From 7a0608609fd2de7f9f86763a758eca7abaaf9f89 Mon Sep 17 00:00:00 2001 From: island Date: Fri, 24 Nov 2017 10:42:08 +0800 Subject: [PATCH] component/bt: Add bluetooth example tutorials --- .../gatt_client_example_walkthrough.md | 718 ++++++++++++++ ...ATT_Security_Client_Example_Walkthrough.md | 119 +++ ...ATT_SECURITY_SERVER_EXAMPLE_WALKTHROUGH.md | 229 +++++ .../GATT_SERVER_EXAMPLE_WALKTHROUGH.md | 934 ++++++++++++++++++ .../tutorial/image/GATT SERVER FIGURE 1.png | Bin 0 -> 149897 bytes .../tutorial/image/GATT SERVER FIGURE 2.jpg | Bin 0 -> 4598622 bytes ...erver_Service_Table_Example_Walkthrough.md | 485 +++++++++ ...re representing the Heart Rate Service.pdf | Bin 0 -> 33702 bytes ...nt_Multi-Connection_Example_Walkthrough.md | 326 ++++++ ...ti-connect Client Application Profiles.pdf | Bin 0 -> 36090 bytes ...Multi-connection GATT Client Flowchart.pdf | Bin 0 -> 16489 bytes 11 files changed, 2811 insertions(+) create mode 100644 examples/bluetooth/gatt_client/tutorial/gatt_client_example_walkthrough.md create mode 100644 examples/bluetooth/gatt_security_client/tutorial/GATT_Security_Client_Example_Walkthrough.md create mode 100644 examples/bluetooth/gatt_security_server/tutorial/GATT_SECURITY_SERVER_EXAMPLE_WALKTHROUGH.md create mode 100644 examples/bluetooth/gatt_server/tutorial/GATT_SERVER_EXAMPLE_WALKTHROUGH.md create mode 100644 examples/bluetooth/gatt_server/tutorial/image/GATT SERVER FIGURE 1.png create mode 100644 examples/bluetooth/gatt_server/tutorial/image/GATT SERVER FIGURE 2.jpg create mode 100644 examples/bluetooth/gatt_server_service_table/tutorial/GATT_Server_Service_Table_Example_Walkthrough.md create mode 100644 examples/bluetooth/gatt_server_service_table/tutorial/image/Table-like data structure representing the Heart Rate Service.pdf create mode 100644 examples/bluetooth/gattc_multi_connect/tutorial/GATT_Client_Multi-Connection_Example_Walkthrough.md create mode 100644 examples/bluetooth/gattc_multi_connect/tutorial/image/ESP32 GATT Multi-connect Client Application Profiles.pdf create mode 100644 examples/bluetooth/gattc_multi_connect/tutorial/image/Multi-connection GATT Client Flowchart.pdf diff --git a/examples/bluetooth/gatt_client/tutorial/gatt_client_example_walkthrough.md b/examples/bluetooth/gatt_client/tutorial/gatt_client_example_walkthrough.md new file mode 100644 index 000000000..b42d3deaf --- /dev/null +++ b/examples/bluetooth/gatt_client/tutorial/gatt_client_example_walkthrough.md @@ -0,0 +1,718 @@ +#GATT CLIENT EXAMPLE WALKTHROUGH + +##INTRODUCTION +In this example, the GATT Client example code for the ESP32 is reviewed. This example implements a Bluetooth Low Energy (BLE) Generic Attribute (GATT) client which scans for nearby peripheral servers and connects to a predefined service. The client then searches for available characteristics and subscribes to a known characteristic in order to receive notifications or indications. The example can register an Application Profile and initializes a sequence of events, which can be used to configure Generic Access Profile (GAP) parameters and to handle events such as scanning, connecting to peripherals and reading and writing characteristics. + +#INCLUDES +This example is located in the examples folder of the ESP-IDF under the bluetooth/gatt_client/main directory. The gattc_demo.c file located in the main folder contains all the functionality that we are going to review. The header files contained in gattc_demo.c are: + +```c +#include +#include +#include +#include +#include "nvs.h" +#include "nvs_flash.h" +#include "controller.h" + +#include "bt.h" +#include "esp_gap_ble_api.h" +#include "esp_gattc_api.h" +#include "esp_gatt_defs.h" +#include "esp_bt_main.h" +#include "esp_gatt_common_api.h" +``` + +These "includes" are required for the FreeRTOS and underlaying system components to run, including the logging functionality and a library to store data in non-volatile flash memory. We are interested in `“bt.h”`, `“esp_bt_main.h”`, `"esp_gap_ble_api.h"` and `“esp_gattc_api.h”`, which expose the BLE APIs required to implement this example. + +* `bt.h`: configures the BT controller and VHCI from the host side. +* `esp_bt_main.h`: initializes and enables the Bluedroid stack. +* `esp_gap_ble_api.h`: implements the GAP configuration, such as advertising and connection parameters. +* `esp_gattc_api.h`: implements the GATT Client configuration, such as connecting to peripherals and searching for services. + +##MAIN ENTRY POINT +The program’s entry point is the app_main() function: + +```c +void app_main() +{ + // Initialize NVS. + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK( ret ); + + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + ret = esp_bt_controller_init(&bt_cfg); + if (ret) { + ESP_LOGE(GATTC_TAG, "%s initialize controller failed, error code = %x\n", __func__, ret); + return; + } + + ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM); + if (ret) { + ESP_LOGE(GATTC_TAG, "%s enable controller failed, error code = %x\n", __func__, ret); + return; + } + + ret = esp_bluedroid_init(); + if (ret) { + ESP_LOGE(GATTC_TAG, "%s init bluetooth failed, error code = %x\n", __func__, ret); + return; + } + + ret = esp_bluedroid_enable(); + if (ret) { + ESP_LOGE(GATTC_TAG, "%s enable bluetooth failed, error code = %x\n", __func__, ret); + return; + } + + //register the callback function to the gap module + ret = esp_ble_gap_register_callback(esp_gap_cb); + if (ret){ + ESP_LOGE(GATTC_TAG, "%s gap register failed, error code = %x\n", __func__, ret); + return; + } + + //register the callback function to the gattc module + ret = esp_ble_gattc_register_callback(esp_gattc_cb); + if(ret){ + ESP_LOGE(GATTC_TAG, "%s gattc register failed, error code = %x\n", __func__, ret); + return; + } + + ret = esp_ble_gattc_app_register(PROFILE_A_APP_ID); + if (ret){ + ESP_LOGE(GATTC_TAG, "%s gattc app register failed, error code = %x\n", __func__, ret); + } + + esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500); + if (local_mtu_ret){ + ESP_LOGE(GATTC_TAG, "set local MTU failed, error code = %x", local_mtu_ret); + } + +} +``` + +The main function starts by initializing the non-volatile storage library. This library allows to save key-value pairs in flash memory and is used by some components such as the Wi-Fi library to save the SSID and password: + +```c + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK( ret ); +``` + +##BT CONTROLLER AND STACK INITIALIZATION + +The main function also initializes the BT controller by first creating a BT controller configuration structure named `esp_bt_controller_config_t` with default settings generated by the `BT_CONTROLLER_INIT_CONFIG_DEFAULT()` macro. The BT controller implements the Host Controller Interface (HCI) on the controller side, the Link Layer (LL) and the Physical Layer (PHY). The BT Controller is invisible to the user applications and deals with the lower layers of the BLE stack. The controller configuration includes setting the BT controller stack size, priority and HCI baud rate. With the settings created, the BT controller is initialized and enabled with the `esp_bt_controller_init()` function: + +```c +esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + ret = esp_bt_controller_init(&bt_cfg); +``` + +Next, the controller is enabled in Dual Mode (BLE + BT Classic). + +```c +ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM); +``` + +There are four Bluetooth modes supported: +1. `ESP_BT_MODE_IDLE`: Bluetooth not running +2. `ESP_BT_MODE_BLE`: BLE mode +3. `ESP_BT_MODE_CLASSIC_BT`: BT Classic mode +4. `ESP_BT_MODE_BTDM`: Dual mode (BLE + BT Classic) + +After the initialization of the BT controller, the Bluedroid stack, which includes the common definitions and APIs for both BT Classic and BLE, is initialized and enabled by using: + +```c +ret = esp_bluedroid_init(); +ret = esp_bluedroid_enable(); +``` +The main function ends by registering the GAP and GATT event handlers, as well as the Application Profile and set the maximum supported MTU size. + +```c + //register the callback function to the gap module + ret = esp_ble_gap_register_callback(esp_gap_cb); + + //register the callback function to the gattc module + ret = esp_ble_gattc_register_callback(esp_gattc_cb); + + ret = esp_ble_gattc_app_register(PROFILE_A_APP_ID); + + esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500); + if (local_mtu_ret){ + ESP_LOGE(GATTC_TAG, "set local MTU failed, error code = %x", local_mtu_ret); + } +``` + +The GAP and GATT event handlers are the functions used to catch the events generated by the BLE stack and execute functions to configure parameters of the application. Moreover, the event handlers are also used to handle read and write events coming from the central. The GAP event handler takes care of scanning and connecting to servers and the GATT handler manages events that happen after the client has connected to a server, such as searching for services and writing and reading data. The GAP and GATT event handlers are registered by using: + +```c +esp_ble_gap_register_callback(); +esp_ble_gattc_register_callback(); +``` +The functions `esp_gap_cb()` and `esp_gattc_cb()` handle all the events generated by the BLE stack. + +##APPLICATION PROFILES + +The Application Profiles are a way to group functionalities that are designed for one or more server applications. For example, you can have an Application Profile connected to the Heart Rate Sensors, and another one connected to the Temperature Sensors. Each Application Profile creates a GATT interface to connect to other devices. The Application Profiles in the code are instances of the `gattc_profile_inst` structure, which is defined as: + +```c +struct gattc_profile_inst { + esp_gattc_cb_t gattc_cb; + uint16_t gattc_if; + uint16_t app_id; + uint16_t conn_id; + uint16_t service_start_handle; + uint16_t service_end_handle; + uint16_t char_handle; + esp_bd_addr_t remote_bda; +}; +``` + +The Application Profile structure contains: + * `gattc_cb`: GATT client callback function + * `gattc_if`: GATT client interface number for this profile + * `app_id`: Application Profile ID number + * `conn_id`: Connection ID + * `service_start_handle`: Service start handle + * `service_end_handle`: Service end handle + * `char_handle`: Char handle + * `remote_bda`: Remote device address connected to this client. + +In this example there is one Application Profile and its ID is defined as: + +```c +#define PROFILE_NUM 1 +#define PROFILE_A_APP_ID 0 +``` +The Application Profile are stored in the `gl_profile_tab` array, which is initialized as: + +```c +/* One gatt-based profile one app_id and one gattc_if, this array will store the gattc_if returned by ESP_GATTS_REG_EVT */ +static struct gattc_profile_inst gl_profile_tab[PROFILE_NUM] = { + [PROFILE_A_APP_ID] = { + .gattc_cb = gattc_profile_event_handler, + .gattc_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */ + }, +}; +``` +The initialization of the Application Profile table array includes defining the callback functions for each Profile. These are `gattc_profile_a_event_handler()` and `gattc_profile_a_event_handler()` respectively. In addition, the GATT interface is initialized to the default value of `ESP_GATT_IF_NONE`. Later on, when the Application Profile is registered, the BLE stack returns a GATT interface instance to use with that Application Profile. + +The profile registration triggers an `ESP_GATTC_REG_EVT` event, which is handled by the `esp_gattc_cb()` event handler. The handler takes the GATT interface returned by the event and stores it in the profile table: + +```c +static void esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) +{ + ESP_LOGI(GATTC_TAG, "EVT %d, gattc if %d", event, gattc_if); + + /* If event is register event, store the gattc_if for each profile */ + if (event == ESP_GATTC_REG_EVT) { + if (param->reg.status == ESP_GATT_OK) { + gl_profile_tab[param->reg.app_id].gattc_if = gattc_if; + } else { + ESP_LOGI(GATTC_TAG, "reg app failed, app_id %04x, status %d", + param->reg.app_id, + param->reg.status); + return; + } + } +… +``` + +Finally, the callback function invokes the corresponding event handler for each profile in the `gl_profile_tab` table. + +```c +… +/* If the gattc_if equal to profile A, call profile A cb handler, + * so here call each profile's callback */ + do { + int idx; + for (idx = 0; idx < PROFILE_NUM; idx++) { + if (gattc_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */ + gattc_if == gl_profile_tab[idx].gattc_if) { + if (gl_profile_tab[idx].gattc_cb) { + gl_profile_tab[idx].gattc_cb(event, gattc_if, param); + } + } + } + } while (0); +} +``` +##SETTING SCAN PARAMETERS + +The GATT client normally scans for nearby servers and tries connect to them, if interested. However, in order to perform the scanning, first the configuration parameters need to be set. This is done after the registration of the Application Profiles, because the registration, once completed, triggers an `ESP_GATTC_REG_EVT` event. The first time this event is triggered, the GATT event handler captures it and assigns a GATT interface to Profile A, then the event is forwarded to the GATT event handler of Profile A. One in this event handler, the event is used to call the `esp_ble_gap_set_scan_params()` function, which takes a `ble_scan_params` structure instance as parameter. This structure is defined as: + +```c +/// Ble scan parameters +typedef struct { + esp_ble_scan_type_t scan_type; /*!< Scan type */ + esp_ble_addr_type_t own_addr_type; /*!< Owner address type */ + esp_ble_scan_filter_t scan_filter_policy; /*!< Scan filter policy */ + uint16_t scan_interval; /*!< Scan interval. This is defined + as the time interval from + when the Controller started its + last LE scan until it begins the + subsequent LE scan. + Range: 0x0004 to 0x4000 + Default: 0x0010 (10 ms) + Time = N * 0.625 msec + Time Range: 2.5 msec to 10.24 + seconds*/ + uint16_t scan_window; /*!< Scan window. The duration of + the LE scan. LE_Scan_Window + shall be less than or equal to + LE_Scan_Interval + Range: 0x0004 to 0x4000 + Default: 0x0010 (10 ms) + Time = N * 0.625 msec + Time Range: 2.5 msec to 10240 + msec */ +} esp_ble_scan_params_t; +``` +An it is initialized as: + +```c +static esp_ble_scan_params_t ble_scan_params = { + .scan_type = BLE_SCAN_TYPE_ACTIVE, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + .scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL, + .scan_interval = 0x50, + .scan_window = 0x30 +}; +``` + +The BLE scan parameters are configured so that the type of scanning is active (includes reading the scanning response), it is of public type, allows any advertising device to be read and has a scanning interval of 100 ms (1.25 ms * 0x50) and a scanning window of 60 ms (1.25 ms * 0x30). + +The scan values are set using the `esp_ble_gap_set_scan_params()` function: + +```c +case ESP_GATTC_REG_EVT: + ESP_LOGI(GATTC_TAG, "REG_EVT"); + esp_err_t scan_ret = esp_ble_gap_set_scan_params(&ble_scan_params); + if (scan_ret){ + ESP_LOGE(GATTC_TAG, "set scan params error, error code = %x", scan_ret); + } + break; +``` + +##START SCANNING +Once the scanning parameters are set, an `ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT` event is triggered, which is handled by the GAP event handler `esp_gap_cb()`. This event is used to start the scanning of nearby GATT servers: +```c + case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT: { + //the unit of the duration is second + uint32_t duration = 30; + esp_ble_gap_start_scanning(duration); + break; + } +``` +The scanning is started using the `esp_ble_gap_start_scanning()` function which takes a parameter representing the duration of the continuous scanning (in seconds). Once the scanning period is ended, an `ESP_GAP_SEARCH_INQ_CMPL_EVT` event is triggered. + +##GETTING SCAN RESULTS + +The results of the scanning are displayed as soon as they arrive with the `ESP_GAP_BLE_SCAN_RESULT_EVT` event, which includes the following parameters: + +```c + /** + * @brief ESP_GAP_BLE_SCAN_RESULT_EVT + */ + struct ble_scan_result_evt_param { + esp_gap_search_evt_t search_evt; /*!< Search event type */ + esp_bd_addr_t bda; /*!< Bluetooth device address which + has been searched */ + esp_bt_dev_type_t dev_type; /*!< Device type */ + esp_ble_addr_type_t ble_addr_type; /*!< Ble device address type */ + esp_ble_evt_type_t ble_evt_type; /*!< Ble scan result event type */ + int rssi; /*!< Searched device's RSSI */ + uint8_t ble_adv[ESP_BLE_ADV_DATA_LEN_MAX + ESP_BLE_SCAN_RSP_DATA_LEN_MAX]; /*!< Received EIR */ + int flag; /*!< Advertising data flag bit */ + int num_resps; /*!< Scan result number */ + uint8_t adv_data_len; /*!< Adv data length */ + uint8_t scan_rsp_len; /*!< Scan response length */ + } scan_rst; /*!< Event parameter of + ESP_GAP_BLE_SCAN_RESULT_EVT */ +``` + +This event also includes a list of sub events as shown below: + +```c +/// Sub Event of ESP_GAP_BLE_SCAN_RESULT_EVT +typedef enum { + ESP_GAP_SEARCH_INQ_RES_EVT = 0, /*!< Inquiry result for a peer + device. */ + ESP_GAP_SEARCH_INQ_CMPL_EVT = 1, /*!< Inquiry complete. */ + ESP_GAP_SEARCH_DISC_RES_EVT = 2, /*!< Discovery result for a peer + device. */ + ESP_GAP_SEARCH_DISC_BLE_RES_EVT = 3, /*!< Discovery result for BLE GATT + based service on a peer device. + */ + ESP_GAP_SEARCH_DISC_CMPL_EVT = 4, /*!< Discovery complete. */ + ESP_GAP_SEARCH_DI_DISC_CMPL_EVT = 5, /*!< Discovery complete. */ + ESP_GAP_SEARCH_SEARCH_CANCEL_CMPL_EVT = 6, /*!< Search cancelled */ +} esp_gap_search_evt_t; +``` +We are interested in the `ESP_GAP_SEARCH_INQ_RES_EVT` event, which is called every time a new device is found. We are also interested in the `ESP_GAP_SEARCH_INQ_CMPL_EVT`, which is triggered when the duration of the scanning is completed and can be used to restart the scanning procedure: +```c + case ESP_GAP_BLE_SCAN_RESULT_EVT: { + esp_ble_gap_cb_param_t *scan_result = (esp_ble_gap_cb_param_t *)param; + switch (scan_result->scan_rst.search_evt) { + case ESP_GAP_SEARCH_INQ_RES_EVT: + esp_log_buffer_hex(GATTC_TAG, scan_result->scan_rst.bda, 6); + ESP_LOGI(GATTC_TAG, "searched Adv Data Len %d, Scan Response Len %d", scan_result->scan_rst.adv_data_len, scan_result->scan_rst.scan_rsp_len); + adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, + ESP_BLE_AD_TYPE_NAME_CMPL, &adv_name_len); + ESP_LOGI(GATTC_TAG, "searched Device Name Len %d", adv_name_len); + esp_log_buffer_char(GATTC_TAG, adv_name, adv_name_len); + ESP_LOGI(GATTC_TAG, "\n"); + if (adv_name != NULL) { + if (strlen(remote_device_name) == adv_name_len && strncmp((char *)adv_name, remote_device_name, adv_name_len) == 0) { + ESP_LOGI(GATTC_TAG, "searched device %s\n", remote_device_name); + if (connect == false) { + connect = true; + ESP_LOGI(GATTC_TAG, "connect to the remote device."); + esp_ble_gap_stop_scanning(); + esp_ble_gattc_open(gl_profile_tab[PROFILE_A_APP_ID].gattc_if, scan_result->scan_rst.bda, true); + } + } + } + break; +``` + +First the device name is resolved and compared to the one defined in `remote_device_name`. If it equals to the device name of the GATT Server we are interested in, then the scanning is stopped. + + +##CONNECTING TO A GATT SERVER +Every time we receive a result from the `ESP_GAP_SEARCH_INQ_RES_EVT` event, the code first prints the address of the remote device: + +```c +case ESP_GAP_SEARCH_INQ_RES_EVT: + esp_log_buffer_hex(GATTC_TAG, scan_result->scan_rst.bda, 6); +``` + +The client then prints the advertised data length and the scan response length: + +```c +ESP_LOGI(GATTC_TAG, "searched Adv Data Len %d, Scan Response Len %d", scan_result->scan_rst.adv_data_len, scan_result->scan_rst.scan_rsp_len); +``` + +In order to get the device name, we use the `esp_ble_resolve_adv_data()` function, which takes the advertised data stored in `scan_result->scan_rst.ble_adv`, the type of advertising data and the length, in order to extract the value from the advertising packet frame. Then the device name is printed. + +```c +adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, + ESP_BLE_AD_TYPE_NAME_CMPL, + &adv_name_len); +ESP_LOGI(GATTC_TAG, "searched Device Name Len %d", adv_name_len); +esp_log_buffer_char(GATTC_TAG, adv_name, adv_name_len); +``` + +Finally if the remote device name is the same as we have defined above, the local device stops scanning and tries to open a connection to the remote device using the `esp_ble_gattc_open()` function. This function takes as parameters the Application Profile GATT interface, the remote server address and a boolean value. The boolean value is used to indicate if the connection is done directly or if it’s done in the background (auto-connection), at the moment this boolean value must be set to true in order to establish the connection. Notice that the client opens a virtual connection to the server. The virtual connection returns a connection ID. The virtual connection is the connection between the Application Profile and the remote server. Since many Application Profiles can run on one ESP32, there could be many virtual connection opened to the same remote server. There is also the physical connection which is the actual BLE link between the client and the server. Therefore, if the physical connection is disconnected with the `esp_ble_gap_disconnect()` function, all other virtual connections are closed as well. In this example, each Application Profile creates a virtual connection to the same server with the `esp_ble_gattc_open()` function, so when the close function is called, only that connection from the Application Profile is closed, while if the gap disconnect function is called, both connections will be closed. In addition, connect events are propagated to all profiles because it relates to the physical connection, while open events are propagated only to the profile that creates the virtual connection. + +##CONFIGURING MTU SIZE + +ATT_MTU is defined as the maximum size of any packet sent between a client and a server. When the client connects to the server, it informs the server which MTU size to use by exchanging MTU Request and Response protocol data units (PDUs). This is done after the opening of a connection. After opening the connection, an `ESP_GATTC_CONNECT_EVT` event is triggered: + +```c + case ESP_GATTC_CONNECT_EVT: + //p_data->connect.status always be ESP_GATT_OK + ESP_LOGI(GATTC_TAG, "ESP_GATTC_CONNECT_EVT conn_id %d, if %d, status %d", conn_id, gattc_if, p_data->connect.status); + conn_id = p_data->connect.conn_id; + gl_profile_tab[PROFILE_A_APP_ID].conn_id = p_data->connect.conn_id; + memcpy(gl_profile_tab[PROFILE_A_APP_ID].remote_bda, p_data->connect.remote_bda, sizeof(esp_bd_addr_t)); + ESP_LOGI(GATTC_TAG, "REMOTE BDA:"); + esp_log_buffer_hex(GATTC_TAG, gl_profile_tab[PROFILE_A_APP_ID].remote_bda, sizeof(esp_bd_addr_t)); + esp_err_t mtu_ret = esp_ble_gattc_send_mtu_req (gattc_if, conn_id); + if (mtu_ret){ + ESP_LOGE(GATTC_TAG, "config MTU error, error code = %x", mtu_ret); + } + break; +``` + +The connection ID and the address of the remote device (server) are stored in the Application Profile table and printed to the console: + +```c +conn_id = p_data->connect.conn_id; +gl_profile_tab[PROFILE_A_APP_ID].conn_id = p_data->connect.conn_id; +memcpy(gl_profile_tab[PROFILE_A_APP_ID].remote_bda, p_data->connect.remote_bda, + sizeof(esp_bd_addr_t)); +ESP_LOGI(GATTC_TAG, "REMOTE BDA:"); +esp_log_buffer_hex(GATTC_TAG, gl_profile_tab[PROFILE_A_APP_ID].remote_bda, + sizeof(esp_bd_addr_t)); +``` + +The typical MTU size for a Bluetooth 4.0 connection is 23 bytes. A client can change the size of MUT, using `esp_ble_gattc_send_mtu_req()` function, which takes the GATT interface and the connection ID. The size of the requested MTU is defined by `esp_ble_gatt_set_local_mtu()`. The server can then accept or reject the request. The ESP32 supports a MTU size of up to 517 bytes, which is defined by the `ESP_GATT_MAX_MTU_SIZE` in `esp_gattc_api.h`. In this example, the MTU size is set to 500 bytes. In case the configuration fails, the returned error is printed: + +```c +esp_err_t mtu_ret = esp_ble_gattc_send_mtu_req (gattc_if, conn_id); +if (mtu_ret){ + ESP_LOGE(GATTC_TAG, "config MTU error, error code = %x", mtu_ret); +} +break; +``` + +The connection opening also triggers an ESP_GATTC_OPEN_EVT, which is used to check that the opening of the connection was done successfully, otherwise print an error and exit. + +```c +case ESP_GATTC_OPEN_EVT: + if (param->open.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "open failed, status %d", p_data->open.status); + break; + } +ESP_LOGI(GATTC_TAG, "open success"); +``` + +When the MTU is exchanged, an `ESP_GATTC_CFG_MTU_EVT` is triggered, which in this example is used to print the new MTU size. + +```c +case ESP_GATTC_CFG_MTU_EVT: + if (param->cfg_mtu.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG,"config mtu failed, error status = %x", param->cfg_mtu.status); + } + ESP_LOGI(GATTC_TAG, "ESP_GATTC_CFG_MTU_EVT, Status %d, MTU %d, conn_id %d", param->cfg_mtu.status, param->cfg_mtu.mtu, param->cfg_mtu.conn_id); +… +``` + +##DISCOVERING SERVICES + +The MTU configuration event is also used to start discovering the services available in the server that the client just connected to. To discover the services, the function `esp_ble_gattc_search_service()` is used. The parameters of the function are the GATT interface, the Application Profile connection ID and the UUID of the service application that the client is interested in. The service we are looking for is defined as: + +```c +static esp_bt_uuid_t remote_filter_service_uuid = { + .len = ESP_UUID_LEN_16, + .uuid = {.uuid16 = REMOTE_SERVICE_UUID,}, +}; +``` +Where, + +```c +#define REMOTE_SERVICE_UUID 0x00FF +``` +The services are then discovered as follows: + +```c +esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, &remote_filter_service_uuid); + break; +``` + +The resulting service found, if there is any, will be returned from an `ESP_GATTC_SEARCH_RES_EVT`. For each service found, the event is triggered to print information about the service discovered, depending on the size of the UUID: + +```c + case ESP_GATTC_SEARCH_RES_EVT: { + esp_gatt_srvc_id_t *srvc_id = &p_data->search_res.srvc_id; + conn_id = p_data->search_res.conn_id; + if (srvc_id->id.uuid.len == ESP_UUID_LEN_16 && srvc_id->id.uuid.uuid.uuid16 == +REMOTE_SERVICE_UUID) { + get_server = true; + gl_profile_tab[PROFILE_A_APP_ID].service_start_handle = p_data->search_res.start_handle; + gl_profile_tab[PROFILE_A_APP_ID].service_end_handle = p_data->search_res.end_handle; + ESP_LOGI(GATTC_TAG, "UUID16: %x", srvc_id->id.uuid.uuid.uuid16); + } + break; +``` + +In case that the client finds the service that it is looking for, the flag get_server is set to true, and the start handle value and end handle value, which will be used later to get all the characteristics of that service, are saved. After all service results are returned, the search is completed and an `ESP_GATTC_SEARCH_CMPL_EVT` event is triggered. + +##GETTING CHARACTERISTICS + +This examples implements getting characteristic data from a predefined service. The service that we want the characteristics from has an UUID of 0x00FF, and the characteristic we are interested in has an UUID of 0xFF01: + +```c +#define REMOTE_NOTIFY_CHAR_UUID 0xFF01 +``` +A service is defined using the `esp_gatt_srvc_id_t` structure as: + +```c +/** + * @brief Gatt id, include uuid and instance id + */ +typedef struct { + esp_bt_uuid_t uuid; /*!< UUID */ + uint8_t inst_id; /*!< Instance id */ +} __attribute__((packed)) esp_gatt_id_t; +``` + +In this example, we define the service that we want to get the characteristics from as: + +```c +static esp_gatt_srvc_id_t remote_service_id = { + .id = { + .uuid = { + .len = ESP_UUID_LEN_16, + .uuid = {.uuid16 = REMOTE_SERVICE_UUID,}, + }, + .inst_id = 0, + }, + .is_primary = true, +}; +``` + +Once defined, we can get the characteristics from that service using the `esp_ble_gattc_get_characteristic()` function, which is called in the `ESP_GATTC_SEARCH_CMPL_EVT` event after the search for services is completed and the client has found the service that it was looking for. + +```c + case ESP_GATTC_SEARCH_CMPL_EVT: + if (p_data->search_cmpl.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "search service failed, error status = %x", p_data->search_cmpl.status); + break; + } + conn_id = p_data->search_cmpl.conn_id;h + if (get_server){ + uint16_t count = 0; + esp_gatt_status_t status = esp_ble_gattc_get_attr_count( gattc_if, + p_data->search_cmpl.conn_id,ESP_GATT_DB_CHARACTERISTIC, gl_profile_tab[PROFILE_A_APP_ID].service_start_handle, gl_profile_tab[PROFILE_A_APP_ID].service_end_handle, + INVALID_HANDLE, + &count); + if (status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_attr_count error"); + } + + if (count > 0){ + char_elem_result = (esp_gattc_char_elem_t*)malloc + (sizeof(esp_gattc_char_elem_t) * count); + if (!char_elem_result){ + ESP_LOGE(GATTC_TAG, "gattc no mem"); + }else{ + status = esp_ble_gattc_get_char_by_uuid( gattc_if, + p_data->search_cmpl.conn_id, + gl_profile_tab[PROFILE_A_APP_ID].service_start_handle, + gl_profile_tab[PROFILE_A_APP_ID].service_end_handle, + remote_filter_char_uuid, + char_elem_result, + &count); + if (status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_char_by_uuid error"); + } + + /* Every service have only one char in our 'ESP_GATTS_DEMO' demo, + so we used first 'char_elem_result' */ + if (count > 0 && (char_elem_result[0].properties + &ESP_GATT_CHAR_PROP_BIT_NOTIFY)){ + gl_profile_tab[PROFILE_A_APP_ID].char_handle = + char_elem_result[0].char_handle; + esp_ble_gattc_register_for_notify (gattc_if, + gl_profile_tab[PROFILE_A_APP_ID].remote_bda, + char_elem_result[0].char_handle); + } + } + /* free char_elem_result */ + free(char_elem_result); + }else{ + ESP_LOGE(GATTC_TAG, "no char found"); + } } + break; +``` + +`esp_ble_gattc_get_attr_count()` gets the attribute count with the given service or characteristic in the gattc cache. The parameters of `esp_ble_gattc_get_attr_count()` function are the GATT interface, the connection ID, the attribute type defined in `esp_gatt_db_attr_type_t`, the attribute start handle, the attribute end handle, the characteristic handle (this parameter is only valid when the type is set to `ESP_GATT_DB_DESCRIPTOR`.) and output the number of attribute has been found in the gattc cache with the given attribute type. Then we allocate a buffer to save the char information for `esp_ble_gattc_get_char_by_uuid()` function. The function finds the characteristic with the given characteristic UUID in the gattc cache. It just gets characteristic from local cache, instead of the remote devices. In a server, there might be more than one chars sharing the same UUID. However, in our gatt_server demo, every char has an unique UUID and that’s why we only use the first char in `char_elem_result`, which is the pointer to the characteristic of the service. Count initially stores the number of the characteristics that the client wants to find, and will be updated with the number of the characteristics that have been actually found in the gattc cache with `esp_ble_gattc_get_char_by_uuid`. + +##REGISTERING FOR NOTIFICATIONS + +The client can register to receive notifications from the server every time the characteristic value changes. In this example, we want to register for notifications of the characteristic identified with an UUID of 0xff01. After getting all the characteristics, we check the properties of the received characteristic, then use the `esp_ble_gattc_register_for_notify()` function to register notifications. The function arguments are the GATT interface, the address of the remote server, and the handle we want to register for notifications. + +```c +… +/* Every service have only one char in our 'ESP_GATTS_DEMO' demo, so we used first 'char_elem_result' */ + if(count > 0 && (char_elem_result[0].properties & + ESP_GATT_CHAR_PROP_BIT_NOTIFY)){ + gl_profile_tab[PROFILE_A_APP_ID].char_handle = + char_elem_result[0].char_handle; + esp_ble_gattc_register_for_notify (gattc_if, + gl_profile_tab[PROFILE_A_APP_ID].remote_bda, + char_elem_result[0].char_handle); + } +… +``` + +This procedure registers notifications to the BLE stack, and triggers an `ESP_GATTC_REG_FOR_NOTIFY_EVT`. This event is used to write to the server Client Configuration Descriptor: + +```c + case ESP_GATTC_REG_FOR_NOTIFY_EVT: { + ESP_LOGI(GATTC_TAG, "ESP_GATTC_REG_FOR_NOTIFY_EVT"); + if (p_data->reg_for_notify.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "REG FOR NOTIFY failed: error status = %d", + p_data->reg_for_notify.status); + }else{ + uint16_t count = 0; + uint16_t notify_en = 1; + esp_gatt_status_t ret_status = esp_ble_gattc_get_attr_count( gattc_if, + gl_profile_tab[PROFILE_A_APP_ID].conn_id, + ESP_GATT_DB_DESCRIPTOR, + gl_profile_tab[PROFILE_A_APP_ID].service_start_handle, + gl_profile_tab[PROFILE_A_APP_ID].service_end_handle, + gl_profile_tab[PROFILE_A_APP_ID].char_handle, + &count); + if (ret_status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_attr_count error"); + } + if (count > 0){ + descr_elem_result = malloc(sizeof(esp_gattc_descr_elem_t) * count); + if (!descr_elem_result){ + ESP_LOGE(GATTC_TAG, "malloc error, gattc no mem"); + }else{ + ret_status = esp_ble_gattc_get_descr_by_char_handle( gattc_if, + gl_profile_tab[PROFILE_A_APP_ID].conn_id, + p_data->reg_for_notify.handle, + notify_descr_uuid, + descr_elem_result, + &count); + if (ret_status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_descr_by_char_handle + error"); + } + + /* Erery char have only one descriptor in our 'ESP_GATTS_DEMO' demo, so we used first 'descr_elem_result' */ + if (count > 0 && descr_elem_result[0].uuid.len == ESP_UUID_LEN_16 && +descr_elem_result[0].uuid.uuid.uuid16 == ESP_GATT_UUID_CHAR_CLIENT_CONFIG){ + ret_status = esp_ble_gattc_write_char_descr( gattc_if, + gl_profile_tab[PROFILE_A_APP_ID].conn_id, + descr_elem_result[0].handle, + sizeof(notify_en), + (Uint8 *)¬ify_en, + ESP_GATT_WRITE_TYPE_RSP, + ESP_GATT_AUTH_REQ_NONE); + } + + if (ret_status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "esp_ble_gattc_write_char_descr error"); + } + + /* free descr_elem_result */ + free(descr_elem_result); + } + } + else{ + ESP_LOGE(GATTC_TAG, "decsr not found"); + } + + } + break; + } +``` + +The event is used to first print the notification register status and the service and characteristic UUIDs of the just registered notifications. The client then writes to the Client Configuration Descriptor by using the `esp_ble_gattc_write_char_descr()` function. There are many characteristic descriptors defined in the Bluetooth specification. However, in this case we are interested in writing to the descriptor that deals with enabling notifications, which is the Client Configuration descriptor. In order to pass this descriptor as parameter, we first define it as: + +```c +static esp_gatt_id_t notify_descr_id = { + .uuid = { + .len = ESP_UUID_LEN_16, + .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,}, + }, + .inst_id = 0, +}; +``` +Where `ESP_GATT_UUID_CHAR_CLIENT_CONFIG` is defined with the UUID to identify the Characteristic Client Configuration: + +```c +#define ESP_GATT_UUID_CHAR_CLIENT_CONFIG 0x2902 /* Client Characteristic Configuration */ +``` +The value to write is “1” to enable notifications. We also pass `ESP_GATT_WRITE_TYPE_RSP` to request that the server responds to the request of enabling notifications and `ESP_GATT_AUTH_REQ_NONE` to indicate that the Write request does not need authorization. + + + +##CONCLUSION + +We have reviewed the GATT Client example code for the ESP32. This example scans for nearby devices and searches for services and characteristics of servers of interest. When the server of interest is found, a connection is made with that server and a search for services is performed. Finally, the client looks for a specific characteristic in the services found, if found, gets the characteristic value and registers for notifications to that characteristic. This is done by registering one Application Profile and following a sequence of events to configure the GAP and GATT parameters required. + diff --git a/examples/bluetooth/gatt_security_client/tutorial/GATT_Security_Client_Example_Walkthrough.md b/examples/bluetooth/gatt_security_client/tutorial/GATT_Security_Client_Example_Walkthrough.md new file mode 100644 index 000000000..ebb9ee59f --- /dev/null +++ b/examples/bluetooth/gatt_security_client/tutorial/GATT_Security_Client_Example_Walkthrough.md @@ -0,0 +1,119 @@ +# GATT Security Client Example Walkthrough + + + +## Introduction + +This documents presents a review of the GATT Security Client code example for the ESP32. The GATT Client is capable of scanning for nearby devices and once it has found a device of interest, it requests a secure connection. The GATT client behaves as a master device that initiates a connection to a slave by sending a *Pairing Request* as specified by the [Bluetooth Core Specification Version 4.2](https://www.bluetooth.com/specifications/bluetooth-core-specification). The remote slave device is normally a GATT Server that exposes Services and Characteristics. The slave replies with a *Pairing Response* followed by authentication and exchange of keys. If the bonding process is also executed, the Long Term Keys are stored for subsequent connections. Finally an encrypted channel is established which can support protection against Man-In-The-Middle (MITM) attacks depending on the security configuration. The code is implemented using an Application Profile that upon registration, allows to set the local privacy configuration as events are triggered during the lifetime of the program. + +This document only includes a description of the security aspects of the GATT Client implementation, for a review of how to define the functionality of the GATT client such as scanning parameters and opening connections please refer to **GATT Client Example Walkthrough**. + +## Configuring Local Privacy of the Security Client + +The example registers one Application Profile defined as: + +``` +#define PROFILE_NUM 1 +#define PROFILE_A_APP_ID 0 +``` + +The registration takes place in the ``app_main()`` function by using the ``esp_ble_gattc_app_register()`` function: + +``` +… +ret = esp_ble_gattc_app_register(PROFILE_A_APP_ID); + if (ret){ + ESP_LOGE(GATTC_TAG, "%s gattc app register error, error code = %x\n", __func__, ret); + } +… +``` + +The Application Profile registration triggers an ``ESP_GATTC_REG_EVT`` event which is managed by the ``esp_gattc_cb()`` callback function and forwarded to the Profile A event handler ``gattc_profile_event_handler()``. Here, the event is used to configure the local privacy of the slave device by using the ``esp_ble_gap_config_local_privacy()`` function. + +``` +case ESP_GATTC_REG_EVT: + ESP_LOGI(GATTC_TAG, "REG_EVT"); + esp_ble_gap_config_local_privacy(true); + break; +``` + +This function is a Bluedroid API call for configuring default privacy settings on the local device. Once the privacy is set, an ``ESP_GAP_BLE_SET_LOCAL_PRIVACY_COMPLETE_EVT`` is triggered which is used to set scan parameters and start scanning for nearby peripherals: + +``` + case ESP_GAP_BLE_SET_LOCAL_PRIVACY_COMPLETE_EVT: + if (param->local_privacy_cmpl.status != ESP_BT_STATUS_SUCCESS){ + ESP_LOGE(GATTC_TAG, "config local privacy failed, error code =%x", param->local_privacy_cmpl.status); + break; + } + esp_err_t scan_ret = esp_ble_gap_set_scan_params(&ble_scan_params); + if (scan_ret){ + ESP_LOGE(GATTC_TAG, "set scan params error, error code = %x", scan_ret); + } + break; + case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT: { + //the unit of the duration is second + uint32_t duration = 30; + esp_ble_gap_start_scanning(duration); + break; + } + case ESP_GAP_BLE_SCAN_START_COMPLETE_EVT: + //scan start complete event to indicate scan start successfully or failed + if (param->scan_start_cmpl.status != ESP_BT_STATUS_SUCCESS) { + ESP_LOGE(GATTC_TAG, "scan start failed, error status = %x", param->scan_start_cmpl.status); + break; + } + ESP_LOGI(GATTC_TAG, "Scan start success"); + break; +``` + +## Configuring and Bonding to a Slave Device + +The rest of the configuration for the GATT Client is performed normally in the same way as the regular GATT Client example. That is, the client finds a device of interest and opens a connection. At this point the GATT client, which is usually the master, initiates the pairing process by sending a Pairing Request to the slave device. This request should be acknowledged with a Pairing Response. The Pairing process is implemented automatically by the stack and no extra user configuration is needed. However, depending on the I/O capabilities of both devices, a passkey might be generated on the ESP32 which is presented to the user with the ``ESP_GAP_BLE_PASSKEY_NOTIF_EVT``: + +``` + case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: ///the app will receive this evt when the IO has Output capability and the peer device IO has Input capability. + ///show the passkey number to the user to input it in the peer deivce. + ESP_LOGE(GATTS_TABLE_TAG, "The passkey Notify number:%d", param->ble_security.key_notif.passkey); + break; + +``` +The combination of input and output capabilities that determine which algorithm is used are: + + | Display Only | Display Yes/No|Keyboard Only|No Input No Output|Keyboard Display| +--------------------|------------------|-----------------------|--------------------|------------------|-----------------------| +Display Only | Just Works| Just Works|Passkey Entry|Just Works|Passkey Entry| +Display Yes/No |Just Works|Just Works|Passkey Entry|Just Works|Passkey Entry| +Keyboard Only |Passkey Entry |Passkey Entry|Passkey Entry|Just Works|Passkey Entry| +No Input No Output| Just Works|Just Works|Just Works|Just Works|Just Works| +Keyboard Display|Passkey Entry|Passkey Entry|Passkey Entry|Just Works|Passkey Entry| + +In the Just Works method, the Temporary Key is set to 0. This is a practical way to authenticate devices when no display or keyboards are attached to them, so that there is no way to show or enter a passkey. However, if the ESP32 GATT Client has an LCD, it can present the passkey generated locally so that the user can input it on the other peer device, or if the GATT Client has a keyboard, it can input the passkey generated by the other peer device. Additionally, a numeric comparison can be performed if both devices have a display and yes/no confirm buttons and LE Secure Connections are used, that way an independently generated passkey is displayed on both devices and the user manually checks that both 6-digit confirmation values match. + +## Exchanging Keys + +When the client connects to a remote device and the pairing is done successfully, the initiator and responder keys are exchanged. For each key exchange message, an ``ESP_GAP_BLE_KEY_EVT`` event is triggered which can be used to print the type of key received: + +``` +case ESP_GAP_BLE_KEY_EVT: + //shows the ble key info share with peer device to the user. + ESP_LOGI(GATTS_TABLE_TAG, "key type = %s", esp_key_type_to_str(param->ble_security.ble_key.key_type)); + break; +``` + +When the keys are exchanged successfully, the pairing process is completed and encryption of payload data can be started using the AES-128 engine. This triggers an ``ESP_GAP_BLE_AUTH_CMPL_EVT`` event which is used to print information: + +``` +case ESP_GAP_BLE_AUTH_CMPL_EVT: { + esp_bd_addr_t bd_addr; + memcpy(bd_addr, param->ble_security.auth_cmpl.bd_addr, sizeof(esp_bd_addr_t)); + ESP_LOGI(GATTS_TABLE_TAG, "remote BD_ADDR: %08x%04x",\ + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); + ESP_LOGI(GATTS_TABLE_TAG, "address type = %d", param->ble_security.auth_cmpl.addr_type); + ESP_LOGI(GATTS_TABLE_TAG, "pair status = %s",param->ble_security.auth_cmpl.success ? "success" : "fail"); + break; +``` + +## Conclusion + +In this document, a review of the security aspects of the GATT Client has been realized. BLE security encompasses Pairing, Bonding and Encryption. In order to establish a secure link between a master and a slave device, the local privacy of the GATT client is set, which allows the BLE stack to set necessary security parameters automatically without the need of additional user configuration. The combination of features and capabilities of the peer devices results in the selection of the appropriate pairing method which the BLE stack then executes. Immediately, the required keys are generated and exchanged and the encryption of subsequent messages is started using the AES-128 engine. These steps trigger different events that are managed by the GATT and GAP event handlers which can be used to print useful information such as the types of keys exchanged and the pairing status. The rest of the security GATT client functionality such as registering for notifications of characteristics is implemented in the same way as in **GATT Client Example Walkthrough**. \ No newline at end of file diff --git a/examples/bluetooth/gatt_security_server/tutorial/GATT_SECURITY_SERVER_EXAMPLE_WALKTHROUGH.md b/examples/bluetooth/gatt_security_server/tutorial/GATT_SECURITY_SERVER_EXAMPLE_WALKTHROUGH.md new file mode 100644 index 000000000..dfedfbd87 --- /dev/null +++ b/examples/bluetooth/gatt_security_server/tutorial/GATT_SECURITY_SERVER_EXAMPLE_WALKTHROUGH.md @@ -0,0 +1,229 @@ +#GATT SECURITY SERVER EXAMPLE WALKTHROUGH + +##INTRODUCTION + +In this document, a description of the security GATT Server BLE example for the ESP32 is presented. The security configuration enables a GATT Server acting as a slave device to bond with a master and establish an encrypted link between them. This functionality is defined by the [Bluetooth Specification version 4.2](https://www.bluetooth.com/specifications/bluetooth-core-specification) and implemented on the ESP-IDF BLE stack, specifically on the Security Manager Protocol (SMP) API. + +BLE security involves three interrelated concepts: pairing, bonding and encryption. Pairing concerns with the exchange of security features and types of keys needed. In addition, the pairing procedure takes care of the generation and exchange of shared keys. The core specification defines the legacy pairing and Secure Connections pairing (introduced in Bluetooth 4.2), which are both supported by ESP32. Once the exchange of shared keys is completed, a temporary encrypted link is established to exchange short term and long term keys. Bonding refers to storing the exchanged keys for subsequent connections so that they do not have to be transmitted again. Finally, encryption pertains to the ciphering of plain text data using the AES-128 engine and the shared keys. Server attributes may also be defined to allow only encrypted write and read messages. At any point of the communication, a slave device can always ask to start encryption by issuing a security request to the other peer device, which returns a security response by calling an API. + +This document only describes the security configuration. The rest of the GATT server functionalities, such as defining the service table, are explained in the GATT Server example walkthrough documentation. For a better understanding of this example workflow, it is recommended that the reader is familiar with the pairing feature exchange and key generation defined in the section 3.5 of the [Bluetooth Specification Version 4.2](https://www.bluetooth.com/specifications/bluetooth-core-specification) [Vol 3, Part H]. + +##SETTING SECURITY PARAMETERS + +The ESP32 requires a series of security parameters in order to define how the pairing request and response are going to be built. The Pairing Response packet built by the GATT Server includes fields such as the input/output capabilities, Secure Connections pairing, authenticated Man-In-The-Middle (MITM) protection or no security requirements (see Section 2.3.1 of the [Bluetooth Specification Version 4.2](https://www.bluetooth.com/specifications/bluetooth-core-specification) [Vol 3, Part H]). In this example, this procedure is done in the `app_main()` function. The pairing request is sent by the initiator which in this case is a remote GATT client. The ESP32 server implemented in this example receives this request and replies with a pairing response, which contains the same security parameters in order for both devices to agree on the resources available and the applicable pairing algorithm (*Just Works* or *Passkey Entry*). Both the pairing request and response commands have the following parameters: + +* *IO Capability*: describes if the device has input/output capabilities such as a display or a keyboard. +* *OOB Flag*: describes if the device supports Out of Band passkey exchange, for example using NFC or Wi-Fi to exchange keys as TKs. Currently, the ESP32 does not support this feature. +* *Authorization Request*: indicates the requested security properties such as Bonding, Secure Connections (SC), MITM protection or none that will be present in the Pairing Request and Response packets. +* *Maximum Encryption Key Size*: maximum encryption key size in octets. +* *Initiator Key Distribution/Generation*: indicates which keys the initiator is requesting to distribute/generate or use during the Transport Specific Key Distribution phase. In the pairing request, these keys are requested, while in the pairing response, these keys are confirmed to be distributed. +* *Responder Key Distribution/Generation*: indicates which keys the initiator is requesting the responder to distribute/generate or use during the Transport Specific Key Distribution phase. In the pairing request, these keys are requested, while in the pairing response, these keys are confirmed to be distributed. + +In code, these parameters are defined as follows: + +* *IO Capability*: + +```c +esp_ble_io_cap_t iocap = ESP_IO_CAP_NONE;//set the IO capability to No Input No Output +``` + +The possible values for *IO Capabilities* are: + +```c +ESP_IO_CAP_OUT 0 /*!< DisplayOnly */ +ESP_IO_CAP_IO 1 /*!< DisplayYesNo */ +ESP_IO_CAP_IN 2 /*!< KeyboardOnly */ +ESP_IO_CAP_NONE 3 /*!< NoInputNoOutput */ +ESP_IO_CAP_KBDISP 4 /*!< Keyboard display */ +``` + +* *Authorization Request*: + +```c +esp_ble_auth_req_t auth_req = ESP_LE_AUTH_BOND; +//bonding with peer device after authentication +``` + +The possible values for *Authorization Request* are a combination of Bonding, MITM protection and Secure Connections requests: + +```c +ESP_LE_AUTH_NO_BOND: No bonding. +ESP_LE_AUTH_BOND: Bonding is performed. +ESP_LE_AUTH_REQ_MITM: MITM Protection is enabled. +ESP_LE_AUTH_REQ_SC_ONLY: Secure Connections without bonding enabled. +ESP_LE_AUTH_REQ_SC_BOND: Secure Connections with bonding enabled. +ESP_LE_AUTH_REQ_SC_MITM: Secure Connections with MITM Protection and no bonding enabled. +ESP_LE_AUTH_REQ_SC_MITM_BOND: Secure Connections with MITM Protection and bonding enabled. +``` + +* *Maximum Encryption Key Size*: + +```c +uint8_t key_size = 16; //the key size should be 7~16 bytes +``` + +* *Initiator Key Distribution/Generation*: + +```c +uint8_t init_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK; +``` + +The initiator distributes the LTK and IRK keys by the setting the EncKey and IdKey masks. + +* *Responder Key Distribution/Generation*: + +```c +uint8_t rsp_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK; +``` + +The responder distributes the LTK and IRK keys by the setting the *EncKey* and *IdKey* masks. + +Once defined, the parameters are set using the `esp_ble_gap_set_security_param()` function. This function sets the parameter type, the parameter value and the parameter length: + +```c +esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &auth_req, sizeof(uint8_t)); +esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &iocap, sizeof(uint8_t)); +esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &key_size, sizeof(uint8_t)); +esp_ble_gap_set_security_param(ESP_BLE_SM_SET_INIT_KEY, &init_key, sizeof(uint8_t)); +esp_ble_gap_set_security_param(ESP_BLE_SM_SET_RSP_KEY, &rsp_key, sizeof(uint8_t)); +``` + +This information is enough for the BLE stack to perform the pairing process, including pairing confirmation and key generation. The procedure is invisible to the user and executed automatically by the stack. + +##CONNECTING AND BONDING TO A PEER DEVICE + +The security parameters set previously are stored locally to be used later when the master device connects to the slave. Every time a remote device connects to the local GATT server, the connection event `ESP_GATTS_CONNECT_EVT` is triggered. This event is employed to perform the pairing and bonding process by invoking the `esp_ble_set_encryption()` function which takes as parameters the remote device address and the type of encryption that will be performed. The BLE stack then executes the actual pairing process in the background. In this example, the encryption includes MITM protection. + +```c +case ESP_GATTS_CONNECT_EVT: + //start security connect with peer device when receive the connect event sent by the master. + esp_ble_set_encryption(param->connect.remote_bda, ESP_BLE_SEC_ENCRYPT_MITM); + break; +``` +The types of encryptions available are: + +* `ESP_BLE_SEC_NONE` +* `ESP_BLE_SEC_ENCRYPT` +* `ESP_BLE_SEC_ENCRYPT_NO_MITM` +* `ESP_BLE_SEC_ENCRYPT_MITM` + +The difference between `ESP_BLE_SEC_ENCRYPT` and `ESP_BLE_SEC_ENCRYPT_NO_MITM` lies in the fact that a previous connection might have a security level that needs to be upgraded, therefore requires to exchange keys again. + +In this example, the I/O capabilities are set to *No Input No Output*, therefore the *Just Works* pairing method, which doesn't not require the generation of a random 6-digit passkey, is used(For details, please refer to the the table below.) The user may modify the example to set the I/O capabilities to use other than *No Input No Output*. Therefore, depending on the I/O capabilities of the remote device, a passkey might be generated on the ESP32 which is presented to the user with the `ESP_GAP_BLE_PASSKEY_NOTIF_EVT`: + +```c +case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: + ///the app will receive this evt when the IO has Output capability and the peer device IO has Input capability. + ///show the passkey number to the user to input it in the peer deivce. + ESP_LOGE(GATTS_TABLE_TAG, "The passkey Notify number:%d", param->ble_security.key_notif.passkey); + break; +``` + +The combination of input and output capabilities that determine which algorithm is used are: + + +##EXCHANGING KEYS + +When the client connects to the server and the pairing is done successfully, the keys indicated by the `init_key` and `rsp_key` security parameters are exchanged. In this example the following keys are generated and distributed: + +* Local device LTK +* Local device IRK +* Local device CSRK +* Peer device LTK +* Peer device IRK + +Note that for this example only, the peer device CSRK is not exchanged. For each key exchange message, an `ESP_GAP_BLE_KEY_EVT` event is triggered, which can be used to print the type of key received: + +```c +case ESP_GAP_BLE_KEY_EVT: + //shows the ble key info share with peer device to the user. + ESP_LOGI(GATTS_TABLE_TAG, "key type = %s", esp_key_type_to_str(param->ble_security.ble_key.key_type)); + break; +``` + +When the keys are exchanged successfully, the pairing process is done. This triggers an `ESP_GAP_BLE_AUTH_CMPL_EVT` event, which is used to print information such as remote device, address type and pair status: + +```c +case ESP_GAP_BLE_AUTH_CMPL_EVT: { + esp_bd_addr_t bd_addr; + memcpy(bd_addr, param->ble_security.auth_cmpl.bd_addr, + sizeof(esp_bd_addr_t)); + ESP_LOGI(GATTS_TABLE_TAG, "remote BD_ADDR: %08x%04x",\ + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); + ESP_LOGI(GATTS_TABLE_TAG, "address type = %d", + param->ble_security.auth_cmpl.addr_type); + ESP_LOGI(GATTS_TABLE_TAG, "pair status = %s", + param->ble_security.auth_cmpl.success ? "success" : "fail"); + break; +} +``` + +##SECURITY PERMISSIONS FOR ATTRIBUTES + +When defining the attributes of the server, different permissions can be set to the write and read events. Attributes permissions can be: + +* Permission to read +* Permission to read with encryption +* Permission to read with encryption and MITM protection +* Permission to write +* Permission to write with encryption +* Permission to write with encryption and MITM protection +* Permission to signed write +* Permission to signed write with MITM protection + +These permissions are defined in the API as: + +* `ESP_GATT_PERM_READ` +* `ESP_GATT_PERM_READ_ENCRYPTED` +* `ESP_GATT_PERM_READ_ENC_MITM` +* `ESP_GATT_PERM_WRITE` +* `ESP_GATT_PERM_WRITE_ENCRYPTED` +* `ESP_GATT_PERM_WRITE_ENC_MITM` +* `ESP_GATT_PERM_WRITE_SIGNED` +* `ESP_GATT_PERM_WRITE_SIGNED_MITM` + +When creating the services table, each attribute can have permissions to read or write, with or without encryption. When an attribute has encrypted permissions and a peer device that does not have the required security clearance tries to read or write to that attribute, the local host sends an Insufficient Authorization Error. In the example, the following attributes are defined with permissions with encryption: + +```c +… +// Body Sensor Location Characteristic Value + [HRS_IDX_BOBY_SENSOR_LOC_VAL] = { + {ESP_GATT_AUTO_RSP}, + {ESP_UUID_LEN_16, + (uint8_t *)&body_sensor_location_uuid, + ESP_GATT_PERM_READ_ENCRYPTED, + sizeof(uint8_t), + sizeof(body_sensor_loc_val), + (uint8_t *)body_sensor_loc_val} + }, +… +// Heart Rate Control Point Characteristic Value + [HRS_IDX_HR_CTNL_PT_VAL] = { + {ESP_GATT_AUTO_RSP}, + {ESP_UUID_LEN_16, + (uint8_t *)&heart_rate_ctrl_point, + ESP_GATT_PERM_WRITE_ENCRYPTED|ESP_GATT_PERM_READ_ENCRYPTED, + sizeof(uint8_t), + sizeof(heart_ctrl_point), + (uint8_t *)heart_ctrl_point} + }, +… +``` + +##SECURITY REQUESTS + +During the communication between a master and a slave device, the slave might request to start encryption at any moment by issuing a security request command. This command will trigger an `ESP_GAP_BLE_SEC_REQ_EVT` event on the master, which will reply a positive (true) security response to the peer device to accept the request or a negative (false) one to reject the request. In this example, this event is used to reply a start encryption response by using the `esp_ble_gap_security_rsp()` API call. + +```c + case ESP_GAP_BLE_SEC_REQ_EVT: + /* send the positive (true) security response to the peer device to accept the security request. + If not accept the security request, should sent the security response with negative(false) accept value*/ + esp_ble_gap_security_rsp(param->ble_security.ble_req.bd_addr, true); + break; +``` +##CONCLUSION + +In this document, a review of the security aspects of the GATT Server has been realized. BLE security encompasses Pairing, Bonding and Encryption. In order to establish a secured link between a master and a slave device, security parameters that define the capabilities and features each device possess are set. The combination of features and capabilities of the peer devices results in the selection of the appropriate pairing method which the BLE stack then executes. Immediately, the required keys are generated and exchanged, and the encryption of subsequent messages is started using the AES-128 engine and these keys. These steps trigger different events that are managed by the GATT and GAP event handlers which can be used to print useful information such as the types of keys exchanged and the pairing status. In addition, attribute permissions are appointed to allow only encrypted read and write events when needed. The rest of the Security GATT server functionalities such as defining services and characteristics are implemented in the same way as presented in the GATT Server example. + diff --git a/examples/bluetooth/gatt_server/tutorial/GATT_SERVER_EXAMPLE_WALKTHROUGH.md b/examples/bluetooth/gatt_server/tutorial/GATT_SERVER_EXAMPLE_WALKTHROUGH.md new file mode 100644 index 000000000..12ff4e8c6 --- /dev/null +++ b/examples/bluetooth/gatt_server/tutorial/GATT_SERVER_EXAMPLE_WALKTHROUGH.md @@ -0,0 +1,934 @@ +# GATT SERVER EXAMPLE WALKTHROUGH +##INTRODUCTION +In this document, we review the GATT SERVER example code which implements a Bluetooth Low Energy (BLE) Generic Attribute Profile (GATT) Server on the ESP32. This example is designed around two Application Profiles and a series of events that are handled in order to execute a sequence of configuration steps, such as defining advertising parameters, updating connection parameters and creating services and characteristics. In addition, this example handles read and write events, including a Write Long Characteristic request, which divides the incoming data into chunks so that the data can fit in the Attribute Protocol (ATT) message. This document follows the program workflow and breaks down the code in order to make sense of every section and reasoning behind the implementation. + +#INCLUDES +First, let’s take a look at the includes: + +```c +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "esp_system.h" +#include "esp_log.h" +#include "nvs_flash.h" +#include "bt.h" +#include "bta_api.h" +#include "esp_gap_ble_api.h" +#include "esp_gatts_api.h" +#include "esp_bt_defs.h" +#include "esp_bt_main.h" +#include "sdkconfig.h" +``` +These includes are required for the FreeRTOS and underlaying system components to run, including the logging functionality and a library to store data in non-volatile flash memory. We are interested in `"bt.h"`, `"esp_bt_main.h"`, `"esp_gap_ble_api.h"` and `"esp_gatts_api.h"`, which expose the BLE APIs required to implement this example. + +* `bt.h`: implements BT controller and VHCI configuration procedures from the host side. +* `esp_bt_main.h`: implements initialization and enabling of the Bluedroid stack. +* `esp_gap_ble_api.h`: implements GAP configuration, such as advertising and connection parameters. +* `esp_gatts_api.h`: implements GATT configuration, such as creating services and characteristics. + +## MAIN ENTRY POINT +The entry point to this example is the app_main() function: + +```c + void app_main() +{ + esp_err_t ret; + + // Initialize NVS. + ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + ret = esp_bt_controller_init(&bt_cfg); + if (ret) { + ESP_LOGE(GATTS_TAG, "%s initialize controller failed\n", __func__); + return; + } + + ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM); + if (ret) { + ESP_LOGE(GATTS_TAG, "%s enable controller failed\n", __func__); + return; + } + ret = esp_bluedroid_init(); + if (ret) { + ESP_LOGE(GATTS_TAG, "%s init bluetooth failed\n", __func__); + return; + } + ret = esp_bluedroid_enable(); + if (ret) { + ESP_LOGE(GATTS_TAG, "%s enable bluetooth failed\n", __func__); + return; + } + + ret = esp_ble_gatts_register_callback(gatts_event_handler); + if (ret){ + ESP_LOGE(GATTS_TAG, "gatts register error, error code = %x", ret); + return; + } + ret = esp_ble_gap_register_callback(gap_event_handler); + if (ret){ + ESP_LOGE(GATTS_TAG, "gap register error, error code = %x", ret); + return; + } + ret = esp_ble_gatts_app_register(PROFILE_A_APP_ID); + if (ret){ + ESP_LOGE(GATTS_TAG, "gatts app register error, error code = %x", ret); + return; + } + ret = esp_ble_gatts_app_register(PROFILE_B_APP_ID); + if (ret){ + ESP_LOGE(GATTS_TAG, "gatts app register error, error code = %x", ret); + return; + } + esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(512); + if (local_mtu_ret){ + ESP_LOGE(GATTS_TAG, "set local MTU failed, error code = %x", local_mtu_ret); + } + return; +} +``` +The main function starts by initializing the non-volatile storage library. This library allows to save key-value pairs in flash memory and is used by some components such as the Wi-Fi library to save the SSID and password: + +```c +ret = nvs_flash_init(); +``` +##BT CONTROLLER AND STACK INITIALIZATION +The main function also initializes the BT controller by first creating a BT controller configuration structure named `esp_bt_controller_config_t` with default settings generated by the `BT_CONTROLLER_INIT_CONFIG_DEFAULT()` macro. The BT controller implements the Host Controller Interface (HCI) on the controller side, the Link Layer (LL) and the Physical Layer (PHY). The BT Controller is invisible to the user applications and deals with the lower layers of the BLE stack. The controller configuration includes setting the BT controller stack size, priority and HCI baud rate. With the settings created, the BT controller is initialized and enabled with the `esp_bt_controller_init()` function: + +```c +esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); +ret = esp_bt_controller_init(&bt_cfg); +``` +Next, the controller is enabled in Dual Mode (BLE + BT Classic). + +```c +ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM); +``` + +There are four Bluetooth modes supported: + +1. `ESP_BT_MODE_IDLE`: Bluetooth not running +2. `ESP_BT_MODE_BLE`: BLE mode +3. `ESP_BT_MODE_CLASSIC_BT`: BT Classic mode +4. `ESP_BT_MODE_BTDM`: Dual mode (BLE + BT Classic) + +After the initialization of the BT controller, the Bluedroid stack, which includes the common definitions and APIs for both BT Classic and BLE, is initialized and enabled by using: + +```c +ret = esp_bluedroid_init(); +ret = esp_bluedroid_enable(); +``` +The Bluetooth stack is up and running at this point in the program flow, however the functionality of the application has not been defined yet. The functionality is defined by reacting to events such as what happens when another device tries to read or write parameters and establish a connection. The two main managers of events are the GAP and GATT event handlers. The application needs to register a callback function for each event handler in order to let the application know which functions are going to handle the GAP and GATT events: + +```c +esp_ble_gatts_register_callback(gatts_event_handler); +esp_ble_gap_register_callback(gap_event_handler); +``` +The functions `gatts_event_handler()` and `gap_event_handler()` handle all the events that are pushed to the application from the BLE stack. + +##APPLICATION PROFILES +The GATT Server example application is organized by using Application Profiles as shown in Fig 1. Each Application Profile describes a way to group functionalities that are designed for one client application, such as a mobile app running on a smartphone or tablet. In this way, a single design, enabled by different Application Profiles, can behave differently when used by different smartphone apps, allowing the server to react differently according to the client app that is being used. In practice, each profile is seen by the client as an independent BLE service. It is up to the client to discriminate the services that it is interested in. + +![](image/GATT SERVER FIGURE 1.png) +

