From bb8767730c63cc293c4f9291674b0c08fc3180d3 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Wed, 14 Apr 2021 17:23:12 +0200 Subject: [PATCH] nrf: add support for S113 SoftDevice This SoftDevice is used by default on the BBC micro:bit v2 so it's a good idea to add support here. Unfortunately this SoftDevice does not support scanning and connecting to other devices. This means that I unfortunately had to duplicate the event handler. I managed to refactor most other code to avoid duplicating much more. (This is when macros would have been useful in Go...) --- Makefile | 2 + adapter_nrf528xx-full.go | 234 + adapter_nrf528xx-peripheral.go | 96 + adapter_nrf528xx.go | 216 +- adapter_s113v7.c | 22 + adapter_s113v7.go | 10 + gap_nrf528xx-advertisement.go | 82 + gap_nrf528xx.go => gap_nrf528xx-central.go | 67 +- gattc_sd.go | 2 +- .../s113_nrf52_7.0.1_API/include/ble.h | 675 ++ .../s113_nrf52_7.0.1_API/include/ble_err.h | 93 + .../s113_nrf52_7.0.1_API/include/ble_gap.h | 2269 ++++++ .../s113_nrf52_7.0.1_API/include/ble_gatt.h | 229 + .../s113_nrf52_7.0.1_API/include/ble_gattc.h | 715 ++ .../s113_nrf52_7.0.1_API/include/ble_gatts.h | 845 ++ .../s113_nrf52_7.0.1_API/include/ble_hci.h | 135 + .../s113_nrf52_7.0.1_API/include/ble_l2cap.h | 507 ++ .../s113_nrf52_7.0.1_API/include/ble_ranges.h | 156 + .../s113_nrf52_7.0.1_API/include/ble_types.h | 215 + .../include/nrf52/nrf_mbr.h | 268 + .../s113_nrf52_7.0.1_API/include/nrf_error.h | 90 + .../include/nrf_error_sdm.h | 70 + .../include/nrf_error_soc.h | 85 + .../s113_nrf52_7.0.1_API/include/nrf_nvic.h | 491 ++ .../s113_nrf52_7.0.1_API/include/nrf_sdm.h | 371 + .../s113_nrf52_7.0.1_API/include/nrf_soc.h | 1055 +++ .../s113_nrf52_7.0.1_API/include/nrf_svc.h | 100 + .../s113_nrf52_7.0.1_license-agreement.txt | 35 + .../s113_nrf52_7.0.1_softdevice.hex | 6899 +++++++++++++++++ 29 files changed, 15754 insertions(+), 280 deletions(-) create mode 100644 adapter_nrf528xx-full.go create mode 100644 adapter_nrf528xx-peripheral.go create mode 100644 adapter_s113v7.c create mode 100644 adapter_s113v7.go create mode 100644 gap_nrf528xx-advertisement.go rename gap_nrf528xx.go => gap_nrf528xx-central.go (75%) create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_err.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gap.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatt.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gattc.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatts.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_hci.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_l2cap.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_ranges.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_types.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf52/nrf_mbr.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_sdm.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_soc.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_nvic.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_sdm.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_soc.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_svc.h create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_license-agreement.txt create mode 100644 s113_nrf52_7.0.1/s113_nrf52_7.0.1_softdevice.hex diff --git a/Makefile b/Makefile index e50d030..da9158a 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,8 @@ smoketest-tinygo: @md5sum test.hex $(TINYGO) build -o test.hex -size=short -target=microbit-s110v8 ./examples/nusserver @md5sum test.hex + $(TINYGO) build -o test.hex -size=short -target=microbit-v2-s113v7 ./examples/nusserver + @md5sum test.hex smoketest-linux: # Test on Linux. diff --git a/adapter_nrf528xx-full.go b/adapter_nrf528xx-full.go new file mode 100644 index 0000000..0660e40 --- /dev/null +++ b/adapter_nrf528xx-full.go @@ -0,0 +1,234 @@ +// +build softdevice,s132v6 softdevice,s140v6 softdevice,s140v7 + +package bluetooth + +// This file implements the event handler for SoftDevices with full support: +// both central and peripheral mode. This includes S132 and S140. + +/* +// Define SoftDevice functions as regular function declarations (not inline +// static functions). +#define SVCALL_AS_NORMAL_FUNCTION + +#include "nrf_sdm.h" +#include "nrf_nvic.h" +#include "ble.h" +#include "ble_gap.h" +*/ +import "C" + +import ( + "unsafe" +) + +func handleEvent() { + id := eventBuf.header.evt_id + switch { + case id >= C.BLE_GAP_EVT_BASE && id <= C.BLE_GAP_EVT_LAST: + gapEvent := eventBuf.evt.unionfield_gap_evt() + switch id { + case C.BLE_GAP_EVT_CONNECTED: + connectEvent := gapEvent.params.unionfield_connected() + switch connectEvent.role { + case C.BLE_GAP_ROLE_PERIPH: + if debug { + println("evt: connected in peripheral role") + } + currentConnection.Reg = gapEvent.conn_handle + DefaultAdapter.connectHandler(nil, true) + case C.BLE_GAP_ROLE_CENTRAL: + if debug { + println("evt: connected in central role") + } + connectionAttempt.connectionHandle = gapEvent.conn_handle + connectionAttempt.state.Set(2) // connection was successful + DefaultAdapter.connectHandler(nil, true) + } + case C.BLE_GAP_EVT_DISCONNECTED: + if debug { + println("evt: disconnected") + } + // Clean up state for this connection. + for i, cb := range gattcNotificationCallbacks { + if cb.connectionHandle == currentConnection.Reg { + gattcNotificationCallbacks[i].valueHandle = 0 // 0 means invalid + } + } + currentConnection.Reg = C.BLE_CONN_HANDLE_INVALID + // Auto-restart advertisement if needed. + if defaultAdvertisement.isAdvertising.Get() != 0 { + // The advertisement was running but was automatically stopped + // by the connection event. + // Note that it cannot be restarted during connect like this, + // because it would need to be reconfigured as a non-connectable + // advertisement. That's left as a future addition, if + // necessary. + C.sd_ble_gap_adv_start(defaultAdvertisement.handle, C.BLE_CONN_CFG_TAG_DEFAULT) + } + DefaultAdapter.connectHandler(nil, false) + case C.BLE_GAP_EVT_ADV_REPORT: + advReport := gapEvent.params.unionfield_adv_report() + if debug && &scanReportBuffer.data[0] != advReport.data.p_data { + // Sanity check. + panic("scanReportBuffer != advReport.p_data") + } + // Prepare the globalScanResult, which will be passed to the + // callback. + scanReportBuffer.len = byte(advReport.data.len) + globalScanResult.RSSI = int16(advReport.rssi) + globalScanResult.Address = Address{ + MACAddress{MAC: advReport.peer_addr.addr, + isRandom: advReport.peer_addr.bitfield_addr_type() != 0}, + } + globalScanResult.AdvertisementPayload = &scanReportBuffer + // Signal to the main thread that there was a scan report. + // Scanning will be resumed (from the main thread) once the scan + // report has been processed. + gotScanReport.Set(1) + case C.BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: + // Respond with the default PPCP connection parameters by passing + // nil: + // > If NULL is provided on a peripheral role, the parameters in the + // > PPCP characteristic of the GAP service will be used instead. If + // > NULL is provided on a central role and in response to a + // > BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request + // > will be rejected + C.sd_ble_gap_conn_param_update(gapEvent.conn_handle, nil) + case C.BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST: + // We need to respond with sd_ble_gap_data_length_update. Setting + // both parameters to nil will make sure we send the default values. + C.sd_ble_gap_data_length_update(gapEvent.conn_handle, nil, nil) + default: + if debug { + println("unknown GAP event:", id) + } + } + case id >= C.BLE_GATTS_EVT_BASE && id <= C.BLE_GATTS_EVT_LAST: + gattsEvent := eventBuf.evt.unionfield_gatts_evt() + switch id { + case C.BLE_GATTS_EVT_WRITE: + writeEvent := gattsEvent.params.unionfield_write() + len := writeEvent.len - writeEvent.offset + data := (*[255]byte)(unsafe.Pointer(&writeEvent.data[0]))[:len:len] + handler := DefaultAdapter.getCharWriteHandler(writeEvent.handle) + if handler != nil { + handler.callback(Connection(gattsEvent.conn_handle), int(writeEvent.offset), data) + } + case C.BLE_GATTS_EVT_SYS_ATTR_MISSING: + // This event is generated when reading the Generic Attribute + // service. It appears to be necessary for bonded devices. + // From the docs: + // > If the pointer is NULL, the system attribute info is + // > initialized, assuming that the application does not have any + // > previously saved system attribute data for this device. + // Maybe we should look at the error, but as there's not really a + // way to handle it, ignore it. + C.sd_ble_gatts_sys_attr_set(gattsEvent.conn_handle, nil, 0, 0) + case C.BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: + // This event is generated by some devices. While we could support + // larger MTUs, this default MTU is supported everywhere. + C.sd_ble_gatts_exchange_mtu_reply(gattsEvent.conn_handle, C.BLE_GATT_ATT_MTU_DEFAULT) + default: + if debug { + println("unknown GATTS event:", id, id-C.BLE_GATTS_EVT_BASE) + } + } + case id >= C.BLE_GATTC_EVT_BASE && id <= C.BLE_GATTC_EVT_LAST: + gattcEvent := eventBuf.evt.unionfield_gattc_evt() + switch id { + case C.BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP: + discoveryEvent := gattcEvent.params.unionfield_prim_srvc_disc_rsp() + if debug { + println("evt: discovered primary service", discoveryEvent.count) + } + discoveringService.state.Set(2) // signal there is a result + if discoveryEvent.count >= 1 { + // Theoretically there may be more, but as we're only using + // sd_ble_gattc_primary_services_discover, there should only be + // one discovered service. Use the first as a sensible fallback. + discoveringService.startHandle.Set(discoveryEvent.services[0].handle_range.start_handle) + discoveringService.endHandle.Set(discoveryEvent.services[0].handle_range.end_handle) + discoveringService.uuid = discoveryEvent.services[0].uuid + } else { + // No service found. + discoveringService.startHandle.Set(0) + } + case C.BLE_GATTC_EVT_CHAR_DISC_RSP: + discoveryEvent := gattcEvent.params.unionfield_char_disc_rsp() + if debug { + println("evt: discovered characteristics", discoveryEvent.count) + } + if discoveryEvent.count >= 1 { + // There may be more, but for ease of implementing we only + // handle the first. + discoveringCharacteristic.handle_value.Set(discoveryEvent.chars[0].handle_value) + discoveringCharacteristic.char_props = discoveryEvent.chars[0].char_props + discoveringCharacteristic.uuid = discoveryEvent.chars[0].uuid + } else { + // zero indicates we received no characteristic, set handle_value to last + discoveringCharacteristic.handle_value.Set(0xffff) + } + case C.BLE_GATTC_EVT_DESC_DISC_RSP: + discoveryEvent := gattcEvent.params.unionfield_desc_disc_rsp() + if debug { + println("evt: discovered descriptors", discoveryEvent.count) + } + if discoveryEvent.count >= 1 { + // There may be more, but for ease of implementing we only + // handle the first. + uuid := discoveryEvent.descs[0].uuid + if uuid._type == C.BLE_UUID_TYPE_BLE && uuid.uuid == 0x2902 { + // Found a CCCD (Client Characteristic Configuration + // Descriptor), which has a 16-bit UUID with value 0x2902). + discoveringCharacteristic.handle_value.Set(discoveryEvent.descs[0].handle) + } else { + // Found something else? + // TODO: handle this properly by continuing the scan. For + // now, give up if we found something other than a CCCD. + if debug { + println(" found some other descriptor (unimplemented)") + } + } + } + case C.BLE_GATTC_EVT_READ_RSP: + readEvent := gattcEvent.params.unionfield_read_rsp() + if debug { + println("evt: read response, data length", readEvent.len) + } + readingCharacteristic.handle_value.Set(readEvent.handle) + readingCharacteristic.offset = readEvent.offset + readingCharacteristic.length = readEvent.len + + // copy read event data into Go slice + copy(readingCharacteristic.value, (*[255]byte)(unsafe.Pointer(&readEvent.data[0]))[:readEvent.len:readEvent.len]) + case C.BLE_GATTC_EVT_HVX: + hvxEvent := gattcEvent.params.unionfield_hvx() + switch hvxEvent._type { + case C.BLE_GATT_HVX_NOTIFICATION: + if debug { + println("evt: notification", hvxEvent.handle) + } + // Find the callback and call it (if there is any). + for _, callbackInfo := range gattcNotificationCallbacks { + if callbackInfo.valueHandle == hvxEvent.handle && callbackInfo.connectionHandle == gattcEvent.conn_handle { + // Create a Go slice from the data, to pass to the + // callback. + data := (*[255]byte)(unsafe.Pointer(&hvxEvent.data[0]))[:hvxEvent.len:hvxEvent.len] + if callbackInfo.callback != nil { + callbackInfo.callback(data) + } + break + } + } + } + default: + if debug { + println("unknown GATTC event:", id, id-C.BLE_GATTC_EVT_BASE) + } + } + default: + if debug { + println("unknown event:", id) + } + } +} diff --git a/adapter_nrf528xx-peripheral.go b/adapter_nrf528xx-peripheral.go new file mode 100644 index 0000000..b50f1b2 --- /dev/null +++ b/adapter_nrf528xx-peripheral.go @@ -0,0 +1,96 @@ +// +build softdevice,s113v7 + +package bluetooth + +// This file implements the event handler for SoftDevices with only peripheral +// mode support. This includes the S113. + +/* +// Define SoftDevice functions as regular function declarations (not inline +// static functions). +#define SVCALL_AS_NORMAL_FUNCTION + +#include "nrf_sdm.h" +#include "nrf_nvic.h" +#include "ble.h" +#include "ble_gap.h" +*/ +import "C" + +import ( + "unsafe" +) + +func handleEvent() { + id := eventBuf.header.evt_id + switch { + case id >= C.BLE_GAP_EVT_BASE && id <= C.BLE_GAP_EVT_LAST: + gapEvent := eventBuf.evt.unionfield_gap_evt() + switch id { + case C.BLE_GAP_EVT_CONNECTED: + if debug { + println("evt: connected in peripheral role") + } + currentConnection.Reg = gapEvent.conn_handle + DefaultAdapter.connectHandler(nil, true) + case C.BLE_GAP_EVT_DISCONNECTED: + if debug { + println("evt: disconnected") + } + currentConnection.Reg = C.BLE_CONN_HANDLE_INVALID + // Auto-restart advertisement if needed. + if defaultAdvertisement.isAdvertising.Get() != 0 { + // The advertisement was running but was automatically stopped + // by the connection event. + // Note that it cannot be restarted during connect like this, + // because it would need to be reconfigured as a non-connectable + // advertisement. That's left as a future addition, if + // necessary. + C.sd_ble_gap_adv_start(defaultAdvertisement.handle, C.BLE_CONN_CFG_TAG_DEFAULT) + } + DefaultAdapter.connectHandler(nil, false) + case C.BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST: + // We need to respond with sd_ble_gap_data_length_update. Setting + // both parameters to nil will make sure we send the default values. + C.sd_ble_gap_data_length_update(gapEvent.conn_handle, nil, nil) + default: + if debug { + println("unknown GAP event:", id) + } + } + case id >= C.BLE_GATTS_EVT_BASE && id <= C.BLE_GATTS_EVT_LAST: + gattsEvent := eventBuf.evt.unionfield_gatts_evt() + switch id { + case C.BLE_GATTS_EVT_WRITE: + writeEvent := gattsEvent.params.unionfield_write() + len := writeEvent.len - writeEvent.offset + data := (*[255]byte)(unsafe.Pointer(&writeEvent.data[0]))[:len:len] + handler := DefaultAdapter.getCharWriteHandler(writeEvent.handle) + if handler != nil { + handler.callback(Connection(gattsEvent.conn_handle), int(writeEvent.offset), data) + } + case C.BLE_GATTS_EVT_SYS_ATTR_MISSING: + // This event is generated when reading the Generic Attribute + // service. It appears to be necessary for bonded devices. + // From the docs: + // > If the pointer is NULL, the system attribute info is + // > initialized, assuming that the application does not have any + // > previously saved system attribute data for this device. + // Maybe we should look at the error, but as there's not really a + // way to handle it, ignore it. + C.sd_ble_gatts_sys_attr_set(gattsEvent.conn_handle, nil, 0, 0) + case C.BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: + // This event is generated by some devices. While we could support + // larger MTUs, this default MTU is supported everywhere. + C.sd_ble_gatts_exchange_mtu_reply(gattsEvent.conn_handle, C.BLE_GATT_ATT_MTU_DEFAULT) + default: + if debug { + println("unknown GATTS event:", id, id-C.BLE_GATTS_EVT_BASE) + } + } + default: + if debug { + println("unknown event:", id) + } + } +} diff --git a/adapter_nrf528xx.go b/adapter_nrf528xx.go index f240650..50047b4 100644 --- a/adapter_nrf528xx.go +++ b/adapter_nrf528xx.go @@ -1,7 +1,9 @@ -// +build softdevice,!s110v8 +// +build softdevice,s113v7 softdevice,s132v6 softdevice,s140v6 softdevice,s140v7 package bluetooth +// This file defines the SoftDevice adapter for all nrf52-series chips. + /* // Define SoftDevice functions as regular function declarations (not inline // static functions). @@ -52,215 +54,3 @@ func (a *Adapter) enable() error { errCode = C.sd_ble_enable(&appRAMBase) return makeError(errCode) } - -func handleEvent() { - id := eventBuf.header.evt_id - switch { - case id >= C.BLE_GAP_EVT_BASE && id <= C.BLE_GAP_EVT_LAST: - gapEvent := eventBuf.evt.unionfield_gap_evt() - switch id { - case C.BLE_GAP_EVT_CONNECTED: - connectEvent := gapEvent.params.unionfield_connected() - switch connectEvent.role { - case C.BLE_GAP_ROLE_PERIPH: - if debug { - println("evt: connected in peripheral role") - } - currentConnection.Reg = gapEvent.conn_handle - DefaultAdapter.connectHandler(nil, true) - case C.BLE_GAP_ROLE_CENTRAL: - if debug { - println("evt: connected in central role") - } - connectionAttempt.connectionHandle = gapEvent.conn_handle - connectionAttempt.state.Set(2) // connection was successful - DefaultAdapter.connectHandler(nil, true) - } - case C.BLE_GAP_EVT_DISCONNECTED: - if debug { - println("evt: disconnected") - } - // Clean up state for this connection. - for i, cb := range gattcNotificationCallbacks { - if cb.connectionHandle == currentConnection.Reg { - gattcNotificationCallbacks[i].valueHandle = 0 // 0 means invalid - } - } - currentConnection.Reg = C.BLE_CONN_HANDLE_INVALID - // Auto-restart advertisement if needed. - if defaultAdvertisement.isAdvertising.Get() != 0 { - // The advertisement was running but was automatically stopped - // by the connection event. - // Note that it cannot be restarted during connect like this, - // because it would need to be reconfigured as a non-connectable - // advertisement. That's left as a future addition, if - // necessary. - C.sd_ble_gap_adv_start(defaultAdvertisement.handle, C.BLE_CONN_CFG_TAG_DEFAULT) - } - DefaultAdapter.connectHandler(nil, false) - case C.BLE_GAP_EVT_ADV_REPORT: - advReport := gapEvent.params.unionfield_adv_report() - if debug && &scanReportBuffer.data[0] != advReport.data.p_data { - // Sanity check. - panic("scanReportBuffer != advReport.p_data") - } - // Prepare the globalScanResult, which will be passed to the - // callback. - scanReportBuffer.len = byte(advReport.data.len) - globalScanResult.RSSI = int16(advReport.rssi) - globalScanResult.Address = Address{ - MACAddress{MAC: advReport.peer_addr.addr, - isRandom: advReport.peer_addr.bitfield_addr_type() != 0}, - } - globalScanResult.AdvertisementPayload = &scanReportBuffer - // Signal to the main thread that there was a scan report. - // Scanning will be resumed (from the main thread) once the scan - // report has been processed. - gotScanReport.Set(1) - case C.BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: - // Respond with the default PPCP connection parameters by passing - // nil: - // > If NULL is provided on a peripheral role, the parameters in the - // > PPCP characteristic of the GAP service will be used instead. If - // > NULL is provided on a central role and in response to a - // > BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request - // > will be rejected - C.sd_ble_gap_conn_param_update(gapEvent.conn_handle, nil) - case C.BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST: - // We need to respond with sd_ble_gap_data_length_update. Setting - // both parameters to nil will make sure we send the default values. - C.sd_ble_gap_data_length_update(gapEvent.conn_handle, nil, nil) - default: - if debug { - println("unknown GAP event:", id) - } - } - case id >= C.BLE_GATTS_EVT_BASE && id <= C.BLE_GATTS_EVT_LAST: - gattsEvent := eventBuf.evt.unionfield_gatts_evt() - switch id { - case C.BLE_GATTS_EVT_WRITE: - writeEvent := gattsEvent.params.unionfield_write() - len := writeEvent.len - writeEvent.offset - data := (*[255]byte)(unsafe.Pointer(&writeEvent.data[0]))[:len:len] - handler := DefaultAdapter.getCharWriteHandler(writeEvent.handle) - if handler != nil { - handler.callback(Connection(gattsEvent.conn_handle), int(writeEvent.offset), data) - } - case C.BLE_GATTS_EVT_SYS_ATTR_MISSING: - // This event is generated when reading the Generic Attribute - // service. It appears to be necessary for bonded devices. - // From the docs: - // > If the pointer is NULL, the system attribute info is - // > initialized, assuming that the application does not have any - // > previously saved system attribute data for this device. - // Maybe we should look at the error, but as there's not really a - // way to handle it, ignore it. - C.sd_ble_gatts_sys_attr_set(gattsEvent.conn_handle, nil, 0, 0) - case C.BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: - // This event is generated by some devices. While we could support - // larger MTUs, this default MTU is supported everywhere. - C.sd_ble_gatts_exchange_mtu_reply(gattsEvent.conn_handle, C.BLE_GATT_ATT_MTU_DEFAULT) - default: - if debug { - println("unknown GATTS event:", id, id-C.BLE_GATTS_EVT_BASE) - } - } - case id >= C.BLE_GATTC_EVT_BASE && id <= C.BLE_GATTC_EVT_LAST: - gattcEvent := eventBuf.evt.unionfield_gattc_evt() - switch id { - case C.BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP: - discoveryEvent := gattcEvent.params.unionfield_prim_srvc_disc_rsp() - if debug { - println("evt: discovered primary service", discoveryEvent.count) - } - discoveringService.state.Set(2) // signal there is a result - if discoveryEvent.count >= 1 { - // Theoretically there may be more, but as we're only using - // sd_ble_gattc_primary_services_discover, there should only be - // one discovered service. Use the first as a sensible fallback. - discoveringService.startHandle.Set(discoveryEvent.services[0].handle_range.start_handle) - discoveringService.endHandle.Set(discoveryEvent.services[0].handle_range.end_handle) - discoveringService.uuid = discoveryEvent.services[0].uuid - } else { - // No service found. - discoveringService.startHandle.Set(0) - } - case C.BLE_GATTC_EVT_CHAR_DISC_RSP: - discoveryEvent := gattcEvent.params.unionfield_char_disc_rsp() - if debug { - println("evt: discovered characteristics", discoveryEvent.count) - } - if discoveryEvent.count >= 1 { - // There may be more, but for ease of implementing we only - // handle the first. - discoveringCharacteristic.handle_value.Set(discoveryEvent.chars[0].handle_value) - discoveringCharacteristic.char_props = discoveryEvent.chars[0].char_props - discoveringCharacteristic.uuid = discoveryEvent.chars[0].uuid - } else { - // zero indicates we received no characteristic, set handle_value to last - discoveringCharacteristic.handle_value.Set(0xffff) - } - case C.BLE_GATTC_EVT_DESC_DISC_RSP: - discoveryEvent := gattcEvent.params.unionfield_desc_disc_rsp() - if debug { - println("evt: discovered descriptors", discoveryEvent.count) - } - if discoveryEvent.count >= 1 { - // There may be more, but for ease of implementing we only - // handle the first. - uuid := discoveryEvent.descs[0].uuid - if uuid._type == C.BLE_UUID_TYPE_BLE && uuid.uuid == 0x2902 { - // Found a CCCD (Client Characteristic Configuration - // Descriptor), which has a 16-bit UUID with value 0x2902). - discoveringCharacteristic.handle_value.Set(discoveryEvent.descs[0].handle) - } else { - // Found something else? - // TODO: handle this properly by continuing the scan. For - // now, give up if we found something other than a CCCD. - if debug { - println(" found some other descriptor (unimplemented)") - } - } - } - case C.BLE_GATTC_EVT_READ_RSP: - readEvent := gattcEvent.params.unionfield_read_rsp() - if debug { - println("evt: read response, data length", readEvent.len) - } - readingCharacteristic.handle_value.Set(readEvent.handle) - readingCharacteristic.offset = readEvent.offset - readingCharacteristic.length = readEvent.len - - // copy read event data into Go slice - copy(readingCharacteristic.value, (*[255]byte)(unsafe.Pointer(&readEvent.data[0]))[:readEvent.len:readEvent.len]) - case C.BLE_GATTC_EVT_HVX: - hvxEvent := gattcEvent.params.unionfield_hvx() - switch hvxEvent._type { - case C.BLE_GATT_HVX_NOTIFICATION: - if debug { - println("evt: notification", hvxEvent.handle) - } - // Find the callback and call it (if there is any). - for _, callbackInfo := range gattcNotificationCallbacks { - if callbackInfo.valueHandle == hvxEvent.handle && callbackInfo.connectionHandle == gattcEvent.conn_handle { - // Create a Go slice from the data, to pass to the - // callback. - data := (*[255]byte)(unsafe.Pointer(&hvxEvent.data[0]))[:hvxEvent.len:hvxEvent.len] - if callbackInfo.callback != nil { - callbackInfo.callback(data) - } - break - } - } - } - default: - if debug { - println("unknown GATTC event:", id, id-C.BLE_GATTC_EVT_BASE) - } - } - default: - if debug { - println("unknown event:", id) - } - } -} diff --git a/adapter_s113v7.c b/adapter_s113v7.c new file mode 100644 index 0000000..b59d5ca --- /dev/null +++ b/adapter_s113v7.c @@ -0,0 +1,22 @@ +// +build softdevice,s113v7 + +// This file is necessary to define SVCall wrappers, because TinyGo does not yet +// support static functions in the preamble. + +// Discard all 'static' attributes to define functions normally. +#define static + +// Get rid of all __STATIC_INLINE symbols. +// This is a bit less straightforward: we first need to include the header that +// defines it, and then redefine it. +#include "nrf.h" +#undef __STATIC_INLINE +#define __STATIC_INLINE + +#include "s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_sdm.h" +#include "s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_nvic.h" +#include "s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble.h" + +// Define nrf_nvic_state, which is used by sd_nvic_critical_region_enter and +// sd_nvic_critical_region_exit. +nrf_nvic_state_t nrf_nvic_state = {0}; diff --git a/adapter_s113v7.go b/adapter_s113v7.go new file mode 100644 index 0000000..d199483 --- /dev/null +++ b/adapter_s113v7.go @@ -0,0 +1,10 @@ +// +build softdevice,s113v7 + +package bluetooth + +/* +// Add the correct SoftDevice include path to CFLAGS, so #include will work as +// expected. +#cgo CFLAGS: -Is113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include +*/ +import "C" diff --git a/gap_nrf528xx-advertisement.go b/gap_nrf528xx-advertisement.go new file mode 100644 index 0000000..1a3dbbb --- /dev/null +++ b/gap_nrf528xx-advertisement.go @@ -0,0 +1,82 @@ +// +build softdevice,s113v7 softdevice,s132v6 softdevice,s140v6 softdevice,s140v7 + +package bluetooth + +import ( + "runtime/volatile" + "time" +) + +/* +// Define SoftDevice functions as regular function declarations (not inline +// static functions). +#define SVCALL_AS_NORMAL_FUNCTION + +#include "ble_gap.h" +*/ +import "C" + +// Address contains a Bluetooth MAC address. +type Address struct { + MACAddress +} + +// Advertisement encapsulates a single advertisement instance. +type Advertisement struct { + handle uint8 + isAdvertising volatile.Register8 + payload rawAdvertisementPayload +} + +// The nrf528xx devices only seem to support one advertisement instance. The way +// multiple advertisements are implemented is by changing the packet data +// frequently. +var defaultAdvertisement = Advertisement{ + handle: C.BLE_GAP_ADV_SET_HANDLE_NOT_SET, +} + +// DefaultAdvertisement returns the default advertisement instance but does not +// configure it. +func (a *Adapter) DefaultAdvertisement() *Advertisement { + return &defaultAdvertisement +} + +// Configure this advertisement. +func (a *Advertisement) Configure(options AdvertisementOptions) error { + // Fill empty options with reasonable defaults. + if options.Interval == 0 { + // Pick an advertisement interval recommended by Apple (section 35.5 + // Advertising Interval): + // https://developer.apple.com/accessories/Accessory-Design-Guidelines.pdf + options.Interval = NewDuration(152500 * time.Microsecond) // 152.5ms + } + + // Construct payload. + // Note that the payload needs to be part of the Advertisement object as the + // memory is still used after sd_ble_gap_adv_set_configure returns. + a.payload.reset() + if !a.payload.addFromOptions(options) { + return errAdvertisementPacketTooBig + } + + data := C.ble_gap_adv_data_t{} + data.adv_data = C.ble_data_t{ + p_data: &a.payload.data[0], + len: uint16(a.payload.len), + } + params := C.ble_gap_adv_params_t{ + properties: C.ble_gap_adv_properties_t{ + _type: C.BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, + }, + interval: uint32(options.Interval), + } + errCode := C.sd_ble_gap_adv_set_configure(&a.handle, &data, ¶ms) + return makeError(errCode) +} + +// Start advertisement. May only be called after it has been configured. +func (a *Advertisement) Start() error { + a.isAdvertising.Set(1) + errCode := C.sd_ble_gap_adv_start(a.handle, C.BLE_CONN_CFG_TAG_DEFAULT) + return makeError(errCode) +} diff --git a/gap_nrf528xx.go b/gap_nrf528xx-central.go similarity index 75% rename from gap_nrf528xx.go rename to gap_nrf528xx-central.go index ecd4301..f7f41ae 100644 --- a/gap_nrf528xx.go +++ b/gap_nrf528xx-central.go @@ -1,4 +1,4 @@ -// +build softdevice,!s110v8 +// +build softdevice,s132v6 softdevice,s140v6 softdevice,s140v7 package bluetooth @@ -27,71 +27,6 @@ var ( globalScanResult ScanResult ) -// Address contains a Bluetooth MAC address. -type Address struct { - MACAddress -} - -// Advertisement encapsulates a single advertisement instance. -type Advertisement struct { - handle uint8 - isAdvertising volatile.Register8 - payload rawAdvertisementPayload -} - -// The nrf528xx devices only seem to support one advertisement instance. The way -// multiple advertisements are implemented is by changing the packet data -// frequently. -var defaultAdvertisement = Advertisement{ - handle: C.BLE_GAP_ADV_SET_HANDLE_NOT_SET, -} - -// DefaultAdvertisement returns the default advertisement instance but does not -// configure it. -func (a *Adapter) DefaultAdvertisement() *Advertisement { - return &defaultAdvertisement -} - -// Configure this advertisement. -func (a *Advertisement) Configure(options AdvertisementOptions) error { - // Fill empty options with reasonable defaults. - if options.Interval == 0 { - // Pick an advertisement interval recommended by Apple (section 35.5 - // Advertising Interval): - // https://developer.apple.com/accessories/Accessory-Design-Guidelines.pdf - options.Interval = NewDuration(152500 * time.Microsecond) // 152.5ms - } - - // Construct payload. - // Note that the payload needs to be part of the Advertisement object as the - // memory is still used after sd_ble_gap_adv_set_configure returns. - a.payload.reset() - if !a.payload.addFromOptions(options) { - return errAdvertisementPacketTooBig - } - - data := C.ble_gap_adv_data_t{} - data.adv_data = C.ble_data_t{ - p_data: &a.payload.data[0], - len: uint16(a.payload.len), - } - params := C.ble_gap_adv_params_t{ - properties: C.ble_gap_adv_properties_t{ - _type: C.BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, - }, - interval: uint32(options.Interval), - } - errCode := C.sd_ble_gap_adv_set_configure(&a.handle, &data, ¶ms) - return makeError(errCode) -} - -// Start advertisement. May only be called after it has been configured. -func (a *Advertisement) Start() error { - a.isAdvertising.Set(1) - errCode := C.sd_ble_gap_adv_start(a.handle, C.BLE_CONN_CFG_TAG_DEFAULT) - return makeError(errCode) -} - // Scan starts a BLE scan. It is stopped by a call to StopScan. A common pattern // is to cancel the scan when a particular device has been found. // diff --git a/gattc_sd.go b/gattc_sd.go index cb5ad7a..197b339 100644 --- a/gattc_sd.go +++ b/gattc_sd.go @@ -1,4 +1,4 @@ -// +build softdevice,!s110v8 +// +build softdevice,s132v6 softdevice,s140v6 softdevice,s140v7 package bluetooth diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble.h new file mode 100644 index 0000000..d8b1c87 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble.h @@ -0,0 +1,675 @@ +/* + * Copyright (c) 2012 - 2020, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON BLE SoftDevice Common + @{ + @defgroup ble_api Events, type definitions and API calls + @{ + + @brief Module independent events, type definitions and API calls for the BLE SoftDevice. + + */ + +#ifndef BLE_H__ +#define BLE_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_err.h" +#include "ble_gap.h" +#include "ble_l2cap.h" +#include "ble_gatt.h" +#include "ble_gattc.h" +#include "ble_gatts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations + * @{ */ + +/** + * @brief Common API SVC numbers. + */ +enum BLE_COMMON_SVCS +{ + SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ + SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ + SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific base UUID. */ + SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ + SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ + SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ + SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ + SD_BLE_OPT_SET, /**< Set a BLE option. */ + SD_BLE_OPT_GET, /**< Get a BLE option. */ + SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ + SD_BLE_UUID_VS_REMOVE, /**< Remove a Vendor Specific base UUID. */ +}; + +/** + * @brief BLE Module Independent Event IDs. + */ +enum BLE_COMMON_EVTS +{ + BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. See @ref ble_evt_user_mem_request_t + \n Reply with @ref sd_ble_user_mem_reply. */ + BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. See @ref ble_evt_user_mem_release_t */ +}; + +/**@brief BLE Connection Configuration IDs. + * + * IDs that uniquely identify a connection configuration. + */ +enum BLE_CONN_CFGS +{ + BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ + BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ + BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ + BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ + BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ +}; + +/**@brief BLE Common Configuration IDs. + * + * IDs that uniquely identify a common configuration. + */ +enum BLE_COMMON_CFGS +{ + BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific base UUID configuration */ +}; + +/**@brief Common Option IDs. + * IDs that uniquely identify a common option. + */ +enum BLE_COMMON_OPTS +{ + BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ + BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ + BLE_COMMON_OPT_EXTENDED_RC_CAL = BLE_OPT_BASE + 2, /**< Extended RC calibration option */ +}; + +/** @} */ + +/** @addtogroup BLE_COMMON_DEFINES Defines + * @{ */ + +/** @brief Required pointer alignment for BLE Events. +*/ +#define BLE_EVT_PTR_ALIGNMENT 4 + +/** @brief Leaves the maximum of the two arguments. +*/ +#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) + +/** @brief Maximum possible length for BLE Events. + * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. + * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. +*/ +#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ + offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ +) + +/** @defgroup BLE_USER_MEM_TYPES User Memory Types + * @{ */ +#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ +#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ +/** @} */ + +/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific base UUID counts + * @{ + */ +#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ +#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ +/** @} */ + +/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. + * @{ + */ +#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ + +/** @} */ + +/** @} */ + +/** @addtogroup BLE_COMMON_STRUCTURES Structures + * @{ */ + +/**@brief User Memory Block. */ +typedef struct +{ + uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ + uint16_t len; /**< Length in bytes of the user memory block. */ +} ble_user_mem_block_t; + +/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ +typedef struct +{ + uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ +} ble_evt_user_mem_request_t; + +/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ +typedef struct +{ + uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ + ble_user_mem_block_t mem_block; /**< User memory block */ +} ble_evt_user_mem_release_t; + +/**@brief Event structure for events not associated with a specific function module. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ + union + { + ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ + ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ + } params; /**< Event parameter union. */ +} ble_common_evt_t; + +/**@brief BLE Event header. */ +typedef struct +{ + uint16_t evt_id; /**< Value from a BLE__EVT series. */ + uint16_t evt_len; /**< Length in octets including this header. */ +} ble_evt_hdr_t; + +/**@brief Common BLE Event type, wrapping the module specific event reports. */ +typedef struct +{ + ble_evt_hdr_t header; /**< Event header. */ + union + { + ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ + ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ + ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ + ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ + ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ + } evt; /**< Event union. */ +} ble_evt_t; + + +/** + * @brief Version Information. + */ +typedef struct +{ + uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ + uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ + uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ +} ble_version_t; + +/** + * @brief Configuration parameters for the PA and LNA. + */ +typedef struct +{ + uint8_t enable :1; /**< Enable toggling for this amplifier */ + uint8_t active_high :1; /**< Set the pin to be active high */ + uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ +} ble_pa_lna_cfg_t; + +/** + * @brief PA & LNA GPIO toggle configuration + * + * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or + * a low noise amplifier. + * + * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided + * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. + * + * @note @ref sd_ble_opt_get is not supported for this option. + * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences + * and must be avoided by the application. + */ +typedef struct +{ + ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ + ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ + + uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ + uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ + uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ +} ble_common_opt_pa_lna_t; + +/** + * @brief Configuration of extended BLE connection events. + * + * When enabled the SoftDevice will dynamically extend the connection event when possible. + * + * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. + * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, + * and if there are no conflicts with other BLE roles requesting radio time. + * + * @note @ref sd_ble_opt_get is not supported for this option. + */ +typedef struct +{ + uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ +} ble_common_opt_conn_evt_ext_t; + +/** + * @brief Enable/disable extended RC calibration. + * + * If extended RC calibration is enabled and the internal RC oscillator (@ref NRF_CLOCK_LF_SRC_RC) is used as the SoftDevice + * LFCLK source, the SoftDevice as a peripheral will by default try to increase the receive window if two consecutive packets + * are not received. If it turns out that the packets were not received due to clock drift, the RC calibration is started. + * This calibration comes in addition to the periodic calibration that is configured by @ref sd_softdevice_enable(). When + * using only peripheral connections, the periodic calibration can therefore be configured with a much longer interval as the + * peripheral will be able to detect and adjust automatically to clock drift, and calibrate on demand. + * + * If extended RC calibration is disabled and the internal RC oscillator is used as the SoftDevice LFCLK source, the + * RC oscillator is calibrated periodically as configured by @ref sd_softdevice_enable(). + * + * @note @ref sd_ble_opt_get is not supported for this option. + */ +typedef struct +{ + uint8_t enable : 1; /**< Enable extended RC calibration, enabled by default. */ +} ble_common_opt_extended_rc_cal_t; + +/**@brief Option structure for common options. */ +typedef union +{ + ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ + ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ + ble_common_opt_extended_rc_cal_t extended_rc_cal; /**< Parameters for enabling extended RC calibration. */ +} ble_common_opt_t; + +/**@brief Common BLE Option type, wrapping the module specific options. */ +typedef union +{ + ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ + ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ +} ble_opt_t; + +/**@brief BLE connection configuration type, wrapping the module specific configurations, set with + * @ref sd_ble_cfg_set. + * + * @note Connection configurations don't have to be set. + * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, + * the default connection configuration will be automatically added for the remaining connections. + * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in + * place of @ref ble_conn_cfg_t::conn_cfg_tag. + * + * @sa sd_ble_gap_adv_start() + * + * @mscs + * @mmsc{@ref BLE_CONN_CFG} + * @endmscs + + */ +typedef struct +{ + uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the + @ref sd_ble_gap_adv_start() call + to select this configuration when creating a connection. + Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ + union { + ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ + ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ + ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ + ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ + ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ + } params; /**< Connection configuration union. */ +} ble_conn_cfg_t; + +/** + * @brief Configuration of Vendor Specific base UUIDs, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. + */ +typedef struct +{ + uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific base UUID bases to allocate memory for. + Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is + @ref BLE_UUID_VS_COUNT_MAX. */ +} ble_common_cfg_vs_uuid_t; + +/**@brief Common BLE Configuration type, wrapping the common configurations. */ +typedef union +{ + ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor Specific base UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ +} ble_common_cfg_t; + +/**@brief BLE Configuration type, wrapping the module specific configurations. */ +typedef union +{ + ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ + ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ + ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ + ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ +} ble_cfg_t; + +/** @} */ + +/** @addtogroup BLE_COMMON_FUNCTIONS Functions + * @{ */ + +/**@brief Enable the BLE stack + * + * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the + * application RAM region (APP_RAM_BASE). On return, this will + * contain the minimum start address of the application RAM region + * required by the SoftDevice for this configuration. + * @warning After this call, the SoftDevice may generate several events. The list of events provided + * below require the application to initiate a SoftDevice API call. The corresponding API call + * is referenced in the event documentation. + * If the application fails to do so, the BLE connection may timeout, or the SoftDevice may stop + * communicating with the peer device. + * - @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST + * - @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST + * - @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST + * - @ref BLE_GAP_EVT_SEC_INFO_REQUEST + * - @ref BLE_GAP_EVT_AUTH_KEY_REQUEST + * - @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST + * - @ref BLE_EVT_USER_MEM_REQUEST + * - @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST + * + * @note The memory requirement for a specific configuration will not increase between SoftDevices + * with the same major version number. + * + * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located + * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between + * APP_RAM_BASE and the start of the call stack. + * + * @details This call initializes the BLE stack, no BLE related function other than @ref + * sd_ble_cfg_set can be called before this one. + * + * @mscs + * @mmsc{@ref BLE_COMMON_ENABLE} + * @endmscs + * + * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. + * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_NO_MEM One or more of the following is true: + * - The amount of memory assigned to the SoftDevice by *p_app_ram_base is not + * large enough to fit this configuration's memory requirement. Check *p_app_ram_base + * and set the start address of the application RAM region accordingly. + * - Dynamic part of the SoftDevice RAM region is larger then 64 kB which + * is currently not supported. + * @retval ::NRF_ERROR_RESOURCES The total number of L2CAP Channels configured using @ref sd_ble_cfg_set is too large. + */ +SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); + +/**@brief Add configurations for the BLE stack + * + * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref + * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. + * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. + * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). + * See @ref sd_ble_enable for details about APP_RAM_BASE. + * + * @note The memory requirement for a specific configuration will not increase between SoftDevices + * with the same major version number. + * + * @note If a configuration is set more than once, the last one set is the one that takes effect on + * @ref sd_ble_enable. + * + * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default + * configuration. + * + * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref + * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref + * sd_ble_enable). + * + * @note Error codes for the configurations are described in the configuration structs. + * + * @mscs + * @mmsc{@ref BLE_COMMON_ENABLE} + * @endmscs + * + * @retval ::NRF_SUCCESS The configuration has been added successfully. + * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. + * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not + * large enough to fit this configuration's memory requirement. + */ +SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); + +/**@brief Get an event from the pending events queue. + * + * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. + * This buffer must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT. + * The buffer should be interpreted as a @ref ble_evt_t struct. + * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. + * + * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that + * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. + * The application is free to choose whether to call this function from thread mode (main context) or directly from the + * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher + * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) + * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so + * could potentially leave events in the internal queue without the application being aware of this fact. + * + * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to + * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, + * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. + * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length + * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: + * + * \code + * uint16_t len; + * errcode = sd_ble_evt_get(NULL, &len); + * \endcode + * + * @mscs + * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} + * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. + * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. + */ +SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); + + +/**@brief Add a Vendor Specific base UUID. + * + * @details This call enables the application to add a Vendor Specific base UUID to the BLE stack's table, for later + * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t + * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code + * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses + * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to + * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field + * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to + * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, + * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. + * + * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by + * the 16-bit uuid field in @ref ble_uuid_t. + * + * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in + * p_uuid_type along with an @ref NRF_SUCCESS error code. + * + * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific base UUID disregarding + * bytes 12 and 13. + * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. + * + * @retval ::NRF_SUCCESS Successfully added the Vendor Specific base UUID. + * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. + * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. + */ +SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); + + +/**@brief Remove a Vendor Specific base UUID. + * + * @details This call removes a Vendor Specific base UUID that has been added with @ref sd_ble_uuid_vs_add. This function allows + * the application to reuse memory allocated for Vendor Specific base UUIDs. + * + * @note Currently this function can only be called with a p_uuid_type set to @ref BLE_UUID_TYPE_UNKNOWN or the last added UUID type. + * + * @param[inout] p_uuid_type Pointer to a uint8_t where its value matches the UUID type in @ref ble_uuid_t::type to be removed. + * If the type is set to @ref BLE_UUID_TYPE_UNKNOWN, or the pointer is NULL, the last Vendor Specific + * base UUID will be removed. If the function returns successfully, the UUID type that was removed will + * be written back to @p p_uuid_type. If function returns with a failure, it contains the last type that + * is in use by the ATT Server. + * + * @retval ::NRF_SUCCESS Successfully removed the Vendor Specific base UUID. + * @retval ::NRF_ERROR_INVALID_ADDR If p_uuid_type is invalid. + * @retval ::NRF_ERROR_INVALID_PARAM If p_uuid_type points to a non-valid UUID type. + * @retval ::NRF_ERROR_FORBIDDEN If the Vendor Specific base UUID is in use by the ATT Server. + */ +SVCALL(SD_BLE_UUID_VS_REMOVE, uint32_t, sd_ble_uuid_vs_remove(uint8_t *p_uuid_type)); + + +/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. + * + * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared + * to the corresponding ones in each entry of the table of Vendor Specific base UUIDs populated with @ref sd_ble_uuid_vs_add + * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index + * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. + * + * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. + * + * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). + * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. + * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. + * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. + */ +SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); + + +/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). + * + * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. + * + * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. + * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). + * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. + * + * @retval ::NRF_SUCCESS Successfully encoded into the buffer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. + */ +SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); + + +/**@brief Get Version Information. + * + * @details This call allows the application to get the BLE stack version information. + * + * @param[out] p_version Pointer to a ble_version_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Version information stored successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). + */ +SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); + + +/**@brief Provide a user memory block. + * + * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. + * + * @param[in] conn_handle Connection handle. + * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Successfully queued a response to the peer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. + */ +SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); + +/**@brief Set a BLE option. + * + * @details This call allows the application to set the value of an option. + * + * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. + * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value. + * + * @retval ::NRF_SUCCESS Option set successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. + */ +SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); + + +/**@brief Get a BLE option. + * + * @details This call allows the application to retrieve the value of an option. + * + * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. + * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Option retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. + * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. + * + */ +SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); + +/** @} */ +#ifdef __cplusplus +} +#endif +#endif /* BLE_H__ */ + +/** + @} + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_err.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_err.h new file mode 100644 index 0000000..1b4820d --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_err.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @addtogroup nrf_error + @{ + @ingroup BLE_COMMON + @} + + @defgroup ble_err General error codes + @{ + + @brief General error code definitions for the BLE API. + + @ingroup BLE_COMMON +*/ +#ifndef NRF_BLE_ERR_H__ +#define NRF_BLE_ERR_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* @defgroup BLE_ERRORS Error Codes + * @{ */ +#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ +#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ +#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ +#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ +#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ +#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ +/** @} */ + + +/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges + * @brief Assignment of subranges for module specific error codes. + * @note For specific error codes, see ble_.h or ble_error_.h. + * @{ */ +#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ +#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ +#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ +#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif + + +/** + @} + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gap.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gap.h new file mode 100644 index 0000000..e8fe3d7 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gap.h @@ -0,0 +1,2269 @@ +/* + * Copyright (c) 2011 - 2020, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GAP Generic Access Profile (GAP) + @{ + @brief Definitions and prototypes for the GAP interface. + */ + +#ifndef BLE_GAP_H__ +#define BLE_GAP_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup BLE_GAP_ENUMERATIONS Enumerations + * @{ */ + +/**@brief GAP API SVC numbers. + */ +enum BLE_GAP_SVCS +{ + SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ + SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ + SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ + SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ + SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ + SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ + SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ + SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ + SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ + SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ + SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ + SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ + SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ + SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ + SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ + SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ + SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ + SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ + SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ + SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ + SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ + SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ + SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ + SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ + SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ + SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ + SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ + SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ + SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ + SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ + SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ + SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_ADV_ADDR_GET = BLE_GAP_SVC_BASE + 39, /**< Get the Address used on air while Advertising. */ + SD_BLE_GAP_NEXT_CONN_EVT_COUNTER_GET = BLE_GAP_SVC_BASE + 40, /**< Get the next connection event counter. */ + SD_BLE_GAP_CONN_EVT_TRIGGER_START = BLE_GAP_SVC_BASE + 41, /** Start triggering a given task on connection event start. */ + SD_BLE_GAP_CONN_EVT_TRIGGER_STOP = BLE_GAP_SVC_BASE + 42, /** Stop triggering the task configured using @ref sd_ble_gap_conn_evt_trigger_start. */ +}; + +/**@brief GAP Event IDs. + * IDs that uniquely identify an event coming from the stack to the application. + */ +enum BLE_GAP_EVTS +{ + BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connected to peer. \n See @ref ble_gap_evt_connected_t */ + BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ + BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ + BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ + BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ + BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ + BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ + BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ + BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ + BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ + BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ + BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ + BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n Reply with @ref sd_ble_gap_authenticate +. \n See @ref ble_gap_evt_sec_request_t. */ + BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ + BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ + BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update. \n See @ref ble_gap_evt_data_length_update_request_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ +}; + +/**@brief GAP Option IDs. + * IDs that uniquely identify a GAP option. + */ +enum BLE_GAP_OPTS +{ + BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ + BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ + BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ + BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ + BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ +}; + +/**@brief GAP Configuration IDs. + * + * IDs that uniquely identify a GAP configuration. + */ +enum BLE_GAP_CFGS +{ + BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ + BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ + BLE_GAP_CFG_PPCP_INCL_CONFIG = BLE_GAP_CFG_BASE + 2, /**< Peripheral Preferred Connection Parameters characteristic + inclusion configuration. */ + BLE_GAP_CFG_CAR_INCL_CONFIG = BLE_GAP_CFG_BASE + 3, /**< Central Address Resolution characteristic + inclusion configuration. */ +}; + +/**@brief GAP TX Power roles. + */ +enum BLE_GAP_TX_POWER_ROLES +{ + BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ + BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ +}; + +/** @} */ + +/**@addtogroup BLE_GAP_DEFINES Defines + * @{ */ + +/**@defgroup BLE_ERRORS_GAP SVC return values specific to GAP + * @{ */ +#define BLE_ERROR_GAP_UUID_LIST_MISMATCH (NRF_GAP_ERR_BASE + 0x000) /**< UUID list does not contain an integral number of UUIDs. */ +#define BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST (NRF_GAP_ERR_BASE + 0x001) /**< Use of Whitelist not permitted with discoverable advertising. */ +#define BLE_ERROR_GAP_INVALID_BLE_ADDR (NRF_GAP_ERR_BASE + 0x002) /**< The upper two bits of the address do not correspond to the specified address type. */ +#define BLE_ERROR_GAP_WHITELIST_IN_USE (NRF_GAP_ERR_BASE + 0x003) /**< Attempt to modify the whitelist while already in use by another operation. */ +#define BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE (NRF_GAP_ERR_BASE + 0x004) /**< Attempt to modify the device identity list while already in use by another operation. */ +#define BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE (NRF_GAP_ERR_BASE + 0x005) /**< The device identity list contains entries with duplicate identity addresses. */ +/**@} */ + + +/**@defgroup BLE_GAP_ROLES GAP Roles + * @{ */ +#define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ +#define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ +/**@} */ + + +/**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources + * @{ */ +#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ +#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ +/**@} */ + + +/**@defgroup BLE_GAP_ADDR_TYPES GAP Address types + * @{ */ +#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ +#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ +#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ +#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ +/**@} */ + + +/**@brief The default interval in seconds at which a private address is refreshed. */ +#define BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S (900) /* 15 minutes. */ +/**@brief The maximum interval in seconds at which a private address can be refreshed. */ +#define BLE_GAP_MAX_PRIVATE_ADDR_CYCLE_INTERVAL_S (41400) /* 11 hours 30 minutes. */ + + +/** @brief BLE address length. */ +#define BLE_GAP_ADDR_LEN (6) + +/**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes + * @{ */ +#define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ +#define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ +#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, + and will not accept a peer using identity address as sender address when + the peer IRK is exchanged, non-zero and added to the identity list. */ +/**@} */ + +/** @brief Invalid power level. */ +#define BLE_GAP_POWER_LEVEL_INVALID 127 + +/** @brief Advertising set handle not set. */ +#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) + +/** @brief The default number of advertising sets. */ +#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) + +/** @brief The maximum number of advertising sets supported by this SoftDevice. */ +#define BLE_GAP_ADV_SET_COUNT_MAX (1) + +/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. + * @{ */ +#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. + If more advertising data is required, use extended advertising instead. */ +/**@}. */ + +/** @brief Set ID not available in advertising report. */ +#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF + +/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons + * @{ */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ +/**@} */ + +/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format + * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm + * @{ */ +#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */ +#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */ +#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */ +#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */ +#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */ +#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */ +#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */ +#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */ +#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */ +#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */ +#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */ +#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */ +#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */ +#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */ +#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */ +#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */ +#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */ +#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */ +#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */ +#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */ +#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */ +#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */ +#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */ +#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */ +#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */ +#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */ +/**@} */ + + +/**@defgroup BLE_GAP_ADV_FLAGS GAP Advertisement Flags + * @{ */ +#define BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE (0x01) /**< LE Limited Discoverable Mode. */ +#define BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE (0x02) /**< LE General Discoverable Mode. */ +#define BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED (0x04) /**< BR/EDR not supported. */ +#define BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER (0x08) /**< Simultaneous LE and BR/EDR, Controller. */ +#define BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST (0x10) /**< Simultaneous LE and BR/EDR, Host. */ +#define BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE Limited Discoverable Mode, BR/EDR not supported. */ +#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE General Discoverable Mode, BR/EDR not supported. */ +/**@} */ + + +/**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min + * @{ */ +#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ +#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ + /**@} */ + + + +/**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types + * + * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. + * + * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. + * Note that some of the advertising types do not support advertising data. Non-scannable types do not support + * scan response data. + * + * @note Extended advertising is not supported in this SoftDevice. + * @{ */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising + events. Advertising interval is less that 3.75 ms. + Use this type for fast reconnections. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising + events. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected + advertising events. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies + * @{ */ +#define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ +#define BLE_GAP_ADV_FP_FILTER_SCANREQ 0x01 /**< Filter scan requests with whitelist. */ +#define BLE_GAP_ADV_FP_FILTER_CONNREQ 0x02 /**< Filter connect requests with whitelist. */ +#define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ +/**@} */ + + +/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units + * @{ */ +#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ +#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. + For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ +/**@} */ + + +/**@defgroup BLE_GAP_DISC_MODES GAP Discovery modes + * @{ */ +#define BLE_GAP_DISC_MODE_NOT_DISCOVERABLE 0x00 /**< Not discoverable discovery Mode. */ +#define BLE_GAP_DISC_MODE_LIMITED 0x01 /**< Limited Discovery Mode. */ +#define BLE_GAP_DISC_MODE_GENERAL 0x02 /**< General Discovery Mode. */ +/**@} */ + + +/**@defgroup BLE_GAP_IO_CAPS GAP IO Capabilities + * @{ */ +#define BLE_GAP_IO_CAPS_DISPLAY_ONLY 0x00 /**< Display Only. */ +#define BLE_GAP_IO_CAPS_DISPLAY_YESNO 0x01 /**< Display and Yes/No entry. */ +#define BLE_GAP_IO_CAPS_KEYBOARD_ONLY 0x02 /**< Keyboard Only. */ +#define BLE_GAP_IO_CAPS_NONE 0x03 /**< No I/O capabilities. */ +#define BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY 0x04 /**< Keyboard and Display. */ +/**@} */ + + +/**@defgroup BLE_GAP_AUTH_KEY_TYPES GAP Authentication Key Types + * @{ */ +#define BLE_GAP_AUTH_KEY_TYPE_NONE 0x00 /**< No key (may be used to reject). */ +#define BLE_GAP_AUTH_KEY_TYPE_PASSKEY 0x01 /**< 6-digit Passkey. */ +#define BLE_GAP_AUTH_KEY_TYPE_OOB 0x02 /**< Out Of Band data. */ +/**@} */ + + +/**@defgroup BLE_GAP_KP_NOT_TYPES GAP Keypress Notification Types + * @{ */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_START 0x00 /**< Passkey entry started. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_IN 0x01 /**< Passkey digit entered. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_OUT 0x02 /**< Passkey digit erased. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_CLEAR 0x03 /**< Passkey cleared. */ +#define BLE_GAP_KP_NOT_TYPE_PASSKEY_END 0x04 /**< Passkey entry completed. */ +/**@} */ + + +/**@defgroup BLE_GAP_SEC_STATUS GAP Security status + * @{ */ +#define BLE_GAP_SEC_STATUS_SUCCESS 0x00 /**< Procedure completed with success. */ +#define BLE_GAP_SEC_STATUS_TIMEOUT 0x01 /**< Procedure timed out. */ +#define BLE_GAP_SEC_STATUS_PDU_INVALID 0x02 /**< Invalid PDU received. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE1_BEGIN 0x03 /**< Reserved for Future Use range #1 begin. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE1_END 0x80 /**< Reserved for Future Use range #1 end. */ +#define BLE_GAP_SEC_STATUS_PASSKEY_ENTRY_FAILED 0x81 /**< Passkey entry failed (user canceled or other). */ +#define BLE_GAP_SEC_STATUS_OOB_NOT_AVAILABLE 0x82 /**< Out of Band Key not available. */ +#define BLE_GAP_SEC_STATUS_AUTH_REQ 0x83 /**< Authentication requirements not met. */ +#define BLE_GAP_SEC_STATUS_CONFIRM_VALUE 0x84 /**< Confirm value failed. */ +#define BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP 0x85 /**< Pairing not supported. */ +#define BLE_GAP_SEC_STATUS_ENC_KEY_SIZE 0x86 /**< Encryption key size. */ +#define BLE_GAP_SEC_STATUS_SMP_CMD_UNSUPPORTED 0x87 /**< Unsupported SMP command. */ +#define BLE_GAP_SEC_STATUS_UNSPECIFIED 0x88 /**< Unspecified reason. */ +#define BLE_GAP_SEC_STATUS_REPEATED_ATTEMPTS 0x89 /**< Too little time elapsed since last attempt. */ +#define BLE_GAP_SEC_STATUS_INVALID_PARAMS 0x8A /**< Invalid parameters. */ +#define BLE_GAP_SEC_STATUS_DHKEY_FAILURE 0x8B /**< DHKey check failure. */ +#define BLE_GAP_SEC_STATUS_NUM_COMP_FAILURE 0x8C /**< Numeric Comparison failure. */ +#define BLE_GAP_SEC_STATUS_BR_EDR_IN_PROG 0x8D /**< BR/EDR pairing in progress. */ +#define BLE_GAP_SEC_STATUS_X_TRANS_KEY_DISALLOWED 0x8E /**< BR/EDR Link Key cannot be used for LE keys. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE2_BEGIN 0x8F /**< Reserved for Future Use range #2 begin. */ +#define BLE_GAP_SEC_STATUS_RFU_RANGE2_END 0xFF /**< Reserved for Future Use range #2 end. */ +/**@} */ + + +/**@defgroup BLE_GAP_SEC_STATUS_SOURCES GAP Security status sources + * @{ */ +#define BLE_GAP_SEC_STATUS_SOURCE_LOCAL 0x00 /**< Local failure. */ +#define BLE_GAP_SEC_STATUS_SOURCE_REMOTE 0x01 /**< Remote failure. */ +/**@} */ + + +/**@defgroup BLE_GAP_CP_LIMITS GAP Connection Parameters Limits + * @{ */ +#define BLE_GAP_CP_MIN_CONN_INTVL_NONE 0xFFFF /**< No new minimum connection interval specified in connect parameters. */ +#define BLE_GAP_CP_MIN_CONN_INTVL_MIN 0x0006 /**< Lowest minimum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ +#define BLE_GAP_CP_MIN_CONN_INTVL_MAX 0x0C80 /**< Highest minimum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ +#define BLE_GAP_CP_MAX_CONN_INTVL_NONE 0xFFFF /**< No new maximum connection interval specified in connect parameters. */ +#define BLE_GAP_CP_MAX_CONN_INTVL_MIN 0x0006 /**< Lowest maximum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ +#define BLE_GAP_CP_MAX_CONN_INTVL_MAX 0x0C80 /**< Highest maximum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ +#define BLE_GAP_CP_SLAVE_LATENCY_MAX 0x01F3 /**< Highest slave latency permitted, in connection events. */ +#define BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE 0xFFFF /**< No new supervision timeout specified in connect parameters. */ +#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MIN 0x000A /**< Lowest supervision timeout permitted, in units of 10 ms, i.e. 100 ms. */ +#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MAX 0x0C80 /**< Highest supervision timeout permitted, in units of 10 ms, i.e. 32 s. */ +/**@} */ + + +/**@defgroup BLE_GAP_DEVNAME GAP device name defines. + * @{ */ +#define BLE_GAP_DEVNAME_DEFAULT "nRF5x" /**< Default device name value. */ +#define BLE_GAP_DEVNAME_DEFAULT_LEN 31 /**< Default number of octets in device name. */ +#define BLE_GAP_DEVNAME_MAX_LEN 248 /**< Maximum number of octets in device name. */ +/**@} */ + + +/**@brief Disable RSSI events for connections */ +#define BLE_GAP_RSSI_THRESHOLD_INVALID 0xFF + +/**@defgroup BLE_GAP_PHYS GAP PHYs + * @{ */ +#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ +#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ +#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ +#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ +#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ + +/**@brief Supported PHYs in connections and for advertising. */ +#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS) /**< All PHYs except @ref BLE_GAP_PHY_CODED are supported. */ + +/**@} */ + +/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters + * + * See @ref ble_gap_conn_sec_mode_t. + * @{ */ +/**@brief Set sec_mode pointed to by ptr to have no access rights.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr) do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0) +/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr) do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0) +/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0) +/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0) +/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0) +/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0) +/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/ +#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0) +/**@} */ + + +/**@brief GAP Security Random Number Length. */ +#define BLE_GAP_SEC_RAND_LEN 8 + + +/**@brief GAP Security Key Length. */ +#define BLE_GAP_SEC_KEY_LEN 16 + + +/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key Length. */ +#define BLE_GAP_LESC_P256_PK_LEN 64 + + +/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman DHKey Length. */ +#define BLE_GAP_LESC_DHKEY_LEN 32 + + +/**@brief GAP Passkey Length. */ +#define BLE_GAP_PASSKEY_LEN 6 + + +/**@brief Maximum amount of addresses in the whitelist. */ +#define BLE_GAP_WHITELIST_ADDR_MAX_COUNT (8) + + +/**@brief Maximum amount of identities in the device identities list. */ +#define BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT (8) + + +/**@brief Default connection count for a configuration. */ +#define BLE_GAP_CONN_COUNT_DEFAULT (1) + + +/**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. + * @{ */ +#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ +/**@} */ + + +/**@defgroup BLE_GAP_ROLE_COUNT GAP concurrent connection count defines. + * @{ */ +#define BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT (1) /**< Default maximum number of connections concurrently acting as peripherals. */ +#define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral roles. */ + +/**@} */ + +/**@brief Automatic data length parameter. */ +#define BLE_GAP_DATA_LENGTH_AUTO 0 + +/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. + * @{ */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ +/**@} */ + +/**@defgroup GAP_SEC_MODES GAP Security Modes + * @{ */ +#define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ +/**@} */ + +/** @} */ + +/** @defgroup BLE_GAP_CHAR_INCL_CONFIG GAP Characteristic inclusion configurations + * @{ + */ +#define BLE_GAP_CHAR_INCL_CONFIG_INCLUDE (0) /**< Include the characteristic in the Attribute Table */ +#define BLE_GAP_CHAR_INCL_CONFIG_EXCLUDE_WITH_SPACE (1) /**< Do not include the characteristic in the Attribute table. + The SoftDevice will reserve the attribute handles + which are otherwise used for this characteristic. + By reserving the attribute handles it will be possible + to upgrade the SoftDevice without changing handle of the + Service Changed characteristic. */ +#define BLE_GAP_CHAR_INCL_CONFIG_EXCLUDE_WITHOUT_SPACE (2) /**< Do not include the characteristic in the Attribute table. + The SoftDevice will not reserve the attribute handles + which are otherwise used for this characteristic. */ +/**@} */ + + +/** @defgroup BLE_GAP_CHAR_INCL_CONFIG_DEFAULTS Characteristic inclusion default values + * @{ */ +#define BLE_GAP_PPCP_INCL_CONFIG_DEFAULT (BLE_GAP_CHAR_INCL_CONFIG_INCLUDE) /**< Included by default. */ +#define BLE_GAP_CAR_INCL_CONFIG_DEFAULT (BLE_GAP_CHAR_INCL_CONFIG_INCLUDE) /**< Included by default. */ +/**@} */ + +/**@addtogroup BLE_GAP_STRUCTURES Structures + * @{ */ + +/**@brief Advertising event properties. */ +typedef struct +{ + uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ + uint8_t anonymous : 1; /**< This feature is not supported on this SoftDevice. */ + uint8_t include_tx_power : 1; /**< This feature is not supported on this SoftDevice. */ +} ble_gap_adv_properties_t; + + + +/**@brief Bluetooth Low Energy address. */ +typedef struct +{ + uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. + This bit is set by the SoftDevice to indicate whether the address has been resolved from + a Resolvable Private Address (when the peer is using privacy). + If set to 1, @ref addr and @ref addr_type refer to the identity address of the resolved address. + + This bit is ignored when a variable of type @ref ble_gap_addr_t is used as input to API functions. */ + uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ + uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */ +} ble_gap_addr_t; + + +/**@brief GAP connection parameters. + * + * @note When ble_conn_params_t is received in an event, both min_conn_interval and + * max_conn_interval will be equal to the connection interval set by the central. + * + * @note If both conn_sup_timeout and max_conn_interval are specified, then the following constraint applies: + * conn_sup_timeout * 4 > (1 + slave_latency) * max_conn_interval + * that corresponds to the following Bluetooth Spec requirement: + * The Supervision_Timeout in milliseconds shall be larger than + * (1 + Conn_Latency) * Conn_Interval_Max * 2, where Conn_Interval_Max is given in milliseconds. + */ +typedef struct +{ + uint16_t min_conn_interval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ + uint16_t max_conn_interval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ + uint16_t slave_latency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/ + uint16_t conn_sup_timeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/ +} ble_gap_conn_params_t; + + +/**@brief GAP connection security modes. + * + * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n + * Security Mode 1 Level 1: No security is needed (aka open link).\n + * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n + * Security Mode 1 Level 3: MITM protected encrypted link required.\n + * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n + * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n + * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n + */ +typedef struct +{ + uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ + uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ + +} ble_gap_conn_sec_mode_t; + + +/**@brief GAP connection security status.*/ +typedef struct +{ + ble_gap_conn_sec_mode_t sec_mode; /**< Currently active security mode for this connection.*/ + uint8_t encr_key_size; /**< Length of currently active encryption key, 7 to 16 octets (only applicable for bonding procedures). */ +} ble_gap_conn_sec_t; + +/**@brief Identity Resolving Key. */ +typedef struct +{ + uint8_t irk[BLE_GAP_SEC_KEY_LEN]; /**< Array containing IRK. */ +} ble_gap_irk_t; + + +/**@brief Channel mask (40 bits). + * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, + * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents + * channel index 39. If a bit is set to 1, the channel is not used. + */ +typedef uint8_t ble_gap_ch_mask_t[5]; + + +/**@brief GAP advertising parameters. */ +typedef struct +{ + ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ + ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. + - When privacy is enabled and the local device uses + @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, + the device identity list is searched for a matching entry. If + the local IRK for that device identity is set, the local IRK + for that device will be used to generate the advertiser address + field in the advertising packet. + - If @ref ble_gap_adv_properties_t::type is directed, this must be + set to the targeted scanner or initiator. If the peer address is + in the device identity list, the peer IRK for that device will be + used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE + target addresses used in the advertising event PDUs. */ + uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE + advertising, this parameter is ignored. */ + uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, + an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + @sa BLE_GAP_ADV_TIMEOUT_VALUES. + @note The SoftDevice will always complete at least one advertising + event even if the duration is set too low. */ + uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling + advertising. Setting the value to 0 disables the limitation. When + the count of advertising events specified by this parameter + (if not 0) is reached, advertising will be automatically stopped + and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, + this parameter is ignored. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary channels. + At least one of the primary channels, that is channel index 37-39, must be used. */ + uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets + are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS + will be used. + The only supported value by this SoftDevice is @ref BLE_GAP_PHY_1MBPS. */ + uint8_t secondary_phy; /**< This field is ignored on this SoftDevice. */ + uint8_t set_id:4; /**< This field is ignored on this SoftDevice. */ + uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a + scan request is received and the scanner address is allowed + by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is a non-scannable + advertising type. */ +} ble_gap_adv_params_t; + + +/**@brief GAP advertising data buffers. + * + * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and + * shall never be modified while advertising. The data shall be kept alive until either: + * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding + * advertising handle. + * - Advertising is stopped. + * - Advertising data is changed. + * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ +typedef struct +{ + ble_data_t adv_data; /**< Advertising data. + @note + Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type + that is allowed to contain advertising data. */ + ble_data_t scan_rsp_data; /**< Scan response data. + @note + Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type + that is scannable. */ +} ble_gap_adv_data_t; + + +/**@brief Privacy. + * + * The privacy feature provides a way for the device to avoid being tracked over a period of time. + * The privacy feature, when enabled, hides the local device identity and replaces it with a private address + * that is automatically refreshed at a specified interval. + * + * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). + * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, + * and devices can establish connections without revealing their real identities. + * + * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) + * are supported. + * + * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all + * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. + * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. + */ +typedef struct +{ + uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ + uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ + uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ + ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. + When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. + By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ +} ble_gap_privacy_params_t; + + +/**@brief PHY preferences for TX and RX + * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. + * @code + * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; + * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; + * @endcode + * + */ +typedef struct +{ + uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ + uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ +} ble_gap_phys_t; + +/** @brief Keys that can be exchanged during a bonding procedure. */ +typedef struct +{ + uint8_t enc : 1; /**< Long Term Key and Master Identification. */ + uint8_t id : 1; /**< Identity Resolving Key and Identity Address Information. */ + uint8_t sign : 1; /**< Connection Signature Resolving Key. */ + uint8_t link : 1; /**< Derive the Link Key from the LTK. */ +} ble_gap_sec_kdist_t; + + +/**@brief GAP security parameters. */ +typedef struct +{ + uint8_t bond : 1; /**< Perform bonding. */ + uint8_t mitm : 1; /**< Enable Man In The Middle protection. */ + uint8_t lesc : 1; /**< Enable LE Secure Connection pairing. */ + uint8_t keypress : 1; /**< Enable generation of keypress notifications. */ + uint8_t io_caps : 3; /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */ + uint8_t oob : 1; /**< The OOB data flag. + - In LE legacy pairing, this flag is set if a device has out of band authentication data. + The OOB method is used if both of the devices have out of band authentication data. + - In LE Secure Connections pairing, this flag is set if a device has the peer device's out of band authentication data. + The OOB method is used if at least one device has the peer device's OOB data available. */ + uint8_t min_key_size; /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */ + uint8_t max_key_size; /**< Maximum encryption key size in octets between min_key_size and 16. */ + ble_gap_sec_kdist_t kdist_own; /**< Key distribution bitmap: keys that the local device will distribute. */ + ble_gap_sec_kdist_t kdist_peer; /**< Key distribution bitmap: keys that the remote device will distribute. */ +} ble_gap_sec_params_t; + + +/**@brief GAP Encryption Information. */ +typedef struct +{ + uint8_t ltk[BLE_GAP_SEC_KEY_LEN]; /**< Long Term Key. */ + uint8_t lesc : 1; /**< Key generated using LE Secure Connections. */ + uint8_t auth : 1; /**< Authenticated Key. */ + uint8_t ltk_len : 6; /**< LTK length in octets. */ +} ble_gap_enc_info_t; + + +/**@brief GAP Master Identification. */ +typedef struct +{ + uint16_t ediv; /**< Encrypted Diversifier. */ + uint8_t rand[BLE_GAP_SEC_RAND_LEN]; /**< Random Number. */ +} ble_gap_master_id_t; + + +/**@brief GAP Signing Information. */ +typedef struct +{ + uint8_t csrk[BLE_GAP_SEC_KEY_LEN]; /**< Connection Signature Resolving Key. */ +} ble_gap_sign_info_t; + + +/**@brief GAP LE Secure Connections P-256 Public Key. */ +typedef struct +{ + uint8_t pk[BLE_GAP_LESC_P256_PK_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key. Stored in the standard SMP protocol format: {X,Y} both in little-endian. */ +} ble_gap_lesc_p256_pk_t; + + +/**@brief GAP LE Secure Connections DHKey. */ +typedef struct +{ + uint8_t key[BLE_GAP_LESC_DHKEY_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman Key. Stored in little-endian. */ +} ble_gap_lesc_dhkey_t; + + +/**@brief GAP LE Secure Connections OOB data. */ +typedef struct +{ + ble_gap_addr_t addr; /**< Bluetooth address of the device. */ + uint8_t r[BLE_GAP_SEC_KEY_LEN]; /**< Random Number. */ + uint8_t c[BLE_GAP_SEC_KEY_LEN]; /**< Confirm Value. */ +} ble_gap_lesc_oob_data_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_CONNECTED. */ +typedef struct +{ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 + and the address is the device's identity address. */ + uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ + ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ +} ble_gap_evt_connected_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_DISCONNECTED. */ +typedef struct +{ + uint8_t reason; /**< HCI error code, see @ref BLE_HCI_STATUS_CODES. */ +} ble_gap_evt_disconnected_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE. */ +typedef struct +{ + ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ +} ble_gap_evt_conn_param_update_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ +typedef struct +{ + ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ +} ble_gap_evt_phy_update_request_t; + +/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ +typedef struct +{ + uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ + uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ + uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ +} ble_gap_evt_phy_update_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. */ +typedef struct +{ + ble_gap_sec_params_t peer_params; /**< Initiator Security Parameters. */ +} ble_gap_evt_sec_params_request_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_SEC_INFO_REQUEST. */ +typedef struct +{ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. */ + ble_gap_master_id_t master_id; /**< Master Identification for LTK lookup. */ + uint8_t enc_info : 1; /**< If 1, Encryption Information required. */ + uint8_t id_info : 1; /**< If 1, Identity Information required. */ + uint8_t sign_info : 1; /**< If 1, Signing Information required. */ +} ble_gap_evt_sec_info_request_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */ +typedef struct +{ + uint8_t passkey[BLE_GAP_PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */ + uint8_t match_request : 1; /**< If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply + with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or + @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */ +} ble_gap_evt_passkey_display_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_KEY_PRESSED. */ +typedef struct +{ + uint8_t kp_not; /**< Keypress notification type, see @ref BLE_GAP_KP_NOT_TYPES. */ +} ble_gap_evt_key_pressed_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_KEY_REQUEST. */ +typedef struct +{ + uint8_t key_type; /**< See @ref BLE_GAP_AUTH_KEY_TYPES. */ +} ble_gap_evt_auth_key_request_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST. */ +typedef struct +{ + ble_gap_lesc_p256_pk_t *p_pk_peer; /**< LE Secure Connections remote P-256 Public Key. This will point to the application-supplied memory + inside the keyset during the call to @ref sd_ble_gap_sec_params_reply. */ + uint8_t oobd_req :1; /**< LESC OOB data required. A call to @ref sd_ble_gap_lesc_oob_data_set is required to complete the procedure. */ +} ble_gap_evt_lesc_dhkey_request_t; + + +/**@brief Security levels supported. + * @note See Bluetooth Specification Version 4.2 Volume 3, Part C, Chapter 10, Section 10.2.1. +*/ +typedef struct +{ + uint8_t lv1 : 1; /**< If 1: Level 1 is supported. */ + uint8_t lv2 : 1; /**< If 1: Level 2 is supported. */ + uint8_t lv3 : 1; /**< If 1: Level 3 is supported. */ + uint8_t lv4 : 1; /**< If 1: Level 4 is supported. */ +} ble_gap_sec_levels_t; + + +/**@brief Encryption Key. */ +typedef struct +{ + ble_gap_enc_info_t enc_info; /**< Encryption Information. */ + ble_gap_master_id_t master_id; /**< Master Identification. */ +} ble_gap_enc_key_t; + + +/**@brief Identity Key. */ +typedef struct +{ + ble_gap_irk_t id_info; /**< Identity Resolving Key. */ + ble_gap_addr_t id_addr_info; /**< Identity Address. */ +} ble_gap_id_key_t; + + +/**@brief Security Keys. */ +typedef struct +{ + ble_gap_enc_key_t *p_enc_key; /**< Encryption Key, or NULL. */ + ble_gap_id_key_t *p_id_key; /**< Identity Key, or NULL. */ + ble_gap_sign_info_t *p_sign_key; /**< Signing Key, or NULL. */ + ble_gap_lesc_p256_pk_t *p_pk; /**< LE Secure Connections P-256 Public Key. When in debug mode the application must use the value defined + in the Core Bluetooth Specification v4.2 Vol.3, Part H, Section 2.3.5.6.1 */ +} ble_gap_sec_keys_t; + + +/**@brief Security key set for both local and peer keys. */ +typedef struct +{ + ble_gap_sec_keys_t keys_own; /**< Keys distributed by the local device. For LE Secure Connections the encryption key will be generated locally and will always be stored if bonding. */ + ble_gap_sec_keys_t keys_peer; /**< Keys distributed by the remote device. For LE Secure Connections, p_enc_key must always be NULL. */ +} ble_gap_sec_keyset_t; + + +/**@brief Data Length Update Procedure parameters. */ +typedef struct +{ + uint16_t max_tx_octets; /**< Maximum number of payload octets that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ + uint16_t max_rx_octets; /**< Maximum number of payload octets that a Controller supports for reception of a single Link Layer Data Channel PDU. */ + uint16_t max_tx_time_us; /**< Maximum time, in microseconds, that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ + uint16_t max_rx_time_us; /**< Maximum time, in microseconds, that a Controller supports for reception of a single Link Layer Data Channel PDU. */ +} ble_gap_data_length_params_t; + + +/**@brief Data Length Update Procedure local limitation. */ +typedef struct +{ + uint16_t tx_payload_limited_octets; /**< If > 0, the requested TX packet length is too long by this many octets. */ + uint16_t rx_payload_limited_octets; /**< If > 0, the requested RX packet length is too long by this many octets. */ + uint16_t tx_rx_time_limited_us; /**< If > 0, the requested combination of TX and RX packet lengths is too long by this many microseconds. */ +} ble_gap_data_length_limitation_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_STATUS. */ +typedef struct +{ + uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ + uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ + uint8_t bonded : 1; /**< Procedure resulted in a bond. */ + uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ + ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ + ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ + ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ + ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ +} ble_gap_evt_auth_status_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_CONN_SEC_UPDATE. */ +typedef struct +{ + ble_gap_conn_sec_t conn_sec; /**< Connection security level. */ +} ble_gap_evt_conn_sec_update_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ +} ble_gap_evt_timeout_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ +typedef struct +{ + int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ +} ble_gap_evt_rssi_changed_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ +typedef struct +{ + uint8_t reason; /**< Reason for why the advertising set terminated. See + @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ + uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, + this field indicates the number of completed advertising events. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. */ +} ble_gap_evt_adv_set_terminated_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */ +typedef struct +{ + uint8_t bond : 1; /**< Perform bonding. */ + uint8_t mitm : 1; /**< Man In The Middle protection requested. */ + uint8_t lesc : 1; /**< LE Secure Connections requested. */ + uint8_t keypress : 1; /**< Generation of keypress notifications requested. */ +} ble_gap_evt_sec_request_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ +typedef struct +{ + uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. + @note ERRATA-153 and ERRATA-225 require the rssi sample to be compensated based on a temperature measurement. */ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 + and the address is the device's identity address. */ +} ble_gap_evt_scan_req_report_t; + + +/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ +typedef struct +{ + ble_gap_data_length_params_t peer_params; /**< Peer data length parameters. */ +} ble_gap_evt_data_length_update_request_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE. + */ +typedef struct +{ + ble_gap_data_length_params_t effective_params; /**< The effective data length parameters. */ +} ble_gap_evt_data_length_update_t; + + +/**@brief GAP event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which event occurred. */ + union /**< union alternative identified by evt_id in enclosing struct. */ + { + ble_gap_evt_connected_t connected; /**< Connected Event Parameters. */ + ble_gap_evt_disconnected_t disconnected; /**< Disconnected Event Parameters. */ + ble_gap_evt_conn_param_update_t conn_param_update; /**< Connection Parameter Update Parameters. */ + ble_gap_evt_sec_params_request_t sec_params_request; /**< Security Parameters Request Event Parameters. */ + ble_gap_evt_sec_info_request_t sec_info_request; /**< Security Information Request Event Parameters. */ + ble_gap_evt_passkey_display_t passkey_display; /**< Passkey Display Event Parameters. */ + ble_gap_evt_key_pressed_t key_pressed; /**< Key Pressed Event Parameters. */ + ble_gap_evt_auth_key_request_t auth_key_request; /**< Authentication Key Request Event Parameters. */ + ble_gap_evt_lesc_dhkey_request_t lesc_dhkey_request; /**< LE Secure Connections DHKey calculation request. */ + ble_gap_evt_auth_status_t auth_status; /**< Authentication Status Event Parameters. */ + ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */ + ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ + ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ + ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ + ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ + ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ + ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ + ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ + ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ + ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_gap_evt_t; + + +/** + * @brief BLE GAP connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_CONN_COUNT The connection count for the connection configurations is zero. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - The sum of conn_count for all connection configurations combined exceeds UINT8_MAX. + * - The event length is smaller than @ref BLE_GAP_EVENT_LENGTH_MIN. + */ +typedef struct +{ + uint8_t conn_count; /**< The number of concurrent connections the application can create with this configuration. + The default and minimum value is @ref BLE_GAP_CONN_COUNT_DEFAULT. */ + uint16_t event_length; /**< The time set aside for this connection on every connection interval in 1.25 ms units. + The default value is @ref BLE_GAP_EVENT_LENGTH_DEFAULT, the minimum value is @ref BLE_GAP_EVENT_LENGTH_MIN. + The event length and the connection interval are the primary parameters + for setting the throughput of a connection. + See the SoftDevice Specification for details on throughput. */ +} ble_gap_conn_cfg_t; + + +/** + * @brief Configuration of maximum concurrent connections in the peripheral role, set with + * @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_CONN_COUNT The periph_role_count is too large. The maximum + * supported sum of concurrent connections is + * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. + * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum + * supported advertising handles is + * @ref BLE_GAP_ADV_SET_COUNT_MAX. + */ +typedef struct +{ + uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ + uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ +} ble_gap_cfg_role_count_t; + + +/** + * @brief Device name and its properties, set with @ref sd_ble_cfg_set. + * + * @note If the device name is not configured, the default device name will be + * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be + * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name + * will have no write access. + * + * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, + * the attribute table size must be increased to have room for the longer device name (see + * @ref sd_ble_cfg_set and @ref ble_gatts_cfg_attr_tab_size_t). + * + * @note If vloc is @ref BLE_GATTS_VLOC_STACK : + * - p_value must point to non-volatile memory (flash) or be NULL. + * - If p_value is NULL, the device name will initially be empty. + * + * @note If vloc is @ref BLE_GATTS_VLOC_USER : + * - p_value cannot be NULL. + * - If the device name is writable, p_value must point to volatile memory (RAM). + * + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Invalid device name location (vloc). + * - Invalid device name security mode. + * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: + * - The device name length is invalid (must be between 0 and @ref BLE_GAP_DEVNAME_MAX_LEN). + * - The device name length is too long for the given Attribute Table. + * @retval ::NRF_ERROR_NOT_SUPPORTED Device name security mode is not supported. + */ +typedef struct +{ + ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ + uint8_t vloc:2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ + uint8_t *p_value; /**< Pointer to where the value (device name) is stored or will be stored. */ + uint16_t current_len; /**< Current length in bytes of the memory pointed to by p_value.*/ + uint16_t max_len; /**< Maximum length in bytes of the memory pointed to by p_value.*/ +} ble_gap_cfg_device_name_t; + + +/**@brief Peripheral Preferred Connection Parameters include configuration parameters, set with @ref sd_ble_cfg_set. */ +typedef struct +{ + uint8_t include_cfg; /**< Inclusion configuration of the Peripheral Preferred Connection Parameters characteristic. + See @ref BLE_GAP_CHAR_INCL_CONFIG. Default is @ref BLE_GAP_PPCP_INCL_CONFIG_DEFAULT. */ +} ble_gap_cfg_ppcp_incl_cfg_t; + + +/**@brief Central Address Resolution include configuration parameters, set with @ref sd_ble_cfg_set. */ +typedef struct +{ + uint8_t include_cfg; /**< Inclusion configuration of the Central Address Resolution characteristic. + See @ref BLE_GAP_CHAR_INCL_CONFIG. Default is @ref BLE_GAP_CAR_INCL_CONFIG_DEFAULT. */ +} ble_gap_cfg_car_incl_cfg_t; + + +/**@brief Configuration structure for GAP configurations. */ +typedef union +{ + ble_gap_cfg_role_count_t role_count_cfg; /**< Role count configuration, cfg_id is @ref BLE_GAP_CFG_ROLE_COUNT. */ + ble_gap_cfg_device_name_t device_name_cfg; /**< Device name configuration, cfg_id is @ref BLE_GAP_CFG_DEVICE_NAME. */ + ble_gap_cfg_ppcp_incl_cfg_t ppcp_include_cfg; /**< Peripheral Preferred Connection Parameters characteristic include + configuration, cfg_id is @ref BLE_GAP_CFG_PPCP_INCL_CONFIG. */ + ble_gap_cfg_car_incl_cfg_t car_include_cfg; /**< Central Address Resolution characteristic include configuration, + cfg_id is @ref BLE_GAP_CFG_CAR_INCL_CONFIG. */ +} ble_gap_cfg_t; + + +/**@brief Channel Map option. + * + * @details Used with @ref sd_ble_opt_get to get the current channel map + * or @ref sd_ble_opt_set to set a new channel map. When setting the + * channel map, it applies to all current and future connections. When getting the + * current channel map, it applies to a single connection and the connection handle + * must be supplied. + * + * @note Setting the channel map may take some time, depending on connection parameters. + * The time taken may be different for each connection and the get operation will + * return the previous channel map until the new one has taken effect. + * + * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. + * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. + * + * @retval ::NRF_SUCCESS Get or set successful. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Less then two bits in @ref ch_map are set. + * - Bits for primary advertising channels (37-39) are set. + * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. + * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by @ref sd_ble_opt_set in peripheral-only SoftDevices. + * + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle (only applicable for get) */ + uint8_t ch_map[5]; /**< Channel Map (37-bit). */ +} ble_gap_opt_ch_map_t; + + +/**@brief Local connection latency option. + * + * @details Local connection latency is a feature which enables the slave to improve + * current consumption by ignoring the slave latency set by the peer. The + * local connection latency can only be set to a multiple of the slave latency, + * and cannot be longer than half of the supervision timeout. + * + * @details Used with @ref sd_ble_opt_set to set the local connection latency. The + * @ref sd_ble_opt_get is not supported for this option, but the actual + * local connection latency (unless set to NULL) is set as a return parameter + * when setting the option. + * + * @note The latency set will be truncated down to the closest slave latency event + * multiple, or the nearest multiple before half of the supervision timeout. + * + * @note The local connection latency is disabled by default, and needs to be enabled for new + * connections and whenever the connection is updated. + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle */ + uint16_t requested_latency; /**< Requested local connection latency. */ + uint16_t * p_actual_latency; /**< Pointer to storage for the actual local connection latency (can be set to NULL to skip return value). */ +} ble_gap_opt_local_conn_latency_t; + +/**@brief Disable slave latency + * + * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection + * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the + * peripheral will ignore the slave_latency set by the central. + * + * @note Shall only be called on peripheral links. + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle */ + uint8_t disable : 1; /**< Set to 1 to disable slave latency. Set to 0 enable it again.*/ +} ble_gap_opt_slave_latency_disable_t; + +/**@brief Passkey Option. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} + * @endmscs + * + * @details Structure containing the passkey to be used during pairing. This can be used with @ref + * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication + * instead of generating a random one. + * + * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. + * + * @note @ref sd_ble_opt_get is not supported for this option. + * + */ +typedef struct +{ + uint8_t const * p_passkey; /**< Pointer to 6-digit ASCII string (digit 0..9 only, no NULL termination) passkey to be used during pairing. If this is NULL, the SoftDevice will generate a random passkey if required.*/ +} ble_gap_opt_passkey_t; + + +/**@brief Authenticated payload timeout option. + * + * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other + * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. + * + * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated + * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted + * link. + * + * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance + * to reset the timer. In addition the stack will try to prioritize running of LE ping over other + * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects + * on other activities, it is recommended to use high timeout values. + * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. + */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle */ + uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ +} ble_gap_opt_auth_payload_timeout_t; + +/**@brief Option structure for GAP options. */ +typedef union +{ + ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ + ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ + ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ + ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ + ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ +} ble_gap_opt_t; + +/**@brief Connection event triggering parameters. */ +typedef struct +{ + uint8_t ppi_ch_id; /**< PPI channel to use. This channel should be regarded as reserved until + connection event PPI task triggering is stopped. + The PPI channel ID can not be one of the PPI channels reserved by + the SoftDevice. See @ref NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK. */ + uint32_t task_endpoint; /**< Task Endpoint to trigger. */ + uint16_t conn_evt_counter_start; /**< The connection event on which the task triggering should start. */ + uint16_t period_in_events; /**< Trigger period. Valid range is [1, 32767]. + If the device is in slave role and slave latency is enabled, + this parameter should be set to a multiple of (slave latency + 1) + to ensure low power operation. */ +} ble_gap_conn_event_trigger_t; +/**@} */ + +/**@addtogroup BLE_GAP_FUNCTIONS Functions + * @{ */ + +/**@brief Set the local Bluetooth identity address. + * + * The local Bluetooth identity address is the address that identifies this device to other peers. + * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. + * + * @note The identity address cannot be changed while advertising. + * + * @note This address will be distributed to the peer during bonding. + * If the address changes, the address stored in the peer device will not be valid and the ability to + * reconnect using the old address will be lost. + * + * @note By default the SoftDevice will set an address of type @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC upon being + * enabled. The address is a random number populated during the IC manufacturing process and remains unchanged + * for the lifetime of each IC. + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @endmscs + * + * @param[in] p_addr Pointer to address structure. + * + * @retval ::NRF_SUCCESS Address successfully set. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising. + */ +SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); + + +/**@brief Get local Bluetooth identity address. + * + * @note This will always return the identity address irrespective of the privacy settings, + * i.e. the address type will always be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. + * + * @param[out] p_addr Pointer to address structure to be filled in. + * + * @retval ::NRF_SUCCESS Address successfully retrieved. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. + */ +SVCALL(SD_BLE_GAP_ADDR_GET, uint32_t, sd_ble_gap_addr_get(ble_gap_addr_t *p_addr)); + + +/**@brief Get the Bluetooth device address used by the advertiser. + * + * @note This function will return the local Bluetooth address used in advertising PDUs. When + * using privacy, the SoftDevice will generate a new private address every + * @ref ble_gap_privacy_params_t::private_addr_cycle_s configured using + * @ref sd_ble_gap_privacy_set. Hence depending on when the application calls this API, the + * address returned may not be the latest address that is used in the advertising PDUs. + * + * @param[in] adv_handle The advertising handle to get the address from. + * @param[out] p_addr Pointer to address structure to be filled in. + * + * @retval ::NRF_SUCCESS Address successfully retrieved. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. + * @retval ::NRF_ERROR_INVALID_STATE The advertising set is currently not advertising. + */ +SVCALL(SD_BLE_GAP_ADV_ADDR_GET, uint32_t, sd_ble_gap_adv_addr_get(uint8_t adv_handle, ble_gap_addr_t *p_addr)); + + +/**@brief Set the active whitelist in the SoftDevice. + * + * @note Only one whitelist can be used at a time and the whitelist is shared between the BLE roles. + * The whitelist cannot be set if a BLE role is using the whitelist. + * + * @note If an address is resolved using the information in the device identity list, then the whitelist + * filter policy applies to the peer identity address and not the resolvable address sent on air. + * + * @param[in] pp_wl_addrs Pointer to a whitelist of peer addresses, if NULL the whitelist will be cleared. + * @param[in] len Length of the whitelist, maximum @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT. + * + * @retval ::NRF_SUCCESS The whitelist is successfully set/cleared. + * @retval ::NRF_ERROR_INVALID_ADDR The whitelist (or one of its entries) provided is invalid. + * @retval ::BLE_ERROR_GAP_WHITELIST_IN_USE The whitelist is in use by a BLE role and cannot be set or cleared. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. + * @retval ::NRF_ERROR_DATA_SIZE The given whitelist size is invalid (zero or too large); this can only return when + * pp_wl_addrs is not NULL. + */ +SVCALL(SD_BLE_GAP_WHITELIST_SET, uint32_t, sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len)); + + +/**@brief Set device identity list. + * + * @note Only one device identity list can be used at a time and the list is shared between the BLE roles. + * The device identity list cannot be set if a BLE role is using the list. + * + * @param[in] pp_id_keys Pointer to an array of peer identity addresses and peer IRKs, if NULL the device identity list will be cleared. + * @param[in] pp_local_irks Pointer to an array of local IRKs. Each entry in the array maps to the entry in pp_id_keys at the same index. + * To fill in the list with the currently set device IRK for all peers, set to NULL. + * @param[in] len Length of the device identity list, maximum @ref BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT. + * + * @mscs + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS The device identity list successfully set/cleared. + * @retval ::NRF_ERROR_INVALID_ADDR The device identity list (or one of its entries) provided is invalid. + * This code may be returned if the local IRK list also has an invalid entry. + * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE The device identity list is in use and cannot be set or cleared. + * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE The device identity list contains multiple entries with the same identity address. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. + * @retval ::NRF_ERROR_DATA_SIZE The given device identity list size invalid (zero or too large); this can + * only return when pp_id_keys is not NULL. + */ +SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len)); + + +/**@brief Set privacy settings. + * + * @note Privacy settings cannot be changed while advertising. + * + * @param[in] p_privacy_params Privacy settings. + * + * @mscs + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Set successfully. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. + * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. + * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. + * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. + * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising. + */ +SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); + + +/**@brief Get privacy settings. + * + * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. + * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. + * + * @param[in,out] p_privacy_params Privacy settings. + * + * @retval ::NRF_SUCCESS Privacy settings read. + * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. + * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. + */ +SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); + + +/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. + * + * @note The format of the advertising data will be checked by this call to ensure interoperability. + * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and + * duplicating the local name in the advertising data and scan response data. + * + * @note In order to update advertising data while advertising, new advertising buffers must be provided. + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @endmscs + * + * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure + * a new advertising set. On success, a new handle is then returned through the pointer. + * Provide a pointer to an existing advertising handle to configure an existing advertising set. + * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. + * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, + * this parameter must be NULL. See @ref ble_gap_adv_params_t. + * + * @retval ::NRF_SUCCESS Advertising set successfully configured. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, + * see @ref sd_ble_gap_whitelist_set. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - It is invalid to provide non-NULL advertising set parameters while advertising. + * - It is invalid to provide the same data buffers while advertising. To update + * advertising data, provide new advertising buffers. + * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to + * configure a new advertising handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification + * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an + * existing advertising handle instead. + * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. + */ +SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); + + +/**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). + * + * @note Only one advertiser may be active at any time. + * + * @note If privacy is enabled, the advertiser's private address will be refreshed when this function is called. + * See @ref sd_ble_gap_privacy_set(). + * + * @events + * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} + * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} + * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} + * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} + * @endmscs + * + * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable + * advertising, this is ignored. + * + * @retval ::NRF_SUCCESS The BLE stack has started advertising. + * @retval ::NRF_ERROR_INVALID_STATE adv_handle is not configured or already advertising. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections for this connection configuration + * tag has been reached; connectable advertiser cannot be started. + * To increase the number of available connections, + * use @ref sd_ble_cfg_set with @ref BLE_GAP_CFG_ROLE_COUNT or @ref BLE_CONN_CFG_GAP. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * @retval ::NRF_ERROR_RESOURCES Either: + * - adv_handle is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * - Not enough BLE role slots available. + * Stop one or more currently active roles (Peripheral or Broadcaster) and try again + * - p_adv_params is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. + */ +SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); + + +/**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). + * + * @mscs + * @mmsc{@ref BLE_GAP_ADV_MSC} + * @endmscs + * + * @param[in] adv_handle The advertising handle that should stop advertising. + * + * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. + * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. + */ +SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); + + + +/**@brief Update connection parameters. + * + * @details In the peripheral role, this will send the corresponding L2CAP request and wait for + * the central to perform the procedure. Regardless of success or failure, the application + * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. + * + * @events + * @event{@ref BLE_GAP_EVT_CONN_PARAM_UPDATE, Result of the connection parameter update procedure.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CPU_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, + * the parameters in the PPCP characteristic of the GAP service will be used instead. + * + * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. + * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); + + +/**@brief Disconnect (GAP Link Termination). + * + * @details This call initiates the disconnection procedure, and its completion will be communicated to the application + * with a @ref BLE_GAP_EVT_DISCONNECTED event. + * + * @events + * @event{@ref BLE_GAP_EVT_DISCONNECTED, Generated when disconnection procedure is complete.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CONN_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] hci_status_code HCI status code, see @ref BLE_HCI_STATUS_CODES (accepted values are @ref BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION and @ref BLE_HCI_CONN_INTERVAL_UNACCEPTABLE). + * + * @retval ::NRF_SUCCESS The disconnection procedure has been started successfully. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established. + */ +SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)); + + +/**@brief Set the radio's transmit power. + * + * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for + * possible roles. + * @param[in] handle The handle parameter is interpreted depending on role: + * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. + * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, + * will use the specified transmit power, and include it in the advertising packet headers if + * @ref ble_gap_adv_properties_t::include_tx_power set. + * - For all other roles handle is ignored. + * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). + * + * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm. + * @note The initiator will have the same transmit power as the scanner. + * @note When a connection is created it will inherit the transmit power from the initiator or + * advertiser leading to the connection. + * + * @retval ::NRF_SUCCESS Successfully changed the transmit power. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); + + +/**@brief Set GAP Appearance value. + * + * @param[in] appearance Appearance (16-bit), see @ref BLE_APPEARANCES. + * + * @retval ::NRF_SUCCESS Appearance value set successfully. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + */ +SVCALL(SD_BLE_GAP_APPEARANCE_SET, uint32_t, sd_ble_gap_appearance_set(uint16_t appearance)); + + +/**@brief Get GAP Appearance value. + * + * @param[out] p_appearance Pointer to appearance (16-bit) to be filled in, see @ref BLE_APPEARANCES. + * + * @retval ::NRF_SUCCESS Appearance value retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + */ +SVCALL(SD_BLE_GAP_APPEARANCE_GET, uint32_t, sd_ble_gap_appearance_get(uint16_t *p_appearance)); + + +/**@brief Set GAP Peripheral Preferred Connection Parameters. + * + * @param[in] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure with the desired parameters. + * + * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters set successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED The characteristic is not included in the Attribute Table, + see @ref ble_gap_cfg_ppcp_incl_cfg_t. + */ +SVCALL(SD_BLE_GAP_PPCP_SET, uint32_t, sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params)); + + +/**@brief Get GAP Peripheral Preferred Connection Parameters. + * + * @param[out] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure where the parameters will be stored. + * + * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED The characteristic is not included in the Attribute Table, + see @ref ble_gap_cfg_ppcp_incl_cfg_t. + */ +SVCALL(SD_BLE_GAP_PPCP_GET, uint32_t, sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params)); + + +/**@brief Set GAP device name. + * + * @note If the device name is located in application flash memory (see @ref ble_gap_cfg_device_name_t), + * it cannot be changed. Then @ref NRF_ERROR_FORBIDDEN will be returned. + * + * @param[in] p_write_perm Write permissions for the Device Name characteristic, see @ref ble_gap_conn_sec_mode_t. + * @param[in] p_dev_name Pointer to a UTF-8 encoded, non NULL-terminated string. + * @param[in] len Length of the UTF-8, non NULL-terminated string pointed to by p_dev_name in octets (must be smaller or equal than @ref BLE_GAP_DEVNAME_MAX_LEN). + * + * @retval ::NRF_SUCCESS GAP device name and permissions set successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_FORBIDDEN Device name is not writable. + */ +SVCALL(SD_BLE_GAP_DEVICE_NAME_SET, uint32_t, sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len)); + + +/**@brief Get GAP device name. + * + * @note If the device name is longer than the size of the supplied buffer, + * p_len will return the complete device name length, + * and not the number of bytes actually returned in p_dev_name. + * The application may use this information to allocate a suitable buffer size. + * + * @param[out] p_dev_name Pointer to an empty buffer where the UTF-8 non NULL-terminated string will be placed. Set to NULL to obtain the complete device name length. + * @param[in,out] p_len Length of the buffer pointed by p_dev_name, complete device name length on output. + * + * @retval ::NRF_SUCCESS GAP device name retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + */ +SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len)); + + +/**@brief Initiate the GAP Authentication procedure. + * + * @details In the peripheral role, this function will send an SMP Security Request. + * + * @events + * @event{Depending on the security parameters set and the packet exchanges with the peer\, the following events may be generated:} + * @event{@ref BLE_GAP_EVT_SEC_PARAMS_REQUEST} + * @event{@ref BLE_GAP_EVT_SEC_INFO_REQUEST} + * @event{@ref BLE_GAP_EVT_PASSKEY_DISPLAY} + * @event{@ref BLE_GAP_EVT_KEY_PRESSED} + * @event{@ref BLE_GAP_EVT_AUTH_KEY_REQUEST} + * @event{@ref BLE_GAP_EVT_LESC_DHKEY_REQUEST} + * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE} + * @event{@ref BLE_GAP_EVT_AUTH_STATUS} + * @event{@ref BLE_GAP_EVT_TIMEOUT} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_SEC_REQ_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. + * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. + * + * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - No link has been established. + * - An encryption is already executing or queued. + * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); + + +/**@brief Reply with GAP security parameters. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * + * @events + * @event{This function is used during authentication procedures, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. + * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. + * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure + * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application + * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. + * Note that the SoftDevice expects the application to provide memory for storing the + * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key + * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the + * @ref BLE_GAP_EVT_AUTH_STATUS event. + * + * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Security parameters has not been requested. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. + */ +SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); + + +/**@brief Reply with an authentication key. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_AUTH_KEY_REQUEST or a @ref BLE_GAP_EVT_PASSKEY_DISPLAY, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * + * @events + * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] key_type See @ref BLE_GAP_AUTH_KEY_TYPES. + * @param[in] p_key If key type is @ref BLE_GAP_AUTH_KEY_TYPE_NONE, then NULL. + * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY, then a 6-byte ASCII string (digit 0..9 only, no NULL termination) + * or NULL when confirming LE Secure Connections Numeric Comparison. + * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_OOB, then a 16-byte OOB key value in little-endian format. + * + * @retval ::NRF_SUCCESS Authentication key successfully set. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Authentication key has not been requested. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); + + +/**@brief Reply with an LE Secure connections DHKey. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * + * @events + * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_dhkey LE Secure Connections DHKey. + * + * @retval ::NRF_SUCCESS DHKey successfully set. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - The peer is not authenticated. + * - The application has not pulled a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); + + +/**@brief Notify the peer of a local keypress. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] kp_not See @ref BLE_GAP_KP_NOT_TYPES. + * + * @retval ::NRF_SUCCESS Keypress notification successfully queued for transmission. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Authentication key not requested. + * - Passkey has not been entered. + * - Keypresses have not been enabled by both peers. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy. Retry at later time. + */ +SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); + + +/**@brief Generate a set of OOB data to send to a peer out of band. + * + * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, + * the one used during connection setup). The application may manually overwrite it with an updated value. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. + * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. + * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. + * + * @retval ::NRF_SUCCESS OOB data successfully generated. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own)); + +/**@brief Provide the OOB data sent/received out of band. + * + * @note An authentication procedure with OOB selected as an algorithm must be in progress when calling this function. + * @note A @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event with the oobd_req set to 1 must have been received prior to calling this function. + * + * @events + * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_oobd_own The OOB data sent out of band to a peer or NULL if the peer has not received OOB data. + * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. + * @param[in] p_oobd_peer The OOB data received out of band from a peer or NULL if none received. + * Must correspond to @ref ble_gap_sec_params_t::oob flag + * in @ref sd_ble_gap_sec_params_reply in the peripheral role. + * + * @retval ::NRF_SUCCESS OOB data accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Authentication key not requested + * - Not expecting LESC OOB data + * - Have not actually exchanged passkeys. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); + + +/**@brief Reply with GAP security information. + * + * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_INFO_REQUEST, calling it at other times will result in @ref NRF_ERROR_INVALID_STATE. + * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. + * @note Data signing is not yet supported, and p_sign_info must therefore be NULL. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_ENC_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. May be NULL to signal none is available. + * @param[in] p_id_info Pointer to a @ref ble_gap_irk_t identity information structure. May be NULL to signal none is available. + * @param[in] p_sign_info Pointer to a @ref ble_gap_sign_info_t signing information structure. May be NULL to signal none is available. + * + * @retval ::NRF_SUCCESS Successfully accepted security information. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - No link has been established. + * - No @ref BLE_GAP_EVT_SEC_INFO_REQUEST pending. + * - Encryption information provided by the app without being requested. See @ref ble_gap_evt_sec_info_request_t::enc_info. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_SEC_INFO_REPLY, uint32_t, sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info)); + + +/**@brief Get the current connection security. + * + * @param[in] conn_handle Connection handle. + * @param[out] p_conn_sec Pointer to a @ref ble_gap_conn_sec_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Current connection security successfully retrieved. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec)); + + +/**@brief Start reporting the received signal strength to the application. + * + * A new event is reported whenever the RSSI value changes, until @ref sd_ble_gap_rssi_stop is called. + * + * @events + * @event{@ref BLE_GAP_EVT_RSSI_CHANGED, New RSSI data available. How often the event is generated is + * dependent on the settings of the threshold_dbm + * and skip_count input parameters.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} + * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] threshold_dbm Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID. + * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. + * + * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); + + +/**@brief Stop reporting the received signal strength. + * + * @note An RSSI change detected before the call but not yet received by the application + * may be reported after @ref sd_ble_gap_rssi_stop has been called. + * + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} + * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * + * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + */ +SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); + + +/**@brief Get the received signal strength for the last connection event. + * + * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND + * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. + * @note ERRATA-153 and ERRATA-225 require the rssi sample to be compensated based on a temperature measurement. + * @mscs + * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. + * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. + * + * @retval ::NRF_SUCCESS Successfully read the RSSI. + * @retval ::NRF_ERROR_NOT_FOUND No sample is available. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. + */ +SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); + + +/**@brief Initiate or respond to a PHY Update Procedure + * + * @details This function is used to initiate or respond to a PHY Update Procedure. It will always + * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. + * If this function is used to initiate a PHY Update procedure and the only option + * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the + * currently active PHYs in the respective directions, the SoftDevice will generate a + * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the + * procedure in the Link Layer. + * + * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, + * then the stack will select PHYs based on the peer's PHY preferences and the local link + * configuration. The PHY Update procedure will for this case result in a PHY combination + * that respects the time constraints configured with @ref sd_ble_cfg_set and the current + * link layer data length. + * + * If the peer does not support the PHY Update Procedure, then the resulting + * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to + * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. + * + * If the PHY Update procedure was rejected by the peer due to a procedure collision, the status + * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or + * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. + * If the peer responds to the PHY Update procedure with invalid parameters, the status + * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. + * If the PHY Update procedure was rejected by the peer for a different reason, the status will + * contain the reason as specified by the peer. + * + * @events + * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} + * @endmscs + * + * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. + * @param[in] p_gap_phys Pointer to PHY structure. + * + * @retval ::NRF_SUCCESS Successfully requested a PHY Update. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. + * @retval ::NRF_ERROR_INVALID_STATE No link has been established. + * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. + * + */ +SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); + + +/**@brief Initiate or respond to a Data Length Update Procedure. + * + * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of + * p_dl_params, the SoftDevice will choose the highest value supported in current + * configuration and connection parameters. + * + * @param[in] conn_handle Connection handle. + * @param[in] p_dl_params Pointer to local parameters to be used in Data Length Update + * Procedure. Set any member to @ref BLE_GAP_DATA_LENGTH_AUTO to let + * the SoftDevice automatically decide the value for that member. + * Set to NULL to use automatic values for all members. + * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not + * have enough resources or does not support the requested Data Length + * Update parameters. Ignored if NULL. + * + * @mscs + * @mmsc{@ref BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Successfully set Data Length Extension initiation/response parameters. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. + * @retval ::NRF_ERROR_INVALID_STATE No link has been established. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect + * p_dl_limitation to see which parameter is not supported. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. + * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. + * Inspect p_dl_limitation to see where the limitation is. + * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the + * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. + */ +SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); + + + +/**@brief Obtain the next connection event counter value. + * + * @details The connection event counter is initialized to zero on the first connection event. The value is incremented + * by one for each connection event. For more information see Bluetooth Core Specification v5.0, Vol 6, Part B, + * Section 4.5.1. + * + * @note The connection event counter obtained through this API will be outdated if this API is called + * at the same time as the connection event counter is incremented. + * + * @note This API will always return the last connection event counter + 1. + * The actual connection event may be multiple connection events later if: + * - Slave latency is enabled and there is no data to transmit or receive. + * - Another role is scheduled with a higher priority at the same time as the next connection event. + * + * @param[in] conn_handle Connection handle. + * @param[out] p_counter Pointer to the variable where the next connection event counter will be written. + * + * @retval ::NRF_SUCCESS The connection event counter was successfully retrieved. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + */ +SVCALL(SD_BLE_GAP_NEXT_CONN_EVT_COUNTER_GET, uint32_t, sd_ble_gap_next_conn_evt_counter_get(uint16_t conn_handle, uint16_t * p_counter)); + + +/**@brief Start triggering a given task on connection event start. + * + * @details When enabled, this feature will trigger a PPI task at the start of connection events. + * The application can configure the SoftDevice to trigger every N connection events starting from + * a given connection event counter. See also @ref ble_gap_conn_event_trigger_t. + * + * @param[in] conn_handle Connection handle. + * @param[in] p_params Connection event trigger parameters. + * + * @retval ::NRF_SUCCESS Success. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. See @ref ble_gap_conn_event_trigger_t. + * @retval ::NRF_ERROR_INVALID_STATE Either: + * - Trying to start connection event triggering when it is already ongoing. + * - @ref ble_gap_conn_event_trigger_t::conn_evt_counter_start is in the past. + * Use @ref sd_ble_gap_next_conn_evt_counter_get to find a new value + to be used as ble_gap_conn_event_trigger_t::conn_evt_counter_start. + */ +SVCALL(SD_BLE_GAP_CONN_EVT_TRIGGER_START, uint32_t, sd_ble_gap_conn_evt_trigger_start(uint16_t conn_handle, ble_gap_conn_event_trigger_t const * p_params)); + + +/**@brief Stop triggering the task configured using @ref sd_ble_gap_conn_evt_trigger_start. + * + * @param[in] conn_handle Connection handle. + * + * @retval ::NRF_SUCCESS Success. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. + * @retval ::NRF_ERROR_INVALID_STATE Trying to stop connection event triggering when it is not enabled. + */ +SVCALL(SD_BLE_GAP_CONN_EVT_TRIGGER_STOP, uint32_t, sd_ble_gap_conn_evt_trigger_stop(uint16_t conn_handle)); + + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_GAP_H__ + +/** + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatt.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatt.h new file mode 100644 index 0000000..c392884 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatt.h @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATT Generic Attribute Profile (GATT) Common + @{ + @brief Common definitions and prototypes for the GATT interfaces. + */ + +#ifndef BLE_GATT_H__ +#define BLE_GATT_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATT_DEFINES Defines + * @{ */ + +/** @brief Default ATT MTU, in bytes. */ +#define BLE_GATT_ATT_MTU_DEFAULT 23 + +/**@brief Invalid Attribute Handle. */ +#define BLE_GATT_HANDLE_INVALID 0x0000 + +/**@brief First Attribute Handle. */ +#define BLE_GATT_HANDLE_START 0x0001 + +/**@brief Last Attribute Handle. */ +#define BLE_GATT_HANDLE_END 0xFFFF + +/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources + * @{ */ +#define BLE_GATT_TIMEOUT_SRC_PROTOCOL 0x00 /**< ATT Protocol timeout. */ +/** @} */ + +/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations + * @{ */ +#define BLE_GATT_OP_INVALID 0x00 /**< Invalid Operation. */ +#define BLE_GATT_OP_WRITE_REQ 0x01 /**< Write Request. */ +#define BLE_GATT_OP_WRITE_CMD 0x02 /**< Write Command. */ +#define BLE_GATT_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ +#define BLE_GATT_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ +#define BLE_GATT_OP_EXEC_WRITE_REQ 0x05 /**< Execute Write Request. */ +/** @} */ + +/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags + * @{ */ +#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00 /**< Cancel prepared write. */ +#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE 0x01 /**< Execute prepared write. */ +/** @} */ + +/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations + * @{ */ +#define BLE_GATT_HVX_INVALID 0x00 /**< Invalid Operation. */ +#define BLE_GATT_HVX_NOTIFICATION 0x01 /**< Handle Value Notification. */ +#define BLE_GATT_HVX_INDICATION 0x02 /**< Handle Value Indication. */ +/** @} */ + +/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes + * @{ */ +#define BLE_GATT_STATUS_SUCCESS 0x0000 /**< Success. */ +#define BLE_GATT_STATUS_UNKNOWN 0x0001 /**< Unknown or not applicable status. */ +#define BLE_GATT_STATUS_ATTERR_INVALID 0x0100 /**< ATT Error: Invalid Error Code. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE 0x0101 /**< ATT Error: Invalid Attribute Handle. */ +#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED 0x0102 /**< ATT Error: Read not permitted. */ +#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED 0x0103 /**< ATT Error: Write not permitted. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_PDU 0x0104 /**< ATT Error: Used in ATT as Invalid PDU. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION 0x0105 /**< ATT Error: Authenticated link required. */ +#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED 0x0106 /**< ATT Error: Used in ATT as Request Not Supported. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET 0x0107 /**< ATT Error: Offset specified was past the end of the attribute. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION 0x0108 /**< ATT Error: Used in ATT as Insufficient Authorization. */ +#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL 0x0109 /**< ATT Error: Used in ATT as Prepare Queue Full. */ +#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND 0x010A /**< ATT Error: Used in ATT as Attribute not found. */ +#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG 0x010B /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE 0x010C /**< ATT Error: Encryption key size used is insufficient. */ +#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH 0x010D /**< ATT Error: Invalid value size. */ +#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR 0x010E /**< ATT Error: Very unlikely error. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION 0x010F /**< ATT Error: Encrypted link required. */ +#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE 0x0110 /**< ATT Error: Attribute type is not a supported grouping attribute. */ +#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES 0x0111 /**< ATT Error: Insufficient resources. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN 0x0112 /**< ATT Error: Reserved for Future Use range #1 begin. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END 0x017F /**< ATT Error: Reserved for Future Use range #1 end. */ +#define BLE_GATT_STATUS_ATTERR_APP_BEGIN 0x0180 /**< ATT Error: Application range begin. */ +#define BLE_GATT_STATUS_ATTERR_APP_END 0x019F /**< ATT Error: Application range end. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN 0x01A0 /**< ATT Error: Reserved for Future Use range #2 begin. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END 0x01DF /**< ATT Error: Reserved for Future Use range #2 end. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN 0x01E0 /**< ATT Error: Reserved for Future Use range #3 begin. */ +#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END 0x01FC /**< ATT Error: Reserved for Future Use range #3 end. */ +#define BLE_GATT_STATUS_ATTERR_CPS_WRITE_REQ_REJECTED 0x01FC /**< ATT Common Profile and Service Error: Write request rejected. */ +#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR 0x01FD /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */ +#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG 0x01FE /**< ATT Common Profile and Service Error: Procedure Already in Progress. */ +#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE 0x01FF /**< ATT Common Profile and Service Error: Out Of Range. */ +/** @} */ + + +/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats + * @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml + * @{ */ +#define BLE_GATT_CPF_FORMAT_RFU 0x00 /**< Reserved For Future Use. */ +#define BLE_GATT_CPF_FORMAT_BOOLEAN 0x01 /**< Boolean. */ +#define BLE_GATT_CPF_FORMAT_2BIT 0x02 /**< Unsigned 2-bit integer. */ +#define BLE_GATT_CPF_FORMAT_NIBBLE 0x03 /**< Unsigned 4-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT8 0x04 /**< Unsigned 8-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT12 0x05 /**< Unsigned 12-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT16 0x06 /**< Unsigned 16-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT24 0x07 /**< Unsigned 24-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT32 0x08 /**< Unsigned 32-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT48 0x09 /**< Unsigned 48-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT64 0x0A /**< Unsigned 64-bit integer. */ +#define BLE_GATT_CPF_FORMAT_UINT128 0x0B /**< Unsigned 128-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT8 0x0C /**< Signed 2-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT12 0x0D /**< Signed 12-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT16 0x0E /**< Signed 16-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT24 0x0F /**< Signed 24-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT32 0x10 /**< Signed 32-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT48 0x11 /**< Signed 48-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT64 0x12 /**< Signed 64-bit integer. */ +#define BLE_GATT_CPF_FORMAT_SINT128 0x13 /**< Signed 128-bit integer. */ +#define BLE_GATT_CPF_FORMAT_FLOAT32 0x14 /**< IEEE-754 32-bit floating point. */ +#define BLE_GATT_CPF_FORMAT_FLOAT64 0x15 /**< IEEE-754 64-bit floating point. */ +#define BLE_GATT_CPF_FORMAT_SFLOAT 0x16 /**< IEEE-11073 16-bit SFLOAT. */ +#define BLE_GATT_CPF_FORMAT_FLOAT 0x17 /**< IEEE-11073 32-bit FLOAT. */ +#define BLE_GATT_CPF_FORMAT_DUINT16 0x18 /**< IEEE-20601 format. */ +#define BLE_GATT_CPF_FORMAT_UTF8S 0x19 /**< UTF-8 string. */ +#define BLE_GATT_CPF_FORMAT_UTF16S 0x1A /**< UTF-16 string. */ +#define BLE_GATT_CPF_FORMAT_STRUCT 0x1B /**< Opaque Structure. */ +/** @} */ + +/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces + * @{ + */ +#define BLE_GATT_CPF_NAMESPACE_BTSIG 0x01 /**< Bluetooth SIG defined Namespace. */ +#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000 /**< Namespace Description Unknown. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATT_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. + */ +typedef struct +{ + uint16_t att_mtu; /**< Maximum size of ATT packet the SoftDevice can send or receive. + The default and minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + @mscs + @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} + @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} + @endmscs + */ +} ble_gatt_conn_cfg_t; + +/**@brief GATT Characteristic Properties. */ +typedef struct +{ + /* Standard properties */ + uint8_t broadcast :1; /**< Broadcasting of the value permitted. */ + uint8_t read :1; /**< Reading the value permitted. */ + uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */ + uint8_t write :1; /**< Writing the value with Write Request permitted. */ + uint8_t notify :1; /**< Notification of the value permitted. */ + uint8_t indicate :1; /**< Indications of the value permitted. */ + uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */ +} ble_gatt_char_props_t; + +/**@brief GATT Characteristic Extended Properties. */ +typedef struct +{ + /* Extended properties */ + uint8_t reliable_wr :1; /**< Writing the value with Queued Write operations permitted. */ + uint8_t wr_aux :1; /**< Writing the Characteristic User Description descriptor permitted. */ +} ble_gatt_char_ext_props_t; + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_GATT_H__ + +/** @} */ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gattc.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gattc.h new file mode 100644 index 0000000..7fb3920 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gattc.h @@ -0,0 +1,715 @@ +/* + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client + @{ + @brief Definitions and prototypes for the GATT Client interface. + */ + +#ifndef BLE_GATTC_H__ +#define BLE_GATTC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations + * @{ */ + +/**@brief GATTC API SVC numbers. */ +enum BLE_GATTC_SVCS +{ + SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ + SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ + SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ + SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ + SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ + SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ + SD_BLE_GATTC_READ, /**< Generic read. */ + SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ + SD_BLE_GATTC_WRITE, /**< Generic write. */ + SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ + SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ +}; + +/** + * @brief GATT Client Event IDs. + */ +enum BLE_GATTC_EVTS +{ + BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ + BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ + BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ + BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ + BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ + BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ + BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ + BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ + BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ + BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ + BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ + BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ + BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ +}; + +/** @} */ + +/** @addtogroup BLE_GATTC_DEFINES Defines + * @{ */ + +/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC + * @{ */ +#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ +/** @} */ + +/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats + * @{ */ +#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ +#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ +/** @} */ + +/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults + * @{ */ +#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATTC_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. + */ +typedef struct +{ + uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. + The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ +} ble_gattc_conn_cfg_t; + +/**@brief Operation Handle Range. */ +typedef struct +{ + uint16_t start_handle; /**< Start Handle. */ + uint16_t end_handle; /**< End Handle. */ +} ble_gattc_handle_range_t; + + +/**@brief GATT service. */ +typedef struct +{ + ble_uuid_t uuid; /**< Service UUID. */ + ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ +} ble_gattc_service_t; + + +/**@brief GATT include. */ +typedef struct +{ + uint16_t handle; /**< Include Handle. */ + ble_gattc_service_t included_srvc; /**< Handle of the included service. */ +} ble_gattc_include_t; + + +/**@brief GATT characteristic. */ +typedef struct +{ + ble_uuid_t uuid; /**< Characteristic UUID. */ + ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ + uint8_t char_ext_props : 1; /**< Extended properties present. */ + uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ + uint16_t handle_value; /**< Handle of the Characteristic Value. */ +} ble_gattc_char_t; + + +/**@brief GATT descriptor. */ +typedef struct +{ + uint16_t handle; /**< Descriptor Handle. */ + ble_uuid_t uuid; /**< Descriptor UUID. */ +} ble_gattc_desc_t; + + +/**@brief Write Parameters. */ +typedef struct +{ + uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ + uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ + uint16_t handle; /**< Handle to the attribute to be written. */ + uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ + uint16_t len; /**< Length of data in bytes. */ + uint8_t const *p_value; /**< Pointer to the value data. */ +} ble_gattc_write_params_t; + +/**@brief Attribute Information for 16-bit Attribute UUID. */ +typedef struct +{ + uint16_t handle; /**< Attribute handle. */ + ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ +} ble_gattc_attr_info16_t; + +/**@brief Attribute Information for 128-bit Attribute UUID. */ +typedef struct +{ + uint16_t handle; /**< Attribute handle. */ + ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ +} ble_gattc_attr_info128_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Service count. */ + ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_prim_srvc_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Include count. */ + ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_rel_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Characteristic count. */ + ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Descriptor count. */ + ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_desc_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Attribute count. */ + uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ + union { + ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ + ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ + } info; /**< Attribute information union. */ +} ble_gattc_evt_attr_info_disc_rsp_t; + +/**@brief GATT read by UUID handle value pair. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ +} ble_gattc_handle_value_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ +typedef struct +{ + uint16_t count; /**< Handle-Value Pair Count. */ + uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ + uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_val_by_uuid_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint16_t offset; /**< Offset of the attribute data. */ + uint16_t len; /**< Attribute data length. */ + uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ +typedef struct +{ + uint16_t len; /**< Concatenated Attribute values length. */ + uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_vals_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ + uint16_t offset; /**< Data offset. */ + uint16_t len; /**< Data length. */ + uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_write_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ +typedef struct +{ + uint16_t handle; /**< Handle to which the HVx operation applies. */ + uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ + uint16_t len; /**< Attribute data length. */ + uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_hvx_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ +typedef struct +{ + uint16_t server_rx_mtu; /**< Server RX MTU size. */ +} ble_gattc_evt_exchange_mtu_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ +} ble_gattc_evt_timeout_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ +typedef struct +{ + uint8_t count; /**< Number of write without response transmissions completed. */ +} ble_gattc_evt_write_cmd_tx_complete_t; + +/**@brief GATTC event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which event occurred. */ + uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ + uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ + union + { + ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ + ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ + ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ + ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ + ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ + ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ + ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ + ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ + ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ + ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ + ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ + ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ + ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ + } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ +} ble_gattc_evt_t; +/** @} */ + +/** @addtogroup BLE_GATTC_FUNCTIONS Functions + * @{ */ + +/**@brief Initiate or continue a GATT Primary Service Discovery procedure. + * + * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. + * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. + * + * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with + * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. + * + * @events + * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] start_handle Handle to start searching from. + * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); + + +/**@brief Initiate or continue a GATT Relationship Discovery procedure. + * + * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, + * this must be called again with an updated handle range to continue the search. + * + * @events + * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Characteristic Discovery procedure. + * + * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with + * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. + * + * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @events + * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. + * + * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_uuid Pointer to a Characteristic value UUID to read. + * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. + * + * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor + * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the + * complete value. + * + * @events + * @event{@ref BLE_GATTC_EVT_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] handle The handle of the attribute to be read. + * @param[in] offset Offset into the attribute value to be read. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); + + +/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. + * + * @details This function initiates a GATT Read Multiple Characteristic Values procedure. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. + * @param[in] handle_count The number of handles in p_handles. + * + * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); + + +/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. + * + * @details This function can perform all write procedures described in GATT. + * + * @note Only one write with response procedure can be ongoing per connection at a time. + * If the application tries to write with response while another write with response procedure is ongoing, + * the function call will return @ref NRF_ERROR_BUSY. + * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. + * + * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size + * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. + * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. + * + * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: + * - Store initial queue element count in a variable. + * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. + * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. + * + * @events + * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} + * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_write_params A pointer to a write parameters structure. + * + * @retval ::NRF_SUCCESS Successfully started the Write procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. + * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. + * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); + + +/**@brief Send a Handle Value Confirmation to the GATT Server. + * + * @mscs + * @mmsc{@ref BLE_GATTC_HVI_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] handle The handle of the attribute in the indication. + * + * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); + +/**@brief Discovers information about a range of attributes on a GATT server. + * + * @events + * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} + * @endevents + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range The range of handles to request information about. + * + * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); + +/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. + * + * @details The SoftDevice sets ATT_MTU to the minimum of: + * - The Client RX MTU value, and + * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. + * + * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. + * + * @events + * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] client_rx_mtu Client RX MTU size. + * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration + used for this connection. + * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply + * if an ATT_MTU exchange has already been performed in the other direction. + * + * @retval ::NRF_SUCCESS Successfully sent request to the server. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); + +/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. + * + * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. + * @note If the buffer contains different event, behavior is undefined. + * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with + * the next Handle-Value pair in each iteration. If the function returns other than + * @ref NRF_SUCCESS, it will not be changed. + * - To start iteration, initialize the structure to zero. + * - To continue, pass the value from previous iteration. + * + * \code + * ble_gattc_handle_value_t iter; + * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); + * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) + * { + * app_handle = iter.handle; + * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); + * } + * \endcode + * + * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. + * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. + */ +__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); + +/** @} */ + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) +{ + uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; + uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; + uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; + + if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) + { + p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; + p_iter->p_value = p_next + sizeof(uint16_t); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_NOT_FOUND; + } +} + +#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ + +#ifdef __cplusplus +} +#endif +#endif /* BLE_GATTC_H__ */ + +/** + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatts.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatts.h new file mode 100644 index 0000000..394d8d1 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_gatts.h @@ -0,0 +1,845 @@ +/* + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server + @{ + @brief Definitions and prototypes for the GATTS interface. + */ + +#ifndef BLE_GATTS_H__ +#define BLE_GATTS_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" +#include "ble_gap.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations + * @{ */ + +/** + * @brief GATTS API SVC numbers. + */ +enum BLE_GATTS_SVCS +{ + SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ + SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ + SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ + SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ + SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ + SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ + SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ + SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ + SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ + SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ + SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ + SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ + SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ + SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ +}; + +/** + * @brief GATT Server Event IDs. + */ +enum BLE_GATTS_EVTS +{ + BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ + BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ + BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ + BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ + BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ + BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ + BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ + BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ +}; + +/**@brief GATTS Configuration IDs. + * + * IDs that uniquely identify a GATTS configuration. + */ +enum BLE_GATTS_CFGS +{ + BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ + BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ +}; + +/** @} */ + +/** @addtogroup BLE_GATTS_DEFINES Defines + * @{ */ + +/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS + * @{ */ +#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ +#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ +/** @} */ + +/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths + * @{ */ +#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ +#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ +/** @} */ + +/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types + * @{ */ +#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ +#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ +#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ +/** @} */ + + +/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types + * @{ */ +#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ +#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ +#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ +#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ +#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ +#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ +#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ +#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ +/** @} */ + + +/** @defgroup BLE_GATTS_OPS GATT Server Operations + * @{ */ +#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ +#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ +#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ +#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ +#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ +#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ +#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ +/** @} */ + +/** @defgroup BLE_GATTS_VLOCS GATT Value Locations + * @{ */ +#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ +#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ +#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack + will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ +/** @} */ + +/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types + * @{ */ +#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ +#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ +#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ +/** @} */ + +/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags + * @{ */ +#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ +#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ +/** @} */ + +/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values + * @{ + */ +#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ +/** @} */ + +/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size + * @{ + */ +#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ +#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ +/** @} */ + +/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults + * @{ + */ +#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATTS_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. + */ +typedef struct +{ + uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. + The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ +} ble_gatts_conn_cfg_t; + +/**@brief Attribute metadata. */ +typedef struct +{ + ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ + ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ + uint8_t vlen :1; /**< Variable length attribute. */ + uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ + uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ + uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ +} ble_gatts_attr_md_t; + + +/**@brief GATT Attribute. */ +typedef struct +{ + ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ + ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ + uint16_t init_len; /**< Initial attribute value length in bytes. */ + uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ + uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ + uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer + that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. + The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ +} ble_gatts_attr_t; + +/**@brief GATT Attribute Value. */ +typedef struct +{ + uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ + uint16_t offset; /**< Attribute value offset. */ + uint8_t *p_value; /**< Pointer to where value is stored or will be stored. + If value is stored in user memory, only the attribute length is updated when p_value == NULL. + Set to NULL when reading to obtain the complete length of the attribute value */ +} ble_gatts_value_t; + + +/**@brief GATT Characteristic Presentation Format. */ +typedef struct +{ + uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ + int8_t exponent; /**< Exponent for integer data types. */ + uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ + uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ + uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ +} ble_gatts_char_pf_t; + + +/**@brief GATT Characteristic metadata. */ +typedef struct +{ + ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ + ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ + uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ + uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ + uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ + ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ + ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ + ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ + ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ +} ble_gatts_char_md_t; + + +/**@brief GATT Characteristic Definition Handles. */ +typedef struct +{ + uint16_t value_handle; /**< Handle to the characteristic value. */ + uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ + uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ + uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ +} ble_gatts_char_handles_t; + + +/**@brief GATT HVx parameters. */ +typedef struct +{ + uint16_t handle; /**< Characteristic Value Handle. */ + uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ + uint16_t offset; /**< Offset within the attribute value. */ + uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ + uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ +} ble_gatts_hvx_params_t; + +/**@brief GATT Authorization parameters. */ +typedef struct +{ + uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ + uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. + Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, + as the data to be written needs to be stored and later provided by the application. */ + uint16_t offset; /**< Offset of the attribute value being updated. */ + uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ + uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ +} ble_gatts_authorize_params_t; + +/**@brief GATT Read or Write Authorize Reply parameters. */ +typedef struct +{ + uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ + union { + ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ + ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ + } params; /**< Reply Parameters. */ +} ble_gatts_rw_authorize_reply_params_t; + +/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ +typedef struct +{ + uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ +} ble_gatts_cfg_service_changed_t; + +/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: + * - The specified Attribute Table size is too small. + * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. + * - The specified Attribute Table size is not a multiple of 4. + */ +typedef struct +{ + uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ +} ble_gatts_cfg_attr_tab_size_t; + +/**@brief Config structure for GATTS configurations. */ +typedef union +{ + ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ + ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ +} ble_gatts_cfg_t; + + +/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + ble_uuid_t uuid; /**< Attribute UUID. */ + uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ + uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ + uint16_t offset; /**< Offset for the write operation. */ + uint16_t len; /**< Length of the received data. */ + uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gatts_evt_write_t; + +/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + ble_uuid_t uuid; /**< Attribute UUID. */ + uint16_t offset; /**< Offset for the read operation. */ +} ble_gatts_evt_read_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ +typedef struct +{ + uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ + union { + ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ + ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ + } request; /**< Request Parameters. */ +} ble_gatts_evt_rw_authorize_request_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ +typedef struct +{ + uint8_t hint; /**< Hint (currently unused). */ +} ble_gatts_evt_sys_attr_missing_t; + + +/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ +} ble_gatts_evt_hvc_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ +typedef struct +{ + uint16_t client_rx_mtu; /**< Client RX MTU size. */ +} ble_gatts_evt_exchange_mtu_request_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ +} ble_gatts_evt_timeout_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ +typedef struct +{ + uint8_t count; /**< Number of notification transmissions completed. */ +} ble_gatts_evt_hvn_tx_complete_t; + +/**@brief GATTS event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ + union + { + ble_gatts_evt_write_t write; /**< Write Event Parameters. */ + ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ + ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ + ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ + ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ + ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ + ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_gatts_evt_t; + +/** @} */ + +/** @addtogroup BLE_GATTS_FUNCTIONS Functions + * @{ */ + +/**@brief Add a service declaration to the Attribute Table. + * + * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to + * add a secondary service declaration that is not referenced by another service later in the Attribute Table. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. + * @param[in] p_uuid Pointer to service UUID. + * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a service declaration. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); + + +/**@brief Add an include declaration to the Attribute Table. + * + * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). + * + * @note The included service must already be present in the Attribute Table prior to this call. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] inc_srvc_handle Handle of the included service. + * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added an include declaration. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. + * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + */ +SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); + + +/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. + * + * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). + * + * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, + * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. + * + * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] p_char_md Characteristic metadata. + * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. + * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a characteristic. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + */ +SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); + + +/**@brief Add a descriptor to the Attribute Table. + * + * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] p_attr Pointer to the attribute structure. + * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a descriptor. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + */ +SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); + +/**@brief Set the value of a given attribute. + * + * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. + * @param[in] handle Attribute handle. + * @param[in,out] p_value Attribute value information. + * + * @retval ::NRF_SUCCESS Successfully set the value of the attribute. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. + */ +SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); + +/**@brief Get the value of a given attribute. + * + * @note If the attribute value is longer than the size of the supplied buffer, + * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), + * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. + * The application may use this information to allocate a suitable buffer size. + * + * @note When retrieving system attribute values with this function, the connection handle + * may refer to an already disconnected connection. Refer to the documentation of + * @ref sd_ble_gatts_sys_attr_get for further information. + * + * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. + * @param[in] handle Attribute handle. + * @param[in,out] p_value Attribute value information. + * + * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + */ +SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); + +/**@brief Notify or Indicate an attribute value. + * + * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation + * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that + * the application can atomically perform a value update and a server initiated transaction with a single API call. + * + * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. + * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, + * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. + * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). + * + * @note Only one indication procedure can be ongoing per connection at a time. + * If the application tries to indicate an attribute value while another indication procedure is ongoing, + * the function call will return @ref NRF_ERROR_BUSY. + * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. + * + * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size + * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. + * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. + * + * @note The application can keep track of the available queue element count for notifications by following the procedure below: + * - Store initial queue element count in a variable. + * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. + * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. + * + * @events + * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} + * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} + * @mmsc{@ref BLE_GATTS_HVN_MSC} + * @mmsc{@ref BLE_GATTS_HVI_MSC} + * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data + * contains a non-NULL pointer the attribute value will be updated with the contents + * pointed by it before sending the notification or indication. If the attribute value + * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to + * contain the number of actual bytes written, else it will be set to 0. + * + * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: + * - Invalid Connection State + * - Notifications and/or indications not enabled in the CCCD + * - An ATT_MTU exchange is ongoing + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. + * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. + * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); + +/**@brief Indicate the Service Changed attribute value. + * + * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute + * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will + * be issued. + * + * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. + * + * @events + * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTS_SC_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] start_handle Start of affected attribute handle range. + * @param[in] end_handle End of affected attribute handle range. + * + * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref + * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. + * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: + * - Invalid Connection State + * - Notifications and/or indications not enabled in the CCCD + * - An ATT_MTU exchange is ongoing + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. + * @retval ::NRF_ERROR_BUSY Procedure already in progress. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); + +/**@brief Respond to a Read/Write authorization request. + * + * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. + * + * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond + * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update + * is set to 0. + * + * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. + * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, + * handle supplied does not match requested handle, + * or invalid data to be written provided by the application. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); + + +/**@brief Update persistent system attribute information. + * + * @details Supply information about persistent system attributes to the stack, + * previously obtained using @ref sd_ble_gatts_sys_attr_get. + * This call is only allowed for active connections, and is usually + * made immediately after a connection is established with an known bonded device, + * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. + * + * p_sysattrs may point directly to the application's stored copy of the system attributes + * obtained using @ref sd_ble_gatts_sys_attr_get. + * If the pointer is NULL, the system attribute info is initialized, assuming that + * the application does not have any previously saved system attribute data for this device. + * + * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. + * + * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. + * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or + * reset the SoftDevice to return to a known state. + * + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. + * + * @mscs + * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. + * @param[in] len Size of data pointed by p_sys_attr_data, in octets. + * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS + * + * @retval ::NRF_SUCCESS Successfully set the system attribute information. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); + + +/**@brief Retrieve persistent system attribute information from the stack. + * + * @details This call is used to retrieve information about values to be stored persistently by the application + * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, + * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. + * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for + * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. + * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes + * may be written to at any time by the peer during a connection's lifetime. + * + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. + * + * @mscs + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle of the recently terminated connection. + * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described + * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. + * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. + * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS + * + * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. + * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. + * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. + */ +SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); + + +/**@brief Retrieve the first valid user attribute handle. + * + * @param[out] p_handle Pointer to an integer where the handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully retrieved the handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + */ +SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); + +/**@brief Retrieve the attribute UUID and/or metadata. + * + * @param[in] handle Attribute handle + * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. + * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. + * + * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. + * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. + */ +SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); + +/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. + * + * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. + * + * @details The SoftDevice sets ATT_MTU to the minimum of: + * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and + * - The Server RX MTU value. + * + * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. + * + * @mscs + * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] server_rx_mtu Server RX MTU size. + * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration + * used for this connection. + * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request + * if an ATT_MTU exchange has already been performed in the other direction. + * + * @retval ::NRF_SUCCESS Successfully sent response to the client. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_GATTS_H__ + +/** + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_hci.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_hci.h new file mode 100644 index 0000000..f0dde9a --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_hci.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ +*/ + + +#ifndef BLE_HCI_H__ +#define BLE_HCI_H__ +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes + * @{ */ + +#define BLE_HCI_STATUS_CODE_SUCCESS 0x00 /**< Success. */ +#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01 /**< Unknown BLE Command. */ +#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 /**< Unknown Connection Identifier. */ +/*0x03 Hardware Failure +0x04 Page Timeout +*/ +#define BLE_HCI_AUTHENTICATION_FAILURE 0x05 /**< Authentication Failure. */ +#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06 /**< Pin or Key missing. */ +#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07 /**< Memory Capacity Exceeded. */ +#define BLE_HCI_CONNECTION_TIMEOUT 0x08 /**< Connection Timeout. */ +/*0x09 Connection Limit Exceeded +0x0A Synchronous Connection Limit To A Device Exceeded +0x0B ACL Connection Already Exists*/ +#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C /**< Command Disallowed. */ +/*0x0D Connection Rejected due to Limited Resources +0x0E Connection Rejected Due To Security Reasons +0x0F Connection Rejected due to Unacceptable BD_ADDR +0x10 Connection Accept Timeout Exceeded +0x11 Unsupported Feature or Parameter Value*/ +#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12 /**< Invalid BLE Command Parameters. */ +#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13 /**< Remote User Terminated Connection. */ +#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14 /**< Remote Device Terminated Connection due to low resources.*/ +#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15 /**< Remote Device Terminated Connection due to power off. */ +#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16 /**< Local Host Terminated Connection. */ +/* +0x17 Repeated Attempts +0x18 Pairing Not Allowed +0x19 Unknown LMP PDU +*/ +#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A /**< Unsupported Remote Feature. */ +/* +0x1B SCO Offset Rejected +0x1C SCO Interval Rejected +0x1D SCO Air Mode Rejected*/ +#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E /**< Invalid LMP Parameters. */ +#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F /**< Unspecified Error. */ +/*0x20 Unsupported LMP Parameter Value +0x21 Role Change Not Allowed +*/ +#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ +#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ +#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ +/*0x25 Encryption Mode Not Acceptable +0x26 Link Key Can Not be Changed +0x27 Requested QoS Not Supported +*/ +#define BLE_HCI_INSTANT_PASSED 0x28 /**< Instant Passed. */ +#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29 /**< Pairing with Unit Key Unsupported. */ +#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A /**< Different Transaction Collision. */ +/* +0x2B Reserved +0x2C QoS Unacceptable Parameter +0x2D QoS Rejected +0x2E Channel Classification Not Supported +0x2F Insufficient Security +*/ +#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ +/* +0x31 Reserved +0x32 Role Switch Pending +0x33 Reserved +0x34 Reserved Slot Violation +0x35 Role Switch Failed +0x36 Extended Inquiry Response Too Large +0x37 Secure Simple Pairing Not Supported By Host. +0x38 Host Busy - Pairing +0x39 Connection Rejected due to No Suitable Channel Found*/ +#define BLE_HCI_CONTROLLER_BUSY 0x3A /**< Controller Busy. */ +#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B /**< Connection Interval Unacceptable. */ +#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C /**< Directed Advertisement Timeout. */ +#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D /**< Connection Terminated due to MIC Failure. */ +#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E /**< Connection Failed to be Established. */ + +/** @} */ + + +#ifdef __cplusplus +} +#endif +#endif // BLE_HCI_H__ + +/** @} */ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_l2cap.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_l2cap.h new file mode 100644 index 0000000..7587350 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_l2cap.h @@ -0,0 +1,507 @@ +/* + * Copyright (c) 2011 - 2020, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) + @{ + @brief Definitions and prototypes for the L2CAP interface. + */ + +#ifndef BLE_L2CAP_H__ +#define BLE_L2CAP_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology + * @{ + * @details + * + * L2CAP SDU + * - A data unit that the application can send/receive to/from a peer. + * + * L2CAP PDU + * - A data unit that is exchanged between local and remote L2CAP entities. + * It consists of L2CAP protocol control information and payload fields. + * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. + * + * L2CAP MTU + * - The maximum length of an L2CAP SDU. + * + * L2CAP MPS + * - The maximum length of an L2CAP PDU payload field. + * + * Credits + * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. + * @} */ + +/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations + * @{ */ + +/**@brief L2CAP API SVC numbers. */ +enum BLE_L2CAP_SVCS +{ + SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ + SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ + SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ +}; + +/**@brief L2CAP Event IDs. */ +enum BLE_L2CAP_EVTS +{ + BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. + \n Reply with @ref sd_ble_l2cap_ch_setup. + \n See @ref ble_l2cap_evt_ch_setup_request_t. */ + BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. + \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ + BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. + \n See @ref ble_l2cap_evt_ch_setup_t. */ + BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. + \n No additional event structure applies. */ + BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. + \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ + BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. + \n See @ref ble_l2cap_evt_ch_credit_t. */ + BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. + \n See @ref ble_l2cap_evt_ch_rx_t. */ + BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. + \n See @ref ble_l2cap_evt_ch_tx_t. */ +}; + +/** @} */ + +/**@addtogroup BLE_L2CAP_DEFINES Defines + * @{ */ + +/**@brief Maximum number of L2CAP channels per connection. */ +#define BLE_L2CAP_CH_COUNT_MAX (64) + +/**@brief Minimum L2CAP MTU, in bytes. */ +#define BLE_L2CAP_MTU_MIN (23) + +/**@brief Minimum L2CAP MPS, in bytes. */ +#define BLE_L2CAP_MPS_MIN (23) + +/**@brief Invalid CID. */ +#define BLE_L2CAP_CID_INVALID (0x0000) + +/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ +#define BLE_L2CAP_CREDITS_DEFAULT (1) + +/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources + * @{ */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ + /** @} */ + + /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes + * @{ */ +#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ +#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ +#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ +#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ +#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ +#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ +#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ +#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ +/** @} */ + +/** @} */ + +/**@addtogroup BLE_L2CAP_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @note These parameters are set per connection, so all L2CAP channels created on this connection + * will have the same parameters. + * + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. + * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. + */ +typedef struct +{ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to receive on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to transmit on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per + L2CAP channel. The minimum value is one. */ + uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission + per L2CAP channel. The minimum value is one. */ + uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection + with this configuration. The default value is zero, the maximum + value is @ref BLE_L2CAP_CH_COUNT_MAX. + @note if this parameter is set to zero, all other parameters in + @ref ble_l2cap_conn_cfg_t are ignored. */ +} ble_l2cap_conn_cfg_t; + +/**@brief L2CAP channel RX parameters. */ +typedef struct +{ + uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to + receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be + able to receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. + - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ + ble_data_t sdu_buf; /**< SDU data buffer for reception. + - If @ref ble_data_t::p_data is non-NULL, initial credits are + issued to the peer. + - If @ref ble_data_t::p_data is NULL, no initial credits are + issued to the peer. */ +} ble_l2cap_ch_rx_params_t; + +/**@brief L2CAP channel setup parameters. */ +typedef struct +{ + ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting + setup of an L2CAP channel, ignored otherwise. */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. + Used when replying to a setup request of an L2CAP + channel, ignored otherwise. */ +} ble_l2cap_ch_setup_params_t; + +/**@brief L2CAP channel TX parameters. */ +typedef struct +{ + uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to + transmit on this L2CAP channel. */ + uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is + able to receive on this L2CAP channel. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able + to transmit on this L2CAP channel. This is effective tx_mps, + selected by the SoftDevice as + MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ + uint16_t credits; /**< Initial credits given by the peer. */ +} ble_l2cap_ch_tx_params_t; + +/**@brief L2CAP Channel Setup Request event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ +} ble_l2cap_evt_ch_setup_request_t; + +/**@brief L2CAP Channel Setup Refused event. */ +typedef struct +{ + uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ +} ble_l2cap_evt_ch_setup_refused_t; + +/**@brief L2CAP Channel Setup Completed event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ +} ble_l2cap_evt_ch_setup_t; + +/**@brief L2CAP Channel SDU Data Buffer Released event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice + returns SDU data buffers supplied by the application, which have + not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or + @ref BLE_L2CAP_EVT_CH_TX event. */ +} ble_l2cap_evt_ch_sdu_buf_released_t; + +/**@brief L2CAP Channel Credit received event. */ +typedef struct +{ + uint16_t credits; /**< Additional credits given by the peer. */ +} ble_l2cap_evt_ch_credit_t; + +/**@brief L2CAP Channel received SDU event. */ +typedef struct +{ + uint16_t sdu_len; /**< Total SDU length, in bytes. */ + ble_data_t sdu_buf; /**< SDU data buffer. + @note If there is not enough space in the buffer + (sdu_buf.len < sdu_len) then the rest of the SDU will be + silently discarded by the SoftDevice. */ +} ble_l2cap_evt_ch_rx_t; + +/**@brief L2CAP Channel transmitted SDU event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< SDU data buffer. */ +} ble_l2cap_evt_ch_tx_t; + +/**@brief L2CAP event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which the event occured. */ + uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or + @ref BLE_L2CAP_CID_INVALID if not present. */ + union + { + ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ + ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ + ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ + ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ + ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ + ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ + ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_l2cap_evt_t; + +/** @} */ + +/**@addtogroup BLE_L2CAP_FUNCTIONS Functions + * @{ */ + +/**@brief Set up an L2CAP channel. + * + * @details This function is used to: + * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. + * - Reply to a setup request of an L2CAP channel (if called in response to a + * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection + * Response packet to a peer. + * + * @note A call to this function will require the application to keep the SDU data buffer alive + * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or + * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} + * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: + * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP + * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST + * event when replying to a setup request of an L2CAP channel. + * - As output: local_cid for this channel. + * @param[in] p_params L2CAP channel parameters. + * + * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, + * see @ref ble_l2cap_conn_cfg_t::ch_count. + */ +SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); + +/**@brief Release an L2CAP channel. + * + * @details This sends a Disconnection Request packet to a peer. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * + * @retval ::NRF_SUCCESS Successfully queued request for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); + +/**@brief Receive an SDU on an L2CAP channel. + * + * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers + * for reception per L2CAP channel. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Buffer accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a + * @ref BLE_L2CAP_EVT_CH_RX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Transmit an SDU on an L2CAP channel. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for + * transmission per L2CAP channel. + * + * @note The application can keep track of the available credits for transmission by following + * the procedure below: + * - Store initial credits given by the peer in a variable. + * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Decrement the variable, which stores the currently available credits, by + * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns + * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Increment the variable, which stores the currently available credits, by additional + * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than + * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in + * @ref BLE_L2CAP_EVT_CH_SETUP event. + * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a + * @ref BLE_L2CAP_EVT_CH_TX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Advanced SDU reception flow control. + * + * @details Adjust the way the SoftDevice issues credits to the peer. + * This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set + * the value that will be used for newly created channels. + * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every + * time it starts using a new reception buffer. + * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will + * use if this function is not called. + * - If set to zero, the SoftDevice will stop issuing credits for new reception + * buffers the application provides or has provided. SDU reception that is + * currently ongoing will be allowed to complete. + * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be + * written by the SoftDevice with the number of credits that is or will be + * available to the peer. If the value written by the SoftDevice is 0 when + * credits parameter was set to 0, the peer will not be able to send more + * data until more credits are provided by calling this function again with + * credits > 0. This parameter is ignored when local_cid is set to + * @ref BLE_L2CAP_CID_INVALID. + * + * @note Application should take care when setting number of credits higher than default value. In + * this case the application must make sure that the SoftDevice always has reception buffers + * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have + * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic + * on the connection handle may be stalled until the SoftDevice again has an available + * reception buffer. This applies even if the application has used this call to set the + * credits back to default, or zero. + * + * @retval ::NRF_SUCCESS Flow control parameters accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_L2CAP_H__ + +/** + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_ranges.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_ranges.h new file mode 100644 index 0000000..0935bca --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_ranges.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @defgroup ble_ranges Module specific SVC, event and option number subranges + @{ + + @brief Definition of SVC, event and option number subranges for each API module. + + @note + SVCs, event and option numbers are split into subranges for each API module. + Each module receives its entire allocated range of SVC calls, whether implemented or not, + but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. + + Note that the symbols BLE__SVC_LAST is the end of the allocated SVC range, + rather than the last SVC function call actually defined and implemented. + + Specific SVC, event and option values are defined in each module's ble_.h file, + which defines names of each individual SVC code based on the range start value. +*/ + +#ifndef BLE_RANGES_H__ +#define BLE_RANGES_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ +#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ + +#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ +#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ + +#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ +#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ + +#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ +#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ + +#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ +#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ + + +#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ + +#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ +#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ + +#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ +#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ + +#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ +#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ + +#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ +#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ + +#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ +#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ + + +#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ + +#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ +#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ + +#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ +#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ + +#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ +#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ + +#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ +#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ + +#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ +#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ + +#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ +#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ + + +#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ + +#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ +#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ + +#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ +#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ + +#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ +#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ + +#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ +#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ + +#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ +#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ + +#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ +#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ + +#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ +#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ + + + + + +#ifdef __cplusplus +} +#endif +#endif /* BLE_RANGES_H__ */ + +/** + @} + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_types.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_types.h new file mode 100644 index 0000000..88c9318 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/ble_types.h @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @defgroup ble_types Common types and macro definitions + @{ + + @brief Common types and macro definitions for the BLE SoftDevice. + */ + +#ifndef BLE_TYPES_H__ +#define BLE_TYPES_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_TYPES_DEFINES Defines + * @{ */ + +/** @defgroup BLE_CONN_HANDLES BLE Connection Handles + * @{ */ +#define BLE_CONN_HANDLE_INVALID 0xFFFF /**< Invalid Connection Handle. */ +#define BLE_CONN_HANDLE_ALL 0xFFFE /**< Applies to all Connection Handles. */ +/** @} */ + + +/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs + * @{ */ +/* Generic UUIDs, applicable to all services */ +#define BLE_UUID_UNKNOWN 0x0000 /**< Reserved UUID. */ +#define BLE_UUID_SERVICE_PRIMARY 0x2800 /**< Primary Service. */ +#define BLE_UUID_SERVICE_SECONDARY 0x2801 /**< Secondary Service. */ +#define BLE_UUID_SERVICE_INCLUDE 0x2802 /**< Include. */ +#define BLE_UUID_CHARACTERISTIC 0x2803 /**< Characteristic. */ +#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP 0x2900 /**< Characteristic Extended Properties Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC 0x2901 /**< Characteristic User Description Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG 0x2902 /**< Client Characteristic Configuration Descriptor. */ +#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG 0x2903 /**< Server Characteristic Configuration Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT 0x2904 /**< Characteristic Presentation Format Descriptor. */ +#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT 0x2905 /**< Characteristic Aggregate Format Descriptor. */ +/* GATT specific UUIDs */ +#define BLE_UUID_GATT 0x1801 /**< Generic Attribute Profile. */ +#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED 0x2A05 /**< Service Changed Characteristic. */ +/* GAP specific UUIDs */ +#define BLE_UUID_GAP 0x1800 /**< Generic Access Profile. */ +#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME 0x2A00 /**< Device Name Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE 0x2A01 /**< Appearance Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ +/** @} */ + + +/** @defgroup BLE_UUID_TYPES Types of UUID + * @{ */ +#define BLE_UUID_TYPE_UNKNOWN 0x00 /**< Invalid UUID type. */ +#define BLE_UUID_TYPE_BLE 0x01 /**< Bluetooth SIG UUID (16-bit). */ +#define BLE_UUID_TYPE_VENDOR_BEGIN 0x02 /**< Vendor UUID types start at this index (128-bit). */ +/** @} */ + + +/** @defgroup BLE_APPEARANCES Bluetooth Appearance values + * @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml + * @{ */ +#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */ +#define BLE_APPEARANCE_GENERIC_PHONE 64 /**< Generic Phone. */ +#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /**< Generic Computer. */ +#define BLE_APPEARANCE_GENERIC_WATCH 192 /**< Generic Watch. */ +#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /**< Watch: Sports Watch. */ +#define BLE_APPEARANCE_GENERIC_CLOCK 256 /**< Generic Clock. */ +#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /**< Generic Display. */ +#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /**< Generic Remote Control. */ +#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /**< Generic Eye-glasses. */ +#define BLE_APPEARANCE_GENERIC_TAG 512 /**< Generic Tag. */ +#define BLE_APPEARANCE_GENERIC_KEYRING 576 /**< Generic Keyring. */ +#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /**< Generic Media Player. */ +#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /**< Generic Barcode Scanner. */ +#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /**< Generic Thermometer. */ +#define BLE_APPEARANCE_THERMOMETER_EAR 769 /**< Thermometer: Ear. */ +#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /**< Generic Heart rate Sensor. */ +#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /**< Heart Rate Sensor: Heart Rate Belt. */ +#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /**< Generic Blood Pressure. */ +#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /**< Blood Pressure: Arm. */ +#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /**< Blood Pressure: Wrist. */ +#define BLE_APPEARANCE_GENERIC_HID 960 /**< Human Interface Device (HID). */ +#define BLE_APPEARANCE_HID_KEYBOARD 961 /**< Keyboard (HID Subtype). */ +#define BLE_APPEARANCE_HID_MOUSE 962 /**< Mouse (HID Subtype). */ +#define BLE_APPEARANCE_HID_JOYSTICK 963 /**< Joystick (HID Subtype). */ +#define BLE_APPEARANCE_HID_GAMEPAD 964 /**< Gamepad (HID Subtype). */ +#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /**< Digitizer Tablet (HID Subtype). */ +#define BLE_APPEARANCE_HID_CARD_READER 966 /**< Card Reader (HID Subtype). */ +#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /**< Digital Pen (HID Subtype). */ +#define BLE_APPEARANCE_HID_BARCODE 968 /**< Barcode Scanner (HID Subtype). */ +#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /**< Generic Glucose Meter. */ +#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /**< Generic Running Walking Sensor. */ +#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /**< Running Walking Sensor: In-Shoe. */ +#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /**< Running Walking Sensor: On-Shoe. */ +#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /**< Running Walking Sensor: On-Hip. */ +#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /**< Generic Cycling. */ +#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /**< Cycling: Cycling Computer. */ +#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /**< Cycling: Speed Sensor. */ +#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /**< Cycling: Cadence Sensor. */ +#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /**< Cycling: Power Sensor. */ +#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /**< Cycling: Speed and Cadence Sensor. */ +#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /**< Generic Pulse Oximeter. */ +#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /**< Fingertip (Pulse Oximeter subtype). */ +#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /**< Wrist Worn(Pulse Oximeter subtype). */ +#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /**< Generic Weight Scale. */ +#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /**< Generic Outdoor Sports Activity. */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /**< Location Display Device (Outdoor Sports Activity subtype). */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /**< Location Pod (Outdoor Sports Activity subtype). */ +#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */ +/** @} */ + +/** @brief Set .type and .uuid fields of ble_uuid_struct to specified UUID value. */ +#define BLE_UUID_BLE_ASSIGN(instance, value) do {\ + instance.type = BLE_UUID_TYPE_BLE; \ + instance.uuid = value;} while(0) + +/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */ +#define BLE_UUID_COPY_PTR(dst, src) do {\ + (dst)->type = (src)->type; \ + (dst)->uuid = (src)->uuid;} while(0) + +/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */ +#define BLE_UUID_COPY_INST(dst, src) do {\ + (dst).type = (src).type; \ + (dst).uuid = (src).uuid;} while(0) + +/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ +#define BLE_UUID_EQ(p_uuid1, p_uuid2) \ + (((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid)) + +/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ +#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \ + (((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid)) + +/** @} */ + +/** @addtogroup BLE_TYPES_STRUCTURES Structures + * @{ */ + +/** @brief 128 bit UUID values. */ +typedef struct +{ + uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */ +} ble_uuid128_t; + +/** @brief Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */ +typedef struct +{ + uint16_t uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */ + uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ +} ble_uuid_t; + +/**@brief Data structure. */ +typedef struct +{ + uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ + uint16_t len; /**< Length of the data buffer, in bytes. */ +} ble_data_t; + +/** @} */ +#ifdef __cplusplus +} +#endif + +#endif /* BLE_TYPES_H__ */ + +/** + @} + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf52/nrf_mbr.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf52/nrf_mbr.h new file mode 100644 index 0000000..389cc37 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf52/nrf_mbr.h @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_mbr_api Master Boot Record API + @{ + + @brief APIs for updating SoftDevice and BootLoader + +*/ + +#ifndef NRF_MBR_H__ +#define NRF_MBR_H__ + +#include "nrf_svc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_MBR_DEFINES Defines + * @{ */ + +/**@brief MBR SVC Base number. */ +#define MBR_SVC_BASE (0x18) + +/**@brief Page size in words. */ +#define MBR_PAGE_SIZE_IN_WORDS (1024) + +/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. +This is the offset where the first byte of the SoftDevice hex file is written. */ +#define MBR_SIZE (0x1000) + +/** @brief Location (in the flash memory) of the bootloader address. */ +#define MBR_BOOTLOADER_ADDR (0xFF8) + +/** @brief Location (in UICR) of the bootloader address. */ +#define MBR_UICR_BOOTLOADER_ADDR (&(NRF_UICR->NRFFW[0])) + +/** @brief Location (in the flash memory) of the address of the MBR parameter page. */ +#define MBR_PARAM_PAGE_ADDR (0xFFC) + +/** @brief Location (in UICR) of the address of the MBR parameter page. */ +#define MBR_UICR_PARAM_PAGE_ADDR (&(NRF_UICR->NRFFW[1])) + + +/** @} */ + +/** @addtogroup NRF_MBR_ENUMS Enumerations + * @{ */ + +/**@brief nRF Master Boot Record API SVC numbers. */ +enum NRF_MBR_SVCS +{ + SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ +}; + +/**@brief Possible values for ::sd_mbr_command_t.command */ +enum NRF_MBR_COMMANDS +{ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ + SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_RESERVED, + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ +}; + +/** @} */ + +/** @addtogroup NRF_MBR_TYPES Types + * @{ */ + +/**@brief This command copies part of a new SoftDevice + * + * The destination area is erased before copying. + * If dst is in the middle of a flash page, that whole flash page will be erased. + * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. + * + * The user of this function is responsible for setting the BPROT registers. + * + * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. + * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. + */ +typedef struct +{ + uint32_t *src; /**< Pointer to the source of data to be copied.*/ + uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ + uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ +} sd_mbr_command_copy_sd_t; + + +/**@brief This command works like memcmp, but takes the length in words. + * + * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. + * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. + */ +typedef struct +{ + uint32_t *ptr1; /**< Pointer to block of memory. */ + uint32_t *ptr2; /**< Pointer to block of memory. */ + uint32_t len; /**< Number of 32 bit words to compare.*/ +} sd_mbr_command_compare_t; + + +/**@brief This command copies a new BootLoader. + * + * The MBR assumes that either @ref MBR_BOOTLOADER_ADDR or @ref MBR_UICR_BOOTLOADER_ADDR is set to + * the address where the bootloader will be copied. If both addresses are set, the MBR will prioritize + * @ref MBR_BOOTLOADER_ADDR. + * + * The bootloader destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * + * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, + * see @ref sd_mbr_command. + * + * This command will use the flash protect peripheral (BPROT or ACL) to protect the flash that is + * not intended to be written. + * + * On success, this function will not return. It will start the new bootloader from reset-vector as normal. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_FORBIDDEN if the bootloader address is not set. + * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. + * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. + */ +typedef struct +{ + uint32_t *bl_src; /**< Pointer to the source of the bootloader to be be copied.*/ + uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ +} sd_mbr_command_copy_bl_t; + +/**@brief Change the address the MBR starts after a reset + * + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. + * + * To restore default forwarding, this function should be called with @ref address set to 0. If a + * bootloader is present, interrupts will be forwarded to the bootloader. If not, interrupts will + * be forwarded to the SoftDevice. + * + * The location of a bootloader can be specified in @ref MBR_BOOTLOADER_ADDR or + * @ref MBR_UICR_BOOTLOADER_ADDR. If both addresses are set, the MBR will prioritize + * @ref MBR_BOOTLOADER_ADDR. + * + * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set, + * see @ref sd_mbr_command. + * + * On success, this function will not return. It will reset the device. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. + * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command. + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_vector_table_base_set_t; + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * + * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not + * change where the MBR starts after reset. + * + * @retval ::NRF_SUCCESS + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_irq_forward_address_set_t; + +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ +typedef struct +{ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ + union + { + sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ + sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ + sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ + sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ + sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ + } params; /**< Command parameters. */ +} sd_mbr_command_t; + +/** @} */ + +/** @addtogroup NRF_MBR_FUNCTIONS Functions + * @{ */ + +/**@brief Issue Master Boot Record commands + * + * Commands used when updating a SoftDevice and bootloader. + * + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page. The location of the flash page should be provided by the application in either + * @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR. If both addresses are set, the MBR + * will prioritize @ref MBR_PARAM_PAGE_ADDR. This page will be cleared by the MBR and is used to + * store the command before reset. When an address is specified, the page it refers to must not be + * used by the application. If no address is provided by the application, i.e. both + * @ref MBR_PARAM_PAGE_ADDR and @ref MBR_UICR_PARAM_PAGE_ADDR is 0xFFFFFFFF, MBR commands which use + * flash will be unavailable and return @ref NRF_ERROR_NO_MEM. + * + * @param[in] param Pointer to a struct describing the command. + * + * @note For a complete set of return values, see ::sd_mbr_command_copy_sd_t, + * ::sd_mbr_command_copy_bl_t, ::sd_mbr_command_compare_t, + * ::sd_mbr_command_vector_table_base_set_t, ::sd_mbr_command_irq_forward_address_set_t + * + * @retval ::NRF_ERROR_NO_MEM No MBR parameter page provided + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. +*/ +SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_MBR_H__ + +/** + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error.h new file mode 100644 index 0000000..6badee9 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /** + @defgroup nrf_error SoftDevice Global Error Codes + @{ + + @brief Global Error definitions +*/ + +/* Header guard */ +#ifndef NRF_ERROR_H__ +#define NRF_ERROR_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions + * @{ */ +#define NRF_ERROR_BASE_NUM (0x0) ///< Global error base +#define NRF_ERROR_SDM_BASE_NUM (0x1000) ///< SDM error base +#define NRF_ERROR_SOC_BASE_NUM (0x2000) ///< SoC error base +#define NRF_ERROR_STK_BASE_NUM (0x3000) ///< STK error base +/** @} */ + +#define NRF_SUCCESS (NRF_ERROR_BASE_NUM + 0) ///< Successful command +#define NRF_ERROR_SVC_HANDLER_MISSING (NRF_ERROR_BASE_NUM + 1) ///< SVC handler is missing +#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED (NRF_ERROR_BASE_NUM + 2) ///< SoftDevice has not been enabled +#define NRF_ERROR_INTERNAL (NRF_ERROR_BASE_NUM + 3) ///< Internal Error +#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation +#define NRF_ERROR_NOT_FOUND (NRF_ERROR_BASE_NUM + 5) ///< Not found +#define NRF_ERROR_NOT_SUPPORTED (NRF_ERROR_BASE_NUM + 6) ///< Not supported +#define NRF_ERROR_INVALID_PARAM (NRF_ERROR_BASE_NUM + 7) ///< Invalid Parameter +#define NRF_ERROR_INVALID_STATE (NRF_ERROR_BASE_NUM + 8) ///< Invalid state, operation disallowed in this state +#define NRF_ERROR_INVALID_LENGTH (NRF_ERROR_BASE_NUM + 9) ///< Invalid Length +#define NRF_ERROR_INVALID_FLAGS (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags +#define NRF_ERROR_INVALID_DATA (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data +#define NRF_ERROR_DATA_SIZE (NRF_ERROR_BASE_NUM + 12) ///< Invalid Data size +#define NRF_ERROR_TIMEOUT (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out +#define NRF_ERROR_NULL (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer +#define NRF_ERROR_FORBIDDEN (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation +#define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address +#define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy +#define NRF_ERROR_CONN_COUNT (NRF_ERROR_BASE_NUM + 18) ///< Maximum connection count exceeded. +#define NRF_ERROR_RESOURCES (NRF_ERROR_BASE_NUM + 19) ///< Not enough resources for operation + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_H__ + +/** + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_sdm.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_sdm.h new file mode 100644 index 0000000..530959b --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_sdm.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /** + @addtogroup nrf_sdm_api + @{ + @defgroup nrf_sdm_error SoftDevice Manager Error Codes + @{ + + @brief Error definitions for the SDM API +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SDM_H__ +#define NRF_ERROR_SDM_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. +#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). +#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SDM_H__ + +/** + @} + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_soc.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_soc.h new file mode 100644 index 0000000..1e784b8 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_error_soc.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup nrf_soc_api + @{ + @defgroup nrf_soc_error SoC Library Error Codes + @{ + + @brief Error definitions for the SoC library + +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SOC_H__ +#define NRF_ERROR_SOC_H__ + +#include "nrf_error.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* Mutex Errors */ +#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken + +/* NVIC errors */ +#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available +#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed +#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return + +/* Power errors */ +#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown +#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown +#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return + +/* Rand errors */ +#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values + +/* PPI errors */ +#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel +#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SOC_H__ +/** + @} + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_nvic.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_nvic.h new file mode 100644 index 0000000..1f79cc3 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_nvic.h @@ -0,0 +1,491 @@ +/* + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @defgroup nrf_nvic_api SoftDevice NVIC API + * @{ + * + * @note In order to use this module, the following code has to be added to a .c file: + * \code + * nrf_nvic_state_t nrf_nvic_state = {0}; + * \endcode + * + * @note Definitions and declarations starting with __ (double underscore) in this header file are + * not intended for direct use by the application. + * + * @brief APIs for the accessing NVIC when using a SoftDevice. + * + */ + +#ifndef NRF_NVIC_H__ +#define NRF_NVIC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup NRF_NVIC_DEFINES Defines + * @{ */ + +/**@defgroup NRF_NVIC_ISER_DEFINES SoftDevice NVIC internal definitions + * @{ */ + +#define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ + +#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ + +/**@brief Interrupt priority levels used by the SoftDevice. */ +#define __NRF_NVIC_SD_IRQ_PRIOS ((uint8_t)( \ + (1U << 0) /**< Priority level high .*/ \ + | (1U << 1) /**< Priority level medium. */ \ + | (1U << 4) /**< Priority level low. */ \ + )) + +/**@brief Interrupt priority levels available to the application. */ +#define __NRF_NVIC_APP_IRQ_PRIOS ((uint8_t)~__NRF_NVIC_SD_IRQ_PRIOS) + +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ +#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ + (1U << POWER_CLOCK_IRQn) \ + | (1U << RADIO_IRQn) \ + | (1U << RTC0_IRQn) \ + | (1U << TIMER0_IRQn) \ + | (1U << RNG_IRQn) \ + | (1U << ECB_IRQn) \ + | (1U << CCM_AAR_IRQn) \ + | (1U << TEMP_IRQn) \ + | (1U << __NRF_NVIC_NVMC_IRQn) \ + | (1U << (uint32_t)SWI5_IRQn) \ + )) + +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ +#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) + +/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ +#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) + +/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ +#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) + +/**@} */ + +/**@} */ + +/**@addtogroup NRF_NVIC_VARIABLES Variables + * @{ */ + +/**@brief Type representing the state struct for the SoftDevice NVIC module. */ +typedef struct +{ + uint32_t volatile __irq_masks[__NRF_NVIC_ISER_COUNT]; /**< IRQs enabled by the application in the NVIC. */ + uint32_t volatile __cr_flag; /**< Non-zero if already in a critical region */ +} nrf_nvic_state_t; + +/**@brief Variable keeping the state for the SoftDevice NVIC module. This must be declared in an + * application source file. */ +extern nrf_nvic_state_t nrf_nvic_state; + +/**@} */ + +/**@addtogroup NRF_NVIC_INTERNAL_FUNCTIONS SoftDevice NVIC internal functions + * @{ */ + +/**@brief Disables IRQ interrupts globally, including the SoftDevice's interrupts. + * + * @retval The value of PRIMASK prior to disabling the interrupts. + */ +__STATIC_INLINE int __sd_nvic_irq_disable(void); + +/**@brief Enables IRQ interrupts globally, including the SoftDevice's interrupts. + */ +__STATIC_INLINE void __sd_nvic_irq_enable(void); + +/**@brief Checks if IRQn is available to application + * @param[in] IRQn IRQ to check + * + * @retval 1 (true) if the IRQ to check is available to the application + */ +__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn); + +/**@brief Checks if priority is available to application + * @param[in] priority priority to check + * + * @retval 1 (true) if the priority to check is available to the application + */ +__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority); + +/**@} */ + +/**@addtogroup NRF_NVIC_FUNCTIONS SoftDevice NVIC public functions + * @{ */ + +/**@brief Enable External Interrupt. + * @note Corresponds to NVIC_EnableIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt was enabled. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn); + +/**@brief Disable External Interrupt. + * @note Corresponds to NVIC_DisableIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt was disabled. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn); + +/**@brief Get Pending Interrupt. + * @note Corresponds to NVIC_GetPendingIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_GetPendingIRQ documentation in CMSIS. + * @param[out] p_pending_irq Return value from NVIC_GetPendingIRQ. + * + * @retval ::NRF_SUCCESS The interrupt is available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq); + +/**@brief Set Pending Interrupt. + * @note Corresponds to NVIC_SetPendingIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt is set pending. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn); + +/**@brief Clear Pending Interrupt. + * @note Corresponds to NVIC_ClearPendingIRQ in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS. + * + * @retval ::NRF_SUCCESS The interrupt pending flag is cleared. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn); + +/**@brief Set Interrupt Priority. + * @note Corresponds to NVIC_SetPriority in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * @pre Priority is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_SetPriority documentation in CMSIS. + * @param[in] priority A valid IRQ priority for use by the application. + * + * @retval ::NRF_SUCCESS The interrupt and priority level is available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority); + +/**@brief Get Interrupt Priority. + * @note Corresponds to NVIC_GetPriority in CMSIS. + * + * @pre IRQn is valid and not reserved by the stack. + * + * @param[in] IRQn See the NVIC_GetPriority documentation in CMSIS. + * @param[out] p_priority Return value from NVIC_GetPriority. + * + * @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority. + * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application. + */ +__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority); + +/**@brief System Reset. + * @note Corresponds to NVIC_SystemReset in CMSIS. + * + * @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN + */ +__STATIC_INLINE uint32_t sd_nvic_SystemReset(void); + +/**@brief Enter critical region. + * + * @post Application interrupts will be disabled. + * @note sd_nvic_critical_region_enter() and ::sd_nvic_critical_region_exit() must be called in matching pairs inside each + * execution context + * @sa sd_nvic_critical_region_exit + * + * @param[out] p_is_nested_critical_region If 1, the application is now in a nested critical region. + * + * @retval ::NRF_SUCCESS + */ +__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region); + +/**@brief Exit critical region. + * + * @pre Application has entered a critical region using ::sd_nvic_critical_region_enter. + * @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called. + * + * @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter. + * + * @retval ::NRF_SUCCESS + */ +__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region); + +/**@} */ + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE int __sd_nvic_irq_disable(void) +{ + int pm = __get_PRIMASK(); + __disable_irq(); + return pm; +} + +__STATIC_INLINE void __sd_nvic_irq_enable(void) +{ + __enable_irq(); +} + +__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) +{ + if (IRQn < 32) + { + return ((1UL<= (1 << __NVIC_PRIO_BITS)) + || (((1 << priority) & __NRF_NVIC_APP_IRQ_PRIOS) == 0) + ) + { + return 0; + } + return 1; +} + + +__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn) +{ + if (!__sd_nvic_app_accessible_irq(IRQn)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } + if (!__sd_nvic_is_app_accessible_priority(NVIC_GetPriority(IRQn))) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; + } + + if (nrf_nvic_state.__cr_flag) + { + nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] |= (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); + } + else + { + NVIC_EnableIRQ(IRQn); + } + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn) +{ + if (!__sd_nvic_app_accessible_irq(IRQn)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } + + if (nrf_nvic_state.__cr_flag) + { + nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] &= ~(1UL << ((uint32_t)(IRQn) & 0x1F)); + } + else + { + NVIC_DisableIRQ(IRQn); + } + + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + *p_pending_irq = NVIC_GetPendingIRQ(IRQn); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + NVIC_SetPendingIRQ(IRQn); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + NVIC_ClearPendingIRQ(IRQn); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if (!__sd_nvic_app_accessible_irq(IRQn)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } + + if (!__sd_nvic_is_app_accessible_priority(priority)) + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; + } + + NVIC_SetPriority(IRQn, (uint32_t)priority); + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority) +{ + if (__sd_nvic_app_accessible_irq(IRQn)) + { + *p_priority = (NVIC_GetPriority(IRQn) & 0xFF); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; + } +} + +__STATIC_INLINE uint32_t sd_nvic_SystemReset(void) +{ + NVIC_SystemReset(); + return NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN; +} + +__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) +{ + int was_masked = __sd_nvic_irq_disable(); + if (!nrf_nvic_state.__cr_flag) + { + nrf_nvic_state.__cr_flag = 1; + nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); + NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; + nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); + NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; + *p_is_nested_critical_region = 0; + } + else + { + *p_is_nested_critical_region = 1; + } + if (!was_masked) + { + __sd_nvic_irq_enable(); + } + return NRF_SUCCESS; +} + +__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) +{ + if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) + { + int was_masked = __sd_nvic_irq_disable(); + NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; + NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; + nrf_nvic_state.__cr_flag = 0; + if (!was_masked) + { + __sd_nvic_irq_enable(); + } + } + + return NRF_SUCCESS; +} + +#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ + +#ifdef __cplusplus +} +#endif + +#endif // NRF_NVIC_H__ + +/**@} */ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_sdm.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_sdm.h new file mode 100644 index 0000000..43ff058 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_sdm.h @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_sdm_api SoftDevice Manager API + @{ + + @brief APIs for SoftDevice management. + +*/ + +#ifndef NRF_SDM_H__ +#define NRF_SDM_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_sdm.h" +#include "nrf_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_SDM_DEFINES Defines + * @{ */ +#ifdef NRFSOC_DOXYGEN +/// Declared in nrf_mbr.h +#define MBR_SIZE 0 +#warning test +#endif + +/** @brief The major version for the SoftDevice binary distributed with this header file. */ +#define SD_MAJOR_VERSION (7) + +/** @brief The minor version for the SoftDevice binary distributed with this header file. */ +#define SD_MINOR_VERSION (0) + +/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ +#define SD_BUGFIX_VERSION (1) + +/** @brief The SoftDevice variant of this firmware. */ +#define SD_VARIANT_ID 113 + +/** @brief The full version number for the SoftDevice binary this header file was distributed + * with, as a decimal number in the form Mmmmbbb, where: + * - M is major version (one or more digits) + * - mmm is minor version (three digits) + * - bbb is bugfix version (three digits). */ +#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) + +/** @brief SoftDevice Manager SVC Base number. */ +#define SDM_SVC_BASE 0x10 + +/** @brief SoftDevice unique string size in bytes. */ +#define SD_UNIQUE_STR_SIZE 20 + +/** @brief Invalid info field. Returned when an info field does not exist. */ +#define SDM_INFO_FIELD_INVALID (0) + +/** @brief Defines the SoftDevice Information Structure location (address) as an offset from +the start of the SoftDevice (without MBR)*/ +#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) + +/** @brief Defines the absolute SoftDevice Information Structure location (address) when the + * SoftDevice is installed just above the MBR (the usual case). */ +#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) + +/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the + * SoftDevice base address. The size value is of type uint8_t. */ +#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) + +/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. + * The size value is of type uint32_t. */ +#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) + +/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value + * is of type uint16_t. */ +#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) + +/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID + * is of type uint32_t. */ +#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) + +/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in + * the same format as @ref SD_VERSION, stored as an uint32_t. */ +#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) + +/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. + * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. + */ +#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) + +/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value + * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is + * installed just above the MBR (the usual case). */ +#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) + +/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base + * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above + * the MBR (the usual case). */ +#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) + +/** @brief Defines the amount of flash that is used by the SoftDevice. + * Add @ref MBR_SIZE to find the first available flash address when the SoftDevice is installed + * just above the MBR (the usual case). + */ +#define SD_FLASH_SIZE 0x1B000 + +/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual + * case). */ +#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) + +/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the + * usual case). */ +#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ +#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ +#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges + * @{ */ +#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ +#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ +/**@} */ + +/**@defgroup NRF_FAULT_IDS Fault ID types + * @{ */ +#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ +#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, + in case of SoftDevice RAM access violation. In case of SoftDevice peripheral + register violation the info parameter will contain the sub-region number of + PREGION[0], on whose address range the disallowed write access caused the + memory access fault. */ +/**@} */ + +/** @} */ + +/** @addtogroup NRF_SDM_ENUMS Enumerations + * @{ */ + +/**@brief nRF SoftDevice Manager API SVC numbers. */ +enum NRF_SD_SVCS +{ + SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ + SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ + SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ + SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ + SVC_SDM_LAST /**< Placeholder for last SDM SVC */ +}; + +/** @} */ + +/** @addtogroup NRF_SDM_DEFINES Defines + * @{ */ + +/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy + * @{ */ + +#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ +#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ +#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ +#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ +#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ +#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ +#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ +#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ +#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ +#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ +#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ +#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ + +/** @} */ + +/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources + * @{ */ + +#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ +#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ +#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ + +/** @} */ + +/** @} */ + +/** @addtogroup NRF_SDM_TYPES Types + * @{ */ + +/**@brief Type representing LFCLK oscillator source. */ +typedef struct +{ + uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ + uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second + units (nRF52: 1-32). + @note To avoid excessive clock drift, 0.5 degrees Celsius is the + maximum temperature change allowed in one calibration timer + interval. The interval should be selected to ensure this. + + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ + uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration + intervals) the RC oscillator shall be calibrated if the temperature + hasn't changed. + 0: Always calibrate even if the temperature hasn't changed. + 1: Only calibrate if the temperature has changed (legacy - nRF51 only). + 2-33: Check the temperature and only calibrate if it has changed, + however calibration will take place every rc_temp_ctiv + intervals in any case. + + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. + + @note For nRF52, the application must ensure calibration at least once + every 8 seconds to ensure +/-500 ppm clock stability. The + recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is + rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at + least once every 8 seconds and for temperature changes of 0.5 + degrees Celsius every 4 seconds. See the Product Specification + for the nRF52 device being used for more information.*/ + uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing + windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ +} nrf_clock_lf_cfg_t; + +/**@brief Fault Handler type. + * + * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. + * The protocol stack will be in an undefined state when this happens and the only way to recover will be to + * perform a reset, using e.g. CMSIS NVIC_SystemReset(). + * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). + * + * @note It is recommended to either perform a reset in the fault handler or to let the SoftDevice reset the device. + * Otherwise SoC peripherals may behave in an undefined way. For example, the RADIO peripherial may + * continously transmit packets. + * + * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. + * + * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. + * @param[in] pc The program counter of the instruction that triggered the fault. + * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. + * + * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when + * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. + */ +typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); + +/** @} */ + +/** @addtogroup NRF_SDM_FUNCTIONS Functions + * @{ */ + +/**@brief Enables the SoftDevice and by extension the protocol stack. + * + * @note Some care must be taken if a low frequency clock source is already running when calling this function: + * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new + * clock source will be started. + * + * @note This function has no effect when returning with an error. + * + * @post If return code is ::NRF_SUCCESS + * - SoC library and protocol stack APIs are made available. + * - A portion of RAM will be unavailable (see relevant SDS documentation). + * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). + * - Interrupts will not arrive from protected peripherals or interrupts. + * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. + * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). + * - Chosen low frequency clock source will be running. + * + * @param p_clock_lf_cfg Low frequency clock source and accuracy. + If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 + In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. + * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. + * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. + * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. + */ +SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); + + +/**@brief Disables the SoftDevice and by extension the protocol stack. + * + * Idempotent function to disable the SoftDevice. + * + * @post SoC library and protocol stack APIs are made unavailable. + * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). + * @post All peripherals used by the SoftDevice will be reset to default values. + * @post All of RAM become available. + * @post All interrupts are forwarded to the application. + * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); + +/**@brief Check if the SoftDevice is enabled. + * + * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice + * + * This function is only intended to be called when a bootloader is enabled. + * + * @param[in] address The base address of the interrupt vector table for forwarded interrupts. + + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_SDM_H__ + +/** + @} +*/ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_soc.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_soc.h new file mode 100644 index 0000000..6eecc87 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_soc.h @@ -0,0 +1,1055 @@ +/* + * Copyright (c) 2015 - 2019, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @defgroup nrf_soc_api SoC Library API + * @{ + * + * @brief APIs for the SoC library. + * + */ + +#ifndef NRF_SOC_H__ +#define NRF_SOC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup NRF_SOC_DEFINES Defines + * @{ */ + +/**@brief The number of the lowest SVC number reserved for the SoC library. */ +#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ +#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ + +/**@brief Guaranteed time for application to process radio inactive notification. */ +#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) + +/**@brief The minimum allowed timeslot extension time. */ +#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) + +/**@brief The maximum processing time to handle a timeslot extension. */ +#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (20) + +/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ +#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (82) + +#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ +#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ +#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ + +#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ +#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. + The default interrupt priority for this handler is set to 6 */ +#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ +#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. + The default interrupt priority for this handler is set to 6 */ +#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ +#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ + +#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ + +#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ + +#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ + +/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is disabled. */ +#define NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK ((uint32_t)(0)) + +/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is enabled. */ +#define NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK ((uint32_t)( \ + (1U << 17) \ + | (1U << 18) \ + | (1U << 19) \ + | (1U << 20) \ + | (1U << 21) \ + | (1U << 22) \ + | (1U << 23) \ + | (1U << 24) \ + | (1U << 25) \ + | (1U << 26) \ + | (1U << 27) \ + | (1U << 28) \ + | (1U << 29) \ + | (1U << 30) \ + | (1U << 31) \ + )) + +/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is disabled. */ +#define NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK ((uint32_t)(0)) + +/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is enabled. */ +#define NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK ((uint32_t)( \ + (1U << 4) \ + | (1U << 5) \ + )) + +/**@} */ + +/**@addtogroup NRF_SOC_ENUMS Enumerations + * @{ */ + +/**@brief The SVC numbers used by the SVC functions in the SoC library. */ +enum NRF_SOC_SVCS +{ + SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, + SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, + SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, + SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, + SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, + SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, + SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, + SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, + SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, + SD_FLASH_WRITE = SOC_SVC_BASE + 9, + SD_FLASH_PROTECT = SOC_SVC_BASE + 10, + SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, + SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, + SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, + SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, + SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, + SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, + SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, + SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, + SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, + SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, + SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, + SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, + SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, + SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, + SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, + SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, + SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, + SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, + SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, + SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, + SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, + SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, + SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, + SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, + SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, + SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, + SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, + SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, + SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, + SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, + SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, + SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, + SD_POWER_USBPWRRDY_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 33, + SD_POWER_USBDETECTED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 34, + SD_POWER_USBREMOVED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 35, + SD_POWER_USBREGSTATUS_GET = SOC_SVC_BASE_NOT_AVAILABLE + 36, + SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 +}; + +/**@brief Possible values of a ::nrf_mutex_t. */ +enum NRF_MUTEX_VALUES +{ + NRF_MUTEX_FREE, + NRF_MUTEX_TAKEN +}; + +/**@brief Power modes. */ +enum NRF_POWER_MODES +{ + NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ + NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ +}; + + +/**@brief Power failure thresholds */ +enum NRF_POWER_THRESHOLDS +{ + NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ +}; + + + +/**@brief DC/DC converter modes. */ +enum NRF_POWER_DCDC_MODES +{ + NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ + NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ +}; + +/**@brief Radio notification distances. */ +enum NRF_RADIO_NOTIFICATION_DISTANCES +{ + NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ + NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ +}; + + +/**@brief Radio notification types. */ +enum NRF_RADIO_NOTIFICATION_TYPES +{ + NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ +}; + +/**@brief The Radio signal callback types. */ +enum NRF_RADIO_CALLBACK_SIGNAL_TYPE +{ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ +}; + +/**@brief The actions requested by the signal callback. + * + * This code gives the SOC instructions about what action to take when the signal callback has + * returned. + */ +enum NRF_RADIO_SIGNAL_CALLBACK_ACTION +{ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current + timeslot. Maximum execution time for this action: + @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. + This action must be started at least + @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before + the end of the timeslot. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ +}; + +/**@brief Radio timeslot high frequency clock source configuration. */ +enum NRF_RADIO_HFCLK_CFG +{ + NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the + external crystal for the whole duration of the timeslot. This should be the + preferred option for events that use the radio or require high timing accuracy. + @note The SoftDevice will automatically turn on and off the external crystal, + at the beginning and end of the timeslot, respectively. The crystal may also + intentionally be left running after the timeslot, in cases where it is needed + by the SoftDevice shortly after the end of the timeslot. */ + NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. + The RC oscillator may be the clock source in part or for the whole duration of the timeslot. + The RC oscillator's accuracy must therefore be taken into consideration. + @note If the application will use the radio peripheral in timeslots with this configuration, + it must make sure that the crystal is running and stable before starting the radio. */ +}; + +/**@brief Radio timeslot priorities. */ +enum NRF_RADIO_PRIORITY +{ + NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ + NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ +}; + +/**@brief Radio timeslot request type. */ +enum NRF_RADIO_REQUEST_TYPE +{ + NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ + NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ +}; + +/**@brief SoC Events. */ +enum NRF_SOC_EVTS +{ + NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ + NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ + NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ + NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ + NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ + NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ + NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ + NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ + NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ + NRF_EVT_POWER_USB_POWER_READY, /**< Event indicating that a USB 3.3 V supply is ready. */ + NRF_EVT_POWER_USB_DETECTED, /**< Event indicating that voltage supply is detected on VBUS. */ + NRF_EVT_POWER_USB_REMOVED, /**< Event indicating that voltage supply is removed from VBUS. */ + NRF_EVT_NUMBER_OF_EVTS +}; + +/**@} */ + + +/**@addtogroup NRF_SOC_STRUCTURES Structures + * @{ */ + +/**@brief Represents a mutex for use with the nrf_mutex functions. + * @note Accessing the value directly is not safe, use the mutex functions! + */ +typedef volatile uint8_t nrf_mutex_t; + +/**@brief Parameters for a request for a timeslot as early as possible. */ +typedef struct +{ + uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ + uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ + uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ + uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ +} nrf_radio_request_earliest_t; + +/**@brief Parameters for a normal radio timeslot request. */ +typedef struct +{ + uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ + uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ + uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ + uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ +} nrf_radio_request_normal_t; + +/**@brief Radio timeslot request parameters. */ +typedef struct +{ + uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ + union + { + nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ + nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ + } params; /**< Parameter union. */ +} nrf_radio_request_t; + +/**@brief Return parameters of the radio timeslot signal callback. */ +typedef struct +{ + uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ + union + { + struct + { + nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ + } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ + struct + { + uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ + } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ + } params; /**< Parameter union. */ +} nrf_radio_signal_callback_return_param_t; + +/**@brief The radio timeslot signal callback type. + * + * @note In case of invalid return parameters, the radio timeslot will automatically end + * immediately after returning from the signal callback and the + * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. + * @note The returned struct pointer must remain valid after the signal callback + * function returns. For instance, this means that it must not point to a stack variable. + * + * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. + * + * @return Pointer to structure containing action requested by the application. + */ +typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); + +/**@brief AES ECB parameter typedefs */ +typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ +typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ +typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ + +/**@brief AES ECB data structure */ +typedef struct +{ + soc_ecb_key_t key; /**< Encryption key. */ + soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ + soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ +} nrf_ecb_hal_data_t; + +/**@brief AES ECB block. Used to provide multiple blocks in a single call + to @ref sd_ecb_blocks_encrypt.*/ +typedef struct +{ + soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ + soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ + soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ +} nrf_ecb_hal_data_block_t; + +/**@} */ + +/**@addtogroup NRF_SOC_FUNCTIONS Functions + * @{ */ + +/**@brief Initialize a mutex. + * + * @param[in] p_mutex Pointer to the mutex to initialize. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); + +/**@brief Attempt to acquire a mutex. + * + * @param[in] p_mutex Pointer to the mutex to acquire. + * + * @retval ::NRF_SUCCESS The mutex was successfully acquired. + * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. + */ +SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); + +/**@brief Release a mutex. + * + * @param[in] p_mutex Pointer to the mutex to release. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); + +/**@brief Query the capacity of the application random pool. + * + * @param[out] p_pool_capacity The capacity of the pool. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); + +/**@brief Get number of random bytes available to the application. + * + * @param[out] p_bytes_available The number of bytes currently available in the pool. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); + +/**@brief Get random bytes from the application pool. + * + * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. + * @param[in] length Number of bytes to take from pool and place in p_buff. + * + * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. + * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. +*/ +SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); + +/**@brief Gets the reset reason register. + * + * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); + +/**@brief Clears the bits of the reset reason register. + * + * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); + +/**@brief Sets the power mode when in CPU sleep. + * + * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait + * + * @retval ::NRF_SUCCESS The power mode was set. + * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. + */ +SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); + +/**@brief Puts the chip in System OFF mode. + * + * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN + */ +SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); + +/**@brief Enables or disables the power-fail comparator. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); + +/**@brief Enables or disables the USB power ready event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_POWER_READY) when a USB 3.3 V supply is ready. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbpwrrdy_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBPWRRDY_ENABLE, uint32_t, sd_power_usbpwrrdy_enable(uint8_t usbpwrrdy_enable)); + +/**@brief Enables or disables the power USB-detected event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_DETECTED) when a voltage supply is detected on VBUS. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbdetected_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBDETECTED_ENABLE, uint32_t, sd_power_usbdetected_enable(uint8_t usbdetected_enable)); + +/**@brief Enables or disables the power USB-removed event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_REMOVED) when a voltage supply is removed from VBUS. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbremoved_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBREMOVED_ENABLE, uint32_t, sd_power_usbremoved_enable(uint8_t usbremoved_enable)); + +/**@brief Get USB supply status register content. + * + * @param[out] usbregstatus The content of USBREGSTATUS register. + * + * @note Calling this function on a chip without USBD peripheral will result in undefined behaviour. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBREGSTATUS_GET, uint32_t, sd_power_usbregstatus_get(uint32_t * usbregstatus)); + +/**@brief Sets the power failure comparator threshold value. + * + * + * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. + * + * @retval ::NRF_SUCCESS The power failure threshold was set. + * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. + */ +SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); + + +/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. + * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); + +/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. + * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); + +/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. + * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); + +/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[in] gpregret_msk Bits to be set in the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); + +/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); + +/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[out] p_gpregret Contents of the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); + +/**@brief Enable or disable the DC/DC regulator. + * + * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. + */ +SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); + + +/**@brief Request the high frequency crystal oscillator. + * + * Will start the high frequency crystal oscillator, the startup time of the crystal varies + * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. + * + * @see sd_clock_hfclk_is_running + * @see sd_clock_hfclk_release + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); + +/**@brief Releases the high frequency crystal oscillator. + * + * Will stop the high frequency crystal oscillator, this happens immediately. + * + * @see sd_clock_hfclk_is_running + * @see sd_clock_hfclk_request + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); + +/**@brief Checks if the high frequency crystal oscillator is running. + * + * @see sd_clock_hfclk_request + * @see sd_clock_hfclk_release + * + * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); + +/**@brief Waits for an application event. + * + * An application event is either an application interrupt or a pended interrupt when the interrupt + * is disabled. + * + * When the application waits for an application event by calling this function, an interrupt that + * is enabled will be taken immediately on pending since this function will wait in thread mode, + * then the execution will return in the application's main thread. + * + * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M + * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets + * pended, this function will return to the application's main thread. + * + * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ + * in order to sleep using this function. This is only necessary for disabled interrupts, as + * the interrupt handler will clear the pending flag automatically for enabled interrupts. + * + * @note If an application interrupt has happened since the last time sd_app_evt_wait was + * called this function will return immediately and not go to sleep. This is to avoid race + * conditions that can occur when a flag is updated in the interrupt handler and processed + * in the main loop. + * + * @post An application interrupt has happened or a interrupt pending flag is set. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); + +/**@brief Get PPI channel enable register contents. + * + * @param[out] p_channel_enable The contents of the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); + +/**@brief Set PPI channel enable register. + * + * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); + +/**@brief Clear PPI channel enable register. + * + * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); + +/**@brief Assign endpoints to a PPI channel. + * + * @param[in] channel_num Number of the PPI channel to assign. + * @param[in] evt_endpoint Event endpoint of the PPI channel. + * @param[in] task_endpoint Task endpoint of the PPI channel. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); + +/**@brief Task to enable a channel group. + * + * @param[in] group_num Number of the channel group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); + +/**@brief Task to disable a channel group. + * + * @param[in] group_num Number of the PPI group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); + +/**@brief Assign PPI channels to a channel group. + * + * @param[in] group_num Number of the channel group. + * @param[in] channel_msk Mask of the channels to assign to the group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); + +/**@brief Gets the PPI channels of a channel group. + * + * @param[in] group_num Number of the channel group. + * @param[out] p_channel_msk Mask of the channels assigned to the group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); + +/**@brief Configures the Radio Notification signal. + * + * @note + * - The notification signal latency depends on the interrupt priority settings of SWI used + * for notification signal. + * - To ensure that the radio notification signal behaves in a consistent way, the radio + * notifications must be configured when there is no protocol stack or other SoftDevice + * activity in progress. It is recommended that the radio notification signal is + * configured directly after the SoftDevice has been enabled. + * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice + * will interrupt the application to do Radio Event preparation. + * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have + * to shorten the connection events to have time for the Radio Notification signals. + * + * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. + * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio + * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is + * recommended (but not required) to be used with + * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. + * + * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. + * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or + * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. + * + * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. + * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all + * running activities and retry. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); + +/**@brief Encrypts a block according to the specified parameters. + * + * 128-bit AES encryption. + * + * @note: + * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while + * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application + * main or low interrupt level. + * + * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input + * parameters and one output parameter). + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); + +/**@brief Encrypts multiple data blocks provided as an array of data block structures. + * + * @details: Performs 128-bit AES encryption on multiple data blocks + * + * @note: + * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while + * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application + * main or low interrupt level. + * + * @param[in] block_count Count of blocks in the p_data_blocks array. + * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of + * @ref nrf_ecb_hal_data_block_t structures. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); + +/**@brief Gets any pending events generated by the SoC API. + * + * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. + * + * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. + * + * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. + * @retval ::NRF_ERROR_NOT_FOUND No pending events. + */ +SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); + +/**@brief Get the temperature measured on the chip + * + * This function will block until the temperature measurement is done. + * It takes around 50 us from call to return. + * + * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. + * + * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp + */ +SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); + +/**@brief Flash Write +* +* Commands to write a buffer to flash +* +* If the SoftDevice is enabled: +* This call initiates the flash access command, and its completion will be communicated to the +* application with exactly one of the following events: +* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. +* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. +* +* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the + * write has been completed +* +* @note +* - This call takes control over the radio and the CPU during flash erase and write to make sure that +* they will not interfere with the flash access. This means that all interrupts will be blocked +* for a predictable time (depending on the NVMC specification in the device's Product Specification +* and the command parameters). +* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS +* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. +* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is +* protected. +* +* +* @param[in] p_dst Pointer to start of flash location to be written. +* @param[in] p_src Pointer to buffer with data to be written. +* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one +* flash page. See the device's Product Specification for details. +* +* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. +* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. +* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. +* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. +* @retval ::NRF_SUCCESS The command was accepted. +*/ +SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); + + +/**@brief Flash Erase page +* +* Commands to erase a flash page +* If the SoftDevice is enabled: +* This call initiates the flash access command, and its completion will be communicated to the +* application with exactly one of the following events: +* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. +* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. +* +* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the +* erase has been completed +* +* @note +* - This call takes control over the radio and the CPU during flash erase and write to make sure that +* they will not interfere with the flash access. This means that all interrupts will be blocked +* for a predictable time (depending on the NVMC specification in the device's Product Specification +* and the command parameters). +* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is +* protected. +* +* +* @param[in] page_number Page number of the page to erase +* +* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. +* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. +* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. +* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. +* @retval ::NRF_SUCCESS The command was accepted. +*/ +SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); + + +/**@brief Flash Protection set + * + * Commands to set the flash protection configuration registers. + This sets the CONFIGx registers of the BPROT peripheral. + * + * @note Not all parameters are valid for all products. Some bits in each parameter may not be + * valid for your product. Please refer your Product Specification for more details. + * + * @note To read the values read them directly. They are only write-protected. + * + * @note It is possible to use @ref sd_protected_register_write instead of this function. + * + * @param[in] block_cfg0 Value to be written to the configuration register. + * @param[in] block_cfg1 Value to be written to the configuration register. + * @param[in] block_cfg2 Value to be written to the configuration register. + * @param[in] block_cfg3 Value to be written to the configuration register. + * + * @retval ::NRF_ERROR_NOT_SUPPORTED Non-zero value supplied to one or more of the unsupported parameters. + * @retval ::NRF_SUCCESS Values successfully written to configuration registers. + */ +SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); + +/**@brief Opens a session for radio timeslot requests. + * + * @note Only one session can be open at a time. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot + * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed + * by the application. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 + * interrupt occurs. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO + * interrupt occurs. + * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This + * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). + * + * @param[in] p_radio_signal_callback The signal callback. + * + * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. + * @retval ::NRF_ERROR_BUSY If session cannot be opened. + * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); + +/**@brief Closes a session for radio timeslot requests. + * + * @note Any current radio timeslot will be finished before the session is closed. + * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. + * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED + * event is received. + * + * @retval ::NRF_ERROR_FORBIDDEN If session not opened. + * @retval ::NRF_ERROR_BUSY If session is currently being closed. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); + +/**@brief Requests a radio timeslot. + * + * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST + * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. + * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by + * p_request->distance_us and is given relative to the start of the previous timeslot. + * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. + * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. + * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. + * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this + * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. + * The application may then try to schedule the first radio timeslot again. + * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). + * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. + * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. + * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the + * specified radio timeslot start, but this does not affect the actual start time of the timeslot. + * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency + * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is + * guaranteed to be clocked from the external crystal. + * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral + * during the radio timeslot. + * + * @param[in] p_request Pointer to the request parameters. + * + * @retval ::NRF_ERROR_FORBIDDEN Either: + * - The session is not open. + * - The session is not IDLE. + * - This is the first request and its type is not @ref NRF_RADIO_REQ_TYPE_EARLIEST. + * - The request type was set to @ref NRF_RADIO_REQ_TYPE_NORMAL after a + * @ref NRF_RADIO_REQ_TYPE_EARLIEST request was blocked. + * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. + * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); + +/**@brief Write register protected by the SoftDevice + * + * This function writes to a register that is write-protected by the SoftDevice. Please refer to your + * SoftDevice Specification for more details about which registers that are protected by SoftDevice. + * This function can write to the following protected peripheral: + * - BPROT + * + * @note Protected registers may be read directly. + * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in + * the register has not changed. See the Product Specification for more details about register + * properties. + * + * @param[in] p_register Pointer to register to be written. + * @param[in] value Value to be written to the register. + * + * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. + * @retval ::NRF_SUCCESS Value successfully written to register. + * + */ +SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); + +/**@} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_SOC_H__ + +/**@} */ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_svc.h b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_svc.h new file mode 100644 index 0000000..231a54f --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_API/include/nrf_svc.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2012 - 2019, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NRF_SVC__ +#define NRF_SVC__ + +#include "stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief Supervisor call declaration. + * + * A call to a function marked with @ref SVCALL, will trigger a Supervisor Call (SVC) Exception. + * The SVCs with SVC numbers 0x00-0x0F are forwared to the application. All other SVCs are handled by the SoftDevice. + * + * @param[in] number The SVC number to be used. + * @param[in] return_type The return type of the SVC function. + * @param[in] signature Function signature. The function can have at most four arguments. + */ + +#ifdef SVCALL_AS_NORMAL_FUNCTION +#define SVCALL(number, return_type, signature) return_type signature +#else + +#ifndef SVCALL +#if defined (__CC_ARM) +#define SVCALL(number, return_type, signature) return_type __svc(number) signature +#elif defined (__GNUC__) +#ifdef __cplusplus +#define GCC_CAST_CPP (uint16_t) +#else +#define GCC_CAST_CPP +#endif +#define SVCALL(number, return_type, signature) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ + __attribute__((naked)) \ + __attribute__((unused)) \ + static return_type signature \ + { \ + __asm( \ + "svc %0\n" \ + "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ + ); \ + } \ + _Pragma("GCC diagnostic pop") + +#elif defined (__ICCARM__) +#define PRAGMA(x) _Pragma(#x) +#define SVCALL(number, return_type, signature) \ +PRAGMA(swi_number = (number)) \ + __swi return_type signature; +#else +#define SVCALL(number, return_type, signature) return_type signature +#endif +#endif // SVCALL + +#endif // SVCALL_AS_NORMAL_FUNCTION + +#ifdef __cplusplus +} +#endif +#endif // NRF_SVC__ diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_license-agreement.txt b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_license-agreement.txt new file mode 100644 index 0000000..2308432 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_license-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2019, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/s113_nrf52_7.0.1/s113_nrf52_7.0.1_softdevice.hex b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_softdevice.hex new file mode 100644 index 0000000..3343f75 --- /dev/null +++ b/s113_nrf52_7.0.1/s113_nrf52_7.0.1_softdevice.hex @@ -0,0 +1,6899 @@ +:020000040000FA +:1000000000040020810A000015070000610A0000BA +:100010001F07000029070000330700000000000050 +:10002000000000000000000000000000A50A000021 +:100030003D070000000000004707000051070000D6 +:100040005B070000650700006F07000079070000EC +:10005000830700008D07000097070000A10700003C +:10006000AB070000B5070000BF070000C90700008C +:10007000D3070000DD070000E7070000F1070000DC +:10008000FB070000050800000F0800001908000029 +:10009000230800002D080000370800004108000078 +:1000A0004B080000550800005F08000069080000C8 +:1000B000730800007D080000870800009108000018 +:1000C0009B080000A5080000AF080000B908000068 +:1000D000C3080000CD080000D7080000E1080000B8 +:1000E000EB080000F5080000FF0800000909000007 +:1000F000130900001D090000270900003109000054 +:100100003B0900001FB500F003F88DE80F001FBD8C +:1001100000F0ACBC40F6FC7108684FF01022401CA7 +:1001200008D00868401C09D00868401C04D0086842 +:1001300000F037BA9069F5E79069F9E7704770B554 +:100140000B46010B184400F6FF70040B4FF0805073 +:100150000022090303692403406943431D1B104621 +:1001600000F048FA29462046BDE8704000F042BA47 +:10017000F0B54FF6FF734FF4B4751A466E1E11E0DA +:10018000A94201D3344600E00C46091B30F8027B3B +:10019000641E3B441A44F9D19CB204EB134394B25D +:1001A00004EB12420029EBD198B200EB134002EBB2 +:1001B000124140EA0140F0BDF34992B00446D1E952 +:1001C0000001CDE91001FF224021684600F0F4FB58 +:1001D00094E80F008DE80F00684610A902E004C8FB +:1001E00041F8042D8842FAD110216846FFF7C0FF7C +:1001F0001090AA208DF8440000F099F9FFF78AFFCB +:1002000040F6FC7420684FF01025401C0FD0206889 +:1002100010226946803000F078F92068401C08D030 +:100220002068082210A900F070F900F061F9A869AF +:10023000EEE7A869F5E74FF080500369406940F6A2 +:10024000FC71434308684FF01022401C06D0086838 +:1002500000F58050834203D2092070479069F7E788 +:100260000868401C04D00868401C03D00020704778 +:100270009069F9E70420704770B504460068C34DE3 +:10028000072876D2DFE800F033041929631E250021 +:10029000D4E9026564682946304600F062F92A46CE +:1002A0002146304600F031F9AA002146304600F0E0 +:1002B00057FB002800D0032070BD00F009FC4FF46C +:1002C000805007E0201D00F040F90028F4D100F034 +:1002D000FFFB60682860002070BD241D94E80700C3 +:1002E000920000F03DFB0028F6D00E2070BDFFF715 +:1002F000A2FF0028FAD1D4E901034FF0805100EBAE +:10030000830208694D69684382420ED840F6F8704E +:1003100005684FF010226D1C09D0056805EB8305B8 +:100320000B6949694B439D4203D9092070BD55694A +:10033000F4E70168491C03D00068401C02D003E0C8 +:100340005069FAE70F2070BD2046FFF735FFFFF731 +:1003500072FF0028F7D1201D00F0F7F80028F2D135 +:1003600060680028F0D100F0E2F8FFF7D3FE00F05B +:10037000BFF8072070BD10B50C46182802D0012028 +:10038000086010BD2068FFF777FF206010BD41684E +:10039000054609B1012700E0002740F6F8742068FF +:1003A0004FF01026401C2BD02068AA68920000F065 +:1003B000D7FA38B3A86881002068401C27D020688D +:1003C000FFF7BDFED7B12068401C22D026684FF051 +:1003D0008050AC686D68016942695143A9420DD9EA +:1003E000016940694143A14208D92146304600F0E5 +:1003F000B8F822462946304600F087F800F078F831 +:100400007069D2E700F093F8FFF784FEF6E77069B1 +:10041000D6E77669DBE740F6FC7420684FF01026DB +:10042000401C23D02068401C0CD02068401C1FD0EA +:100430002568206805F18005401C1BD027683879A5 +:10044000AA2819D040F6F8700168491C42D001680A +:10045000491C45D00168491C3ED001680968491C07 +:100460003ED00168491C39D000683EE0B069DAE747 +:10047000B569DEE7B769E2E710212846FFF778FEA5 +:100480003968814222D12068401C05D0D4F8001080 +:1004900001F18002C03107E0B169F9E730B108CA63 +:1004A00051F8040D984201D1012000E000208A4259 +:1004B000F4D158B1286810B1042803D0FEE72846CB +:1004C000FFF765FF3149686808600EE0FFF722FE1C +:1004D00000F00EF87169BBE77169BFE7706904E06D +:1004E0004FF480500168491C01D000F0CBFAFEE7C0 +:1004F000BFF34F8F26480168264A01F4E06111439B +:100500000160BFF34F8F00BFFDE72DE9F0411746B3 +:100510000D460646002406E03046296800F054F8EF +:10052000641C2D1D361DBC42F6D3BDE8F08140F69B +:10053000FC700168491C04D0D0F800004FF48051D1 +:10054000FDE54FF010208069F8E74FF080510A690F +:10055000496900684A43824201D810207047002050 +:10056000704770B50C4605464FF4806608E0284693 +:1005700000F017F8B44205D3A4F5806405F5805562 +:10058000002CF4D170BD0000F40A0000000000202F +:100590000CED00E00400FA05144801680029FCD0C5 +:1005A0007047134A0221116010490B68002BFCD0E0 +:1005B0000F4B1B1D186008680028FCD0002010603D +:1005C00008680028FCD07047094B10B501221A605A +:1005D000064A1468002CFCD0016010680028FCD08A +:1005E0000020186010680028FCD010BD00E4014015 +:1005F00004E5014070B50C46054600F073F810B9EB +:1006000000F07EF828B121462846BDE8704000F091 +:1006100007B821462846BDE8704000F037B8000012 +:100620007FB5002200920192029203920A0B000B06 +:100630006946012302440AE0440900F01F0651F80C +:10064000245003FA06F6354341F82450401C8242F8 +:10065000F2D80D490868009A10430860081D016827 +:10066000019A1143016000F03DF800280AD00649C4 +:1006700010310868029A10430860091D0868039A3F +:10068000104308607FBD00000006004030B50F4CED +:10069000002200BF04EB0213D3F800582DB9D3F8A1 +:1006A000045815B9D3F808581DB1521C082AF1D3C3 +:1006B00030BD082AFCD204EB0212C2F80008C3F8CD +:1006C00004180220C3F8080830BD000000E0014013 +:1006D0004FF08050D0F83001082801D0002070473A +:1006E000012070474FF08050D0F83011062905D016 +:1006F000D0F83001401C01D0002070470120704725 +:100700004FF08050D0F830010A2801D00020704707 +:100710000120704708208F490968095808471020B0 +:100720008C4909680958084714208A4909680958FA +:100730000847182087490968095808473020854923 +:100740000968095808473820824909680958084744 +:100750003C20804909680958084740207D490968BC +:100760000958084744207B49096809580847482028 +:1007700078490968095808474C207649096809589A +:10078000084750207349096809580847542071499F +:1007900009680958084758206E49096809580847E8 +:1007A0005C206C4909680958084760206949096854 +:1007B00009580847642067490968095808476820AC +:1007C00064490968095808476C2062490968095852 +:1007D000084770205F4909680958084774205D4937 +:1007E00009680958084778205A490968095808478C +:1007F0007C205849096809580847802055490968EC +:10080000095808478420534909680958084788202F +:1008100050490968095808478C204E490968095809 +:10082000084790204B4909680958084794204949CE +:10083000096809580847982046490968095808472F +:100840009C204449096809580847A0204149096883 +:1008500009580847A4203F49096809580847A820B3 +:100860003C49096809580847AC203A4909680958C1 +:100870000847B0203749096809580847B420354966 +:10088000096809580847B8203249096809580847D3 +:10089000BC203049096809580847C0202D4909681B +:1008A00009580847C4202B49096809580847C82037 +:1008B0002849096809580847CC2026490968095879 +:1008C0000847D0202349096809580847D4202149FE +:1008D000096809580847D8201E4909680958084777 +:1008E000DC201C49096809580847E02019490968B3 +:1008F00009580847E4201749096809580847E820BB +:100900001449096809580847EC2012490968095830 +:100910000847F0200F49096809580847F4200D4995 +:10092000096809580847F8200A490968095808471A +:10093000FC2008490968095808475FF48070054998 +:10094000096809580847000003480449024A034B54 +:100950007047000000000020000B0000000B0000AA +:1009600040EA010310B59B070FD1042A0DD310C82C +:1009700008C9121F9C42F8D020BA19BA884201D97E +:10098000012010BD4FF0FF3010BD1AB1D30703D0C6 +:10099000521C07E0002010BD10F8013B11F8014B7C +:1009A0001B1B07D110F8013B11F8014B1B1B01D198 +:1009B000921EF1D1184610BD02F0FF0343EA032254 +:1009C00042EA024200F005B87047704770474FF0A6 +:1009D00000020429C0F0128010F0030C00F01B800C +:1009E000CCF1040CBCF1020F18BF00F8012BA8BF1A +:1009F00020F8022BA1EB0C0100F00DB85FEAC17CDE +:100A000024BF00F8012B00F8012B48BF00F8012B90 +:100A100070474FF0000200B51346944696462039C1 +:100A200022BFA0E80C50A0E80C50B1F12001BFF4A7 +:100A3000F7AF090728BFA0E80C5048BF0CC05DF80D +:100A400004EB890028BF40F8042B08BF704748BF5B +:100A500020F8022B11F0804F18BF00F8012B7047CF +:100A6000014B1B68DB6818470000002009480A4951 +:100A70007047FFF7FBFFFFF745FB00BD20BFFDE719 +:100A8000064B1847064A1060016881F308884068E1 +:100A900000470000000B0000000B000017040000DE +:100AA000000000201EF0040F0CBFEFF30881EFF3ED +:100AB0000981886902380078182803D100E0000015 +:100AC000074A1047074A12682C3212681047000084 +:100AD00000B5054B1B68054A9B58984700BD0000B0 +:100AE0007703000000000020F00A0000040000006E +:100AF000001000000000000000FFFFFF0090D00386 +:10100000B00F002021AE010065B0000087AD0100E7 +:1010100065B0000065B0000065B000000000000091 +:10102000000000000000000000000000ADAE010064 +:1010300065B000000000000065B0000065B0000071 +:1010400015AF01001BAF010065B0000065B00000E6 +:1010500065B0000065B0000065B0000065B000003C +:1010600021AF010065B0000065B0000027AF0100AE +:1010700065B000002DAF010033AF010039AF0100B2 +:1010800065B0000065B0000065B0000065B000000C +:1010900065B0000065B0000065B0000065B00000FC +:1010A00065B000003FAF010065B0000065B0000012 +:1010B00065B0000065B0000065B0000065B00000DC +:1010C00045AF010065B0000065B0000065B00000EC +:1010D00065B0000065B0000065B0000065B00000BC +:1010E00065B0000065B0000065B0000065B00000AC +:1010F00065B0000065B0000065B0000065B000009C +:1011000065B0000065B0000000F002F819F077FE4D +:101110000AA090E8000C82448344AAF10107DA4552 +:1011200001D119F06CFEAFF2090EBAE80F0013F00E +:10113000010F18BFFB1A43F00103184770A201000A +:1011400090A201000A4410F8014B14F00F0508BFEB +:1011500010F8015B240908BF10F8014B6D1E05D083 +:1011600010F8013B6D1E01F8013BF9D1641E03D05C +:10117000641E01F8015BFBD19142E4D3704700008B +:101180000023002400250026103A28BF78C1FBD890 +:10119000520728BF30C148BF0B6070471FB500F031 +:1011A00003F88DE80F001FBD19F026BE70B51B4C6B +:1011B00005460A202070A01C00F0D7F85920A08016 +:1011C00029462046BDE8704006F0FEBE06F00CBF82 +:1011D00070B50C461249097829B1A0F160015E2969 +:1011E00008D3012013E0602804D0692802D043F21C +:1011F00001000CE020CC0B4E94E80E0006EB8000C2 +:10120000A0F58050241FD0F8806E2846B04720609B +:1012100070BD0120704706207047000008000020C4 +:101220001800002074AF01003249884201D2012029 +:1012300070470020704770B50446A0F500002E4EA0 +:10124000B0F1786F02D23444A4F5000429488442F6 +:1012500001D2012500E0002500F043F848B125B98E +:10126000B44204D32548006808E0012070BD002086 +:1012700070BD002DF9D1B442F9D321488442F6D291 +:10128000F3E710B50446A0F50000B0F1786F03D283 +:1012900019480444A4F5000400F023F84FF08041FD +:1012A00030B11648006804E08C4204D2012003E00B +:1012B00013488442F8D2002080F0010010BD10B520 +:1012C00020B1FFF7DEFF08B1012010BD002010BDE6 +:1012D00010B520B1FFF7AFFF08B1012010BD00200D +:1012E00010BD084808490068884201D101207047B4 +:1012F0000020704700C00100000000201C000020FA +:101300000800002058000020BEBAFECA10B50446EE +:101310000021012000F041F800210B2000F03DF8F1 +:101320000021082000F039F80421192000F035F8D8 +:1013300004210D2000F031F804210E2000F02DF8DA +:1013400004210F2000F029F80421C84300F025F8FB +:101350000621162000F021F80621152000F01DF8C6 +:101360002046FFF723FF002010BDCC2101807047ED +:10137000FFF72CBF1148704710487047104A10B54E +:1013800014680F4B0F4A08331A60FFF721FF0C480F +:10139000001D046010BD704770474907090E002802 +:1013A00004DB00F1E02080F80014704700F00F002B +:1013B00000F1E02080F8141D7047000003F900429E +:1013C000100502400100000130B5FF4D0446062C17 +:1013D000A9780ED2DFE804F0030E0E0E0509FFDF38 +:1013E00008E0022906D0FFDF04E0032902D0FFDF76 +:1013F00000E0FFDFAC7030BDF34810B5407E41081F +:10140000F14800F11A0005D00DF043FBBDE8104093 +:1014100006F07ABC0DF024FBF8E730B50446A1F1E4 +:1014200020000D460A2847D2DFE800F005070C1916 +:10143000202532373C41FFDF3FE0207820283CD197 +:10144000FFDF3AE0E0488078052836D0207824286D +:1014500033D0252831D023282FD0FFDF2DE020786E +:1014600022282AD0232828D8FFDF26E02078222827 +:1014700023D0FFDF21E0207822281ED024281CD092 +:1014800026281AD0272818D0292816D0FFDF14E0E4 +:101490002078252811D0FFDF0FE0207825280CD0F8 +:1014A000FFDF0AE02078252807D0FFDF05E020785D +:1014B000282802D0FFDF00E0FFDF257030BD1FB518 +:1014C0000022ADF800200C88ADF802404B88ADF842 +:1014D0000430CA88ADF808208988ADF806100021CC +:1014E000ADF80A10ADF80C1080B14FF6FF70062170 +:1014F000844201D1ADF80210834201D1ADF804104D +:10150000824203D14FF44860ADF8080068460DF000 +:10151000BEFB06F0F9FB04B010BD70B514460D46D5 +:101520000646FFF788FE60B90DB1A54201D90C202F +:1015300070BD002409E000BF56F82400FFF77BFED1 +:1015400008B1102070BD641CE4B2AC42F4D300209A +:1015500070BD2DE9F04105461F4690460E46002419 +:101560000068FFF7B5FE30B9A98828680844401E16 +:10157000FFF7AEFE10B11020BDE8F081286800280A +:10158000A88802D0B84202D850E00028F4D0092040 +:10159000F2E72968085DB8B1671CCA5D152A2ED02C +:1015A0003CDC152A3AD2DFE802F039122222282840 +:1015B0002A2A313139393939393939393939220019 +:1015C000085D30BB641CA4B2A242F9D833E0022803 +:1015D000DDD1A01C085C88F80000072801D2400774 +:1015E00001D40A20C8E7307840F0010015E0C1437B +:1015F000C90707E0012807D010E00620BCE7010773 +:10160000A1F180510029F5D01846B5E7307881075F +:1016100001D50B20B0E740F0020030702868005D73 +:10162000384484B2A888A04202D2B0E74FF44853AD +:1016300082B2A242ADD800209EE710B502785408CD +:1016400009D0012243F20223012C07D0022C0DD035 +:10165000032C13D10FE00020087005E080790324EB +:10166000B4EB901F0AD10A70002010BD8079B2EB54 +:10167000901F03D1F7E780798009F4D0184610BD98 +:1016800008B500208DF800004F4890F8221051B1A5 +:1016900090F8230002280FD003280FD0FFDF00BFEF +:1016A0009DF8000008BD48486946193001F0C6F9A8 +:1016B0000028F5D0FFDFF3E7032000E001208DF8DC +:1016C0000000EDE738B50C460546694601F0B6F96D +:1016D00000280DD19DF80010207861F3470020709C +:1016E00055F8010FC4F80100A888A4F805000020EF +:1016F00038BD38B51378C0B1022816D033A46D4672 +:10170000246800944C7905EB9414247864F347031F +:10171000137003280ED003F0FE0010700868C2F8A2 +:1017200001008888A2F8050038BD23F0FE0313707D +:101730000228EED1D8B240F00100EEE702210EF00F +:10174000BDBC38B50C460978222901D2082038BD25 +:10175000ADF800008DF8022068460DF0D9F906F0CA +:10176000D3FA050003D121212046FFF756FE284673 +:1017700038BD1CB500208DF80000CDF80100ADF893 +:101780000500114890F82200022801D0012000E055 +:1017900000208DF8070068460DF024FA002800D0DC +:1017A000FFDF1CBD2DE9FF478CB00025BDF834607C +:1017B00082461C4690468DF81C50700703D5606821 +:1017C000FFF739FD90B903E0A00100200302FF01FB +:1017D000FE4F4FF0010997F8220058B197F8230007 +:1017E000022807D16068FFF773FD18B1102010B010 +:1017F000BDE8F087300702D5A089802815D870078A +:1018000004D4B8F1000F01D0387E70B1E07DC0F390 +:1018100000108DF81B00617D072041B1012906D021 +:101820000229E4D00429E2D117E00720DFE78DF890 +:1018300017908DF819908DF81580606878B107A918 +:10184000FFF7FBFE0028D2D1606850F8011FCDF8E9 +:101850000F108088ADF8130005E00620C7E7CDF82B +:101860000F50ADF81350E07B0028F6D1207C002803 +:10187000F3D1607C0028F0D1A07C0028EDD1E07C81 +:10188000C006EAD18DF800A0BDF83400ADF8020022 +:10189000A0680190A0680290CDA0D0E90010CDE929 +:1018A0000A10E07C0AA901EB501000788DF80C00BA +:1018B000FFF7E6FE8DF80D009DF81C008DF80E0078 +:1018C0008DF818508DF816508DF81A5009A96846F1 +:1018D0000DF02CFA06F018FA89E7F0B58FB0002465 +:1018E0008DF830408DF814408DF8344006468DF860 +:1018F0002840019402940394049419B10FC901ADD6 +:1019000085E80F00B14DA878052801D004280CD136 +:1019100001986968884200D120B90398E968884233 +:1019200003D110B108200FB0F0BD1F273B460DAA10 +:1019300005A903A8FFF70DFE0028F4D13B460AAA2B +:101940000CA901A8FFF705FE0028ECD19DF81400B2 +:10195000C00701D00A20E6E7A88A410708D4A97D7C +:1019600031B19DF82810890702D043F20120DAE74F +:101970009DF82810C90709D0400707D4288818B156 +:1019800044F25061884201D90720CCE78DF8184015 +:101990008DF81960BDF80800ADF81A00019807909D +:1019A00006A80DF0CEF906F0AFF90028BBD18DF8EE +:1019B00020408DF82160BDF81000ADF8220003989A +:1019C000099008A80DF0DFF906F09EF90028AAD1C9 +:1019D00001AC2D1D94E80F0085E80F000020A2E760 +:1019E00070B50646FFF7AAFE054606F06FFB040039 +:1019F00000D1FFDF6680207820F00F00801C20F0EF +:101A0000F000203020700320207295F83E006072B4 +:101A1000BDE8704006F05EBB2DE9F04385B00400E0 +:101A200000D1FFDF2078694E20F00F00801C20F0ED +:101A3000F0007030207060680178C91F14292AD224 +:101A4000DFE801F04DF3290AF3F33AF2292966F2AF +:101A5000F2F129F2F2F0EFF286883046FFF76EFEDF +:101A60000546304608F0BDF8C0B16068807985F859 +:101A70003E0021212846FFF7D0FC304603F0FAF95A +:101A8000304604F0ADFB3146012012F047F9A87F43 +:101A900020F01000A87705B0BDE8F083207820F092 +:101AA000F00020302070032020726680606880790A +:101AB000607206F00FFBDCE785882846FFF73EFEE4 +:101AC00000B9FFDF60688078012800D0FFDF606820 +:101AD000817905B02846BDE8F04308F04ABA868807 +:101AE0003046FFF72BFE050000D1FFDF06F0F2FACB +:101AF00060683146C08828816068008968816068B4 +:101B00004089A881012012F009F90020A875C2E7D8 +:101B1000807828B10228BED03C28BCD0FFDFBAE7CD +:101B200006F0D8FA6568A879AD1C00B9FFDFF77830 +:101B3000B5F80290B046384606F05FF8060000D1CE +:101B4000FFDF0022022148460EF0AFFA040000D168 +:101B5000FFDF22212046FFF760FCA17F012060F318 +:101B60000101A177298B2181698B6181A98BA181D9 +:101B700084F822708DF80800B0680090F068019039 +:101B80006A46032148460EF090FA00B9FFDFB0889C +:101B9000ADF81000B0788DF8120004AA052148466F +:101BA0000EF083FA00B9FFDFB088ADF80C00F078D2 +:101BB0008DF80E0003AA042148460EF076FA00B90B +:101BC000FFDF062105F1120006E00000A001002061 +:101BD000070605040302010000F04DFF30B36879E9 +:101BE000800700D5FFDF6979E07D61F34700E0758C +:101BF000D5F80600A0616889A083062105F10C00D4 +:101C000000F039FFE0B198F819104A08617862F3E2 +:101C100047016170D8F81A10C4F80210B8F81E0015 +:101C200017E028E020E033E02DE017E0E07D20F031 +:101C3000FE00801CE075D5F81200A061E88ADBE7A1 +:101C4000607820F0FE00801C6070E868C4F8020034 +:101C5000288AE0800320FFF7B7FB1CE705B0204689 +:101C6000BDE8F04301F092BC06F034FA16F8240FF8 +:101C700040F0020005E006F02DFA16F8240F40F0BF +:101C80000400307007E705B0BDE8F04306F022BA63 +:101C9000B178052909D00429DFD106F01BFA02200A +:101CA00005B0BDE8F043FFF78FBB80780028D4D0A3 +:101CB000F07800F0AAFE06F00DFA0320F0E72DE917 +:101CC000F047054600780027000991460C463E463D +:101CD000012871D0022870D007280AD00A286DD0B8 +:101CE000FFDF00BFA9F800600CB1278066800020EC +:101CF0007EE5D5F804C0DFF8448804F108009CF8BC +:101D000000204FF0010AD21F4FF6FF71142A76D23D +:101D1000DFE802F00AF9F9F9F9F9F91DF9F926C035 +:101D2000889DF91061D476EE12271026BCF80400C5 +:101D30002146F3E01C270A26ECB3BCF80200A08081 +:101D4000686800792072686840796072CAE71B276A +:101D5000092684B30320207268684088A080C1E708 +:101D60009CF802103C29BDD010272C260CF1020C47 +:101D70000CB3BCF80210A180BCF818106182BCF84A +:101D800018102182BCF81A10A182BCF81C10E18244 +:101D90009CF8053002460CF106011846FFF7A9FC35 +:101DA0009CF8040001289DD184F80FA00020207623 +:101DB00008F1040003E00BE0A8E0B2E0EAE090E8FC +:101DC0000E00D8F81000C4E90930C4E9071289E709 +:101DD000A9F800608BE720271126002CF8D0A180FD +:101DE000686804F10A02807820726868807A6072FC +:101DF00069680B1DC8781946FFF77BFC72E782E023 +:101E000021270A26002CE3D0BCF80200A0806868D5 +:101E10000079207268684079607298F8241021F087 +:101E2000040162E022270B26002CD1D0BCF804006C +:101E3000A0806868807820726868807900F02AFE47 +:101E400060726868C07900F025FEA0724AE7262714 +:101E50001C26002CBCD0A1806868C07860726868BD +:101E60008079A07208F1040090E80E00D8F8100004 +:101E7000C4E90530C4E90312686880783C2803D0BF +:101E8000432804D0FFDF2DE784F808A02AE70220CA +:101E9000207227E724271026002C99D0BCF80200D6 +:101EA000A0806868007920816868007A608168682D +:101EB000C088A08168684089E08113E72327102645 +:101EC000002C85D0BCF80200A08068688088208142 +:101ED0006868C088608168680089A08168684089F6 +:101EE000E08198F8241021F0020188F82410F9E626 +:101EF0002F272A26002C86D0A18069682222891CDF +:101F00000BF017FAEEE64A46214644E0287A02280A +:101F100001D0FFDFE6E612271026688800F098FD62 +:101F2000E0E6287AB0B3012835D0022833D0032860 +:101F300001D0FFDFD6E611270926002C8AD0B5F89C +:101F400002804046FFF7FAFB90F822A0A4F8048034 +:101F5000687A2072042140460EF0C2F805214046FE +:101F60000EF0BEF8002140460EF0BAF801214046BE +:101F70000EF0B6F8032140460EF0B2F802214046BA +:101F80000EF0AEF8062140460EF0AAF8504600F0DA +:101F90003CFDA7E6FFE72846BDE8F04701F02CBC72 +:101FA00070B5012801D0FFDF70BD8DB22846FFF764 +:101FB000C5FB040000D1FFDF20782128F4D006F013 +:101FC00085F880B1017821F00F01891C21F0F00122 +:101FD000103101700221017245800020A075BDE81A +:101FE000704006F077B821462846BDE870401322BD +:101FF000FFF7A7BB2DE9F04116460C00804600D143 +:10200000FFDF307820F00F00801C20F0F00010304F +:1020100030702078022802D0FFDFBDE8F081404612 +:10202000FFF78CFB050000D1FFDFA1884FF6FF70A2 +:102030000027814202D1E288824203D0814201D14D +:10204000E08840B106F046F894E80F00083686E8CC +:102050000F00AF75E1E7A87D0128DED178230022CB +:10206000414611F0B1FD0220A875D6E738B5054606 +:102070000C460846FFF7DFF8A8B9242D31D006DC5E +:10208000202D0AD0212D0AD0222D04D124E0252D87 +:102090001BD03F2D2DD0072038BD062038BD6068ED +:1020A000FFF70DF908B1102038BD618820886A4615 +:1020B0000CF0E1FF05F028FE0028F5D16168002949 +:1020C000F2D0BDF800200A8038BDA07800F00101F0 +:1020D00020880DF001F808E02068BDE8384001F0E4 +:1020E000C0BD618820880CF05FFFBDE8384005F076 +:1020F0000BBE207800F001008DF8000068460CF05F +:10210000BDFD05F001FE38BD70B505460C4608461C +:10211000FFF7B7F808B1102070BD202D07D0212D92 +:102120000DD0222D0BD0252D09D0072070BD208881 +:10213000A11C0CF03CFDBDE8704005F0E5BD06209B +:1021400070BDFE481930704708B528220021FB48B1 +:102150000BF019F90120FFF737F9F84968461A31F1 +:1021600005F04AFFF5489DF80020417E62F34701E3 +:1021700021F001014176002180F822104FF46171B5 +:102180000184022180F82310FFF736F900B1FFDF48 +:1021900000F0AEFC01F0CCF908BD10B50C464022B1 +:1021A000002120460BF0EFF8A07F20F00300A0777D +:1021B000202020700020A07584F8230010BD7047F7 +:1021C0002DE9FC410746FFF736F810B11020BDE8B5 +:1021D000FC81DA4E06F11901D6F819000090B6F824 +:1021E0001D50ADF80450F47F8DF806403846FFF7D7 +:1021F00069FA0028EBD1FFF7FFF80028E7D0009933 +:1022000046F8191FB580B471E1E710B50446FFF731 +:1022100038F808B1102010BDC848C8492246407E91 +:102220001A314008FFF765FA002010BD3EB504469C +:102230000D460846FFF725F808B110203EBD14B141 +:1022400043F204003EBDBD488078052803D0042831 +:1022500001D008203EBD694602A80BF01AFB2A46B1 +:1022600069469DF80800FFF744FA00203EBDFEB520 +:102270000D4604004FF0000711D00822FFF74DF97A +:10228000002811D1002608E054F826006946FFF71F +:10229000D4F9002808D1761CF6B2AE42F4D30CF083 +:1022A00037FB10B143F20320FEBDA44E3776FCB1DC +:1022B00000271AE054F8270002A9FFF7BEF900B181 +:1022C000FFDF9DF808008DF8000054F8270050F853 +:1022D000011FCDF801108088ADF8050068460CF0AC +:1022E0003CFB00B1FFDF7F1CFFB2AF42E2D335768B +:1022F0000020FEBD2DE9F0478AB01546894604004E +:102300001DD00F4608222946FFF707F9002810D1F3 +:10231000002612E054F826006946103000F08EFBCB +:10232000002806D13FB157F82600FEF784FF10B110 +:1023300010200AB0DCE4761CF6B2AE42EAD30026E6 +:10234000A5F101081CE000BF06F1010A0AF0FF0731 +:1023500012E000BF54F82600017C4A0854F8271008 +:102360000B7CB2EB530F05D10622113011310AF06C +:10237000B3FF58B17F1CFFB2AF42EBD30AF0FF06A8 +:102380004645E1DB4E4624B1012003E043F205203F +:10239000CFE700200CF000FB10B90CF009FB10B1E6 +:1023A00043F20420C5E75CB300270DF1170825E0D0 +:1023B00054F827006946103000F040FB00B1FFDF01 +:1023C00054F82700102250F8111FCDF80110808812 +:1023D000ADF8050054F827100DF107000AF0A9FF29 +:1023E00096B156F82710102240460AF0A2FF684620 +:1023F0000CF098FA00B1FFDF7F1CFFB2AF42D7D3D9 +:10240000FFF7B7F9002094E7404601F01EFCEEE725 +:1024100030B585B00446FEF70EFF18B96068FEF7C8 +:1024200057FF10B1102005B030BD60884AF2B811D6 +:10243000884206D82078414D28B1012806D00228CC +:1024400004D00720EFE7FEF7D7FF18E060780228F6 +:1024500004D0032802D043F20220E4E785F82300E9 +:10246000C1B200200090ADF8040002292CD003294D +:1024700027D0FFDF68460CF00CFB05F045FC002878 +:10248000D1D1606801F0D4FB207858B101208DF8DB +:1024900000000DF1010001F0D8FB68460CF075FE5C +:1024A00000B1FFDF207885F82200FFF762F960882D +:1024B00060B1288480B20CF067FA00B1FFDF002021 +:1024C000B1E78DF80500D5E74020FAE74FF46170D9 +:1024D000EFE710B50446FEF7D4FE20B9606838B1C6 +:1024E000FEF7EDFE08B1102010BD606801F0ADFBF5 +:1024F000124830F8201F6180C178617080782070A8 +:10250000002010BD2DE9F843144689460646FEF723 +:10251000B8FEB8B94846FEF7DBFE98B92046FEF78C +:10252000D7FE78B9054DA878012800D154B131788B +:10253000FF2909D061B143F2040001E0A0010020AD +:10254000BDE8F8831020F8E7012801D00420F4E763 +:10255000CCB3052811D004280FD06946204600F0DE +:10256000A4FA0028E9D1217D49B1012909D0022925 +:1025700009D0032909D00720DFE70820DDE702465C +:1025800004E0012202E0022200E00322804623460A +:10259000174600200099FFF705F90028CDD1A08942 +:1025A0002880A07BE875BDF80000A882AF75BDF853 +:1025B0000010090701D5A18931B1A1892980C0077F +:1025C00004D0032003E006E08021F7E70220FEF7B5 +:1025D000FBFE86F800804946BDE8F8430020FFF77F +:1025E0007CB92DE9FC41FF4C06460D46A078022837 +:1025F00003D0032801D00820E9E516B143F2040016 +:10260000E5E506200DF00EFD10B9A078032849D0AD +:102610000FF07CFC074610F0DBFE381A00F0FF08D4 +:1026200006200DF0F7FC074606200DF0FBFC391ADA +:10263000A078042809D000221144A8EB010111F070 +:10264000FF0F04D0032804D00DE00122F4E713208B +:10265000BDE5284605F0D1FA10B3407810B32846FE +:1026600005F0D6FDE570FFF70BF80BF054F80120EC +:102670008DF800008DF801008DF802602088ADF81B +:102680000400E07D8DF8060068460CF050FC05F073 +:102690003BFB0028B0D1A078032805D0042010E02F +:1026A000052094E5122092E5E07805F0A6FA0400F2 +:1026B00000D1FFDF607800B9FFDF6078401E6070F6 +:1026C0000520FEF781FE002081E51CB510B143F224 +:1026D00004001CBDC34CA078042803D0052801D0F9 +:1026E00008201CBD00208DF8000001218DF801108C +:1026F0008DF8020068460CF01AFC05F005FB002876 +:10270000EFD1A078052805D05FF00200FEF75CFE4F +:1027100000201CBDE07800F078F90320F6E72DE9F1 +:10272000FC4180460D4603260846FEF7D1FD08B160 +:1027300010204CE54046FFF701F8040004D0207853 +:10274000222804D2082042E543F202003FE5A07FA0 +:1027500000F003073DB1012F0AD000202946FEF703 +:10276000AEFE0600E5D1012F04D0FFDF30462EE596 +:102770000120F3E7A07D2946022801D011B107E02E +:10278000112024E5684600F0E7FA0028D1D1694617 +:10279000404607F0CEFB0600E8D10120A075E5E732 +:1027A00070B50C460546FEF7C9FF010005D022466C +:1027B0002846BDE87040FEF7C4BF43F2020070BD7A +:1027C00010B5012807D1874B9B78012B00D011B1A0 +:1027D00043F2040010BD0CF009F9BDE8104005F00B +:1027E00093BA012300F01BB900231A46194600F0E2 +:1027F00016B970B5064615460C460846FEF741FD6B +:1028000018B92846FEF73DFD08B1102070BD2A46D4 +:10281000214630460CF017FC05F076FA0028F5D179 +:1028200021787F29F2D1052070BD7CB505460C4684 +:102830000846FEF700FD08B110207CBD2846FEF7D3 +:102840007DFF20B10078222804D208207CBD43F20D +:1028500002007CBD634890F82400400701D5112098 +:102860007CBD2178C80802D16078C20801D0072059 +:102870007CBD890801D1800801D006207CBDADF85F +:10288000005020788DF8020060788DF80300022057 +:10289000ADF8040068460BF00FFF05F035FA7CBD7B +:1028A00070B586B014460D460646FEF747FF28B1C0 +:1028B0000078222805D2082006B070BD43F202003D +:1028C000FAE72846FEF704FD20B944B12046FEF79A +:1028D000F6FC08B11020EFE700202060A0804148FE +:1028E00090F82400800701D51120E5E703A93046C0 +:1028F0000BF01FFF18B100BF05F006FADCE7ADF8DA +:102900000060BDF81400ADF80200BDF81600ADF887 +:102910000400BDF81000BDF81210ADF80600ADF8C7 +:1029200008107DB1298809B1ADF80610698809B190 +:10293000ADF80210A98809B1ADF80810E98809B10D +:10294000ADF80410DCB1BDF80610814201D9081AB7 +:102950002080BDF80210BDF81400814201D9081A88 +:102960006080BDF80800BDF80410BDF816200144D1 +:10297000BDF812001044814201D9081AA0806846AF +:102980000BF074FFB8E770B505460C460846FEF735 +:1029900078FC08B1102070BD214628460CF04AF999 +:1029A000BDE8704005F0B0B93EB505460C46084696 +:1029B000FEF767FC08B110203EBD0020009001909A +:1029C0000290ADF800502089ADF8080020788DF80D +:1029D0000200606801902089ADF808006089ADF8B8 +:1029E0000A0001E0A001002068460CF031F905F072 +:1029F0008BF93EBD0EB5ADF8000000200190684691 +:102A00000CF026F905F080F90EBD10B505F0F5F8CB +:102A1000040000D1FFDF6078401C607010BD1CB561 +:102A2000ADF800008DF802308DF803108DF8042009 +:102A300068460CF0D7FA05F067F91CBD0278520819 +:102A400004D0012A02D043F202207047FEF7F5BD00 +:102A500070B50C0006460DD0FEF770FE050000D1E3 +:102A6000FFDFA68028892081288960816889A0816C +:102A7000A889E08170BD10B500231A4603E0845C8C +:102A80002343521CD2B28A42F9D30BB1002010BDAD +:102A9000012010BD00B530B1012803D0022801D0BB +:102AA000FFDF002000BDFF2000BD00220A8092B29F +:102AB00022F060020A800078062817D2DFE800F0D2 +:102AC000160306090C1142F0110007E042F01D0048 +:102AD00009E042F0150006E042F0100040F002006C +:102AE00001E042F010000880002070470720704786 +:102AF000FD48002101604160018170472DE9FF4FD1 +:102B000093B09B46209F160004460DD01046FEF75A +:102B100092FB18B1102017B0BDE8F08F31460120AC +:102B2000FEF7CDFC0028F6D101258DF842504FF478 +:102B3000C050ADF84000002210A9284603F016FE50 +:102B40000028E8D18DF84250A8464FF428500025BF +:102B5000ADF840001C222946684607950AF013FC90 +:102B60009DF81C000DF11C0A20F00F00401C20F005 +:102B7000F00010308DF81C0020788DF81D00617871 +:102B80009DF81E000DF1400961F3420040F0010084 +:102B90008DF81E009DF8000008AA40F002008DF894 +:102BA00000002089ADF83000ADF832506089ADF8F2 +:102BB0003400CDF82CA060680E900AA9CDF82890BA +:102BC000684603F0C8FB0028A5D16068FEF777FBD4 +:102BD00040B16068FEF77CFB20B9607800F003002C +:102BE000022801D0012000E00020BF4C08AA0AA959 +:102BF0002072BDF8200020808DF8428042F601202E +:102C0000ADF840009DF81E0020F00600801C20F06A +:102C100001008DF81E000220ADF83000ADF8340040 +:102C200014A80E90684603F096FB002889D1BDF8E1 +:102C30002000608036B1211D304600F059F900288F +:102C4000C2D109E0BBF1000F05D00AF017F9E8BBCB +:102C50000AF014F9D0BBA58017B1012F43D04AE088 +:102C60008DF8428042F6A620ADF8400046461C2270 +:102C70000021684607950AF086FB9DF81C00ADF818 +:102C8000346020F00F00401C20F0F00010308DF870 +:102C90001C009DF81D0020F0FF008DF81D009DF820 +:102CA0001E0020F0060040F00100801C8DF81E0080 +:102CB0009DF800008DF8446040F002008DF800009F +:102CC000CDE90A9AADF8306011A800E011E00E904D +:102CD00008AA0AA9684603F03EFB0028A6D1BDF861 +:102CE0002000E08008E00AF0C9F810B90AF0C6F840 +:102CF00008B103200FE7E58000200CE73EB504464D +:102D0000794D0820ADF80000A88828B12046FEF7CC +:102D100092FA18B110203EBD06203EBD214601208A +:102D2000FEF7CDFB0028F8D12088ADF804006088BC +:102D3000ADF80600A088ADF80800E088ADF80A00FC +:102D4000A88801AB6A46002103F00CFFBDF8001013 +:102D50000829E2D003203EBD7FB5634D0446A88814 +:102D600068B1002002900820ADF80800CDF80CD022 +:102D70002046FEF760FA20B1102004B070BD062096 +:102D8000FBE7A98802AA4FF6FF7004F02DF900288E +:102D9000F3D1BDF80810082901D00320EDE7BDF8F4 +:102DA00000102180BDF802106180BDF80410A180E0 +:102DB000BDF80610E180E0E701B582B00220ADF871 +:102DC0000000494802AB6A464088002103F0CAFE71 +:102DD000BDF80010022900D003200EBD1CB5002153 +:102DE00000910221ADF800100190FEF74AFA08B1F7 +:102DF00010201CBD3C486A4641884FF6FF7004F025 +:102E0000F3F8BDF800100229F3D003201CBDFEB575 +:102E1000354C06461546207A0F46C00705D00846B1 +:102E2000FEF709FA18B11020FEBD0F20FEBDF82DE7 +:102E300001D90C20FEBD3046FEF7FDF918BB2088F5 +:102E400001A902F08AFF0028F4D130788DF805003E +:102E5000208801A903F064FE0028EBD100909DF8C2 +:102E600000009DF8051040F002008DF800000907F1 +:102E700003D040F008008DF800002088694603F078 +:102E8000ECFD0028D6D1ADF8085020883B4602AAB8 +:102E9000002103F067FEBDF80810A942CAD0032044 +:102EA000FEBD7CB505460020009001900888ADF875 +:102EB00000000C4628460195FEF701FA18B9204695 +:102EC000FEF7DFF908B110207CBD15B1BDF8000098 +:102ED00060B105486A4601884FF6FF7004F084F837 +:102EE000BDF8001021807CBDC80100200C20FAE74D +:102EF00030B5044693B000200D46014600901422E0 +:102F000001A80AF040FA1C22002108A80AF03BFAA6 +:102F10009DF80000CDF808D020F00F00401C20F0F4 +:102F2000F00010308DF800009DF8010006AA20F096 +:102F3000FF008DF801009DF8200001A940F002007B +:102F40008DF8200001208DF8460042F60420ADF8EF +:102F5000440011A801902088ADF83C006088ADF8CD +:102F60003E00A088ADF84000E088ADF842009DF832 +:102F7000020020F00600801C20F001008DF8020005 +:102F80000820ADF80C00ADF810000FA8059008A8B7 +:102F900003F0E1F9002803D1BDF8180028800020D3 +:102FA00013B030BD0A4810B5046809490948083112 +:102FB00008600FF0BEFE0648001D046010BD064903 +:102FC000002008604FF0E0210220C1F88002704725 +:102FD0001005024001000001FC1F00400548064AA0 +:102FE0000168914201D1002101600449012008607B +:102FF0007047000058000020BEBAFECA40E50140FC +:103000002CFFFFFFDBE5B15100C00100CC00FFFF4A +:1030100071000000C1CF6A00FEA0D9111C1006C3C8 +:1030200089CCFC7A7B3B49141906A8C010B504462C +:10303000FEF701F908B1102010BD2078C0F302108E +:10304000042807D86078072804D3A178102901D86C +:10305000814201D2072010BDE078410706D42179D2 +:103060004A0703D4000701D4080701D5062010BD84 +:10307000002010BD70B514460D46064605F026F832 +:1030800080B10178182221F00F01891C21F0F00194 +:10309000A03100F8081B21460AF04BF9BDE870404A +:1030A00005F018B829463046BDE870401322FEF7F7 +:1030B00048BB2DE9F047064608A8904690E8300442 +:1030C00089461F461422002128460AF05CF9002197 +:1030D000CAF80010B8F1000F03D0B9F1000F03D106 +:1030E00014E03878C00711D02068FEF7CAF8C0BBDA +:1030F000B8F1000F07D12068123028602068143022 +:1031000068602068A8602168CAF8001038788007D5 +:1031100024D56068FEF7D3F818BBB9F1000F21D0B1 +:10312000FFF70FF80168C6F868118188A6F86C11DE +:10313000807986F86E0101F034FAF84FEF6062682A +:1031400062B196F8680106F2691140081032FEF784 +:10315000D0FA1022394660680AF0EBF80020BDE88A +:10316000F08706E0606820B1E8606068C6F8640136 +:10317000F4E71020F3E730B5054608780C4620F058 +:103180000F00401C20F0F001103121700020607011 +:1031900095F8230030B104280FD0052811D0062857 +:1031A00014D0FFDF20780121B1EB101F04D295F875 +:1031B000200000F01F00607030BD21F0F0002030D2 +:1031C00002E021F0F00030302070EBE721F0F00059 +:1031D0004030F9E7F0B591B0022715460C46064697 +:1031E0003A46ADF80870092103AB05F070FD049074 +:1031F000002810D004208DF804008DF80170E03410 +:10320000099605948DF818500AA968460EF051FCED +:1032100000B1FFDF012011B0F0BD2DE9F84F0646E7 +:10322000808A0C4680B28246FEF788FA0546BB4F7C +:103230003078203F4FF002094FF000080F287CD271 +:10324000DFE800F07BA39D082C5B6A7CBADAFD976F +:1032500048979700012150460CF030FF040000D140 +:10326000FFDF97F85C00C00701D0386E0BE0032148 +:1032700004F11D0010F06BFAD4F81D00A849B0FB52 +:10328000F1F201FB1200C4F81D0070686067B068BD +:10329000A0672878252872D0FFDF70E00121504612 +:1032A0000CF00CFF060000D1FFDF3078810702D55B +:1032B0002978252904D040F001003070BDE8F88F4E +:1032C00084F80090307F207106F11D002D36C4E98E +:1032D0000206F3E7012150460CF0F0FE050000D194 +:1032E000FFDF2878C10604D5072020703D356560D2 +:1032F000E4E740F008002870E0E7E87F000700D529 +:10330000FFDF307CB28800F0010301B05046BDE819 +:10331000F04F092106F06FBD05B9FFDF716821B1DB +:10332000102205F124000AF004F828212846FEF7AF +:1033300074F8307A85F82000C0E7F7E001215046A4 +:103340000CF0BCFE050000D1FFDF022105F1850075 +:1033500010F0FDF90420207005F5B4706060B5F838 +:10336000850020826D4810387C356561C4E90270A3 +:10337000A4E7012150460CF0A1FE00B9FFDF324660 +:1033800029465046BDE8F84F74E605B9FFDF2878B6 +:10339000212893D93079012803D1E87F40F0080033 +:1033A000E877324629465046FFF764FE2846BDE8D6 +:1033B000F84F2321FEF731B83279A28004F10803D7 +:1033C0000921504605F083FCE06010B10520207013 +:1033D00074E74546012150460CF070FE040000D110 +:1033E000FFDF04F1620102231022081F0CF0FFFC32 +:1033F00005703179417061E7012150460CF05EFEA5 +:10340000040000D1FFDF94F8840000F003000128DD +:1034100059D1E87F10F0010003D194F8A010C9073A +:103420002AD0D4F8602132B394F88330117C63F34E +:1034300087011174AA7FD30963F3410100E071E0B1 +:10344000D4F860211174D4F8602160F30001117484 +:1034500090B1D4F86001102205F12401883409F0FC +:1034600068FF207E40F001002076207820F00100E7 +:1034700004F8880919E0C0B994F88810C90714D075 +:10348000D4F85C218AB194F88330117C63F387010E +:103490001174AA7FD309D4F85C2163F3410111743C +:1034A000D4F85C2160F30001117494F8880080075F +:1034B00009D594F87C00D4F86421400804F17D011A +:1034C0001032FEF716F98DF8009094F884006A46E1 +:1034D00000F003008DF8010094F888108DF80210B8 +:1034E00094F8A0008DF803002946504601F042F8F8 +:1034F0002878252805D0212807D0FFDF2878222822 +:1035000003D922212846FDF788FF012150460CF0FF +:10351000E7FD00283FF4DDAEFFDFCFE6F401002039 +:1035200040420F00716881F80180C7E6FFDFC5E601 +:1035300070B5FE4C002584F85C5025660EF085FAC7 +:1035400004F11001204604F07DFD84F8305070BD78 +:1035500070B50D46FEF7F2F8040000D1FFDF4FF41E +:10356000B8720021284609F00EFF2434012105F12C +:10357000E0002C610EF06AFA002800D0FFDF70BD79 +:103580000A46014602F1E0000EF081BA70B5054628 +:10359000406886B00178082906D00B2933D00C2961 +:1035A0002FD0FFDF06B070BD46883046FEF7C6F864 +:1035B000040000D1FFDF20782128F3D028281BD178 +:1035C000686802210C3000F0A0FFA8B168680821EB +:1035D000001D00F09AFF78B104F1240130460BF091 +:1035E000A8FC04F091FB00B1FFDF06B02046BDE867 +:1035F00070402921FDF711BF06B0BDE8704004F00E +:1036000069BD01218171686886883046FEF796F8A9 +:10361000040000D1FFDF20782128C3D068688179B9 +:1036200009B1807808B1FFDFBCE704F053FDA07F4B +:10363000000622D5E07FC00705D094F8200000F0F6 +:103640001F00102817D0052084F82300207829288F +:1036500015D02428A6D13146042010F05FFB22218A +:103660002046FDF7DAFE012130460CF039FD002836 +:1036700098D0FFDF96E70620E6E70420E4E7012183 +:1036800030460CF01BFD050000D1FFDF2521204650 +:10369000FDF7C3FE03208DF80000694605F1E00048 +:1036A0000EF0ECF90228BFD00028BDD0FFDF79E78B +:1036B0002DE9F04788B09A46164688468146FEF7BF +:1036C0003DF805003AD02878222837D3232835D072 +:1036D000E87F000732D40027012148460CF0EEFCB9 +:1036E000040005D10121002248460CF0DEFC04460E +:1036F000694600F066FF009800B9FFDF00983CB112 +:10370000E03404612878222804D0242802D005E07F +:10371000076103E025212846FDF77FFE009801217F +:103720004170C0F824908680C0E9028A01A90EF099 +:10373000C0F9022802D0002800D0FFDF08B00EE553 +:1037400070B586B00546FDF7F9FF0078222814D938 +:10375000012128460CF0B2FC04002CD1FFDF2AE046 +:10376000B4F85E0004F1620630440178427829B171 +:1037700021462846FFF72EFDB0B913E7ADF8042027 +:103780000921284602AB05F0A2FA03900028F4D0E4 +:1037900005208DF80000694604F1E0000EF06EF996 +:1037A000022801D000B1FFDF02231022314604F1CC +:1037B0005E000CF052FBB4F860000028D0D1F1E6B6 +:1037C00010B586B00446FDF7B9FF0078222811D95C +:1037D000012120460CF072FC040000D1FFDF06201E +:1037E0008DF80000694604F1E0000EF047F900286A +:1037F00000D0FFDF06B010BD2DE9F84F0546007878 +:103800000C460027010904F1080090463E46BA46DE +:10381000009002297ED0072902D00A2909D142E06E +:1038200068680178082905D00B292CD00C292AD0EA +:10383000FFDF72E114271C26002C6CD04088A0808A +:10384000FDF77CFF5FEA000900D1FFDF99F8170060 +:1038500009F118014008009AFDF74BFF686880895C +:10386000208268684168C4F812108068C4F81600A5 +:10387000A07E20F0060040F00100A07699F81E001E +:1038800040F020014FE01A270A26002CD5D080886E +:10389000A080FDF753FF050000D1FFDF2846009907 +:1038A000FFF769FC39E10CB1A88BA080287A4FF0B2 +:1038B000010B0B287ED006DC01287CD0022808D022 +:1038C000032804D137E00D2876D00E2875D0FFDF0D +:1038D00023E11E270926002CAFD0A088FDF72EFF7C +:1038E0005FEA000900D1FFDF287B00F00300012818 +:1038F000207A1DD020F001002072297B890861F315 +:1039000041002072297BC90861F382002072297B63 +:10391000090901E0F7E0AEE061F3C300207299F815 +:103920001E0040F0400189F81E10F6E0D40100208E +:1039300040F00100E0E713270D26002CA6D0A08858 +:10394000FDF7FCFE81460121A0880CF0B7FB0500C5 +:1039500000D1FFDF686F817801F003010129217A2E +:1039600050D021F00101217283789B0863F341015B +:1039700021728378DB0863F38201217283781B094B +:1039800063F3C3012172037863F306112172437854 +:1039900063F3C711217284F809A0C178A17202797A +:1039A000E17A62F30001E1720279520862F34101A7 +:1039B000E17203E029E067E04EE05FE002799208FF +:1039C00062F38201E1720279D20862F3C301E1720B +:1039D0004279217B62F3000121734279520862F33C +:1039E000410121734279920862F382012173407987 +:1039F000C00860F3C301217399F8000023282AD975 +:103A0000262139E041F00101ADE71827102694B3D3 +:103A1000A088FDF793FE00900121A0880CF04EFBDA +:103A20005FEA000900D1FFDFE868A06099F80000B4 +:103A300040F0040189F8001099F80100800708D5CA +:103A400084F80CB000980078232866D927210098C4 +:103A500052E084F80CA060E015270F265CB1A08826 +:103A6000FDF76CFE81460622E868009909F0E9FC42 +:103A700084F80EB085E042E048463DE0162709266E +:103A8000ECB3287B207248E0287B19270E26B4B3BC +:103A9000C4F808A0A4F80CA0012807D0022808D078 +:103AA00003280CD004280AD0FFDF15E084F808B002 +:103AB00001E002202072607A20F003000BE0697BB5 +:103AC000042801F00F0141F080012172F3D1607AE6 +:103AD00020F00300401C6072A088FDF72FFE054611 +:103AE0000078212819D0232800D0FFDF0121A088E9 +:103AF0000CF0F6FA22212846FDF78FFC0DE0FFE7D7 +:103B0000A8F800600EE00CB16888A080287A10B395 +:103B1000012809D002283AD0FFDFA8F800600CB1D4 +:103B200027806680002007E415270F26002CE7D0A9 +:103B3000A088FDF703FE0121A0880CF0BFFA050064 +:103B400000D1FFDFD5F81D000622009909F079FCAD +:103B500084F80EA0E1E717270926002CD0D0A08812 +:103B6000FDF7ECFD81460121A0880CF0A7FA0500C5 +:103B700000D1FFDF6878800701D5022000E0012036 +:103B8000207299F800002328C7D9272174E7192744 +:103B90000E26002CB4D0A088FDF7D0FD5FEA000906 +:103BA00000D1FFDFC4F808A0A4F80CA084F808A096 +:103BB000A07A40F00300A07299F81E10C90961F3C1 +:103BC0008200A07299F81F2099F81E1012EAD11FE6 +:103BD00005D099F8201001F01F01102925D020F000 +:103BE0000800A07299F81F10607A61F3C300607238 +:103BF000697A01F0030101298FD140F0040060725D +:103C0000E87A217B60F300012173AA7A607B62F37A +:103C100000006073EA7A520862F341012173A97AC5 +:103C2000490861F34100607377E740F00800D8E786 +:103C300010B5F84C30B10146102204F1200009F013 +:103C400078FB012084F8300010BD10B5044600F068 +:103C5000A8FCF04920461022BDE81040203109F0B0 +:103C600068BB70B5EB4D06004FF0000412D0FDF7B5 +:103C7000E2FA08B110240BE00621304609F0C8FB37 +:103C8000411C04D02866012085F85C0000E0072470 +:103C9000204670BD0020F7E7007810F00F0204D036 +:103CA000012A05D0022A0CD110E0000909D10AE04E +:103CB0000009012807D0022805D0032803D00428D2 +:103CC00001D0072070470870002070470620704719 +:103CD00005282AD2DFE800F003070F171F00087835 +:103CE00020F0FF001EE0087820F00F00401C20F0BC +:103CF000F000103016E0087820F00F00401C20F093 +:103D0000F00020300EE0087820F00F00401C20F07A +:103D1000F000303006E0087820F00F00401C20F062 +:103D2000F0004030087000207047072070472DE9F0 +:103D3000F043804687B00D464FF000090846FDF776 +:103D4000C7FAA8B94046FDF7F9FC060003D0307861 +:103D500022280BD104E043F2020007B0BDE8F08353 +:103D600035B1B07FC10601D4000703D50820F4E7C0 +:103D70001020F2E7F07F000701D50D20EDE70027C6 +:103D8000012140460CF09AF9040006D101210022DD +:103D900040460CF08AF9040005D0694600F011FC99 +:103DA000009818B901E00420D7E7FFDF009802214E +:103DB000E0344170C0F82480446107810121017121 +:103DC000297801F00102017E62F3010101762A786F +:103DD000520862F3820101762A78920862F3C301E5 +:103DE00001762A78D20862F3041101762421304644 +:103DF000FDF713FB01A900980DF05BFE022801D02E +:103E000000B1FFDF4846A8E72DE9FF4F0E46824983 +:103E1000904697B09A4607C914AB4FF0000983E863 +:103E200007001798FDF78AFC050006D02878262899 +:103E300006D008201BB0BDE8F08F43F20200F9E77E +:103E400026B94046FFF7F2F80028F3D10121179870 +:103E50000CF034F9040000D1FFDF852E27D007DCF9 +:103E6000EEB1812E1DD0822E1DD0832E08D11CE0F4 +:103E7000862E1ED0882E1ED0892E1ED08A2E1ED0B1 +:103E80000F2020710F281CD004F020F9D8B1012098 +:103E90008DF83400201D0E902079B0B126E100206D +:103EA000EFE70120EDE70220EBE70320E9E705203B +:103EB000E7E70620E5E70820E3E70920E1E70A2035 +:103EC000DFE70720B6E71120B4E798F80000D4E94F +:103ED0001D764208A87F002162F3C710A87798F8E2 +:103EE00000008208E87F62F30000E87798F800009D +:103EF000C209607862F34100607098F8000002091E +:103F0000207862F34710207098F80000C2086078AB +:103F100062F30000607098F80100607198F800008A +:103F200000F00102B07862F30100B070AA7FD209FC +:103F300062F38200B070EA7F62F3C300B07062780F +:103F400062F30410B0702278C0F3C00052093270DE +:103F50006278C2F34002727098F80220F2707171B8 +:103F60003171B978C1F3C00108405FEA000B2ED06F +:103F70005046FDF760F978BBDAF80C00FDF75BF905 +:103F800050BBDAF81C00FDF756F928BBDAF80C0034 +:103F9000A060DAF81C00E06060787A7842EA5001AC +:103FA00061F341006070B978C0B200EA111161F3A9 +:103FB000000060700020207705F117006061681C28 +:103FC000A061B07800F00300012806D046E06078D8 +:103FD0007A7802EA5001E3E719E0B87800F00300CC +:103FE00001283BD1321D711D404600F099FA31790C +:103FF000387901408DF8281070797A7910408DF861 +:10400000300001432AD05046FDF715F930B1102099 +:1040100010E70000D4010020E8B001000AF1100010 +:1040200004F5AE7304F18C028DE80D0000210AAB9B +:104030005A462046FFF73DF80028E9D104F5B07252 +:1040400004F1A403CDF800A0CDE9013201210CABAD +:104050005A462046FFF72DF80028D9D1607880070E +:1040600022D4B078B978C0F38000C1F3800108434E +:104070001AD0307814AA397832F810204B00DA4080 +:1040800002F00309B9F1030F01D14FF00209BBF1AE +:10409000000F09D0012801D0042805D1012901D041 +:1040A000042901D14FF00409A87F40F08000A877CF +:1040B000E97F6BF30001E9776078800706D503207C +:1040C000A071BBF1000F11D100202CE00220B9F14A +:1040D000020F1AD0B9F1010F19D0B9F1040F2AD08B +:1040E0000020A071A87F20F08000A8772521284615 +:1040F000FDF793F90DA904F1E0000DF0BFFC10B13C +:10410000022800D0FFDF002094E6A071DCE7A07158 +:104110000D22002104F1200009F035F9207840F04B +:104120000200207001208DF84C0013AA2946179830 +:1041300000F020FADAE70120A071D7E72DE9F0437B +:1041400087B09046894604460025FDF7F7FA070038 +:1041500004D03878272804D00820FEE543F2020076 +:10416000FBE5012120460BF0A9FF040000D1FFDF91 +:10417000A6795FEA090005D0012821D0B9F1020F24 +:1041800026D110E0B8F1000F22D1012E05D0022E69 +:1041900005D0032E05D0FFDF2EE00C252CE00125F5 +:1041A0002AE0022528E04046FDF745F8B0B9032E85 +:1041B0000ED11022414604F11D0009F0BAF81BE0AF +:1041C000012E02D0022E03D104E0B8F1000F13D06B +:1041D0000720C2E54046FDF72EF808B11020BCE5E7 +:1041E0001022002104F11D0009F0CDF806214046FF +:1041F00009F00EF9C4F81D002078252140F00200D6 +:1042000020703846FDF709F92078C10713D020F057 +:104210000100207002208DF8000004F11D000290C2 +:104220008DF804506946C3300DF028FC022803D0F5 +:1042300010B1FFDF00E0257700208EE530B587B0B4 +:104240000D460446FDF77AFA60B1012120460BF0D5 +:1042500035FF04000CD02846FCF7EDFF28B11020F4 +:1042600007B030BD43F20200FAE72078400701D4DE +:104270000820F5E7294604F13D002022054609F013 +:1042800058F8207840F01000207001070FD520F07A +:104290000800207007208DF80000694604F1E00056 +:1042A00001950DF0EBFB022801D000B1FFDF0020EB +:1042B000D6E770B50D460646FDF740FA18B100780E +:1042C000272817D102E043F2020070BD01213046D9 +:1042D0000BF0F4FE040000D1FFDFA079022809D121 +:1042E0006078C00706D02A4621463046FEF772FFA6 +:1042F00010B10FE0082070BDB4F860000E280BD29A +:1043000004F1620102231022081F0BF070FD01214D +:1043100001704570002070BD112070BD70B506465B +:1043200014460D460846FCF786FF18B92046FCF7F0 +:10433000A8FF08B1102070BDA6F57F40FF380ED051 +:104340003046FDF7FBF938B1417822464B08811C15 +:104350001846FDF7CEF907E043F2020070BD204693 +:10436000FDF753FF0028F9D11021E01D0FF0EFF900 +:10437000E21D294604F1170000F033F9002070BD5A +:104380002DE9F04104468AB015460E46002708463E +:10439000FCF79EFF18B92846FCF79AFF18B11020C9 +:1043A0000AB0BDE8F0812046FDF7C8F95FEA0008D1 +:1043B00004D098F80000272810D102E043F2020050 +:1043C000EEE7012120460BF079FE040000D1FFDF6B +:1043D0002078400702D56078800701D40820DFE705 +:1043E000D4E91D01497801B18DB1407800B176B1B1 +:1043F000ADB1EA1D06A8E16800F0F3F8102206A9A5 +:1044000005F1170008F068FF18B1042707E007203E +:10441000C6E71022E91D04F12D0008F08AFF2EB135 +:104420001022F11D04F11D0008F083FF20782521E2 +:1044300040F0020020704046FCF7EFFF2078C107F3 +:1044400015D020F00100207002208DF8000004F14A +:104450001D000290103003908DF804706946B3304F +:104460000DF00CFB022803D010B1FFDF00E027772E +:10447000002095E770B50D4606460BB1072070BDCC +:10448000FDF75CF9040007D02078222802D3A07F32 +:10449000800604D4082070BD43F2020070BDADB1A7 +:1044A000294630460AF045FD03F02EFC297C4A08D7 +:1044B000A17F62F3C711A177297CE27F61F300023B +:1044C000E277297C890884F8201004E030460AF05D +:1044D00053FD03F019FCA17F21F02001A17770BDED +:1044E00070B50D46FDF72AF9040005D02846FCF703 +:1044F000C8FE20B1102070BD43F2020070BD2946F5 +:104500002046FEF738FE002070BD04E010F8012BB5 +:104510000AB100207047491E89B2F7D201207047C6 +:1045200010B5C4780B7864F300030B70C47864088A +:1045300064F341030B70C478A40864F382030B7026 +:10454000C478E40864F3C3030B700379117863F350 +:104550000001117003795B0863F341011170037965 +:104560009B0863F3820111700079C00860F3C301F6 +:10457000117010BD70B51546064603F0A7FD040086 +:1045800000D1FFDF207820F00F00801C20F0F00029 +:104590002030207066802868A060BDE8704003F07D +:1045A00099BD10B5134C94F83000002808D104F1DF +:1045B0002001A1F110000DF0A3FA012084F83000D1 +:1045C00010BD10B190F8B9202AB10A4890F8350012 +:1045D00018B1002003E0B83001E00648343008602C +:1045E000704708B50023009313460A460BF065FF99 +:1045F00008BD0000D4010020F0B5007B059F1E46D9 +:1046000014460D46012800D0FFDF0C2030803A20F0 +:104610003880002C08D0287A032806D0287B01286F +:1046200000D0FFDF17206081F0BDA889FBE72DE9EE +:10463000F04786B0144691F80C900E9A0D46B9F1E9 +:10464000010F0BD01021007B2E8A8846052807D049 +:10465000062833D0FFDF06B0BDE8F0870221F2E77D +:10466000E8890C2100EB400001EB4000188033206A +:104670001080002CEFD0E889608100271AE00096B6 +:10468000688808F1020301AA696900F086FF06EB59 +:104690000800801C07EB470186B204EB4102BDF81D +:1046A000040090810DF1060140460E320DF09EFA95 +:1046B0007F1CBFB26089B842E1D8CCE734201080BB +:1046C000E889B9F1010F11D0122148430E3018804A +:1046D000002CC0D0E88960814846B9F1010F00D0B4 +:1046E0000220207300270DF1040A1FE00621ECE7E9 +:1046F0000096688808F1020301AA696900F04DFF7D +:1047000006EB0800801C86B2B9F1010F12D007EB4E +:10471000C70004EB4000BDF80410C18110220AF16B +:104720000201103008F005FE7F1CBFB26089B8425C +:10473000DED890E707EB470104EB4102BDF8040027 +:10474000D0810AF10201404610320DF04FFAEBE73A +:104750002DE9F0470E4688B090F80CC096F80C8012 +:10476000378AF5890C20109902F10C044FF0000AE9 +:10477000BCF1030F08D0BCF1040F3FD0BCF1070F10 +:104780007ED0FFDF08B067E705EB850C00EB4C003F +:10479000188031200880002AF4D0A8F1060000F02B +:1047A000FF09558126E01622002101A808F0EBFD43 +:1047B00000977088434601AA716900F0EEFEBDF8CB +:1047C00004002080BDF80600E080BDF808002081CC +:1047D000A21C0DF10A0148460DF008FAB9F1000FCC +:1047E00000D018B184F804A0A4F802A007EB0800D8 +:1047F00087B20A346D1EADB2D5D2C3E705EB850C86 +:1048000000EB4C00188032200880002ABAD0A8F1B2 +:10481000050000F0FF09558137E000977088434696 +:1048200001AA716900F0B9FE9DF80600BDF80410F8 +:10483000E1802179420860F3000162F341018208BE +:1048400062F38201C20862F3C301020962F3041138 +:10485000420962F34511820962F386112171C00990 +:104860006071BDF80700208122460DF1090148461C +:104870000DF0BCF918B184F802A0A4F800A000E083 +:1048800007E007EB080087B20A346D1EADB2C4D250 +:1048900078E7A8F1020084B205FB08F000F10E0CE5 +:1048A000A3F800C035230B80002AA6D0558194813F +:1048B000009783B270880E32716900F06EFE61E776 +:1048C0002DE9F84F1E460A9D0C4681462AB1607AB2 +:1048D00000F58070D080E089108199F80C000C27D9 +:1048E0004FF000084FF00E0A0D2872D2DFE800F0FA +:1048F0009D070E1B272F374554697272720021469F +:1049000048460095FFF778FEBDE8F88F207B91467A +:10491000082802D0032800D0FFDF3780302009E0CC +:10492000A9F80A80F0E7207B9146042800D0FFDF39 +:10493000378031202880B9F1000FF1D1E4E7207BE6 +:104940009146042800D0FFDF37803220F2E7207B39 +:104950009146022800D0FFDF37803320EAE7207B32 +:104960001746022800D0FFDF3420A6F800A02880D8 +:10497000002FC9D0A7F80A80C6E7207B1746042875 +:1049800000D0FFDF3520A6F800A02880002FBBD084 +:104990004046A7F80A8012E0207B1746052802D07F +:1049A000062800D0FFDF1020308036202880002F1E +:1049B000AAD0E0897881A7F80E80B9F80E00B881F6 +:1049C000A2E7207B9146072800D0FFDF3780372001 +:1049D000B0E72AE04FF0120018804FF038001700BF +:1049E000288091D0E0897881A7F80E80A7F8108000 +:1049F00099F80C000A2805D00B2809D00C280DD0F6 +:104A0000FFDF81E7207B0A2800D0FFDF01200AE0DA +:104A1000207B0B2800D0FFDF042004E0207B0C2843 +:104A200000D0FFDF052038736EE7FFDF6CE770B55D +:104A30000C460546FCF782FE20B10078222804D2FD +:104A4000082070BD43F2020070BD052128460BF01E +:104A500035FB206008B1002070BD032070BD30B46C +:104A60004880087820F00F00C01C20F0F000903043 +:104A700001F8080B1DCA81E81D0030BC03F02ABBF9 +:104A80002DE9FF4784B00027824602970798904699 +:104A90008946123006F043FB401D20F003060798BC +:104AA00028B907A95046FFF7C2FF002854D1B9F131 +:104AB000000F05D00798017B19BB052504681BE092 +:104AC00098F80000092803D00D2812D0FFDF46E037 +:104AD000079903254868B0B3497B428871439142E6 +:104AE00039D98AB2B3B2011D0BF06DF904460780C3 +:104AF00002E0079C042508340CB1208810B1032D76 +:104B000029D02CE007980121123006F03AFBADF8CD +:104B10000C00024602AB2946504604F0D8F80700C4 +:104B200001D1A01C029007983A461230C8F8040040 +:104B3000A8F802A003A94046029B06F02FFBD8B1BB +:104B40000A2817D200E006E0DFE800F00709141495 +:104B5000100B0D141412132014E6002012E611207D +:104B600010E608200EE643F203000BE6072009E6F4 +:104B70000D2007E6032005E6BDF80C002346CDE92D +:104B800000702A465046079900F017FD57B9032DCB +:104B900008D10798B3B2417B406871438AB2011DC6 +:104BA0000BF025F9B9F1000FD7D0079981F80C90D7 +:104BB000D3E72DE9FE4F91461A881C468A46804667 +:104BC000FAB102AB494604F082F8050019D040461C +:104BD000A61C27880BF0B7FB3246072629463B4622 +:104BE00000960AF0D6FF20882346CDE900504A46B9 +:104BF0005146404600F0E1FC002020800120BDE845 +:104C0000FE8F0020FBE710B586B01C46AAB1042336 +:104C10008DF800301388ADF808305288ADF80A20BE +:104C20008A788DF80E200988ADF80C1000236A46AA +:104C30002146FFF725FF06B010BD1020FBE770B539 +:104C40000D4605210BF03AFA040000D1FFDF29469A +:104C500004F11200BDE8704006F07CBA2DE9F8437B +:104C60000D468046002603F031FA044628781028C5 +:104C700078D2DFE800F0773B3453313112313131F3 +:104C80000831313131312879001FC0B2022801D0FA +:104C9000102810D114BBFFDF35E004B9FFDF052178 +:104CA00040460BF00BFA007B032806D004280BD0FB +:104CB000072828D0FFDF072655E02879801FC0B2DB +:104CC000022820D050B1F6E72879401FC0B2022850 +:104CD00019D0102817D0EEE704B9FFDF13E004B9AC +:104CE000FFDF287901280ED1172137E00521404642 +:104CF0000BF0E4F9070000D1FFDF07F11201404695 +:104D000006F005FA2CB12A4621464046FFF7A7FED9 +:104D100029E013214046FDF743FD24E004B9FFDFFD +:104D2000052140460BF0CAF9060000D1FFDF6946B5 +:104D300006F1120006F0F5F9060000D0FFDFA988A1 +:104D4000172901D2172200E00A46BDF8000082426E +:104D500002D9014602E005E01729C5D3404600F01C +:104D60003CFCD0E7FFDF3046BDE8F883401D20F073 +:104D7000030219B102FB01F0001D00E00020104405 +:104D8000704713B5009848B1002468460AF0C5FF83 +:104D9000002C02D1F74A009911601CBD01240020AB +:104DA000F4E72DE9F0470C46154624220021204661 +:104DB00008F0E9FA05B9FFDFA87860732888DFF802 +:104DC000B4A3401D20F00301AF788946DAF8000053 +:104DD0000AF0C1FF060000D1FFDF4FF00008266097 +:104DE000A6F8008077B109FB07F1091D0AD0DAF8AF +:104DF00000000AF0B0FF060000D1FFDF6660C6F8D1 +:104E0000008001E0C4F80480298804F11200BDE8A4 +:104E1000F04706F06DB92DE9F047804601F1120028 +:104E20000D46814606F07BF9401DD24F20F003026B +:104E30006E7B1446296838680AF0B8FF3EB104FB5F +:104E400006F2121D03D0696838680AF0AFFF05202A +:104E50000BF0E0F8044605200BF0E4F8201A0128D6 +:104E600002D138680AF06CFF49464046BDE8F04779 +:104E700006F054B970B5054605210BF01FF9040082 +:104E800000D1FFDF04F112012846BDE8704006F0B2 +:104E90003EB92DE9F04F91B04FF0000BADF834B0B2 +:104EA000ADF804B047880C460546924605213846C1 +:104EB0000BF004F9060000D1FFDF24B1A780A4F8AD +:104EC00006B0A4F808B0297809220B20B2EB111F14 +:104ED0007ED12A7A04F1100138274FF00C084FF0E8 +:104EE00001090391102A74D2DFE802F073F3F2F1A2 +:104EF0008008D3898EA03DDCF4EFB7B7307B022861 +:104F000000D0FFDFA88908EBC001ADF80410302104 +:104F1000ADF83410002C25D06081B5F80E90002734 +:104F20001DE004EBC708317C88F80E10F189A8F861 +:104F30000C10CDF800906888042304AA296900F0B9 +:104F40002CFBBDF81010A8F8101009F10400BDF8F2 +:104F500012107F1C1FFA80F9A8F81210BFB26089E6 +:104F6000B842DED80EE1307B022800D0FFDFE989AD +:104F700008EBC100ADF804003020ADF83400287B08 +:104F80000A90001FC0B20F90002CEBD06181B5F8E1 +:104F90001090002726E000BFCDF80090688869696E +:104FA00003AA0A9B00F0F9FA0A9804EBC7084844E0 +:104FB0001FFA80F908F10C0204A90F980CF016FEF4 +:104FC00018B188F80EB0A8F80CB0BDF80C1001E0CC +:104FD000D4E0D1E0A8F81010BDF80E107F1CA8F89E +:104FE0001210BFB26089B842D6D8CBE00DA80090AD +:104FF00001AB224629463046FFF719FBC2E0307B61 +:10500000082805D0FFDF03E0307B082800D0FFDF51 +:10501000E8891030ADF804003620ADF83400002CDB +:105020003FD0A9896181F189A18127E0307B0928DE +:1050300000D0FFDFA88900F10C01ADF80410372182 +:10504000ADF83410002C2CD06081E8890090AB8939 +:10505000688804F10C02296956E0E889392110308A +:1050600080B2ADF80400ADF83410002C74D0A989DA +:105070006181287A0E280AD002212173E989E18111 +:10508000288A0090EB8968886969039A3CE00121CD +:10509000F3E70DA8009001AB224629463046FFF702 +:1050A00057FB6FE0307B0A2800D0FFDF1220ADF8FD +:1050B0000400ADF834704CB3A9896181A4F810B034 +:1050C000A4F80EB084F80C905CE020E002E031E03F +:1050D00039E042E0307B0B2800D0FFDF288AADF8B2 +:1050E00034701230ADF8040084B104212173A98911 +:1050F0006181E989E181298A2182688A00902B8A6D +:10510000688804F11202696900F047FA3AE0307BDE +:105110000C2800D0FFDF1220ADF80400ADF8347089 +:105120003CB305212173A4F80AB0A4F80EB0A4F88A +:1051300010B027E00DA8009001AB2246294630466A +:10514000FFF75AFA1EE00DA8009001AB224629464F +:105150003046FFF7B5FB15E034E03B21ADF8040025 +:10516000ADF8341074B3A4F80690A4F808B084F82D +:105170000AB007E010000020FFDF03E0297A0129D0 +:1051800017D0FFDFBDF80400AAF800006CB1BDF82D +:1051900034002080BDF804006080BDF83400392858 +:1051A00003D03C2801D086F80CB011B00020BDE837 +:1051B000F08F3C21ADF80400ADF8341014B1697AD9 +:1051C000A172DFE7AAF80000EFE72DE9F84356885F +:1051D0000F4680461546052130460AF06FFF040051 +:1051E00000D1FFDF123400943B46414630466A68E6 +:1051F00006F008F9B8E570B50D4605210AF05EFF26 +:10520000040000D1FFDF294604F11200BDE8704020 +:1052100005F092BF70B50D4605210AF04FFF04005E +:1052200000D1FFDF294604F11200BDE8704005F00F +:10523000B0BF70B5054605210AF040FF040000D15B +:10524000FFDF04F1080321462846BDE87040042230 +:10525000AFE470B5054605210AF030FF040000D127 +:10526000FFDF214628462368BDE870400522A0E400 +:1052700070B5064605210AF021FF040000D1FFDFCA +:1052800004F1120005F04BFF401D20F0030511E072 +:10529000011D00880322431821463046FFF789FC90 +:1052A00000280BD0607BABB2684382B26068011DFE +:1052B0000AF0D3FD606841880029E9D170BD70B55E +:1052C0000E46054602F002FF040000D1FFDF012078 +:1052D000207266726580207820F00F00C01C20F0DC +:1052E000F00030302070BDE8704002F0F3BE2DE9D0 +:1052F000F0438BB00D461446814606A9FFF797FB95 +:10530000002814D14FF6FF7601274FF420588CB1B6 +:1053100003208DF800001020ADF8100007A80590BC +:1053200007AA204604A90CF080FC78B107200BB036 +:10533000BDE8F0830820ADF808508DF80E708DF8A8 +:105340000000ADF80A60ADF80C800CE00698A1787A +:1053500001742188C1818DF80E70ADF80850ADF848 +:105360000C80ADF80A606A4602214846069BFFF7AA +:1053700087FBDCE708B501228DF8022042F6020225 +:10538000ADF800200A4603236946FFF73CFC08BD40 +:1053900008B501228DF8022042F60302ADF8002084 +:1053A0000A4604236946FFF72EFC08BD00B587B006 +:1053B00079B102228DF800200A88ADF808204988CA +:1053C000ADF80A1000236A460521FFF759FB07B024 +:1053D00000BD1020FBE709B1072314E40720704744 +:1053E00070B588B00D461446064606A9FFF71FFBA8 +:1053F00000280ED17CB10620ADF808508DF80000D1 +:10540000ADF80A40069B6A460821DC813046FFF76A +:1054100037FB08B070BD05208DF80000ADF80850CE +:10542000F0E700B587B059B107238DF80030ADF82B +:105430000820039100236A460921FFF721FBC6E7F4 +:105440001020C4E770B588B00C460646002506A9B2 +:10545000FFF7EDFA0028DCD106980121123005F0A3 +:1054600090FE9CB12178062921D2DFE801F02005C9 +:1054700005160318801E80B2C01EE28880B20AB1F1 +:10548000A3681BB1824203D90C20C2E71020C0E7F9 +:10549000042904D0A08850B901E00620B9E7012909 +:1054A00013D0022905D004291CD005292AD00720B1 +:1054B000AFE709208DF800006088ADF80800E088AB +:1054C000ADF80A00A068039023E00A208DF80000E0 +:1054D0006088ADF80800E088ADF80A00A0680A25E9 +:1054E000039016E00B208DF800006088ADF80800EE +:1054F000A088ADF80A00E088ADF80C00A0680B2584 +:10550000049006E00C208DF8000060788DF808000B +:105510000C256A4629463046069BFFF7B1FA78E724 +:1055200000B587B00D228DF80020ADF808100023DB +:105530006A461946FFF7A4FA49E700B587B071B18A +:1055400002228DF800200A88ADF808204988ADF8BD +:105550000A1000236A460621FFF792FA37E7102067 +:1055600035E770B586B0064601200D46ADF8081047 +:105570008DF80000014600236A463046FFF780FAA6 +:10558000040008D12946304601F006FB00213046D0 +:1055900001F020FB204606B070BDF8B51C4615464C +:1055A0000E46069F0AF0BDFE2346FF1DBCB23146E3 +:1055B0002A4600940AF0B9FAF8BD30B41146DDE984 +:1055C00002423CB1032903D0002330BC04F013BCD9 +:1055D0000123FAE71A8030BC704770B50C460546C7 +:1055E000FFF72DFB2146284601F0E5FA2846BDE8E5 +:1055F0007040012101F0EEBA18B18178012938D14B +:1056000001E010207047018842F60112881A914289 +:1056100031D018DC42F60102A1EB020091422AD0FF +:105620000CDC41B3B1F5C05F25D06FF4C050081851 +:1056300021D0A0F57060FF381BD11CE001281AD0E2 +:1056400002280AD117E0B0F5807F14D008DC0128C9 +:1056500011D002280FD003280DD0FF2809D10AE06D +:10566000B0F5817F07D0A0F58070033803D0012802 +:1056700001D0002070470F2070470A281FD008DC97 +:105680000A2818D2DFE800F0191B1F1F171F231D5F +:105690001F21102815D008DC0B2812D00C2810D0A0 +:1056A0000D2816D00F2806D10DE011280BD0842824 +:1056B0000BD087280FD003207047002070470520AB +:1056C0007047072070470F2070470420704706205E +:1056D00070470C20704743F20200704738B50C4603 +:1056E000050041D06946FEF7D7FA002819D19DF888 +:1056F0000010607861F3020060706946681CFEF774 +:10570000CBFA00280DD19DF80010607861F3C50038 +:105710006070A978C1F34101012903D0022905D0A5 +:10572000072038BD217821F0200102E0217841F0E6 +:1057300020012170410704D0A978C90861F38610BF +:105740006070607810F0380F07D0A978090961F30C +:10575000C710607010F0380F02D16078400603D592 +:10576000207840F040002070002038BD70B504461D +:105770000020088015466068FFF7B0FF002816D1AA +:105780002089A189884211D860688078C0070AD032 +:10579000B1F5007F0AD840F20120B1FBF0F200FB26 +:1057A0001210288007E0B1F5FF7F01D90C2070BDF1 +:1057B00001F201212980002070BD10B50478137812 +:1057C00064F3000313700478640864F341031370F6 +:1057D0000478A40864F3820313700478E40864F383 +:1057E000C30313700478240964F30413137004785A +:1057F000640964F3451313700078800960F386131D +:10580000137031B10878C10701D1800701D501209B +:1058100000E0002060F3C713137010BD42785307F7 +:1058200002D002F0070306E012F0380F02D0C2F3F4 +:10583000C20300E001234A7863F302024A70407811 +:1058400010F0380F02D0C0F3C20005E0430702D0C9 +:1058500000F0070000E0012060F3C5024A707047C5 +:105860002DE9F04F95B00D00824613D01222002191 +:10587000284607F088FD4FF6FF7B05AA0121584610 +:1058800007F049FB0024264637464FF420586FF4B2 +:10589000205972E0102015B0BDE8F08F9DF81E0071 +:1058A00001280AD1BDF81C1041450BD011EB0900AD +:1058B0000AD001280CD002280CD0042C0ED0052CC4 +:1058C0000FD10DE0012400E00224BDF81A6008E0C9 +:1058D000032406E00424BDF81A7002E0052400E069 +:1058E0000624BDF81A10514547D12C74BEB34FF0B1 +:1058F000000810AA4FF0070ACDE90282CDE900A8FE +:105900000DF13C091023CDF810904246314658461F +:1059100007F0D1FB08BBBDF83C002A46C0B210A975 +:105920000CF064F9C8B9AE81CFB1CDE900A80DF192 +:10593000080C0AAE40468CE8410213230022394687 +:10594000584607F0B8FB40B9BDF83C00F11CC01E3A +:10595000C0B22A1D0CF04AF910B103209BE70AE0FF +:10596000BDF82900E881062C05D19DF81E00A8721B +:10597000BDF81C00288100208DE705A807F0D7FAA4 +:1059800000288BD0FFF779FE85E72DE9F0471C460C +:10599000DDE90978DDF8209015460E00824600D139 +:1059A000FFDF0CB1208818B1D5B11120BDE8F08718 +:1059B000022D01D0012100E0002106F1140006F0C3 +:1059C00073F9A8F8000002463B462946504603F00A +:1059D0007EF9C9F8000008B9A41C3C600020E5E786 +:1059E0001320E3E7F0B41446DDE904528DB100233F +:1059F00014B1022C09D101E0012306E00D7CEE0771 +:105A000003D025F0010501230D742146F0BC04F0FC +:105A1000F2B91A80F0BC70472DE9FE4F91461A8802 +:105A20001C468A468046FAB102AB494603F04FF95C +:105A3000050019D04046A61C27880AF084FC32468F +:105A4000072629463B4600960AF0A3F820882346FD +:105A5000CDE900504A4651464046FFF7C3FF0020BB +:105A600020800120BDE8FE8F0020FBE72DE9F047F4 +:105A700086B082460EA8904690E8B000894604AAF7 +:105A800005A903A88DE807001E462A462146504670 +:105A9000FFF77BFF039901B101213970002818D16C +:105AA000FA4904F1140204AB0860039805998DE8E3 +:105AB000070042464946504606F0A9FCA8B109280D +:105AC00011D2DFE800F005080510100A0C0C0E00DA +:105AD000002006B06AE71120FBE70720F9E708205D +:105AE000F7E70D20F5E70320F3E7BDF81010039862 +:105AF000CDE9000133462A4621465046FFF772FFA2 +:105B0000E6E72DE9F04389B01646DDE910870D463A +:105B100081461C461422002103A807F034FC012012 +:105B200002218DF810108DF80C008DF81170ADF871 +:105B3000146064B1A278D20709D08DF81600E0880D +:105B4000ADF81A00A088ADF81800A068079008A862 +:105B50000095CDE90110424603A948466B68FFF75E +:105B600085FF09B0BDE8F083F0B58BB00024064690 +:105B7000069407940727089405A8099401940097B0 +:105B80000294CDE903400D4610232246304607F02B +:105B900092FA78B90AA806A9019400970294CDE96F +:105BA0000310BDF8143000222946304607F021F8D2 +:105BB000002801D0FFF761FD0BB0F0BD06F0B2BECA +:105BC0002DE9FC410C468046002602F07FFA05468E +:105BD00020780D287ED2DFE800F0BC0713B325BD86 +:105BE00049496383AF959B00A848006820B141787C +:105BF00041F010014170ADE0404602F099FAA9E091 +:105C0000042140460AF05AFA070000D1FFDF07F1ED +:105C10001401404605F0DDFFA5BB13214046FCF70B +:105C2000BFFD97E0042140460AF048FA070000D182 +:105C3000FFDFE088ADF800000020B8819DF800008B +:105C4000010704D5C00602D5A088B88105E09DF8FB +:105C5000010040067ED5A088F88105B9FFDF224605 +:105C60002946404601F0C0FC022673E0E188ADF809 +:105C700000109DF8011009060FD5072803D006284B +:105C80000AD00AE024E0042140460AF017FA060090 +:105C900000D1FFDFA088F0810226CDB9FFDF17E039 +:105CA000042140460AF00AFA070000D1FFDF07F19D +:105CB000140006F06EFE90F0010F02D1E0790006AC +:105CC00048D5387C022640F00200387405B9FFDF61 +:105CD000224600E03DE02946404601F085FC39E0DF +:105CE000042140460AF0EAF9017C002D01F0020689 +:105CF000C1F340016171017C21F002010174E7D11F +:105D0000FFDFE5E702260121404602F043FA21E0E9 +:105D1000042140460AF0D2F90546606800902089C7 +:105D2000ADF8040001226946404602F054FA287C8E +:105D300020F0020028740DE0002DC9D1FFDFC7E775 +:105D4000022600214046FFF765FA002DC0D1FFDF93 +:105D5000BEE7FFDF3046BDE8FC813EB50C0009D050 +:105D600001466B4601AA002007F02AFA20B1FFF78E +:105D700084FC3EBD10203EBD00202080A0709DF818 +:105D8000050002A900F00700FDF7A2FF50B99DF839 +:105D9000080020709DF8050002A9C0F3C200FDF7BD +:105DA00097FF08B103203EBD9DF8080060709DF884 +:105DB0000500C109A07861F30410A0709DF80510DA +:105DC000890961F3C300A0709DF80410890601D50C +:105DD000022100E0012161F342009DF8001061F30F +:105DE0000000A07000203EBD70B5144606460D466A +:105DF00051EA040005D075B10846FBF760FA78B99E +:105E000001E0072070BD2946304607F040FA10B186 +:105E1000BDE8704031E454B12046FBF750FA08B1B8 +:105E2000102070BD21463046BDE8704095E7002047 +:105E300070BD2DE9FC5F0C469046054600270178B1 +:105E40000822007A3E46B2EB111F7DD104F10A010F +:105E500000910A31821E4FF0020A04F1080B0191F1 +:105E6000092A72D2DFE802F0EDE005F528287BAAC6 +:105E7000CE00688804210AF021F9060000D1FFDF76 +:105E8000B08928B152270726C3E00000380200205D +:105E900051271026002C7DD06888A0800120A07199 +:105EA000A88900220099FFF79FFF002873D1A889D5 +:105EB0002081288AE081D1E0B5F81290072824D10A +:105EC000E87B000621D5512709F1140086B2002C89 +:105ED000E1D0A88900220099FFF786FF00285AD157 +:105EE0006888A08084F806A0A88920810120A0737A +:105EF000288A2082A4F81290A88A009068884B46CD +:105F0000A969019A01F04CFBA8E0502709F11200A1 +:105F100086B2002C3ED0A88900225946FFF764FFC4 +:105F2000002838D16888A080A889E080287A0728CE +:105F300013D002202073288AE081E87BC0096073B7 +:105F4000A4F81090A88A01E085E082E000906888BB +:105F50004B4604F11202A969D4E70120EAE7B5F83B +:105F60001290512709F1140086B2002C66D068887F +:105F700004210AF0A3F883466888A080A88900223B +:105F80000099FFF731FF00286ED184F806A0A88998 +:105F9000208101E052E067E00420A073288A20827B +:105FA000A4F81290A88A009068884B46A969019AC3 +:105FB00001F0F6FAA989ABF80E104FE06888FBF7FC +:105FC000BDFB0746688804210AF078F8064607B941 +:105FD000FFDF06B9FFDF687BC00702D05127142618 +:105FE00001E0502712264CB36888A080502F06D0BD +:105FF00084F806A0287B594601F0E2FA2EE0287BBF +:10600000A11DF9E7FE49A8894989814205D1542794 +:1060100006269CB16888A08020E053270BE06888A2 +:10602000A080A889E08019E0688804210AF046F879 +:1060300000B9FFDF55270826002CF0D1A8F8006032 +:1060400011E056270726002CF8D06888A080002091 +:1060500013E0FFDF02E0012808D0FFDFA8F80060AE +:106060000CB1278066800020BDE8FC9F57270726DB +:10607000002CE3D06888A080687AA071EEE7401D0C +:1060800020F0030009B14143091D01EB40007047B6 +:1060900013B5DB4A00201071009848B1002468460F +:1060A00009F03BFE002C02D1D64A009911601CBDBC +:1060B00001240020F4E770B50D461446064686B06C +:1060C0005C220021284607F05EF904B9FFDFA078C2 +:1060D0006874A2782188284601F09DFA0020A881E2 +:1060E000E881228805F11401304605F056FD6A4624 +:1060F0000121304606F00FFF1AE000BF9DF80300B3 +:10610000000715D5BDF806103046FFF72DFD9DF8A8 +:106110000300BDF8061040F010008DF80300BDF834 +:106120000300ADF81400FF233046059A07F077F816 +:10613000684606F0FCFE0028E0D006B070BD10B541 +:106140000C4601F1140005F060FD0146627C20461A +:10615000BDE8104001F094BA30B50446A84891B0AB +:106160004FF6FF75C18905AA284606F0D4FE30E037 +:106170009DF81E00A0422AD001282AD1BDF81C009B +:10618000B0F5205F03D042F60101884221D1002002 +:1061900002AB0AAA0CA9019083E80700072000902F +:1061A000BDF81A1010230022284606F084FF38B9E3 +:1061B000BDF828000BAAC0B20CA90BF017FD10B156 +:1061C000032011B030BD9DF82E00A04201D1002067 +:1061D000F7E705A806F0ABFE0028C9D00520F0E7D8 +:1061E00070B50546042109F069FF040000D1FFDF06 +:1061F00004F114010C46284605F0EBFC2146284624 +:10620000BDE8704005F0ECBC70B58AB00C4606469F +:10621000FBF794FA050014D02878222827D30CB174 +:10622000A08890B101208DF80C0003208DF810009B +:1062300000208DF8110054B1A088ADF81800206836 +:1062400007E043F202000AB070BD0920FBE7ADF899 +:10625000180005900421304609F030FF040000D1F9 +:10626000FFDF04F1140005F0E6FC000701D408206C +:10627000E9E701F02BFF60B108A802210094CDE905 +:10628000011095F8232003A930466368FFF7EEFB61 +:10629000D9E71120D7E72DE9F04FB2F802A08346E5 +:1062A00089B0154689465046FBF748FA074604214F +:1062B000504609F003FF0026044605964FF00208F9 +:1062C0000696ADF81C6007B9FFDF04B9FFDF414651 +:1062D000504603F0DAFE50B907AA06A905A88DE8D2 +:1062E00007004246214650466368FFF74EFB44488C +:1062F00007AB0660DDE9051204F11400CDF800904B +:10630000CDE90320CDE9013197F8232059465046C5 +:106310006B6805F0D9FC06000AD0022E04D0032ECB +:1063200014D0042E00D0FFDF09B03046BDE8F08F56 +:10633000BDF81C000028F7D00599CDE900104246B1 +:10634000214650466368FFF74DFBEDE7687840F063 +:1063500008006870E8E72DE9F04F99B004464FF067 +:1063600000082748ADF81C80ADF82080ADF82480E7 +:10637000A0F80880ADF81480ADF81880ADF82C8036 +:10638000ADF82880007916460D464746012808D00A +:10639000022806D0032804D0042802D0082019B00F +:1063A000C4E72046FAF747FF70BB2846FAF743FFD9 +:1063B00050BB6068FAF78CFF30BB606848B16089F9 +:1063C0002189884202D8B1F5007F01D90C20E6E787 +:1063D00080460EAA06A92846FFF7C8F90028DED194 +:1063E00068688078C0F34100022808D19DF8190040 +:1063F00010F0380F03D02869FAF761FF20B904E0E4 +:10640000380200201400002022E005A92069FFF7CF +:1064100065F90028C3D1206948B1607880079DF8EC +:10642000150000F0380001D5F0B300E0E0BB9DF8A6 +:10643000140080060ED59DF8150010F0380F03D01B +:106440006068FAF73CFF18B96068FAF741FF08B1D5 +:106450001020A4E70AA96069FFF740F900289ED13F +:10646000606940B19DF8290000F0070101293CD185 +:1064700010F0380F39D00BA9A069FFF72FF90028C9 +:106480008DD19DF8280080062FD49DF82C00800621 +:106490002BD4A06950B19DF82D0000F0070101290F +:1064A00023D110F0380F00E01FE01ED0E06818B1D3 +:1064B0000078D0B11C2818D20FAA611C2046FFF723 +:1064C0007CF90121384661F30F2082468DF8521085 +:1064D000B94642F603000F46ADF850000DF13F02F9 +:1064E00018A928680BF0A1FB08B1072057E79DF811 +:1064F000600015A9CDF80090C01CCDE9019100F015 +:10650000FF0B00230BF20122514614A806F02EFCCB +:10651000F0BBBDF854000C90FE482A89296900920E +:10652000CDE901106B89BDF838202868069906F07E +:106530001DFC01007ED120784FF0020AC10601D473 +:1065400080062BD5CDF80C90606950B90AA906A831 +:10655000FFF764F99DF8290020F00700401C8DF832 +:1065600029009DF8280008A940F0C8008DF82800EF +:106570008DF8527042F60210ADF8500003AACDF823 +:1065800000A0CDE90121002340F2032214A800E07D +:106590001EE00A9906F0EAFB01004BD1DD484D46AA +:1065A00008385B460089ADF83D000FA8CDE90290A0 +:1065B000CDF80490CDF810904FF007090022CDF8E7 +:1065C0000090BDF854104FF6FF7006F012FB10B1AA +:1065D000FFF753F8E3E69DF83C00000624D5294672 +:1065E000012060F30F218DF852704FF42450039571 +:1065F000ADF8500062789DF80C00002362F30000B3 +:106600008DF80C006278CDF800A0520862F34100CA +:106610008DF80C0003AACDE9012540F2032214A84D +:1066200006F0A4FB010005D1606888B32069A8B911 +:1066300005A900E084E006A8FFF7F0F8607880077D +:1066400006D49DF8150020F038008DF8150005E0FF +:106650009DF8140040F040008DF814008DF8527041 +:1066600042F60110ADF85000208940F20121B0FB44 +:10667000F1F201FB1202606809ABCDF80080CDE9B0 +:106680000103002314A8059906F070FB010057D1FF +:106690002078C00728D00395A06950B90BA906A897 +:1066A000FFF7BCF89DF82D0020F00700401C8DF886 +:1066B0002D009DF82C008DF8527040F040008DF8B0 +:1066C0002C0042F60310ADF8500007A903AACDF83C +:1066D00000A0CDE90121002340F2032214A80B9968 +:1066E00006F044FB01002BD1E06868B32946012085 +:1066F00060F30F218DF8527042F60410ADF850008F +:10670000E068002302788DF8582040788DF8590011 +:10671000E06816AA4088ADF85A00E06800798DF864 +:106720005C00E068C088ADF85D00CDF80090CDE970 +:1067300001254FF4027214A806F018FB010003D0E3 +:106740000C9800F0C9FF2AE672480321083801714D +:1067500056B100893080BDF824007080BDF820005B +:10676000B080BDF81C00F080002018E670B501254F +:106770008AB016460B46012802D0022816D104E042 +:106780008DF80E504FF4205003E08DF80E5042F675 +:106790000100ADF80C005BB10024601C60F30F2415 +:1067A00004AA08A918460BF040FA18B107204AE5D8 +:1067B000102048E504A99DF820205648CDE9002185 +:1067C000801E02900023214603A802F2012206F057 +:1067D000CDFA10B1FEF751FF35E54E4808380EB13D +:1067E000C1883180057100202DE5F0B593B00746D2 +:1067F00001268DF83E6041F60100ADF83C0012AA7A +:106800000FA93046FFF7B2FF002849D1414C0025BF +:10681000083CEFB31C22002102A806F0B4FD9DF84D +:1068200008008DF83E6040F020008DF8080042F628 +:106830000520ADF83C000E959DF83A00119520F02A +:106840000600801C8DF83A009DF838006A4620F05A +:10685000FF008DF838009DF8390009A920F0FF00ED +:106860008DF839000420ADF82C00ADF830000EA8EA +:106870000A9011A80D900FA80990ADF82E5002A80B +:10688000FFF769FD00280BD1BDF80000608100E032 +:1068900008E0BDF80400A081401CE08125710020C3 +:1068A00013B0F0BD6581A581BDF84800F4E72DE97E +:1068B000F74F1849A0B00024083917940A79A14667 +:1068C000012A04D0022A02D0082023B02EE5CA886B +:1068D000824201D00620F8E721988A46824201D1FF +:1068E0000720F2E70120214660F30F21ADF84800B0 +:1068F0004FF6FF780691ADF84A808DF86E0042F6AB +:10690000020B8DF872401CA9ADF86CB0ADF8704068 +:10691000139101E040020020ADF8508012A806F06B +:1069200035FB00252E462F460DAB072212A9404607 +:1069300006F02FFB78B10A285DD195B38EB3ADF880 +:106940006450ADF866609DF85E008DF8144019AC97 +:10695000012864D06BE09DF83A001FB3012859D19B +:10696000BDF8381059451FD118A809A901940294FF +:10697000CDE9031007200090BDF836101023002247 +:10698000404606F098FBB0BBBDF86000042801D07B +:1069900006284AD1BDF82410219881423AD10F200F +:1069A00093E73AE0012835D1BDF83800B0F5205F13 +:1069B00003D042F6010188422CD1BAF80600BDF896 +:1069C0003610884201D1012700E0002705B19EB1B1 +:1069D000219881421ED118A809AA01940294CDE9F8 +:1069E0000320072000900D4610230022404606F0A9 +:1069F00062FB00B902E02DE04E460BE0BDF86000FE +:106A0000022801D0102810D1C0B217AA09A90BF092 +:106A1000EDF850B9BDF8369086E7052055E705A991 +:106A200017A8221D0BF001F908B103204DE79DF8CE +:106A300014000023001DC2B28DF814202298009289 +:106A4000CDE901401BA8069906F090F910B9022281 +:106A50008AF80420FEF711FE37E710B50B46401EFA +:106A600088B084B205AA00211846FEF7A6FE0020D1 +:106A70000DF1080C06AA05A901908CE80700072073 +:106A800000900123002221464FF6FF7006F0B1F876 +:106A90000446BDF81800012800D0FFDF2046FEF7AD +:106AA000ECFD08B010BDF0B5F74F044687B038795B +:106AB0000E46032804D0042802D0082007B0F0BDF9 +:106AC00004AA03A92046FEF751FE0500F6D160682E +:106AD0008078C0F3410002280AD19DF80D0010F023 +:106AE000380F05D02069FAF7EAFB08B11020E5E776 +:106AF000208905AA21698DE807006389BDF8102067 +:106B00002068039906F032F910B1FEF7B6FDD5E71B +:106B100016B1BDF814003080042038712846CDE746 +:106B2000F8B50C0006460CD001464FF6FF75002361 +:106B30006A46284606F044FB28B100BFFEF79DFDDB +:106B4000F8BD1020F8BD69462046FEF7C7FD0028B5 +:106B5000F8D1A078314600F001032846009A06F0EB +:106B60005EFBEBE730B587B0144600220DF1080C50 +:106B700005AD01928CE82C00072200920A460146DE +:106B800023884FF6FF7006F034F8BDF8141021800A +:106B9000FEF773FD07B030BD70B50D46042109F056 +:106BA0008DFA040000D1FFDF294604F11400BDE88E +:106BB000704005F039B870B50D46042109F07EFA31 +:106BC000040000D1FFDF294604F11400BDE8704045 +:106BD00005F04DB870B50D46042109F06FFA0400B8 +:106BE00000D1FFDF294604F11400BDE8704005F034 +:106BF00065B870B50546042109F060FA040000D1BB +:106C0000FFDF214628462368BDE870400122FEF7D9 +:106C100003BF70B50646042109F050FA040000D104 +:106C2000FFDF04F1140004F0F0FF401D20F0030525 +:106C300011E0011D00880022431821463046FEF76E +:106C4000EBFE00280BD0607CABB2684382B2A06838 +:106C5000011D09F002F9A06841880029E9D170BD41 +:106C600070B50546042109F029FA040000D1FFDFC0 +:106C7000214628466368BDE870400222FEF7CCBE7C +:106C800070B50E46054601F021FA040000D1FFDF81 +:106C90000120207266726580207820F00F00001DB0 +:106CA00020F0F00040302070BDE8704001F012BAD2 +:106CB00010B50446012900D0FFDF2046BDE8104092 +:106CC0000121FEF7A7BA2DE9F04F97B04FF0000A67 +:106CD0000C008346ADF814A0D04619D0E06830B15E +:106CE000A068A8B10188ADF81410A0F800A058461B +:106CF000FAF724FD070043F2020961D03878222810 +:106D00005CD30421584609F0D9F9050005D103E008 +:106D1000102017B0BDE8F08FFFDF05F1140004F07C +:106D200074FF401D20F00306A078012803D002283C +:106D300001D00720EDE7218807AA584606F0EBF8B6 +:106D400030BB07A806F0F3F810BB07A806F0EFF871 +:106D500048B99DF82600012805D1BDF82400A0F50A +:106D60002451023902D04FF45050D2E7E068B0B15C +:106D7000CDE902A00720009005AACDF804A0049256 +:106D8000A2882188BDF81430584605F032FF10B1B2 +:106D9000FEF773FCBDE7A168BDF8140008809DF8FC +:106DA0001F00C00602D543F20140B2E70B9838B18C +:106DB000A1780078012905D080071AD40820A8E717 +:106DC0004846A6E7C007F9D002208DF83C00A86825 +:106DD0004FF00009A0B1697C4288714391420FD9FC +:106DE0008AB2B3B2011D08F0EEFF8046A0F800A001 +:106DF00006E003208DF83C00D5F800804FF0010933 +:106E00009DF8200010F0380F00D1FFDF9DF8200022 +:106E10001E49C0F3C200084497F8231010F8010C73 +:106E2000884201D90F2074E72088ADF8400014A9EA +:106E30000095CDE90191434607220FA95846FEF778 +:106E400015FE002891D19DF8500050B9A078012876 +:106E500007D1687CB3B2704382B2A868011D08F004 +:106E6000C6FF002055E770B5064615460C46084695 +:106E7000FEF7C2FB002805D12A4621463046BDE870 +:106E8000704073E470BD12E538020020F2B00100DA +:106E900070B51E4614460D0009D044B1616831B189 +:106EA00038B1FC49C988814203D0072070BD102049 +:106EB00070BD2068FEF7A0FB0028F9D132462146BC +:106EC0002846BDE87040FFF746BA70B515460C007D +:106ED00006D038B1EF490989814203D0072070BD3F +:106EE000102070BD2068FEF787FB0028F9D12946E5 +:106EF0002046BDE87040D6E570B5064686B00D4622 +:106F000014461046FAF7BDF9D0BB6068FAF7E0F90D +:106F1000B0BBA6F57F40FF3803D03046FAF70EFC31 +:106F200080B128466946FEF79BFC00280CD19DF8ED +:106F300010100F2008293DD2DFE801F008060606F0 +:106F4000060A0A0843F2020006B070BD0320FBE700 +:106F50009DF80210012908D1BDF80010B1F5C05FFD +:106F6000F2D06FF4C052D142EED09DF80610012944 +:106F70000DD1BDF80410A1F52851062907D200E073 +:106F800029E0DFE801F0030304030303DCE79DF8D5 +:106F90000A1001290FD1BDF80810B1F5245FD3D034 +:106FA000A1F60211B1F50051CED00129CCD00229B1 +:106FB00001D1C9E7FFDF606878B9002305AA294637 +:106FC000304606F0FDF810B1FEF757FBBCE79DF820 +:106FD0001400800601D41020B6E7618822462846B6 +:106FE0006368FFF7BFFDAFE72DE9F043814687B047 +:106FF000884614461046FAF744F918B1102007B035 +:10700000BDE8F083002306AA4146484606F0D8F8BA +:1070100018B100BFFEF731FBF1E79DF81800C0067C +:1070200002D543F20140EAE70025072705A80195AC +:1070300000970295CDE9035062884FF6FF734146F1 +:10704000484606F038F8060013D16068FAF719F9D7 +:1070500060B960680195CDE90250009704952388D6 +:1070600062884146484606F026F80646BDF81400F8 +:1070700020803046CEE739B1864B0A889B899A42F8 +:1070800002D843F2030070471DE610B586B0814C6C +:107090000423ADF81430638943B1A4898C4201D232 +:1070A000914205D943F2030006B010BD0620FBE76C +:1070B000ADF81010002100910191ADF800300221CF +:1070C0008DF8021005A9029104A90391ADF81220D0 +:1070D0006946FFF7F8FDE7E72DE9FC4781460D46D5 +:1070E0000846FAF7A8F888BB4846FAF727FB5FEA94 +:1070F00000080AD098F80000222829D30421484625 +:1071000008F0DCFF070005D103E043F20200BDE810 +:10711000FC87FFDF07F1140004F08DFD0646287898 +:10712000012803D0022804D00720F0E7B0070FD5CC +:1071300002E016F01C0F0BD0A8792C1DC00709D057 +:10714000E08838B1A068FAF776F818B11020DEE7C9 +:107150000820DCE721882A780720B1F5847F35D024 +:107160001EDC40F20315A1F20313A94226D00EDC67 +:10717000B1F5807FCBD003DCF9B1012926D1C6E778 +:10718000A1F58073013BC2D0012B1FD113E0012B6D +:10719000BDD0022B1AD0032BB9D0042B16D112E08C +:1071A000A1F20912082A11D2DFE802F00B04041040 +:1071B00010101004ABE7022AA9D007E0012AA6D0DC +:1071C00004E0320700E0F206002AA0DACDB200F0B7 +:1071D0007DFF50B198F82300CDE90005FA892346D8 +:1071E00039464846FEF78DFC91E711208FE72DE9DF +:1071F000F04F8BB01F4615460C4683460026FAF723 +:107200009DFA28B10078222805D208200BB081E52C +:1072100043F20200FAE7B80801D00720F6E7032F8F +:1072200000D100274FF6FF79CCB1022D73D3204651 +:10723000FAF74EF830B904EB0508A8F10100FAF7A7 +:1072400047F808B11020E1E7AD1E38F8028CAAB269 +:107250002146484606F007F940455CD1ADB20D49DC +:10726000B80702D58889401C00E001201FFA80F889 +:10727000F80701D08F8900E04F4605AA41465846DD +:1072800005F049FE4FF0070A4FF00009DCB3204635 +:107290000BE0000038020020408810283BD8361D43 +:1072A000304486B2AE4236D2A01902884245F3D3AA +:1072B00051E000BF9DF8170002074CD594B304EBD2 +:1072C0000608361DB8F80230B6B2102B23D89A192A +:1072D000AA4220D8B8F8002091421CD1C0061CD583 +:1072E000CDE900A90DF1080C0AAAA11948468CE8BD +:1072F0000700B8F800100022584605F07AFC20B1CB +:10730000FEF7BBF982E726E005E0B8F80200BDF819 +:107310002810884201D00B2078E7B8F802003044EA +:1073200086B207E0FFE7C00604D55846FEF71CFC0E +:10733000002888D19DF81700BDF81A1020F0100021 +:107340008DF81700BDF81700ADF80000FF23584670 +:10735000009A05F064FF05A805F0E9FD18B9BDF82D +:107360001A10B942A6D90421584608F0A7FE040015 +:1073700000D1FFDFA2895AB1CDE900A94D46002313 +:1073800021465846FEF7BDFB0028BBD1A5813DE74D +:1073900000203BE72DE9FF4F8BB01E4617000D463E +:1073A0004FF0000412D0B00802D007200FB0B1E4B3 +:1073B000032E00D100265DB10846F9F780FF28B9F9 +:1073C0003888691E0844F9F77AFF08B11020EDE704 +:1073D000C74AB00701D5D18900E00121F0074FF677 +:1073E000FF7802D0D089401E00E0404686B206AA4F +:1073F0000B9805F090FD4FF000094FF0070B0DF1D1 +:10740000140A38E09DF81B00000734D5CDF804902D +:10741000CDF800B0CDF80890CDE9039A434600229C +:107420000B9805F048FE60BB05B3BDF814103A8810 +:1074300021442819091D8A4230D3BDF81E2020F8A6 +:10744000022BBDF8142020F8022BCDE900B9CDE9BC +:107450000290CDF810A0BDF81E10BDF81430002227 +:107460000B9805F028FE08B103209FE7BDF8140033 +:107470002044001D84B206A805F059FD20B10A2859 +:1074800006D0FEF7FAF891E7BDF81E10B142B9D95F +:1074900034B17DB13888A11C884203D20C2085E725 +:1074A000052083E722462946404605F0DCFF0146D9 +:1074B00028190180A41C3C80002077E710B5044601 +:1074C000F9F7DFFE08B1102010BD8948C08920807F +:1074D000002010BDF0B58BB00D46064614220021E9 +:1074E00003A805F050FF01208DF80C008DF8100066 +:1074F00000208DF81100ADF814503046FAF71EF94F +:1075000048B10078222812D30421304608F0D6FD75 +:10751000040005D103E043F202000BB0F0BDFFDF31 +:1075200004F11400074604F086FB800601D408200D +:10753000F3E7207C022140F00100207409A80094A8 +:10754000CDE90110072203A930466368FEF78EFAE1 +:1075500020B1217C21F001012174DEE7294630466B +:10756000FDF749FE08A9384604F054FB00B1FFDFDF +:10757000BDF82040172C01D2172000E02046A84279 +:1075800001D92C4602E0172C00D2172421463046A0 +:10759000FFF711FB21463046FDF751FB0020BCE709 +:1075A000F8B51C4615460E46069F08F0BAFE23465F +:1075B000FF1DBCB231462A46009408F0B6FAF8BD69 +:1075C00070B50C4605460E220021204605F0DBFE74 +:1075D000002020802DB1012D01D0FFDF70BD0620DD +:1075E00000E00520A07170BD10B5488008781346F2 +:1075F00020F00F00001D20F0F00080300C460870D5 +:107600001422194604F1080005F093FE00F062FD13 +:107610003748046010BD2DE9F047DFF8D890491DC8 +:10762000064621F0030117460C46D9F8000008F081 +:1076300092FB050000D1FFDF4FF000083560A5F890 +:1076400000802146D9F8000008F085FB050000D134 +:10765000FFDF7560A5F800807FB104FB07F1091D0D +:107660000BD0D9F8000008F076FB040000D1FFDF52 +:10767000B460C4F80080BDE8F087C6F80880FAE777 +:107680002DE9F0411746491D21F00302194D064628 +:1076900001681446286808F089FB2246716828684A +:1076A00008F084FB3FB104FB07F2121D03D0B16860 +:1076B000286808F07BFB042008F0ACFC044604209A +:1076C00008F0B0FC201A012804D12868BDE8F04178 +:1076D00008F036BBBDE8F08110B50C4605F0EAFBBA +:1076E00000B1FFDF2046BDE81040FDF7C6BF000037 +:1076F00038020020140000204FF0E0214FF4004039 +:10770000C1F88001BFF34F8FBFF36F8F00F021B836 +:1077100010B5044600F01DF8002C09D0124A12489A +:1077200012491432124B012C03D0022C07D0FFDF78 +:1077300010BD0224046011604FF0407004E0032487 +:10774000046011604FF40000186010BD00B5FFDF49 +:1077500000BD054800210160016005494FF06070DF +:10776000091D08607047000000F500404802002035 +:1077700004F501402DE9F05FDFF850A44FF0000858 +:107780008B4606469AF80940474645469AF80190C6 +:1077900008E0284601F00EF8817B407811FB007765 +:1077A0006D1CEDB24D45F4D19AF8090020442044F7 +:1077B00020440744FF2F01D94FF013083068C01C44 +:1077C00020F0030232605BEA080021D1FF48FBB2DF +:1077D000062120300CF0C8F9002408E0062C0FD256 +:1077E000DFE804F005030A0A0C05F94800E0F9484F +:1077F0000CF0DAF9054604E0F748F9E7F748F7E74F +:10780000FFDFA54200D0FFDF641CE4B2062CE5D305 +:10781000306800EB071030604046BDE8F09F38B597 +:107820000C468288817B19B14189914200D90A4670 +:107830002280C188121D90B26A4607F081FCBDF813 +:107840000000032800D30320C1B2208800F0D1FF3C +:1078500038BD38B50C468288817B19B101899142C7 +:1078600000D90A462280C188121D90B26A4607F0EC +:1078700067FCBDF80000022800D30220C1B22088B6 +:1078800000F0B7FF401CC0B238BD2DE9FF5F824653 +:107890008B46D34814460BF10302D0E90110CDE921 +:1078A000021022F0030201A84421019208F035FAE7 +:1078B000C64E002C02D1CB49019A8A60019901443D +:1078C0000191B57E05F1010504D1E8B20AF026F96F +:1078D00000B1FFDF019800EB0510C01C20F0030190 +:1078E000019144B9727A00200870B08B80B205F023 +:1078F00040F900B1FFDF0198F16908440190214689 +:1079000001A8FFF737FF80460198C01C20F0030054 +:107910000190717A04B1002008F0F5FA0199084449 +:107920000190214601A800F06FFFA84800273D46BE +:1079300090F801900CE0284600F03CFF0646817864 +:107940008088FDF713FA71786D1C00FB0177EDB2AA +:107950004D45F0D10198C01C20F00300019004B106 +:1079600000203946FDF70DFA0199002708440190DF +:1079700096483D4690F801900CE0284600F01AFF2A +:107980000646C1788088FEF77AFB71786D1C00FB93 +:107990000177EDB24D45F0D10198C01C20F00300F5 +:1079A000019004B100203946FEF772FB01994FF0B7 +:1079B00000090844019085484D4647780EE0284666 +:1079C00000F0F8FE0646807B30B106F1080002F0B8 +:1079D0009DF8727800FB02996D1CEDB2BD42EED1AC +:1079E0000198C01C20F00300019004B100207D49E3 +:1079F0004A78494602F08EF80199084401902146E0 +:107A000001A800F0B3FE0198C01D20F0070001900E +:107A1000DAF80010814204D3A0EB0B01B1F5803FEE +:107A200004DB4FF00408CAF8000004E0CAF80000C4 +:107A3000B8F1000F02D0404604B0EEE674BB6A49CC +:107A40000020019A0CF0FEF9FAF77EFB5F4C207ED5 +:107A50000090607E012823D0002318B300225B48E9 +:107A600000210C30FBF74AF800B1FFDFE07EFEF7A3 +:107A7000BCFE00B1FFDF55484FF4F67200213830EC +:107A800005F081FC51480421383080F8E91180F874 +:107A9000EA11062180F8EB11032101710020CBE7E8 +:107AA0000123DAE702AADAE770B5484C0646383413 +:107AB000207804EB4015E078083598B9A01990F8C3 +:107AC000E80100280FD0A0780F2800D3FFDF202284 +:107AD0000021284605F057FC687866F302006870BC +:107AE0000120E070284670BD2DE9F04105460C46A6 +:107AF00000270078052190463E46B1EB101F00D0CC +:107B0000FFDF287A50B101280ED0FFDFA8F800600F +:107B10000CB1278066800020BDE8F081012709268E +:107B200074B16888A08008E00227142644B16888F0 +:107B3000A0802869E060A88A2082287B2072E5E77F +:107B4000A8F80060E7E730B5204C01200021207044 +:107B50006170207260726176217621730521A182A5 +:107B60001F21E182607321A121610A21A176E076C3 +:107B70001C4D4FF4B060E0616868C11C21F0030146 +:107B8000814200D0FFDF6868606030BD30B5154CC1 +:107B90001568636810339D4202D20420136030BD23 +:107BA0000A4B5D785A6802EB051210705170032081 +:107BB000D080172090800120D070907000209073AA +:107BC0005878401C58706068103013E0540300204F +:107BD000A11F0000359C0000A9B000000F19010092 +:107BE000F8B0010018000020000000206E52463559 +:107BF000780000006060002030BD70B50646F8488F +:107C00000024457807E0204600F0D4FD0178B14219 +:107C100004D0641CE4B2AC42F5D1002070BDF7B5CD +:107C2000074608780C4610B3FFF7E7FF0546A7F1B3 +:107C30002006202F06D0052E19D2DFE806F00F2BE4 +:107C40002B151A0000F0C2FD0DB1697800E000218B +:107C5000401AA17880B20844FF2808D8A07830B133 +:107C6000A088022824D202E06088172820D20720AA +:107C7000FEBD207AE0B161881729F8D3A1881729C1 +:107C8000F5D3A1790029F2D0E1790029EFD040287D +:107C900004D9ECE7242F0BD1207A48B161884FF644 +:107CA000FB70814202D8A188814201D90420FEBD27 +:107CB00065B9207802AA0121FFF768FF0028F6D1F4 +:107CC0002078FFF79AFF050000D1FFDF052E18D2BC +:107CD000DFE806F0030B0E081100A0786870A0889A +:107CE000E8800FE06088A8800CE0A078A87009E028 +:107CF000A078E87006E054F8020FA8606068E860B9 +:107D000000E0FFDF0020FEBD1A2835D00DDC13286F +:107D100032D2DFE800F01B31203131272723252D17 +:107D2000313129313131312F0F00302802D003DCBD +:107D30001E2821D1072070473A3809281CD2DFE8D5 +:107D400000F0151B0F1B1B1B1B1B0700002070479F +:107D500043F20400704743F202007047042070476A +:107D60000D2070470F207047082070471120704782 +:107D700013207047062070470320704710B5007825 +:107D800000F0010007F0D2F9BDE81040BCE710B5E3 +:107D9000007800F0010007F0CEF9BDE81040B3E72D +:107DA0000EB5017801F001018DF80010417801F065 +:107DB00001018DF801100178C1F340018DF8021026 +:107DC0004178C1F340018DF80310017889088DF8DE +:107DD0000410417889088DF8051081788DF8061017 +:107DE000C1788DF8071000798DF80800684606F014 +:107DF0005DFEFFF789FF0EBD2DE9F84F784CDFF8E7 +:107E0000E481383400261FE0012000F048FD012005 +:107E1000FFF74AFE054644214746D8F8080007F018 +:107E20009AFF686000B9FFDF686806F03BFDA8B103 +:107E30002846F9F7F1FD284600F036FD20B9442226 +:107E40006968B86807F0B2FF94F9E9010428DBDA41 +:107E5000022008F0DFF807460025A6E04422696802 +:107E6000D8F8080007F0A2FFF2E7B8F80210404681 +:107E7000491C89B2A8F80210B94201D300214180FF +:107E80000221B8F8020008F019F9002865D0B8F806 +:107E90000200694607F0C8F8FFF736FF00B1FFDFC0 +:107EA0009DF8000078B1B8F8020008F04CFA5FEADB +:107EB000000900D1FFDF484607F0CBFC18B1B8F845 +:107EC000020002F0D0F8B8F8020008F02AFA5FEADF +:107ED000000900D1FFDF484607F0B3FCE8BB0321EF +:107EE000B8F8020008F0EAF85FEA000B48D1FFDFBB +:107EF00046E000BFDBF8100010B10078FF2849D041 +:107F0000022000F0CCFC0220FFF7CEFD824648465E +:107F100007F0A3FDCAF8040000B9FFDFDAF8040097 +:107F200007F06BFE002100900170B8F80210504677 +:107F3000AAF8021001F0BAFF484607F060FE00B947 +:107F4000FFDF504600F0B0FC18B99AF801000007B6 +:107F500004D50099CBF8101012E024E0DBF81000F3 +:107F600038B10178491C11F0FF01017008D1FFDF21 +:107F700006E000221146484600F0F6FB00B9FFDF9C +:107F800094F9EA01022805DBB8F8020001F055FF78 +:107F90000028AFD194F9E901042804DB484607F032 +:107FA00092FE00B101266D1CEDB2BD4204D294F9DF +:107FB000EA010228BFF659AF002E7FF423AFBDE8D7 +:107FC000F84F032000F06BBC10B5064CE060086869 +:107FD0002061AFF2DB1002F0C8FF607010BD00003E +:107FE0005403002018000020F74800210170F748D2 +:107FF0000170F7494160704770B505464FF08050F9 +:108000000C46D0F8A410491C05D1D0F8A810C943DB +:108010000904090C0BD050F8A01F01F001012970D0 +:10802000416821608068A080287830B970BD062141 +:1080300020460BF08CFB01202870607940F0C000D6 +:10804000607170BD70B54FF080540D46D4F880104B +:10805000491C0BD1D4F88410491C07D1D4F88810DE +:10806000491C03D1D4F88C10491C0CD0D4F88010D2 +:108070000160D4F884104160D4F888108160D4F88D +:108080008C10C16002E010210BF061FBD4F890006D +:10809000401C0BD1D4F89400401C07D1D4F89800B0 +:1080A000401C03D1D4F89C00401C09D054F8900F18 +:1080B000286060686860A068A860E068E86070BDDB +:1080C0002846BDE8704010210BF041BBBE48383057 +:1080D0000079E9E470B5BC4C3834E07830B32078EE +:1080E00004EB4010407A00F00700204490F9E801CA +:1080F000002800DCFFDF2078002504EB4010407AE8 +:1081000000F00700011991F8E801401E81F8E8012C +:108110002078401CC0B220700F2800D12570A078B4 +:10812000401CA0700BF09CF9E57070BDFFDF70BDC6 +:108130003EB50546032107F0C1FF0446284608F076 +:10814000F0F8054604B9FFDF206918B10078FF2870 +:1081500000D1FFDF01AA6946284600F005FB60B99F +:10816000FFDF0AE0002202A9284600F0FDFA00B96C +:10817000FFDF9DF8080000B1FFDF9DF80000411E01 +:108180008DF80010EED220690199884201D10020BB +:1081900020613EBD70B50546A0F57F400C46FF3816 +:1081A00000D1FFDF012C01D0FFDF70BDFFF78EFF94 +:1081B000040000D1FFDF207820F00F00401D20F0E8 +:1081C000F000503020706580002020720120207364 +:1081D000BDE870407EE72DE9F04116460D460746A2 +:1081E000FFF774FF040000D1FFDF207820F00F00BC +:1081F000401D20F0F0005030207067800120207278 +:1082000028682061A888A0822673BDE8F04161E754 +:108210007FB5FFF7F2FC040000D1FFDF02A9204682 +:10822000FFF7FDFA054603A92046FFF712FB8DF87C +:1082300000508DF80100BDF80800001DADF80200E7 +:10824000BDF80C00001DADF80400E088ADF8060094 +:10825000684606F053FF002800D0FFDF7FBD2DE900 +:10826000F05F5A4E8146307810B10820BDE8F09F8B +:108270004846F9F706F808B11020F7E7524C207885 +:1082800008B9FFF760FC647A4D4600F09FFAA042FF +:1082900007D2201AC1B22A460020FFF777FC002837 +:1082A000E4D171684848C91C002721F003017160BE +:1082B000B3463E463D46BA463C4690F801800AE049 +:1082C000204600F077FA4178807B0E4410FB015580 +:1082D000641CE4B27F1C4445F2D10AEB870000EB3A +:1082E000C600DBF8041000EB850045185C4601224F +:1082F00029464846FFF7C9FA060013D00020FFF7C9 +:108300007CFC05000CD005F11300616820F003002F +:10831000884200D0FFDF2C484178491E41706560DB +:108320003046A3E7002229464846FFF7AEFA00B1DF +:10833000FFDFD9F8000060604FF6FF706080012019 +:108340002070002092E72DE9F04104461F481746AF +:108350000E46007810B10820BDE8F0810846F8F715 +:108360006AFF08B11020F7E7174D287808B9FFF722 +:10837000EAFB601E1E2807D8012C22D13078FE2887 +:108380001FD8A8760020E7E7A4F120001F2805D811 +:10839000E0B23A463146BDE8F04140E4A4F1400085 +:1083A0001F2805D831462046BDE8F04100F0A2BAAA +:1083B000A4F1A0001F2804D80020A02C0AD0A12CD2 +:1083C0000DD00720C8E7000054030020180000204B +:1083D00048100020317801F00101E976BCE73168EE +:1083E0000922F82901D38B0701D01046B4E76B7B33 +:1083F00003F00303012B04D1EB8AD7339CB28C42E8 +:10840000F3D8E961A8E72DE9F04781460E46084612 +:10841000F8F737FF48B94846F8F751FF28B909F18E +:10842000030020F00301494502D01020BDE8F08789 +:10843000FC484FF0000A817869B14178804600EB32 +:1084400041140834378832460021204600F039FABA +:10845000050004D027E0A6F800A00520E6E7B9F162 +:10846000000F24D03088B84201D90C251FE0607875 +:1084700000F00705284600F012FA08EB050732461F +:1084800097F8E8014946401C87F8E801204607F5BF +:10849000F47700F016FA05463878401E387003204D +:1084A00000F0FDF92DB10C2D01D0A6F800A0284652 +:1084B000BCE76078DC4E00F00701012923D00229D7 +:1084C0000CD0032933D0FFDF98F801104046491C37 +:1084D000C9B288F801100F2934D035E0616821B1A4 +:1084E000000702D46088FFF723FE98F8EA014746A8 +:1084F000012802D1707802F057FD97F9EA010428AB +:10850000E2DBFFDFE0E7616819B14422B06807F001 +:108510004DFC98F8E9014746032802D1707802F033 +:1085200043FD97F9E9010428CEDBFFDFCCE7C00665 +:1085300002D56088FFF7FCFD98F9EB010628C3DB44 +:10854000FFDFC1E780F801A08178491E8170617862 +:1085500001F0070101EB080090F8E811491C80F8D0 +:10856000E811A4E770B50D460446F8F764FE18B9A3 +:108570002846F8F786FE08B1102070BD294620462F +:10858000BDE8704009F002BB70B5054609F021FB5B +:10859000C4B22846F8F793FE08B1102070BD35B17B +:1085A00028782C7018B1A04201D0072070BD204659 +:1085B000FDF7D2FD052805D109F00FFB012801D0F8 +:1085C000002070BD0F2070BD70B5044615460E46E4 +:1085D0000846F8F730FE18B92846F8F752FE08B1F9 +:1085E000102070BD022C03D0102C01D0092070BDCA +:1085F0002A463146204609F0F9FA0028F7D005202E +:1086000070BD70B514460D460646F8F714FE38B92D +:108610002846F8F736FE18B92046F8F750FE08B19C +:10862000102070BD22462946304609F0FEFA002887 +:10863000F7D0072070BD3EB50446F8F722FE08B11A +:1086400010203EBD684606F0C0F9FFF75DFB00282C +:10865000F7D19DF806002070BDF808006080BDF8D5 +:108660000A00A08000203EBD70B505460C460846B5 +:10867000F8F725FE20B93CB12068F8F702FE08B1F2 +:10868000102070BDA08828B121462846BDE8704062 +:10869000FDF7BABD092070BD70B505460C46084609 +:1086A000F8F7C9FD30B9681E1E2814D82046F8F71F +:1086B000C2FD08B1102070BD032D01D9072070BD87 +:1086C00005B9FFDF594800EB850050F8041C20462F +:1086D000BDE870400847A5F120001F2805D82146B5 +:1086E0002846BDE87040F9F7C1BCF02D0AD0BF2D77 +:1086F000E4D1A078218800F0010001F08DFA68B182 +:10870000002070BDA068F8F796FD0028D2D1204661 +:1087100006F04CFDBDE87040FFF7F6BA082070BDCA +:1087200070B504460D460846F8F7ABFD30B9601E3B +:108730001E280FD82846F8F77EFD08B1102070BD1E +:10874000012C03D0022C01D0032C01D1062070BDD6 +:10875000072070BDA4F120001F28F9D82946204623 +:10876000BDE87040F9F7D0BC07F03AB81CB5002955 +:108770001FD104F02AFE2C4800224178C06805F081 +:108780001DFF29481030C0788DF8000010B1012875 +:1087900002D004E0012000E000208DF800006846CF +:1087A00006F06BF9214824380068019001A806F012 +:1087B000BFFA1CBD30B51B4D0446383D6878A04259 +:1087C00000D8FFDF686800EB041030BD70B51548B5 +:1087D000002538382C46467807E02046FFF7EAFFA8 +:1087E0004078641C2844C5B2E4B2B442F5D12846AE +:1087F00070BD021D5143452900D245210844C01CCB +:10880000B0FBF2F0C0B270472DE9FC5F06460548A8 +:108810004FF0000838388B464746444690F80190A0 +:1088200029E000008C030020180000201CB101008A +:108830002046FFF7BFFF050000D1FFDF68786946DB +:108840003844C7B22846FEF7EAFF824601A9284607 +:10885000FEF7FFFF0346BDF804005246001D81B23B +:10886000BDF80000001D80B207F0A6FC6A78641C09 +:1088700000FB0288E4B24C45DAD13068C01C20F01D +:1088800003003060BBF1000F00D0002042463946A3 +:1088900007F0A0FC316808443060BDE8FC9F5649F1 +:1088A00008710020C87070475349CA782AB10A7805 +:1088B00001EB42110831814201D0012070470020B4 +:1088C00070472DE9F04106460078154600F00F0488 +:1088D00000201080601E0F46052800D3FFDF4748A8 +:1088E0002A4600EB8400394650F8043C3046BDE887 +:1088F000F04118472DE9F0413F4E0C46383E4028E4 +:1089000006D041281AD0422822D0432826D11AE086 +:1089100020786578012801D913201DE5FF2D08D89E +:1089200009F0F4FA07460AF053FD381A401EA8422F +:1089300001DA122010E5208830810DE0BDE8F04119 +:10894000084600F00DB80878022807D8307603E012 +:108950000878022802D870760020FDE40720FBE4A6 +:1089600038B50446407800F00300012803D00228FF +:108970000BD0072038BD606858B1F8F7A9FCD0B912 +:108980006068F8F79CFC20B915E06068F8F753FCC4 +:1089900088B969462046FBF77FF90028EAD160785C +:1089A00000F00300022808D19DF8000028B160689B +:1089B000F8F785FC08B1102038BD6189F8290ED878 +:1089C000208988420BD8607800F003020A483838C2 +:1089D000012A06D1D731C26989B28A4201D209205F +:1089E00038BD94E80E0000F10C0585E80E000AB9C8 +:1089F00000218182002038BD8C03002004B10100D9 +:108A00002DE9F041074614468846084601F024FD4A +:108A1000064608EB88001C22796802EBC0000D189E +:108A2000688C58B14146384601F025FD014678680A +:108A30000078C200082305F120000CE0E88CA8B102 +:108A40004146384601F01EFD01467868082340780B +:108A5000C20005F1240007F000FA38B106212172A6 +:108A60006681D0E90010C4E9031009E028780928DC +:108A70000BD00520207266816868E06000202870B5 +:108A80002046BDE8F04101F0C8BC07202072668195 +:108A9000F4E72DE9F04116460D460746406801EB24 +:108AA00085011C2202EBC1014418204601F00CFD97 +:108AB00040B10021708865F30F2160F31F4105204C +:108AC0000BF02CF909202070324629463846BDE8C3 +:108AD000F04195E72DE9F0410E46074600241C21A0 +:108AE000F07816E004EB8403726801EBC303D25CF8 +:108AF0006AB1FFF7EBFA050000D1FFDF6F802A466D +:108B000021463046FFF7C5FF0120BDE8F081641C17 +:108B1000E4B2A042E6D80020F7E770B5064600248C +:108B20001C21C0780AE000BF04EB8403726801EBEB +:108B3000C303D5182A782AB1641CE4B2A042F3D842 +:108B4000402070BD28220021284604F01CFC7068DB +:108B500080892881204670BD70B5034600201C2501 +:108B6000DC780CE000EB80065A6805EBC606324460 +:108B7000167816B1128A8A4204D0401CC0B28442D0 +:108B8000F0D8402070BDF0B5044600201C26E578E2 +:108B90000EE000BF00EB8007636806EBC7073B44AD +:108BA0001F788F4202D15B78934204D0401CC0B240 +:108BB0008542EFD84020F0BD0078032801D0002086 +:108BC0007047012070470078022801D000207047CC +:108BD000012070470078072801D00020704701204D +:108BE00070472DE9F041064688461078F178154621 +:108BF000884200D3FFDF2C781C27641CF078E4B295 +:108C0000A04201D8201AC4B204EB8401706807EBBB +:108C1000C1010844017821B14146884708B12C7050 +:108C200073E72878A042E8D1402028706DE770B53E +:108C300014460B880122A240134207D113430B8034 +:108C400001230A22011D07F0D2F8047070BD2DE93E +:108C5000FF4F81B00878DDE90E7B9A4691460E46BB +:108C600040072CD4019807F06EFB040000D1FFDF11 +:108C700007F1040820461FFA88F106F0BDFC050044 +:108C800000D1FFDF204629466A4606F008FF00981B +:108C9000A0F80370A0F805A0284606F0AEFF017802 +:108CA00069F306016BF3C711017020461FFA88F1C2 +:108CB00006F0E5FC00B9FFDF019805F027FC06EBA4 +:108CC0000900017F491C017705B0BDE8F08F2DE94F +:108CD000F84F0E469A4691460746032107F0EEF9F3 +:108CE0000446008DDFF87C85002518B198F8000057 +:108CF000B0421ED1384607F026FB070000D1FFDF47 +:108D000009F10401384689B206F076FC050010D05E +:108D1000384629466A4606F0C2FE009800210A46F7 +:108D20000180817005F067FC0098C01DCAF8000042 +:108D300021E098F80000B04216D104F1260734F87B +:108D4000341F012000FA06F911EA090F00D0FFDFF5 +:108D50002088012340EA090020800A22391D384674 +:108D600007F060F8067006E0324604F1340104F1C1 +:108D70002600FFF75CFF0A2188F800102846BDE8AE +:108D8000F88FFEB515460C46064602AB0C220621AE +:108D9000FFF79DFF002827D00299607812220A7001 +:108DA000801C487008224A80A070029829880523F8 +:108DB00081806988C180A9880181E9884181002575 +:108DC0000C20CDE90005062221463046FFF73FFF83 +:108DD0002946002266F31F41F02310460AF0F4FEF4 +:108DE0006078801C60700120FEBD2DE9FE430C46BA +:108DF000804644E002AB0E2207214046FFF767FFA2 +:108E0000002841D060681C2267788678BF1C06EB7A +:108E1000860102EBC10145180298142101704770C8 +:108E20000A214180698A0181E98A4181A98881807A +:108E3000A9898181304601F00FFB029905230722A1 +:108E4000C8806F700420287000250E20CDE9000531 +:108E500021464046FFF7FBFE294666F30F2168F3E3 +:108E60001F41F023002205200AF0AEFE6078FE4983 +:108E7000801C607062682046921CFFF7B2FE60683A +:108E800080784028B6D10120BDE8FE83FEB50D46AE +:108E9000064638E002AB0E2207213046FFF717FFE7 +:108EA000002835D068681C23C17801EB810203EBF0 +:108EB000C2028418029815220270627842700A2257 +:108EC0004280A2894281A2888281084601F0C4FAC8 +:108ED000014602988180618AC180E18A0181A0886F +:108EE000B8B10020207000210E20CDE9000105233B +:108EF000072229463046FFF7AAFE6A68DB49284662 +:108F0000D21CFFF76EFE6868C0784028C2D10120ED +:108F1000FEBD0620E6E72DE9FE430C46814644E00F +:108F2000204601F0BBFAD0B302AB08220721484625 +:108F3000FFF7CDFE0028A7D060681C22657806796F +:108F4000AD1C06EB860102EBC10147180298B7F889 +:108F5000108006210170457004214180304601F0E7 +:108F60007BFA0146029805230722C180A0F80480FD +:108F70007D70082038700025CDE90005214648465F +:108F8000FFF765FE294666F30F2169F31F41F023C1 +:108F9000002205200AF018FE6078801C607062686C +:108FA000B3492046121DFFF71CFE60680179402975 +:108FB000B6D1012068E72DE9F34F83B00D4691E06B +:108FC000284601F06BFA00287ED068681C2290F8D1 +:108FD00006A00AEB8A0102EBC1014418514628465B +:108FE00001F050FAA178CB0069684978CA000146BF +:108FF00004F1240006F04DFF07468188E08B4FF016 +:109000000009091A8EB208B1C84607E04FF00108FE +:10901000504601F00CFA08B9B61CB6B2208BB0422B +:1090200000D80646B34602AB324607210398FFF745 +:109030004EFE060007D0B8F1000F0BD0504601F0ED +:10904000F6F910B106E000203EE60299B8884FF02C +:10905000020908800196E28B3968ABEB09001FFA20 +:1090600080F80A4403984E46009207F06CF9DDE957 +:109070000021F61D4346009606F08BFDE08B404430 +:1090800080B2E083B988884201D1012600E0002641 +:10909000CDE900B6238A072229460398FFF7D7FDBA +:1090A000504601F0C4F910B9E089401EE0815EB17C +:1090B000A078401CA0706868E978427811FB02F142 +:1090C000CAB20123816900E006E00E3006F08FFE8F +:1090D00080F800A00020E0836A6866492846921D57 +:1090E000FFF77FFD6868817940297FF469AF01202F +:1090F000EAE570B5064648680D4614468179402970 +:1091000010D104EB84011C2202EBC101084401F0E0 +:10911000FCF9002806D06868294684713046BDE80D +:10912000704048E770BDFEB50C460746002645E096 +:10913000204601F0B3F9D8B360681C22417901EBF5 +:10914000810102EBC1014518688900B9FFDF02AB5C +:10915000082207213846FFF7BAFD002833D00299CC +:10916000607816220A70801C48700420488060686D +:10917000407901F071F901460298052307228180A8 +:109180006989C1800820CDE9000621463846FFF7ED +:109190005EFD6078801C6070A88969890844B0F51C +:1091A000803F00D3FFDFA88969890844A8816E81C8 +:1091B000626831492046521DFFF713FD606841790E +:1091C0004029B5D10120FEBD30B5438C458BC3F39A +:1091D000C704002345B1838B641EED1AC38A6D1E3C +:1091E0001D4495FBF3F3E4B22CB1008918B1A04201 +:1091F00000D8204603444FF6FF70834200D3034655 +:1092000013800C7030BD2DE9FC41074616460D4613 +:10921000486802EB86011C2202EBC10144186A4631 +:1092200001A92046FFF7D0FFA089618901448AB2D5 +:10923000BDF80010914212D0081A00D500206081BC +:109240006868407940280AD1204601F054F9002886 +:1092500005D06868294646713846FFF764FFBDE8C7 +:10926000FC8100002C000020B98B0000C78B00009F +:10927000D58B00000BA50000F7A400002DE9FE4FE0 +:109280000F46814615465088032106F017FF0190CE +:10929000B9F8020001F0D3F882460146019801F0C6 +:1092A000FDF8002824D001981C2241680AEB8A00AE +:1092B00002EBC0000C18204601F006F9002817D177 +:1092C000B9F80000E18A88420ED8A18961B1B8429C +:1092D0000ED100265146019801F0CDF8218C01EB0A +:1092E0000008608B30B114E0504601F0A0F8A0B344 +:1092F000BDE8FE8F504601F09AF808B1678308E098 +:10930000022FF5D3B9F804006083618A884224D81B +:109310000226B81B87B2B8F80400A28B801A002876 +:1093200014DD874200DA38461FFA80FB68886968D6 +:109330000291D8F800100A44009206F0F2FFF61DE0 +:10934000009A5B460299009606F0EFFBA08B38442A +:1093500080B2A083618B884207D96888019903B0E5 +:109360005246BDE8F04F01F0EDB81FD14FF00900B3 +:109370002872B9F802006881D8E90010C5E9041024 +:10938000608BA881284601F048F85146019801F009 +:1093900072F801460198082340680078C20004F181 +:1093A000200006F05AFD0020A0836083504601F0A3 +:1093B0003EF810B9A089401EA0816888019903B0C9 +:1093C0000AF0FF02BDE8F04F1DE72DE9F041064627 +:1093D00015460F461C461846F7F72DFF18B92068AA +:1093E000F7F74FFF08B110201AE47168688C09780C +:1093F000B0EBC10F01D3132012E43946304601F01F +:109400003AF80146706808230078C20005F1200090 +:1094100006F0EDFCD4E90012C0E90012002005E4DA +:1094200010B50446032106F049FE014600F114027E +:109430002046BDE81040A4E470B50446032106F0C0 +:109440003DFE054601462046FFF765FD002816D083 +:1094500029462046FFF767FE002810D029462046FF +:10946000FFF714FD00280AD029462046FFF7BDFC6F +:10947000002804D029462046BDE870409BE570BD19 +:109480002DE9F0410C4680461EE0E178427811FB60 +:1094900002F1CAB2816901230E3006F0DEFC0778C2 +:1094A00060681C22C179491EC17107EB87016068A1 +:1094B00002EBC10146183946204600F0EFFF18B113 +:1094C000304600F0FAFF20B16068C1790029DCD194 +:1094D0008AE7FEF7FBFD050000D1FFDF0A202872B6 +:1094E000384600F0B9FF68813946204600F0CAFFCF +:1094F0000146606808234078C20006F1240006F0A7 +:10950000ACFCD0E90010C5E90310A5F8028028469C +:1095100000F083FFB07800B9FFDFB078401EB07074 +:1095200062E770B50C460546032106F0C7FD01460B +:109530004068C2792244C2712846BDE870409FE766 +:109540002DE9FE4F8246507814460F464FF0000832 +:10955000002850D0012807D0022822D0FFDF206841 +:10956000B8606068F860C3E602AB0E22082150467E +:10957000FFF7ADFB0028F2D00298152105230170FA +:10958000217841700A214180C0F80480C0F8088029 +:10959000A0F80C80628882810E20CDE900080822A4 +:1095A00021E0A678304600F057FF054606EB86011D +:1095B0002C22786802EBC1010822465A02AB114600 +:1095C0005046FFF784FB0028C9D00298072101709C +:1095D000217841700421418008218580C680CDE931 +:1095E000001805230A4639464FEA0A00FFF72FFB09 +:1095F00087F808807CE6A678022516B1022E13D0E3 +:10960000FFDF2A1D914602AB08215046FFF75FFBA2 +:109610000028A4D002980121022E01702178417007 +:109620004580868002D005E00625EAE7A188C18052 +:10963000E1880181CDE9009805230822394650468A +:10964000D4E710B50446032106F038FD014600F1C9 +:1096500008022046BDE8104072E72DE9F04F0F46A2 +:10966000054687B014465088032106F027FD4FF0C9 +:1096700000088DF808800646ADF80A80042F5CD3F8 +:109680006A78002A59D028784FF6FF794FF01C0AE3 +:10969000132815D006DC01286FD006282BD0072808 +:1096A00006D16EE0142869D0152868D0162867D036 +:1096B000CDF80080CDF8048068788DF8000037E0A0 +:1096C000B078904239D13078010736D5062F34D1A1 +:1096D00020F0080030706088414660F31F41002090 +:1096E0000AF01CFB02208DF80800ADF80C90A88849 +:1096F000ADF80E00F4E0082F1FD1A888EF8881464E +:1097000000F09DFE80460146304600F0C7FE18B1CD +:10971000404600F08CFE98B1FA48D0E90010CDE93F +:1097200000106878ADF804908DF80000ADF8067070 +:1097300060886A463146FFF703FF07B0BDE8F08F47 +:10974000716808EB88002C2202EBC000085AB8426E +:10975000F3D1EC486A46D0E90210CDE900106878F0 +:109760008DF8000008F0FF058DF802506088314642 +:10977000FFF7E6FE2246294623E097E025E0CEE00B +:1097800023E1082FD9D1B5F80480E88800F057FE0E +:1097900007460146304600F081FE0028CDD007EB99 +:1097A000870271680AEBC2000844028A4245C4D1AC +:1097B00001780829C1D1407869788842BDD1F9B2D1 +:1097C00022463046FFF765F9B7E70E2F7FF470AFFA +:1097D000E9886F898B46B5F808903046FFF7BCF9E9 +:1097E000ABF14001402901D3092048E0B9F1170F3E +:1097F00001D3172F01D20B2041E040280ED000EBFF +:10980000800271680AEBC20008440178012903D183 +:1098100040786978884290D00A2030E03046FFF7DF +:109820007CF940282AD000EB800372680AEBC30160 +:1098300002EB0108012288F800206A7888F80120EC +:109840007168AA884989B94200D93946AD8903238C +:109850002372A282E7812182A4F80C90658200F035 +:10986000FBFD6081A8F81490A8F81870A8F80E50B5 +:10987000A8F810B0204600F0D0FD5EE704200521D6 +:109880002172A4F80A80E081012121739D49D1E968 +:109890000421CDE9002169788DF80010ADF80200AF +:1098A00060886A463146FFF74BFEE3E7062F8BD30D +:1098B000B07890421AD13078010717D520F008000F +:1098C00030706088414660F31F4100200AF026FA9C +:1098D00002208DF80800A888ADF80C00ADF80E90B5 +:1098E0006088224602A9F8F785FB26E70421304666 +:1098F000FFF749F905464028BFD0022083030090B6 +:1099000022462946304600F0E6FD4146608865F370 +:109910000F2160F31F4105200AF000FA0DE70E2F1A +:10992000ABD104213046FFF72EF981464028A4D060 +:109930004146608869F30F2160F31F4105200AF05A +:10994000EDF9A88906906889009070682F89408990 +:10995000B84200D938468346B5F80680A8880190F9 +:10996000484600F079FD6081069818B10220009009 +:10997000069B24E0B8F1170F1ED3172F1CD3042029 +:10998000207200986082E781A4F810B0A4F80C80DF +:1099900009EB890271680AEBC2000D18DDE90002CB +:1099A000A5F81480A5F818B0E8812A82204600F0B6 +:1099B00034FD06202870C0E601200B2300902246CB +:1099C0004946304600F087FDB7E6082F8DD1A988BB +:1099D0003046FFF7C1F80746402886D000F027FD43 +:1099E00000289BD107EB870271680AEBC20008448C +:1099F000804600F069FD002890D1ED88B8F80E008F +:109A00002844B0F5803F05D360883A46314600F0DF +:109A100099FD92E6002DCED0A8F80E0060883A4657 +:109A20003146FFF766FB08202072384600F014FD2F +:109A30006081A5811EE72DE9F05F0C4601281ED04C +:109A4000957992F80480567905EB85011F2202EB87 +:109A5000C10121F0030B08EB060111FB05F14FF6E4 +:109A6000FF7202EAC10909F1030115FB0611264F35 +:109A700021F0031ABB6840B101283ED125E061689E +:109A8000E57891F800804E78DEE75946184606F0F2 +:109A900062F9606000B9FFDF5A460021606803F098 +:109AA00072FCE5705146B86806F055F96168486186 +:109AB00000B9FFDF6068426902EB090181616068FB +:109AC00080F800806068467017E06068524641691F +:109AD000184606F06BF95A466168B86806F066F9F0 +:109AE000032006F097FA0446032006F09BFA201A9A +:109AF000012802D1B86806F023F90BEB0A00BDE893 +:109B0000F09F000028B101002C0000200246002137 +:109B1000022090E7F7B5FF4C0A2016462070009807 +:109B200060B100254FEA0D0006F0F7F80021A170A2 +:109B30006670002D01D10099A160FEBD01250020B5 +:109B4000F2E770B50C46154638220021204603F096 +:109B50001AFC012666700A22002104F11C0003F0A1 +:109B600012FC05B9FFDF297A207861F3010020702B +:109B7000A87900282DD02A4621460020FFF75BFF58 +:109B800061684020E34A88706168C8706168087144 +:109B900061684871616888716168288808816168B6 +:109BA00068884881606886819078002811D0616853 +:109BB0000620087761682888C885616828884886F3 +:109BC0006068068560686988928801868186468516 +:109BD000828570BDC878002802D0002201202AE7C3 +:109BE000704770B50546002165F31F4100200AF05B +:109BF00095F80321284606F061FA040000D1FFDF42 +:109C000021462846FEF766FF002804D0207840F061 +:109C100010002070012070BD70B505460C46032071 +:109C200006F0EAF908B1002070BDBA48857084805A +:109C3000012070BD2DE9FF4180460E460F0CFEF756 +:109C400045FA050007D06F800321384606F036FA42 +:109C5000040008D106E004B03846BDE8F041132105 +:109C6000F8F79EBDFFDF5FEA080005D0B8F1050FE9 +:109C700018D0FFDFBDE8FF8120782A4620F00800D9 +:109C800020700020ADF8020002208DF800004FF691 +:109C9000FF70ADF80400ADF8060069463846F8F7E5 +:109CA000A9F9E7E7C6F3072101EB81021C236068ED +:109CB00003EBC202805C042803D008280AD0FFDF2F +:109CC000D8E7012000904FF440432A46204600F098 +:109CD00002FCCFE704B02A462046BDE8F041FEF77B +:109CE000D8BE2DE9F05F05464089002790460C4616 +:109CF0003E46824600F0A3FB8146287AC01E082813 +:109D00006BD2DFE800F00D04192058363C4772276B +:109D10001026002C6CD0D5E90301C4E902015CE0F7 +:109D200070271226002C63D00A2205F10C0104F1E1 +:109D3000080003F0FEFA50E071270C26002C57D0E3 +:109D4000E868A06049E0742710269CB3D5E90301B8 +:109D5000C4E902016888032106F0B0F98346FEF7E2 +:109D6000B5F902466888508049465846FEF748FED5 +:109D700033E075270A26ECB1A88920812DE07627EB +:109D80001426BCB105F10C0004F1080307C883E8F0 +:109D9000070022E07727102664B1D5E90301C4E962 +:109DA00002016888032106F089F901466888FFF7F7 +:109DB00067FB12E01CE073270826CCB168880321FA +:109DC00006F07CF901460078C00606D56888FEF7E3 +:109DD00081FE10B96888F7F703FEA8F800602CB17F +:109DE0002780A4F806A066806888A080002086E608 +:109DF000A8F80060FAE72DE9FC410C461E4617461C +:109E00008046032106F05AF905460A2C0AD2DFE8FB +:109E100004F005050505050509090907042303E004 +:109E2000062301E0FFDF0023CDE900762246294624 +:109E30004046FEF70CFFBDE8FC81F8B50546A0F5ED +:109E40007F40FF382BD0284606F06BFA040000D183 +:109E5000FFDF204605F001FE002821D001466A46BA +:109E6000204605F01CFE00980321B0F80560284646 +:109E700006F024F90446052E13D0304600F0DFFA30 +:109E800005460146204600F009FB40B1606805EB3D +:109E900085013E2202EBC101405A002800D001207A +:109EA000F8BD007A0028FAD00020F8BDF8B50446C5 +:109EB000408806F036FA050000D1FFDF6A462846E2 +:109EC000616800F0A8FA01460098091F8BB230F8CB +:109ED000032F0280428842800188994205D1042ADA +:109EE00008D0052A20D0062A16D022461946FFF7A8 +:109EF000C5F9F8BD001D0E4605460146224630460E +:109F0000FBF763F90828F4D1224629463046FCF7CE +:109F1000C2F9F8BD2C000020636864880A46011D60 +:109F20002046F9F7C5FBF4E72246001DFFF795FB35 +:109F3000EFE770B50D460646032106F0BFF80400B2 +:109F400004D02078000704D5112070BD43F2020030 +:109F500070BD2A4621463046FEF713FF18B928681F +:109F600060616868A061207840F0080020700020DF +:109F700070BD2DE9F04F0E4691B08046032106F0EA +:109F80009DF80446404606F0DEF90746002007909B +:109F900008900990ADF830000A9002900390049068 +:109FA00004B9FFDF0DF10809FFB9FFDF1DE03846F6 +:109FB0000BA9002205F014FC9DF82C0000F07F0591 +:109FC0000A2D00D3FFDF6019017F491E01779DF83C +:109FD0002C00000609D52A460CA907A8FEF727FE83 +:109FE00019F80510491C09F80510761EF6B2DED2E4 +:109FF00004F13400F84D04F1260BDFF8E0A304F17E +:10A000002A07069010E05846069900F08DFA064699 +:10A0100028700A2800D3FFDF5AF8261040468847E8 +:10A02000E08CC05DB04202D0208D0028EBD10A2028 +:10A030002870EA4D4E4628350EE00CA907A800F01E +:10A0400073FA0446375D55F8240000B9FFDF55F870 +:10A050002420394640469047BDF81E000028ECD128 +:10A0600011B0BDE8F08F10B5032106F027F8040009 +:10A0700000D1FFDF0A22002104F11C0003F083F964 +:10A08000207840F00400207010BD10B50C4603216C +:10A0900006F014F82044007F002800D0012010BDF5 +:10A0A0002DE9F84F894615468246032106F006F849 +:10A0B000070004D02846F7F7BEF840B903E043F2A2 +:10A0C0000200BDE8F88F4846F7F7DBF808B110202A +:10A0D000F7E7786828B169880089814201D90920A9 +:10A0E000EFE7B9F800001C2488B100F0A8F9804619 +:10A0F0000146384600F0D2F988B108EB880079684B +:10A1000004EBC000085C01280BD00820D9E73846D2 +:10A11000FEF703FD8046402807D11320D1E7052034 +:10A12000CFE7FDF7D3FF06000BD008EB8800796876 +:10A1300004EBC0000C18B9F8000020B1E88910B198 +:10A1400013E01120BDE72888172802D36888172854 +:10A1500001D20720B5E7686838B12B1D2246414679 +:10A160003846FFF732F90028ABD104F10C026946FA +:10A170002046FFF729F8288860826888E082B9F8CD +:10A18000000030B102202070E889A080E889A0B1E9 +:10A190002BE003202070A889A0807868817840296E +:10A1A00005D180F8028039465046FEF71EFE404633 +:10A1B00000F052F9A9F8000021E07868218B40896D +:10A1C000884200D908462083A6F802A004203072F5 +:10A1D000B9F800007081E0897082F181208B3082B3 +:10A1E000A08AB081304600F018F97868C17840291B +:10A1F00005D180F8038039465046FEF747FE00201F +:10A200005FE770B50D460646032105F057FF0400D1 +:10A210000ED0284600F013F905460146204600F00E +:10A220003DF918B1284600F002F920B1052070BDB3 +:10A2300043F2020070BD05EB85011C22606802EB51 +:10A24000C101084400F040F908B1082070BD2A4659 +:10A250002146304600F076F9002070BD2DE9F0412E +:10A260000C4617468046032105F028FF0546204688 +:10A2700000F0E5F8044695B10146284600F00EF9D5 +:10A2800080B104EB84011C22686802EBC10146180E +:10A29000304600F019F938B10820BDE8F08143F2EA +:10A2A0000200FAE70520F8E73B46324621462846F9 +:10A2B000FFF78BF80028F0D1E2B229464046FEF7BE +:10A2C000A2FF708C0838082803D24348407800F079 +:10A2D0006BFE0020E1E72DE9F0410D461746804670 +:10A2E000032105F0EBFE0446284600F0A8F80646D8 +:10A2F00024B13846F6F79FFF38B902E043F2020076 +:10A30000CBE73868F6F797FF08B11020C5E731466C +:10A31000204600F0C3F860B106EB86011C2260689D +:10A3200002EBC1014518284600F0CEF818B108200C +:10A33000B3E70520B1E7B888A98A884201D90C2083 +:10A34000ABE76168E88C4978B0EBC10F01D313200B +:10A35000A3E73146204600F095F8014660680823DF +:10A360004078C20005F1240005F041FDD7E9001254 +:10A37000C0E90012F2B221464046FEF7BAFE0020C4 +:10A380008BE72DE9F0470D461F4690468146032195 +:10A3900005F094FE0446284600F051F806463CB10C +:10A3A0004DB13846F6F78BFF50B11020BDE8F0876D +:10A3B00043F20200FAE7606858B1A0F80C8028E088 +:10A3C0003146204600F06AF818B1304600F02FF808 +:10A3D00030B10520EAE700002C00002040B1010068 +:10A3E00006EB86011C22606802EBC1014518284675 +:10A3F00000F06AF808B10820D8E7A5F80880F2B2A2 +:10A4000021464846FEF7FFFE1FB1A8896989084426 +:10A4100038800020CAE705F042BB017821F00F0127 +:10A42000491C21F0F00110310170FDF753BE20B935 +:10A430004E48807808B101207047002070474B4992 +:10A440008988884201D100207047402801D24020ED +:10A4500000E0403880B2704710B50446402800D96B +:10A46000FFDF2046FFF7E3FF10B14048808810BDB2 +:10A470004034A0B210BD406842690078484302EB06 +:10A48000C0007047C2784068037812FB03F243783B +:10A49000406901FB032100EBC1007047C2788A428A +:10A4A00009D9406801EB81011C2202EBC101405C2B +:10A4B00008B101207047002070470078062801D9B4 +:10A4C00001207047002070470078062801D0012045 +:10A4D000704700207047F0B401EB81061C274468E8 +:10A4E00007EBC6063444049D05262670E3802571DB +:10A4F000F0BCFEF785BA10B5418911B1FFF7DDFF59 +:10A5000008B1002010BD012010BD10B5C18C8278AB +:10A51000B1EBC20F04D9C18911B1FFF7CEFF08B169 +:10A52000002010BD012010BD10B50C4601230A22E9 +:10A53000011D05F092FC00782188012282409143A0 +:10A54000218010BDF0B402EB82051C264C6806EB9E +:10A55000C505072363554B681C79402C03D11A713C +:10A56000F0BCFEF7D8BCF0BC704700002C00002007 +:10A5700070B50B2000F0BDF9082000F0BAF90021F9 +:10A580000B2000F0D4F90021082000F0D0F9F44CA1 +:10A5900001256560A5600020C4F84001C4F84401AD +:10A5A000C4F848010B2000F0B5F9082000F0B2F91A +:10A5B0000B2000F091F9256070BD10B50B2000F064 +:10A5C00098F9082000F095F9E54801214160816083 +:10A5D000E4490A68002AFCD10021C0F84011C0F803 +:10A5E0004411C0F848110B2000F094F9BDE8104068 +:10A5F000082000F08FB910B50B2000F08BF9BDE8F2 +:10A600001040082000F086B900B530B1012806D00E +:10A61000022806D0FFDF002000BDD34800BDD3488C +:10A6200000BDD248001D00BD70B5D1494FF00040BB +:10A630000860D04DC00BC5F80803CF480024046063 +:10A64000C5F840410820C43500F053F9C5F83C4135 +:10A65000CA48047070BD08B5C14A002128B101285C +:10A6600011D002281CD0FFDF08BD4FF48030C2F8A3 +:10A670000803C2F84803BB483C300160C2F84011EF +:10A68000BDE80840D0E74FF40030C2F80803C2F834 +:10A690004803B44840300160C2F84411B3480CE0AC +:10A6A0004FF48020C2F80803C2F84803AD48443094 +:10A6B0000160C2F84811AD48001D0068009008BD57 +:10A6C00070B516460D460446022800D9FFDF002269 +:10A6D000A348012304F110018B4000EB8401C1F871 +:10A6E000405526B1C1F84021C0F8043303E0C0F85A +:10A6F0000833C1F84021C0F8443370BD2DE9F04162 +:10A700001D46144630B1012833D0022838D0FFDF6F +:10A71000BDE8F081891E002221F07F411046FFF73D +:10A72000CFFF012D23D00020944D924F0126687059 +:10A730003E61914900203C3908600220091D0860F3 +:10A740008D490420303908608B483D34046008206E +:10A750006C6000F0DFF83004C7F80403082000F054 +:10A76000BBF88349F007091F08602E70D0E701206D +:10A77000DAE7012B02D00022012005E00122FBE7ED +:10A78000012B04D000220220BDE8F04198E701220D +:10A79000F9E774480068704770B500F0D8F8704C5D +:10A7A0000546D4F840010026012809D1D4F8080351 +:10A7B000C00305D54FF48030C4F80803C4F84061E5 +:10A7C000D4F8440101280CD1D4F80803800308D53B +:10A7D0004FF40030C4F80803C4F84461012008F0C5 +:10A7E00014FAD4F8480101280CD1D4F80803400326 +:10A7F00008D54FF48020C4F80803C4F8486102204B +:10A8000008F003FA5E48056070BD70B500F09FF86F +:10A810005A4D0446287850B1FFF706FF687818B102 +:10A820000020687008F0F1F95548046070BD0320FD +:10A83000F8E74FF0E0214FF40010C1F80002704734 +:10A84000152000F067B84B4901200861082000F08E +:10A8500061B848494FF47C10C1F808030020024653 +:10A8600001EB8003C3F84025C3F84021401CC0B26F +:10A870000628F5D37047410A43F609525143C0F305 +:10A88000080010FB02F000F5807001EB50207047CB +:10A8900010B5430B48F2376463431B0C5C020C6039 +:10A8A000384C03FB0400384B4CF2F72443435B0D58 +:10A8B00013FB04F404EB402000F58070401210708C +:10A8C00008681844086010BD2C4840687047294942 +:10A8D0000120C1F800027047002809DB00F01F02C8 +:10A8E000012191404009800000F1E020C0F80011F2 +:10A8F000704700280DDB00F01F0201219140400944 +:10A90000800000F1E020C0F88011BFF34F8FBFF34B +:10A910006F8F7047002809DB00F01F020121914072 +:10A920004009800000F1E020C0F88012704749071C +:10A93000090E002804DB00F1E02080F800147047C5 +:10A9400000F00F0000F1E02080F8141D70470C4863 +:10A95000001F00680A4A0D49121D1160704700006F +:10A9600000B0004004B500404081004044B10040C8 +:10A9700008F501400080004040850040380000207C +:10A9800014050240F7C2FFFF6F0C01000100000137 +:10A9900010B5EFF3108000F0010472B6FC48417866 +:10A9A000491C41704078012801D108F081FD002C3C +:10A9B00000D162B610BD70B5F54CA07848B901253C +:10A9C000A570FFF7E5FF08F084FD20B1002008F036 +:10A9D0004EFD002070BD4FF08040E570C0F804537C +:10A9E000F7E770B5EFF3108000F0010572B6E84CA0 +:10A9F000607800B9FFDF6078401E6070607808B949 +:10AA000008F05AFD002D00D162B670BDE04810B5C7 +:10AA1000817821B10021C1708170FFF7E2FF002031 +:10AA200010BD10B5044608F054FDD9498978084096 +:10AA300000D001202060002010BD10B5FFF7A8FF56 +:10AA400008F047FD02220123D149540728B1D1481B +:10AA5000026023610320087202E00A72C4F8043322 +:10AA60000020887110BD2DE9F84FDFF8249342785B +:10AA7000817889F80420002689F80510074689F8AE +:10AA800006600078DFF810B3354620B1012811D0F8 +:10AA9000022811D0FFDF08F02EFD4FF0804498B15E +:10AAA00008F030FDB0420FD1304608F02FFD0028ED +:10AAB000FAD042E00126EEE7FFF76AFF5846016848 +:10AAC000C907FCD00226E6E70120E060C4F8045183 +:10AAD000B2490E600107D1F84412B04AC1F34231C5 +:10AAE00024321160AD49343108604FF0020AC4F8D5 +:10AAF00004A3A060AA480168C94341F3001101F111 +:10AB00000108016841F01001016001E010F030F926 +:10AB1000D4F804010028F9D0304608F0F7FC0028EA +:10AB2000FAD0B8F1000F04D19D48016821F010015E +:10AB30000160C4F808A3C4F8045199F805004E4612 +:10AB400080B1387870B908F0C4FC804608F0CAFEBD +:10AB50006FF00042B8F1000F02D0C6E9032001E017 +:10AB6000C6E90302DBF80000C00701D008F0ADFC25 +:10AB7000387810B13572BDE8F88F4FF01808C4F876 +:10AB800008830127A7614FF42070ADF8000000BFD3 +:10AB9000BDF80000411EADF80010F9D2C4F80C5108 +:10ABA000C4F810517A48C01D08F030FD3570FFF729 +:10ABB00044FF67617949307920310860C4F8048323 +:10ABC000D9E770B5050000D1FFDF4FF080424FF0AC +:10ABD000FF30C2F808030021C2F80011C2F80411C6 +:10ABE000C2F80C11C2F81011694C617008F07DFCBC +:10ABF00010B10120A070607067480068C00701D0E4 +:10AC000008F063FC2846BDE870402CE76048007AF5 +:10AC1000002800D0012070472DE9F04F61484FF027 +:10AC2000000A85B0D0F800B0D14657465D4A5E496B +:10AC3000083211608406D4F8080110B14FF0010801 +:10AC400001E04FF0000808F0B4FC78B1D4F824011A +:10AC500000B101208246D4F81C0100B101208146D8 +:10AC6000D4F8200108B1012700E00027D4F8000142 +:10AC700000B101200490D4F8040100B10120039038 +:10AC8000D4F80C0100B101200290D4F8100100B1F9 +:10AC900001203F4D0190287800260090B8F1000F68 +:10ACA00004D0C4F80861012008F0E1FBBAF1000FFC +:10ACB00004D0C4F82461092008F0D9FBB9F1000FD1 +:10ACC00004D0C4F81C610A2008F0D1FB27B1C4F8F5 +:10ACD00020610B2008F0CBFB2D48C01D08F09EFC26 +:10ACE00000B1FFDFDFF8AC800498012780B1C4F821 +:10ACF0000873E87818B1EE70002008F0B8FB287AE5 +:10AD0000022805D1032028720221C8F8001027610B +:10AD1000039808B1C4F80461029850B1C4F80C61FA +:10AD2000287A032800D0FFDFC8F800602F72FFF7F1 +:10AD300058FE019838B1C4F81061287A012801D171 +:10AD400000F05CF86761009838B12E70287A01280D +:10AD500001D1FFF772FEFFF744FE0D48C01D08F059 +:10AD600073FC1049091DC1F800B005B0BDE8F08FB3 +:10AD7000074810B5C01D08F051FC0549B0B10120CD +:10AD800008704FF0E021C1F80002BDE81040FFE577 +:10AD900040000020340C00400C0400401805004026 +:10ADA00010ED00E01005024001000001087A0128C2 +:10ADB00001D1FFF742FEBDE81040244808F044BC32 +:10ADC00070B5224CE41FA07808B908F075FB01208B +:10ADD0008507A861207A0026032809D1D5F80C013F +:10ADE00020B9002008F092FB0028F7D1C5F80C61CB +:10ADF00026724FF0FF30C5F8080370BD70B5134CD4 +:10AE0000E41F6079F0B1012803D0A179401E81428E +:10AE100018DA08F05EFB054608F064FD6179012947 +:10AE200002D9A179491CA1710DB1216900E0E16845 +:10AE3000411A022902DA11F1020F06DC0DB120617C +:10AE400000E0E060BDE87040F7E570BD470000201D +:10AE5000374901200860704770B50D2000F049F8AF +:10AE6000344C0020C4F800010125C4F804530D201F +:10AE700000F050F825604FF0E0216014C1F80001A7 +:10AE800070BD10B50D2000F034F82A480121416052 +:10AE90000021C0F80011BDE810400D2000F03AB8C4 +:10AEA000254810B504682449244808310860214920 +:10AEB000D1F80001012804D0FFDF1F48001D046005 +:10AEC00010BD1B48001D00680022C0B2C1F800215F +:10AED00008F05FFCF1E710B5164800BFD0F800118C +:10AEE0000029FBD0FFF7DCFFBDE810400D2000F08B +:10AEF00011B800280DDB00F01F020121914040092C +:10AF0000800000F1E020C0F88011BFF34F8FBFF345 +:10AF10006F8F7047002809DB00F01F02012191406C +:10AF20004009800000F1E020C0F880127047000066 +:10AF300004D5004000D0004010050240010000018F +:10AF40004FF0E0214FF00070C1F8800101F5C071B1 +:10AF5000BFF34F8FBFF36F8FC1F80001394B8022D1 +:10AF600083F8002441F8800C704700B502460420A5 +:10AF7000354903E001EBC0031B792BB1401EC0B281 +:10AF8000F8D2FFDFFF2000BD41F8302001EBC00107 +:10AF900000224A718A7101220A7100BD2A4A0021E9 +:10AFA00002EBC0000171704710B50446042800D3BD +:10AFB000FFDF254800EBC4042079012800D0FFDF23 +:10AFC0006079A179401CC0B2814200D060714FF01D +:10AFD000E0214FF00070C1F8000210BD70B50425EB +:10AFE000194E1A4C16E0217806EBC1000279012AAD +:10AFF00008D1427983799A4204D04279827156F815 +:10B00000310080472078401CC0B22070042801D352 +:10B01000002020706D1EEDB2E5D270BD0C4810B559 +:10B0200004680B490B4808310860064890F8000492 +:10B030004009042800D0FFDFFFF7D0FF0448001DBF +:10B04000046010BD19E000E07805002054000020E5 +:10B0500010050240010000010F4A12680D498A42A2 +:10B060000CD118470C4A12680A4B9A4206D101B516 +:10B0700008F00AFC08F0DDFEBDE801400749096858 +:10B080000958084706480749054A064B704700001B +:10B0900000000000BEBAFECA5800002004000020D4 +:10B0A000B00F0020B00F002070B50C46054600F030 +:10B0B00045FB21462846BDE8704001F026BC000053 +:10B0C000F8B51D46DDE906470E000AD005F03BF94C +:10B0D0002346FF1DBCB231462A46009404F059FDB8 +:10B0E000F8BDD0192246194602F023F92046F8BDD2 +:10B0F00070B50D4604461022002102F044F9258166 +:10B1000017206081A07B40F00A00A07370BD4FF64D +:10B11000FF720A800146022008F000BE70470089D5 +:10B120007047827BD30701D1920703D480890880BE +:10B130000020704705207047827B920700D58181EF +:10B14000704701460020098841F6FE52114200D0A6 +:10B150000120704700B50346807BC00701D0052061 +:10B1600000BD59811846FFF7ECFFC00703D0987B5C +:10B1700040F004009873987B40F001009873002021 +:10B1800000BD827B520700D509B140897047172066 +:10B190007047827B61F3C302827370472DE9FC5FC5 +:10B1A0000E46044601789646012000FA01F14DF65C +:10B1B000FF5201EA020962684FF6FF7B1188594588 +:10B1C00002D10920BDE8FC9FB9F1000F05D041F67E +:10B1D000FE55294201D00120F4E741EA090111801E +:10B1E0001D0014D000232B7094F800C00521032209 +:10B1F0001F464FF0020ABCF10E0F76D2DFE80CF0CA +:10B20000F909252F47646B77479193B4D1D804206F +:10B21000D8E7616820898B7B9B0767D517284AD3BD +:10B220000B89834247D38989172901D3814242D1AF +:10B2300085F800A0A5F80100328061688881606807 +:10B24000817B21F002018173C6E0042028702089EF +:10B25000A5F801006089A5F803003180BCE0208AD0 +:10B260003188C01D1FFA80F8414524D3062028707C +:10B270002089A5F801006089A5F80300A089A5F838 +:10B2800005000721208ACDE90001636941E00CF047 +:10B29000FF00082810D0082028702089A5F8010098 +:10B2A0006089A5F8030031806A1D694604F10C002D +:10B2B00006F0BBFC10B15EE01020EDE730889DF891 +:10B2C00000100844308087E00A2028702089A5F803 +:10B2D0000100328044E00C2028702089A5F801008C +:10B2E0006089A5F8030031803AE082E064E02189BA +:10B2F000338800EB41021FFA82F843453BD3B8F193 +:10B30000050F38D30E222A700BEA4101CDE9001057 +:10B31000E36860882A467146FFF7D2FEA6F80080EF +:10B320005AE04020287060893188C01C1FFA80F8DC +:10B33000414520D32878714620F03F001230287014 +:10B340002089A5F801006089CDE9000260882A46BD +:10B35000E368FFF7B5FEA6F80080287840063BD4E6 +:10B3600061682089888037E0A0893288401D1FFAF3 +:10B3700080F8424501D204273DE01620287020893C +:10B38000A5F801006089A5F80300A089CDE90001B6 +:10B3900060882A4671462369FFF792FEA6F800806E +:10B3A000DEE718202870207A6870A6F800A013E065 +:10B3B00061680A88920401D405271CE0C9882289A3 +:10B3C000914201D0062716E01E2129703080606866 +:10B3D000018821F400510180B9F1000F0BD0618880 +:10B3E00078230022022008F0EFFB61682078887043 +:10B3F00006E0338003276068018821EA09010180A3 +:10B400003846DFE62DE9FF4F85B01746129C0D0048 +:10B410001E461CD03078C10703D000F03F00192829 +:10B4200001D9012100E000212046FFF7AAFEA84231 +:10B430000DD32088A0F57F41FF3908D03078410630 +:10B4400001D4000605D5082009B0BDE8F08F07201B +:10B45000FAE700208DF800008DF8010030786B1EAF +:10B4600000F03F0C0121A81E4FF0050A4FF0020921 +:10B470004FF0030B9AB2BCF1200F75D2DFE80CF04D +:10B480008B10745E7468748C749C74B574BA74C8D0 +:10B4900074D474E1747474F174EF74EE74ED748B9D +:10B4A000052D78D18DF80090A0788DF80400708873 +:10B4B000ADF8060030798DF80100707800F03F009B +:10B4C0000C2829D00ADCA0F10200092863D2DFE8A9 +:10B4D00000F0126215621A621D622000122824D048 +:10B4E00004DC0E281BD01028DBD11BE016281FD04F +:10B4F0001828D6D11FE02078800701E02078400787 +:10B50000002848DAEEE020780007F9E72078C00646 +:10B51000F6E720788006F3E720784006F0E7207809 +:10B520000006EDE72088C005EAE720884005E7E748 +:10B5300020880005E4E72088C004E1E72078800740 +:10B5400029D5032D27D18DF800B0B6F8010081E090 +:10B55000217849071FD5062D1DD381B270780128A7 +:10B5600003D0022817D102E0C9E0022000E0102039 +:10B5700004228DF8002072788DF80420801CB1FB25 +:10B58000F0F2ADF8062092B242438A4203D103970B +:10B59000ADF80890A6E079E02078000776D598B25B +:10B5A00082088DF800A0ADF80420B0EB820F6DD1B9 +:10B5B0000297ADF8061095E02178C90666D5022DF0 +:10B5C00064D381B206208DF80000707802285DD324 +:10B5D000B1FBF0F28DF80400ADF8062092B24243C0 +:10B5E0008A4253D1ADF808907BE0207880064DD593 +:10B5F000072003E0207840067FD508208DF8000062 +:10B60000A088ADF80400ADF80620ADF8081068E099 +:10B610002078000671D50920ADF804208DF80000CF +:10B62000ADF8061002975DE02188C90565D5022DA9 +:10B6300063D381B20A208DF80000707804285CD3AF +:10B64000C6E72088400558D5012D56D10B208DF82E +:10B650000000A088ADF8040044E021E026E016E0F8 +:10B66000FFE72088000548D5052D46D30C208DF82E +:10B670000000A088ADF80400B6F803006D1FADF817 +:10B680000850ADF80600ADF80AA02AE035E02088A1 +:10B69000C00432D5012D30D10D208DF8000021E0FD +:10B6A0002088800429D4B6F80100E080A07B000740 +:10B6B00023D5032D21D3307800F03F001B2818D06C +:10B6C0000F208DF80000208840F40050A4F80000FE +:10B6D000B6F80100ADF80400ED1EADF80650ADF867 +:10B6E00008B0039769460598F9F7B8FA050008D03D +:10B6F00016E00E208DF80000EAE7072510E0082587 +:10B700000EE0307800F03F001B2809D01D2807D03C +:10B710000220059908F002FB208800F400502080E8 +:10B72000A07B400708D52046FFF70BFDC00703D1DB +:10B73000A07B20F00400A073284685E61FB50228F0 +:10B7400006D101208DF8000088B26946F9F786FA23 +:10B750001FBD0000F8B51D46DDE906470E000AD002 +:10B7600004F0F1FD2346FF1DBCB231462A46009489 +:10B7700004F00FFAF8BDD0192246194601F0D9FDA0 +:10B780002046F8BD2DE9FF4F8DB09B46DDE91B57E4 +:10B79000DDF87CA00C46082B05D0E06901F0FEF82E +:10B7A00050B11020D2E02888092140F010002880F4 +:10B7B0008AF80010022617E0E16901208871E26929 +:10B7C0004FF420519180E1698872E06942F60101ED +:10B7D0000181E069002181732888112140F0200057 +:10B7E00028808AF80010042638780A900A203870D9 +:10B7F0004FF0020904F118004D460C9001F0C6FB11 +:10B80000B04681E0BBF1100F0ED1022D0CD0A9EB98 +:10B810000800801C80B20221CDE9001005AB524621 +:10B820001E990D98FFF796FFBDF816101A988142E1 +:10B8300003D9F74800790F9004E003D10A9808B1C2 +:10B8400038702FE04FF00201CDE900190DF1160319 +:10B8500052461E990D98FFF77DFF1D980088401BEA +:10B86000801B83B2C6F1FF00984200D203461E99A6 +:10B870000BA8D9B15FF00002DDF878C0CDE9032054 +:10B8800009EB060189B2CDE901C10F980090BDF81E +:10B89000161000220D9801F00EFC387070B1C0B285 +:10B8A000832807D0BDF8160020833AE00AEB09018F +:10B8B0008A19E1E7022011B0BDE8F08FBDF82C0035 +:10B8C000811901F0FF08022D0DD09AF801204245A0 +:10B8D00006D1BDF82010814207D0B8F1FF0F04D087 +:10B8E0009AF801801FE08AF80180C9480068017851 +:10B8F000052902D1BDF81610818009EB08001FFA56 +:10B9000080F905EB080085B2DDE90C1005AB0F9A54 +:10B9100001F03FFB28B91D980088411B4145BFF647 +:10B9200071AF022D13D0BBF1100F0CD1A9EB0800A1 +:10B93000801C81B20220CDE9000105AB52461E9960 +:10B940000D98FFF707FF1D98058000203870002034 +:10B95000B1E72DE9F8439C46089E13460027B26BD9 +:10B960009AB3491F8CB2F18FA1F57F45FF3D05D0F9 +:10B970005518AD882944891D8DB200E0002529198C +:10B98000B6F83C800831414520D82A44BCF8011063 +:10B9900022F8021BBCF8031022F8021B984622F87A +:10B9A000024B914604F0BDFC4FF00C0C41464A4658 +:10B9B0002346CDF800C004F0B8F8F587B16B00203D +:10B9C0002944A41D2144088003E001E0092700E088 +:10B9D00083273846BDE8F88310B50B88848F9C42D6 +:10B9E0000CD9846BE018048844B1848824F40044A2 +:10B9F000A41D23440B801060002010BD0A2010BD40 +:10BA00002DE9F0478AB00025904689468246ADF878 +:10BA1000185007274BE0059806888088000446D414 +:10BA2000A8F8006007A8019500970295CDE903509A +:10BA30004FF4007300223146504601F03CFB0400F5 +:10BA40003CD1BDF81800ADF8200005980488818825 +:10BA5000B44216D10A0414D401950295039521F439 +:10BA600000410097049541F48043428821465046A6 +:10BA700001F0BFF804000BD10598818841F4004122 +:10BA8000818005AA08A94846FFF7A6FF0400DCD07C +:10BA90000097059802950195039504950188BDF8D6 +:10BAA0001C300022504601F0A4F80A2C06D105AA49 +:10BAB00006A94846FFF790FF0400ACD0ADF8185037 +:10BAC00004E00598818821F40041818005AA06A937 +:10BAD0004846FFF781FF0028F3D00A2C03D0204608 +:10BAE0000AB0BDE8F0870020FAE710B50C46896B74 +:10BAF00086B051B10C218DF80010A18FADF808105F +:10BB0000A16B01916946FAF75BF800204FF6FF71CF +:10BB1000A063E187A08706B010BD2DE9F0410D4676 +:10BB20000746896B0020069E1446002911D0012B80 +:10BB30000FD1324629463846FFF762FF002808D168 +:10BB4000002C06D0324629463846BDE8F04100F0C8 +:10BB500034BFBDE8F0812DE9FC411446DDE9087CE5 +:10BB60000E46DDE90A15521DBCF800E092B296457A +:10BB700002D20720BDE8FC81ACF8002017222A7011 +:10BB8000A5F80160A5F803300522CDE900423B4647 +:10BB90002A46FFF7DFFD0020ECE770B50C4615469E +:10BBA00048220021204601F0EEFB04F1080044F891 +:10BBB0001C0F00204FF6FF71E06161842084A58492 +:10BBC0001720E08494F82A0040F00A0084F82A0044 +:10BBD00070BD4FF6FF720A800146032008F09EB840 +:10BBE00030B585B00C460546FFF77FFFA18E28468D +:10BBF00029B101218DF800106946F9F7E1FF002015 +:10BC0000E0622063606305B030BDB0F8400070476B +:10BC10005C00002090F84620920703D440880880FA +:10BC20000020F4E70620F2E790F846209207EED5D0 +:10BC3000A0F84410EBE70146002009880A0700D568 +:10BC4000012011F0F00F01D040F00200CA0501D52B +:10BC500040F004008A0501D540F008004A0501D5EE +:10BC600040F010000905D2D540F02000CFE700B524 +:10BC7000034690F84600C00701D0062000BDA3F897 +:10BC800042101846FFF7D7FF10F03E0F05D093F88B +:10BC9000460040F0040083F8460013F8460F40F0D9 +:10BCA00001001870002000BD90F84620520700D512 +:10BCB00011B1B0F84200AAE71720A8E710F8462F04 +:10BCC00061F3C3020270A2E72DE9FF4F9BB00E00A3 +:10BCD000DDE92B34DDE92978289D24D02878C107B7 +:10BCE00003D000F03F00192801D9012100E0002114 +:10BCF0002046FFF7D9FFB04215D32878410600F05F +:10BD00003F010CD41E290CD0218811F47F6F0AD179 +:10BD10003A8842B1A1F57F42FF3A04D001E01229EE +:10BD200001D1000602D504201FB0C5E5FA491D98CF +:10BD30004FF0000A08718DF818A08DF83CA00FAAEA +:10BD40000A60ADF81CA0ADF850A02978994601F022 +:10BD50003F02701F5B1C04F1180C4FF0060E4FF0F1 +:10BD6000040BCDF858C01F2A7ED2DFE802F07D7D9B +:10BD7000107D267DAC7DF47DF37DF27DF17DF47D3B +:10BD8000F07D7D7DEF7DEE7D7D7D7D7DED0094F808 +:10BD90004610B5F80100890701D5032E02D08DF8B1 +:10BDA00018B01EE34FF40061ADF85010608003211D +:10BDB0008DF83C10ADF84000D4E2052EEFD1B5F877 +:10BDC00001002083ADF81C00B5F80310618308B1B1 +:10BDD000884201D9012079E10020A07220814FF62C +:10BDE000FF702084169801F0D1F8052089F8000032 +:10BDF0000220029083460AAB1D9A16991B9801F007 +:10BE0000C8F890BB9DF82E00012804D0022089F8C4 +:10BE10000100102003E0012089F8010002200590B4 +:10BE2000002203A90BA805F000FFE8BB9DF80C0059 +:10BE3000059981423DD13988801CA1EB0B018142DB +:10BE400037DB02990220CDE900010DF12A034A46B1 +:10BE500041461B98FFF77EFC02980BF1020B801CF9 +:10BE600081B217AA029101E09CE228E003A90BA885 +:10BE700005F0DBFE02999DF80C00CDE9000117AB3F +:10BE80004A4641461B98FFF765FC9DF80C000AAB3B +:10BE90000BEB00011FFA81FB02991D9A084480B246 +:10BEA000029016991B9800E003E001F072F8002858 +:10BEB000B6D0BBF1020F02D0A7F800B04FE20A20C3 +:10BEC0008DF818004BE200210391072EFFF467AFB5 +:10BED000B5F801002083ADF81C00B5F8032062839B +:10BEE00000283FF477AF90423FF674AF0120A07274 +:10BEF000B5F8050020810020A073E06900F04EFD38 +:10BF000078B9E16901208871E2694FF4205191808C +:10BF1000E1698872E16942F601000881E069002167 +:10BF20008173F01F20841E98606207206084169839 +:10BF300001F02CF8072089F80000012004900290FD +:10BF40000020ADF82A0028E019E29FE135E1E5E0A4 +:10BF500012E2A8E080E043E00298012814D0E069F2 +:10BF60008079012803D1BDF82800ADF80E000498AF +:10BF700003ABCDE900B04A4641461B98FFF7EAFB08 +:10BF80000498001D80B20490BDF82A00ADF80C00A2 +:10BF9000ADF80E00059880B202900AAB1D9A169972 +:10BFA0001B9800F0F6FF28B902983988001D05900B +:10BFB0008142D1D20298012881D0E069807901289C +:10BFC00003D1BDF82800ADF80E00049803ABCDE90D +:10BFD00000B04A4641461B98FFF7BCFB0298BDE102 +:10BFE000072E02D0152E7FF4DAAEB5F801102183AA +:10BFF000ADF81C10B5F80320628300293FF4EAAEC7 +:10C0000091423FF6E7AE0121A1724FF0000BA4F878 +:10C0100008B084F80EB0052E07D0C0B2691DE269E1 +:10C0200005F0E4FD00287FF44AAF4FF6FF7020844E +:10C0300001A906AA14A8CDF800B081E885032878E4 +:10C04000214600F03F031D9A1B98FFF79BFB824699 +:10C05000208BADF81C0082E10120032EC3D14021CA +:10C06000ADF85010B5F801102183ADF81C100AAAE4 +:10C07000B8F1000F00D00023CDE9020304921D980F +:10C08000CDF80480009038880022401E83B21B98AF +:10C0900001F011F88DF8180090BB0B2089F8000012 +:10C0A000BDF8280035E04FF0010C052E9BD1802013 +:10C0B000ADF85000B5F801102183B5F803002084D5 +:10C0C000ADF81C10B0F5007F03D907208DF81800DB +:10C0D00087E140F47C4222840CA8B8F1000F00D024 +:10C0E0000023CDE90330CDE9018C1D9800903888FC +:10C0F000401E83B21B9800F0DEFF8DF8180018B1C7 +:10C100008328A8D10220BFE00D2189F80010BDF8D6 +:10C110003000401C22E100005C000020032E04D20D +:10C1200048067FF53CAE002018E1B5F80110ADF8E7 +:10C130001C102878400602D58DF83CE002E007206C +:10C140008DF83C004FF000080320CDE902081E9B4B +:10C15000CDF810801D980193A6F1030B00901FFAF3 +:10C160008BF342461B9800F044FD8DF818008DF8C3 +:10C170003C80297849060DD52088C00506D5208B3E +:10C18000BDF81C10884201D1C4F8248040468DF8C7 +:10C190001880E3E0832801D14FF0020A4FF4807049 +:10C1A000ADF85000BDF81C002083A4F820B01E9804 +:10C1B0006062032060841321CDE0052EFFF4EFAD13 +:10C1C000B5F80110ADF81C10A28F6AB3A2F57F4339 +:10C1D000FE3B29D008228DF83C2000BF4FF0000B19 +:10C1E0000523CDE9023BDDF878C0CDF810B01D9AEB +:10C1F00080B2CDF804C040F400430092B5F80320AB +:10C200001B9800F0F6FC8DF83CB04FF400718DF8EF +:10C210001800ADF85010832810D0F8B1A18FA1F507 +:10C220007F40FE3807D0DCE00B228DF83C204FF633 +:10C23000FE72A287D2E7A4F83CB0D2E000942B466D +:10C2400031461E9A1B98FFF784FB8DF8180008B141 +:10C2500083284BD1BDF81C00208353E700942B4664 +:10C2600031461E9A1B98FFF774FB8DF81800E8BB47 +:10C27000E18FA06B0844831D8DE888034388828882 +:10C2800001881B98FFF767FC824668E095F80180FB +:10C29000022E70D15FEA080002D0B8F1010F6AD116 +:10C2A00009208DF83C0007A800908DF84080434697 +:10C2B000002221461B98FFF730FC8DF842004FF01A +:10C2C000000B8DF843B050B9B8F1010F12D0B8F19E +:10C2D000000F04D1A18FA1F57F40FF380AD0A08FB5 +:10C2E00040B18DF83CB04FF4806000E037E0ADF82D +:10C2F00050000DE00FA91B98F9F762FC82468DF8FB +:10C300003CB04FF48060ADF85000BAF1020F06D097 +:10C31000FC480068C07928B18DF8180027E0A4F81F +:10C32000188044E0BAF1000F03D081208DF8180086 +:10C330003DE007A800904346012221461B98FFF7E5 +:10C34000ECFB8DF8180021461B98FFF7CEFB9DF8FB +:10C35000180020B9192189F80010012038809DF8B3 +:10C360003C0020B10FA91B98F9F72AFC8246BAF1CC +:10C37000000F33D01BE018E08DF818E031E0207892 +:10C38000000712D5012E10D10A208DF83C00E0885C +:10C39000ADF8400003201B9907F0C0FC0820ADF861 +:10C3A0005000C0E648067FF5FAAC4FF0040A20883A +:10C3B000BDF8501008432080BDF8500080050BD513 +:10C3C000A18FA1F57F40FE3806D11E98E062289823 +:10C3D0002063A6864FF0030A5046A5E49DF8180096 +:10C3E00078B1012089F80000297889F80110BDF89A +:10C3F0001C10A9F802109DF8181089F804100520E7 +:10C4000038802088BDF8501088432080E4E72DE96B +:10C41000FF4F8846087895B0012181404FF209000E +:10C42000249C0140ADF820102088DDF88890A0F50C +:10C430007F424FF0000AFF3A06D039B1000705D518 +:10C44000012019B0BDE8F08F0820FAE7239E4FF0D5 +:10C45000000B0EA886F800B018995D460988ADF863 +:10C460003410A8498DF81CB0179A0A718DF838B0AD +:10C47000086098F8000001283BD0022809D0032862 +:10C480006FD1307820F03F001D303070B8F80400D4 +:10C49000E08098F800100320022904D1317821F0BF +:10C4A0003F011B31317094F84610090759D505AB8F +:10C4B000B9F1000F13D0002102AA82E80B00072077 +:10C4C000CDE90009BDF83400B8F80410C01E83B2ED +:10C4D0000022159800F0EFFD0028D1D101E0F11CF9 +:10C4E000EAE7B8F80400A6F80100BDF81400C01C83 +:10C4F00004E198F805108DF81C1098F80400012844 +:10C5000006D04FF4007A02282CD00328B8D16CE171 +:10C510002188B8F8080011F40061ADF8201020D08F +:10C5200017281CD3B4F84010814218D3B4F8441033 +:10C53000172901D3814212D1317821F03F01C91C62 +:10C540003170A6F801000321ADF83410A4F84400BE +:10C5500094F8460020F0020084F8460065E10525C5 +:10C560007EE177E1208808F1080700F4FE60ADF86D +:10C57000200010F0F00F1BD010F0C00F03D038884F +:10C58000228B9042EBD199B9B878C00710D0B96826 +:10C590000720CDE902B1CDF804B00090CDF810B07D +:10C5A000FB88BA883988159800F023FB0028D6D17B +:10C5B0002398BDF82010401C80294ED006DC10299D +:10C5C0000DD020290BD0402987D124E0B1F5807F00 +:10C5D0006ED051457ED0B1F5806F97D1DEE0C806B0 +:10C5E00001D5082000E0102082460DA907AA0520E9 +:10C5F000CDE902218DF83800ADF83CB0CDE90496C4 +:10C6000008A93888CDE9000153460722214615982C +:10C61000FFF7B8F8A8E09DF81C2001214FF00A0AA6 +:10C62000002A9BD105ABB9F1000F00D00020CDE965 +:10C6300002100720CDE90009BDF834000493401E24 +:10C6400083B2218B0022159800F035FD8DF81C0077 +:10C650000B203070BDF8140020E09DF81C20012153 +:10C660004FF00C0A002A22D113ABB9F1000F00D011 +:10C670000020CDE902100720CDE900090493BDF8A0 +:10C680003400228C401E83B2218B159800F013FDDC +:10C690008DF81C000D203070BDF84C00401CADF82A +:10C6A000340005208DF83800208BADF83C00BCE04C +:10C6B0003888218B88427FF452AF9DF81C004FF0E0 +:10C6C000120A00281CD1606AA8B1B878C0073FF4EC +:10C6D00046AF00E018E0BA680720CDE902B2CDF815 +:10C6E00004B00090CDF810B0FB88BA88159800F01F +:10C6F00080FA8DF81C00132030700120ADF8340052 +:10C7000093E000005C0000203988208B8142D2D168 +:10C710009DF81C004FF0160A0028A06B08D0E0B36B +:10C720004FF6FF7000215F46ADF808B0019027E09A +:10C7300068B1B978C907BED1E18F0DAB0844821D3D +:10C7400003968DE80C0243888288018809E0B87856 +:10C75000C007BCD0BA680DAB03968DE80C02BB884D +:10C76000FA881598FFF7F7F905005ED0072D72D00B +:10C7700076E0019005AA02A92046FFF72DF90146AF +:10C78000E28FBDF80800824201D00029F1D0E08F8D +:10C79000A16B084407800198E08746E09DF81C00E3 +:10C7A0004FF0180A40B1208BC8B138882083214649 +:10C7B0001598FFF79AF938E004F118000090237EED +:10C7C000012221461598FFF7A8F98DF81C000028D2 +:10C7D000EDD1192030700120ADF83400E7E70525D0 +:10C7E00021461598FFF781F93AE0208800F400709F +:10C7F000ADF8200050452DD1A08FA0F57F41FE3926 +:10C8000001D006252CE0D8F808004FF0160A48B1F0 +:10C81000A063B8F80C10A1874FF6FF71E187A0F86C +:10C8200000B002E04FF6FF70A087BDF8200030F4A2 +:10C830007F611AD0782300220320159907F0C4F9EC +:10C8400098F8000020712088BDF82010084320804F +:10C850000EE000E007252088BDF8201088432080E6 +:10C86000208810F47F6F1CD03AE02188814321801A +:10C870009DF8380020B10EA91598F9F7A1F90546E1 +:10C880009DF81C000028EBD086F801A00120307034 +:10C89000208B70809DF81C0030710520ADF83400AD +:10C8A000DEE7A18EE1B118980DAB0088ADF8340039 +:10C8B0002398CDE90304CDE90139206B0090E36AA8 +:10C8C000179A1598FFF700FA054601208DF83800F1 +:10C8D0000EA91598F9F774F900B10546A4F834B01B +:10C8E00094F8460040070AD52046FFF7A4F910F057 +:10C8F0003E0F04D114F8460F20F004002070189861 +:10C90000BDF83410018028469BE500B585B00328AA +:10C9100006D102208DF8000088B26946F9F750F977 +:10C9200005B000BD10B5384C0B782268012B02D041 +:10C93000022B2AD111E013780BB1052B01D104236E +:10C94000137023688A889A802268CB88D3802268F3 +:10C950000B891381498951810DE08B88938022686E +:10C96000CB88D38022680B8913814B8953818B89B3 +:10C970009381096911612168F9F722F92268002180 +:10C980000228117003D0002800D0812010BD832020 +:10C9900010BD806B002800D00120704781780129EC +:10C9A00009D10088B0F5205F03D042F6010188422A +:10C9B00001D10020704707207047F0B587B00024F0 +:10C9C00015460E460746ADF8184011E00598008858 +:10C9D000288005980194811DCDE902410721049426 +:10C9E0000091838842880188384600F002F930B906 +:10C9F00005AA06A93046FEF7EFFF0028E6D00A2870 +:10CA000000D1002007B0F0BD5C00002010B58B788D +:10CA100083B102789A4205D10B885BB102E08B7931 +:10CA2000091D4BB18B789A42F9D1B0F801300C88CE +:10CA3000A342F4D1002010BD812010BD072826D0CC +:10CA400012B1012A27D103E0497801F0070102E081 +:10CA50004978C1F3C20105291DD2DFE801F00318AE +:10CA6000080C12000AB10320704702207047042806 +:10CA70000DD250B10DE0052809D2801E022808D33E +:10CA800003E0062803D0032803D0052070470020C8 +:10CA900070470F20704781207047C0B282060BD4C8 +:10CAA000000607D5FA48807A4143C01D01EBD0004B +:10CAB00080B27047084670470020704770B51388F1 +:10CAC0000B800B781C0625D5F14CA47A844204D83F +:10CAD00043F010000870002070BD956800F0070654 +:10CAE00005EBD0052D78F54065F304130B70137832 +:10CAF000D17803F0030341EA032140F20123B1FBA3 +:10CB0000F3F503FB15119268E41D00FB012000EB17 +:10CB1000D40070BD906870BD37B51446BDF80410E0 +:10CB20001180117841F0040111709DF804100A067B +:10CB30001ED5D74AA368C1F30011927A824208D861 +:10CB4000FE2811D1D21DD2084942184600F01BFC24 +:10CB50000AE003EBD00200F00703012510789D40A6 +:10CB6000A843994008431070207820F010002070EE +:10CB70003EBD2DE9F0410746C81C0E4620F00300DB +:10CB8000B04202D08620BDE8F081C14D002034467D +:10CB90002E60AF802881AA72E8801AE0E988491CDB +:10CBA000E980810614D4E17800F0030041EA002016 +:10CBB00040F20121B0FBF1F201FB12012068FFF706 +:10CBC0006CFF2989084480B22881381A3044A0605B +:10CBD0000C3420784107E1D40020D4E7AC4801228E +:10CBE0000189C08800EB400002EB8000084480B25D +:10CBF00070472DE9FF4F89B01646DDE9168A0F46CA +:10CC0000994623F44045084600F054FB040002D046 +:10CC10002078400703D401200DB0BDE8F08F0998BB +:10CC200003F016FA02902078000606D59848817A1B +:10CC30000298814201D88720EEE7224601A9029896 +:10CC4000FFF73CFF834600208DF80C004046B8F10A +:10CC5000070F1AD001222146FFF7F0FE0028DBD192 +:10CC60002078400611D502208DF80C00ADF8107028 +:10CC7000BDF80400ADF81200ADF814601898ADF8D6 +:10CC80001650CDF81CA0ADF818005FEA094004D595 +:10CC900000252E46A84601270CE02178E07801F017 +:10CCA000030140EA012040F20121B0FBF1F280468D +:10CCB00001FB12875FEA494009D5B84507D1A17841 +:10CCC000207901F0030140EA0120B04201D3BE42C5 +:10CCD00001D90720A0E7A8191FFA80F9B94501D9A1 +:10CCE0000D2099E79DF80C0028B103A90998F8F7E1 +:10CCF00065FF002890D1B84507D1A0784FEA1921E7 +:10CD000061F30100A07084F804901A9800B10580C6 +:10CD1000199850EA0A0027D0199830B10BEB060099 +:10CD20002A46199900F005FB0EE00BEB0608574662 +:10CD3000189E099803F0F5FA2B46F61DB5B2394650 +:10CD40004246009502F0F1FE224601A90298FFF743 +:10CD5000B5FE9DF80400224620F010008DF8040076 +:10CD6000DDE90110FFF7D8FE002055E72DE9FF4F60 +:10CD7000DFF81C91824685B0B9F80610D9F800009A +:10CD800001EB410100EB810440F20120B2FBF0F124 +:10CD9000174600FB1175DDE9138B4E4629460698B0 +:10CDA000FFF77BFE0346FFF719FF1844B1880C30EC +:10CDB000884202D9842009B02FE70698C6B230060F +:10CDC00003D5B00601D50620F5E7B9F80620521CB8 +:10CDD00092B2A9F80620BBF1000F01D0ABF80020F9 +:10CDE000B00602D5C4F808800AE0B9F808201A4451 +:10CDF00092B2A9F80820D9F80000891A0844A06066 +:10CE00002246FE200699FFF787FEE77025712078FD +:10CE1000390A61F301002A0AA17840F0040062F3A4 +:10CE20000101A17020709AF802006071BAF8000048 +:10CE3000E08000252573300602D599F80A7000E0DD +:10CE40000127B00601D54FF000084E4600244FF0F0 +:10CE500007090FE0CDE902580195CDF8009004953F +:10CE6000F1882046129B089AFFF7C3FE0028A2D142 +:10CE7000641CE4B2BC42EDD300209CE700B5FFF790 +:10CE8000ADFE03490C308A88904203D9842000BD4E +:10CE900098050020CA88086802EB420300EB830073 +:10CEA000521C037823F004030370CA80002101732D +:10CEB0000846ECE72DE9F047804600F0FBF9070053 +:10CEC00005D000264446F74D40F2012916E0012026 +:10CED000BDE8F087204600F0EDF90278C17802F055 +:10CEE000030241EA0222B2FBF9F309FB13210068B5 +:10CEF000FFF7D3FD3044641C86B2A4B2E988601EFB +:10CF00008142E7DCA8F10100E8802889801B2881A4 +:10CF100000203870DCE710B5144631B1491E21807D +:10CF200003F096F8A070002010BD012010BD70B570 +:10CF30000446DC48C188036801E0401C208020884A +:10CF4000884207D200EB400213EB820202D0157830 +:10CF50006D07F2D580B2884216D2AAB15079A0727C +:10CF6000D08820819178107901F0030140EA0120F6 +:10CF7000A081A078E11CFFF7A1FD20612088401C62 +:10CF80002080E080002070BD0A2070BD0121018258 +:10CF900070472DE9FF4F85B04FF6FF798246A3F821 +:10CFA000009048681E460D4680788DF80600486857 +:10CFB0000088ADF8040000208DF80A00088A0C886B +:10CFC000A04200D304462C8251E03878400708D4B0 +:10CFD000641C288AA4B2401C288208F10100C0B257 +:10CFE00046E0288A401C2882781D6968FFF70EFDFC +:10CFF000D8BB3188494501D1601E30803188A1EB12 +:10D00000080030806888A04238D3B878397900F0B9 +:10D01000030041EA002801A9781DFFF7F7FC20BBB7 +:10D02000298949452ED0002239460798FFF706FD89 +:10D03000D8B92989414518D1E9680391B5F80AC0E2 +:10D04000D7F808B05046CDF800C003F06AF9DDF813 +:10D0500000C05A460CF1070C1FFA8CFC434603999A +:10D06000CDF800C002F02BFD60B1641CA4B200201A +:10D070008046204600F01EF90700A6D1641E2C82CF +:10D080000A2098E674807879B071F888B080397891 +:10D09000F87801F0030140EA01207081A6F80C80C5 +:10D0A000504602F0D5FF3A4606F10801FFF706FDAB +:10D0B000306100207FE62DE9FF4F87B081461C4696 +:10D0C0009246DDF860B0DDF85480089800F0F2F880 +:10D0D000050002D02878400702D401200BB09CE55F +:10D0E000484602F0B5FF2978090605D56D49897AC9 +:10D0F000814201D88720F1E7CAF309062A4601A92F +:10D10000FFF7DCFC0746149807281CD000222946AC +:10D11000FFF794FC0028E1D12878400613D50120C0 +:10D120008DF808000898ADF80C00BDF80400ADF8C3 +:10D130000E00ADF81060ADF8124002A94846F8F7AD +:10D140003DFD0028CAD12978E87801F0030140EAC2 +:10D150000121AA78287902F0030240EA022056450C +:10D1600007D0B1F5007F04D9611E814201DD0B209B +:10D17000B4E7864201D90720B0E7801B85B2A542FB +:10D1800000D92546BBF1000F01D0ABF8005017982D +:10D1900018B1B9192A4600F0CCF8B8F1000F0DD03B +:10D1A0003E4448464446169F03F0CDF82146FF1DF5 +:10D1B000BCB232462B46009402F0EBFC00208DE717 +:10D1C0002DE9F04107461D461646084600F072F864 +:10D1D000040002D02078400701D40120D3E438466F +:10D1E00002F036FF2178090605D52E49897A814259 +:10D1F00001D88720C7E422463146FFF75FFC65B1BE +:10D200002178E07801F0030140EA0120B0F5007FC9 +:10D2100001D8012000E0002028700020B3E42DE9AF +:10D22000F04107461D461646084600F043F8040044 +:10D2300002D02078400701D40120A4E4384602F04F +:10D2400007FF2178090605D51649897A814201D858 +:10D25000872098E422463146FFF75EFCFF2D14D06C +:10D260002178E07801F0030240EA022040F2012236 +:10D27000B0FBF2F302FB130015B900F2012080B2FB +:10D28000E070000A60F30101217000207BE410B51A +:10D290000C4600F00FF810B10178490704D40120C2 +:10D2A00010BD000098050020C18821804079A07041 +:10D2B0000020F5E70749CA88824209D340B10968CE +:10D2C00000EB40006FF00B0202EB80000844704757 +:10D2D000002070479805002070B504460D46214691 +:10D2E0002B460AB9002070BD01E0491C5B1C501E92 +:10D2F000021E03D008781E78B042F6D008781E7857 +:10D30000801BF0E730B50C4601462346051B9542CD +:10D3100006D202E0521E9D5C8D54002AFAD107E02D +:10D3200004E01D780D70491C5B1C521E002AF8D1C8 +:10D3300030BDF0B50E460146334680EA030404F0E2 +:10D340000304B4B906E002B9F0BD13F8017B01F89B +:10D35000017B521E01F00307002FF4D10C461D463D +:10D3600002E080CD80C4121F042AFAD221462B4647 +:10D3700000BF04E013F8014B01F8014B521E002AD4 +:10D38000F8D100BFE0E7F0B50C460146E6B204E094 +:10D3900002B9F0BD01F8016B521E01F00307002F26 +:10D3A000F6D10B46E5B245EA052545EA054501E01B +:10D3B00020C3121F042AFBD2194602E001F8016BB8 +:10D3C000521E002AFAD100BFE3E710B506F0F7FEBF +:10D3D000FAF792F906F09CFDBDE8104006F02EBE6B +:10D3E000202801D2012070470020704701224FF011 +:10D3F000A043824011B1C3F80C257047C3F808253B +:10D4000070474FF0A04101228240C1F818257047B3 +:10D4100070B50346002002466FF02F050EE09C5CBD +:10D42000A4F130060A2E02D34FF0FF3070BD00EB9E +:10D43000800005EB4000521C2044D2B28A42EED359 +:10D4400070BD30B50A230BE0B0FBF3F403FB14040A +:10D45000B0FBF3F08D183034521E05F8014CD2B2F7 +:10D46000002AF1D130BD30B500234FF6FF7510E032 +:10D47000040A44EA002084B2C85C6040C0F303148C +:10D48000604005EA00344440E0B25B1C84EA40108E +:10D490009BB29342ECD330BDF94A137882F88B30BB +:10D4A000A2F88C0082F88A10012082F8880092F895 +:10D4B000640008B192F8600082F88E00704710B5E1 +:10D4C0000B46114658B11846FFF7E6FFED48806855 +:10D4D000008802F026FFBDE8104002F0CDBBBDE899 +:10D4E00010404FF6FF70D7E770B50026044646702F +:10D4F000E44D1120207029682022A01C6831FFF71C +:10D5000018FF0121A171286800F8666F8078002853 +:10D5100011D1DB48B0F86A20A0F89220AA68537BAA +:10D5200080F8943080F89010108802F0FAFEBDE880 +:10D53000704002F0B0BB70BD70B5D24D296891F853 +:10D5400096200024012A11D091F89020012A1CD0A5 +:10D5500091F86620012A22D091F88820012A21D052 +:10D5600091F8A020012A2ED0002070BD447017220F +:10D57000027051F8972FC0F802204A68C0F80620C0 +:10D580000A7A827201F8014C1BE044700522027095 +:10D59000D1F89220C0F8022081F8904011E0FFF706 +:10D5A000A3FF0EE091F86620012AF8D044701422FF +:10D5B000027051F88A2FC0F802208A88C28001F8D0 +:10D5C000024C012070BD44701A2200F8022B222266 +:10D5D000A131FFF7AEFE286880F8A040F1E7A94826 +:10D5E000006890F8661011B1B0F86A0070474FF605 +:10D5F000FF70704770B5A34C206800B9FFDF20684A +:10D60000417811B10C25284670BD0025C422294659 +:10D61000FFF7B9FE2168FF2008707F2081F83700EE +:10D6200013204884282081F86500012081F85C00DF +:10D63000002081F85F0007F0AFF906F091FCE2E707 +:10D6400070B5904C0546206800B9FFDF21680020C6 +:10D6500048706560FFF7CEFF002800D0FFDF70BD87 +:10D66000884909680978814201D10120704700206A +:10D670007047844800B5016891F82400498CC0F3D4 +:10D680008002C0F340031A4400F001001044132943 +:10D6900015D004DC102909D0122904D10FE0152976 +:10D6A00008D01D2904D0FFDF002000BD764903E02B +:10D6B000764800BD7449083131F8100000BD724948 +:10D6C0000839F9E76F4840F271210068806A4843E1 +:10D6D00070476C48006890F83600002800D00120A0 +:10D6E000704710B5664C207B00F074FD40B1207D82 +:10D6F00004F115010BF034FB082801D0012010BD06 +:10D70000207B30B1022804D00120BDE8104007F092 +:10D71000A6BC0020F9E75A490873704759490968BF +:10D7200081F83000704770B50646554890F82D00D6 +:10D730000BF0A4FA050018D010210BF076FD00289C +:10D7400013D1504C012032462168C87628461C313E +:10D7500007F092FCD4E900101C310BF0BFFF6068A9 +:10D76000BDE8704001210BF0C8BF70BD2DE9F0414C +:10D77000434C074694F82D000BF0FDFA064694F84A +:10D780002F0004F10E0528B126B194F82D000BF0FE +:10D7900018FAA0B194F83000002824D094F82E0094 +:10D7A000002820D0607B294600F025FDA8B10BF0B1 +:10D7B0008AFB3A462946BDE8F04107F05DBC0120EE +:10D7C00060733A462946304607F056FC94F82D100F +:10D7D0002846BDE8F0410BF065BB39462846BDE858 +:10D7E000F04107F07EBCBDE8F08170B5254C2168A2 +:10D7F000087BB0B1022814D0012048730E3107F025 +:10D8000018FC2068007B00F0E5FC216881F82F00FF +:10D81000082081F82D00487B0E3100F0E3FC40B970 +:10D8200001E00020E9E72168487B0E3100F0E3FCCD +:10D8300000B10120216881F82E0091F82F0018B95D +:10D8400091F82200400706D5087D15310BF088FAC3 +:10D85000216881F82D0020680025456004F0ADFDA9 +:10D86000216888600020FFF781FF2068C57690F866 +:10D87000220040070CD5BDE87040002053E70000AF +:10D88000A405002064000020A0B101008F891300CE +:10D8900070BDFB4A1268137B0370D2F80E0008605B +:10D8A000508A8880704778B5F6490446F44D407B2D +:10D8B00008732A68207810706088ADF8000080B284 +:10D8C00000F00101C0F3400341EA4301C0F38003CB +:10D8D00041EA8301C0F3C00341EAC301C0F300136E +:10D8E00041EA0311C0F3401341EA4311C0F3801031 +:10D8F00041EA80105084E07D012825D0022825D0FF +:10D90000FFDF286880F85E60217B80F82410418C5E +:10D910001D291DD061688162617D80F83610A17B70 +:10D92000C1B1022916D00121017554F80F1FC0F8AA +:10D930001510A188A0F81910217B012900D0002121 +:10D9400080F83410002078BD0126DAE70226D8E7F7 +:10D950000021E0E70021E7E7C948006890F82200CD +:10D96000C0F38000704700B5FFF7F6FF08B1002054 +:10D9700000BD1F2000BD00B5FFF7F5FF002800D057 +:10D98000012000BDBE49002209680A664B8C1D2B90 +:10D9900002D081F86400704781F864207047B84A6B +:10D9A0000023126882F85D3042F84C1F90800120FD +:10D9B00050747047B24A0023126882F85C30A2F8B3 +:10D9C000580042F8541F012010727047AC49096892 +:10D9D00081F835007047AA49096881F85F007047EF +:10D9E000A748006890F95F007047A548006890F864 +:10D9F000220000F001007047A148006890F8220062 +:10DA0000C0F340007047002070479D48006890F8C0 +:10DA10002200C0F3C000704701207047012070470A +:10DA20000120704770B500F0FAFB954C2068016E3C +:10DA3000491C016690F83300002530B106F0ACFFB8 +:10DA400006F08EFA206880F833502068457090F810 +:10DA5000381009B102201AE090F86410B1B1006EDC +:10DA6000814213D8022007F095FF206890F8220029 +:10DA7000C00704D0A06843220188012003E04322AC +:10DA80004FF6FF710020BDE8704018E50020BDE8AA +:10DA9000704007F07FBF10B501280DD002280DD0CF +:10DAA00004280FD0FFDF7648006890F85E10BDE8CC +:10DAB0001040252006F0FEBB252000E0262006F0C1 +:10DAC000D3FCF0E72720FAE702460020D30701D075 +:10DAD000CB0705D0930705D58B0703D402207047E9 +:10DAE000012070475207FCD54907FAD4042070473B +:10DAF0002DE9F041624C86B0206800B9FFDF206854 +:10DB00004178E9BB0178FF2942D0002580F83150E7 +:10DB1000A0F85A50857080F83850284606F09EFECE +:10DB2000182259496846FFF704FC684606F08AFE49 +:10DB300006F0CCFB206890F95F0006F085FC5248A7 +:10DB40001D3806F087FC5048203806F06CFE6068EF +:10DB500006F087FE2068002190F82400FFF7B4FF4C +:10DB6000FFF799FF206880F82C5006F071FE2068BE +:10DB700090F85E10002006F030FD0F21052000E037 +:10DB800006E006F038FC206890F82E1051B902E04B +:10DB90000C2006B027E690F82F1019B990F8220053 +:10DBA00040072BD504F009FC804620684146806878 +:10DBB00005F004F9354F064690FBF7F007FB1060BF +:10DBC0004142404604F0CDF82168886096FBF7F0AA +:10DBD0004A68104448600BF0BFF821684A689042D8 +:10DBE0000CD8C1E901580120FFF7C0FD206890F86A +:10DBF0002200400702D50120FFF795FD2068417BF8 +:10DC00000E3006F0EAFB206890F85C1039B1B0F8ED +:10DC10005810A0F84810416D416480F85C5090F8AD +:10DC20005D1041B1B0F85010A0F84010C16C40F840 +:10DC30003C1F80F821500BF0FCF8032160680BF0CA +:10DC40002FF9216881F833000020A2E70C49886091 +:10DC500070472DE9F0410A4C0746002620683146FE +:10DC6000C57E6068068000F0D1FA2068408C1328D9 +:10DC700040D00DDC102861D012280DD15CE00000EE +:10DC800064000020A4050020B0B1010040420F0054 +:10DC9000152838D01D2836D0FFDF00BF00F0CAFAA3 +:10DCA0002068418C1D2907D0152905D0B0F84820DF +:10DCB000416C60680BF028FD206890F82C1090F8FB +:10DCC0002400FFF701FF05463FB1FFF7E4FE012204 +:10DCD0004FF49671002006F01EFD206890F82C107D +:10DCE000294380F82C1090F824208A434FF001013A +:10DCF00029D02DE0002160680BF0C4FC0121606890 +:10DD000000F084FACAE7012160680BF0BBFC012136 +:10DD1000606800F07BFAD4E9001025B11C310BF0EB +:10DD2000DDFC012104E015310BF0D8FC2068017DF9 +:10DD300060680BF0E2FCB1E7062100E002216068B8 +:10DD40000BF0A0FCAAE7428C1D2A0BD080F8311002 +:10DD50004170418C13290ED007DC10290AD01229FA +:10DD600007D108E080F82C60F2E7152903D01D29BF +:10DD700001D0FFDF37E590F85E20BDE8F0410121DA +:10DD8000084606F05ABEF84810B50068417841B917 +:10DD90000078FF2805D00021084600F059FA00203D +:10DDA00010BD00F03CFA0C2010BD2DE9F041EE4D05 +:10DDB0000446174628680E4690F8660000B1FFDF5B +:10DDC0002968002F81F868704ED12088A1F86A0078 +:10DDD0006088A1F88000A088A1F88200E088A1F8FE +:10DDE000840094F88C0181F8860091F82F0020B10E +:10DDF000487B0E3100F0FFF940B9296891F83000F6 +:10DE000060B1487B0E3100F0EDF938B12868D0F8E8 +:10DE10000E104167418AA0F8781003E02868476730 +:10DE2000A0F878706968FF2E0878C0F380106076DB +:10DE3000D1F80300C4F81A00B1F80710E18314D038 +:10DE4000296801F16E02C1F87A00E08BA1F87E002A +:10DE500030466D310AF099FF00B9FFDF286810F8ED +:10DE60006D1F41F002010170BDE42868C0F87A70AE +:10DE7000A0F87E70617E80F86D10D4F81A1040F81A +:10DE80006E1FE18B8180AEE470B5FFF7BEFDB64C2E +:10DE9000012538B13C22FF21A068FFF786FF2068EA +:10DEA00080F86650206890F82200C00704D0A0686F +:10DEB0003C220188012003E03C224FF6FF71002044 +:10DEC000FFF7FDFA206880F8385070BDA649096850 +:10DED00081F83200704770B5002507F0BAFC50B1E8 +:10DEE000A14C20684178012908D0022901D00329DA +:10DEF00036D0FFDF70BDBDE8704093E58178002922 +:10DF0000F8D1418C102913D090F8330020B106F0DD +:10DF100019F8402006F02DFD206890F822104907DE +:10DF200010D490F83610012904D0032902D002E061 +:10DF3000002119E0102590F85E2045F00E01002028 +:10DF400006F07BFD206890F8340008B106F054FD1F +:10DF50000021962006F0B1FC21680220487070BDB7 +:10DF600081780029FBD18178BDE87040012000F064 +:10DF70006FB957E510B57C4C206890F8340008B1B3 +:10DF800000F07AF9206890F8330018B106F004FD2B +:10DF900005F0E6FF07F05DFC88B1206840780228B4 +:10DFA00000D0FFDF0021012000F052F92068417805 +:10DFB000002903D04078012800D0FFDF10BDBDE864 +:10DFC00010402FE510B50AF0CBFE04460AF07DFFA5 +:10DFD00038B120460AF052FE18B110210BF025F995 +:10DFE00008B1002010BD012010BD2DE9F047DFF879 +:10DFF00078910E460746032809D0FFF7F6FC044641 +:10E00000D9F8000090F8320020B1012003E0FFF7BA +:10E01000F3FC04460020804606F018FA0546032F5C +:10E020002BD0012734EA080453D0D9F800004C461D +:10E0300090F8330068B10AF0E2FE30700146FF2824 +:10E0400007D06068C01C0AF0B7FE30780AF0E1FE25 +:10E05000054360680178C1F3801221680B7D9A4204 +:10E0600005D10622C01C1531FFF736F938B1002062 +:10E070003178FF290BD0D8B903E00227D2E701207D +:10E08000F6E7206890F82D00884211D008E038B1FA +:10E09000616811F8030BC0F38010FFF793FF38B1EC +:10E0A0000020216891F82210490703D5A0B910E09B +:10E0B0000120F6E785B92D4890F8360008B1B8423E +:10E0C00007D1616811F8030BC0F38010FFF77AFFE6 +:10E0D00010B10020BDE8F0870120FBE7F8B5224C25 +:10E0E0000746002520684078022800D0FFDF20681E +:10E0F00090F8340008B100F0BFF860680BF0E4FA63 +:10E1000006460FB306F073F9F0B1052E1DD1606815 +:10E1100090F8240000F01F00102816D9206890F80D +:10E12000350090B1FF208DF80000012569460520DB +:10E13000FFF75BFF40B1206880F8A05061682222A1 +:10E14000A130C91CFFF7F5F815E060680BF0FCFA88 +:10E1500088B1062E0FD2DFE806F00E0E0E030E0B6E +:10E1600000F0CDF806E0000064000020A4050020C7 +:10E1700000F091F800B90125206890F8330018B13B +:10E1800006F00AFC05F0ECFE1DB10021012000F0B4 +:10E190005FF820684178002906D04178012903D032 +:10E1A0004078032800D0FFDFF8BD70B59F4E0546CC +:10E1B0000C463068807800280BD106F02FF8034613 +:10E1C0003068214690F85E202846BDE8704007F090 +:10E1D000C1BD70BD022803D0032801D000207047C4 +:10E1E00001207047012802D14879800901D0002020 +:10E1F000704701207047012806D148790121B1EB11 +:10E20000901F01D101207047002070470278202321 +:10E2100022F0200203EA41110A430270704710B550 +:10E2200006F09AFB06F079FB06F0C8FABDE810404C +:10E2300006F0FFBA10B57D4C7D4960680BF048FAD6 +:10E240007B480E38417B6068BDE810400BF04CBA4B +:10E25000764A10B5126892F831303BB1508C1D28C7 +:10E2600000D1FFDFBDE81040FFF7DCBB002902D181 +:10E27000BDE81040EDE410BD10B56C4C206837309F +:10E2800006F0C5FB18B921687F2081F83700BDE88A +:10E29000104006F0A7BB38B5FF208DF8000001251F +:10E2A00069460520FFF7A1FE30B3604C20688078F6 +:10E2B00008BB6268A0681278417BC2F3401211402B +:10E2C0004173012100F04AF800229DF80010A06877 +:10E2D000FFF76BFD2068012100F8661F82788188B6 +:10E2E0000120FFF7ECF8216800204870FFF797FF46 +:10E2F000012007F04FFB00E00025284638BD38B567 +:10E30000FF208DF80000012569460320FFF76DFE10 +:10E31000464C002820681CD090F8341031B190F899 +:10E32000960018B99DF8000000F04CF860680021D4 +:10E33000018004210BF0A6F9FFF77CFF2068B0F8FC +:10E340004020C16B60680BF0EFF921680320487032 +:10E3500002E0807800B90025284638BD70B5334DFD +:10E360000446686850F80F2FC4F80E208288628235 +:10E3700082792275C27962750289E282428962805D +:10E380008289A280C289E2800269A260027D227332 +:10E39000427D02F01F022276407D400984F88C0104 +:10E3A00084F8641084F86510002104F130000BF04B +:10E3B0002AFB286890F8651004F8661F90F85F0043 +:10E3C000607070BD70B5194C0122216881F89620EB +:10E3D0000A7881F89720FF280DD001F19902983131 +:10E3E0000AF0D3FC00B9FFDF206810F8981F41F055 +:10E3F000020101700CE060680278C2F3801281F8BB +:10E400009820D0F8032041F8992FB0F807008880B1 +:10E41000256895F837009F357F2800D1FFDF2068F9 +:10E4200010F8371F29707F21017070BD6400002033 +:10E43000B20500202DE9FC470C460646694600F06F +:10E4400010FF002860D1FFF7CAF8B0425CD0214627 +:10E45000304608F0DEFF28BB019D95F82C01703591 +:10E4600018B9287F08B1012000E00020814695F806 +:10E4700039004FF000084FF0010AA0B195F83A00BA +:10E48000800710D584F8018084F800A084F8028009 +:10E49000A68095F83B10A171A98F2181E98F618138 +:10E4A00085F839802DE0304601F04DFF070000D19E +:10E4B000FFDF384601F06DF940B184F801800D218D +:10E4C0002170A680E08084F802A01AE0304601F0B6 +:10E4D00028FF070000D1FFDFB9F1000F14D0384644 +:10E4E00001F0AFF980B1304606F01EFD84F80180DE +:10E4F0000A21217084F80280A680697FA17185F8C5 +:10E500001C800120BDE8FC870020FBE71CB56946A4 +:10E5100000F0A7FE00B1FFDF684600F0AFFEF9494A +:10E5200000208968A1F8F2001CBD2DE9FC410446D9 +:10E530000E46062001F06EFD00250746A84606445B +:10E5400017E02088401C80B22080B04202D34046B1 +:10E55000A4F8008080B2B84204D3B04202D20020B6 +:10E56000BDE8FC81694600F07CFE0028F8D06D1CF7 +:10E57000EDB2AE42E5D84FF6FF7020801220EFE7F3 +:10E5800010B506F043FD0AF026FBDF484FF6FF7199 +:10E5900000234182818203701B2141804FF4A472C9 +:10E5A0008280C180028103228275C2758272042436 +:10E5B000C4728181C1810282837610BD70B5D14C55 +:10E5C0000D466060217006F0ADFC00F063FEFFF7C1 +:10E5D000D7FF207809F09EFD284607F04DFACA487B +:10E5E0002838FFF72DF82178606808F0F6FFBDE8BD +:10E5F00070400AF0F0BA10B501240AB1002010BD35 +:10E6000021B1012903D00024204610BD02210BF0C6 +:10E61000CBF8F9E7887800B90320C97801B903215C +:10E62000107019700020704730B587B0044600881C +:10E63000694600F016FE002806D1A08830B10128F6 +:10E6400004D0022802D0122007B030BD05AB04AAC6 +:10E6500021466846FFF7DEFF0400F5D1019901204D +:10E6600081F8C501019991F81012002539B9019975 +:10E6700091F8C41119B9019991F8971009B13A2488 +:10E6800015E00199039581F8C40101989DF81020C7 +:10E6900080F8C621019B9DF8140083F8C7018DF80E +:10E6A0000C208DF80D0003AA01200AF0F4FE019859 +:10E6B00080F8C5512046C7E710B504460020A17870 +:10E6C00001B90120E2780AB940F0020000F0F6FD3D +:10E6D000002803D12046BDE81040A5E710BD70B565 +:10E6E0000D4604460189002380880AF0C9FE696A44 +:10E6F00081421DD2401A401CA1884008091A8AB2E2 +:10E70000A2802189081A2081668895F86410104635 +:10E710000AF08DFE864200D230466080E68895F889 +:10E72000651020890AF083FE864200D23046E080E0 +:10E7300070BDF0B585B00D46064603A900F091FD09 +:10E7400000282AD104990022FB20B1F84E30FB2B7F +:10E7500000D30346B1F85040FB20FB2C00D3044605 +:10E76000DFF8A8C19CE8811000900197CDF808C09F +:10E77000ADF80230ADF806406846FFF7B0FF6E8096 +:10E78000BDF80400E880BDF808006881BDF802000B +:10E79000A880BDF806002881002005B0F0BD2DE955 +:10E7A000F04186B004460088694600F05AFD002812 +:10E7B00059D12189E08800F09BFD002853D1A18820 +:10E7C000608800F095FD00284DD12189E08800F097 +:10E7D00085FD002847D1A188608800F07FFD0600F4 +:10E7E00041D1208802A9FFF7A4FF00B1FFDFBDF8E7 +:10E7F000101062880920914235D3BDF80C10E288D0 +:10E80000914230D3BDF81210BDF80E202389114477 +:10E81000A2881A44914226D3019D01274FF0000897 +:10E8200085F8BB71019890F8FC0105F5DD7508B11C +:10E830003A2615E0E08868806088E880218940F603 +:10E840004800814200D30146A980A188814200D2BC +:10E8500008462881002228460199FFF740FF2F70C3 +:10E8600085F80180304606B0BDE8F08197E710B525 +:10E870000446FEF761FE002813D0207814280FD13B +:10E88000A07868B1A088062101F018FC40B100888A +:10E8900006F04AFBA088062101F022FC00B1FFDF50 +:10E8A000012010BD2DE9F041060000D1FFDF164820 +:10E8B000022114308046FFF738FE00B1FFDF124C12 +:10E8C0000620A78A01F0A6FB0546A08AA84203D12C +:10E8D0003046FFF7CCFF20B9A08A3146FFF7AAFDEA +:10E8E00030B1304600F012FD0028EED10120BBE728 +:10E8F00002214046FFF719FE10B9A08AB842E4D1C0 +:10E900000020B1E77000002090060020C8B101008F +:10E9100010B500F083FC08B10C2010BD0AF096F988 +:10E92000002010BD10B50446007818B1012801D0B0 +:10E93000122010BD00F07DFC20B10AF0FDF908B1F5 +:10E940000C2010BD207800F053FCE21D04F11703E9 +:10E95000611CBDE810400AF09BB910B5044600F0F8 +:10E960005DFC08B10C2010BD207818B1012801D041 +:10E97000122010BD00F03CFC611C0AF041F908B106 +:10E98000002010BD072010BD10B50AF0D9F908B15C +:10E99000002010BD302010BD10B5044600F049FC29 +:10E9A00008B10C2010BD20460AF0C2F9002010BDAD +:10E9B00010B500F03EFC20B10AF0BEF908B10C2001 +:10E9C00010BD0AF0A7F9002010BDFF2181704FF69D +:10E9D000FF718180F84949680A7882718A880281CA +:10E9E0004988418101214170002070471CB50024F5 +:10E9F00012F1080F15D00CDC12F1280F11D012F112 +:10EA0000140F0ED012F1100F0BD012F10C0F0CD10D +:10EA100007E012F1040F04D01AB1032A01D0042A2E +:10EA200003D1012804D0032806D0122420461CBD9F +:10EA30001046FEF7D0FFF9E708461446694600F095 +:10EA400010FC08B10224F1E7019880F86740002427 +:10EA5000ECE710B5134601220AF003FC002010BDBC +:10EA600010B5044600F0E5FB08B10C2010BD2146AE +:10EA7000002006F0CCFA002010BD10B5044607F0C7 +:10EA800095F920B1207807F003F8002010BD0C2084 +:10EA900010BD10B5044600F0CCFB08B10C2010BD31 +:10EAA0002146012006F0B3FA002010BD38B5044617 +:10EAB0004FF6FF70ADF80000A079E179884216D0DA +:10EAC0002079FEF78DFC90B16079FEF789FC70B17A +:10EAD0000022A07911460BF0DBFB40B90022E0795F +:10EAE00011460BF0D5FB10B9207A072801D9122066 +:10EAF00038BD07F067F948B900216846FFF715FDF2 +:10EB000020B1204605F0ADFB002038BD0C2038BDFB +:10EB10002DE9FC41817804461A2925D00EDC1629FE +:10EB20002DD2DFE801F02C2C2C2C2C212C2C2C2C81 +:10EB30002C2C2C2C2C2C2C2C2C2121212A291ED0A5 +:10EB40000BDCA1F11E010C2919D2DFE801F0181825 +:10EB50001818181818181818180D3A3904290ED250 +:10EB6000DFE801F00D020D022088B0F5706F06D2CB +:10EB70000127694600F075FB18B10220F0E412206D +:10EB8000EEE4019D68462E4605F5C87506F291161D +:10EB900000F05AFB08B1287808B10C20E0E42F708F +:10EBA000A0783070684600F069FB0020D8E41CB5FE +:10EBB0000C46694600F055FB002118B12160217117 +:10EBC00002201CBD0198024610F1700080F842102E +:10EBD00093682360137B237190F84230002BF5D1AA +:10EBE00000201CBD10B5044600F023FB20B10AF044 +:10EBF000A3F808B10C2010BD207800F0F9FAE279F2 +:10EC0000611C0AF06EF908B1002010BD022010BD91 +:10EC100010B5886E60B1002241F8682F0120CA71DA +:10EC2000897988400BF028FB002800D01F2010BDF8 +:10EC30000C2010BD1CB50C46694600F012FB0028E4 +:10EC400005D10198B0F87000401C208000201CBD48 +:10EC50001CB504460088694600F003FB08B1022099 +:10EC60001CBD606828B1DDE90001224600F09CFB74 +:10EC70001CBDDDE90001FFF7CBFF1CBD10B500781E +:10EC8000012800D00020FEF7A1FE002010BDF0B545 +:10EC900044888188C288038945898089A71F40F6F6 +:10ECA0007B46B74215D28F1FB74212D28C4210D882 +:10ECB000B2F5FA7F0DD2A3F10A04361FB44208D28E +:10ECC000521C4A43B2EB830F03DA854201D800207D +:10ECD000F0BD3020F0BDF8B515460E46044607F0ED +:10ECE00071F808B10C20F8BD204600F09CFB00280C +:10ECF000F9D1A078C1064FF01100F4D5E17D0329C8 +:10ED0000F1D0FEF76DFE3070A07555B9FF208DF87B +:10ED1000000069460020FEF74DFE69460020FEF720 +:10ED20003EFE2046BDE8F840FEF7BDBD0022D2E71A +:10ED30000078C10801D01220704720498876002051 +:10ED4000704710B504460078C00704D1608810B140 +:10ED5000FEF711FE80B12078618800F00102607832 +:10ED600000F0ACFB002806D1FEF7FDFD01466088EF +:10ED7000884203D9072010BD122010BD6168FEF73C +:10ED800019FE002010BD10B504460078C00704D15C +:10ED9000608810B1FEF730FE90B12078618800F0F5 +:10EDA0000102607800F08AFB002804D16088616865 +:10EDB000FEF7F5FD002010BD700000209006002039 +:10EDC0001220F8E77CB5044640784225012808D88F +:10EDD000A078FEF745FC20B120781225012802D04A +:10EDE00090B128467CBDFEF710FE20B1A088002817 +:10EDF000F7D08028F5D8FEF70FFE60B160780028C4 +:10EE0000EFD02078012808D006F07EF9044606F0FD +:10EE100009FE00287FD00C207CBDFEF762FC10B9F3 +:10EE2000FEF7F1FD90B306F0CDFF0028F3D1FEF719 +:10EE3000D6FBA0F57F41FF39EDD1FEF7D6FCA688C1 +:10EE400042F210704643A079FEF79CFDFEF7CDFD1F +:10EE5000F8B10022062101A801F002F9040058D0FF +:10EE6000F7480021846020460AF01EF92046FEF78C +:10EE7000EDFEF44D04F13000AA89E989C2830184D2 +:10EE8000FEF7CCFD60B1288A01210DE0FFE71220DA +:10EE90007CBD3146002006F0FEFD88B3FFDF44E074 +:10EEA000FEF7BEFD0146288A06F090FE0146A062EC +:10EEB0000022204606F02BF9FEF7B0FD38B9FEF728 +:10EEC000AFFD0246214601200AF0E3FAD0B1DD4A47 +:10EED0002146163201200AF0DEFAE87A0090AB7A79 +:10EEE000EA89A989208801F0A5F900B1FFDF20880F +:10EEF00006F019F83146204606F0CDFD00B1FFDFDF +:10EF000013E008E00621BDF8040001F0E9F800B1C3 +:10EF1000FFDF09207CBD44B1208806F005F8208879 +:10EF2000062101F0DDF800B1FFDF00207CBD0021EB +:10EF300048E770B50D46062101F0C0F8040003D083 +:10EF400094F8930110B10AE0022070BD94F87D009E +:10EF5000142801D0152802D194F8E00108B10C2042 +:10EF600070BD1022294604F5CA70FEF7E2F90120AF +:10EF700084F89301002070BD10B5062101F09EF8C1 +:10EF800018B190F8931111B107E0022013E790F83F +:10EF90007D10142903D0152901D00C200BE7022184 +:10EFA00080F89311002006E72DE9FC410D464BF651 +:10EFB00080321221954213D895B1694600F051F97B +:10EFC00000280CD1019EB41C703627882A46394689 +:10EFD00030460AF02AF82088B842F6D10020CDE564 +:10EFE0000846CBE51CB504460088694600F039F9AF +:10EFF000002808D10199A378084691F82C20703197 +:10F000009A4201D10C201CBD7F220A728A72002212 +:10F01000CA72E17880F82D10217980F82E10A1783D +:10F0200080F82C1010461CBD1CB50C46694600F03B +:10F0300018F9002806D1019890F88C0000B1012041 +:10F04000207000201CBD7CB50D461446694600F0BA +:10F0500008F9002805D1019890F82C00012801D06A +:10F060000C207CBD019890F87810297090F87900F8 +:10F07000207000207CBD70B50D461646062101F0BB +:10F080001DF818B381880124C388428804EB410429 +:10F09000AC4217D842F210746343A4106243B3FB2E +:10F0A000F2F2521E94B24FF4FA72944200D914460E +:10F0B000A54200D22C46491C641CB4FBF1F24A4321 +:10F0C000521E91B290F8CC211AB901E0022070BD15 +:10F0D00001843180002070BD10B50C46062100F07F +:10F0E000EDFF48B180F8FF4024B190F8FD1009B160 +:10F0F00006F083FD00205EE602205CE6017899B10F +:10F10000417889B141881B290ED381881B290BD3F3 +:10F11000C188022908D34B490268283941F8322FA7 +:10F1200040684860002070471220704710B506F014 +:10F130001EFD00203FE610B506F01CFD00203AE65B +:10F1400070B514460A46064600250121104606F011 +:10F150003DFD002800D8284605460121304600F034 +:10F160004EF806460121002000F049F8311801222E +:10F1700096318D4206D901F19600691AB1FBF0F083 +:10F18000401C82B22280002070BD10B5044600F001 +:10F1900050F808B10C200EE6601C09F08FFE2078B4 +:10F1A00000F00100FEF7BAFA002004E610B50446AC +:10F1B000062000F021FF08B10C20FCE52078C007F4 +:10F1C00010D00022607811460BF062F808B11220CE +:10F1D000F1E5A06808F073FD6078616808F078FDDB +:10F1E0000020E8E5002008F06AFD00210846F5E768 +:10F1F00018B1022801D0012070470020704710B5D7 +:10F20000012904D0022905D0FFDF2046D3E5C00044 +:10F21000503001E080002C3084B2F6E710B506F0E3 +:10F22000D1FD20B1FEF755FA08B10120C3E5002059 +:10F23000C1E510B506F0C6FD002800D00120BAE5F2 +:10F240007000002090060020416891F82C0191F890 +:10F250008C1021B918B1042801D00120704700207A +:10F26000704710B50C46062100F028FF606018B109 +:10F270000120207000209EE502209CE5416891F865 +:10F28000FD20002A05D0002281F8FD20406806F00C +:10F29000B4BC704708B54FF6FF70ADF8000006E04B +:10F2A0000621BDF8000000F01BFF00B1FFDF0021C8 +:10F2B0006846FFF73AF90028F2D008BD70B5144649 +:10F2C0000546012200F00EF9002806D12146284605 +:10F2D000BDE87040002200F005B970BDFB2803D8DE +:10F2E00040F64800814201D9112070470020704744 +:10F2F0001B38E12806D2B1F5A47F03D344F2902055 +:10F30000814201D912207047002070471FB58E49F5 +:10F31000897ECA0702D10278192A0AD08A0702D444 +:10F320000278182A24D0490739D40178122933D019 +:10F3300035E04088ADF8000002A9FFF792FF00B168 +:10F34000FFDF039810F8601F8DF8021040788DF8E9 +:10F3500003000020ADF8040001B9FFDF9DF80300B1 +:10F3600000B9FFDF6846FFF7A7F9D8B1FFDF19E062 +:10F370004088ADF8000040F64800FB21ADF80400DD +:10F38000ADF80800ADF80210ADF806106846FFF7BA +:10F390006DFA38B1FFDF05E0007BC00702D0002026 +:10F3A00004B008E50120FBE7F8B50646508914468D +:10F3B0000F4640B1B0F5004F05D20022A0781146AB +:10F3C0000AF066FF08B11220F8BDB86E394607F1A1 +:10F3D000700530B1A07891F86E20904201D00C20D9 +:10F3E000F8BD012081F86F00A07881F86E00606898 +:10F3F00041F8680F608988802089A884002087F8F8 +:10F400006F0020886946FFF715FCA88CBDF8001036 +:10F41000081A00B2002804DD39463046FFF7F8FB31 +:10F42000DDE70020F8BD38B504460078EF2841D864 +:10F430006088ADF80000009800F061F888B361883A +:10F44000080708D4D4E90120824233D8202A31D3D6 +:10F45000B0F5804F2ED8207B18B307282AD8607BC0 +:10F4600028B1012803D0022801D0032822D14A075D +:10F4700003D4022801D0032805D1A07B08B10128BC +:10F4800018D1480707D4607D28B1012803D002288D +:10F4900001D003280ED1C806E07D03D5012809D18B +:10F4A00004E007E0012801D0032803D1E07E18B171 +:10F4B000012801D0122038BD002038BD70B50C469F +:10F4C0000546FF2904D8FEF7A9FA18B11F2C01D967 +:10F4D000122070BD2846FEF7C3F808B1002070BDA9 +:10F4E000422070BD0AB1012200E00222024202D194 +:10F4F000880802D109B1002070471120704780B2FE +:10F50000C1060BD401071CD481064FEAC07101D596 +:10F51000B9B900E099B1800713D410E0410610D4C6 +:10F5200081060ED4C1074FEA807104D0002902DBA6 +:10F53000400704D405E0010703D4400701D40120AB +:10F5400070470020704700009006002030B5058805 +:10F5500025F4004421448CB24FF4004194420AD275 +:10F56000121B92B21B339A4201D2A94307E005F461 +:10F570000041214303E0A21A92B2A9431143018042 +:10F5800030BD0844083050434A31084480B27047C7 +:10F5900070B51D4616460B46044629463046049A69 +:10F5A000FFF7EFFF0646B34200D2FFDF282200211B +:10F5B0002046FDF7E8FE4FF6FF70A082283EB0B26D +:10F5C00065776080B0F5004F00D9FFDF618805F1F5 +:10F5D0003C00814200D2FFDF60880835401B343890 +:10F5E00080B220801B2800D21B2020800020A07722 +:10F5F00070BD8161886170472DE9F05F0D46C1885B +:10F60000044600F12809008921F4004620F400484E +:10F6100000F063FB10B10020BDE8F09F4FF0000A3E +:10F620004FF0010BB0450CD9617FA8EB0600401AE2 +:10F630000838854219DC09EB06000021058041806D +:10F640001AE06088617F801B471A083F0DD41B2F8A +:10F6500000DAFFDFBD4201DC294600E0B9B2681ADA +:10F660000204120C04D0424502DD84F817A0D2E750 +:10F6700009EB06000180428084F817B0CCE770B532 +:10F68000044600F12802C088E37D20F400402BB13D +:10F6900010440288438813448B4201D2002070BD7D +:10F6A00000258A4202D30180458008E0891A0904B6 +:10F6B000090C418003D0A01D00F01FFB08E0637F10 +:10F6C00000880833184481B26288A01DFFF73EFF0E +:10F6D000E575012070BD70B5034600F12804C588AA +:10F6E000808820F400462644A84202D100201882D7 +:10F6F00070BD98893588A84206D3401B75882D1A9D +:10F700002044ADB2C01E05E02C1AA5B25C7F204497 +:10F710003044401D0C88AC4200D90D809C8924B136 +:10F72000002414700988198270BD0124F9E770B5AE +:10F73000044600F12801808820F400404518208A02 +:10F74000002825D0A189084480B2A08129886A8830 +:10F750001144814200D2FFDF2888698800260844CE +:10F76000A189884212D1A069807F2871698819B166 +:10F77000201D00F0C2FA08E0637F2888083318448F +:10F7800081B26288201DFFF7E1FEA681268201205A +:10F7900070BD2DE9F041418987880026044600F1BB +:10F7A0002805B94219D004F10A0800BF21F400402D +:10F7B0002844418819B1404600F09FFA08E0637F71 +:10F7C00000880833184481B262884046FFF7BEFEC5 +:10F7D000761C6189B6B2B942E8D13046BDE8F08105 +:10F7E0002DE9F04104460B4627892830A68827F4E6 +:10F7F0000041B4F80A8001440D46B74201D100200F +:10F80000ECE70AB1481D106023B1627F691D1846FC +:10F81000FDF78FFD2E88698804F1080021B18A194F +:10F8200096B200F06AFA06E0637F6288083399199D +:10F8300089B2FFF78BFE474501D1208960813046B0 +:10F84000CCE78188C088814201D101207047002027 +:10F85000704701898088814201D1012070470020D2 +:10F86000704770B58588C38800F1280425F40042EC +:10F8700023F4004114449D421AD08389058A5E19FD +:10F8800025886388EC18A64214D313B18B4211D398 +:10F890000EE0437F08325C192244408892B2801AFD +:10F8A00080B22333984201D211B103E08A4201D1E0 +:10F8B000002070BD012070BD2DE9F0478846C18849 +:10F8C0000446008921F4004604F1280720F400458D +:10F8D00007EB060900F001FA002178BBB54204D914 +:10F8E000627FA81B801A002503E06088627F801B6E +:10F8F000801A083823D4E28962B1B9F80020B9F837 +:10F9000002303BB1E81A2177404518DBE0893844E2 +:10F91000801A09E0801A217740450ADB607FE1897F +:10F920000830304439440844C01EA4F81280BDE8B1 +:10F93000F087454503DB01202077E7E7FFE7618299 +:10F940000020F4E72DE9F74F044600F12805C088B0 +:10F95000884620F4004A608A05EB0A0608B1404553 +:10F9600002D20020BDE8FE8FE08978B13788B6F872 +:10F97000029007EB0901884200D0FFDF207F4FF0A3 +:10F98000000B50EA090106D088B33BE00027A07FB6 +:10F99000B9463071F2E7E18959B1607F29440830F6 +:10F9A00050440844B4F81F1020F8031D94F82110A7 +:10F9B0008170E28907EB080002EB0801E1813080E9 +:10F9C000A6F802B002985F4650B1637F30880833D2 +:10F9D000184481B26288A01DFFF7B8FDE78121E0DD +:10F9E000607FE18908305044294408442DE0FFE756 +:10F9F000E089B4F81F102844C01B20F8031D94F8B8 +:10FA00002110817009EB0800E28981B202EB080045 +:10FA1000E081378071800298A0B1A01D00F06DF9DF +:10FA2000A4F80EB0A07F401CA077A07D08B1E088AC +:10FA3000A08284F816B000BFA4F812B084F817B002 +:10FA400001208FE7E0892844C01B30F8031DA4F88B +:10FA50001F10807884F82100EEE710B5818800F14E +:10FA6000280321F400442344848AC288A14212D08E +:10FA7000914210D0818971B9826972B11046FFF745 +:10FA8000E8FE50B91089283220F40040104419795A +:10FA90000079884201D1002010BD184610BD00F148 +:10FAA0002803407F08300844C01E1060088808B949 +:10FAB000DB1E136008884988084480B270472DE92E +:10FAC000F04100F12806407F1C460830904643185C +:10FAD00008884D88069ADB1EA0B1C01C80B29042F7 +:10FAE00014D9801AA04200DB204687B298183A4603 +:10FAF0004146FDF7F1FB002816D1E01B84B2B84463 +:10FB0000002005E0ED1CADB2F61EE8E7101A80B249 +:10FB10000119A94206D8304422464146BDE8F041C9 +:10FB2000FDF7DABB4FF0FF3058E62DE9F04100F168 +:10FB30002804407F1E460830904643180025088858 +:10FB40004F88069ADB1E90B1C01C80B2904212D939 +:10FB5000801AB04200DB304685B299182A464046EA +:10FB6000FDF7E7FB701B86B2A844002005E0FF1CF0 +:10FB7000BFB2E41EEAE7101A80B28119B94206D872 +:10FB8000211832464046FDF7D4FBA81985B2284615 +:10FB900024E62DE9F04100F12804407F1E4608309C +:10FBA00090464318002508884F88069ADB1E90B1BE +:10FBB000C01C80B2904212D9801AB04200DB30469D +:10FBC00085B298182A464146FDF7B3FB701B86B2F2 +:10FBD000A844002005E0FF1CBFB2E41EEAE7101AAB +:10FBE00080B28119B94206D8204432464146FDF719 +:10FBF000A0FBA81985B22846F0E5401D704710B556 +:10FC0000044600F12801C288808820F4004319448A +:10FC1000904206D0A28922B9228A12B9A28A9042C1 +:10FC200001D1002010BD0888498831B1201D00F0A5 +:10FC300064F800202082012010BD637F62880833B1 +:10FC4000184481B2201DFFF781FCF2E70021C18139 +:10FC500001774182C1758175704703881380C2891D +:10FC600042B1C28822F4004300F128021A440A601B +:10FC7000C08970470020704710B50446808AA0F5FF +:10FC80007F41FF3900D0FFDFE088A082E08900B12A +:10FC90000120A07510BD4FF6FF7181820021817592 +:10FCA000704710B50446808AA0F57F41FF3900D126 +:10FCB000FFDFA07D28B9A088A18A884201D1002059 +:10FCC00010BD012010BD8188828A914201D1807DC2 +:10FCD00008B1002070470120704720F4004221F451 +:10FCE00000439A4207D100F4004001F400418842E9 +:10FCF00001D0012070470020704730B504460088CD +:10FD00000D4620F40040A84200D2FFDF21884FF4C6 +:10FD1000004088432843208030BD70B50C00054664 +:10FD200009D0082C00D2FFDF1DB1A1B2286800F075 +:10FD300044F8201D70BD0DB100202860002070BD6A +:10FD40000021026803E093881268194489B2002AEE +:10FD5000F9D100F032B870B500260D4604460829E6 +:10FD600000D2FFDF206808B91EE0044620688188C1 +:10FD7000A94202D001680029F7D181880646A9422C +:10FD800001D100680DE005F1080293B2002299420A +:10FD900009D32844491B02608180216809682160D9 +:10FDA0000160206000E00026304670BD00230B603B +:10FDB0008A8002680A600160704700234360021D68 +:10FDC000018102607047F0B50F46018840881546F2 +:10FDD0000C181E46AC4200D3641B3044A84200D924 +:10FDE000FFDFA019A84200D9FFDF3819F0BD2DE9C7 +:10FDF000F041884606460188408815460C181F4683 +:10FE0000AC4200D3641B3844A84200D9FFDFE0199C +:10FE1000A84200D9FFDF70883844708008EB0400E6 +:10FE2000BDE8F0812DE9F041054600881E461746E1 +:10FE3000841B8846BC4200D33C442C8068883044F4 +:10FE4000B84200D9FFDFA019B84200D9FFDF6888A7 +:10FE50003044688008EB0400E2E72DE9F0410688B1 +:10FE60001D460446701980B2174688462080B84265 +:10FE700001D3C01B20806088A84200D2FFDF701928 +:10FE8000B84200D9FFDF6088401B608008EB0600A5 +:10FE9000C6E730B50D460188CC18944200D3A41AA9 +:10FEA0004088984200D8FFDF281930BD2DE9F04185 +:10FEB000BF4D04469046A8780E46A04200D8FFDF0A +:10FEC00005EB8607786A50F8240000B1FFDFB868B8 +:10FED000002816D0304600F032F90146B868FFF726 +:10FEE0003AFF05000CD0786A072E40F8245000D362 +:10FEF000FFDFB0484246294650F826302046984752 +:10FF00002846BDE8F0812DE9F84305000C46009530 +:10FF100024D00026E81C20F00300A84200D0FFDF18 +:10FF2000DFF88C820027314688F8007088F801409D +:10FF300088F8024088F8034088F8044088F80540B3 +:10FF400088F80640684600F003F900204246009910 +:10FF5000C91C21F00301009116B10FE00126D9E779 +:10FF600002EB80035962002106E000BFD3F824C0F1 +:10FF70004CF82170491CC9B2A142F7D30099401C2A +:10FF800001EB8401C0B200910728E0D3481BBDE813 +:10FF9000F88310B50446F1F774F908B1102010BDCC +:10FFA0002078834A618802EB800092780EE0436AF1 +:10FFB00053F8213043B14A1C6280A180406A50F856 +:10FFC0002100A060002010BD491C89B28A42EED8F1 +:10FFD0006180052010BD70B505460C460846F1F756 +:10FFE00050F908B1102070BD072D01D3072070BD56 +:10FFF00025700020608070BD0EB56946FFF7EBFFED +:020000040001F9 +:1000000000B1FFDF6846FFF7C4FF08B100200EBD56 +:1000100001200EBD10B50446072800D3FFDF644859 +:10002000005D10BD3EB5054600246946FFF7D3FFCD +:1000300018B1FFDF01E0641CE4B26846FFF7A9FFD6 +:100040000028F8D02846FFF7E5FF001BC0B23EBDF0 +:1000500057498978814201D9C0B27047FF20704763 +:100060002DE9F04106291BD1514C00273B464FF6A4 +:10007000FF7604EB810514F801C00AE0DC19D5F81D +:1000800024E0A4B25EF824E0BEF1000F04D05B1CB3 +:100090009BB29C45F2D8344604802046B44201D13C +:1000A00000202EE7BDE8F04100E7A0F57F43FF3BCD +:1000B00001D0072901D300207047F7E6A0F57F4261 +:1000C000FF3A0BD0072909D2394A9378834205D9E0 +:1000D00002EB8101496A51F8200070470020704707 +:1000E0002DE9F04104460D46A4F57F4143F202009C +:1000F000FF3902D0072D01D3072002E72C494FF02A +:1001000000088A78A242F8D901EB8506726A52F893 +:100110002470002FF1D0274839461C3050F8252094 +:1001200020469047716A284641F8248000F007F87D +:1001300002463946B068FFF739FE0020E1E61D4966 +:10014000383131F810004FF6FC71C01C0840704780 +:100150002DE9F843164E8846054600242868C01C41 +:1001600020F0030028602046FFF7E9FF315D484397 +:10017000B8F1000F01D0002200E02A680146009289 +:1001800032B100274FEA0D00FFF7C7FD1FB106E0AF +:1001900001270020F8E706EB8401009A8A602968AD +:1001A000641C0844E4B22860072CD7D3EFE60000B3 +:1001B000AC060020D4B1010070B50E461D461146B4 +:1001C00000F0D5F804462946304600F0D9F820441E +:1001D000001D70BD2DE9F04190460D4604004FF022 +:1001E000000610D00027E01C20F00300A04200D041 +:1001F000FFDFE5B141460020FFF78FFD0C3000EB3B +:10020000850617B113E00127EDE7624F04F10C00FA +:10021000AA003C602572606000EB85002060002130 +:100220006068FDF7B0F841463868FFF776FD304664 +:10023000BDE8F0812DE9FF4F564C804681B0206823 +:100240009A46934600B9FFDF2068027A424503D9F7 +:10025000416851F8280020B143F2020005B0BDE822 +:10026000F08F5146029800F082F886B258460E99F7 +:1002700000F086F885B27019001D87B22068A1468B +:1002800039460068FFF767FD04001FD067802580AE +:100290002946201D0E9D07465A4601230095FFF76B +:1002A00077F92088314638440123029ACDF800A01E +:1002B000FFF76EF92088C1193846FFF79AF9D9F887 +:1002C00000004168002041F82840C7E70420C5E746 +:1002D00070B5304C0546206800B9FFDF2068017A10 +:1002E000A9420ED9426852F8251051B1002342F8B4 +:1002F00025304A880068FFF759FD216800200A7AF6 +:1003000008E043F2020070BD4B6853F8203033B967 +:10031000401CC0B28242F7D80868FFF711FD0020E8 +:1003200070BD70B51B4E05460024306800B9FFDF74 +:100330003068017AA94204D9406850F8250000B11C +:10034000041D204670BD70B5124E0546002430686D +:1003500000B9FFDF3068017AA94206D9406850F839 +:10036000251011B131F8040B4418204670BD10B5AA +:100370000A460121FFF705F9C01C20F0030010BD5B +:1003800010B50A460121FFF7FCF8C01C20F003005D +:1003900010BD00007C00002070B50446C2F11005BD +:1003A0002819FCF7C6FF15F0FF0109D0491ECAB293 +:1003B0008020A0542046BDE870400021FCF7E3BF38 +:1003C00070BD30B505E05B1EDBB2CC5CD55C6C402B +:1003D000C454002BF7D130BD10B5002409E00B78D0 +:1003E000521E44EA430300F8013B11F8013BD2B22C +:1003F000DC09002AF3D110BD2DE9F04389B01E4677 +:10040000DDE9107990460D00044622D002460846E8 +:10041000F949FEF71EFB102221463846FFF7DCFFA4 +:10042000E07B000606D5F44A394610231032084610 +:10043000FFF7C7FF102239464846FFF7CDFFF87B8C +:10044000000606D5EC4A4946102310320846FFF74D +:10045000B8FF102200212046FCF795FF0DE0103E6A +:10046000B6B208EB0601102322466846FFF7A9FF43 +:10047000224628466946FEF7ECFA102EEFD818D02F +:10048000F2B241466846FFF787FF10234A466946A5 +:1004900004A8FFF796FF1023224604A96846FFF739 +:1004A00090FF224628466946FEF7D3FA09B0BDE818 +:1004B000F08310233A464146EAE770B59CB01E46E9 +:1004C0000546134620980C468DF808002022194650 +:1004D0000DF10900FCF72DFF202221460DF1290026 +:1004E000FCF727FF17A913A8CDE90001412302AAB1 +:1004F00031462846FFF780FF1CB070BD2DE9FF4F45 +:100500009FB014AEDDE92D5410AFBB49CDE90076A4 +:10051000202320311AA8FFF76FFF4FF000088DF855 +:1005200008804FF001098DF8099054F8010FCDF8BB +:100530000A00A088ADF80E0014F8010C1022C0F3D8 +:1005400040008DF8100055F8010FCDF81100A88873 +:10055000ADF8150015F8010C2C99C0F340008DF88A +:10056000170006A88246FCF7E4FE0AA8834610227C +:100570002299FCF7DEFEA0483523083802AA40681D +:100580008DF83C80CDE900760E901AA91F98FFF7F0 +:1005900033FF8DF808808DF809902068CDF80A00A7 +:1005A000A088ADF80E0014F8010C1022C0F3400032 +:1005B0008DF810002868CDF81100A888ADF8150056 +:1005C00015F8010C2C99C0F340008DF81700504627 +:1005D000FCF7AFFE584610222299FCF7AAFE864887 +:1005E0003523083802AA40688DF83C90CDE90076A2 +:1005F0000E901AA92098FFF7FFFE23B0BDE8F08FF8 +:10060000F0B59BB00C460546DDE922101E461746A4 +:10061000DDE92032D0F801C0CDF808C0B0F805C03F +:10062000ADF80CC00078C0F340008DF80E00D1F892 +:100630000100CDF80F00B1F80500ADF813000878FF +:100640001946C0F340008DF815001088ADF816006B +:1006500090788DF818000DF119001022FCF769FE52 +:100660000DF1290010223146FCF763FE0DF139002F +:1006700010223946FCF75DFE17A913A8CDE9000149 +:10068000412302AA21462846FFF7B6FE1BB0F0BD63 +:10069000F0B5A3B017460D4604461E46102202A828 +:1006A0002899FCF746FE06A820223946FCF741FEB1 +:1006B0000EA820222946FCF73CFE1EA91AA8CDE967 +:1006C0000001502302AA314616A8FFF795FE16989E +:1006D000206023B0F0BDF0B589B00446DDE90E0717 +:1006E0000D463978109EC1F340018DF80010317825 +:1006F0009446C1F340018DF801101968CDF802103D +:100700009988ADF8061099798DF808100168CDF830 +:1007100009108188ADF80D1080798DF80F00102335 +:100720006A46614604A8FFF74CFE2246284604A903 +:10073000FEF78FF9D6F801000090B6F80500ADF885 +:100740000400D7F80100CDF80600B7F80500ADF8B1 +:100750000A000020039010236A46214604A8FFF7F0 +:1007600030FE2246284604A9FEF773F909B0F0BD11 +:100770001FB51C6800945B6801931368029352686C +:100780000392024608466946FEF763F91FBD10B59D +:1007900088B00446106804905068059000200690C8 +:1007A000079008466A4604A9FEF753F9BDF8000011 +:1007B000208008B010BD1FB51288ADF800201A883F +:1007C000ADF80220002201920292039202460846EE +:1007D0006946FEF73EF91FBD7FB5074B1446054637 +:1007E000083B9A1C6846FFF7E6FF22466946284602 +:1007F000FFF7CDFF7FBD000022B2010070B50446B7 +:1008000000780E46012813D0052802D0092813D1FC +:100810000EE0A06861690578042003F07FFA052DD9 +:100820000AD0782300220420616903F0CDF903E0A7 +:100830000420616903F072FA31462046BDE8704039 +:1008400001F08AB810B500F12D03C2799C78411DE2 +:10085000144064F30102C271D2070DD04A795C7969 +:1008600022404A710A791B791A400A718278C97844 +:100870008A4200D9817010BD00224A71F5E74178A3 +:10088000012900D00C21017070472DE9F04F93B081 +:100890004FF0000B0C690D468DF820B00978012649 +:1008A0000C2017464FF00D084FF0110A4FF00809C1 +:1008B0001B2975D2DFE811F01B00C40207031F03D8 +:1008C0005E037103A303B803F9031A0462049504D9 +:1008D000A204EF042D05370555056005F30536061E +:1008E000390668068406FE062207EB06F00614B1F8 +:1008F00020781D282AD0D5F808805FEA08004FD05C +:1009000001208DF82000686A02220D908DF82420C5 +:100910000A208DF82500A8690A90A8880028EED042 +:1009200098F8001091B10F2910D27DD2DFE801F0C4 +:100930007C1349DEFCFBFAF9F8F738089CF6F50061 +:1009400002282DD124B120780C2801D00026F0E314 +:100950008DF82020CBE10420696A03F0DFF9A88834 +:100960000728EED1204600F0F2FF022809D02046E9 +:1009700000F0EDFF032807D9204600F0E8FF072824 +:1009800002D20120207004E0002CB8D02078012889 +:10099000D7D198F80400C11F0A2902D30A2061E0C8 +:1009A000C4E1A070D8F80010E162B8F80410218604 +:1009B00098F8060084F83200012028700320207087 +:1009C00044E00728BDD1002C99D020780D28B8D15B +:1009D00098F8031094F82F20C1F3C000C2F3C002AE +:1009E000104201D0062000E00720890707D198F8BF +:1009F00005100142D2D198F806100142CED194F8E8 +:100A0000312098F8051020EA02021142C6D194F86C +:100A1000322098F8061090430142BFD198F80400A4 +:100A2000C11F0A29BAD200E008E2617D81427CD868 +:100A3000D8F800106160B8F80410218198F8060019 +:100A4000A072012028700E20207003208DF8200055 +:100A5000686A0D9004F12D000990601D0A900F3016 +:100A60000B9022E12875FCE3412891D1204600F04B +:100A70006EFF042802D1E078C00704D1204600F0C0 +:100A800066FF0F2884D1A88CD5F80C8080B24FF077 +:100A9000400BE669FFF745FC324641465B464E4651 +:100AA000CDF80090FFF741F80B208DF82000686A20 +:100AB0000D90E0690990002108A8FFF79FFE2078BB +:100AC000042806D0A07D58B1012809D003280AD0F7 +:100AD0004AE305202070032028708DF82060CEE1C5 +:100AE00084F800A032E712202070EAE11128BCD17E +:100AF000204600F02CFF042802D1E078C00719D06E +:100B0000204600F024FF062805D1E078C00711D167 +:100B1000A07D02280ED0204608E0CCE084E072E1FF +:100B200051E124E103E1E9E019E0B0E100F00FFF59 +:100B300011289AD1102208F1010104F13C00FCF7C0 +:100B4000F8FB607801286ED012202070E078C00792 +:100B500060D0A07D0028C8D00128C6D05AE0112856 +:100B600090D1204600F0F3FE082804D0204600F083 +:100B7000EEFE132886D104F16C00102208F1010169 +:100B80000646FCF7D6FB207808280DD014202070EC +:100B9000E178C8070DD0A07D02280AD06278022A29 +:100BA00004D00328A1D035E00920F0E708B10128DE +:100BB00037D1C80713D0A07D02281DD00020009097 +:100BC000D4E9062133460EA8FFF777FC10220EA9C0 +:100BD00004F13C00FCF780FBC8B1042042E7D4E9F3 +:100BE0000912201D8DE8070004F12C0332460EA8DF +:100BF000616BFFF770FDE9E7606BC1F34401491ECB +:100C00000068C84000F0010040F08000D7E720787D +:100C1000092806D185F800908DF8209036E32870D9 +:100C2000EFE30920FBE79EE1112899D1204600F06F +:100C30008EFE0A2802D1E078C00704D1204600F0D9 +:100C400086FE15288CD104F13C00102208F1010128 +:100C50000646FCF76EFB20780A2816D01620207076 +:100C6000D4E90932606B611D8DE80F0004F15C036B +:100C700004F16C0247310EA8FFF7C2FC10220EA946 +:100C80003046FCF729FB18B1F9E20B20207073E223 +:100C90002046FFF7D7FDA078216AC0F110020B189B +:100CA00000211846FCF76FFB26E3394608A8FFF73A +:100CB000A5FD06463CE20228B7D1204600F047FEDB +:100CC000042804D3204600F042FE082809D3204619 +:100CD00000F03DFE0E2829D3204600F038FE1228F1 +:100CE00024D2A07D0228A0D10E208DF82000686AB1 +:100CF0000D9098F801008DF82400F5E3022894D1B6 +:100D0000204600F024FE002810D0204600F01FFEF0 +:100D10000128F9D0204600F01AFE0C28F4D0042057 +:100D20008DF8240098F801008DF8250060E2112864 +:100D3000FCD1002CFAD020781728F7D16178606AAE +:100D4000022912D05FF0000101EB4101182606EBE9 +:100D5000C1011022405808F10101FCF7EAFA042011 +:100D6000696A00F0E7FD2670F0E50121ECE70B2849 +:100D7000DCD1002CDAD020781828D7D16078616ACD +:100D800002281CD05FF0000000EB4002102000EBB6 +:100D9000C2000958B8F8010008806078616A02282A +:100DA0000FD0002000EB4002142000EBC2000958D5 +:100DB000404650F8032F0A604068486039E001203F +:100DC000E2E70120EEE71128B0D1002CAED0207868 +:100DD0001928ABD16178606A022912D05FF0000156 +:100DE00001EB41011C2202EBC1011022405808F125 +:100DF0000101FCF79EFA0420696A00F09BFD1A20AD +:100E0000B6E00121ECE7082890D1002C8ED02078A4 +:100E10001A288BD1606A98F80120017862F34701A3 +:100E20000170616AD8F8022041F8012FB8F8060075 +:100E300088800420696A00F07DFD90E2072011E6B9 +:100E40003878012894D1182204F114007968FCF74D +:100E500070FAE079C10894F82F0001EAD001E07837 +:100E600061F30000E070217D002974D1217803290D +:100E700009D0C00725D0032028708DF82090686A1B +:100E80000D90412008E3607DA178884201D90620B9 +:100E9000E8E502262671E179204621F0E001E171C2 +:100EA000617A21F0F0016172A17A21F0F001A17262 +:100EB000FFF7C8FC2E708DF82090686A0D9007200F +:100EC000EAE20420ABE6387805289DD18DF82000B1 +:100ED000686A0D90B8680A900720ADF824000A9857 +:100EE0008DF830B06168016021898180A17A8171BB +:100EF00004202070F8E23978052985D18DF820107A +:100F0000696A0D91391D09AE0EC986E80E004121AE +:100F1000ADF824108DF830B01070A88CD7F80C8084 +:100F200080B24026A769FFF70EFA41463A4633469B +:100F3000C846CDF80090FEF72CFE002108A8FFF768 +:100F40005DFCE07820F03E00801CE07020780528F1 +:100F500002D00F200CE04AE1A07D20B1012802D090 +:100F6000032802D002E10720BEE584F80080EDE40A +:100F70002070EBE4102104F15C0002F0E8FB606BF0 +:100F8000B0BBA07D18B1012801D00520FDE00620EE +:100F90002870F8486063A063C2E23878022894D1D0 +:100FA000387908B12875B7E3A07D022802D003285C +:100FB00005D022E0B8680028F5D060631CE06078B6 +:100FC000012806D0A07994F82E10012805D0E94810 +:100FD00006E0A17994F82E00F7E7B8680028E2D07F +:100FE0006063E078C00701D0012902D0E14803E046 +:100FF00003E0F8680028D6D0A06306200FE68DF83D +:101000002090696A0D91E1784846C90709D0617856 +:10101000022903D1A17D29B1012903D0A17D032992 +:1010200000D00720287033E138780528BBD120781C +:1010300007281ED084F800A005208DF82000686ADB +:101040000D90B8680A90ADF824A08DF830B0032157 +:101050000170E178CA070FD0A27D022A1AD00021C0 +:101060000091D4E9061204F15C03401CFFF725FA55 +:101070006BE384F80090DFE7D4E90923211D8DE8B4 +:101080000E0004F12C0304F15C02401C616BFFF7BD +:1010900022FB5AE3626BC1F34401491E1268CA4045 +:1010A00002F0010141F08001DAE738780528BDD16E +:1010B0008DF82000686A0D90B8680A90ADF824A0F9 +:1010C0008DF830B0042100F8011B102204F15C01FE +:1010D000FCF72FF9002108A8FFF790FB20780928DA +:1010E00001D0132044E70A2020709AE5E078C10778 +:1010F00042D0A17D012902D0022927D038E06178B1 +:1011000008A8012916D004F16C010091D4E9061257 +:1011100004F15C03001DFFF7BBFA0A2028700326C8 +:101120008DF82080686A0D90002108A8FFF766FB03 +:10113000E1E2C7E204F15C010091D4E9062104F187 +:101140006C03001DFFF7A4FA0026E9E7C0F3440191 +:1011500014290DD24FF0006101EBB0104FEAB060DE +:10116000E0706078012801D01020BDE40620FFE681 +:10117000607801283FF4B6AC0A2050E5E178C90751 +:1011800008D0A17D012903D10B202870042030E074 +:1011900028702EE00E2028706078616B012818D02E +:1011A00004F15C0304F16C020EA8FFF7E1FA20469B +:1011B000FFF748FBA0780EAEC0F1100230440021CA +:1011C000FCF7E1F806208DF82000686A09960D907A +:1011D0009BE004F16C0304F15C020EA8FFF7C8FA6F +:1011E000E8E73978022903D139790029D0D0297567 +:1011F00092E28DF82000686A0D9056E5387807284D +:10120000F6D1D4E909216078012808D004F16C00F6 +:10121000CDE90002029105D104F16C0304E004F170 +:101220005C00F5E704F15C0304F14C007A680646C3 +:10123000216AFFF763F96078012822D1A078216A3A +:10124000C0F110020B1800211846FCF79CF8D4E9F5 +:101250000923606B04F12D018DE80F0004F15C039C +:1012600000E05BE204F16C0231460EA8FFF7C8F91A +:1012700010220EA904F13C00FCF72EF808B10B2057 +:10128000ACE485F8008000BF8DF82090686A0D906E +:101290008DF824A009E538780528A9D18DF820001B +:1012A000686A0D90B8680A90ADF824A08DF830B047 +:1012B00080F80080617801291AD0D4E9092104F16D +:1012C0002D03A66B03910096CDE9013204F16C0366 +:1012D00004F15C0204F14C01401CFFF791F900217C +:1012E00008A8FFF78BFA6078012805D015203FE6A3 +:1012F000D4E90912631DE4E70E20287006208DF85A +:101300002000686ACDF824B00D90A0788DF82800F0 +:10131000CBE438780328C0D1E079C00770D00F2023 +:101320002870072065E7387804286BD11422391D0E +:1013300004F11400FBF7FDFF616A208CA1F809009D +:10134000616AA078C871E179626A01F003011172E3 +:10135000616A627A0A73616AA07A81F824001620B1 +:101360005DE485F800A08DF82090696A50460D91E3 +:1013700092E0000022B201003878052842D1B86816 +:10138000A8616178606A022901D0012100E0002192 +:1013900001EB4101142606EBC1014058082102F07F +:1013A000D6F96178606A022901D0012100E00021AC +:1013B00001EB410106EBC101425802A8E169FFF7C8 +:1013C0000BFA6078626A022801D0012000E0002058 +:1013D00000EB4001102000EBC1000223105802A9CD +:1013E0000932FEF7EEFF626AFD4B0EA80932A169D1 +:1013F000FFF7E1F96178606A022904D0012103E076 +:1014000044E18DE0BFE0002101EB4101182606EB2D +:10141000C101A27840580EA9FBF78BFF6178606A82 +:10142000022901D0012100E0002101EB410106EB7E +:10143000C1014158A0780B18C0F1100200211846D4 +:10144000FBF7A1FF05208DF82000686A0D90A869C0 +:101450000A90ADF824A08DF830B0062101706278B2 +:10146000616A022A01D0012200E0002202EB42025E +:1014700006EBC202401C89581022FBF75AFF0021DC +:1014800008A8FFF7BBF91220C5F818B028708DF82E +:101490002090686A0D900B208DF8240005E43878C0 +:1014A000052870D18DF82000686A0D90B8680A9000 +:1014B0000B20ADF824000A98072101706178626A58 +:1014C000022901D0012100E0002101EB410310219C +:1014D00001EBC30151580988A0F801106178626AD4 +:1014E000022902D0012101E02FE1002101EB41039B +:1014F000142101EBC30151580A6840F8032F4968D1 +:10150000416059E01920287001208DF8300074E600 +:10151000162028708DF830B0002108A8FFF76EF96A +:10152000032617E114202870AEE6387805282AD162 +:101530008DF82000686A0D90B8680A90ADF824A074 +:101540008DF830B080F800906278616A4E46022AC9 +:1015500001D0012200E0002202EB42021C2303EB37 +:10156000C202401C89581022FBF7E3FE002108A8A4 +:10157000FFF744F9152028708DF82060686A0D90F7 +:101580008DF8246039E680E0387805287DD18DF823 +:101590002000686A0D90B8680A90ADF8249009217F +:1015A00001706169097849084170616951F8012F3A +:1015B000C0F802208988C18020781C28A8D1A1E722 +:1015C000E078C00702D04FF0060C01E04FF0070CA6 +:1015D000607802280AD000BF4FF0000000EB040141 +:1015E00001F1090105D04FF0010004E04FF00100C6 +:1015F000F4E74FF000000B78204413EA0C030B7063 +:1016000010F8092F02EA0C02027004D14FF01B0CF3 +:1016100084F800C0D2B394F801C0BCF1010F00D02F +:101620009BB990F800C0E0465FEACC7C04D028F07B +:1016300001060670102606E05FEA887C05D528F0D2 +:101640000206067013262E70032694F801C0BCF122 +:10165000020F00D092B991F800C05FEACC7804D0B4 +:101660002CF001060E70172106E05FEA8C7805D594 +:101670002CF002060E701921217000260078D0BBD4 +:10168000CAB3C3BB1C20207035E012E002E03878FA +:10169000062841D11A2015E4207801283CD00C28D6 +:1016A0003AD02046FFF7EBF809208DF82000686A51 +:1016B0000D9031E03878052805D0062038700326D3 +:1016C0001820287046E005208DF82000696A0D91E9 +:1016D000B9680A910221ADF8241001218DF830106B +:1016E0000A990870287D4870394608A8FFF786F8DF +:1016F000064618202870012E0ED02BE001208DF810 +:101700002000686A0D9003208DF82400287D8DF854 +:10171000250085F814B012E0287D80B11D202070CE +:10172000172028708DF82090686A0D9002208DF89F +:101730002400394608A8FFF761F806460AE00CB114 +:10174000FE2020709DF8200020B1002108A8FFF79E +:1017500055F80CE413B03046BDE8F08F2DE9F043A6 +:1017600087B00C464E6900218DF8041001202578C1 +:10177000034602274FF007094FF0050C85B1012DF4 +:1017800053D0022D39D1FE2030708DF80030606AC0 +:10179000059003208DF80400207E8DF8050063E09D +:1017A0002179012925D002292DD0032928D0042907 +:1017B00023D1B17D022920D131780D1F042D04D30E +:1017C0000A3D032D01D31D2917D12189022914D3E4 +:1017D0008DF80470237020899DF80410884201E080 +:1017E0001AB2010018D208208DF80000606A059036 +:1017F00057E070780128EBD0052007B0BDE8F083F2 +:101800001D203070E4E771780229F5D131780C2978 +:10181000F3D18DF80490DDE7083402F804CB94E8A6 +:101820000B0082E80B000320E7E71578052DE4D1D3 +:101830008DF800C0656A0595956802958DF81010C1 +:1018400094F80480B8F1010F13D0B8F1020F2DD035 +:10185000B8F1030F1CD0B8F1040FCED1ADF804706D +:101860000E202870207E687000216846FEF7C6FFB3 +:101870000CE0ADF804700B202870207E002100F0F1 +:101880001F0068706846FEF7B9FF37700020B4E7A4 +:10189000ADF804708DF8103085F800C0207E6870B7 +:1018A000277011466846FEF7A9FFA6E7ADF8049039 +:1018B0002B70207F6870607F00F00100A870A07F0F +:1018C00000F01F00E870E27F2A71C0071CD094F876 +:1018D000200000F00700687194F8210000F0070074 +:1018E000A87100216846FEF789FF2868F062A88881 +:1018F0003086A87986F83200A0694078707528791A +:10190000B0700D203070C1E7A9716971E9E700B5C9 +:1019100087B004280CD101208DF800008DF8040058 +:10192000002005918DF8050001466846FEF766FF28 +:1019300007B000BD70B50C46054602F0EFF9214630 +:101940002846BDE870407823002202F03DB908B176 +:10195000007870470C20704770B50C0005784FF088 +:1019600000010CD021702146F1F757FC694821781D +:10197000405D884201D1032070BD022070BDF1F7A7 +:101980004CFC002070BD0279012A05D000220A70AB +:101990004B78012B02D003E0042070470A758A615E +:1019A00002799300521C0271C15003207047F0B5B8 +:1019B00087B00F4605460124287905EB800050F8D2 +:1019C000046C7078411E02290AD252493A460839FD +:1019D00001EB8000314650F8043C28469847044605 +:1019E0000CB1012C11D12879401E10F0FF00287194 +:1019F00001D00324E0E70A208DF80000706A05900A +:101A0000002101966846FFF7A7FF032CD4D007B04A +:101A10002046F0BD70B515460A46044629461046D4 +:101A2000FFF7C5FF064674B12078FE280BD1207C55 +:101A300030B100202870294604F10C00FFF7B7FFF1 +:101A40002046FEF71CFF304670BD704770B50E464D +:101A500004467C220021FBF796FC0225012E03D0D0 +:101A6000022E04D0052070BD0120607000E065707A +:101A70002046FEF704FFA575002070BD28B1027C4A +:101A80001AB10A4600F10C01C4E70120704710B5F5 +:101A9000044686B0042002F041F92078FE2806D0E2 +:101AA00000208DF8000069462046FFF7E7FF06B0EA +:101AB00010BD7CB50E4600218DF804104178012937 +:101AC00003D0022903D0002405E0046900E0446942 +:101AD0000CB1217C89B16D4601462846FFF753FFC2 +:101AE000032809D1324629462046FFF793FF9DF887 +:101AF0000410002900D004207CBD04F10C05EBE7A4 +:101B000030B40C460146034A204630BC024B0C3A26 +:101B1000FEF751BE60B201001AB2010070B50D4669 +:101B2000040012D08DB1220100212846FBF72BFCC6 +:101B3000102255492846FBF7FCFB53480121083881 +:101B4000018044804560002070BD012070BD70B5EB +:101B50004D4E00240546083E10E07068AA7B00EB5D +:101B60000410817B914208D1C17BEA7B914204D170 +:101B70000C222946FBF7B0FB30B1641C308884424C +:101B8000EBDB4FF0FF3070BD204670BD70B50D46E9 +:101B9000060006D02DB1FFF7DAFF002803DB401C5A +:101BA00014E0102070BD384C083C20886288411C2D +:101BB000914201D9042070BD6168102201EB001030 +:101BC0003146FBF7B6FB2088401C2080287000209F +:101BD00070BD2D480838008870472B49083908889F +:101BE000012802D0401E08800020704770B51446BE +:101BF0000D0018D0BCB10021A170022802D010281D +:101C000011D105E0288870B10121A170108008E091 +:101C10002846FFF79CFF002805DB401CA070A88920 +:101C20002080002070BD012070BD70B505461446AF +:101C30000E000BD000203070A878012808D005D9FC +:101C40001149A1F108010A8890420AD9012070BD0A +:101C500024B1287820702888000A5070022008706B +:101C60000FE064B14968102201EB001120461039E1 +:101C7000FBF75FFB287820732888000A6073102028 +:101C80003070002070BD0000880000202DE9F04178 +:101C900090460C4607460025C2EB4811FE48072F28 +:101CA00000EB410607D2DFE807F007070707040447 +:101CB0000400012500E0FFDF06F81470002D13D0AA +:101CC000F5487C3000EB880191F827001F2803D0ED +:101CD00006EB4000447001E081F8264006EB440228 +:101CE0001F20507081F82740BDE8F081F0B51F46F5 +:101CF00014460E4605461F2A00D1FFDFE648C7EB13 +:101D0000471100EB410CE4490CEB44007C3101EB42 +:101D100087021F2E07D00CEB460140784B784870A5 +:101D200018461F210AE092F82530407882F82500F5 +:101D3000F6E701460CEB410005704078A142F8D16E +:101D400092F827401F2C03D00CEB4404637001E091 +:101D500082F826300CEB41041F23637082F82710B1 +:101D6000F0BD30B50D46CD4B44190022181A72EB68 +:101D7000020100D2FFDFCA48854200DDFFDFC8480C +:101D80004042854200DAFFDFC448401C844207DA43 +:101D9000002C01DB204630BDC048401C201830BD5F +:101DA000BE48C043FAE710B504460168407ABD4A10 +:101DB00052F82020114450B10220084420F07F4006 +:101DC000F8F759FD94F90810BDE81040C9E7042060 +:101DD000F3E72DE9F047B04E7C3696F82D50DFF84A +:101DE000B89206EB850090F8264036E0C5EB451129 +:101DF00009EB41074FF0070817F81400012806D037 +:101E000004282ED005282ED0062800D0FFDF01F0B0 +:101E100045F9014607EB4400427806EB850080F85F +:101E2000262090F82720A24202D11F2280F82720E6 +:101E3000084601F03EF92A4621460120FFF726FF19 +:101E40009948414600EB041002682046904796F8F6 +:101E50002D5006EB850090F826401F2CC6D1BDE81A +:101E6000F087022000E003208046D0E710B58A4CBE +:101E70001F217C3484F8251084F8261084F827105C +:101E8000002084F8280084F82D0084F82E10411ECC +:101E9000A16044F8100B2074607420736073A07309 +:101EA0008249E07720750870487000217A4A103C1A +:101EB00002F81100491CC9B21F29F9D30120F8F713 +:101EC000CAFB0020F8F7C7FB012084F82200F9F7CD +:101ED00037F87748F9F749F8744CA41E2070754814 +:101EE000F9F743F86070BDE81040F8F741BB10B552 +:101EF000F8F763FB6D4CA41E2078F9F74FF8607873 +:101F0000F9F74CF8BDE8104001F000B91F20704708 +:101F10000020F8F779BB70B5054601240E46AC40A9 +:101F20005AB1FFF7F5FF0146634800EBC500C0F862 +:101F30001015C0F81465614801E06048001D046098 +:101F400070BD2DE9F34F544D00247C3505EB810A1B +:101F500089B09AF825001F2823D0611E02915249AA +:101F6000009401EB0017391D03AB07C983E8070094 +:101F700005F11400A0460189ADF81C10807A8DF897 +:101F80001E009DF81500C8B10226464951F82040B0 +:101F90000399A219114421F07F41019184B10221DA +:101FA0000FE00120F8F757FB0020F8F754FBF8F793 +:101FB00022FB01F0ABF885F82F40A9E00426E4E706 +:101FC00000218DF81810022801D0012820D1039893 +:101FD00001190998081A801C9DF81C1020F07F40F8 +:101FE00001B10221353181420BD203208DF8150059 +:101FF0000398C4F13201401A20F07F40322403904C +:102000000CE095F8240018B901F063FA002863D0B9 +:10201000322C03D214B101F06DF801E001F076F832 +:10202000224A107818B393465278039B121B002162 +:102030009DF81840994601281AD0032818D000208E +:102040008DF81E00002A04DD981A039001208DF8F7 +:1020500018009DF81C0000B102210398184A20F0D6 +:102060007F40039003AB099801F05CF810B110E0D9 +:102070000120E5E79DF81D0018B99BF80000032832 +:1020800029D08DF81C80CDF80C908DF818408DF873 +:102090001E809DF8180015E0DC080020FF7F841EDC +:1020A0000020A10770B20100EC0600209A00002079 +:1020B000773A0100D31D010000F0014004F5014012 +:1020C000FFFF3F0058B103980123811900221846F1 +:1020D000F8F714FB06E000200BB0BDE8F08F0120FC +:1020E000F8F7B9FA97F90C20012300200199F8F7C5 +:1020F00005FBF87BC00701D0F8F7E9FB012085F864 +:102100002F008AF8288020226946FE48FBF711F943 +:102110000120E1E72DE9F05FDFF8E883064608EBF0 +:10212000860090F825501F2D21D0A8F17C01C6EB28 +:1021300046102C4601EB4007A1F5F879DFF8C8B34B +:1021400005E0A24607EB4A0044781F2C0AD0F8F7B6 +:1021500020FB09EB04135A4601211B1D00F0E2FF8E +:102160000028EED0AC4202D0334652461EE0E7488B +:1021700008B1AFF30080F8F70CFB98F82F206AB194 +:10218000D8F80C20411C891A0902CA1701EB126108 +:102190000912002902DD0020BDE8F09F3146FFF75B +:1021A000D0FE08B10120F7E733462A461F2104205C +:1021B000FFF79CFDEFE72DE9F041D24C2569F8F7D8 +:1021C000E8FA401B0002C11700EB1160001200D4B6 +:1021D000FFDF94F8220000B1FFDF012784F82270AE +:1021E00094F82E001F2800D1FFDF94F82E601F20E6 +:1021F00084F82E00002584F82F5084F8205084F8AD +:102200002150C34825600078022835D0032833D0F8 +:1022100000202077A068401C05D04FF0FF30A06060 +:102220000120F8F718FA0020F8F715FAF8F711FB73 +:10223000F8F709FBF8F7DFF908F0C6F8B5480560CC +:1022400005604FF0E0214FF40040B846C1F880022D +:10225000F0F7B5FE94F82D703846FFF75BFF0028C5 +:10226000FAD0A849C7EB47107C3901EB400010F8C1 +:102270001600022802D006E00120CAE73A4631469D +:102280000620FFF703FD84F8238004EB870090F815 +:1022900026001F2804D09E48801E4078F8F784FE50 +:1022A000207F002803D0F8F7C4FA257765771BE56F +:1022B000944910B591F82D20924B0024C2EB4211A5 +:1022C0007C3B03EB410100BF11F814302BB1641CBF +:1022D000E4B21F2CF8D31F2010BD8F4901EB04116D +:1022E00008600020C87321460120FFF7CFFC20467C +:1022F00010BD10B5012801D0032800D181B3814A57 +:1023000092F82D307F4C0022C3EB43137C3C04EB4E +:10231000430300BF13F812400CB1082010BD521C3B +:10232000D2B21F2AF6D37A4A48B1022807D0072929 +:1023300017D2DFE801F01606080A0C0E1000002183 +:102340000AE01B2108E03A2106E0582104E0772149 +:1023500002E0962100E0B52151701070002010BD00 +:10236000FFE70720FBE76A4810B54078F8F783FAE3 +:1023700080B2F4E710B51F2815D2624991F82D20DC +:10238000C2EB4213A1F17C0202EB430414F81030BB +:102390004BB191F82D30C3EB431302EB430212F81B +:1023A0001020012A01D00020D9E791F82D20014604 +:1023B0000020FFF76BFC0120D1E710B5F8F7E9F931 +:1023C000BDE81040F8F757BA2DE9F0410E464D4FE1 +:1023D00001781F257C3FC3EB43130C4607EB4303F7 +:1023E00003E0254603EB45046478944202D01F2C99 +:1023F000F7D108E01F2C06D0A14206D103EB410122 +:102400004978017007E000206EE403EB440003EB21 +:10241000450140784870414F7EB127B1002140F21C +:102420002D40AFF300803078A04206D127B10021C3 +:102430004FF48660AFF30080357027B1002140F281 +:102440003540AFF3008001204EE410B542680B68C0 +:102450009A1A1202D41702EB1462121216D4497A95 +:1024600091B1427A82B92E4A006852F8211012685E +:1024700019441044001D891C081A0002C11700EB02 +:1024800011600012322801DB012068E7002066E7B6 +:102490002DE9F0478146204EC1EB411006F5F87159 +:1024A0009846144601EB400713E000BF06EB041505 +:1024B000291D4846FFF7C9FF68B988F80040A97B85 +:1024C00099F80A00814201D80020C8E407EB4400D3 +:1024D00044781F2CEAD10120C1E42DE9F04782465F +:1024E00008480E4600EB8600DFF82C8090F8254067 +:1024F0001F201070C1EB46109946154608F5F8717B +:1025000010E0000058090020FFFF3F00000000001D +:102510009A00002000F50040EC06002000000000BA +:1025200070B2010001EB40070BE000BF08EB0410A4 +:102530005146001DFFF789FF28B107EB44002C70BE +:1025400044781F2CF2D1297889F800104B46224696 +:1025500031465046BDE8F0479AE72DE9FC410E466A +:1025600007460024FE4D08E09DF8000005EB001032 +:102570008168384600F0EAFD01246B4601AA314625 +:102580003846FFF7AAFF0028EED02046BDE8FC81C0 +:1025900070B50446C0EB44110125F248A54300EB99 +:1025A0004101C5EB451200EB42003E22FAF7C1FEA5 +:1025B000ED4E26B100214FF49360AFF30080E9485F +:1025C0007C3000EB850100EB8400D0F82500C1F8D9 +:1025D000250026B1002140F29C40AFF30080284640 +:1025E00070BD8A4203D003460520FFF77FBB1F2939 +:1025F00008D0DC4AC0EB401002EB400000EB410089 +:1026000040787047D7497C3101EB800090F8250075 +:102610007047D34901EB0010001DFFF7C4BB7CB528 +:102620001D46134604460E4600F108022146184690 +:10263000F8F72EF994F908000F2804DD1F382072EE +:102640002068401C206096B10220C84951F826102D +:10265000461820686946801B20F07F40206094F96E +:1026600008002844C01C1F2803DA012009E00420C8 +:10267000EBE701AAF8F70CF99DF8040010B10098F7 +:10268000401C00900099206831440844C01C20F090 +:102690007F4060607CBDFEB50C46064609786079D7 +:1026A000907220791F461546507279B12179002227 +:1026B0002846A368FFF7B3FFAA4928467C3191F862 +:1026C0002E201F2A0AD00969491D0DE0D4E90223F2 +:1026D000217903B02846BDE8F040A0E7A449497835 +:1026E000052900D20521314421F07F4100F02EFD63 +:1026F00039462846FFF731FFD4E90232217968468E +:10270000FFF78DFF2B4600213046019A00F00AFDAD +:10271000002806D103B031462846BDE8F04000F05D +:1027200015BDFEBD2DE9FE4F814600F0CBFC38B152 +:102730005FF0000799F8000020B10020BDE8FE8F8F +:102740000127F7E7874D884C4FF0000A7C3524B10C +:10275000002140F2FF40AFF3008095F82D8085F80E +:1027600023A0002624B1002140F20450AFF30080E2 +:102770001FB94046FFF70CFF804624B1002140F20C +:102780000C50AFF30080F8F704F843466A46494618 +:10279000FFF781FF24B1002140F21250AFF3008017 +:1027A00095F82E001F280CD029690098401A0002C5 +:1027B000C21700EB1260001203D5684600F0C6FC99 +:1027C000012624B1002140F21C50AFF3008095F89F +:1027D00023000028BBD124B1002140F22250AFF3E6 +:1027E0000080F7F7D6FF6B46624A002100F09AFCA2 +:1027F0000028A3D027B941466846FFF7AEFE06433E +:1028000026B16846FFF7CFFAC9F8080024B10021C5 +:1028100040F23550AFF3008001208FE72DE9F04FF3 +:1028200089B08B46824600F04DFC4E4C7C3428B378 +:102830009BF80000002710B1012800D0FFDF4A4DAF +:1028400025B1002140F2F750AFF300804449012048 +:1028500001EB0A18A94607905FEA090604D0002197 +:1028600040F2FF50AFF30080079800F022FC94F88C +:102870002D50002084F8230067B119E094F82E0051 +:1028800001271F2800D1FFDF9BF800000028D6D0C9 +:10289000FFDFD4E72846FFF77BFE054626B100217F +:1028A00040F20960AFF3008094F823000028D3D1F0 +:1028B00026B1002140F21360AFF30080F7F769FF03 +:1028C0002B4602AA59460790FFF7E5FE98F80F003D +:1028D0005FEA060900F001008DF8130004D0002122 +:1028E00040F21D60AFF300803B462A4602A9CDF8B6 +:1028F00000A0079800F035FC064604EB850090F830 +:1029000028000090B9F1000F04D0002140F22460AB +:10291000AFF3008000F0C2FB0790B9F1000F04D0C4 +:10292000002140F22A60AFF3008094F823000028D1 +:1029300092D1B9F1000F04D0002140F23260AFF320 +:1029400000800DF1080C9CE80E00C8E90112C8F8DF +:102950000C30BEB35FEA090612D000210CE0000083 +:10296000EC060020DC0800200000000070B201002E +:102970009A000020FFFF3F0040F23F60AFF300806D +:102980000098B84312D094F82E001F280ED126B11B +:10299000002140F24460AFF300802846FFF7BAFB05 +:1029A00020B99BF80000D8B3012849D0B9F1000F35 +:1029B00004D0002140F26160AFF30080284600F0AF +:1029C00066FB01265FEA090504D0002140F26A6037 +:1029D000AFF30080079800F06CFB25B1002140F2B6 +:1029E0006E60AFF300808EB194F82D0004EB800090 +:1029F00090F826001F2809D025B1002140F275600B +:102A0000AFF30080F9484078F8F7CEFA25B10021FD +:102A100040F27A60AFF3008009B03046BDE8F08F35 +:102A2000FFE7B9F1000F04D0002140F24C60AFF392 +:102A3000008094F82D2051460420FFF727F9C0E7C5 +:102A4000002E3FF409AF002140F25760AFF3008041 +:102A500002E72DE9F84FE64D814695F82D004FF03D +:102A60000008E44C4FF0010B474624B100214FF41D +:102A7000D160AFF30080584600F01BFB85F823704F +:102A800024B1002140F28D60AFF3008095F82D0055 +:102A9000FFF77EFD064695F8230028B1002CE4D010 +:102AA000002140F293604DE024B1002140F2976094 +:102AB000AFF30080CE49C6EB46107C3901EB4001F4 +:102AC00011F81900032856D1334605EB830A4A460C +:102AD0009AF82500904201D1012000E000200090EA +:102AE0000AF125000021FFF76FFC01460098014222 +:102AF00003D001228AF82820AF77E1B324B1002166 +:102B000040F29C60AFF30080324649460120FFF757 +:102B1000BDF89AF828A024B1002140F2A760AFF3D5 +:102B2000008000F0BBFA834624B1002140F2AC6083 +:102B3000AFF3008095F8230038B1002C95D0002128 +:102B40004FF4D660AFF300808FE7BAF1000F07D0E3 +:102B500095F82E001F2803D13046FFF7DBFAE0B1CD +:102B600024B1002140F2C460AFF30080304600F091 +:102B70008EFA4FF0010824B1002140F2CD60AFF38E +:102B80000080584600F095FA24B1002140F2D1604F +:102B9000AFF300804046BDE8F88F002CF1D0002153 +:102BA00040F2BF60AFF30080E6E70120F7F72CBDED +:102BB0008E48007870472DE9F0418D4C94F82E0036 +:102BC0001F2821D194F82D6004EB860797F8255033 +:102BD0001F2D00D1FFDF8649C6EB46107C3901EB83 +:102BE000400000EB4500407807F8250F0120F87001 +:102BF00084F82300294684F82E50324602202234DD +:102C0000FFF744F8002020701EE42DE9F0417A4ED1 +:102C1000774C012538B1012821D0022879D003282A +:102C20007DD0FFDF10E400F065FAFFF7C4FF207EDF +:102C300000B1FFDF84F821500020F7F70CFDA168F8 +:102C4000481C04D0012300221846F7F757FD14F85A +:102C50002E0F217806EB01110A68012154E0FFF7DD +:102C6000AAFF0120F7F7F7FC94F8210050B1A06803 +:102C7000401C07D014F82E0F217806EB01110A68CA +:102C8000062141E0207EDFF86481002708F1020878 +:102C9000012803D002281ED0FFDFB5E7A777F7F79A +:102CA000C8FD98F80000032801D165772577607D7D +:102CB000524951F8200094F8201051B948B1616888 +:102CC0000123091A00221846F7F718FD0220207682 +:102CD0009AE7277698E784F8205000F00BFAA07F57 +:102CE00050B198F8010061680123091A00221846C2 +:102CF000F7F704FD257600E0277614F82E0F2178EB +:102D000006EB01110A680021BDE8F041104700E020 +:102D100005E036480078BDE8F041F8F745B9FFF71F +:102D20004AFF14F82E0F217806EB01110A680521DD +:102D3000EAE710B52E4C94F82E001F2800D1FFDFD3 +:102D400014F82E0F21782C4A02EB01110A68BDE815 +:102D50001040042110477CB5254C054694F82E0000 +:102D60001F2800D1FFDFA068401C00D0FFDF94F8CF +:102D70002E00214901AA01EB0010694690F90C00D0 +:102D80002844F7F785FD9DF904000F2801DD012097 +:102D900000E00020009908446168084420F07F4169 +:102DA000A16094F82100002807D002B00123BDE8FB +:102DB000704000221846F7F7A1BC7CBD30B5104A20 +:102DC0000B1A541CB3EB940F1ED3451AB5EB940F9A +:102DD0001AD3934203D9101A43185B1C14E095428E +:102DE00010D9511A0844401C43420DE098000020BD +:102DF0005809002000000000EC06002070B201001D +:102E0000FF7F841EFFDF0023184630BD0123002210 +:102E100001460220F7F772BC0220F7F71CBCF7F757 +:102E2000B8BC2DE9FE4FF24C05468A4694F82E00B8 +:102E30001F2800D1FFDFEE4E94F82E10A04620464A +:102E4000A6F51B7202EB01141F218DF8001090F8FB +:102E50002D10376900EB8101D8F8000091F825901A +:102E6000284402AA01A90C36F7F712FD9DF90800C3 +:102E7000002802DD0198401C0190A0680199642D92 +:102E8000084453D3DB4B00225B1B72EB02014DD392 +:102E90006168411A21F07F41B1F5800F46D220F0E0 +:102EA0007F40706086F80AA098F82D1044466B4663 +:102EB0004A463046FFF7ECFAB8B3A068401C10D081 +:102EC000F7F767FCA168081A0002C11700EB116050 +:102ED000001202282CDD0120F7F7BDFB4FF0FF3078 +:102EE000A06094F82D009DF800201F210F34FFF7FB +:102EF00078FBA17FBE4AC1EB41117C3A02EB410154 +:102F0000E27F01EB4201487054F80F0C284444F86A +:102F10000F0C012020759DF800001F2803D0B64833 +:102F20004078F8F741F8012008E401E0002005E4CA +:102F30007760FBE72DE9F047AD4C074694F82D008C +:102F4000A4F17C06C0EB401006EB400010F817001F +:102F500000B9FFDF94F82D50A046A84C24B1002101 +:102F600040F6E800AFF30080C5EB451040F6F409E9 +:102F700040F6FD0A06EB400616F81700012819D0A6 +:102F8000042811D005280FD006280DD01CB100212F +:102F90004846AFF3008007F0EBFE002CECD0002198 +:102FA0005046AFF30080E7E72A4639460120FEF796 +:102FB0006DFEF2E74FF0010A4FF00009454624B1DB +:102FC000002140F60410AFF30080504600F071F885 +:102FD00085F8239024B1002140F60910AFF300805A +:102FE00095F82D00FFF7D4FA064695F8230028B18E +:102FF000002CE4D0002140F60F101FE024B1002186 +:1030000040F61310AFF3008005EB860000F12701B6 +:1030100033463A462630FFF7D7F924B1002140F66F +:103020001710AFF3008000F039F8824695F82300BE +:1030300038B1002CC3D0002140F61D10AFF3008042 +:10304000BDE785F82D60012085F82300504600F08B +:1030500030F8002C04D0002140F62A10AFF3008095 +:10306000BDE8F08730B5044661480D4690F82D0064 +:103070005F49C0EB40107C3901EB400010F81400B0 +:1030800000B9FFDF5E4800EB0410C57330BD58493E +:1030900081F82D00012081F82300704710B55948B0 +:1030A00008B1AFF30080EFF3108000F0010072B6BA +:1030B00010BD10B5002804D1534808B1AFF300800B +:1030C00062B610BD51480068C005C00D10D0103860 +:1030D00040B2002804DB00F1E02090F8000405E095 +:1030E00000F00F0000F1E02090F8140D4009704747 +:1030F0000820704710B53E4C94F82400002804D1F5 +:10310000F7F746FC012084F8240010BD10B5384CB8 +:1031100094F82400002804D0F7F763FC002084F81A +:10312000240010BD10B51C685B68241A181A24F01E +:103130007F4420F07F40A14206D8B4F5800F03D22F +:10314000904201D8012010BD002010BDD0E900320E +:10315000D21A21F07F43114421F07F41C0E90031B0 +:1031600070472DE9FC418446214815460F46C2EBC5 +:1031700045117C38089C00EB410616F81400012824 +:1031800004D0022802D00020BDE8FC813B46204A42 +:1031900001216046FFF7C6FFF0B101AB6A46294640 +:1031A0003846FFF79AF9B8B19DF804209DF8001051 +:1031B0002846FFF716FA06EB440148709DF8000018 +:1031C0001F280DD006EB400044702A4621460320FC +:1031D000FEF75CFD0120D7E72A4621460420F7E7E9 +:1031E0000348012100EB850000F8254FC170ECE792 +:1031F00058090020FF1FA1079800002000000000D0 +:10320000EC060020000000000000000004ED00E0DB +:10321000FFFF3F002DE9F041044680074FF0000515 +:103220004FF001060CD56B480560066000F0DEF932 +:1032300020B16948016841F48061016024F0020412 +:10324000E0044FF0FF3705D564484660C0F80873C6 +:1032500024F48054600003D56148056024F0804464 +:10326000E0050FD55F48C0F80052C0F808735E490A +:103270000D60091D0D605C4A04210C32116006616D +:1032800024F48074A00409D558484660C0F8005260 +:10329000C0F808735648056024F40054C4F3803025 +:1032A000C4F3C031884200D0FFDF14F4404F14D083 +:1032B00050484660C0F808734F488660C0F8005216 +:1032C000C0F808734D490D600A1D16608660C0F88D +:1032D00008730D60166024F4404420050AD5484860 +:1032E00046608660C0F80873C0F8487345480560BA +:1032F00024F4006407F042F84348044200D0FFDFA2 +:10330000BDE8F081F0B50022202501234FEA020438 +:1033100020FA02F1C9072DD051B2002910DB00BFFD +:103320004FEA51174FEA870701F01F0607F1E02720 +:1033300003FA06F6C7F88061BFF34F8FBFF36F8FB4 +:103340000CDB00BF4FEA51174FEA870701F01F0659 +:1033500007F1E02703FA06F6C7F8806204DB01F103 +:10336000E02181F8004405E001F00F0101F1E021C6 +:1033700081F8144D02F10102AA42C9D3F0BD10B583 +:10338000224C20600846F7F71CFC2068FFF742FF3C +:103390002068FFF7B7FF06F031FC00F088F906F06F +:1033A000EDFF06F02CFFF7F7CBFDBDE8104006F06F +:1033B000D9BC10B5154C2068FFF72CFF2068FFF72B +:1033C000A1FF06F0DBFFF7F7FBFC0020206010BD3B +:1033D0000A207047FC1F00403C17004000C000401E +:1033E00004E50140008000400485004000D000401A +:1033F00004D5004000E0004000F0004000F500402F +:1034000000B0004008B50040FEFF0FFD9C0000200A +:1034100070B526490A680AB30022154601244B6894 +:103420005B1C4B600C2B00D34D600E7904FA06F345 +:103430000E681E420FD0EFF3108212F0010272B636 +:1034400000D001220C689C430C6002B962B6496846 +:103450000160002070BD521C0C2AE0D3052070BD15 +:103460004FF0E0214FF48000C1F800027047EFF305 +:10347000108111F0010F72B64FF0010202FA00F252 +:103480000A48036842EA0302026000D162B6E7E735 +:1034900006480021016041607047012181400348D6 +:1034A0000068084000D0012070470000A000002004 +:1034B00001208107086070470121880741600021D1 +:1034C000C0F80011184801707047174901200870B2 +:1034D00070474FF08040D0F80001012803D0124817 +:1034E0000078002800D00120704710480068C0070D +:1034F00000D0012070470D480C300068C00700D094 +:10350000012070470948143000687047074910319E +:103510000A68D20306D5096801F00301814201D18E +:103520000120704700207047A800002008040040D8 +:103530004FF08050D0F830010A2801D000207047A9 +:103540000120704700B5FFF7F3FF20B14FF0805026 +:10355000D0F8340108B1002000BD012000BD4FF0BB +:103560008050D0F83001062803D0401C01D0002044 +:103570007047012070474FF08050D0F830010D287F +:1035800001D000207047012070474FF08050D0F8E4 +:103590003001082801D000207047012070474FF00B +:1035A0008050D0F83001102801D000207047012051 +:1035B000704700B5FFF7F3FF30B9FFF7DCFF18B92C +:1035C000FFF7E3FF002800D0012000BD00B5FFF7A2 +:1035D000C6FF38B14FF08050D0F83401062803D32D +:1035E000401C01D0002000BD012000BD00B5FFF748 +:1035F000B6FF48B14FF08050D0F83401062803D30D +:10360000401C01D0012000BD002000BD0021017040 +:10361000084670470146002008707047EFF310819C +:1036200001F0010172B60278012A01D0012200E006 +:1036300000220123037001B962B60AB1002070476D +:103640004FF400507047E9E7EFF3108111F0010FDC +:1036500072B64FF00002027000D162B600207047CF +:10366000F2E700002DE9F04115460E46044600271A +:1036700000F0EBF8A84215D3002341200FE000BF73 +:1036800094F84220A25CF25494F84210491CB1FB19 +:10369000F0F200FB12115B1C84F84210DBB2AB426B +:1036A000EED3012700F0DDF83846BDE8F08172491D +:1036B00010B5802081F800047049002081F8420094 +:1036C00081F84100433181F8420081F841004331E3 +:1036D00081F8420081F841006948FFF797FF684888 +:1036E000401CFFF793FFF7F7B3FBBDE8104000F075 +:1036F000B8B840207047614800F0A7B80A460146B4 +:103700005E48AFE7402070475C48433000F09DB80A +:103710000A46014659484330A4E740210170002081 +:10372000704710B504465548863000F08EF820707A +:10373000002010BD0A460146504810B58630FFF7FC +:1037400091FF08B1002010BD42F2070010BD70B516 +:103750000C460646412900D9FFDF4A480068103868 +:1037600040B200F054F8C5B20D2000F050F8C0B2DD +:10377000854201D3012504E0002502E00DB1F7F7F1 +:10378000AAFB224631463D48FFF76CFF0028F5D0E2 +:1037900070BD2DE9F0413A4F0025064617F10407A8 +:1037A00057F82540204600F041F810B36D1CEDB2EB +:1037B000032DF5D33148433000F038F8002825D0E8 +:1037C0002E4800F033F8002820D02C48863000F036 +:1037D0002DF800281AD0F7F754FB2948FFF71EFFF1 +:1037E000B0F5005F00D0FFDFBDE8F0412448FFF7EF +:1037F0002BBF94F841004121265414F8410F401C7E +:10380000B0FBF1F201FB12002070D3E74DE7002876 +:1038100004DB00F1E02090F8000405E000F00F0068 +:1038200000F1E02090F8140D4009704710F8411F96 +:103830004122491CB1FBF2F302FB13114078814293 +:1038400001D1012070470020704710F8411F4078D7 +:10385000814201D3081A02E0C0F141000844C0B21D +:10386000704710B50648FFF7D9FE002803D1BDE820 +:103870001040F7F7F1BA10BD0DE000E08809002014 +:10388000AC00002004ED00E070B5154D2878401C18 +:10389000C4B26878844202D000F0DBFA2C7070BDAC +:1038A0002DE9F0410E4C4FF0E02600BF00F0C6FAC3 +:1038B00007F05EFA40BF20BF677820786070D6F8C6 +:1038C0000052EDF759FD854305D1D6F8040210B931 +:1038D0002078B842EAD000F0ACFA0020BDE8F081D0 +:1038E000BC0000202DE9F04101264FF0E022310319 +:1038F0004FF000084046C2F88011BFF34F8FBFF36E +:103900006F8F204CC4F800010C2000F02EF81E4DE3 +:103910002868C04340F30017286840F01000286072 +:10392000C4F8046326607F1C02E000BF07F020FAA1 +:10393000D4F800010028F9D01FB9286820F0100041 +:103940002860124805686660C4F80863C4F80081FE +:103950000C2000F00AF82846BDE8F08110B50446B6 +:10396000FFF7C0FF2060002010BD002809DB00F039 +:103970001F02012191404009800000F1E020C0F8C1 +:103980008012704700C0004010ED00E008C5004004 +:103990002DE9F047FF4C0646FF21A06800EB061218 +:1039A00011702178FF2910D04FF0080909EB01119F +:1039B00009EB06174158C05900F0F4F9002807DD5B +:1039C000A168207801EB061108702670BDE8F08729 +:1039D00094F8008045460DE0A06809EB05114158B8 +:1039E000C05900F0DFF9002806DCA068A84600EB0B +:1039F00008100578FF2DEFD1A06800EB061100EB51 +:103A000008100D700670E1E7F0B5E24B04460020A7 +:103A100001259A680C269B780CE000BF05EB001787 +:103A2000D75DA74204D106EB0017D7598F4204D0C7 +:103A3000401CC0B28342F1D8FF20F0BD70B5FFF743 +:103A4000EEF9D44C08252278A16805EB02128958BA +:103A500000F0A8F9012808DD2178A06805EB011124 +:103A60004058BDE87040FFF7D1B9FFF7A1F8BDE8B5 +:103A70007040F7F799BA2DE9F041C64C2578FFF769 +:103A8000CEF9FF2D6ED04FF00808A26808EB05169E +:103A9000915900F087F90228A06801DD80595DE0A6 +:103AA00000EB051109782170022101EB0511425C40 +:103AB0005AB1521E4254815901F5800121F07F41D3 +:103AC00081512846FFF764FF34E00423012203EB11 +:103AD000051302EB051250F803C0875CBCF1000F20 +:103AE00010D0BCF5007F10D9CCF3080250F806C006 +:103AF0000CEB423C2CF07F4C40F806C0C3589A1A9D +:103B0000520A09E0FF2181540AE0825902EB4C324B +:103B100022F07F428251002242542846FFF738FFAC +:103B20000C21A06801EB05114158E06850F82720EE +:103B3000384690472078FF2814D0FFF770F9227894 +:103B4000A16808EB02124546895800F02BF90128BC +:103B500093DD2178A06805EB01114058BDE8F041E4 +:103B6000FFF754B9BDE8F081F0B51D4614460E4686 +:103B70000746FF2B00D3FFDFA00700D0FFDF8548FB +:103B8000FF210022C0E90247C57006710170427032 +:103B900082701046012204E002EB0013401CE15445 +:103BA000C0B2A842F8D3F0BD70B57A4C064665782D +:103BB0002079854200D3FFDFE06840F82560607817 +:103BC000401C6070284670BD2DE9FF5F1D468B4686 +:103BD0000746FF24FFF723F9DFF8B891064699F866 +:103BE0000100B84200D8FFDF00214FF001084FF07C +:103BF0000C0A99F80220D9F808000EE008EB01132E +:103C0000C35CFF2B0ED0BB4205D10AEB011350F869 +:103C100003C0DC450CD0491CC9B28A42EED8FF2C47 +:103C200002D00DE00C46F6E799F803108A4203D162 +:103C3000FF2004B0BDE8F09F1446521C89F8022012 +:103C400008EB04110AEB0412475440F802B00421B7 +:103C5000029B0022012B01EB04110CD040F8012043 +:103C60004FF4007808234FF0020C454513D9E905BD +:103C7000C90D02D002E04550F2E7414606EB413261 +:103C800003EB041322F07F42C250691A0CEB0412BA +:103C9000490A81540BE005B9012506EB453103EBD8 +:103CA000041321F07F41C1500CEB0411425499F8E8 +:103CB00000502046FFF76CFE99F80000A84201D0A2 +:103CC000FFF7BCFE3846B4E770B50C460546FFF773 +:103CD000A6F8064621462846FFF796FE0446FF282A +:103CE0001AD02C4D082101EB0411A8684158304628 +:103CF00000F058F800F58050C11700EBD140401398 +:103D00000221AA6801EB0411515C09B100EB4120CA +:103D1000002800DC012070BD002070BD2DE9F047B7 +:103D200088468146FFF770FE0746FF281BD0194DD5 +:103D30002E78A8683146344605E0BC4206D02646B7 +:103D400000EB06121478FF2CF7D10CE0FF2C0AD000 +:103D5000A6420CD100EB011000782870FF2804D097 +:103D6000FFF76CFE03E0002030E6FFF755F8414610 +:103D70004846FFF7A9FF0123A968024603EB041395 +:103D8000FF20C854A878401EB84200D1A87001EBAB +:103D9000041001E0540A002001EB061100780870BD +:103DA000104613E6081A0002C11700EB116000125A +:103DB0007047000010B5202000F07FF8202000F0B0 +:103DC0008DF84D49202081F80004EDF7D3FA4B49D6 +:103DD00008604B48D0F8041341F00101C0F8041307 +:103DE000D0F8041341F08071C0F804134249012057 +:103DF0001C39C1F8000110BD10B5202000F05DF89D +:103E00003E480021C8380160001D01603D4A481E3F +:103E100010603B4AC2F80803384B1960C2F8000131 +:103E2000C2F8600138490860BDE81040202000F069 +:103E300055B834493548091F08607047314933483F +:103E4000086070472D48C8380160001D521E02608E +:103E500070472C4901200860BFF34F8F70472DE950 +:103E6000F0412849D0F8188028480860244CD4F83C +:103E700000010025244E6F1E28B14046EDF7D4F90D +:103E800040B9002111E0D4F8600198B14046EDF747 +:103E9000CBF948B1C4F80051C4F860513760BDE8AF +:103EA000F041202000F01AB831684046BDE8F041EA +:103EB00006F068BFFFDFBDE8F08100280DDB00F0F1 +:103EC0001F02012191404009800000F1E020C0F86C +:103ED0008011BFF34F8FBFF36F8F7047002809DB4E +:103EE00000F01F02012191404009800000F1E02014 +:103EF000C0F880127047000020E000E0C8060240D1 +:103F000000000240180502400004024001000001C8 +:103F1000454800210170417010218170704770B5D3 +:103F2000054616460C460220F3F7F2FB3E490120F7 +:103F3000F61E08703D4806603C4808380560001FC2 +:103F4000046070BD10B50220F3F7E2FB3649012092 +:103F5000087000F051F836494FF40000086010BDB9 +:103F600010B5314C207888B131494FF40000091D5B +:103F7000086000F04AF8002120B1012060702D484F +:103F8000006801E061701020A0702170BDE8104051 +:103F90000020F3F7BDBB244810B5017859B126487D +:103FA000D0F8000128B100F030F8002800D001203E +:103FB00010BD022010BD407810BD10B5C824641E8D +:103FC000E4B2FFF7E8FF022803D0012800D0002068 +:103FD00010BD002CF3D1FFDFF9E7134810B50178CD +:103FE00041B100F012F818B112480068C0B210BD1B +:103FF000102010BD807810BD0F480021C0F80011BE +:10400000C0F80411C0F8081170470B48D0F800112F +:1040100029B1D0F8041111B1D0F8080108B100207D +:104020007047012070470000BE00002010F50040DE +:1040300004F5014000F4004000F000404748002132 +:1040400001704170704770B5064614460D46012058 +:10405000F3F75EFB42480660001D0460001D05602A +:1040600070BD70B53D4901250D7040EA02413C4AE2 +:1040700041F08071121F11603A4C0026C4F80461AF +:10408000394A4FF04071116058B1012800D0FFDF6C +:10409000C4F80062256034494FF00070091F0860C1 +:1040A00070BDC4F80052256070BD2C48017871B114 +:1040B0002D4A4FF0407111602A49D1F804210021A6 +:1040C0001AB12A4A1268427000E041700170002063 +:1040D000F3F71EBB2148017841B12248D0F8040112 +:1040E000002802D021480068C0B27047407870476D +:1040F0002DE9F04700282AD01848007800B9FFDFE2 +:10410000184DD5F80401002821D10227C5F8047301 +:10411000174C2068C04340F30016206840F01000A0 +:1041200020604FF400484FF0E029761C04E000BF07 +:10413000C9F8808206F01CFED5F804010028F7D0EB +:104140001EB9206820F010002060C5F80873BDE893 +:10415000F08704490120886070470000C1000020FA +:1041600008F5004000F0004008F5014000F4004070 +:1041700010ED00E010B541F6A474012802D0022829 +:1041800002D0FFDF204610BD41F2883010BD38B5A7 +:10419000FE4D0024C5F80041C5F80C41C5F810419A +:1041A000C5F80441C5F81441C5F81841FFF70EFAE7 +:1041B00008B1C5F82841F6480068009038BD70B5D0 +:1041C000F44D00246C702C7000F0D2FD85F8254071 +:1041D000EC620922002105F11800AC63F9F7D3F86D +:1041E000ED49601E0860091D0860091D0C60091D6D +:1041F0000860091D0C60091D0860091D0860091D83 +:104200000860091D0860091D0860091D0860091D76 +:104210000860091D0860091D086070BDDF4800B511 +:10422000016801F00F01032905D0006800F00F00BC +:10423000042802D0FFDF012000BD022000BD00B530 +:10424000012802D0022800D0FFDF002000BD00B509 +:10425000012802D0022802D0FFDF282000BD18204C +:1042600000BD10B5CB4902681839CA4C0A634268D0 +:104270004A63007A81F83800207E50B1207FF9F738 +:10428000C0F8A07E08B1012100E00021207FF9F7ED +:10429000ADF8607E00280CD0607FF9F7B2F8E07EC0 +:1042A00008B1012100E00021607FBDE81040F9F76E +:1042B0009DB810BD00F063BD10B500F060FDB348BF +:1042C000D0F80001002800D0FFDF10BD70B501203C +:1042D00000F030FDB2480025056001260660FFF7BA +:1042E00085F9B04C18B1206840F480602060FFF779 +:1042F00036F928B12068AC4920F0770008432060E7 +:10430000FFF764F938B1A748001D016821F47F4127 +:1043100041F4B0510160A349A4483C310860FFF763 +:1043200055F99C4C60B19D490220503184F8210020 +:104330000860A0499E48086095481030091F086031 +:104340004FF01020806C411C05D094497C310A68E4 +:1043500060F317420A60914940F25B6028310860BF +:10436000091F40F203100860081F06608B490320F4 +:1043700008608C48EC38066094F8211011B14FF4B5 +:10438000C02100E08C498B4A41F46021943A1160CD +:104390008749884A091F083211607D490839121F70 +:1043A0001160016821F440710160016841F480717D +:1043B0000160012000F0CFFC74491020C1F8040313 +:1043C00084F83150E56270BD76483830016821F0DC +:1043D000010141F08071016070476E4A0368183A2C +:1043E000C2F81A308088D0836A48017270476948E1 +:1043F00090F825007047674A517010707047F0B50B +:104400000546840061488B882044C0F820360B782C +:10441000D1F8011043EA0121C0F8001605F10800A7 +:104420000127604C07FA00F6FC3C52B1012A00D08B +:10443000FFDF2068304320602068AF4038432060B1 +:10444000F0BD2068B043F6E706F0E8B8514890F8B0 +:1044500032007047514AC1781432116000684F49E8 +:1044600000020C3108607047252807D0262807D0A5 +:10447000272807D00A2807D8042206E0022107E0EF +:104480001A2105E0502103E0062202EB4001C9B2E7 +:10449000424A083A116041494431086070473D483A +:1044A000817A012917D0022914D1417E002911D027 +:1044B000827F0121C37F01FA02F299400A433D49FC +:1044C00094390A6090F820003C4A002102EB8000F9 +:1044D000C0F810157047017EE8E72DE9F0472D4C34 +:1044E000A17A01290BD0022975D1627E002A72D0EF +:1044F000012906D0677FE17E59B101260AE0227EBC +:10450000F4E7277FA17E09B1012600E000261121F2 +:1045100001E000262421DFF898804FF0010AA8F17D +:104520004408C8F84CA0DFF898904518D9F8000066 +:10453000A84200D3FFDF0021C8F84C11C9F8005091 +:10454000380286F0010140EA015040F0031294F86D +:1045500020101A4800EB8103C3F8102500EB8101FD +:10456000A27F184800EBC203C3F81415164DC3F818 +:104570001055E37F00EBC300C0F814150449083957 +:10458000C0F810150AFA02F120E024E00010004003 +:10459000181100407C0A0020000E00401015004059 +:1045A000FC1F00403C170040880000802C00008960 +:1045B000448000409CF5014000000404006000407D +:1045C0004C85004000F001404C8100400AFA03F0A5 +:1045D0000143F9480160BDE8F0872DE9F0410E463E +:1045E000F64907460320C1F80002F54C94F8210073 +:1045F00010B14FF4C02000E0F248EF4D2860304683 +:1046000006F036F817B1012F0FD017E0FEF7DEFFE6 +:1046100010B1304600F0C9FB0120A072A06B40F43D +:104620008010A0634FF4801007E00220A072A06BFE +:1046300040F40010A0634FF400102860F6F744F92E +:104640003146BDE8F04148E72DE9F05FDB4C074615 +:1046500003200E469346C4F80002D94D95F8210078 +:1046600010B14FF4C02100E0D649DFF84C93C9F8EF +:104670000010104605F0FCFFDFF83C834FF0010A04 +:1046800008F1A808A7B3012F3ED0FFDFCE4806608F +:10469000C949CE48A4310860A86B40F40020A86343 +:1046A000D4F800721025C4F808530020C4F80002A2 +:1046B000C1494FF48028091DC1F8008004F5007439 +:1046C000FFF765FD2760C9F80080C4F80451E903CD +:1046D000C9F80010BE49C1F84CA0BB48001D0068D5 +:1046E000B04200D3FFDF59463046BDE8F05FF4E644 +:1046F000FFE7FEF76BFF10B1584600F056FBC8F815 +:10470000004085F80AA0C1E7AC49091DC8F80010AF +:104710000220A872BAE72DE9F041A94C064690465E +:1047200094F831000F46002500B9FFDF16B1012EC5 +:1047300012D01DE094F83100012806D094F8302002 +:104740004146384605F0A2FF10E094F8301042468A +:10475000384605F0DCFF09E094F8310094F8301099 +:1047600001284246384609D005F0F8FFE16A4518AD +:10477000424629463046BDE8F04165E705F0A8FF0E +:10478000F4E708B5FF208DF800008C480021C0F840 +:1047900010110121016104E09DF80010491E8DF8FF +:1047A00000109DF8001019B1D0F810110029F3D0B5 +:1047B0009DF80000002800D1FFDF08BD2DE9F04181 +:1047C0007E4CD4F8000220F00307D4F804034FF025 +:1047D0001008C0F30016C4F808830025C4F800527E +:1047E000774890F8210010B14FF4C02000E07548E0 +:1047F000714940F46020091D0860FFF750FEFFF783 +:10480000C0FFC4F81051FEF7E1FE08B1C4F828510A +:1048100000F0AEFAC4F80072002E01D0C4F8048390 +:10482000BDE8F081ADE700686A4920F07F4008608C +:10483000704710B5012000F07DFABDE8104001205E +:1048400000F089BA01465E4818221838F8F771BDA1 +:104850004FF0E0210220C1F8000170475E49087066 +:1048600070475C4938390860704770B50546F6F7FF +:104870002BF8534C2844E16A884200D8FFDF01201E +:104880002074F6F721F82844606194F8211041B1B2 +:10489000084460614948D0F8001241F04001C0F876 +:1048A00000124B490020C1F8440147496069091FC3 +:1048B0000860BDE8704000F0A2BA70B5404C0646F2 +:1048C00002200D462074FFF7A9FC024694F831003F +:1048D00094F8301001281BD0304605F081FF60614C +:1048E00094F8210048B16169084460613348D0F808 +:1048F000001241F04001C0F8001235490020C1F813 +:1049000044016169E06A08442F49091F086070BDCD +:104910002B46304605F037FFE1E727494FF480008A +:10492000091D08602648816B21F480018163002104 +:10493000017470472A4A10B502EBC002274BC2F837 +:104940001035C2F81415012181401B4801601C4834 +:10495000826B0A43826310BD1D4801214160C16022 +:104960000021C0F844111848001F01601448C162BA +:10497000704710B50446FEF729FE10B1104880F8C4 +:1049800021401448243004600C48D0F8001241F053 +:104990004001C0F8001210BD084810B5D0F8001250 +:1049A00021F04001C0F80012FEF710FE0949243141 +:1049B00000B10220086010BD04F501400010004065 +:1049C0007C0A002000000404488500404881004023 +:1049D000008000403C150040C3000020041100404E +:1049E00000F00140F948D0F8001221F01001C0F8A1 +:1049F0000012012181617047F4480021C0F81C11A8 +:104A0000D0F8001241F01001C0F800127047EF49D1 +:104A100008B5D1F81C21012A01D0002008BDEC4ABC +:104A2000126802F07F02524202700020C1F81C019D +:104A3000E84800680090012008BDF0B517460C005A +:104A4000064600D1FFDFE44DE0072F7302D0012CB2 +:104A500000D0FFDF46B102206872EC72012802D05C +:104A6000022800D0FFDFF0BD0120F5E770B5DA4C79 +:104A70000021E27A930703D5830701D5430713D4B6 +:104A8000D30605D594F8333013B194F835305BB1C3 +:104A9000130702D594F8243033B9520702D594F89D +:104AA00025200AB1C00700D00121607A012518B184 +:104AB000A1B1BDE8704081E694F8210010B14FF437 +:104AC000C02000E0C548C6490860C048D0F80012C0 +:104AD00021F00301C0F80012E57270BD012803D077 +:104AE000022808D0FFDF70BD00F042F9A5729621C0 +:104AF000227B002006E000F03BF90220A072227B1E +:104B000096210120BDE8704005E62DE9F05FDFF851 +:104B1000D4B29BF80000042800D3FFDFB248D0F8DD +:104B20004C0108B1FFF7BBFCAB4CAD49A06B086072 +:104B30004FF00008C4F8388000F06BF9DFF8AC9251 +:104B40000546D9F80010A16294F8210008B1081AAE +:104B5000A062A648001F0068E062FFF75FFB84F8D0 +:104B60003000A07ADFF868A2012184F83100AAF1B0 +:104B7000440A022808D1607830B1DAF800201278AF +:104B800002402078904310D084F82480924EA807E9 +:104B9000A6F1180605D5F5F797FEA16A081A31693E +:104BA0008847E80704D0002709E084F82410EDE7DF +:104BB000A80701D5012702E0280707D50227F5F746 +:104BC00083FEE16A7269081A394690479BF8000033 +:104BD000C0071CD1DAF800005746007800F00F003B +:104BE000072812D239680622A01C0931F8F774FB95 +:104BF00038B9207A39680978B0EBD11F01D101208A +:104C000000E0002084F8250001E084F82580284693 +:104C1000FFF72CFFE80701D030682FE0A80726D562 +:104C200068071ED4FEF7D2FCD8B9FEF7DFFCC0B986 +:104C30006748F4380168001F0068C0F3425CC0F3A5 +:104C4000006700F00F03C0F30312C0F3032047B165 +:104C50000BB102B128B921B1BCF1030F01D245F06B +:104C6000040545F380007168401C884709E0280767 +:104C700001D5B06802E0E80602D5F068804700E0A0 +:104C8000FFDFA07A02281BD1207C002818D0564ACA +:104C9000C2F8448102280FD0012800D0FFDFE16A6A +:104CA0006069884200D8FFDFD4F81410C9F80010FA +:104CB000BDE8F05F00F0A3B86169E06A0144F5E780 +:104CC000BDE8F09F70B5054641F2643441F66A06CE +:104CD000022806D0012D12D0022D0CD0FFDF304665 +:104CE00070BDFEF72FFC0028F6D1FEF738FC002837 +:104CF000F2D141F6583441F29A00204470BD42F698 +:104D0000CE3070BD324808300168032904D00068F5 +:104D1000022801D000207047012070472C4808303D +:104D200001680B2904D000680A2801D000207047D0 +:104D30000120704700280DDB00F01F020121914087 +:104D40004009800000F1E020C0F88011BFF34F8FD0 +:104D5000BFF36F8F7047002809DB00F01F020121AD +:104D600091404009800000F1E020C0F880127047B7 +:104D700019480021417281720121C172704730B51A +:104D800000240546012902D002290BD0FFDF184874 +:104D900004430F4834380460164805430C48303843 +:104DA000056030BD4FF08074F1E7094A4032116868 +:104DB00053060228D3F820031ED0C0F3062000BFFC +:104DC00021F4FE4141EA00201060704700100040CD +:104DD000481500401C1100407C0A0020000004041B +:104DE00008F50140C30000200080004044850040D9 +:104DF0000801100000000302C0F30660E0E7354838 +:104E0000816B41F48001816333494FF48000086075 +:104E1000DBE7F8B52F4C314E0020217C19B1D6F8D4 +:104E20004411012907D00023A27A2D49012A04D078 +:104E3000022A0AD019E00123F6E7D1F80C01012873 +:104E400001D0002011E008200FE0D1F80C0101286A +:104E500006D0002223480068012803D0042002E085 +:104E60000222F7E7002010431843D1F81021012A4D +:104E70002ED0002505431C48026812F0FF0F03D016 +:104E8000D1F81421012A00D0002284F832200068D1 +:104E900010F0FF0F03D0D1F81801012800D0002036 +:104EA00084F833000F481030006884F83400FFF7AE +:104EB00072F8012800D0002084F83500FFF767F968 +:104EC0000020C6F844010948006800902846F8BD53 +:104ED0001025CFE77C0A002004F501400080004047 +:104EE0000010004000140040401600404481004083 +:104EF00010B5444822220021F8F745FA4148002421 +:104F0000017821F010010170012104F04DFC3D49B0 +:104F10004FF6FF70263981F8224088843A4908808C +:104F2000488010BDE4E7704700F05FB83549016084 +:104F30007047354908807047324926398A8CA2F576 +:104F40007F43FF3B02D00021016008E091F822205E +:104F50002C492639012A02D0016001207047002027 +:104F600070472848263810F8221F012908D001214F +:104F7000017025482349263900888884012070471C +:104F8000002070472049488070471E491E4B263933 +:104F90008A8C5B889A4205D191F8222012B1016077 +:104FA00001207047002070471648174A2638818C28 +:104FB0005288914209D14FF6FF71818410F8221F67 +:104FC00019B10021017001207047002070470D4881 +:104FD0000D4A2638818C5288914204D190F82200E3 +:104FE00008B10020704701207047064926398A8C95 +:104FF000824205D1002081F822004FF6FF7088849C +:1050000070470000DE0A0020C400002070473D4ABF +:10501000012338B1012804D1137008689060888892 +:105020009081704753700868C2F802008888D08069 +:105030007047344A10B1012807D00EE0507860B1B3 +:10504000D2F802000860D08804E0107828B1906897 +:1050500008609089888001207047002070472949A6 +:1050600010B1012802D005E0487800E0087808B1C6 +:10507000012070470020704730B50C4605468DB0C2 +:105080004FF0030104F1030012B1FEF741FB01E010 +:10509000FEF75DFB60790D2220F0C00040F040007B +:1050A0006071002104A8F8F76EF9E0788DF81F0010 +:1050B00020798DF81E0060798DF81D001022294698 +:1050C0006846F8F736F9684604F036FE9DF82F007A +:1050D00020709DF82E0060709DF82D00A0700DB01E +:1050E00030BD10B5002904464FF0060102D0FEF78E +:1050F0000FFB01E0FEF72BFB607920F0C000607130 +:1051000010BD0000C8000020FE48406870472DE92F +:10511000F0410E46074601461446012004F011FDF9 +:10512000054697F86500FFF725F84AF2B1210844D3 +:105130004FF47A71B0FBF1F1788840F2712250435C +:10514000C1EB4000041BA4F2663402F0BBFD00B1C9 +:105150001E3CAE4201D2284600E03046A04204D2B6 +:10516000AE4201D22C4600E034467C62BDE8F081BC +:1051700030B502460020002914D0A2FB01104C0AD1 +:1051800044EAC054400A641C40F100000021D4F1FC +:10519000FF3240F2A175814100D2FFDF04F5F464D3 +:1051A000B4FBF5F030BD2DE9FF4F8BB0044690F80D +:1051B00065008A460990DDE90D1008430890D24841 +:1051C0000026007800F004FE054694F88C0100F0FB +:1051D000FFFD284480B2009094F87D000D2804D093 +:1051E000002007900D9810B131E00120F9E794F804 +:1051F0002C0103282BD1079848B3B4F8AE115145C0 +:1052000025D1D4F83401C4F82001608840F2E2418D +:105210004843C4F82401B4F87A01B4F806110844EC +:10522000C4F82801204602F057FDB4F8B201E0822C +:1052300094F8B0016075B4F8B4016080B4F8B601B8 +:10524000A080B4F8B801E080022084F82C01D4F8E2 +:1052500084010590D4F880010390B4F80681B4F875 +:105260007811D4F8740106900D9820B194F840019B +:1052700000287DD108E004F580700290743004901D +:1052800004F5B075001D07E004F5AA700290001D3A +:10529000049004F5A275001D0A90B4F87020AAEBE2 +:1052A00002000FFA80F9AAEB010007B2002F05DA1D +:1052B000D4F87001069001204F46089092484FF0B4 +:1052C000000B007970B3F5F7A1FC58B3B4F81801DE +:1052D000022827D394F82C01022823D094F8430104 +:1052E00000BB94F88C0100F073FD00F5C86080B23B +:1052F000009094F82C01012845D0608840F2E241EA +:1053000048430099FFF734FF08EB0901CA1BD4F8A2 +:10531000341180B2431A02FB03BBC4F834010120EC +:1053200084F8430194F82C0100286DD001287DD029 +:1053300002287CD003287BD0FFDF00BFA6EB0B0147 +:105340000698FCF70EFD0499012640F271220860D0 +:105350000A990020A1F800A028702E710498006816 +:10536000A8606088D4F834115043C1EB400000E0DD +:10537000BFE16549A0F23630C861896981427DD9B3 +:10538000029908607BE194F88000032833D0012162 +:10539000002004F0CDF8E18A40F27122514300EB85 +:1053A00041000190D4F82401B8340099FFF7E0FEE1 +:1053B000A16E226F431AA066DDE9001002FB03BB59 +:1053C000FFF7D6FEA16FA067421A34F8B60C40F280 +:1053D000E241484393440099FFF7CAFE08EB0901F4 +:1053E000226FC91B8A1AE16F521E431A02FB03BBCC +:1053F000E067B83C93E7E08A40F27122D4F82411C8 +:10540000504301EB4000CCE7039800B9FFDF0121D6 +:10541000002004F08DF80646E08A40F271214843EE +:1054200006EB40000099FFF7A3FE02E0C0E058E061 +:10543000DDE0C4F83001608840F2E2414843009961 +:10544000FFF796FEC4F8340182B22046A16AFFF746 +:105450005EFE14F8650FFEF7F2FE4FF47A7800F264 +:10546000E140B0FBF8F1039801EB00092078FEF76A +:10547000E6FE07462078FEF77DFE00E0FDE03844BA +:105480004AF2AB310144B1FBF8F134F84F0C40F271 +:105490007122504306EB4000411AD4F8CB0040F291 +:1054A000E2430A1A02EB0906227814F8501C11FB99 +:1054B00003F1203E00F0B9FC1349801C886114F808 +:1054C0006509FEF7BCFE00F2E140B0FBF8F103987D +:1054D0000844301A40F2F6218842BFF42FAFFFDFB4 +:1054E0002CE7E08A40F27122D4F82411504301EBFA +:1054F00040000099FFF73CFEC4F83001608840F29C +:10550000E24103E0000B0020D8000020484300994E +:10551000FFF72EFEC4F8340182B22046A16AFFF7DD +:10552000F6FDB8F1000F21D10E98F8B194F865603E +:105530003046FEF71FFE4AF2B12101444FF47A7063 +:10554000B1FBF0F0D4F8301140F271230144E08A4D +:10555000D4F82421584302EB4000471A3046FEF7A6 +:1055600076FE0599081A3E18203E0AE0E08A40F2CD +:105570007122D4F82411504301EB4000D4F83011CB +:10558000461AD4F82821D4F82011D4F8300140F27A +:10559000E24301FB020094F86520617D11FB03F1F9 +:1055A00000F043FCF9498861012084F82C01C5E62C +:1055B000608840F271225043D4F83411D4F8282185 +:1055C000C1EB40067E4308EB0900801AD4F8207135 +:1055D000D4F83031401E07FB023200FB012094F862 +:1055E0006520617D40F2E24311FB03F140E06088F9 +:1055F00040F27122D4F834115043C1EB400694F8C4 +:105600007C007E43242803D094F87D0024280AD10E +:10561000B4F8AE11AAEB010000B2002803DB94F845 +:10562000B10100B109900898D8B1B8F1000F18D1B4 +:10563000059808B1039800B9FFDF94F86500FEF7FC +:1056400099FD4AF2B12101444FF47A70B1FBF0F0B8 +:10565000361A94F86500FEF7FAFD0599081A064413 +:10566000203ED4F8341108EB090048430021099A80 +:1056700000F0DBFBC549886160E602980160029892 +:10568000616A0068084400F5D370E86002F01AFB14 +:1056900010B1E8681E30E8606E71B4F8F010A1EB4C +:1056A0000A0000B2002801DD032068710798002875 +:1056B0000E9822D0C0B100BFB4F81811B1B3B4F83D +:1056C0001A0100BFA4F81A0194F81C21401C42439F +:1056D0008A4209D26879401E002805DD6E71B4F84F +:1056E0001A01401CA4F81A010D9830B394F8400137 +:1056F000F8B102200FB0BDE8F08F0028DCD194F89B +:105700002C010028F0D0608840F27122D4F83411C6 +:105710005043C1EB4001284603F04EFE0004000C4C +:10572000E2D0189901B108800120E3E7FFE70020EB +:10573000C8E794F87C01FDF78CF994F87C012946C0 +:1057400000F059FB20B10D9880F0010084F8410170 +:105750000020CFE77CB50446FCF72FFE0146D4F8C5 +:105760007001FDF72BFB214600F076FB94F87D10CD +:105770000D290AD0B4F87020B4F83E1113189942DC +:1057800006DB491CA4F83E1106E0B4F83E010CE02B +:10579000401C1044A4F83E0194F8420140B9B4F80A +:1057A0003E01B4F8F410884202D1401CA4F83E0136 +:1057B000B4F87A0101AE401CA4F87A01B4F89A005A +:1057C000B4F89810401AB4F87010401E084485B21E +:1057D00009E000231A4620460096FFF7E4FCD0B10A +:1057E00001282ED0FFDFB4F83E11681A00B200285D +:1057F000EFDA082084F88D00012084F88C00204620 +:1058000001F0F5FE204600F0F8FA60484079BDE866 +:105810007C40F5F7C9BBA06E002811D0B4F83E015A +:10582000B4F89420801A01B2002909DD34F86C0F15 +:105830000144491E91FBF0F189B201FB0020208553 +:105840007CBDB4F83E01BDF804100844A4F83E0144 +:10585000C9E770B54E4C607A08B1002070BD94F86D +:10586000300030B1616B606A884202D9F8F70CFBF6 +:10587000F3E7A06AC8B1F7F725FF0546F7F7F9FE89 +:10588000284442F210714618FCF797FD0546294658 +:10589000E06AFDF793FAE562A16A8219914202D2A9 +:1058A0000120A062E2E7081AA062012070BD70B575 +:1058B000374C012500202575207494F8300004F140 +:1058C000100650B14FF47A71A069FCF74AFAA06152 +:1058D0000021304603F070FD10E0002000F00DFBC9 +:1058E0000546F7F7EFFE05442946A069FCF739FAAB +:1058F000A0612946304603F05FFD451C208C411C09 +:105900000A2901D228442084606828B1208C401CD8 +:105910000A2801D3022000E003206075FFF799FFF9 +:1059200038B1207B314600F066FA002800D1FFDF55 +:1059300070BD00F0DAFA15484079BDE87040F5F71F +:1059400033BB38B50025044680F82C51A0F87851B7 +:105950002B462A4629460095FFF725FC00B1FFDFBC +:10596000C4F828510120C4F8205184F82C01A4F86F +:105970003E51A4F83C5184F8425134F8700F401E57 +:1059800024F8B80B0020A4F8525038BDD8000020ED +:10599000000B002010B530B1F749012807D00228CC +:1059A0000BD0FFDF10BDBDE8104000F0EABA486A36 +:1059B000BDE81040002100F0B5BA002081F83000A9 +:1059C000FCF7F9FBED484079BDE81040F5F7ECBA7B +:1059D0002DE9F0410646E8480F460178E74D0329D6 +:1059E00009D1017BB14206D1406868613846BDE803 +:1059F000F04100F0EEBA304600F0F3F90621FAF774 +:105A00005DFB040000D1FFDF304600F0EAF9218899 +:105A1000884200D0FFDF214638466C61BDE8F04186 +:105A200000F027BA10B5D44C207848B1012060723C +:105A3000F8F74CFA2078032804D0207A002800D008 +:105A40000C2010BD207BFDF704F8207BFDF772FAD7 +:105A5000207BFCF78FFC00B9FFDF0020207010BD19 +:105A600010B5FFF7DFFF00F0F1FAC348002180F81E +:105A70003010C172084610BDC049487100208870BE +:105A800001220A7048700A71C870BB490870E7E7C4 +:105A9000BA49087070472DE9F047B74C07460E46E3 +:105AA000207800284BD1B648FCF702FC20731F2851 +:105AB00045D04FF00309676084F8009000256572B7 +:105AC000257287B1012107F58E70FDF740FE062093 +:105AD000FAF7A0FA97F81C11B1FBF0F200FB1210D4 +:105AE000401C87F81C01FCF73EFC40F2F65188424E +:105AF00000D2084600F23F101FFA80F8F7F7B9FD10 +:105B0000E061F7F7DFFD0127E0B1A772FCF755FC74 +:105B10008246002000F0F1F900EB08015046FCF746 +:105B200020F9A061C4E90A6A277584F815909249A2 +:105B30002574207B103100F05EF990B910E00C2044 +:105B4000BDE8F087FCF739FC4146FCF70AF9A06193 +:105B5000A57284F83070A6F28B566663A562E3E7FF +:105B6000FFDF25840020F8F7B1F90020E8E783493A +:105B7000487070478149087170472DE9F0417F4CAA +:105B80000746E088401CE080D4E902516078D7F8ED +:105B9000806120B13246284603F036FC0546A068F5 +:105BA000854205D02169281A08442061FDF7D3F801 +:105BB000A560AE4205D897F82C01012801D0E07805 +:105BC00010B10020BDE8F0810120FBE710B50446CC +:105BD0000846FEF7CFFA4AF2B12108444FF47A7131 +:105BE000B0FBF1F040F2E2414C4300F23630844227 +:105BF00001D9201A10BD002010BD7CB5044600203C +:105C000084F8400194F8FE0000283FD194F82C015C +:105C100003283BD1FCF7D1FB0146D4F87001FDF716 +:105C2000CDF8002832DD214600F016F9411CB4F809 +:105C300070000144A4F83C11B4F83C11B4F8F4200D +:105C4000511A09B2002921DD012184F84211B4F86A +:105C50009A10B4F8982001AE891A491E084485B2FA +:105C60000EE00096B4F83C11002301222046FFF715 +:105C70009AFA00280AD0012809D0022806D0FFDFAE +:105C8000B4F83C01281A00B20028EADA7CBDB4F866 +:105C90003C01BDF804100844A4F83C01F0E738B515 +:105CA00000250446012902D13448C07868B1042097 +:105CB00084F82C01FCF77FFAA4F87A51B4F870004C +:105CC000A4F83E0184F842515FE60095B4F8F41060 +:105CD000012300222046FFF766FA0028EAD0FFDF02 +:105CE000E8E710B5062916D2DFE801F00509030C34 +:105CF0000C0D002100E00121BDE81040CFE7032199 +:105D000080F82C1110BDB0F834118AB2816ABDE858 +:105D10001040FFF7FCB9FFDF10BD70B5174CA1783C +:105D2000022916D1E188002913D16569C5F88401DB +:105D300095F86500FEF78BFAD5F88411081AA1686A +:105D40000144A160E1680844E060BDE8704000F0F3 +:105D5000A9B970BD70B5054608488478022C11D0E9 +:105D6000054C243401B34FF47A7601290ED0022970 +:105D700010D0FFDF70BD0000000B0020D800002015 +:105D8000D1590100446904F5C074EBE71846FEF7E9 +:105D900056FA02E01046FEF795FF00F2E140B0FB34 +:105DA000F6F0281A2060E5E72560E3E7FE4810B525 +:105DB000007808B1002010BD0620FAF71DF980F028 +:105DC000010010BDF8480078002800D0012070477D +:105DD00010B504460C2800D3FFDFF44830F8140057 +:105DE00010BD10B504461F2800D3FFDFEE48383041 +:105DF00030F8140010BDFCF711BD70B5044600204A +:105E000084F82C0194F87C514FF6FF761F2D00D3B7 +:105E1000FFDFE548383020F8156094F87C01FCF786 +:105E2000A9FA1F2084F87C01A4E770B505460C464A +:105E300016461046FEF79EF94AF2B12108444FF487 +:105E40007A71B0FBF1F000EB450004443046FEF7F8 +:105E5000FEF9204460308DE7002809D0D1F83421C4 +:105E6000498840F271235943C2EB4101B0FBF1F084 +:105E700070472DE9F04101250226CD4F0C46082838 +:105E800031D2DFE800F0040E161611301A23204636 +:105E900000F0ADF9204600F064F984F84051BE707E +:105EA00090E601F00AFF01E0FEF72FFE84F8405172 +:105EB00088E62046BDE8F0414CE4FEF7B3FCFEF76F +:105EC00024FE4FF0E020C0F880627BE694F82C01BD +:105ED000042800D0FFDF2046FFF78FFF7879BDE868 +:105EE000F041F5F761B8FFDF6CE610B5AE4C207BF2 +:105EF000FCF740FA0020207010BD08B500284FF0D4 +:105F00000101684602D0FDF703FC01E0FDF7F6FB56 +:105F10009DF8000042F210710002B0FBF1F201FBAB +:105F2000120008BD2DE9F0419F4C0746002084F87F +:105F30003000A669E07220700120207201216068A3 +:105F400003F0B2F86068C0F87061257B80F87C517E +:105F5000C0F88071C0F8746106881F2D00D3FFDF80 +:105F60009148383020F815606068FFF7EAFC00B10E +:105F7000FFDFFCF720F98E484079BDE8F041F5F7E6 +:105F800013B870B5884C0025A07A18B10120FFF72E +:105F9000B4FF0546F7F796FB4119A069FBF7E1FE50 +:105FA000A061002525740320607501202075607AAA +:105FB00030B97D49207B1031FFF71DFF00B9FFDFAD +:105FC0002584FCF7F8F87A484079BDE87040F4F78A +:105FD000EBBF70B5744D04462878032800D0FFDF6E +:105FE000082C31D2DFE804F0040E2A2A2630302DA6 +:105FF00000206862F7F77CFD00B1FFDF6C490320E9 +:106000008870B7E6F7F735FBE9690446A14206D286 +:10601000601A0421FCF705FFEC6108B906E0E861AD +:10602000F7F7B1FE0028ECD0FFDFA3E6BDE8704033 +:106030000020AFE4BDE87040FEF767BDBDE87040EA +:1060400035E4BDE8704050E7FFDF93E6FEB5584CFD +:106050000120E0704FF6FF750CE00621FAF72EF8EC +:10606000060000D1FFDF96F87C01FCF763FF3046A5 +:10607000FFF7C3FE69460620F9F7ADFF50B1FFDF19 +:1060800008E0029830B190F82C1119B10088A842AC +:10609000E3D104E06846F9F77CFF0028F1D0002046 +:1060A000E070FEBD2DE9F0474148446994F8431182 +:1060B000002955D094F82C11032951D194F86590FA +:1060C0000078FFF785FE054694F88C01FFF780FE07 +:1060D000284486B294F88C01FFF77AFE00F5C86078 +:1060E0001FFA80F84846FEF7B2F8D4F884110D1A6A +:1060F0004846FEF73FF84FF47A7A00F2E730B0FBFB +:10610000FAF02D1A4846FEF7A2F8D4F800110F1A3B +:106110004846FEF72FF84AF2B1210144B1FBFAF0EC +:106120003A1AA2F160007043B0FBF8F1292000EBAD +:1061300052006031A0EB510200EB5100AA4201D89D +:10614000854201D3F4F714FE608840F2E2414843EF +:106150003146FFF70DF8C4F83401002084F84301FC +:10616000EEE470B50446FCF7FEF8054694F86500C9 +:10617000FEF700F84AF2B12108444FF47A71B0FBFF +:10618000F1F0D4F8341140F2712201446088504398 +:10619000C1EB4006303EB72D00D8B725214601207F +:1061A00003F0CFFC284405E0000B002088B201007A +:1061B000D8000020351A21460120A5F21B3503F036 +:1061C000C0FC616A9C30814201D9081A00E00020BD +:1061D0002C49A842CD6000D328468860D4F86C01D1 +:1061E000A0F5D3700861BDE87040FCF7B4BD10B5F0 +:1061F000044624490020C4F88001C880C4F8840102 +:1062000094F8410138B9FCF7D8F8D4F84C11FCF7F0 +:10621000D5FD002813DCB4F83E11B4F870008142BB +:1062200001D1B4F8F410081AA4F8F600A4F870101C +:10623000D4F86801C4F84C01C4F870011CE0B4F84B +:106240003C01B4F87010401AA4F8F600B4F83C0110 +:10625000A4F87000D4F84C01C4F86801C4F87001C7 +:10626000D4F85401C4F80001D4F85801C4F87401FA +:10627000B4F85C01A4F878012046BDE8104001F0B4 +:1062800006BC0000D80000202DE9F0410E4604466F +:1062900003F06FFB0546204603F06DFB044603F058 +:1062A000FDF8FB4F010015D0386990F864208A4250 +:1062B00010D090F8C4311BB190F8C63123421FD0E2 +:1062C0002EB990F85D30234201D18A4218D890F857 +:1062D000C401A8B1284603F0E1F870B1396991F81A +:1062E0006520824209D091F8C40118B191F8C70124 +:1062F000284205D091F8C40110B10120BDE8F08119 +:106300000020FBE730B5E24C85B0E06900285ED0A4 +:10631000142200216846F7F736F8206990F86500E6 +:10632000FDF728FF4FF47A7100F5FA70B0FBF1F534 +:10633000206990F86500FDF78AFF2844ADF8060053 +:1063400020690188ADF80010B0F87010ADF80410A5 +:106350004188ADF8021090F8A60130B1A069C11CC7 +:10636000039103F01FFA8DF81000206990F8A50141 +:106370008DF80800E169684688472069002180F8A7 +:10638000A61180F8A5110399002920D090F8A41136 +:1063900000291CD190F87C10272918D09DF81010E6 +:1063A000039A002913D013780124FF2B11D0072B57 +:1063B0000DD102290BD15178FF2908D180F8A441D1 +:1063C0000399C0F8A8119DF8101080F8A71105B026 +:1063D00030BD1B29F2D9FAE770B5AD4C206990F8B1 +:1063E0007D001B2800D0FFDF2069002580F8A75022 +:1063F00090F8D80100B1FFDF206990F8A81041B1F2 +:1064000080F8A8500188A0F8DC1180F8DA510C213E +:1064100008E00188A0F8DC1180F8DA51012180F849 +:10642000DE110B2180F8D8110088F9F77AFFF9F70F +:1064300023FC2079F4F7B8FD206980F87D5070BD09 +:1064400070B5934CA07980072CD5A078002829D16D +:1064500062692046D37801690D2B01F170005FD08D +:106460000DDCA3F102034FF001050B2B19D2DFE87D +:1064700003F01A1844506127182C183A6400152BA1 +:106480006FD008DC112B4BD0122B5AD0132B62D0BB +:10649000142B06D166E0162B71D0172B70D0FF2B72 +:1064A0006FD0FFDF70BD91F87F200123194602F005 +:1064B00038FF0028F6D12169082081F87F0070BDDF +:1064C0001079BDE8704001F0A2BC91F87E00C007D1 +:1064D00000D1FFDF01F05AFC206910F87E1F21F087 +:1064E0000101017070BD91F87D00102800D0FFDF20 +:1064F0002069112180F8A75008E091F87D00142848 +:1065000000D0FFDF2069152180F8A75080F87D10AA +:1065100070BD91F87D00152800D0FFDF172005E041 +:1065200091F87D00152800D0FFDF1920216981F83E +:106530007D0070BDBDE870404EE7BDE8704001F0E1 +:106540003ABC91F87C200123002102F0EAFE00B958 +:10655000FFDF0E200FE011F87E0F20F0040008701E +:106560001DE00FE091F87C200123002102F0D9FE0C +:1065700000B9FFDF1C20216981F87C0070BD12E0AA +:106580001BE022E091F87E00C0F30110012800D04A +:10659000FFDF206910F87E1F21F010010170BDE8B7 +:1065A000704001F0F3BB91F87C200123002102F040 +:1065B000B8FE00B9FFDF1F20DDE791F87D0021283C +:1065C00001D000B1FFDF2220B0E7BDE8704001F04C +:1065D000E9BB2F48016991F87E20130702D50121FC +:1065E0008170704742F0080281F87E208069C0788F +:1065F00081F8E10001F0C1BB10B5254C21690A8882 +:10660000A1F81A2281F8180291F8640001F0A9FBA0 +:10661000216981F81C0291F8650001F0A2FB216953 +:1066200081F81D02012081F81602002081F8C401C2 +:106630002079BDE81040F4F7B7BC10B5144C052123 +:106640002069FFF74EFB206990F85A10012908D005 +:1066500000F5F77103F048FA2079BDE81040F4F72F +:10666000A3BC022180F85A1010BD10B5084C0123BC +:106670000921206990F87C20703002F052FE48B168 +:106680002169002001F8960F087301F81A0C10BD5B +:10669000F80000200120A070F9E770B5FE4D01233D +:1066A00029462869896990F87C2009790E2A01D148 +:1066B000122903D000241C2A03D004E0BDE8704056 +:1066C000D3E7142902D0202A07D008E080F87C40C4 +:1066D00080F8A240BDE87040AFE7162906D0262A10 +:1066E00001D1162902D0172909D00CE000F87C4FFF +:1066F00080F82640407821280CD01A2017E090F826 +:106700007D20222A07D0EA69002A03D0FF2901D17F +:1067100080F8A63132E780F87D4001F037FB286928 +:1067200080F8974090F8C4010028F3D00020BDE81D +:10673000704061E72DE9F843D74C206990F87C1050 +:10674000202909D05FF0000790F87D10222905D09C +:106750007FB300F17C0503E00127F5E700F17D053B +:1067600010F8B01F41F004010170A06903F007F9AF +:106770004FF00108002608B33946A069FFF784FDF1 +:10678000E0B16A46A169206902F096FE90B3A06963 +:1067900003F0F3F82169A1F8AE01B1F8701001F02F +:1067A000C6FA40B32069282180F88D1080F88C80CB +:1067B00048E0FFE70220A070BDE8F883206990F868 +:1067C000C40110B11E20FFF717FFAFB1A069216906 +:1067D000C07881F8E20008FA00F1C1F3006000B966 +:1067E000FFDF20690A2180F87C1090F8A20040B9F0 +:1067F000FFDF06E009E01AE02E7001F0C7FAFFF7AC +:10680000E8FE206980F89760D6E7206990F8C40117 +:1068100018B10020FFF7F0FE2E70206900F17D0115 +:1068200080F897608D420DD180F87D600AE0206984 +:106830009DF8001080F8B0119DF8011080F8B1119A +:1068400024202870206900F17D018D4203D1BDE82C +:10685000F84301F09BBA80F8A260ADE770B58E4CAA +:1068600001230B21206990F87D20703002F059FD42 +:10687000202650BB20690123002190F87D20703034 +:1068800002F04FFD0125F0B1206990F87C0024282A +:106890001BD0A06903F063F8C8B1206990F8B0106C +:1068A00041F0040180F8B010A1694A7902F00702B2 +:1068B00080F85D20097901F0070180F85C1090F8FC +:1068C000C5311BBB06E0A57058E6A67056E6BDE8CC +:1068D00070407EE690F8C431C3B900F164035E787D +:1068E0008E4205D11978914202D180F897500DE07F +:1068F00000F504710D7002884A8090F85C200A71DE +:1069000090F85D0048712079F4F74EFB2169212051 +:1069100081F87D00BDE8704001F02FBAF8B55E4CFB +:10692000206990F87E0010F0300F04D0A07840F07D +:106930000100A070F8BDA06902F0FAFF50B3A06991 +:1069400002F0F0FF0746A06902F0F0FF0646A069DA +:1069500002F0E6FF0546A06902F0E6FF0146009757 +:10696000206933462A46303003F046F8A079800784 +:1069700003D56069C07814280FD0216991F87C0094 +:106980001C280AD091F85A0001280ED091F8BB01BA +:1069900058B907E0BDE8F8401BE62169012081F8FD +:1069A0005A0002E091F8BA0130B1206910F87E1F58 +:1069B00041F0100101700EE091F87E0001F5FE72C9 +:1069C00040F0200081F87E0031F8300B03F080F8B1 +:1069D0002079F4F7E9FABDE8F84001F0CEB970B5D6 +:1069E0002D4C206990F87E10890707D590F87C20FF +:1069F00001230821703002F094FCE8B1206990F87E +:106A0000AA00800712D4A06902F073FF216981F8FF +:106A1000AB00A06930F8052FA1F8AC204088A1F8A0 +:106A2000AE0011F8AA0F40F002000870206990F83B +:106A3000AA10C90703D00FE00120A0709EE590F8CE +:106A40007E00800700D5FFDF206910F87E1F41F02F +:106A50000201017001F091F92069002590F87C1085 +:106A6000062906D180F87C5080F8A2502079F4F7EE +:106A70009BFA206990F8AC110429DFD180F8AC5161 +:106A80002079F4F791FA206990F87C100029D5D18B +:106A900080F8A25072E50000F800002070B5FE4CAE +:106AA00001230021206990F87D20703002F039FC2C +:106AB000012578B9206990F87D20122A0AD0012397 +:106AC0000521703002F02DFC10B10820A07055E5B2 +:106AD000A57053E5206990F8A80008B901F04DF9B8 +:106AE0002169A06901F5847102F0F1FE2169A069B4 +:106AF000D83102F0F2FE206990F8E00100B1FFDF2A +:106B000021690888A1F8E20101F5F271A06902F09B +:106B1000D6FE2169A06901F5F67102F0D5FE206963 +:106B200080F8E051142180F87D102079BDE8704094 +:106B3000F4F73ABA70B5D84C01230021206990F8D7 +:106B40007D20703002F0EDFB0125A8B1A06902F0B4 +:106B50008CFE98B1A0692169B0F80D00A1F8AE01D2 +:106B6000B1F8701001F0E3F858B12069282180F8DD +:106B70008D1080F88C5001E5A570FFE4BDE87040F1 +:106B800027E5A0692169027981F8B021B0F80520D4 +:106B9000A1F8B22102F060FE2169A1F8B401A06958 +:106BA00002F05DFE2169A1F8B601A06902F05AFE6B +:106BB0002169A1F8B8010D2081F87D00DEE47CB5E3 +:106BC000B54CA079C00738D0A06901230521C5784C +:106BD000206990F87D20703002F0A3FB68B1AD1EF3 +:106BE0000A2D06D2DFE805F00909050509090505A2 +:106BF0000909A07840F00800A070A07800281CD1F6 +:106C0000A06902F0FFFD00287AD0A0690226C578AD +:106C10001DB1012D01D0162D18D1206990F87C00EE +:106C200002F067FB90B1206990F87C101F290DD00D +:106C3000202903D0162D16D0A6707CBD262180F801 +:106C40007C10162D02D02A20FFF7D6FC0C2D58D030 +:106C50000CDC0C2D54D2DFE805F033301D44A7A71F +:106C6000479E57A736392020A0707CBD0120152DE6 +:106C700075D008DC112D73D0122D69D0132D64D07E +:106C8000142D3DD178E0162D7CD0182D7DD0FF2D10 +:106C900036D183E020690123194690F87F207030B7 +:106CA00002F03FFBF8B9A06902F007FE216981F804 +:106CB0009201072081F87F0078E001F044F975E047 +:106CC000FFF738FF72E001F01EF96FE0206990F8DD +:106CD0007D10112901D0A67068E0122180F87D1086 +:106CE00064E0FFF7DBFE61E0206990F87D00172883 +:106CF000F1D101F04BF821691B2081F87D0055E0AE +:106D000052E0FFF76CFE51E0206990F87E00C0076A +:106D100003D0A07840F001001FE06946A06902F0AE +:106D2000EAFD9DF8000000F02501206900F8B01F81 +:106D30009DF8011001F04101417001F01EF8206939 +:106D400010F87E1F41F0010114E0FFF78EFC2DE0EA +:106D5000216991F87E10490705D5A07026E00EE064 +:106D600016E00FE011E001F008F8206910F87E1F2E +:106D700041F00401017019E0FFF7D0FD16E001F0C9 +:106D80008AF813E0FFF76AFD10E0FFF7D3FC0DE08F +:106D900001F060F80AE0FFF780FC07E0E16919B153 +:106DA000216981F8A60101E0FFF713FC2069F0E9F1 +:106DB0003012491C42F10002C0E900127CBD70B5DE +:106DC000354CA07900074AD5A078002847D1206922 +:106DD00090F8E400FE2800D1FFDF2069FE210025A5 +:106DE00080F8E41090F87D10192906D180F8A7509A +:106DF00000F0CCFF206980F87D50206990F87C106D +:106E00001F2902D0272921D119E090F87D0002F036 +:106E100070FA78B120692621012380F87C1090F85F +:106E20007D200B21703002F07CFA78B92A20FFF720 +:106E3000E3FB0BE02169202081F87C0006E00121C2 +:106E400080F8A51180F87C5080F8A250206990F855 +:106E50007F10082903D10221217080F8E41059E441 +:106E600010B50D4C216991F8B0210AB991F8642050 +:106E700081F8642091F8B1210AB991F8652081F870 +:106E8000652010B10020FFF7B7FB206902F0D4FDA8 +:106E9000002809D0206901E0F8000020BDE810407A +:106EA00000F5F77102F020BE10BD70B5FC4C06462F +:106EB0000D46206990F8E400FE2800D0FFDF22692B +:106EC000002082F8E46015B1A2F8A40022E422F8C0 +:106ED0009E0F012010711DE470B5F14C01230021BB +:106EE000206990F87C20703002F01BFA002869D0ED +:106EF000206990F8BA1111B190F8BB1139B190F82E +:106F0000C41100295DD090F8C51111B359E090F873 +:106F10007D1024291BD090F87C10242917D0002341 +:106F200000F5D87200F5DD7102F058FD21690020EE +:106F300081F8BA0101461420FFF7B7FF216901F17A +:106F40003000C28A21F8E62F408B48803FE00123C1 +:106F5000E6E790F87D2001230B21703002F0E1F983 +:106F600078BB206990F8640000F0FBFE05462069BC +:106F700090F8650000F0F5FE0646206990F8C6110D +:106F8000284600F0E0FE50B1206990F8C711304665 +:106F900000F0D9FE18B10020FFF72EFB11E02069A8 +:106FA0000123032190F87D20703002F0BAF940B936 +:106FB00020690123022190F87D20703002F0B1F9A0 +:106FC00008B1002080E400211620FFF76EFF0120A9 +:106FD0007AE410B5F0BBB24C206990F87E10CA0775 +:106FE00002D00121092051E08A070AD501210C2095 +:106FF000FFF75BFF206910F8AA1F41F00101017043 +:1070000046E04A0702D5012113203FE00A0705D5D3 +:1070100010F8E11F41710121072037E011F0300F16 +:107020003AD090F8BB11A9B990F8BA11D9B190F83B +:107030007D1024292ED090F87C1024292AD00023FA +:1070400000F5D87200F5DD7102F0C8FC216911F875 +:107050007E0F00E020E020F0200040F010000870DB +:10706000002081F83C01206990F87E10C90613D5F4 +:1070700002F0E2FCFFF7E1FA216901F13000C28A77 +:1070800021F8E62F408B488001211520FFF70DFFE6 +:10709000012010BD0123D3E7002010BD70B5804C46 +:1070A000206990F8E410FE2978D1A178002975D1E3 +:1070B00090F87F2001231946703002F032F9002841 +:1070C0006CD1206990F8901149B10021A0F89C1072 +:1070D00090F8911180F8E610002102205BE090F812 +:1070E0007D2001230421703002F01BF90546FFF7D3 +:1070F00070FF002852D1284600F089FF00284DD1AA +:1071000020690123002190F87C20703002F009F9F9 +:1071100078B120690123042190F87D20703002F0BD +:1071200000F930B9206990F8960010B100211220C2 +:1071300031E0206990F87C200A2A0DD0002D2DD155 +:1071400001230021703002F0ECF878B1206990F84A +:10715000AC1104290AD105E010F8E21F01710021E9 +:10716000072018E090F8AA00800718D0FFF7B4FEB7 +:10717000002813D120690123002190F87C20703071 +:1071800002F0CFF8002809D0206990F8A401002867 +:1071900004D00021FF20BDE8704086E609E0002110 +:1071A0000C20FFF782FE206910F8AA1F41F00101B0 +:1071B000017043E43EB505466846FDF7BDFE00B9E3 +:1071C000FFDF222200210098F6F7DDF80321009866 +:1071D00002F0FFFA0098017821F0100101702946B1 +:1071E00002F01DFB2E4C0D2D40D00BDCA5F102054D +:1071F0000B2D19D2DFE805F01F184719191F185673 +:1072000018192400152D5ED008DC112D25D0122D63 +:107210000BD0132D09D0142D06D154E0162D29D0F2 +:10722000172D69D0FF2D73D0FFDFFDF79AFE0028E0 +:1072300000D1FFDF3EBD2169009891F8E61017E00C +:10724000E26800981178017191884171090A817191 +:107250005188C171090A0172E7E70321009802F021 +:10726000A6FB0621009802F0A6FBDEE700980621A7 +:107270000171DAE70098216991F8C621027191F84D +:10728000C7114171D1E72169009801F5887102F0B9 +:1072900028FB21690098DC3102F028FBC5E70000DB +:1072A000F8000020F849D1E90001CDE90101206989 +:1072B00001A990F8B00000F025008DF804000098B6 +:1072C00002F048FBB1E72069B0F84810009802F0DE +:1072D00017FB2069B0F8E810009802F015FB206950 +:1072E000B0F84410009802F013FB2069B0F8E610E3 +:1072F000009802F011FB98E7216991F8C401002879 +:107300000098B9D111F8642F02714978B9E7FFE705 +:10731000206990F8A721D0F8A811009802F08DFA02 +:1073200083E7DA4810B5006990F8821041B990F807 +:107330007D2001230621703001F0F3FF002800D0EA +:10734000012010BD70B5D14D286990F8801039B179 +:10735000012905D0022906D0032904D0FFDF0AE461 +:10736000B0F8F41037E090F87F10082936D0B0F864 +:107370009810B0F89A2000248B1C9A4206D3511A18 +:10738000891E0C04240C01D0641EA4B290F896103F +:1073900039B190F87C2001230921703001F0C1FF40 +:1073A00040B3FFF7BEFF78B129690020B1F8902003 +:1073B000B1F88E108B1C9A4203D3501A801E00D055 +:1073C000401EA04200D284B20CB1641EA4B228694F +:1073D000B0F8F4102144A0F8F01040E5B0F898108F +:1073E0000329BDD330F8701F428D1144491CA0F809 +:1073F000801034E50024EAE770B50C4605464FF4EA +:10740000087200212046F5F7BEFF258027E5F8F732 +:107410005FBF2DE9F0410D4607460621F8F74EFE05 +:10742000041E3ED094F8CC010026B8B16E7007203F +:1074300028700DE0268484F8CC61D4F8CE01C5F81C +:107440000200D4F8D201C5F80600B4F8D60168816C +:1074500094F8CC010028EDD1AE70B6E094F8D801D4 +:1074600090B394F8D8010B2813D00C2801D0FFDF7B +:10747000ABE02088F8F755FF0746F8F712FC78B91B +:107480006E700C20287094F8DA01A8702088A8800B +:1074900014E02088F8F745FF0746F8F702FC10B122 +:1074A0000020BDE8F0816E700B20287094F8DA019E +:1074B000A8702088A88094F8DE01A87184F8D861AB +:1074C0003846F8F7E8FB80E0FFE794F80E0230B1A9 +:1074D0006E700E20287084F80E626F8075E094F84C +:1074E000E00180B16E700820287020886880D4F890 +:1074F000E4116960D4F8E811A960B4F8EC01A8813E +:1075000084F8E06161E094F8080270B16E701620B2 +:10751000287005E084F80862D4F80A02C5F8020071 +:1075200094F808020028F5D14FE094F8EE01B0B1CC +:107530006E70122028700DE084F8EE61D4F8F0012E +:10754000C5F80200D4F8F401C5F80600D4F8F80133 +:10755000C5F80A0094F8EE010028EDD135E094F862 +:10756000FC0180B16E701820287084F8FC61D4F89A +:10757000FE01C5F80200D4F80202C5F80600B4F80E +:107580000602688121E094F8100240B119202870A9 +:1075900084F81062D4F81202C5F8020015E094F8DD +:1075A000160200283FF47DAF6E701320287008E0AB +:1075B00084F81662D4F81802C5F80200B4F81C0268 +:1075C000E88094F816020028F2D1012069E72F48DC +:1075D0000021C16101620846704730B52B4D0C4651 +:1075E000E860FFF7F4FF00B1FFDF2C7130BD002130 +:1075F00080F87C1080F87D1080F8801090F8FE10E4 +:1076000009B1022100E00321FEF76BBB2DE9F04137 +:107610001E4C0546206909B1002104E0B0F80611AE +:10762000B0F8F6201144A0F8061190F8901139B97D +:1076300090F87F2001231946703001F072FE30B1BE +:10764000206930F89C1FB0F85A201144018020694D +:1076500090F8A23033B1B0F89E10B0F8F620114483 +:10766000A0F89E1090F9A670002F06DDB0F8A410C7 +:10767000B0F8F6201144A0F8A41001213D263DB138 +:1076800080F88D6018E00000A0B20100F800002032 +:107690002278022A0AD0012A11D0A2782AB380F8CF +:1076A0008C1012F0140F0DD01E2113E090F8E6207C +:1076B000062A3CD016223AE080F88C1044E090F87C +:1076C000922134E0110702D580F88D603CE09106EC +:1076D00003D5232180F88D1036E0900700D1FFDF1D +:1076E00021692A2081F88D002AE02BB1B0F89E2074 +:1076F000B0F8A0309A4210D2002F05DDB0F8A420D7 +:10770000B0F8A0309A4208D2B0F89C30B0F89A2075 +:10771000934204D390F890310BB1222207E090F805 +:1077200080303BB1B0F89830934209D3082280F8FA +:107730008D20C1E7B0F89820062A01D33E22F6E753 +:10774000206990F88C1019B12069BDE8F0414EE72E +:10775000BDE8F0410021FEF7C4BA2DE9F047FF4C27 +:1077600081460D4620690088F8F7EDFD060000D13E +:10777000FFDFA0782843A070A0794FF000058006B5 +:10778000206904D5A0F8985080F8045103E030F83F +:10779000981F491C0180FFF7C4FD012740B3E08812 +:1077A000000506D5206990F8821011B1A0F88E501E +:1077B0001EE02069B0F88E10491C89B2A0F88E1026 +:1077C000B0F890208A4201D3531A00E00023B4F8A5 +:1077D00008C00CF1050C634501D880F89670914201 +:1077E00006D3A0F88E5080F80E722079F3F7DCFBF8 +:1077F000A0794FF0020810F0600F0ED0206990F8C9 +:10780000801011B1032908D102E080F8807001E0F6 +:1078100080F880800121FEF764FA206990F88010DA +:10782000012904D1E188C90501D580F88080B9F12A +:10783000000F71D1E188890502D5A0F8185104E044 +:10784000B0F81811491CA0F8181100F0A7FBFEF7BA +:1078500059FDFFF723FC00F0B2FD0028206902D09B +:10786000A0F8F85003E030F8F81F491C018000F040 +:10787000A9FD38B1206990F80411022907D8491CE4 +:1078800080F80411206990F80401022804D92069C5 +:1078900020F8F85F4580057320690123002190F8E6 +:1078A0007D20703001F03DFD20B9206990F87D0009 +:1078B0000C286AD120690123002190F87C207030C7 +:1078C00001F02FFD48B320690123002190F87F20AB +:1078D000703001F026FD00B3206990F88010022975 +:1078E00053D190F80401C0B93046F7F7AAFFA0B110 +:1078F000216991F8E400FE2847D1B1F8F20001288F +:1079000043D981F8FD70B1F89A20B1F89800931E20 +:10791000984203DB012004E043E036E0101A401EE9 +:1079200080B2B1F8F82023899A4201D3012202E003 +:107930009A1A521C92B2904200D91046012801D1E5 +:1079400081F8FD5091F86F206AB98A6E5AB1B1F88A +:107950009420B1F87030D21A12B2002A03DD90429E +:1079600000DB104680B291F8892192B1B1F8FA207B +:10797000B1F88A118A4201D3012102E0891A491C17 +:1079800089B2884205D9084603E02169012081F8BF +:10799000FD502169B1F870201044A1F8F400FFF700 +:1079A000D1FCE088C0F340214846FFF72FFE206954 +:1079B00080F8FE50BDE8F047FDF7F6BA6749024689 +:1079C0008878CB78184312D10846006942B189798A +:1079D000090703D590F87F00082808D001207047D8 +:1079E000B0F84C10028E914201D8FEF7C6B80020C4 +:1079F000704770B5594C05460E46E0882843E08034 +:107A0000A80703D5E80700D0FFDF6661EA074FF05B +:107A100000014FF001001AD0A661F278062A02D0C8 +:107A20000B2A14D10AE0226992F87D30172B0ED16F +:107A30000023E2E92E3302F8370C08E0226992F8BD +:107A40007D30112B03D182F8811082F8A800AA079B +:107A500018D56269D278052A02D00B2A12D10AE021 +:107A6000216991F87D20152A0CD10022E1E930220C +:107A700001F83E0C06E0206990F87D20102A01D123 +:107A800080F88210280601D50820E07067E42DE90F +:107A9000F84F324C00254FF00108E580A570E570E5 +:107AA0004146257061F3070220619246814680F8C5 +:107AB000FE800088F8F747FC070000D1FFDF20694F +:107AC0000088FDF736FA20690088FDF75BFA206927 +:107AD000B0F8F21071B190F8E410FE290FD190F8CF +:107AE000901189B190F87F2001231946703001F080 +:107AF00018FC78B1206990F8E400FE2804D02069D1 +:107B000090F8E400FFF756FB206990F8FF1089B168 +:107B1000258118E02069A0F89C5090F8911180F818 +:107B2000E61000210220FFF7C0F9206980F8FD501F +:107B30000220E7E790F8CC1119B9018C82889142B4 +:107B400000D881882181B0F8F610491E8EB2B0F8B5 +:107B5000F8103144A0F8F81002E00000F80000200E +:107B600090F8FC1021B1A0F8FA5080F8FC5004E025 +:107B7000B0F8FA103144A0F8FA1030F8981F3144E8 +:107B80000180FFF7CEFB20B1206930F88E1F314411 +:107B900001802069B0F8F210012902D8491CA0F830 +:107BA000F2100EB180F8045190F8FD10A1B1B0F8B8 +:107BB000F800218988420FD23846F7F742FE58B1C3 +:107BC000206990F8891139B1B0F8FA10B0F88A013B +:107BD000814201D300F0F9FB206980F8FD5090F854 +:107BE0007D100B2901D00C2916D1B0F87020B0F807 +:107BF000AE31D21A12B2002A0EDBD0F8B011816079 +:107C000090F8B4110173032101F04EFA206980F855 +:107C10007D5080F8B28026E0242910D1B0F8701091 +:107C2000B0F8AE21891A09B2002908DB90F8C40126 +:107C3000FFF716F9206900F87D5F857613E090F86C +:107C40007C10242901D025290DD1B0F87010B0F88E +:107C5000AE01081A00B2002805DB0120FFF700F989 +:107C6000206980F87C5020690146B0F8F620703019 +:107C700001F0C8FA206990F8891109B1A0F8FA500A +:107C8000F6480090F64BF74A4946504600F0DEFAB7 +:107C9000216A11B16078FCF74DFE206901230521AE +:107CA00090F87D20703001F03CFB002803D0BDE847 +:107CB000F84F00F038BABDE8F88F00F045BBEA494C +:107CC000C8617047E848C069002800D001207047AB +:107CD000E54A50701162704710B50446B0F8B421FF +:107CE0004388B0F8B611B0F8B8019A4205D1A3881C +:107CF000994202D1E38898420FD02388A4F8D0316A +:107D0000A4F8D221A4F8D411A4F8D601012084F853 +:107D1000CC01D5480079F3F747F90221204601F05C +:107D2000C3F9002004F87D0F0320E07010BD401A55 +:107D300000B247F6FE71884201DC002801DC012018 +:107D4000704700207047012802D0022805D102E0C8 +:107D5000012904D001E0022901D000207047012050 +:107D6000704710B5012804D0022804D0FFDF204658 +:107D700010BD0124FBE70224F9E7BB48002100699C +:107D800020F8A41F8178491C81707047B64800B55F +:107D9000016911F8A60F401E40B20870002800DAF1 +:107DA000FFDF00BDB0482721006980F87C1000216A +:107DB00080F8A411704710B5AB4C206990F8AC1155 +:107DC000042916D190F87C2001230021703001F0A5 +:107DD000A8FA00B9FFDF206990F8AA10890703D438 +:107DE000062180F87C1004E0002180F8A21080F8C1 +:107DF000AC11206990F87E00800707D5FFF7C6FF19 +:107E0000206910F87E1F21F00201017010BD964913 +:107E100010B5096991F87C200A2A09D191F8E2206D +:107E2000824205D1002081F87C0081F8A20010BDBB +:107E300091F87E20130706D522F0080081F87E0015 +:107E4000BDE81040A2E7FF2801D0FFDF10BDBDE86C +:107E50001040A7E710B5844C206910F8B01F41F01E +:107E600004010170A06901F0A4FD162806D1206963 +:107E700090F87C00202802D0262805D010BDA069EB +:107E800001F09BFDFEF7B8FB2169002081F87C0022 +:107E900081F8A20010BDF8B5734C01230A212069B6 +:107EA00090F87C20703001F03CFA38B3A06901F002 +:107EB0003FFDC8B1A06901F035FD0746A06901F09A +:107EC00035FD0646A06901F02BFD0546A06901F0CD +:107ED0002BFD01460097206933462A46303001F0D9 +:107EE0008BFD206901F0A8FD2169002081F8A20026 +:107EF00081F87C00BDE8F840FEF79FBBA07840F019 +:107F00000100A070F8BD10B5574C01230021206975 +:107F100090F87D20703001F004FA30B1FFF72DFFAA +:107F20002169102081F87D0010BD20690123052101 +:107F300090F87D20703001F0F4F908B1082000E0DD +:107F40000120A07010BD70B5474C012300212069AD +:107F500090F87D20703001F0E4F9012588B1A06926 +:107F600001F0A8FC2169A1F8AE01B1F87010FFF78B +:107F7000DEFE40B12069282180F88D1080F88C50F9 +:107F800084E5A57082E52169A06901F5D87101F049 +:107F90008CFC21690B2081F87D0077E510B5FEF798 +:107FA0000EFFFEF70CFE304CA079400708D5A078F4 +:107FB00030B9206990F87F00072801D10120207096 +:107FC000FEF73EFAA079C00609D5A07838B9206935 +:107FD00090F87D100B2902D10C2180F87D10E078FB +:107FE00000070ED520690123052190F87D2070300F +:107FF00001F097F930B10820A0702169002081F8C4 +:10800000D80110BDBDE81040002000F016BB10B52F +:10801000154C216991F87D2040B3102A06D0142A0E +:1080200007D0152A23D01B2A35D123E001210B20AC +:1080300022E0FBF769FB0C2820D32069082100F51A +:108040008870FBF765FB28B120690421DC30FBF761 +:108050005FFB00B9FFDF012104200DE05B77010029 +:10806000BD790100F3790100F800002008E000F07C +:1080700017F803E001210620FEF717FF012010BDCD +:10808000212A08D191F8970038B991F8C40110B1AC +:1080900091F8C50108B1002010BD01211720EBE7C0 +:1080A00070B5184C0025206990F8931101290AD069 +:1080B000022925D190F8A810A9B1062180F8E61070 +:1080C0000121022017E090F8D811002918D100F101 +:1080D000C80300F58471002200F5CA7001F0C1F8F0 +:1080E0000121052007E090F8B000400701D51120DC +:1080F00000E00D200121FEF7D8FE206980F89351A1 +:10810000C4E40000F8000020F9480078002800D0FE +:108110000C20704710B50446FFF7F6FF00B1FFDFF3 +:10812000F348047210BDF2490120C871704770B560 +:108130000C460546082B01D0194600E004211046E4 +:1081400001F075F9844200D220460DB1001D80B2C5 +:10815000C0B270BD70B5E64934314C6804F17005A9 +:1081600060B1628F218F94F86530A87CFFF7DFFF44 +:1081700094F86510BDE87040FCF79EB8FF2094F8B5 +:108180006410F7E72DE9F0478146D9483430446858 +:10819000002004F17005628F218F94F86530FFF79D +:1081A000C6FFD34F0646D34878620120FFF7D2FFBF +:1081B000A87C4FF0000840B305F15801CE4891E883 +:1081C0000E1000F1080A8AE80E10A96EC0F82110FE +:1081D000E96EC0F82510FE38FCF743FBC6480121C4 +:1081E00008300176D5E91412C0E90412A0F58372B3 +:1081F000796AFBF728FF94F8650000F0A7FB0246B8 +:1082000031460120FBF72DFF04E0786AFCF729FBDB +:10821000FBF74BFFB9F1000F03D141469620FCF765 +:108220004CFB94F8642001210020FCF706FC94F834 +:108230002C00012801D1FCF7DFFB02203870FCF78D +:1082400061FD002800D0FFDFBDE8F0872DE9F04395 +:10825000A74D87B0804628780E9F1C461646894653 +:1082600010B90EB104B107B9FFDFEF61C5E90564CC +:108270000020C5E90D89E871A871E870A87028711F +:108280009B4F6871A8813437E8817E68344636F8A0 +:10829000700BF8F758F8E8622088F8F742F828637E +:1082A000FCF714F894F96700FCF7CEF804F112001B +:1082B000FCF7B9FA04F10E00FCF7CCF80120FCF74A +:1082C000CDFA18228D496846F5F733F88C480490AA +:1082D0006846FCF7B7FAF07EFCF7C6F8FCF7B8FA88 +:1082E00094F86F0078B9A06E68B1B08C318888427C +:1082F00009D1B4F86C1001220844B08494F86E00DF +:10830000A16EF9F708FE628F218F94F86530B07C7A +:10831000FFF70DFF94F865402146FBF7CDFF786825 +:1083200090F8880108B1FCF74FF821460120FCF7CE +:1083300054F97868D0F80001FCF797FA0120FFF7AC +:1083400021FF07B0BDE8F083694800B50078022836 +:1083500000D0FFDF00BD664810B534304468FCF73C +:10836000FBFAFCF7DAFAFCF729FAFCF762FAFBF7FA +:108370009CFE94F82C00012801D1FCF733FB94F803 +:108380006F0038B9A06E28B1002294F86E00114633 +:10839000F9F7C1FD564CE08900F0E2FAE269A179F3 +:1083A000A07890470020207010BD514810B500788B +:1083B000022800D0FFDFBDE81040CCE7CBE74C48F7 +:1083C000007970474A48C078704749490120487190 +:1083D00070472DE9FC474648454E3430A0F114075C +:1083E00044684FF0000A254694F875004FF00108E4 +:1083F000703458B3012868D002286AD0032876D098 +:10840000FFDF316AB1460826087820F008000870BE +:10841000A37906EAC303184320F004000870E37947 +:10842000042606EA8303184320F0100008706779D9 +:10843000D9F82C00F7F715FA0646FCF7C8FD022F0D +:1084400067D0012F65D0032F66D068E000F094FA62 +:10845000AA8E0146104600F0EAFF298E814200D222 +:1084600008464C21ADF8040048533846FCF78DFD12 +:1084700048B14FF48060316A00F077FA03206071F0 +:1084800084F80380BDE76A4601A9F06A00F05CFA4F +:10849000306210B194F8371029B13846FCF746FD28 +:1084A00084F80580ADE79DF8001031B9A0F800A070 +:1084B00080F802A0012101F08CF9BDF80410306AA7 +:1084C00001F07DFA022060719BE73846FCF72EFD33 +:1084D00097E7B5F84C00ADF804006A4601A9F06AC8 +:1084E00000F032FA306200288BD1FFDF89E709E023 +:1084F0001C010020780B0020780D0020A8B201009C +:108500001B5D01003846FCF740FD0028BAD1FFDFB3 +:1085100077E7B04301D002E00EB1012100E0002175 +:10852000D9F820004E46027842EA01110170617CC0 +:1085300051B36179012927D004F15801F7488EC958 +:1085400000F1080989E88E00A16EC0F82110E16EE3 +:10855000C0F82510FE38FCF784F9F048083080F8A0 +:1085600018A0D4E91212C0E90412A0F58371326A8E +:10857000FBF769FD95F8640000F0E8F90246FB217D +:108580000020FBF76EFD03E0FCF76BF9FBF78DFDB8 +:10859000012195F865200846FCF74FFA86F804801B +:1085A000316A0A8832828978B17486F80080FCF7D3 +:1085B000B5FB002800D0FFDFBDE8FC8770B5D84CC4 +:1085C000054639B9012D05D1E078401CC0B2E070F4 +:1085D000012820D8A16928468847E0B16179D148AF +:1085E00031B1012D04D1417811B90178C90612D5F4 +:1085F000A17981B98DB9CA4910310978CA0602D466 +:108600000078C00607D5A08928B9A06A28B9608972 +:1086100018B1C80601D4012070BD002070BD10B58E +:10862000BF4CA06A00B9FFDF6289D4E90910D21CEF +:10863000F4F77FFEA06A606210BD2DE9F0470600E6 +:10864000B748B74D00F134004468686A04F170041B +:10865000477801D0012E03D1296B02F0EDF8687044 +:1086600068784FF000084FF0010938B1012816D0A2 +:1086700002282FD0032844D0FFDFE5E5012E30D0BB +:10868000FFF7CDFF39460122286BF7F75BF926E0AB +:1086900084F8078030E000BF84F807902CE0012EBA +:1086A00008D0FFF7BCFF39460022286BF7F74AF9DC +:1086B000022EE2D0D4E91401401C41F10001C4E9CA +:1086C0001401E079012802D084F80790BCE584F811 +:1086D0000780B9E5012E04D0286BF7F7B7FA022E10 +:1086E000CBD0D4E91401401C41F10001C4E91401CC +:1086F000E0790128D0D1CBE7287ABDE8F047F2F73E +:1087000053BC012EB9D0286BF7F7A0FAF4E770B587 +:108710008349834A343100264C68516A01257034FC +:108720000B7803F00303012B14D0022B12D0032B80 +:1087300003D0907940F0040023E0A570D08940F484 +:108740000060D081012000F010F91CE0E67170BDDE +:10875000E57170BD4978B1B1D38943F40063D38129 +:10876000936A002BF5D0FB2908D8D17921B1BDE857 +:108770007040802000F0F4B8057070BD907940F032 +:108780001000907170BDE0790128E1D1DEE770B58D +:108790006348634D3430446828787034012800D031 +:1087A000FFDFA07838B10020A0700146042000F05F +:1087B000DCF801202071296A0878C043800705D1C0 +:1087C000A889400502D5022000F0CFF80121002041 +:1087D000FFF7F4FE10B1BDE87040BCE5BDE87040A5 +:1087E0000020CFE42DE9F84F4D4F4D4C3437002693 +:1087F0007D6882468DF8006020787035022800D0B0 +:10880000FFDFE08940F40070E0810020FFF7A2FC68 +:10881000A87CBAF1000F5BD0FBF76AFCFBF75AFCAF +:108820004FF0010968B9A87C58B1606A417841B13C +:108830000078E979C0F3C000884202D184F8029040 +:1088400059E0606A4178618121B1206BF7F734F813 +:10885000A06200E0A662E089B84640F02000E08116 +:10886000E670786800F17007064690F82C00012841 +:1088700016D1FCF7B7F83946304600F010FD78B154 +:10888000D8F804003188A0F80A12397A80F80C125E +:10889000797A80F80D1280F80892207AF2F784FB3A +:1088A000606AA9790078C0F38000884205D000F0A2 +:1088B00094F8E08940F48070E081606AE97900789A +:1088C000C0F3C00088420AD16846FFF720FF06E0E7 +:1088D00008B1FBF73EFCE08940F04000E0815146E2 +:1088E0000120FFF76BFE00289DF8000007D010B1B3 +:1088F0000020FFF7A2FEFFF72EFDBDE8F88F10B1B4 +:108900000120FFF79AFEFFF764FD9DF800000028A4 +:10891000F3D00220FFF791FEEFE70000780D002072 +:108920001C010020780B002070B5064654480D4607 +:108930004468FBF773FC034694F8642029463046EC +:10894000BDE87040FDF706BAF6F7C5BE00B50128D0 +:1089500002D0022802D0FFDF002000BD012000BDB0 +:10896000474A0021343A52691047454A343A9389BC +:108970000343938152691047414810B5446804F19C +:108980007001087B24280ED0497B24290BD01F2896 +:108990000CD020280AD0222912D094F86400042890 +:1089A00000D1082010BD94F8B01106E0222907D0AC +:1089B00094F8C60100F04FF8014694F8640008E00E +:1089C00094F8C60114F85D1F084000F044F8014611 +:1089D000E079BDE8104000F048B870B52848446818 +:1089E00094F875007034002832D0022810D1244D3C +:1089F000343DE86AF6F79BFE00B9FFDFD4E91201C7 +:108A0000401C41F10001C4E91201287AF2F7CCFAC6 +:108A100000256571207920B1257100211020FFF714 +:108A2000A4FFE07878B1E570FCF7BEFA00B9FFDF8B +:108A300000210820FFF799FFD4E91201401C41F101 +:108A40000001C4E91201A079012802D00120A0711F +:108A500070BDA57170BDC10701D0012070478007AE +:108A600001D50220704700207047002904D001285A +:108A700003D0012901D00220704701207047000077 +:108A8000500100202DE9F0410F4606460024FE4D1E +:108A90000FE000BF05EBC40090F85311B14206D1BE +:108AA0000622394600F5AA70F4F716FC38B1641CAA +:108AB000E4B22878A042EDD81020BDE8F08120462D +:108AC000FBE7F0B50746F04816460478621C0270D2 +:108AD00000EBC4050868C5F854018888A5F858015A +:108AE000102C00D3FFDF85F8537185F85A612046BA +:108AF000F0BD70B5054600F017FA10281CD1E24C05 +:108B00002078401EC0B22070A84215D004EBC002ED +:108B100004EBC50102F58070D2F85321C1F853214E +:108B2000D0F85700C1F85701207800F0FDF910285F +:108B300002D0204480F8035170BD2DE9F047D24C9B +:108B40000646A719A078401EC5B2A57097F8038104 +:108B5000AE422AD004EB051A04EB06190AF1030110 +:108B600009F103001022F4F7E4FB0AF1830109F193 +:108B700083001022F4F7DDFB601905EB450290F845 +:108B8000031187F8031106EB460104EB420204EBE4 +:108B90004101D2F80B31C1F80B31B2F80F21A1F825 +:108BA0000F2190F83B0187F83B0104EBC80090F8D7 +:108BB0005A01C00703D14046BDE8F04799E7BDE838 +:108BC000F087B1498A78824203D9084490F843017A +:108BD00070470020704710B540F2D3120021AA4818 +:108BE000F4F7D1FB0822FF21A848F4F7CCFBA748F3 +:108BF00000210C38417081704FF46171818010BD8B +:108C000070B50D460646FFF73DFF9F4C102807D074 +:108C100004EBC00191F85A11C90701D0012070BDC1 +:108C20006178082910D2102808D004EBC000012177 +:108C300080F85A116078401C6070EFE701222946E5 +:108C40003046FFF73EFFF5E7002070BD70B58E4D52 +:108C50002878401E44B20AE005EBC40090F85A019F +:108C6000C00702D0E0B200F070F9641E64B2002CBC +:108C7000F2DA864900200C39887070BD82498A7802 +:108C8000824203D901EB0010C01C704700207047DE +:108C90002DE9F047984691460C460546FFF7F2FE4F +:108CA0000646102805D000F03FF9102801D0122008 +:108CB00085E7754FB87808282AD2102E05D10022F2 +:108CC00021462846FFF7FDFE0646BC781022601CB0 +:108CD000B87007EB0415E81C494600F0B5FA05F139 +:108CE00083001022414600F0AFFA1021404600F008 +:108CF0009CFA3C44102184F84301484604F59674DC +:108D000000F093FAE07704F8296C0020E07356E74E +:108D1000072054E75C4810B58078401E44B204E058 +:108D2000E0B2FFF70AFF641E64B2002CF8DA10BD4F +:108D300056490C394870704754480C384078704791 +:108D400040B14AF2B811884204D850490C398880A1 +:108D500001207047002070474C480C3880887047CD +:108D600010B5FFF78FFE102803D000F0DDF81028B3 +:108D700000D1082010BD44498A78824203D901EB12 +:108D8000001083307047002070473F4B10B59C782F +:108D900084420FD9184490F8030103EBC00090F807 +:108DA00053310B70D0F854111160B0F85801908015 +:108DB000012010BD002010BD334A114491F8032159 +:108DC00032490C390A700268C1F80620808848814F +:108DD000704770B52D4B0C3B5B7873B12A4B9C7878 +:108DE0005CB1451821460AB1D81C01E02648833001 +:108DF0002A46FBF794F8012070BD002070BD10B525 +:108E0000FBF7DBF818B1BDE81040FBF7E6B8FF2030 +:108E100010BD1D498A78824209D9084490F803019F +:108E200001EBC00090F85A0100F0010070470020EB +:108E300070472DE9F04100242546134E2CE02846CA +:108E400000F072F88046FFF719FF06EBC50797F8A8 +:108E50005A11C9071ED060B1B8F1100F05D006EB4A +:108E6000080191F83B11012903D0102100F0DDF930 +:108E700080B10649204601F80480641C97F853210C +:108E800007F5AA71E4B203E0A80D002064010020F8 +:108E9000FBF7B5FA6D1CEDB23078A842CFD80CE6DE +:108EA000012296E72E4A01EB410102EB41010268E3 +:108EB000C1F80B218088A1F80F01704701461022EC +:108EC000284800F0C1B92748704725498A7882426E +:108ED00003D9084490F83B0108B1002070470120F5 +:108EE00070472DE9F0410E460746154606213046EB +:108EF00000F09BF91A4C58B1002004E02118401CE6 +:108F000081F83B51C0B2A1788142F7D80120D4E565 +:108F100031463846FFF724FF082803D0204480F864 +:108F20003B51F3E70020C8E50D4910B5034600208A +:108F30008A7806E00C1894F803419C4204D0401C47 +:108F4000C0B28242F6D8102010BD05494A78521EA0 +:108F50004A7001EBC001002281F85A21C9E50000E6 +:108F6000A80D00207B0F002000F00101400800F058 +:108F700001021144400800F001021144400800F0D1 +:108F800001021144400800F001021144400800F0C1 +:108F900001021144400800F00102114401EB5000AD +:108FA000704710B500240485848DDB004C43B3FB6F +:108FB000F2F394FBF2F45B1C84859BB203FB02F496 +:108FC0004385B4F5C84F01DD5B1E43854FF4FA437A +:108FD000B3FBF2F35B1C0386438C02EBC3035B1E03 +:108FE000B3FBF2F30384C38B4B43B3FBF2F1C183B6 +:108FF00010BD70B50546087B0E4600F01F000873D3 +:109000000020687604463019007AFFF7ADFF291971 +:10901000641C0875697EE4B208446876052CF2D3B6 +:10902000C0B2252800D9FFDF70BD0023C38342846E +:1090300001EBC202521EB2FBF1F101847047F0B5A0 +:109040006FF01F02010C02EA90261F25A1F5AA402D +:1090500054380DD0A1F5AA40553809D0A1F52850B3 +:10906000AA3805D0A1F52A40AA3801D0012000E095 +:10907000002000221346144682EA0107FF431F43E3 +:109080007F1C0FD006F00107520842EAC73205F0F4 +:1090900001075B0876086D08641C43EAC733162C89 +:1090A000EAD3F0BD0020F0BD2DE9F04101260446D1 +:1090B000002500F1700751B1012974D0022971D047 +:1090C00003296CD101463846BDE8F04191E7802282 +:1090D00000213846F4F757F9BD71FD713D737D737A +:1090E000FD733D747D71BD76FD76212087F84000CB +:1090F000412087F84100FE2087F8740027887022FD +:1091000000212046F4F73FF9278084F8646084F852 +:109110006560282084F8660004F1300000210746CD +:1091200000F071FC1B21F9833984A4F85210A4F8D3 +:1091300054104FF4A470A4F85600A4F858006673B5 +:109140004FF448606080A4F8F050A4F8F250A4F8FE +:10915000F450A4F8F650A4F8F850A4F8FA5084F8A3 +:10916000FD5084F8FF50A4F8065184F80451A4F887 +:109170001851A4F81A5184F8BA5184F8BB5184F8F4 +:10918000C45184F8C55184F8895184F8905184F809 +:10919000935184F8AC51C4F8A451C4F8A851BDE867 +:1091A000F08100E025E0A4F8065184F8FE506188C3 +:1091B000FE480A460844B0FBF1F0A4F890004BF6D4 +:1091C0008030A4F89200E3883846FFF7EAFE214693 +:1091D0003846FFF70EFFFAF7F9F920B1D4F80E0080 +:1091E000FFF72DFF10B184F88851D8E784F8886123 +:1091F000D5E74188B4F8B831B4F8B4213846BDE8B1 +:10920000F041CEE6437E0BB1252B01D912207047E9 +:109210002AB14B7B2BB1012B05D01F2070470020BA +:10922000704700F0EEB900F092B910B500231A466D +:1092300003E0845C2343521CD2B28A42F9D30BB1BF +:10924000002010BD012010BD30B5134606E0CC183B +:10925000D51A14F8014C5B1E4455DBB2002BF6D135 +:1092600030BD70B50E468CB0144601461D46102226 +:109270006846FFF7E9FF1022314604A8FFF7E4FF34 +:10928000684600F059FD08A94FF0100228461CB1AD +:10929000FFF7DAFF0CB070BDF4F74BF8FAE738B51A +:1092A00005460C466846FBF7B2FB002820D09DF926 +:1092B00000002072E17E617294F90A100022411AC6 +:1092C00000D5494295F82D308B4210DCFF2B0ED093 +:1092D000E17A491CC9B2E17295F82E30994202D860 +:1092E000A17A7F2903D1A0720020E07201221046EA +:1092F00038BD0C2813D00B2811D00D280FD01F28F3 +:109300000DD020280BD0212809D0222807D02328CF +:1093100005D0242803D0262801D000207047012042 +:10932000704710B5A2F10F030C2941D2DFE801F01C +:1093300006080D1215181C40243E272EAAB337E04C +:10934000072A37D0082A35D032E00C2A32D00B2A2F +:1093500030D02DE00D2A2DD02AE00C2B2AD927E081 +:10936000103A0B2A26D923E0032B23D990F8380092 +:10937000F0B11B2A1ED91BE0062A1BD018E01C2ABC +:1093800018D01D2A16D01E2A14D011E01F2A11D081 +:10939000202A0FD0212A0DD0222A0BD0232A09D02F +:1093A000242A07D0262A05D002E003E00E2A01D0A5 +:1093B000002010BD012010BD2DE9F0410C460546EE +:1093C00040F23577866805E0F8F7F7FF3946F8F799 +:1093D000C8FCA8602846F9F7A5F90028F4D08CB19C +:1093E0003046A968F9F7EAFC00280BDD2044401E4E +:1093F000B0FBF4F707FB04F13046F8F7B2FCA860C5 +:109400003846CCE60020CAE670B5044690420BD23E +:10941000101B642800D2642025188D4205D8042131 +:10942000F9F7FFFC08B1284670BD204670BD11F069 +:109430000C0F19D04A074FF41671002A03DA00BF47 +:109440004FF0100201E04FF0400201DA4FF09601B8 +:1094500001F5BC71A0EB0103884202D993FBF2F045 +:1094600000E0002080B27047022904D06FF00D01A7 +:1094700001EBD000F6E76FF00E0101EB9000F1E791 +:109480000844184498300AB1042100E0002108443F +:10949000704701207047106808667047C10701D007 +:1094A00001207047810701D502207047400701D590 +:1094B00008207047002070472DE9F0410546164608 +:1094C00088460124084600F054FA0746404600F05A +:1094D00052FA0346FFF7E2FF02463846FFF7DEFF87 +:1094E00052EA000100D10024990700D10022B907F7 +:1094F00000D1002095F86410914200D10022327012 +:1095000095F86510814200D10020707072B968B979 +:10951000404600F032FAB5F87010401A00B247F633 +:10952000FE71884201DC002800DC0024204636E67B +:1095300010B540F6C4125410012903D0022902D0FC +:10954000FFDF02E008B1104610BD204610BDF0B5A7 +:109550000C7C8B7BCD7B5C404B7C02886B4044EA6F +:109560000324467E62400023D5B2120A95FAA5F57F +:1095700092FAA2F22D0E120E45EA022202EB02121C +:109580005B1C2244DBB292B2032BEDD36240252355 +:10959000B2FBF3F403FB142301EBD304837603F053 +:1095A00007070125247A05FA07F701E0FFDB05002C +:1095B0003C4201D0C3761AE05643320C521CD2B260 +:1095C000002403191B7D934213D300230E19367A0E +:1095D00005FA03F73E4201D0521ED2B222B15B1C03 +:1095E000DBB2082BF4D306E003EBC401C176002004 +:1095F000F0BDD21AD2B2641CE4B2052CE1D31F2014 +:10960000F0BDF0B5837E0C7E012504FB02322523DC +:10961000B2FBF3F403FB142201EBD204827602F0D6 +:109620000703247A05FA03F31C4201D0C2761EE038 +:10963000437EB2FBF3F403FB1422521CD2B200238C +:10964000C418247D944214D30024CE1896F80860E0 +:1096500005FA04F73E4201D0521ED2B222B1641C78 +:10966000E4B2082CF4D306E004EBC301C176002079 +:10967000F0BD121BD2B25B1CDBB2052BE0D31F2066 +:10968000F0BD000030B50546007801F00F0220F073 +:109690000F0010432870092912D2DFE801F00507F6 +:1096A00005070509050B0F0006240BE00C2409E053 +:1096B000222407E001240020E87003E00E2401E0EA +:1096C0000024FFDF6C7030BD007800F00F007047A1 +:1096D0000A6840F8032F8988818070470A6840F83B +:1096E000092F8988818070470278402322F0400248 +:1096F00003EA81110A4302707047027822F0800267 +:1097000042EAC1120270704770B514460E46054613 +:109710001F2A00D9FFDF2246314605F10900F3F781 +:1097200008FEA41D6C7070BD70B514460E4605464B +:109730001F2A00D9FFDF2246314605F10900F3F761 +:10974000F8FDA41D6C7070BD30B5017801F00F01FB +:10975000032920D0052921D14578B0F81910B0F897 +:109760001B40B0F81730827D222D17D1062915D362 +:109770004FF44865A94211D8B4F5FA7F0ED26AB108 +:10978000082A0BD88A4209D28B4207D8B0F81D00AC +:10979000A84205D902E040780C2801D0002030BD55 +:1097A000012030BD4078704700B5027801F0030316 +:1097B00022F003021A430270012905D0022903D0C6 +:1097C000032903D0FFDF00BD002100E0012141702B +:1097D00000BD00B5027801F0030322F003021A4332 +:1097E0000270012905D0022903D0032903D0FFDF2D +:1097F00000BD002100E00121417000BD007800F0B3 +:1098000003007047417841B1C078192803D2704AEB +:10981000105C884201D1012070470020704730B5AC +:1098200001240546C170192902D26948445C02E04E +:10983000FF2900D0FFDF6C7030BD70B514460E46B6 +:1098400005461B2A00D9FFDF6C7022463146E81C12 +:10985000BDE87040F3F76DBDB0F807007047B0F891 +:1098600009007047B0F80B00704770B5B0F80720DA +:10987000B0F80940B0F805300179951F40F67A46F6 +:10988000B54210D8B4F5FA7F0DD261B108290AD8D3 +:10989000914208D2934206D8B0F80B00B0F5486F59 +:1098A00001D8012070BD002070BD42680A60007AB6 +:1098B00008717047B0F80900704700797047426836 +:1098C0000A6080684860704780890880704750F857 +:1098D0000E2F0A60406848607047D0F81600086094 +:1098E00070470A6842604968816070470968C160D2 +:1098F00070470079704742680A6080684860704726 +:109900000171090A417170478171090AC17170477B +:109910000172090A417270478172090AC172704767 +:1099200080887047C08870470089704740897047B9 +:1099300001891B290CD341894FF4A472914207D3AA +:1099400081881B2904D3C088904201D3012070472D +:10995000002070470A684260496881607047017959 +:10996000490704D04079400701D00120704700200A +:1099700070470079704740797047C08870470CB5D0 +:1099800014A2D2E90012CDE900120179407901F068 +:10999000070269461DF80220012A04D800F00700DA +:1099A000085C012801D900200CBD01200CBD01710B +:1099B000704700797047417170474079704730B502 +:1099C0000C460546FB2900D9FFDF6C7030BD000056 +:1099D000C0B20100000101020102020310B58C882F +:1099E0000A894B88C988A0F84430A0F84810A0F82C +:1099F0004640A0F84A2010BD10B5029C8181C2816A +:109A00000382448210BD1B2202838282C281828132 +:109A100042800281028042848284828300290AD1AA +:109A20004FF4A4714183C18241820182C18041818E +:109A30008180C18401857047F0B5B0F84830818FCE +:109A4000458EC48E8B4200D30B46B0F84A10B0F856 +:109A50004020914200D20A464386C286068F478F35 +:109A600000F130019E4200D21E46974200D21746B6 +:109A70000E814F81AB4201D1A24201D0012400E00E +:109A80000024B0F84420C38F068E858E9A4200D3FE +:109A90001A46B0F84670B0F842309F4200D23B46BA +:109AA00090F85A70022F08D1964200D232469D4259 +:109AB00000D22B46002780F85A700A808B80B24271 +:109AC00001D1AB4201D0012000E000202043F0BDD5 +:109AD000508088899080C889D080088A1081488AFF +:109AE000508101201070704770B502884A80048E42 +:109AF0008C80838ECB80428E0A81C58E4D81B0F8DA +:109B00005660AE420BD1B0F85250954207D1B0F832 +:109B100058509D4203D1B0F85430A34201D00123E4 +:109B200000E000230B73A0F852204A89A0F85620C9 +:109B30008A88A0F85420CA88A0F85820012008700C +:109B400070BD70B50C46088E91F8641000F016F8E0 +:109B5000A18E0546A94200D20D46208F94F86510CB +:109B600000F00CF8618F814200D208460146284679 +:109B7000BDE8704000221346FFF782BC11F00C0FC5 +:109B800004D04FF4747101EB801006E0022902D07A +:109B9000C000703001E080003C3080B270470000AF +:109BA0002DE9F0410C4612490D68114A114908325D +:109BB0001160A0F12001312901D301200CE04128DE +:109BC00010D040CC0C4F94E80E0007EB8000241F0F +:109BD00050F8807C3046B84720600548001D05607D +:109BE000BDE8F081204601F0B9F8F5E7062070479E +:109BF0001005024001000001DCB2010010B555481B +:109C0000F9F704FD00B1FFDF5248401CF9F7FEFCF4 +:109C1000002800D0FFDF10BD2DE9F14F4E4E82B07D +:109C2000D6F800B001274B48F9F7F8FCDFF824819B +:109C300020B9002708F10100F9F706FD474C00257F +:109C40004FF0030901206060C4F80051C4F80451CA +:109C5000029931602060DFF808A11BE0DAF800000B +:109C6000C00617D50E2000F068F8EFF3108010F052 +:109C7000010072B600D001200090C4F80493D4F81B +:109C8000000120B9D4F8040108B901F071F8009876 +:109C900000B962B6D4F8000118B9D4F8040100285C +:109CA000DCD0D4F804010028CCD137B1C6F800B01C +:109CB00008F10100F9F7B2FC11E008F10100F9F731 +:109CC000ADFC0028B6D1C4F80893C4F80451C4F818 +:109CD00000510E2000F031F81E48F9F7B5FC0020C5 +:109CE000BDE8FE8F2DE9F0438DB00D4606460024F9 +:109CF0000DF110090DF1200818E000BF04EB440736 +:109D0000102255F827106846F3F713FB05EB870779 +:109D1000102248467968F3F70CFB6846FFF77CFF92 +:109D200010224146B868F3F704FB641CB442E5DB3B +:109D30000DB00020BDE8F0836EE7002809DB00F0DD +:109D40001F02012191404009800000F1E020C0F88D +:109D5000801270476C01002004E5004000E00040E4 +:109D600010ED00E0B64900200870704770B5B54DA1 +:109D700001232B60B44B1C68002CFCD0002407E0AE +:109D80000E6806601E68002EFCD0001D091D641CB4 +:109D90009442F5D30020286018680028FCD070BDDC +:109DA00070B5A74E0446A94D3078022800D0FFDFD9 +:109DB000AC4200D3FFDF7169A548012903D847F2FF +:109DC0003052944201DD03224271491C7161291B0A +:109DD000C1609F49707800F030F9002800D1FFDFA2 +:109DE00070BD70B5964C0D466178884200D0FFDF9B +:109DF000964E082D4BD2DFE805F04A041E2D4A4A44 +:109E00004A382078022800D0FFDF03202070A07895 +:109E1000012801D020B108E0A06800F041FD04E075 +:109E200004F1080007C8FFF7A1FF05202070BDE876 +:109E30007040F8F7C0B9F8F7C0FA01466068F8F763 +:109E4000BDFFB04202D2616902290BD30320F9F7AA +:109E50000EFB12E0F8F7B1FA01466068F8F7AEFFC2 +:109E6000B042F3D2BDE870409AE7207802280AD0C9 +:109E7000052806D0FFDF04202070BDE8704000F008 +:109E8000D2B8022000E00320F9F7F1FAF3E7FFDF90 +:109E900070BD70B50546F8F790FA694C606020789F +:109EA000012800D0FFDF6A490120087000200871F6 +:109EB00004208D6048716548C86002202070607879 +:109EC00000F0BBF8002800D1FFDF70BD10B55C4C7E +:109ED000207838B90220F9F7E0FA18B90320F9F729 +:109EE000DCFA08B1112010BD5A48F8F7E1F96070AA +:109EF0001F2804D0012020700020606110BD0320C5 +:109F000010BD2DE9F0471446054600EB84000E46CF +:109F1000A0F1040800F0D7FC07464FF0805001691B +:109F20004F4306EB8401091FB14201D2012100E039 +:109F3000002189461CB10069B4EB900F02D90920B9 +:109F4000BDE8F0872846E7F76FF990B9A84510D328 +:109F5000BD4205D2B84503D245EA0600800701D0CC +:109F60001020EDE73046E7F75FF910B9B9F1000FBF +:109F700001D00F20E4E7384838490068884205D00E +:109F8000224631462846FFF7F1FE1AE0FFF79EFF12 +:109F90000028D5D12A4800218560C0E9036481707A +:109FA000F9F7DDFA08B12E4801E04AF2F870604393 +:109FB0004FF47A7100F2E730B0FBF1F01830FFF7A0 +:109FC00068FF0020BCE770B505464FF0805004697B +:109FD0006C432046E7F728F908B10F2070BD00F068 +:109FE00072FCA84201D8102070BD1B481B490068B4 +:109FF000884203D0204600F053FC10E0FFF766FFD4 +:10A000000028F1D10E48012184608170F9F7A7FA88 +:10A0100008B1144800E014481830FFF73AFF002058 +:10A0200070BD00F053BE10B5054C6078F8F7A2F98A +:10A0300000B9FFDF0020207010BDF8F7EFBB000073 +:10A040007001002004E5014000E40140105C0C00B8 +:10A050008C0F0020E39D010058000020BEBAFECA0C +:10A0600050280500645E0100A85B01007149096881 +:10A070000160002070476F4908600020704701218F +:10A080008A0720B1012804D042F20400704791678A +:10A0900000E0D1670020704767490120086042F264 +:10A0A0000600704708B50423634A1907103230B11F +:10A0B000C1F80433106840F0010010600BE0106834 +:10A0C00020F001001060C1F808330020C1F8080139 +:10A0D0005A4800680090002008BD011F0B2909D8CC +:10A0E000554910310A6822F01E0242EA4000086019 +:10A0F0000020704742F205007047000100F18040E7 +:10A10000C0F8041900207047000100F18040C0F839 +:10A11000081900207047000100F18040D0F80009C4 +:10A12000086000207047012801D907207047444A81 +:10A1300052F8200002680A4302600020704701289C +:10A1400001D9072070473E4A52F8200002688A432E +:10A15000026000207047012801D907207047384A63 +:10A1600052F820000068086000207047020035495E +:10A170004FF0000003D0012A01D0072070470A6089 +:10A18000704708B54FF40072510510B1C1F80423AF +:10A1900008E0C1F808230020C1F8240127481C303A +:10A1A00000680090002008BD08B58022D10510B1DC +:10A1B000C1F8042308E0C1F808230020C1F81C01FD +:10A1C0001E48143000680090002008BD08B54FF408 +:10A1D0008072910510B1C1F8042308E0C1F808238A +:10A1E0000020C1F8200115481830006800900020B8 +:10A1F00008BD10493831096801600020704770B50A +:10A200004FF080450024C5F80841F9F7B4F910B9BA +:10A21000F9F7BBF928B1C5F82441C5F81C41C5F8C8 +:10A2200020414FF0E020802180F800140121C0F887 +:10A23000001170BD0004004000050040080100400E +:10A24000A0B30100780500406249634B0A68634986 +:10A250009A42096801D1C1F31001016000207047E2 +:10A260005C495D4B0A685D49091D9A4201D1C0F302 +:10A2700010000860002070475649574B0A6857493C +:10A2800008319A4201D1C0F31000086000207047E5 +:10A2900030B5504B504D1C6842F20803AC4202D01E +:10A2A000142802D203E0112801D3184630BDC300A0 +:10A2B0004B481844C0F81015C0F81425002030BDD4 +:10A2C0004449454B0A6842F209019A4202D00628E5 +:10A2D00002D203E0042801D308467047404A012116 +:10A2E00042F83010002070473A493B4B0A6842F26E +:10A2F00009019A4202D0062802D203E0042801D3C1 +:10A3000008467047364A012102EBC0004160002038 +:10A31000704770B52F4A304E314C156842F2090330 +:10A3200004EB8002B54204D0062804D2C2F800181B +:10A3300007E0042801D3184670BDC1F31000C2F82D +:10A340000008002070BD70B5224A234E244C1568C9 +:10A3500042F2090304EB8002B54204D0062804D27D +:10A36000D2F8000807E0042801D3184670BDD2F8DF +:10A370000008C0F310000860002070BD174910B538 +:10A380000831184808601120154A002102EBC0036B +:10A39000C3F81015C3F81415401C1428F6D3002078 +:10A3A00006E0042804D302EB8003C3F8001807E09A +:10A3B00002EB8003D3F80048C4F31004C3F800484C +:10A3C000401C0628EDD310BD04490648083108603A +:10A3D0007047000058000020BEBAFECA00F50140D8 +:10A3E00000F001400000FEFF814B1B6803B198475D +:10A3F000BFF34F8F7F4801687F4A01F4E06111434A +:10A400000160BFF34F8F00BFFDE710B5EFF3108081 +:10A4100010F0010F72B601D0012400E0002400F01A +:10A42000DDF850B1E6F7A4FFF7F761FDF8F7C1FFDB +:10A43000F9F7E2FC71490020086004B962B6002017 +:10A4400010BD2DE9F0410C460546EFF3108010F0E9 +:10A45000010F72B601D0012600E0002600F0BEF820 +:10A4600020B106B962B60820BDE8F08100F006FD13 +:10A47000E6F782FF0246002001234709BF0007F1EB +:10A48000E02700F01F01D7F80071CF40F9071BD07B +:10A49000202803D222FA00F1C90727D141B20029AE +:10A4A00004DB01F1E02191F8001405E001F00F0157 +:10A4B00001F1E02191F8141D4909082916D203FA87 +:10A4C00001F717F0EC0F11D0401C6428D5D3F9F731 +:10A4D00071FC4B4A4B490020F9F7B4FC47494A4804 +:10A4E00008602046E6F7A7FE60B904E006B962B648 +:10A4F00041F20100B8E73E4804602DB12846E6F776 +:10A50000E7FE18B1102428E0404D19E02878022811 +:10A5100002D94FF4805420E007240028687801D045 +:10A52000D8B908E0C8B1202817D8A878212814D8AD +:10A53000012812D001E0A87878B9E8780B280CD867 +:10A54000E6F71AFF2946F8F71AFFF7F78FFC00F035 +:10A55000EDF92846E6F7DAFE044606B962B61CB104 +:10A56000FFF753FF20467FE700207DE710B5044644 +:10A5700000F034F800B101202070002010BD244903 +:10A5800008600020704770B50C4622490D682149CB +:10A59000214E08310E60102807D011280CD0122847 +:10A5A0000FD0132811D0012013E0D4E90001FFF7E8 +:10A5B00048FF354620600DE0FFF727FF00252060AB +:10A5C00008E02068FFF7D2FF03E011492068086027 +:10A5D000002020600F48001D056070BD07480A4933 +:10A5E0000068884201D101207047002070470000B8 +:10A5F000880100200CED00E00400FA05580000205E +:10A600004810002000000020BEBAFECAA8B3010016 +:10A6100004000020100502400100000100B585493A +:10A6200010F1080F19D00CDC10F1280F1DD010F11B +:10A63000140F18D010F1100F13D010F10C0F08D117 +:10A640000DE010F1040F06D080B103280ED00428CD +:10A650000CD0FFDF00BDFC2008E0F82006E0F4206D +:10A6600004E0F02002E0EC2000E0D820086000BD0B +:10A67000704900B5091D012803D0022803D0FFDF6F +:10A6800000BD032000E00420086000BD2DE9F0417A +:10A6900005460C4617461046F9F76CFD4FF47A76DE +:10A6A000022C10D0012C10D040F63401441838464A +:10A6B000F9F7C5FD204449F679710844B0FBF6F07E +:10A6C000281ABDE8F0813146F0E74FF4C861EDE7A4 +:10A6D00070B505460C460846FAF7F4FA022C10D07D +:10A6E000012C11D04FF4AF5149F6CA62511A0844F7 +:10A6F0004FF47A7100F2E140B0FBF1F0281A801EAD +:10A7000070BD40F24C41EFE740F63401ECE770B524 +:10A71000064615460C460846FAF7D4FA4FF47A7105 +:10A7200040F63402022D11D0012D11D01346022C17 +:10A7300011D0012C01D04FF4AF529A1A104449F6AF +:10A74000FC621044B0FBF1F0301A70BD0B46EEE72E +:10A750004FF4C863EBE740F24C42EEE770B50446B5 +:10A760000E460846F9F706FD05463046F9F767FD3F +:10A7700028444AF2AB3108444FF47A71B0FBF1F04F +:10A78000201A801E70BD2DE9F04106461D460C467C +:10A790001746104600F045F806EB4601C1EBC6111E +:10A7A00000EBC100022C15D0012C16D04FF4AF5194 +:10A7B00046182046FAF786FA301A4FF47A7100F6F6 +:10A7C000B730B0FBF1F43846F9F741FD2044284496 +:10A7D000401D76E740F24C41EAE740F63401E7E7F6 +:10A7E00070B5044615460E460846F9F7C3FC04EB5F +:10A7F0004401C1EBC411C0EBC1043046F9F71FFDA1 +:10A80000241A284600F00DF820444FF47A7100F61F +:10A81000B730B0FBF1F42846F9F719FD2044401D8C +:10A8200070BD082803D0042801D0F9F7A3BC4EF668 +:10A83000283070470C150040F0B585B00C46054631 +:10A84000FEF7DCFF07466E78204603A96A46F5F757 +:10A8500004FA81198EB258B1012F02D0032005B03D +:10A86000F0BD204604AA0399F5F719F9049D01E00B +:10A87000022F0FD1ED1C042E0FD32888BDF8001035 +:10A88000001D80B2884201D8864202D14FF00000FC +:10A89000E5E702D34FF00200E1E74FF00100DEE709 +:10A8A0000B4A022111600B490B68002BFCD0084BAE +:10A8B0001B1D186008680028FCD000201060086884 +:10A8C0000028FCD070474FF080504069704700006E +:10A8D00004E5014000E4014002000B464FF0000097 +:10A8E000014620D0012A04D0022A04D0032A0DD127 +:10A8F00003E0012002E0022015E00320072B05D22F +:10A90000DFE803F00406080A0C0E10000720704769 +:10A91000012108E0022106E0032104E0042102E015 +:10A92000052100E00621F7F7E4BC0000E24805211C +:10A9300081700021017041707047E0490A78012A56 +:10A9400005D0CA681044C8604038F8F704BA8A686D +:10A9500010448860F8E7002819D00378D849D94A0C +:10A9600013B1012B0ED011E00379012B00D06BB98C +:10A9700043790BB1012B09D18368643B8B4205D22B +:10A98000C0680EE00379012B02D00BB100207047A4 +:10A9900043790BB1012BF9D1C368643B8B42F5D2EB +:10A9A00080689042F2D801207047C44901220A70A1 +:10A9B000027972B100220A71427962B104224A71AD +:10A9C000826852328A60C068C860BB4902208870C1 +:10A9D00070470322EFE70322F1E770B5B74D044655 +:10A9E00000202870207988B100202871607978B122 +:10A9F0000420B14E6871A168F068F7F7B2F9A86059 +:10AA0000E0685230E8600320B07070BD0120ECE7D0 +:10AA10000320EEE72DE9F04105460226F8F7C5F8D8 +:10AA2000006800B1FFDFA44C01273DB12878B8B120 +:10AA3000012805D0022811D0032814D027710DE079 +:10AA40006868C82808D30421F8F7EBF920B16868D2 +:10AA5000FFF773FF012603E0002601E000F014F980 +:10AA60003046BDE8F08120780028F7D16868FFF70C +:10AA700072FF0028E2D06868017879B1A0780428D4 +:10AA800000D0FFDF01216868FFF7A7FF8B49E0785E +:10AA900000F003F90028E1D1FFDFDFE7FFF785FFD2 +:10AAA0006770DBE72DE9F041834C0F46E17888427F +:10AAB00000D0FFDF00250126082F7DD2DFE807F058 +:10AAC000040B28283D434F57A0780328C9D00228FB +:10AAD000C7D0FFDFC5E7A078032802D0022800D046 +:10AAE000FFDF0420A07025712078B8BB0020FFF79D +:10AAF00024FF72480178012906D08068E06000F0E8 +:10AB0000F9F82061002023E0E078F7F782FDF5E70F +:10AB1000A078032802D0022800D0FFDF207880BB75 +:10AB2000022F08D05FF00500F8F7A1FCA0780328F9 +:10AB300040D0A57095E70420F6E7A078042800D05F +:10AB4000FFDF022004E0A078042800D0FFDF01200E +:10AB5000A1688847FFF75EFF054633E003E0A07871 +:10AB6000042800D0FFDFBDE8F04100F08DB8A078E8 +:10AB7000042804D0617809B1022800D0FFDF2078D2 +:10AB800018B1BDE8F04100F08AB8207920B1062064 +:10AB9000F8F76DFC25710DE0607840B14749E07829 +:10ABA00000F07BF800B9FFDF65705AE704E007208A +:10ABB000F8F75DFCA67054E7FFDF52E73DB1012DC9 +:10ABC00003D0FFDF022DF9D14BE70420C0E70320BB +:10ABD000BEE770B5050004D0374CA078052806D133 +:10ABE00001E0102070BD0820F8F757FC08B11120D3 +:10ABF00070BD3548F7F75CFBE0701F2806D00121D7 +:10AC0000F8F730FA0020A560A07070BD032070BD79 +:10AC1000294810B5017809B1112010BD81780529A6 +:10AC200006D0012906D029B101210170002010BDF4 +:10AC30000F2010BD00F033F8F8E770B51E4C054644 +:10AC4000A07808B1012809D155B12846FFF783FE45 +:10AC500040B1287840B1A078012809D00F2070BDFC +:10AC6000102070BD072070BD2846FFF79EFE03E050 +:10AC700000212846FFF7B1FE1049E07800F00DF8FA +:10AC800000B9FFDF002070BD0B4810B5006900F06F +:10AC900029F8BDE81040F7F78EBAF7F7BFBD0648B0 +:10ACA00010B5C078F7F766FB00B9FFDF0820F8F7AA +:10ACB000DEFBBDE8104039E68C0100209C0F00202F +:10ACC0003D860100FF1FA107A5AA010010B5134C86 +:10ACD0002060201D0160114810300260001D0360DB +:10ACE000002010BD0E490A6848F202139A4302433D +:10ACF0000A6070470A4A116848F2021301EA030029 +:10AD0000994311607047054B02465B421020134483 +:10AD1000FC2B01D8116000207047000000060040A5 +:10AD2000C806024070477047704700001EF0040FCD +:10AD30000CBFEFF30880EFF30980014A10470000D1 +:10AD40005F3E010001B41EB400B5F8F7A9FD01B4DF +:10AD50000198864601BC01B01EBD0000826903490E +:10AD600081614FF0010010447047000045AD0100C3 +:10AD70000FF20C0000F10000694641F8080C20BFFA +:10AD800070470000FEDF18490978F9B904207146C0 +:10AD900008421BD10699154A914217DC06990229EF +:10ADA00014DB02394878DF2810D10878FE2807D054 +:10ADB000FF280BD14FF001004FF000020C4B184759 +:10ADC00041F201000099019A094B1847094B002BE9 +:10ADD00002D01B68DB6818474FF0FF3071464FF018 +:10ADE0000002034B1847000028ED00E000C00100FE +:10ADF000E9A3010004000020174818497047FFF735 +:10AE0000FBFFE6F7CBF900BD1548164909688842F3 +:10AE100003D1154A13605B68184700BD20BFFDE7EA +:10AE20000F4810490968884210D1104B18684FF03C +:10AE3000FF318842F2D080F308884FF02021884209 +:10AE400004DD0B48026803210A4302600948804779 +:10AE500009488047FFDF0000B00F0020B00F00203E +:10AE600000100000000000200400002000C00100CD +:10AE700014090040DD2F000009AE0100F0B4404687 +:10AE8000494652465B460FB402A0013001B5064860 +:10AE9000004700BF01BC86460FBC804689469246EB +:10AEA0009B46F0BC70470000091100000420714669 +:10AEB000084202D0EFF3098101E0EFF308818869CD +:10AEC00002380078102813DB20280FDB2C280BDB3E +:10AED0000A4A12680A4B9A4203D1602804DB094AE5 +:10AEE0001047022008607047074A1047074A10477A +:10AEF000074A12682C3212681047000058000020E0 +:10AF0000BEBAFECA7D130000A19B010087A5010007 +:10AF1000040000200D4B0E4908470E4B0C49084712 +:10AF20000D4B0B4908470D4B094908470C4B084985 +:10AF300008470C4B064908470B4B054908470B4B84 +:10AF4000034908470A4B02490847000019AC0000B2 +:10AF500059B00000A52F00000BA8000099A7000021 +:10AF6000A1AE0000991300004D7700001DB0000055 +:10AF70002DAD01005F8200000784000065850000A0 +:10AF8000C98500000386000037860000698600003E +:10AF90009986000021870000478300008985000012 +:10AFA00013120000C12100000B2200006F220000DC +:10AFB000F522000011240000D32400000525000024 +:10AFC000E3250000CB2600001F270000A12700007A +:10AFD000C1270000B92D0000DD2D0000FD2C000070 +:10AFE000592D00000F2E0000A32E00002F3D000061 +:10AFF000093E00003D4100003D420000B342000018 +:10B000001D4300008143000017120000754400003A +:10B01000E1440000E3270000E927000017120000C8 +:10B02000171200001712000017120000F32700008B +:10B030002B280000A12800001712000017120000A2 +:10B040002D22000087290000A9290000F529000011 +:10B05000131200001312000013120000131200005C +:10B06000EF5200007553000091530000AD530000F3 +:10B070003B550000D7530000E1530000235400006B +:10B0800045540000215500006355000013120000D4 +:10B0900013120000676E0000876E0000916E0000C2 +:10B0A000CB6E0000F96E0000E96F000077700000C1 +:10B0B0008B700000D9700000EF71000095730000E4 +:10B0C000BD740000E95D0000D5740000131200009B +:10B0D00013120000A1A0000003A200005DA2000066 +:10B0E000D7A2000083A30000100110013A02000063 +:10B0F0001A0200040506000007000000FFFFFFFF22 +:10B100000000FFFFE39C0000BF1C0000934E000006 +:10B11000335E0000E97A000000000000A17D00001D +:10B120007D7D00008F7D0000000002000000000017 +:10B13000000200000000000000010000000000000C +:10B14000136C0000F36B0000616C00007152000092 +:10B150003352000053520000219400003994000043 +:10B160004396000041370000816C000000000000A1 +:10B17000B16C0000BF5200000000000000000000A1 +:10B18000000000002395000000000000C13700000F +:10B19000555555D6BE898E0000006406640C6412B5 +:10B1A00000000803AC055008000054044408340CA7 +:10B1B00075DF0000DDE00000D7DE000073DF000077 +:10B1C0001B5D0100ABE1000000000000480800002A +:10B1D0004808000051350000513500009B21000057 +:10B1E000439B0000B7600000A34D0000F97301000D +:10B1F0008135000081350000BF210000D59B000093 +:10B200003F610000174E00000F74010070017001D3 +:10B21000400038005C002400200200000300656C40 +:10B220007462000000000000000000000000000048 +:10B230000000870000000000000000000000000087 +:10B240000000BE83605ADB0B376038A5F5AA9183F6 +:10B25000886C0000010000008B0801005D170100F0 +:10B2600000000001020603040500000007000000C2 +:10B2700000000000060000000A000000320000008C +:10B2800073000000B4000000F401FA0096006400AE +:10B290004B0032001E0014000A00050002000100ED +:10B2A0000041000000000000AB830100E5870100C1 +:10B2B0008F870100BD830100000000002989010083 +:10B2C0000C0802170D010102090901010602091803 +:10B2D00018030101090903030500000049A2010048 +:10B2E00061A2010079A2010091A20100C1A20100A6 +:10B2F000E9A2010013A3010047A30100C79F0100B9 +:10B30000039F010023A0010007AD01000D360100DD +:10B310001D360100493601001B37010023370100AB +:10B32000353701007FA0010099A001006DA0010048 +:10B3300077A00100A5A00100DBA00100ED9B0100AA +:10B34000FBA0010009A1010017A1010027A1010034 +:10B350003FA1010057A101006DA10100ED9B01007B +:10B3600000000000B7A900000DAA000023AA0000F9 +:10B37000D9A80100199C0100E59C0100D3AB010094 +:10B3800011AC01003BAC0100113401005D3901003A +:10B3900083A10100A9A10100CDA10100F3A1010039 +:10B3A0001C0500402005004000100200CCB3010045 +:10B3B00008000020980100004411000000B40100C2 +:10B3C000A0010020100E00008011000001150545AD +:10B3D000481000200519A40500203601000100884E +:10B3E0003720FB349B5F80041F8000100D9DCB092C +:10B3F0000020880900200E0A0020024810000000EA +:00000001FF