From e6b6c3a19c75c7cb9ebd66d5b85fc2420ee92611 Mon Sep 17 00:00:00 2001 From: Gabor Date: Fri, 4 Aug 2017 12:37:32 +0200 Subject: [PATCH 1/7] example obj_usage: begin --- lv_examples/1_2_obj_usage/obj_usage.c | 129 ++++++++++++++++++++++++++ lv_examples/1_2_obj_usage/obj_usage.h | 42 +++++++++ 2 files changed, 171 insertions(+) diff --git a/lv_examples/1_2_obj_usage/obj_usage.c b/lv_examples/1_2_obj_usage/obj_usage.c index e69de29bb..00cc31c4b 100644 --- a/lv_examples/1_2_obj_usage/obj_usage.c +++ b/lv_examples/1_2_obj_usage/obj_usage.c @@ -0,0 +1,129 @@ +/** + * @file lv_hello_world.c + * + */ + +/* + * The basic building blocks in LittlevGL are the graphical objects. + * For example: + * - Buttons + * - Labels + * - Charts + * - Sliders etc + * + * Regardless to the object type the 'lv_obj_t' is used stores objects + * and you can refer to an object with an lv_obj_t pointer (lv_obj_t *) + * + * + * INHERITANCE + * ------------- + * Similarly to object oriented languages some kind of inheritance is used + * among the object types. + * + * Every object is derived from the 'Basic object'. (lv_obj) + * + * The types are backward compatible which means a type can use all the ancestor + * attributes/functions too. + * + * For example a 'Button' is derived from 'Container' which is derived from 'Basic objects'. + * Therefore a button can use container attributes like automatically fit size to the content. + * + * PARENT-CHILD + * ------------- + * A parent can be considered as the container of its children. + * Every object has exactly one parent object (except screens) but + * a parent can have unlimited number of children. + * There is no limitation for the type of the parent. + * + * The children are visible only on their parent. The parts outside will be cropped (not displayed) + * + * If the parent is moved the children move with it. + * + * The earlier created object (and its children) will drawn earlier. + * Using this layers can be built. + * + * LEARN MORE + * ------------- + * - General overview: http://www.gl.littlev.hu/objects + * - Detailed description of types: http://www.gl.littlev.hu/object-types + */ + +/********************* + * INCLUDES + *********************/ +#include "obj_usage.h" +#if USE_LV_EXAMPLE != 0 + +#include "lvgl/lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_action_res_t btn_rel_action(lv_obj_t * btn, lv_dispi_t * dispi); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * + */ +void lv_obj_usage_init(void) +{ + + /* Create a new screen and load it + * Screen can be created from any type object + * Now a Page is used which is an objects with scrollable content*/ + lv_obj_t * scr = lv_page_create(NULL, NULL); + lv_scr_load(scr); + + /*Add a title*/ + lv_obj_t * label = lv_label_create(scr, NULL); /*First parameters (scr) is the parent*/ + lv_label_set_text(label, "Object usage demo"); /*Set the text*/ + lv_obj_set_x(label, 50); /*Labels are inherited from Basic object so 'lv_obj_...' functions can be used*/ + + /*Create a button*/ + lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); /*Create a button the currently loaded screen*/ + lv_btn_set_rel_action(btn1, btn_rel_action); /*Set function to call when the button is released*/ + lv_obj_align(btn1, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); /*Align below the label*/ + label = lv_label_create(btn1, NULL); /*Create a label on the button (the 'label' variable can be reused)*/ + lv_label_set_text(label, "Button 1"); + + /*Copy the previous button*/ + lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), btn1); /*Second parameter is an object to copy*/ + lv_obj_align(btn2, btn1, LV_ALIGN_OUT_RIGHT_MID, 50, 0);/*Align next to the prev. button.*/ + label = lv_label_create(btn2, NULL); /*Create a label on the button*/ + lv_label_set_text(label, "Button 2"); + + /*Add a slider (inheritance: lv_obj -> lv_bar -> lv_slider)*/ + lv_obj_t * slider = lv_slider_create(scr, NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static lv_action_res_t btn_rel_action(lv_obj_t * btn, lv_dispi_t * dispi) +{ + cord_t width = lv_obj_get_width(btn); + lv_obj_set_width(btn, width + 20); + + return LV_ACTION_RES_OK; +} + +#endif /*USE_LV_EXAMPLE != 0*/ diff --git a/lv_examples/1_2_obj_usage/obj_usage.h b/lv_examples/1_2_obj_usage/obj_usage.h index e69de29bb..5f6d7dc00 100644 --- a/lv_examples/1_2_obj_usage/obj_usage.h +++ b/lv_examples/1_2_obj_usage/obj_usage.h @@ -0,0 +1,42 @@ +/** + * @file lv_hello_world.h + * + */ + +#ifndef LV_OBJ_USAGE_H +#define LV_OBJ_USAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_conf.h" +#if USE_LV_EXAMPLE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_obj_usage_init(void); + +/********************** + * MACROS + **********************/ + +#endif /*USE_LV_EXAMPLE != 0*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_OBJ_USAGE_H*/ From 4ab5d9459e57d8b85e707d6f20f0e04c0162e9e8 Mon Sep 17 00:00:00 2001 From: Gabor Date: Fri, 4 Aug 2017 12:40:43 +0200 Subject: [PATCH 2/7] lv_slider: don't let indicator or bar to disappear because of hpad/vpad --- lv_objx/lv_slider.c | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/lv_objx/lv_slider.c b/lv_objx/lv_slider.c index 56750ee4c..4eaec2bb5 100644 --- a/lv_objx/lv_slider.c +++ b/lv_objx/lv_slider.c @@ -17,6 +17,7 @@ /********************* * DEFINES *********************/ +#define LV_SLIDER_SIZE_MIN (2 * LV_DOWNSCALE) /*hpad and vpad cannot make the bar or indicator smaller then this [px]*/ /********************** * TYPEDEFS @@ -246,24 +247,47 @@ static bool lv_slider_design(lv_obj_t * slider, const area_t * mask, lv_design_m lv_style_t * style_knob = lv_slider_get_style_knob(slider); lv_style_t * style_indic = lv_bar_get_style_indic(slider); + /*Draw the bar*/ area_t area_bar; - area_cpy(&area_bar, &slider->cords); - area_bar.x1 += style_knob->hpad; - area_bar.x2 -= style_knob->hpad; - area_bar.y1 += style_knob->vpad; - area_bar.y2 -= style_knob->vpad; + /*Be sure at least vpad/hpad width bar will remain*/ + cord_t vpad_bar = style_indic->vpad; + cord_t hpad_bar = style_indic->hpad; + if(vpad_bar * 2 + LV_SLIDER_SIZE_MIN > area_get_height(&area_bar)) { + vpad_bar = (area_get_height(&area_bar) - LV_SLIDER_SIZE_MIN) >> 1; + } + if(hpad_bar * 2 + LV_SLIDER_SIZE_MIN > area_get_width(&area_bar)) { + hpad_bar = (area_get_width(&area_bar) - LV_SLIDER_SIZE_MIN) >> 1; + } + + area_bar.x1 += hpad_bar; + area_bar.x2 -= hpad_bar; + area_bar.y1 += vpad_bar; + area_bar.y2 -= vpad_bar; lv_draw_rect(&area_bar, mask, style_slider); + /*Draw the indicator*/ area_t area_indic; area_cpy(&area_indic, &area_bar); - area_indic.x1 += style_indic->hpad; - area_indic.x2 -= style_indic->hpad; - area_indic.y1 += style_indic->vpad; - area_indic.y2 -= style_indic->vpad; + + /*Be sure at least vpad/hpad width indicator will remain*/ + cord_t vpad_indic = style_indic->vpad; + cord_t hpad_indic = style_indic->hpad; + if(vpad_indic * 2 + LV_SLIDER_SIZE_MIN > area_get_height(&area_bar)) { + vpad_indic = (area_get_height(&area_bar) - LV_SLIDER_SIZE_MIN) >> 1; + } + if(hpad_indic * 2 + LV_SLIDER_SIZE_MIN > area_get_width(&area_bar)) { + hpad_indic = (area_get_width(&area_bar) - LV_SLIDER_SIZE_MIN) >> 1; + } + + area_indic.x1 += hpad_indic; + area_indic.x2 -= hpad_indic; + area_indic.y1 += vpad_indic; + area_indic.y2 -= vpad_indic; cord_t slider_w = area_get_width(&slider->cords); cord_t slider_h = area_get_height(&slider->cords); + cord_t act_value = lv_bar_get_value(slider); cord_t min_value = lv_bar_get_min_value(slider); cord_t max_value = lv_bar_get_max_value(slider); From 125b199f85f8056258faeb07734304eb80dd0a4c Mon Sep 17 00:00:00 2001 From: Gabor Date: Sat, 12 Aug 2017 10:09:27 +0200 Subject: [PATCH 3/7] examples: obj_usage: comment updates --- lv_examples/1_2_obj_usage/obj_usage.c | 111 +++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 11 deletions(-) diff --git a/lv_examples/1_2_obj_usage/obj_usage.c b/lv_examples/1_2_obj_usage/obj_usage.c index 00cc31c4b..c0c207798 100644 --- a/lv_examples/1_2_obj_usage/obj_usage.c +++ b/lv_examples/1_2_obj_usage/obj_usage.c @@ -4,16 +4,18 @@ */ /* - * The basic building blocks in LittlevGL are the graphical objects. + * The basic building blocks (components or widgets) in LittlevGL are the graphical objects. * For example: * - Buttons * - Labels * - Charts * - Sliders etc * - * Regardless to the object type the 'lv_obj_t' is used stores objects - * and you can refer to an object with an lv_obj_t pointer (lv_obj_t *) + * In this part you can learn the basics of the objects like creating, positioning, sizing etc. + * You will also meet some different object types and their attributes. * + * Regardless to the object type the 'lv_obj_t' variable type is used stores the objects + * and you can refer to an object with an lv_obj_t pointer (lv_obj_t *) * * INHERITANCE * ------------- @@ -31,13 +33,13 @@ * PARENT-CHILD * ------------- * A parent can be considered as the container of its children. - * Every object has exactly one parent object (except screens) but - * a parent can have unlimited number of children. + * Every object has exactly one parent object (except screens). + * A parent can have unlimited number of children. * There is no limitation for the type of the parent. * * The children are visible only on their parent. The parts outside will be cropped (not displayed) * - * If the parent is moved the children move with it. + * If the parent is moved the children will be moved with it. * * The earlier created object (and its children) will drawn earlier. * Using this layers can be built. @@ -46,6 +48,10 @@ * ------------- * - General overview: http://www.gl.littlev.hu/objects * - Detailed description of types: http://www.gl.littlev.hu/object-types + * + * NOTES + * ------------- + * - Be sure 'LV_OBJ_FREE_P' is enabled in 'lv_conf.h' */ /********************* @@ -68,6 +74,7 @@ * STATIC PROTOTYPES **********************/ static lv_action_res_t btn_rel_action(lv_obj_t * btn, lv_dispi_t * dispi); +static lv_action_res_t ddlist_action(lv_obj_t * ddlist, lv_dispi_t * dispi); /********************** * STATIC VARIABLES @@ -82,27 +89,39 @@ static lv_action_res_t btn_rel_action(lv_obj_t * btn, lv_dispi_t * dispi); **********************/ /** - * + * Initialize the Object usage example */ void lv_obj_usage_init(void) { + /******************** + * CREATE A SCREEN + *******************/ + /* Create a new screen and load it * Screen can be created from any type object * Now a Page is used which is an objects with scrollable content*/ lv_obj_t * scr = lv_page_create(NULL, NULL); lv_scr_load(scr); - /*Add a title*/ + + /**************** + * ADD A TITLE + ****************/ lv_obj_t * label = lv_label_create(scr, NULL); /*First parameters (scr) is the parent*/ lv_label_set_text(label, "Object usage demo"); /*Set the text*/ lv_obj_set_x(label, 50); /*Labels are inherited from Basic object so 'lv_obj_...' functions can be used*/ + + /******************** + * CREATE TWO BUTTONS + ********************/ + /*Create a button*/ - lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); /*Create a button the currently loaded screen*/ + lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); /*Create a button on the currently loaded screen*/ lv_btn_set_rel_action(btn1, btn_rel_action); /*Set function to call when the button is released*/ lv_obj_align(btn1, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); /*Align below the label*/ - label = lv_label_create(btn1, NULL); /*Create a label on the button (the 'label' variable can be reused)*/ + label = lv_label_create(btn1, NULL); /*Create a label on the button (the 'label' variable can be reused)*/ lv_label_set_text(label, "Button 1"); /*Copy the previous button*/ @@ -111,19 +130,89 @@ void lv_obj_usage_init(void) label = lv_label_create(btn2, NULL); /*Create a label on the button*/ lv_label_set_text(label, "Button 2"); + + /**************** + * ADD A SLIDER + ****************/ + /*Add a slider (inheritance: lv_obj -> lv_bar -> lv_slider)*/ - lv_obj_t * slider = lv_slider_create(scr, NULL); + lv_obj_t * slider = lv_slider_create(scr, NULL); /*Create a slider*/ + lv_obj_set_size(slider, lv_obj_get_width(lv_scr_act()) / 3, LV_DPI / 3); /*Set the size*/ + lv_obj_align(slider, btn1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); /*Align below the first button*/ + lv_bar_set_value(slider, 30); /*Slider is a 'bar' so set its value like a 'bar'*/ + + + /*********************** + * ADD A DROP DOWN LIST + ************************/ + + lv_obj_t * ddlist = lv_ddlist_create(lv_scr_act(), NULL); + lv_obj_align(ddlist, slider, LV_ALIGN_OUT_RIGHT_TOP, 20, 0); /*Align next to the slider*/ + lv_obj_set_free_p(ddlist, slider); /*Save the pointer of the slider in the ddlist (used in 'ddlist_action()')*/ + lv_ddlist_set_options_str(ddlist, "None\nLittle\nHalf\nA lot\nAll"); /*Set the options*/ + lv_ddlist_set_action(ddlist, ddlist_action); /*Set function to call on new option choose*/ + lv_obj_set_top(ddlist, true); /*Enable the drop down list always be on the top*/ + + + /**************** + * CREATE A CHART + ****************/ + lv_obj_t * chart = lv_chart_create(lv_scr_act(), NULL); /*Craete the chart*/ + lv_obj_set_size(chart, lv_obj_get_width(scr) / 2, lv_obj_get_width(scr) / 4); /*Set the size*/ + lv_obj_align(chart, slider, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); /*Align below the slider*/ + lv_chart_set_dl_width(chart, 3 * LV_DOWNSCALE); /*Set the line width (LV_DOWNSCALE compensates anti-aliasing if enabled)*/ + + /*Add a RED data line and set some points*/ + lv_chart_dl_t * dl1 = lv_chart_add_data_line(chart, COLOR_RED); + lv_chart_set_next(chart, dl1, 10); + lv_chart_set_next(chart, dl1, 25); + lv_chart_set_next(chart, dl1, 45); + lv_chart_set_next(chart, dl1, 80); + + /*Add a BLUE data line and set some points*/ + lv_chart_dl_t * dl2 = lv_chart_add_data_line(chart, COLOR_MAKE(0x40, 0x70, 0xC0)); + lv_chart_set_next(chart, dl2, 10); + lv_chart_set_next(chart, dl2, 25); + lv_chart_set_next(chart, dl2, 45); + lv_chart_set_next(chart, dl2, 80); + lv_chart_set_next(chart, dl2, 75); + lv_chart_set_next(chart, dl2, 505); + } /********************** * STATIC FUNCTIONS **********************/ + +/** + * Called when a button is released + * @param btn pointer to the released button + * @param dispi pointer to caller display input (e.g. touchpad) + * @return LV_ACTION_RES_OK because the object is not deleted in this function + */ static lv_action_res_t btn_rel_action(lv_obj_t * btn, lv_dispi_t * dispi) { + /*Increase the button width*/ cord_t width = lv_obj_get_width(btn); lv_obj_set_width(btn, width + 20); return LV_ACTION_RES_OK; } +/** + * Called when a new option is chosen in the drop down list + * @param ddlist pointer to the drop down list + * @param dispi pointer to caller display input (e.g. touchpad) + * @return LV_ACTION_RES_OK because the object is not deleted in this function + */ +static lv_action_res_t ddlist_action(lv_obj_t * ddlist, lv_dispi_t * dispi) +{ + uint16_t opt = lv_ddlist_get_selected(ddlist); /*Get the id of selected option*/ + + lv_obj_t * slider = lv_obj_get_free_p(ddlist); /*Get the saved slider*/ + lv_bar_set_value(slider, (opt * 100) / 4); /*Modify the slider value according to the selection*/ + + return LV_ACTION_RES_OK; +} + #endif /*USE_LV_EXAMPLE != 0*/ From d69c18dba43ac7210e48009741e526fc0445f6d8 Mon Sep 17 00:00:00 2001 From: Gabor Date: Sat, 12 Aug 2017 10:10:16 +0200 Subject: [PATCH 4/7] examples: style_usage: skeleton added --- lv_examples/1_3_style_usage/style_usage.c | 64 +++++++++++++++++++++++ lv_examples/1_3_style_usage/style_usage.h | 42 +++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/lv_examples/1_3_style_usage/style_usage.c b/lv_examples/1_3_style_usage/style_usage.c index e69de29bb..f6f5ec850 100644 --- a/lv_examples/1_3_style_usage/style_usage.c +++ b/lv_examples/1_3_style_usage/style_usage.c @@ -0,0 +1,64 @@ +/** + * @file style_usage.c + * + */ + +/* + * + */ + +/********************* + * INCLUDES + *********************/ +#include "style_usage.h" + +#if USE_LV_EXAMPLE != 0 + +#include "lvgl/lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a simple 'Hello world!' label + */ +void style_usage_init(void) +{ + + /*3 buttons*/ + /*copy default style and mod, create new style*/ + + + + /*3 labels font + symbol font*/ + + /*3 leds*/ + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*USE_LV_EXAMPLE != 0*/ diff --git a/lv_examples/1_3_style_usage/style_usage.h b/lv_examples/1_3_style_usage/style_usage.h index e69de29bb..ef814def2 100644 --- a/lv_examples/1_3_style_usage/style_usage.h +++ b/lv_examples/1_3_style_usage/style_usage.h @@ -0,0 +1,42 @@ +/** + * @file style_usage.h + * + */ + +#ifndef STYLE_USAGE_H +#define STYLE_USAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_conf.h" +#if USE_LV_EXAMPLE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void style_usage_init(void); + +/********************** + * MACROS + **********************/ + +#endif /*USE_LV_EXAMPLE != 0*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_HELLO_WORLD_H*/ From e044e025413cff59a2c25118d38db1a69b7fd6b3 Mon Sep 17 00:00:00 2001 From: Gabor Date: Thu, 17 Aug 2017 09:42:12 +0200 Subject: [PATCH 5/7] lv_example: style_usage example added --- lv_examples/1_3_style_usage/style_usage.c | 108 +++++++++++++++++++++- 1 file changed, 103 insertions(+), 5 deletions(-) diff --git a/lv_examples/1_3_style_usage/style_usage.c b/lv_examples/1_3_style_usage/style_usage.c index f6f5ec850..4c7ffe322 100644 --- a/lv_examples/1_3_style_usage/style_usage.c +++ b/lv_examples/1_3_style_usage/style_usage.c @@ -4,8 +4,25 @@ */ /* + * You can modify the appearance of the graphical objects with styles. + * A style is simple 'lv_style_t' variable. + * Objects save the address of this variable so it has to be 'static or 'global'. * - */ + * A style contains various attributes to describe rectangle, image or text like + * objects at same time. To know which attribute is used by an object see: + * http://www.gl.littlev.hu/object-types + * + * To set a new style for an object use: 'lv_obj_set_style(obj, &style); + * If NULL is set as style then the object will inherit the parents style. + * For example is you create a style for button the label appearance can be defined there as well. + * + * You can use built-in styles. 'lv_style_get(LV_STYLE_... , ©)' will give you a pointer to built in style + * and copy it to variable (second parameter) if it is not NULL. + * By default the objects use the built-in styles. + * The built-in styles can be modified in run time to give a new default skin to your GUI. + * + * Learn more here: http://www.gl.littlev.hu/objects#style + * */ /********************* * INCLUDES @@ -46,15 +63,96 @@ void style_usage_init(void) { - /*3 buttons*/ - /*copy default style and mod, create new style*/ + /************************************ + * BUTTON + LABEL WITH DEFAULT STYLE + ************************************/ + + lv_obj_t * btn1; + btn1 = lv_btn_create(lv_scr_act(), NULL); /*Create a simple button*/ + lv_obj_set_pos(btn1, 10, 10); + lv_obj_t * label = lv_label_create(btn1, NULL); /*Add a lebel tothe button*/ + lv_label_set_text(label, "Default"); + + /************************ + * BUTTON WITH NEW STYLE + ************************/ + + /* Create a new style + * Don't forget a style can describe any object type + * like buttons and labels */ + static lv_style_t style_btn2; /*Styles can't be local variables*/ + lv_style_get(LV_STYLE_PRETTY_COLOR, &style_btn2); /*Copy a built-in style as a starting point*/ + style_btn2.swidth = 10; /*10 px shadow*/ + style_btn2.bwidth = 5; /*5 px border width*/ + style_btn2.mcolor = COLOR_ORANGE; /*Orange main color*/ + style_btn2.gcolor = COLOR_RED; /*Red gradient color*/ + style_btn2.letter_space = 10; /*10 px letter space*/ + style_btn2.txt_align = LV_TXT_ALIGN_MID; /*Text align: middle*/ + + /*Create a button and apply the new style*/ + lv_obj_t * btn2; + btn2 = lv_btn_create(lv_scr_act(), NULL); + lv_obj_align(btn2, btn1, LV_ALIGN_OUT_RIGHT_MID, 20, 0); + lv_obj_set_style(btn2, &style_btn2); + + /* Add a label to the button. + * Label by default inherits the parent's style */ + label = lv_label_create(btn2, NULL); + lv_label_set_text(label, "New\nstyle"); + + /************************ + * LABEL WITH NEW STYLE + ************************/ + + /*Create new style for the label*/ + static lv_style_t style_label; + lv_style_get(LV_STYLE_PRETTY_COLOR, &style_label); /*Use a built-in style*/ + style_label.ccolor = color_mix(COLOR_BLUE, COLOR_WHITE, OPA_70);/*Light blue content color (text color) */ + style_label.letter_space = 4; /*4 px letter space*/ + style_label.txt_align = LV_TXT_ALIGN_MID; /*Text align: middle*/ + + /*Copy 'btn2'. It will use the same style as 'btn2'*/ + lv_obj_t * btn3; + btn3 = lv_btn_create(lv_scr_act(), btn2); + lv_obj_align(btn3, btn2, LV_ALIGN_OUT_RIGHT_MID, 20, 0); + + /*Create a label and apply the new style */ + label = lv_label_create(btn3, NULL); + lv_label_set_text(label, "Label\nstyle"); + lv_obj_set_style(label, &style_label); + /************************ + * CREATE A STYLED LED + ***********************/ - /*3 labels font + symbol font*/ + /*Create a style for the LED*/ + static lv_style_t style_led; + lv_style_get(LV_STYLE_PRETTY_COLOR, &style_led); + style_led.swidth = 15; + style_led.radius = LV_RADIUS_CIRCLE; + style_led.bwidth = 5; + style_led.bopa = OPA_30; + style_led.mcolor = COLOR_MAKE(0xb5, 0x0f, 0x04); + style_led.gcolor = COLOR_MAKE(0x50, 0x07, 0x02); + style_led.bcolor = COLOR_MAKE(0xfa, 0x0f, 0x00); + style_led.scolor = COLOR_MAKE(0xb5, 0x0f, 0x04); - /*3 leds*/ + /*Create a LED and switch it ON*/ + lv_obj_t * led1 = lv_led_create(lv_scr_act(), NULL); + lv_obj_set_style(led1, &style_led); + lv_obj_align_us(led1, btn1, LV_ALIGN_OUT_BOTTOM_MID, 0, 40); + lv_led_on(led1); + /*Copy the previous LED and set a brightness*/ + lv_obj_t * led2 = lv_led_create(lv_scr_act(), led1); + lv_obj_align_us(led2, btn2, LV_ALIGN_OUT_BOTTOM_MID, 0, 40); + lv_led_set_bright(led2, 190); + + /*Copy the previous LED and switch it OFF*/ + lv_obj_t * led3 = lv_led_create(lv_scr_act(), led1); + lv_obj_align_us(led3, btn3, LV_ALIGN_OUT_BOTTOM_MID, 0, 40); + lv_led_off(led3); } /********************** From b8080ef1db8fdeaf09f7148a07192716eceb2100 Mon Sep 17 00:00:00 2001 From: Gabor Date: Thu, 17 Aug 2017 09:56:01 +0200 Subject: [PATCH 6/7] lv_examle: renames, add 'lv_ex_' prefix --- .../lv_ex_hello_world.c} | 0 .../lv_ex_hello_world.h} | 0 .../obj_usage.c => 1_2_objects/lv_ex_objects.c} | 4 ++-- .../obj_usage.h => 1_2_objects/lv_ex_objects.h} | 0 .../style_usage.c => 1_3_styles/lv_ex_styles.c} | 0 .../style_usage.h => 1_3_styles/lv_ex_styles.h} | 2 +- .../animations.h => 1_4_responsive/lv_ex_responsive.c} | 0 .../anti_aliasing.c => 1_4_responsive/lv_ex_responsive.h} | 0 .../1_5_animations/{animations.c => lv_ex_animations.c} | 0 .../anti_aliasing.h => 1_5_animations/lv_ex_animations.h} | 0 .../lv_ex_anti_aliasing.c} | 0 .../lv_ex_anti_aliasing.h} | 0 .../new_obj_type.c => 1_7_gui/lv_ex_gui.c} | 0 .../new_obj_type.h => 1_7_gui/lv_ex_gui.h} | 0 .../button_ctrl.c => 1_8_new_obj_type/lv_ex_new_obj_type.c} | 0 .../button_ctrl.h => 1_8_new_obj_type/lv_ex_new_obj_type.h} | 0 .../keyboard_ctrl.c => 2_1_button_ctrl/lv_ex_button_ctrl.c} | 0 .../keyboard_ctrl.h => 2_1_button_ctrl/lv_ex_button_ctrl.h} | 0 .../{encoder_ctrl.c => lv_ex_encoder_ctrl.c} | 6 +++--- .../{encoder_ctrl.h => lv_ex_encoder_ctrl.h} | 0 .../lv_ex_keyboard_ctrl.c} | 0 .../lv_ex_keyboard_ctrl.h} | 0 .../app_desktop.c => 2_4_mouse_ctrl/lv_ex_mouse_ctrl.c} | 0 .../app_desktop.h => 2_4_mouse_ctrl/lv_ex_mouse_ctrl.h} | 0 .../app_run.c => 3_1_app_desktop/lv_ex_app_desktop.c} | 0 .../app_run.h => 3_1_app_desktop/lv_ex_app_desktop.h} | 0 .../{3_3_app_com/app_com.c => 3_2_app_run/lv_ex_app_run.c} | 0 .../{3_3_app_com/app_com.h => 3_2_app_run/lv_ex_app_run.h} | 0 lv_examples/3_3_app_com/lv_ex_app_com.c | 0 lv_examples/3_3_app_com/lv_ex_app_com.h | 0 30 files changed, 6 insertions(+), 6 deletions(-) rename lv_examples/{1_1_lv_hello_world/lv_hello_world.c => 1_1_hello_world/lv_ex_hello_world.c} (100%) rename lv_examples/{1_1_lv_hello_world/lv_hello_world.h => 1_1_hello_world/lv_ex_hello_world.h} (100%) rename lv_examples/{1_2_obj_usage/obj_usage.c => 1_2_objects/lv_ex_objects.c} (99%) rename lv_examples/{1_2_obj_usage/obj_usage.h => 1_2_objects/lv_ex_objects.h} (100%) rename lv_examples/{1_3_style_usage/style_usage.c => 1_3_styles/lv_ex_styles.c} (100%) rename lv_examples/{1_3_style_usage/style_usage.h => 1_3_styles/lv_ex_styles.h} (95%) rename lv_examples/{1_5_animations/animations.h => 1_4_responsive/lv_ex_responsive.c} (100%) rename lv_examples/{1_6_anti_aliasing/anti_aliasing.c => 1_4_responsive/lv_ex_responsive.h} (100%) rename lv_examples/1_5_animations/{animations.c => lv_ex_animations.c} (100%) rename lv_examples/{1_6_anti_aliasing/anti_aliasing.h => 1_5_animations/lv_ex_animations.h} (100%) rename lv_examples/{1_7_comlex_gui_1/complex_gui_1.c => 1_6_anti_aliasing/lv_ex_anti_aliasing.c} (100%) rename lv_examples/{1_7_comlex_gui_1/complex_gui_1.h => 1_6_anti_aliasing/lv_ex_anti_aliasing.h} (100%) rename lv_examples/{1_8_new_obj_type/new_obj_type.c => 1_7_gui/lv_ex_gui.c} (100%) rename lv_examples/{1_8_new_obj_type/new_obj_type.h => 1_7_gui/lv_ex_gui.h} (100%) rename lv_examples/{2_1_button_ctrl/button_ctrl.c => 1_8_new_obj_type/lv_ex_new_obj_type.c} (100%) rename lv_examples/{2_1_button_ctrl/button_ctrl.h => 1_8_new_obj_type/lv_ex_new_obj_type.h} (100%) rename lv_examples/{2_3_keyboard_ctrl/keyboard_ctrl.c => 2_1_button_ctrl/lv_ex_button_ctrl.c} (100%) rename lv_examples/{2_3_keyboard_ctrl/keyboard_ctrl.h => 2_1_button_ctrl/lv_ex_button_ctrl.h} (100%) rename lv_examples/2_2_encoder_ctrl/{encoder_ctrl.c => lv_ex_encoder_ctrl.c} (99%) rename lv_examples/2_2_encoder_ctrl/{encoder_ctrl.h => lv_ex_encoder_ctrl.h} (100%) rename lv_examples/{2_4_mouse_ctrl/mouse_ctrl.c => 2_3_keyboard_ctrl/lv_ex_keyboard_ctrl.c} (100%) rename lv_examples/{2_4_mouse_ctrl/mouse_ctrl.h => 2_3_keyboard_ctrl/lv_ex_keyboard_ctrl.h} (100%) rename lv_examples/{3_1_app_desktop/app_desktop.c => 2_4_mouse_ctrl/lv_ex_mouse_ctrl.c} (100%) rename lv_examples/{3_1_app_desktop/app_desktop.h => 2_4_mouse_ctrl/lv_ex_mouse_ctrl.h} (100%) rename lv_examples/{3_2_app_run/app_run.c => 3_1_app_desktop/lv_ex_app_desktop.c} (100%) rename lv_examples/{3_2_app_run/app_run.h => 3_1_app_desktop/lv_ex_app_desktop.h} (100%) rename lv_examples/{3_3_app_com/app_com.c => 3_2_app_run/lv_ex_app_run.c} (100%) rename lv_examples/{3_3_app_com/app_com.h => 3_2_app_run/lv_ex_app_run.h} (100%) create mode 100644 lv_examples/3_3_app_com/lv_ex_app_com.c create mode 100644 lv_examples/3_3_app_com/lv_ex_app_com.h diff --git a/lv_examples/1_1_lv_hello_world/lv_hello_world.c b/lv_examples/1_1_hello_world/lv_ex_hello_world.c similarity index 100% rename from lv_examples/1_1_lv_hello_world/lv_hello_world.c rename to lv_examples/1_1_hello_world/lv_ex_hello_world.c diff --git a/lv_examples/1_1_lv_hello_world/lv_hello_world.h b/lv_examples/1_1_hello_world/lv_ex_hello_world.h similarity index 100% rename from lv_examples/1_1_lv_hello_world/lv_hello_world.h rename to lv_examples/1_1_hello_world/lv_ex_hello_world.h diff --git a/lv_examples/1_2_obj_usage/obj_usage.c b/lv_examples/1_2_objects/lv_ex_objects.c similarity index 99% rename from lv_examples/1_2_obj_usage/obj_usage.c rename to lv_examples/1_2_objects/lv_ex_objects.c index c0c207798..8516c8be0 100644 --- a/lv_examples/1_2_obj_usage/obj_usage.c +++ b/lv_examples/1_2_objects/lv_ex_objects.c @@ -57,7 +57,7 @@ /********************* * INCLUDES *********************/ -#include "obj_usage.h" +#include "lv_ex_objects.h" #if USE_LV_EXAMPLE != 0 #include "lvgl/lvgl.h" @@ -91,7 +91,7 @@ static lv_action_res_t ddlist_action(lv_obj_t * ddlist, lv_dispi_t * dispi); /** * Initialize the Object usage example */ -void lv_obj_usage_init(void) +void lv_ex_objects(void) { /******************** diff --git a/lv_examples/1_2_obj_usage/obj_usage.h b/lv_examples/1_2_objects/lv_ex_objects.h similarity index 100% rename from lv_examples/1_2_obj_usage/obj_usage.h rename to lv_examples/1_2_objects/lv_ex_objects.h diff --git a/lv_examples/1_3_style_usage/style_usage.c b/lv_examples/1_3_styles/lv_ex_styles.c similarity index 100% rename from lv_examples/1_3_style_usage/style_usage.c rename to lv_examples/1_3_styles/lv_ex_styles.c diff --git a/lv_examples/1_3_style_usage/style_usage.h b/lv_examples/1_3_styles/lv_ex_styles.h similarity index 95% rename from lv_examples/1_3_style_usage/style_usage.h rename to lv_examples/1_3_styles/lv_ex_styles.h index ef814def2..6598c2a59 100644 --- a/lv_examples/1_3_style_usage/style_usage.h +++ b/lv_examples/1_3_styles/lv_ex_styles.h @@ -27,7 +27,7 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -void style_usage_init(void); +void lv_ex_styles(void); /********************** * MACROS diff --git a/lv_examples/1_5_animations/animations.h b/lv_examples/1_4_responsive/lv_ex_responsive.c similarity index 100% rename from lv_examples/1_5_animations/animations.h rename to lv_examples/1_4_responsive/lv_ex_responsive.c diff --git a/lv_examples/1_6_anti_aliasing/anti_aliasing.c b/lv_examples/1_4_responsive/lv_ex_responsive.h similarity index 100% rename from lv_examples/1_6_anti_aliasing/anti_aliasing.c rename to lv_examples/1_4_responsive/lv_ex_responsive.h diff --git a/lv_examples/1_5_animations/animations.c b/lv_examples/1_5_animations/lv_ex_animations.c similarity index 100% rename from lv_examples/1_5_animations/animations.c rename to lv_examples/1_5_animations/lv_ex_animations.c diff --git a/lv_examples/1_6_anti_aliasing/anti_aliasing.h b/lv_examples/1_5_animations/lv_ex_animations.h similarity index 100% rename from lv_examples/1_6_anti_aliasing/anti_aliasing.h rename to lv_examples/1_5_animations/lv_ex_animations.h diff --git a/lv_examples/1_7_comlex_gui_1/complex_gui_1.c b/lv_examples/1_6_anti_aliasing/lv_ex_anti_aliasing.c similarity index 100% rename from lv_examples/1_7_comlex_gui_1/complex_gui_1.c rename to lv_examples/1_6_anti_aliasing/lv_ex_anti_aliasing.c diff --git a/lv_examples/1_7_comlex_gui_1/complex_gui_1.h b/lv_examples/1_6_anti_aliasing/lv_ex_anti_aliasing.h similarity index 100% rename from lv_examples/1_7_comlex_gui_1/complex_gui_1.h rename to lv_examples/1_6_anti_aliasing/lv_ex_anti_aliasing.h diff --git a/lv_examples/1_8_new_obj_type/new_obj_type.c b/lv_examples/1_7_gui/lv_ex_gui.c similarity index 100% rename from lv_examples/1_8_new_obj_type/new_obj_type.c rename to lv_examples/1_7_gui/lv_ex_gui.c diff --git a/lv_examples/1_8_new_obj_type/new_obj_type.h b/lv_examples/1_7_gui/lv_ex_gui.h similarity index 100% rename from lv_examples/1_8_new_obj_type/new_obj_type.h rename to lv_examples/1_7_gui/lv_ex_gui.h diff --git a/lv_examples/2_1_button_ctrl/button_ctrl.c b/lv_examples/1_8_new_obj_type/lv_ex_new_obj_type.c similarity index 100% rename from lv_examples/2_1_button_ctrl/button_ctrl.c rename to lv_examples/1_8_new_obj_type/lv_ex_new_obj_type.c diff --git a/lv_examples/2_1_button_ctrl/button_ctrl.h b/lv_examples/1_8_new_obj_type/lv_ex_new_obj_type.h similarity index 100% rename from lv_examples/2_1_button_ctrl/button_ctrl.h rename to lv_examples/1_8_new_obj_type/lv_ex_new_obj_type.h diff --git a/lv_examples/2_3_keyboard_ctrl/keyboard_ctrl.c b/lv_examples/2_1_button_ctrl/lv_ex_button_ctrl.c similarity index 100% rename from lv_examples/2_3_keyboard_ctrl/keyboard_ctrl.c rename to lv_examples/2_1_button_ctrl/lv_ex_button_ctrl.c diff --git a/lv_examples/2_3_keyboard_ctrl/keyboard_ctrl.h b/lv_examples/2_1_button_ctrl/lv_ex_button_ctrl.h similarity index 100% rename from lv_examples/2_3_keyboard_ctrl/keyboard_ctrl.h rename to lv_examples/2_1_button_ctrl/lv_ex_button_ctrl.h diff --git a/lv_examples/2_2_encoder_ctrl/encoder_ctrl.c b/lv_examples/2_2_encoder_ctrl/lv_ex_encoder_ctrl.c similarity index 99% rename from lv_examples/2_2_encoder_ctrl/encoder_ctrl.c rename to lv_examples/2_2_encoder_ctrl/lv_ex_encoder_ctrl.c index 9064fe32b..a1bfea53c 100644 --- a/lv_examples/2_2_encoder_ctrl/encoder_ctrl.c +++ b/lv_examples/2_2_encoder_ctrl/lv_ex_encoder_ctrl.c @@ -1,5 +1,5 @@ /** - * @file encoder_ctrl.c + * @file lv_ex_encoder_ctrl.c * */ @@ -33,7 +33,7 @@ /********************* * INCLUDES *********************/ -#include "encoder_ctrl.h" +#include "lv_ex_encoder_ctrl.h" #if USE_LV_EXAMPLE != 0 #include "lvgl/lvgl.h" @@ -78,7 +78,7 @@ static lv_group_t * g; /*An Object Group*/ /** * Create a simple GUI to demonstrate encoder control capability */ -void encoder_ctrl_init(void) +void lv_ex_encoder_ctrl(void) { /* Create a Page screen (to make it scrollable) * and use Pretty layout to make the content responsive. diff --git a/lv_examples/2_2_encoder_ctrl/encoder_ctrl.h b/lv_examples/2_2_encoder_ctrl/lv_ex_encoder_ctrl.h similarity index 100% rename from lv_examples/2_2_encoder_ctrl/encoder_ctrl.h rename to lv_examples/2_2_encoder_ctrl/lv_ex_encoder_ctrl.h diff --git a/lv_examples/2_4_mouse_ctrl/mouse_ctrl.c b/lv_examples/2_3_keyboard_ctrl/lv_ex_keyboard_ctrl.c similarity index 100% rename from lv_examples/2_4_mouse_ctrl/mouse_ctrl.c rename to lv_examples/2_3_keyboard_ctrl/lv_ex_keyboard_ctrl.c diff --git a/lv_examples/2_4_mouse_ctrl/mouse_ctrl.h b/lv_examples/2_3_keyboard_ctrl/lv_ex_keyboard_ctrl.h similarity index 100% rename from lv_examples/2_4_mouse_ctrl/mouse_ctrl.h rename to lv_examples/2_3_keyboard_ctrl/lv_ex_keyboard_ctrl.h diff --git a/lv_examples/3_1_app_desktop/app_desktop.c b/lv_examples/2_4_mouse_ctrl/lv_ex_mouse_ctrl.c similarity index 100% rename from lv_examples/3_1_app_desktop/app_desktop.c rename to lv_examples/2_4_mouse_ctrl/lv_ex_mouse_ctrl.c diff --git a/lv_examples/3_1_app_desktop/app_desktop.h b/lv_examples/2_4_mouse_ctrl/lv_ex_mouse_ctrl.h similarity index 100% rename from lv_examples/3_1_app_desktop/app_desktop.h rename to lv_examples/2_4_mouse_ctrl/lv_ex_mouse_ctrl.h diff --git a/lv_examples/3_2_app_run/app_run.c b/lv_examples/3_1_app_desktop/lv_ex_app_desktop.c similarity index 100% rename from lv_examples/3_2_app_run/app_run.c rename to lv_examples/3_1_app_desktop/lv_ex_app_desktop.c diff --git a/lv_examples/3_2_app_run/app_run.h b/lv_examples/3_1_app_desktop/lv_ex_app_desktop.h similarity index 100% rename from lv_examples/3_2_app_run/app_run.h rename to lv_examples/3_1_app_desktop/lv_ex_app_desktop.h diff --git a/lv_examples/3_3_app_com/app_com.c b/lv_examples/3_2_app_run/lv_ex_app_run.c similarity index 100% rename from lv_examples/3_3_app_com/app_com.c rename to lv_examples/3_2_app_run/lv_ex_app_run.c diff --git a/lv_examples/3_3_app_com/app_com.h b/lv_examples/3_2_app_run/lv_ex_app_run.h similarity index 100% rename from lv_examples/3_3_app_com/app_com.h rename to lv_examples/3_2_app_run/lv_ex_app_run.h diff --git a/lv_examples/3_3_app_com/lv_ex_app_com.c b/lv_examples/3_3_app_com/lv_ex_app_com.c new file mode 100644 index 000000000..e69de29bb diff --git a/lv_examples/3_3_app_com/lv_ex_app_com.h b/lv_examples/3_3_app_com/lv_ex_app_com.h new file mode 100644 index 000000000..e69de29bb From 7fdd633561ca5c752c094ff27d65db48dded0f76 Mon Sep 17 00:00:00 2001 From: Gabor Date: Thu, 17 Aug 2017 10:41:48 +0200 Subject: [PATCH 7/7] lv_example: add screenshots --- .../1_1_hello_world/lv_ex_hello_world.c | 6 +- .../1_1_hello_world/lv_ex_hello_world.h | 8 +- .../1_1_hello_world/lv_ex_hello_world.png | Bin 0 -> 1801 bytes lv_examples/1_2_objects/lv_ex_objects.h | 8 +- lv_examples/1_2_objects/lv_ex_objects.png | Bin 0 -> 10844 bytes lv_examples/1_3_styles/lv_ex_styles.c | 113 +++++++++--------- lv_examples/1_3_styles/lv_ex_styles.png | Bin 0 -> 11107 bytes lv_examples/1_5_animations/lv_ex_animations.c | 27 ----- .../2_2_encoder_ctrl/lv_ex_encoder_ctrl.h | 8 +- .../2_2_encoder_ctrl/lv_ex_encoder_ctrl.png | Bin 0 -> 9012 bytes 10 files changed, 71 insertions(+), 99 deletions(-) create mode 100644 lv_examples/1_1_hello_world/lv_ex_hello_world.png create mode 100644 lv_examples/1_2_objects/lv_ex_objects.png create mode 100644 lv_examples/1_3_styles/lv_ex_styles.png create mode 100644 lv_examples/2_2_encoder_ctrl/lv_ex_encoder_ctrl.png diff --git a/lv_examples/1_1_hello_world/lv_ex_hello_world.c b/lv_examples/1_1_hello_world/lv_ex_hello_world.c index c9a65c6e9..c7968a3d5 100644 --- a/lv_examples/1_1_hello_world/lv_ex_hello_world.c +++ b/lv_examples/1_1_hello_world/lv_ex_hello_world.c @@ -1,5 +1,5 @@ /** - * @file lv_hello_world.c + * @file lv_ex_hello_world.c * */ @@ -14,7 +14,7 @@ /********************* * INCLUDES *********************/ -#include "lv_hello_world.h" +#include "lv_ex_hello_world.h" #if USE_LV_EXAMPLE != 0 #include "lvgl/lvgl.h" @@ -46,7 +46,7 @@ /** * Create a simple 'Hello world!' label */ -void lv_hello_world_init(void) +void lv_ex_hello_world(void) { /*Create a Label on the current screen*/ lv_obj_t * label1 = lv_label_create(lv_scr_act(), NULL); diff --git a/lv_examples/1_1_hello_world/lv_ex_hello_world.h b/lv_examples/1_1_hello_world/lv_ex_hello_world.h index a14b3f043..a84708f17 100644 --- a/lv_examples/1_1_hello_world/lv_ex_hello_world.h +++ b/lv_examples/1_1_hello_world/lv_ex_hello_world.h @@ -1,10 +1,10 @@ /** - * @file lv_hello_world.h + * @file lv_ex_hello_world.h * */ -#ifndef LV_HELLO_WORLD_H -#define LV_HELLO_WORLD_H +#ifndef LV_EX_HELLO_WORLD_H +#define LV_EX_HELLO_WORLD_H #ifdef __cplusplus extern "C" { @@ -27,7 +27,7 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -void lv_hello_world_init(void); +void lv_ex_hello_world(void); /********************** * MACROS diff --git a/lv_examples/1_1_hello_world/lv_ex_hello_world.png b/lv_examples/1_1_hello_world/lv_ex_hello_world.png new file mode 100644 index 0000000000000000000000000000000000000000..547f045edfa022c4f3bf687f05642b6b6b277901 GIT binary patch literal 1801 zcmZvddsLEl7{@7{VoAETlc{OiMb9=%TX~x)DVEt3oaKd<%5qv+qEi$LFNuX+%ud5h zmr2gbB?R8^8j>Tkognf!#7l@C%WI-(NQvNnFJPU{*+1{|zQ5=BJtXTJNsrzG zI8^FAQ=cFkLG!NLSi7$ovIRtQp0N?(SVj*2PI;Ns#>VVUgm)idb7x@7xM7f)xclkv zuZsg1mt1$7M2-nP#iM;kxT8c_Q#T12xD;_V;7ZMIg4tQ3C{gXhRG3Is3`(2}H?2SF zkAvScpy1Z7Cp#Bj!d=*!ZChlqo{YWtMcWo9{eyZaCnMvwe;=6!tVB7jcDE_=cYw#j z5s)t#h19142g10`;ni6v!ToI8@aPl9h-wheH?<%aKPKZSFEm%}o%DB}(^k0zr-aK4 zDY$h>dz_rX@oG)B&ntoRx$$$FB<4OSC)b^ObTarpYv6WTi60VoYLtTt{4ML2(*q4f z`V^dO9~tNM(wGdoi(R`~qeLqZa>n7{Be4dWJlDfD@<2V%3O@xzZ`G!H_(bin^62a~nb zfl_3X@**Rz2j}M_9q#fghO-vmHBc+2P{au|Ye2niepFTC&^rH4E)kEG-w2~ufQK|A zLtPl}$7@Uf;r>Qp1+_CVafa7BCbE?Fxur)b-+zCR9VHi@mNzmyGnDnnhM~x9M8&Vl z2Zk;qKQ-nNaC75nyB=B~Sk{~nj(~Udq?|d@^_C-OkS?6RHTtD{w#j&If@7(IbhqFG zVOHfj+VY%A#HV;}cv*TbXL9KF!0c(RD-At?0Jjv<5;2CRAR*I9)o~uQKxS@^Jj?~O zA!1thmMR?g@!D>P`T|6=sl%@)DGB%# zI+ok$@GJ()w-Z!4gA!(#%1};2XW|RS;i&oTKYk;ql>aHciRqwI?iSPvTkJzfoPK(w zB;F&lbDATYnYXRlcm+iq43jasJe7-B)%!DPDXO@tGxX=oc0x^~fY*L%_K8*Z12kUP zL#<@D3K4=z5CGBx+dUr1wI~=0Q7ue(l%_N{w8V*(2~3r{Thla#$E;smDt_F@GPJ99 zDebQ4U0@9l_%m{eHDy@#y4rsP?u&Jt#y66O>N-wqu4`tOVgA@aJ-Z97;I;TYE>A|z zsN;qF!eD%K6_$;bt+`38k7&g^)AA=n&BZzK&U;N4=pf3jl_y-D3z8sN>5!8Xi4vObP$Ax;k() zSsFoHfW83DMxrJ(aM3ZWDNn!c2!O|Dw1A)h0qQ#~6wq1<903s1iC$)ru9ogH1cZ+* zgh$^8;Dh3I2m`fsf^_ZRW6x@s1tAQ3T;tRk0A!tDh()nw8bs?z2TG1)YP->fjqn5- zbU~~Fx*@KCAwi4*TDEWY)?oajtRl;WWs$mQ2MlMj literal 0 HcmV?d00001 diff --git a/lv_examples/1_2_objects/lv_ex_objects.h b/lv_examples/1_2_objects/lv_ex_objects.h index 5f6d7dc00..7bcba5ac0 100644 --- a/lv_examples/1_2_objects/lv_ex_objects.h +++ b/lv_examples/1_2_objects/lv_ex_objects.h @@ -1,10 +1,10 @@ /** - * @file lv_hello_world.h + * @file lv_ex_objects.h * */ -#ifndef LV_OBJ_USAGE_H -#define LV_OBJ_USAGE_H +#ifndef LV_EX_OBJECTS_H +#define LV_EX_OBJECTS_H #ifdef __cplusplus extern "C" { @@ -27,7 +27,7 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -void lv_obj_usage_init(void); +void lv_ex_objects(void); /********************** * MACROS diff --git a/lv_examples/1_2_objects/lv_ex_objects.png b/lv_examples/1_2_objects/lv_ex_objects.png new file mode 100644 index 0000000000000000000000000000000000000000..f18386c16cdde7559e124ba548620dd22234ed3d GIT binary patch literal 10844 zcmW+61zZ(R^MFS_ka!Z(4bqKBcZ1Rmg3>A7jdV&%cX#KLRFUpdLb|)*yZ^Vp_q%sH zyE8X4w>vXCa}n=UWU(-aF#rI-l9!WG0{{du@csl15xhRBG6{iyNX`=S8fa)}OKYmD zVE2`aw2q6qgSm_QhtHn?3wsB@L)qa{I+lbe4F4LtDuOTqt|dB*#)>S*uc*6%E^T>m=T`>5)z zZ>sur3dlDlqo3EiUQ98Z{#W4_`_CQPsgLJ5&l-T(auRc2Qt>?sil81dM4V+^Wh9Q~ zz9stHZT^A32QO$glfYasnN*o7O zT)Cd}8HK9<@86tz?Kddo8`Uu}F|Of}XhCU|e0*B|Ci^e?;Y38@I3@5b05>|Y?mU`u zG{_M%nlk+N8h_o@3DWlF=BNL+&CN}8w$RW}u=7eOIXM}hfPlWst$tAIkrK^?gk$Zo zj-KwnCjC6ml0>ik>-XJ>9VT0Gp`>Q!3MyUEwDU$6bY zJ)BflR-T+VcJr`hlfk{1G?0@Q1^55C*@{zgJ%0XH3R#_@O-@QqmNq-{=VYCOIAPrFF0p@r5G4#^ zqXtArV=iirj*K7&R93P)T3*PHjEvBQFed*32a*+v{3DEbD*`x`Aw!M0upb&s$49v=LZdZj3*s`|Ixl^I}6R#=3&QE%ch3>aps(B6?3 z6*ScnzqOXek*D&qr+t;d5k$F#8yko<>OzG^jfzHv5gJ5c>Y=X-5zjg1cwfdoxBjOGHVfCOFqV-(V|oZuD3AE(vu zkXLUqLUw+nrn1UKM|@-xcvjnueU!zByg!Q!Pfca>@LZURo$ZZCn2l+?8o4IM@7pf4 zjb}j}D(KRDq@W;w=)0q{wR;0%`TKZq*sgySs8i*9$;|)ccWV3e?b!EW$XGxRw?uqZ zhO3r1LX*&I=&28jgN4UDF?J^n?JI+bUqO=jlj-5N16Uv~zcMK7@-W{M!3@Z6-Rq_u%o1WIjWi(#-3IYl}RD zD9Onh7+%(>=2lKzZbPvnhr z#5W~%w5bu+6`H>2L?ZCxO+g6uXEJ#x`#F8Fk8hsXt1SWI zXHtwLkh&+akM?0(hFa|ZT(8IxeE1zht8348fmZKE)24R#fl!ZU8f2JoG1=&!iJ@A) za~`39K~W|iWf2KFnp4qxQUtexID4yVHE($J-ks1^Dy)7O!=MBv=c2@5iq<;+O(#|h zZj~^JeV~@D1g`BUWz#(5D5)J8)AqFQ$)r>=-95HZJac8j2NL>dS)qKJGNu{n%&vK- z(l1EFHt=H#DQ?`F*m#D;YZYDdoN!o(t%l&$+;P9I>>iF@*=d&x%T}yb%5_v#?l)4k zrXkc}qol$V&g^IjNe1e2`ad@8t6gZf&X5qKExCyy?t%hvDPbCx~gCQtV zUt-r~XR$v>C|SZ2bx%3-5CF$jkF`J;@zm+zE&c4;wb6PkyXGvJ(0h-v`cb@eMT;Rq z?b$P${VyCJb`Nff8rFB}Hu(v0#e0qnU$=>d#UI6dz~yt56Qk?U<2-$ol<5tsJkC2&Q-p4)^f_DA==Ff>%} zEwjBuc+V~lz5fK&lY`#{zPs~ZUBNjQpUg0Vn2>La={n=84Y}IvDRW}SRK`m4r4e}r zqL1`B*~P!*J9RwI)uin}U|Rfppw>l82r#JZL%Uj{u%*ns8-UlZ zF;3JO#T0V$LPyG6>ekJbb{PGXs@rqjl_#l(LZX9o0lea&b}?r?8FCra>i?& z0x$WJh%Rr*4C_#VxA{}JhSy{6$2b`e!^-TkUr=_!?Kj$Q{SEk4DR1NUw|2wX-tw4$ z5YQ=c7{>phGu@Zr%6M&Dls5jJklFsM=JO0)rF?#Hw)Em#Q(CE#`;B%_lDUzR%k$0R zRDt&zXY~u{!{!Vi)rHKEqK1tTE$B>q#~i&4Hg0fX!}uT>RR{pD!=4*&ST@^^`c;9f z?Oj9{f@ApJ(-mA0{k0QqL!-{x7m{jQv_>p7x0kbhfMZ?fmg=jq{ty&{%GRIqqrz_4 z*?wJ{$zKJ~+l-Alj9)mDlgS(Xl# z))xI}I=>U~p}@cDE@*ZvXEH}6J&CcEx6w2(ewrcacE%ouiQ{_S(-}V;g#{12C+4Fm zC(?+i${-(*Mns-=_wn< zV)bR8bzXkCEOzUkE_S=`R-4*W@a4MQXRR5}nAV<`QYOaCtD@5umEPnX&QUwtAWWVk zN~#>|KY@#W5>nSNYB*+YYC|+5)T4b2(C^&JWosluawa^FB3TkXv= zTE7=Qz?A+b1`C_V&`3Ny%uT0P#`$MkIZSG{#_b8*1UuJr?2v#tet+}kJr|{l(V6(G z4fDaCqXMLWMo$GGJcbBH$Z6hJENSqsOLnZ2!+#Q$gn%Gfb4Ug--d~gRH_bn?u z2rI7C6a9ER(eTaKSW40;O;lIiO;X(}E62g1%4P7Y&xfa%UN|JUX($Rz%a-p0FFVEu z@i#OO0X;ZK)-m;pT=>5C;Wa?ZXNq}<@A#SL6F*2JVz2FbNB0p&dDm5WAx4?RukL!M zZ9bf{uIm^IoRll}(EFQCg&6|@#g!RcDnyWgfkiu3}-?QEP>YTU?$Z{+*c^?`{M@c{gUULpeljWrhAo z?Qmrf?4U?qkqVG-m@)zf0-xQ+5}bp4po$KTHjDy4@BE!`%>XfVEoIH3UaUb{h+f7X z0|b?JAl5?7l`ztevCV7P`3FZ|6RPM;c5$WGMz({Ow&8Wn?>P$vo}!tDGe6%gu2f_! z9-{o$UAP>kmLN};6r|-F`02)mK^fC?@fG~tj%NOg8NZr_3AxJJyOrhTBP8-xSuViP z5o2@m88bG$cfg}}`z~KPD(xeIAU7S06#?x1nXGri*=@R0P2pouL}T3Nr)Ogo>#(>N zpQx3eGz{LncR5p+wONCZzIBnyd*?{twKGl?kqTS)A|`>ftNh=Mp*+BCjTua-6`od2 zQS>QyWbmMDI~KvTthK|_Xx;LkrNdY zsC#6ugqHTiB}sv#Z(M=Xo}gsV9Qv>Ibbvo&MW{1PE=eG(3OjKle_qpY`sz{k9-I8T zRL1XJYwt8te)5j-_4sk@hhI@+HFq-|NU}nvBIQX_Gfy0TKJPv+L$nZ+Ht74~u$j6i z{_*7=KR-0_u6S+^;DgbnZh|9bW%Re&bJZSCtHkj1spUK-}q2 zx@}%MHMCUpn(m9v0!>G*-z*GYO(pzSqHIMjDfJ6Udgz9v>4xfVCu4-Z=hbNLbR^I| zyrl}FRHMlQ<7AxIwMqZ|l_j_cfWXNhGZToDX`w3(6DRAjsNuVJ942tU z-`^j)kt5{EMMaf|Eh;vv75-ROUES?2V$0{{Q@c|CEcyGD z&&SCclr(-^9WFIAG=Lm~S1UPF)AhZXin&T%8YAtx9hdg*YZ4|HrtJY6+2!RWGBPqJ zC+94^t*!0!uFHCRR7kvdFiM1+CB+U;T$7}fgq*f^Y6M0e$@=E@cEyaf{R?>)vPBR` zNL(v5KlY!*HHIBm%g$pFa!a$bvkMEa+mU0VqhBVBi%7}H`~gq954Y!9Skq+)-%4>t zP3jvOTI`kvRR;!MGcq!=us{NmnYGWRjuxAkMMTH}Oe5ZuUl2?9B-QR5y7zl6Edm&9 zYIc^MnzhMj0)>T5y<_e05DU0IS|Q==o$UJZ+bz!u`Y@@;e)y;BzBd#)O?fNN#mx{Pu3=?bwzU zcW-Y&Vc`qAz)h?BCcbFw7dRI15F9r31uon9+79<)JrPw!ta)3)x2&voAO|@Dii(Q*J$}N3UlgC#zEDgCgAXhzD$-5-6~c9vNqUGhKNd4R zGc&+nXqb~#FJvcC>)u~rYMzH6RxGlQT2PDJdyQN$T(30iA3- zhe$*H{o_;f^YfXRq}`44^EzI?ey*v3nV?A|VBC@?W%+A$HQRTRPBi9&Yo;Q2K#u2f zWEo41UsZ9AHtdZwba`T8?Z|$htF{)p0@6-QOiW5TA0%-AYM>*A_)=R8b8+%y_$SPdNER%#^%E(Ykf90Hf=`h=M9w}T}R-O%E!`qGBW{Meed0r zl%h9z9oATQVrp#{>L2f~k!ql1WMo(XsF!J)cN!WmVX(f`!GV9nd1d(p1-E_>#o{I_ zXtbf_Qr&q=f)}UXgGY=E%~5ju=%`Al1l3{;?KwefcehdAyPLZ^z3l#8T}$E*KNIPu z1KQYJG&D3^TrM2^@0W@cQ;phP%351*vfTfyDQ=jaZJww*ao!FM?(FS-c6M&)bP3;V zg;Dmi6_|*M_JG=R=)RTdr_L)brUy6w1goR2ZhCmgRbY1km-CiVgE5>`wJOUV-*gfr5epnxvtrIg-ZNH#eu9O;?}wiraj--E|){J+WH-j8s%q)G{~W zoY5={E_ju`Myag&^kpKS;eY=cZ+-hrnYgZmf_c+PE$4uF6Ij<54CXx_Q()9+y%0ZG zR887{nGzS8pKb)i;y5%>uf|Pq`vsipbuA%IPLTaTCon^*5*=vx`oEjeAVHj;q9=xi zh9gocnwt1PxXz?Wyn2a>@;APi2*%ft#fI99w+>!7gyWW4(`lS$X{90IgMJkW#3Ur_ z#@(bOB*RjR5ikZIU}imJd3iY$O2~yv7b@mWaJ4gG-;tGV?x+8|!D38CT6&_&5%&wt zT1!GkM#j-fM~lzxXZlHCb-GNQ(psR7Gpz<@&N!YOs>!JGEv7Hk`QgS1AbRV<$h?9B zxOu#K2AZ9-3lWi}wS^g1s_yK{@ly>2jMhj9#f$_jSKkDTNLmte8Ys zp6Zno%hS`7va&Mhp`|$+t17>y|I{tc)Hm5eeANsO_W>PP*nGj;w05U9yZ`Vg|N2Zsp@i4y@8iU4hER)y}TATdZ z0?C{$-V++l$AU_Gfn)}fVYCgzos!#^k-(8sD_lv&>lk+<@K~j2nh*~*3;LqNhQUym z`67^{EESpi;M$aM(e1q!x{yct5nR+7K`bv|C-?h=xFlfmvk{nTClk_C#73qDS51{3gqI?{^k zKYCVdRV>+SH3=Q?^t4_6F^A*C(gAmeNGy1!~L zKfk-|I96l+yS{O51HF_il-fZ}IcMQv&FQM`q&EXB~KQ+Vu6mqih9PC>E_5YTOVlvsTi`a%^WDJ7N)M}{0S-RPmkAB9Ng8<5-IcQt9kw_ zZ9b1wfY5cT!*qdBB602Yn7;}(@$(fwkD+d$J#ET-6>_)F8@}+Zto-)J;|R-=RBZq$C`Keb{?;HzX$XGfzxY;y#WK$j`6Q8*TyBNJ^FXy zn*x#JRnO_%!6G*RuvnsG<+p*gDi5v$$^T9rwa6)AtIvXt!Q>BfiJV%W7$jQ0Q}~Es zXVl#$Gq=*9Di+!Y`nOJ;^~DeXM9)9qPH~uDrvp$O7I{_=bb;3AyM4PP2Fc@pmSbGv z;HjcFbF8~Z7MnoC{7EpknPc@}f$AF{g4oj6*CRDOY*t3$tVAbB!)*~}%<7}8wcYTs zQA?}y`}3hN{iO%J3X(a`?w$|9bs_U;f)HW;#E)1UZh3Zu1LzNHGQ)pIEfGwXiNdSMbz@~hi;XoJX%2S%}jZUEW)a@aC))&tBnY8voC%(c{4xJ5JK0M zxk!kk(QSPWdH2t$fRnzMl*v6UARO}o{KZcPJf^Z0p}O8*e~XD8sZrusMKyPIP#}3w z9OKnV?$3OUf&k|gPN&991NvjVx1yY-t+uc9(x(|~5CW)>v;cr=TS)j^NSHOXc)}9M zwLc;C5+ttn>9&Z&|9QF4U=bHlk))?jA?zLt{PXnkbKb--XfxH*v$EO+{fFHID()8q z{zRLnG=i9jjyLo#&8$OtMI4p3XQXXITv@p#y&E^j7@c~5py7>Rhk}fkosf?-A z{e9TtPc#pymF{J8DO5ECi(s1aN-agi%D6!Pz<^%zFQS}nUM8^w?%RP9hI^fY{0X*; zKV9C&9&5;tj$_W-DCILi{KEKne7e;K5po)85@y-gFC%}5#Tm0cq%W{KC^fhr|7mRG zG1K;~uiu%L^EEGyu=IIBAz~XPg2qhCyQ&ZUst|^_U!#ElM=Vl~;~L8D66hOxCIzmT zj6L)OrriQ{jeSmCWWoZWuU=8DtpOY?%oTr3Ad(tQCW0kPx(lc^Ty|O+nuz6tr34vtnKJ)~sa*!Zhqy@mp3ggq zc+Z{&<(mXV}B#$hVIIt)-j+A!YloZ)1Nh9#fFwl)_#+#%3qoQ$BPGF>)(7BJZ`&r zYPavoF4QVOQL;Tf@A%ZUret^#{u9v$bq=SP;$SlhLrHO?vgIv9iF8?`+fLMBt+Ym{sAtn}mGSu3Yom*$LSzZsg~&EMse}1O@UZg z9EPbtP{-;dSkgOH&qUZ3HK87dxX)D;c*e}PyMmaWcBsO>cHOEsrB6Oqm{7s8rppOJ z<3cV9dIsaa4MQ@4i6VUAn-?@)Ie20Dc0N*tGP!H&=tdfc?Cd<;xR%j^!YB`4+TU4s ztrgt$@Qrv{^t#ravaadYMe5yqR0284xS3feh?O3V~L&-W!2XfE1%f6PYig>1FMjz{4(iyD8 z^o#m(`Q?^3BLUq^9%;8<(^8pPC#v$BY4+V90WSd43f^?5KJs{4vwT|?+wn;JU@wuE zMol(z!G*M1vr#d%N{+jP0+5inJqm)=7XW?}+4A^T*3Bj|U1MGZAb`4AuVJ@=-{<+- zzvu^=m;P~mKmh8`pLm}_=3(E(24^1Oh+Bi$g>9tF9zUcgbLzhxmfP=#wxJt27>fcx zFq^@NS_PIuLs4z!rHGuuozwQHkgDoLK4$NgfVdRRfdqG_@b6=u1V8nTTHw0PDcjga zk9qHH9KO)M1Kmck*s7r;?P=G^jf=M6KAFp&c4rGE15yA|qvtALz{#i}^#Rqe6{p@B zU)WydKjJD4?GeDpJQYrtaNT$e?MD@Z>&e?1-YO*sp2W@U{oeBTJcJ{jhuI8Xp7G;? zxQn6)#sg5L{`G(Q`zr+9(q@!N|Nnl+H$xJ`Mf{(9e0_x_1OGdeIi9SFYk`3;h6}Xn z2oovb`Z|kZs%MfQ5VUX=f_+ThmF^!mQVCVsj91z2Z#pH>fE(Y3Q-U0$dyH^KTXV_a z=OK!zZ|U2+o*r9Dt8^AR4#2zj?@t?Y>U7g$bfC|u)9~(bOn>8rCk@yx7zK!3V_3sy zvOWYJ;pZd!sZVdgUPOW{EG8l92p;_o78=r{3_CqIVFLb7=Q+yZ3YGg0 zJ2#R*>o&LlN~ZWMMrG-~kkK@stpTAh*15YrzXgsMOMs&&rB3I~_r00m^K%QoXWw^v zdd_NU$5C5Ql3HJHc*|czfbpf6oV1&pvsxl$`fhLJ>dol}W)W5X_pvBq`su%{(|@bZ zw6r&?sw3M+-}&U9|7<@(GJ_tl>hXSQQI|kj7A7GgGNI;K5e3y1 zv@t2|sa;}O^^@p*3<;q^Mh4kNHEwn6846Rjc>|uPeGc`y z65)=&70 zs)ysWYc{i(uNhZWhDDxQ(=D#95OQGmk_Wporu!`>v2?`MSqq11cQ;Z|yJ-|;{zM#? zC1lBSzb^~~ry|`Mju>c{eQrMiL~8GF;{~YC^!Qa+c!bgdog4=th;mdc^*yM-hPPZR@hvmbCyp4{T>m6DKv;*gMU63}DRQS3WA8FTIV~>c4|DkSi( zZ*?B}yCkrmg?rfTbr;a=UDUjNDLJMk2yL+s%??X#*e<@gp=h?N*xj|ILAwiNH64Vs zWKFyLCs&+%I}GKX$y};q3YQ(WlCi$=ZGGbl0fCCOo!wh!^9NK4$JBD|>I3_H=}qc^ zF0ljbzm?%nbLb0tSua}_sP>TWnSy-rMgLG~ALH!Yrs&nyn9lTE6Q6QTRCx_VmPTVD z!wOxMcHLl0BV7uNrACZDz1 zlRtinx&458c=} zj8A=YB9MRto{Y%EX_SjhOP2(&vExsDAbMa_T1%cr|E zL)A=~M?nPm`1lkne;eGJc*So|3ZRiL^`mDb>?zH&!-a4Ez z{C)K_$z_o64*de~OH5;*i@th!X*r%m8ypje?&k!Ae4~ zJ?()cO}IMs;T$-a@RAe>Oh5(yS8Lz`KL7y}CX}PlyFlFji0_;nL2q8U42V1u{`Yy0 zQfB)R`a7w(IQ$j-yFeu0VG~kVK2hPn8|dodRk_l+KEt=ngrJx zW_+*R`=GZ(>5bNGo**=v3P7P{MJ42G2;CBJBuYnb2!*W*VI+g_8jak2Zj3ptcsL>P z-5axb@9rYuY;I?L=!`I_`*t|{KR-SnO0hhZkl=iy%A`Ga!tJbqGytYT0G+Q%QfXpv zp&$bRXy}3A;RyYq40W^$#axL=`Z5Kyl4XY7Ba3*WeR$;yA>v>9@VLSj#NuT)A)zDj z!}C?q;4wtr(dCoVg~n1+!V6PIAk?%LKXBSf^ zLUK@ii63~+U1R4Av%5R?11OM3!lEMV&_(n*D3IBe^8+dF6P4akB~c_%5Gl~B^HeC> zQBF}7kP3^CzPR1EAU~ZlMGY%O?`(?c{}JIVhl;s&UxzUUdYY zo@6|-lTC~J6Z?vAZ75DTS#!e7NSB`=-j9YEbldbj_tL*mMu#v&NP0wrzlzZ+nNIu% zUPDrnbIL=QL+C^3xS?En2ZBK3OzOlf`wXwmtk-hSlLGbDtFKh_(@qnvPf^D9zDKBT zD@`4bAW#%*nrl(_$1iOtmxhA44+|aRRzfL*yUu>VWNyH!tFO0<@`V99k7Lv0HYjs5 zkYR(TMDT=eF2Qcf5pz+7o`#HAojxTWLn#g|r17Ee`m8czI_f$T`$ynfngZ18&&sD0 z)ia+pC2Vt^1HPNS2Dwr0wx2cvBO^qXE5L~y5?IfZy&xa15%VA)>V&~46Da*H-MRWo z{iP;9Ic+KgA>54ieO|{OZ^{=#iWEGDWOySIx2OuzRqRCQ)p;vo<$YAEHy<+h-z|>A_;HOy!Tq|JoUG27)Nytm{<5l#wqjb@MLgGV*4Q9` zvGtI+rg26{oEqY$5sZ%_15knpPeIZqX-q`b!LzM8Zf`5di&W3Z^?n9sAzy+>x!;>e zJiFG2c%Kt^FSxz^2@)Nmy5c;Tp(K080C-6CnZ_~B}6t6J(&Slv*6(#`!- z;PJVYq8qAy1b_|sc^kD~G(dgG-Wg@LI-BBlpe$87?Mz!0&(yRFh*Xz__#_K99IX0~ z__f1+weANM*Od15YzDXg)uXqB1Z?;_Xj!D>WHD-#s40e3xITWpwV|nw)Nwd7vvOB7 z0wI#!T0^(x@#ycz_>Ud-JxX2_b_?%z|`GMVSRCQ^#uA#Rn{;mC*z#qIxi;P%G=#YR|QaUWv zdyj)8!Pq<(?lb8l@y&Shk&(U--bnEe=3UDk_G|kkVY^2^8~Rml<#$B6Pkc`A_gEBY z$*{0RC`V?PI)-%v4#PSFGmNM(I;VKUCV&8A(@4QmY*yQMsx|0xWv`9SnM?GA3ZHe>6dkrIGg6Ko&$|KVpm8ku+p~Td7P(9{!tznun;Rx$$uB#uPJ6ffB)l5eIA7p zHR(JvQe*79e($pmgH&JwdmfzPom&fcy8Q5Bo#uZ&Byw{u`zuX*iut?dmFaHLy)>LB z=Jq%WZ2Lv#rB)`1A71dI2^Qf^pne z!-CF&?ymaz-?c{aXKRa>9U0mz)>1+ad$YIpwh`pu{OiUew*dGWtlDc@jFKH(rv~7* zwT@yQC2-c1p&vS5eo{tc_@EGZkVP=>U?P;>F(>Tj!k9Jacy!2R>>voy@#h3^e%=i< zQwlIgMiq*@ZNokDWqG-asrG+8w#+T<-J)H31A&FVuH24~Z~ut2GPngE5;LrCM2UR{ zEhK5}6Yj>ogcg=Opwc}?uGM9FHu>@WnO9pW-`6JvZe7?u-x&Ajm8;6Ny7GG3?puLX znDzULQ?N+W*+qq>akN{^Cw%drHg-}_A9ybsFTV*|Q;8w!hVov^?Z-sHEmhhH`G3O# zTRGoG9K+9s&u%?b>5Cl0AGFeZkw*g2VJ^hyU8CTO0EdD#1r=&@dj=Pv;A`brwtr%8 zPcmKu?~4hm_1I@&R=b?b>s=-2Acf#RSxmNJb7Eb7(+U48NeM&%=^@%DIR<_z|(m1PX&f) zp3qda0B7Sr@Aun&wc0vckAe-_uN&FSR89uf8%DBHbMS^kvTLOc9SIoqHP~9%_vgjr zwh9b6|4EDy{3<~ru-6BoJ8L5ZU!>@D8OLmV5rSra?+FcuvVPi(J6&(5yW)1}k~JAP z8~B@y&~{#BqtSv7l#{=wcn%nT)Wy2qws9YA!Rmb)qkRfhzW@Q{DC`BPZDroi|=ke6;a1+YRY9aSMZ$EZG1enM9mV|F^<8m zVB5Orr^%|(uxYM&E>Le?)au^v)wHIq=yIGKHWP7ob30vaZLY1of^^pCAs?ljk~AgE zO}!4>YrTF>k%zj=L)FoXTv%3PrxIA@+Hsl1GkbZFG0%nce=V3c#dX($FfWES%UcK` z`W0mQkPs@1x71*`)G#;=+NfwgzuVeBr2meCY9K+ZSVvJ$W7){atZIrNL^b`GzaaI)*f!uyU3 z+%9{cwWcbDrE}SOT@KRl@$&Arvc}g5c>iI1T3`U1Z)hKwfaDI8;o<>JU)B1i6#5Mjw&AcjjlUywJ6F2IxI3_*C(<@z=F zx1#ynP8MOZYirr#Pkz}kN}tJ2d!=POO^BlEW^V{YdCFqxg`>9g1l%{bf4HA;M`4mT zt5xaZfyY@X7}QG;9xKse#uG0vqf5_y?Qmkngn7`1W)qZj`8a;;rOnTP5_( z0o`UdVj;hlvi=n?_NW5aiV_kMnoU1H4icm`JJ)I5?PX&Yd#x4*;mOac!>O8KL&P5ykwydhWBkR`) z0DjCx@Q1TPC%yukM9k+l;$^AUUq4U*)_**YZn?73?5#!+$5NBpy^jRM;Yun58&YcDWKk!3f+-$?B27~!@)2ki5fXO6U%b>Iw z-5MPS)6leYB}Ze3oUaep*%v)c*%SB_mf zqSb0+iF{Y{uNK?OtB(D|;G+PhF;yx8E=i`-tK=!`MD%R=Jcp3^KIV0g2HRgrYS&}3 z%V|$6#A>SJ^;+SskNZ5zUWMM@EW66y!Ekh6THpXuqY;%~l`YRM-xB`M@q+SoU}5p5 zrIqJ+rhsy@{}1@X1O-9OWA5mtIB9bw<^pR2OP}=!mR=|S4RZ#F1VDsE?^PPs&G!>K zJFO4_Kl^rKl1DthTX)<{QI**tUq!EnrgVa$s^8wKyd90PYWr7{PR^hS_N~HQu9K)6=+cG^VVm9 zlnNQ6&6Q4-P=QVc-%ru^UhTN^2);+rQ9qC8@rZ@aUFJ5FyQeo%vxpvM+ql17Ommzk zyWadfoo_Vtg$mgF(|TX-YmejXcUSwmq5Zhp;-veWe1n{Ium7rM*STxRjLb+GLP-YE zY35gO8_Kdik<)dd|3X#KWaSkU<4*+0^g>V&fB`7*JC4l+!(FKRb9!z~D{LJUUf}u% zmR4q}X&9g&`|P7-dX*@K#rR>7Jn!?vWMZ2sUeAgILaXP&*s2#WN*OZBgS;tL7OO9k zi3!^;e+PEce1Wjh)F;^ia=wfU&c2wF*uGw$lE`^ZZBxto|C#(VCy(OmbsN)AR{2^< zvNSfbcKAJUL%YzVt#M=_2>Uraw4^jn;CV&e&W|&F1^! zG!gM9`Ui%!4`?foqqwVYlEng3%Ix|&)DME=<Q>t6=Me{XFM^JG9Nt9;845p zY!=wO*$kYxx<(w9Y(KaZ#SZ3(Hl8%_kZ`cS927#VzdRx;w4ZSCU&$^QS9v{pSy^xQ z;2FXufB^rRF;4bK$F4<%|JMu zayhq{Q*~z8K=sEP@%W?3|Huef_V*Xg8+&N{wYt?!(pNjaxh~xDXVE0HHqni%lDn+pQ{J}{TH^jYbyTBf$yjc8}jxGLH2&Nu}fuxyKFgmcb2G3 zrPWRLRq6OQuFO(!Q-)-kDwYf`Gf|Ai^axFrvYF2Z)k~|b2SYbEla?0-R!>>4tM!1l z(%cg*pWn4Y0;MTvUk?Lzq)kIVGOvVTVsOjQCW3 z4GHl|YSH6Q+j#7!?avSU*WbMT(BJ0kgm!SR$B1IB{_@qgn3l(y{?lgGCI*ZHy3mqT z*vuo-h>t-bPzUi&bCq#l^v;?tYZj7#?3vyuUr?bsl9}$7_sqEUg>HGCZuD^*Ebb1~ z&7~ZAu|tWZ+mCcWLbp0(S4`Rt!%RD%32_Nfyiw)4^iT707DA_WauP)``=OU_)gw09S7mwQ|AnGc-0PT(+${$XeO zmuT1LMPw-_jBO9fl_JbW-U3`VXZFO*5ul+Mi(z0gW~OooJS8bszKnd(_wBx$dy=!G zrp+m7cp$sqSHP_2m+`xiZ)S6Ar!t4BG+Z&OOj6|Gs>b_Sh@ z)2~GJB%Rb2^GeUaVkZLWVq{6X)~BL6Wms-AiTCZSH0p9DhljynELB_%$i<~o?qF+G z6(P)Rq?+`iZg=owwB*X}cMT-{A|+R1B#M9kD+jnykaEXDnt2|)J@=c=sS^km(H;Hce7EWVV>uqP~Pq~rQz%? z&`3z`B!Vx&M?dG@{SI4#tS=uzEh8XM8{Vq{1i;TK&AGJzTrWBO=W)nBiem4vs@DH87hf z87k1NUns?T01;h!zL3BGK$=!K@a~yJ=+Bt7TSZAspv+UP`YmMZoV@~KrJ4ul_KyLn z*lS7p*s`t+G4oz7qtT_Px*+H~pSkamUTR_+M+$(CkiX~YD+(uZn={v1a(u6-k_fgO zH^3OQzo_BvAM;g|V!{mbz|cS(2-8zb&8)a`Bw^c&7`NHw!;Ha2(_C?i;^q{2CSwf_ zeh|(rR$aapytzuzJM}N{z6$%J>Z)4!H6~-<>sf4$Z*k?vF09iumMZ~WOo)UC1RG8= z7}kowJ;H(NO`ml(z547QSO{!H<*T$(MeaIhNY}`1eovmev%@9gkue#^yl%PHSK`%I zz6U}3yi!ULB88uqUF<_{0%aT*e#pGutm(TKB@P%hPIc znG14cJb}mb4;dECIVUp@5piQCs*tZZH364tTD4Jf zzXD$Z^ZLDGT-`W-*H@HSFV)%6QF>bBdpp$a-3>AW(z(B;`%?(hgFo^Z@J!Q(!M zHF7D;AK=Vj39G_pZ6GbO>SKWY!kMlphMD#L*Bb9;CDs@vrKu=A9rC>`>fk;a3lOMB z^r_ZVPg3o~U1#Uw2fa^}=?YXKg~7mLT6wSVrn}bgiSx)hxs-NTaPr zn#4cvvR9MK?rHQ^*MoX8Ue5r^cs>LO;nJ~ao*}XCyx$F729=5?9(*&&E!zn&g4G>3 zl#eV@M*KbhF$x(oEI=_9MGAL_>Oi6`}(PvF`3Q446Cks z5=fQ~;KkSlPzRuZI5mPtdxjEmsXIc6ih%Y!T5u`k2d<>wBZ4LEutP{ordp$iz>`@M zC&L1_&O(9;K4;)VY+4jGW|svQ83@e=fz0ZuO%bBc1tPPCnhzV6OF}DUb6$fJw*h@v z37?#d3?2vVE8@_sSS=~_Z+k32>Zge>$}p*vA*mm5BH?oiK1A9x!<7ayVTZi~$l;$G zYKo~nrD@>Ee6L1q)@Eewd+5NCiL6e*XH3R3=B(<)F#g>;Q)E|N##jd1pkWkw6Ug*G z6*fX|)yI;I->CXDFc*y?SivTMQ#Gi!e!wm;vYHjx+nH7O5FGt2`loBbw^n8Fw$(j& z)*^3`X%lZ63Fg5~XW`y-%=|UM`mKY$vA-ppIbf}|D(UIiKLbrOosj6obE}$(FhB8e z22+b%%o|mIm)ViCV76J17w@*1B8#Lh&k<#Vr4E_R=L95UD2dSGKq^%yqQw^k#WH?v z{-nj)pg~<+19#XGuAe3Rw2+}r)sY{0caPb8?!>m$D9a7 zhGWR?J=`l|$^mrV-d944&C2shcG8R^EYuO-?xR7i356Omhp0;7h~S`6q6YogCynC@ zWa;X#fZ~FN4JS)|C(@@K7L_wm=p(<~_sL8pGA4W^9FGJWgdR6625Eyqmr%lfp!JsU zCX{eSaCpP3Rn!YJq9@@Gbiz`LrDnyhI>r&>f>`5-u|cdu(Ks>SPE7i#VLoUYE7d2K zI zBKWFRNKwkk1y|Tl-IR7e%rvz{SgC_tTBUw0$Z6m=WCsywSR+6|dk&e?rRR*$M#Y3* zptA}x_DS^Ig%gqBY*9pX>bbkbx&Q(Sw&p5^%B@%rcr(W0v)BVsiECJ)snOyL$jI`3 z926V^v|S>}ge0~oj9fmV+!P1CpYa#J$#8lY8_21pcox8d1rmtVI31>Gxr#bhc|~co zGLMwOUulL25{`CA$8H3s=;Qem)Os{oSxam+xHB1hmc%05b;Larg<;)o@6o29FMMVd zr0);wosT6V#4r|ha;e(gj!Ua8{IQZobWkbe>Qd&pGXF5_x}Shzh?GiEm=a1_EJ+`a zB7;4wM`Z@xHV{1=2f;Z}K9;H0O0#^*-Hq9Pc*GNTdo>-8ihSc)p+48txdfD5aJ;zMFuHk^&{72dl&iJ zq%hCanQQxuLmgrVa2@I;ks2TO7?QKKFut`gY;`u%zBvRW+#^zxn6IP6oQT+OY)s1V z`5K{H{Eml!5J%Ma^4M~3#PRm`kvVEx>Ubo~$9LOfw%O7FSAK%tn?-YLD?T^K`J%9q zisHZWiSmdPiL7(5pjg_^Yai|5&>#tb%FOT|Atf?B&Id42+pc6@E$UeT_kqng&&GXN zuwCG#B5u-eVx|%uGf+*&!%Hdw+j7cn71Q<|1~$-95y1A56*`-U77i_zV1LrCODrrm zF&06o+G*YqT#75*tMCflhDWF-YM#-idww$&h(vn+ z+_~Ch@-?ZuqTepZm4L0GqQ?fQ<*Do2?OH`3KN=+LI$bA#U;+SP?suoMH5+Ym6t=^B z$)+3_rvVEL6GdM8l9i_uR%2}BqY{bSykcJv-S!>gLE0?@I@{5J^MmWPDK#kNYmzxp z%rbNfrB9Z?XkS&tQV{vb_9M6n(rsxQyZmjsx!=7J7oQ+f2o-|~RwB%tdH)TIzKts; zb=>TrR$ST4pq3hL47R}e5F*Q}e=~#=Rl+B>?|?rm{*TD|5B+`R3|gq_B9P=HAF?NK z{lGiT+oDA0;VP4VkBo1g3fb4Pfuua3NE0(uZ5W4-zTo(_0p(4wa9s7+k>|65p&kh* zICXxIzo+rzOvWdKamq%cC3edGY{1CAn{}5o?JkXc8!-}oUJEpP+3O3TP~ac7ubn5&me0>lVIhHqudL|stQ`DXe=4-zrFgWera-1yh!)PYEYA{J;gU1wZsry~xQl>edA)1Jrc)-;@WD*$ zFhC|&T1OO8SM0jC`CXw=0g!l~odRAZTtiWiB)rhpq;^eTkYPd%H;BTTWN!#_AW%dv zYr*@_0DJ#LQfibD-xcI((+4X9L&lenC}v@Xcu~NB%v2sc*fbtSeJF`|t?watrtk6$ zQ+e$87}%8Y6!DbskWoUJ+n>S!T%W12V8eB(Mj#aG*&>_6Evz|XDK!4l80z%+`y2UBx+mAE*vYy1zn%FV5C+6WA(nsS&5KZs|)7gOBoh$$>a0 z(9R`_Ofi}Zb^>#jr!X|OI7j}BvdO{48#&vsI9Thx`!5{xz*+A41Cw(3S-k$OZ>CuN z*v+S|6lz%Z#6hWNT;h{h!{2c-s!N4vsHSttcOySLG_{9NvY8 znSt+>5p@^weNuQk1jQQfV0(|QWGExkIf{98m+)peXT2h1nbngq-0io<24}Z6ivmMGqa%+{YVeAGqIQv{ndVhxNS_;WIpIz7 zM^a-gqZn{0x6vzAuIB}D=?yi)=jkNN6Uj-y;`bveyBa?#aE_r>D4BjIS!w%)p zK+;pxTeu;C*m&U$Fq_iSYy^&w3va$em#;PUJ?sY0u$bc4?k?dz8z3_^Y^ zPzP5DtJjIzYEH4-zAccoadp(h@=t^!)@*6>v^ySlFr8I(b<*j=3^&KJbcMnf3Gog1>l2zwM!tc zQ+Jh^csQy4K)KX`ZHNaZE80rd1wz9K8xq(NMo1)gnZYgh05v zVL7$bTR6lG@Oj-t1a?f)Pmoz68+U}IM&Ji*c}TIuot#-_ch$u&C-S&RIS3dE2t!y` zShz28g}FvGnW<8C@Tyv4SSCn*VrZ$3+;9=e-JJT#Z)np zV>Aa5r1owW?eS&yF}TQDZklrM|xy23*OuCg^f$ zm7hr!8}g8H6Hr5u84RLVyc`nksVJOw#VY59G^49@ZJqoXO>`hQnKeE)?omuV-rQm< zdP0@5r^O9BO87Km4W2^0y8U(>alo)7#rWNF;`Ya7!ge30Tb8V40qdYr_m#&#BEwg` ze@+pz$;&4KIFy8cIbb-5VqF7sVXczCCTX8hr_Ji55g!jmBE_RXRH+mzm-pbR|o?KAV8z(xZrbMr$J8L7CuXcEVs^D%_{z>fKNk; z%SZ8AFd=3dWfJz4nW&>)s++af!mO}DK2ra}Sz4E3cFwqb zyEuWe8Vxl^)mF6=&#d(jLZ_Vw6l4D9=nD*LRl-?L*eF}8eE+RQ zLl6riLuu=84>@0rIjq@A6tGRMQHG=R85P_SNj3DQ!?Qs>TD!Sy)<)>Ul6gd2ld+~i zbVM?--#o|g+{Kudpt8wg$GG8eADn=TcOKX7_cibiZMmEe z(t!M$WE=wB``a%Q65fqpvcC~Nt_a!M*~rKoc4JQpj*)l^$IUGDgM+60@d(?H5D?_aJtFanvCKSVmc}DJ`zU!ioFFs+A`BhR zBC>`w&esBi98yXd_^)DfS}{1olu5rk(8WmMaTqCcH;CetMF|akg5x>g&9z6Zt7Qu>!IZXIB~tpa1Ls>okOs01nDH)A8CUnD zB1HAnXfVnI{zG*CA;kY-*R?7X)r>eYFjapk@jsmUznQhXSrwQh|E0vnau)xR@2}<1 z+Kkn`|4p({-&BIRKA5rl8h{1o7bO3s+W*DU`C4>(4FBj1sB)0j}@PY;mTBF~FhRYw4s{d?^%r&xy# zLi&NCQ=!SihaN-|tgXpHwA;!94jv#O5rxEx9SEV~(&VtSkqv_lwP16feY42XL`k3m zA%S(jDxXQ&^)34|jm~dkQww>nwg+Mme>is*ySk9ANjm9~NU6aW zS>MMcN+cyE4u-S_;~i8JE=n`w3i;`W3RqRP?CT`$=<)r5q8#LLqwBo zZS=)L!+c5PXnb`Nt*awiQC4P_kUYXto&)KpbRXr4q}(<3prhck~EKPQoc zjDZnpTw|t(And4#(k9JB}ws!v6{hpb7W&)<-r#@7sqJ zw1C?&FK_2>cw$zt#QDYpX@YNPBo!#c}Lh z7mG6Ja%!QMwO-szmPD6*^P=X_g1`h{zAfWTisrw}y(zkUDYBC5<>JZx>14iz{5`lG z*%_T&0-Us9jLr9G2~_=Z5g=7DuVz`whSQhd2J$zj+^-M#kiADYbOz>ma3_o>n>^&Q zDeXeA>S?SXPeXt>gM3D7;qbb+7TRoB%@ynxy_YwG6HXIcUooz3x*%;@g;D+1H{=+^ zjueiF9$<=BhqT#3QNsL_$ki96n;(tuoDU&(ejbLjVC~?`&dO;${2?(F*Fsa9BdgzU z=9Kv!w0AhNLypPGf~6p%eVCX{3OmJ$&KgZ5rHfr*#8H&|mxr~>f4eUa=Xsf#i}YH& z`D8bXdz%${L72iT3I;k}g_qr(o#)5PdOU5wDkLK(e*touA@9BRlb@UZl(4t(Sa}p+ z=z$qIsX{ThQeviWPjnl`+T7dQ3-Z;jwe6z^V`EbZd*36R_Q%G@C6#{QP?r`Jtpzx2 z52-PTTU#G2)H|px50Q;s`3*J`kcrse`u#k+>$gp_7}0wpzf%+!lDfnm5fK50Mj&=k zfHLQy{AW>7(Pn?*S*DTE>^<5PsfP_#+*fuc1%f1tq*9`u@3jj->mO(3%(v?;Cz(Mj z7o^`|(%Q+h(c)c-0~eP;`1`s=S}E#(xDFQ{IUaB8A57F_$4hH@PcnC%QZ!|=7h5-4 zQio_^GuAvV)zhX`h1c;~&7N-7&vcOX$pO~Q0~$!?`~eLqy(2e#HD&qainaO{DbP-V zyTk_#)ZJ8VByl?i48oNX+l`GJR50n~?L!J0DIhl^LlG*t%a}=ze?77ZHN=oaXL*Gv z^4uAr1(9%?Vp6MVYSww){L9J7xxIA<^$rdaLMeqjlc1vt^TkeFggHG7CpCsicU@vq zgx`=S`=Uu@Uu5;H%=qD$W)eHLgTBF=9A@O=FWnp1;pTyp9K;e~R5ONv6;5buYy_Bo zU++Gh*7&U%otddvMnFs)(At^+y}`Xif9KFx@JXqtb%^v@|1yFTYx^=0%ae_Nqs`iz zj78##s;*es)YjvNc~0xa|H!B(Qm4W&kkPU$lrZ5#qaHaAgz2|l=D;^#oOYaHw`NBA zC9GQ?hfJ#$8{NiDKBo?Le^0YM-08Z%zXwDC{@wQW_LSW)%Zf5*KAEOnVGDZ|EMLD+}zxB zi!+%jrqxXq7#trjGMDw}55#(!s*ylD3xw&Kd3lv53BdG}Tv|U0z&sImo(v0N6~!!T z{h)&2#L!Vy1(Z;0*cF+Qy2i9Bq$*v;Y~bt7#Tawr#qYu7My>p zKM=J-X9Jvk{Tpc+^WJD6O0>*T{l}rUpinsbJ1Q$w--e-*rn|4RQMjy61gDjwcuer} z@^9@hv=6a|bAPOs8r}GM*XKP?+EDct!P^1(dsm!QL~{dMO;X@QWscr(QqIeRS$ra* zsRkFjS!7B|N*fy+PSb&rFKoiJy&K|sRO&xMO7-VpD84^`{*!%7Xe7!L{QiM83jDwSaoY)+y|hT33ji{3{*8v@*%F9KZ zXa{e*P67w!&cqW^Q%0wLl0?mYEvG3Od;>OK{U!#2w7_V!{v)F1q%hZzlm33gLx%j# zGpyrxa5;2ZoUM6DqhSwR{n+A@_J8caK2 zEZUNGurZSL95`7BX9BgF-7Q&R=uDMW#pGFgc2*--j^RRje7Kwyx;FskmIA|lX)K6m zz9RZh3H~m6+W&oRZYuC>U}F|?zkYoGs-849Y}y93ejqn9SE*~iX4_P5sU;T#CP=h< z_hA_t25(_e*x;?-4M;+dZm+B@Ob-x5m-ako0~H94;ZX~wwMb`cH68qU1^ZdIv+BSx zrd~3C#Q0g0$OczQG%{z)_*a)C4g;*S2eV9YtbH2|1pE?(jYK&)nqVUU=96Vuh%<;@ zo{l;$V4RM2*s-z^{pRvEzqK>wc;i3(As|M8Q0h}5$e*!?ctLvP!h?%n(B|TnvWjyI zcKP1txLI*2!Ibg-n1gXp#Uc*>hCepB@)S3g=Fim3Z2VX}nmjl;U1;~1y5%jmi&?(n zOW#*d72z$pHT`*n&`BPiGTjz&&4gZs$S^8(k6*K*f9Gi#f_PI#f@|2;q4uS%uweY) z56x%WZXzqI3`D~Booj(lr=@J0{5}~PE*ldaiY&T+YM{ z2qX)44Qgsfd1HDnBtV}W&2ing}4=;&yme8#?+ zLCqHirbH>%=LgvME!mY{5stePg(^g0T{pWh*iRv^+Z~ovVH$7p-Aj@o>m(KClDfl7 z!`~@-UKjDH`S^UZYCnz)Q9Ulaps#gYQ^aC;)V5`geae zT=unI*@(#tV-$`z<8)d>-8WJy9i&k2Mdp1<wYRrd@32izPmj)u2+z^D)@&X&!zirbSVwjK_d$2}2mgLl##+FIlw!Ph zol25^`#5W&?ab~QR6-{1M^2}4ei&8BTHZ_9Vbs#X!tZ9C+JO75q||o2q;Qp3T2R2q z!otGLyw)>31kbXx$HAM3WG%>?GxGp>I&~cJdJZnS1^JRq>-pZXEsNfsI zgZTPHug^9WIPC5#z@z7$E5ANS%mFCa>yxK+9y)26Yeojhy0N)Ax{OggsimT_?shTg z>#F@lRMF3g+I<1y6E0hvA2)uT>EU_<@=VNp?;ymnM}BZzA2!WxXIFKc$+@itXv ztlsgXdNxoA&guN5&&uq7v~#&EQ!#?KqqUAb4a6?>^>jl6c`59=UXxKw@3Mxo}!yXt`SQ0Evu;Vaqw-ZE^-@q-B+c`4i+(kbg{MHdS?ShN z^^c>CkBvDJ4VYDAb{TG&pnNNpmiX!0n|u8ECpYKjLsWA(DJc~{^TFn{ddM*$ipkk2 z(QnHW-xo+RF)@~wmK5m<()gGpY$9fD_sFNppU)7{U%TcmT4K&U{RbFS$RcYW@2rXe zmr%p>>FC<>^`lZ%zo_EHTT{xGk7ljDFI4gsoHByC+>;@N_P74z7FN5NFfB6_qN{?U)cjd?bLk(NP*cn1h_AAyB~_-R=~Xy6Nxn>@i$x(<$v5m{Nv zjv{KbQR+K}z~op`t~cu;rx6TuJ3j`J*Rc|y!C!h^C1s0p1O}bJePf@Kjfr9O8;n-^7&^H0zcQ5rr@v zSQoC3>)-=+HdXqe)p}(fJ^VJTfDY^%td4P8SCm9rr658>-|oFAgj9yFOWgR*9MalTkP8qt|bT{?-WIC%B0@t3JNwy5L!oa#j+bcK16S1p<2LN4_? zA{^OGy`nB_J!)DG`IrLkXE=9nS0sfm~8DMI`oe`ZPICAwuuDE}4agkRIx+7po z36YVJQ&Ursk=U~{OHCd>e*EBfU!+zFwc?FIlQ-|Ic64-16ZGH_5?b2ag%xxxi2#jg zj#SjtHi0FE&!9jc30OjaPTRIKJQPT@m7l57Y?#XCl_^y;c^}&+$fbpa#rG%2_JjnY z(L*OEr?+q4-fshj76b79QB4(0MdZLe-yNql6PfH55nbOYqP02VVq?Xh@_+rBn3~dJ zAu?bQiV&0dD?`FZO~OtqF`km`Pa|7zqd!ks*4%3TCHfX{Hi|<2c+j_tm_pv1nt{ryRqN{=gBC*DeI{(St`TjJvQ zDYvj2CUYjDut2gIKqF#w$<8Z|JN;(4qKk52O*Nss&QiR1YeJtHDvS?TCnknec3Ft} zQ|+4j@^R~KAels$S4gEXdc`eOl_$nXh$99p@afG z;{s|`Q&an($Uq>^LAzJsLf7}KrK9l{AD`mMxsj2T9Y?X0*3n|@VEg~&T7vV>_os(* z2_tag)r0476O~_sJJ=lfX#HtGr3wrZym&w`UucVhOXJD{@-O%QPa6&5NJk4+>8+1G zz|TU905SwsBR~RR0w-MOgMayp=noqZ-L^00$n5VWIM%~~WB?l`GaFFc`r*Rfe!cVi zju}p~C26bi8Cf(*BA0v@@ZkX~*W~?xpcjJ$1!0qMNyq+%P_Oj%)!+y%dQ{(7!C##c z!RdkoI4`1idf5oCELWfiKm$O;gO7(-?JnDpoxR!{O$V2XntHv13B%QTC9||;Gdl|_n^vEB?qH$DIg~W@?HN(SSuS68M*cG2nauCaOiwo ztp;J|fgt?`6HYB6yHQTpEbh%d;YPKS(SO43N%4lSZ0+pwZ?_EEUgyB!{r&w)eh+CE z+E*~ih|Q1F^Iva421-WLc8jr(*RF~jxS0yzQqycST8bWv(pKNFR>&>px3s~nDz7p~ z`*-FHx6xggs0ab|iM*5M=zCjJZ6&2_x0>MET|ho_bMq)FL9X5~NaVWbj4M(5_cY~6 zq;lbvR7e*+*QBo9J=C5eF*&*Lxk3H6RWWgKB-&qqE;F`)$S^Z$B<0*cw0444$5pq6 zK)52^GaT@KH&1@=B(fSrp?m1}u#tKu1C63uTv`%x zJ<(U>pw)>=R98+WleSd)+EECs_(q2Di~RLbKPf@r5qCMNc-cXpA|kC zAqg(6hi9@ffNiTRizhqr#BK2Eswcej`2sgRsj z7!~D`onzgi`x3l_II>1pRp)lRkX`?R+&W_F2Q_slr;$5}| zgKw)!yGWAO7pRcN6|5Jxxibiu2S-9cFh51GIWQtyAz`cd)K>3UFoE^SQ1657oT^-Mt&2rCUXGeu2U3W>1W=(6Dt99N^q^U>7@ za;+gGP|qwq>n%B`6Px;HJkRBydKF!7moRw47GXF}zPUk?jf<=}&Md@m%u_4$l-s?@e9Nyy#~ghC=wp3FvL6M9F+6yIeRH>|~m z9NEX9fdu$X7OGUb`=IqmJ+lJK3d$AaXde0!M3L(+U%nI=fH87sQ!0|l!mrcbM`yp) z##a6_>?Y8MNBWlme{u5-K4^tg3AN`tvvXApB0A2dP~1q#4;PoB=M@TyJ0GTc9TDQp zB2Jby;x+7~t*&=ul1FiU>9d1!#v;A z4fyIjz#m~xQIHgvkfu=J%7hA-Cnla$`2eaUM)EA&NF?7TN!EWF>R$JgMT(baO6|X| zZw_DC#j$#Pa`@=A&0aT?iP*pBcAvu8lyFV35F*^*oT$8_(csthFm3oOA>0#E# z=~+M7Ge@A7pu&yuelGwCs;IZ%QxMp~X3-j0UCqVd!pqBxFBXJFo|j|1?fH1KjU#+t zzBT*$w%p_D$YMOtEvauVN@(7F#rXKHqxxs>f#W^=@D%lRrk8!pT`iEkS+BCQEfZ+? zhS2TC39lLneqE~DG&eVwl9u+{kGyZVW0ZCC9>h1m=E~MtYsWdjmXVPG zoD2g4gC_S2neR)JBM~a94z&5bxfK%h;FYY{?Fa-Zk&aD#ms_&0stWq z2)?eaes;so;F%ds`ARX(AM0`NrHzUItpCT4rG5a-K}JQjnm1V6A@-ZcsJMrtUS1oc z{I?AigRuI||3!RH)sY6~nrNfcP>bA`v(*~Cg?vBR+57u%7h=F0CGX7QD?i*$k)`|f zc49p}w;r#y#iPa^^Dm8ohxx}ok4OJfeZKCvsT=a*@fqP7RY*wQUo4+ZdDfLY&Y;0f zPKgoawNcwl=s)%SvXK`mlWH>pcMKytGmu>(ORxGd|6cv4n1P4%(zB`^8 z*ryqPeTuXWY}k;9RmP18soN6WuImt{I#ZojeyvTu(fo&xALIB=foaJqB3fMBOejIX z-n@X9<0=h5f7o`;?WA+J>Xu-8xMa29=pO^;$76pzy^7VXCR%(>A9${>f`$1UANf&%C3)ruA6oFTH)09O2raam2iZ zRjp98%+>i`&ks6xPu7KF%kgd0p$AvJ>m7-9+{H)t3#|Hy?@jA#U#h$umTV&$j&_A; zJXJ0Fijwi=uMDSJnsm=ss<)32`3<&FegIE6B2&l6udN(JMKXuaWZIsdRJ&jh; z9}wPpG2}IGOa*=QET4gwmUyiAesx#t)xkqO_b(@x4XAza$w$(3_DL7$Xg;@U^Y)=U zrswbyz&IU&ikn~LAFCMx%uuvYGO9pq*P{ zMOG!39OC^SKQb44Cz3gJa-ZfgxGNCZQO92XxXCA4`&{**c7pw+mEFP1 z29%{}1u=xeqagwJtwN(@@Q%9(?Bf;#7x+eh9G(Gk1`Y^_f$&99Kz-d2gi&IkcBoE(aLE$Ngd|@I~ z&_1D1gFy2rSv9NLobS)t$s9 zSgGDnyZ}ueZjqN{m*OrIHt<)CpnopmceDMM)6(@nU~}Go+GuKlBeFL=#rxf^93VtC zJd{(z5ymwL4}CEQ7!nS_46l~B4qcs!%e1#XVU>-OyxD%r&`Xiajf&*h-*y9;HNRHY zgG@~>g4G!eDhH4p2O>}-y!Qb6RJ40V!g{@oDdl;3{qm-hf z>S3kxHz!U2nxTQFtV{mWs2;8k3jHCf~w<<++FxniQsTQHO0wptI0tb#{!0kptcZ#be|uFPp6WHwm>E zN?@gy+r)1fiiU*^lU9s&Sh5nm4&&5}bJdDUpDLZMN~!B^&5Q3sbcjmS)U~oxsb_wV z^H}cbo{#D(KI?|@*1Rm#`FVmZNOyn8<;uj~-$3QbUhiyu?{r_oy->*SME7avr5*!8 z*0S>qJp$4HxgKf0f>2> z?;R1w3wh3_H<^gfhKY0D)dMJf8)~oC%+u7|PTZ*K*;ueZ!UQHUgV!G54{> za@jjF)cDNzby}6#g+2e}{s)q`^_+^XtkY$w+#5%>?`60^QC8 z8NIHD@jy)_AQ|?aZGIcDlt9GxJ9?GCa^`pH5v(Bam1V+WoQu-#c(5^fbu~j?x;w5S zd|SCXMCH}=CWp=&@n~~i%NApx7-cp$P4JJP)B8*<7#82kEJ%6K5@ zC;K}4VyH^!l@^_Q=SVmyz9AIbA$CpM(}o{jt0sXW?er@uIY*h6fH4hjiiskSwop zjK}nQCSt