Fig.1. Application Profiles are used to organize a BLE application in order to implement different functionality for different clients.

+ + +Each profile is defined as a struct where the struct members depend on the services and characteristics that are implemented in that Application Profile. The members also include a GATT interface, Application ID, Connection ID and a callback function to handle profile events. In this example, each profile is composed by: + +* GATT interface +* Application ID +* Connection ID +* Service handle +* Service ID +* Characteristic handle +* Characteristic UUID +* Attribute permissions +* Characteristic properties +* Client Characteristic Configuration descriptor handle +* Client Characteristic Configuration descriptor UUID + +It can be observed from this structure that this profile was designed to have one service and one characteristic, and that the characteristic has one descriptor. The service has a handle and an ID, in the same manner that each characteristic has a handle, an UUID, attribute permissions and properties. In addition, if the characteristic supports notifications or indications, it must implement a Client Characteristic Configuration descriptor (CCCD), which is an additional attribute that describes if the notifications or indications are enabled and defines how the characteristic may be configured by a specific client. This descriptor also has a handle and an UUID. + +The structure implementation is: + +```c +struct gatts_profile_inst { + esp_gatts_cb_t gatts_cb; + uint16_t gatts_if; + uint16_t app_id; + uint16_t conn_id; + uint16_t service_handle; + esp_gatt_srvc_id_t service_id; + uint16_t char_handle; + esp_bt_uuid_t char_uuid; + esp_gatt_perm_t perm; + esp_gatt_char_prop_t property; + uint16_t descr_handle; + esp_bt_uuid_t descr_uuid; +}; +``` +The Application Profiles are stored in an array and corresponding callback functions `gatts_profile_a_event_handler()` and `gatts_profile_b_event_handler()` are assigned. Different applications on the GATT client use different interfaces, represented by the gatts_if parameter. For initialization, this parameter is set to `ESP_GATT_IF_NONE`, which means that the Application Profile is not linked to any client yet. + +```c +static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = { + [PROFILE_A_APP_ID] = { + .gatts_cb = gatts_profile_a_event_handler, + .gatts_if = ESP_GATT_IF_NONE, + [PROFILE_B_APP_ID] = { + .gatts_cb = gatts_profile_b_event_handler, + .gatts_if = ESP_GATT_IF_NONE, + }, +}; +``` +Finally, the Application Profiles are registered using the Application ID, which is an user-assigned number to identify each profile. In this way, multiple Application Profiles can run in one server. + +```c +esp_ble_gatts_app_register(PROFILE_A_APP_ID); +esp_ble_gatts_app_register(PROFILE_B_APP_ID); +``` + +##SETTING GAP PARAMETERS +The register application event is the first one that is triggered during the lifetime of the program, this example uses the Profile A GATT event handle to configure the advertising parameters upon registration. This example has the option to use both standard Bluetooth Core Specification advertising parameters or a customized raw buffer. The option can be selected with the `CONFIG_SET_RAW_ADV_DATA` define. The raw advertising data can be used to implement iBeacons, Eddystone or other proprietaries, and custom frame types such as the ones used for Indoor Location Services that are different from the standard specifications. + +The function used to configure standard Bluetooth Specification advertisement parameters is `esp_ble_gap_config_adv_data()`, which takes a pointer to an `esp_ble_adv_data_t` structure. The `esp_ble_adv_data_t` data structure for advertising data has the following definition: + +```c +typedef struct { + bool set_scan_rsp; /*!< Set this advertising data as scan response or not*/ + bool include_name; /*!< Advertising data include device name or not */ + bool include_txpower; /*!< Advertising data include TX power */ + int min_interval; /*!< Advertising data show advertising min interval */ + int max_interval; /*!< Advertising data show advertising max interval */ + int appearance; /*!< External appearance of device */ + uint16_t manufacturer_len; /*!< Manufacturer data length */ + uint8_t *p_manufacturer_data; /*!< Manufacturer data point */ + uint16_t service_data_len; /*!< Service data length */ + uint8_t *p_service_data; /*!< Service data point */ + uint16_t service_uuid_len; /*!< Service uuid length */ + uint8_t *p_service_uuid; /*!< Service uuid array point */ + uint8_t flag; /*!< Advertising flag of discovery mode, see BLE_ADV_DATA_FLAG detail */ +} esp_ble_adv_data_t; +``` +In this example, the structure is initialized as follows: + +```c +static esp_ble_adv_data_t adv_data = { + .set_scan_rsp = false, + .include_name = true, + .include_txpower = true, + .min_interval = 0x20, + .max_interval = 0x40, + .appearance = 0x00, + .manufacturer_len = 0, //TEST_MANUFACTURER_DATA_LEN, + .p_manufacturer_data = NULL, //&test_manufacturer[0], + .service_data_len = 0, + .p_service_data = NULL, + .service_uuid_len = 32, + .p_service_uuid = test_service_uuid128, + .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), +}; +``` +The minimum and maximum advertisement intervals are set as multiples of 1.25 ms. In this example, the minimum advertisement interval is defined as 0x20 * 1.25 ms = 40 ms, and the maximum advertisement interval is initialized as 0x40 * 1.25 ms = 80 ms. + +An advertising payload can be up to 31 bytes of data. It is possible the parameter data is large enough to surpass the 31-byte advertisement packet limit, which causes the stack to cut the advertisement packet and leave some of the parameters out. This behavior can be demonstrated in this example if the manufacturer length and data are uncommented, which makes the services to not be advertised after recompiling and testing. + +It is possible to also advertise customized raw data using the `esp_ble_gap_config_adv_data_raw()` +and `esp_ble_gap_config_scan_rsp_data_raw()` functions, which require to create and pass a buffer for both advertising data and scanning response data. In this example, the raw data is represented by the `raw_adv_data[]` and `raw_scan_rsp_data[]` arrays. + +Finally, to set the device name, the `esp_ble_gap_set_device_name()` function is used. The registering event handler is shown as follows: + +```c +static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + switch (event) { + case ESP_GATTS_REG_EVT: + ESP_LOGI(GATTS_TAG, "REGISTER_APP_EVT, status %d, app_id %d\n", param->reg.status, param->reg.app_id); + gl_profile_tab[PROFILE_A_APP_ID].service_id.is_primary = true; + gl_profile_tab[PROFILE_A_APP_ID].service_id.id.inst_id = 0x00; + gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_16; + gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A; + + esp_ble_gap_set_device_name(TEST_DEVICE_NAME); +#ifdef CONFIG_SET_RAW_ADV_DATA + esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, sizeof(raw_adv_data)); + if (raw_adv_ret){ + ESP_LOGE(GATTS_TAG, "config raw adv data failed, error code = %x ", raw_adv_ret); + } + adv_config_done |= adv_config_flag; + esp_err_t raw_scan_ret = esp_ble_gap_config_scan_rsp_data_raw(raw_scan_rsp_data, sizeof(raw_scan_rsp_data)); + if (raw_scan_ret){ + ESP_LOGE(GATTS_TAG, "config raw scan rsp data failed, error code = %x", raw_scan_ret); + } + adv_config_done |= scan_rsp_config_flag; +#else + //config adv data + esp_err_t ret = esp_ble_gap_config_adv_data(&adv_data); + if (ret){ + ESP_LOGE(GATTS_TAG, "config adv data failed, error code = %x", ret); + } + adv_config_done |= adv_config_flag; + //config scan response data + ret = esp_ble_gap_config_adv_data(&scan_rsp_data); + if (ret){ + ESP_LOGE(GATTS_TAG, "config scan response data failed, error code = %x", ret); + } + adv_config_done |= scan_rsp_config_flag; +#endif +``` +##GAP EVENT HANDLER +Once the advertising data have been set, the GAP event `ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT` is triggered. For the case of raw advertising data set, the event triggered is `ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT`. Additionally when the raw scan response data is set, `ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT` event is triggered. + +```c +static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) +{ + switch (event) { + #ifdef CONFIG_SET_RAW_ADV_DATA + case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: + adv_config_done &= (~adv_config_flag); + if (adv_config_done==0){ + esp_ble_gap_start_advertising(&adv_params); + } + break; + case ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT: + adv_config_done &= (~scan_rsp_config_flag); + if (adv_config_done==0){ + esp_ble_gap_start_advertising(&adv_params); + } + break; +#else + case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: + adv_config_done &= (~adv_config_flag); + if (adv_config_done == 0){ + esp_ble_gap_start_advertising(&adv_params); + } + break; + case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: + adv_config_done &= (~scan_rsp_config_flag); + if (adv_config_done == 0){ + esp_ble_gap_start_advertising(&adv_params); + } + break; +#endif +… +``` +In any case, the server can start advertising using the `esp_ble_gap_start_advertising()` function, which takes a structure of type `esp_ble_adv_params_t` with the advertising parameters required by the stack to operate: + +```c +/// Advertising parameters +typedef struct { + uint16_t adv_int_min; + /*!< Minimum advertising interval for undirected and low duty cycle directed advertising. + Range: 0x0020 to 0x4000 + Default: N = 0x0800 (1.28 second) + Time = N * 0.625 msec + Time Range: 20 ms to 10.24 sec */ + uint16_t adv_int_max; + /*!< Maximum advertising interval for undirected and low duty + cycle directed advertising. + Range: 0x0020 to 0x4000 + Default: N = 0x0800 (1.28 second) + Time = N * 0.625 msec + Time Range: 20 ms to 10.24 sec */ + esp_ble_adv_type_t adv_type; /*!< Advertising type */ + esp_ble_addr_type_t own_addr_type; /*!< Owner bluetooth device address type */ + esp_bd_addr_t peer_addr; /*!< Peer device bluetooth device address */ + esp_ble_addr_type_t peer_addr_type; /*!< Peer device bluetooth device address type */ + esp_ble_adv_channel_t channel_map; /*!< Advertising channel map */ + esp_ble_adv_filter_t adv_filter_policy; /*!< Advertising filter policy */ +} +esp_ble_adv_params_t; +``` + +Note that `esp_ble_gap_config_adv_data()` configures the data that will be advertised to the client and takes an `esp_ble_adv_data_t` structure, while `esp_ble_gap_start_advertising()` makes the server to actually start advertising and takes an `esp_ble_adv_params_t` structure. The advertising data is the information that is shown to the client, while the advertising parameters are the configuration required by the GAP to execute. + +For this example, the advertisement parameters are initialized as follows: + +```c +static esp_ble_adv_params_t test_adv_params = { + .adv_int_min = 0x20, + .adv_int_max = 0x40, + .adv_type = ADV_TYPE_IND, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + //.peer_addr = + //.peer_addr_type = + .channel_map = ADV_CHNL_ALL, + .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, +}; +``` + +These parameters configure the advertising interval between 40 ms to 80 ms. The advertisement is `ADV_IND`, which is a generic, not directed to a particular central device and connectable type. The address type is public, uses all channels and allows both scan and connection requests from any central. + +If the advertising started successfully, an `ESP_GAP_BLE_ADV_START_COMPLETE_EVT` event is generated, which in this example is used to check if the advertising status is indeed advertising. Otherwise, an error message is printed. + +```c +… + case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: + //advertising start complete event to indicate advertising start successfully or failed + if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) { + ESP_LOGE(GATTS_TAG, "Advertising start failed\n"); + } + break; +… +``` + +##GATT EVENT HANDLERS +When an Application Profile is registered, an `ESP_GATTS_REG_EVT` event is triggered. The parameters of the `ESP_GATTS_REG_EVT` are: + +* `esp_gatt_status_t status; /*!< Operation status */` +* `uint16_t app_id;       /*!< Application id which input in register API */` + +In addition to the previous parameters, the event also contains the GATT interface assigned by the BLE stack. The event is captured by the `gatts_event_handler()`, which used to store the generated interface in the profile table, and then the event is forwarded to the corresponding profile event handler. + +```c +static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) +{ + /* If event is register event, store the gatts_if for each profile */ + if (event == ESP_GATTS_REG_EVT) { + if (param->reg.status == ESP_GATT_OK) { + gl_profile_tab[param->reg.app_id].gatts_if = gatts_if; + } else { + ESP_LOGI(GATTS_TAG, "Reg app failed, app_id %04x, status %d\n", + param->reg.app_id, + param->reg.status); + return; + } + } + +/* If the gatts_if equal to profile A, call profile A cb handler, + * so here call each profile's callback */ + do { + int idx; + for (idx = 0; idx < PROFILE_NUM; idx++) { + if (gatts_if == ESP_GATT_IF_NONE||gatts_if == gl_profile_tab[idx].gatts_if) { + if (gl_profile_tab[idx].gatts_cb) { + gl_profile_tab[idx].gatts_cb(event, gatts_if, param); + } + } + } + } while (0); +} +``` + +##CREATING SERVICES +The register event is also used to create a profile attributes table by using the `esp_ble_gatts_create_attr_tab()` function, which takes an `esp_gatts_attr_db_t` type structure that has all the information of the service table. The way to create this table is: + +```c +… +esp_ble_gatts_create_service(gatts_if, &gl_profile_tab[PROFILE_A_APP_ID].service_id, GATTS_NUM_HANDLE_TEST_A); +break; +… +``` +The number of handles is defined as 4: + +```c +#define GATTS_NUM_HANDLE_TEST_A 4 +``` + +The handles are: + +1. Service handle +2. Characteristic handle +3. Characteristic value handle +4. Characteristic descriptor handle + +The service is defined as a primary service with a UUID length of 16 bits. The service ID is initialized with instance ID = 0 and UUID defined by `GATTS_SERVICE_UUID_TEST_A`. + +The service instance ID can be used to differentiate multiple services with the same UUID. In this example, since there is only one service for each Application Profiles and the services have different UUIDs, the service instance ID can be defined as 0 in both profile A and B. However if there was only one Application Profile with two services using the same UUID, then it would be necessary to use different instance IDs to refer to one service or the other. + +Application Profile B creates the service in the same way as Profile A: + +```c +static void gatts_profile_b_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + switch (event) { + case ESP_GATTS_REG_EVT: + ESP_LOGI(GATTS_TAG, "REGISTER_APP_EVT, status %d, app_id %d\n", param->reg.status, param->reg.app_id); + gl_profile_tab[PROFILE_B_APP_ID].service_id.is_primary = true; + gl_profile_tab[PROFILE_B_APP_ID].service_id.id.inst_id = 0x00; + gl_profile_tab[PROFILE_B_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_16; + gl_profile_tab[PROFILE_B_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_B; + + esp_ble_gatts_create_service(gatts_if, &gl_profile_tab[PROFILE_B_APP_ID].service_id, GATTS_NUM_HANDLE_TEST_B); + break; +… +} +``` + +##STARTING SERVICES AND CREATING CHARACTERISTICS +When a service is created successfully, an `ESP_GATTS_CREATE_EVT` event managed by the profile GATT handler is triggered, and can be used to start the service and add characteristics to the service. For the case of Profile A, the service is started and the characteristics are added as follows: + +```c +case ESP_GATTS_CREATE_EVT: + ESP_LOGI(GATTS_TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d\n", param->create.status, param->create.service_handle); + gl_profile_tab[PROFILE_A_APP_ID].service_handle = param->create.service_handle; + gl_profile_tab[PROFILE_A_APP_ID].char_uuid.len = ESP_UUID_LEN_16; + gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_A; + + esp_ble_gatts_start_service(gl_profile_tab[PROFILE_A_APP_ID].service_handle); + a_property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY; + esp_err_t add_char_ret = + esp_ble_gatts_add_char(gl_profile_tab[PROFILE_A_APP_ID].service_handle, + &gl_profile_tab[PROFILE_A_APP_ID].char_uuid, + ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, + a_property, + &gatts_demo_char1_val, + NULL); + if (add_char_ret){ + ESP_LOGE(GATTS_TAG, "add char failed, error code =%x",add_char_ret); + } + break; +``` + +First, the service handle generated by the BLE stack is stored in the profile table, which will be used later by the application layer to refer to this service. Then, the UUID of the characteristic and its UUID length are set. The length of the characteristic UUID is again 16 bits. The service is started using the `esp_ble_gatts_start_service()` function with the service handle previously generated. An `ESP_GATTS_START_EVT` event, which is used to print information, is triggered. The characteristic is added to the service by the `esp_ble_gatts_start_service()` function in conjunction with the characteristics permissions and properties. In this example, the characteristics in both profiles are set up as follows: + +Permissions: + +* `ESP_GATT_PERM_READ`: To read characteristic value is permitted +* `ESP_GATT_PERM_WRITE`: To write characteristic value is permitted + +Properties: + +* `ESP_GATT_CHAR_PROP_BIT_READ`: Characteristic can be read +* `ESP_GATT_CHAR_PROP_BIT_WRITE`: Characteristic can be written +* `ESP_GATT_CHAR_PROP_BIT_NOTIFY`: Characteristic can notify value changes + +It might seem redundant to have both permissions and properties for read and write. However, the read and write properties of an attribute are information that is shown to the client in order to let the client know if the server accepts read and write requests. In that sense, the properties serve as a hint to the client to properly access the server resources. On the other hand, permissions are the authorization that is given to the client to either read or write that attribute. For example, if a client tries to write an attribute for which it does not have the write permission, the server will reject that request, even if the write property is set. + +In addition, this example gives an initial value to the characteristic represented by `gatts_demo_char1_val`. The initial value is defined as follows: + +```c +esp_attr_value_t gatts_demo_char1_val = +{ + .attr_max_len = GATTS_DEMO_CHAR_VAL_LEN_MAX, + .attr_len = sizeof(char1_str), + .attr_value = char1_str, +}; +``` +Where `char1_str` is dummy data: + +```c +uint8_t char1_str[] = {0x11,0x22,0x33}; +``` + +and the characteristic length is defined as: + +```c +#define GATTS_DEMO_CHAR_VAL_LEN_MAX 0x40 +``` + +The characteristic initial value must be a non-null object and the characteristic length must always be greater than zero, otherwise the stack will return an error. + +Finally, the characteristic is configured in a way that it is required to send a response manually every time the characteristic is read or written, instead of letting the stack auto respond. This is configured by setting the last parameter of the `esp_ble_gatts_add_char()` function, representing the attribute response control parameter, to `ESP_GATT_RSP_BY_APP` or NULL. + +##CREATING THE CHARACTERISTIC DESCRIPTOR + +Adding a characteristic to a service triggers an `ESP_GATTS_ADD_CHAR_EVT` event, which returns the handle generated by the stack for the characteristic just added. The event includes the following parameters: + +* `esp_gatt_status_t status;     /*!< Operation status */` +* `uint16_t attr_handle;       /*!< Characteristic attribute handle */` +* `uint16_t service_handle;     /*!< Service attribute handle */` +* `esp_bt_uuid_t char_uuid;     /*!< Characteristic uuid */` + +The attribute handle returned by the event is stored in the profile table and the characteristic descriptor length and UUID are set as well. The characteristic length and value are read using the `esp_ble_gatts_get_attr_value()` function, and then printed for information purposes. Finally, the characteristic description is added using the `esp_ble_gatts_add_char_descr()` function. The parameters used are the service handle, the descriptor UUID, write and read permissions, an initial value and the auto response setting. The initial value for the characteristic descriptor can be a NULL pointer and the auto response parameter is set to NULL as well, which means that requests that require responses have to be replied manually. + +```c + case ESP_GATTS_ADD_CHAR_EVT: { + uint16_t length = 0; + const uint8_t *prf_char; + + ESP_LOGI(GATTS_TAG, "ADD_CHAR_EVT, status %d, attr_handle %d, service_handle %d\n", + param->add_char.status, param->add_char.attr_handle, param->add_char.service_handle); + gl_profile_tab[PROFILE_A_APP_ID].char_handle = param->add_char.attr_handle; + gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.len = ESP_UUID_LEN_16; + gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG; + esp_err_t get_attr_ret = esp_ble_gatts_get_attr_value(param->add_char.attr_handle, &length, &prf_char); + if (get_attr_ret == ESP_FAIL){ + ESP_LOGE(GATTS_TAG, "ILLEGAL HANDLE"); + } + ESP_LOGI(GATTS_TAG, "the gatts demo char length = %x\n", length); + for(int i = 0; i < length; i++){ + ESP_LOGI(GATTS_TAG, "prf_char[%x] = %x\n",i,prf_char[i]); + } + esp_err_t add_descr_ret = esp_ble_gatts_add_char_descr( + gl_profile_tab[PROFILE_A_APP_ID].service_handle, + &gl_profile_tab[PROFILE_A_APP_ID].descr_uuid, + ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, + NULL,NULL); + if (add_descr_ret){ + ESP_LOGE(GATTS_TAG, "add char descr failed, error code = %x", add_descr_ret); + } + break; + } +``` + +Once the descriptor is added, the `ESP_GATTS_ADD_CHAR_DESCR_EVT` event is triggered, which in this example is used to print an information message. + +```c + case ESP_GATTS_ADD_CHAR_DESCR_EVT: + ESP_LOGI(GATTS_TAG, "ADD_DESCR_EVT, status %d, attr_handle %d, service_handle %d\n", + param->add_char.status, param->add_char.attr_handle, + param->add_char.service_handle); + break; +``` +This procedure is repeated in the Profile B event handler, in order to create the services and characteristics for that profile. + +##CONNECTION EVENT +An `ESP_GATTS_CONNECT_EVT` is triggered when a client has connected to the GATT server. This event is used to update the connection parameters, such as latency, minimum connection interval, maximum connection interval and time out. The connection parameters are stored into an `esp_ble_conn_update_params_t` structure, and then passed to the `esp_ble_gap_update_conn_params()` function. The update connection parameters procedure needs to be done only once, therefore the Profile B connection event handler does not include the `esp_ble_gap_update_conn_params()` function. Finally, the connection ID returned by the event is stored in the profile table. + +Profile A connection event: + +```c +case ESP_GATTS_CONNECT_EVT: { + esp_ble_conn_update_params_t conn_params = {0}; + memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t)); + /* For the IOS system, please reference the apple official documents about the ble connection parameters restrictions. */ + conn_params.latency = 0; + conn_params.max_int = 0x30; // max_int = 0x30*1.25ms = 40ms + conn_params.min_int = 0x10; // min_int = 0x10*1.25ms = 20ms + conn_params.timeout = 400; // timeout = 400*10ms = 4000ms + ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONNECT_EVT, conn_id %d, remote %02x:%02x:%02x:%02x:%02x:%02x:, is_conn %d", + param->connect.conn_id, + param->connect.remote_bda[0], + param->connect.remote_bda[1], + param->connect.remote_bda[2], + param->connect.remote_bda[3], + param->connect.remote_bda[4], + param->connect.remote_bda[5], + param->connect.is_connected); + gl_profile_tab[PROFILE_A_APP_ID].conn_id = param->connect.conn_id; + //start sent the update connection parameters to the peer device. + esp_ble_gap_update_conn_params(&conn_params); + break; + } +``` + +Profile B connection event: + +```c +case ESP_GATTS_CONNECT_EVT: + ESP_LOGI(GATTS_TAG, "CONNECT_EVT, conn_id %d, remote %02x:%02x:%02x:%02x:%02x:%02x:, is_conn %d\n", + param->connect.conn_id, + param->connect.remote_bda[0], + param->connect.remote_bda[1], + param->connect.remote_bda[2], + param->connect.remote_bda[3], + param->connect.remote_bda[4], + param->connect.remote_bda[5], + param->connect.is_connected); + gl_profile_tab[PROFILE_B_APP_ID].conn_id = param->connect.conn_id; + break; +``` + +The `esp_ble_gap_update_conn_params()` function triggers a GAP event `ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT`, which is used to print the connection information: + +```c + case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT: + ESP_LOGI(GATTS_TAG, "update connetion params status = %d, min_int = %d, max_int = %d, + conn_int = %d,latency = %d, timeout = %d", + param->update_conn_params.status, + param->update_conn_params.min_int, + param->update_conn_params.max_int, + param->update_conn_params.conn_int, + param->update_conn_params.latency, + param->update_conn_params.timeout); + break; +``` + +##MANAGING READ EVENTS + +Now that the services and characteristics are created and started, the program can receive read and write events. The read operations are represented by the `ESP_GATTS_READ_EVT` event, which has the following parameters: + +* `uint16_t conn_id;     /*!< Connection id */` +* `uint32_t trans_id;     /*!< Transfer id */` +* `esp_bd_addr_t bda;     /*!< The bluetooth device address which been read */` +* `uint16_t handle;      /*!< The attribute handle */` +* `uint16_t offset;      /*!< Offset of the value, if the value is too long */` +* `bool is_long;        /*!< The value is too long or not */` +* `bool need_rsp;       /*!< The read operation need to do response */` + +In this example, a response is constructed with dummy data and sent back to the host using the same handle given by the event. In addition to the response, the GATT interface, the connection ID and the transfer ID are also included as parameters in the `esp_ble_gatts_send_response()` function. This function is necessary if the auto response byte is set to NULL when creating the characteristic or descriptor. + +```c +case ESP_GATTS_READ_EVT: { + ESP_LOGI(GATTS_TAG, "GATT_READ_EVT, conn_id %d, trans_id %d, handle %d\n", + param->read.conn_id, param->read.trans_id, param->read.handle); + esp_gatt_rsp_t rsp; + memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); + rsp.attr_value.handle = param->read.handle; + rsp.attr_value.len = 4; + rsp.attr_value.value[0] = 0xde; + rsp.attr_value.value[1] = 0xed; + rsp.attr_value.value[2] = 0xbe; + rsp.attr_value.value[3] = 0xef; + esp_ble_gatts_send_response(gatts_if, + param->read.conn_id, + param->read.trans_id, + ESP_GATT_OK, &rsp); + break; + } +``` + +##MANAGING WRITE EVENTS +The write events are represented by the `ESP_GATTS_WRITE_EVT` event, which has the following parameters: + +* `uint16_t conn_id;     /*!< Connection id */` +* `uint32_t trans_id;    /*!< Transfer id */` +* `esp_bd_addr_t bda;    /*!< The bluetooth device address which been written */` +* `uint16_t handle;     /*!< The attribute handle */` +* `uint16_t offset;     /*!< Offset of the value, if the value is too long */` +* `bool need_rsp;      /*!< The write operation need to do response */` +* `bool is_prep;       /*!< This write operation is prepare write */` +* `uint16_t len;       /*!< The write attribute value length */` +* `uint8_t *value;      /*!< The write attribute value */` + +There are two types of write events implemented in this example, write characteristic value and write long characteristic value. The first type of write is used when the characteristic value can fit in one Attribute Protocol Maximum Transmission Unit (ATT MTU), which is usually 23 bytes long. The second type is used when the attribute to write is longer than what can be sent in one single ATT message by dividing the data into multiple chunks using Prepare Write Responses, after which an Executive Write Request is used to confirm or cancel the complete write request. This behavior is defined in the [Bluetooth Specification Version 4.2](https://www.bluetooth.com/specifications/bluetooth-core-specification), Vol 3, Part G, section 4.9. The write long characteristic message flow is shown in Fig. 2. + +When a write event is triggered, this example prints logging messages, and then executes the `example_write_event_env()` function. + +```c +case ESP_GATTS_WRITE_EVT: { + ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, conn_id %d, trans_id %d, handle %d\n", param->write.conn_id, param->write.trans_id, param->write.handle); + if (!param->write.is_prep){ + ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len); + esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len); + if (gl_profile_tab[PROFILE_B_APP_ID].descr_handle == param->write.handle && param->write.len == 2){ + uint16_t descr_value= param->write.value[1]<<8 | param->write.value[0]; + if (descr_value == 0x0001){ + if (b_property & ESP_GATT_CHAR_PROP_BIT_NOTIFY){ + ESP_LOGI(GATTS_TAG, "notify enable"); + uint8_t notify_data[15]; + for (int i = 0; i < sizeof(notify_data); ++i) + { + notify_data[i] = i%0xff; + } + //the size of notify_data[] need less than MTU size + esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, + gl_profile_tab[PROFILE_B_APP_ID].char_handle, + sizeof(notify_data), + notify_data, false); + } + }else if (descr_value == 0x0002){ + if (b_property & ESP_GATT_CHAR_PROP_BIT_INDICATE){ + ESP_LOGI(GATTS_TAG, "indicate enable"); + uint8_t indicate_data[15]; + for (int i = 0; i < sizeof(indicate_data); ++i) + { + indicate_data[i] = i % 0xff; + } + //the size of indicate_data[] need less than MTU size + esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, + gl_profile_tab[PROFILE_B_APP_ID].char_handle, + sizeof(indicate_data), + indicate_data, true); + } + } + else if (descr_value == 0x0000){ + ESP_LOGI(GATTS_TAG, "notify/indicate disable "); + }else{ + ESP_LOGE(GATTS_TAG, "unknown value"); + } + } + } + example_write_event_env(gatts_if, &a_prepare_write_env, param); + break; +} +``` + +![](image/GATT SERVER FIGURE 2.jpg) +

