basic/qa/basic_coverage/test_format_function.bas | 6 basic/qa/basic_coverage/test_str_method.bas | 42 basic/qa/basic_coverage/test_typename_method.bas | 2 basic/source/classes/image.cxx | 3 basic/source/comp/scanner.cxx | 2 basic/source/comp/symtbl.cxx | 5 basic/source/inc/filefmt.hxx | 2 basic/source/runtime/methods.cxx | 19 basic/source/runtime/runtime.cxx | 4 basic/source/sbx/sbxscan.cxx | 10 download.lst | 4 drawinglayer/source/primitive2d/textbreakuphelper.cxx | 5 drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx | 4 drawinglayer/source/primitive2d/textprimitive2d.cxx | 3 drawinglayer/source/processor2d/vclprocessor2d.cxx | 3 drawinglayer/source/tools/emfphelperdata.cxx | 2 drawinglayer/source/tools/wmfemfhelper.cxx | 5 external/curl/0001-cookie-don-t-treat-the-leading-slash-as-trailing.patch | 54 external/curl/0001-ws-get-a-new-mask-for-each-new-outgoing-frame.patch | 61 external/curl/UnpackedTarball_curl.mk | 2 external/mariadb-connector-c/UnpackedTarball_mariadb-connector-c.mk | 1 external/mariadb-connector-c/c23.patch.0 | 11 extras/source/templates/presnt/Candy/styles.xml | 8 include/drawinglayer/primitive2d/textdecoratedprimitive2d.hxx | 1 include/drawinglayer/primitive2d/textprimitive2d.hxx | 7 sc/qa/unit/data/functions/array/fods/sumproduct.fods | 6862 +++++----- sc/qa/unit/data/ods/tdf140866.ods |binary sc/qa/unit/scshapetest.cxx | 50 sc/qa/unit/tiledrendering/data/tdf167042.ods |binary sc/qa/unit/tiledrendering/tiledrendering2.cxx | 53 sc/source/core/data/drwlayer.cxx | 4 sc/source/core/tool/compiler.cxx | 2 sc/source/ui/undo/undoblk.cxx | 6 svgio/source/svgreader/svgcharacternode.cxx | 1 svx/source/svdraw/svdotextdecomposition.cxx | 4 sw/inc/doc.hxx | 5 sw/source/core/doc/doc.cxx | 10 sw/source/core/doc/docfmt.cxx | 31 sw/source/filter/ww8/rtfexport.cxx | 2 sw/source/uibase/shells/textsh.cxx | 4 sw/source/uibase/wrtsh/wrtsh1.cxx | 4 vcl/qa/cppunit/pdfexport/pdfexport2.cxx | 4 42 files changed, 3901 insertions(+), 3407 deletions(-)
New commits: commit ca11eb473dadc90500baed1e0c56d0e87fd4dad6 Author: Mike Kaganski <[email protected]> AuthorDate: Sat Sep 27 00:42:27 2025 +0500 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:59 2025 +0200 tdf#168569: support date values in string pool Commit f45463d8e2bb0771ec1837d159ff98108b0047cf (tdf#93727 Support date literals in basic, 2017-05-24) introduced correct parsing of literals like #2025-09-26#. However, it didn't retain the value type; there was a discussion about that in gerrit, but no solution was found, and type was set to double. Later, a similar problem (storing type of value in compiled image) was fixed in commit 5eedb3beeaeed88de0d1ebd041a9f15ceea7e78c (tdf#142460: properly handle boolean values in string pool, 2021-06-25). This change reuses the same method to store date type using 'd' char in the string pool. Change-Id: I32e8497ece1f30980ba6d4fca248687b817348f2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191555 Tested-by: Jenkins Reviewed-by: Mike Kaganski <[email protected]> (cherry picked from commit 22d7827c6695358e11ee06a5599b72a92ff0b2ac) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191595 Reviewed-by: Xisco Fauli <[email protected]> Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191638 diff --git a/basic/qa/basic_coverage/test_format_function.bas b/basic/qa/basic_coverage/test_format_function.bas index 75b7c37ee3bf..3a8ba67aa921 100644 --- a/basic/qa/basic_coverage/test_format_function.bas +++ b/basic/qa/basic_coverage/test_format_function.bas @@ -26,6 +26,7 @@ Sub verify_testFormat TestUtil.AssertEqual(Format(" "), " ", "Format("" "")") TestUtil.AssertEqual(Format(" 00 "), "0", "Format("" 00 "")") TestUtil.AssertEqual(Format(CDate("2025-09-26")), "09/26/2025", "Format(CDate(""2025-09-26""))") + TestUtil.AssertEqual(Format(#2025-09-26#), "09/26/2025", "Format(#2025-09-26#)") Exit Sub errorHandler: diff --git a/basic/qa/basic_coverage/test_str_method.bas b/basic/qa/basic_coverage/test_str_method.bas index 2ce10952ee04..9ce67ff1dec3 100644 --- a/basic/qa/basic_coverage/test_str_method.bas +++ b/basic/qa/basic_coverage/test_str_method.bas @@ -32,6 +32,7 @@ Sub verify_testStr ' Dates are converted into locale-dependent strings (test uses en-US) TestUtil.AssertEqualStrict(Str(CDate("2025-09-26")), "09/26/2025", "Str(CDate(""2025-09-26""))") + TestUtil.AssertEqualStrict(Str(#2025-09-26#), "09/26/2025", "Str(#2025-09-26#)") TestUtil.AssertEqualStrict(Str(true), "True", "Str(true)") diff --git a/basic/qa/basic_coverage/test_typename_method.bas b/basic/qa/basic_coverage/test_typename_method.bas index 028f57f0e8db..f6fb90c2df79 100644 --- a/basic/qa/basic_coverage/test_typename_method.bas +++ b/basic/qa/basic_coverage/test_typename_method.bas @@ -43,6 +43,8 @@ Function doUnitTest ' TypeName() assert( TypeName(myUDF) = "Object" , "TypeName(myUDF) is not ""Object""" ) assert( TypeName(var) = "Empty" , "TypeName(var) is not ""Empty""" ) + assert( TypeName(#2025-09-26#) = "Date" , "TypeName(#2025-09-26#) is not ""Date""" ) + assert( TypeName(int_) = "Integer" , "TypeName(int_) is not ""Integer""" ) assert( TypeName(long_) = "Long" , "TypeName(long_) is not ""Long""" ) assert( TypeName(single_) = "Single" , "TypeName(single_) is not ""Single""" ) diff --git a/basic/source/classes/image.cxx b/basic/source/classes/image.cxx index 336666300fd2..19c0d518417f 100644 --- a/basic/source/classes/image.cxx +++ b/basic/source/classes/image.cxx @@ -615,6 +615,7 @@ void SbiImage::AddEnum(SbxObject* pObject) // Register enum type rEnums->Insert(pObject, rEnums->Count()); } +// See also: SbiRuntime::StepLOADNC // Note: IDs start with 1 OUString SbiImage::GetString( sal_uInt32 nId, SbxDataType *eType ) const { @@ -654,6 +655,8 @@ OUString SbiImage::GetString( sal_uInt32 nId, SbxDataType *eType ) const case '@': *eType = SbxCURRENCY; break; // tdf#142460 - properly handle boolean values in string pool case 'b': *eType = SbxBOOL; break; + // tdf#168569 - support date values in string pool + case 'd': *eType = SbxDATE; break; // Not in GetSuffixType } } } diff --git a/basic/source/comp/scanner.cxx b/basic/source/comp/scanner.cxx index 820951889ad7..5aac70b833fe 100644 --- a/basic/source/comp/scanner.cxx +++ b/basic/source/comp/scanner.cxx @@ -648,7 +648,7 @@ bool SbiScanner::NextSym() GenError( ERRCODE_BASIC_CONVERSION ); bNumber = true; - eScanType = SbxDOUBLE; + eScanType = SbxDATE; } else { diff --git a/basic/source/comp/symtbl.cxx b/basic/source/comp/symtbl.cxx index 6f8b53ed0d5a..d28d5fde5e7c 100644 --- a/basic/source/comp/symtbl.cxx +++ b/basic/source/comp/symtbl.cxx @@ -100,6 +100,11 @@ short SbiStringPool::Add(double n, SbxDataType t) size = snprintf(buf, sizeof(buf), "%.16g", n) + 1; buf[size++] = '@'; break; + case SbxDATE: + // tdf#168569 - support date values in string pool + size = snprintf(buf, sizeof(buf), "%.16g", n) + 1; + buf[size++] = 'd'; // Not in GetSuffixType + break; default: assert(false); break; // should not happen } diff --git a/basic/source/inc/filefmt.hxx b/basic/source/inc/filefmt.hxx index 38dfa95754f3..5f29d6cdf56d 100644 --- a/basic/source/inc/filefmt.hxx +++ b/basic/source/inc/filefmt.hxx @@ -43,6 +43,8 @@ // tdf#142460: properly handle boolean values in string pool (no // version number bump for backward compatibility; relies on // new integer type suffix 'b') +// tdf#168569: support date values in string pool (no version number bump +// for backward compatibility; relies on new integer type suffix 'd') // #define B_IMG_VERSION_12 0x00000012 diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx index 2fcbfb7372cb..833e3af6a5a9 100644 --- a/basic/source/runtime/runtime.cxx +++ b/basic/source/runtime/runtime.cxx @@ -2817,7 +2817,7 @@ void SbiRuntime::StepERROR() } // loading a numeric constant (+ID) - +// See also: SbiImage::GetString void SbiRuntime::StepLOADNC( sal_uInt32 nOp1 ) { // tdf#143707 - check if the data type character was added after the string termination symbol @@ -2849,6 +2849,8 @@ void SbiRuntime::StepLOADNC( sal_uInt32 nOp1 ) case '@': eType = SbxCURRENCY; break; // tdf#142460 - properly handle boolean values in string pool case 'b': eType = SbxBOOL; break; + // tdf#168569 - support date values in string pool + case 'd': eType = SbxDATE; break; // Not in GetSuffixType } } // tdf#143707 - if the data type character is different from the default value, it was added commit 367ad7de7a7a2ffc9d9a684ee21f49ae0b6dfd0c Author: Mike Kaganski <[email protected]> AuthorDate: Fri Sep 26 21:14:33 2025 +0500 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:59 2025 +0200 tdf#168561: fix Str function implementation 1. If a string is passed as argument, it is returned without any changes. For that, SbRtl_Str checks argument type, skipping processing for string. 2. Non-negative numbers are preceded by a blank space. That already was implemented. 3. Negative numbers are preceded by a minus sign. That was done incorrectly - a space was added for any number. 4. Dates are converted into locale-dependent strings. That wasn't done at all - dates were converted to strings representing the serial date. A check is implemented SbxValue::Format, to handle this. Additionally, Format function was improved to handle such input without format string (taking into account that it handles strings that can be converted to numbers differently). Change-Id: I5ac0429950e4ea8bf69b0091502b4e6dc1f4957d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191549 Reviewed-by: Mike Kaganski <[email protected]> Tested-by: Jenkins (cherry picked from commit 92878d3216aeaf0e5131c0c3fa1f8dc9ce67b5b4) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191582 Reviewed-by: Xisco Fauli <[email protected]> Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191637 diff --git a/basic/qa/basic_coverage/test_format_function.bas b/basic/qa/basic_coverage/test_format_function.bas index d1c51fe791a5..75b7c37ee3bf 100644 --- a/basic/qa/basic_coverage/test_format_function.bas +++ b/basic/qa/basic_coverage/test_format_function.bas @@ -22,6 +22,11 @@ Sub verify_testFormat TestUtil.AssertEqual(Format(d, "YYYY-MM-DD"), "2024-09-16", "Format(d, ""YYYY-MM-DD"")") TestUtil.AssertEqual(Format("2024-09-16 05:03:30 PM", "hh-mm-ss"), "17-03-30", "Format(""2024-09-16 05:03:30 PM"", ""hh-mm-ss"")") + TestUtil.AssertEqual(Format(""), "", "Format("""")") + TestUtil.AssertEqual(Format(" "), " ", "Format("" "")") + TestUtil.AssertEqual(Format(" 00 "), "0", "Format("" 00 "")") + TestUtil.AssertEqual(Format(CDate("2025-09-26")), "09/26/2025", "Format(CDate(""2025-09-26""))") + Exit Sub errorHandler: TestUtil.ReportErrorHandler("verify_testFormat", Err, Error$, Erl) diff --git a/basic/qa/basic_coverage/test_str_method.bas b/basic/qa/basic_coverage/test_str_method.bas new file mode 100644 index 000000000000..2ce10952ee04 --- /dev/null +++ b/basic/qa/basic_coverage/test_str_method.bas @@ -0,0 +1,41 @@ +' This file is part of the LibreOffice project. +' +' This Source Code Form is subject to the terms of the Mozilla Public +' License, v. 2.0. If a copy of the MPL was not distributed with this +' file, You can obtain one at http://mozilla.org/MPL/2.0/. +' + +Option Explicit + +Function doUnitTest as String + TestUtil.TestInit + verify_testStr + doUnitTest = TestUtil.GetResult() +End Function + +Dim failedAssertion As Boolean, messages As String + +Sub verify_testStr + On Error GoTo errorHandler + + ' If a string is passed as argument, it is returned without any changes + TestUtil.AssertEqualStrict(Str(""), "", "Str("""")") + TestUtil.AssertEqualStrict(Str(" "), " ", "Str("" "")") + TestUtil.AssertEqualStrict(Str(" 00 "), " 00 ", "Str("" 00 "")") + + ' Non-negative numbers are preceded by a blank space + TestUtil.AssertEqualStrict(Str(0), " 0", "Str(0)") + TestUtil.AssertEqualStrict(Str(1 / 10), " 0.1", "Str(1 / 10)") + + ' Negative numbers are preceded by a minus sign + TestUtil.AssertEqualStrict(Str(-1 / 10), "-0.1", "Str(-1 / 10)") + + ' Dates are converted into locale-dependent strings (test uses en-US) + TestUtil.AssertEqualStrict(Str(CDate("2025-09-26")), "09/26/2025", "Str(CDate(""2025-09-26""))") + + TestUtil.AssertEqualStrict(Str(true), "True", "Str(true)") + + Exit Sub +errorHandler: + TestUtil.ReportErrorHandler("verify_testStr", Err, Error$, Erl) +End Sub diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx index 160d9adafc4d..172090440a90 100644 --- a/basic/source/runtime/methods.cxx +++ b/basic/source/runtime/methods.cxx @@ -1354,12 +1354,21 @@ void SbRtl_Str(StarBASIC *, SbxArray & rPar, bool) else { OUString aStr; - OUString aStrNew(u""_ustr); + OUString aStrNew; SbxVariableRef pArg = rPar.Get(1); - pArg->Format( aStr ); + const SbxDataType argType = pArg->GetType(); + if (argType == SbxSTRING) + { + // From Help: "If a string is passed as argument, it is returned without any changes" + aStr = pArg->GetOUString(); + } + else + { + pArg->Format(aStr); + } // Numbers start with a space - if (pArg->GetType() != SbxBOOL && pArg->IsNumericRTL()) + if (argType != SbxBOOL && argType != SbxSTRING && pArg->IsNumericRTL()) { // replace commas by points so that it's symmetric to Val! aStr = aStr.replaceFirst( ",", "." ); @@ -1395,7 +1404,9 @@ void SbRtl_Str(StarBASIC *, SbxArray & rPar, bool) } else { - aStrNew = " " + aStr; + if (!aStr.startsWith("-")) + aStrNew = " "; + aStrNew += aStr; } } else diff --git a/basic/source/sbx/sbxscan.cxx b/basic/source/sbx/sbxscan.cxx index a2e80161b16a..3d71d7c14ace 100644 --- a/basic/source/sbx/sbxscan.cxx +++ b/basic/source/sbx/sbxscan.cxx @@ -476,7 +476,10 @@ std::optional<double> StrToNumberIntl(const OUString& s, std::shared_ptr<SvNumberFormatter>& rpFormatter) { double ret; - if (SbxValue::ScanNumIntnl(s, ret) == ERRCODE_NONE) + sal_uInt16 nLen = 0; + bool bHasNumber = false; + if (ImpScan(s, ret, o3tl::temporary(SbxDataType()), &nLen, &bHasNumber, true) == ERRCODE_NONE + && bHasNumber && nLen == s.getLength()) return ret; // We couldn't detect a Basic-formatted number (including type characters & specific exponents). @@ -551,6 +554,11 @@ void SbxValue::Format( OUString& rRes, const OUString* pFmt ) const rRes = SbxBasicFormater::BasicFormatNull(pFmt ? *pFmt : std::u16string_view{}); return; } + if (eType == SbxDATE && !pFmt) + { + rRes = GetOUString(); + return; + } std::shared_ptr<SvNumberFormatter> pFormatter; std::optional<double> number = GetNumberIntl(*this, rRes, pFormatter, pFmt != nullptr); commit 233a422b8cdd82785e70bc94700d2e436b089ef3 Author: Khaled Hosny <[email protected]> AuthorDate: Thu Sep 25 16:33:09 2025 +0300 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:59 2025 +0200 tdf#168371: Disable ligatures in Impress/Draw with character spacing This is follow up to commit: commit b9f0caad5d9e628f82d5148dfc7d2436d32817e2 Author: Khaled Hosny <[email protected]> Date: Tue Aug 23 04:13:28 2022 +0200 tdf#66819: Disable ligatures with character spacing Even though editengine was applying letter spacing, when drawing with drawinglayer, letter spacing was not propagated which caused VCL to not disable the ligature features. Change-Id: Ia8bf2231478720262484a757e16fe5afec3cd28e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191512 Reviewed-by: Khaled Hosny <[email protected]> Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191627 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191635 diff --git a/drawinglayer/source/primitive2d/textbreakuphelper.cxx b/drawinglayer/source/primitive2d/textbreakuphelper.cxx index 121e44ec8759..be3887d18363 100644 --- a/drawinglayer/source/primitive2d/textbreakuphelper.cxx +++ b/drawinglayer/source/primitive2d/textbreakuphelper.cxx @@ -150,6 +150,7 @@ namespace drawinglayer::primitive2d mrSource.getLocale(), mrSource.getFontColor(), mrSource.getTextFillColor(), + mrSource.getLetterSpacing(), pTextDecoratedPortionPrimitive2D->getOverlineColor(), pTextDecoratedPortionPrimitive2D->getTextlineColor(), @@ -180,7 +181,9 @@ namespace drawinglayer::primitive2d std::move(aNewKashidaArray), mrSource.getFontAttribute(), mrSource.getLocale(), - mrSource.getFontColor())); + mrSource.getFontColor(), + mrSource.getTextFillColor(), + mrSource.getLetterSpacing())); } } diff --git a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx index bfa5ebbb7eea..f3abbe41f4a2 100644 --- a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx @@ -463,6 +463,7 @@ namespace drawinglayer::primitive2d const css::lang::Locale& rLocale, const basegfx::BColor& rFontColor, const Color& rFillColor, + short nLetterSpacing, // local parameters const basegfx::BColor& rOverlineColor, @@ -487,7 +488,8 @@ namespace drawinglayer::primitive2d rFontAttribute, rLocale, rFontColor, - rFillColor), + rFillColor, + nLetterSpacing), maBufferedBrokenUpText(), maBufferedDecorationGeometry(), maOverlineColor(rOverlineColor), diff --git a/drawinglayer/source/primitive2d/textprimitive2d.cxx b/drawinglayer/source/primitive2d/textprimitive2d.cxx index d08f729e3abf..09c4243a4ee5 100644 --- a/drawinglayer/source/primitive2d/textprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/textprimitive2d.cxx @@ -206,7 +206,7 @@ TextSimplePortionPrimitive2D::TextSimplePortionPrimitive2D( basegfx::B2DHomMatrix rNewTransform, OUString rText, sal_Int32 nTextPosition, sal_Int32 nTextLength, std::vector<double>&& rDXArray, std::vector<sal_Bool>&& rKashidaArray, attribute::FontAttribute aFontAttribute, css::lang::Locale aLocale, - const basegfx::BColor& rFontColor, const Color& rTextFillColor) + const basegfx::BColor& rFontColor, const Color& rTextFillColor, short nLetterSpacing) : maTextTransform(std::move(rNewTransform)) , maText(std::move(rText)) , mnTextPosition(nTextPosition) @@ -217,6 +217,7 @@ TextSimplePortionPrimitive2D::TextSimplePortionPrimitive2D( , maLocale(std::move(aLocale)) , maFontColor(rFontColor) , maTextFillColor(rTextFillColor) + , mnLetterSpacing(nLetterSpacing) { #if OSL_DEBUG_LEVEL > 0 const sal_Int32 aStringLength(getText().getLength()); diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index 73e3d8adbac9..cdefe9095ad4 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -445,6 +445,9 @@ void VclProcessor2D::RenderTextSimpleOrDecoratedPortionPrimitive2D( basegfx::fround<tools::Long>(aPointY)); } + // tdf#168371 set letter spacing so that VCL knows it has to disable ligatures + aFont.SetFixKerning(rTextCandidate.getLetterSpacing()); + // tdf#152990 set the font after the MapMode is (potentially) set so canvas uses the desired // font size mpOutputDevice->SetFont(aFont); diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx index 3d9bef482860..6346777c67e8 100644 --- a/drawinglayer/source/tools/emfphelperdata.cxx +++ b/drawinglayer/source/tools/emfphelperdata.cxx @@ -1707,6 +1707,7 @@ namespace emfplushelper locale, color.getBColor(), // Font Color COL_TRANSPARENT, // Fill Color + 0, color.getBColor(), // OverlineColor color.getBColor(), // TextlineColor drawinglayer::primitive2d::TEXT_LINE_NONE, @@ -2221,6 +2222,7 @@ namespace emfplushelper Application::GetSettings().GetLanguageTag().getLocale(), color.getBColor(), COL_TRANSPARENT, + 0, color.getBColor(), color.getBColor(), drawinglayer::primitive2d::TEXT_LINE_NONE, diff --git a/drawinglayer/source/tools/wmfemfhelper.cxx b/drawinglayer/source/tools/wmfemfhelper.cxx index c77c653d4ebd..00aff7114203 100644 --- a/drawinglayer/source/tools/wmfemfhelper.cxx +++ b/drawinglayer/source/tools/wmfemfhelper.cxx @@ -1128,6 +1128,7 @@ namespace wmfemfhelper aLocale, aFontColor, aFillColor, + rFont.GetFixKerning(), // attributes for TextDecoratedPortionPrimitive2D rProperty.getOverlineColorActive() ? rProperty.getOverlineColor() : aFontColor, @@ -1155,7 +1156,9 @@ namespace wmfemfhelper std::move(rKashidaArray), std::move(aFontAttribute), std::move(aLocale), - aFontColor); + aFontColor, + aFillColor, + rFont.GetFixKerning()); } } diff --git a/include/drawinglayer/primitive2d/textdecoratedprimitive2d.hxx b/include/drawinglayer/primitive2d/textdecoratedprimitive2d.hxx index 07b780b24922..c635dc93ecfe 100644 --- a/include/drawinglayer/primitive2d/textdecoratedprimitive2d.hxx +++ b/include/drawinglayer/primitive2d/textdecoratedprimitive2d.hxx @@ -89,6 +89,7 @@ namespace drawinglayer::primitive2d const css::lang::Locale& rLocale, const basegfx::BColor& rFontColor, const Color& rFillColor, + short nLetterSpacing, /// local parameters const basegfx::BColor& rOverlineColor, diff --git a/include/drawinglayer/primitive2d/textprimitive2d.hxx b/include/drawinglayer/primitive2d/textprimitive2d.hxx index 878ef9d8291c..60ae7a2723d3 100644 --- a/include/drawinglayer/primitive2d/textprimitive2d.hxx +++ b/include/drawinglayer/primitive2d/textprimitive2d.hxx @@ -136,6 +136,9 @@ private: /// #i96669# internal: add simple range buffering for this primitive basegfx::B2DRange maB2DRange; + /// Letter spacing + short mnLetterSpacing; + protected: /// local decomposition. virtual Primitive2DReference @@ -155,7 +158,8 @@ public: std::vector<sal_Bool>&& rKashidaArray, attribute::FontAttribute aFontAttribute, css::lang::Locale aLocale, const basegfx::BColor& rFontColor, - const Color& rTextFillColor = COL_TRANSPARENT); + const Color& rTextFillColor = COL_TRANSPARENT, + short nLetterSpacing = 0); /** get text outlines as polygons and their according ObjectTransformation. Handles all the necessary VCL outline extractions, scaling adaptations and other stuff. @@ -174,6 +178,7 @@ public: const css::lang::Locale& getLocale() const { return maLocale; } const basegfx::BColor& getFontColor() const { return maFontColor; } const Color& getTextFillColor() const { return maTextFillColor; } + short getLetterSpacing() const { return mnLetterSpacing; } /// helpers for determining various decoration states virtual bool hasTextRelief() const; diff --git a/svgio/source/svgreader/svgcharacternode.cxx b/svgio/source/svgreader/svgcharacternode.cxx index 4e7c8e4794c5..4e24576158b7 100644 --- a/svgio/source/svgreader/svgcharacternode.cxx +++ b/svgio/source/svgreader/svgcharacternode.cxx @@ -408,6 +408,7 @@ namespace svgio::svgreader std::move(aLocale), aFill, COL_TRANSPARENT, + 0, // extra props for decorated aDecoColor, diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx index d5870e4cf7f6..45bd4a7ad43b 100644 --- a/svx/source/svdraw/svdotextdecomposition.cxx +++ b/svx/source/svdraw/svdotextdecomposition.cxx @@ -564,6 +564,7 @@ namespace rInfo.mpLocale ? *rInfo.mpLocale : css::lang::Locale(), aBFontColor, aTextFillColor, + rInfo.mrFont.GetFixKerning(), // attributes for TextDecoratedPortionPrimitive2D aBOverlineColor, @@ -592,7 +593,8 @@ namespace rFontAttribute, rInfo.mpLocale ? *rInfo.mpLocale : css::lang::Locale(), aBFontColor, - aTextFillColor); + aTextFillColor, + rInfo.mrFont.GetFixKerning()); } return pNewPrimitive; diff --git a/vcl/qa/cppunit/pdfexport/pdfexport2.cxx b/vcl/qa/cppunit/pdfexport/pdfexport2.cxx index 3e9f1eb76d3a..0713269c8f20 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport2.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport2.cxx @@ -4131,9 +4131,9 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest2, testTdf145873) int nPageObjectCount = pPdfPage->getObjectCount(); // tdf#145873: Without the fix #1 in place, this test would have failed with - // - Expected: 66 + // - Expected: 107 // - Actual : 3 - CPPUNIT_ASSERT_EQUAL(66, nPageObjectCount); + CPPUNIT_ASSERT_EQUAL(107, nPageObjectCount); auto pObject = pPdfPage->getObject(4); CPPUNIT_ASSERT_MESSAGE("no object", pObject != nullptr); commit e2dc0ae926ca8578cf5561c573febca7baa7c6df Author: Balazs Varga <[email protected]> AuthorDate: Fri Sep 26 17:03:06 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:59 2025 +0200 tdf#140866 - sc fix cell comments disappear after ods saving They disappeared because before saving the file to ods some other drawing objects very copied and pasted on the sheet which caused a recalculation of all the cell anchored drawing object's anchor position with SetCellAnchoredFromPosition since commit: 545737df40880875304bffc3f49800d1d2e99723 No need to recalculate the cell anchor position of Caption objects since their anchor position is handled differently. Change-Id: I83d54075974d9a7c2676af23f285e621afe0d523 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191548 Tested-by: Gabor Kelemen <[email protected]> Tested-by: Jenkins Reviewed-by: Balazs Varga <[email protected]> (cherry picked from commit d932a383766b6133ffe9ebf077f95cc328807b1b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191608 Reviewed-by: Xisco Fauli <[email protected]> (cherry picked from commit 161311deff7d1efaa7cca1f06b74df4d1b5f7efb) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191620 diff --git a/sc/qa/unit/data/ods/tdf140866.ods b/sc/qa/unit/data/ods/tdf140866.ods new file mode 100644 index 000000000000..5b3c73161782 Binary files /dev/null and b/sc/qa/unit/data/ods/tdf140866.ods differ diff --git a/sc/qa/unit/scshapetest.cxx b/sc/qa/unit/scshapetest.cxx index fbea25178581..7431f13a9f1e 100644 --- a/sc/qa/unit/scshapetest.cxx +++ b/sc/qa/unit/scshapetest.cxx @@ -25,6 +25,7 @@ #include <drwlayer.hxx> #include <fuconcustomshape.hxx> #include <fuconuno.hxx> +#include <postit.hxx> #include <tabvwsh.hxx> #include <userdat.hxx> @@ -78,6 +79,17 @@ static SdrObject* lcl_getSdrObjectbyName(ScDocument& rDoc, std::u16string_view r return pObj; } +static void lcl_SelectObjectByName(ScTabViewShell& rViewShell, std::u16string_view rObjName) +{ + bool bFound = rViewShell.SelectObject(rObjName); + CPPUNIT_ASSERT_MESSAGE( + OString(OUStringToOString(rObjName, RTL_TEXTENCODING_UTF8) + " not found.").getStr(), + bFound); + + CPPUNIT_ASSERT(rViewShell.GetViewData().GetScDrawView()->GetMarkedObjectList().GetMarkCount() + != 0); +} + CPPUNIT_TEST_FIXTURE(ScShapeTest, testTdf144242_OpenBezier_noSwapWH) { // Shapes, which have rotation incorporated in their points, got erroneously width-height @@ -1373,6 +1385,44 @@ CPPUNIT_TEST_FIXTURE(ScShapeTest, testTdf167450_copySheet) CPPUNIT_ASSERT_RECTANGLE_EQUAL_WITH_TOLERANCE(aRectSource, pObjTarget->GetLogicRect(), 1); } +CPPUNIT_TEST_FIXTURE(ScShapeTest, testTdf140866) +{ + // Load a document, which has a comment in cell $sheet2.$A$1, and a custom shape in cell + // $sheet2.$B$11. When the shape from $sheet2.$B$11 was copied and pasted to $sheet2.$D$9, + // the anchor position of comment is changed and after saved to ods the comment was gone. + createScDoc("ods/tdf140866.ods"); + ScDocument* pDoc = getScDoc(); + + // Check that we have the comment on A1 + ScPostIt* pNote = pDoc->GetNote(ScAddress(0, 0, 0)); + CPPUNIT_ASSERT(pNote); + CPPUNIT_ASSERT_EQUAL(u"Test 1"_ustr, pNote->GetText()); + + goToCell(u"$Sheet2.$B$11"_ustr); + lcl_SelectObjectByName(*getViewShell(), u"Shape 1"); + + // Copy and paste + dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); + goToCell(u"$Sheet2.$D$9"_ustr); + dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); + + // Check that we still have the comment on A1 + pNote = pDoc->GetNote(ScAddress(0, 0, 0)); + CPPUNIT_ASSERT(pNote); + CPPUNIT_ASSERT_EQUAL(u"Test 1"_ustr, pNote->GetText()); + + // Save, reload + saveAndReload(u"calc8"_ustr); + pDoc = getScDoc(); + // Check that we still have the comment on A1 after save&reload + pNote = pDoc->GetNote(ScAddress(0, 0, 0)); + // Without the fix in place the comment was gone and test would have failed with: + // assertion failed + // - Expression : pNote + CPPUNIT_ASSERT(pNote); + CPPUNIT_ASSERT_EQUAL(u"Test 1"_ustr, pNote->GetText()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx index d41f21e86d71..b5355bf0b0f0 100644 --- a/sc/source/core/data/drwlayer.cxx +++ b/sc/source/core/data/drwlayer.cxx @@ -2693,7 +2693,9 @@ bool ScDrawLayer::IsCellAnchored( const SdrObject& rObj ) { // Cell anchored object always has a user data, to store the anchor cell // info. If it doesn't then it's page-anchored. - return GetFirstUserDataOfType(&rObj, SC_UD_OBJDATA) != nullptr; + // tdf#140866: Caption objects anchor position are handled differently. + return GetFirstUserDataOfType(&rObj, SC_UD_OBJDATA) != nullptr + && rObj.GetObjIdentifier() != SdrObjKind::Caption; } bool ScDrawLayer::IsResizeWithCell( const SdrObject& rObj ) commit 21b756167b4b28ed5d5def8a8e1738e3c1e02b79 Author: Oliver Specht <[email protected]> AuthorDate: Thu Sep 25 07:23:05 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:59 2025 +0200 tdf#167973 Fixes case rotation in selection in multiple paragraphs Broken in commit b1170251fbca5b6b243902cf10695ab4c4c5642b because it checked the selection in a single paragraph only. Change-Id: If84aca87c9fee5750751cd91cb08372714f17eba Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191472 Tested-by: Jenkins Reviewed-by: Oliver Specht <[email protected]> (cherry picked from commit bb496f5494a23c247c86fdf5ae65054908df44ce) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191601 Reviewed-by: Xisco Fauli <[email protected]> (cherry picked from commit fd25b527b3c03f20050aad763b8eb18982f018c0) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191614 diff --git a/sw/source/uibase/shells/textsh.cxx b/sw/source/uibase/shells/textsh.cxx index cfd2d3a8ac45..ca3ad0f88fe7 100644 --- a/sw/source/uibase/shells/textsh.cxx +++ b/sw/source/uibase/shells/textsh.cxx @@ -896,7 +896,9 @@ void SwTextShell::ExecRotateTransliteration( SfxRequest& rReq ) { if (bSentenceCase) { - OUString aSelection = rSh.GetSelText().trim(); + OUString aSelection; + rSh.GetSelectedText(aSelection); + aSelection = aSelection.trim(); if (aSelection.getLength() <= 2 || (aSelection.indexOf(' ') < 0 && aSelection.indexOf(' ') < 0)) transFlags = m_aRotateCase.getNextMode(); } commit 74e492a939905b09a74213b8398e5dbb2da45b90 Author: Xisco Fauli <[email protected]> AuthorDate: Thu Sep 11 10:06:08 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:59 2025 +0200 mariadb-connector-c: upgrade to 3.3.17 c23.patch.0 has been fixed upstream Downloaded from https://dlm.mariadb.com/4441363/Connectors/c/connector-c-3.3.17/mariadb-connector-c-3.3.17-src.tar.gz Change-Id: Idf813aa383f22b8ae22ac92e23fc0ffa78050f38 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190795 Reviewed-by: Xisco Fauli <[email protected]> Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190809 Reviewed-by: Taichi Haradaguchi <[email protected]> diff --git a/download.lst b/download.lst index 0a54265cb57b..8c36f6e296e1 100644 --- a/download.lst +++ b/download.lst @@ -549,8 +549,8 @@ LXML_TARBALL := lxml-5.4.0.tar.gz # three static lines # so that git cherry-pick # will not run into conflicts -MARIADB_CONNECTOR_C_SHA256SUM := b593fdd3d5b8964a9feec2bf57a13e6cc8f178a4fe948e89f60ede9c53d621fe -MARIADB_CONNECTOR_C_TARBALL := mariadb-connector-c-3.3.15-src.tar.gz +MARIADB_CONNECTOR_C_SHA256SUM := a5abb7331508988f7287b481c1839bd929261ce38352cd0fde6c002c300e0c01 +MARIADB_CONNECTOR_C_TARBALL := mariadb-connector-c-3.3.17-src.tar.gz # three static lines # so that git cherry-pick # will not run into conflicts diff --git a/external/mariadb-connector-c/UnpackedTarball_mariadb-connector-c.mk b/external/mariadb-connector-c/UnpackedTarball_mariadb-connector-c.mk index 2cbce8b00032..36b44dde8871 100644 --- a/external/mariadb-connector-c/UnpackedTarball_mariadb-connector-c.mk +++ b/external/mariadb-connector-c/UnpackedTarball_mariadb-connector-c.mk @@ -31,7 +31,6 @@ $(eval $(call gb_UnpackedTarball_set_patchlevel,mariadb-connector-c,1)) $(eval $(call gb_UnpackedTarball_add_patches,mariadb-connector-c,\ external/mariadb-connector-c/clang-cl.patch.0 \ - external/mariadb-connector-c/c23.patch.0 \ external/mariadb-connector-c/0001-const-up-my_uca1400_collation_definitions.patch \ external/mariadb-connector-c/0001-const-up-mariadb_defaults-and-MADB_OS_CHARSET.patch \ )) diff --git a/external/mariadb-connector-c/c23.patch.0 b/external/mariadb-connector-c/c23.patch.0 deleted file mode 100644 index d19d6be4cdae..000000000000 --- a/external/mariadb-connector-c/c23.patch.0 +++ /dev/null @@ -1,11 +0,0 @@ ---- include/ma_global.h -+++ include/ma_global.h -@@ -683,7 +683,7 @@ - typedef int myf; /* Type of MyFlags in my_funcs */ - typedef char my_bool; /* Small bool */ - typedef unsigned long long my_ulonglong; --#if !defined(bool) && !defined(bool_defined) && (!defined(HAVE_BOOL) || !defined(__cplusplus)) -+#if !defined(bool) && !defined(bool_defined) && !(defined(__cplusplus) || __STDC_VERSION__ >= 202311L) - typedef char bool; /* Ordinary boolean values 0 1 */ - #endif - /* Macros for converting *constants* to the right type */ commit 97a3f5670510a9cf01ab378cd677cdb260263c80 Author: Laurent Balland <[email protected]> AuthorDate: Sat Sep 27 13:25:54 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:59 2025 +0200 tdf#168571 Restore gradient in Candy template draw:fill-gradient-name requires draw:fill="gradient" Change-Id: I3646b683486317e804adccb9faf994742fe1fb0c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191562 Reviewed-by: Laurent Balland <[email protected]> Tested-by: Jenkins (cherry picked from commit 771a93e3be34dfbd77b4dbba407caa9677090488) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191569 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> (cherry picked from commit a5dc5761eedf7dc8e33fc9cd2a0817c682c7270d) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191581 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/extras/source/templates/presnt/Candy/styles.xml b/extras/source/templates/presnt/Candy/styles.xml index 1873988c52d7..199fc77a5207 100644 --- a/extras/source/templates/presnt/Candy/styles.xml +++ b/extras/source/templates/presnt/Candy/styles.xml @@ -185,19 +185,19 @@ <style:text-properties fo:color="#000000" loext:opacity="100%"/> </style:style> <style:style style:name="Filled_20_Blue_20_Cyan" style:display-name="Filled Blue Cyan" style:family="graphic" style:parent-style-name="Filled"> - <style:graphic-properties draw:fill-gradient-name="Filled_20_Blue_20_Cyan"/> + <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled_20_Blue_20_Cyan"/> <style:text-properties fo:color="#ffffff" loext:opacity="100%"/> </style:style> <style:style style:name="Filled_20_Cyan_20_Red" style:display-name="Filled Cyan Red" style:family="graphic" style:parent-style-name="Filled"> - <style:graphic-properties draw:fill-gradient-name="Filled_20_Cyan_20_Red"/> + <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled_20_Cyan_20_Red"/> <style:text-properties fo:color="#ffffff" loext:opacity="100%"/> </style:style> <style:style style:name="Filled_20_Red_20_Orange" style:display-name="Filled Red Orange" style:family="graphic" style:parent-style-name="Filled"> - <style:graphic-properties draw:fill-gradient-name="Filled_20_Red_20_Orange"/> + <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled_20_Red_20_Orange"/> <style:text-properties fo:color="#ffffff" loext:opacity="100%"/> </style:style> <style:style style:name="Filled_20_Orange_20_Yellow" style:display-name="Filled Orange Yellow" style:family="graphic" style:parent-style-name="Filled"> - <style:graphic-properties draw:fill-gradient-name="Filled_20_Orange_20_Yellow"/> + <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled_20_Orange_20_Yellow"/> <style:text-properties fo:color="#ffffff" loext:opacity="100%"/> </style:style> <style:style style:name="Outlined" style:family="graphic" style:parent-style-name="Shapes"> commit e960667811dfa1111fc8aadf399c3b773b82db06 Author: Balazs Varga <[email protected]> AuthorDate: Tue Sep 23 13:50:24 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:58 2025 +0200 tdf#167042 - sc cell comments texts should not be deleted but the note text should be remembered in maNoteData to be able to later reconstruct a caption from it. Originally the bPreserveData was introduced and set to true in commit: b8b657123cc508c906622d20669507628c93e104 (tdf#104967 preserve isolated notes data in clipboard when closing document) The original bugdoc from tdf#104967 was checked with this patch and had no crash with it. Change-Id: I3b6c56e4828c11c2cab0351c95dd4bcb5762d86e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191396 Tested-by: Jenkins Reviewed-by: Balazs Varga <[email protected]> (cherry picked from commit 01765ffe843953bbf7d1e2822512306d3776b3be) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191461 Reviewed-by: Xisco Fauli <[email protected]> Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191465 diff --git a/sc/qa/unit/tiledrendering/data/tdf167042.ods b/sc/qa/unit/tiledrendering/data/tdf167042.ods new file mode 100644 index 000000000000..22e95e0597ef Binary files /dev/null and b/sc/qa/unit/tiledrendering/data/tdf167042.ods differ diff --git a/sc/qa/unit/tiledrendering/tiledrendering2.cxx b/sc/qa/unit/tiledrendering/tiledrendering2.cxx index b9df067e40dc..4fd669950546 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering2.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering2.cxx @@ -21,6 +21,7 @@ #include <docuno.hxx> #include <scmod.hxx> #include <tabvwsh.hxx> +#include <postit> using namespace com::sun::star; @@ -139,10 +140,8 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testDecimalSeparatorInfo) dispatchCommand(mxComponent, ".uno:GoToCell", aPropertyValues); // Cell A1 has language set to English. Decimal separator should be ".". - CPPUNIT_ASSERT_EQUAL(std::string("."), aView1.decimalSeparator); // Go to cell B1. - aPropertyValues = { comphelper::makePropertyValue("ToPoint", OUString("B$1")) }; dispatchCommand(mxComponent, ".uno:GoToCell", aPropertyValues); // Cell B1 has language set to Turkish. Decimal separator should be ",". @@ -201,6 +200,56 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testSplitPanesXLSX) assertXPath(pSheet, "/x:worksheet/x:sheetViews/x:sheetView/x:pane", "activePane", u"topRight"); } +CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testTdf167042) +{ + ScModelObj* pModelObj = createDoc("tdf167042.ods"); + ScDocument* pDoc = pModelObj->GetDocument(); + ViewCallback aView1; + + uno::Sequence<beans::PropertyValue> aPropertyValues + = { comphelper::makePropertyValue("ToPoint", OUString("$A$1")) }; + dispatchCommand(mxComponent, ".uno:GoToCell", aPropertyValues); + + Point aPoint = aView1.m_aCellCursorBounds.Center(); + + aPropertyValues = { comphelper::makePropertyValue("ToPoint", OUString("$B$1")) }; + dispatchCommand(mxComponent, ".uno:GoToCell", aPropertyValues); + + // Check that we have the comment on A1 + CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); + ScPostIt* pNote = pDoc->GetNote(ScAddress(0, 0, 0)); + CPPUNIT_ASSERT(pNote); + CPPUNIT_ASSERT_EQUAL(u"test1"_ustr, pNote->GetText()); + + uno::Sequence aArgs{ comphelper::makePropertyValue(u"PersistentCopy"_ustr, false) }; + dispatchCommand(mxComponent, u".uno:FormatPaintbrush"_ustr, aArgs); + + pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, aPoint.getX(), aPoint.getY(), 1, + MOUSE_LEFT, 0); + pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, aPoint.getX(), aPoint.getY(), 1, + MOUSE_LEFT, 0); + + // Check that FormatPaintbrush worked + vcl::Font aFont; + pDoc->GetPattern(0, 0, 0)->fillFontOnly(aFont); + CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be bold A1", WEIGHT_BOLD, aFont.GetWeight()); + + // Check that we still have the comment on A1 after FormatPaintbrush + pNote = pDoc->GetNote(ScAddress(0, 0, 0)); + CPPUNIT_ASSERT(pNote); + CPPUNIT_ASSERT_EQUAL(u"test1"_ustr, pNote->GetText()); + + dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); + + // Check that we still have the comment on A1 after Undo + pNote = pDoc->GetNote(ScAddress(0, 0, 0)); + CPPUNIT_ASSERT(pNote); + // Without the fix in place, this test would have failed with + // - Expected : test1 + // - Actual : + CPPUNIT_ASSERT_EQUAL(u"test1"_ustr, pNote->GetText()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx index 5b30ac8c470e..c44b9e7a1ebd 100644 --- a/sc/source/ui/undo/undoblk.cxx +++ b/sc/source/ui/undo/undoblk.cxx @@ -1021,9 +1021,13 @@ void ScUndoPaste::DoChange(bool bUndo) } sal_uInt16 nExtFlags = 0; + pDocShell->UpdatePaintExt(nExtFlags, maBlockRanges.Combine()); - rDoc.ForgetNoteCaptions(maBlockRanges, false); + // tdf#167042 - cell comments texts should not be deleted but + // the note text should be remembered in maNoteData to be able + // to later reconstruct a caption from it. + rDoc.ForgetNoteCaptions(maBlockRanges, true); aMarkData.MarkToMulti(); rDoc.DeleteSelection(nUndoFlags, aMarkData, false); // no broadcasting here for (size_t i = 0, n = maBlockRanges.size(); i < n; ++i) commit 523930027bb7f3850ae0bb4628af1c5101a14de4 Author: Xisco Fauli <[email protected]> AuthorDate: Wed Sep 10 12:22:44 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:58 2025 +0200 curl: patch CVE-2025-9086 and CVE-2025-10148 More info in https://curl.se/docs/CVE-2025-9086.html and https://curl.se/docs/CVE-2025-10148.html Change-Id: Ib4993a00efdabf0baa3fe0e25c66d850f370572a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190741 Tested-by: Jenkins Reviewed-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190752 Reviewed-by: Taichi Haradaguchi <[email protected]> diff --git a/external/curl/0001-cookie-don-t-treat-the-leading-slash-as-trailing.patch b/external/curl/0001-cookie-don-t-treat-the-leading-slash-as-trailing.patch new file mode 100644 index 000000000000..45fba1f8af4e --- /dev/null +++ b/external/curl/0001-cookie-don-t-treat-the-leading-slash-as-trailing.patch @@ -0,0 +1,54 @@ +From c6ae07c6a541e0e96d0040afb62b45dd37711300 Mon Sep 17 00:00:00 2001 +From: Daniel Stenberg <[email protected]> +Date: Mon, 11 Aug 2025 20:23:05 +0200 +Subject: [PATCH] cookie: don't treat the leading slash as trailing + +If there is only a leading slash in the path, keep that. Also add an +assert to make sure the path is never blank. + +Reported-by: Google Big Sleep +Closes #18266 +--- + lib/cookie.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/lib/cookie.c b/lib/cookie.c +index 914a4aca1..b72dd99bc 100644 +--- a/lib/cookie.c ++++ b/lib/cookie.c +@@ -296,9 +296,9 @@ static char *sanitize_cookie_path(const char *cookie_path) + /* Let cookie-path be the default-path. */ + return strdup("/"); + +- /* remove trailing slash */ ++ /* remove trailing slash when path is non-empty */ + /* convert /hoge/ to /hoge */ +- if(len && cookie_path[len - 1] == '/') ++ if(len > 1 && cookie_path[len - 1] == '/') + len--; + + return Curl_memdup0(cookie_path, len); +@@ -965,7 +965,7 @@ replace_existing(struct Curl_easy *data, + clist->spath && co->spath && /* both have paths */ + clist->secure && !co->secure && !secure) { + size_t cllen; +- const char *sep; ++ const char *sep = NULL; + + /* + * A non-secure cookie may not overlay an existing secure cookie. +@@ -974,8 +974,9 @@ replace_existing(struct Curl_easy *data, + * "/loginhelper" is ok. + */ + +- sep = strchr(clist->spath + 1, '/'); +- ++ DEBUGASSERT(clist->spath[0]); ++ if(clist->spath[0]) ++ sep = strchr(clist->spath + 1, '/'); + if(sep) + cllen = sep - clist->spath; + else +-- +2.39.5 + diff --git a/external/curl/0001-ws-get-a-new-mask-for-each-new-outgoing-frame.patch b/external/curl/0001-ws-get-a-new-mask-for-each-new-outgoing-frame.patch new file mode 100644 index 000000000000..99f497d26726 --- /dev/null +++ b/external/curl/0001-ws-get-a-new-mask-for-each-new-outgoing-frame.patch @@ -0,0 +1,61 @@ +From 84db7a9eae8468c0445b15aa806fa7fa806fa0f2 Mon Sep 17 00:00:00 2001 +From: Daniel Stenberg <[email protected]> +Date: Mon, 8 Sep 2025 14:14:15 +0200 +Subject: [PATCH] ws: get a new mask for each new outgoing frame + +Reported-by: Calvin Ruocco +Closes #18496 +--- + lib/ws.c | 28 +++++++++++++--------------- + 1 file changed, 13 insertions(+), 15 deletions(-) + +diff --git a/lib/ws.c b/lib/ws.c +index e973409b6..3b6542816 100644 +--- a/lib/ws.c ++++ b/lib/ws.c +@@ -875,6 +875,19 @@ static CURLcode ws_enc_add_frame(struct Curl_easy *data, + enc->payload_remain = enc->payload_len = payload_len; + ws_enc_info(enc, data, "sending"); + ++ /* 4 bytes random */ ++ ++ CURLcode result = ++ Curl_rand(data, (unsigned char *)&enc->mask, sizeof(enc->mask)); ++ if(result) ++ return result; ++ ++#ifdef DEBUGBUILD ++ if(getenv("CURL_WS_FORCE_ZERO_MASK")) ++ /* force the bit mask to 0x00000000, effectively disabling masking */ ++ memset(&enc->mask, 0, sizeof(enc->mask)); ++#endif ++ + /* add 4 bytes mask */ + memcpy(&head[hlen], &enc->mask, 4); + hlen += 4; +@@ -1335,21 +1347,7 @@ CURLcode Curl_ws_accept(struct Curl_easy *data, + subprotocol not requested by the client), the client MUST Fail + the WebSocket Connection. */ + +- /* 4 bytes random */ +- +- result = Curl_rand(data, (unsigned char *)&ws->enc.mask, +- sizeof(ws->enc.mask)); +- if(result) +- return result; +- +-#ifdef DEBUGBUILD +- if(getenv("CURL_WS_FORCE_ZERO_MASK")) +- /* force the bit mask to 0x00000000, effectively disabling masking */ +- memset(ws->enc.mask, 0, sizeof(ws->enc.mask)); +-#endif +- +- infof(data, "[WS] Received 101, switch to WebSocket; mask %02x%02x%02x%02x", +- ws->enc.mask[0], ws->enc.mask[1], ws->enc.mask[2], ws->enc.mask[3]); ++ infof(data, "[WS] Received 101, switch to WebSocket"); + + /* Install our client writer that decodes WS frames payload */ + result = Curl_cwriter_create(&ws_dec_writer, data, &ws_cw_decode, +-- +2.39.5 + diff --git a/external/curl/UnpackedTarball_curl.mk b/external/curl/UnpackedTarball_curl.mk index 4f21212eff8d..69914f58b9ee 100644 --- a/external/curl/UnpackedTarball_curl.mk +++ b/external/curl/UnpackedTarball_curl.mk @@ -25,6 +25,8 @@ $(eval $(call gb_UnpackedTarball_add_patches,curl,\ external/curl/curl-msvc-disable-protocols.patch.1 \ external/curl/zlib.patch.0 \ external/curl/configurable-z-option.patch.0 \ + external/curl/0001-cookie-don-t-treat-the-leading-slash-as-trailing.patch \ + external/curl/0001-ws-get-a-new-mask-for-each-new-outgoing-frame.patch \ )) ifeq ($(OS)-$(COM_IS_CLANG),WNT-TRUE) commit 70c88675e946e25ac45700a62e6397c81eb382b3 Author: Noel Grandin <[email protected]> AuthorDate: Mon Sep 22 10:51:21 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:58 2025 +0200 tdf#166895 Document Colors do not appear anymore in the color selection missed a spot where we are using surrogate functionality. Also rename ForEachCharacterBrushItem->ForEachCharacterBackgroundBrushItem to make it more obvious. Regression from commit 56d35ad0eaccd353c8acd2a259293199e233e8ec Author: Noel Grandin <[email protected]> Date: Mon Sep 9 17:14:43 2024 +0200 RES_CHRATR_HIGHLIGHT does not need surrogate support and commit 08c58ac51962b65b57c5b76a45467d45807ef02d Author: Noel Grandin <[email protected]> Date: Mon Sep 16 21:04:59 2024 +0200 dont use GetItemSurrogates for gathering SvxColorItem and commit b6a5cdc0f753c8ed6ed080f9189ac2e2601dce9d Author: Noel Grandin <[email protected]> Date: Tue Sep 17 20:19:06 2024 +020 dont use GetItemSurrogates for gathering SvxBrushItem Change-Id: Id67d78aa82f8731555f06b23760c4ea8f0d8eeb5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191317 Tested-by: Jenkins Reviewed-by: Noel Grandin <[email protected]> (cherry picked from commit 50099a54cd32afd361810e3059af3b420741d41b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191353 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 3272667958fd..c2a1d54760b0 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -1450,7 +1450,7 @@ public: SW_DLLPUBLIC void ForEachCharacterUnderlineItem(const std::function<bool(const SvxUnderlineItem&)>& ) const; /// Iterate over all RES_CHRATR_BACKGROUND SvxBrushItem, if the function returns false, iteration is stopped - SW_DLLPUBLIC void ForEachCharacterBrushItem(const std::function<bool(const SvxBrushItem&)>& ) const; + SW_DLLPUBLIC void ForEachCharacterBackgroundBrushItem(const std::function<bool(const SvxBrushItem&)>& ) const; /// Iterate over all RES_CHRATR_FONT/RES_CHRATR_CJK_FONT/RES_CHRATR_CTL_FONT SvxFontItem, if the function returns false, iteration is stopped SW_DLLPUBLIC void ForEachCharacterFontItem(TypedWhichId<SvxFontItem> nWhich, bool bIgnoreAutoStyles, const std::function<bool(const SvxFontItem&)>& ); @@ -1473,6 +1473,9 @@ public: /// Iterate over all RES_BACKGROUND SvxBrushItem, if the function returns false, iteration is stopped SW_DLLPUBLIC void ForEachBackgroundBrushItem(const std::function<bool(const SvxBrushItem&)>& ) const; + /// Iterate over all RES_CHRATR_HIGHLIGHT SvxBrushItem, if the function returns false, iteration is stopped + SW_DLLPUBLIC void ForEachCharacterHighlightBrushItem(const std::function<bool(const SvxBrushItem&)>& ) const; + // Call into intransparent Basic; expect possible Return String. void ExecMacro( const SvxMacro& rMacro, OUString* pRet, SbxArray* pArgs ); diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index 3a6701b2a4d1..be2e1c700832 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -1448,12 +1448,18 @@ void SwDoc::ForEachCharacterUnderlineItem( const std::function<bool(const SvxUnd ForEachCharacterItem(this, RES_CHRATR_UNDERLINE, rFunc); } -/// Iterate over all SvxBrushItem, if the function returns false, iteration is stopped -void SwDoc::ForEachCharacterBrushItem( const std::function<bool(const SvxBrushItem&)>& rFunc ) const +/// Iterate over all RES_CHRATR_BACKGROUND SvxBrushItem, if the function returns false, iteration is stopped +void SwDoc::ForEachCharacterBackgroundBrushItem( const std::function<bool(const SvxBrushItem&)>& rFunc ) const { ForEachCharacterItem(this, RES_CHRATR_BACKGROUND, rFunc); } +/// Iterate over all RES_CHRATR_HIGHLIGHT SvxBrushItem, if the function returns false, iteration is stopped +void SwDoc::ForEachCharacterHighlightBrushItem( const std::function<bool(const SvxBrushItem&)>& rFunc ) const +{ + ForEachCharacterItem(this, RES_CHRATR_HIGHLIGHT, rFunc); +} + /// Iterate over all RES_TXTATR_UNKNOWN_CONTAINER SvXMLAttrContainerItem, if the function returns false, iteration is stopped void SwDoc::ForEachTxtAtrContainerItem(const std::function<bool(const SvXMLAttrContainerItem&)>& rFunc ) const { diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx index 9d8e1f7d90b0..ba1e1645a85a 100644 --- a/sw/source/core/doc/docfmt.cxx +++ b/sw/source/core/doc/docfmt.cxx @@ -19,6 +19,8 @@ #include <libxml/xmlwriter.h> #include <hintids.hxx> +#include <editeng/brushitem.hxx> +#include <editeng/colritem.hxx> #include <svl/itemiter.hxx> #include <svl/numformat.hxx> #include <editeng/tstpitem.hxx> @@ -28,7 +30,6 @@ #include <officecfg/Office/Common.hxx> #include <osl/diagnose.h> #include <svl/zforlist.hxx> -#include <svx/DocumentColorHelper.hxx> #include <comphelper/processfactory.hxx> #include <unotools/configmgr.hxx> #include <sal/log.hxx> @@ -2059,11 +2060,31 @@ void SwDBData::dumpAsXml(xmlTextWriterPtr pWriter) const std::set<Color> SwDoc::GetDocColors() { std::set<Color> aDocColors; - SwAttrPool& rPool = GetAttrPool(); - svx::DocumentColorHelper::queryColors<SvxColorItem>(RES_CHRATR_COLOR, &rPool, aDocColors); - svx::DocumentColorHelper::queryColors<SvxBrushItem>(RES_CHRATR_HIGHLIGHT, &rPool, aDocColors); - svx::DocumentColorHelper::queryColors<SvxBrushItem>(RES_CHRATR_BACKGROUND, &rPool, aDocColors); + ForEachCharacterColorItem( + [&aDocColors] (const SvxColorItem& rColorItem) -> bool + { + Color aColor(rColorItem.GetValue()); + if (COL_AUTO != aColor) + aDocColors.insert(aColor); + return true; + }); + ForEachCharacterHighlightBrushItem( + [&aDocColors] (const SvxBrushItem& rColorItem) -> bool + { + Color aColor(rColorItem.GetColor()); + if (COL_AUTO != aColor) + aDocColors.insert(aColor); + return true; + }); + ForEachCharacterBackgroundBrushItem( + [&aDocColors] (const SvxBrushItem& rColorItem) -> bool + { + Color aColor(rColorItem.GetColor()); + if (COL_AUTO != aColor) + aDocColors.insert(aColor); + return true; + }); return aDocColors; } diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx index 898db5c7ca94..c796679b8726 100644 --- a/sw/source/filter/ww8/rtfexport.cxx +++ b/sw/source/filter/ww8/rtfexport.cxx @@ -1379,7 +1379,7 @@ void RtfExport::OutColorTable() { InsColor(pBackground->GetColor()); } - m_rDoc.ForEachCharacterBrushItem([this](const SvxBrushItem& rBrush) -> bool { + m_rDoc.ForEachCharacterBackgroundBrushItem([this](const SvxBrushItem& rBrush) -> bool { InsColor(rBrush.GetColor()); return true; }); commit e056c403690a854f55645f3b636ac34fb83876a5 Author: Jim Raykowski <[email protected]> AuthorDate: Wed Sep 24 17:09:25 2025 -0800 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:58 2025 +0200 tdf#166713 Fix crash in lcl_FoldedOutlineNodeEndOfParaSplit by handling the case of a paragraph outline level set by direct formatting. Change-Id: Ida0c8f91f0fb0584b39c16b3ddf2201429c6943f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191471 Tested-by: Jenkins Reviewed-by: Jim Raykowski <[email protected]> (cherry picked from commit fd9ae53e39f3219474461d1e8e3220d8efdfcecb) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191482 Reviewed-by: Xisco Fauli <[email protected]> (cherry picked from commit 5b9e275838ec1cd08f1c1755de545b4f7f34c7d1) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191500 diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx index c9fd6049fc1b..959eb327a8a4 100644 --- a/sw/source/uibase/wrtsh/wrtsh1.cxx +++ b/sw/source/uibase/wrtsh/wrtsh1.cxx @@ -1394,6 +1394,10 @@ static bool lcl_FoldedOutlineNodeEndOfParaSplit(SwWrtShell *pThis) SwTextNode* pNd = pDoc->GetNodes().MakeTextNode(*pEndNd, pTextNode->GetTextColl(), true); + // if the outline level is not set in style then it is set in direct formatting + if (!pTextNode->GetTextColl()->GetAttrOutlineLevel()) + pNd->SetAttrOutlineLevel(pTextNode->GetAttrOutlineLevel()); + (void) rOutlineNodes.Seek_Entry(pNd, &nPos); pThis->GotoOutline(nPos); commit 7d2d7beda29d204bae39b66121f5723ff3aa5cc1 Author: Balazs Varga <[email protected]> AuthorDate: Mon Sep 22 17:39:58 2025 +0200 Commit: Andras Timar <[email protected]> CommitDate: Tue Sep 30 12:31:58 2025 +0200 tdf#168422 - Fix SUMPRODUCT calculation is broken in some cases Double refs with operators only trimmable in case of one root paramater. Follow up of: 969ddf72824942be9755a8d14482d6549a2231ce regression after commit: 969ddf72824942be9755a8d14482d6549a2231ce Change-Id: I87365efc5b7bc54bfdda4d33e4b5b9550d6e2602 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191365 Tested-by: Jenkins Reviewed-by: Balazs Varga <[email protected]> (cherry picked from commit 22c0eb18f5dcaa76d4fc7a65e98e1d20589ced04) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191380 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/sc/qa/unit/data/functions/array/fods/sumproduct.fods b/sc/qa/unit/data/functions/array/fods/sumproduct.fods index 405b4f56f918..39a1a5260ebc 100644 --- a/sc/qa/unit/data/functions/array/fods/sumproduct.fods +++ b/sc/qa/unit/data/functions/array/fods/sumproduct.fods @@ -1,2875 +1,3056 @@ <?xml version="1.0" encoding="UTF-8"?> -<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:scr ipt="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:form x="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.spreadsheet"> +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/200 4/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns :css3t="http://www.w3.org/TR/css3-text/" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" office:version="1.4" office:mimetype="application/vnd.oasis.opendocument.spreadsheet"> + <office:meta><dc:date>2025-09-22T19:44:09.641976200</dc:date><meta:editing-duration>PT10M48S</meta:editing-duration><meta:editing-cycles>4</meta:editing-cycles><meta:generator>Collabora_OfficeDev/25.04.5.1$Windows_X86_64 LibreOffice_project/3dc7fe01dec3493d3e905e6099ffa574ec741c95</meta:generator><meta:document-statistic meta:table-count="2" meta:cell-count="298" meta:object-count="0"/></office:meta> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="VisibleAreaTop" config:type="int">0</config:config-item> + <config:config-item config:name="VisibleAreaLeft" config:type="int">0</config:config-item> + <config:config-item config:name="VisibleAreaWidth" config:type="int">22010</config:config-item> + <config:config-item config:name="VisibleAreaHeight" config:type="int">4262</config:config-item> + <config:config-item-map-indexed config:name="Views"> + <config:config-item-map-entry> + <config:config-item config:name="ViewId" config:type="string">view1</config:config-item> + <config:config-item-map-named config:name="Tables"> + <config:config-item-map-entry config:name="Sheet1"> + <config:config-item config:name="CursorPositionX" config:type="int">0</config:config-item> + <config:config-item config:name="CursorPositionY" config:type="int">0</config:config-item> + <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item> + <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item> + <config:config-item config:name="PositionRight" config:type="int">0</config:config-item> + <config:config-item config:name="PositionTop" config:type="int">0</config:config-item> + <config:config-item config:name="PositionBottom" config:type="int">0</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ZoomValue" config:type="int">100</config:config-item> + <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> + <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> + <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseTrailingEmptyLinesInLayout" config:type="boolean">false</config:config-item> + </config:config-item-map-entry> + <config:config-item-map-entry config:name="Sheet2"> + <config:config-item config:name="CursorPositionX" config:type="int">3</config:config-item> + <config:config-item config:name="CursorPositionY" config:type="int">51</config:config-item> + <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item> + <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item> + <config:config-item config:name="PositionRight" config:type="int">0</config:config-item> + <config:config-item config:name="PositionTop" config:type="int">0</config:config-item> + <config:config-item config:name="PositionBottom" config:type="int">25</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ZoomValue" config:type="int">100</config:config-item> + <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> + <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> + <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseTrailingEmptyLinesInLayout" config:type="boolean">false</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-named> + <config:config-item config:name="ActiveTable" config:type="string">Sheet1</config:config-item> + <config:config-item config:name="HorizontalScrollbarWidth" config:type="int">1851</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ZoomValue" config:type="int">100</config:config-item> + <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> + <config:config-item config:name="ShowPageBreakPreview" config:type="boolean">false</config:config-item> + <config:config-item config:name="ShowZeroValues" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowNotes" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowNoteAuthor" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowFormulasMarks" config:type="boolean">false</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item> + <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item> + <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> + <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsValueHighlightingEnabled" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item> + <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item> + <config:config-item config:name="RasterResolutionX" config:type="int">1000</config:config-item> + <config:config-item config:name="RasterResolutionY" config:type="int">1000</config:config-item> + <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item> + <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item> + <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> + <config:config-item config:name="FormulaBarHeight" config:type="short">1</config:config-item> + <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> + <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> + <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseTrailingEmptyLinesInLayout" config:type="boolean">false</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-indexed> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="AutoCalculate" config:type="boolean">true</config:config-item> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item> + <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> + <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> + <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item> + <config:config-item config:name="IsDocumentShared" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">3</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterName" config:type="string">Microsoft Print to PDF (átirányítás: 1)</config:config-item> + <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary">hBb+/01pY3Jvc29mdCBQcmludCB0byBQREYgKMOhdGlyw6FuecOtdMOhczogMSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUmVtb3RlIERlc2t0b3AgRWFzeSBQcmludAAAAAAAAAAWAAEAPhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAIAAoAOEAdABpAHIA4QBuAAAAAAABBAMG3ABYFAMtAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDQACwDLBHiXo1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAABkAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFNNVEoAAAAAEADAAHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwRAABWNERNAQAAAAAAAACcCnAiHAAAAOwAAAADAAAA+gFPCDTmd02D7gdIF8A1gdAAAABMAAAAAwAAAAAIAAAAAAAAAAAAAAMAAAAACAAAKgAAAAAIAAADAAAAQAAAAFYAAAAAEAAARABvAGMAdQBtAGUAbgB0AFUAcwBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AE8AdwBuAGUAcgBQAGEAcwBzAHcAbwByAGQAAABEAG8AYwB1AG0AZQBuAHQAQwByA HkAcAB0AFMAZQBjAHUAcgBpAHQAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAENPTVBBVF9EVVBMRVhfTU9ERRMARHVwbGV4TW9kZTo6VW5rbm93bgwAUFJJTlRFUl9OQU1FKwBNaWNyb3NvZnQgUHJpbnQgdG8gUERGICjDoXRpcsOhbnnDrXTDoXM6IDEpCwBEUklWRVJfTkFNRRkAUmVtb3RlIERlc2t0b3AgRWFzeSBQcmludA==</config:config-item> + <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item> + <config:config-item config:name="RasterResolutionX" config:type="int">1000</config:config-item> + <config:config-item config:name="RasterResolutionY" config:type="int">1000</config:config-item> + <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item> + <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item> + <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="ShowFormulasMarks" config:type="boolean">false</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowNoteAuthor" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowNotes" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowZeroValues" config:type="boolean">true</config:config-item> + <config:config-item config:name="SyntaxStringRef" config:type="short">7</config:config-item> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> + <config:config-item-map-named config:name="ScriptConfiguration"> + <config:config-item-map-entry config:name="Sheet1"> + <config:config-item config:name="CodeName" config:type="string">Sheet1</config:config-item> + </config:config-item-map-entry> + <config:config-item-map-entry config:name="Sheet2"> + <config:config-item config:name="CodeName" config:type="string">Sheet2</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-named> + </config:config-item-set> + </office:settings> + <office:scripts> + <office:script script:language="ooo:Basic"> + <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </office:script> + </office:scripts> + <office:font-face-decls> + <style:font-face style:name="Droid Sans Devanagari" svg:font-family="'Droid Sans Devanagari'" style:font-family-generic="system" style:font-pitch="variable"/> + <style:font-face style:name="Droid Sans Fallback" svg:font-family="'Droid Sans Fallback'" style:font-family-generic="system" style:font-pitch="variable"/> + <style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/> + <style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/> + <style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/> + </office:font-face-decls> <office:styles> <style:default-style style:family="table-cell"> - <style:paragraph-properties style:tab-stop-distance="36pt"/> - <style:text-properties style:font-name="Liberation Sans" fo:language="en" fo:country="US" style:font-name-asian="DejaVu Sans1" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans1" style:language-complex="hi" style:country-complex="IN"/> + <style:paragraph-properties style:tab-stop-distance="1.27cm"/> + <style:text-properties style:font-name="Liberation Sans" fo:font-size="10pt" fo:language="en" fo:country="US" style:font-name-asian="Microsoft YaHei" style:font-size-asian="10pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lucida Sans" style:font-size-complex="10pt" style:language-complex="hi" style:country-complex="IN"/> </style:default-style> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" style:writing-mode="page"/> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" loext:tab-stop-distance="0cm" style:writing-mode="page" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" fo:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-family-asian="'Segoe UI'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-family-complex="Tahoma" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/> + </style:default-style> + <style:style style:name="Default" style:family="graphic"/> + <style:style style:name="Note" style:family="graphic" style:parent-style-name="Default"> + <style:graphic-properties draw:stroke="solid" draw:marker-start="Arrowheads_20_1" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:fill="solid" draw:fill-color="#ffffc0" draw:auto-grow-height="true" draw:auto-grow-width="false" fo:padding-top="0.1cm" fo:padding-bottom="0.1cm" fo:padding-left="0.1cm" fo:padding-right="0.1cm" draw:shadow="visible" draw:shadow-offset-x="0.1cm" draw:shadow-offset-y="0.1cm"/> + <style:text-properties style:font-name="Liberation Sans" fo:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="10pt" style:font-name-asian="Microsoft YaHei" style:font-family-asian="'Microsoft YaHei'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="10pt" style:font-name-complex="Lucida Sans" style:font-family-complex="'Lucida Sans'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="10pt"/> + </style:style> <number:number-style style:name="N0"> <number:number number:min-integer-digits="1"/> </number:number-style> <number:number-style style:name="N3"> - <number:number number:decimal-places="0" loext:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> </number:number-style> - <number:currency-style style:name="N122P0" style:volatile="true"> - <number:number number:decimal-places="2" loext:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:currency-style style:name="N149P0" style:volatile="true"> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> <number:text> </number:text> <number:currency-symbol number:language="cs" number:country="CZ">Kč</number:currency-symbol> </number:currency-style> - <number:currency-style style:name="N122"> + <number:currency-style style:name="N149"> <style:text-properties fo:color="#ff0000"/> <number:text>-</number:text> - <number:number number:decimal-places="2" loext:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> <number:text> </number:text> <number:currency-symbol number:language="cs" number:country="CZ">Kč</number:currency-symbol> - <style:map style:condition="value()>=0" style:apply-style-name="N122P0"/> + <style:map style:condition="value()>=0" style:apply-style-name="N149P0"/> </number:currency-style> - <number:number-style style:name="N126P0" style:volatile="true"> + <number:number-style style:name="N153P0" style:volatile="true"> <number:text> $</number:text> - <number:number number:decimal-places="2" loext:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> <number:text> </number:text> </number:number-style> - <number:number-style style:name="N126P1" style:volatile="true"> + <number:number-style style:name="N153P1" style:volatile="true"> <number:text> $(</number:text> - <number:number number:decimal-places="2" loext:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> <number:text>)</number:text> </number:number-style> - <number:number-style style:name="N126P2" style:volatile="true"> + <number:number-style style:name="N153P2" style:volatile="true"> <number:text> $-</number:text> - <number:number number:decimal-places="0" loext:min-decimal-places="0" number:min-integer-digits="0"/> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="0"/> <number:text> </number:text> </number:number-style> - <number:text-style style:name="N126"> + <number:text-style style:name="N153"> <number:text-content/> <number:text> </number:text> - <style:map style:condition="value()>0" style:apply-style-name="N126P0"/> - <style:map style:condition="value()<0" style:apply-style-name="N126P1"/> - <style:map style:condition="value()=0" style:apply-style-name="N126P2"/> + <style:map style:condition="value()>0" style:apply-style-name="N153P0"/> + <style:map style:condition="value()<0" style:apply-style-name="N153P1"/> + <style:map style:condition="value()=0" style:apply-style-name="N153P2"/> </number:text-style> - <number:number-style style:name="N127"> - <number:scientific-number number:decimal-places="14" loext:min-decimal-places="14" number:min-integer-digits="1" number:min-exponent-digits="3" loext:exponent-interval="1" loext:forced-exponent-sign="true"/> + <number:number-style style:name="N154"> + <number:scientific-number number:decimal-places="14" number:min-decimal-places="14" number:min-integer-digits="1" number:min-exponent-digits="3" number:exponent-interval="1" number:forced-exponent-sign="true"/> </number:number-style> - <number:number-style style:name="N315P0" style:volatile="true"> - <number:number number:decimal-places="0" loext:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> + <number:number-style style:name="N157P0" style:volatile="true"> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> </number:number-style> - <number:number-style style:name="N315P1" style:volatile="true"> + <number:number-style style:name="N157P1" style:volatile="true"> <number:text>-</number:text> - <number:number number:decimal-places="0" loext:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> </number:number-style> - <number:number-style style:name="N315P2" style:volatile="true"> + <number:number-style style:name="N157P2" style:volatile="true"> <number:text>- </number:text> </number:number-style> - <number:text-style style:name="N315"> + <number:text-style style:name="N157"> <number:text-content/> <number:text> </number:text> - <style:map style:condition="value()>0" style:apply-style-name="N315P0"/> - <style:map style:condition="value()<0" style:apply-style-name="N315P1"/> - <style:map style:condition="value()=0" style:apply-style-name="N315P2"/> + <style:map style:condition="value()>0" style:apply-style-name="N157P0"/> + <style:map style:condition="value()<0" style:apply-style-name="N157P1"/> + <style:map style:condition="value()=0" style:apply-style-name="N157P2"/> </number:text-style> - <number:currency-style style:name="N129P0" style:volatile="true"> + <number:currency-style style:name="N159P0" style:volatile="true"> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:text> </number:text> + <number:currency-symbol number:language="de" number:country="DE">€</number:currency-symbol> + </number:currency-style> + <number:currency-style style:name="N159"> + <style:text-properties fo:color="#ff0000"/> + <number:text>-</number:text> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:text> </number:text> + <number:currency-symbol number:language="de" number:country="DE">€</number:currency-symbol> + <style:map style:condition="value()>=0" style:apply-style-name="N159P0"/> + </number:currency-style> + <number:number-style style:name="N160"> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="1"/> + <number:text>×</number:text> + </number:number-style> + <number:currency-style style:name="N162P0" style:volatile="true"> <number:currency-symbol number:language="en" number:country="GB">£</number:currency-symbol> - <number:number number:decimal-places="0" loext:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> </number:currency-style> - <number:currency-style style:name="N129"> + <number:currency-style style:name="N162"> <number:text>-</number:text> <number:currency-symbol number:language="en" number:country="GB">£</number:currency-symbol> - <number:number number:decimal-places="0" loext:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> - <style:map style:condition="value()>=0" style:apply-style-name="N129P0"/> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> + <style:map style:condition="value()>=0" style:apply-style-name="N162P0"/> </number:currency-style> - <number:currency-style style:name="N131P0" style:volatile="true"> + <number:currency-style style:name="N164P0" style:volatile="true"> <number:currency-symbol number:language="en" number:country="GB">£</number:currency-symbol> - <number:number number:decimal-places="2" loext:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> </number:currency-style> - <number:currency-style style:name="N131"> + <number:currency-style style:name="N164"> <number:text>-</number:text> <number:currency-symbol number:language="en" number:country="GB">£</number:currency-symbol> - <number:number number:decimal-places="2" loext:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> - <style:map style:condition="value()>=0" style:apply-style-name="N131P0"/> + <number:number number:decimal-places="2" number:min-decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <style:map style:condition="value()>=0" style:apply-style-name="N164P0"/> </number:currency-style> - <number:currency-style style:name="N132P0" style:volatile="true"> + <number:currency-style style:name="N165P0" style:volatile="true"> <number:currency-symbol number:language="en" number:country="GB">£</number:currency-symbol> - <number:number number:decimal-places="0" loext:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> + <number:number number:decimal-places="0" number:min-decimal-places="0" number:min-integer-digits="1" number:grouping="true"/> </number:currency-style> - <number:currency-style style:name="N132"> + <number:currency-style style:name="N165"> <style:text-properties fo:color="#ff0000"/> -e ... etc. - the rest is truncated
