You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libreoffice/0001-Updated-liborcus-to-0....

420 lines
19 KiB

From 38c4f46325260ffe176937fa309ef804e3bb0c31 Mon Sep 17 00:00:00 2001
From: Kohei Yoshida <kohei.yoshida@gmail.com>
Date: Wed, 15 Nov 2017 20:42:23 -0500
Subject: [PATCH] Updated liborcus to 0.13.1.
Change-Id: Id5aa07f87603879fe7a21dc96cad207f1b168286
Reviewed-on: https://gerrit.libreoffice.org/44850
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Kohei Yoshida <libreoffice@kohei.us>
---
RepositoryExternal.mk | 4 ++--
download.lst | 4 ++--
external/liborcus/ExternalPackage_liborcus.mk | 8 ++++----
external/liborcus/ExternalProject_liborcus.mk | 4 ++--
external/liborcus/Library_orcus.mk | 15 ++++++++-------
external/liborcus/UnpackedTarball_liborcus.mk | 4 ----
external/liborcus/nullptr-in-ostringstream.patch.1 | 12 ------------
.../orcus_allow_missing_xml_header.patch.1 | 12 ------------
.../orcus_allow_underscore_in_names.patch.1 | 12 ------------
external/liborcus/visibility.patch.0 | 15 ---------------
sc/qa/unit/helper/csv_handler.hxx | 4 ++--
sc/source/filter/inc/orcusinterface.hxx | 10 +++++++---
sc/source/filter/orcus/interface.cxx | 22 +++++++++++++++-------
sc/source/ui/dataprovider/csvdataprovider.cxx | 2 +-
sc/source/ui/docshell/datastream.cxx | 2 +-
sfx2/source/control/emojiview.cxx | 6 +++---
16 files changed, 47 insertions(+), 89 deletions(-)
delete mode 100644 external/liborcus/nullptr-in-ostringstream.patch.1
delete mode 100644 external/liborcus/orcus_allow_missing_xml_header.patch.1
delete mode 100644 external/liborcus/orcus_allow_underscore_in_names.patch.1
delete mode 100644 external/liborcus/visibility.patch.0
diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
index 0e4c15b6ba5f..db70ce875e71 100644
--- a/RepositoryExternal.mk
+++ b/RepositoryExternal.mk
@@ -3230,7 +3230,7 @@ $(call gb_LinkTarget_set_include,$(1),\
)
$(call gb_LinkTarget_add_libs,$(1),\
- -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/liborcus/.libs -lorcus-0.12 \
+ -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/liborcus/.libs -lorcus-0.13 \
)
$(if $(SYSTEM_BOOST), \
@@ -3249,7 +3249,7 @@ $(call gb_LinkTarget_set_include,$(1),\
)
$(call gb_LinkTarget_add_libs,$(1),\
- -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/parser/.libs -lorcus-parser-0.12 \
+ -L$(call gb_UnpackedTarball_get_dir,liborcus)/src/parser/.libs -lorcus-parser-0.13 \
)
endef
diff --git a/download.lst b/download.lst
index dca14ac081be..b857dc49dfe8 100644
--- a/download.lst
+++ b/download.lst
@@ -180,6 +180,6 @@ export OPENLDAP_SHA256SUM := cdd6cffdebcd95161a73305ec13fc7a78e9707b46ca9f84fb89
export OPENSSL_TARBALL := openssl-1.0.2k.tar.gz
-export ORCUS_SHA256SUM := 676b1fedd721f64489650f5e76d7f98b750439914d87cae505b8163d08447908
-export ORCUS_TARBALL := liborcus-0.12.1.tar.gz
+export ORCUS_SHA256SUM := d7041ef455bb78db66b4ba7876af1b3d0fa377b9444e3ef72ceaccd2e8400937
+export ORCUS_TARBALL := liborcus-0.13.1.tar.gz
export OWNCLOUD_ANDROID_LIB_SHA256SUM := b18b3e3ef7fae6a79b62f2bb43cc47a5346b6330f6a383dc4be34439aca5e9fb
export OWNCLOUD_ANDROID_LIB_TARBALL := owncloud-android-library-0.9.4-no-binary-deps.tar.gz
export PAGEMAKER_SHA256SUM := 3b5de037692f8e156777a75e162f6b110fa24c01749e4a66d7eb83f364e52a33
diff --git a/external/liborcus/ExternalPackage_liborcus.mk b/external/liborcus/ExternalPackage_liborcus.mk
index 4a8b5f8bacd6..32382b7d89a1 100644
--- a/external/liborcus/ExternalPackage_liborcus.mk
+++ b/external/liborcus/ExternalPackage_liborcus.mk
@@ -12,11 +12,11 @@ $(eval $(call gb_ExternalPackage_ExternalPackage,liborcus,liborcus))
$(eval $(call gb_ExternalPackage_use_external_project,liborcus,liborcus))
ifeq ($(OS),MACOSX)
-$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.12.0.dylib,src/liborcus/.libs/liborcus-0.12.0.dylib))
-$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.12.0.dylib,src/parser/.libs/liborcus-parser-0.12.0.dylib))
+$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.13.0.dylib,src/liborcus/.libs/liborcus-0.13.0.dylib))
+$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.13.0.dylib,src/parser/.libs/liborcus-parser-0.13.0.dylib))
else ifeq ($(DISABLE_DYNLOADING),)
-$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.12.so.0,src/liborcus/.libs/liborcus-0.12.so.0.0.0))
-$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.12.so.0,src/parser/.libs/liborcus-parser-0.12.so.0.0.0))
+$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-0.13.so.0,src/liborcus/.libs/liborcus-0.13.so.0.0.0))
+$(eval $(call gb_ExternalPackage_add_file,liborcus,$(LIBO_LIB_FOLDER)/liborcus-parser-0.13.so.0,src/parser/.libs/liborcus-parser-0.13.so.0.0.0))
endif
# vim: set noet sw=4 ts=4:
diff --git a/external/liborcus/ExternalProject_liborcus.mk b/external/liborcus/ExternalProject_liborcus.mk
index 3b7ea728b216..01c7c050d04a 100644
--- a/external/liborcus/ExternalProject_liborcus.mk
+++ b/external/liborcus/ExternalProject_liborcus.mk
@@ -114,8 +114,8 @@ $(call gb_ExternalProject_get_state_target,liborcus,build) :
$(MAKE) \
$(if $(filter MACOSX,$(OS)),\
&& $(PERL) $(SRCDIR)/solenv/bin/macosx-change-install-names.pl shl OOO \
- $(gb_Package_SOURCEDIR_liborcus)/src/liborcus/.libs/liborcus-0.12.0.dylib \
- $(gb_Package_SOURCEDIR_liborcus)/src/parser/.libs/liborcus-parser-0.12.0.dylib \
+ $(EXTERNAL_WORKDIR)/src/liborcus/.libs/liborcus-0.13.0.dylib \
+ $(EXTERNAL_WORKDIR)/src/parser/.libs/liborcus-parser-0.13.0.dylib \
) \
)
diff --git a/external/liborcus/Library_orcus.mk b/external/liborcus/Library_orcus.mk
index adc43cb1cc9b..9916f6fe5236 100644
--- a/external/liborcus/Library_orcus.mk
+++ b/external/liborcus/Library_orcus.mk
@@ -67,8 +67,8 @@ $(eval $(call gb_Library_add_generated_exception_objects,orcus,\
UnpackedTarball/liborcus/src/liborcus/odf_namespace_types \
UnpackedTarball/liborcus/src/liborcus/odf_number_formatting_context \
UnpackedTarball/liborcus/src/liborcus/odf_para_context \
- UnpackedTarball/liborcus/src/liborcus/odf_styles_context \
UnpackedTarball/liborcus/src/liborcus/odf_styles \
+ UnpackedTarball/liborcus/src/liborcus/odf_styles_context \
UnpackedTarball/liborcus/src/liborcus/odf_tokens \
UnpackedTarball/liborcus/src/liborcus/ods_content_xml_context \
UnpackedTarball/liborcus/src/liborcus/ods_content_xml_handler \
@@ -86,23 +86,24 @@ $(eval $(call gb_Library_add_generated_exception_objects,orcus,\
UnpackedTarball/liborcus/src/liborcus/orcus_import_ods \
UnpackedTarball/liborcus/src/liborcus/orcus_import_xlsx \
UnpackedTarball/liborcus/src/liborcus/orcus_ods \
- UnpackedTarball/liborcus/src/liborcus/orcus_xlsx \
UnpackedTarball/liborcus/src/liborcus/orcus_xls_xml \
+ UnpackedTarball/liborcus/src/liborcus/orcus_xlsx \
UnpackedTarball/liborcus/src/liborcus/orcus_xml \
UnpackedTarball/liborcus/src/liborcus/session_context \
UnpackedTarball/liborcus/src/liborcus/spreadsheet_interface \
UnpackedTarball/liborcus/src/liborcus/spreadsheet_types \
UnpackedTarball/liborcus/src/liborcus/string_helper \
- UnpackedTarball/liborcus/src/liborcus/xlsx_autofilter_context \
- UnpackedTarball/liborcus/src/liborcus/xlsx_conditional_format_context \
- UnpackedTarball/liborcus/src/liborcus/xlsx_context \
- UnpackedTarball/liborcus/src/liborcus/xlsx_handler \
- UnpackedTarball/liborcus/src/liborcus/xlsx_helper \
UnpackedTarball/liborcus/src/liborcus/xls_xml_context \
UnpackedTarball/liborcus/src/liborcus/xls_xml_detection_handler \
UnpackedTarball/liborcus/src/liborcus/xls_xml_handler \
UnpackedTarball/liborcus/src/liborcus/xls_xml_namespace_types \
UnpackedTarball/liborcus/src/liborcus/xls_xml_tokens \
+ UnpackedTarball/liborcus/src/liborcus/xlsx_autofilter_context \
+ UnpackedTarball/liborcus/src/liborcus/xlsx_conditional_format_context \
+ UnpackedTarball/liborcus/src/liborcus/xlsx_context \
+ UnpackedTarball/liborcus/src/liborcus/xlsx_drawing_context \
+ UnpackedTarball/liborcus/src/liborcus/xlsx_handler \
+ UnpackedTarball/liborcus/src/liborcus/xlsx_helper \
UnpackedTarball/liborcus/src/liborcus/xlsx_pivot_context \
UnpackedTarball/liborcus/src/liborcus/xlsx_revision_context \
UnpackedTarball/liborcus/src/liborcus/xlsx_session_data \
diff --git a/external/liborcus/UnpackedTarball_liborcus.mk b/external/liborcus/UnpackedTarball_liborcus.mk
index 655aa496e2f2..b3261a5fa993 100644
--- a/external/liborcus/UnpackedTarball_liborcus.mk
+++ b/external/liborcus/UnpackedTarball_liborcus.mk
@@ -18,10 +18,6 @@ $(eval $(call gb_UnpackedTarball_update_autoconf_configs,liborcus))
$(eval $(call gb_UnpackedTarball_add_patches,liborcus,\
external/liborcus/0001-workaround-a-linking-problem-on-windows.patch \
external/liborcus/rpath.patch.0 \
- external/liborcus/visibility.patch.0 \
- external/liborcus/nullptr-in-ostringstream.patch.1 \
- external/liborcus/orcus_allow_missing_xml_header.patch.1 \
- external/liborcus/orcus_allow_underscore_in_names.patch.1 \
))
ifeq ($(OS),WNT)
diff --git a/external/liborcus/nullptr-in-ostringstream.patch.1 b/external/liborcus/nullptr-in-ostringstream.patch.1
deleted file mode 100644
index d8b97ee2c92a..000000000000
--- a/external/liborcus/nullptr-in-ostringstream.patch.1
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -ur liborcus.org/src/liborcus/xml_context_base.cpp liborcus/src/liborcus/xml_context_base.cpp
---- liborcus.org/src/liborcus/xml_context_base.cpp 2017-06-30 14:32:19.044195127 +0200
-+++ liborcus/src/liborcus/xml_context_base.cpp 2017-06-30 14:34:27.580268421 +0200
-@@ -171,7 +171,7 @@
-
- // Create a generic error message.
- ostringstream os;
-- os << "element '" << ns << ":" << m_tokens.get_token_name(name) << "' expected, but '";
-+ os << "element '" << (ns ? ns : "") << ":" << m_tokens.get_token_name(name) << "' expected, but '";
- os << elem.first << ":" << m_tokens.get_token_name(elem.second) << "' encountered.";
- throw xml_structure_error(os.str());
- }
diff --git a/external/liborcus/orcus_allow_missing_xml_header.patch.1 b/external/liborcus/orcus_allow_missing_xml_header.patch.1
deleted file mode 100644
index 2cfd498c7eae..000000000000
--- a/external/liborcus/orcus_allow_missing_xml_header.patch.1
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -ur liborcus.org/include/orcus/sax_parser.hpp liborcus/include/orcus/sax_parser.hpp
---- liborcus.org/include/orcus/sax_parser.hpp 2017-08-12 09:44:21.379509116 +0200
-+++ liborcus/include/orcus/sax_parser.hpp 2017-08-12 09:46:06.884259216 +0200
-@@ -20,7 +20,7 @@
- * parsing regardless of whether or not the xml stream begins with a
- * <?xml..?> declaration.
- */
-- static const bool strict_xml_declaration = true;
-+ static const bool strict_xml_declaration = false;
- };
-
- /**
diff --git a/external/liborcus/orcus_allow_underscore_in_names.patch.1 b/external/liborcus/orcus_allow_underscore_in_names.patch.1
deleted file mode 100644
index b5acc5a0938b..000000000000
--- a/external/liborcus/orcus_allow_underscore_in_names.patch.1
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -ur liborcus.org/src/parser/sax_parser_base.cpp liborcus/src/parser/sax_parser_base.cpp
---- liborcus.org/src/parser/sax_parser_base.cpp 2017-08-12 10:39:49.963174114 +0200
-+++ liborcus/src/parser/sax_parser_base.cpp 2017-08-12 10:41:32.026899749 +0200
-@@ -334,7 +334,7 @@
- {
- const char* p0 = mp_char;
- char c = cur_char();
-- if (!is_alpha(c))
-+ if (!is_alpha(c) && c != '_')
- {
- ::std::ostringstream os;
- os << "name must begin with an alphabet, but got this instead '" << c << "'";
diff --git a/external/liborcus/visibility.patch.0 b/external/liborcus/visibility.patch.0
deleted file mode 100644
index a62ecf753dc8..000000000000
--- a/external/liborcus/visibility.patch.0
+++ /dev/null
@@ -1,15 +0,0 @@
-Upstreamed as
-<https://gitlab.com/orcus/orcus/commit/05d3e608ce09a9cf34aa085de6180978a03f0f13>
-"Allow passed-in CXXFLAGS to override -fvisibility=hidden":
-
---- configure
-+++ configure
-@@ -4255,7 +4255,7 @@
-
- fi
-
--CXXFLAGS="$CXXFLAGS -fvisibility=hidden -Wall -pthread"
-+CXXFLAGS="-fvisibility=hidden $CXXFLAGS -Wall -pthread"
-
- # ===========================
- # Find required base packages
diff --git a/sc/qa/unit/helper/csv_handler.hxx b/sc/qa/unit/helper/csv_handler.hxx
index c4b5fafc63b6..8f0e8a8c2be3 100644
--- a/sc/qa/unit/helper/csv_handler.hxx
+++ b/sc/qa/unit/helper/csv_handler.hxx
@@ -98,7 +98,7 @@ public:
mnCol = 0;
}
- void cell(const char* p, size_t n)
+ void cell(const char* p, size_t n, bool /*transient*/)
{
#if DEBUG_CSV_HANDLER
std::cout << "Col: " << mnCol << " Row: " << mnRow << std::endl;
@@ -194,7 +194,7 @@ public:
mnCol = 0;
}
- void cell(const char* p, size_t n)
+ void cell(const char* p, size_t n, bool /*transient*/)
{
#if DEBUG_CSV_HANDLER
std::cout << "Col: " << mnCol << " Row: " << mnRow << std::endl;
diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx
index 1d4c285200ee..9938cf10d5fd 100644
--- a/sc/source/filter/inc/orcusinterface.hxx
+++ b/sc/source/filter/inc/orcusinterface.hxx
@@ -182,7 +182,8 @@ public:
virtual void set_row_hidden(orcus::spreadsheet::row_t row, bool hidden) override;
- virtual void set_merge_cell_range(const char* p_range, size_t n_range) override;
+
+ virtual void set_merge_cell_range(const orcus::spreadsheet::range_t& range) override;
};
class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet
@@ -242,6 +243,8 @@ public:
orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar,
const char* p, size_t n, const char* p_range, size_t n_range) override;
+ virtual orcus::spreadsheet::range_size_t get_sheet_size() const override;
+
SCTAB getIndex() const { return mnTab; }
};
@@ -417,7 +420,7 @@ public:
// border
virtual void set_border_count(size_t n) override;
- virtual void set_border_style(orcus::spreadsheet::border_direction_t dir, const char* s, size_t n) override;
+
virtual void set_border_style(orcus::spreadsheet::border_direction_t dir, orcus::spreadsheet::border_style_t style) override;
virtual void set_border_color(orcus::spreadsheet::border_direction_t dir,
orcus::spreadsheet::color_elem_t alpha,
@@ -507,7 +510,8 @@ class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
public:
ScOrcusFactory(ScDocument& rDoc);
- virtual orcus::spreadsheet::iface::import_sheet* append_sheet(const char *sheet_name, size_t sheet_name_length) override;
+ virtual orcus::spreadsheet::iface::import_sheet* append_sheet(
+ orcus::spreadsheet::sheet_t sheet_index, const char *sheet_name, size_t sheet_name_length) override;
virtual orcus::spreadsheet::iface::import_sheet* get_sheet(const char *sheet_name, size_t sheet_name_length) override;
virtual orcus::spreadsheet::iface::import_sheet* get_sheet(orcus::spreadsheet::sheet_t sheet_index) override;
virtual orcus::spreadsheet::iface::import_global_settings* get_global_settings() override;
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index e98df4e4e1a6..de52b861e5fc 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -84,7 +84,8 @@ ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) :
maStyles(rDoc),
mnProgress(0) {}
-orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char* sheet_name, size_t sheet_name_length)
+orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(
+ orcus::spreadsheet::sheet_t /*sheet_index*/, const char* sheet_name, size_t sheet_name_length)
{
OUString aTabName(sheet_name, sheet_name_length, RTL_TEXTENCODING_UTF8);
if (!maDoc.appendSheet(aTabName))
@@ -296,7 +297,7 @@ void ScOrcusSheetProperties::set_row_hidden(os::row_t row, bool hidden)
mrDoc.getDoc().SetRowHidden(row, row, mnTab, hidden);
}
-void ScOrcusSheetProperties::set_merge_cell_range(const char* /*p_range*/, size_t /*n_range*/)
+void ScOrcusSheetProperties::set_merge_cell_range(const orcus::spreadsheet::range_t& /*range*/)
{
}
@@ -574,6 +575,9 @@ formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( os::formula_grammar_t
case orcus::spreadsheet::formula_grammar_t::gnumeric:
eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1;
break;
+ case orcus::spreadsheet::formula_grammar_t::xls_xml:
+ eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1;
+ break;
case orcus::spreadsheet::formula_grammar_t::unknown:
break;
}
@@ -689,6 +693,15 @@ void ScOrcusSheet::set_array_formula(
{
}
+orcus::spreadsheet::range_size_t ScOrcusSheet::get_sheet_size() const
+{
+ orcus::spreadsheet::range_size_t ret;
+ ret.rows = MAXROWCOUNT;
+ ret.columns = MAXCOLCOUNT;
+
+ return ret;
+}
+
ScOrcusSharedStrings::ScOrcusSharedStrings(ScOrcusFactory& rFactory) :
mrFactory(rFactory) {}
@@ -1279,11 +1292,6 @@ void ScOrcusStyles::set_border_count(size_t /*n*/)
// needed at all?
}
-void ScOrcusStyles::set_border_style(orcus::spreadsheet::border_direction_t /*dir*/, const char* /*s*/, size_t /*n*/)
-{
- // implement later
-}
-
void ScOrcusStyles::set_border_style(
orcus::spreadsheet::border_direction_t dir, orcus::spreadsheet::border_style_t style)
{
diff --git a/sc/source/ui/dataprovider/csvdataprovider.cxx b/sc/source/ui/dataprovider/csvdataprovider.cxx
index f961a4c21977..1d61996f7a6e 100644
--- a/sc/source/ui/dataprovider/csvdataprovider.cxx
+++ b/sc/source/ui/dataprovider/csvdataprovider.cxx
@@ -41,7 +41,7 @@ public:
mnCol = 0;
}
- void cell(const char* p, size_t n)
+ void cell(const char* p, size_t n, bool /*transient*/)
{
if (mnCol > MAXCOL)
return;
diff --git a/sc/source/ui/docshell/datastream.cxx b/sc/source/ui/docshell/datastream.cxx
index 16a6cb09409e..f74feb7a7d06 100644
--- a/sc/source/ui/docshell/datastream.cxx
+++ b/sc/source/ui/docshell/datastream.cxx
@@ -71,7 +71,7 @@ public:
static void begin_row() {}
static void end_row() {}
- void cell(const char* p, size_t n)
+ void cell(const char* p, size_t n, bool /*transient*/)
{
if (mnCols >= mnColCount)
return;
diff --git a/sfx2/source/control/emojiview.cxx b/sfx2/source/control/emojiview.cxx
index e2820186c68d..0a572449c61d 100644
--- a/sfx2/source/control/emojiview.cxx
+++ b/sfx2/source/control/emojiview.cxx
@@ -104,12 +104,12 @@ void EmojiView::Populate()
}
// Populate view using the orcus json parser
- using node = orcus::json_document_tree::node;
+ using node = orcus::json::node;
// default json config
orcus::json_config config;
- orcus::json_document_tree aEmojiInfo;
+ orcus::json::document_tree aEmojiInfo;
// Load JSON string into a document tree.
aEmojiInfo.load(msJSONData, config);
@@ -122,7 +122,7 @@ void EmojiView::Populate()
orcus::pstring key = *it;
node value = root.child(key);
- if(value.type() == orcus::json_node_t::object)
+ if(value.type() == orcus::json::node_t::object)
{
// iterate each element to get the keys
std::vector<orcus::pstring> aEmojiParams = value.keys();
--
2.14.3