Fig.2. Message flow for Write Long Characteristic

+ +The `example_write_event_env()` function contains the logic for the write long characteristic procedure: + +```c +void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){ + esp_gatt_status_t status = ESP_GATT_OK; + if (param->write.need_rsp){ + if (param->write.is_prep){ + if (prepare_write_env->prepare_buf == NULL){ + prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t)); + prepare_write_env->prepare_len = 0; + if (prepare_write_env->prepare_buf == NULL) { + ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem\n"); + status = ESP_GATT_NO_RESOURCES; + } + } else { + if(param->write.offset > PREPARE_BUF_MAX_SIZE) { + status = ESP_GATT_INVALID_OFFSET; + } + else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) { + status = ESP_GATT_INVALID_ATTR_LEN; + } + } + + esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t)); + gatt_rsp->attr_value.len = param->write.len; + gatt_rsp->attr_value.handle = param->write.handle; + gatt_rsp->attr_value.offset = param->write.offset; + gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE; + memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len); + esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, + param->write.trans_id, status, gatt_rsp); + if (response_err != ESP_OK){ + ESP_LOGE(GATTS_TAG, "Send response error\n"); + } + free(gatt_rsp); + if (status != ESP_GATT_OK){ + return; + } + memcpy(prepare_write_env->prepare_buf + param->write.offset, + param->write.value, + param->write.len); + prepare_write_env->prepare_len += param->write.len; + + }else{ + esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL); + } + } +} +``` + +When the client sends a Write Request or a Prepare Write Request, the server shall respond. However, if the client sends a Write Without Response command, the server does not need to reply back a response. This is checked in the write procedure by examining the value of the `write.need_rsp parameter`. If a response is needed, the procedure continues doing the response preparation, if not present, the client does not need a response and therefore the procedure is ended. + +```c +void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, + esp_ble_gatts_cb_param_t *param){ + esp_gatt_status_t status = ESP_GATT_OK; + if (param->write.need_rsp){ +… +``` + +The function then checks if the Prepare Write Request parameter represented by the `write.is_prep` is set, which means that the client is requesting a Write Long Characteristic. If present, the procedure continues with the preparation of multiple write responses, if not present, then the server simply sends a single write response back. + +```c +… +if (param->write.is_prep){ +… +}else{ + esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL); +} +… +``` +To handle long characteristic write, a prepare buffer structure is defined and instantiated: + +```c +typedef struct { + uint8_t *prepare_buf; + int prepare_len; +} prepare_type_env_t; + +static prepare_type_env_t a_prepare_write_env; +static prepare_type_env_t b_prepare_write_env; +``` +In order to use the prepare buffer, some memory space is allocated for it. In case the allocation fails due to a lack of memory, an error is printed: + +```c +if (prepare_write_env->prepare_buf == NULL) { + prepare_write_env->prepare_buf = + (uint8_t*)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t)); + prepare_write_env->prepare_len = 0; + if (prepare_write_env->prepare_buf == NULL) { + ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem\n"); + status = ESP_GATT_NO_RESOURCES; + } +} +``` + +If the buffer is not NULL, which means initialization completed, the procedure then checks if the offset and message length of the incoming write fit the buffer. + +```c +else { + if(param->write.offset > PREPARE_BUF_MAX_SIZE) { + status = ESP_GATT_INVALID_OFFSET; + } + else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) { + status = ESP_GATT_INVALID_ATTR_LEN; + } +} +``` + +The procedure now prepares the response of type `esp_gatt_rsp_t` to be sent back to the client. The response it constructed using the same parameters of the write request, such as length, handle and offset. In addition, the GATT authentication type needed to write to this characteristic is set with `ESP_GATT_AUTH_REQ_NONE`, which means that the client can write to this characteristic without needing to authenticate first. Once the response is sent, the memory allocated for its use is freed. + +```c +esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t)); +gatt_rsp->attr_value.len = param->write.len; +gatt_rsp->attr_value.handle = param->write.handle; +gatt_rsp->attr_value.offset = param->write.offset; +gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE; +memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len); +esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, + param->write.trans_id, status, gatt_rsp); +if (response_err != ESP_OK){ + ESP_LOGE(GATTS_TAG, "Send response error\n"); +} +free(gatt_rsp); +if (status != ESP_GATT_OK){ + return; +} +``` +Finally, the incoming data is copied to the buffer created and its length is incremented by the offset: + +```c +memcpy(prepare_write_env->prepare_buf + param->write.offset, + param->write.value, + param->write.len); +prepare_write_env->prepare_len += param->write.len; +``` +The client finishes the long write sequence by sending an Executive Write Request. This command triggers an `ESP_GATTS_EXEC_WRITE_EVT` event. The server handles this event by sending a response and executing the `example_exec_write_event_env()` function: + +```c +case ESP_GATTS_EXEC_WRITE_EVT: + ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT"); + esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); + example_exec_write_event_env(&a_prepare_write_env, param); + break; +``` +Let’s take a look at the Executive Write function: + +```c +void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){ + if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC){ + esp_log_buffer_hex(GATTS_TAG, prepare_write_env->prepare_buf, prepare_write_env->prepare_len); + } + else{ + ESP_LOGI(GATTS_TAG,"ESP_GATT_PREP_WRITE_CANCEL"); + } + if (prepare_write_env->prepare_buf) { + free(prepare_write_env->prepare_buf); + prepare_write_env->prepare_buf = NULL; + } + prepare_write_env->prepare_len = 0; +} +``` +The executive write is used to either confirm or cancel the write procedure done before, by the Long Characteristic Write procedure. In order to do this, the function checks for the `exec_write_flag` in the parameters received with the event. If the flag equals the execute flag represented by `exec_write_flag`, the write is confirmed and the buffer is printed in the log; if not, then it means the write is canceled and all the data that has been written is deleted. + +```c +if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC){ + esp_log_buffer_hex(GATTS_TAG, + prepare_write_env->prepare_buf, + prepare_write_env->prepare_len); + } +else{ + ESP_LOGI(GATTS_TAG,"ESP_GATT_PREP_WRITE_CANCEL"); + } +``` +Finally, the buffer structure that was created to store the chunks of data from the long write operation is freed and its pointer is set to NULL to leave it ready for the next long write procedure. + +```c +if (prepare_write_env->prepare_buf) { + free(prepare_write_env->prepare_buf); + prepare_write_env->prepare_buf = NULL; +} +prepare_write_env->prepare_len = 0; +``` + +##CONCLUSION +In this document, we have gone through the GATT SERVER example code describing each section. The application is designed around the concept of Application Profiles. In addition, the procedures that this example uses to register event handlers are explained. The events follow a sequence of configuration steps, such as defining advertising parameters, updating connection parameters and creating services and characteristics. Finally, the way in which read and write events are handled, including Write Long characteristics by dividing the write into chunks that can fit the Attribute Protocol message is explained. + + diff --git a/examples/bluetooth/gatt_server/tutorial/image/GATT SERVER FIGURE 1.png b/examples/bluetooth/gatt_server/tutorial/image/GATT SERVER FIGURE 1.png new file mode 100644 index 0000000000000000000000000000000000000000..17111a93bcc40fae3b7e86aecfd0a3b81664b510 GIT binary patch literal 149897 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

