From fd2e9857965dd5f715484907594beb563d468163 Mon Sep 17 00:00:00 2001 From: ITCactus Date: Tue, 18 Oct 2022 13:27:34 +0200 Subject: [PATCH] port Digistyle watchface to the 1.11 codebase --- src/CMakeLists.txt | 1 + src/displayapp/screens/Clock.cpp | 16 ++ src/displayapp/screens/Clock.h | 1 + src/displayapp/screens/WatchFaceDigistyle.cpp | 249 ++++++++++++++++++ src/displayapp/screens/WatchFaceDigistyle.h | 90 +++++++ .../screens/settings/SettingWatchFace.cpp | 3 +- src/resources/fonts.json | 12 + src/resources/fonts/Seven Segment.ttf | Bin 0 -> 29076 bytes src/resources/images.json | 7 + src/resources/images/digistyle.png | Bin 0 -> 2771 bytes 10 files changed, 378 insertions(+), 1 deletion(-) create mode 100644 src/displayapp/screens/WatchFaceDigistyle.cpp create mode 100644 src/displayapp/screens/WatchFaceDigistyle.h create mode 100644 src/resources/fonts/Seven Segment.ttf create mode 100644 src/resources/images/digistyle.png diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e59c0d814b..5d1d7c39c8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -431,6 +431,7 @@ list(APPEND SOURCE_FILES displayapp/screens/WatchFaceTerminal.cpp displayapp/screens/WatchFacePineTimeStyle.cpp displayapp/screens/WatchFaceCasioStyleG7710.cpp + displayapp/screens/WatchFaceDigistyle.cpp ## diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index 07d307e0f2..151fe2966e 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -14,6 +14,7 @@ #include "displayapp/screens/WatchFaceAnalog.h" #include "displayapp/screens/WatchFacePineTimeStyle.h" #include "displayapp/screens/WatchFaceCasioStyleG7710.h" +#include "displayapp/screens/WatchFaceDigistyle.h" using namespace Pinetime::Applications::Screens; @@ -55,6 +56,9 @@ Clock::Clock(DisplayApp* app, case 5: return WatchFaceCasioStyleG7710(); break; + case 6: + return WatchFaceDigistyle(); + break; } return WatchFaceDigitalScreen(); }()} { @@ -136,3 +140,15 @@ std::unique_ptr Clock::WatchFaceCasioStyleG7710() { motionController, filesystem); } + +std::unique_ptr Clock::WatchFaceDigistyle() { + return std::make_unique(app, + dateTimeController, + batteryController, + bleController, + notificationManager, + settingsController, + heartRateController, + motionController, + filesystem); +} diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index 613fef57ea..c27eda9747 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -52,6 +52,7 @@ namespace Pinetime { std::unique_ptr WatchFaceTerminalScreen(); std::unique_ptr WatchFaceInfineatScreen(); std::unique_ptr WatchFaceCasioStyleG7710(); + std::unique_ptr WatchFaceDigistyle(); }; } } diff --git a/src/displayapp/screens/WatchFaceDigistyle.cpp b/src/displayapp/screens/WatchFaceDigistyle.cpp new file mode 100644 index 0000000000..d955fd3651 --- /dev/null +++ b/src/displayapp/screens/WatchFaceDigistyle.cpp @@ -0,0 +1,249 @@ +#include "displayapp/screens/WatchFaceDigistyle.h" + +#include +#include +#include +#include "displayapp/screens/BatteryIcon.h" +#include "displayapp/screens/BleIcon.h" +#include "displayapp/screens/NotificationIcon.h" +#include "displayapp/screens/Symbols.h" +#include "components/battery/BatteryController.h" +#include "components/ble/BleController.h" +#include "components/ble/NotificationManager.h" +#include "components/heartrate/HeartRateController.h" +#include "components/motion/MotionController.h" +#include "components/settings/Settings.h" + +using namespace Pinetime::Applications::Screens; + +WatchFaceDigistyle::WatchFaceDigistyle(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificationManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController, + Controllers::FS& filesystem) + : Screen(app), + currentDateTime {{}}, + dateTimeController {dateTimeController}, + batteryController {batteryController}, + bleController {bleController}, + notificationManager {notificationManager}, + settingsController {settingsController}, + heartRateController {heartRateController}, + motionController {motionController} { + + lfs_file f = {}; + if (filesystem.FileOpen(&f, "/fonts/seven_segment_100.bin", LFS_O_RDONLY) >= 0) { + filesystem.FileClose(&f); + font_seeven_segment = lv_font_load("F:/fonts/seven_segment_100.bin"); + } + + img_background = lv_img_create(lv_scr_act(), nullptr); + lv_img_set_src(img_background, "F:/images/digistyle.bin"); + lv_obj_align(img_background, nullptr, LV_ALIGN_CENTER, 0, 0); + + batteryIcon.Create(lv_scr_act()); + batteryIcon.SetColor(LV_COLOR_BLACK); + lv_obj_align(batteryIcon.GetObject(), lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -15, 32); + + batteryPlug = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(batteryPlug, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_label_set_text_static(batteryPlug, Symbols::plug); + lv_obj_align(batteryPlug, batteryIcon.GetObject(), LV_ALIGN_OUT_LEFT_MID, -5, 0); + + bleIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_label_set_text_static(bleIcon, Symbols::bluetooth); + lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0); + + notificationIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); + lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 15, 32); + + label_date = lv_label_create(lv_scr_act(), nullptr); + lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); + lv_obj_set_style_local_text_color(label_date, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + + label_time = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + if (font_seeven_segment != nullptr) { + lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_seeven_segment); + } else { + lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); + } + + lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); + + label_time_ampm = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(label_time_ampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_label_set_text_static(label_time_ampm, ""); + lv_obj_align(label_time_ampm, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -30, -55); + + heartbeatIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(heartbeatIcon, Symbols::heartBeat); + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 5, -2); + + heartbeatValue = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(heartbeatValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_label_set_text_static(heartbeatValue, ""); + lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0); + + stepValue = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_label_set_text_static(stepValue, "0"); + lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, -2); + + stepIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(stepIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_label_set_text_static(stepIcon, Symbols::shoe); + lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); + + taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); + Refresh(); +} + +WatchFaceDigistyle::~WatchFaceDigistyle() { + lv_task_del(taskRefresh); + + if (font_seeven_segment != nullptr) { + lv_font_free(font_seeven_segment); + } + + lv_obj_clean(lv_scr_act()); +} + +void WatchFaceDigistyle::Refresh() { + powerPresent = batteryController.IsPowerPresent(); + if (powerPresent.IsUpdated()) { + lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(powerPresent.Get())); + } + + batteryPercentRemaining = batteryController.PercentRemaining(); + if (batteryPercentRemaining.IsUpdated()) { + auto batteryPercent = batteryPercentRemaining.Get(); + batteryIcon.SetBatteryPercentage(batteryPercent); + } + + bleState = bleController.IsConnected(); + bleRadioEnabled = bleController.IsRadioEnabled(); + if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); + } + lv_obj_realign(batteryPlug); + lv_obj_realign(bleIcon); + + notificationState = notificationManager.AreNewNotificationsAvailable(); + if (notificationState.IsUpdated()) { + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); + } + + currentDateTime = dateTimeController.CurrentDateTime(); + + if (currentDateTime.IsUpdated()) { + auto newDateTime = currentDateTime.Get(); + + auto dp = date::floor(newDateTime); + auto time = date::make_time(newDateTime - dp); + auto yearMonthDay = date::year_month_day(dp); + + auto year = static_cast(yearMonthDay.year()); + auto month = static_cast(static_cast(yearMonthDay.month())); + auto day = static_cast(yearMonthDay.day()); + auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + + uint8_t hour = time.hours().count(); + uint8_t minute = time.minutes().count(); + + if (displayedHour != hour || displayedMinute != minute) { + displayedHour = hour; + displayedMinute = minute; + + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + char ampmChar[3] = "AM"; + if (hour == 0) { + hour = 12; + } else if (hour == 12) { + ampmChar[0] = 'P'; + } else if (hour > 12) { + hour = hour - 12; + ampmChar[0] = 'P'; + } + lv_label_set_text(label_time_ampm, ampmChar); + lv_label_set_text_fmt(label_time, "%2d:%02d", hour, minute); + lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); + } else { + lv_label_set_text_fmt(label_time, "%02d:%02d", hour, minute); + lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); + } + } + + if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { + lv_label_set_text_fmt(label_date, + "%s %d %s %d", + dateTimeController.DayOfWeekShortToString(), + day, + dateTimeController.MonthShortToString(), + year); + } else { + lv_label_set_text_fmt(label_date, + "%s %s %d %d", + dateTimeController.DayOfWeekShortToString(), + dateTimeController.MonthShortToString(), + day, + year); + } + lv_obj_realign(label_date); + + currentYear = year; + currentMonth = month; + currentDayOfWeek = dayOfWeek; + currentDay = day; + } + } + + heartbeat = heartRateController.HeartRate(); + heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; + if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { + if (heartbeatRunning.Get()) { + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_label_set_text_fmt(heartbeatValue, "%d", heartbeat.Get()); + } else { + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_label_set_text_static(heartbeatValue, ""); + } + + lv_obj_realign(heartbeatIcon); + lv_obj_realign(heartbeatValue); + } + + stepCount = motionController.NbSteps(); + motionSensorOk = motionController.IsSensorOk(); + if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) { + lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); + lv_obj_realign(stepValue); + lv_obj_realign(stepIcon); + } +} + +bool WatchFaceDigistyle::IsAvailable(Pinetime::Controllers::FS& filesystem) { + lfs_file file = {}; + + filesystem.FileClose(&file); + if (filesystem.FileOpen(&file, "/fonts/seven_segment_100.bin", LFS_O_RDONLY) < 0) { + return false; + } + + filesystem.FileClose(&file); + if (filesystem.FileOpen(&file, "/images/digistyle.bin", LFS_O_RDONLY) < 0) { + return false; + } + + filesystem.FileClose(&file); + return true; +} diff --git a/src/displayapp/screens/WatchFaceDigistyle.h b/src/displayapp/screens/WatchFaceDigistyle.h new file mode 100644 index 0000000000..422717d16c --- /dev/null +++ b/src/displayapp/screens/WatchFaceDigistyle.h @@ -0,0 +1,90 @@ +#pragma once + +#include +#include +#include +#include +#include "displayapp/screens/Screen.h" +#include "components/datetime/DateTimeController.h" +#include "components/ble/BleController.h" +#include "displayapp/widgets/StatusIcons.h" + +namespace Pinetime { + namespace Controllers { + class Settings; + class Battery; + class Ble; + class NotificationManager; + class HeartRateController; + class MotionController; + } + + namespace Applications { + namespace Screens { + + class WatchFaceDigistyle : public Screen { + public: + WatchFaceDigistyle(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificationManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController, + Controllers::FS& fs); + ~WatchFaceDigistyle() override; + + void Refresh() override; + + static bool IsAvailable(Pinetime::Controllers::FS& filesystem); + + private: + uint8_t displayedHour = -1; + uint8_t displayedMinute = -1; + + uint16_t currentYear = 1970; + Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + uint8_t currentDay = 0; + + DirtyValue batteryPercentRemaining {}; + DirtyValue powerPresent {}; + DirtyValue bleState {}; + DirtyValue bleRadioEnabled {}; + DirtyValue> currentDateTime {}; + DirtyValue motionSensorOk {}; + DirtyValue stepCount {}; + DirtyValue heartbeat {}; + DirtyValue heartbeatRunning {}; + DirtyValue notificationState {}; + + lv_obj_t* img_background; + lv_font_t* font_seeven_segment = nullptr; + + lv_obj_t* label_time; + lv_obj_t* label_time_ampm; + lv_obj_t* label_date; + lv_obj_t* bleIcon; + lv_obj_t* batteryPlug; + lv_obj_t* heartbeatIcon; + lv_obj_t* heartbeatValue; + lv_obj_t* stepIcon; + lv_obj_t* stepValue; + lv_obj_t* notificationIcon; + + BatteryIcon batteryIcon; + + Controllers::DateTime& dateTimeController; + Controllers::Battery& batteryController; + Controllers::Ble& bleController; + Controllers::NotificationManager& notificationManager; + Controllers::Settings& settingsController; + Controllers::HeartRateController& heartRateController; + Controllers::MotionController& motionController; + + lv_task_t* taskRefresh; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp index 217f97b8ea..23a841320e 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.cpp +++ b/src/displayapp/screens/settings/SettingWatchFace.cpp @@ -6,6 +6,7 @@ #include "components/settings/Settings.h" #include "displayapp/screens/WatchFaceInfineat.h" #include "displayapp/screens/WatchFaceCasioStyleG7710.h" +#include "displayapp/screens/WatchFaceDigistyle.h" using namespace Pinetime::Applications::Screens; @@ -58,7 +59,7 @@ std::unique_ptr SettingWatchFace::CreateScreen2() { std::array watchfaces { {{"Infineat face", Applications::Screens::WatchFaceInfineat::IsAvailable(filesystem)}, {"Casio G7710", Applications::Screens::WatchFaceCasioStyleG7710::IsAvailable(filesystem)}, - {"", false}, + {"Digistyle", Applications::Screens::WatchFaceDigistyle::IsAvailable(filesystem)}, {"", false}}}; return std::make_unique( 1, diff --git a/src/resources/fonts.json b/src/resources/fonts.json index a270e6a291..f269d56172 100644 --- a/src/resources/fonts.json +++ b/src/resources/fonts.json @@ -58,5 +58,17 @@ "size": 115, "format": "bin", "target_path": "/fonts/" + }, + "seven_segment_100" : { + "sources": [ + { + "file": "fonts/Seven Segment.ttf", + "symbols": "0123456789: -" + } + ], + "bpp": 1, + "size": 100, + "format": "bin", + "target_path": "/fonts/" } } diff --git a/src/resources/fonts/Seven Segment.ttf b/src/resources/fonts/Seven Segment.ttf new file mode 100644 index 0000000000000000000000000000000000000000..214053f88d735871f7be7d587415d1965838ca36 GIT binary patch literal 29076 zcmeHwdvqMtndiOLUENZ*TI%YS)U9{5S`W*5w`>a;J65-ijIlAs4^SHikg;ro@gv3< zCQ8`EAv{b57-#hX&&N2P~j&Hu@;MkG>T6Oua@#7N4l!tFQeoXfpo?kIm zx(C-odynipxNWNUON@CwgX`n_#_l+R^FiEi3-%@ZZvTtDkNqNcIb*(0F*f$-{_(Lr zv9qy#xPKY0uh@?hHM>IPI9`Y2mi-5h-97uYucplozLkGw1 zKEnT=e-`EasIMOyJ2*c3!t$ex-Coa_D|O`X9moE*?71Pv4&RJAzddqv{K!MEcXZ(Q zsLpmXf(5=izwzlW-&C>c-&qs7h0o8bZo44&2Oec?=Izj7&l@-{VG5na2fy*WF@xuZ z{*|%W+0bEeCwWb79}s6AU^`ibIHBNJVb%0gzFM4dyI$mvGL^a20Ts~VO>*ygk?m0c zvE1kLjCpawel{D$hYd4d>qXDrnZ48!K91Th`i1fj$~Umn8CTw91Vg5L8JB)4zY1#e zyV-=YhE2F{#MjLx)W2pE=*5J~XML~6xeaWB{~X7tNA=y;$-1J9-?+XgkLmaHbsmfR zUyJj5@f_M)b?m)em-cp)h9J*9z-VKd8O5_k0@V>0Dj=d4IBJ z|5Ww^@Safr5mcg}9gndI8VA}tVNlqH!fWCfFck2(lSUc$u=dJkjN{kwZI@s63+#8} zA^6gm*~;1A`#1I<>;jwCeR`!H)$8?M{U-gZ ztrur!aR+%1oh@Oj*qGxU-(=ro&#@n|pW`0CWWQ!_vbWef?4r)}V8K23>^rmnG5fz} zU!Q$#_SM;M&OSYRX7;JsC&j(RX7;agWyW5) zv-RR{Bcs1-t-mAeL+pC|9c4FQR6O`vPvQy i=MTvR>Yl2V_al?BQxf?6nCSydg0 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 U#t2b^z4)6eo+h+#zGLwJ0uWpRasU7T literal 0 HcmV?d00001 diff --git a/src/resources/images.json b/src/resources/images.json index db2ccab088..86887b3053 100644 --- a/src/resources/images.json +++ b/src/resources/images.json @@ -5,5 +5,12 @@ "output_format": "bin", "binary_format": "ARGB8565_RBSWAP", "target_path": "/images/" + }, + "digistyle" : { + "sources": "images/digistyle.png", + "color_format": "CF_INDEXED_1_BIT", + "output_format": "bin", + "binary_format": "ARGB8565_RBSWAP", + "target_path": "/images/" } } diff --git a/src/resources/images/digistyle.png b/src/resources/images/digistyle.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf9afef8c539db700057eb40b2504b711e44b89 GIT binary patch literal 2771 zcmeHJ`%}}|75^rc4H5~Ron52Iqs}fvofa}G+wcl0N=I3?+Dcc~LV_qHjG#dR2{GZd zC~QX;T5&f*2mxK!y5SM{I)o$;KvqCw5&<;{5I}iE_~xa7#E@5mc01jf_CN54bI&<5 z_ndp@bI<*p^S3`8I^gdY=m!9RfAYbkBVKLZ5a0K_Yr^NtSG)>FJ#t_l(5?tt_Bxx$ ziGNH4fX-T^GtoC*M_p$&nJQ2v<(0Dd{iNr`_cCK}WgSDqh4U3kV=WmpK! z+24J73n{5SoAny={L+rw<37S@I>xG8#Cu@T5t2>$DB9+^ApQFTG3u~#svrf>onTYu zO|$(7Ll2oo!;%^scwB=p-lU*SuA{R1VO$3wJS z{P5I#aOgnf?67&h!E$;ufj@BU3SB8zgp`=HE8IBZs)oMJ8(&AtFstTV>cy$()%PFk zu}Id`Hw^V94FkuVl%<(iCo3qDJrpg0cYIF~RxaCa^j{a^-?NZ+nCMxCnzmc;t8Y`9@v9+q%m+kew>86xyG3?fR;D2=L#{f|A=Ov)EkI;d zi5%KU5PCOqw#w5I%9+_4!)M|gue7?5?K~lBsoD`vPIEZOJ>2`Mz9z%o1kcVlP@N}@ z;OaoJ=SY);=}gB>C>`DBbv5h~Yw*f(Eq)#S`K+76Yka2g0ss=f)Zo@yjiv|ottF&r zHb~*q-CtBJiUzMu==GQ3lrEX@Wh?sx?J$n-NW352K(8MejyqbDg{hK+lZ#9WQ^*2| z?D#kKL$$dITZ1-Lxk7x>7<)zgyP3{{kD0rtaWQ;{q`-YIEAljn);(K1f)L1ryPZ8t ztd2LQa~s;MOH2QiH^Y_teUkw@^Ah&+iUAaZk+8=7DEI6N?8SF9>&b0E<0S$-8X=jM zyFLmTNN7(*XciyW^#kV4rbl6tJHL)FQ>7Y=Bwa&&`N{{#qiSzkv-~8z%+(fIO!<8J zt#%UmZX_k71Sr?3SFTMVCB5~8Epwu7@sjl-VG;pV!-^9O)8lc%0O%&Oxzx9ucSD=D zuCt<{n@CjvUH_9KKk!a?xwkIu)7eJ=H*OmDk#dumR<&@k3AT zCmjMJeD0GwbwyHjLMt06_BUj4G0x0BU?5jiQxz2D+l)|+{k`%%*y>ztV8Nqbm4~Ds z*pCX_^r#Zb8BMGN&gTdF$K?F-_W|uUb|U=YF9wUE7Mc?QT+h4UcYwVsl6N1Yxq1x_ zbhL0=E%&UMeVYbybHX83XUP{Bm^pCrer(2;$`UWvCea|$BXmFwl`C%GZr-5YOxH;uUd26q_{J=z&!oB8 z_?8r!D9r^2YR++EN4@l3`G(MwQjMM}*9SIxjt&YiB9icn)sAyU%h-N9cR1AFH5y=r zh%WoJu9T>K6}vOpITzrk?naLJ`V3znNZb0$ilpw8igPxdm~ZK#YVb1RkM?Ka6Bh)R z7fgWJQeAf|ug%hx#>_9B(=6j`t#OjC$arrk#$KVVH6jI0n-y7rn*!7Ha>y9lA)P-X z+@>sKiy|N$)JxVW&>6f=SG|fs>0TK%7kYRF0gE%D3{-}H+#gRZr1y9HwafUK8~fX`(yN3mO4e3M(nowYwYYu+6wjU?BP0v` z%8IlQ>Wn%p@HjeW*9&pJt#22_6)wc@bzG8@A5{>p|Kk|?E4YyK6UYzwpC&P;z?7)M zhzZJvD_A_z^JCq73zW}N8DyaYf literal 0 HcmV?d00001