From 85379b359cc0ffac0b113fd53bd2dbac8660c9a6 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 28 Aug 2023 15:01:09 +1000 Subject: [PATCH] Add some cool battery icons --- src/ui/CMakeLists.txt | 2 ++ src/ui/icons/battery_20.c | 52 ++++++++++++++++++++++++++++++ src/ui/icons/battery_40.c | 52 ++++++++++++++++++++++++++++++ src/ui/icons/battery_60.c | 52 ++++++++++++++++++++++++++++++ src/ui/icons/battery_80.c | 52 ++++++++++++++++++++++++++++++ src/ui/icons/battery_empty.c | 52 ++++++++++++++++++++++++++++++ src/ui/icons/battery_full.c | 52 ++++++++++++++++++++++++++++++ src/ui/widget_top_bar.cpp | 37 +++++++++++++-------- tools/{ => fonts}/mkfonts.sh | 0 tools/icons/raw/battery_20.png | Bin 0 -> 617 bytes tools/icons/raw/battery_40.png | Bin 0 -> 617 bytes tools/icons/raw/battery_60.png | Bin 0 -> 618 bytes tools/icons/raw/battery_80.png | Bin 0 -> 622 bytes tools/icons/raw/battery_empty.png | Bin 0 -> 614 bytes tools/icons/raw/battery_full.png | Bin 0 -> 618 bytes 15 files changed, 337 insertions(+), 14 deletions(-) create mode 100644 src/ui/icons/battery_20.c create mode 100644 src/ui/icons/battery_40.c create mode 100644 src/ui/icons/battery_60.c create mode 100644 src/ui/icons/battery_80.c create mode 100644 src/ui/icons/battery_empty.c create mode 100644 src/ui/icons/battery_full.c rename tools/{ => fonts}/mkfonts.sh (100%) create mode 100644 tools/icons/raw/battery_20.png create mode 100644 tools/icons/raw/battery_40.png create mode 100644 tools/icons/raw/battery_60.png create mode 100644 tools/icons/raw/battery_80.png create mode 100644 tools/icons/raw/battery_empty.png create mode 100644 tools/icons/raw/battery_full.png diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 6b5c393a..af261412 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -8,6 +8,8 @@ idf_component_register( "themes.cpp" "widget_top_bar.cpp" "screen.cpp" "screen_onboarding.cpp" "modal_progress.cpp" "modal.cpp" "modal_confirm.cpp" "screen_settings.cpp" "splash.c" "font_fusion.c" "font_symbols.c" + "icons/battery_empty.c" "icons/battery_full.c" "icons/battery_20.c" + "icons/battery_40.c" "icons/battery_60.c" "icons/battery_80.c" INCLUDE_DIRS "include" REQUIRES "drivers" "lvgl" "tinyfsm" "events" "system_fsm" "database" "esp_timer" "battery") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/ui/icons/battery_20.c b/src/ui/icons/battery_20.c new file mode 100644 index 00000000..0ae909b9 --- /dev/null +++ b/src/ui/icons/battery_20.c @@ -0,0 +1,52 @@ +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATTERY_20 +#define LV_ATTRIBUTE_IMG_BATTERY_20 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_20 uint8_t battery_20_map[] = { + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ + 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ + 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ + + 0x55, 0x00, 0x55, + 0x54, 0x00, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0x00, 0x15, +}; + +const lv_img_dsc_t battery_20 = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 12, + .header.h = 12, + .data_size = 52, + .data = battery_20_map, +}; diff --git a/src/ui/icons/battery_40.c b/src/ui/icons/battery_40.c new file mode 100644 index 00000000..07310273 --- /dev/null +++ b/src/ui/icons/battery_40.c @@ -0,0 +1,52 @@ +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATTERY_40 +#define LV_ATTRIBUTE_IMG_BATTERY_40 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_40 uint8_t battery_40_map[] = { + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ + 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ + 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ + + 0x55, 0x00, 0x55, + 0x54, 0x00, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0x00, 0x15, +}; + +const lv_img_dsc_t battery_40 = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 12, + .header.h = 12, + .data_size = 52, + .data = battery_40_map, +}; diff --git a/src/ui/icons/battery_60.c b/src/ui/icons/battery_60.c new file mode 100644 index 00000000..ac7db567 --- /dev/null +++ b/src/ui/icons/battery_60.c @@ -0,0 +1,52 @@ +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATTERY_60 +#define LV_ATTRIBUTE_IMG_BATTERY_60 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_60 uint8_t battery_60_map[] = { + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ + 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ + 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ + + 0x55, 0x00, 0x55, + 0x54, 0x00, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0x00, 0x15, +}; + +const lv_img_dsc_t battery_60 = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 12, + .header.h = 12, + .data_size = 52, + .data = battery_60_map, +}; diff --git a/src/ui/icons/battery_80.c b/src/ui/icons/battery_80.c new file mode 100644 index 00000000..086c0708 --- /dev/null +++ b/src/ui/icons/battery_80.c @@ -0,0 +1,52 @@ +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATTERY_80 +#define LV_ATTRIBUTE_IMG_BATTERY_80 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_80 uint8_t battery_80_map[] = { + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ + 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ + 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ + + 0x55, 0x00, 0x55, + 0x54, 0x00, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0x55, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0x00, 0x15, +}; + +const lv_img_dsc_t battery_80 = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 12, + .header.h = 12, + .data_size = 52, + .data = battery_80_map, +}; diff --git a/src/ui/icons/battery_empty.c b/src/ui/icons/battery_empty.c new file mode 100644 index 00000000..ed356167 --- /dev/null +++ b/src/ui/icons/battery_empty.c @@ -0,0 +1,52 @@ +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATTERY_EMPTY +#define LV_ATTRIBUTE_IMG_BATTERY_EMPTY +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_EMPTY uint8_t battery_empty_map[] = { + 0xfd, 0xfd, 0xfd, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + 0x26, 0x2c, 0xfa, 0xff, /*Color of index 2*/ + 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ + + 0x00, 0x55, 0x00, + 0x01, 0x55, 0x40, + 0x01, 0x00, 0x40, + 0x01, 0x00, 0x40, + 0x01, 0x00, 0x40, + 0x01, 0x00, 0x40, + 0x01, 0x00, 0x40, + 0x01, 0x00, 0x40, + 0x01, 0x00, 0x40, + 0x01, 0xaa, 0x40, + 0x01, 0xaa, 0x40, + 0x01, 0x55, 0x40, +}; + +const lv_img_dsc_t battery_empty = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 12, + .header.h = 12, + .data_size = 52, + .data = battery_empty_map, +}; diff --git a/src/ui/icons/battery_full.c b/src/ui/icons/battery_full.c new file mode 100644 index 00000000..fffd5a73 --- /dev/null +++ b/src/ui/icons/battery_full.c @@ -0,0 +1,52 @@ +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATTERY_FULL +#define LV_ATTRIBUTE_IMG_BATTERY_FULL +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_FULL uint8_t battery_full_map[] = { + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ + 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ + 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ + + 0x55, 0x00, 0x55, + 0x54, 0x00, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xaa, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0xff, 0x15, + 0x54, 0x00, 0x15, +}; + +const lv_img_dsc_t battery_full = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 12, + .header.h = 12, + .data_size = 52, + .data = battery_full_map, +}; diff --git a/src/ui/widget_top_bar.cpp b/src/ui/widget_top_bar.cpp index 851b617f..c5c3d88b 100644 --- a/src/ui/widget_top_bar.cpp +++ b/src/ui/widget_top_bar.cpp @@ -16,6 +16,13 @@ #include "widgets/lv_img.h" #include "widgets/lv_label.h" +LV_IMG_DECLARE(battery_empty); +LV_IMG_DECLARE(battery_20); +LV_IMG_DECLARE(battery_40); +LV_IMG_DECLARE(battery_60); +LV_IMG_DECLARE(battery_80); +LV_IMG_DECLARE(battery_full); + namespace ui { namespace widgets { @@ -48,8 +55,7 @@ TopBar::TopBar(lv_obj_t* parent, const Configuration& config) { playback_ = lv_label_create(container_); lv_label_set_text(playback_, ""); - battery_ = lv_label_create(container_); - lv_label_set_text(battery_, ""); + battery_ = lv_img_create(container_); } auto TopBar::Update(const State& state) -> void { @@ -65,18 +71,21 @@ auto TopBar::Update(const State& state) -> void { break; } - lv_label_set_text(battery_, std::to_string(state.battery_percent).c_str()); - // if (state.battery_percent >= 95) { - // lv_label_set_text(battery_, "100"); - // } else if (state.battery_percent >= 70) { - // lv_label_set_text(battery_, ">70"); - // } else if (state.battery_percent >= 40) { - // lv_label_set_text(battery_, ">40"); - // } else if (state.battery_percent >= 10) { - // lv_label_set_text(battery_, ">10"); - // } else { - // lv_label_set_text(battery_, "0"); - // } + if (state.battery_percent >= 95) { + lv_img_set_src(battery_, &battery_full); + } else if (state.battery_percent >= 75) { + lv_img_set_src(battery_, &battery_80); + lv_label_set_text(battery_, ">70"); + } else if (state.battery_percent >= 55) { + lv_img_set_src(battery_, &battery_60); + lv_label_set_text(battery_, ">40"); + } else if (state.battery_percent >= 35) { + lv_img_set_src(battery_, &battery_40); + } else if (state.battery_percent >= 15) { + lv_img_set_src(battery_, &battery_20); + } else { + lv_img_set_src(battery_, &battery_empty); + } } } // namespace widgets diff --git a/tools/mkfonts.sh b/tools/fonts/mkfonts.sh similarity index 100% rename from tools/mkfonts.sh rename to tools/fonts/mkfonts.sh diff --git a/tools/icons/raw/battery_20.png b/tools/icons/raw/battery_20.png new file mode 100644 index 0000000000000000000000000000000000000000..9012376f49e7db949b9e8520c09efa4e30e89c32 GIT binary patch literal 617 zcmV-v0+#)WP)EX>4Tx04R}tkv&MmKpe$i(~3n}9PA*{Az*c~AS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRrd-(Wz7w1{t=l&dFHE%J%Clb#x!?cMvh^IGg zgY!Odgq38K_?&pmqze*1a$RxxjdQWZ0?&+?ne;qygjg(gvC_q?WNO4y#4%OVDPPFC zta9GstW|2PeNX=bb^91le16O*-Uu^(0pQP72 zTI>ku-v%zOJDRcwTt+~Cm_i_3FWT>mu4RCM> zj20<--Q(TC?%w`A)9&vFO}=uNL|@cs00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~y90WH2dL$~80000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zQ%OWYR2b7^{QK`O0}QY*v;6=6pMimak&*Gw-#>71CS(;5X+}my1_lOZCT4^b0}?>i z4bg*c5*{#Q6`=%y^lZE00000NkvXXu0mjf DL?ru> literal 0 HcmV?d00001 diff --git a/tools/icons/raw/battery_40.png b/tools/icons/raw/battery_40.png new file mode 100644 index 0000000000000000000000000000000000000000..88a0b448840e7e34806d8cb94c7578bbd41d0096 GIT binary patch literal 617 zcmV-v0+#)WP)EX>4Tx04R}tkv&MmKpe$i(~3n}9PA*{Az*c~AS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRrd-(Wz7w1{t=l&dFHE%J%Clb#x!?cMvh^IGg zgY!Odgq38K_?&pmqze*1a$RxxjdQWZ0?&+?ne;qygjg(gvC_q?WNO4y#4%OVDPPFC zta9GstW|2PeNX=bb^91le16O*-Uu^(0pQP72 zTI>ku-v%zOJDRcwTt+~Cm_i_3FWT>mu4RCM> zj20<--Q(TC?%w`A)9&vFO}=uNL|@cs00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~y90WEa!B}di0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zQ%OWYR2b9EQLzocAPln!&u|0h_Y7Vk4FiG(hF0o?$JkC}hk7dpqC_(TK(cC`^WYVo zCJ8`-JQN(fyLEX>4Tx04R}tkv&MmKpe$i(~3n}9PA*{Az*c~AS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRrd-(Wz7w1{t=l&dFHE%J%Clb#x!?cMvh^IGg zgY!Odgq38K_?&pmqze*1a$RxxjdQWZ0?&+?ne;qygjg(gvC_q?WNO4y#4%OVDPPFC zta9GstW|2PeNX=bb^91le16O*-Uu^(0pQP72 zTI>ku-v%zOJDRcwTt+~Cm_i_3FWT>mu4RCM> zj20<--Q(TC?%w`A)9&vFO}=uNL|@cs00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~y90WEPa8rYW0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zR7pfZR2b7^{QK`O0}QY*v;6=6pMimak&*Gw-#>71CS(;5X+}my1_lOZCT4^b0}?>i z4bg*c5*|Q3MJR5vKCDSk>;C_}O}1^@s6 literal 0 HcmV?d00001 diff --git a/tools/icons/raw/battery_80.png b/tools/icons/raw/battery_80.png new file mode 100644 index 0000000000000000000000000000000000000000..344b37033edce333c1e1431a55d4ec43a1420a62 GIT binary patch literal 622 zcmV-!0+IcRP)EX>4Tx04R}tkv&MmKpe$i(~3n}9PA*{Az*c~AS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRrd-(Wz7w1{t=l&dFHE%J%Clb#x!?cMvh^IGg zgY!Odgq38K_?&pmqze*1a$RxxjdQWZ0?&+?ne;qygjg(gvC_q?WNO4y#4%OVDPPFC zta9GstW|2PeNX=bb^91le16O*-Uu^(0pQP72 zTI>ku-v%zOJDRcwTt+~Cm_i_3FWT>mu4RCM> zj20<--Q(TC?%w`A)9&vFO}=uNL|@cs00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~y90WEG^MD3K0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zSV=@dR2b7^{QK`O0}QY*v;6=6pMimak&*Gw-#>71CS(;5X+}my1_lOZCT4^b0}?>i z4bg*c5*~nJlJ#Lttcr*-iOz~p9RC0BZSqZGghvZ<=%Ixz08lv=B%$qnZvX%Q07*qo IM6N<$g8wuDs{jB1 literal 0 HcmV?d00001 diff --git a/tools/icons/raw/battery_empty.png b/tools/icons/raw/battery_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..c9176e8c7e739612ac63fdac98fd6b0bf4d1ad41 GIT binary patch literal 614 zcmV-s0-61ZP)EX>4Tx04R}tkv&MmKpe$i(~3n}9PA*{Az*c~AS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRrd-(Wz7w1{t=l&dFHE%J%Clb#x!?cMvh^IGg zgY!Odgq38K_?&pmqze*1a$RxxjdQWZ0?&+?ne;qygjg(gvC_q?WNO4y#4%OVDPPFC zta9GstW|2PeNX=bb^91le16O*-Uu^(0pQP72 zTI>ku-v%zOJDRcwTt+~Cm_i_3FWT>mu4RCM> zj20<--Q(TC?%w`A)9&vFO}=uNL|@cs00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~y90WBabP=q_0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zP)S5VR2b96kt-H}Fbo7|n_dRR{qNQgL?3OaK!9Ln_9G_p!?{$gMg$EX>4Tx04R}tkv&MmKpe$i(~3n}9PA*{Az*c~AS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRrd-(Wz7w1{t=l&dFHE%J%Clb#x!?cMvh^IGg zgY!Odgq38K_?&pmqze*1a$RxxjdQWZ0?&+?ne;qygjg(gvC_q?WNO4y#4%OVDPPFC zta9GstW|2PeNX=bb^91le16O*-Uu^(0pQP72 zTI>ku-v%zOJDRcwTt+~Cm_i_3FWT>mu4RCM> zj20<--Q(TC?%w`A)9&vFO}=uNL|@cs00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-~y90WBr9-)ji0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zR7pfZR2b7^{QK`O0}QY*v;6=6pMimak&*Gw-#>71CS(;5X+}my1_lOZCT4^b0}?Pl zpbBT7bhwShBs^fqDnbc@|9@|jZxSOsS|A~g4B#;X0P>d<`z9c}z5oCK07*qoM6N<$ Ef@y91c>n+a literal 0 HcmV?d00001