pYAVFkr{D*Mks&ew@p|4SyePHy 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

SqGZrH@Y1&R6D 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 z zt2yTYyCQA87-t;xmnFo7U~R4jH@>Uf&RHe`VbxZ)ZC2MKk4eCd$;k*YAB3bet zK*OciE++<;msiKDuB)MJ_CUL#E->!fy{g88#$CP13U5Abc>5O%WmDRo!s=QJg>g%* zrJA=yX73EkGUQ@KG+ET5$ux@k%v;x>vvHKm(K2*^ z#T&{2f$+=o0E6IosnhGXEhC+`-^u~bNA^PyZQrEZOp8e;>b6$dReIge7Q82lRg&7h z8QPtKl;?nG!P-LgOf1|ZobXF@T=amg8fqEzPdo7V^p}48!tHZak>NJOZS9KRmh6Ue z2KyJIY(c<%mYp*x1239lRZsn6Pxk;z&ohu_CoTJ%)h$qu5P4TQJG@!7{0x69u-~`( zZVO=x+h_PKpYQ)LjDH5b|8vzHEQ;sNXcqNvhvD~HevfZJDSIC=mFM~U|1(l*XZ&-vl({PE(`4v*sb3@*^*#cH;~V~Bfj{mGjE1lrxVH~C3p3*1KmRq5|6A<;rt1GK_P;UW|4H^Q znfXJ3{Qp?8)2Z&bc8jYZ=J@_6eF}Rf;!VX1WW-_r4{EI$P;1Mws7SxVE`Lx42*)h~ zhU7vdl<~hM>^pyrv3Z{t?}vR9({8`xBz{oP(Q>rk z885gxr~YT8oqh}Aa?!19ApSpbi5Ar5TELT(fAa524}uOb1y>3}kbl#eKJ#ewPA?mI zja;sdR)Vw-7Xw^=&YKYxXpSMLa`m-MgHcys`|rf?X+@!bq}h4Uvgv?s1dyq3GtG8> g+8n;`Eh8TY^qI;rD~p~$fdPNw!ZJdo0y^*iA1l~G7XSbN literal 0 HcmV?d00001 diff --git a/examples/bluetooth/gatt_server/tutorial/image/GATT SERVER FIGURE 2.jpg b/examples/bluetooth/gatt_server/tutorial/image/GATT SERVER FIGURE 2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc5b14a18b869f59228f2261fd53044a2a99b839 GIT binary patch literal 4598622 zcmeFaZLB*_S;t-FK~PjcV?cP}6MuzJAckl#V)ljJxk<1_On{gQXhM;9mBf$&2CNcN z6VVz?MFWiwjV4XhO0bw%H6>DzG{#0#h(#^ZAO(5@MT-=;?wPi`JG51B?O20AqkLz!+c*Fa{U{ zi~+`g#be-&Z+xQ_YSv>P`&fD2^PVR!deMt`!hkWr7+?%A1{ed30mcAhfHA-rU<@z@ z7z2y}#(FKoK(umu7TfB*y_ z009VG1p&RbLH~ZoZ_;Qm*Q&$mv8~6r9_u{rMgTqOZv1R3{jdM}ucBi(%xnMgkAJ*8 z|M}0CpZmF=li&Q!-;}@myT6m!Y$hN5=tp_Nz}hkJk&k>t-u>=(%dh_GugXhb`cnDc z@BLnR)T1617~A^$&wlo^wq1tU0|5v?00Izz00c5g;Nu_vxHygz_|FIA(`Va$J1j#k5N5Vb)1DByLt@kv24zh^;p+qo=18D=t=3> z*;Z1o3;m{V`X=uhdEDb3C$D?m>*O<^`HXF*Vh;pT5zu<+PyEDBcw=1ufAH*QKU+Te z$xo)Lk3tZD00bZa0SG_<0(%1bx4fr4?P=cMS^9UpSH0?0yF9Egg1|Kp&^d+mm^Oc- z)?;3eeIDrupeLo{W?Lz(zdrfNPxkKrKlp<`$aP_xld$J(1m5$W_sCP9`c!Yczu*Ng z5WUWm2LvDh0SG_<0uX>easoQ<>UV$lcYA+ZJ@UvS@_`S0AbCZUfItQa=)HdQ7N0uX=z z1Rwwb2tXhi0lnwdi(d31Z!YmeKlDTLxzBwrStXnefs7H*V_c7QS5wm00Qdqh zV2#_gc$R*gN$iT(GV3r00+%6R z=IH+Y-~au~G)gNFfB*y_009UdbBSO0g_C6DSgYgd<*$wVmL*8jh+-m zB^%%U&hPw=r=z~@ZEwql(O3zAdm`|oKl-EI_3+^jfB2qSp;`z)00Izz00ba#9R&XB zul~yW+v(M>e)V;9ie5k{a6xG_rl+Td{-0raHPIN5mCOJDj@Z_MjFN<1KtX9B45P$##AOL||3B3OGulN3Tde3{_bL;t>0D)^JVCt*-+Td{- z0raHPIN5ksu~^*wAMlOe_>JssXrqI$>7oR5EWB!px9%Q*mvfK@9 zhrrng=xag8D4{2vjubuVbXK;V`ShnheK+2}@B6;bHq)>N0v9Ln@sEGp)01BL%2!^z zeHw%S1Rwwb2tWV=St9TwKk_5HznvcY*vDqcY;1+Vy%BKrBzjej0}W1Rwwb2tXiX1kjU04%@6`Ivz@Y zH)l}uhF)KWIpeNnpiOpQPjfxZsh1h4c)t6<& ze-Y!Rb137;XnkmBJrd_oSFtg=rSbbbyplnyCBsF8;rH3B<#nScS?(arg8&2|009U< zz$yahNv=Cq(r;B`=L>o+QLcAn?#>C^V!U1*0raHgE=5mD&din)=t=ROSWkOWxo8E6H&9De| z&u!aYJ$jPu9>P8dKmY;|fB*z+B7mNx{^oDHzaeW)sVKEpPbRa4tX3-b#bPS`c0D++ zD7A%ObZr{N=d}erDLGH{q~y$ODS@68<%yNF%-jq9-M1W=je5q+?I4$G+ZDC{$$POGL*ft8d1wlBdrU%3X2) z7m3!B)-sz+WHM2C`PS~4!D^SYk#t&3X*8SCR5^~i{h`d4QAVh`riZ%p;q6MsgPych z*=DmPoo-*I3sW!J%5pxFQMc~dTWSqtHoG~mc+k4*{)C=%-TtL_5P$##AOHafoR>iE z^`z}gs_vQw6?YW<*ZrRPsNv>TEl6C>iA3`NJ*Sv1c9qXZU1>I&Y97#$;bbl!n@!cR ziA>e;IGZ+Vy@j5WOw=Aj;c3a~c8IJOx}J$F^n66;p54twn$qbFWf89Uyu;7R+R&4d zy9GTdIWt>IpeKbrv6X(c=;8M5>jC&mESNVgnuPEtEmjouza#j;e)H6B`LbK1fAi($dFzC}+;?pgGtir%8sXPX`RSv41I%*x=anpDXIKS z`u=S^8$OpYsGc=($L> zH$QIs%D+KRO739vq~y$ODS@68_JsP4!PApUG71C)h0neDvwv?j_IEQhAX878bt>LH zzfh{ncfbUdhBnl8a~>IW?X;tE%lNHhE&aN&4zJSna)qxaW<^jv4 zOov@*_mzIM9{V;qO|>IX@GfEURY>fTpocbX~DWE5* zJWsv^weOTV?)~59w7h*J)CA2#F1a{{ zo|N3p=t;?$*-`>MDddUm)X%9`C`W5Mp(1e~{d?;zdQw2cYRG)OmX-Q_Vd*_rvR+N4 z=Ef+g-xzjVLKu2dvD%BswP)-%q4Xs8=K=JjIFE^-C&jbj2m~Mi0SG_<0uTrjKu-!1 z(YdJyy|&aU<-i`$fw-kg$NQZ(5Jyx@HxKZBYYv(s=HLA0x`^$f=h;@Q5B8XfQff$Q5D2r=9TGzqcCo7#fg!UpMdd zf&Xh<{V4pZ_Kw(@W!4p$Puu7VdeR9VLr*#h5+^|b0uX=z1Rwx`0|E4;n}))6x9+Ro zZun~k4u99XIgQRU4~WZyx{$iJ7f;Pwcj3=b3eukL7e=JELv`P;&zSSvgyqVQp(iDG zFnUsQX10_-PYQd&%*S1n{^BTjG+aP^UQ4%Ll}5WOBef@|yId{u-fC(<&HcSU@%`If z6Bkie&^Yv@AdlNW5ubEBBhG*T1Rwwb2tWV=E`hx3Nt@MNrjxM@2V)6u+2%6ZziwpI zGV-M!)*Ia4JYe7Ir0wth)|%*9ilH&7cqliVD777`#>hF(zWH4Ki=LF+?dVC#nb}eT zJ?YpJ=6yG?pW5-M`)?L~FJ`o$w4U9qS{;eJw?=3{n`zt2hgYoiWxY}B-Bzok=X$e| zje4%tdbpj+6;W5vMD(N}kJ~??C*977Gavu~2tWV=5P*P7An$t8xZ&@e+?n0>JG7zY zl=itO?r$D&@X*qqrxY6_SU(u72I~_eKIWt>IpeIFnLhXl8_4h+4 zsJz_$S#%<$S-;_F{Q5p^?wt^MZ;jHE%(zokM`P$lp8B>e2X((4r@hylBJ1+Y=yiDQ z(&7J)nEXlA-d%REGuyh3_vlI2;YWG_0SG_<0uX?}WeDV5PukAA{@>{8@Az709P``o zTKaWY%PB~)cF2Q$Z}R}(|ABdgvazV1g`?lFjo7Iq^AXid&V(aTldGcQdYv+|N9~@a<+I6=P1L z=Qs7+e!o`doHQR%%|y<5jOO$97CkAs$I+9LGqa@xdQ!Y6w)4Kf4lQ&KHgzWbzF2Na zICb}=<^Bdyl93zUWbDQ1?(ep@U=#SwB3!@sxzhE2^GK*C9aJch?c_)+JN}I#p35~K zK~K77@6tC2KmY;|fB*!}O#nSf6J1KX64I1zm^(BE;q?J`n+G_DJ$`QT?Xd0`zmr#F zYW@iB6-;4=Dr@RV-kis)Gk>#Jv!f-DwI0sXn~to?&ll)P`SCS9g#ZK~009U<;O+#_lYEA=VMi)XyslKLwq&yO z(x@`vzg3x&$%pD@&6y3UTf5uTUn|#byKyrPPa8*ECcK4qDrLtZo4_` zA-5K_w2p@&fS$xKfB*y_009U<00O5IKuJ%lBV<+vKB6ZjcM^J1a%Q%aKu@y86WCz`0rVsrynqc5fB*y_009VOg#da|Ry>8B zmm+|kl$8Bmm+|kl$8Bmm+|k zl$8Bmm+|kl$8Bmm+|kl$8Bmm+|kl$UGoE3g zb(jQ!%MzH+=boPQ%2&SfvW?Rk1Rwwb2tWV=5Xcw-H$LgnkA8H>Jr*X3Jtmi%NdAsrc4d3t$^3|_?)kYJs2?7@*@c#F|-_w&`_qx|ztX&#{ z00bZa0SG_<0$C*RlRx>B-rr82_{1l&*ad8cz}X1=_kaJlcRlE9gU4wE(34K%WaC*s z{nJ0~jrqxBVxx)J1c8eY_>JHA4exq*=R4ndv36+)0uX=z1Rwwb2xO7K8{haw?{BAG zub0IxU^4{HMnGQ!IyOl^^|is{Gy>>Jr*X3Jtl#^+-}A=&Ti)^(8%@L}2waSSn*%`q zAMnwSe)MAP(hvk7009U<00I!mB7wj8o4@hq66BuDq6e}0oCNeW;Oa^G+Td{-0raHP zIN5mCr#|&5FK5`dfBUz~X0x%;Ol*R{y%QLZ$MQ8_^EJEw1AgEKe&F8QqX7s&00Izz z00bbAbpqS%R-XFQr|$lKdi>)bFRXdXx<|1;Edf3D^);aNq^CUPDWb0p9;XpNPdbg0 zt!Mr0&;G2ZqrUBJZ?n}*?1I3(68O;{{Za2a_~SqR<9lt3${_#&2tWV=5P-n75UAJd z-rrD_O66L*ML!^rh=3mZZfugiCU~4q06pn+RyLmb@BjYqUX0S$fBo0XbUL-sOl*R{ zy%BiVyWZv9|DXNrXUmtr{N;OVi;5ut0SG_<0uX?}H4*sS=RPOj_HEy``&;U3zxHco zFc@4@_vi}*ZYA)yfBUzh$G+B+^tGU`2_B~tKuiCIimMY=K+ChCh*Bm zep2*Uch|Y;Yk)^`0_aJ}nb}z4zy9mL0@~`cp7kvG(1$)`qp8>gfjblU!$15(dD4@f z&92|?=M@M2zH$QZeeZh% zzf0?}ude|f$qAq*C1+-93BC5mUH`2AFL>0W9wo1O)vJhEwbfzRm6*V2G?Ev-@P*#r zI(nSz*u2kv_OprWq5uRS009U<00IzzfKNdGKK;lek9dD)>AiD*;wOHB{H#7A-esJC z&NZyZw7V~~o=ZIA8P5dEU-=dJ zvp@SY`QQgXDF676|Hu;t){cSqzyJNaHOzV)+lycPV)@SR{La9=U;jVw+Sk5T{`Y_X z*VfAsyC47o2tWV=5P(3Y2z=%$806ppM3~jC9fBxrx&aKY`c+#mJM4l01Rwwb2tWV=S3yAU`J?x{avUcRBhKH>+4$QTKL!1y*EZ;} ztjDw-+dR%g06pnE9Br>f=a>1XfBL7L4*T}Ezg=pz8qYH^F!TBR%+LG`T+hVyO>cUW zv|6oQF31mm_`|ZGunz(dfB*y_009VGB>}y6^uPSezsS4a{cicK-})_i!yDef z-@Iq~n^)&`aJ3)(+bQ$3^UPEA7}aA{k6Ar-+5h~0ZcXS(_rsN1^F!b*Z+VONf57|R z_rCmeoSs4e0uX=z1Rwwb2tWV=cOviyfA9z1Tte?*%mV^hB7mNhC2wJ?jReq>Z1f5? zK>z{}fB*y_009UV?2tWV=5P$##AOHafKp;#2Jt<6t&sidXo|GkTVXKV<(35QR3N}Fi0uX=z z1Rwwb2tdGo0_aKh`v?o;37{v%v*8E?P9cDvbP6TTfdB*`009U<00Izz00hDW(38SM z_?#sI=t)`f7Pi_*06ob@uV51dAOHafKmY;|fB*#SCxD)0zmKpmo&b7MJR6Qc;1mMr zNvBZa90))F0uX=z1Rwwb2tXiA06i&8gwI(bfS!~kZ(*yA1kjUg^a?gX00Izz00bZa z0SG|Aegf!8_WKA6;|ZWA#k1iE1WqA?eSpWWSHFFrENZ1f5?K>z{}fB*y_009U< zzV?2tWV= z5P$##AOHafKp;#2Jt<6t&sidXo|GkTVXKV<(35QR3N}Fi0uX=z1Rwwb2tdGo0_aKh z`v?o;37{v%v*8E?P9cDvbP6TTfdB*`009U<00Izz00hDW(38SM_?#sI=t)`f7Pi_* z06ob@uV51dAOHafKmY;|fB*#SCxD)0zmKpmo&b7MJR6Qc;1mMrNvBZa90))F0uX=z z1Rwwb2tXiA06i&8gwI(bfS!~kZ(*yA1kjUg^a?gX00Izz00bZa0SG|Aegf!8_WKA6 z;|ZWA#k1iE1WqA?eSpWWSHFFrENZ1f5?K>z{}fB*y_009UV?2tWV=5P$##AOHafKp;#2 zJt<6t&sidXo|GkTVXKV<(35QR3N}Fi0uX=z1Rwwb2tdGo0_aKh`v?o;37{v%v*8E? zP9cDvbP6TTfdB*`009U<00Izz00hDW(38SM_?#sI=t)`f7Pi_*06ob@uV51dAOHaf zKmY;|fB*#SCxD)0zmKpmo&b7MJR6Qc;1mMrNvBZa90))F0uX=z1Rwwb2tXiA06i&8 zgwI(bfS!~kZ(*yA1kjUg^a?iJL}0sF$#S`jd9Gx&TFH8|xv2_{B_-f7U&%JM>{eEW zU)J#_%69Gg@TU6AhBjW^tM$YAcC(5bcZcuQ*jugFvbmw}X0LdE1_GOf40=83^#-zt z92#3$&Sx^4&DC=z^X2*sjYd_GuAS|Axwq?J<4xC%-)g$HL^iTq%w;~;&xNcadHJo} z?Oj?MleU_+opj|c>#w9NI3EHJLjXPLVYt)kc?h5mJ$J~)o+;n`=5BR0jp2W0k)>n+L&n&$jiF5FIu`x1_sP`)w zv|2J;+^?fIvu>b&w~axk(vVTKz!9=P?;r2tzpeDD#l2sgmKq7c$7Vi|O7Zw!;Z)l) zKjUyo*Um`{Jy{y{pW|&h8q7glkQ58@_8qKo|N|ykhT6REuwThKQ!k@NAHUbS!Au7mf1U~ zJKnsvIS$X-_r}h9hq-a_FuyOgBvN|XOr-4Ufv5UL=}DzSnNoA?(b+DCUR{k*v|ZlG zcYL!Rw>$<%W6bT((Q8q9^Lq^fxnr*$w)kEBw;DAMK2e-Qdg6N8x!GUEn#|7Nnsn`~ zrR(ZoM`LDxf2;LoN6tyxR;O~yJ+oLpo4%IL#-py@`bFAy(v`cUzi#b1CqTeD0_aKB zxdej}5I|2#0E<&05J3PvDFO;#SxmsxlN@Pw`!eYFrEfgDown2~rNCUW)C|Y8SlmSm zOSRH_|X+3uJgo4EB zTsKym;NW`V>q$f5ZCCV3m=dQnoYeR=jJVP^idouGZ+Pb#Iftf1MQy zA&o3$Tjsbe6dY*}rn~jP%h^zBj?d!sYcZ0<{>zj$-cV!op|tI!EO$wNMR%BQAz(KF z^d!6egLO9(Ku@}v4@V(z8v*pB+X!*oE&`^WRF=sNYgQ&5V_vV~V9vd!!!9oOY|U!u zuazmakK>Lu!TGxzztb2VQ=hiW-dwsFB{(JM%Er)mT9e3Vs06j$e5yGwFSUG4E2`9H z){~;AXE-vv-_WTj6EgALUHrG`*SvAm4Fwu4hjs6mQy+v_%%$e7fs58WLj__#rfX*@ z4X=Gi`k~-SvtN#(gQsh2D}5slsvW*YRIH$06pmzKpcj^EdUdM-=;`){DxYukA{n>d>1?l|%!XZQHX6IS zo2|ACr=f{si0o!HmtnsvE!|eLB`sB^+w03j#V#B_)-qFlm>lYyk91p2Ri-1u$s!nY zv02JU)vNocpRIORoikUNd6PU=()3~(Dl!QbHno;Uuj{QrE7rnu`HghE_>i*aKbPGu z-B6@Y4*i`>Wx4awK9}yO>+1%k)?k;{coo(d&(ePpvybMQyEux2+F{+F(v{+3r;>~> zx1F_$vFWy3dw;6&)$WaU`rc|jRpWXp^FWei#cis_$z*n{0q!c?%3>B(&TUO3v5o76 z8gCtcys2^A8%`wXmjwRvO)=j2u}Ouab(N-u;>h4w(v(@(*P81}^W3iIyL*C;H;ZGn z8>5Hg`@SS^M|WVm@U_NbJt97DJCmxbMS41Ty0+A)HP#2$BG&zy*Q0-rG(abKo5n^p z{`C0NaenH4Hd{p9(D&E=RGl|l=zC$Bc62w=mAkCJ65!@k2v|e_J;@?xU`k>F=t+r@ zQ2+t~0_aHr9DJ~zfH^<9O-~A*>*`74rn8S-D3+z-X(WerAI>56X1kDf^>Cg$w=-VL zjsDU6+^e@xmU>KCr`kD=liJLrrPgw}F+EYQ#cDU$o{^urT=nC9+_G-0&SKQ|W%Rq`@>ky#oBmiaxS3ph4;viK za{7c6HcorKzUPib|Fx*{OuL$@(Qas5M%(FItlycrtg5}h2vbLm_#;n`36_`5IGB&i z$j_ziEw`t^0xD0JW7xUZ2UE18YBl4Jw3Ze1n0VKkdyh-k*1qno=zR(2^QgAWdg~E- zQ0BT@A_mAW+QAq}9?@#p(WBj{CwZ8_zN)T$LJh4hk|xiCh}%eC1-==vim5%58B)r}& z-S`@Z#%-yp##Sw2ESvEY)!82jqQaP!@3Tu(;1G&cG%H7Xu!W^qnsQox?x|S+ z`36S3Q~7M1Lw^mMy%WtoxAxkicg%fboTGWUD@sQVBhKqkx0&y&VD3j~)DfMdUNvT% zr#Pc6=RaH*Qq!Bt!P~PfzmhE;a_nx9+pL zmbb?JMvZST7hBqPQkL_5@euw>;sDNtz{3$hPkK1^w0w60=t*~HNDcWWfS#0Z|7WlF z#{5^$p;Zh-rCgTs;aRDa#W8iH!#vx}*Xz#@3R3BW_T)Bmm&EB+b3gxyW8^oqkG zmvKOkD0g=ngZW)8D$$FI6R92gP$(bP;^_*Fxly4|m1!slV{YV!iLyn{@q1NwP8pqJ z#%}Cc7h_=o5_on*A~PnK_E?qyJ`G zo_6ES-SnStU&K4rr;^KC>6#|qeOuAmW3Z;RA9LjPdv}77mr1qZ zsQZc;XBN0bZ)K}1JZ{J5mNag$}o*GL07)zh|sIQV00AoqpeI@328>8a06i%sIEq2wKma|7p^z;C z#{AcvQ{MQh_Qy8nuez`P{2)R{G1f%rScLg{Eh`oGv-F;7U+>k_*LaLQk^FkqIuH5X*OIb3|5Ni`H;%&8S4>UIZOUJxQINWdlUlD< zMjw{4QvI6t{G7z6&gK31BDI(KE}+5GrA&=TeebQMIpp~@G^S!`pLU;Jgimy*V&;Nz zdc=M7-)!qvJ*nE1{%GdMaJi02HNI3HVK29Lc!}`oP!0c6Fs}#~_TQmwwl{x9skrDtA%5tIR5*->2l^S7zQzd@V_9 zT>0w=?1l2;4*fJ?SPo9J7yrF%ML8AVsX^ZC7e)-Pbs@r_{bTH_Z>s`K>vZjD2sc74zy<^B;eun@P~LJs4B8-$Sb| zm6Bt`Ll|=^J>N6ui00g=6<*V0wiBvjH*Y-t&duL#S{wC#JL`D!+q`)Z?@&s`?6Fyju(rCEao#A588gr zjAC3Yw}Nxv15C4y*fC}LXg9u$7?+4xw0+e^pX0`f!Oi#Wak+Fhsv6B)>t-MHdzHJZ z-s;LUv^S#JmhV5`x~O++Bd3lTtLB|+jum5Vop)TnQQD@rhnnK$>9mKF%>CbXeo}du zjvgu7@yEJaKV{0uMgwO1M|x7qJ{i>;Z0p+85)c?6B$ ze=^oW>AlX^H)uqn@}awHg>>%idEbqPI*vi|*qupFGV>=#^*8+8Dg8IcMr00~)!5h8 zcK&J}?d50I5w;=vvl^ot!=GmUo`8SUIwt4f>yyWcuE5BpekhmD#)C2InRLSW=QRuC z>F@EDZoON;zH%=>VfVp|uZmg^r%y7p1)YyOEbA->wSdiqL(c9%V=3D)_eu2DhXyJ( z_0{8i+=Y~V3N_(>H1{nq;w}9XPJEY=N3eEdeeYq+nECv7=ca8ZWjX8o6$Hj72v|V? zJ;@3;U_?p+=t(KTQ49hH0_aH$g=`Us(qxkL;3ny6tB)844}#+sB;Lwa7Gb` zbMiP*#S~XB7tx_yIvYdwY}YcMjHKIcsF*u9PnWAJ`RkWVroR6|b%j2zjkRErI^b6A z3-9VzG5Uy^2mi>IDmS#p#H~lY*7~8S!<6mJd%jlH9EBsJbZ5==jfd+YWn0R@GM|oR z(CmZmQTgwy1Sd=Du3)_)2pPY*#W;nnk-=SL@n_ z-ZkM`xmk>i{T6*q%w%f%&n*}EYSz>H1sep9xYv4qV6AVj9?)yZqn4x)EJ0TxFU><_$sB1hnm(#4syNk zX325&N42iGF*Mps+fKT27xkCXOWr~tO9ar9vg9pn4HH053KQWo1dPzkGKnMqhDj2<(-lw4QK0kf`iFZtRer+nzj^*9|QEb!@tqS;Z zt{Zm_-HJ$%rM{W0m6OJk#YQqU13C@bSd*1 z4QdhUpc(V0AVke zYv;m_QL#{U#~WK_d&-o=k90PwW;PSwr|N#v&``EU?40_}jO9w(PP%fJ^jBi!6o7yg z1kjVLa05o9B!Hfj5*)=Ka3Fx5#8Ai5 zYa;vgJ*9eA7HeH@DT8Lko3ji|wXWJvZa?2!FQ(G2nXwV-Jag_Gqp$eB zH0MC7tW%TWY$;o{m)vSTmPXlFgA@~65lET`j4gwT7@5qN?}V zCDW5OMt*SJ$8NuOSl1J>@eKVxT~AWeM~BPt#Vtd zwU%m3jynGOsU2rG&S=+QkVC27k=au1^|zR)JV&ANWt2-}c>lSyqF&9ozKTr45{WKiYEFt*RmDv0mXE5v8Jq4NXzKfdkwe~$L(%au ze%_uS!*YA#8KqS97o{ierI`*OdB;-R^7w59Gn9kuVE_RD&y?lD#0 zXS&aQBd*fa(PFRfgK6GNDjUtXA?=f%r^N?!;ey(K&b@b}YDZa_vfL&86^LPsiz)Mf z^9BNT5I|3|!w*=IjsSX6I&PGLfJ*>9$tA&SHV7EGiFIs2)Lvk>bi~vyqRVg8Z}y?N zww`;2pP{_Ce!UUr8fBY9KU&Dl1#?utQD%Qk?FZ%d*U*!k$bGxi)M?)L*UBB$<=YsS z6Zj^Krgl&;=Xpnk%v?sQ&6qV_KD!v78gVv(*r4qsq*wWEoV))?^dya8*l>(7qw-jJ zbMv%FyJnn;+~B{Xp=5k9>-hR?+9%U#f4 z#=TBo%c1Z!w;Q}dz$yahNmjW7V-gZTPf7@k(;*NdfSwcr!bi&q82UswPwR=6Pu(2S zx_ne@!=av8Xb*UQ&gV#@J3d--WPW7?HcH%k0&9x!8@XnHraiT`u*F zwB2=FM|zT5a-+ubd^aYi)47~J1d`jR*Wu08Sf1|2v$ip)aJd$FuebQmJI{M##;wGx zc{9#ksOwN)!&7w)%on%V;+0GKW+Q3Z*{l{jyY#){bibr)OVqx53w1x!_p(#&GxP3V z3r?yh?a8IIF)4PX?4{wZA~;i(yNthPQq@|lsf{P*LIDWG6L{p2N94sXezE-JU;d?h z`O9C9Kk>vP=t(Dn;xsD>peI@B7L3Xe0raE{ISW&*CSdAG-nulaEylR(Az0_aH=H~|wfO#nS9)9%A~iwK}6S>%k| znUX&}NynFXd&WiXVVJu?aMliwo6c^&=|t>RdDe!gEJ#4DW!8IU778lo+8iA(2!~JS zB4FxC`}NNSdDNpGl{#h#J?UJYp`M2zfS&Xa)M@jY2%sljlQ-$hLlW@!LyE~M{gB4d z_LUPb^3*5ZuP?i3wu`=(7piXLxzBEoEV5kX9vciNfjm(bS$EZ@%tr&6MC7!(>Q2+S zixP;^lU!X%zb1`YLQlG=`)KUU1kjVt43z3}M*ux3cP^*H_e5Z-^G+9w;*?vF`F!uG zS*nGABB1irR~#v-@mH$%bEN_Jd%541M~Q&~0SG_<0-C^WdXlRxof@-*p2WDyG6D3Y zEPD^zZ6JW2WP=y50Rj+!00hz!Sg%&QeC(_aN=uM(5P(3Q2%M@Xxw_JAF-z!4c^W;} z*H`qU>+>l+x-0=xPkP|NY-Dzx%ttEAM#6JJ6FXnA2fGIs)iP>9|n}0xkhlPkQTH z-@5yM;q|Y7z3_wqV}LQh7+?%A1{ed30mcAh;JU`Z6QB4*Pyb1(Bk8qruYUEbC{-HC`-_jqNwm)RtTUc zWyMq2X)6KrBwIa$T@c7Nfz4_u%cXj*)~X|0S?Tw?r~bTutle{V->=kJCp@<6Lp}TY z)|(T`oZ*z!d@93!UwXaX?%5vmB@t)9Uy2xOPQcHZ^(jw!Zey`6|tIPAw< zY|3iawY4;h!9AKAqy3SadOq(}{km11r ziqexx2b)goUsNUM{%$QTLz8PMJ!#f1d*ju+F4VPG@odl57(F*J>Vp6T_5{B8#V?)} z1@TE|#YtrsCV-xFVc;}(bp+6puFj=&2m%jIAfP8XN>AEMJiVdd#Oq0gLPe%G#ZW8< zhd3BF=At0py!qU{Hf>h(@nX3qz2QU_OSKkDt<#&1`%*9ac4$4MHMu`+>)hR2joVUk z9C4hQOzs+=bSFK@k!H6q1GSd0e|YwKU1>FHo`&OUO{LZ;TGhEp>H3z^sg@KgN2;C4 zeKe4w&SO1k8l@+xnrEHLL1%JguuRbuMIZnH2;4vbJ?REG9I~DOdXn`n!a&OjpeI@G zAk2e61_^8zeJLJdB8v5)>cL!UhtFD1+N&;y7?sePx8@CN-e%q4S~smT+?SrTp7=3V zPQ4$KCuu8#h8yRj)@JScnn8!%)#N+rNoASDYKR*dHvO2JLZK)<7Hu88wUvI&UEij3 zB6U$MdbQ*DBz?BwpZ)cCSBFy`0uX?JPXIm1XTiJd5kODMp3kt@E&}LDcKHKqAaE4~ zjM$!1OUH9;{CqiO6|c1GWb~S+_%&~NBptU*t0mq3Q0B`UY}uKvSWL&#>$G?6G@H8INEV?Or1fH^I80!2Nft@&x&DV6l40W+@|OuV$;C zt#((2lX+;3oI6fbzo&~BjZlr&rDk&&OS^G$@TK~0sS{rxJx*h87E9+_vj!1A9%--1 zZKrKdPilvP&IWZ?dpg7V#-JH|f&c_^P5?bA=K~<)-A7N#xC1f&!3m%zJ-7=n00LJ? zK&{1b_PK%^hx|rv{%6O_uVZKm<%Tq??tC|9&6^kVRFs-p3*~A!dp*g}t5nQVoc=Sc z`?^HjIj%F-V?TG2j!%kLan>^Gc6M6Ja6I!h3L}SerO`NAyS3ND9O;ZB79edG()M`l zIlB6pel0ip(VE$EbYt%Dde>j8<@%#g2<7A6%%r8(cA4#k-xsUhVEgx~Cn=A3zSk_u zG7dRoF=~7Hz{9rc^ZPSbuu|jFh==P(px4@Gx9l_Don!d2*a)q;OTc_Lw$l369hkyD{b%7}CGBd|xEE~oZ!YpIx``O?)UZZ2=GF>-Cy+D%PqOI0I}vOd;P zxs?6KLK=>*XXxXlN>wUl$Lq8H&S~g%gvMiI^iLhvYr`tFnp8@@hNjEa2a8>yNy}YF zX2u8USfF6rPPrnrYDG$h4x{U-_4oDcD!XqzNkx4%9oMd)p0pVF<3`(6D3+wE>~-{e z@2T?!?c<8(#+tB7XKDaEyj>0bvgJc8U0nYXGFQS_I^P~!x&LN0k(Roqnw`;J$J{QZ z+iXa^*^3z8Gk^T+9Qko|@;w9~0D*)A(327Z<8-SCpeI@74vfhl0raE{It`N{a1{g$ zJxR}RjWu$|Yu}v0_g1NOzeVIl5f!&C~|X z{v~DZ=fzIu+c+x8zBd^LHMwN z+v93BX!-FfUc8HI=l-==u6uDmQx~deX!D01F_HPXdOfaEQ-Y4(eWvjk)H{*Al8~r#PJp zCR$GltWm4<{8$y0SEl4@LFLX3xsYN!u~qq)#{+4ryiH}t*CPD&RC^7geaIEHtHsbD zinT#x#ex3nq||2YjEWwuU#QUf3ua%dbP`UK2&QM%kH{2Z=XJOiqY3-U1wLb@sHvAQ}rYxp3Bt` z$4x)aQ++U3Y*q%VrK}XcY0rznQ5=7TNdkv&m#Jln0ZRy8qn_i*6erl<|OEM zZi@;a0D=4vKu^k#udlJE=tPzD&Z?%f6a-|qUgQ)ej z3U>T3b+JlU?Mr9qWMQo;^7CO0mzS4WvD@#bcidL^n^-+bow(n7tgdn|IbK}YQTwjX zbj3zrO?@WZrvKUS{YiR~im&o=WIM8Vp;?C;Q*`sIACt3?x~q#7YCDZm+vYO~<#dne zUsC32ed{y3`#aNy#u=`IyIVvJ5P-ln5I|451~2Bf59mqx^*ud54*~R~^KhgV2tXhy z0YeY)v$3)IMjlxvng@j?OJ}{JN3(Y%1f? zP)0LTuZlQx5zJ}i*<)xBzK#(rZ}vm)duM(=(r?`Os=(`hO`KV-+Kbk%f-RfciJ8Ah z<#Vn%9`CRXMNflKKJt8~YBu_MKYG&KkI7Q{(|+xs=~s8m-27^4ZGOyKL0Y?oZHC4a z&etB%zog8~^TS-DKgX?s%`6wI6R4P~#bSBmdN;ElTH`2H8`A9!WIUP4Qs*64IfH7hrgT9)X+8GW zHx`QZLp;$s5VO>u>$QN#tX696o@TXCEZwz!J6|mOo{x(<$NRkF`S2)TyWvZhZ&K#w z`AK{mHEz;=x0(3ki}h}4DN+ss5C{`MPYM&^bCw98CuPZ7*lHsI^duX-f=v*}1A%Bg z$&7VzYE7vf@<_Y$cunR;JxM7ny{enzs3i4z+0zNUeZg+S8`w9jbXZ>%Uub6R3FhT} zGBk){wI5m7Twk@*p;VdM^E|Dj*HC-Jw>#1sPWM{Z3FT&8KNquZ%WvC_Pcqk(shFKn z#JWJGvpKHLc1AtvI9IueYatECk2^B8o=MBkpVami8k%MGSm~-U(3DQMC)2=wb%q{Q ztVpBg*5&5yHtI2a>5apr%-{ca>3nOLao4xzx=&B{ylbVDhX4d}PXIkB_d_7l0ML^% z?LLgRfB<@u1x~;O2;`DLjGh$GgM1yKGjkIY-KHn$wARg?hUCQ<>6n`E8m1eWo9pg$ z+1l~`ZHMyfST-wW&`rV1-<#?2K~D5(A0cL}77HCIZviOO+f z=I|~!?L%&HQ*$ZGv2JFr4O97t)Dpg9J;~hLEPAcg(AYokeCyrHGC3d%yJWMRNVDu} zgL*8u+SmTfg^|C#;56k}0aIMucq+v+yzVf-QXSuom#BR0hA%xmNs=;8>)SAu^q+m7 zAG1hbDNg^v_&D$=wj9TNg zFd*F=pQKMT^X=?4sY+*R)NsOEW1XCv-)6V|t3Q;5ZOVS-L zlv=ix<+LvqrC)gUw#J@8VU45K8Ol=a$)h3tG$S!46s#+)n0SG`KNB})4$b(PWB7mNh zEq`IHeFV^x?DGj0K_DLljF=g7?Ue4kn&dv!ybmAx+H_h}=&8**vyZBV(a52A{{ zR?N+Bt>eD@{5m(vHeTNTn+4$zV*GF`kl&sRdu->G{w|)Q4j(UfPg^&J;{K<+sqL_ zPs*IjFxWBz=t-721alye8v-g{j~fqT#=7kKzm>kHjU2BP+synu-@p z4U>1`EpOH{=`<>VxS)UrQY=ZUKRK*BGwL$*q+&(I-c*m{Z7R)y?3TG1#oV{ELEF=4 z0_`bntkE4Gx3?>}l}R@k!{nANRa+{5kXyTmpYtggtFjnHw_7aLWT5uC^UE1)rc}Nu zSF0$uCw?Qb?+o9&8b|oG=t#LzlU8>i^FZFCh)R`@j^d{d^*NQMj2He|$#Ch-%+JH^ zsJz^fj~n}UI&-(~biQ>FT2t1RwwbmjHT_OM=%d52&9xbp5`AnTeUF^ld5=&9#g*iH`J2RWXGi009UHdJ=;m%LLGqvg|!< zw}Ak9k_}$K1_(glyablgblkOK!T6i=wsS*mrk>RF^CR6*fCjEeFV^xuFt3R2m<*eVD5MC z#wMw~=ucW#b`Qjqo|G&{^*z`?l@KuUh&9|~>`;LK1R!um0_aI+gh^EwCxD)GapW|3 zWdzWZuFRoy2Libz5Zr@a@6|P!Ka`lHoS^oos}_sm6bn*0DMxi~9Y@FSkwCw?*H(+Q z{%N_l?$H*ih5!VvlK^_sb^0|gy+TjQi>K-5eGx!Ux-YWS3jqjRp1@YttCcKo%9DM0 zqi7KV4@Y2^M}8HvAK=58MavL?!1WM7Pr4po=CLQ}NqO`-eLg1v^rUmrq%H_R00Izz z00bZa0SM%W0D4k>e0_~QMNhg$uhOSW5 zI( ze0_~QMNhg$uhOSW5I(e0_~QMNhg$uhOSW z5I(e0_~QMNhg$uhOSW5I(e0_~QMNhg$uhOSW5I(e0_~QMNhg$uhOSW5boQX^rTDDrmbrvfSz=XUd?8o){~YL3WbxN zPPs1q=`x!gwa99dd9g8ywX9z={Zf`mjI6RTe0WoRW<%qqbMUz%qtG;YJ?%@gJ(7Ex z+8@kVOS5S9@0Rz)k~F%b2h+YxcDz50z;@pA?kml4SRdKQpjGvb`}ZJ6TEqEi4V-jV zx^_16fm9;Kr&DdqJods!+16q#jf#6c8rOkSk>2Fo_uF(fo`gDZQrdRXmAjbBc%8);J{m9C|rzm%VxUslFLEONTNgLr>buuz9Gf*o?93Txi$Q zF5NuNBFAI3ch5T4x%!v)dREeO_Wmta`ym)>=~j#0n2qvttv3smN%JvXJL_rZM%xO- zn#_*0-Fs?FUHi5Ex%9PkHYO*Zww-k4F6po2EGPki`y+s!bboBA`Thx@C*40|TDWck z=tGzFiuPg0lT}lT{V?Xy(8bq`RlBKRcpsh=39Ol}ELRq3@ zqV24EG^cf%QL#))mnpltj3dJn{jwUjrQ|r`I5nAgGSymIu3bv!^1i+oQl_5dNOv@q z*>oyX^EsQ!c+izk-P@$! zFupHJFH|lm&{XYgr&2NQb(PjoR-3gf7ZYiE*O|KBltyOuDpgzR3Tqi-TgN_4)tb7E zVlnL03>JBAu^rZVHO#RnR z06pp2J)E8XnR-&GHHkNTJ&~%h{)0JvJgQTUj2doyP(fP0pyL&tcFZ~VK`$ycNx*=}m;>Dtok0o~Zc zLizZ5o3#CVK;zB=emWaN08aRrww-k4F6plmI?pK(xF`Yiq>JLFu`?4uPdYPDs>>Y# z^rYOm+}aKY^rYtaMmuMQ#!>RlUCV4Tk;!yFF`SRO(rh%P)#}J_vIx#4H%l4y)$wL? z_iVMh>YRCuZsFED-_@~QO{LpvO5;$r-5bi{77b!P8A`X^+PBwgNxRdP{%|6zqo4ZS zwod4SBD9>1q~qG6>h1Q2GGE?k%n{esxasL5<#t%dGqjd+Q@ZXNw1S#{hXkd~wC&YX zYPtTqy+7;4OeV^2)7f&*SLa2Zj->9!C#krp!Bpi)UK~d$oumJvVl({pZc0x&ZYIcV z(f8-xaccw3h<57(p)s{CN)i`c<2QrHsH>$0vx~3*m z*&W`lRGd~%T~qqHX-TKsmuZAwJe$`Gb)9wm>#Wt5UgWs6CBM*tlKK_xA|JelnRw#w+gb zBZuSqzM7^TZGXCQm-W{voH+*qmn49mbV=H@b#4OaN#`a?eR(5*o|HF_+uL7rPUCAt z(e`d8hIZl3Z`LC(7f`wC=kalKqPVd)i&5J<&pqb9mZd)n2?|ENl}019-p*g&)fpd8 z`sRaH%=vD)qI9N4dq!I~^+8Q~q+RvnWPJPg^_Cm`$T?Re&Gp!~vD^u2YRVpWeW8vS zTN|2DIG4)Qh+%M9%L)An=i^=*`c|-CM(ofz`=3xx+RlueHW7MK^6@p1y0O+M*yn;2 zD=i5uw=$R}9gnh_NTVE|FR0QQ9QoflXet$@&3f@?uFi6JEjNcjy;cphY0r?dcXJD+cPlW6rujT`}uL!`$_K z#Jvycu~cqPT^H?Nm&3q4UFTd+)sCtyUAfEqD+qv35O`Pu=t&RDpVse206pn${3s0p z^d!cBEd-M2NrSpSZ>w|;a|<=UGUvPA`iZ(>Nfw@RQ#oh#R zgoNtd&y5|aDQzj7Psh}T%sr)cWr~hesx_&U-8rhBlj>*PpX-L&it2-!@fbOe_H~ph zRaLL!#Rutnokm2=MWnOM_?(JNjhLy`$miA4o4Rd{HEk6$AN58$UQQQPhZ`bwLVqSL zSNq$~+1E-d4E9@TDn+eh2aZn^Pt{u#bDbevboJi$|x)mEU=@Q1C;lqT+9kBZeD^CzXXaXmKo z|1^CT^oe`lOWRJWa@P1O>_0w3;4%czlP<%VR_=!YdeZ%HrPllqKu^k#uWj#XKu=P! zFp&?n7G~J?*LmnUaoZIyjQQ1Wj;-Q4X3M2ahboVEUujOEe5v*B#E7X_%dq9=2q~zX zJ+X7@Qq$O{dn+SP4^eaElAAkPt$(Qbx2L;7k>sKh%Wo*pv z*7IQ?hi^L~A5s+8iLo!+e%`!4Ygl&<8kN#nb{bJgH*&QXldaMtTscX{P?#EDA?y>? zj6Y}J>q+~TjeOi5)BTb2_utgh3Q|{VzlMW>49sW0r`8oVq#V#g3I~m0Z&#}ErTBPp z7pk9TgxhvGGJI*oW`&uaIv%V3cr26}Vur;nC*6QPa5Csk6+q$4DSBgQEid&FwQ9);^b2I$*5Mp-7W@FQ91H`9ZBnds$X}EP11GW z#YQvNo9?r|N1J;}7E~;k8}*j9omAxvUp$1rG*=!Fct`^1Ne@Y%w(m*+J?X9lDW7)& z=t+4W0rvFY)RT6x6aPPZ?+?1p^X>ObAW4@ZaEm~?6iFlLQr!!CA%s-6Az&?}vz6P~ zTnx9diOmhd4OT*eMX-`Dc;RPd0v54ZxJZzI7fi7M147R4%(^pkW_MQC_5bek1+R~* z?#!I?IHRBUJYQ$dbUM^-x07GKZfR}fvbMQsMtRyr*U7U{UhYJ_5xqae^`3J@x_Zqm zYLeT0d!9&Qj0OcAvx^Fx#F7xaAMuV%Kl3o;22bz~r8?m-sJZCFT~d zpW``}^EgK5R7$bwtTi$tKFskaB4M7hiSq2$Zd>n#d%&b2ThOVo$o7xV~qtvuAHt_w{Mmg`? zjwBPKC-E(^E|bb9mVcr;QR;H0;1!Q4xGQFe~(ebHD7G*lUYBC zew}?sg6qMYN$%GDJ@fhAC$R=UpHFl=>}k7R(zvhpd5PQyF_zB5v11WmWn#d2)duQZ+J*g4Ny-a$oYc;0S+3L6aVTS(oo6vZYwQ`L6CH{-C zG`HNxCJiTZk)vZLL8m6mmMR%5=@KENBP-m4OgiS^;3DS z74HvK^Hz?P?5WasUmgWJ5ho{Sgju#aeVQ&-Tq`~!#>U;0V&@u?dA2m?7IOZPhoyhs zx!uS*ZRYzRzC~)!R!eF$`zAj|_f%>e!CimGbbt0S%f8fDwnKXrZ8;xrLi5F(Mm_sI zrM`#TnVS8!S&^$pZFJ6}6Q9$5DtD^vIHlTsI$lM<;~o%rApz(~FNBM(Urqpe(#sKJ zfQl1cJw|B!of&D-EwLoLo>kiP-%zX)1wu3I#wRp>eQO8%REl&+T|)?Q)_;?t@0 zYo?~O=r>)1TH`&5^N~6xzlYyFtFx*m)K@i{;u=6=?J4XqYgI9pZ{LK&NVL~BXC8H) zi8eI%@kCQo$EO#siEX|OYeccQpc{)b*jYnROLfyWy`H||kLuCCeiQK$I>l@J7h`eG z*No2xJnZ+h=ihLEilELr)!Pl`CTMsfxsf@6q#XBhD&J$1m1lmRq}jPyrK6 zi_S;M&A0bUb;}*wIO;q+F_x;wp8XMii#QSMWSu+?iDtGng`Y(qd2Ld!Yj#LuUV^#v3z+6avZlmy>?DN=In_xTWiX~CVf$p%=5XsobmP;yLhb3 zf80K&x~Pu0Z*9(Q<2`x02Agv78)_GaGe&*Ie4T`%{R8b{{giMmvBbg3(< zoI<7RmKw|HH2;Y_1HpV><=>wB&NFO0EPC!Os>`@(qT1^{n>zzYaKPkI4V zbon*{(39SV8Ut070Q97a2KEQtl51Z7+VzH0SJ%FgIDagl`A+Q%JJK=z%bSc&C-ocg zexqcgn&?;V`;ykk{G{PZWeSKKo_HPIqQQ7di{+Za-63B4?PhjOWY%Y5EFS||=SZFV z6tSHdAK0fT_TfYk?}roH?WD<>Yq`H|Fq@g&i;PCZEe}h57Ch(cOh-mHlXZyW0dDxC z?y+n3+j`P#{7>mgUb*EYYHKN-hjTQX6uAfHR}AX%pXjio)nZD6UPsi0x#&tgy`M)g zEjl0NXDhug$POZs~$!#!(p_H4jAKbv}t z%p=FtoHxk1I-Zz1pFcO4NpG^IzMPwvw^u`%x0Yysti8HbwfLJre$I=Ia~9tpIeS*m z`?;ATIyR-oVs}nF@7AjYO{a5r53%67G#awlpDW%kdRf*+(?8ckx3$2m=9-B|m|`n={$ zxYPg>hCHif4v->Jk7giIwthG+tiT(RI=a$G5uJn-dtfHcNlFCUi zYpM1m)}?fR_K|ao27MZiCp24b3+qW)4eYX38~E11sWYxF`5B&lFoIoPOf5UPW)~Wd zJm2jl{)@3xev(Ifh}ouV9i{R{%FM6hmUWiNnD;~WY3URLQzM>eCC)O`d2eoBN{RW{ zxtuL;=Sy-W{nHx8&G-p+IzQ=rVVAK#^@5yN*&6!1 zU5xA2>%1a=9V(&eh;zf#FtSc}gZDtTL~fZruU?x|ZX8*ksY!Fs7sy`J^Vb?-xv@B} zX<&7}yqq`h_my_?j>ob#UWO3!jdl7a?}^qiRCUo8f>YUX%C&oMyzan_TS4G01fVCq z1v3VD5dr8)F9M5hYeN8fQf)&0^^U$;Pjb#=;`OpvdL(T2G|=an@mj^KtHhdGtsUK3 zLfkZ3iJHonT!?5rH0vCr1IP#*+`q9G){{7!!<@OsHfHjHcnnz^yb+9ZG$(0{y|(+< z^xyqG8c}?^tWT5ND|H{;rC@ijo;1?uyEV8rwC?XE{>wG$6+MYtDUoxr6?Li1XW6+|ewJFabn?yIyrN(rYM7^LLk(2Jv(R~YUR-h%^B*6uZquf*v_50!@7p{Ih-0DK<$m1 ztag|6Iq&`1F2-VQc3GpDnl@rA|N1?vY4j#bI`H1S^XW+I*}&|9QMS74+S}2WYogfK zEA_l>{>Q}!pB^IF<@sa#ky?(d4c(wFpLsT$E#kd6X&WE+UuYuN@{?kGCz_bL<;w34 z+0r{D=GS2%;?<Z;(S99&;9dh zPxGPGl2o6j4v-kjA3wp)=t)G&eqiQ*v(33z{5d=ESf}HT79*>nsrCOw*($;A#&niB zf}P3Md$+4kbZHUS`9D)Qw|cPRVKro#hr+QD+KZ!!@x0imf=0>D{o`=M)7JTJ>2j{u zk^4OJ`He%PwJIAD?eB?WwR#gi!%)pb{=Qne-&aO!RO9jdF!_>KzAF;b%tIL-GH*!f zsAi6)zSrgVP?>R*k)_(bGhS??)Y1HUslkm45O_HO=t(a}i~(Lq0D963;iBtW5P+Uk zi!lF$lTuIe=Jee1LacrB+Mjmv@9cK1ep#2>=T3cI(Qo=b=Q*#9ZO)TeXY+d0xzF=l z>rhgE$@761aWwDCeI7aer}ksr!WX~K`bHq^YmfcwaCNV&Wu*M`?jaQH^8B&uA~zSx z)juviUdDK~|DL)**I=dg`ZfEDi&m(Zl$c-Zv8&~H=L%~zChtNp_1>%F=gddt(1FH| z7UrKfy{U+~7^{e$WNhU6#BFWIl}D*}mSJ}-OzQkIbH?12y`i_5^k$(MW;fS$!xX!8 zT_#rpZ8)F5<4yK*96jK1WAoFzv2ON+o@rW@8*6=IEEUJr(5rl%%s!hp#ypspl zCz5%Y?U8%dpwtc(C;R<<=QzgRa_!z3FIhL-+9?y}U8na|u9CdM;1& zRzCu-(34a>*}C0r1f4T z7N~(mzs=5o23?WIl&qCI!$p#3AuQ!J(8M`wUXRnH-e^I`NSrsW|F$p2y6OWD6LOxD z$qjJU>;Vm?>$~>3S*s5;46L2gFvY^&$cYld{zjKVU*Ycp{@Am>-JA}JHq0R?N z?&D0G+0fApwNBA&^^*J?F_;+3XrAJ2rye(JHqI_O&Z8Ok{92iJEY)ubc8)ozCwBj4 zcE6Lo^+@x9&(45GOS{uDU0=+%*OZQO@2k``)M!P=v6iW;Xgl+2b3tcBp5x?_#^uI3 z?UvNf)J#|NP<^MYvfn9k-<`=dbM4Q6R@_EeBU|N;dXDSkv+YC-+f!j{@o`*R%e8w~ zyd)F(z3BRYXCUw%0??D*!x^Kzh5+=W*KkFz^&#*~J?Ve^kN-j4ZkPVyKm3PrKE}WN zm;bUpAmQoH5jaN&3b$Jd!;pV>yw4~{NO0EFm%oc2_aSY!mv(9o%C#Rk&Q6`}mNU$? zKJwq=J$E~8OGvvt@88S6`6u5wMVE80G2g`IA41H6;DFZuJN~soHa=Hr~ng`*2+wx8dlQ62N@CBQRX=s-5I}HT&MY zmODDbtsVkveFmYkzt3|cUV1KplFEG5@%ZA1rT^00nEoc*`8^x>tpd5^R{OGo!#Je zFM-`^L7Q~VIq#i#@u>v3*4SdX5p|-T+B-S}fx8GmPr3^iZvHX?(38F_ATa0W2o%wi zisT|m9Z6q9Px`s(0E2x5P8;ern-p-p zbF=^f5CDOC6M&vn@A&_^_t2AmJ%X_R(**MLq27wHLw4PKp7fI?!xK8T7#&sodjro8%fH{CUfH{CUfH{CUfH_e8 zIRHH=v(&;1Urqpe(w7Ga=6yW@sVDu1|L`B^pZ&9cX8y*2|L<4-|NDqBVvIR}Ie=U9EW5%^T=Rb&ELseKvt>dXgTiY|aw&Bux;HAOHd& z00JNY0w4eaAW%I5(37ec(>i$sJ*iI7hOe(6P()9XPTg2h-vkBa*C+YEvO4lj;<0`1%S0W%VR!OJ2?r^dw0M*C0?Y0;l7F4hQ}{M(p^Rj_Nx8RnIR! zk-jH>{m6F}_&G;OKbQWZQ-L;5xaGLp(sDkh*=!d7&KFDC?heIle!}?A?&2IB6OKoE z9O22t_gFL_CpV6lxuNIGk&aPB=Ry!3QK>&JECBj%+C!iB&pcRN-nm9=H|yHIxz8ePuJw28z2kOH-N3ceIhUZ> zrpa=5tDCQTe?1HmjsdN##8=MFXl3Ht9IOiT5z)AHg{ht^{1~*mG+lj|@7?|tK=AM_ zCz^FF!{Iif?MTPeelC`SW)kNf?Y>5zd)Rq&00JQJMFgNHeNixA%H0H@C*6$<4M4yl z@Ju~PcC2!i{_B7Juks~ag8&HBgg~?&SxNSM>TG0??D*!x^Jgm%yv^r0NobXCMFqw+J|TQowrBX=C(;Mv$*3H5wh-Udy34 zERsAJopaG3vu?g+)V=RZn|VFnZ1-rk+|d5Od$D+*-gZ5we%soi^pMf!b=uaw=HI&i zxE@n02q*}8w0Sf?=^;HSpy6~*3*JjOPkv{!DUAj_qv2?+sWmF1Ro(Ku%=-tLbX&|S zpzdT-rh^x>$?8d4pPs}chm%gCGX=CbyucK62?8KcYXZ=dY90QccOH7u&xa5We3$_A zqz?xG!-GHt37q$HY9=`m&Hj=-+)*!iuJojf>XPKBr1rcGuk3jXr|w=ir8B%rPl`4+ z$13R0bLu3WX)(}wKD;+8_O*fmz2(wFdQzJZG|n{d>HTf2 z6Y+;?KkH@llhoZJK9|qqt$^Zv5C8!XC{6%+QgK$e^ZN)uPx`)?z@pzG06poq;st9# z;3o)(+@97*<#U{Dy_`1ZE5%Ou_dMnAc{@7$dvwmqMNc}@KHSn~%fFj2>EA;t+S7Kk ziSIe)Y8aPxQo9;&uhcT;y-->^YcvLlR;K#k{YPr7?Jm}$&c`iHM?)G6hcx8h@oY)A zN+ch`6-{)T(TJw=CG8GZY>7>07TYz=CgXUV;ZU_((LR-f6zxOiu%T_}uPJ^y?zsLq z=LyC3j%YL*({whc&CZj9CG?77`@v-FTeMEuc8P%g@0sfa**vgZJ>+zt72B)Ws^8Ig zO3TeIwMS0R6ZU(%&(R2ZwjLClWG=h*5Uo;Q>8)TAEoh0+?%MNblX73VDF=|9W9)g|)o z(ZPt;wsw-rPs&$uB3ex+vDUI&hgPEyHJm$xL1ypPMGp&Tvi591I`3(0cw9JY{Y*W! z2Xnt>c354l9p0bXy;?dRjYg^-_bH?i@9mP~rLUXasXP8l^(2mniM?XcrgbV9`_Q zX_X}59M)5Q-lv(-Po$nSq3v>DGz{OKx2>rG)1wvZ2U<7K``wPBy?5Uk*Cp<<78AE? z4#+Dd2$0Shb*deo<2K@)qTNAj6XIsyrO;TktxCJ;v9{C|b(Gb66RxFffA%y8te&CX zZ*{uVX$Qt<^;$4c`v}F)N%+U_tG!{JUXMC0tD&iO{lz|Rv>EArWHLWU9Y*!jn_v2gI}^S>KR-#0aHL_N?Q->`{ld;0WmluwqAuGTsB819>IPl%igsd8 zSZA`0&3FEDT-vtnB$qDFzdM<;Fjg+Mj)CIIaYG~iObsWii;j6d&~!MU{&41*-=UrV zsz$!(2A3cJ0wC}R0q9AO&_ml#6M&xd=?Gx_Unc-P>DMC&`$6DW2?#w&t#8F1x$K@d zt0x3}9(@#M^&}GKSo!LDA6GWtsO{4cJQ&wTbCKGF(kuejY6djnePp|1Dp^MNBQ%Iu z*JusJdF^Lf$-d2*cd~XekJIYYI?+K?x6y8C&gxQq$~{fXL16Wh)__b(4z~;ELUT#9 zG@qU%>s~dQT&LUF6nLi1#MZBJbR*%b^SWk{c@(j4NIffaWAXy$40Wt7HqrYJotU#$ z#`#xvH(Er?k*-6nSSA`uw6?io!7!t{>_m+&t-Z&TogL?t zxO?8t`2{g1PBbw&QJ1|?K0Qg+An$n( z0^8fV>TQwZB7Bv4i(!$u5V0?$ClPHtXO~Is$3L#Dy`R4NCYU@I~oIPrtnax$`7!*9#hR-KKV6wFtYP>Y_o6lUh-6FG7Q8_7>ib9e-6(YMDF3c|^M?qT}H}2lIQR zi0gXWv+{;<{co99lsDGtu%mFd=RB}W29Hlqij6#H0v90&L znREL17U8R3*NJ-;{}Hh-swatjF0CQ1hqlgBf3agWN5SeqN9MPk*_dTUa4C) z`yyr@|L$g9GPVNR!{sSZB)T(g~d`tyOuSCwsU|U1nx?IZrP;R{E7( zJ&A9;oITd(+Dn1S3(JhJW2QP5zDj*2J*IswVqZv4;`}O8BRil=2xT8Sr|9~l&B@tQ zU+ZFxUaV0n+bok*O?Quf_cAXVTg&Y6D`~^v37><F84rPYDUX_ zW$r#Y-6s2ZqFuP9^=e70Q0i5lJNIr)BV&)yAgqqzwwHdWbMNHyjDDl@tDMKno;caA zJM(K-?#NO*k@btXo^vlSywf%`jRwOpGBM+xg|DyClXf;Ii}k0=-a#2xJ!h^zO0CW2 zyftVPZ)_79Q@UQe$G>}-%lp$@{m*muJEjA9$8%{zu{hn)Ic^035U4Ey=t;E=eI*=+ zo>Yl2!if(OfS&Y0_!t@lYE8hWCvk3!IHzs2;XEKyH^=6Y$aS&NZ!}A1Z`+jji!Dr! zjj1=J@6CJUKAKv$X;1CGxt#m=^PbUQj6Fhw=yL9n??>h*sr`MYt*tYz^0T57?|0)p zTJDf+ThMwF(m~Z7=bAx1ttq`x zPm0!de`BNBPx6T(CueECQ+olktd6{QPq8{NOTE`Gj>TbaV%$_U-ggrd!%V$)5lhYY zUgq-tdt&RGH)UTtZS4HQez&p|(GCPaAWZ;zQkn>!{}KV{Nxu{=*!qnGpeKD}RA3Vb z)PaCsPm;MVL2pRCq>i*+$15^d^(0nUW?fz5s73vL+vo)5T(DbsopZxl$^NSRMxi(p z%+!4n8bq@@_coUMt709B+uW}6bfnpU&xjvSXtvy5w5|f}!l|vrtj4lq>-;3Sr;KxU zR-S!U%GC$=tsoT%)@(`|9^id7h7S*qnC2ur_nth?G)`n00e4J0D4mGr@&7GfS&Zz z;e+vCKmdBu7X$$&fIuw?O{i~8-2U`Sa7jJfE1D(0Eqcj&O>_v88EtJf}KY4jwzmwDOPrm2*FZeyNhQNCBS z1OX7JI|1lPb)Nyh?LYLS-;N)w|2zTcNuQ4aEC7Le63Ek&h>l{PA^_=b}k}I_kYcov|g`ixtM0_ad*X;azcZ+v~SULy=S%TOo#29 zI;>xqen)F#P+H^YO_p@vGuc!P@bzq9_GqcLCKrlZyX^uRufkYsIvut&?gnP82Jhcf z%AC~}v_^BHsi|GnprAM9^W`o=PqgPgO#V({cXB3QY`E~%>Mh14&xMFR`w?{eG#Ct$ z-#+zwU23a#E0l z2I0M5_s6=7n^$w9d0+3nx-w?xq6=A{PBgnxOZ#F2*RoDT6}wkV*SA)AU$(x^Rhwhm zbxsvqz~}PmeR@Upq*1bu@%A_u27`G{4XWMT?!nVcJ&)O(tqZwjUu!ICoSb^?x&Gb9 zoF{h4*xD$UzT(>db_(s8Z|OZu2H)P+TWr-g!a0gtM+xv6Xzv9ew-{oSfTbFx0t_DUA z?JZ=sU%CF!3Isp^1T+EYNty&6e~|$6q+g60Z2l$!(38F?8n6WfK;T&f0gc?KY(S;drTs?dwbEN&1}nZ!?(P5jt&%Vw{d*R`Tc;IcQY>;+fpXV zy^KBbXL^z&x1VDhGCt(u&G6CpGzZ^Z-{tX16Cw)T{U;_w%z;g*4Xc*|dVs8G; zbH};To79trwm#C87I+H;UPItubM?AYs7bGZj9x*Yz678r)i?H4@Em$l6`}|qK1l$2 z(kJO-Y!Co}=Mmt2N3$`Fr+hxVsKXq5O3Q(s^t{lbr-umG8c{v2RF5AJ009tqE&=FC z&*h2U-b(;_(tCMhwCWLno>aYaFDZ373#Ur1oyy=be=-n>}ttryyYu0a3-V=NE=0T2KI5C8!X009uF4gu&%)rn;tJ%OH7$Ed^SXA*#(^h}!Q3j{y_ z1V8`;KmY_l00ino0D4k=VqHZ~p(j-_s_^NZ1fVCqlQzZz0T2KI5C8!X009sHf$9)| zo>ZM!*3lE_Np*}me10YY=t<9{iM~Jp1V8`;KmY_l00cmwJ_MjA)hE_f^b~qh6{8BD z-bny@(mQEmED!(z5C8!X009sH0T8GT0q9B9iDexJWgQ zRGnDX(G%!Nb&NWEekK9vNzbH-zCZv3KmY_l00ck)1VErZ1fVC?C)QQ;6nat>qY9ti zNdS7%J85Gq5C8!X009sH0T2KI5U36T=ta%E!{=ubfS&YBn&=AzKmY_l z00ck)1V8`;>O%l}Qhj1wMNgq8RWYjY>74|iC%uz4#sUEl009sH0T2KI5CDPd5P+Uk zomke<6X;2Gj5>UNCIRS4&!maIKmY_l00ck)1V8`;K%hPZpeNNQ)>ZTrdQugm3ZLFd z0D96pX=5x9009sH0T2KI5C8!Xs15<>N!5vE9X)}bRL7{p=Vuatp7czb=nDiu00ck) z1V8`;KmY{lLjZbGePUfjPoXDOF{<$CodlpKy^}V^0s#;J0T2KI5C8!X0D-V=NE=0T2KI5C8!X009uF4gu&%)rn;tJ%OH7$Ed^SXA*#(^h}!Q3j{y_1V8`; zKmY_l00ino0D4k=VqHZ~p(j-_s_^NZ1fVCqlQzZz0T2KI5C8!X009sHf$9)|o>ZM! z*3lE_Np*}me10YY=t<9{iM~Jp1V8`;KmY_l00cmwJ_MjA)hE_f^b~qh6{8BD-bny@ z(mQEmED!(z5C8!X009sH0T8GT0q9B9iDexJWgQRGnDX z(G%!Nb&NWEekK9vNzbH-zCZv3KmY_l00ck)1VErZ1fVC?C)QQ;6nat>qY9tiNdS7% zJ85Gq5C8!X009sH0T2KI5U36T=ta%E!{=ubfS&YBn&=AzKmY_l00ck) z1V8`;>O%l}Qhj1wMNgq8RWYjY>74|iC%uz4#sUEl009sH0T2KI5CDPd5P+Ukomke< z6X;2Gj5>UNCIRS4&!maIKmY_l00ck)1V8`;K%hPZpeNNQ)>ZTrdQugm3ZLFd0D96p zX=5x9009sH0T2KI5C8!Xs15<>N!5vE9X)}bRL7{p=Vuatp7czb=nDiu00ck)1V8`; zKmY{lLjZbGePUfjPoXDOF{<$CodlpKy^}V^0s#;J0T2KI5C8!X0D- zV=NE=0T2KI5C8!X009uF4gu&%)rn;tJ%OH7$Ed^SXA*#(^h}!Q3j{y_1V8`;KmY_l z00ino0D4k=VqHZ~p(j-_s_^NZ1fVCqlQzZz0T2KI5C8!X009sHf$9)|o>ZM!*3lE_ zNp*}me10YY=t<9{iM~Jp1V8`;KmY_l00cmwJ_MjA)hE_f^b~qh6{8BD-bny@(mQEm zED!(z5C8!X009sH0T8GT0q9B9iDexJWgQRGnDX(G%!N zb&NWEekK9vNzbH-zCZv3KmY_l00ck)1VErZ1fVC?C)QQ;6nat>qY9tiNdS7%J85IA zXAn4_j&wL2a(<6=JRT`Jot`li`p^Un^CO-0YnjJ09YtKC{2S>U=@?$?PY!T0eIKLG z#rAZ}n|I0UJok=KM5imhORsSK1Olf$EoL*C%@(xxPK`4ib|Hn~j(g%H1 zIOphau`99h+ULfOT5c?&6CL(D+U?Zuo{nB#c9h4i%G!AEsAb0~+fLheraf~End5DY z>br3tbHB{NqwWNcAW#Vc(32_=#@adoJ*l>#hvQEo06pnRAkod62t+gr8q{bM_-zK% zA1~;Dwf%#!iD+z?2eistj_>DATw3Ez&bYF_W`2LNb+n=&iFtFdlJD^Kkrty7E%&bt z^eLP={@t2`L1#cKzrc~QzwS>TiQk!K-R31O!H8#q`*YeYsME}TR|MTL?VdPY%8hg4 zdE52Oseneyo$H8rR(7oQbYMP1a_)A9GdhU=pK)2v#`{MuJ5Jel(!#@{pTzFkci5RW zvmv#7|Gx@4G+jTNytEM4An-l{(39TB8Y4ZQ0Q98iGewW}A^<(9Uh)2YZ&{0IW!Hyt zeU!Ow4ru@Tj(^mHML#g>-r+jEYQLDan#L%%VLeH&$y&p; zVR1ezO<#kR-!60WgBQ_yWEf=TnD!_0*reI+cJ{)9ru}U5N8@)~4b7TI9`Cpu7@n<>)pM*@Cz@u~tS$0MJg4p0^c4)2 zwu`G*2by$S6a)cvCpPaXT5CO_L3ujY)o$;2Gul`^DdJt4|S-dQzJ-?R;GE03sZku)1&?h+EVdhC_Jfn>_N#Ks&uHP!x<*kv`w0x~j;Y_SK z16sZ|b;@VLPrUX>{PuIZUZ18CjSfq_7pXx(f01Ibqn_CV=hr+_4RW8B8|Od+Gk!qx zRPv)#}!``v~Y4JBMoX*d|feGf-tT5eMdM`YOLXiM%-pP zo70AK7qUMQh3vy7>2tSIV-2~@gqEAVn{#nG(2Dz2KC0i*c*^(e3e=F5qaJB!av3_b zNg!-ECvE=lM3V^Nr{6Y{|J9PF(JYpEX5X+1#W?W?!Y$ zQ2e>y?jJ`vaNb+3vDx?J=bc09>iid@gO?kN zXRX*D-1F@Fm7hoZ9VtNHaaqPjo_}h7sysjDAMSmc@a40=<@>_D`YtRpj&h@HJ8sIl zo7tnQV`CmY{~wChR)6QZUOulVXAiHk6h9#FYXqPt{aVCeuOt9HNz%YI2;5HqdeZ&O z(BhK>F_g<|ht%t!SKc?BHPGI+Y#D8lJlH8l~p2pqeKC^DH_qGS~%o@S; z+h|iir)|)kWb>p>A&q!1m(J<&JvO^jcRW#_y4|&Z=hkg?u8!K95qRvs+}Eag=w0bJ z6!nw!$l5sGx`NVrsNZX`)^v2%uuf%RUYD7C2$APx*yY7U_}d(){dN%zO^%0+i}Fk6 z4n5QV`}CwUO^t5m(UVHdFSQB&YH~Fl~drkJ0lMkBa&RyB> z4mF>%TJ>@e*zZQ3qsKDwjZH3RU)+@SAzi<%(d=^V{}XK|`m?BGB)FW9tf|i8zeSAa z**aM9oqT?Q-Zxi7pBBC25(K`E0Q97<3keLmg8=lTJ7D2f5bzLyp5%dom%f;QUnBAw ze3*+hV288>vJv|X>{|D-HovS*_cRDD&-MGQPM11uv995@WxC#ouiv24r$Jw@JCZ&- z6T9ALjbPSw#|qjV>UBHRO6es%xiN;x=2!AhYFIDT-jYos) zfGZB|(WSoAEB*ItGjNsH1q2`?rD^sX9fm{8o0Hvh9@Ptb_Mj9hxk+Ca=@R$fGCSghjL(SPi%{&C#3+^n+VK z;2Q`)Px^)^z=pB}peL0jhjt)vApkuIGvT)gi1n|kgX*Tq7*~#5Yql%(nD)f84p2Id z%9#l1xZm==w=r!wT_-eucjot7eOe2>CE6`*ehshbWjzwRzEJ%(Xt1z(6X(4>hfKXU zN)7}%i@#Af_`Io&vnhzrnie&noWEg<^>D1abVd{&4z%SxcH=o~J*m30{pm)mt0P*< zJQtBCWB~du!ET0g*MgrS@e1rr)56sCnbE%f>|IlW6@+a)>sv9=FJ~ zdV&8^Piq8yTCA3|SS+01*>sZCcsesP_Y~Gr^GnvR;yF7O=Zr^Ot0~|)70(0pDEHUo zaI@hRpC{3-jEy#@hV!vjG8g7d>#@~TgORO0l^Z{6py!I~4+V+8!e(=$^m%mA7R`J5 zLfoTx=^dqVjjuV%dS4BB9--*NU!$G}6ZhzG>|FO~VTpbAo+P(T^mETx+Fkp2rp16Y z<-qDl@x0;MNkaCux8HO1h>gztRzCA*`Rwj7Gqu>tj#IW>4g(vb`}L%wb55B=7^>4g(<~?ieHno%APNz+Q z)RB^PwycM0*8vUcOj3UrmbFXr^eR3pTIT}=qW+2OS85&_rlUu+r?JK$U+Z}f`Pox1 z@uAU9_Ts4y#oDOR=+ZWogs~I#VSKizy;HNUUQ_yO%xJsqqpY>kr7#&&?%$c{BrvJx zw6)#b-kbqv+pGR1yG%^f4Z>gPkK`w76urWKIhN6GbZqh-Tf9z}YsHfDOX@pPpHpbm z&tW02@V;lrfZAVLVox-@*BDy*^D=de0k=F6ybv_*wfrSL~D7 zd&Ih?#CsXbuRXdwiF(P}@Aw8$mx*H<@b`-TtY32ZL@zhls(Z8JSWfvmgv^zSxs)7B zSesmO9W>APW24zmY1!G9H(z*XO7m1^kHUuo9oet#%+@3>x|X;3MSPZdoX{Y3 zDX9_h>t-)aQs-A_OwH6e?UtPmXUYg z;Z2{_(BgZ<(UVwd6?(CZbAMrVu-N#L0W0P-okDfHvXNskKitSDQ6D}rP z!+lQksrYV*zcaaZQGTdo7yj##JZxw3yTocqO6zjSmmQ~UJ8PhGRV0p11AcN`+qkN^ zmEJR*z8}v);8zGhPx_Te!A>6m=t({*cnt)K6M&vnoE7f;1_ELosQx|9b%bHFK|=D`Ib*d0$o8@0N{(aadj38qIetb@D(O?k z{`iFhjYQpeFHe8N?5ibtI33BjBy&iXjf?LsJ5Jelj)C@xjbqMtmc2E;O4q7y_S}82 zsoU`s1b&JD^rW8(7mQ62fS!~Bf~O#GCjsb5cLKxhA0{Byzj^!7ZdiD29U#}Yh1UDR z2Gg(5m|Rm_+b`$M9cbDMj7F0lv#E2F)Y_`BP9XIMzkZY+$D8Nj8h?2v_Cl$%&Z8?D z5pg|qy{|*n-rmi1K2$ab$*_Bpo;1>V8fjf4=XnwT<=pVrusN<>J%w}E(rIe4k8}+D z&v~tS67iJvdz|?2KBgdvb>VrUIuNzglXm57OpJ*_nxyN`rCx#qXFA3O z2>c)c=t(~qG?;7%KuNv9nMY@_ z>~hv-V*M|3D5SPv^IKlyzZ^^2ASsQ3{-F8ij`IP3OhP#9G zxUkxp+=uJjRNzTz8*SgKp*{1==&R{`&$8o`ZD-AMu5Ny3#doW74Bh$P9ozg$r$ame zfgdISJ?V#o2h$095+(r%JVpR|(qsJ4`rQP?x;ZbG<%UUD*8y^UEzX2Kw^d~?pkO4>#%dv@0yI)OZEYpiQzr_6~qQ|kAJ zG?~t5>zpf>x-s=Mt%1eszMOTtb6!@mHcx9Ts{5-kQ8yIOljNSgSNJcrkBkPPY)pPO z)aR`K6oRS+OoC^O6FZY|coW=t;j8G1w~!Ku?l1a18?Y z6M&v{KQpxWBmueJ%gJTAVczw1fT)?xT7WsDTJ-6jr8PGD7Hq$~4&~gYbjHtmWOasi zytY5m$gG*z7taQWj? z|GHk)pB}G{HtEUFp9Y&V=hu^D{Ip-*$J5sCEA;rJ z+Q`pnrslEC`BV8`LO`+g=2^>NEl0g2waEsLCvGn}j^x{-rRphI66%R`ZbKDUSF4l(UgXIk~mB1`5hql3emz^@X3p7g7cgWZY%^d!s!5O|CL^rXl5q4m27yjo9k*P==T=}ne&;Qe6d(~;J* zf&F`bYK>#p7nl7Ft^Snuk!p9K#js=b0FzgBqG?C`4Zb(!^W-k;y=cFsaZhMTJeFF^ zno`v{`ihN)T(ff9phwH_KxaNn?zmgipe^=bM4Y zYu;l~%#muOeU#$`V+J~!L_c)p!@ zzMYOcT8wnC-%F`IaBfWQ9he-C~Iqp8uBu4Nae@a zx;-w#_IP8BDlv{~>}U%)XN<+)Jrh26P{k!W@OMnt#!UG< z7kQOZN6YA4M^K#0p8Mp$0uOI+D=_|qjBT5p0o>USXnt?z<0D2Op!fz1} zwTV@3fe~1Wdm+~W{`M#Sn|*4n&1+Jr55(80y12Gq&%L7kaA~uJWG$FX|Dw(1Jw6Xg z`)k%KtSxxY?c$}=Zf^I=W%{x<=G6qgMpSAC4Y|(CG?KN9c+8wVUY1=>OhulJlN)s2 zr1UB~#M9^IjWw^S=0;i0`=AX;*WX zwaD)sC+@C$5!rH^Lm_Ss~6`j$h}M^PeABNnL5F?YcA6qX7ikqHEYlr z(t7Vn7Lx6Au8%8`N0HLi(oMpN%}wb}vuk8^|IL_)bHtte5Y=`n*Q2~%mTRyl`Y-jQ zJU<-Yh0Q9a&YF>Lymx-ZeIGY8l(}U|EW4u#^@Bt!VE^4&cBb{D@8s28<`~y=S#h3{ zt{2>yWajkUHgf*YxF`0|CHATD^n7+0@sq3ZOW&-Yi?ajMT=gyLG1|_udL!EsbVkl+ z-_hJSU(Z!mEib{xSm4lfEny3~*1y+~oWP1@c1D|0dqj}eBu%h_%@FX=ooKMLad=c;E$y)fm{uiHL(yQpOkLOj$^Ku{8Qa{mH@8inoNxJ2U z=khL|liTf%icf+2ZB+a4c08B2@qAV`x(b)J$UNSNpSjOm$h?)DJ#XUPJ%0|>XL!q> zf!+RwEvDVQ7bhw+&gr<1?NZ+r#p6i(&fqNB?rsB1Gzh7yv{C6KlvyBg#OV#`bYFRJidA2|!Q!!l1yUpCSM~>8HX4W51Yy)RWA8u0QJ1eBhn^W*-`-}yWA zumAPGrvLn(|8wb_CFn`7h!XmI7Xj!=?;?$Hs!9NQQdJ`hzurv%deXazV?0ZsetMG1 zFEMAvdCxGkbZ~V)f%Pzm*PDUotjha)LyN)$crUX$Gqcg)nrl1gc!jy)#=8heJxS|I z>alFj67;0I@Z;t$BLF?=%K`#(evSb2q@N2J4E|CA_B^DVn$lltH_WO60a2&^?(_P7 z*Z=c=Zt6nyMV4kfjsWze+JzhrzlgwA)tzoODQJ(p^?YA6EV=~&Cct&-I{`I$ z{x=N=0*)peJEo{W1aQNxvLD*!~R!peKDp z6kr1gfB*=9Kv@FO@fg=*$L^rA1knxzK%h58eg`QNsn8Ks? z5|Db5s>k=Q{?)&V|8AlFUxQyTz#PCFz#PCFz#PCFz#PCFz#OQ~9QeC`_wSl|+*&WX z=P_Mp33}3d*KQc?xdfmmJ(nkXs~-WWC*AY^65OlmW#ShMFb6OPFb6OPFb6OPFb6OP z>Nf{;&eEU%`JbDA6aUp;{Z;)IQ}Fnw2|!Q!>F~k$FCYLtseb?e$G`aybIbwE0n7o+ z0n7o+0n7o+fwFVpAN+%VK>zOF{X6>a|NXxc@{_(`K?f5`6M&vn8XX#fKukdDN&n@) z{1*ztkpA0$`)~LK1Iz);0n7o+0n7o+0n7o+0nCAl&4GXXkN>gBC%RWp`WOG=U(jFv zJ?XFi`mevrHW&i}AOHd&00JNY0w4ea zAn-f_sutEgI+Dyq@>u~r$wvjR{R#o-Nxu>)*!islpeKE6WMCHvfB*=900@8p2!H?x zJeNRGJ;|4g zNIpxTC;6!0wO=6sJ?U2>1v|f$0Q979jSTDpf!`%?Iv(h7;NN4!PMqneuH#?z-2O!R zzUXXU%(*&8$E1%VopSE^u9r`Vz1sJpk1nI<`Sh4Q-@@P8aiHkdL^wq@2Kzl7Pimf> z%zQlF?4TTdYvViSs*S7q7}>ECK2b>X*^Fk3&5wL;$}vYP5CDPV1hk%1CKt&!3iKo& z6}}zOH}F^fT00sv zSn1j1A#q$&N6)+Xu}SkiM=n~K`Pdw+QVox^7>#JD?t9?J+W6|Zdg6Iz=hko=(RQRi zCkda!l9~yJ-fZ`PS7-_XAW#(o|K{KPo6H$)kN5^X=@EKp`)LBulRg~*jQ{HdpeOx$ z1Yti2d>4UeJ+eAVYs`AmmfCt<-(r0!F*n+X`_%j0*;SopGioROwr*-q&nI%GR@OQK5brup2TbX!Sayn?)%p0J`;G| z9wh5_;e+qa%WG%aF6K0w&uK1x7xO7~wa(P+&~(0V-k;Ae`;s2Zj`3ObxILfcZ+)_M zSiQu)%U2mKsZGm+BzmApw?#n^Pa}O}lj^qg)8h6>{-4@! zsNA%6c=V)YblRg{(3=aZTBOvmTS|gSJAvB9N=PM=t z`t>Bv0m|9;X4k_xIUlD3tvLT@I2^{mqw$oMn_WixIY&F%Y&NvrZuv1Z_Q)_q`;a!t z`-lI1pm4jQzRpkLT2G5@Na0?4B3s_Nj;tZK_>97lFHSHT6rZrkn7>0CA`E!o;v|h|;JhF3awcTedwKl$c00rp9u%R#BVgq0oLr{Ty{~ zd%Sg-avhx@&Xv0CZ~OO?KR4@hw{N!N?nI^H`i(YfI~(MT&-U@2xy4TSrW+N0EN+kG z-=Lt~%CV_M^Ib}WVO#Es&kft99cEuzMoa3Flv127oqF7=eo~ZM>*}J1s@7*(kGnZO za~xWI+UUePzFXS(YF1{Sp02xP{7csY=UBHdbGp&!&^8+;8Urk^$8&SVMq}Bc+xE$6~e%`0q+HSP5dQyW%+Y|58 zk?VENwMc0-c8%`pN&7`gZ)vuu+wC}-P@|#t_}B%sQ{$$A`PI3K4nX@)E$P*nPXj8A(P5IWK3D;pR_fy;+%U^2}{MZbr)e2HN zOOHZ}n##oInlI9hk(wk?>KwPAPduISe@<(oU0&*OM>OfAeBk)1Gtt_kOTF&xRL;!? zHCr8yL&u#L%|7W&C26CcGcRLx+|Yvuj2wnTh=t-BGqm8V`EoREm%~u=DL)-f)q(N}u5zoJ*p1id2ldPdYG3oRmOw}pO_zSq@VZYUOZ z_{^2tk5DZ#cWy>j@9Ip1mSpa9bE(SZo7`iMJ%`?>MQp^mVxuH+>#_J4N1Y2h53G)J ziLZX%zMeOht0#?&)?)V2@yNG)koAi6eokrQCs{e*)Dy04rq6jx>#Lc2@d5~d00`J+zuj zf3c(Jc%;MOV1AELL|d`PN9qI$<$34k0BK#KztB6EH1OiOi*Dh6EZUE_Pv-liIz24y zUccUKmwLCzQ!&ns`rwv-T5G$EBhN?EoF9#k&jV|R){pqH)fV|t{JibvqB;HCr6-+f zVe-HNny05l-0_KaT%Ub^j7)Bvwehp89KYiyBHj<>*=2jiD>6F`Nn&lB>~+$5P~M|2hsV{gSc~Y* zJwXv;-Oyb;jm1kv`zdzcDV&&`8l4*>1}kt`Y#h~5mcQG5HlCvI2jb(7BJD`@r1t1i zCy2E{8Ta;Boh|73xl2zH`y5%@ELtz?TUcei7cmKjnfglE`|%10fB*>GCICI@HY42e zy#$~qeQ#`F*>4blp7a}Wf|VdpH3C`vL3o(j_cr9iv%-nqZ)NqQQ7h3D3hEWUy+?;d z&(R^$b(=0$$#wY1slz0!E^t}2A93HcJQ8tMoqxaIEtAAJH*~Tx8p$)_llH*c!F91a zV^$yS&vqi}W$~Pt_zH91t0$Q`=GGavqh_zHje4%S_hjdOs&-g``Rtp^?kK)zBHo<$ zR#YGJ^@P_z00cll6M&wiN#OAp2|!Q!#i+sNZz2Fa>6@YfTR@;b1hQ*t*LNpxsM(=m zKdUEA%=zcM7io8l_q!c=&ztibo#=E@zY#?zaqyTLj%zKqJZtyfJiT{Jtix~UF0L2p zXGQxF`hrsz-0e>?{6;S|Qwnk@4CwW5wJxT71lsFgW1zSoZ%*Q0%va&=Kx)F0HGXidzq`Odj4`@VY3zMFi!)|Hy& zS3AL*AOHd&;1YnI9^tqYrl^G^rY{L2`mDEIuP)!seOJsx=O5{$Tj+& z`a&;i1U*`Y2i|vdrsHl+gLc!=o3uWp&ULf3o0}s4$L-J7bUx9vV{0{aM^l>37IeRa zQ(V7MXS-XyNYx4&(qXX`at8|7TJUijy} zJ5JHLY{n#Xn3d@X%YK6Z^rYX26RZS* zsuA$7seN9i_r0}frDT=l=d_!fHL}%+toEZ{GkcZJJ4fSakKA*>PFs6snrf@tZO6KP zlkGcikDazH`&eARQEiXwvCzHjxZ0=qvDwSk2+9te^Gb1h?7pviG!mk_y1!F;=G6bZa zG+OJ-p&a-2QZwpMrVMiw(zs`J2C26MoY%A7+qLsKUGXd8d=D7hSLp)A_KWVJ9#;fc33Oz41cq$@30)+>zFTpULl>iNssns45__v0A|fB*;-BLF?A7$@BIodlpKeP>)?)$b61 zp7cAhf~6n;0@n$gqXUK8ErnsozdJfaWoimtALA5V&X0@u+_-oCDBpImUm@*w2TC7R z_fA{Nj`fcCl(o&Y<9%$G^8q6-Thwqup5=iY%^Se z00@9UK?2Z|3WCCIUr7LZ(pQEBM*R>0=t(~mESL%cAOHd&00MUqIPYgk{qiQw;sfsP zXpCDy00cmw00HPp1t8&;uO$FI>1#s+!+wMS^rRmN6wCwx5C8!X0D%$&PDidG|K|Gf zCCo$<5CDN6B>+9?M*|15V*=2VFcCoDF#^z&9^;4BAOHd&00JNY0w4eaAW&BV(39#K z`D*wLJ*gUTgcqM906pn*>@hM3fB*=900@8p2!H?x{4xRPNxvLD*bY4ja{vS$BLF?= zF@9(b0w4eaAOHd&00JNY0(B(-J*lpduZG{yld2I%c=0&`(33vL9wUPQ2!H?xfB*=9 z00@AC^vltM?a-4j2SDI40??BlHD00JNY0w4eaAOHd&P*(!blj<7zYWNL3 zsTy&F7oQ^lJ?V4oF)|2%00@8p2!H?xfB*>mG6CpGzZ^Z-4m}BT00bT*06pn3erOE> zAOHd&00JNY0w4eabtM2jsjiW)hTqVWsu4$c@i_v}lRn2DBZB}4fB*=900@8p2!OyZ z6M&xd%h7}F(33C+K;SU~(32kHht?nf0w4eaAOHd&00JOTR|3$J>KgfK_zgX&8gYad zpCbT0>2vHcG6;YG2!H?xfB*=900{gt0q9A;96i_$JqdFF1Rf&*J?SxiXbl1&00JNY z0w4eaAOHe&B>+9Cu92^X-_Vn)5l49OIRem=KF1y-g8&GC00@8p2!H?xfWR*kfS&Zr z(Sz;KlQ0KB;4uQwlOE%T)*t`^AOHd&00JNY0w7RV0??D{8u@DY4LzwEafBD2BLF?= zbL=rP2!H?xfB*=900@8p2>dbu=t;jEJ=hLC33C7h9wPuf=`nt24FVtl0w4eaAOHd& z00MO-06nR$k*|i|(37eWM|kl$0??B_#~vet00@8p2!H?xfB*=9z%LVkp7hJngYD3h zFb6>3F#^z&9^;4BAOHd&00JNY0w4eaAW&BV(39#K`D*wLJ*gUTgcqM906pn*>@hM3 zfB*=900@8p2!H?x{4xRPNxvLD*bY4ja{vS$BLF?=F@9(b0w4eaAOHd&00JNY0(B(- zJ*lpduZG{yld2I%c=0&`(33vL9wUPQ2!H?xfB*=900@AC^vltM?a-4j2SDI4 z0??BlHD00JNY0w4eaAOHd&P*(!blj<7zYWNL3sTy&F7oQ^lJ?V4oF)|2%00@8p z2!H?xfB*>mG6CpGzZ^Z-4m}BT00bT*06pn3erOE>AOHd&00JNY0w4eabtM2jsjiW) zhTqVWsu4$c@i_v}lRn2DBZB}4fB*=900@8p2!OyZ6M&xd%h7}F(33C+K;SU~(32kH zht?nf0w4eaAOHd&00JOTR|3$J>KgfK_zgX&8gYadpCbT0>2vHcG6;YG2!H?xfB*=9 z00{gt0q9A;96i_$JqdFF1Rf&*J?SxiXbl1&00JNY0w4eaAOHe&B>+9Cu92^X-_Vn) z5l49OIRem=KF1y-g8&GC00@8p2!H?xfWR*kfS&Zr(Sz;KlQ0KB;4uQwlOE%T)*t`^ zAOHd&00JNY0w7RV0??D{8u@DY4LzwEafBD2BLF?=bL=rP2!H?xfB*=900@8p2>dbu z=t;jEJ=hLC33C7h9wPuf=`nt24FVtl0w4eaAOHd&00MO-06nR$k*|i|(37eWM|kl$ z0??B_#~vet00@8p2!H?xfB*=9z%LVkp7hJngYD3hFb6>3F#^z&9^;4BAOHd&00JNY z0w4eaAW&BV(39#K`D*wLJ*gUTgcqM906pn*>@hM3fB*=900@8p2!H?x{4xRPNxvLD z*bY4ja{vS$BLF?=F@9(b0w4eaAOHd&00JNY0(B(-J*lpduZG{yld2I%c=0&`(33vL z9wUPQ2!H?xfB*=900@AC^vltM?a-4j2SDI40??BlHD00JNY0w4eaAOHd& zP*(!blj<7zYWNL3sTy&F7oQ^lJ?V4oF)|2%00@8p2!H?xfB*>mG6CpGzZ^Z-4m}BT z00bT*06pn3erOE>AOHd&00JNY0w4eabtM2jsjiW)hTqVWsu4$c@i_v}lRn2DBZB}4 zfB*=900@8p2!OyZ6M&xd%h7}F(33C+K;SU~(32kHht|&|aHiwoK!?2F^VBxxE!M^&}D5Y1~(0D4mGr@+?$h&Cf?G#Z6|gLa?h+r!t`{;P&a=FPz>*Nu5k#-&Z0oTbr8 z#PC{wa-j7vNMat)Dz!|GwsRVeSM;K#ePTvL!>07_#&xqrgX!vH+LvU9>tY1XyP5f3 z8Lrd%$cYxCu6f^n2L&`*?urdi=&o|(oOTQ9c;;u&9n&uNgHdv<{h9_H{dp9hgP=pR z&9lF6%h^~6wR2P1amu!ngYT)I#O~Vn;rXzpVYlU(gAM8oW^~Anvm6W8An-W?(33vL z9wR?a0D98n4ADcq2|!P(cl^J}d#P>MHJw<~c(kVe!k=sKO@4i~Er$gKnrkqk^h*0; z`;L0aJiIdxL+pLL-#%4X#>!_B{lg_jpCVe%BId(mZY((SM^?Bx2BZFc7=7!ggoO*3bGaqi8+RGTtS%Z(FlCs%E2G1IUDaMUv`|b?WBb#n)d<|zt(Uq-!#|J=0=R;@7x}3GjTRu-~t3bP5^q+$3p-E z9v}cc=>d3X3Ia?3dJ?9=w-AteQnNFp`C?A63Mi5}s!Bj$F8 zmOI|l$ot+l^MQE1NwZYDdx4f3=e(tk_^#`Wmc0KdqQibeL-RS~&l_uG(yLNq@h5B~ z=C;ax+VY;d6SG)OdV)njizg(@l(X?(>O^J7DcjCic;3^vOHb3hp-<+P!;UjGJ<<`kW5&QNRo z;=N^3PioQnY97FeW+LYxxUxsk0K~-y3E14aMrZ2iF2pl3PiQUeAx-rjv<9!g zQ-acIJ2w5aMtX0DW|!|zv=3>+aodK63tv?idAp*%&QIcX)MCr^Y4_PIrDyn0oSR|y zyRn{>9mZw0pWC%}-X6ib=GUeBJ^MUy=E#iJoG+98(M-$EN1iu4mYI({kH^ymh2D9? zV{Q2}wb@eq_W8(pS~LDksn5-bCet}>J#jHMb1mZ4d}2RmqcP3A^WL=JV$k<|Hbpzn zrOi!h&@dI)^WJJG-rNt)9qDR)G}cegv{x)t-WtzW-+WYaNqq-x`M!|zOw`Z)ZeXo`oN10u=ooXxh`|4ay{b>I`rS81^*xGT~`DyRbdcWKctlz~W2z&>{nxRpMK9iwrL)w1O?G=XE5;o?YY7F%4D5g^z9a-ocr~@uqI8mVmvX{H6M7< zL*s5>^c!pcrQh~o?pe#YbxN6T~l4^ zaYsVma{UsyL(la8PCe-yih3s=J?Z}WwV}S)YvlUepk`-8&UP!o^xpYM#|;hI?miqj zUT3t(#6L(rQytc3P5znIS@h>^xODYeo?P3R&99MTT&|m3>-wTGnt8|9OxPFFS8OO3<5 zmTjjDvUWG9%li{gr;XXOsAD7zKl0xLrc>5i2V+kiEOqCZYcT20EA%AE4%gpB0D97Q z#RJydM*w=#eY|it2&4%>Pf8QP^G^}DM^9Sx?YgZqN!Av;zLM)*vwtIA^Iq1I`-QBF z!fQf4tE=1XIBOB54LLPJQvF`m!vXbJTT0i{k=l?vQz~xL45-uXQKzlfsA^5Be*1Q< zn;OgK1Fv{Q&7(^ntxlKw4IF(b7!<9yA@g%Ov=up1$Cc$ZQkyN#VozH~)}ubr#ME@* zK6Hvy0e?0lt^HkcgCf=nUB6jVX{t3 zsK+L?IhNgyJ4c#5vEM1hwCH@Kque`l8MDpvv74GVYG0U9IK5->{;O6i^_gjq+;@83 zxiz<%L7P8kU22&=25-eI+&Y+WUNmz|qUn#P5%rAEc` zvS(`-$vnSCqeWUODK(DJc;y({uJ}>JrrEuG7E6ugbeev0rjRvp`*~zm57tjAYh$#Q z=YPtWxiQh-du7Kd+fI?&a;>R$f5Nq=k}p7xk=DU{dQzHp=J`?TWL*lcem7-W;{_0S z8v*D^Z$piNUO)hP(hH!X%UThDo>Z%Ff3>rYp2WE@-XGozvmD!f9%?N;*5ZX&U&U)| z&g%#d2ih*Vj`y53r&N90{&XX9Dk55rY>kix*X+q%Q@4iVobEHNj2^;k;#{`Ny7_X~(&%=& zc1KD#((4<^mh}iNC#f6?sqr<^G2vnCnqBTS6ZNr z@xH=4lL9j#so6d2E6HoR?vjV9$FvEUgxr-s`5?*m>u# zL+{?B_9G>G51loBvQJ6stQ>p8uk1L2yWKmgED}HBo<@=v-gRa&T%nXbd zK;XRupeMbTH%5Cd0q9B3<%!T&cw5Y8c6g(41)<@}1_4(*~>TCU^Z8=LlN85c8d%$da_VkuNe2ZPb zxq8xA?*Ws0%3k8XjMZh`9M3JDgV!Dh3wH-qsre=HP#S`k-oro*)0 zeB?GdPeSE+$s9C2mXrUX^;Bmp-ruG5L)}RBE8=8h+Mr4LKzrT;)Z_f7Zm&<1RZ>^0 z>}ONk;dzvrR>lUt-`XhWo!gOQV)P`wMb>3f`Hbzr&XsiS>{8O$?9`PJ z|91E3D0UwM=Z>%z5FL+n;QS^1dyFEk`C@aQ%=%IE>+Cxcuny)-a<{JPna_Pbi8c87 ze4^uFPuum9#(lldOXNO?v3x#|)F1e7@jJHpD10~^_`Gwj7v9raNYQiFM1F|gJ0th& zNsUPEWzuV1t1+d{R=?#BGxV?DgvOJsm1Ep5@n4Lkx#d1KX*ijS9349eO3g3UR-F7T z-hbI2O=-2|`Dv28>=^NtU|MuO%FkA7xJq@XpUQKscz>vxw{omxPnEv=@+jDeI5{~Z z%(B(#({!=oTJae%HtwbrJJ*oRv!yw=kn@i`EdBG&?MBvVGv5dCEmC{7T2iCgH~BHT zr&8kx?)o#P`?HT(_NB(M9onmC%lUW{nlI)w>e=rp^*!9q)ahJvYIEJ9F|9(+xmWVv?xS?Q6tVUaYY?AKrC&2OrA5E# z8q}KINt}<=G5J0G?pd8xHKD$$(G=GJ5^GOkhgqwNv3&bn97dwOwmI{t^Gvj%xsNBB znmRtccuj2cZCE3U#Rc71oWaf-f?BGZw(0fs4S!UR{`H%Pm(VF*HyV2CNUK~ClTTG7E_{!kUmI~&VLE=X4zt|a{eudaU|MuON^ZWr zU#eT~*v3)k;fb;Q`)!2ZB2L6QStpM}qM4Z*GY_!4*zNl-?-dI4XU&(xCFh-AZ&JO= zGt|syR1e1*tU3QJ@zrxQnwZ~rjB}Ga8zIMM_UaqaewOYSOZ#)>@vxG$i~KyVGdi?mgjH5m`!h2)#V#Kxi&Ae6fH=tQMzwcUmyaxgwA^<(< zL*Oy&QwTs$dJ0B#Qey(plWH9NFLPb4dHrkG8wOwfx4YOIlDE!Hy>4s}{b~&$ZHcr! zNY)L<&BUom<7x%+@6Z1HBwt>F9LMcXubtD6IeX&L4)AlSA1yd{%hZWZYeanS!kjt8 zd!UY?$%o41R0(!If0P+^{U-Mv`E`od_%FuF*+VF6{wVHlO(5mP1M`bphsz1qt4YUB zJa3CL-UQR4^HFm9|Ji$E&~?7=&fA40utgw$_>+YcX;P$E?6yg&S@vHBA&^p1nq~u5 z0aM!i@oDl13&Iv_2v`Iwn^*)J6R?tpbqkA_LRcFg@F|8w7Fo`7t~2-Eb7$`8%%~q{ z^!zd+zHT{eAEIbMCn#bx>KxkIfT`eIds3`%kcwdXnlt+|i^jYLX>BUy5UN z#@l1;{8MrJoa&-F;^wtEyN&nc=^AX}eRXMLQ`h5`Hyljd>(AoU(Osi^ON}G*@I+lI zIl9ypRZgMObxV!qbejD{o`I0k*0P(W-g$X-Y!MvYn|p@SMWy9L^N-emJq+PMVy$miyZVvzf`gNNGge z^0?Gz!E?UObY#{+vJUZefIIV1_t-W2eLd+l^B0+lxTn=(N`qcU)P;$3rJml;BbermNBP-G?hCTROARK@K@ns5;?c>=O6p0vV?Kv| zzu|My#{=rLTpd-NZFpcU&Ylfe@UyAMNIkMoO)X>2)$#b$`TV)gjC+$c_0w^&8p^!2 zSo>q`)vc<<-vsh=o_Cy!`2NV)vwAtqO^j&Ylp2d?d*--XuNHiE{oLI{EVwR>hAi}N z@qXURvNoFjxgNT$1!gtZWUgM>amuzc_Q{L8pP%UFkpK3eHOcE^vr8*+&VuX`*C0?u z0??DH=oQ$MmjLvnyrgg+2>1y=Px5oYt3OXbu6gzPsE`$R{_QU7^O`f^5(9*M&Q-rZ zq{(zfTYZj|=(pKT@2gNnxKo?}zNuGF2nxOe=Agq0W1gIS-}cu@jvwZ{sDtlJnCV#$Epj zc3MxmoOq8XpQ$+Pb1kT4D*n!gRqAZRGVD_JCti?om9C-B+r_wUyre?zN1Pj` zhLLr;8@vayC34I3dG*?ya^uMQOih}5zCaG5p1;-z%ZY-j`mh5+;=g8~A&wN)gLt}fnv7|QD@a!EU&V>qiUXgYaq*&>h=6ft>qv~7ww80vmnzqy; z8~hz)P&nTe1^ipOooDv_x;c(tCyr+hnFOe5&ga(AT5eL`G?82RNmqPlK6^>8tJPzNZ0Vg6@pW7Xe>JJEe93z*)j5EN&78V{9c#3XSIQzr z^2Vbw-92-S_bJXd6msle&Ig(gt(K(vGXFhNjm4k+M~S-JNijIf9+Z)_b?BPjqQS%twR2zXu5O_TS=t-|l=Zvw>|c+!_~dAmXR9MyN6J)%bJf}7rD7muKp3tF&g99 z^Ow0$t_@yhiM@W!{=%&1%f#0@v8FWs6Mks0R%7xm1XJ(5x}6h`Y9>b-J6f1OZhBMU zb1_yPJ;~U}^`zU{jvJ3s?<~X4>mU6hpMPe~n7gqz^d6JmY^Qsq{an`#Q|yv;nOqID z;e7s1ciGEv^nj<0%}?|Cy4e$YrfF4fto5C-lpk9|N7LYqe^yVDF{(|;d@RU=>q*JH z%=T#G^enYQ#mRnu7aYg*TDG0(AiB8u`SIj<-uSGj{d{uYrmP!o@>>(b<0%OI6anZ- zKSdhjyn+Dqq*qWypWj5_m3q?u`9J^Xn^0n|4-%02M6$MOuCB$u-EX$%bEn)h;O)9P z=nQFn5Qzn9V9{^0!+$&Oiae(H-~XNABF?iAmhu{C;+!?F$7xb;w4hTc&KuW%+ZSWq zoC6QD<2)ym8{n)%0vb%$h4#5wtB*7ctew+aXI0Dd${StU$s`HgVUGFOv%lS(4oaP! z?bZQ)-uyY|#MBz@($+T*J)ii|+N@Y5_Wu-(FYZ(2thLSlCCy(wa;%IwR^<4CX`y($ z_Hm)jZ0Kl)TBm5XdU1Y^7)*?1G*9uiQ;(Z98)p|C=h2LNZvMs1u~fe$*g57Tp4k1H z>HSXj))UPKK05@zMxN*6$ z&if_xQ#I407#~bm>F*S|@6P0!x%Ov2%WtEsk*#t^J;(L&*>=K*?WwRe|2VF#W!s5f z#OEiSBgZ*;=DSvY=CiI{{ZcZ4o+Oy#@+}0QC%pwb27M9%=t)lkiEh4@z$^5m|M5Tm z2mP1-@?Ypr{^U=-mMbP+eFB&8NW1NpcDo(_?s=b4hL9lE1g-e*;-|xow%e$k+JkcI zM~<^sXS-z#bE}W+_ju3UUfZ&x{ek!IW#3%Ocg|sS4qwRoz|ud}oxk+^&G<5t;(eEV z&erZ4R~%b=KKab&%m?E!8jiUgcq|?J_k!5iSo}im!`$;Y+v`|6I-DHU$=hLZcHVBd z%#f{%-ib~Jk9$9RU&Dg0l^cimKVI!ppY<(&&hIl+W|bR@HLT+y zjt%}!iO-|Vp5`t(3$jptlI^Xmjkbq;S7pa3+b*9~kKMJOMteu0Cq2dytsf@qfDgFdRXfi2X!gB%Ed@HmtsVkveFmYkzt3|cUV1Kp(>l`eI5%~2E06TKqoOwu z@DhNYBrQ9ViLBK_8H{g%;@^qvOjNtJaw3@bta>-QqGaPO-L zARY@5mbG=fd(;Z`hMOG%9E;Ie_W{lKzWhPwZajG+f%P!B{+lb%XE8ppZ*&C$MF~Jp zDoPCZSBU`hq$+s>w$zb889m9Di=;Iq`3OC!ju8QyQv`U;r0W#-t!H#=NbWU$7h8?j^8aEohUhIp@6-FFut3*BV?0mJ}e05Rak0Q97nFWoS}lL9hR# zZL@)%^lcu;e4kCAjGm-zxRQ z@;2uB3IdPlNzxu)&Jy$_NeI^<@I3_1rz0JY{Cf&{(ib|Z>+7$2Zhu03UwE-EW?Wsu zQ{2ai&KdVq>*aH7ubz9}N0-s_=Jc37RpD>#I8t~o5YD0X!Qnusvx>8`iO1934$9HD zHvUAcTED7~ksUkc6Ygj}o6&5ssmbT29CNe+0T6f}0q9BZV~>#^CjdR^afayOy9qo? zPtp`+&Jy$_O$Co2@I3@B`>8qSrO_Nwc-c^(&suH{=@g?l?|1V8`;`~;vU`MKcLdJuq~R1ZJF%IXq$ww@$s`p^IT&+;j*K>!54fIzq&S?#1X zW<6<3ZN08WRC+Ht?FyV}$9F<)pojK|NV_nc_hwCntao`0Ul zT>TfF;p6tam%p8_wWC49b%vgl(vn)V&>9izNv+rqt>M~qd|};1$LUR-%CyM7ur|Ir zRzn)KY@Cf)Puh+3=fv{aO*-bYb4!BDo)O*w0T2LzYy!}evf1FB>JxyTRDB=8!fF$E zrJhvnnZr5|0D)H!aP*{r^`!I0tkWC84Lyn1_=Dv!)1;qUqx($Yb$bx6+r=DwcSf&W zXuFuxY(A&C_+8AW)YUpuvqRJQ!g+r_kM<=!mL21>>T!GC%iqq)+F|t)`z~Llw4^pI zkCNz-CfybVK|tNf#xxDrL!*Oc>Qv_L+ZWcxpVyPN9zBUz)780J&Hm!H@pu;mKmY^^ z5`dmm5EyQ+6anZ-m2wA+sUZRANi}pDOa_4p6Sy4aW`9kyzhq1I)YEx6ti|Yzl2m@u z^`16uGHT-d+#1~n_e^7*2f{g587BG~CSH41KZ$NjKh1BC`wA}1d+Rr82(`K`w?RLwLJ7bS@LwMNHCVv0;{~c+!T~S}> zCvmN(#db%#gPw_OdG9*3x>T+_r?|g(Zlic^!_k=Lt6get_eM{@pWhzKpEW;KhG@5< z3D+7@yho!6+q31pjp-50D>?mR?$5Zeb|mzq)5_%FMEeUnHK9}%7>&1-5BO7C@?IC5Uwej_=Y(7#n)@3_3^B7BA?6@#G zZ!k>OjY>@cFMt3DfIw~n(35hb!i^Oq06nRKPJv0aA^<(9R_=naAW#DWc5m1qUeN3M z#DS<+WA&sa4W|>kCyw)!eEZ()8a=Hi9advgV>w-`s7>>o(0)Yy9CdGdymgs!9i8Bs zD;4c;`@bf?HtTb@Z?>awqEdeSMjN%A4Kl`O`*_dXVlU>V8|8k?Z;$2QprGB#u&G7! zeL{p`TMGH-j_uM8vo9^BC3Q(kDNdJ8J#JM$Da@>O73ra>^@Y~sZpNJ153N3JbmAS~ zEp2=?E3;2e*WEJnOV$EsU$>)}ZZtZyO}j}=6h9yU0w7SB0Q987$k3od1fVBX$QdxD zmIRnT6)(`;=w+E_iQL8I-N_vy&>I_Fv>v>Llc zclD&hBB8f5Th#4#98IXvPk)G_liR;LY(__H;f#ODrPjx-$(s6U*M{j^0m_Tn@4=$^i8z<37)K;YX5Ku`KM zkAK#Dp(lNoKQWu1CjdR^=b2+f5C8#|0Ytr;;Z>M%&#Fr9d$VhFp(lwt!)o2$pKin% zaUm^7`dlm4KDh3YR9#jBkz*6@J+pg@d za7r^Ub#o$HliGp3`PNl_dn|t*k6909mUXzDnKRQG4N)`b0smxKE$tZ0X4KR5&EuT1 zjw&K_>nEirMK^~VS&v&p%E`@F8_ajM_w$YhLB!)4e{nr|Y2!OtSwo|%%Wi74Kbw1% zybI4k00cmw7y;->#dzWFY7u~*R4sqNn)(rdo>V`d!D0~j1Ol#}6l(yY#>;gbF3x+i zYjmq8?M2>*Jp0}9xzMbua*5QMKUs(PKz*S_1nsuaZ<6=Ay2~BK!VaIha{CdgMe5GY z$m(64iO`bFoo+5wxqOo%_SkdieOkmuoGUhp6Sp4okC~`*VdKE+IFWz#^Y-n$u}nQ_ zWV9BukB&#aHwRg-Nbl#AHolXU15Q2R+GhHkx1_$Bx)(2i00@9UP6E)Aa)QEbl_UT? zsgiDiQ8gj}J*h^{f~g?zK?J;d63=fZG@=IAzSjHR>>AzbN$a82T>6VWg{Ko8k4N)+ z3Pak8Jw8$=P$(~ZHwQ@T68(kVxuk*T*IjfA|6|^M#C$wUO>=(KKfW1QJG6epkFB=IkK*TTHy6$6r;wg>p@qo<3uvAUi)+Vc z+H-yO!znbman{E7vU28qeIoq*P@Y}7XS@OeAn?5epeKE=?>}MY(33vFiH}zxJ=vq$_YvXvYlh%W>9(_4Hu71T@L~rhKiWuvT?&4`I zUdr1~zWdI*iOH$axiMm}9GCgVQ5~iEyWOY#Df)iEKkg{fj#y7>kD@w3tPM)Px5w&i zLC;SiJxT0yWNkBVy{xLRO3z;SBp9aZE2ZzpDPe$ktSRKwD|~y8j*Fh7LnP}qMOMjm z_{gclB&^PHnYSNt->p0naaNswzu!HR#5i|!vN9UUGyIdBfwhC{Vt2-@KH8t{MAXaT zn3(tqa~IW?dl6<%nlrEW4xlo(X?*-dkRM%-0iM0|5{K z0ZjmUk|u%2Iud}MR7bDD<|+|@o>V1oz!nhr9s=n#wL5nwZ>ZU!VLz=WP0ab{yccPI zy6$&7@t!y5H$2n%tbRiZ&*I=QH5}JkZh6-3y?Ju)m{^D3(OukGB%kH&N9YSqU2wNQ z$*_ug(!>67r+a;7wHiJbP;Z7b_nl~L^dF@)cGG9Q71WdL9J2M7)8RlzwcjlcFKeT} zjr3czH;~Vmdo-2}gIgCO{%+}%x4OW4AOHd&kRSj(DFFmeYefKhQmxztV=G7idQt_Q z0+T@C3kamw)X7OF_PrV1$F9+3&FZl)7lpeFH&g2OhcubaXnT@+l2}`F-_4e-#gwky zE$)429WMI0sY{)OzR;lQUfOLr$r{*$mCV$!_uRh9YmeM#X8Fs$eg1sRKeBgwZMB*P z={imJUA{`3$JXdf=`3%^p(n|Gk#Y{+e5cFK*0^S$Dlb?Y-^)r)`+Ci`_Vni{wl#GR zUH}0Q0D*!8peGdshTAJe0D4lT+yP^1NC0|L4V?y)LEr-j`1FU=v=aN?qWU;?jec14 z?Oru+J(vRx#2Ic{ zMQyDOG@4v1+OIifnsR+3zddC%l1KcLWw*5>Lr>y{&bZ8|JKNdra_C82QQKVBJWpv; z+-tbD=fVYp)pZezOz22?8Jh0xkjQ zNiGjOs}}+2N%isRdNlySXXyf873TP3JRBJGNF+cQmEhY(d2(oc#KYI@{gqMXFZN zkT!>q5nbrGojdROYd-mCCSS{MPZ^Dbm7P-lNm?nNTRXD#B*kdf6~1S^ZKiX)GV~-_ z+g!!bbUvf``p84Oa|pT<+MPJ#>2jvsa!i5I^lZH*Yom-+I}3m8yW`}IW!r0xE7oVV zz3uTfM+4jf0w4ea_X$8xy3YuARF?qsr0V(xmeqp*^rU+D308u@rxEb4seQ9d?t5#| zO35nm&v`#LYhxR6(b}q*@Vxo>VJ$!B`OZ7y?pH8m)EaP{#BQQZwpM zstj|uqjAsb3{r0iIIm}Yuxsc2Oq}P&`-%>pA=e|J9kt{7JK=`r)k0 zE{+oob^Nln=8JpxemnyK5CDOE1fVD7O%l}Qhj^{OF;kxZWFkK zN7`+-wA=0YcTdN#OiiKNW1Pe2{J4t$J z9q(g{&Ib&=jKkxewsDN@54^Y1G<@#GvsqnsHt$Z>hkCBn=nVuw;2Q}*Px?l$f6knt zCw-1DF_ZTYfS&Xo?idvWKmY_l00e%Dz@n$?Np)%WDiQ3bCWCQ600b&U0D4lT+yP?> z5`dmm5EyO;fdm2QNeLi$3IZSi0w4eapF}{^;qJ}LpHBEmNH7-=0D`YeB9HXr~3AOHd&UYe6A%D_ni7DX zR8z;n>?;B2NeBcGc#Ht_q{sN7H3)zJ2!H?xfB*=900?|50q9BJ>iN%@H}s^>@FQmN zJ_68_-p3vzg8&GC00@8p2!H?xfIyuIKu@Z(_h38pB*Xv+JVpR|(qsJ48U#Q91V8`; zKmY_l00h330Q979_55ed8+y`b_z|;s9|7n|?_-aVK>!3m00ck)1V8`;K%mY9peNPY zd$1jP5@G-Z9wPuf=`nt24FVtl0w4eaAOHd&00Q4i0D985dj2!!4L#{I{D@h+j{x+f z_p!&wAOHd&00JNY0w4eaAW&xl(39%yJ=hLC2{8Zyj}d^L^cX+11_2NN0T2KI5C8!X z0D*5M06pnjJ^vZ=hMx2pe#9)^M*w=#``BY-5C8!X009sH0T2KI5U4W&=t*_<9&Cr6 zgctyU#|S`AdW;`hg8&GC00@8p2!H?xfWWsBfS&ZNp8t$_Lr?k)KVlZ|BLF?=ee5wZ z2!H?xfB*=900@8p2-KMX^rSj_54J;3LJWYwV+5clJ;o2MK>!3m00ck)1V8`;K;T;m zKu`Ks&ws|ep(lNYA2Eyf5rCfbKK2+H1V8`;KmY_l00ck)1nNuxdQzRe2iu`1AqGI; zF#^z&9^;4BAOHd&00JNY0w4eaAn>gOpeKE+=RafK(33vHkC?^#2tZGIAA5`p0w4ea zAOHd&00JNY0(B+;J*m##gYD3h5Cb6a7y;->kMTom5C8!X009sH0T2KI5cpOC(38H^ z^Pe$q=t-a9N6g}V1fVCqk3B{P0T2KI5C8!X009sHfjSd_o>XV=!FK3Lhyf6Ii~#hc z$M~T&2!H?xfB*=900@8p2z)C6=t1V8`;KmY_l00ck)1iqC3^rUa~{AbJ? zdeUe35wmz70q9BZV~>$R00ck)1V8`;KmY_lpw0xKC)L?|upN35VgLjlBLF?=F@9(b z0w4eaAOHd&00JNY0^dpideXOg{xjwcJ?S(2h*`Xk0Q98yvB$_D00JNY0w4eaAOHd& zP-g@hM3fB*=900@8p2!H?x)R_SE zq&j;KwnI-s41mC61fVB9#t*GQ00ck)1V8`;KmY_l;9ChmPx@BRf5yC_Cw+z=F^l&R zfS&X|_81uiKmY_l00ck)1V8`;>P!H7Qk}gA+o2~R20-930??BlHD00JNY0w4ea zAOHd&@T~-(Cw;5uKV#m|lRm?bn8o`DKu>xfdyEVMAOHd&00JNY0w4eabtV8ksm|Vm z?a-4D10e7i0q9AO@k476009sH0T2KI5C8!X_*MeYlfKpSpD}OfNuS|I%;J3npeMbL zJw^rr5C8!X009sH0T2LzIun4NRA=wOcIZin0T6hM0Q98C_@OljfB*=900@8p2!H?x zd@BLyN#E-E&zLv#q|fjpX7N4((39TB9wUPQ2!H?xfB*=900@9Uoe4lssAOHd&00JNY0w4ea-%0>_ z(zkm4Gv*CF=`;L@S-g(`^rZK($H*W60w4eaAOHd&00JOTX9CcZ>g+w(4m}Am00NH@ zfS&XiKePq`5C8!X009sH0T2LzZzTXd>03Sj8S{po^cjA{EZ#=|deZyYV`LBj0T2KI z5C8!X009uFGXdyHb@m=?hn|EO0D;E{Ku>y%A6kO|2!H?xfB*=900@A*Nqm-C5^$79CtiB6{zh39j*&e6(Gz%W12#eWCCdZCl> zOPGBlT|(`{Tm8v_&Zh5E_&(pBPg!vnzs|9D3PU>In7f=6uAe~Qe4xc_Mzh(14&KnX z&~d+`-EPmnJK7(^Ck*QAqTD!_@EF+@+j#49V@EAF7SWlGhdu50>i0k=FE2aFV^?Ku zEIMl0amuw*-(80*KNVBu7>4opzEm7lT1(Kr6q%k+A>UpFZNh3(dOC$S=W&BflXGq3wXE>vy=>Hj)h>sTkAqNj)}cwts07h+$F3i%0!u*XGPQ zp(lph$!&i%d$fCkYs!ri(p2kUshEkr-+HrM%B5w;nsn}bXEys!)7Q$`n40R{7s`%P zrd_zX6H8Yg_Go)Ap3ZCYeWkubvc602P98UaK*b0^PpX(hU``I%qtT(|p7-eTzPHWXe$E<=ghp0!EE%_rMnL1m_PQVVxLZ;$uq^U_ z7QG~*7fafBqeuT+WydMg?y{qvh$WTVwmF>W%<;5e&z$_XX8+drS^7Kj)!$iucz6{A zo=*UJ(({?3$DbnrJ?ZCIW2Da{06pn5{rb7Hl6q2`HaGSdY$jq|&v`J<-qZ29j6E|u zE$v>J);OJabavP8I)7)dOjF;E+h#32^a)O$;j>;k3yo*A@n%D1H7)$QT$i^-R@3rz zbl%OVY1W_tE&VB7zNTOG+9Uou%zGw|rinzO?Xf9yq_|nP`ytwA?sH z8kq3|nkSMc<-7u+gO?lYLUWM^HBNp;I9Jf?EE$NUbhI`ztXu|Ig`28W* z=$X!!T+i3PV9@<;caes&TTW>>7+m`vj>fdyCKiqfbm!Bamh&l%)L6q2jkwKpHm42e zE~I}#+VLDVai9B@8f(aHCbZlf+??POoXPTJ&khbxkW_K+&8B-_4eeS06>SbXQZW8?;7?YhB}0Qe%9| z{E6fo<(@kM$+=wg;(dRtD`l-4i^P}iJmegk>39_RljCbVTV3_N(|*fwy`{ZVWSO~b zIZigav<7(X@Ir^3ubm!^sIZOUf#Ypro770{tCSi_K#R1b zNxP}ln)|GIUc&wLJ3-}}WwE-(X#9ROm*V5730w|VYxL%`a6U{|Ymr6=FE|v!3QlG7Hs43zuXA+{tFd<-6W!OQ`OfL}W+<#jdd<|J zaiUO&Tu*KIEI3=^sz**`VVMsh@|+C2ET4$^HV10IT}VTdAj93r&q~ z=FyW%#Ftt}uSRm8l$dwR`litw+E@|XBp2&w!BMtTHP0bUCCNj-I)_%{I1A9GJ1^Lp16*UQ;&-|>F3IZ_IT?y;5uD_urtyJON_(4 z%KRgxW%+(K=Ch{1#|;xeP!f>Cb@H0_PayHb6Trj z4#f8`$LOhyf3GH&v+u-zQTR)3Wwc|To^%vie3#~nk;z@m(wVae<8=_I zDgo$8RrL()%0mEpQXWdU2L!SSKu^kMgLkS(z^@T`Ej`Y~8n9z(rEW%P{Y9^NqqXUQ z27y?st2J(?OP#h@*YIn}dLzDmgHE3Y{e%Y4nb`F{YXq~dJ66!{P_NseRzff7$&E3* zF0*?q8fJYG%_Guq4hva}g~w>NsLTDzb+M|avdDQbk|N>m|+=QQ2FP#Z(-m zbrv;}+oBJ7zxIWGy!u4UH_8nPY0`21(cn7ZYL8ia6xDZn<^1ny9!J*kviG}{i?4Me zZd+ZBt)3^AWxh^|Tk?}4K2Ne8D+@(G1DCyf{#`R@bG&sEaoptnT`Ga>zW;MSqsv$N>?G==H5x6t%5P=IDckPe#N}S# zMwfPpfU~}A(18D_aoO4WanO_Q!NvP^Apkw8E}nv&J_68_d{pon2;?UKJt;pc+*t(z zV*ShOi?x628J)P+Y**?r?TOjnCI5Y|){Ud(j!uUy?|U25meX~16QTdK`m`2$OSoU! zdLyh|$a*Ahzr1!>*u06$!Jb2=bdpiLZ{l*8Tit=ro7y;=f-WR$KskG?#CrIuyL3jh zJ05Avd+f$@)_M|kXZzEQSXYO%lzA>9Pw1wHIk(7YSe>cuPweGrkE6OmvgWqbp0kGwz(!D*J=tlrnLUn2*kO18QiR&#pg-1D`TV0so{LAm9r4`7a?9E!S$fsp);|fv zc|NjVsd;E*avjlVM|EB0Ydv3~7tRwgXA8CCy?Clau{LV(-^90xzlrZfeHfoDYK=eZ z>NTam28p)YKFV4v_V4g=|IS43gOhqrTiea;%^7gEz3N}GOZi0IAm%IQBl*d-*(>HR z$1>VY9ABBwTf9z}nrF%QlKPI+=M)RCx;1;z~{}rDn-L9mK(uYzjypF|M zWRLgcb$fl9tn{8Y9$nN^m;ST%d9HX)W^Wqnni6j`mS1~xdkSsNk)HSU22q!ZeH-xi zip(=}KB9Nost(iRSWbE`n`_y%)!LpVc;!-ZtaQ&@2hH>S*l6|>T6VhS-B%v8@gQTE z^CsJY)kvM1>Sf0%+b(nBAx*pbJ5<@~ey4FFlKt-HeSG?>u~f`w+JHAepc(|ACso4_ zu%a9R=tjZHolI@rGvB>lc16Hh6<=&#ph0h9?t75Kq5}vMgl9#g)we|Xs*S$KA zLh370)6zrPJv9yLbDmUqI*B

BRHe&TLKMylZ)zU&LpbUlSUnE+yAf{JPmo6W0_G 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%0D02%wmmgR009ILKmY**5I|rU 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.status != ESP_BT_STATUS_SUCCESS) { + ESP_LOGE(GATTS_TABLE_TAG, "Advertising start failed\n"); + } + break; + default: + break; + } +} +``` + +The function to start advertising takes a structure of type ``esp_ble_adv_params_t`` with the advertising parameters required. + +``` +/// Advertising parameters +typedef struct { + uint16_t adv_int_min; /*!< Minimum advertising interval for + undirected and low duty cycle directed advertising. + Range: 0x0020 to 0x4000 + Default: N = 0x0800 (1.28 second) + Time = N * 0.625 msec + Time Range: 20 ms to 10.24 sec */ + uint16_t adv_int_max; /*!< Maximum advertising interval for undirected and low duty + cycle directed advertising. + Range: 0x0020 to 0x4000 + Default: N = 0x0800 (1.28 second) + Time = N * 0.625 msec + Time Range: 20 ms to 10.24 sec */ + esp_ble_adv_type_t adv_type; /*!< Advertising type */ + esp_ble_addr_type_t own_addr_type; /*!< Owner bluetooth device address type */ + esp_bd_addr_t peer_addr; /*!< Peer device bluetooth device address */ + esp_ble_addr_type_t peer_addr_type;/*!< Peer device bluetooth device address type */ + esp_ble_adv_channel_t channel_map; /*!< Advertising channel map */ + esp_ble_adv_filter_t adv_filter_policy; /*!< Advertising filter policy */ +} esp_ble_adv_params_t; +``` + +Note that ``esp_ble_gap_config_adv_data()`` configures the data that is advertised to the client and takes an ``esp_ble_adv_data_t structure``, while ``esp_ble_gap_start_advertising()`` makes the server to actually start advertising and takes an ``esp_ble_adv_params_t`` structure. The advertising data is the information that is shown to the client, while the advertising parameters are the configuration required by the BLE stack to execute. + +For this example, the advertisement parameters are initialized as follows: + +``` +static esp_ble_adv_params_t heart_rate_adv_params = { + .adv_int_min = 0x20, + .adv_int_max = 0x40, + .adv_type = ADV_TYPE_IND, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + //.peer_addr = + //.peer_addr_type = + .channel_map = ADV_CHNL_ALL, + .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, +}; +``` + +These parameters configure the advertising interval between 20 ms to 40 ms. The advertisement is of type ADV_IND, which is generic, not directed to a particular central device and advertises the server as connectable. The address type is public, uses all channels and allows both scan and connection requests from any central. + +If the advertising started successfully, an ``ESP_GAP_BLE_ADV_START_COMPLETE_EVT`` event is generated which in this example is used to check if the advertising status is indeed advertising or otherwise print an error message. + +``` +… + case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: + //advertising start complete event to indicate advertising start successfully or failed + if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) { + ESP_LOGE(GATTS_TABLE_TAG, "Advertising start failed\n"); + } + break; +… +``` + +## GATT Event Handlers +When an Application Profile is registered, an ``ESP_GATTS_REG_EVT`` event is triggered. The parameters of the ``ESP_GATTS_REG_EVT`` are: + +* esp_gatt_status_t status; /*!< Operation status */ +* uint16_t app_id; /*!< Application id which input in register API */ + +In addition to the previous parameters, the event also contains the GATT interface assigned by the BLE stack. The event is captured by the ``gatts_event_handler()`` which stores the generated interface in the profile table and then forwards it to the corresponding profile event handler. + +``` +static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, + esp_ble_gatts_cb_param_t *param) +{ + ESP_LOGI(GATTS_TABLE_TAG, "EVT %d, gatts if %d\n", event, gatts_if); + + /* If event is register event, store the gatts_if for each profile */ + if (event == ESP_GATTS_REG_EVT) { + if (param->reg.status == ESP_GATT_OK) { + heart_rate_profile_tab[HEART_PROFILE_APP_IDX].gatts_if = gatts_if; + } else { + ESP_LOGI(GATTS_TABLE_TAG, "Reg app failed, app_id %04x, status %d\n", + param->reg.app_id, + param->reg.status); + return; + } + } + + do { + int idx; + for (idx = 0; idx < HEART_PROFILE_NUM; idx++) { + if (gatts_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */ + gatts_if == heart_rate_profile_tab[idx].gatts_if) { + if (heart_rate_profile_tab[idx].gatts_cb) { + heart_rate_profile_tab[idx].gatts_cb(event, gatts_if, param); + } + } + } + } while (0); +} +``` + +## Creating Services and Characteristics with the Attribute Table + +The register event is used to create a table of profile attributes by employing the ``esp_ble_gatts_create_attr_tab()`` function. This function takes an argument of type ``esp_gatts_attr_db_t`` which corresponds to a look up table keyed by the enumeration values defined in the header file. + +The ``esp_gatts_attr_db_t`` structure has two members: + +* esp_attr_control_t attr_control; /*!< The attribute control type*/ +* esp_attr_desc_t att_desc; /*!< The attribute type*/ + +The attr_control is the auto-respond parameter which can be set as ``ESP_GATT_AUTO_RSP`` to allow the BLE stack to take care of responding messages when read or write events arrive. The other option is ``ESP_GATT_RSP_BY_APP`` which allows to manually respond to messages using the ``esp_ble_gatts_send_response()`` function. + +The ``att_desc`` is the attribute description which is made of: + +* ``uint16_t uuid_length``; /*!< UUID length */ +* ``uint8_t *uuid_p``; /*!< UUID value */ +* ``uint16_t perm``; /*!< Attribute permission */ +* ``uint16_t max_length``; /*!< Maximum length of the element*/ +* ``uint16_t length``; /*!< Current length of the element*/ +* ``uint8_t *value``; /*!< Element value array*/ + +For example, the first element of the table in this example is the service attribute: + +``` +[HRS_IDX_SVC] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ, + sizeof(uint16_t), sizeof(heart_rate_svc), (uint8_t *)&heart_rate_svc}}, +``` + +The initialization values are: + +* ``[HRS_IDX_SVC]``: Named or designated initializer in the enum table. +* ``ESP_GATT_AUTO_RSP``: Auto respond configuration, set to respond automatically by the stack. +* ``ESP_UUID_LEN_16``: UUID length set to 16 bits. +* ``(uint8_t *)&primary_service_uuid``: UUID to identify the service as a primary one (0x2800). +* ``ESP_GATT_PERM_READ``: Read Permission for the service. +* ``sizeof(uint16_t)``: Maximum length of the service UUID (16 bits). +* ``sizeof(heart_rate_svc)``: Current service length set to the size of the variable *heart_rate_svc*, which is 16 bits. +* ``(uint8_t *)&heart_rate_svc``: Service attribute value set to the variable *heart_rate_svc* which contains the Heart Rate Service UUID (0x180D). + +The rest of the attributes is initialized in the same way. Some attributes also have the *NOTIFY* property which is set by ``&char_prop_notify``. The complete table structure is initialized as follows: + +``` +/// Full HRS Database Description - Used to add attributes into the database +static const esp_gatts_attr_db_t heart_rate_gatt_db[HRS_IDX_NB] = +{ + // Heart Rate Service Declaration + [HRS_IDX_SVC] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ, + sizeof(uint16_t), sizeof(heart_rate_svc), (uint8_t *)&heart_rate_svc}}, + + // Heart Rate Measurement Characteristic Declaration + [HRS_IDX_HR_MEAS_CHAR] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, + CHAR_DECLARATION_SIZE,CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_notify}}, + + // Heart Rate Measurement Characteristic Value + [HRS_IDX_HR_MEAS_VAL] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&heart_rate_meas_uuid, ESP_GATT_PERM_READ, + HRPS_HT_MEAS_MAX_LEN,0, NULL}}, + + // Heart Rate Measurement Characteristic - Client Characteristic Configuration Descriptor + [HRS_IDX_HR_MEAS_NTF_CFG] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_client_config_uuid, ESP_GATT_PERM_READ|ESP_GATT_PERM_WRITE, + sizeof(uint16_t),sizeof(heart_measurement_ccc), (uint8_t *)heart_measurement_ccc}}, + + // Body Sensor Location Characteristic Declaration + [HRS_IDX_BOBY_SENSOR_LOC_CHAR] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, + CHAR_DECLARATION_SIZE,CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read}}, + + // Body Sensor Location Characteristic Value + [HRS_IDX_BOBY_SENSOR_LOC_VAL] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&body_sensor_location_uuid, ESP_GATT_PERM_READ, + sizeof(uint8_t), sizeof(body_sensor_loc_val), (uint8_t *)body_sensor_loc_val}}, + + // Heart Rate Control Point Characteristic Declaration + [HRS_IDX_HR_CTNL_PT_CHAR] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, + CHAR_DECLARATION_SIZE,CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_write}}, + + // Heart Rate Control Point Characteristic Value + [HRS_IDX_HR_CTNL_PT_VAL] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&heart_rate_ctrl_point, ESP_GATT_PERM_WRITE|ESP_GATT_PERM_READ, + sizeof(uint8_t), sizeof(heart_ctrl_point), (uint8_t *)heart_ctrl_point}}, +}; +``` + +## Starting the Service +When the attribute table is created, an ``ESP_GATTS_CREAT_ATTR_TAB_EVT`` event is triggered. This event has the following parameters: + +* ``esp_gatt_status_t status``; /*!< Operation status */ +* ``esp_bt_uuid_t svc_uuid``; /*!< Service uuid type */ +* ``uint16_t num_handle``; /*!< The number of the attribute handle to be added to the gatts database */ +* ``uint16_t *handles``; /*!< The number to the handles */ + +This example uses this event to print information and to check that the size of the created table equals the number of elements in the enumeration HRS_IDX_NB. If the table is correctly created, the attribute handles are copied into the handle table heart_rate_handle_table and the service is started using the ``esp_ble_gatts_start_service()`` function: + +``` +case ESP_GATTS_CREAT_ATTR_TAB_EVT:{ + ESP_LOGI(GATTS_TABLE_TAG, "The number handle =%x\n",param->add_attr_tab.num_handle); + if (param->add_attr_tab.status != ESP_GATT_OK){ + ESP_LOGE(GATTS_TABLE_TAG, "Create attribute table failed, error code=0x%x", param->add_attr_tab.status); + } + else if (param->add_attr_tab.num_handle != HRS_IDX_NB){ + ESP_LOGE(GATTS_TABLE_TAG, "Create attribute table abnormally, num_handle (%d) \ + doesn't equal to HRS_IDX_NB(%d)", param->add_attr_tab.num_handle, HRS_IDX_NB); + } + else { + memcpy(heart_rate_handle_table, param->add_attr_tab.handles, sizeof(heart_rate_handle_table)); + esp_ble_gatts_start_service(heart_rate_handle_table[HRS_IDX_SVC]); + } + break; +``` + +The handles stored in the handles pointer of the event parameters are numbers that identify each attribute. The handles can be used to know which characteristic is being read or written to, therefore they can be passed around and to upper layers of the application to handle different actions. + +Finally, the heart_rate_handle_table contains the Application Profile in the form of a structure with information about the attribute parameters as well as GATT interface, connection ID, permissions and application ID. The profile structure is shown as follows, note that not all members are used in this example: + +``` +struct gatts_profile_inst { + esp_gatts_cb_t gatts_cb; + uint16_t gatts_if; + uint16_t app_id; + uint16_t conn_id; + uint16_t service_handle; + esp_gatt_srvc_id_t service_id; + uint16_t char_handle; + esp_bt_uuid_t char_uuid; + esp_gatt_perm_t perm; + esp_gatt_char_prop_t property; + uint16_t descr_handle; + esp_bt_uuid_t descr_uuid; +}; +``` + +## Conclusion +This document explains the work flow of the GATT Server Service Table example code that implements a Heart Rate Profile. This example begins by defining a table of attributes which include all the services and characteristics of the server, then it registers the Application Profile which triggers events that are used to configure GAP parameters and to create the service table. A service table is initialized with all the parameters required for each attribute and the service is started. This example shows a practical way of defining the server attributes by using a table instead of adding characteristic one by one. + + + diff --git a/examples/bluetooth/gatt_server_service_table/tutorial/image/Table-like data structure representing the Heart Rate Service.pdf b/examples/bluetooth/gatt_server_service_table/tutorial/image/Table-like data structure representing the Heart Rate Service.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b69769f2e52d1ab4f31768e9278f06d8a0f4b9a0 GIT binary patch literal 33702 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 literal 0 HcmV?d00001 diff --git a/examples/bluetooth/gattc_multi_connect/tutorial/GATT_Client_Multi-Connection_Example_Walkthrough.md b/examples/bluetooth/gattc_multi_connect/tutorial/GATT_Client_Multi-Connection_Example_Walkthrough.md new file mode 100644 index 000000000..b39bdc0a6 --- /dev/null +++ b/examples/bluetooth/gattc_multi_connect/tutorial/GATT_Client_Multi-Connection_Example_Walkthrough.md @@ -0,0 +1,326 @@ +# GATT Client Multi-Connection Example Walkthrough + +## Introduction +This document presents a description of the multi-connection BLE GATT client example for the ESP32. In this implementation, a single ESP32 working as a GATT client connects to three different GATT servers at the same time. This set up illustrates the use case of an ESP32 device acting in a way so that it receives data from different BLE sensors. The unique combination of ESP32’s BLE + Wi-Fi capabilities in addition to connection to multiple peripherals makes it a great candidate to serve as an IoT gateway. + +This example’s workflow is similar to the **GATT Client Example Walkthrough** and is shown in Fig. 1. However, in the multi-connection implementation, a GATT client searches for three specific server names and once that it has found them it opens a connection to all three of them one after the other. In code, each connection is handled separately with one Application Profile. + +Four ESP32 devices are needed in order to demonstrate this example, among which: + +* one would be employed as a GATT Client flashed with the ``gattc_multi_connect`` demo, and, +* the rest run as GATT servers flashed with the ``gatt_server`` demo of the ESP-IDF Bluetooth examples folder. + +![Multi-Connection GATT Client Flowchart](image/Multi-connection GATT Client Flowchart.pdf) + +## Includes +The multi-connection example’s main source file is ``gattc_multi_connect.c``. For details, see Section **Includes** in **GATT Client Example Walkthrough**. + +## Main Entry Point +See Section **Main Entry Point** in **GATT Client Example Walkthrough**. + +## Implementation Procedure +The GATT Client implementation includes the following steps: + +* system initialization, +* scanning configuration, +* scanning of nearby devices, +* connection to devices of interest, +* registering for notifications. + +### Initializing +See Section **Main Entry Point** in **GATT Client Example Walkthrough**. + +#### Application Profiles +Application Profiles are a way to group functionality. They are designed so that each Application Profile connects to one peer device, that way the same ESP32 can connect to multiple devices by assigning one Application Profile to each one, as Fig. 2 shows. Each Application Profile creates a GATT interface to connect to other devices. The Application Profiles are defined by an ID number, there are three profiles in this example: + +``` +#define PROFILE_NUM 3 +#define PROFILE_A_APP_ID 0 +#define PROFILE_B_APP_ID 1 +#define PROFILE_C_APP_ID 2 +``` +![ESP32 GATT Multi-Connect Client Application Profiles](image/ESP32 GATT Multi-connect Client Application Profiles.pdf) + +The ``esp_ble_gattc_app_register()`` function is used to register each Application Profile to the BLE stack. The registration operation generates a GATT interface that is returned as a parameter in a registration event. In addition, each Application Profile is also defined by a structure that can be used to keep the state of the application and update its parameters when new data is propagated by the stack. + +The Application Profiles in code are instances of a ``gattc_profile_inst`` structure. For details, see Section **Application Profiles** in **GATT Client Example Walkthrough**. + +### Scanning + +#### Setting Scan Parameters +See Section **Setting Scan Parameters** in **GATT Client Example Walkthrough**. + +#### Starting to Scan +See Section **Start Scanning** in **GATT Client Example Walkthrough**. + +#### Getting Scan Results +See Section **Getting Scan Results** in **GATT Client Example Walkthrough**. + +#### Name Comparison + +* First, the name of the device is extracted from the advertised data and stored in the ``adv_name`` variable: + + ``` + adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, + ESP_BLE_AD_TYPE_NAME_CMPL, &adv_name_len); + ``` + +* Then, the device name found is compared to the server names that the client wants to connect to. The server names are defined in the ``remote_device_name`` array: + + ``` +static const char remote_device_name[3][20] = {"ESP_GATTS_DEMO_1", "ESP_GATTS_DEMO_2", “ESP_GATTS_DEMO_3"}; + ``` + + The name comparison takes places as follows: + + ``` +if (strlen(remote_device_name[0]) == adv_name_len && strncmp((char *)adv_name, remote_device_name[0], adv_name_len) == 0) { + if (find_device_1 == false) { + find_device_1 = true; + ESP_LOGI(GATTC_TAG, "Searched device %s", remote_device_name[0]); + memcpy(gl_profile_tab[PROFILE_A_APP_ID].remote_bda, scan_result->scan_rst.bda, 6); + } + break; + } + else if (strlen(remote_device_name[1]) == adv_name_len && strncmp((char *)adv_name, remote_device_name[1], adv_name_len) == 0) { + if (find_device_2 == false) { + find_device_2 = true; + ESP_LOGI(GATTC_TAG, "Searched device %s", remote_device_name[1]); + memcpy(gl_profile_tab[PROFILE_B_APP_ID].remote_bda, scan_result->scan_rst.bda, 6); + } + } + else if (strlen(remote_device_name[2]) == adv_name_len && strncmp((char *)adv_name, remote_device_name[2], adv_name_len) == 0) { + if (find_device_3 == false) { + find_device_3 = true; + ESP_LOGI(GATTC_TAG, "Searched device %s", remote_device_name[2]); + memcpy(gl_profile_tab[PROFILE_C_APP_ID].remote_bda, scan_result->scan_rst.bda, 6); + } + break; + } + ``` + +* If any of the device names found corresponds to a remote device name, the ``find_device_X`` flag is set and the address of the remote device is stored in the ``gl_profile_tab`` table. When all flags are set, the client stops scanning and connects to the remote devices. + +### Connecting to Remote Devices + +#### Connecting to the First Remote Device +Once all devices have been found, the client stops scanning: + +``` +if (find_device_1 && find_device_2 && find_device_3 && stop_scan == false) + { + stop_scan = true; + esp_ble_gap_stop_scanning(); + } +``` + +The scan stop triggers an ``ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT`` event which is used to open a connection to the first remote device. The second and third devices get connected once the client searches for services, gets characteristics and registers for notifications on the first device. This workflow is designed to test that the communication between each remote device is working correctly before trying to connect to the next device or in case of error, skip to the next device. + +``` +case ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT: + if (param->scan_stop_cmpl.status != ESP_BT_STATUS_SUCCESS){ + ESP_LOGE(GATTC_TAG, "Scan stop failed"); + break; + } + ESP_LOGI(GATTC_TAG, "Stop scan successfully"); + if (!stop_scan){ + ESP_LOGE(GATTC_TAG, "Did not find all devices"); + } + if (find_device_1){ + esp_ble_gattc_open(gl_profile_tab[PROFILE_A_APP_ID].gattc_if, gl_profile_tab[PROFILE_A_APP_ID].remote_bda, true); + } + break; +``` + +* The connection is opened with the ``esp_ble_gattc_open()`` function which takes the GATT interface, the remote device address and a boolean value set to true for direct connection or false for background auto connection. To disconnect the physical connection, the GAP API function ``esp_ble_gap_disconnect()`` is used. + + When connecting to the first device, an ``ESP_GATTC_CONNECT_EVT`` event is generated which is forwarded to all profiles. It also triggers an ``ESP_GATTC_OPEN_EVT`` event that is forwarded to the Profile A event handler only, or ``gattc_profile_a_event_handler()`` function. The event checks that the connection is opened successfully, if not, the device is ignored and the client tries to open a connection to the second device: + + ``` + case ESP_GATTC_OPEN_EVT: + if (p_data->open.status != ESP_GATT_OK){ + //open failed, ignore the first device, connect the second device + ESP_LOGE(GATTC_TAG, "connect device failed, status %d", p_data->open.status); + if (find_device_2){ + esp_ble_gattc_open(gl_profile_tab[PROFILE_B_APP_ID].gattc_if, gl_profile_tab[PROFILE_B_APP_ID].remote_bda, true); + } + break; + } + ``` + + If the connection is successful the client saves the connection ID, prints the remote device information and configures the MTU size to 200 bytes. + + ``` +gl_profile_tab[PROFILE_A_APP_ID].conn_id = p_data->open.conn_id; + ESP_LOGI(GATTC_TAG, "ESP_GATTC_OPEN_EVT conn_id %d, if %d, status %d, mtu %d", p_data->open.conn_id, gattc_if, p_data->open.status, p_data->open.mtu); + ESP_LOGI(GATTC_TAG, "REMOTE BDA:"); + esp_log_buffer_hex(GATTC_TAG, p_data->open.remote_bda, sizeof(esp_bd_addr_t)); + esp_err_t mtu_ret = esp_ble_gattc_config_mtu (gattc_if, p_data->open.conn_id, 200); + if (mtu_ret){ + ESP_LOGE(GATTC_TAG, "config MTU error, error code = %x", mtu_ret); + } + break; + ``` + +* After configuration of the MTU size, an ``ESP_GATTC_CFG_MTU_EVT`` is generated. This event is used to search for available known services on the remote device. The search is performed by using the ``esp_ble_gattc_search_service()`` function and a service ID defined by: + + ``` +static esp_bt_uuid_t remote_filter_service_uuid = { + .len = ESP_UUID_LEN_16, + .uuid = {.uuid16 = REMOTE_SERVICE_UUID,}, +}; + ``` + +* The handler then searches for the service: + + ``` +case ESP_GATTC_CFG_MTU_EVT: + if (param->cfg_mtu.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG,"Config mtu failed"); + } + ESP_LOGI(GATTC_TAG, "Status %d, MTU %d, conn_id %d", param->cfg_mtu.status, param->cfg_mtu.mtu, param->cfg_mtu.conn_id); + esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, &remote_filter_service_uuid); + break; + ``` + + If the service is found, an ``ESP_GATTC_SEARCH_RES_EVT`` event is triggered which allows to set the ``get_service_1 flag`` to true. This flag is used to print information and later get the characteristic that the client is interested in. + +* Once the search for all services is completed, an ``ESP_GATTC_SEARCH_CMPL_EVT`` event is generated which is used to get the characteristics of the service just discovered. This is done with the ``esp_ble_gattc_get_characteristic()`` function: + + ``` + case ESP_GATTC_SEARCH_CMPL_EVT: + if (p_data->search_cmpl.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "search service failed, error status = %x", p_data->search_cmpl.status); + break; + } + if (get_service_1){ + esp_ble_gattc_get_characteristic(gattc_if, p_data->search_cmpl.conn_id, &remote_service_id, NULL); + } + break; + ``` + The ``esp_ble_gattc_get_characteristic()`` function takes the GATT interface, the connection ID and the remote service ID as parameters. In addition, a NULL value is passed to indicate that we want all the characteristics starting from the first one. If the client is interested in a specific characteristic it could pass the characteristic ID in this field to specify that. + + An ``ESP_GATTC_GET_CHAR_EVT`` event is triggered when a characteristic is discovered. This event is used to print information about the characteristic. + +* If the characteristic ID is the same as the one defined by ``REMOTE_NOTIFY_CHAR_UUID``, the client registers for notifications on that characteristic value. + +* Finally, the next characteristic is requested using the same ``esp_ble_gattc_get_characteristic()`` function, this time, the last parameter is set to the current characteristic. This triggers another ``ESP_GATTC_GET_CHAR_EVT`` and the process is repeated until all characteristics are obtained. + + ``` +case ESP_GATTC_GET_CHAR_EVT: + if (p_data->get_char.status != ESP_GATT_OK) { + break; + } + ESP_LOGI(GATTC_TAG, "GET CHAR: conn_id = %x, status %d", p_data->get_char.conn_id, p_data->get_char.status); + ESP_LOGI(GATTC_TAG, "GET CHAR: srvc_id = %04x, char_id = %04x", p_data->get_char.srvc_id.id.uuid.uuid.uuid16, p_data->get_char.char_id.uuid.uuid.uuid16); + + if (p_data->get_char.char_id.uuid.uuid.uuid16 == REMOTE_NOTIFY_CHAR_UUID) { + ESP_LOGI(GATTC_TAG, "register notify"); + esp_ble_gattc_register_for_notify(gattc_if, gl_profile_tab[PROFILE_A_APP_ID].remote_bda, &remote_service_id, &p_data->get_char.char_id); + } + + esp_ble_gattc_get_characteristic(gattc_if, p_data->get_char.conn_id, &remote_service_id, &p_data->get_char.char_id); + break; + ``` + +At this point the client has acquired all characteristics from the remote device and has subscribed for notifications on the characteristics of interest. Every time a client registers for notifications, an ``ESP_GATTC_REG_FOR_NOTIFY_EVT`` event is triggered. In this example, this event is set to write to the remote device Client Configuration Characteristic (CCC) using the ``esp_ble_gattc_write_char_descr()`` function. In turn, this function is used to write to characteristic descriptors. There are many characteristic descriptors defined by the Bluetooth specification, however, for this example, the descriptor of interest is the one that deals with enabling notifications, that is the Client Configuration descriptor. + +#### Connecting to the Next Remote Device +* In order to pass this descriptor as a parameter we first define it as: + + ``` +static esp_gatt_id_t notify_descr_id = { + .uuid = { + .len = ESP_UUID_LEN_16, + .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,}, + }, + .inst_id = 0, +}; + ``` + + Where ``ESP_GATT_UUID_CHAR_CLIENT_CONFIG`` is defined as the UUID to identify the CCC: + + ``` + #define ESP_GATT_UUID_CHAR_CLIENT_CONFIG 0x2902 /* Client Characteristic Configuration */ + ``` + + The value to write is “1” to enable notifications. The parameter ``ESP_GATT_WRITE_TYPE_RSP`` is also passed to request that the server responds to the write request, as well as the ``ESP_GATT_AUTH_REQ_NONE`` parameter to indicate that the write request does not need authorization: + + ``` + case ESP_GATTC_REG_FOR_NOTIFY_EVT: { + if (p_data->reg_for_notify.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "reg notify failed, error status =%x", p_data->reg_for_notify.status); + break; + } + uint16_t notify_en = 1; + ESP_LOGI(GATTC_TAG, "REG FOR NOTIFY: status %d, srvc_id = %04x, char_id = %04x", + p_data->reg_for_notify.status, + p_data->reg_for_notify.srvc_id.id.uuid.uuid.uuid16, + p_data->reg_for_notify.char_id.uuid.uuid.uuid16); + + esp_ble_gattc_write_char_descr(gattc_if, + gl_profile_tab[PROFILE_A_APP_ID].conn_id, + &remote_service_id, + &p_data->reg_for_notify.char_id, + ¬ify_descr_id, + sizeof(notify_en), + (uint8_t *)¬ify_en, + ESP_GATT_WRITE_TYPE_RSP, + ESP_GATT_AUTH_REQ_NONE); + break; + } + + ``` +* Once notifications are enabled, the remote device sends a notification which triggers the ``ESP_GATTC_NOTIFY_EVT`` event on the client. This event is handled to write back to the characteristic using the ``esp_ble_gattc_write_char()`` function: + + ``` +case ESP_GATTC_NOTIFY_EVT: + ESP_LOGI(GATTC_TAG, "ESP_GATTC_NOTIFY_EVT, Receive notify value:"); + esp_log_buffer_hex(GATTC_TAG, p_data->notify.value, p_data->notify.value_len); + //write back + esp_ble_gattc_write_char(gattc_if, + gl_profile_tab[PROFILE_A_APP_ID].conn_id, + &remote_service_id, + &p_data->notify.char_id, + p_data->notify.value_len, + p_data->notify.value, + ESP_GATT_WRITE_TYPE_RSP, + ESP_GATT_AUTH_REQ_NONE); + break; + ``` + +* If the writing procedure is acknowledged then the remote device has connected successfully and communication is established without error. Immediately, the write procedure generates an ``ESP_GATTC_WRITE_CHAR_EVT`` event which in this example is used to print information and connect to the second remote device: + + ``` +case ESP_GATTC_WRITE_CHAR_EVT: + if (p_data->write.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "write char failed, error status = %x", p_data->write.status); + }else{ + ESP_LOGI(GATTC_TAG, "write char success"); + } + //connect the second device + if (find_device_2){ + esp_ble_gattc_open(gl_profile_tab[PROFILE_B_APP_ID].gattc_if, gl_profile_tab[PROFILE_B_APP_ID].remote_bda, true); + } + break; + ``` +* This triggers an open event which is handled by the Profile B event handler. This handler follows the same steps to search for services, get characteristics, register for notifications and write to the characteristic as the first device. The sequence for the second device also ends with an ``ESP_GATTC_WRITE_CHAR_EVT`` event which in turn is used to connect to the third device: + + ``` + case ESP_GATTC_WRITE_CHAR_EVT: + if (p_data->write.status != ESP_GATT_OK){ + ESP_LOGE(GATTC_TAG, "Write char failed, error status = %x", p_data->write.status); + }else{ + ESP_LOGI(GATTC_TAG, "Write char success"); + } + //connect the third device + if (find_device_3){ + esp_ble_gattc_open(gl_profile_tab[PROFILE_C_APP_ID].gattc_if, gl_profile_tab[PROFILE_C_APP_ID].remote_bda, true); + } + break; + ``` + +* The third devices also performs the same configuration and communication steps in identical form as the first and second devices. Upon successful completion, all three remote devices are simultaneously connected appropriately and receiving notifications without error. + +## Conclusion +In this example we have reviewed the example code for the multi-connection GATT client. The client connects to three remote BLE peripherals and searches for services of interest. If the services are found, the characteristics of those services are discovered and subscribed to. The connections to the remote devices are done in order, starting from the first one and making sure that remote device has connected successfully and is notifying before trying to connect to the next device. This example shows a practical way to use the ESP32 as a central device that can read multiple BLE sensors at the same time. diff --git a/examples/bluetooth/gattc_multi_connect/tutorial/image/ESP32 GATT Multi-connect Client Application Profiles.pdf b/examples/bluetooth/gattc_multi_connect/tutorial/image/ESP32 GATT Multi-connect Client Application Profiles.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7cdf10f1f1d2886989c6ea204d7c72d0dd663050 GIT binary patch literal 36090 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 QP#6>rp%M^K)>fhVA4QoQ9{>OV literal 0 HcmV?d00001 diff --git a/examples/bluetooth/gattc_multi_connect/tutorial/image/Multi-connection GATT Client Flowchart.pdf b/examples/bluetooth/gattc_multi_connect/tutorial/image/Multi-connection GATT Client Flowchart.pdf new file mode 100644 index 0000000000000000000000000000000000000000..41aa3fcd2ad142eb0d3cadca7d2476c152594300 GIT binary patch literal 16489 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 literal 0 HcmV?d00001