From 7b6055e76d809d2b72dd1a793244d858f4a62e0e Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Sat, 24 Jan 2026 18:43:25 +0100 Subject: [PATCH] Make go to flow widget themable --- YACReader/goto_flow_toolbar.cpp | 53 +++++++++-------- YACReader/goto_flow_toolbar.h | 7 ++- YACReader/goto_flow_widget.cpp | 10 ++++ YACReader/goto_flow_widget.h | 6 +- YACReader/themes/theme.h | 33 +++++++++++ YACReader/themes/theme_factory.cpp | 87 ++++++++++++++++++++++++++++ YACReader/yacreader_images.qrc | 6 +- images/centerFlow.svg | 11 ++++ images/gotoFlow.svg | 11 ++++ images/imgCenterSlide.png | Bin 298 -> 0 bytes images/imgCenterSlide@2x.png | Bin 465 -> 0 bytes images/imgCenterSlidePressed.png | Bin 339 -> 0 bytes images/imgCenterSlidePressed@2x.png | Bin 563 -> 0 bytes images/imgGoToSlide.png | Bin 204 -> 0 bytes images/imgGoToSlide@2x.png | Bin 291 -> 0 bytes images/imgGoToSlidePressed.png | Bin 241 -> 0 bytes images/imgGoToSlidePressed@2x.png | Bin 374 -> 0 bytes 17 files changed, 191 insertions(+), 33 deletions(-) create mode 100644 images/centerFlow.svg create mode 100644 images/gotoFlow.svg delete mode 100644 images/imgCenterSlide.png delete mode 100644 images/imgCenterSlide@2x.png delete mode 100644 images/imgCenterSlidePressed.png delete mode 100644 images/imgCenterSlidePressed@2x.png delete mode 100644 images/imgGoToSlide.png delete mode 100644 images/imgGoToSlide@2x.png delete mode 100644 images/imgGoToSlidePressed.png delete mode 100644 images/imgGoToSlidePressed@2x.png diff --git a/YACReader/goto_flow_toolbar.cpp b/YACReader/goto_flow_toolbar.cpp index c0c35de2..2f45af1d 100644 --- a/YACReader/goto_flow_toolbar.cpp +++ b/YACReader/goto_flow_toolbar.cpp @@ -18,19 +18,6 @@ GoToFlowToolBar::GoToFlowToolBar(QWidget *parent) quickNavi->setLayout(naviLayout); slider = new QSlider(Qt::Horizontal, this); - slider->setStyleSheet( - "QSlider::groove:horizontal {" - " border: 1px solid #22FFFFFF;" - " border-radius: 1px;" - " background: #77000000;" - " margin: 2px 0;" - " padding: 1px;" - "}" - "QSlider::handle:horizontal {" - " background: #55FFFFFF;" - " width: 48px;" - " border-radius: 1px;" - "}"); connect(slider, &QSlider::valueChanged, this, &GoToFlowToolBar::setCenter); connect(slider, &QSlider::valueChanged, this, &GoToFlowToolBar::setPage); @@ -41,35 +28,25 @@ GoToFlowToolBar::GoToFlowToolBar(QWidget *parent) edit = new QLineEdit(); edit->setValidator(v); edit->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - edit->setStyleSheet("QLineEdit {border: 1px solid #77000000; background: #55000000; color: white; padding: 3px 5px 5px 5px; margin: 13px 5px 12px 5px; font-weight:bold}"); edit->setFixedSize(54, 50); edit->setAttribute(Qt::WA_MacShowFocusRect, false); - // edit->setAttribute(Qt::WA_LayoutUsesWidgetRect,true); - // edit->resize(QSize(54,50)); edit->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); - // edit->setAutoFillBackground(false); connect(edit, &QLineEdit::returnPressed, this, &GoToFlowToolBar::goTo); - QString centerButtonCSS = "QPushButton {background-image: url(:/images/imgCenterSlide.png); width: 100%; height:100%; background-repeat: none; border: none;} " - "QPushButton:focus { border: none; outline: none;}" - "QPushButton:pressed {background-image: url(:/images/imgCenterSlidePressed.png); width: 100%; height:100%; background-repeat: none; border: none;} "; centerButton = new QPushButton(); - centerButton->setStyleSheet(centerButtonCSS); + centerButton->setIconSize(QSize(12, 12)); centerButton->setFixedSize(26, 50); centerButton->setAttribute(Qt::WA_LayoutUsesWidgetRect, true); connect(centerButton, &QAbstractButton::clicked, this, &GoToFlowToolBar::centerSlide); - QString goToButtonCSS = "QPushButton {background-image: url(:/images/imgGoToSlide.png); width: 100%; height:100%; background-repeat: none; border: none;} " - "QPushButton:focus { border: none; outline: none;}" - "QPushButton:pressed {background-image: url(:/images/imgGoToSlidePressed.png); width: 100%; height:100%; background-repeat: none; border: none;} "; goToButton = new QPushButton(); - goToButton->setStyleSheet(goToButtonCSS); + goToButton->setIconSize(QSize(12, 12)); goToButton->setFixedSize(32, 50); goToButton->setAttribute(Qt::WA_LayoutUsesWidgetRect, true); connect(goToButton, &QPushButton::clicked, this, &GoToFlowToolBar::goTo); goToButton2 = new QPushButton(); - goToButton2->setStyleSheet(goToButtonCSS); + goToButton2->setIconSize(QSize(12, 12)); goToButton2->setFixedSize(32, 50); goToButton2->setAttribute(Qt::WA_LayoutUsesWidgetRect, true); connect(goToButton2, &QPushButton::clicked, this, &GoToFlowToolBar::goTo); @@ -94,12 +71,34 @@ GoToFlowToolBar::GoToFlowToolBar(QWidget *parent) updateOptions(); setFixedHeight(50); + + initTheme(this); +} + +void GoToFlowToolBar::applyTheme(const Theme &theme) +{ + auto goToFlowTheme = theme.goToFlowWidget; + + slider->setStyleSheet(goToFlowTheme.sliderQSS); + edit->setStyleSheet(goToFlowTheme.editQSS); + pageHint->setStyleSheet(goToFlowTheme.labelQSS); + + centerButton->setStyleSheet(goToFlowTheme.buttonQSS); + centerButton->setIcon(goToFlowTheme.centerIcon); + + goToButton->setStyleSheet(goToFlowTheme.buttonQSS); + goToButton->setIcon(goToFlowTheme.goToIcon); + + goToButton2->setStyleSheet(goToFlowTheme.buttonQSS); + goToButton2->setIcon(goToFlowTheme.goToIcon); + + update(); } void GoToFlowToolBar::paintEvent(QPaintEvent *) { QPainter painter(this); - painter.fillRect(0, 0, width(), height(), QColor(0x99000000)); + painter.fillRect(0, 0, width(), height(), theme.goToFlowWidget.toolbarBackgroundColor); } void GoToFlowToolBar::setPage(int pageNumber) diff --git a/YACReader/goto_flow_toolbar.h b/YACReader/goto_flow_toolbar.h index ba5b0d26..615a3511 100644 --- a/YACReader/goto_flow_toolbar.h +++ b/YACReader/goto_flow_toolbar.h @@ -4,15 +4,20 @@ #include #include +#include "themable.h" + class QLineEdit; class QIntValidator; class QPushButton; class QSlider; class QLabel; -class GoToFlowToolBar : public QStackedWidget +class GoToFlowToolBar : public QStackedWidget, protected Themable { Q_OBJECT +protected: + void applyTheme(const Theme &theme) override; + private: QLineEdit *edit; QSlider *slider; diff --git a/YACReader/goto_flow_widget.cpp b/YACReader/goto_flow_widget.cpp index 1fc339d3..782b9b87 100644 --- a/YACReader/goto_flow_widget.cpp +++ b/YACReader/goto_flow_widget.cpp @@ -40,6 +40,16 @@ GoToFlowWidget::GoToFlowWidget(QWidget *parent, FlowType flowType) resize(static_cast(5 * imageSize.width()), toolBar->height() + static_cast(imageSize.height() * 1.7)); this->setCursor(QCursor(Qt::ArrowCursor)); + + initTheme(this); +} + +void GoToFlowWidget::applyTheme(const Theme &theme) +{ + auto goToFlowTheme = theme.goToFlowWidget; + + flow->setBackgroundColor(goToFlowTheme.flowBackgroundColor); + flow->setTextColor(goToFlowTheme.flowTextColor); } GoToFlowWidget::~GoToFlowWidget() diff --git a/YACReader/goto_flow_widget.h b/YACReader/goto_flow_widget.h index df294dfb..6456463a 100644 --- a/YACReader/goto_flow_widget.h +++ b/YACReader/goto_flow_widget.h @@ -6,6 +6,7 @@ #include "yacreader_global_gui.h" #include "yacreader_page_flow_rhi.h" +#include "themable.h" using namespace YACReader; @@ -14,9 +15,12 @@ class GoToFlowToolBar; class QVBoxLayout; class QKeyEvent; -class GoToFlowWidget : public QWidget +class GoToFlowWidget : public QWidget, protected Themable { Q_OBJECT +protected: + void applyTheme(const Theme &theme) override; + public: GoToFlowWidget(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); ~GoToFlowWidget() override; diff --git a/YACReader/themes/theme.h b/YACReader/themes/theme.h index 719ba61b..0ccec5a0 100644 --- a/YACReader/themes/theme.h +++ b/YACReader/themes/theme.h @@ -16,6 +16,26 @@ struct ViewerThemeTemplates { QString infoLabelQSS = "QLabel { color : %1; font-size:%2px; }"; }; +struct GoToFlowWidgetThemeTemplates { + QString sliderQSS = "QSlider::groove:horizontal {" + " border: 1px solid %1;" + " border-radius: 1px;" + " background: %2;" + " margin: 2px 0;" + " padding: 1px;" + "}" + "QSlider::handle:horizontal {" + " background: %3;" + " width: 48px;" + " border-radius: 1px;" + "}"; + QString editQSS = "QLineEdit {border: 1px solid %1; background: %2; color: %3; padding: 3px 5px 5px 5px; margin: 13px 5px 12px 5px; font-weight:bold}"; + QString buttonQSS = "QPushButton { border: none; padding: 0px; } " + "QPushButton:focus { border: none; outline: none; } " + "QPushButton:pressed { padding-top: 1px; padding-left: 1px; padding-bottom: -1px; padding-right: -1px; }"; + QString labelQSS = "QLabel { color: %1; }"; +}; + struct ToolbarTheme { QString toolbarQSS; @@ -92,9 +112,22 @@ struct ViewerTheme { QString infoLabelQSS; }; +struct GoToFlowWidgetTheme { + QColor flowBackgroundColor; + QColor flowTextColor; + QColor toolbarBackgroundColor; + QString sliderQSS; + QString editQSS; + QString buttonQSS; + QString labelQSS; + QIcon centerIcon; + QIcon goToIcon; +}; + struct Theme { ToolbarTheme toolbar; ViewerTheme viewer; + GoToFlowWidgetTheme goToFlowWidget; }; #endif // THEME_H diff --git a/YACReader/themes/theme_factory.cpp b/YACReader/themes/theme_factory.cpp index 04002b47..603572fb 100644 --- a/YACReader/themes/theme_factory.cpp +++ b/YACReader/themes/theme_factory.cpp @@ -23,11 +23,28 @@ struct ViewerParams { QColor infoTextColor; }; +struct GoToFlowWidgetParams { + GoToFlowWidgetThemeTemplates t; + + QColor flowBackgroundColor; + QColor flowTextColor; + QColor toolbarBackgroundColor; + QColor sliderBorderColor; + QColor sliderGrooveColor; + QColor sliderHandleColor; + QColor editBorderColor; + QColor editBackgroundColor; + QColor editTextColor; + QColor labelTextColor; + QColor iconColor; +}; + struct ThemeParams { QString themeName; ToolbarParams toolbarParams; ViewerParams viewerParams; + GoToFlowWidgetParams goToFlowWidgetParams; }; void setToolbarIconPair(QIcon &icon, @@ -113,6 +130,28 @@ Theme makeTheme(const ThemeParams ¶ms) theme.viewer.infoLabelQSS = params.viewerParams.t.infoLabelQSS.arg(params.viewerParams.infoTextColor.name()); // end Viewer + // GoToFlowWidget + auto &gotoParams = params.goToFlowWidgetParams; + theme.goToFlowWidget.flowBackgroundColor = gotoParams.flowBackgroundColor; + theme.goToFlowWidget.flowTextColor = gotoParams.flowTextColor; + theme.goToFlowWidget.toolbarBackgroundColor = gotoParams.toolbarBackgroundColor; + theme.goToFlowWidget.sliderQSS = gotoParams.t.sliderQSS.arg( + gotoParams.sliderBorderColor.name(QColor::HexArgb), + gotoParams.sliderGrooveColor.name(QColor::HexArgb), + gotoParams.sliderHandleColor.name(QColor::HexArgb)); + theme.goToFlowWidget.editQSS = gotoParams.t.editQSS.arg( + gotoParams.editBorderColor.name(QColor::HexArgb), + gotoParams.editBackgroundColor.name(QColor::HexArgb), + gotoParams.editTextColor.name()); + theme.goToFlowWidget.buttonQSS = gotoParams.t.buttonQSS; + theme.goToFlowWidget.labelQSS = gotoParams.t.labelQSS.arg(gotoParams.labelTextColor.name()); + + const QString centerIconPath = recoloredSvgToThemeFile(":/images/centerFlow.svg", gotoParams.iconColor, params.themeName); + const QString goToIconPath = recoloredSvgToThemeFile(":/images/gotoFlow.svg", gotoParams.iconColor, params.themeName); + theme.goToFlowWidget.centerIcon = QIcon(centerIconPath); + theme.goToFlowWidget.goToIcon = QIcon(goToIconPath); + // end GoToFlowWidget + return theme; } @@ -157,6 +196,22 @@ ThemeParams classicThemeParams() params.viewerParams = viewerParams; + GoToFlowWidgetParams goToFlowWidgetParams; + goToFlowWidgetParams.flowBackgroundColor = QColor(0x282828); + goToFlowWidgetParams.flowTextColor = Qt::white; + goToFlowWidgetParams.toolbarBackgroundColor = QColor::fromRgba(0x99000000); + goToFlowWidgetParams.sliderBorderColor = QColor::fromRgba(0x22FFFFFF); + goToFlowWidgetParams.sliderGrooveColor = QColor::fromRgba(0x77000000); + goToFlowWidgetParams.sliderHandleColor = QColor::fromRgba(0x55FFFFFF); + goToFlowWidgetParams.editBorderColor = QColor::fromRgba(0x77000000); + goToFlowWidgetParams.editBackgroundColor = QColor::fromRgba(0x55000000); + goToFlowWidgetParams.editTextColor = Qt::white; + goToFlowWidgetParams.labelTextColor = Qt::white; + goToFlowWidgetParams.iconColor = Qt::white; + goToFlowWidgetParams.t = GoToFlowWidgetThemeTemplates(); + + params.goToFlowWidgetParams = goToFlowWidgetParams; + return params; } @@ -185,6 +240,22 @@ ThemeParams lightThemeParams() params.viewerParams = viewerParams; + GoToFlowWidgetParams goToFlowWidgetParams; + goToFlowWidgetParams.flowBackgroundColor = QColor(0xF6F6F6); + goToFlowWidgetParams.flowTextColor = QColor(0x202020); + goToFlowWidgetParams.toolbarBackgroundColor = QColor::fromRgba(0xBBFFFFFF); + goToFlowWidgetParams.sliderBorderColor = QColor::fromRgba(0x22000000); + goToFlowWidgetParams.sliderGrooveColor = QColor::fromRgba(0x33000000); + goToFlowWidgetParams.sliderHandleColor = QColor::fromRgba(0x55000000); + goToFlowWidgetParams.editBorderColor = QColor::fromRgba(0x33000000); + goToFlowWidgetParams.editBackgroundColor = QColor::fromRgba(0x22000000); + goToFlowWidgetParams.editTextColor = QColor(0x202020); + goToFlowWidgetParams.labelTextColor = QColor(0x202020); + goToFlowWidgetParams.iconColor = QColor(0x404040); + goToFlowWidgetParams.t = GoToFlowWidgetThemeTemplates(); + + params.goToFlowWidgetParams = goToFlowWidgetParams; + return params; } @@ -213,6 +284,22 @@ ThemeParams darkThemeParams() params.viewerParams = viewerParams; + GoToFlowWidgetParams goToFlowWidgetParams; + goToFlowWidgetParams.flowBackgroundColor = QColor(40, 40, 40); + goToFlowWidgetParams.flowTextColor = Qt::white; + goToFlowWidgetParams.toolbarBackgroundColor = QColor::fromRgba(0x99000000); + goToFlowWidgetParams.sliderBorderColor = QColor::fromRgba(0x22FFFFFF); + goToFlowWidgetParams.sliderGrooveColor = QColor::fromRgba(0x77000000); + goToFlowWidgetParams.sliderHandleColor = QColor::fromRgba(0x55FFFFFF); + goToFlowWidgetParams.editBorderColor = QColor::fromRgba(0x77000000); + goToFlowWidgetParams.editBackgroundColor = QColor::fromRgba(0x55000000); + goToFlowWidgetParams.editTextColor = Qt::white; + goToFlowWidgetParams.labelTextColor = Qt::white; + goToFlowWidgetParams.iconColor = QColor(0xCCCCCC); + goToFlowWidgetParams.t = GoToFlowWidgetThemeTemplates(); + + params.goToFlowWidgetParams = goToFlowWidgetParams; + return params; } diff --git a/YACReader/yacreader_images.qrc b/YACReader/yacreader_images.qrc index ef71304d..ac17f295 100644 --- a/YACReader/yacreader_images.qrc +++ b/YACReader/yacreader_images.qrc @@ -12,10 +12,8 @@ ../images/close.svg ../images/up.png ../images/down.png - ../images/imgCenterSlide.png - ../images/imgGoToSlide.png - ../images/imgCenterSlidePressed.png - ../images/imgGoToSlidePressed.png + ../images/centerFlow.svg + ../images/gotoFlow.svg ../images/defaultCover.png ../images/fromTo.png ../images/dropDownArrow.png diff --git a/images/centerFlow.svg b/images/centerFlow.svg new file mode 100644 index 00000000..ccfb1c17 --- /dev/null +++ b/images/centerFlow.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/gotoFlow.svg b/images/gotoFlow.svg new file mode 100644 index 00000000..8c0a7158 --- /dev/null +++ b/images/gotoFlow.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/imgCenterSlide.png b/images/imgCenterSlide.png deleted file mode 100644 index 0c50ca860aaba6c6204e9b4852331406fe02f3d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^Qb26P!3HFqww|5}q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6`k>PaSW-r^=8UN-X;TqwrKSi96c8V3z%dY1!WHUN;C?t z5N@edIt@m21m#_UTTla-)-S*adQ&&&rc(o&pdvDga-Wxr$ zGUYPkZnka+a%@}wRVp!i#yugorSoLNXGJ?NyEoe=Ywhm6az+1+HQg{=*V_A7;)KVx t-TxNJ`RDJIpCcdV#t3x6gYz{k5)3{&Z|i)nZ_Wof%G1@)Wt~$(696YxcpLx# diff --git a/images/imgCenterSlide@2x.png b/images/imgCenterSlide@2x.png deleted file mode 100644 index eb1108eda934a236f850ea23fbed3191994c3035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^CP19R!3HExeiN1fQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07#NE^T^vIyZoRqjF}KM< z>P;}uux7mL5S_cEKIHcQfd4z}gneJIvS#MqH@)xwsp(?#hvvr>g$6(i;oyhtL4Ub3 zQPQW?rtX^3wM1@-TF`b!fj!m5p(-9qrrX+emlmzO&~C8v?K+F{6%S@78r_t5{@Q(I z^-BJg5A(Qo?T=qMyGckbYerb+;T-{4PkQ!Vw7A+Mtd=MFzO8EuYt%JAz4r!oCEs>l z6HzN$S9as^x>?0@Zo8iUyN|`$!w0k9T@+ zE$4_l%@uxSdS&nXg&P*u8^8OVDt#q#U9|pzc>Vjn>brTXt}omkES;6}`}7vS{eKSJ z-L!j~dSTp}UCx%}Ix9mfmPCJ0zS5~Hu&{<_YL#@>-kUR4t$MRBY<20wqxJm9ebV)x zRa$KhI=ZLktM!?Cx05EGKmDn`g%KVw4E{A-1`HeTzUltI2>$W?6Q$CIk_^cq0Ox42P085If8j@(lHzh-|UwN(a6ZM6YXTM13tJmc@u8 z1op$YSXN2{v5h|(EILiphW&|b2(^;aiCQ|Evs?%k_0o9+8>?YIkaMJ5rggSXosv`c z$s*lMf~Hy<_ehJaM|SCbtK>k;5_6Z{^wAwNig`_;1^~_JN>OG2Uq}D|002ovPDHLkV1njHhJfb?)d)#PRVTYf81>YnE$t`PXkAJBdDel>Qrv5HZnQ0o*3-e0?k_fwUYvhkGt5&PU|9DStgkmqRZ$YI}>25ZgXuV#y z{hRBRbLzg9%faVj;W+>R0000000000fTQ^lU;zJ2q03o7pGE)x002ovPDHLkV1l;Y B`4RvC diff --git a/images/imgGoToSlide.png b/images/imgGoToSlide.png deleted file mode 100644 index 3187cfc5ff42a006f6d266d05401c452ee11e508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^Qb26P!3HFqww|5}q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c73F!lIEGZ*dUM5*t3g4)A+VFrzbaMp&=zrtu*KPgqsu9?8RI@CC4tY5A@UN=-~E@TH|-EZebXw*&=`crFGlw zo+Md4{ub-Bc-r=R5B@v7?zOa@Z^*z9U&vv=P%d8U}fi7AzZCsS>JijI1^IEGZ*dUK;bKmcTTzSKj zd!>$lB|qO0`FD1Lj^)-sEg;a)D{xr;v)rh3$Hsx%)Rl g+`%y8dT0Y9gR8@4UX8O0FMtF+UHx3vIVCg!0L*!BN&o-= diff --git a/images/imgGoToSlidePressed.png b/images/imgGoToSlidePressed.png deleted file mode 100644 index 76f5b0b15fa974f5089c21a0eb285fac39ee2c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^Qb26P!3HFqww|5}q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6;1YZaSW-r^=8Uj&ISd6HdCnufl&uNV-5-yiKrK{x@R_9 zJ*<-nJkjZLS`NH3fTdhtAx6u6jSeIOoYz&aTRv=L#*J>g(mX z)8kddvl(?4dyjNxE}yuyOk|0RoZ$AQIwjp18+%v%DB*V!vn-P-adFqZwddtp_TTmw k?@SE-Pz*9S{-H<$!*xG%50;pBOdyLqUHx3vIVCg!01B{Jn*aa+ diff --git a/images/imgGoToSlidePressed@2x.png b/images/imgGoToSlidePressed@2x.png deleted file mode 100644 index 354993d75c37d7cc6c9649334becc845c5432cad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^CP19R!3HExeiN1fQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07#JlyT^vIyZoRqwF!Qj10NaIcFBoJsB^L_skW-vo(sE>W zNlV`&-YC{Dhi6P%R_NDv`nQ9Joxvq%j?*7MoELJy55CV@{)V$Hu|oH5bgfNEZ27G> ze4%GHZh3yIZ|gSO3oOR|T3S-cmjX93sfmheCteEJsHDa!dUD3UL$}TbOziymZgy~X z=8BBY%*HO(8Fx)*a0l)-Eqk$en|*Sf<6N)5do5S^SWU~bcl>(&&gHZf#>?X0^7sbm zd+W{pdiQV88Owg&yxa3PA6