From 82b0bb44c3b0eedec240a32ac7e914812d51e32d Mon Sep 17 00:00:00 2001 From: Wang Xin Date: Sat, 22 Feb 2020 10:12:26 +0800 Subject: [PATCH] sdk build tools and app framework updates (#171) --- README.md | 4 +- .../app-native-shared/native_interface.h | 94 ---- core/app-framework/base/native/base_lib.inl | 14 + .../base/native/base_lib_export.c | 14 +- .../base/native/base_lib_export.h | 13 - core/app-framework/base/native/req_resp_api.h | 32 -- .../base/native/req_resp_native_api.h | 36 ++ core/app-framework/base/native/timer_api.h | 37 -- .../base/native/timer_native_api.h | 43 ++ .../app-framework/base/native/timer_wrapper.c | 1 + .../connection/native/connection_api.h | 32 -- .../connection/native/connection_native_api.h | 41 ++ .../connection/native/connection_wrapper.c | 2 + core/app-framework/sensor/app/sensor.c | 1 + .../sensor/native/runtime_sensor.h | 17 +- core/app-framework/sensor/native/sensor_api.h | 32 -- .../sensor/native/sensor_mgr_ref.c | 36 +- .../sensor/native/sensor_native_api.h | 37 ++ core/app-framework/wgl/app/wasm_app.cmake | 4 + core/app-framework/wgl/native/gui_api.h | 36 -- .../app-framework/wgl/native/gui_native_api.h | 46 ++ doc/pics/wamr_menu_config.png | Bin 59330 -> 19135 bytes .../gui/wasm-runtime-wgl/src/ext_lib_export.c | 6 +- .../vgl-wasm-runtime/src/ext_lib_export.c | 4 +- samples/simple/src/ext_lib_export.c | 6 +- samples/simple/src/iwasm_main.c | 46 +- wamr-sdk/Kconfig | 46 +- wamr-sdk/build_sdk.sh | 406 ++++-------------- wamr-sdk/menuconfig.sh | 216 +++++++--- wamr-sdk/wamr_config_default.cmake | 3 + 30 files changed, 572 insertions(+), 733 deletions(-) create mode 100644 core/app-framework/base/native/base_lib.inl delete mode 100644 core/app-framework/base/native/base_lib_export.h delete mode 100644 core/app-framework/base/native/req_resp_api.h create mode 100644 core/app-framework/base/native/req_resp_native_api.h delete mode 100644 core/app-framework/base/native/timer_api.h create mode 100644 core/app-framework/base/native/timer_native_api.h delete mode 100644 core/app-framework/connection/native/connection_api.h create mode 100644 core/app-framework/connection/native/connection_native_api.h delete mode 100644 core/app-framework/sensor/native/sensor_api.h create mode 100644 core/app-framework/sensor/native/sensor_native_api.h delete mode 100644 core/app-framework/wgl/native/gui_api.h create mode 100644 core/app-framework/wgl/native/gui_native_api.h diff --git a/README.md b/README.md index 7db0c50e..f426eb1f 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ Menu configuration is supported for easy integration of runtime components and a ``` cd wamr-sdk -./menuconfig.sh +./build_sdk.sh -i -n [profile name] ``` wamr build menu configuration @@ -141,7 +141,7 @@ simple/ └── lib ``` -The tool **build_sdk.sh** can be also directly executed by passing the configuration arguments, which is how each WAMR sample project builds the WAMR SDK for its own building profile. + ### Use Runtime SDK diff --git a/core/app-framework/app-native-shared/native_interface.h b/core/app-framework/app-native-shared/native_interface.h index cb7e7e96..0c094267 100644 --- a/core/app-framework/app-native-shared/native_interface.h +++ b/core/app-framework/app-native-shared/native_interface.h @@ -34,100 +34,6 @@ /*char *wa_strdup(const char *);*/ -/* - * request/response interfaces - */ - -bool -wasm_response_send(wasm_exec_env_t exec_env, - int32 buffer_offset, int size); -void -wasm_register_resource(wasm_exec_env_t exec_env, - int32 url_offset); -void -wasm_post_request(wasm_exec_env_t exec_env, - int32 buffer_offset, int size); -void -wasm_sub_event(wasm_exec_env_t exec_env, - int32 url_offset); - -/* - * sensor interfaces - */ - -bool -wasm_sensor_config(wasm_exec_env_t exec_env, - uint32 sensor, int interval, int bit_cfg, int delay); -uint32 -wasm_sensor_open(wasm_exec_env_t exec_env, - int32 name_offset, int instance); -bool -wasm_sensor_config_with_attr_container(wasm_exec_env_t exec_env, - uint32 sensor, - int32 buffer_offset, int len); -bool -wasm_sensor_close(wasm_exec_env_t exec_env, - uint32 sensor); - -/* - * timer interfaces - */ - -typedef unsigned int timer_id_t; - -timer_id_t -wasm_create_timer(wasm_exec_env_t exec_env, - int interval, bool is_period, bool auto_start); -void -wasm_timer_destroy(wasm_exec_env_t exec_env, timer_id_t timer_id); -void -wasm_timer_cancel(wasm_exec_env_t exec_env, timer_id_t timer_id); -void -wasm_timer_restart(wasm_exec_env_t exec_env, - timer_id_t timer_id, int interval); -uint32 -wasm_get_sys_tick_ms(wasm_exec_env_t exec_env); - -/* - * connection interfaces - */ - -uint32 -wasm_open_connection(wasm_exec_env_t exec_env, - int32 name_offset, int32 args_offset, uint32 len); -void -wasm_close_connection(wasm_exec_env_t exec_env, - uint32 handle); -int -wasm_send_on_connection(wasm_exec_env_t exec_env, - uint32 handle, int32 data_offset, uint32 len); -bool -wasm_config_connection(wasm_exec_env_t exec_env, - uint32 handle, int32 cfg_offset, uint32 len); - -/** - * gui interfaces - */ - -void -wasm_obj_native_call(wasm_exec_env_t exec_env, - int32 func_id, uint32 argv_offset, uint32 argc); - -void -wasm_btn_native_call(wasm_exec_env_t exec_env, - int32 func_id, uint32 argv_offset, uint32 argc); - -void -wasm_label_native_call(wasm_exec_env_t exec_env, - int32 func_id, uint32 argv_offset, uint32 argc); - -void -wasm_cb_native_call(wasm_exec_env_t exec_env, - int32 func_id, uint32 argv_offset, uint32 argc); - -void -wasm_list_native_call(wasm_exec_env_t exec_env, - int32 func_id, uint32 argv_offset, uint32 argc); #endif /* end of _NATIVE_INTERFACE_H */ diff --git a/core/app-framework/base/native/base_lib.inl b/core/app-framework/base/native/base_lib.inl new file mode 100644 index 00000000..84df855f --- /dev/null +++ b/core/app-framework/base/native/base_lib.inl @@ -0,0 +1,14 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + + EXPORT_WASM_API(wasm_register_resource), + EXPORT_WASM_API(wasm_response_send), + EXPORT_WASM_API(wasm_post_request), + EXPORT_WASM_API(wasm_sub_event), + EXPORT_WASM_API(wasm_create_timer), + EXPORT_WASM_API(wasm_timer_destroy), + EXPORT_WASM_API(wasm_timer_cancel), + EXPORT_WASM_API(wasm_timer_restart), + EXPORT_WASM_API(wasm_get_sys_tick_ms), diff --git a/core/app-framework/base/native/base_lib_export.c b/core/app-framework/base/native/base_lib_export.c index 04086ba5..ee90f1da 100644 --- a/core/app-framework/base/native/base_lib_export.c +++ b/core/app-framework/base/native/base_lib_export.c @@ -7,20 +7,14 @@ #include #include #include "lib_export.h" -#include "base_lib_export.h" +#include "req_resp_native_api.h" +#include "timer_native_api.h" + static NativeSymbol extended_native_symbol_defs[] = { /* TODO: use macro EXPORT_WASM_API() or EXPORT_WASM_API2() to add functions to register. */ - EXPORT_WASM_API(wasm_register_resource), - EXPORT_WASM_API(wasm_response_send), - EXPORT_WASM_API(wasm_post_request), - EXPORT_WASM_API(wasm_sub_event), - EXPORT_WASM_API(wasm_create_timer), - EXPORT_WASM_API(wasm_timer_destroy), - EXPORT_WASM_API(wasm_timer_cancel), - EXPORT_WASM_API(wasm_timer_restart), - EXPORT_WASM_API(wasm_get_sys_tick_ms), + #include "base_lib.inl" }; int get_base_lib_export_apis(NativeSymbol **p_base_lib_apis) diff --git a/core/app-framework/base/native/base_lib_export.h b/core/app-framework/base/native/base_lib_export.h deleted file mode 100644 index d5f9f626..00000000 --- a/core/app-framework/base/native/base_lib_export.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef _BASE_LIB_EXPORT_H_ -#define _BASE_LIB_EXPORT_H_ - -#include "bi-inc/attr_container.h" -#include "native_interface.h" - -#endif /* end of _BASE_LIB_EXPORT_H_ */ - diff --git a/core/app-framework/base/native/req_resp_api.h b/core/app-framework/base/native/req_resp_api.h deleted file mode 100644 index fffa5131..00000000 --- a/core/app-framework/base/native/req_resp_api.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef _REQ_RESP_API_H_ -#define _REQ_RESP_API_H_ - -#include "bh_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - -bool -wasm_response_send(int32 buf_offset, int size); - -void -wasm_register_resource(int32 url_offset); - -void -wasm_post_request(int32 buf_offset, int size); - -void -wasm_sub_event(int32 url_offset); - -#ifdef __cplusplus -} -#endif - -#endif /* end of _REQ_RESP_API_H_ */ - diff --git a/core/app-framework/base/native/req_resp_native_api.h b/core/app-framework/base/native/req_resp_native_api.h new file mode 100644 index 00000000..7e8592b8 --- /dev/null +++ b/core/app-framework/base/native/req_resp_native_api.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#ifndef _REQ_RESP_API_H_ +#define _REQ_RESP_API_H_ + +#include "bh_platform.h" +#include "wasm_export.h" + +#ifdef __cplusplus +extern "C" { +#endif + +bool +wasm_response_send(wasm_exec_env_t exec_env, + int32 buffer_offset, int size); +void +wasm_register_resource(wasm_exec_env_t exec_env, + int32 url_offset); +void +wasm_post_request(wasm_exec_env_t exec_env, + int32 buffer_offset, int size); +void +wasm_sub_event(wasm_exec_env_t exec_env, + int32 url_offset); + + + +#ifdef __cplusplus +} +#endif + +#endif /* end of _REQ_RESP_API_H_ */ + diff --git a/core/app-framework/base/native/timer_api.h b/core/app-framework/base/native/timer_api.h deleted file mode 100644 index 0881bab9..00000000 --- a/core/app-framework/base/native/timer_api.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef _TIMER_API_H_ -#define _TIMER_API_H_ - -#include "bh_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef unsigned int timer_id_t; - -timer_id_t -wasm_create_timer(int interval, bool is_period, bool auto_start); - -void -wasm_timer_destroy(timer_id_t timer_id); - -void -wasm_timer_cancel(timer_id_t timer_id); - -void -wasm_timer_restart(timer_id_t timer_id, int interval); - -uint32 -wasm_get_sys_tick_ms(void); - -#ifdef __cplusplus -} -#endif - -#endif /* end of _TIMER_API_H_ */ - diff --git a/core/app-framework/base/native/timer_native_api.h b/core/app-framework/base/native/timer_native_api.h new file mode 100644 index 00000000..4d1f5878 --- /dev/null +++ b/core/app-framework/base/native/timer_native_api.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#ifndef _TIMER_API_H_ +#define _TIMER_API_H_ + +#include "bh_platform.h" +#include "wasm_export.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned int timer_id_t; + +/* + * timer interfaces + */ + +typedef unsigned int timer_id_t; + +timer_id_t +wasm_create_timer(wasm_exec_env_t exec_env, + int interval, bool is_period, bool auto_start); +void +wasm_timer_destroy(wasm_exec_env_t exec_env, timer_id_t timer_id); +void +wasm_timer_cancel(wasm_exec_env_t exec_env, timer_id_t timer_id); +void +wasm_timer_restart(wasm_exec_env_t exec_env, + timer_id_t timer_id, int interval); +uint32 +wasm_get_sys_tick_ms(wasm_exec_env_t exec_env); + +#ifdef __cplusplus +} +#endif + +#endif /* end of _TIMER_API_H_ */ + diff --git a/core/app-framework/base/native/timer_wrapper.c b/core/app-framework/base/native/timer_wrapper.c index 9ba3628e..ba5db9e8 100644 --- a/core/app-framework/base/native/timer_wrapper.c +++ b/core/app-framework/base/native/timer_wrapper.c @@ -9,6 +9,7 @@ #include "bh_list.h" #include "bh_thread.h" #include "bh_time.h" +#include "timer_native_api.h" static bool timer_thread_run = true; diff --git a/core/app-framework/connection/native/connection_api.h b/core/app-framework/connection/native/connection_api.h deleted file mode 100644 index 7d8ef598..00000000 --- a/core/app-framework/connection/native/connection_api.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef CONNECTION_API_H_ -#define CONNECTION_API_H_ - -#include "bh_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - -uint32 -wasm_open_connection(int32 name_offset, int32 args_buf_offset, uint32 args_buf_len); - -void -wasm_close_connection(uint32 handle); - -int -wasm_send_on_connection(uint32 handle, int32 data_offset, uint32 data_len); - -bool -wasm_config_connection(uint32 handle, int32 cfg_buf_offset, uint32 cfg_buf_len); - -#ifdef __cplusplus -} -#endif - - -#endif /* end of CONNECTION_API_H_ */ diff --git a/core/app-framework/connection/native/connection_native_api.h b/core/app-framework/connection/native/connection_native_api.h new file mode 100644 index 00000000..3b4fcaa5 --- /dev/null +++ b/core/app-framework/connection/native/connection_native_api.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#ifndef CONNECTION_API_H_ +#define CONNECTION_API_H_ + +#include "bh_platform.h" +#include "wasm_export.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * connection interfaces + */ + +uint32 +wasm_open_connection(wasm_exec_env_t exec_env, + int32 name_offset, int32 args_offset, uint32 len); +void +wasm_close_connection(wasm_exec_env_t exec_env, + uint32 handle); +int +wasm_send_on_connection(wasm_exec_env_t exec_env, + uint32 handle, int32 data_offset, uint32 len); +bool +wasm_config_connection(wasm_exec_env_t exec_env, + uint32 handle, int32 cfg_offset, uint32 len); + + + +#ifdef __cplusplus +} +#endif + + +#endif /* end of CONNECTION_API_H_ */ diff --git a/core/app-framework/connection/native/connection_wrapper.c b/core/app-framework/connection/native/connection_wrapper.c index d817bc4f..b60a2498 100644 --- a/core/app-framework/connection/native/connection_wrapper.c +++ b/core/app-framework/connection/native/connection_wrapper.c @@ -6,6 +6,8 @@ #include "connection_lib.h" #include "wasm_export.h" #include "native_interface.h" +#include "connection_native_api.h" + /* Note: * diff --git a/core/app-framework/sensor/app/sensor.c b/core/app-framework/sensor/app/sensor.c index 8427af4e..2af23faf 100644 --- a/core/app-framework/sensor/app/sensor.c +++ b/core/app-framework/sensor/app/sensor.c @@ -4,6 +4,7 @@ */ #include "wa-inc/sensor.h" + #include "sensor_api.h" typedef struct _sensor { diff --git a/core/app-framework/sensor/native/runtime_sensor.h b/core/app-framework/sensor/native/runtime_sensor.h index 03ce65c0..8154d6d9 100644 --- a/core/app-framework/sensor/native/runtime_sensor.h +++ b/core/app-framework/sensor/native/runtime_sensor.h @@ -9,6 +9,7 @@ #include "bh_platform.h" #include "bi-inc/attr_container.h" #include "wasm_export.h" +#include "sensor_native_api.h" struct _sys_sensor; typedef struct _sys_sensor* sensor_obj_t; @@ -50,20 +51,10 @@ void sensor_cleanup_callback(uint32 module_id); int check_sensor_timers(); void reschedule_sensor_read(); -uint32 -wasm_sensor_open(wasm_exec_env_t exec_env, - int32 name_offset, int instance); +void init_sensor_framework(); +void start_sensor_framework(); +void exit_sensor_framework(); -bool -wasm_sensor_config(wasm_exec_env_t exec_env, - uint32 sensor, int interval, int bit_cfg, int delay); -bool -wasm_sensor_config_with_attr_container(wasm_exec_env_t exec_env, - uint32 sensor, int32 buffer_offset, - int len); - -bool -wasm_sensor_close(wasm_exec_env_t exec_env, uint32 sensor); #endif /* LIB_EXTENSION_RUNTIME_SENSOR_H_ */ diff --git a/core/app-framework/sensor/native/sensor_api.h b/core/app-framework/sensor/native/sensor_api.h deleted file mode 100644 index 0546ecf4..00000000 --- a/core/app-framework/sensor/native/sensor_api.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef _SENSOR_API_H_ -#define _SENSOR_API_H_ - -#include "bh_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - -uint32 -wasm_sensor_open(int32 name_offset, int instance); - -bool -wasm_sensor_config(uint32 sensor, int interval, int bit_cfg, int delay); - -bool -wasm_sensor_config_with_attr_container(uint32 sensor, int32 buffer_offset, int len); - -bool -wasm_sensor_close(uint32 sensor); - -#ifdef __cplusplus -} -#endif - -#endif /* end of _SENSOR_API_H_ */ - diff --git a/core/app-framework/sensor/native/sensor_mgr_ref.c b/core/app-framework/sensor/native/sensor_mgr_ref.c index b31c696b..9166947e 100644 --- a/core/app-framework/sensor/native/sensor_mgr_ref.c +++ b/core/app-framework/sensor/native/sensor_mgr_ref.c @@ -84,21 +84,6 @@ void app_mgr_sensor_event_callback(module_data *m_data, bh_message_t msg) } } -static attr_container_t * read_test_sensor(void * sensor) -{ - //luc: for test - attr_container_t *attr_obj = attr_container_create("read test sensor data"); - if (attr_obj) { - attr_container_set_string(&attr_obj, "name", "read test sensor"); - return attr_obj; - } - return NULL; -} - -static bool config_test_sensor(void * s, void * config) -{ - return false; -} static void thread_sensor_check(void * arg) { @@ -122,13 +107,9 @@ void set_sensor_reshceduler(void (*callback)()); void init_sensor_framework() { // init the mutext and conditions - korp_thread tid; vm_cond_init(&cond); vm_mutex_init(&mutex); - // add the sys sensor objects - add_sys_sensor("sensor_test", "This is a sensor for test", 0, 1000, - read_test_sensor, config_test_sensor); set_sensor_reshceduler(cb_wakeup_thread); @@ -137,12 +118,25 @@ void init_sensor_framework() wasm_register_cleanup_callback(sensor_cleanup_callback); - vm_thread_create(&tid, (void *)thread_sensor_check, NULL, - BH_APPLET_PRESERVED_STACK_SIZE); + } +void start_sensor_framework() +{ + korp_thread tid; + + vm_thread_create(&tid, + (void *)thread_sensor_check, + NULL, + BH_APPLET_PRESERVED_STACK_SIZE); +} + + void exit_sensor_framework() { sensor_check_thread_run = false; + reschedule_sensor_read(); + + //todo: wait the sensor thread termination } diff --git a/core/app-framework/sensor/native/sensor_native_api.h b/core/app-framework/sensor/native/sensor_native_api.h new file mode 100644 index 00000000..5cc8ad83 --- /dev/null +++ b/core/app-framework/sensor/native/sensor_native_api.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#ifndef _SENSOR_NATIVE_API_H_ +#define _SENSOR_NATIVE_API_H_ + +#include "bh_platform.h" +#include "wasm_export.h" + +#ifdef __cplusplus +extern "C" { +#endif + +bool +wasm_sensor_config(wasm_exec_env_t exec_env, + uint32 sensor, int interval, + int bit_cfg, int delay); +uint32 +wasm_sensor_open(wasm_exec_env_t exec_env, + int32 name_offset, int instance); + +bool +wasm_sensor_config_with_attr_container(wasm_exec_env_t exec_env, + uint32 sensor, int32 buffer_offset, + int len); + +bool +wasm_sensor_close(wasm_exec_env_t exec_env, uint32 sensor); + +#ifdef __cplusplus +} +#endif + +#endif /* end of _SENSOR_NATIVE_API_H_ */ + diff --git a/core/app-framework/wgl/app/wasm_app.cmake b/core/app-framework/wgl/app/wasm_app.cmake index e6456637..f01be9ff 100644 --- a/core/app-framework/wgl/app/wasm_app.cmake +++ b/core/app-framework/wgl/app/wasm_app.cmake @@ -5,6 +5,10 @@ set (WASM_APP_GUI_DIR ${CMAKE_CURRENT_LIST_DIR}) set (DEPS_DIR ${WASM_APP_GUI_DIR}/../../../deps) +if (NOT EXISTS "${DEPS_DIR}/lvgl") + message (FATAL_ERROR "Can not find third party dependency: ${DEPS_DIR}/lvgl") +endif () + include_directories(${WASM_APP_GUI_DIR} ${DEPS_DIR} ${DEPS_DIR}/lvgl diff --git a/core/app-framework/wgl/native/gui_api.h b/core/app-framework/wgl/native/gui_api.h deleted file mode 100644 index 65ff587a..00000000 --- a/core/app-framework/wgl/native/gui_api.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef _GUI_API_H_ -#define _GUI_API_H_ - -#include "bh_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void -wasm_obj_native_call(int32 func_id, int32 argv_offset, uint32 argc); - -void -wasm_btn_native_call(int32 func_id, int32 argv_offset, uint32 argc); - -void -wasm_label_native_call(int32 func_id, int32 argv_offset, uint32 argc); - -void -wasm_cb_native_call(int32 func_id, int32 argv_offset, uint32 argc); - -void -wasm_list_native_call(int32 func_id, int32 argv_offset, uint32 argc); - - -#ifdef __cplusplus -} -#endif - - -#endif /* end of _GUI_API_H_ */ diff --git a/core/app-framework/wgl/native/gui_native_api.h b/core/app-framework/wgl/native/gui_native_api.h new file mode 100644 index 00000000..57d98710 --- /dev/null +++ b/core/app-framework/wgl/native/gui_native_api.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#ifndef _GUI_API_H_ +#define _GUI_API_H_ + +#include "bh_platform.h" +#include "wasm_export.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * gui interfaces + */ + +void +wasm_obj_native_call(wasm_exec_env_t exec_env, + int32 func_id, uint32 argv_offset, uint32 argc); + +void +wasm_btn_native_call(wasm_exec_env_t exec_env, + int32 func_id, uint32 argv_offset, uint32 argc); + +void +wasm_label_native_call(wasm_exec_env_t exec_env, + int32 func_id, uint32 argv_offset, uint32 argc); + +void +wasm_cb_native_call(wasm_exec_env_t exec_env, + int32 func_id, uint32 argv_offset, uint32 argc); + +void +wasm_list_native_call(wasm_exec_env_t exec_env, + int32 func_id, uint32 argv_offset, uint32 argc); + +#ifdef __cplusplus +} +#endif + + +#endif /* end of _GUI_API_H_ */ diff --git a/doc/pics/wamr_menu_config.png b/doc/pics/wamr_menu_config.png index 82762aa3b05165c1507be5e0f620f162fadbfc64..c85409584e929db8b16ab66237e5f7833269efa7 100644 GIT binary patch literal 19135 zcmZ_0b9AOZ)CKy~wvCzEw(Y5H+jcvh+P0?c)V6KT)V6Kk{=RSByVlh|ub!-&^R88qtp?AS2t?I*kO&$mNdW!rBuc7;CZ_nLfH{Zm}0)C^6HUv>uEvlE) zdNR^${5-TvmVApfC7qJz&hcM$GlBb9`=FMbtp}L`(l#9}$Bz>Viw;1K;`=KFje-`# ztM67t(IZl#QJ0xS#+dv2jf^}R*>ua}2Tpv)Mq135!7zVDPGDZ~YB2>B?~eq-8LT`I z025?nTu@k0D8e0#B7ufNK!A~rOk&JLcF4qIII$OUoA{i^Q)j4vkZ~yTU-uAb9h&f0 zl`p_&Yq$zUII%u-`F0LMz5zNbXAIqI>(Zj~o#zi47tiBKjZE&t4`+$y2#8yy#-Z{V zO#D(qpn&;l{O0FK>0DFh*>?jU*NHfozvSO(G_W>W7!`MtEEUQ8RdSY;c@L_DNOLy_ z|MTZH5~TaFH0&y{S1JI%*AxygZN3TQP@*e1&aZOx#B0G721 z-5+!n|F?;t?ix1efW*kX7e{t^XVV63KnQ$H@)ls@Y7_(yXwhg9V0|L*hQLcBg9vIz zU+i%HbQaSAYBJA{-eLZm3Ku<^I_v;vC1UkA2)EG)6bSVFi%k%~q0e@y5FZl?sPV9A zc=`EN5ZZmq#xoAQXF+9i`{wO*N_)VN#0Mz*P%(vqNa|$jUIKs zh`^iym7^jmqHQ!HuqTwDcMd7~Rm*??CZucClE35fq+V!`l}el-k&7){i)?K zryaUsCrl3+1e^Z#g>&>_xs68$Ae5XWU&Vt`s@`GJ7`?`JB!nN$a}lKD?hoF>QREG* zUXXd%O!{gZKw#znYnB19`nfyL{yz~MHZEAr^xuzH5`q{zNOGLA>0;;rMH!n!zP*W-W7E$9Yh8_~MQQ{CSOt8zH5HAXPBBOw4l zP5HQG!l{;&+}qA4b8(nOA8ku5as=9pY}4~vxra^9B*MMP=<4I72NMq@O_|b4UWPA$ z-0fMp^+Pd7;u>ZfQ_XgxVggd_X-2LYoD%>fkMqx{Bqn~rpt%*__#*Kp(fRaW+-bqK zki1^t{o7G^|4I5pH!B_5PgTlv7wtrD8mZB4tzoSGr~h6xQ4Lc{EWZ6hYOWRt*jZp3 zCjjK+tdw=|4y`(-6q{<~URkJll9w1mRTdbDi;3lIk9Bp(abeA>Dz_sF-8K^cbW@i4 z(J`AXh#e*kCN+jvqStuX&Tfb77G^?pnMb((L;NgM5d$Sd#(nBx(ga7B2YC`x1r6Br z=$aP%uPd@g(jl zWI+8+;DZNn2EpD{AVXAlh{FQxaP6n8{u5bQ3D#w3W5U#?>ed~^%i=u152NtFnvuJ< ztKeakViZlZy-r2U9?CYTv=18Q4aMB+(@|tN09lPHwJrn0T+4H}z&nvV-#R`K=nLz7 z{BFIxUi~DZ3i=d!_=@U}ONjgdF61&)0(VZ(5A+Nk`xv-{OOGo#TY6-xbh*V92R z777Psky_sWHl!%zM874&Wx0xZY3P;?&ZM=0

$cwzXA)+u%2t`H%|4Tni4la6I}| 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 literal 59330 zcmYg&V|XRa)^<42#F*IT#I`0A+nCtq#I}tcYhv3rC$?>8Cp%xB_nhZkU;pW=y9=vU zt+lG^uDd#1K~5489v2=A3=C1~hnNx=7{odl7x z?DHANSzNL2(kBNwMUG@n58fNyz;~ zONR`iJO^9cwAGd#SuT8hE9kZ7ern;YE!*d8+4ZafxS!UYrUBfZhZ6)QYmXOw4)|aD z4F>Bdti48)3B~|OSyq3bKOu=V|`-Ab6nc2mFDl6lvj;fpRiHPPZMX0$^TixRP)Sp<)v7#(i$qjm zra(h`G$OE_?9a0>#KBcXXLZkiYOcS`QKChNd_TTYPZ2ukLtr9Cxi)e! zDGWxTjtD3#J8qLBO*fuJV9KYRf{TCnU4xGdV1SX*no-#4eT0hfz@sV=z^$#wwAbW* zARC`)>gubi_^lIYt6lnOB>FIt3$fa~!Fh9=>6C=A`K^3WRY*p(C1Z{mC3TlnTUorD z_eW25?7UeSS*uPq)XO4d*@%j)by@Mrw9#~GwZngmC!%Pw1j^E$`+RE{s|-hTwQsTd z9q=3A_J+NbaSU!t<~0LiCgqv%<%1K2jT2z!g)}JpnjAkk5yd!U;|*D>s}hb}8{@Gc zbeDi5jzN8csS}c_J>Tn=n>H}XdAVW&ZPwC?!>g>=qHrc3FWMdOfh}Xd`P2GD*)I1^ zt9>GQZ8Lsa4=QD#eQ7#m)Cgf<%ZCfpFpG+r;sVT)$7^J$tP1rGl$>#4sG&L0-_u}7 zKZi+*cpU?Cb}~-(YEwa>vdl0?Tn*51O`T#|1?~~jG|hX)3MkO42g?O>gv_PxK=qdk z^{sK2c_Y5Z0S-PN&PS>4koP|o!0?BgM1Rm5sM0i4IZ@fO3Ncx1QMBpVtLuHijTtyW zOh@Pu?k&M^)%h+uL7*&pnoPBlgfe`AOA?<|0ZW3EoU~uPg(ZR#OVt8gpM9QJ#9zZz zF&CPDIc?Cg)viN`T^r0Z(1R7G&o%(PwWfvm+aPz)Mwn=tXAE&4WewgCmyclolnUcFj9Cy!W6KfRAz0C^iXCdWNLqx$Vej*C_J-bX(Wb=RzH}=)DhDb#R-#2H)4Y01u;Kg0rZaxL z=|7!>UE)x+uy_IB#5M?z#q>j=IvYTn@XVhObv~d3brhBt5*{ApnzE?KanaOfW?x`^a&k19lCqlVhU}3&_x@ z(q(pT-R(WqZzH!}(v@fXcEwRUK!#eY1=u0}CT=Tgsx-Il)QB*(Z2|8=I~3)y`+;s- zeI2;ar0p7w#w0L%SlPRlxRle|W5`q6W6jmO&0F0$41cgwO2T5q9$Sv*@%rIrJnWIb z&>~_IesznBX%S~x3_rd7-jUyo2;IKQ0{gW?0FXgSRD6i5BIhmc$0k4uuz5eFhT@_& z-zeibHy_P6=P)XJ8xV7!;aEjP4u1@UofOwKscO15m%@dQYVlj4@T-q5QJ1uk=Q8He zz5%YQq=ZPV`H)U}GP7|aCJWC!A6wg!n;?uu=s*P&HAtcxD~(pA%F-M&0!~Q@7SM%q zQKn(%X65SCE+vZ&=l;;$BrHZApIe{3_NKQ_ShUHF9FZhWCa}{(!TWSa{t_4Xy1<@$ z3ErHO;tXo~np&;T|26d+30rbA%bcp{4hNw)aj9|MlBbhLxu z-za_wrsN}@BE;AqCG+PuBo(I|?j1fMs>c0%0Gv%;%#r|u1LgR#DFIQxRw2aaX^=`W zphcHGrjdCFDs9LS&kCQOHoLH*8-5wf$PAy{ssc#6e>zbA^=5RQfxm`p)c57xzoXja z`-SKL!Y(V<&#@`Jj#u?G%K;L7>pvJov(1l(U2%rj_A7CZdkOfd?U|**16d{~T7)br z03`EBWHs*rOlD;1ANI=)IkB(xWEb`mWah66a15M?^Wf!Ux!FZJ9Sx8ULANnhq>R3p z*kUygwh^gJn97DAmQ!XDR$4(<-H|_iBhOb0)=tNoBdIwAopeI|W5mp7eTdh#Eh^nMa2Ij>c~p)mb^SM8 zsto>A4VqomF^NZ<>NMX35uq=l9oLUJxHx9ImWL|sbmhOJbAoRnAK3G)pp3hgx;{u_ z^Q}8vCdSF{FE;b72UeP0Pr-t<+(wG7H?>P8ZnAkhP+`R(4#QhrqwbFBjiDL!K}X)< zf?dsD9t9_C^gWUCFkA?BOvfaz4&@Ihp2ZS6=|JOGSH2mgYtrPbX<0`n&X~+si_=f# z1%!Ncht+B0U3XTDkYNnF<<0y;C01{KHgD4x)4NgaL0212G>w(hH}CBqa_e*>gsL-@ z@v`LDp6|{PV8F&BO#-;@XLy3U^XMvb^UcPoH(aUv}D1c6Q6r! z-+;qUH(RcNm(KHK+tm?-NLREpAHt(3n%;wfmCkdi%a48$jBetBmfO=Vfjqxq%U~w6{{GW7q0v$|jdr0P22Bz2%p5OJ=bD;w@-k~;{u2G~~ zfKl&4-nIOCS=JuNL?1x#z?g=y8mFyZS#`kVJ}pxi22k&XPVi;Jkw=%rROg+95g-r~ z@{7c|$6Rx?`tlWVoD{d6_dxSb2_jlAz!tZ8j;<5SVZ?*}B*~WARbE z_tr<{PJu6Q)8WB060Y;Gt$JFAXo5)z>iB$O&ixQ z+Bx;fi*HxC6rYamjJ;GG@l^{=T21^8T_G`Xb$ zXR~k4$Sw&Q^DS`geSAhln10Y@eHvZ*iRz?5L^MM%M!tk1am&otWyy|v8xnte5C6RqHvZrQ>iTPAv7KHJ;cudf%4)9CMP{)o8n4)6-! zpA1HUcu?p8*wxcV@@({tk~`E{WLam_k^tzQHUoSK(2Ih z7e@5)I?s_?pm$nvu*nLvU9kl!tUF9H^vuf2iW%gWB-N3{*Zu03J69M8)|UYwl``L@ zr2u;~EX!HTRaffC@dL28wqGWjIb;=$iIx%v9rmly>q7HQ_uWsaVI%TgsnhE2bZ&8u z%#Uj_kfGk_k^oE2JZ*xtR&B_I1(QhuC5qmMWYqQ@ByJJn0vY*Nr8k zFQ5@+y?`})A-M03hwaa=-wq9jd0q)qjv&|Izm^uHn_sPz7$?O{!P>|wW_jHxRC5F= zPzySJanZAnPMf+{vX?24^d-ofMU|RgUY_bbggr6FU+{l4Pf2OQwxw(CK4}rgo1!p- z21|UHwjQ|0w*GBG1lBc+PVHjduuAjykI(`6&@+Se)(^RIFmt293=RcVYdh|PZ2HS=z7TYgZFMXjnm&?WtwQti$)yBVN!BA}sw|dE|lmx?r!Y_h;FOS>zsPm_f+qOh- z8~vP-1-A@qbE-OuS#OD`?dnU`m>$#38<^AWO5#@e-QIDWvY`NsWA_p zkwCkdfJ-U+N3Qab9aE= zAAsoaNHLEiNFNjvc;LrNe*DAyukMpcm&?5MP;y%jYH6?5r{Bk0P^?mUg z^;hCms>9tO-ZpDPFTcf`r?j1Q4{&a|aUfElT*>4HNq#?DoxW*wL!v^B%)38shPFLO zy8awJ4%5IX<%lM0NRixzt9-{-8%k_ODGh3VF z20RRtzSo9u`R31JtNGrMT>6zcuhAQMe22kKT`V2@EAJH?JB25jjuf+l!g%%~WQ^Rb z?j6;2$YGmF0Acpc7kFv6Z1KJDtag3hwahl~uf1r`)VA?_s303l)DzyivlfG(etWF8 zT(yZ~8!9j6m4mf{qC-}Ho%m7!WwFQe!;N$*bDp z)8hJ`)OrcFijVUv!SwYog)JixM7}=Y4yv-V-;xNmXx#x}1p-XI3DFu_|^LirSs~d)zl+~3QMK#K*U*cc0Y<2+5#(ny9MsFoXOr$khqBWCr=ewJXv=QGUtJfA|} zOG9*Mrk_1ozZ3H~Wx~?Z^QiqJOLDbM1eF z0dONYdbfg%HJRFehkPBd1YzYYS9e28ziEiXjj%4oym;g<4%QKf*2_-6I2BI6Uem_$ zxG(=v(e3AdTkqIY(pHI}&YWs5_VoWs=L>T2c~-)^9Bsahte&R)J3QA=D-(e=_GCLrRex}a=!!p6sT|Ch} z#@}Jn*1EwBkfjCdRct)t(Yv8oKgi za&A=NRy;lK)deM&pay%1v3@>15NFKV=lDS8bTuF`eTI6*b`!MJjX4+hJBiiZZH(61 z`7g?h+=$3=TAgu#lt9khe3uFnsrg17eg3SI0xMWK8VXKq#vvI3DZs2Ba#*$IPXvz9 zw4swF@9bE8_UwGZw%@QVnCBbinv0G&>S}6tmseZk!PShWy=1ZV*7_Kwr@xp|HzwM= zvD8z}-1}{vH;lJJB+kdjXS~E)T?rVfF9~ztD__>Mx;R&_+#=m16^CUFx%}z@CF;&- zu*r`cd?FaPT9tVZMMuxH$BkwzTF_Yxe7F0IW#ez;7@QG?Mh`D=WeV!M`2e(vjCq`* z{rivUUDJ@{)Y%Rnl5wN@R%)Foivmc#b{_cOdDC9|#={LPXq|+r+=o7b$MF2Y%X7j6 z9NcD*W38uC`t}R)q!6kqzc-GX-wLN+b{2V;vN}MF&O=AsB^$4RDMClfe#Q)aot})R zD6`^{2-Z+fjX2y1s(_Z&FV~!T;4eq3wSw~Z+1iqvzNbI=*eEulfH`~|?N+LScY*;d zhWPzpSpOK;6Vo4323s)EAcfb zO@TEwK{oa5JJ+4>w9V7lgP0(Ue{TFRDovC~S7g?q1UKtr#FAqXgNC2LN2iOc^L;x( zt3Dep!DrOpy8;PZF_hQHiZc^f4y!nr3-=nlyVJVZuc&R^2J3~WVL;QZJs1hiDu4}s z>w_U*Q-T#A)pdjB@(@AyN610=u7nL?Ey>&TdhfJ>wHwF5L#Qh}`b1YGfAWPZB1U@B z`-H3Yfhv@?BsM0Z@7Ec1DXjqlK8ZpQBy2`^t zJ)CFT*>>AMhd=m2Ic!Y;{{xB&CTV&&x8GgsO|F(moe+xV9 zA~gFKp~YMaF3xyz*PAPXXsOWcF1>t6Sqz;?;2s9FRSg<^C9|bWrh$1mQ}3Q+%F!6_ zii$j)KfK-H?V1dgyE8gE$u>DWFS3M>DDX2e057GDKryzK*V_nA=slA`)!v+=fPezr zFOHPsmdI^ObKELEB zW)hUcDa{8J$w!i?Dm>M;KIz%@n^5C+9Uj?9hN#C_TxXna!bIJ9b6Z=QAB!36R(E4H z^yT`R!6=ikZ}YbMtWJ?6trq@{m#TKmM7$@=JIo5CzHB%`dQ;zUbhT?oSp+C<;zWS4&iI zI$fHe9hMVV!kN2IXn5XlnzBD*CiBRQ2eZTa#@#$w8E$%$IJ%r%b(VfLb+Jc8&p6Y9 zDx(zo?U~xcFlhp2P*shP+VnZ%dzyjQE8Z?{K>@*`H5uKN`js1^%ZVSn2h-ZzBN!58 zMy+0Q40t&gx%qQT%IK2BudQhaU#5M&?Gl*Io8qSb1n|U^GvZI_BDf~H&OM8O|I{(f zKA?lPm8DpCru9sp(s22jnxnp;DqxRj77V_+(!v`q=@x%^9qL z8b~PkBT}T-a&-W_SV7Xy-kIUU#~DEp@2?Oy`)`cFJyZFdyFdwQ4G%P6`)F~FPk>c) z|3OejRo)4DJ4k6pmlh_UrcZhLz?n#hR~tDa?WWg@)Ia`oYio=j9*~aimW_RzcCE3eP zj`{IFy6fOslJurSZ2@wA4{Q_d$#^LnQ`OC19XoR6hXyUS#3Lcm zhoei@e`io-TNzIAmbHS)bMm}AU>1xVxl3y8y2Gb~&6uOqK%EBP^yK}LT+bi=d~F@2 z?IL?r45!G{Y@zMV;uf~7{@_6F;19gGxLRz>)YN}r_HF8TZX@K1WqN^$T$NE_#^8QG zDb3}Q?Wh|x9J1iqvuh0%?4}B=y4W7h0l~@k5!N7*sD$Xg5pJ@#f5jFzKHo!&kU zeWi!>0E^AR*d7`ncm!)*u>L9pOCS@S{_Ws2kylSsj1|k)i%Vo%O}0*U+`abXXI15w zsL75RhNt4-Emer7;ML_hzOie4YT+ay)e zc_G;!1*P=6@JD{dbGe-1{?o0g?R5IS>o4q-xXaYp?1BLTD47g6pHiF#ru5cDJ!$nxA4NI584WK zD7|#*C?-b@e|UTO!_nnp!JR1ZOaOAM2V+0-IAM>ybuNhJ>3JdjAfQnY`{Jy~-@zOZb0S0(4$qX5I*9;nU-sQBE1&GaZi6#V!uF;f1V{Gh9Oov8Xc|X6(>g%B@>nTLo@> zNnwBH0EJ|7tsy@ahkDrSqRn;%=?iXt2}%dXm*epNC?>gjVd_ja)2q)tWU);?fQ(C%?SBzQ31trtkQ-A{zA5d$!5 z4EExnyG2NO-#vP>5~aiGLBBSXNN|6HFVbT+$Fn(8tK~&F>{6|;c0wr=AQv22<;l0k z{k8<&a5IMx9n`_&y7UCE8I-aUZ1xCY(AAViK$+IAZ|Z`U3;343Dce)NH_x)%{xP}X ztJ4=Fhi>OWus4iIWlUkQ(wWVm2$P!qOJ5m{T|vaeg!y+_I->l0if1<0jC}OI5ZC)@ zjM2l|B61Fw-)asa0xk_ag4)&-LlB)JlXq;X zbIHo}n%x~BG^MtnA8IgIn%&%vefF-(a1V?l&#&(hrh6FRt35SU3P7k(lC99SCu;t% z#`)b7ND@-&n|j`RI9+=UT#C)@JF2+>wLdTF>;1CQ#u|ZMOP}gIA2+9d&tj6d^(FGE zsIviZ>3xec-nx}+xeJ}nd)5sK2n34FR6kzXl?6IMOrwiF1$Y(7zNqiw9Ix9?2S`Lf z!dJiF@UB11+-4Ez=y}m%-*C8At^OdFZ_TG_Owk9~LTVC!zoXpb-+T($I{jzfFi@<+ z_TiOR1}W%eWGvgKma#Ur8@1SO%Nb5aX|se|$;-egXoHOA;&Ib*S6yylENdCBBcPZo{Q8qHNnqbmnS!K$HcwziFZ>mBlZ= z3~FQh>7`AdoH-3&^ci7pwuawWNs)g3v`JQ0gQ~I(#)i!F_jmLQSXC2^WmyTFpK9VH z8LrId5lq*6R^@pw%mPnE!!=%db^MFeYGI}-6)G61(s|_AJw1{va}hKcA>S+t8+B5Y zVL$ildZ);1k@>j`{ff&}U{ra;m`(E`$GLSr(F*DyZ#@<$&lNf`w(MS(dUqXo@jNg^ zIzLn^iQJus(9)JS>G#v@x{miI%*OY3pH%1dQURg{PSi#yYKn=j3q}FX@mOoY{h@!k z0QDzJUT>b`j^nrCUcZE^k|b|b60k+|C6Zdg(NFi7AOK>k15?Fq7k|!ZlS!EV2t4v+ zy*LNSu^4R|D{IJA`GUu0csjs>C)75PocbE8Jv_g9i_ly;cx|-`v@j?~gpfHaX+rWQ z4xQEk%E~Z2pffnX_r&HW&Tk<GAnfCH16o>$XtC9vDbuzGWfkbuVg;=GgiBUe z@ZFG@^kcEy@AOb1XVD%;HDZqW_V_R+ppITh+mXuqU&i$ljwM{fiN6}w$P2j!g2#~h z2kCH_#$^Q=WARc2?1_yuIaVr!d#zD{$SX~o&}BZ)KU-B zF^cRl?%w6JM&0Pu@VeHz?h$6>Ti~n5-Ifu<5WTQ7v85Z|Lm)ho4@1K+{b`6j^Sx%M zstS5X-k8#r=OFdUD;Sx{)`&^H6gehW!aeeSClugbBuV_S^Bnl>WM}v52DxjZGgI;= zyxn%Eq2toZ!Jzl!Ch`b**FAs=K)|p=W}=c^_bUC{5Kiz!X4((P)c$p@3KTe*=SZ7F zMUFOl)9;YwPn5y;xz4+J>8xPWrI&_k-@K+C;a{oDKf%@0zx?ysyKj*Zv2{gag?g36~zk_DQ*Y*m0-Rh+O9pASHqluFUZmq zqU9-Yqz-Yu*Q&mH-L_6H@9)5^*M=Z;ERYn)Yw-t1*yKB`hS-y>@oYDtVXqaA!bZ{p z#=Ki?55C$+uu)`HGO-+Ekb=Lmy04V{EkJaTS)e(4>x{S2Q}iT}I_2|)?0`2U_`2yyJC|7BAQ$5;8a*971GOBz8Nok4-Pe?D#E)I$Cb zjRY-xUv}`@k^1-I^~pyLNP_L@au7)3jQrp7vsl*I-rK;tiIgudLESpY3jc6V{;8Qe zW*@l)fB{V5ADpk2aFDAJ2}O}Wm(Fp|R@X*+5&4w<|5A?9Nawf#5DL-{e0}{&nu-+5 zyt9~nkQS=YD^rL&J#nPfY>8_v5!$OgnNsCx6HeU!mrruqZ!NqQ6fb!5w~2nUHr4UY zg|*ZXJnh{3zU1wfZZQ$_f(~c}nYG{tw}d6l^RVuqq#gWq52Uo_`!(b-(ewAzMGtN@ zhJW=$P8C3wFck0{0!_c15FFv;vGq@JbQ|p+q0xE2ocSLf8u25_`Be)_iFD=PpA|8l zMw7dJ79bGsJg!_4uV+VZeY<*m_B5JF{#6aWK2qqY8eKWoMGxsn6rGv!nE*>_g`&sf zLdTVLkL^*BJ}4pBhNs|jo60TL;R%JB1xEAkoRwa$IW_Fhb|rTIy+^8J@4&8(ks97O z(fc=PH#Zb%TrTQoS_#&NzGjD=LbQ8A8tdShpvaa&AB2z1#*A+qIn&W*P{t|R|Lq3H zu^GTl6K``(EhIH};z?t6L857M{dw=!-N0C<*g2R91tCl2n)^#0(8Jn^<>|U0(fA{V zl2i&(-2!u=$ab!hSL62S^P5%K6=Z^Cn1dPTcHgh*jLyOX^rZhEi4O<-aQIK>b7yAy|{e!7g);sMR5B!>{bfA*uVPjb${T zb&}+<OO#A{x01B#s&5)^FtUx9dC$RxY7x;T-v% zT4im;3Jq#c-ZyVe+&3dHIx{QVK2tlDzm69o)J2cGKldJpT{GX5N#oGXul>(xqO#$P z)G?1bulOgbX2UApsh;>-+Ln}jsNjWNx18QCm!|8+uURi|Gh2Q;{xEI+Ut96L=f-~; zu-yqhGfQ;blX_YXJyiY?Afa|Io8GUm_+mH~Jb`_Z+S~MB7TSK2So$sz+2#A-R3oifXG+O?0cECsZrXBmyxIGEj@i5$BLR4HyM{;+D(HBzv)W4c=c3bcHeBqO z%_g&7&@G7C#y#9E=Awtem+4-t)R;vWjZ{2+>lEm^)!c?iz~t#Fw{y_B&|u20Ko8N2 zRSam&vLFHeZH&ct3*Rr4{IZ_FiNgb2(w!oU<{>K)oMKNly)-HbQ`hSVJ2;{Krt^%i z>^02cjjW5d835t@@DoM?r- zq}P(5rAtxgN$9(-B35(hVVk|2&Z`KA9L+$HCgkJ<{il|IsxeyJ6)Kh~dz5i+hKf?0 z0w$gBP_;O@g!{2umkn3HGphUQ38lg}23aQT-e#|`K2M~~iA}nhv!;_wY!y7UIq)?e zuhqaA0c3=WK|6pnv0H0%zyCW?Ibtoaqi+oQLCHBF>d9}oKqC)p)#t6B`uYf&L3ozKe9cs(Av>!)5 zQYxsaT&7rc6s!sMz9e_0Pi|(ZaHxb6rH$$@EhT)JVZnHTPFJB>TkDvx;99(}aBfQ3 z2J?@PeD2wQ?E2P|I3^J6SQgzbcDuNbfdogM@K&k|-YhXq-vp7n+|pjB*@skTvzAW3 zrY;)_ozWav>vEQ^ycAPC3{5lAhM8K=x7RzH5LKotxU!(Dys#kG`^#TV3ReSMdE4?l?hBDp zDa%L(9-fFFXUvp2U1=T*CuD@{*oFFm1}<_(ZqjEX$3XX^^@FIH*yoAP$TKFL$r^~c zmY9=%Fz1EI%OOLSO%^?A*mY`bP2?tpAB4xMyL0<_Z2IAmGhq!;Mx#@|UB$gLz_c<} zRdN$~!dtyH0&UsC7IbCLHH7P>+&7xmGq>?m*ScdVBd9@-&idivdAiVBkuP z{RfTL<$dgTOO2M=6gG}VbSwu|Zz@6|F2dd7;Ex%f!0186WvbRE5udK+v)E5;z+-4(YSkM5W)xvDM+X((EM>IG9XNn|KV&i`qH9csYgRRF%dt{Py#5ohzaI zWm&Okw304 z87K_RTRI$mb|RUUB`jD?nd&M9+X5RDFHd=f2=ba5l6Q(Kqo`wd6ya-s`GZ&oTIcn( zPZqzpuKD@WIY}M_*no*oqCGBiBVe*%iPp$B%m3zWzfe|B5K~9EXQrAc!~7IOo&rEB zY$Hxr6d}i=H=5mI1>2?QM?`Ah3Kc;oB`(Fg01io}+Z%#-RL55Aa6a^|v7$*D|21gB zUV76QR_C(H4^L2=L;jakUp~z>X(R0nrn}~iL&y3q#1mmv+5_$akMY{{{>}qC{<5~T z^}bp}y9p&1aNR5oGiXZJ>1F=VFyk?Xn8lH`h!%TR@w}cyXH!C|Rvd?&tr4lD-?ro@ zBt8)X9HMOYKmsDLE!v$gSmpS+G#k&|5Kp@`cP(P3#%1Yfq_DX9L!aB{!;G;GHdIHdE zh5us!0#*pQ8TE8{3m!Kz;9}44X^ig0t^DWB2&T?F3Q?VR#R!+0B<4&;tMk;j%r*X$ z9udR)3yEL5H3jFCVhsbQruI?K(92uN%Jiix(GeC!%t{Lp9q;&0%DfAD=UE|`!Ti?hA=^b-)F)QL_?WELvktf zr)=Ia7Xl%(u8zD7!P09csmfH{5>k}}<}cTtRYAq3-hjV4(?J)YGOBW85{K+j*_)aa z-#MqxSpa_@ew`6-=6en7vER(7K6_TRK6IKEb1BYjK)DNcd?5RPq)QEJvESU(Gg^I5 zWOaazxgW%)DehaMxwPij>gZfMNP1*be+yAwRjEkCW0-XIUHck<6@~nG*=(m$U_Q<> z`-sVj^a#YyS=-YNh#HzoOY#mIzFK2Uf+oK3v9{4 zcnP>GQFx(yH(;i|Am#0K8X=ORxZIAo+T%OvQ}-1~l0@pUh0M@L)?MsMt)wkva5hqy zsr~NEQwt7HLZkFfghM@Ks!RYy0w)#Ac1p*|%zCSKU3v^^!x>C#&E|0aM*oRDq!v~x zgov{)e+O^6U~TKLC9H_NQZa-p;f}~jo5`jshQYVmM*eT!7g{f_KC7KZaRe6vrXdNX z%PLWtBa?$J6>EYCm6Mp(t7^T)02dwmOT%I)d~9bT#ki>(G8a`Sd=E{+WB84Bedt|= z4Jm*?lufvzwdKQ{IfOW{)a4s4617IkW|2t1DEd-9h3u)c%p+Wn!xMZaizHD{q-g%;BYFJ z>p8%pClr&3Vy9vMJ>IRsD1J*Ic=}B!mQ~&;gY>UJe;-G$RV12-q{aO@Pk)XGm6}BMb7nB5uXI+w#5@oh zdvyvoeQNkp5k;v|u6G#Ldb9o@yj)YrGk5<5Zx3*Z?yYL^sqqdes~@~(B|2&v&o+v1 ziz{2@dq0(6b?P2t5Oknh^4p`{NVOeY7)r|cieh+BJUif5wj&z^AH#|v!bFedZH);A@iCjX)}#+^2{>5vXHL~{gxwvhQ+^o2{XESpu0 z@?iKF%~bn$Y}={7wR;-q?TGqFjtB}g=dA)kK3wbWi+vUcAwreBfHG`F|0T~C2-}f2 zwcejqJKKTlVwB-SYFdp%RKVQGD&9&olPyuabY-aX;3E+_(E;r0a_}`er;qPgh{LfR z%|u#A?t?508Vy1vcKLe-`R)X+ zo`?J7UE)Vj<+@^jv(p8?vD)wOrQb9lomhKQs zv&2|q`qRYbqD$mTzU5z}pHFhd{R;lBa^?713?(*YesiqNj2PD7xxe6pMN#WdEeaMP zFIF70eQs>%mvqT>GCj6hwP{>A9WIxV9&Kq3wo^RToB2iKmmt<;7rV3Z%q~b2`~<2J zCMW0#dn4m3ZtxfdK`n9}Kp zIerVz^~tvfu2HL>t)$v)#}A7C{lYMj#x$K>?Y7>m^!8<0lhmV}g!OY#L{OGJwo&Cq zV5}4m_cP;lhXBmILt@F2LP{Q`Hxw`IoaEi6fDbTSg^ zD6M;->_l2qTqJEhb&G{HJfwmW;hE2j6mo-ea$!;(Yo33CiI^<<0b#Uze%hfsnAe3& zT1}dCS)J}UCRUw1IL|lZ+}>9gsNcLt*{$jE0(jO$@fEq$=K1)uX;|x%nkKC}8Rd?2 zMjuQeFa08 zur?A|dJR6!OFhCbU{>V=wi>URo(6t#Ez9C(SYR`?@#;bff$<#k*w_O}{L@j9c``S# zs81k6AYNtYCpajMY6=~RHT_GMvLDAxaBzL;PAFH*QK=x24a&#Oc17e@@?D?ww;BN> zWkDlwyXq1B+fP_+Gt27~-RR33Xo>T$>xXtq(&uro0wEHQZ5>e8M(Fpx0eXA&s-p@c z(4$!R{=Tqr$lUIG#qQ`&-Hsec=M+e@G44DOrt8;2$6GT zvN~R`J^{Cz_4~3>_V~2Yh66?>*4Q~QT?PA$k!WcJoxx7Twll=5HPB4O_b$WPma`DH!a>s)3_ zO4ljBrN84Y!$C*m&uB?0jHn_Fk>+60(Snnr_!Ez!48PgeoDNrrJNVy?x&MVSj7#ss zOEBHS%D3FGh;p_i*fRL)9e8==#*T6^`Vd{#?OhQm>dVq@d*Cm<+2^Or%PC6r4s|(` zwP`=uMUOYu<&eMqq_;RiJT}=@D6~C5(Tfh$rG&-PfDwixl^K+|o?3G|+an@h?O`%m zBx>9}ru0$dL+F*KH~6k==OE`NG);ID)~UnlB}{^pRGyv>A2&$6D9(J=|3EsM6ZbM! zWde*o)ARxYy|RYmlmejfME2z`C}Ny8+XdYllX4I`KJ)apHuj@3PudW{WjJPzOB4%i zK`K1jd*_!m_NmV^NH68PhYeEV&okI=T2j?Z5(rU0sH&~)%qBtBgfIWaj)r5%Sk~c9 zlqv576P?XhdesS+`==5G)~Ld)*ZMAye?Lz~_qQB|)ONT}TUqm+Jfw68u!YD|OF*us z((eU+#KfI+Mkel@_*xfQOZW|`0=dnf-gvsaS>3E*)F<69yDPKH&mFftuLz-wBcHj+R@>MAfN z#_S%Tnd-E0sCiR;a=6;WleF85N*^~f1 z+LBlIBb#s6wPmiCEl$wYg~;A{3ce@!KJ3$j`CIh+ylVtwa)NStn&ABb$9onSI@AJ?9EOq?+nhY&(w>yoe zl;-hMc+50s(x|>2WbPH63EC2~W zfBZN`p+q6JpFZ+%C*bMFM1QE+|*r$-CvIyP=%tc)Wmf8a#D7O*)U zD4AnBxebQ-tr{^r_Y zz_e0E>|nRQ^c&vnN~tg{1KDI@Z{sQ(f%#k|cPD?Z*FCWvsF?3rva(1qh)&`gdvTVb zl9M&Im-jJi4S%(`#S~}VS;|IldI_kSzhKp4yM!Y##jJPxte+K<_dBIlBs?!>@Qbzl z58aX&oyA5D~M3;S@sDl$PCQMV)ZiiQ!Q|_h0XG?zH@OXu!a1%k^ zN&T4H_^V;lz?a#EK%%ZSdHY8%tpoaZ8vh)}dp_PWbWyLb>qNz$=Y6F#ukKC8=A5MZ zQx%BZycTdUXmLFmmE+9(zq2#O;A-8QPmS2q-Ee1W{80v{ocmcmCzvrH{gE)k#j~C7 zkUN_A#GLmB-KHP#EWg@Xb#r=lv`fWPDf#sMIP|NdO|Ik2ZgFis7oQ66+>AW*$hmfH z>QGe6Zio{^XKo%7ch7GXyRE1tg)1rb=5%LI6wlsp3DsGVZLVjo4{?dueN}-Yfn{^O*AXV!7{$^%=t*s$0+=ZgquUb6PmTl z?mHrLEzKo09_s~EQ>>x=^MY?~x7zz(LOdD=Z5&6^uwlcuR>9RoTV4JWS6`GZpRU9r zZr2)hwSax%ye>IQgS}%Kx}Arwd>=Bf?Pi4uj`hgds|Tlc>s62O3q?hipg@FDqX(e+!5A9RuhyE@<1rG9Xnqt=LW^$6sR5N-t!8e;R{ zG>Df^`}-2}0d@HxB{43dCFj$Ql5+rX0Mn<6V9g_wDkqT(mkmqv;v?C(e%BLYskDTN z##5c6ZP`}#x6e=j&J5$;`{>stTz94 zb(*`IX8(6KALNXymacR;Hzju}z0iwp+;1I`RKon}QfEU@!H`PU->4DM#E|?N=#-H@ z4~=fs?s14~rsLK$+1{a%lD;^^Ic#P&l{PHu=Rxrm3`|sA;n%4P6p!7N@}1UJt)%=% z>BO>cco+|j8;XiU6I>$xm854JNNp|oj6*^_w*0IQp>VgWDCb+M0SC{n=go)A+>|n2 zZ4Ue#NEq^S8ZsP@vII{hEn&jOoQ@jtHj!bt^UZ?ti7)LcZI&erS1_Ot<=FH)WlJhl z3Ut?7oI&$U4P_-{A9>M>+GbD8S$iw@n`in+-ImSV<%&{i-V4t;gyjHJo^*+ED0g$v zy<^-$WrF%dP0x9OU6x-*14g9ya;n-GBV+;vuS4h(=_|JKMuJoShOBE9^xK(PrcYzX zba~?PxofHL#}n#+Cm7lO@YB(nJskJph^uK8%zkYRxN9~!s4g0UP`4a-Xo+9W@%TG& zhooX9Wp|}sdGX7tWof>D`e zBa*Umzrir)HTfGZlL&LqK`c_AJe|`R|BRChg>GM$!Lq=po~~JPoVV@6vI4?0VTm+3{Ck{i3h@UdUE1e4Pa8$W*LlpAlKiJO5R7RHuJiW{z{f>*afUKV*?4I_TYiR56+&60)Vq>%3#F?*zKcJxg%oSAB$!i*o4Kh6c@z^X^nq+FAI7R@4-d>?=FyEKR@_Z)Fl*bOh*0rDt!ToXdm#gava*MGl?;LdRab<;xUz*7>!jQb9 z(j@dcFk#_*tU)zu$|q=b3+Z1A>sTCduc^QV_{oPs0p6o=O|O%eQs+0q4dHwg$d{PG z>CET^EY=@82PX0qLY}v+{)tzI#|05zOld2I4Isg@iXRW9SPh_*P@0UJ;65C}c;cf1 zG6;1-+Go`M4#a*f>zVT&;3!U!4)_>M&E+j4a^v-g7FB1F{t9V3V}#E?H=krz*XU(# zaWD7&4C}fbTdh1U@Ss}2|D#$zIgEUT7Tt};GxltW+Fi6x&NU(@0J@RJ7Nl+6<0BP1 z5$xZiWBljd;j;pSfQ&lxt+esLzs&-?tTF@K#e)9l%BMPs53BbSO|e8J81&{!ILxW- zPxVofifYUzJe0C?b9nPM@tTe_>cjJ^?@?X9Y_S6qXn&kJKO&ZiQ2srg(=a!_^+?mP zi`(P~LgCZ>_DxS5eAeo)N4!a7D`n7(krNwnWQcfpgu$4%kNT%ZqhQC^&OacLYk7B; z1X)eHoLef)Jd_4~Xz`EC$XLfx+zWhV`%B4VPltq;OIL<6dx`I?P;wfm12HTYGrbe4 zwzV&JvIFFQFU@)&V!YCBUbwn)aWt@%NWE10x~;*o9^j#jr!ihTA$$E0OXhQXKl~b+ zc9m*>waai~B3Zd(H`J1y9#_=HmBRkEaX2bwzgN{DdTpQk_L5e!cLKNWvBO&HyAE0d zfNR&y1+Js@lKeBGj@}XF7=2+UfMcZJ#ZImD@)P^l&E18>#r9Vhj(*rvlILngS2I$| z_tnAqT!Y+|WQMcrgx|%^(gg6>8VU3!OBi>l6x{(B=K=IwmzsnGg#{(*w~F}>7q0u% zp(ZO)c*Cbi&VF@!m!PLhxj!@h+K^#UXBBPXMpvYxDI6(J883vEYi2wut^cS$z`cEE z*fMs>yOC57eaQWql!NWhlPM`<-g!+sP788_fdR^o3AY ztN~F<^F=3`B9k7RMha(Db^i3fCD!?6U0aW}4a zw#S8#fB(_$T?JRH0KSR|G@$8*jS`qNa)nPyUI}4F+KTI7GMX4z^T4S)aR^)eWESew?!g_ zL!UPDk;UF~${v?4a-Eu+@>-w0FLi;}P%(t{@#PVv){FU-wm(86VB=U3dqpZRwI%&? z&c1av1$V(+#pUgV7{E}^t?A{9x$&5>c=u;GBkJ`oz!wNlW^o}sZptFTrUMipRj7&E zmCdxR1l@?&u&-mzPrB?pJEQXwl0baPeFor|=ky2!tcklX?$zWZ<{`GGgHXkSr&*Py zmw$}SC7#n^Zws>Ko?UeK1!;QLTE10c-Id;tbKW7^j*L9d3ZQL_yXYGtn&U7s^?uF93D;|v5W!8yR0SL}&pmg~dm3;p(RIJ= zE^bny4Yyu-vgBr&1oTxxTH6|SLL7o=_( zNCm#fYnSi?N@_Jr7{CvL$Mr&wrl|Kw;3~e)=fJT}5lgye?l?orzaPo@eN@(`9xdtW z%}D?%Z@aTadgJhyWoewY+~mc=(*>Q>?~Nuuva_6vBZN6BI9@8mhKHphZd}ffz8+}U z=WSG4hr%%D`?%-AjK}f&7(hSCCJ*)mV$l6I=BTPb1o87Sf6KDD&Hs4}TZEuzfA|cw z#-(LbyKkr4XMy4V%H6IwFf~>X(B-cs8zZWdnNblo%M7o^aSES%zma7HZIsnAoI{;M z%Gzr&_Vcagkd;SMh(>qCN%7I90=Wu0U~0K06n#ad>cJjyMqYJ7;%G8HrMK7t*7|fg zAxk=}@tAm&#OOevcsX2ics=9i^&^ZZ2M=Q`KjMw5jFs;G2{F>X1|>9r@EXm2HYRqaoaVYlaD5Z?htpYB1j*b9(7gq?66&;=vA#&Wj-{Pg3DFH0i$a>?L z<8pCN+Z8{OqDuu%!rMPIYL>N?T!tM=9i+NgaF}HaQobVY<0c70WN6IPdR&3J=77XcB*mEev6ax^`r+k|r+`4K6w$kxnFpwfaRq0aRZ%C>i4!xz#r zCANup2PeTnRJM#=qV11zq%}Cd2EPS;(}#f}Z~O+wc%fiunw z%u#hV=BgZz_{J`*Kk7wQTljK5*>s7IzQ7zO#N)T2*j5h3?F zW(f)+*D5V+1dj^l4*d-Gq>txM0BR=$io=jBP>>v&UMYx?E1}u|XG&mK>PF*%UPd(u zRV;^0EM(jW_Ybs=D#-23;XO%Bk}6mq_) zoUVCC5e7uZqz}jMy&LVfFj_wxoZDYDH`*FXAisCTk^|*D-+7%IS}vELWdF~5rG+^XzT1=X z+UVdHQra!wA#*uyuHgG8mSXqLYxR?_vB_Oid&*&Mj>NSSWa~%9Wk*T#dN<84^(FQ7 zkd+Gd?#Slb^C%7UarzOT^bK(JQGA>Kw$RTGOq=DzzgIt7ZTMc?tsOX7f8XI%A6v<--bf_)L>0t{KBMOuFj{>E{DVP!zRd9hzts#+J0 zUoh&-dN!J405g-96xCu_FZovtgshX_d7RLuy>FX&Y>aIS-4(w6!>b5c4<`Z7z}{>{ zx`LE|ekZ50?9BO%{c%&VG3_fQi*2Q9nD3g9XTLZSalSrsabUrIcKP?X;45GArNmhO z-BX`KDY!tmwZiif!8~GoSSOz}g&-Yl(QX??Gpg8qP-ML8gF6T4EHuH94F14{`JB4=NEfQZqi2Q8Cs$?V zKwEwW%7uKr)^~n&7wx6vLfgyEtx4DI1%mv+zK`VRA6n+E3|ER2LX}*~#W`Ca>mdu% ztcPVbD^7nV_ttlUuJ+|@lJj(^cEuhb-lmAK(j)@uC#AZpox`y?ZFM|IXVsapQ|4>F zH(@yek(u^2k;=4sS5H6s@xFb~Iy#J;rEyj{G1_ZRGdzI0uo*O1=+=3lr2bQ&b0Q*W z;?EurFQ!?aoV#i}91J(e7T;Uk1izSUu)76no?6U=k-~d&;0UoxW-PQasLkv9f}#9I z8RyW*Rz!Q;7eBPd70CYldceKO`AYz+2~tt`c-dXF_=(?^wq+~7z^f!*BK;xej&tIL)a>oMWnl^;)W znkiDk1WpB<(TVb7PfK5j!sEZf$sTedMApUZXQ9o1_eoE5dw$L`ok*&8_Bv!YhV z;XURyu6tQgEa-o0VKJZllxpne&PBOkX*AM~cLOP3d%PMi)_^lMC+`84+X8igH)EG&gEQiMf)UzuvXWf z%aLSA$_VM#3=U_xKJX?S4eb4uA{->8p#VkxJgYqBDz}6vAF`s^_f$lrC9-#Vk+HtG zn!_-X4SpQJ@ErBqp!|c+nf`suYQneB0eszC9gp5nLHW>BhFGks>D<34G7!ORtzh}y zMz_;10l`X@|ME=PsR&)4p_rw0VSb-4C zEX@bz)8P_mLZZ>j=8X0_Jof{J7ixRS1-B7~A7Vz1a|L)4y`|`mdPp zB-w!);5}lPoIlL=?8txw|7t*IP}?eM{3zuU(Iex+l1s^MV`_`%1pm@j-uoAw{vIFR zQsCCOw|Xmu#T#Ux zEt5=YGKC*XGFrq>y@U_Z+x+8MTRegcpAATogYw=#*C5S&D zyN1{xKdvs(68uAIp);RCh1N$Itj%Ly~LwsEddSO$}Rf5gU6u;=qEGh0`UI zzN$T`XLr;V_+ya`HLZ~dv<9Myx;2*AUA1wU&0{NNyPt)eMEwzaY4j6QEsDgD4z8&+ zNjvXp6_5W; zf;bDdr2O{#5o*6&V%IPVKgH#}N z+b`)-nN7zlaYurQza8O!X(7uaqb~E=7+cO|5-|Hgq}IOtg?&A`C!EACsl%A}(8$Y| zvAqk?#q=QL2EkEId7@4!(DpkgFsUo`lyndrJg?qLWZ>-1XGQR-NNv)2?MXfwG*Ykj zvTuz6oteFq_`7wgyXXp0l4S*R!szV?+AwjpF%T?DdA}aGPJMA+;KZ0$1YT53DBFG; z2+gq~S{7auTaFh9(m;2Oz#Go_&a6s;22Z-P&3-l=_$~4*4yefV-T6;5mpvj^1bPw;v0WQPBI&Y;DNXOPW zzGOL)#C&ZB9%-;}%B(f>v+XT*Egr%fjL$?jvMFB!{0*22>A&t0F1WpSP z@YH&VGtLBgSh68M6+wOuD{(@MKZA+;9!le(lbKRL89wihRGK*EQ_(Ttbi~&DNQMCS zWnXlt-J(gnRNV<;q1*#|dG=3>Ot+>&08MUj_@2Vu8&lE*E8FyCQWk<)=76m$G@}Wr z4c&%1wl!rDXt`LhDV1?Zbm-=w>raPh7HeLO-O>-w#KiE&m<8wF!qz372G7{trew?1 z*5aQx@sf+zJ73zxCTE)7>0qAYZLIfxc)IYS9}gHDU}wtPQ&D{+6&t$F*}(O%(YVKF ztcSfgIY3=Z@ECZ>sGr(uqj9DTqohu<*iiCvlM)pGSX=+Ea)?FivPg9hBP>$P{&ZYN z$0U}ZFh+}K%0z1s3f(D*I&Q3y>gigPUJvs1el3uZ@rqldo_uEloQdSe3-(VZX6-#= zr7$Zg69Leu!HhgQzWSk6X{3Xf#qjoK|6}i1y01>n_>D7LJWZH~b!*7^_rDz|37E^) zuaJ#XLJOkEPk}$Z65}J2$F%$bIyGERR#12y|vR)&Bzr0dF8= z%|i})><9M{;Whh6e8y&1!Vj9GukCkL5S1lbMT8jqrbWEd+N=UNB0C#X8IK|3kyanA z@&rx)sZQAK^zi*t{AiK+p`JmeUS}Gb-p_P5M0~k6X2Gt+e{7lu&Z1x*@)qj4%ZA?Z z9+2cVW+4@!f3Pd_ptS>#-b0gWY>DF@xUQ<5-iY3!scyoHnbT%>)KbWrJDe;ubHa_2 zWSRi7g^?W7g8Cmgg9bIgqn1o@3S>iW!C{SuDZ3F5VQY2T zA0&L2Z}sr_IIfvxNA=}{Ttdkf+Xt8i*!GVg2bV-cIomM#=*QQSVvXTr0Ik zEFNK1S=_MAV`O4Xq9<`{V|4|sie3X-%nWqCss*xzkZPqkYt>*j*M~2JDPVUWPV)8D z8;}k*2cuqEm?91(7f{&YtOnJCw(bw92|Bco0+clC{DNCtf131WBsz zYr}z_4El2i_QP}c==*ilay_C! z$HPmv%x{gxU?6NUis%5<`Zqms7%l*gmPTSaDk`$l*B-YU$sC3<-*c!tTbYZomQ~sv zzse8*YN6dZI%z*)!Nz7rDmD+Ks&i-sXwK1>ivM!pjQA)wOr`WcbpmGW zXDxhxl3zt~kayQ9l7+;PW%bATa#1m(=~QyxW14xQLc@_!t;@>I-9F|STiZ7&?WE&> zK4lDUXjUt6&3C|Rqv^0KF0+Iv{er*IlibMMYblktNaVA)7=YEA2>|!JoW3hHdV^e z;lqrfa&2j8$H(1hqE^%iC*aV(ffTFRT~pXckHk~}KB z=OqKZkH*MaYahP+FA1Szf6>rwNghK+V>Iai^pLB)ui$MMn z=^@a0HG4^sSkvdnAEf5K6;(L4Ru^hYn&A&g+B3F8klcyEI9jI^cIIU6~ac z;D$XEf>E{&)&9;z!nVDyiS1I@x;%aF-SJ>JRN$_8^9h*+zSEzS5b0BJ_gzjs0oS(g=*LtjEeK~p6785Fh8y(X(ni82;!xxDe&kWDC3>Z%=~_X$QH}1=4ZH)4!{FN+@!+P({z%CsUMCn}GRMV}tFSi>)qh;y4V=9~|rv)ty zn1B7<#*x`6uN4V@&Cat8PhA(AJuDf~36y27XSi3QVge^c_L-Ze%g}qR-tNYYho9?E zY@5ow0U(Z-(`heUQk;8SK2WI3%iS7l=4I}XV%AGp5U0BEA)BtdH5(zeG9B;{W8V`u z@T1(J$L}XoF(VEoHwBme3m|Ro#h8zg)cY)wx>fQ$Tu#Wg*Gh({Xq(uO?1<{s9*cy9 z*D$KD6&AIX?y7LzV^Nt$QESutTvY5ETZ9qsd&(T!HvR#W7$(gVGn+Q6Rv<_$@8tOu zR{6_{%}vOD)fDuhhw!A5^hzQB>#BXa5=|`@L%52TF{9Pgy+vW9HDZunC+BN9mXF=D zsp(`H<#(Hq2ctdT)_23nIX7==*vE-p@r1XrbNQdZ7c71dZzj>zp|?FJXG({$XHRgk z>sc<-WG?_g9}7Pna3mJY z%Wik@0(Py=d7OvXoSSyPg(MIR+_ux#%CVtKXpyk98uZrg7xqq~{zZV|W?9G$6U%iM zVEWZKkf`WsG@DDzA@kzJpVi<}gl-P=?s3fRc@2y^%*knTBXui*AH~ynphx$t_~v-x z9Kgi7ipyOvZ!r(NMP)=1rneoI(_aZYtAeSS2OQ&_^VOm`^lu^`%fIvw zqa;O8!mlOdKZ$F;t)~4SOHsj)3A~tzA&{f~$6r4Vfe))bawEIbzm&(4CWaN`In%!WW2Yl8 zH;&DCyM^n!%mi$?+w;D|K>D?#|FrX8bBvfBU#myHoIZJ@PK52}JXn-2EFJ+!|7qj1 z*7k;g85G##O9Y=u`M+h1@Apt=#|djPE;1Z0w%8^U@v~$~6bhulJ z9E$vxv-&HJP4h)CHotta4vC-sN5B|=p~jI#CpB2h-J`WrYu_RMh{1R2=ah36ihWIY zJ1%Ti4;39xt9w=~B!jUu6^GJJHv_(sN+NVuzvid^E zgXz!zG5*Gx$K8$mCarUYJ2bA#!ZLQmHkiEvIGB%Nb@h1t-4xRNNhg%B0ik1|fT2DK z=}W9u-2ZflkIrRIb#{)oqEu+q07J&l+fAcj5P%Sab6;7{#ZyVBH6gw66SLB89+_&< zA^OH0oq+M;vi&}N0=gP||w8qAw-7o_7jKx4c#DZ}78 zy?4@-)Ckh+e@B;E|2w+Wa78lobyxI%LlVm1>di|uCCJEHcBkT}VsQ2AjnUti>{+y_ z@tgd(d1bajK5(Z!BO6p&VZ*A>Y$x0^R(Wy-q(kCFN~f}0Co(0Jzr6bQV^LHu-mbXs zOZ$8MrkzsXLR*XXLC@WNoH`F{Z!CKb$6kSUcD(s?GSY7FCcAQQp^e!pADsbJ@4*^J zc>jdLsf$&{J;GMy@ijzt;UsZAtgHCHCMgB5#h<~=SYT{!%xeXZ!&ZTSz%L{$injFw zGD}FSHYl|r#>HIXH@7~Q@A5Ai)-|%#h^yVtRBCQM{8RF5K7NVDK;|WqVRyxw+y*eA9q3#iDJj!@Uch+8z8$pr>G_Vxc%QtKNYFPqly;%G zVA~Wcr{EYza1Oz(O0rr`A1^e%Hk2JE%!I`jj@j~@36m`B8qK?J7f;RGJeH z&H44kwA$&)Ej#Jrdj%cwJo?v3;>tun>JggQlK5pa>A`(lDP^}kHWzV!_32-0wO&WV3m{q2RknsKZpU6XlM0^=3;ue&H$ zf(|C5VD(!jv$9~9i_1IzE34A&->phqWQnf|nl$2~J?lLOHBM;otR;WkZN31n73Rp& zR@7)nM%4nv2T}m?XCNSIuGmC9aO(JqU%IXi(JL-{$4wQzA)qm==!=^W3hoL@&l;PI$loCZ;0=!3 zP>E(b^J_TgcYX%ka5hF>5>gwVz1@YH=M7A;Mnj;n+pG6&vb@brIDapiD$dFtbr-$> zt735`SXr)|oC}2CI+Rw-+=zBR6}W^<$mwNzO958OCzUVo$~*LzJ+LA>;I0STU`H- z46`%l|96HNw_jnQrY-riiS*6@V;R<~h%C;NKiXd6=(ay+r23kufm2^X(}0GN+iN1Qr5M-Z{}l+>sVx;Xr~ZDeI!$t`m{aeHS(Sps_?$AA zn8Gs}*@0{%7ZK0I)NGxAA^H#SVt5$pKiB@QioS6DUXcUo#Qqz$9<{;tE7*^(c6?R7 zGisUI9|B=5j$?{`j;wuPHkZsbKzc@>ud*G(K&wC5QLSP`Twx&^Jlrm6hp9l3y+X1u znmZb^SaO32sUkTg(vqi?5cQW7qg?*jy_9R&J78tFvwvzKIo`Ry5}GKs0B_))_VW3D zl$0Gjsg8L=m5VILT_;AZ`9ZNoe)RD^EEq%4JtoxjhPwL)`r=2)8JMC3dkhf1)Nk+& zjAu0#g2yikO#vKqLk^MdV(0C7DAJ7lHod#>RS+?$c;sDe6?Oi`N?;mgs3=0H)Z2kx0Lh;iO10%=(*lrCU`s zp+4e)fvSGq;Po{qs~#VsdzvOLU%{aztnBR1?Mq71rAwvY^s;|}w9w31uk)e#{rI^y z_Zi%9-pgte=bRa5sUX0riOSGYYj{*xLu{O?=WH`nM->5D^d=`xLo0Q4YBVazir&U! z=&{3@m&F@+izwg*Yo}CJ-R6FA#fr!E9{AMy(C18W(OT$fDU2t(+*v9tO6G3D)Yg;M zJDcodja(7~*)ZIOSmB8mz7!44bJT9M!`x7-m>wgOt{L!Z@!8QGU_kTU@atbes)Z>C zpGNWC&+Uzgo39pEa$GpBG%KlN>aL(gXg_bK(Q1D?a`z*PLBB^O!o+bo9>EMMKOLNk z?;|{KA4yd-OGbE4WL<7qpW}Td<8?9%TuU9#2gj&ZAJVD)jKt&qJz0zHt8>CH2wJWf zS~d@49qCRIMt9k1IFWoW4c0$t$T2OdP%~?&(X<6y5Wt$`RApKEZGSq=J%%e=Bd8k( zu2pzvA91VIzygVGevrafi-ilf9S+d*?MhAe&e?3DypC*_KCIm^*ZL#H{qU7(s6Fu1 zfhvYqZ+&)Y_I>x=RD;yY`2&9;q65RG2sn-;l2LW8QEA2h-vRykjp2HaMH24AL^VQp z`YTAd%aJ5Z#@Db$vwpV)zeHGMnk}pCqs<=@OGb0Jl<5w)pCLQZWPh5FCtBFImEF%~ zVHnBncz0UrTsiIu`z66rY*PWdvw-iGGF~Z1A7n>)#g%wyP$}XD1NC~!cPm~&!8UXr zhZm4vaO$t|We=C!3Bg+U(v$?Rk|?~J#-^4n8?~9@p?i^AP)qb(=|!U?j^^qr1RXZh z!bwv+p6?;M{wH!P_lbxQPIT_v?+&l+q9}g2cK7Zp+W9|u(^T-ZyK_-z*tK*8L737F zkkE%~)7Ju9rx?|a6^3u;pHF1QdJqb=piJLi!~*KyOTTBE{;yt4n?AlP}PtJ{p?c7|#QDil$p+y8esAYVxGpt{eg4R9c6rPKV}P z%r)!v+h7Ly(XH%H-b0;7cJ_$I`~K^g9^LkI>y5AcV@gYKZ0?091ImI}tK4v;UVp5U z>nk4H%QXTeR`jUn?QV&g0PP=ImL?m``O5}q*&+6cyF zPp|!GMr%Kj2(14~Y$a%b+&xNeNrQ2*A=H-=^K#@lNtKsCaKdX?vVfX3Na+}9bGeRI zFa^hEK|E1%c+&q@7^%Gl-@7=v%flqp&oL>|ySgo|g8~?0rtv(;L1KGFi9*_u*n*MVFH}5w@g%i>_^}PH!uz`v1CRtcj`f zE#JqISp;N>l9{e@4Nq8K+E3V!k-|FVyI7J})2NnJg?zntoU2-p%`(+;NgoY(OqQs5PWj`dM5rTh7-WnHsXeTc-qjdp*OK%lI^aDnotUSFLZ#x zJ5^geF(Q7yqK|2KyjrcLXR2M6J49eB;u~KXYGux=C7@5|w*=2(C$i-kODd~7w2Y1r zTz-_a%`t#am$597O&*HbZNIrGI1*p}Qhy2IQk6#OOG7g7tBXbA3PD$;MS+*fXHo%} z+XnDs3hnR6;l0L8`@S*!$amqo*Gv<~Irfh6!LA`nb24c>9qsFHH+JL8U8^bWVXJIn z?y>ZDSdaGCbgO}I1L2nE!>Jw5<-is#wswiTyxjD!wLR)3Aa#P^oZFymrI7xE-% z?qSH-HsWeQ8bbf8&GtIx4(Y5i)a2GL3KB{} zs~b1{zLpT;vNI;nleWX|JkCa(sQ4ULd={7-OgD`Oq+_@_41P0N-ocgwGLcpxorSu% z4W&J~JJJng_t%iIxfQZ2PZTWpy!_tOPzGVm1y(Y=iNwL7F%)UR(FPVg+aln} zZdi!-r#sC=ceZ^*eEyx2lV*n?6<`R-hA&Chhq9r8`Mn>fQNxwr8Z!Y^fLCxAisRly$KJ65`m%$&kz+(kSvb7MVV`H!`wS83pTy zuQKN{6Ep<}D(tuv_`-51k@=bSk?SAOK2zu3TR3_GiTO;2J~#?^O&nJkUK{Qwx$Gys zo}4gVx4uv<;9YxphXl0F%C2wH2pyYnc013(eF-|6hrGzTr{G^Uyw0h;*IM7>*( z3dmE!a)KrT5Oc2T81;LWN(m!6rjqa}fyPtWeeN$4NukGdp&dN43HdxModIhw02N_; z*Z|#nl{{DMdscg#gs3^f5W76aMeHMtvBj_C~{gjIHl^yI4 zq8~Ot{=xzv2prsBh{5#XyFDzo3Vy2UAtyA`Xj>b(uXdNF$xAY5d=ICeGauS6`*?GN z>bGW?GOyfECl87?(5~IFp54+qOx#(*b8{AjsZSbw-gp;Kjxe0B7$>Hy!5eAp$1D;C8t>?@>*S?| zk4MMu*ZIt1W3FCDoULY4kIc(%Q`IsYSnSs67B(WcLVEkbvl$k{FZCb?8I^0tY^Ql;Zu`8 zEb`4+gV(VlqbBPc{X!wKB@=&Yi$2SqE(h!EPdeSbq1)GuXy|n2Xspr%nc_qy&J7ba zYw)dyMSA-XD66;nM8LJQM2H8;1n2d_{Y-94nnbvuTpd{FhVZh?LedM_XhypeY9>ro zqS`rin7~_EbDtKCsASNgvq97l0J_mH6nJXzZRJX9u$4o|nwh zSIZd{>N6Y;Ck+>G5zf>d)<3O@TG#zB9#6VeGhqZFF7RK!z7{ItO<-7KzVz4Q(dwgj zQ!T5oK&8|Y=LPi{4cjeN8}cxk(CWIVlcQRKz3u_40;gxJ@tlGEkkt49{6>6lrXV|o zDp!mdOkCpSt3gD7XvVCWEK(KhbgK)*842Tq?e|=^>%l84(TqFMK!sQ%fYB+f<4XvG zD*H7h1|})p%aPwO{b+lTCQ#8l9>@>?(%u-G!)ze_Iq6;U?YY-su9r-IXP3Mb5g=&h z{sA%^?XFz50D|;8q!M!#>`b|dA{K8P{Y)#?A_tbr6X44GUH{P#fZn-6a8a4 zi1hfl-be!34pzcF@w-PO9&f|*H9#o&?>9s%R^qv*mq8rZY@mbaK3E_cki&1`?3Sqvpax)aQ-z&wmwNvfW&G zmM8JMobli7#an+XK%fX-%xDip0rLJZ=sD)n%?C9vdxYXj=~4u6&+mWB2}(VRC&(Sp#8(Q+G6;HnAr5PNZY!iaPTS`G(IF z^O@08f3?Mq4EE$rzP5#9tI=Vu(^`IiT<^9PIVnnqJ--V(oo_+ot+$LCIb*Bs54JNQ zvJtQwlaXh4ugGgm+;oSfmg_CLrYuq?-(zsp9oobmPLKe<3-OX?e`FE*(0L(->&pZC z4k@rRn*q1$^BVSBgC41SpLqZ{BVb2|8*UD%3@A+n@ggX*=Qil3TynEN<-r?TERiuu zw&QpLzQf%1WDc)FcU!<~lE6N^(swK(cir+*t39r8ve;(h4q|!jl1Wxn+ITwkcWAl> zk~8XbE2q;Xj7f|*7al|7<$p`3*5VIi?C!YSYG^hxV zoU-3q`A;%)G=+z3H?y8BeSL52InGCeAIQ|)Z(gnoxG$xBmuSva%RP4q;CRxMl&8MxifqJdt7>sK{`v+(!0jK0h2Kbud!jeP4H}y%PUYpp@T5v9};jdv&s4 zbmO-D`|JoMm-3s5{9$+y*JFhxg6k!Dd1(C|&GM6GLaHo9fg{ipgtG3Q6#*hxQI(Zo z0S*oV&v)ioBT|;}I~^kZ-(OkJtz`DM63+8ljFZ2x7p%_j<>S1+y;b&$dIC088uwmy za{C;RF9Nw~uii>3wy$qu5Uey3KxrdMwwR|o3vGFg*Yym?J0B-O@~)z4=w8QmTDG2y zn!>yLyW54y%iMzvkQvOOws2R$;JcZi<$d({QtnIT4l-KTK_8Da5t&rd)7Wjz@1(w+ zpp0He=JGvHfG_+ri`DU@+-#0v)&79Kbf+8rwB9w-P+M!karpPaKn(ept35Lif3U8o zDiAF70gW3=a;;IUgm`25M6^u2RiQ*)i5ObgHghQDg)Gk%e^N7;a)ti>a>I`pa)k(s zh5xQl<#wKeLGZ~?Xj)s~RgD%V`+cLG>e~?R%XQ6Z>JZT|c(2_TB})XSy|m4DRaNWV zxR{6-JH0wQ874eonI=(=EbtdGq zCTxgri(bIF`L{UC>;*RKT^`ZVaBR2j+s^PjJ%LmmOs74ajaULX`j<2NS6G)#b2KClLgF;inoTKfOC*g|=(DxZDr-DGCChked*$1k`XX&iQA)59*3h0) zLpRv2xIN9R9L5h~OYucqyjS?sb`%$3GJ2aAsH>CYt$+#X(z0=5Oht{fwWiXC8;^F? z`jFR0n$EyK^J`7U4~RF?g|4l!NesrZ7JF%dItJqMdlic5u3qF2|AW1^jEXDhwnec3 z!QGwUF2OZea0u=Y+}$;}ySo!0xVyW%HSX@-!0UYX*f{rm=Z^8-eeeCb^{dC;-Med7 zt(t4DSyii+%|D(_fklSBAafaL9rOVv0*vzWf?0q_f^jJ zn?YBrVfq2wh2RKH)oPn#4!CbWTDG@6TX=e!ZXmUzURwh7HoW{(ZZG%NyPPS0ull$e zd-dsM>&oSP@Quadz$6kItt8sZJo!MrN)ZH7y6mQ-_Tea;qw1J6o;EL%pB~D)J!Cbo zcb(!Aonw2?8c30mkvVKL=TLPR9=Se>+>Pk=Niaq2r$F$|s0j>{t9^Y0Iyy)Fwuac%3us>Y z5K1YdaX1$ayCd@8gzO8jZ>?QnzICMRd;?dk;veZAwy2rAqPjn6!^KkR0X^{P=Dw-A za~`}Nkm8t z3C4kdJshDoD@QVqKlHZ{Of$Ut?aWwv!*b4;O-IaHLHP3Bx{-jlfnX&z@nIR4?cAEP zGB*sC?r|omVDt$Ei!ea1 zSWx!~1rJ?hcUh^y1&o2QGca3{irCfAqzyrWc>-N)HlG=5Z50Jgvk1l0o*td@L%b2b z_ttW4s^W7Le6PBfpFbRDqkDmy*Ei~zNRL>Kmb65u{^?;5;;Aw}hw$x4@Qv`RiSB@{ zHX%{HUUQ}i7-GMDOxLc;)_k?a2D>10@wr8^mE#ji5ftdVWQtZ^#salxZuGCU3w)6h zfwwRVSDI^C>6Sx0U$}&T>pRg2<5$kQA)VfbrtGc8-H)RTv9OGUU^NLd^j>Pxl4b9` zhVU~)nGY|X+ohrem7jfr!yyo~S4@J(Mr|smW-=j^90x^330gDIg6Q~WWs{Uc_L*{7 z=faYAkxg}XOFBks^*!H10v2VL0&x(grwVmPDl|22{)5v`Zu>)86W>2`NgXK&vABeCK+)VIohdOK$7 zHYB3&u3Z-Ng53Ew*u{iBg}VHS%3zsJoyQ(@CxHgdEUE5D;E$5; zGd4p=I3c$gmc(p&_ydLQlK`(v#6odyn$51rNAZc$4m1vY=a$_$<*W&=bDp(o10lp5 z^6{ja?>bFmCPUj?_9bbnQ&Br%%vf=ao?p9+8uwZ^G`v3gI394GpE$xOrhT5SSoj+0 z&L%u&=hS<5aFnrRDPpfxOv$c_s&p01`DFEkEh+taBcv{}?~YB$moM z11kM0W3DCDz&KYHbU7Px0y1X%IWtu1uwxUP$lqWt4i0_2#~wS4MRldIa)&P|?eIEAyKEnU&u$#@)>-n`AOHL6SM|=Gu#Kx74%Fxw z<@BExJ`c&+?7|jGW+sF$)TMSVlguPb*x2#D6b5H!@z`b$%wNJuM*rSgdR9tJ!JqgV zphdt2_-jduA?IabrEh2Gk`Br=(u-KLr=^R5U!(I}pEx5w7y`j%%d_?8e&cgKyd zxy}7nalP=m5PuoUVlGFv4gqDx_ufr=*f6_7qPlOz(oV+aAb=29cL z`RNH|rj>UIq3c)Y=l7(5{fR`DJic>$UH4sH4x{9qNQ*u(20Ha7C;U&OrGTre4(+V1 z2*g|<$yjluVecdUvf2&_dky|lB+j5;VZo^bb_t8^*`bV1dxUlqGODb|FnE4UWhB!( zkjdxl3Bz_H%@28Nl{ca!CsXb&M{hUm!5N3^M_gYkE;=r!CuZ9%LVF+jvGbcbMP&OA~!JW;rzud=sC^{w6_^lLjhW9CH{~mM&|+3I7x!`$@Z45q^^s17}!jBFH`^7vN>;J~RJF5LR zt{d$#fbPjdg+|i#Ev)S&$PnfS{$bry$#M3Yy$V2s4o9#mmXSQ?ps`YT`PYA9IpUw5 zHN;Tn1NRaa>k;a~8NNTbS(h!8*QcVTC~}jRO+?33F>Sa^CD*_d+Z}f49=h_XviMH& zbpoe0aqwq?eFC7Fk7^tHUufJTK*MPYqgl3Wc%%Dns)Wr~hev~g0~p{%oeS}Cqa?3u zi!7CI+MZR^bwSpaPr+g`I)5!yxsHTm)7`E53=gf~p%3pFrmycn9fECsYb)1u;Nk;l ziO38GrC!TQ4(j&8Gp3($e48qxP_ZrPez^F zED2Ps`fMPZ%6IC^VfFu`=)Ju1SM*k^9Q$u{b|U$8IZePF>=c5NicZ=CMe)pajvJo} zbhp^X@^I-pr@80?B>?f}b+BZFLqQ}}& zqcJ{$3@rf`1wrCFrU-F5cw)0VW-lo^H^J?xaw#;v9L#W?T({Km+AJ4_|yAUJE zIOMW>SGPC{2PIIps0}V(oZ#%x(CjWYzM3bVn=Go8Q=bEQvps%O(adzF@2G&x3jzd> z!LIabf)2=^h~-UBeivaVgSk)%D~372aWnF)z&#tUhK!GM+KHDi@6DhBP%f1~rvQu+ zeIIJe-plKr!WDdm#7bI$l{=ce>O$n@DeNN>3TeyUnYp@_Nq@zyl6QpM2ppuCqrJ21 zz9%!;^5#o?`>Z$q6q`~4!9kT5wKmOq_k?oxUkaK#hRC_=gz~pe^G1{tX@f^C`+nG@ z6K#$XQ_|%SO%bfFNaZEo!;xN`V3Su+ts6H~HrD13F0;WySku{YRj%EYd4C-}_7^RQ zk1vL2qmrg=M27-P0-YWQmogFFp{_)-+l2wd0Fw|@Sx^{=qOvp@u|KDx*>1JR)0v(d9_gLih<9mb7hW8bS$*xxMm9LhPlf2U&BzRU zD-xahY73V>{6xFwFq&!tW39g&u`dm82LqreN~Z7rOx5mC+U^elo#%Oe+Ij|4F~!vH zwIr%GrtsS0JDM<(@!V@xnyJp+@vByp`#j`<-o|Y*>~g_==?19BND8p&8{@3DF~IMx zVu)#fW8H^Nw85X+eD@qC$K=mA%hPc`8u%hLhRpg=;rhI7rS=i6k~?Ls+~vLw83YOaj&iU74kq7k-$Y<}*R4!$DVe`O`Nfmi z;vG4kx7tIYtbYO1M*7CbCpZx_AbjU1;a=g4=Ve`oYs`diq z)$rC`ct8a1{j8`eA$1SplNi;U>5(BdoN^^Znl+Nl_?kh@GcuL30;E-xrfC%CFL zq_T=hB2785gP*#dCrUnTd#LZu60E{5)SJ91zHj%^I4|_Rgct#?BdQzjPhXQUR2Ut4 z6OftnEUsBNfuIdzjL=NoSxsrSloQ4)gIQ-I^ttnh%YDs9ai+K{G+TiVTox0;Egc^wu(cN4gfM@1M9Sn<$!N42#&Zpb1r@%mCwC(q{u<2L_4 zQFL-gmyMC73LmH2aB+wt=aMFZ({k9Z&yhnt&LyG6RU=G-1xwX7C#rvgGJj`&$R)R6U&17T-eRPg8Q!>$d>xZr-KC_=3=F%B#xVIhkJc| zG7aXR(jqo?(^yWgFS+~-9w|`K_j12b;cI#MnO;J;99G|TEIpZ7e|Zbult{TEb79Ds zNW8N!=3BU+Tr{>I{#hvtve?3R_TldHNzI-o_aG?Fr|4-ihtby8B@EW&k98+46u?B#A&QBkr#>8;I6Qh7N-8|Ruuxlo?H*{B4~eYI zvzNm>-m3^ZFLbmeT9=6gau>T*tgmZ?2+vCRpfdq=PP`7rYES{!szkW$3BF#;=`5Dg z&jz-vkMAYeGa(7}6Cu?{I6&67>)w#*R2;ma?6MX}Gy7|bI~ktmC-}P8YH=4|vK?TL zF?nI~6!X_c^ARM<7%h3R*S4pj0)9E)qlC|xFltx#Wk2FCUeI0d;fIh4IVMf7<>z7& zua(;}G}Lq+46LnbL0EZTA`E>|`fd0ENcs~UKX;G;-3rh-v8i5O0! zbcaNsDE<@_M#VWQfr8oK?Lm@2ALJM#1wf5Ty?Y4CPZ$8zvqT#quRg)#uS)N6FKdj1 z8y?5o4$fG-{X(w~)(!lxB@a@|R`dI>u1d}iR}Q1BoV5pF%l37K+q4flUflNCoe>u@ z4+c>(!S}ms82B8KqYvEV9A_MMZM1Sa=vw=&fUg9w*%q#Br#vI8rwXbdP@hbO#%%^M zmoP)jjJb2b#@C0toPLFWpB%;ugZu~e8SBCg;?-yzlT|o$`&O>E{%@p3aY)ITqm7`z zj5k3yr`MLo^=kHhrTzAU@^%xq;%UfvBHBH%U}6o1X>^#0e*!M+K!A^;4ZCwgK~q6$ zz#Q17=0?T<0@A{4scf&rvWuJ*ruw?By6-;5SG7nxWX;*2}B zwV1e(AG`vbwza(MB=hC}RfoIG=98ReksEz(P_c%pqHf(u`^Q3-q<57}e zD9VMX=KUNlRXDeO`EuULE+#%NtRu6zvRrk)c2oHy zEm6&`Ic;&&AfNW9EOJKc>kl4|(xlYSajz5LjUry!`RKH5h zT!7XHG;;lD41Va1Nd5JAt?)qQ#j-1+n+>;|8OUKHGS;VOxeR$^x1_{}Cy*@(T915h zZquDH-E5?(LbqG$Qst~ev=#z_iXS;vgl`FvHFQ+=ZWfP+u1MPx*e@vCzj&MeeI5}X zq|AW6N=D}Fq?M9k0epS!!y|rv4x|GFmxlr}wFy*|+F+g+S={mWG4?Q3E@S=J`cD)NqZtJ8|CrZf`1_5Yq@Qg5ay(Rc8aq(X7#gbn{TGP-gC6q@ z4)DM85z?&`BLBJ;;P3zaJE{Ett49B)7XMp2`2RHL|7p(um$2jiu4(ClwMg@3oqPPn zwa`qFc$t)W%>QrD?tf8ZCcoGS)trB;m<_AW54Hb{%T;}XI4yLzw}Ubdsvm}@T5iB( z(M;34pNrJSLxoLGULv@{*y|I+bi2_PVDc>57>6ctrh#af2LTgvV^u%wuV6MjO-Vz_ zIu6#hU5Gj=aW}9k<}{(7%LR6#s@S4C_m;AGiQ9rrOxuMI<=Z@^L{2XcH?Qe`2=XnY zEWn8UagGO|ev5FKfURA-GDq_-Sk(i#^Q!Y%g3~o#P;7p33qb*q{UWu8V%aNhyPEbr zPE}hbNdNCP#40V<#%*aYFY1dand*E$yWaq=k_9|ohzfEqcTLY`Dx^KwAK5T4gB}9Q zDmBjo(~U~JHvo{{$d>V#yk!4*ztH;`ix@Or9t?@nwY@mA7Og|Y{k;N zSzpz_K7u89rS~n)+Xk8gUoBvDZJn*WG{@z!S?T`KLT-ggCJP;~SD7^mqi0hL+szwW zt-vd$fot{B5c{ixRyynXn%?0TZ{MR$%w3P809B~^kkiZW;f>KjnQo#fXJq6Oom@m_ zJIoY=+lrI#l`_fR&zORjqhwXp2%H>1GOg*-DUz3Z#J(|T{n#!8yd3Ygpz&S@gl^o$ z$oa8KBcY-1UPzCU1(|;s1X(VJ8mwL!QXIf8QPQ2elC>CZgXf^dpGi3wQzv?pc!%l1 ztG2k}J(0G;Bhq(#fiUI;f%Qqe)R6v4tEkT3x?v0YVh!%11V$L`jcbAB$MkFNej-6h zIWOM5=to}9DtDIn;Y*UiB6|$a#2>mp?xppyFMOV)(%mvj>x4(L7w9!>v#r}$xs;E} zw1X!k3m%pnmM%57FXL{L1AY^A8M+~t>EPbwKl>Q~GWQ&1Bnym~$`2>EhZ@ZH64$Px zWb&oE=#H`oJodm?r5 z4VPQm7+0a`S)Q;`s~BQas7;dBOCM&;Z{FGVY^MH`S&`E|`jjzg*?LI80dDLHDTa~~5V8}%tIm2X z(z&4-2=0eS>FiYdT(Gs<{p)GE4b!z{6|&O?G5MMmm%xYc|A zlJSf8D-jZA@-8}>uxK^5u?Fw6`;JjEahZ04nwe7kP6q0^+Pxq+3wwmEoR^m)8d|{> zo6aHJO%t$x3V${_m=UZX@n;C}#yz0|EmF?Y0J^~5=|oVH z^~oqGR}wL+;WHyrOP_f%hJ0a1A`r5x_D!htnbpLtY<+_M@SBY*x`iMW4u*|h4=9yX zJB*r+GHxTdmF{~WwENPBx~r14;u`m8$RMHS79z%5YZkrQeq(as$2ZMSC=1c5c@I3q zKm!pQeJJ7+D_)2nqPU|qu3%Z`Y!Tq6C>6)--&bRr%d1c z5$`Nlq7-4j?c04zgJ! zHh$B!F*QHDjRP2rQKqvqF3v;@sS+=M(a2qZZ>zNoMy|)g1?0q32;r_(2B0pA|7KAb zfNp%-*T!_+x2*@sW4}bMHglIsw{4*9bjp7hHM~FMx@oL?Ah38jULsL|0@OsCD3ADjVTVZ`jX!oe`dd1yXJf~Mh$v1bc0E{8SH>WyZo^iWM)oyM?AYeYX2hA? zHebi?(<@fw_S>fr^^Z5rm-^P!Tzg%_y?3Oe-Ce}&9Xu8>&NKcwH8a-0-KhsRTk_;xISGdPzGUc@oc5-wt)LoCa@_tJzl(M zsP&!dku9=)V42;L9_(njv2#ZumM>L1?DM!(WDiv?bWPt@wl%l6-1bLX-WJ&psX{U8 zNeY89Mz^)1p6rrYp3@gkYKn+o*9?q>>m=n!)%hCRa&K8p80$m_TjyF3+Q9j)$qEQ< zGs$=yrWj%?JB8-MMZ0hmq}C^O?Ld4}QVQc6P=y)zTA;X)ilwEnurQKf4~2%mjhMEd zxR>oc@?WTgkrLK2*%hRZxlN}q-N?e zak4%)8hfE%v>rd$VSLr-?EBP6=_HNV7o7p*Y4kiN;CgHKgOgepfa3lY&Z;f$O*G{& z$({9RBfYes@R}0ZaN_3EuuZs_8U2<%S0nG+I0X!4N;bW@ebhR(SL5}UdtuU5*;S>j zGHR_;W7{A5dPb4DC(!Xd`i{(UpB@XS=@IWMaGwGiqzg$iv6I@~Vr1Y8yvg!73rs)p z2h9Jh9z%SSG{?3Nk3uTgZD`8&LU;_r59%9pvEr8jSs*_28jXB^D@l z5UbK4lzc;5>Ao`lisJD%^T!j5Q|zx<=s!M(B7iy22*wKgh{0!?x@%3;2emjRCKRv7 zU+Z-Ri&!qzjoD(i0k+o5V66RVhblB@FI;$soQV3EJ9JE9OfwLf0nM~>1wOMv3pX3* zGgAX!tLR8dz#o}V;nR=-;<(%}aMuwCedeGg1z|b z6Xa5JW?5|tI9YA$x$i2NlZv_cdX*#7Ew`lWFp|&*&BM}p<{^gEIiz5j?kkz}?-;Y$ zCAC)bcAP342KUM-%y9v^MC}Ke&gji#*Zf!?s@9aBq2h+IM4y(gBBIG-J21|422S`# zvJ zt2sGPl_xd?6X@6bfSS@l#u>2sv+I(!b49U?O+86^uKyWZ%cC>V!{DG}O(|=-zts!h z>I1DN`MBG9&vvK$BSS8oJaBkeC==7&=&Z_1)xpgHf^>)gzzuxr;kANuNk~$GT{d@7 z#Q%1#4{s?~Z-~eXugd(e{>C12mFJ{)!E##rOl9xBISAx2MLu=}E#Lnn92oQ@q(Mqy zpk}w3bq;Ic@Yx%E@pfV|fd2i?IT-Rsi^csR8gSpe-=ALL z2)Q$N_rv4sdiU8~g^bUeY%j#v2q*_C#F3r5XYZMQ#JOFYff=ab4M!Hhmrz#f!P$<`k<6BN9Fx* zdz>0g!8vS!efgm=cNKWa2bw(3NtT(kZeZjVFY~QRe$T`*U#M(4k${}FMzf!ah zB2K!1wiZMTv-?+hGx)n@~1YvJLfjuzKu2imlo z`VJv?6((fCOoocK-VuxDB)=!!I|t4<_jf=s>5UxlKR3Vm8w~weG!E!fbmrhxI$+Kz zzU#`vZqZ}fUdrUFy#a=qA8558^DkTwSx4Mfua|SHbTK>2RdbsIK9DXx>kR{Q7VB>H zku(Oj(9t9uBEZH@v^#w{dF6kYw#(E9l{#YhWyL;pNTzW{-&4q~KAZ}<-HWsctgS17 zj5p40LE)v%wAO7`*r86U=R*3svZ1EfE635UvRtLj<@$YfrDKh6n44ckfp0vE%YI?O zTwnHx)2f6?34FoQn=d;z(W(^mr&EE$37R&$kjI^O!Fz#y#Dqge&KBv9AuYDYoDOrh zDAt<@D=26;HGW&(D2)O^WA|+AieSOs2?pA{?*e-;OZH@o{eJ4xBN;;X^%2Vjt6wUD5S9Tb&Hj#;zIr=Qm@h?az2 zJVki2#U>?9m;WVLeNP>$I$czGulW+>b7;540q0W7I)TWZ?=8i3ICm~6el5UJsXLTc zr-R!4`-+l7z`s3G=3yUi3znoz#nVH_9``!Llz?4v(D0r+W^MfzPu$n`JLsiaj>lhW zUvfhmqCxrg{!twNZjL~n{KsdIhWU6M33oHgS$A-l^F*PtBTmMV>PlQVRlW}`HeEe2gw5|KH--lYUTyHg$Kb-a$gLk+?bTkKj(GV_ zgF@8F`lWtk2clN}S5J57TS~8iZh}0H6x-_23e&gdR@8B4CFd&|gMCtFK9?CRYR4X-XQm{+*bo{KNktiQ53wIyPxv&JSRoG-_U&QkBN za%`!|kMi4a-Hi!!GXuO=<`A$4S~T`>^F)K5GhbsctU?c4;Q^8trLcKoZ6+$NJRt;* zeQAmwehrQ$HD=a$-1{6}c(a$~e~Q_=s52IWZa(kU2SA-h)ah52Vf zgI(V%*(6;(ZiN;X4c&y%VK$IWD^>CP%K^fuU*tp^&6#KGuQl1plhVkHoM3!>a8$)7 z{349KgCE;mhr0puC-ax!~5H=$=z%S=X9X;`vJV zVkE0Sd44Fhz;}}exnxfh-pB90uIHxPCA&|g=vPP-#WjNB!j!mctkn1b zlz@E1F02%`KcAW(CJgU9rH8o_23ACl?aq_-swOGh4XJwNc;gZs&9tCxNPe$n@wut& z!tah2D)Xr52?PsEzF0J-K=fFf6Faj*xSe#Y9pFp;9D{P81p{CdULI^68$Z4n&zmQ= z!3Tzb-j!>Pct;yXwbo7x*NuYNXpg}O&L!?)-O~%`h(vc_yFa_8^!d->qxipu*%oSm zw!1d}jgdSRe3O5sC0HdHOFhsV4lW7Sn)|YFL0-{SY@VZ-yS1BpJ?rpsFsBOH;wKid zyj93+=%n^#|6vWizFkhIt!=7hL9ZTiT<_~M$2NmR&>k>eE+fL#$mR%W63`Zjt7B;5 zcj5m$X;JmbX{S=6@{8Fnr%YN`T4d%AgevCrulJOWOW@({1xHTj6WU2=+UF;lSYra7 z5n?T3%^iK;&+I=f-O2K>PI#RkV##xjEH&VVhw{CjYN}C=b)`?%X2EbNtEXvu{YRZ5 zIiU+kuB)wkFFj5|^dhqKvAK~ZA)&JW`tE4)U8N{qik2;Hq#p&X_Y16lu0Qqp{5m_y z38t2H$GP=urR$QXWryHJ>uJUPMq8Dhpy$=>a)5`{ybUTS@lU5rEH(ffdJ& zq-QkRj7GGqIs3?oz2N)y)whbUKDfClo%7ur+xd(AWrTd){1L7jB{Q5&zbdKlm@fK| z;8U!jvxyZFrw^1<7&pCoNA`ka)bB6%5;pVE=SSthsseA{FwK4?rVWW!9&ACaI|Kj&6>_I4zFOoBQKjbq(c{0{q%Pk&z|kvc$*7348b>r4;>2AbyLQ z#bN@>-$lzg1IFK4%k>X)?XWX?P;$|+vMQkpqoW^LMRc%dagDpf5ykJU=(T|1Bla zZ_zR@Z!wT^C3JLM?zt1a-ZNxyZLWfZgA^`k=-Wh|>#{SzpZLp5@>Op51PK#w#5it& zw&SJiv|CGuY2xT~1UsO*#zzkzM~9<%b< zkB7%$YfLdO3dw5ps9|>Z6WJhnSl_M%*LaV(;O|@ay&R4oMprYMFWB$OtCIWgaH`n! zRC3_yX~n3wRC-i;5?u-J=S+-EU0#>b;FQRpcVp2S?F_UJESt z?s0KxwV`q+olkVO1Z=-L{Sf5^hR>MgjX%!>S*g4J;(XBAp6$#69-OMzMqt(6MN?q( zmqTWxu(MH*{&3iiPl{N;x{wMhypR8^5YJ*eNU~&@`?OtQbnctxYVkw8VIS3Fb7K-a zi;_SDiICOd&~eJ%l+209JL>#()r`j;={BA>H2FxYH`dXK+tOY6#;GE%C`Mo+9f~f* z^=!*hi7u(ZC3#@zE@=1QMyu=KT-s*`OR#^p94+|IZqf;xaWNg)eLZ%FaHegH#;qp&oAI~|!sgE}_rZ*2>kfsA}$J_CAZD3nN0#P>47tans zGOXv!%If{ZfazsF4t1hUFQpvf``C#hJbJ?byp4#t-6|uSW!ITc@}1yi>KawM zuk<7OM3@%gpa^*|YVoIoP`T+z_`9)g@I@;-&CHRqA99MIzZv3|<1QhYRo*2b1q*je zKZLqgwMWrQvZN^PKxAOIf=kszP<@}Y?Juv9NT&RR-~_cRh??7jIIgcDO;sY{$*(B& zg-IAFpY%J!2YAQX49Ox_6$jX=zI+BJz9+UlRAai_E10cgZ%d?p$x1ytEoMNYC=tRg zhqP)wM`|Y%h26Sr*oBxLMB&cc!4$W;3li>nW!P_j>@nA5W;VT-I`~q?oCA0@=hw)w`2tCl2nA!zcFtJ<@xpKej^ZD_wm*Dz|6b!B`>P}NV^tp{XkWC zkY#&$`>~nc?lmHVC~68>V$mT)A0(Ei^D5v1yi-#g$erO41``$3rO}JXGt*GGk0J}M z`-)uRGGF*-V-OyqpPaVWXW^J6h^{=f!JyKbEqvvIz&YkQHso z>H*A*>}?wSGT1;Q(9#ly3hL7gZs`$N%`-y7I$0>=>ZC5L%n0Q{EDE@QC%&rRZwMQ` z8b9|SN1E@r?eEHxPMTg@2(!Ts7JGf$#zw&;JX+kod-zga<%4{>uk50nI@Va)Zy`|B zWRfz`ClQ;!+T@e{ITDHnJi7birsStT6(;XF?79j;tq20K-|siG4;u9yNAok1Md8PTSi%&+MatqjquL#kh)z8g1URGtzf>Z@YOJoN)vuGo>8|ht@S_ z@-XSs8*MbNGi~>&szr=o{%(1{fSzm$^MmlV+C2L6BSKigG&=QP*8;##i-}0s#_}+V zjs4Wa(WU>|0M0N}h=x9k9pv`|-L1#G@$s1ewQ4LtFmn}kU45->W}n_*UB2;p?Bm_h zC$<7gp3vBI0~rj=s~FaYwDK_N8WSHkhxh7C&sYWWKF{%kcZ4%xZ9rF%K%@ zut{tJ(M^G>;~*F*Fq0*%fkP>LN)|{AMqs_ucVNHTzSKR)-3SnA^Eb`b!J1u_5Oado zP@LXa@0R$uW({Fyw2Gs9Ua1=kC02U3`9c;5vRt-)q7%8r?N5usE`Gb^&zc5L+*QyZ*JT^fit*YBDee4O%@I+=$_GUu!D z99!Lk)BZ$v3J@16sj7MvAYYdWSI4sP@qd+?4OM;6Z*ZTcJg7UF8EWBGVzW^~&TjOu zsG3Ite#~Mj>3@;IotmwXuQ4!yh7N*^n24ezP1(=LHWKmq0`Y4?9oe=s04U0!>qwqb zZfRCu9>!iAm-Sl=95!8MQQ#h3bwZ8|jW>%>r#TT1VWh=KO#WV$f|YeQ%s;i=z0gt^ zl`|y&no9%$C5Z(C!xXKgdS(XDzrevO)rW9UxzUgAN{Nh%sX$4uzd!EBxbSH#m5?z1 zP*FTCEkhR$f{hwg%R+t~nzDq8|c)5?L!&2z6&cW4`WG6TabPu=pHeYMW<%b(i=4+$X z3lON{GX_Nmwi^SlO7MrziIdQs_H3R$yH3f9M!=W1MCb-3rzUE{#WxuK4uP0~u1+Tm zwIFwQwK3WCUq)eCMh&G`pMr!}nxX49uG4Q6sb?X}-M2HBm}aY^PBH3$v6O(Hs89`+ zEpc1NBFe`9`X$r+^t5vbmLkr5XENbZw~dIyYRToL#^;f?>$Uy-)tUcKpx_3sQQscJtV`Re`$tih z@&lg6GjK{h!AtrKA}R9h)CQ4Auik!s^P`@|dTWYvQNffS=Fw~3mH*6Pk@2&&V^G&C z8q7n^WgF2VXh$0>D=YdWL!K+D=fLLk6r?H;30)Q2%w)Z9)TsqLJ`Pv^3qu5wg*?X= z%ud818mE8vexoNX$!qKJIP+|s!~WSycT7hR0P`m#JqQ~0e3B=x3gyMcO|)Au?=Jcb zY7IFvuJTC@CZ&kHe%oyov*Y68;z*ADbY-Bz2MX~G1lf}_D#fo|l=^|Z78|6rl+nMJ zLe$ZCwC6TS@qaBQ1aZ88CbIm9Xu3l#`#Y$H_4lnQ-_2RJv`_)7D3wfs2L@A_*$c45 zI9yB(Jtb_7OV&IROLvDPli>?*9dDR)R)runTSds3tirfXM_E;tO<598wFFsGKw zWJfMaWx#}$P9k87>N&7 zmcpqoK3j=+pK8LEkjm9W_v;SwydX^78Ga+-NxY*vGNRLZgekBdF~Kk zJctfyu>ygQ;%^PZnJv~BW|j1WMK)=JH>5G^n`=ji=691D=pD&_SW&NO&>H@J7e5fJ zHYY$%Q;V-ZGiYRl^vWVwtqHJ|p{-rC`RTYZT}M5zfi>Fo65of3=;RJcp5{*9da8So ziOw6#QqvT4^Y;4OSeq?Z0t<&Y^VuAu(mS@{`Bz3(As_jtnYoeYS#JVRbXSV49ISi* z=uGxZF+suY9gka{>vq*UJ6wLIv?2ogI&(Y#)W7w(DS$2+>}{%g4;Qf!EK8Na0^EXG zMnsC-3dDN@v7+DXd0$uSR_->543irLWth(OKH}7nc&NR0Qh?M{iMN6Qg;WF&*XdmE zJs||;Y=(}_*W|g<;|4t^_kXf2MJY(s zI>Gkl%=0P3BkYOi`J!U!c~2BlM}YrY9I=Bih3jV0@~qT>1j0?0zeh2y2)I`a`A}TZk%Y!p)-WBIr|Gjh6pPYw+ZW-Q~ zvdb9Pg{H*`XeIe;dqR1gH4mOaW;+N{?TgT(8*3BSayjg;)b;(Ma3mf__bi67w!@9)UfAhY*ov+z~NZt~~Ea+7dbt!K%2sce8@@ zO@|!~%ZLF|NpwuunI}%hH!Ip8b+tE-@MALXy^HqN?XJs)k|}W=*PwgBE;S&^N8#{x zSkSs~c&nh{jtN*=pD_A{`G-+m&S|d6YmMHYCq+VcSw^uw?Hby_G)$r0i8IW5963KKG<}E&R7B-+y}L_k6Op8I zd4JFfq0TTN+3Wk~3N`nHL}n7{HJ`CjSFUkb8_LF~yiC0h>y4c$Cui?g0x9~XkcNb= z`?N+@KUgp43#%>0$nQEkvY2>exxBV4kWBj4W)_p|^RSueLA+@xE|0^}2~?GnW-RID zlfl64p^e!f*xyR5EHc0F6O23hl;>Y(C31)ovsGz96V4Ga!eH!d#9PmLp-iR7^OKKimzBkA^ByD|oC#0th?3fcr7wJh+3Y{4+zd1R z7^g~U66us&Cot3UdOPzJ7du_y*#vP!g>9Oh_W3lV=?Z<%k$#Z;7T5+X(Jx(XNvj%xS z@7tcGM>vvS-5e+u0WV2B!a`e+8kY;55Tcs_pY!FFo}7gg?`rGFrl4g7`EJ&&D8b)` z(`+~N9Dfm`qQqwTli=ToDF>P5Jr{Xce&y{@4-ACxTH6VM|1PxB zPK=FlgnsXbDeuYVqKA|&DO>R8F%JOY(Uf?*0aIe$)1A3MmzMCm*UN#aNG(|7`)6`9 zyUhAq@42>;EJrm6su1O_d*5ebNI~^xw}HvBFS}4KWkw9h#tsbxwQ^MP=D+7?m^JvY zFhorY^9#^TZ*eW!Oj*<}i_g!3x-XXd3DC%(oJLATXTG_P(TrvsRP)u~*EtUFg$J5K z^HIY{uP>(=2}7X2aOFNy6wOaMnGxk&bb)Ej zr1&$Y)vH+*bi=8)ozTiNI+?Cf&vPBTn>}bktT0gga|`OUeCn_5IrMOE@w(fuHTUuf?ltrCKOsXUDJb{w2!$VzKZ1PUNJ)6O z1*s=`tbdDUV8w(pwj=J(I~^+GxI4P%;K3f%!KDeaF%%bgX$WKxGf4?Cfcapr^Gn?+ zmVMS9VmN&}IA@FVfXV4Vq!UsGZ>mxkYF(AER62%5d>+O_=yK`w^>}pAEgS@gttm9c zSA^fHk1i6=r;-`3O}5<-*q(Es=1H1ml(uXuV&-@Lzxp~0rZ~4Q3!}k8 zaDoL$UzNCzi)aEIU!2+$BDL4r0AB)G%H-5L!V+`VyV90HBYaA)SL`le>?>|b!| zoZ9uC^{n;o;~VMK^cJxBO4lac($rF*)%2F5j~S0NjdGmtDbpef8{dZA(pnciYp&64 zZ6;ZmTSeFbYwRMA-zqK#BOxyc@5>c027;PukwpCbkauHJugb=TA#2vlbt^iVnU8GZ z&JVs%n)=Wa={O8&8d#a?ew_2x+M6UyFauV4PA*WSB!FCO z09!SHy`NOxAO>H}<}crcAW^itD2Lskq88!%-6JFJYo4?>fx*KCwQ~9$Z_?KUiOqJf zN&BWl48BZ#M zMyx<8dHYhzL?BH&gradIxL_%o(fLJn_rMf|5G_2_AW^vn7E+)0ZAX`_r|>=083%9d zN5C+I{;rs4Q29l8K`}kKs;6WmFM6l6SEwYEE+uE)mR}5y7T*b}bRno%Fy4FDMvyZc z*X3K1nVd|*;9^lg_g@PjphZz_9!|1W$Xk)*GCOOyPZldC#pLlLMrMF3R&#_Xn(gbI zQBLSY$?)KWI@s5$Z58UzsBt3e`S$-7%|9xpBBn<@r(5A`4m#OI1j%XAPnV=R;8!5* z&Z(Z>7%a(B;Ow7~B_=G8Ps(VNy_;R8{$|S<@O3Q??`W)RJGF(M1Znl25fDn6m2u;J|pc zb@)Phwx-NFb#U`co>KAQK|O8q#Ut3#rPpArOM(VrjMti8uS_Uw=)G~$-V^k&dsh)A z5O!*FO>ne3k4RJJAt&V7M^Arqq%R>oEuLg!M=wQ3$L9n=a2^=j_|kqfn5`L3v>}r) zY<9nNTJyB$%;Dz%18dbS2L85Ow_ICrH6V{sg;4ND# zt3s|Cn04Eb3Z50mkYQ5l@0aW>kbf%$X61LzE2;_4O7*|15y?Hw4|;kve!cSgu(Zy^ zyYy$&@I1jvIn~|PM^>@r_vfBOq!%$+laWGV!gD z>2C=94?%c|YTEzSWFf$8K(q?9wD*#>#r}3j)r*=RQsvGTyZR&4Wk=+-5T zM0ZU-i#Nw68epUBE+&s@bkhG1;1eay_G2@T<*maroXK)fLP!yjjKU#iQV7wGg(>h+ zR=3xmUNrn+7nN|_Fv8ge={k3>G3QHf=7E)#xQ(y&8#rMjde`8Ls9|mM6bTZZEn@4- zBhMIecfNS|-q!MC8`!@li8EH(YLYz()|yGutcfa%@5wT3tTEj<)%^Xhr0R?_76wjx zWD&bEhdx|>y_rpYzVrmd`1RSB(_0pd&~2&hZ=d-30_fsa`%G}XnOHI4c z>539cgYn;s5bt73@wxhO~;Y3)}6n}n9(8aa6Q&+Ic`meaUgUqp8w5K zaD;{U-@CHqZrK6)Tiu3{PvH9%!_KpyUuLo3+(4hIdcCueQ8nwKQ-}qQjTGIXI6H#Hal{dfG6jA3GRtc3(DTyq81r)k{;5PrdFgG}$!W)ml z`jAm{b6ZA4Y`=WfO~lUAQu1(3;+46-w&dbq(9(=#oN^zL-()lcJv(VFri<`11^+Bi z!22&llLVxHCq7ml{>$y*0^Uqb7^V^n6aMBPcFX#7V7F?TOL{gPc?IFD@83OI+X|w9 z0;{hvhCr>bE?-rur!~2lnbc~L7rCcIL6Vl0w(rGFExvj_BqaxMCr&Bs-EGPc&|R z!fJzBclvTEoKyR8*OjLIG$>;VE)--g%-XLxOld0CCUw}5Z+hZ~Q6=#|Q8S1NEZ!FWHqrN_nnFA!Q?Y>kXY|PC@xK_!Tv%rw>o=iD9VoPUd=mS9oG0NXI? z&4te_ZjW7{f38B(I~;oRc<{4Q0(rVYm4=kedMt)Xj#(2Aq4_nZKZS4mK7zG$6^o=| zhM|sxB%FswdQHp6*!G(y;|x%5xt@@qGTjvkkC5ZJSr?$!C@XWY)mc3LCr%1#4>#qNqnqv^|&cFJ-=j-a*L$d zIMczByCgsxyK~>5pVuIiw7;1g1_$nbdAs2u;^u3_55BeaGOf~l|FJiVB9_r#Qe>Z% z(@V!~!kuXli*sMys0)=odAPe6$>p4!T|(Bxz;_V zLchyFnINi}x=$trLt&a~*!?f;XX*7tpq3b>X@(_b^|kDh3c)l9 z@zl~J&r=Qzt>0c6t(QLFe%6H4AA77k_*zz_gK;HPSN}NGVm`az zKIVM#6URXYQyP#-(kK&Bw~POaufXwS;DBmu_Yt?AVdY`gKhjx9(IR zrNQUpt($|9!9ockiCq7NFe+O!Ozs2UB@b>GP;l!06!C*~|B-h}ocS!HWIHHMhkZX^ zIctgGn!dhrWE=WodI}U9ODP(Rt*X5SBxppvLW{n|oO=)w4^oJ$0pmQ07X^827m4`% zVgIyk`d%*}bg9v4Gm{;+n|{&9Q(f^ot{n_28Wwlw3Rx41=*ej7&V!_YNm2SzO^e|7zvaEQ6>4k^d47-2rmoS$XZ7881WG!_&ovn+uJG}JiU7`jmktD5D}qRH_&!iAPMd%4Ff>q}F>_ zHo(<|^R|n_>?@?lT!q;;JxCytRdx0D=?vJj;zNQHC`m0he*udPTuhN4G&V>qYfl@> z>KI+JW{f$iv{`5XTo@-)+}_ne&J z`YKA7U|DrOJMsQ9k)Mq-<2YHvxeEz#n-&e>)Cl=%E@!T!pN5V|JS9C!H95iXC~eQc zd2r~WGXe0mlPwooA&AIBiHw)^U(ltosF}knf8$kBChg_(EZa~nBqR(Z5Ku<@AMO3G zC*MOg&I1yZ29n2Mq{Yda=*#UE$miI*T5-8;Z;Qk07})tyc3f`YL#5$B%^KcDm-E8l z;%RLF^51xgd}}PTw``%7IVDxiR{^kS{(W?1feemBSumSXO((i9Tvv&Wmz|{p)DpJk z{O`QPPfcKa3KhxqAUWB@PZhCPHCKQ1E2+si($RrEh=UxGOaWF@UsDU*9nrh}116(I zQ47*Vu24?Qv@7&JjRdGPCEbxNgrc-;Y3Cvts%gTeLyG3U`$XY{hSZ~X4axo;+Q@$6 z$XrzDx8)gSvMa}SH4&#(*o9z_FbzpnGG(IUGf}E&`FTP3M_|T?`%8ZjMuL9o&e|}H z0xE5B<``uz9%8Cx^c{%pQLn9i>Ash7bT6qEHY5)HOfo@kB`@RWjY{*-KSVXzR3%@r zWjl6RIj8+kwtXm&t%T49QY6(^5`#VZ(|L0=A7XO2ahlcW(Y4m^=!JyMn>=dM^LY9R zXtmt+JIdqmW0}pBaz`)Oc9(?*s_)L~`zTH1qsid-l;;yYYpi-gWN5e4_0W?|uw{5Q zykPXRB=R(GE0cZ)`xVOcxt;iba~&925-a3eW0Ct-tqm15tu=XLf$>58UsL}Ny=r#e z`~lBjw-RWR{tacn*c9BK8h}Z)4fm6>aRwFxjyu@+@`v1l-!5{UuG2^r%8<)hSP)ZW zMej6pl8?K2*bwF+ZCfpfyo}oa(oHx@2s$avU&Pm-;2jtb8Jy@0>+nkr@x^;}gq`W* zwGcfd9x4+)yqPIrZ*)@=(Z^-FsaG&TW(nv#%AWhoH6~#IyZ|~h$7&8)^zrK2=$!ia zQ(~C-N1zH3s8==6em1~_+fVMH(dqE=AMnap8CUXmtLpW2Lqf)@HnEG(!EVU-<8K9t?Nw75<&zV zoMk(lz9fbgTJ9`L?Z>X*PpqXv6*;t$C`N+A5)@imh>%Hke1ob?4AR0}y}%)xF2^uC zOEg&}Ha4whe;?lQ!FBbaJt{XlJ=#Si-C9&lC;F4o5l16@wl?m>Gxn8RVoFjQGY#RY z`DHsocZ2plkl>bLj5#B}zHjjSKLrZ9H4U{e{a}hRvh82tveYmz#!ZAFbVq?xZ*JU9 zkH}tyPE1p5AQao;`$@hAPPX~6@p+h+(Lcd71YIPcB2*4+vWGI_c$_ZuN~o#?5W%NF zOFQXQy)nfEX|$49%KQ>2B2?dwPykxLMDI=QVR7{27jml~iJ9aMX)YBy>&X}_PGJ`d zi^zVowdjU8%h3WtTEEoAr|UC(c1&?X>7#eTeAJMi{L}yWk;$7|h~q_le@yRmL;5jdk>zXx zT33R;();7{1|Aax)jOm2nCg^aCQmr4{E}rGMKd$Bl$#hn5Eeh|Sd|6BsJl&=A(;xMHb$nBN z^4IQmnQ=Tf{4KKTq>*lU<#u;kk-g-pq>IoPV@Gy)L1fK1Tj%O?BixN$86zCqBOK9U zKfcRV+leXv;M#_GrKsL9#@1jGa5>-Y);^=Ma~Bj|>Lyj$?)#DmLcIJ$hW8p~h06aI zEQCn1ZD>G+Gxve2HQ=0uQ4XNc7Fe72rW7OmXa8gr54%A8QgE6X)!#sco=;`TVf*(& zZ4iwgPV+(N3w>JNlYq>Xr0%X?MZ(@U{E9{f>;_cVI-U*g?f2{%<{%i{O;rcY|CP6k zUrdx7Mu|E{98~awf{iB{Kg+p6&3Lqa&ClLch`C*0@SeYCcd0jd>Y&_3Nh%~GuzUen zs)JULnICMS3v2y;$YWB<+K6sx{a> ${wamr_config_cmake_file} - elif [[ "${target}" = "X86_32" ]]; then - echo -e "set (WAMR_BUILD_TARGET \"X86_32\")" >> ${wamr_config_cmake_file} - else - echo "unknown build target." - exit 1 - fi -} - -function set_build_platform () { - platform=$1 - - if [[ "${platform}" = "linux" ]]; then - echo -e "set (WAMR_BUILD_PLATFORM \"linux\")" >> ${wamr_config_cmake_file} - # TODO: add other platforms - else - echo "${platform} platform currently not supported" - exit 1 - fi -} - -# input: array of selected exec modes [aot jit interp] -function set_exec_mode () { - modes=($1) - - for mode in ${modes[@]} - do - if [[ "$mode" = "aot" ]]; then - echo "set (WAMR_BUILD_AOT 1)" >> ${wamr_config_cmake_file} - elif [[ "$mode" = "jit" ]]; then - echo "set (WAMR_BUILD_JIT 1)" >> ${wamr_config_cmake_file} - BUILD_LLVM="TRUE" - elif [[ "$mode" = "interp" ]]; then - echo "set (WAMR_BUILD_INTERP 1)" >> ${wamr_config_cmake_file} - else - echo "unknown execute mode." - exit 1 - fi - done -} - -function set_libc_support () { - libc=$1 - - if [ "$libc" = "WASI" ]; then - echo "set (WAMR_BUILD_LIBC_WASI 1)" >> ${wamr_config_cmake_file} - else - echo "set (WAMR_BUILD_LIBC_BUILTIN 1)" >> ${wamr_config_cmake_file} - fi -} - -function set_app_framework () { - app_support=$1 - - if [ "$app_support" = "TRUE" ]; then - echo "set (WAMR_BUILD_APP_FRAMEWORK 1)" >> ${wamr_config_cmake_file} - fi -} - -# input: array of selected app modules -function set_app_module () { - modules=($1) - - for module in ${modules[*]} - do - if [ "${module}" = "all" ]; then - cmake_app_list="WAMR_APP_BUILD_ALL" - break - fi - - cmake_app_list="${cmake_app_list} WAMR_APP_BUILD_${module^^}" - done - - # APP module list - if [ -n "${cmake_app_list}" ]; then - echo "set (WAMR_BUILD_APP_LIST ${cmake_app_list# })" >> ${wamr_config_cmake_file} - fi -} if [ ! -f "/opt/wasi-sdk/bin/clang" ]; then echo "Can't find wasi-sdk under /opt/wasi-sdk" @@ -236,143 +65,71 @@ if [ ! -f "/opt/wasi-sdk/bin/clang" ]; then exit 1 fi -if [ "${FROM_GUI_MENU}" = "TRUE" ]; then - # called from gui based menuconfig, - # all settings are passed from command line options - - if [[ -f $wamr_config_cmake_file ]]; then - rm $wamr_config_cmake_file - fi - - set_build_target ${TARGET} - set_build_platform ${PLATFORM} - set_exec_mode "${MODES[*]}" - set_libc_support ${LIBC_SUPPORT} - set_app_module "${APP_LIST[*]}" - set_app_framework ${APP} +if [ -z "$PROFILE" ]; then + PROFILE="default" + echo "PROFILE argument not set, using DEFAULT" + if [[ -z "$wamr_config_cmake_file" ]]; then + wamr_config_cmake_file=${sdk_root}/wamr_config_default.cmake + echo "use default config file: [$wamr_config_cmake_file]" + fi fi -# No options passed, ask for user input -if [ "$MENUCONFIG" = "TRUE" ]; then +if [ ! -d "${out_dir}" ]; then + mkdir -p ${out_dir} +fi - if [[ -f $wamr_config_cmake_file ]]; then - rm $wamr_config_cmake_file +curr_profile_dir=${out_dir}/${PROFILE} +wamr_app_out_dir=${curr_profile_dir}/app-sdk/wamr-app-framework +sysroot_dir=${curr_profile_dir}/app-sdk/libc-builtin-sysroot + + +echo "CMAKE_DEXTRA_SDK_INCLUDE_PATH=${CMAKE_DEXTRA_SDK_INCLUDE_PATH}" + + +if [[ "$CLEAN" = "TRUE" ]]; then + rm -rf ${curr_profile_dir} +fi + + + +# cmake config file for wamr runtime: +# 1. use the users provided the config cmake file path. +# 2. if user set MENU CONFIG, enter menu config to generate +# menu_config.cmake in the profile output folder +# 3. If the menu_config.cmake is already in the profile folder, use it +# 4. Use the default config cmake file +# +if [[ -n "$wamr_config_cmake_file" ]]; then + if [[ ! -f $wamr_config_cmake_file ]]; then + echo "user given file not exist: ${wamr_config_cmake_file}" + exit 1 fi - echo "" - echo "-----------------------------------------------------------------" - echo "select a build target:" - echo "[1] X86_64 (default)" - echo "[2] X86_32" - read -a select_target + echo "User config file: [${wamr_config_cmake_file}]" - if [ "${select_target}" = "2" ]; then - TARGET="X86_32" - else - TARGET="X86_64" +else + wamr_config_cmake_file=${out_dir}/wamr_config_${PROFILE}.cmake + # always rebuilt the sdk if user is not giving the config file + if [ -d ${curr_profile_dir} ]; then + rm -rf ${curr_profile_dir} + fi + + if [[ "$MENUCONFIG" = "TRUE" ]] || [[ ! -f $wamr_config_cmake_file ]]; then + echo "MENUCONFIG: [${wamr_config_cmake_file}]" + ./menuconfig.sh -x ${wamr_config_cmake_file} + [ $? -eq 0 ] || exit $? + else + echo "use existing config file: [$wamr_config_cmake_file]" fi - - echo "" - echo "-----------------------------------------------------------------" - echo "select a build platform:" - echo "[1] linux (default)" - echo "More platforms to be add here ..." - - read -a select_platform - - if [ "${select_platform}" = "1" ]; then - PLATFORM="linux" - # TODO: add more platforms - else - PLATFORM="linux" - fi - - echo "" - echo "-----------------------------------------------------------------" - echo "select one or more execution mode of the WAMR runtime" - - enable_interp="y" - enable_jit="n" - enable_aot="n" - - read -p "enable interpreter mode [y]/n: " -a enable_interp - read -p "enable jit mode y/[n]: " -a enable_jit - read -p "enable aot mode y/[n]: " -a enable_aot - - # by default the interpreter mode is selected - if [[ ${enable_interp} != "n" ]] && [[ ${enable_interp} != "N" ]]; then - enable_interp="y" - fi - - if [[ ${enable_interp} != "y" ]] && [[ ${enable_aot} != "y" ]]; - then - echo "WASM Interpreter and AOT must be enabled at least one" - exit 1 - fi - - if [[ ${enable_interp} = "y" ]]; then - MODES[${#MODES[@]}]=interp - fi - if [[ ${enable_jit} = "y" ]] || [[ ${enable_jit} = "Y" ]]; then - MODES[${#MODES[@]}]=jit - fi - if [[ ${enable_aot} = "y" ]] || [[ ${enable_aot} = "Y" ]]; then - MODES[${#MODES[@]}]=aot - fi - - echo "" - echo "-----------------------------------------------------------------" - echo "select a libc support:" - echo "[1] builtin libc (default)" - echo "[2] WebAssembly System Interface (WASI)" - read -a libc_select - - if [ "$libc_select" = "1" ]; then - LIBC_SUPPORT="BUILTIN" - elif [ "$libc_select" = "2" ]; then - LIBC_SUPPORT="WASI" - fi - - echo "" - echo "-----------------------------------------------------------------" - echo "enable app framework? [y]/n" - read -a enable_app - - if [[ "$enable_app" != "n" ]] && [[ "$enable_app" != "N" ]]; then - APP="TRUE" - fi - - if [[ "$APP" = "TRUE" ]]; then - echo "" - echo "-----------------------------------------------------------------" - echo "please input the name of the module you need, seperate by ',' " - echo "type \"all\" if you want to enable all of them" - echo "---------------" - for folder in `ls ${wamr_root_dir}/core/app-framework -F | grep "/$" | grep -v "base" | grep -v "app-native-shared" | grep -v "template"` - do - folder=${folder%*/} - echo "${folder}" - done - echo "---------------" - read -a app_select - - app_select=${app_select},base - app_select=${app_select#,} - OLD_IFS="$IFS" - IFS="," - APP_LIST=($app_select) - IFS="$OLD_IFS" - fi - - set_build_target ${TARGET} - set_build_platform ${PLATFORM} - set_exec_mode "${MODES[*]}" - set_libc_support ${LIBC_SUPPORT} - set_app_module "${APP_LIST[*]}" - set_app_framework ${APP} fi + +mkdir -p ${curr_profile_dir} +mkdir -p ${curr_profile_dir}/app-sdk +mkdir -p ${curr_profile_dir}/runtime-sdk + + if [ "${BUILD_LLVM}" = "TRUE" ]; then if [ ! -d "${wamr_root_dir}/core/deps/llvm" ]; then echo -e "\n" @@ -388,6 +145,29 @@ echo "############## Start to build wasm app sdk ###############" cd ${sdk_root}/app rm -fr build && mkdir build cd build + +# If wgl module is selected, check if the extra SDK include dir is passed by the args, prompt user to input if not. +app_all_selected=`cat ${wamr_config_cmake_file} | grep WAMR_APP_BUILD_ALL` +app_wgl_selected=`cat ${wamr_config_cmake_file} | grep WAMR_APP_BUILD_WGL` + +if [[ -n "${app_wgl_selected}" ]] || [[ -n "${app_all_selected}" ]]; then + if [ -z "${CMAKE_DEXTRA_SDK_INCLUDE_PATH}" ]; then + echo -e "\033[31mWGL module require lvgl config files, please input the path to the lvgl SDK include path:\033[0m" + read -a extra_file_path + + if [[ -z "${extra_file_path}" ]] || [[ ! -d "${extra_file_path}" ]]; then + echo -e "\033[31mThe extra SDK path is invalid, exiting\033[0m" + exit 1 + else + CMAKE_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${extra_file_path}" + fi + fi +fi + +out=`grep WAMR_BUILD_LIBC_WASI ${wamr_config_cmake_file} |grep 1` +if [ -n "$out" ]; then + LIBC_SUPPORT="WASI" +fi if [ "${LIBC_SUPPORT}" = "WASI" ]; then echo "using wasi toolchain" cmake .. $CMAKE_DEXTRA_SDK_INCLUDE_PATH -DWAMR_BUILD_SDK_PROFILE=${PROFILE} -DCONFIG_PATH=${wamr_config_cmake_file} -DCMAKE_TOOLCHAIN_FILE=../wasi_toolchain.cmake @@ -396,8 +176,8 @@ else cmake .. $CMAKE_DEXTRA_SDK_INCLUDE_PATH -DWAMR_BUILD_SDK_PROFILE=${PROFILE} -DCONFIG_PATH=${wamr_config_cmake_file} -DCMAKE_TOOLCHAIN_FILE=../wamr_toolchain.cmake fi [ $? -eq 0 ] || exit $? -make +make if (( $? == 0 )); then echo -e "\033[32mSuccessfully built app-sdk under ${curr_profile_dir}/app-sdk\033[0m" else @@ -407,8 +187,10 @@ fi cd .. rm -fr build - echo -e "\n\n" + + + echo "############## Start to build runtime sdk ###############" cd ${sdk_root}/runtime rm -fr build_runtime_sdk && mkdir build_runtime_sdk @@ -424,21 +206,15 @@ else exit 1 fi -cd .. -rm -fr build_runtime_sdk - -if [ "$APP" = "TRUE" ]; then +APP=`grep WAMR_BUILD_APP_FRAMEWORK ${wamr_config_cmake_file} |grep 1` +if [ -n "$APP" ]; then # Generate defined-symbol list for app-sdk cd ${wamr_app_out_dir}/share cat ${curr_profile_dir}/runtime-sdk/include/*.inl | egrep "^ *EXPORT_WASM_API *[(] *[a-zA-Z_][a-zA-Z0-9_]* *?[)]" | cut -d '(' -f2 | cut -d ')' -f1 > defined-symbols.txt - echo "wasm_register_resource" >> defined-symbols.txt - echo "wasm_response_send" >> defined-symbols.txt - echo "wasm_post_request" >> defined-symbols.txt - echo "wasm_sub_event" >> defined-symbols.txt - echo "wasm_create_timer" >> defined-symbols.txt - echo "wasm_timer_destroy" >> defined-symbols.txt - echo "wasm_timer_cancel" >> defined-symbols.txt - echo "wasm_timer_restart" >> defined-symbols.txt - echo "wasm_get_sys_tick_ms" >> defined-symbols.txt fi + +cd .. +rm -fr build_runtime_sdk + +exit 0 diff --git a/wamr-sdk/menuconfig.sh b/wamr-sdk/menuconfig.sh index 320a3ecd..d8499d74 100755 --- a/wamr-sdk/menuconfig.sh +++ b/wamr-sdk/menuconfig.sh @@ -3,6 +3,118 @@ # Copyright (C) 2019 Intel Corporation. All rights reserved. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +usage () +{ + echo "menuconfig.sh [options]" + echo " -x [config file path name]" + exit 1 +} + + +while getopts "x:" opt +do + case $opt in + x) + wamr_config_cmake_file=$OPTARG + ;; + ?) + echo "Unknown arg: $arg" + usage + exit 1 + ;; + esac +done + + + + +function set_build_target () { + target=$1 + + if [[ "${target}" = "X86_64" ]]; then + echo -e "set (WAMR_BUILD_TARGET \"X86_64\")" >> ${wamr_config_cmake_file} + elif [[ "${target}" = "X86_32" ]]; then + echo -e "set (WAMR_BUILD_TARGET \"X86_32\")" >> ${wamr_config_cmake_file} + else + echo "unknown build target." + exit 1 + fi +} + +function set_build_platform () { + platform=$1 + + if [[ "${platform}" = "linux" ]]; then + echo -e "set (WAMR_BUILD_PLATFORM \"linux\")" >> ${wamr_config_cmake_file} + # TODO: add other platforms + else + echo "${platform} platform currently not supported" + exit 1 + fi +} + +# input: array of selected exec modes [aot jit interp] +function set_exec_mode () { + modes=($1) + + for mode in ${modes[@]} + do + if [[ "$mode" = "aot" ]]; then + echo "set (WAMR_BUILD_AOT 1)" >> ${wamr_config_cmake_file} + elif [[ "$mode" = "jit" ]]; then + echo "set (WAMR_BUILD_JIT 1)" >> ${wamr_config_cmake_file} + BUILD_LLVM="TRUE" + elif [[ "$mode" = "interp" ]]; then + echo "set (WAMR_BUILD_INTERP 1)" >> ${wamr_config_cmake_file} + else + echo "unknown execute mode." + exit 1 + fi + done +} + +function set_libc_support () { + libc=$1 + + if [ "$libc" = "WASI" ]; then + echo "set (WAMR_BUILD_LIBC_WASI 1)" >> ${wamr_config_cmake_file} + else + echo "set (WAMR_BUILD_LIBC_BUILTIN 1)" >> ${wamr_config_cmake_file} + fi +} + +function set_app_framework () { + app_support=$1 + + if [ "$app_support" = "TRUE" ]; then + echo "set (WAMR_BUILD_APP_FRAMEWORK 1)" >> ${wamr_config_cmake_file} + fi +} + +# input: array of selected app modules +function set_app_module () { + modules=($1) + + for module in ${modules[*]} + do + if [ "${module}" = "all" ]; then + cmake_app_list="WAMR_APP_BUILD_ALL" + break + fi + + cmake_app_list="${cmake_app_list} WAMR_APP_BUILD_${module^^}" + done + + # APP module list + if [ -n "${cmake_app_list}" ]; then + echo "set (WAMR_BUILD_APP_LIST ${cmake_app_list# })" >> ${wamr_config_cmake_file} + fi +} + + + + sdk_root=$(cd "$(dirname "$0")/" && pwd) wamr_root=${sdk_root}/.. @@ -28,96 +140,80 @@ do done menuconfig Kconfig +[ $? -eq 0 ] || exit $? if [ ! -e ".config" ]; then exit 0 fi - -args="" -function args_add_bool() -{ - args="${args} -$1" -} - -function args_add_one() -{ - args="${args} -$1 $2" -} - -function args_add_array() -{ - args="${args} -$1 ${2#,}" -} - -profile=`cat .config | grep "^CONFIG_WAMR_SDK_PROFILE"` -profile=${profile#CONFIG_WAMR_SDK_PROFILE=\"} -profile=${profile%*\"} -args_add_one n ${profile} - +# parse platform platform=`cat .config | grep "^CONFIG_PLATFORM"` platform=${platform%*=y} platform=${platform,,} platform=${platform#config_platform_} -if [ -n "${platform}" ]; then - args_add_one p ${platform#config_platform_} -fi +# parse target target=`cat .config | grep "^CONFIG_TARGET"` target=${target%*=y} target=${target#CONFIG_TARGET_} -if [ -n "${target}" ]; then - args_add_one t ${target#CONFIG_TARGET_} -fi - +# parse execution mode modes=`cat .config | grep "^CONFIG_EXEC"` -arg_mode="" +mode_list="" for mode in ${modes} do mode=${mode%*=y} mode=${mode#CONFIG_EXEC_} - arg_mode="${arg_mode},${mode,,}" + mode_list="${mode_list} ${mode,,}" done -if [ -z "${arg_mode}" ]; then +if [ -z "${mode_list}" ]; then echo "execution mode are not selected" exit 1 fi -args_add_array m "${arg_mode}" +# parse libc support libc=`cat .config | grep "^CONFIG_LIBC"` libc=${libc%*=y} if [ "${libc}" = "CONFIG_LIBC_WASI" ]; then - args_add_bool w + libc_support="WASI" +else + libc_support="BUILTIN" fi -app_en=`cat .config | grep "^CONFIG_APP_FRAMEWORK"` -app_en=${app_en%*=y} -app_en=${app_en,,} -if [ -n "${app_en}" ]; then - args_add_bool a +# parse application framework options +app_option=`cat .config | grep "^CONFIG_APP_FRAMEWORK"` +app_option=${app_option%*=y} +app_option=${app_option#CONFIG_APP_FRAMEWORK_} + +if [ "${app_option}" != "DISABLE" ]; then + app_enable="TRUE" + + # Default components + if [ "${app_option}" = "DEFAULT" ]; then + app_list="base connection sensor" + # All components + elif [ "${app_option}" = "ALL" ]; then + app_list="all" + # Customize + elif [ "${app_option}" = "CUSTOM" ]; then + app_option=`cat .config | grep "^CONFIG_APP_BUILD"` + app_list="base" + for app in ${app_option} + do + app=${app%*=y} + app=${app#CONFIG_APP_BUILD_} + app_list="${app_list} ${app,,}" + done + fi fi -apps=`cat .config | grep "^CONFIG_APP_BUILD"` -arg_app="" -for app in ${apps} -do - app=${app%*=y} - app=${app#CONFIG_APP_BUILD_} - arg_app="${arg_app},${app,,}" -done - -if [ -n "${app_en}" ]; then - arg_app="${arg_app},base" - args_add_array l "${arg_app}" +if [[ -f $wamr_config_cmake_file ]]; then + rm $wamr_config_cmake_file fi -extra_path=`cat .config | grep "^CONFIG_EXTRA_INCLUDE_PATH"` -if [ -n "${extra_path}" ]; then - extra_path=${extra_path#CONFIG_EXTRA_INCLUDE_PATH=\"} - extra_path=${extra_path%*\"} - args_add_one e ${extra_path} -fi - -args="-g ${args}" -./build_sdk.sh ${args} \ No newline at end of file +set_build_target ${target} +set_build_platform ${platform} +set_exec_mode "${mode_list[*]}" +set_libc_support ${libc_support} +set_app_module "${app_list[*]}" +set_app_framework ${app_enable} diff --git a/wamr-sdk/wamr_config_default.cmake b/wamr-sdk/wamr_config_default.cmake index ab0c014d..98cc6e9c 100644 --- a/wamr-sdk/wamr_config_default.cmake +++ b/wamr-sdk/wamr_config_default.cmake @@ -7,3 +7,6 @@ set (WAMR_BUILD_LIBC_BUILTIN 1) set (WAMR_BUILD_LIBC_WASI 0) set (WAMR_BUILD_APP_FRAMEWORK 1) set (WAMR_BUILD_APP_LIST WAMR_APP_BUILD_BASE) + +# +# set (EXTRA_SDK_INCLUDE_PATH "")