From 495624c79a8b7f2f05036ee78a05c47934ae5092 Mon Sep 17 00:00:00 2001 From: zhanli <719901725@qq.com> Date: Thu, 22 Aug 2024 20:12:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E6=A4=8D=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=88=B0dw1000,=E5=A2=9E=E5=8A=A0LED=E9=97=AA?= =?UTF-8?q?=E7=83=81=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 8 + .../UWB-TaoBao/Core/Inc/dw1000.h | 81 + .../UWB-TaoBao/Core/Inc/tim.h | 1 - .../UWB-TaoBao/Core/Src/dw1000.c | 140 + .../UWB-TaoBao/Core/Src/main.c | 228 +- .../UWB-TaoBao/Core/Src/stm32f1xx_hal_msp.c | 53 +- .../UWB-TaoBao/Core/Src/stm32f1xx_it.c | 30 - .../UWB-TaoBao/Core/Src/tim.c | 102 +- .../UWB-TaoBao/Drivers/Hardware/Led/led.c | 26 +- .../UWB-TaoBao/Drivers/Hardware/Led/led.h | 5 +- .../UWB-TaoBao/MDK-ARM/UWB-TaoBao.uvguix.x | 293 +- .../UWB-TaoBao/MDK-ARM/UWB-TaoBao.uvoptx | 80 +- .../UWB-TaoBao/MDK-ARM/UWB-TaoBao.uvprojx | 5 + .../MDK-ARM/UWB-TaoBao/UWB-TaoBao.axf | Bin 874272 -> 0 bytes .../UWB-TaoBao/UWB-TaoBao.build_log.htm | 55 - .../MDK-ARM/UWB-TaoBao/UWB-TaoBao.hex | 1428 -------- .../MDK-ARM/UWB-TaoBao/UWB-TaoBao.htm | 2377 ------------- .../MDK-ARM/UWB-TaoBao/UWB-TaoBao.lnp | 47 - .../MDK-ARM/UWB-TaoBao/UWB-TaoBao.map | 3109 ----------------- .../MDK-ARM/UWB-TaoBao/UWB-TaoBao.sct | 15 - .../UWB-TaoBao/UWB-TaoBao_UWB-TaoBao.dep | 1397 -------- .../MDK-ARM/UWB-TaoBao/deca_device.crf | Bin 64332 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_device.d | 8 - .../MDK-ARM/UWB-TaoBao/deca_device.o | Bin 114764 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_mutex.crf | Bin 653341 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_mutex.d | 36 - .../MDK-ARM/UWB-TaoBao/deca_mutex.o | Bin 715752 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_params_init.crf | Bin 58465 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_params_init.d | 8 - .../MDK-ARM/UWB-TaoBao/deca_params_init.o | Bin 47040 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_sleep.crf | Bin 653435 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_sleep.d | 37 - .../MDK-ARM/UWB-TaoBao/deca_sleep.o | Bin 715216 -> 0 bytes .../MDK-ARM/UWB-TaoBao/deca_spi.crf | Bin 637566 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_spi.d | 36 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_spi.o | Bin 712560 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/gpio.crf | Bin 636529 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/gpio.d | 35 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/gpio.o | Bin 708740 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/led.crf | Bin 636680 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/led.d | 34 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/led.o | Bin 710700 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/main.crf | Bin 721523 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/main.d | 56 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/main.o | Bin 796012 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/port.crf | Bin 640283 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/port.d | 37 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/port.o | Bin 723332 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/spi.crf | Bin 636024 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/spi.d | 35 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/spi.o | Bin 708860 -> 0 bytes .../MDK-ARM/UWB-TaoBao/startup_stm32f103xe.d | 1 - .../MDK-ARM/UWB-TaoBao/startup_stm32f103xe.o | Bin 6664 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal.crf | Bin 636630 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal.o | Bin 741336 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_cortex.crf | Bin 636092 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_cortex.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_cortex.o | Bin 731112 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_dma.crf | Bin 647700 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_dma.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_dma.o | Bin 729880 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_exti.crf | Bin 638250 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_exti.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_exti.o | Bin 720388 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_flash.crf | Bin 639975 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash.o | Bin 728324 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_flash_ex.crf | Bin 641223 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_flash_ex.d | 33 - .../UWB-TaoBao/stm32f1xx_hal_flash_ex.o | Bin 727700 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio.crf | Bin 639155 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio.o | Bin 719964 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_gpio_ex.crf | Bin 635292 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_gpio_ex.d | 33 - .../UWB-TaoBao/stm32f1xx_hal_gpio_ex.o | Bin 709716 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_msp.crf | Bin 637221 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_msp.d | 34 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_msp.o | Bin 714184 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd.crf | Bin 655426 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd.o | Bin 770528 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_pcd_ex.crf | Bin 635634 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd_ex.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd_ex.o | Bin 711320 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pwr.crf | Bin 638090 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pwr.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pwr.o | Bin 731352 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc.crf | Bin 647427 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc.o | Bin 730736 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_rcc_ex.crf | Bin 638008 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc_ex.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc_ex.o | Bin 711916 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_spi.crf | Bin 660967 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_spi.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_spi.o | Bin 796572 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim.crf | Bin 702013 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim.o | Bin 910208 -> 0 bytes .../UWB-TaoBao/stm32f1xx_hal_tim_ex.crf | Bin 662346 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim_ex.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim_ex.o | Bin 782112 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_uart.crf | Bin 663079 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_uart.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_hal_uart.o | Bin 808004 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_it.crf | Bin 636514 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_it.d | 36 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_it.o | Bin 722420 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_ll_usb.crf | Bin 662147 -> 0 bytes .../MDK-ARM/UWB-TaoBao/stm32f1xx_ll_usb.d | 33 - .../MDK-ARM/UWB-TaoBao/stm32f1xx_ll_usb.o | Bin 756908 -> 0 bytes .../MDK-ARM/UWB-TaoBao/system_stm32f1xx.crf | Bin 635496 -> 0 bytes .../MDK-ARM/UWB-TaoBao/system_stm32f1xx.d | 33 - .../MDK-ARM/UWB-TaoBao/system_stm32f1xx.o | Bin 708716 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/tim.crf | Bin 637129 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/tim.d | 35 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/tim.o | Bin 715632 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usart.crf | Bin 640522 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usart.d | 36 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usart.o | Bin 712444 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usb_device.crf | Bin 660957 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usb_device.d | 47 - .../MDK-ARM/UWB-TaoBao/usb_device.o | Bin 730232 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_conf.crf | Bin 665247 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_conf.d | 44 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_conf.o | Bin 773860 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_core.crf | Bin 661512 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_core.d | 43 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_core.o | Bin 753784 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_ctlreq.crf | Bin 663632 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_ctlreq.d | 43 - .../MDK-ARM/UWB-TaoBao/usbd_ctlreq.o | Bin 738720 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_custom_hid_if.crf | Bin 660931 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_custom_hid_if.d | 45 - .../MDK-ARM/UWB-TaoBao/usbd_custom_hid_if.o | Bin 729848 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_customhid.crf | Bin 664519 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_customhid.d | 44 - .../MDK-ARM/UWB-TaoBao/usbd_customhid.o | Bin 745112 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_desc.crf | Bin 661692 -> 0 bytes .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_desc.d | 44 - .../UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_desc.o | Bin 736876 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_ioreq.crf | Bin 659322 -> 0 bytes .../MDK-ARM/UWB-TaoBao/usbd_ioreq.d | 43 - .../MDK-ARM/UWB-TaoBao/usbd_ioreq.o | Bin 733016 -> 0 bytes .../MDK-ARM/startup_stm32f103xe.lst | 12 +- .../UWB-TaoBao/USB_DEVICE/App/usb_device.c | 33 +- .../UWB-TaoBao/USB_DEVICE/App/usb_device.h | 88 +- .../USB_DEVICE/App/usbd_custom_hid_if.h | 89 +- 150 files changed, 616 insertions(+), 10530 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/dw1000.h create mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/dw1000.c delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao.axf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao.build_log.htm delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao.hex delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao.htm delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao.lnp delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao.map delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao.sct delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/UWB-TaoBao_UWB-TaoBao.dep delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_device.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_device.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_device.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_mutex.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_mutex.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_mutex.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_params_init.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_params_init.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_params_init.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_sleep.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_sleep.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_sleep.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_spi.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_spi.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/deca_spi.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/gpio.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/gpio.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/gpio.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/led.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/led.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/led.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/main.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/main.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/main.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/port.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/port.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/port.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/spi.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/spi.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/spi.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/startup_stm32f103xe.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/startup_stm32f103xe.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_cortex.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_cortex.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_cortex.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_dma.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_dma.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_dma.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_exti.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_exti.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_exti.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash_ex.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash_ex.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_flash_ex.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio_ex.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio_ex.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_gpio_ex.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_msp.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_msp.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_msp.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd_ex.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd_ex.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pcd_ex.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pwr.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pwr.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_pwr.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc_ex.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc_ex.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_rcc_ex.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_spi.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_spi.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_spi.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim_ex.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim_ex.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_tim_ex.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_uart.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_uart.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_hal_uart.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_it.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_it.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_it.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_ll_usb.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_ll_usb.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/stm32f1xx_ll_usb.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/system_stm32f1xx.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/system_stm32f1xx.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/system_stm32f1xx.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/tim.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/tim.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/tim.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usart.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usart.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usart.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usb_device.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usb_device.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usb_device.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_conf.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_conf.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_conf.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_core.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_core.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_core.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_ctlreq.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_ctlreq.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_ctlreq.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_custom_hid_if.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_custom_hid_if.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_custom_hid_if.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_customhid.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_customhid.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_customhid.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_desc.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_desc.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_desc.o delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_ioreq.crf delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_ioreq.d delete mode 100644 Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/MDK-ARM/UWB-TaoBao/usbd_ioreq.o diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2439f3f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "files.associations": { + "spi.h": "c", + "port.h": "c", + "usbd_core.h": "c", + "tim.h": "c" + } +} \ No newline at end of file diff --git a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/dw1000.h b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/dw1000.h new file mode 100644 index 0000000..d8db30d --- /dev/null +++ b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/dw1000.h @@ -0,0 +1,81 @@ +/******************************************************************************* + * @filename : dw1000.h + * @brief : dw1000芯片测距 + * @author : zhanli + * @date : 2024/08/22 + *****************************************************************************/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DW1000_H__ +#define __DW1000_H__ + +#include "stm32f1xx_hal.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#define APP_NAME "KWS1000 UWB TWR v1.0" +/* Inter-ranging delay period, in milliseconds. */ +#define RNG_DELAY_MS 1000 + +/* 天线延迟参数: DW1000由于天线的延迟会导致测量距离存在一定的线性误差,可以调整这个 + 参数调节测距误差,直到和实际距离值符合*/ +#define TX_ANT_DLY 16550 // 天线发送延迟参数 +#define RX_ANT_DLY 16550 // 天线接收延迟参数 + +/* Length of the common part of the message (up to and including the function code */ +#define ALL_MSG_COMMON_LEN 10 +/* Indexes to access some of the fields in the frames defined above. */ +#define ALL_MSG_SN_IDX 2 +#define FINAL_MSG_POLL_TX_TS_IDX 10 +#define FINAL_MSG_RESP_RX_TS_IDX 14 +#define FINAL_MSG_FINAL_TX_TS_IDX 18 +#define Hand_MSG_1_IDX 10 // 手持标签配置参数 +#define Hand_MSG_2_IDX 12 // 手持标签配置参数 +#define Hand_MSG_3_IDX 14 // 手持标签配置参数 +#define FINAL_MSG_TS_LEN 4 +#define Hand_MSG_LEN 2 // 手持标签消息长度 +#define LOCAL_MSG_IDX 10 +/* Buffer to store received response message.Its size is adjusted to longest + * frame that this example code is supposed to handle. */ +#define RX_BUF_LEN 24 // 接收缓存Buff的长度 +#define TAG_IDX 8 // 标签索引在Buffer中的位号 +/* UWB microsecond (uus) to device time unit (dtu, around 15.65 ps) conversion + * factor. 1 uus = 512 / 499.2 ?s and 1 ?s = 499.2 * 128 dtu. */ +#define UUS_TO_DWT_TIME 65536 +/* This is the delay from the end of the frame transmission to the enable of + the receiver, as programmed for the DW1000's wait for response feature. */ +#define POLL_RX_TIMEOUT_UUS 3000 +#define BLINK_TX_TO_POLL_RX_DLY 500 +/* This is the delay from Frame RX timestamp to TX reply timestamp used for + * calculating/setting the DW1000's delayed TX function. This includes the + * frame length of approximately 2.46 ms with above configuration. */ +#define BLINK_TX_TO_RESP_TX_DLY_UUS 4000 * TAG_NUM +/* This is the delay from the end of the frame transmission to the enable of + * the receiver, as programmed for the DW1000's wait for response feature. */ +#define RESP_TX_TO_FINAL_RX_DLY_UUS 500 +/* Receive final timeout. */ +#define FINAL_RX_TIMEOUT_UUS 3300 +/* Preamble timeout, in multiple of PAC size. */ +#define PRE_TIMEOUT 8 +#define SPEED_OF_LIGHT 299702547 + +#define BLINK_RX_TO_POLL_TX_DLY_UUS 2750 + + +void InitDW1000(void); + +uint64_t get_tx_timestamp_u64(void); +uint64_t get_rx_timestamp_u64(void); +void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts); +void final_msg_set_ts(uint8_t *ts_field, uint64_t ts); +void hand_msg_set(uint8_t *dis_field, uint16_t dis); +void hand_msg_get(const uint8_t *dis_field, uint16_t *dis); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/tim.h b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/tim.h index fa28c52..e38293d 100644 --- a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/tim.h +++ b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Inc/tim.h @@ -22,7 +22,6 @@ void TIM3_Init(void); void TIM4_Init(void); void delay_us(uint16_t us); - #ifdef __cplusplus } #endif diff --git a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/dw1000.c b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/dw1000.c new file mode 100644 index 0000000..2696d36 --- /dev/null +++ b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/dw1000.c @@ -0,0 +1,140 @@ +/******************************************************************************* + * @filename : dw1000.c + * @brief : dw1000芯片测距 + * @author : zhanli + * @date : 2024/08/22 + *****************************************************************************/ +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" +#include "deca_device_api.h" +#include "dw1000.h" +#include "port.h" +#include "stdio.h" + +dwt_config_t config = { + 2, /* Channel number. */ + DWT_PRF_64M, /* Pulse repetition frequency. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 1, /* 0 to use standard SFD, 1 to use non-standard SFD. */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + (128 + 1 + 8 - 8) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */ +}; + + +void InitDW1000(){ + /* 重置和初始化DW1000, 初始化时,DW1000时钟必须暂时设置为晶振速度,初始化后,可以增加 + * SPI速率以获得最佳性能 */ + reset_DW1000(); + // 降低DW1000的SPI速率 + port_set_dw1000_slowrate(); + if (dwt_initialise(DWT_LOADUCODE) == DWT_ERROR){ + printf("DW1000 init failed.\r\n"); + }else{ + printf("DW1000 init success.\r\n"); + } + // 恢复DW1000的SPI速率 + port_set_dw1000_fastrate(); + /* 配置DW1000 */ + dwt_configure(&config); + // 配置DW1000的天线延迟参数 + dwt_setrxantennadelay(RX_ANT_DLY); + dwt_settxantennadelay(TX_ANT_DLY); + printf("DW1000 is configured.\r\n"); +} + +/** + * @fn get_tx_timestamp_u64() + * @brief 获取64bit TX时间戳变量,数假设发送还是接收时的时间戳的长度为40位 + * @param none + * @return 64-bit 读取时间戳. + */ +uint64_t get_tx_timestamp_u64(void) +{ + uint8_t ts_tab[5]; + uint64_t ts = 0; + int i; + dwt_readtxtimestamp(ts_tab); + for (i = 4; i >= 0; i--) + { + ts <<= 8; + ts |= ts_tab[i]; + } + return ts; +} + +/** + * @fn get_rx_timestamp_u64() + * @brief 获取64bit RX时间戳变量,数假设发送还是接收时的时间戳的长度为40位 + * @param none + * @return 64-bit 读取时间戳. + */ +uint64_t get_rx_timestamp_u64(void) +{ + uint8_t ts_tab[5]; + uint64_t ts = 0; + int i; + dwt_readrxtimestamp(ts_tab); + for (i = 4; i >= 0; i--){ + ts <<= 8; + ts |= ts_tab[i]; + } + return ts; +} + +/** + * @fn final_msg_set_ts() + * @brief Fill a given timestamp field in the final message with the given value. + * In the timestamp fields of the final message, the least significant + * byte is at the lower address. + * @param ts_field pointer on the first byte of the timestamp field to fill + * ts timestamp value + * @return none + */ +void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts) +{ + *ts = 0; + for (int i = 0; i < FINAL_MSG_TS_LEN; i++){ + *ts += ts_field[i] << (i * 8); + } +} + +void hand_msg_get(const uint8_t *dis_field, uint16_t *dis) +{ + *dis = 0; + for (int i = 0; i < Hand_MSG_LEN; i++){ + *dis += dis_field[i] << (i * 8); + } +} +void final_msg_set_ts(uint8_t *ts_field, uint64_t ts) +{ + for (int i = 0; i < FINAL_MSG_TS_LEN; i++) + { + ts_field[i] = (uint8)ts; + ts >>= 8; + } +} + +void hand_msg_set(uint8_t *dis_field, uint16_t dis) +{ + for (int i = 0; i < Hand_MSG_LEN; i++){ + dis_field[i] = (uint8)dis; + dis >>= 8; + } +} + +void MsgSetData(uint8_t *msg, uint16_t dis, int len){ + for (int i = 0; i < Hand_MSG_LEN; i++){ + msg[i] = (uint8)dis; + dis >>= 8; + } +} +void MsgGetData(const uint8_t *msg, uint16_t *data, int len){ + *data = 0; + for (int i = 0; i < len; i++){ + *data += msg[i] << (i * 8); + } +} diff --git a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/main.c b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/main.c index a5da861..9849ef9 100644 --- a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/main.c +++ b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/main.c @@ -12,6 +12,7 @@ #include "spi.h" #include "tim.h" #include "usbd_customhid.h" +#include "dw1000.h" // Decawave相关头文件 #include "deca_device_api.h" #include "deca_regs.h" @@ -19,7 +20,6 @@ #include "port.h" /* Private includes ----------------------------------------------------------*/ -/* Private typedef -----------------------------------------------------------*/ uint8_t report[64]; // USBHid发送缓存 /* Private define ------------------------------------------------------------*/ @@ -30,123 +30,35 @@ uint8_t report[64]; // USBHid发送缓存 uint8_t Car_moving = 1; // 当前的工作模式 0 : 接收和发送手持标签信息 // 1 : 接收自身和基站距离信息 uint8_t ReInitDW1000Flag = 0; -#define APP_NAME "KWS1000 UWB TWR v1.0" -/* Inter-ranging delay period, in milliseconds. */ -#define RNG_DELAY_MS 1000 -#define TX_ANT_DLY 16550 // 天线发送延迟参数 -#define RX_ANT_DLY 16550 // 天线接收延迟参数 -/* Length of the common part of the message (up to and including the function code */ -#define ALL_MSG_COMMON_LEN 10 -/* Indexes to access some of the fields in the frames defined above. */ -#define ALL_MSG_SN_IDX 2 -#define FINAL_MSG_POLL_TX_TS_IDX 10 -#define FINAL_MSG_RESP_RX_TS_IDX 14 -#define FINAL_MSG_FINAL_TX_TS_IDX 18 -#define Hand_MSG_1_IDX 10 // 手持标签配置参数 -#define Hand_MSG_2_IDX 12 // 手持标签配置参数 -#define Hand_MSG_3_IDX 14 // 手持标签配置参数 -#define FINAL_MSG_TS_LEN 4 -#define Hand_MSG_LEN 2 // 手持标签消息长度 -#define LOCAL_MSG_IDX 10 -/* Buffer to store received response message.Its size is adjusted to longest - * frame that this example code is supposed to handle. */ -#define RX_BUF_LEN 24 // 接收缓存Buff的长度 -#define TAG_IDX 8 // 标签索引在Buffer中的位号 -/* UWB microsecond (uus) to device time unit (dtu, around 15.65 ps) conversion - * factor. 1 uus = 512 / 499.2 ?s and 1 ?s = 499.2 * 128 dtu. */ -#define UUS_TO_DWT_TIME 65536 -/* This is the delay from the end of the frame transmission to the enable of - the receiver, as programmed for the DW1000's wait for response feature. */ -#define POLL_RX_TIMEOUT_UUS 3000 -#define BLINK_TX_TO_POLL_RX_DLY 500 -/* This is the delay from Frame RX timestamp to TX reply timestamp used for - * calculating/setting the DW1000's delayed TX function. This includes the - * frame length of approximately 2.46 ms with above configuration. */ -#define BLINK_TX_TO_RESP_TX_DLY_UUS 4000 * TAG_NUM -/* This is the delay from the end of the frame transmission to the enable of - * the receiver, as programmed for the DW1000's wait for response feature. */ -#define RESP_TX_TO_FINAL_RX_DLY_UUS 500 -/* Receive final timeout. */ -#define FINAL_RX_TIMEOUT_UUS 3300 -/* Preamble timeout, in multiple of PAC size. */ -#define PRE_TIMEOUT 8 -#define SPEED_OF_LIGHT 299702547 -#define BLINK_RX_TO_POLL_TX_DLY_UUS 2750 /* Private variables ---------------------------------------------------------*/ uint8_t uartRxBuffer[20]; uint8_t buff[100], buff_idx = 0, buff_done = 0, buff_len = 0; uint8_t flag_10ms = 0, flag_100ms = 0, flag_500ms = 0, flag_1s = 0, counter = 0; -dwt_config_t config = { - 2, /* Channel number. */ - DWT_PRF_64M, /* Pulse repetition frequency. */ - DWT_PLEN_128, /* Preamble length. Used in TX only. */ - DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ - 9, /* TX preamble code. Used in TX only. */ - 9, /* RX preamble code. Used in RX only. */ - 1, /* 0 to use standard SFD, 1 to use non-standard SFD. */ - DWT_BR_6M8, /* Data rate. */ - DWT_PHRMODE_STD, /* PHY header mode. */ - (128 + 1 + 8 - 8) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */ -}; - -uint64_t get_tx_timestamp_u64(void); -uint64_t get_rx_timestamp_u64(void); -void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts); -void final_msg_set_ts(uint8_t *ts_field, uint64_t ts); -void hand_msg_set(uint8_t *dis_field, uint16_t dis); -void hand_msg_get(const uint8_t *dis_field, uint16_t *dis); - /* External variables --------------------------------------------------------*/ extern USBD_HandleTypeDef hUsbDeviceFS; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); - -void InitDW1000(){ - /* 重置和初始化DW1000, 初始化时,DW1000时钟必须暂时设置为晶振速度,初始化后,可以增加 - * SPI速率以获得最佳性能 */ - reset_DW1000(); - // 降低DW1000的SPI速率 - port_set_dw1000_slowrate(); - if (dwt_initialise(DWT_LOADUCODE) == DWT_ERROR){ - printf("DW1000 init failed.\r\n"); - }else{ - printf("DW1000 init success.\r\n"); - } - // 恢复DW1000的SPI速率 - port_set_dw1000_fastrate(); - /* 配置DW1000 */ - dwt_configure(&config); - // 配置DW1000的天线延迟参数 - dwt_setrxantennadelay(RX_ANT_DLY); - dwt_settxantennadelay(TX_ANT_DLY); - printf("DW1000 is configured.\r\n"); -} - /** * @brief The application entry point. * @retval int */ int main(void) { - uint32_t frame_len; + uint32_t frame_len; int ret; uint32_t resp_tx_time; uint32_t poll_tx_ts[TAG_NUM], resp_rx_ts[TAG_NUM], final_tx_ts[TAG_NUM], poll_rx_ts_32, resp_tx_ts_32, final_rx_ts_32; uint16_t dis0,dis1,dis2; // 接收到手持标签与其他标签之间的距离 double tof, distance; double Ra, Rb, Da, Db; - uint16_t dis[TAG_NUM]; int64_t tof_dtu; -#if 1 - -#endif /* Frames used in the ranging process. * The first 10 bytes of those frame are common and are composed of the following fields: * - byte 0/1: frame control (0x8841 to indicate a data frame using 16-bit addressing). @@ -196,34 +108,22 @@ int main(void) SystemClock_Config(); /* 初始化外设 */ GPIO_Init(); - LED_GPIO_Configuration(); + LED_GPIO_Config(); TIM3_Init(); TIM4_Init(); SPI1_Init(); USART1_Init(); /* USB设备初始化,用于USBHid数据通信 */ - MX_USB_DEVICE_Init(); - + USB_DEVICE_Init(); + /* 初始化DW1000芯片 */ InitDW1000(); /* 定时器和串口参数配置 */ // 使能定时器3中断 - printf("init timer\r\n"); HAL_TIM_Base_Start_IT(&htim3); - printf("init timer finish\r\n"); /* DW1000的初始化配置 */ // 串口打印程序版本信息 -// while (1) -// { -// Led_On(LED_ALL); -// HAL_Delay(100); -// Led_Off(LED_ALL); -// HAL_Delay(100); -// printf("Hello world !\r\n"); -// } - flag_100ms = 1; - printf("start\r\n"); while(1) { if(ReInitDW1000Flag){ @@ -487,7 +387,7 @@ int main(void) } /** - * @brief System Clock Configuration + * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) @@ -544,97 +444,7 @@ void UsbSendPackageReport(package_t* pack, uint8_t* report){ USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, 64); } -/** - * @fn get_tx_timestamp_u64() - * @brief 获取64bit TX时间戳变量,数假设发送还是接收时的时间戳的长度为40位 - * @param none - * @return 64-bit 读取时间戳. - */ -uint64_t get_tx_timestamp_u64(void) -{ - uint8_t ts_tab[5]; - uint64_t ts = 0; - int i; - dwt_readtxtimestamp(ts_tab); - for (i = 4; i >= 0; i--) - { - ts <<= 8; - ts |= ts_tab[i]; - } - return ts; -} -/** - * @fn get_rx_timestamp_u64() - * @brief 获取64bit RX时间戳变量,数假设发送还是接收时的时间戳的长度为40位 - * @param none - * @return 64-bit 读取时间戳. - */ -uint64_t get_rx_timestamp_u64(void) -{ - uint8_t ts_tab[5]; - uint64_t ts = 0; - int i; - dwt_readrxtimestamp(ts_tab); - for (i = 4; i >= 0; i--){ - ts <<= 8; - ts |= ts_tab[i]; - } - return ts; -} -/*! ------------------------------------------------------------------------------------------------------------------ - * @fn final_msg_set_ts() - * - * @brief Fill a given timestamp field in the final message with the given value. In the timestamp fields of the final - * message, the least significant byte is at the lower address. - * - * @param ts_field pointer on the first byte of the timestamp field to fill - * ts timestamp value - * - * @return none - */ -void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts) -{ - *ts = 0; - for (int i = 0; i < FINAL_MSG_TS_LEN; i++){ - *ts += ts_field[i] << (i * 8); - } -} -void hand_msg_get(const uint8_t *dis_field, uint16_t *dis) -{ - *dis = 0; - for (int i = 0; i < Hand_MSG_LEN; i++){ - *dis += dis_field[i] << (i * 8); - } -} -void final_msg_set_ts(uint8_t *ts_field, uint64_t ts) -{ - for (int i = 0; i < FINAL_MSG_TS_LEN; i++) - { - ts_field[i] = (uint8)ts; - ts >>= 8; - } -} -void hand_msg_set(uint8_t *dis_field, uint16_t dis) -{ - for (int i = 0; i < Hand_MSG_LEN; i++){ - dis_field[i] = (uint8)dis; - dis >>= 8; - } -} - -void MsgSetData(uint8_t *msg, uint16_t dis, int len){ - for (int i = 0; i < Hand_MSG_LEN; i++){ - msg[i] = (uint8)dis; - dis >>= 8; - } -} -void MsgGetData(const uint8_t *msg, uint16_t *data, int len){ - *data = 0; - for (int i = 0; i < len; i++){ - *data += msg[i] << (i * 8); - } -} /** * @brief 当 TIM 时间基准周期已经过去时调用此函数。 * @param htim: 指向 TIM_HandleTypeDef 结构体的指针,包含了TIM模块的 @@ -647,12 +457,14 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { flag_10ms = 1; counter++; - if (counter % 10 == 0) - flag_100ms = 1; - if (counter % 50 == 0) - flag_500ms = 1; - if (counter % 100 == 0) - { + if (counter % 10 == 0){ + flag_100ms = 1; + Led_Toggle(LED_PC6); + } + if (counter % 50 == 0){ + flag_500ms = 1; + } + if (counter % 100 == 0){ flag_1s = 1; counter = 0; } @@ -665,12 +477,13 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) */ void Error_Handler(void) { - /* User can add his own implementation to report the HAL error return state */ + /* User can add his own implementation to report the HAL error + return state + */ __disable_irq(); while (1) { } - /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT @@ -683,7 +496,8 @@ void Error_Handler(void) */ void assert_failed(uint8_t *file, uint32_t line) { - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* User can add his own implementation to report the file name and line + number, ex: printf("Wrong parameters value: file %s on line %d\r\n", + file, line) */ } -#endif /* USE_FULL_ASSERT */ +#endif diff --git a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_hal_msp.c b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_hal_msp.c index 51e3d4d..1e2291c 100644 --- a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_hal_msp.c +++ b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_hal_msp.c @@ -4,6 +4,8 @@ * @brief MSP(MCU Support Package)主要负责硬件相关的初始化工作,如 UART、 * I2C、SPI、ADC 等)的底层硬件资源的配置。MSP 初始化主要涉及 GPIO * 引脚、时钟、DMA 和中断的配置。 + * @author zhanli + * @date 2024/08/22 ******************************************************************************/ /* Includes ------------------------------------------------------------------*/ @@ -12,6 +14,7 @@ void HAL_MspInit(void) { __HAL_RCC_AFIO_CLK_ENABLE(); + // 开启RCC实时时钟 __HAL_RCC_PWR_CLK_ENABLE(); } @@ -120,10 +123,58 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) /* Peripheral clock disable */ __HAL_RCC_USART1_CLK_DISABLE(); - /**USART1 GPIO Configuration + /**USART1 GPIO 配置 PA9 ------> USART1_TX PA10 ------> USART1_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); } } + +/** +* @brief : TIM MSP初始化 +* @param tim_baseHandle: TIM handle pointer +* @author : zhanli +* @date : 2024/08/22 +* @retval : None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM3){ + /* TIM3 clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + + /* TIM3 interrupt Init */ + HAL_NVIC_SetPriority(TIM3_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(TIM3_IRQn); + } + else if(tim_baseHandle->Instance==TIM4) + { + /* TIM4 clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + } +} +/** +* @brief : TIM MSP反初始化 +* @param tim_baseHandle: TIM handle pointer +* @author : zhanli +* @date : 2024/08/22 +* @retval : None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) +{ + if(tim_baseHandle->Instance==TIM3) + { + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + + /* TIM3 interrupt Deinit */ + HAL_NVIC_DisableIRQ(TIM3_IRQn); + } + else if(tim_baseHandle->Instance==TIM4) + { + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + } +} diff --git a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_it.c b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_it.c index 0778fe8..9a8161c 100644 --- a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_it.c +++ b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/stm32f1xx_it.c @@ -25,10 +25,6 @@ /* External variables --------------------------------------------------------*/ extern PCD_HandleTypeDef hpcd_USB_FS; -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - /** * @brief This function handles TIM3 global interrupt. @@ -47,14 +43,9 @@ void TIM3_IRQHandler(void) */ void NMI_Handler(void) { - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ while (1) { } - /* USER CODE END NonMaskableInt_IRQn 1 */ } /** @@ -122,12 +113,7 @@ void UsageFault_Handler(void) */ void SVC_Handler(void) { - /* USER CODE BEGIN SVCall_IRQn 0 */ - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ } /** @@ -135,12 +121,6 @@ void SVC_Handler(void) */ void DebugMon_Handler(void) { - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ } /** @@ -182,15 +162,5 @@ void SysTick_Handler(void) */ void USB_LP_CAN1_RX0_IRQHandler(void) { - /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */ - - /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */ HAL_PCD_IRQHandler(&hpcd_USB_FS); - /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */ - - /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */ } - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/tim.c b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/tim.c index c3d01cf..807f110 100644 --- a/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/tim.c +++ b/Firmware/UWB-TaoBao-HAL-TAG/UWB-TaoBao/Core/Src/tim.c @@ -1,22 +1,9 @@ -/** - ****************************************************************************** - * File Name : TIM.c - * Description : This file provides code for the configuration - * of the TIM instances. - ****************************************************************************** - * @attention - * - *
+>C8ICtk7sU4w;<{@w;;haE=|jswpgAe6)^o z@T-mVpQU1iOVYzDzy6X0v;9=^KCKFWvNakruCYu1(#z6d4kEkd{wl_(RwP8oUj08s$};Ptc+DP;+%n9 zEUkiFaq&vQHm0)j`uWGz{W;P@_TX4WdWfII+{e{dcysK?x}e-x$;oo~Mx|k$+Szu% z;+~3pEN-$p^70Fji}wZ1N(e2oP$6i0@XsyMLl-(Jd^D(PZ$8wcy?vp$_TC=)qEmXv z^D33$y+-3C-Tbr!oMA;FPs!%(|g ~$a#pgk5NlI_ zK0WZn@@0h|AMh0N5mt7-9qpQ74hNq}Yl}QR7zxoDqvKGt1r|Ls7dIE$@U~%BX@3r_ z%srpOhgtkJ@MY{Y$J91{An{#oR-R1!+ndxD2(vbY`QS}j=^6u%zZ4$u72X#rXxXhk z&zsy!we^U2!*SRzn<$*gWBe3TOqen+_SV7cmDp+1njiYCpPVT;5_tRo%_owH+Xr)$ zD0Z*ToiX)ibKie;k1zY< ^Lv uYoCKD%;cd!0Q-A?s+oRy^72Lf-aKjx|DbZataPG3;h zMYt8-I7cWowKu6R l+?N04xZ3@ z&X Mwa%55HU8%RAx|IGoWa%|Od=!0$)3HLYw|ez=wN$l@=kYNsB0 zxA$BsRM`9XPNV*fsroM(l1M?SbpIQ~YZTlITALcl;ZIVzX1rmK@Zkj!U- W%o4f|eZWkzQr!ujuSmrd+gm zS45CY!(8c%6VwKIcUsKk&Wg>@TF$|XrI>Bg$(3Z{d#``eVv_0t& * z;7K|0058U*GA`yR3zOzt&w%Ikm@&g5C)%gn4L@v(d+u0!>srygc4}!dkuh+mBFK%6 zCtf|)c 3twM zPkFzQn=%Jh^!!Y2iV)+cVC8elw01$+9^hQ;jL40~NP`=ntBnS@GE *jh}^BLN=i)462g>Wf)Qbt6}r-rlDEcv&{(1Z@$tEuc+%&Fo@1WD;+n zRK1kSl}xxV_F#Q2?xkC5jtHA<+vbP|O!k;G1#+2E+fM!~TiyZt-&6UN(ss`4;M|s2 zZ6tP(bC*GbH?> >Q)(OMzB;2N zS}Me1jgD6d`{E$|D*dYzJ^!DPe_4BN 5EN8U*mI0h!>7-bUFtKiEa{JnI6pvy9 zog3Ok@)&eV8Y_NLj_b&q!71GNpKat_nSnBeVzZ1`X77lGq=O^UoAc(RDHD{Kx`JzK z8HqQa|JhbA=vy=nUcrej4ktC3G97Z)ed>e#xCf|Nac%!xO};c@7bEF1B#FH~3G-i% zdvyD=;F|;2JYbVMvt8Q8xzkQ`K)&09Zg~2Wjhx@oPG@fK?8jLIyxscPzLLh@uUqMU zM!Yf|mRqitlw;j8C)e{HdecaZD|-m`0eP2g#a SbS+--f?Sa1?{2=nQ%G&s87VhZ^n>5XvQswQAj_v7As1%6l<<9cc+hP zQN^~YaW4HQDtr6#7<(#4e0y<(P5V|%E4}Tmu0@Niv@YA0-X)|j>awSUi#DQ2r7^{& ztjBH)g(rIE >48z;v(EBM@!1u0Cf)k~Q?RLW$O!cDct(h*zY80%@k-5o)x zR}46tB Jux*+nR5^^>3_3wv2;D=LNX#EW`0+?d3;pY+Dbv} zV2Z4e28(ez+-@T6*&=l FpOr^vDHE}( z9nGH)O%`+-@?I|t%i6BVdMM^gTG06LT<_W0<5`}Ek|uh>o%%ZsGAnjm>meBxJ2ap2 z81*BtPyf?udbB2DkHEqnO5Ff3!Q#xYHVauIogHw;*j44KD_ql6Sy_d!`BQ=>d#(XJ zSJ)2fuJFS+SEpmI(y$sglFKubIFU3hVf8hgF92L36(|owF0R1+dal4E&veQa&}d;t zAf3yEBwe-ZaXyyb6FqY%zSfAhabpQ~XeX9;T#=(M(ar>)lfY3Ka!wlJ$d=;hNGC~z z9*k~q<`%0b(S|6uoo4jf8Qh+myqH<1(v%;vf8)Sw3m~ 6}wL)@?UW(J tmez-k5eK_px7w+@VJ?v#`idx15gf7^&j))Hs~IieMkt zQEkDk5r?w^>p_mq9axjDAAR!R0qjD^p%9CIy$`VrBLv)k;AmaDKI3HRx(43^pOhlE zlR3!Ja~%E>gfFEUifrtl8wq8xa%H%LkvkRIKE-tFCmU^NQ~MOSuj{lbOIkLHXH$C= zVrqW^r=?Om5jF)^jZQv$5;UdkvBWj;yl&S)j8cf>%)Vf#96KhZA@@40dVNAQ _hgVZBm>I`YI-?F?VsxXN42LrEmy}TUBc)8RwLLgPHALV_O-pb zRlt&ICkZzavPe%3acrq}`{iH%S_Z3e(azr*y4huCC4fj1WtxTYj&C18eP);K`nS$~ zu-XRb&sMOnj#otJFTaUsl|{%_>0Zm_w=2Ghdo69+y%w>t61Q0FirDDsVIHgE6Wg@g zEn=exJnd|~rp$Wnt1O@tJ7} QtHKoAFrJcQr{DUb3+ J`2TZ}chQ_R zTP6rA)R?!fcX=*Yxaok8UGyT9*Wx*AUCk+8{8Czq`DdhLcw2E>S#T2eYCyYRpNstW z$e6D<3BJESYw9%2u>`EWj-HCYqIpxN&R -0iyVI6QK`lp z;vU0_6fX-}+^CBtm!4|sMV1OpzG&B^LwRG^f17qXS+i^Z4=@vB6LFFkGvwRlwC^`n z))%fX#5rsC`Sy(cZkk~{#U>v{-72e@V)f^#+)dJTe4i;U`V#F@WV(B7J8)T*alu;V z&Wvq{U&Tw2<}>A-tu+0F*xktS-Co?8;>7yGvz_)m^@X*n@NIh&mGEJ#9`{E>nBi^3 z8lPVJ`oa~8{rfd>yN!F-{xoy*pL%@LoV;?aS?HMJd=kAk=QJt3Rv{)i6P=IC;x984 z=IrYn&Xee@mirU;C(CD8RBk+TC)$63Z$7Xyk}YE8j^q5gcx*oZ?|Zv#j44ct%51Vl z5%=CMx7|UtUtjoe;jQy8d?qO6lED#1k=$N -j@{;o44{ zn`3mYgki?T; -$YQeXtj+V@z(hiWeLZFLvyJRnwKKd2w4Qi6+CV`*LSu6yFZ z%f9}PX%&G(+@D{gJw=Rh?-FEl#Ix;zY8w9>lX2H69Ef;|-Z>ylyFX@~wk5`-jSIHR z|FO*xWK+1%eKBVb=A(7a2OBnVq3_Dr5u3>as_F5}GIeoYoP4NbP60OH=$|M1E(lud z8t5y>3{W1tt0qt#xnrp+Nml0+q#5js+_9?KzA8 Hc%Pv!sTzW?ZSq{83t zbGS})de3@Upkey~Nu%&o-^`kHXR$Odi0^##S-WK>IJY+zqvY*<&D&~Qlx z^K4&D++-sgF~f(IT0LFafz=Vn4(GhLdqqD&IXH!Z^WSKPGx@G6;GElP;_7O?s{z=$ zZMem-nmH$cR-msL`&**_ 11 =3hElFs&9~M4XBuxpYaWVmThls &^P%aUr7u9&rcW2!3QOo<*|*K1LNRsrX2s1`Wu zzn%Q<`|z-Ktp~dwcO|K1IaQQXhx1CF#!bvg`pyUDSOD^ctVz!0+ Gb)5L@RSVkLS! g4CYWL}zCfN+ljzai&Dm(_^58tG9We+?mi@&GV^hCFo$qL3GXd$RGS@p-N zVs*q!u)t(uUy@nv9m&MM3^qf4Ww1m_aa5%fs3aA~A;o3V JC<5&dF(CdN3;z!fra}8jmjJ>c|6AK70l0FzJd%u6#iE9LAY>=D|8{rsfSF zMj4Jn$wXT}wLKcM+>Q~5MYDvBYBKQ*@Oqurp`OXanTu328jGw}`BdA(Xic*Rj9^Nf z@^-7xk-aeL ~vY1oh+Gg|reDpz7waQZ%#j?O7N zT8VFr*|Z$pgA8l>4A#)n?a8vlu+yu_j5IL*utT#WScQ~hhmFAYbc@VaH5)9xSN`+z z9Q(>bVM^a;WRJx%*`rOJ+iKP9m;X80AE#!54%uAWkj>drHkXmIwXe3jt1pVMfIOM6 zIDqp{))Q&+_9CZDt+PX0L+7xL&e$%qx9jLk0blrdH^}+z&^)#2U%aW;6>TuEW7To? zFP`+^vclquw17}{;WNsYi#|8GnZph_kAC%3FWXbtdJOV;2r{222hm=>Gbq6Rr}6W< z^47Ze^i_F&Pf-GGtW 8exp`Cj_v5>f4aZ7`MRH5kL|$shI*ST zQlY-)jPu`lDC^i0xFwwL>U(k8-hSMR%X1CBcr!vtHP6-m;v$6lpqYhD)M}0AC(@Iu zz&)v&ITJz_u0OGEU?4GOpg(b{e;_fvZy>Q8@S}L{yEu^O8N_}VaBuW}(M)$V{}Z!| zZzcbZaBkn(MVzFB&mf%9mvN?mD|^~DUK~H}>EfpDDsRNr!kpgl>8iE}=l*7UC%)ms z+z(>3VgH%1k4+r4JY%`1Fx}nz*}^?fs(;65x$OY%+ QA}CUy;2WXY$J-%Up4U2<5M+yRf`(_>#BWKIWC z-9Lcyj9d#W#DqOi`(AjJ0VchmmIt0x%OIU{W_MNWvqNS()#$6qL{_r!XMFcNyzew_ zb}6rEeIZ8BgSa<$F`0O0fSdFid}S(`=mr()ZS>Oo1Cp;d<`GIen3H(Ok~rm^lkc6x z?YtBpGrz>g+5vD81{by9qSoNTt8wxBLE_?fDK5UB;$j)N7!NLX4BTI6n*Q2nyBFl+ zJ9E`%&_*oYt{m{QV}RuN$bjd<=anQ!@aL-BN77n1NOGjm{evd_o*dxZH}y>Vm5%$5 zi-s(JG`ONEEL=ZAl4DXeXumj8k^&?tXp+o_By%9ie8#(`?GyI)CH|CjzeXjN3`ug< zUe^66XPZ#ACz+@iyfFoh19ZdS)hVbL(A9&Ya%ZZxpA94vFZCxA>5%zh*@N25&}9C{ zi#pG{F6uJBZUnDKpbygeH@?K{FE75J=0n;!kam8p!Rg}~r=v7Zb!ii)kEJ;M&jI3; zAma4Y0C7qXae8t &P)#Dq`MK`9Mq$v&0Fd=ZJ}^%atUj~gKeY!#CLI5 z^y rXtQX3A!HnY>b-@_n|aFL8cwp1e@*OPm=jlV{=m zx4}kvUK54q%GH3MNYa ggU#`sI1g^(FqE>`y$a_9yOE7cE%4urIMCSrgy0 zY#~A$lFYRL?|bmB#=C8>Kk;>S`+=o<>k1_`Px3+^6|7k`N&e=+#5>9QLetdb1@EtX zi~P;b$Y7#1IltPAv!uU3f1reK(0tLuJum-)T5j4!`aRr#!{TdF{-mzo6=C=iV7C7P zT5{D0tNI=+j;yM-e`E`Apatx}?$?vJ#lpK5?Q_8LR}Xq#GwsVbvw$TNjsbpOF4Dk$ zfms5Kb)XgB*ZGBN -O9qu&LwEz(YQptOJOrO_5n zI$%^L0sdVtjV4L*uN>Cz$i^!t;AGw|IVuwm?Y+cr)?(t;jr70j1)o>Xl6|mw5%IV5 z{pi3fobxv$T+>H9P^#y39v&O!0beLF31*8`wAs_rGcvOr4pJHYafl$i5!Nxx%$R2t zW6i4s)^@MRqIfGe6*1+TMa+te&Z5~P+8iE{-s5rkjh>=OUz_yC8z)}3?&Bwh8-LK~ zafr;$Ml+6C@bK(0_9VNW70g)13T8dW3g(RG3a+__T{q(mcHOKyx$EY9kH793eEsaU zJ-2l&{f@6_e%^Ez?ONL7o;gdI7rsH6cXZCqDM#nboON{0(K)}YROZ#r{ZV=CTpVd# zLD!6M_J+eLDtz-d{Wi=~VSCLPjMY~#OsevDK5wGU#_>4~xo67r#L^k##5qF2QlVg@ zQ1EVE!GJJEFxiA0Zmc_dv}cD uKO^ zLdNW;`8HR5o>XTYC*C0xtQAW4Y 3A=i7APb|1AJ@@>yaiU2)Qt*98 z!IMJ4PlSR7A y+3KaI1RIcsTwt!U~3^HjUb zJaylSP{E8`yJaR{=E=|f!tRqeC%Y;O=I=zsO&rIKsveEXm$0<78`DgXhB=!vi4( {xoER5NP0Y5V86zn6BlqJnT7%9?6BCsZDfRs4X02s?M zg2S{O!zfCeJ&93`a_}{rQ6@1h4I^a=QXtRGOkyD-M`-~ld2|}0hy}*Rq%l2^PdI!! z7a3TA5kCV~KTc0U!9v1QV0;>*S5XEiSC5{HwlF~t!m141>~wUP29TDPk(Lh9t}Kns z;%l^5i5V}F{zM8eHi=$5s7=-asFvHIMUe8TTF_t_1t~B^$Kiy0F6uEY7pyQgJs0d> zMKQC}_4MUBKsja@c*bVta>U=PTt?{_n@s`6=1fP OVK*= znqg#RD&5>+l%8Eesn=eLB-FfNROM(wTsMr+GctDlr6|U37)De=RyPiV!>oEBvYRfA zAZ7{e8Aj{u64E=296Y;U?BZq$Qee4`W9*hOnl*hbAJ%khzGmwyW^0sq+f*dH%>Wp?JrxAg zEA=2HSfvLUyTeFHW!`B3Q?m%XD+O8z2O!jUp*Ve>!q&If+(n-0#wXe3NUuJ zS$ln*UewTo<`l1tg;GJ}TBipYyT^zo`u7@uUh;Y)J;mKe1gSl4&;p *bvq-*gjb^VX>{Ljn57hL~`y#1s4klhr* zKUUx)1L$v<0WShfHekR@E`w_?gO^ 1vZ^R1m|Gpp>m?ClTzX&S#2e-ZztLmuMk!TvFui+?wvU^x8{{xJ5JN8+hnQvNT1 zpQNRKaHw4xaXFxMc^t{ IO=Ke+vsHC0xh3bzoB~7 #5>ED+&B-i86AMrqbm3*p%F!9%f z`s~&4-`Ht>M0nKnn5L8a`K7tvFv@-zb-WR2QnYV3XdCfi=-^I`hE}#WH*#<8w*VXQ zClJ5tlK6YHc*B0C7BR6(kN*z09MoaB5@6ylP|3upTHH{7uneaC+jl-3rvGvY6McGq zs@oj~f20Em%8Qo|w`GFeGjy2bL1okeb`0kqlG*Ib@J4-3!KUVF=|{*6ut6`3e58w1 zTO7h410Po^=i+5}!*&AD%}85Xbs1crf(<#I$YtV8z1$%=8nnWBdOv8uU!>{wV8EXO z&Ou%S_8~p_KM4=XC=amS#)tG!Yv{qK_kN@)LVBa#2CaE1T1L9Y*-Q+MNN4cxxmxET zm0u SC0C6y=kAuEbmYKPY4R z74lITjVMEyH>_WRdBAvSIv_he0i75y>EOgnT?U377DC@RQi68*;7-dU=0}CcOpVmG z4LN@ca!=WV*5(cT0^oIB>b|rDG>HD=8L(>;(Yt@A{Sn)v;$zlE%P#Zd!naMDuQJm8 zIGu@q)yn +)Nms0d>kBE<2AG0)?cL|T1zD-;Xx0h4dOq>mb7xkbRqkcynOk8n= z`WZTbpi+IpkWCKNy#O?)Bd=kLM%@ozhBs(c0Uy@V57RQ@7NDHlFN-63)Q>(79bG@7 z9MUb}_g+7&Thiqw^aDowBKY_X!|jpaw-Il&b;^Gf@swV|L%K bQ9SrK4N{; z@|d|%*kyX0 bnpoIZ(Zhp*#v3Hvb!>HR?$=|Hfr-6Vh8o Z@G=waVXa5`vET?`t>(S8-cMB{Qj z8~kBuQ~XdX=l-2nYI{am^{6u@?wU-9-w5oP#(xqX;&<+leW&F57`IaM`@hrk5PyZK zJchg{jmH=c`3)UWSww3#=0HT(knax*n0P=-H>@*?r?hU2qh3MyN_8~+Ll4F!v$gyW z4v$>`8!~9anCfoOB7gQ(G9Vk=13pOa2HoqYF!521?v?xZ80x3{gW<6#*?JV?m?g+( z=)QJ>-qs9Re~$PSsd%d6qZrd7+mJmj!>am7_z#!G?@YlYTgty2>C3hHUE=@wXJ`QQ z+jo9<>_cA~>4fxp0(GLWp%X&~_k+hjX!v0r82b7Gd1$;s`KY{$fL$YK82F;8OeC2b zw2l0=kQ3F1$|4??1J?WfFPF7sL|Q7V2{bRa4TI-DLJsv>d0(dELq5`hgoo% (YQt((6h4b_F_4Xexax)^niqc1K)+{ijpTlgWy0wZNsb&cM>jC4l+Um_h= zfQIrLcnM>{%n^8_&c`v1xV#TC;slIUwrhEY D!HVRX-Op`EuU1L(R&o zTF%?+5>skLpTr6YQeu()tX^XAk5+zSWSAA-5ZWCz~<)Cj(y({K)aNfuH^r=??%u zLe4|wZodp~=w<(OCN95>S0io`;^tl!XUNub6%#+z;x3iF!CxNYr)u%T{*mPQ1ZaxD zll>69=Q8-mm%%+~yVMp8p0LcA@-suWGE~Pq5$C!>nb8q6seKCIjbtt1As!^m9is?) zb4U1kZ|?oy%>Bj??PCk|J{)?(Xlt0C$AQ<&d`Mr*K%60i>zC+rW+RV*p9(yc54*dB z*6-0b!n_IpC0ad;hwMhnW6-)6<)`f95?asAH{_(re+jiWLxyi4ZiH@VF8!gQk0O*q zycuaXfu|AnS~Zf+uMs!G*0eTl@Kp{vKCLd7>c0*AlKu_)Yys9hAkdL*(4g@$(o)!v zpM)^!>-UR{b*>>BxWn)bMm;2?p|AnxrC_7n2;dR*(&myz+BYuGi@MPG$jF-s{pm6v z){_zU1Y|OzPgqLwDo^p q;djU0eeZo3fgytjQI>@Km-~wdc&Z(N zH+X*@>4_JEA0BndG15K4&8I?)w9g=JWWAmTJfi(9Cf<$q{(F>1J}$*a4f#P@TQthq zTm5BUYQ#+i-9=j7A$<+iZwX{F#2+l!;H?69;!VOsI{*A@I{hn+nT@gDY@~S*>8~hX z;0@Y;9 2xzTH_dMA0>z*ItH!05it4wAg9x!c!IH4ulXwjei< W;MAJV$U@0jJ>Z@i6d%oII*!cO#Q^tODN9)BmO`O? UJj zz=rKn`gGVXjqUO v6;N-nE-oEnFMA_x?Gnyvr8T H7r2?_C~r}beF*d)!FUVgQ- zHC$h}Wvw(za 1MRbE~yE#I)=UL@YM-tU)I&aR&|=kD@5z`S&wh%YRG8P2jf z^!5AJ)=O)Gb(@&Ln>PnHY}E!Hg0awxaIcaNpM@`axQ8>wTA|whkeTY{M8m|1dmE zs1{Lk@7lt0{)usOC4y#LP2fw6yH*2d%_Q(wjGL!{SI;K!*NnSPs@-bjeT#87>Y$$a zIK$N~En3h0SH^jCSkHceabAtuUH7i7+dNc$ NeFsP`3#++O%Qa+BI8N;cI5ome+0Y)omCNoL1#sbl3eeM_^Vh zu2?t?&5{Xgc~
&@@?+?e&+JCE09}l_b0DZraqB*S9JN%Ef{R6$(~Gs93NnLghu|rWUMFp=zm! z+(kgBh`d!%|KBs0=dv51P=CMwHnN{S>CBlkw=-vMXU?2S^)GGDp4;Bhn`r3I#Tr`9 z>Svh=lt*3rK(7L1CoE0$r84W5w)eMpC;HIAC1P$u%|O HY5sD^`RTOE;SkSss>7 zJ|SAYG*a6lea3{AXh=HE33ZLtt@YC5na~naaPNfLmC=S-5?&%av!!Q*@XV1OpYY6; zo{_>cPkKg82rsRk9Sile_xC4yRou}oph~0E1ypH`aRF7Dhq-_!%Zv_p0Z)-YzYBP( z1dg3h9S+ToscZuimbKQz>LamGb<^xvbfv@@C!mcA+OkqnVEhDu)v{7mWP 6t z=2YUMIe9!> oc2^M&g@yoe6;~S-sU~3Bt9A9Eg zWx-I(Z0YpCIY&Bu!Pcb_4KEcQ72*$`*<7bX#tV-MDHoo(GJ#3LGf#Rdg7s0A-Lzn% zc1{nro~09-Np6+SEOM)4<^|7$N2XF0JTt8E7m!=wFCw?X50hKvS|1Fnn2jvwClPZ5 z?I|b`PIR%rDPDdDh;iAN_ap{P35odpa29N-ZLMutUK?hCZcwk(k%vefi>khqB)7;U zRKkCVO#V6cUT#I5#YAdEd#geoI8}XoaH{H1@~Sp|I8T;@7!T(u(pe7YsnR(K&MN7w zfOEcdPJ?syEa{#e#7G=cG?|IUmf%^zkY UvHdk+C`T0^t!kn^P|)&s>qUIrUQE5qX asT+kyWN%L0Bs?O2bLwW{5d|=(-Y7h(1Y3khm0+vzs1j@=&pcIv+l5D!V7u_B z65P#Mq-IIP=I1RX{4KEBPXhj6w4p_|Eel4&y1#kgZd7m|-1W*`$|9I=V$s2+cm<;- zHE5?eZY2MdVb1u{IDfFkPO-(2Vv8fimi!cPNuaqP&BRE4Invxc&KI =Xn;Y1(5ewG zwGrlOgbhHbtJWA-*% QS2BY~!40!)LlHY+AdhQ5&Xk@_#8i}79jpnuLgF$dHhGb)^*8 FEMPDtQ~#D1xHZw^Zps zjI088j_fiRT?MZ4VuU4J<-;H=a54PT A`Tb&SNIIRT{HcBwX#N z&EH4!J*dq~NBTggP; `}Rx?M&@Hc_~@KNQ#2FbcK zoz-e5+S$<&>nt~x5-Y6k=MP3y3CFVt?EviL*N@>BnC6T}Crt}h>msn=lG;@&f+yG< ziP~N)S5!c$#S#9XuJd?{!z4Y*gUvMxeNu2mi!MY3i^%PXRmtCu;a@~4etI; B}`JxAh{k{dG!;U5M*C*F@V z*Vsfz9LB$n?Ei6eh55&$!EYS>vnER9c!>&v;?k0|roI1MY$ ZDMQ`S_$Wlfc*G#F`UR&Ku|`FVEY^Zk4; z5`THhB(Pzlredh2UOGK;ASBxQg3Wq$S{kfrZE2Ah{$P!Ejt@45mMCyJi!4Uwc1BnG z`R|d@ VNv&_9Q=(@P%28t}TfKg@TB|%ru~chK!Wy~GnbAM} z{4L68>NM0y4WG1SQ26MF)f$W{Rcp9C`1?Ux6>mJ8DqgugY)uMc+-_Ba9{M0Ql6F0N z#`4d2%o$&t<_~IGFl*GnAY-p*tN{QikWj+v5WgGCuS60LPQx$=DyTh=M#tD1S d)tx-E?g49;z7RB$v#!*T`3WY@4< z!N+65h$=W5q$#T4lY-TaI{6B6D>xMgq8zI@e-7~bQJgKuV*wp$UZGc2C{g1QT^kQZ z;l+~bG!3b#Q4AUp;k|9VF%`pWZ7U6t V`$Q&dL6)-qZxo%4dCQxH2;p$D`sk&zdePfeGLA;%5~19>a5 zToj~b9q1%es5d`*yhJUv*G;IzCxF^0P$@~;Yp}5bFBjM{J|aX176~sH$DaZT|7XTK zbuZ1QSivYxq8TovyE!Pg5?+hRq7ENs<~gk)i*+ZFSI0v?gRH`C%AbtqucI74o*6~z zLv?e^G%6F6#G1h|ohvBDeBDRDR-vUj5$fnmb+5;$7}6~UHYY+7{V~e7hIHFi>+ugG zyv`CkRI5~2@>!!#6}i=bzkuA}4N7nkx|8mfVK9IyV|@@yALVWgHY- V}MfD2KVoz3bpew`N!s9Diq zEgra&%K)2?)Y`#7;A|CWubq*tTx8Tn=BPk>U`IhHa1>(BRe|;#4PuGq1_I})K+*Yx zNCVWPzyJbIR)O~HjST?>mLc#I6==`n*x*v&L 1)WB6D^NWiWBe0Dj1$SY4I zI Uk@Ap&TKZeA8;qfHhe#MWGUZXj!s>j}nZn&Wn=^p-U>Hiwo# zw5C$kJ_tG}ZeuEbt`+lm&QF%qJs$_E2SMk)_F|*+HfSKM-@@3ynpCorRR*5GS8YlO zW~KiE=>CW;Tmw#NEOK1PdA%v9M7ukpa>5Eb!r-lj71o$oljx @Y#cfg z>S&Lj+Yq)A*#?VXhRC Rucs)A5x?E+yn4L;S&|sm_GP!%{wzOl6X}bsAF6#{I=3*-;QA zS{<#8(b5;JC|TACt`37?^Rb<5Y$H1udfYaz9j9(tV`D7ZQr*;AhZ)Y12ROIR5y08F z`(Ue;_?Z%23G7%X(in|}YGMr*=UYJ(+Zmh}Q}jC>RrWY5YIRL>i 234F? >%aV+pB?BF~>>Wp{=@o3u5VZ%lY#{z>un-YxR z^b>6u_$`8_HQzMin80%|RS>wr46f`-WJ2lQoaQea+MCAI>CF#oockqCeS2@08}DJ@ z&1`-{ w;5(@=>hhjps-Pc~z zo=sGDc4qK+Fbn(vP%J6rfnq~{XJSyZ)*=`~f%RaP3yi`D4}EFZ_|vA&pxeTUc>CJ+ zHHo%PI6B3_v~Xf%r(@|@dpcQc1JBk6p_TSEQtNnMsv1hY;~iB&WVlobks25*@EGIe zM+gs{3OvX7 tTV@0P&dLFasyRMhOdc#dDcn7T64ENiZ`Q>*{UqM!XZ? z$3)(_HW!O`#3()~9h}ekuesU$f_Y5f_gKIOe!?pQFW~zP*O);11Lse1|BS1>rNKB@ zMW)4q=?spSC|MrN4MsAF_P&lrRV0EM$UIVwr3ZOTpo9b?lFx%6+vg4TXItyAXQH4I zQMDG)(a1j{nC{7lQBc+(nC cb!$z)Y?Qw zk`6mzB0+9YK9fzczG?7(az5i9CH^2ZFPc)xEcy!(6|_udvbjimuBW;W7bykMKudHw zkUTCVG#SM#aRIR$C7_RzUz|y;&Gm@wHNi#^k%)Am)Buep1S_>8OTb~W%$dQ?WP3N2 z_!)y=2D#{0edWPOeXT^o0<;x7SW3Xa>O6$)D7ophGlb Et z<~$lf2L$|B&hI%KW@XZ@_2YYwD>+C2v&A-~Y>MGB6|_YEZwx7VEcqGZN7!S@Q;Y}g zv1A|P$LO&HW57&nEb((b*BVQX `NNOO1DPDmfLTYSWx~x(AF)oq>3P9I#6YKW*=8UhJ*y{JHRk@A< zQR=Ez2!Qg_g)j`zaB@wu6C;kwPRP(^7s7=sZB8K^Vpl3osP|k~aWK3$i7mh`7(w}9 zdjaS`4P-ltt@&V}gH5^#TdpgxMWP*QxORC1)PR=KDG?T#1gdXtjVge`X$dR8A-A tvDto y21C*-2Q?>b0tr?rX=2 zmX^uZd946-W^kw=PjG!f1+mU_M+G}m1E6NdKo@oaI 0CaA3WG_2sop)%2}He!)&jL9Da z+3p@aOE5({_5wNz!}>1fpe0A+JN?8AF&BAFH@A3Deb5q$(5evLV9!7YxFC~@^> ~!94xj`{l@<=*rsn{RDYfG@s?0R$R;4_s>7~?#wyy<>}C8~ZbllS zF2LdAZpH8&ZfF$}O^n{PP0~fN2l|BwroES ^tL+%YII5zLP6H`r}~oZ7`SCun=VgtTx%jM(W2(K%an+U4tp?p z<_p1`V22RQ20MjdZYY$P#Y{~?T`O@ykF_8G6L(<%)Sf8}Gr22F@ggR57g)%zFuN %SO#q^p=~{6|Vyu{S zDg(P9MyC47`L8nY4WrV35iUCA0+$&|MV1=VO-x|%FVd)haly4edhb1Hx*gY)#Ozgc zJJXkNH}fSQMudNI9~NW~Dfyqr)k^S+xsUsQ2`7n+u<+@|(j@Q#0w5r1?~cdfUEP?) zG6QjdA7^-R33PcIe*}S;2lr6kn=ZvG1KbhC4N2OtD|ua>RBS*<#T*i_JwgH|0hYAs zNlwzH0&&s>LYySPw#4RUA+Zs_0uf2{9YiFM9zsMiV}~vL^Upd?w4GD@=dTnnkGaM4 zPk_@Q0=! 52qqz5^Dc<{c9Xb|4qfmZNMHw_ae Q^(lxg?Nb1slJ}`vj$$)zwuE~M1qBu2Jw+T3o3Yy|$x|`&WqAth zkmhMZ+R`@&{m@?|ee)%H3Y;g?Q_wuAo`O2%dJ1$Hp1>O+g?I`g#dyl21bND*M0v`m zgn7!R#Cgi61$xRWMS993g?h>(#d^vk1$)XPMSIFam+SG{fIG@||37JIvJ*#SbPFtN zT|bM7?YoryHzqqW?U{8ag?ihwxUDvj&87P48^Yok7*dGNSX_X5lAXo2be(k$V{cBz z(iJagj}I+tjp9ZTN^WiK9U!@MzzWj=bI;&-BCd@ef1gRD3CA304Y@An$84LR?GX#y zhu+GXUN!usn10YN<6Ip@_0n|SbfKvO&WC Qf&odshSXJBb{FmYrSzg=LsmtdZOljQ>4ew085G@(q@$o18AXvYk#>^JY}uT z76lu?3v!ZH%e8Q@x;NLF$mPU#P%h!>gAG}kSoIpH;Y+!L3~JQ-q)EsC+A8^l%$u!$ z&pC;X*?LTFAA~1UnS{-VMW}}0e+>8PZ?uocpH>tBK?lGx=TU>9*eviJ&TqmjB*{fR z&1%Y{41S*uX(gGC6_WMvhpZ5>3A2K>dHBzDP#7zE9Bkv3q@Czq4}V&R*D86E6**kO zU)F(n?R9erztAu%12>l(f1L-tKbED6#4?HVa0k7k4>cM{WUYNR3wGo|cyR6V_TB;P zLgdQT2(DG ^T-YoxQ)wBLZv}RnPI4oR*fAx zYkFRzEikOUbQW}=RhR1olBek+uSyF@fw%{$tTBS3ZCKzUVECH8Zet*HBdIve!tIk* z(H*}Il+vahE|mX~C@q66iS|w$UF`slzv&Gd=NOSC68o*x$Zo(%+#5g|-*iohT^fz# zF@>f!h5!~g0*mDGraNscs EPGCa|#)*Cr(5E%sHX_jNIVR9YWcr#JT%5?&w}!+r%H}XA8v=KF(_RPeqXM^X z2wd8z%xwCM&rbJm0=GHWgAESxdSUt{5VFl`y2}ygBoCEEvdCEj?Y+saWFq4%(rI*x zjzYhzw-SQ4#%&uZM9^Vu$!crEm>Cw=D>1bOk)DJQGSf&au^O9KK>EwZ?bVT`UXkdx zY7!wqcQ{s8-GI0ToAF@jq^3WN6jhwU75ScW6xmtQKcJ+n>AF#F>{2gPu(7?ryCK|~ zb5-pqFR}5?ya*o^5pctL0OH-;KnBEgM{7hhU(=^YyYtD3XqXc^v0uoG@oB^;ZTenb zjGIJ^Rw%`g2**{j?;(P}>BYPVzY-B-s}5v@xF9dyi- 4s8w(GD*m65v*OB101E zyf{JVxs_v0IcB_=eISfdlb4Vp4`fLWE~h6Cq=Aqk!-#=6bXQPcFq7!ZgAFC@WykOL z%lY3uEI#NB+QLjo;~}J%=hAkz1j9ft?!mjmd=7jeakPtHDuSdSKQILos^9$fVSzQA zu6B|L7bC}X+;tpp{=@+#IcH$u2y^OgDfG{ZEw`vCZUTA{ahB8@uw>M@6X=yWNmLRy z<7%LUrFw-(9nv{5SeR3 P`?II@>^j&l67H=?3y#=~EK3r0RPpnCy{s8ao+Dj@}Ebt=m zw*#~+i?P6h+)XK1zI(kG6qaM(G=i2Otm2^LhyyrvD7FRg%#oaJz=_<9rwl0VD+! `4R(FrqTq+G&pVfn)f{`akbc+7`!TPmzI3Nn;tR>|5U^C2Gw6;TM_`8 zm10~mkGZ6N5Ew5p$NfmDzKQT5#C|Tgko#2#;hO_42i|EzfraF6%8(%>-m4rkM9Kc9 z<_B8(ber=-lvohUJCX~^qETnE)>P=U7hz3hg|-Y*kPa5TlW*VwCxTe>7h+w<1IIrG zL88dSJq}@AZfU_ihPhQs63@oa;R!k=iBBQ4VhBm%G`A%2S)d*3k|e$a$n+s3iBNzS z(nTdnq=+YC!x2xUNhD0QV1d^FoCQ3qVp#Y9G|!SBz6D>EB|jwJ0+;-7QBWK ) zr>RJ)YT%}5(xe^zjBkv@{Tu2zZtWxVIRfUF2Vz43&hMhC_qlUdq!lsbVq4ENfh8Wi z{f;}5qevYp(Vl7OPY+ L^22TjZNptjE0k0$f)A@?jOh=B_T$GA#rB&Pp*W zfRvP+AyU;{+?vp>i5qYbL`3oQtcKtUFH}{}b+tLJ@)9h+UN{#fu)FNI4vNtmCw|Ge zYz&<+?&A`%MHHQBUgeS{{CdM2_rt^G-2g%#V#((OJ5G9Suw3w2w{}z-2v_%a#PZBW zSF1BH1FgRV+_gBX8^OPUQvJYhmnu|W-PBZz 8hbHvL>Mj z2o-7{e+ZrB$K#z#-#XYn(M#XBSo&J{gCij(GanfjXdFeh2I%0L1%3ozg=?X?Kp#}M zAgPa<{}=~*Dp>#ND;Bcr1pbV83(f1sy91k4XaG@b=n|(*YZh1yU>(+_XJcKePqTkG zA{Y3mFBiDmC%TV&Ngud+B!AlwOHRDkb#QCXSfc2(i*itPxr&ybcNsJb7tHLmz9^i- z#eDA`lra6knAHHfHI|#PaH6-}x?ZIwL)_Eph1fPr#sZy7HkcV(An4nBQ1tCiCsW0? zxZetMz XLOu-rlQy3Zls=Uxi>>qW@VTP7K77OtJn__R4a*qn_+ zm$MxQFJk{|EwAcZYb7zP4HY0*Gj%4{sKXK66peY9rNMd_3w18mAc1LZfbta`(h}>t z5`a~XJap{wAky~#=X6p)z L{kGb soa~&T!>}};lbt(sm_N8I+c9(ywv1E_Ro2EOuFBlN`CW4OWD5>TzL$;{ z-T8JoELm^(x_!9#1k8hka8Th|+uXwWsiuH8MzGj&g-td1B0Fqp)>g`n7*K^5v1*W_ zGvvPwewGZ;D;IyqQP5Xun Y;idBhRHhS2&UC5Z|)HsWdf`m(~dW1`?afAyi z8k3FtCy*%_89}XVD4qqJZ2@tW_D)=-r4XX1D&RjYK&ZJXilq_mOhjw3dTMTBqyJ$A zwnoFa@UWr@#s+Gum&PKvE6Yaz-3rEPvt@BZ)8ay$w=JA-ZMY!>l}cy~Xl$9x-)xkI z))3t$TScZ I&ywv1)x6^&7uSjWi( z6sCqmngz~ 2Yv0y{$iW?7yJh285kO7yv0YF4{&kVLMmlF z*bB12cG4V#x?nd*p>^;L^JOm1Maf)XXA=6{bS2tk5mMfVA!fP-cst`C!K95}=U5jl z^xQ4=+;MbFw%kvOgF>-*-`rv&4jIlT!}v39Hat_HyMQC2H3__oqbF$3QQj$M**@-> zvfSY_r-U3nW6ElWk56fG`0%{=U500J2X+{2@>&@HlU0#cX~KyGj^lhUgd6)&4AQ2x z@*jD`ki|Lz30`7~1RJ@XV1u3DAm{s$;8UIhOOTgMX$UpM8lo}F+!^zf`0dOcV4rVF z)Gi?(p<_a|POetSqW-^%Y=88KT3+v{<)B^5vkm?QEKnZsdZzS8S{j^ pBxR#wV}u|Sd<7{gwuc8^O2>d6EKr_g3F_1`-t4Q zf7u|cERhGsoXAoVIh9pOa*j8@GLp(lGebSfx)HE)IIZ+>C!tQKJv~@&xnX(Ba?c7b zU0O$`mng+~!5Yh56|A<97MPceLTPDCjgYAw0|j4%MBt=4)Ca4>%GqdsPhdiPfOG+z ziSUT|umE~cSy&ZkfocHHF`pSFi3+fTp_U^o2MP(}l0;Ly0;7#|ebNhaRMHp_BiZg{ zuz&Z<(WT}$N6VC$E2YgyiO5Svi>R1bsE49tmX4~5yLqjlemk{IUcM1_g}z)00t*vm zgv5f4&DC_tA8s^GHSVg5xWQ0$V*@UzQ>xfAYRmhwBfae9cYDp&U8SDM12CO57ypqZ zg-FTd0kV#8f=3yYoN>K>eTDgaY2audpA5p%Iw$adpxnXCx0O-r-$H8RAWd4BEDPdp zB_%`LW`2E)todO!BKp|1K)e9f`>2}`;=Pap6(XWA4*>B&AWH5+ibtFOs}LvIDWX5U zN+}*4Y*?XE+z&UI1G~s;PJJ70VS`MRDQJFQ8LFOPr-1HtB9t^P2nHJ^uR)_>GWKgK zh1(~auc=7x4i-nG?UP~MF^m)_uU*1}u1B8T!UNipXOHl}kQI5J6dnvu -w1}4pv!4z=`zqG`h zanraq7axUIg@jQx$w{F|gXQzV3Zxx|p59nn8?i$DAks3+H$GU`+!(gJ*s_YgPHYGR zZdk{n^prz|Fq@}5(}H!&n#3ww0j8V3mK_R9JSThY^3lydN(S|&WH2_s`kwO4vyxGO zD)Xy>f^LVfBOoY*eHJ7GicvC)L^8?~wvthRdh_>%$sp`(B-1F80j(*Sh)70xqE<2r zuo9-1Rz%fUJIBXgMk9Rk2(U{l=ExRmVd~By>7nF2<}>4D@iD47I@vFgF9u&>$B*#* z=4X}7=~HYxRP!Ie!&yp1_pyE4{H{X$lp{sd sL&dVMq8noOScBmUnNs+^qs<>F%hryT zMo+qnN@Sy}1kk6+iX!Spk*QZl^-zeBA!uHqY*8O;(*Yf^1g56ZuS1R14NFN1hPJ{y zicUg+kQ{EI-89+URcOi@y|ot6w@ePw?RhaHVk0Ab(N&RJS&*HRangdTPjYm XTh4ckE{ny)OpXnhHfIH!C t zl2))pv}m8w`eLVl;Yj}L(GykjQ2KM>kxG$VaJI*2<&I}%q?fbPcOA+1J0sSL3-NeR zLdBToUjQw0@hVMW Beo-3w&2-`{9X%D9D34= zH98|F>gk(~;y-tmNS=HgKwTC*b`<}em5HN)@Qkrd0@+4sZHkPYe)%N+cV~W@?gx AXCd06MaJCoX^Ag{>4lYHT2V_=4?| z`HnFTURw_Bj#Ordwp}9w+T{OPhRE#ne@y1T8sp$|9b2UDV2=W-J5yP3Z3TaJOr;(I z*5O HZ1D&J3 )Q<_zsAEWZ5c4wg8HZhIixU?`|Ais4K2x#cfI4_QdHiT@!Vama&!Z z!7ust{luMTGPIH`I_}wtn(rGy>YESYezW;3rwhy@;H8_-<{x?BS;oE0{Hu0++8_i# zE)@>iB42beFs~C{175l(ZQf!8jv@nl=64OK)I->5-mM`&GAK=xnU5HO1p?<+B8VR8 z#BZz1Uekfzn=UqnYHY Yp&Bof+{OE{~C|)5l2e1PkCQS(Y0Zf zlzE9q7M0sYWd^Id)a$#%XHh9XeR22pUCZmB66MA%Dv{4z?=8r5z+m&YdVPNxT@oV# zk^1ZatzWt_sXqLpyW{hp_WEuv74$ ~{+U&E@Vyx7R*Kjrg%ZH#P+b^Y sa!gf zSfl-;VZO6YY+zLmut&Ns3# !`ZCHb)`u5B^=
$hg&C*|GOFS4~x1#130PG-!v)q&-7W?p2-vr9Oy zw4K*0r;nLilyf8|t)G09wCYOn@OY(&RVmh%mHzJ2!3ue6!2_owo%346!;Ua AB+{|BsZJl9)<74Aia8=+jHD}0M+c&fH+^7%Ize0NESyiK3$ z6&HiV!2BFbV`9So{+dNJub+px;&Fq2y=06;?akCBV9YF&5DS|jkk_013ktavyW4k1 z-fHrfy)tF&TSzehdlp(T4UzC3lkc!`^+tGT+^anNagR(Fg{W4V7egitE8c5j?Urpo zR`qiaf4jslYKt=A_8<1YL^tI0IwQ*vj;UI}F+^e_kQ@bD1|M)Na`hq73n;cObUrxh zdF)R$M@e2HzN*@4z?K3%*c*;P5kHC>tU`N|`%?%7-JX#= r?a86xh>7Fn&YLajF~Bqq40Ue~=c@HD6(?2zRd5RfNEl>r8IA(B*#6|pJ i(ZOh@y+2F)9O9k5tcM7}%J&*=VrN7Nf#)`w{EtUXv?5WI zzGM!X8tASMPI5(c@SO-@ReMeTkcuoaJJ6VIIY{9H`=|heuC{%5n~H*;H6x3*#XU#T z%`LLl-Hg_)3Q_BxhCT3D|CJzSC3gHuwkq1NGVlgME^nfcx8eF*Gr3CmSP{qBwxq#7 ze?RW31;&UAA)&!0b;}^s*C`sPf+Jv1$&&RA1SzXhK6O<<&|PFtq-Q(cho0(?v@bTo zZw288Yi+_4kHh?lMfed*$^SaY{kt>C^%uBiG?L3iSGs)(HP%U@NyeceE)>{D!*#4^ zoa3y 8CR5LkRiMDFh@7YRHqtMYv^S|QZ+fEbB9&MNh z0d&qWU%S$yEFG67W#dbreYMaDRhJqlvv|BOqm-+p7ej_*lKEfp@=xmg=l=hZe+mEA zd{zHB|2Okj`e*s|zjg%w%W0xLYojfW{0rKXNL@Rai?%GrNsY2=YLi=q=-a|FKmr}@ zknM|Gg#X Pqrm zn8{IGVw-m$+e0JyuXKiU{vTwBvCMN&^GFfO UScI$H6IaY*K z;%ykY5C9$0hqAux)2Q=;WgqIxdOp;bg)Z}l`m!JD%R(vcLw(r~^<~3zKGc`}P+!)e zDf*$lENM%Bs4x4WzO2+_Abr`>x0io#y;QCDS5>-T{gEG3@2{$qo&Mt^4_5DwQu))7 z??bom=85lLMenJJA4o;-b4MMxir&jdy_fnjwD3qorPV>Dx~f)|Alt SyvA0IV_%$`V7N02{@p{TD@SU$po-edp?XDqDh7Y4t2 BPTlbRG0+R~l$ss; oMsZFM@roUtHmwxphnD=_1M@qJxij4WH?!}?epu3{_bV*b_@QTHPe`ZxX4F1(I z LOF3y?HT3#C)}?p_mOHnq7 DCrl|LfpZu`xg2YYHqvVqI-c~xL6Oa*+wWuS{A*|? zCAB}t9$@=B)S(!6{tu!O(QEDE@3i^ZkE^ agtm`o#6W*G+1;P$tVrT9b&t>X)9s`R`ooTY zoyTHb=~OnB!<;MLru7G7cwHV>)NjHqAqG!h2hGNK=;Ir(Fo=WJ7)(dRdXsosE&z+3 zb-{>?&jNQd-fo@{i`6wW*5W~N`WrZm^WG!Qiy?7XR$zfLT;-HL@ida{P2gIQ2(83l zV6-RNJCZt9lZ<7-MBIF!NP&QnEZ(Xo6M0uN sO7>&*s^Z1)bd!vlvtvHP04@KbX+^xv rOb(D-iGB`Sp@$wl{;`btsFGVynKM3T;Nhyn z1wEua3q=yfH5x?GtnRbM-*A mV -1WS!i6sz{B$o_Lm^`uxSzmy z;Ac!DLWzSV$;5Udqu Yu*@H;?Jz^CTsO8@Am!n42Qg7%dv8F}r{{ z55Tjnl?F28ku`iZR)IfbQxJsTIr#5@c&b=w{XFPAX9dRC5}Ve)HTYz&F#nQEX;N#v ztwg6nQXh+{Nr5#1iPSy nG z7sj_uP}$y`(|+fS%MCv6aJ%e`YwR#l50ae(HW@7NC|d bOaOZkMQ(83efB z60mzEEZLo;ch5UItkmxl!4HaH*e!yIFTB_sZx5vs;C%nXBJ_C*rM~Vs6C84#mfx;Y zZd`1`-^@lVT=4nvtcjBHEd0K~?;7D1hNuP;!eT6@^v9S+y`6e~AH9|ZU UAiuCgMYJ1l_lZN8c3T>l?=5^gLAx`)VDSCYx)_X4#$gX` zPz;wEXBz0Vl0=-$|96;q;>!XnrCBIp{3}{YRC({U|DnNCJC`!woA}yLD{KM|hjM}j z(K~1H836p3oF-7`_u3C08g<@;K6DShU8wUJ*BgA(2yJODGuYmRM_O}(QV)%5%nhJG zGBYUD(&SsD#0vKSD$QPykACkpryd&gxe~OYnm3LCeXcP0=PddNvLrguVQ4+YxW;^v z=z|`U$qBgF3j9%V&8%TDei)#~czoN4Cf|llloG)+wExKrcDCo*8P_Nt>@AZWYNvE7 zOeVDxKrh{CN7Y1t%%EJjD`S(w(Bdov(2qp9l6;;+c+B0@#C*5on{=2pU!CzY1BRjm z>EzC6uq&R+^fIn-b3_`L`J L9DkP1bxr= zr@?<|icT->jFN>qt}!kqB1t&&e-~8SjNSceY!|vZttS$Q9oG^VhPJ~i#8yJCP@4!y zJ00mg243p?!WNa7lvl%t$9lx*`ZjV}ZCN%IJ>qc!b>ML`%HezP$lpHvcj%A5mxh_| z4t(LUVr}>PHBfR^pxq!;ieqhOjL>x+9_#$W(5GkOyO-+x1>;kwvj$b5s;RF5a3MLq z4M&C?KZGL+M|>w7)o^tD1`gwjG&V!@8y;)A@t8M)_`(77$Il!5e%T*!9+Deu@6RRr z`yuwFOBY;YZUiYXrinGL>_4{xB7eh!CbS257~d8}liMtsU?1S3iN?H_XrlH3k|w{f zX!2fXgono3pX3X)sxKV}KKT>p7fG6A2F2MK<2w8$tKP$d7ieu?fp3uNjsEe!hGTtC zn;I;yASS`{x)N`^k9vm%7t{UmfDNbqLG&O&(vylNFWNMLO?Ip9T;tLEMENv1Ynahw zC+OkFIJyXGBWFP5{6k3-jH7Z-OnP=)BXw$m$g$!|cpd9&unI{h5B+t<)+Ly4@$Cjp z8a``G!}O^^+fe0HJpeC|V>uj;!O_tP2ag0ga`@l4Vo=Pq?{(gKXpEoiOy=tVEy5G* zeZ}t#{zWeK74%RERF;!jtbehs(8&8i6TJim_)NTS;o2R{1c0w5^Yr>Dgc#}C3Dfwr zIX)8Mt9m 5zg@DR8lN2ZY!6}i0`c4qe7noQcdzmP9e`rD z0`-6*9peO-QI&_s+&l~8P6l7q5g2>^%=!1#3mK^{yl8?Eh;fZ^KB`Z@=kXo-;|uL! zcH+Ai^@h^MFVW5#v`JQUc+@k4I?@JhX1S>6cGOdYcF1}T4?d=S$cgwiQa#_|7oeUR z^d{<=x*mX$IF9Z31{~ryb6Cui_tY}q%lJGn@4N6;gWo#RCtko2ubkjvdoBc)8fy|L zkkmIFh5Vuc5QoMt4f8z0A@6_!BT1lbdFSxx57&ZLM2$hv3;n(m+@L{ibXq@L_U65q zv_6OLRjTI( {LhSzmH1CDqlU?vlFlSa zaMLysH2IuyIcTCmyNDFu0^mrT<)(fBM+rH83df&_IM2bMs4;C=j2krf5##RyE!4UH z8DBT}7WLSbJob 1-UoTljkf3*1(17YsrxnvD*}U?K!Pm> )fIjK`Aw>7P z0Wcp|TxPIUQp1r2>cMD(tKv}8qg{{ul@AMg)407A-@TxB! mt-bQ{WGhRmk&5U&Vb}<0v?m}j4C}hU{pt;&79gyB%aq5Sy zf*}>U+JKp$9kx~050ZW#juR_Zx!`LB{MAvcf>`aH&U1_Xow %(od|7%#4!fs@;j zC5^Q(k`ZZWR!;*A;6_U_1vOBOxf}ejN+2{q4AZKv?vfEQ *dItuDxW%n2auOBjOuR-ulLxl WQ9{pdy2BTLrc^`waeV@2EWM4Y8I)H`Ig@nFgG$WV+hp5QB*esXA&Yv}=;$ zi8KG;$8q_Fyj`g@baXesI~QJCeL+Ozk;6ESc%i9B_gX7}Abu-d $3MayvN*)pzCIQShKN(yYO=5khHCDb< w)rT})$}S~d#kW<_^uZx%T9-#t z9jiB=rk{Klnx6mfGPcq>cM-m-W5B0>gDlQ7GJpOe^C{YHiWpyYoU4eU_R`=;Xh>qe zD@>_~HCYJ(uojcnF<%0 zBEJ*axMK|@UEh3 zLj&1ZvcC(Dz>{@TY#{9oN(?CU`?pzx&>D}H#3U_T2vg2qC~T*2g0|zTp)~%b)G~HM z-3qT C0!HMVwM z6X&rNLt)h`tVV$aP0B*7!gZv7g}`1g6t>K?Lm)t*sxY~sL;?Ojfu93D#wPb&*#mD= z*Bj|c_|7Xf0oA84VQj>==y-IR?FRoYmzH%yx!#sUJb`Q7t=do)na _$j=9=~~Ze|TT(^x~)8cR;rt`0gdzeGlfEZQ9X7$3-}eyV6a#b?;2L z$gri`iJ;j+;<*{1+hYd5%BCBh%*`eH2NEr~vn4DuYuroSbo+(yie<)n@ZbI9wbmft z8j7fg5jPHBns$Po)Hxp{nqrgq39B39nPiw`uqmoBUvg7)HWdDoa^Xf44U*TQ=xF!~ z`ZryC#_xm5m5aZB6OT6GtN#dS`YVI?Sv1vbO5L1fa*A1X1iDb-7#%NjllJ2-(smC; zTEVQtnqO(op)qkM(e_b;udryFM^lZs*-g{myJ`AM7fl}+il%h7PQUcOVqA^qdW&!} z-!KQOUwpn3aQ^qY!JjXo$18-Hd>rl3WnivR-X?-|(xHcc?fE#L9|!M1KNPNE7DGUK z2_go7|3Y{Zd~L#T3T-XwUNbiR7ZlHs)h+n=%O&2_9RSP%R^lEw;*a3Z(eSC?tl>-Z zHK#D&4fu8v&2b6-ens<0dnTI@`|Xy*c>}mA!?;G>LZk)z$SwBI$(NSOiqsVMD6(}9 zUz&AR;S&6O=399pI{%9Xf00iReA=4ptc`$NYB<$s&r1p=)-eCMAkdESPV)7@S1>j0 zG $&evQMI&O~G5H0FEhB+&V%2LFyt=Z0LD zO=ykxHc?he7>LlPO>h!=5_|=OZWOAv7A=XMe%xI7AZPoo^+0isuPvv-av*s3##x}} z6&{|k*cMwzo17YLCDG3&=XY==!|wK s_%VF^ zGkkPv9RN!amiiPNC&3ZF6pl%7u)43B^WfeCREBc$%Yohqz(_)02FF{-g4OLXeQ*=T zOv1VnSQP*~hrrbFaO@ITFPpyx6PyT)(+KNoV7&>z4-nY(cQ{zx2G4E8CJ5~yjBA1M z69B$U>Fk2zQc8z@|B`igaq`5L*~~|iYWW *s=||6}mK zdn8RUonqzPmF#9rqiiDr+I?&Wu20zXEQN2Cl8y?pdCe`5IuS?a-!uGxGM(b&N!ql~ zHt(EyP{91G@oBJ+2GxTkscQjP14q}_;Go~ke+e&P1TQx6){Q4a^%>u#Cu79M^^!}} z!%>ZmvDW4~wa(B;R}u3_Ui!f&VEO{yf(fq-l)^%HxYBC_Xhr0hbPDLT&ES7E<-QE` zYDr`V$i9_WH)*^bZj$|GD3S#P$%Ze@S} P|49btH}%ECZH;|?4www z3`Il_5pme|)kUBm^}|g>!*9XnrA pB){6gKY)4T1)%4x z?0*6fUoCc|4*}yF@QUBCr8Cj^Gx*M#4?4eK@U3n-Lx<5xXbW3Xk~aD@0q@Tv^b2`} zz8n5LLf-(8gV5{YrC)fsj-$KL|4+o+Q-2!h{A0Z9V$)g3o}5(HxHEAT%rTN?gcsul zG(-HvzcB#v$l3@H4GqJVjuluf(^1oYMaTX6NUApzqDu#A+aX6(jl984$RCl{x!d>- z00k4f& cx-M=RNfC~(w}BUFYc_Z~`0;UrKcnbKJGTNlYUDj`I*yr?N5{VoMaS{N zNTZZI;mVlk=EHX%Q;*#+iIqwhfUaAel04X#RTI6&sUZ5<+n8#23%HPs?BMq=IlIFZ z$)el$kwl)@>r$c@j_x)p$)~<-BbZUqP2)!0bh}M> rc??~9(7+M>Iz~)SI8;rqPI!K<*)2I+??veQ;dCc=XA{;94t2RL&pqk z4e`}4gdppA&cDS=T1Am1v2<_*br(OH9F**wbjJ>vdZuNqsJtP%b1$Et^_n+A+Q!q> z^)*mJ$i}1X^z@?tvHvFZucj4{7^kZvuApCwptC7R&|{NL52sD0*67l?bL!CEF?t?7 zEFYg}&BXBxs$zr~z5YFbv9Z`V;`U1Bi%x~|=NafcH< gUA7J=x9Cqzfj|)O~ z;X7v$+UHu6|FL|cXqy%7$y{@PU2l8$GH59EYWgzq)Vz+gl}PVsss73EQyfXOTJmB= z4rOTOe+6f9#}OdvrtC-wb2Q&uh0XUffOy%L%qU8F2R`e1?i=e#yZRh7%{$#;K7{*D z%}fY9@P(@}n&Nu%MH9z}wyDLXf LCSM)k*D0<0tkZaz98PZtsJ -yt8nN)xB sDA1$0A^2t;{ggG#~wIF!_oN)97g9~=`W+- zu%pe}AA#9;5M!gH&2gxy28D?d4FFt5jutpRPL6Ikx`{R)hr{UnEd3R 57Vjq}CE zH?M*=M2w2X;G2t$y`N!BgEkW--U8qua{LpHJK#u^gBaqM9&WT)GZ}+R1^5KCAlol@ z9
UI_%S)Y499oL zu^o=haCH6@4ny)})o|m &H4L8~m-9Cfwr87Z0Jdt (LEpom<)gh}bP4G5MT39x1dBe=OtQNh zYgmge8u$D{x(vJZ0?h%`p DyRDFX8;E>@-}3I%ANu^Z0BiR9@y%++Jb HPP1c@3@ )_MloQimj;DAowD~iCKO?Ny*V8w+mFYM<`%TqFActD(nM-2dD ``Y8eoUuHG z)%ffp+`qxjXuSoZjb9KiEFp`T^1ONqn8HpzB>G-*=RtE1huD zS+y86hB)Nb(av|1_oC?_uYJaSHhJZ^BaXOFCclgNr4r(z{$G%0UPt*dKzvnPb_2=g z=d8wBHHL#ATeacWz*10Gf x`o9ZZ`O%a$Q0F!m*^#Slfuy za;&GG@EW{%RNe&;F*$xT=$q2@0pt--0?ZZPnd7`Lw%+(&T?TRBXN+YVVU9?FN@27o zbshjGljD3iD&fHI;KtG7qytTRbf(&~9Bc!#x6kuYVwte2HQEqbqQucyD9}1d l zzn7b-76873F!_6M81~C5R5ge1ZKB(cO@5<;ZdmR|GO(4F%;Di>jkw26x$9x&C<&dy zL|@uQ7To(e3TYkau#ynawScZlt5mx)DZ1()_5^ir8UMH%SJ+XO8Y2HzZYGWc`B~kM z%!e>0gaPcQfZNb6uK)mTP8?praTYlyd