From 1ee447feaf3e6633cf0138e691e14cb84d15078a Mon Sep 17 00:00:00 2001 From: Justin Chow Date: Tue, 6 Jan 2026 14:33:01 -0500 Subject: [PATCH] Add support for ACK response for Generic Frame Fragments --- .gitignore | 4 +- README.md | 48 +- components/dataLink/DataLinkFrames.cpp | 239 +++++- components/dataLink/DataLinkManager.cpp | 190 ++++- components/dataLink/DataLinkRIP.cpp | 93 ++- components/dataLink/DataLinkScheduler.cpp | 283 ++++++- components/dataLink/README.md | 126 +++- .../images/wired_communication_diagram.drawio | 708 ++++++++++++++++++ .../images/wired_communication_diagram.png | Bin 0 -> 78708 bytes components/dataLink/include/DataLinkManager.h | 73 +- components/dataLink/include/Frames.h | 36 +- components/dataLink/include/Scheduler.h | 34 +- components/dataLink/include/Tables.h | 2 +- components/rmt/README.md | 23 +- components/rmt/RMTManager.cpp | 2 +- components/rmt/images/manchester_math.png | Bin 0 -> 65637 bytes components/rmt/images/rmt_pin_layouts.png | Bin 0 -> 155787 bytes main/CMakeLists.txt | 57 +- main/README.md | 57 +- main/main.cpp | 2 + main/main_rmt_test.cpp | 477 ++++++------ 21 files changed, 2002 insertions(+), 452 deletions(-) create mode 100644 components/dataLink/images/wired_communication_diagram.drawio create mode 100644 components/dataLink/images/wired_communication_diagram.png create mode 100644 components/rmt/images/manchester_math.png create mode 100644 components/rmt/images/rmt_pin_layouts.png diff --git a/.gitignore b/.gitignore index 317b69c..f9f513f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ sdkconfig.old .vscode/* /.cache -test/build/* \ No newline at end of file +test/build/* +build_A +build_B \ No newline at end of file diff --git a/README.md b/README.md index 2fb25da..76fef2c 100644 --- a/README.md +++ b/README.md @@ -90,11 +90,17 @@ Build the project idf.py build ``` -Flash and open serial monitor +Flash and open serial monitor (Use Ctrl+T then Ctrl+X to exit, or Ctrl+C to force terminate the python script) ``` idf.py flash monitor ``` +Use the `-p ` or `--port ` flag to specify which board to build, flash, and/or monitor: +``` +idf.py build flash monitor -p COM3 +``` +Ensure the port exists. Check Device Manager to see available ports on Windows. + ### Using an IDE Any IDE that supports CMake or has an ESP-IDF extension should be compatible with this project. @@ -108,3 +114,43 @@ CLion is compatible with this project. Follow [the tutorial on Espressif's site] - When asked to select a project, simply import the root directory of this repository (ie. the `firmware` folder). - If the `Open Project Wizard` does not open, access it via `Settings > Build, Execution, Deployment > CMake`. - When setting the `DIDF_TARGET`, ensure you specify `esp32s3`. + +# me when it works + +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⣖⣤⣶⣿⣿⣿⣿⣿⣭⡶⠶⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠈⠉⠁⠒⠤⠀⡔⠄⠀⠂ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⢋⣥⣾⣿⣿⣿⣿⣿⣿⡿⠛⠁⢀⣠⠔⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠛⠓⢤⡀⠀⠀⢀⣀⠈⠂⠉⠀ +⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠘⣿⣀⢻⡟⠉⣷⠀⠀⠀⠀⠀⠀⢀⡤⠎⠁⣀⣿⣿⣿⣿⣿⣿⣿⠟⢉⣠⣶⡾⠋⠀⠀⠀⠀⣀⣠⡤⢶⡾⠶⠀⠀⠀⠀⠀⠉⠶⣽⣾⣿⣷⣄⡀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣶⣬⣺⡟⠀⠀⠀⠀⢀⡴⠋⢀⣤⣾⣿⣿⣿⣿⣿⣿⡿⣣⣴⡿⠟⠁⠀⠀⣠⣤⣶⡿⠟⢉⣴⠋⠁⠀⠀⢀⡞⠀⠀⣦⠀⠙⢿⣿⣿⣿⣿⣦ +⠀⠀⠀⠀⠀⠰⡄⠀⠀⠀⠀⠀⠀⠀⠈⠁⠀⠀⠀⢀⣴⣯⣶⣿⣿⣿⡿⣽⣿⣿⣿⣿⣿⣿⢿⠋⡀⣀⣤⣾⠿⣿⡿⢋⣴⣾⠟⠀⠀⠀⠀⣴⠋⠀⠀⠀⢹⣦⠠⢪⣻⣿⣿⣿⣿ +⠀⠀⠀⠀⠀⠀⠻⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣻⢋⡞⣿⣿⣿⣿⣿⣿⣿⣷⣾⡿⠟⠉⣱⡾⣯⡶⣿⡿⠃⠀⠀⠀⢀⡼⠃⢠⣆⠀⠀⣇⣿⡆⡜⡏⢿⣿⣿⣿ +⠀⠀⠀⠀⠀⠀⠀⢷⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⡟⠁⠀⠁⣰⣿⣿⣿⣿⣿⣿⡿⠛⠁⠀⢠⣾⣿⠟⢡⣾⣿⠅⠀⠀⠀⣠⡿⠁⣰⣿⢸⢸⡆⣿⣿⣿⣼⣼⡈⣿⣿⣿ +⠀⠀⠀⠀⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⣴⣿⠟⣹⣿⡏⠀⠀⠀⢰⣿⣿⣿⣿⡿⠟⠉⠀⠀⠀⣰⣿⡿⠃⢠⣾⣿⠞⠀⠀⡴⣷⣿⠅⠀⣿⣿⢸⣾⡇⢻⣿⣿⣿⣿⣇⠸⣿⣿ +⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⢰⡿⠁⣸⣿⡟⢠⢀⢠⢀⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⢰⣿⠟⠀⢠⣿⣿⡟⠀⢀⣼⣿⣿⡿⠀⢰⣿⣿⡟⣿⣇⢸⣿⣿⣿⣿⣿⠀⣿⣿ +⠀⠀⠀⠀⢰⡾⢶⣀⣥⣤⡀⠀⠀⠀⢰⡟⠁⣴⣿⣿⣧⡟⣾⢋⣼⣿⡿⠋⠀⠀⠀⠀⠀⠀⢠⣿⠏⠀⠀⣼⣿⣿⠀⢀⣾⣿⣳⡿⠁⠀⡇⣿⣿⣿⣿⣿⡸⣿⣿⣿⣿⣿⡀⢻⡏ +⠀⠀⠀⠀⢸⣇⠀⠻⣇⣸⡇⠀⠀⢀⡞⠀⣼⢿⣿⣿⣿⣹⡟⣾⡿⠋⠑⠦⠤⠤⣀⣀⣀⠤⣾⡿⠂⠀⢸⣿⣿⡇⢀⣾⡿⢱⡿⠁⠀⠐⠁⣿⣿⣿⣿⣿⣇⣿⣿⣿⣿⣿⡇⢸⡇ +⠀⠀⠀⠀⠀⠙⢷⣴⠟⠋⠀⠀⠀⡾⠀⢰⠃⢈⣿⣿⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⡏⠀⠀⠀⢸⣿⡿⢀⣾⡿⣇⡾⠁⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⡇ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠃⢰⠇⠀⠸⢸⣿⣿⣿⢋⡀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠸⠃⠀⠀⠀⢸⣿⡇⣾⡿⠁⡸⢣⡀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⡇ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢺⣠⠏⢀⡀⠀⣸⣿⣿⡏⢀⣹⣶⣶⣶⣿⣯⡒⢆⡀⠀⠀⠀⠀⠀⠀⢸⣿⢳⡿⠀⢰⠇⠀⠙⢦⡀⢀⠀⠀⠸⣿⣿⣿⡿⣿⣿⣿⣿⣿⡃⣼⠁ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠋⣠⠞⠀⣼⢿⣿⣿⣱⡿⠋⠁⢠⣴⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠸⣿⣿⠃⠀⠀⠀⠀⠀⠀⠙⢮⡄⠀⠀⢻⣿⣿⣿⢿⣿⣿⣿⣿⠀⣿⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⣁⠞⠁⢀⣾⣿⢸⣿⡿⡿⠀⠀⣰⣿⣿⣿⣿⡟⢻⡇⠀⠀⠀⠀⠀⠀⠀⢻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠲⣀⠈⢿⣿⣿⠈⣿⣿⣿⣿⢠⣿⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⠟⠁⢀⣴⣿⣿⣿⣾⣿⣿⠃⠀⢠⡟⠉⠙⠛⢻⣷⣿⡇⠀⠀⠀⠀⠀⠀⠀⠸⠃⠀⠀⠀⠀⢠⣤⣀⠀⡀⠀⠀⠀⠙⠚⢿⣿⣧⠸⣿⣿⣿⣾⣷⢰ +⠀⠀⠀⠀⠀⠀⢀⣴⡿⢛⡥⢀⣴⣿⣿⣿⠟⠀⢹⣿⣧⠀⠀⠘⢇⠀⣀⡀⣸⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⣿⣿⣷⣿⣤⡀⠀⠀⠀⠈⢿⣿⣆⠸⣿⣿⣿⣿⣾ +⠀⠀⠀⢀⣠⠾⠋⢉⣴⣫⣶⣿⣿⡿⠋⠁⠀⠀⠀⣿⣿⡄⠀⠈⢿⡀⠈⠉⢁⡼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣷⣧⡀⠀⠈⢻⣿⣆⠹⣿⣿⣿⣿ +⠀⠀⠀⠈⢱⣄⣾⣯⣿⣿⠟⠋⠀⠀⠀⠀⠀⣠⣼⠃⠙⢷⠀⠐⠚⠿⠖⠚⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⠛⠿⢿⣿⡏⢙⡏⠻⣿⣆⠀⠀⠻⣿⣷⣿⣿⣿⣿ +⡀⠀⠀⣠⣿⣿⣿⠟⣹⣵⣤⣤⣤⣤⣤⣤⡼⢿⡏⠀⠀⠀⠙⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡃⠀⠀⠀⠀⢘⣿⣿⠇⠀⠹⣿⡆⠀⠀⢸⣏⣿⣿⣿⣿ +⣡⣴⣾⣻⣿⠟⣩⣾⣿⣿⣿⣿⣿⣿⣿⡏⠀⣸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢉⣳⠀⢤⣀⣠⠞⢉⡿⠀⠀⠀⢹⣷⠀⢀⣾⣾⣿⣿⣿⣿ +⣿⣿⢣⣿⣗⣼⣿⣿⡿⠿⢿⡟⠛⠛⠛⣷⠞⠋⠛⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣧⠀⠀⠀⠀⣠⠟⠀⠀⠀⠀⣸⠇⢀⣾⣾⣿⢿⣿⣿⣿ +⣿⣿⠠⣿⠿⣿⡁⠈⠀⠀⠀⠑⣄⣠⠞⠁⠀⠀⠀⣀⡹⠶⠤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣒⠖⠋⠁⠀⠀⠀⠀⠞⠁⣰⣿⣿⠟⢡⣿⡿⠋⠀ +⡋⠙⣸⠃⠀⠈⠻⣦⠀⢀⡴⣶⠟⠁⠀⠀⣀⡴⠚⠁⠀⠀⠀⠙⣆⠀⠀⠀⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⡿⢟⡥⣺⣿⠟⠀⠊⠀ +⠀⠀⠃⠀⠀⠀⠀⢈⡿⠋⣰⠇⠀⠀⠐⠚⠁⠀⠀⠀⠀⣠⠴⠛⠋⠓⣆⠀⠈⢇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣛⣻⠵⠚⢁⡴⠟⠁⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⣰⠏⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⣠⠖⠋⠀⠀⠀⠀⠀⢸⣦⠀⠈⠳⠤⠴⠖⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠊⠉⠉⠀⢀⣤⠶⠭⠄⠀⠀⠀⠀⠀⢀ +⠀⠀⠀⠀⠀⡼⠁⠀⠀⠀⠘⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⠞⠉⠈⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⠋⠁⠀⠀⠀⠀⢀⣀⣀⠐⠃ +⠀⠀⠀⠀⡼⠁⠀⠀⠀⠀⠀⡎⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠖⠋⠀⢀⠀⠀⢸⠀⠀⠀⡤⠤⠤⣤⡴⠒⠒⠒⢦⡖⠒⠲⠤⣄⣀⡀⠀⣀⣤⣾⡋⠉⠓⠶⠖⠚⠛⠉⠁⠀⠀⠀⢀ +⠀⠀⠀⡸⠁⠀⠀⠀⠀⠀⠀⡇⠀⠈⢣⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⣦⡞⠀⢠⡞⠀⠀⠀⠈⡇⠀⠀⠀⢸⠇⠀⠀⠀⡇⠈⠉⠙⢿⣿⣿⣿⣆⠀⠀⠀⠀⢠⠀⠀⣠⣀⣠⣿ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡇⠀⡇⠀⢸⡓⢤⡀⠀⠀⠀⠀⠀⠀⢀⡴⢻⠉⢹⣿⠇⠀⠀⠀⠀⡇⠀⠀⠀⡸⠀⠀⠀⢰⡇⠀⠀⠀⢸⣿⣿⡿⠟⠳⠤⠖⠶⠤⣤⣴⣿⣌⢿⣿ +⠀⠀⠀⠀⠀⠀⢀⠴⠋⠉⠁⡇⠀⠀⠀⠀⠇⠀⠉⠑⠶⢤⡤⠴⠞⠉⠄⣼⣠⠾⠿⠀⠀⠀⠀⠀⠃⠀⠀⠀⠃⠀⠀⠀⠸⠁⠀⠀⢰⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠦⡹ +⠠⠂⠀⠀⠀⠀⢸⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣲⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡏⠘⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠃⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠁⠀⠀⠀⠀⠀⠙⠓⠤⢤⣤⣀⣀⣀⣀⣀⣠⡤⢖⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⢀⠀⠀⢀⡔⠉⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/components/dataLink/DataLinkFrames.cpp b/components/dataLink/DataLinkFrames.cpp index b2a73c0..6c45961 100644 --- a/components/dataLink/DataLinkFrames.cpp +++ b/components/dataLink/DataLinkFrames.cpp @@ -1,6 +1,12 @@ #include "DataLinkManager.h" #include "esp_log.h" +/** + * @brief Creates a Control Frame from `FrameHeader` + * + * @param header + * @return ControlFrame + */ ControlFrame make_control_frame_from_header(const FrameHeader& header) { ControlFrame frame{}; frame.preamble = header.preamble; @@ -13,6 +19,12 @@ ControlFrame make_control_frame_from_header(const FrameHeader& header) { return frame; } +/** + * @brief Creates a Generic Frame from `FrameHeader` + * + * @param header + * @return GenericFrame + */ GenericFrame make_generic_frame_from_header(const FrameHeader& header) { GenericFrame frame{}; frame.preamble = header.preamble; @@ -27,6 +39,13 @@ GenericFrame make_generic_frame_from_header(const FrameHeader& header) { return frame; } +/** + * @brief Store a fragment that has been received + * + * @param fragment + * @param channel + * @return esp_err_t + */ esp_err_t DataLinkManager::store_fragment(GenericFrame* fragment, uint8_t channel){ if (fragment == nullptr){ return ESP_ERR_INVALID_ARG; @@ -40,8 +59,18 @@ esp_err_t DataLinkManager::store_fragment(GenericFrame* fragment, uint8_t channe return ESP_ERR_INVALID_ARG; } - if (fragment_map[fragment->receiver_id].find(fragment->seq_num) == fragment_map[fragment->receiver_id].end()){ - FragmentMetadata& metadata = fragment_map[fragment->receiver_id][fragment->seq_num]; + // ESP_LOGI(DEBUG_LINK_TAG, "got frame %d, fragment %d of %d", fragment->seq_num, fragment->frag_num, fragment->total_frag); + + if (rx_fragment_mutex[channel] == NULL){ + return ESP_FAIL; + } + + if (xSemaphoreTake(rx_fragment_mutex[channel], pdMS_TO_TICKS(ASYNC_QUEUE_WAIT_TICKS)) != pdTRUE){ + return ESP_ERR_TIMEOUT; + } + + if (fragment_map[channel][fragment->receiver_id].find(fragment->seq_num) == fragment_map[channel][fragment->receiver_id].end()){ + FragmentMetadata& metadata = fragment_map[channel][fragment->receiver_id][fragment->seq_num]; metadata.num_fragments_rx = 0; metadata.fragments.reserve(fragment->total_frag); @@ -50,21 +79,51 @@ esp_err_t DataLinkManager::store_fragment(GenericFrame* fragment, uint8_t channe } } - FragmentMetadata& metadata = fragment_map[fragment->receiver_id][fragment->seq_num]; - if (fragment->frag_num >= metadata.fragments.size()){ + FragmentMetadata& metadata = fragment_map[channel][fragment->receiver_id][fragment->seq_num]; + if ((fragment->frag_num-1) > metadata.fragments.size()){ + xSemaphoreGive(rx_fragment_mutex[channel]); return ESP_ERR_INVALID_STATE; } - if (metadata.fragments[fragment->frag_num].data_len ==0){ - metadata.fragments[fragment->frag_num] = *fragment; + if (metadata.fragments[fragment->frag_num-1].data_len == 0){ + metadata.fragments[fragment->frag_num-1] = *fragment; metadata.num_fragments_rx++; + // ESP_LOGI(DEBUG_LINK_TAG, "store frame %d fragment %d success; got %d out of %d", fragment->seq_num, fragment->frag_num, metadata.num_fragments_rx, metadata.fragments.size()); } - if (metadata.num_fragments_rx == metadata.fragments.size()){ + uint16_t last_consec_rx_frag = 0; + if (static_cast(GET_TYPE(fragment->type_flag)) != FrameType::MISC_UDP_GENERIC_TYPE){ + for (; last_consec_rx_frag < fragment->total_frag; last_consec_rx_frag++){ + if (metadata.fragments[last_consec_rx_frag].data_len == 0){ + //found missing fragment + break; + } + } + } + + size_t metadata_fragment_size = metadata.fragments.size(); + xSemaphoreGive(rx_fragment_mutex[channel]); + + if (static_cast(GET_TYPE(fragment->type_flag)) != FrameType::MISC_UDP_GENERIC_TYPE){ + SendAckMetaData data = { + .data = {GENERIC_FRAG_ACK_PREAMBLE, static_cast((last_consec_rx_frag & 0xFF00) >> 8), static_cast(last_consec_rx_frag & 0xFF), + static_cast((fragment->total_frag & 0xFF00) >> 8), static_cast(fragment->total_frag & 0xFF), + static_cast((fragment->seq_num & 0xFF00) >> 8), static_cast(fragment->seq_num & 0xFF)}, + .sender_id = fragment->sender_id, + }; + if (xSemaphoreTake(send_ack_queue_mutex[channel], pdMS_TO_TICKS(SEND_ACK_MUTEX_WAIT)) != pdTRUE){ + return ESP_FAIL; + } + + send_ack_queue[channel].push(data); + xSemaphoreGive(send_ack_queue_mutex[channel]); + } + + if (metadata.num_fragments_rx == metadata_fragment_size){ //all fragments received return complete_fragment(fragment->receiver_id, fragment->seq_num, channel); } - + return ESP_OK; } @@ -76,23 +135,44 @@ esp_err_t DataLinkManager::store_fragment(GenericFrame* fragment, uint8_t channe * @return esp_err_t */ esp_err_t DataLinkManager::complete_fragment(uint16_t board_id, uint16_t sequence_num, uint8_t channel){ - if (fragment_map[board_id].find(sequence_num) == fragment_map[board_id].end()){ + Rx_Metadata rx; + + if (xSemaphoreTake(rx_fragment_mutex[channel], pdMS_TO_TICKS(ASYNC_QUEUE_WAIT_TICKS)) != pdTRUE){ + return ESP_ERR_TIMEOUT; + } + + if (fragment_map[channel][board_id].find(sequence_num) == fragment_map[channel][board_id].end()){ return ESP_ERR_NOT_FOUND; } - FragmentMetadata& metadata = fragment_map[board_id][sequence_num]; + FragmentMetadata& metadata = fragment_map[channel][board_id][sequence_num]; if (metadata.num_fragments_rx != metadata.fragments.size()){ return ESP_ERR_INVALID_STATE; } - - Rx_Metadata rx; - uint16_t total_data_len = metadata.num_fragments_rx*MAX_CONTROL_DATA_LEN; //max data size with n fragments + uint16_t total_data_len = metadata.num_fragments_rx*MAX_FRAME_SIZE; //max data size with n fragments + xSemaphoreGive(rx_fragment_mutex[channel]); + uint8_t* combined_data = (uint8_t*)pvPortMalloc(total_data_len); rx.data_len = total_data_len; if (combined_data == nullptr){ return ESP_ERR_NO_MEM; } + if (rx_fragment_mutex[channel] == NULL){ + return ESP_FAIL; + } + + // ESP_LOGI(DEBUG_LINK_TAG, "completing %d fragments for frame %d", metadata.num_fragments_rx, sequence_num); + + if (xSemaphoreTake(rx_fragment_mutex[channel], pdMS_TO_TICKS(ASYNC_QUEUE_WAIT_TICKS)) != pdTRUE){ + return ESP_ERR_TIMEOUT; + } + + if (fragment_map[channel][board_id].find(sequence_num) == fragment_map[channel][board_id].end()){ + xSemaphoreGive(rx_fragment_mutex[channel]); + return ESP_ERR_NOT_FOUND; + } + rx.data = combined_data; uint16_t prev_index = 0; for (size_t i = 0; i < metadata.num_fragments_rx; i++){ @@ -100,6 +180,8 @@ esp_err_t DataLinkManager::complete_fragment(uint16_t board_id, uint16_t sequenc prev_index += metadata.fragments[i].data_len; } + xSemaphoreGive(rx_fragment_mutex[channel]); + rx.data_len = prev_index; if (async_rx_queue_mutex[channel] == nullptr){ @@ -119,6 +201,8 @@ esp_err_t DataLinkManager::complete_fragment(uint16_t board_id, uint16_t sequenc .crc_16 = 0 }; + // ESP_LOGI(DEBUG_LINK_TAG, "pushing frame %d onto async rx queue", sequence_num); + if (xSemaphoreTake(async_rx_queue_mutex[channel], pdMS_TO_TICKS(ASYNC_QUEUE_WAIT_TICKS)) != pdTRUE){ vPortFree(combined_data); return ESP_ERR_TIMEOUT; @@ -128,15 +212,31 @@ esp_err_t DataLinkManager::complete_fragment(uint16_t board_id, uint16_t sequenc xSemaphoreGive(async_rx_queue_mutex[channel]); - fragment_map[board_id].erase(sequence_num); + fragment_map[channel][board_id].erase(sequence_num); - if (fragment_map[board_id].empty()) { - fragment_map.erase(board_id); + if (fragment_map[channel][board_id].empty()) { + fragment_map[channel].erase(board_id); } + // ESP_LOGI(DEBUG_LINK_TAG, "frame %d pushed success", sequence_num); + return ESP_OK; } +/** + * @brief Sends an ACK + * + * @param sender_id This is the board id that is receiving the ACK (the original sender board id) + * @param data + * @param data_len + * @return esp_err_t + * + * @note This may be moved to a private function - Unsure if users should be able to manually send ACKs + */ +esp_err_t DataLinkManager::send_ack(uint8_t sender_id, uint8_t* data, uint16_t data_len){ + return send(sender_id, data, data_len, FrameType::ACK_TYPE, 0x0); +} + /** * @brief Checks the channel receive queue for any received frames. If there is, return the first frame's data size * @@ -214,11 +314,13 @@ esp_err_t DataLinkManager::async_receive(uint8_t* data, uint16_t data_len, Frame memcpy(data, top.data, top.data_len); vPortFree(top.data); + // ESP_LOGI(DEBUG_LINK_TAG, "pushed frame %d onto async queue", header->seq_num); + return ESP_OK; } esp_err_t DataLinkManager::receive_rmt(uint8_t channel){ - uint16_t data_len = MAX_CONTROL_DATA_LEN+GENERIC_FRAME_OVERHEAD; //max possible data len + uint16_t data_len = MAX_FRAME_SIZE; //max possible data len uint8_t data[data_len]; memset(data, 0, data_len); @@ -231,7 +333,7 @@ esp_err_t DataLinkManager::receive_rmt(uint8_t channel){ return ESP_ERR_TIMEOUT; } - if (recv_len > MAX_CONTROL_DATA_LEN + GENERIC_FRAME_OVERHEAD){ + if (recv_len > MAX_FRAME_SIZE){ ESP_LOGE(DEBUG_LINK_TAG, "Received frame is too large to be control or generic"); return ESP_ERR_INVALID_RESPONSE; } @@ -241,7 +343,7 @@ esp_err_t DataLinkManager::receive_rmt(uint8_t channel){ return ESP_ERR_INVALID_RESPONSE; } - uint8_t message[MAX_CONTROL_DATA_LEN]; + uint8_t message[MAX_FRAME_SIZE]; memset(message, 0, sizeof(message)); size_t message_size = 0; FrameHeader header; @@ -254,10 +356,37 @@ esp_err_t DataLinkManager::receive_rmt(uint8_t channel){ // print_buffer_binary(message, message_size); + //push control frame onto async_receive_queue + if (static_cast(GET_TYPE(header.type_flag)) == FrameType::ACK_TYPE){ + if (message_size != GENERIC_FRAG_ACK_DATA_SIZE || message_size == 0){ + return ESP_OK; + } + + if (message[0] != GENERIC_FRAG_ACK_PREAMBLE){ + return ESP_OK; + } + + FrameAckRecord record = { + .last_ack = static_cast((message[1] << 8) | (message[2])), + .total_frags = static_cast((message[3] << 8) | (message[4])), + .seq_num = static_cast((message[5] << 8) | (message[6])) + }; + + res = inc_head_sliding_window(channel, header.sender_id, record.seq_num, &record); + + // if (res == ESP_OK){ + // ESP_LOGI(DEBUG_LINK_TAG, "Got ACK for seq number %d from board %d! Highest Conseq ACK: 0x%X%X Total Frag: 0x%X%X", record.seq_num, header.sender_id, message[1], message[2], message[3], message[4]); + // } else { + // ESP_LOGI(DEBUG_LINK_TAG, "Got ACK for seq number %d from board %d but got a lower conseq ack 0x%x%X Total Frag: 0x%X%X", record.seq_num, header.sender_id, message[1], message[2], message[3], message[4]); + // } + + return ESP_OK; + } + if (!IS_CONTROL_FRAME(header.type_flag)){ //Handle generic frame fragment GenericFrame frame = make_generic_frame_from_header(header); - if (message_size > MAX_CONTROL_DATA_LEN){ + if (message_size > MAX_FRAME_SIZE){ return ESP_FAIL; } @@ -268,16 +397,16 @@ esp_err_t DataLinkManager::receive_rmt(uint8_t channel){ //control frame handling: - TODO: clean up :) memcpy(data, message, message_size); - ESP_LOGI(DEBUG_LINK_TAG, "Received frame of type 0x%X destined for board %d", GET_TYPE(header.type_flag), header.receiver_id); + // ESP_LOGI(DEBUG_LINK_TAG, "Received frame of type 0x%X destined for board %d", GET_TYPE(header.type_flag), header.receiver_id); //check for a rip frame if (static_cast(GET_TYPE(header.type_flag)) == FrameType::RIP_TABLE_CONTROL){ - // printf("Got a RIP frame\n"); + ESP_LOGI(DEBUG_LINK_TAG, "Got a RIP frame"); for (size_t i = 0; i < message_size-1; i+=2){ uint8_t board_id = message[i]; uint8_t hops = message[i+1]; - ESP_LOGI(DEBUG_LINK_TAG, "Received: board_id %d and number of hops %d on channel %d", board_id, hops, channel); + // ESP_LOGI(DEBUG_LINK_TAG, "Received: board_id %d and number of hops %d on channel %d", board_id, hops, channel); RIPRow* entry = nullptr; @@ -318,16 +447,25 @@ esp_err_t DataLinkManager::receive_rmt(uint8_t channel){ return res; } } - } - //got frame but not destined for this board - if (header.receiver_id != this_board_id && header.receiver_id != BROADCAST_ADDR && header.seq_num > sequence_num_map[header.receiver_id]){ - // ESP_LOGI(DEBUG_LINK_TAG, "Sending message to board %d with message %s", header.receiver_id, message); - res = send(header.receiver_id, message, message_size, FrameType::DEBUG_CONTROL_TYPE, 0); return res; } - //push control frame onto async_receive_queue + uint16_t seq_num = 0; + + res = get_sequence_num(header.receiver_id, &seq_num); + + if (res != ESP_OK){ + return res; + } + + //got frame but not destined for this board + if (header.receiver_id != this_board_id && header.receiver_id != BROADCAST_ADDR && header.seq_num > seq_num){ + // ESP_LOGI(DEBUG_LINK_TAG, "Sending message to board %d with message %s", header.receiver_id, message); + res = send(header.receiver_id, message, message_size, FrameType::MISC_CONTROL_TYPE, 0); + return res; + } + uint8_t* metadata_message = (uint8_t*)pvPortMalloc(message_size); if (metadata_message == nullptr){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to malloc for receive"); @@ -370,7 +508,48 @@ esp_err_t DataLinkManager::receive_rmt(uint8_t channel){ res = link_layer_obj->start_receive_frames_rmt(i); } - vTaskDelay(pdMS_TO_TICKS(SCHEDULER_PERIOD_MS)); + vTaskDelay(pdMS_TO_TICKS(RECEIVE_TASK_PERIOD_MS)); + } + + vTaskDelete(nullptr); +} + +[[noreturn]] void DataLinkManager::send_ack_thread_main(void* args){ + DataLinkManager* link_layer_obj = static_cast(args); + if (link_layer_obj == nullptr || link_layer_obj->manual_broadcasts == nullptr){ + ESP_LOGE(DEBUG_LINK_TAG, "Send Ack thread failed to start due to invalid pointer"); + vTaskDelete(nullptr); + } + + for (uint8_t i = 0; i < link_layer_obj->num_channels; i++){ + if (link_layer_obj->send_ack_queue_mutex[i] == NULL){ + ESP_LOGE(DEBUG_LINK_TAG, "%d send ack queue mutex is null!", i); + vTaskDelete(nullptr); + } + } + + ESP_LOGI(DEBUG_LINK_TAG, "Starting Send ACK task"); + + esp_err_t res; + + while(!link_layer_obj->stop_tasks){ + for (uint8_t channel = 0; channel < link_layer_obj->num_channels; channel++){ + vTaskDelay(pdMS_TO_TICKS(SEND_ACK_PERIOD_MS)); + + if (xSemaphoreTake(link_layer_obj->send_ack_queue_mutex[channel], pdMS_TO_TICKS(SEND_ACK_MUTEX_WAIT)) != pdTRUE){ + continue; + } + + if (link_layer_obj->send_ack_queue[channel].empty()){ + xSemaphoreGive(link_layer_obj->send_ack_queue_mutex[channel]); + continue; + } + + SendAckMetaData data = link_layer_obj->send_ack_queue[channel].front(); + link_layer_obj->send_ack_queue[channel].pop(); + link_layer_obj->send_ack(data.sender_id, data.data, GENERIC_FRAG_ACK_DATA_SIZE); + xSemaphoreGive(link_layer_obj->send_ack_queue_mutex[channel]); + } } vTaskDelete(nullptr); diff --git a/components/dataLink/DataLinkManager.cpp b/components/dataLink/DataLinkManager.cpp index e159a28..29d5d9c 100644 --- a/components/dataLink/DataLinkManager.cpp +++ b/components/dataLink/DataLinkManager.cpp @@ -4,7 +4,7 @@ #include "nvs_flash.h" /** - * @brief Construct a new Data Link Manager:: Data Link Manager object + * @brief Constructs a new Data Link Manager object * * @param board_id Board ID of the current board. Will be written to the NVM under key "board" if not already written. */ @@ -16,22 +16,84 @@ DataLinkManager::DataLinkManager(uint8_t board_id, uint8_t num_channels = MAX_CH return; } + uint8_t existing_board_id = 0; + get_board_id(existing_board_id); + this_board_id = board_id; - set_board_id(this_board_id); + if (existing_board_id != board_id){ + set_board_id(this_board_id); + } this->num_channels = num_channels; + sequence_num_map_mutex = xSemaphoreCreateMutex(); + init_scheduler(); init_rip(); } +/** + * @brief Returns if the link layer is ready to receive frames + * + * @return esp_err_t + */ +esp_err_t DataLinkManager::ready(){ + return (phys_comms == nullptr || rip_broadcast_task == NULL || rip_ttl_task == NULL || scheduler_task == NULL || receive_task == NULL) ? ESP_FAIL : ESP_OK; +} + +/** + * @brief Atomic function to get and post increment sequence number map + * + * @param board_id + * @param seq_num + * @return esp_err_t + */ +esp_err_t DataLinkManager::get_inc_sequence_num(uint8_t board_id, uint16_t* seq_num){ + if (seq_num == NULL){ + return ESP_ERR_INVALID_ARG; + } + + if (xSemaphoreTake(sequence_num_map_mutex, pdMS_TO_TICKS(SEQUENCE_NUM_MAP_MUTEX_MAX_WAIT_MS)) != pdTRUE){ + return ESP_FAIL; + } + + *seq_num = sequence_num_map[board_id]++; + + xSemaphoreGive(sequence_num_map_mutex); + + return ESP_OK; +} + +/** + * @brief Atomic function to get sequence number map + * + * @param board_id + * @param seq_num + * @return esp_err_t + */ +esp_err_t DataLinkManager::get_sequence_num(uint8_t board_id, uint16_t* seq_num){ + if (seq_num == NULL){ + return ESP_ERR_INVALID_ARG; + } + + if (xSemaphoreTake(sequence_num_map_mutex, pdMS_TO_TICKS(SEQUENCE_NUM_MAP_MUTEX_MAX_WAIT_MS)) != pdTRUE){ + return ESP_FAIL; + } + + *seq_num = sequence_num_map[board_id]; + + xSemaphoreGive(sequence_num_map_mutex); + + return ESP_OK; +} + DataLinkManager::~DataLinkManager(){ stop_tasks = true; bool dummy = true; xQueueSend(manual_broadcasts, &dummy, 0); - vTaskDelay(pdMS_TO_TICKS(50)); //delay to allow tasks to be killed + vTaskDelay(pdMS_TO_TICKS(100)); //delay to allow tasks to be killed if (rip_broadcast_task == NULL){ vTaskDelete(rip_broadcast_task); @@ -45,6 +107,14 @@ DataLinkManager::~DataLinkManager(){ vTaskDelete(scheduler_task); scheduler_task = NULL; } + if (receive_task == NULL){ + vTaskDelete(receive_task); + receive_task = NULL; + } + if (send_ack_task == NULL){ + vTaskDelete(send_ack_task); + send_ack_task = NULL; + } } esp_err_t DataLinkManager::set_board_id(uint8_t board_id){ @@ -54,13 +124,13 @@ esp_err_t DataLinkManager::set_board_id(uint8_t board_id){ } nvs_handle_t handle; - esp_err_t res = nvs_open("board", NVS_READWRITE, &handle); + esp_err_t res = nvs_open(NVS_BOARD_NAMESPACE, NVS_READWRITE, &handle); if (res != ESP_OK){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to open NVS Handle"); return res; } - - res = nvs_set_u8(handle, "id", board_id); + + res = nvs_set_u8(handle, NVS_BOARD_ID_KEY, board_id); if (res != ESP_OK){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to write ID %d to NVM", board_id); nvs_close(handle); @@ -75,7 +145,7 @@ esp_err_t DataLinkManager::set_board_id(uint8_t board_id){ } this_board_id = board_id; - printf("Successfully wrote %d to NVM\n", board_id); + ESP_LOGI(DEBUG_LINK_TAG, "Successfully wrote %d to NVM", board_id); nvs_close(handle); @@ -84,20 +154,20 @@ esp_err_t DataLinkManager::set_board_id(uint8_t board_id){ esp_err_t DataLinkManager::get_board_id(uint8_t& board_id){ nvs_handle_t handle; - esp_err_t res = nvs_open("board", NVS_READWRITE, &handle); + esp_err_t res = nvs_open(NVS_BOARD_NAMESPACE, NVS_READWRITE, &handle); if (res != ESP_OK){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to open NVS Handle"); return res; } - res = nvs_get_u8(handle, "id", &board_id); + res = nvs_get_u8(handle, NVS_BOARD_ID_KEY, &board_id); if (res != ESP_OK){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to get ID from NVM. Please make sure NVM is already assigned a board id!"); nvs_close(handle); return res; } - printf("Successfully got board id %d from NVM\n", board_id); + ESP_LOGI(DEBUG_LINK_TAG, "Successfully got board id %d from NVM", board_id); nvs_close(handle); @@ -125,8 +195,8 @@ esp_err_t DataLinkManager::create_control_frame(uint8_t* data, uint16_t data_len return ESP_ERR_INVALID_ARG; } - if (data_len > MAX_CONTROL_DATA_LEN){ - ESP_LOGE(DEBUG_LINK_TAG, "Data for control frame is too large. Maximum size is %d. Current data length is %d", MAX_CONTROL_DATA_LEN, data_len); + if (data_len > MAX_FRAME_SIZE){ + ESP_LOGE(DEBUG_LINK_TAG, "Data for control frame is too large. Maximum size is %d. Current data length is %d", MAX_FRAME_SIZE, data_len); return ESP_ERR_INVALID_ARG; } @@ -181,6 +251,17 @@ esp_err_t DataLinkManager::create_control_frame(uint8_t* data, uint16_t data_len return ESP_OK; } +/** + * @brief Helper function to create a generic frame + * + * @param data + * @param data_len + * @param generic_frame + * @param offset + * @param send_data + * @param send_data_len + * @return esp_err_t + */ esp_err_t DataLinkManager::create_generic_frame(uint8_t* data, uint16_t data_len, GenericFrame generic_frame, uint16_t offset, uint8_t* send_data, size_t* send_data_len){ if (data == nullptr){ ESP_LOGE(DEBUG_LINK_TAG, "Data array does not exist"); @@ -192,8 +273,8 @@ esp_err_t DataLinkManager::create_generic_frame(uint8_t* data, uint16_t data_len return ESP_ERR_INVALID_ARG; } - if (data_len > MAX_CONTROL_DATA_LEN){ - ESP_LOGE(DEBUG_LINK_TAG, "Data for control frame is too large. Maximum size is %d. Current data length is %d", MAX_CONTROL_DATA_LEN, data_len); + if (data_len > MAX_FRAME_SIZE){ + ESP_LOGE(DEBUG_LINK_TAG, "Data for generic frame is too large. Maximum size is %d. Current data length is %d", MAX_FRAME_SIZE, data_len); return ESP_ERR_INVALID_ARG; } @@ -268,13 +349,18 @@ esp_err_t DataLinkManager::create_generic_frame(uint8_t* data, uint16_t data_len esp_err_t DataLinkManager::send(uint8_t dest_board, uint8_t* data, uint16_t data_len, FrameType type, uint8_t flag){ bool isControlFrame = IS_CONTROL_FRAME((uint8_t)type); - if (isControlFrame && data_len > MAX_CONTROL_DATA_LEN){ - //Control frames has max data size of MAX_CONTROL_DATA_LEN + if (isControlFrame && data_len > MAX_FRAME_SIZE){ + //Control frames has max data size of MAX_FRAME_SIZE return ESP_ERR_INVALID_ARG; } - if (!isControlFrame && data_len > MAX_GENERIC_NUM_FRAG * MAX_CONTROL_DATA_LEN){ - //Generic frames has max MAX_GENERIC_NUM_FRAG fragments, each max size of MAX_CONTROL_DATA_LEN (data size) + if (!isControlFrame && data_len > MAX_GENERIC_NUM_FRAG * MAX_GENERIC_DATA_LEN){ + //Generic frames has max MAX_GENERIC_NUM_FRAG fragments, each max size of MAX_GENERIC_DATA_LEN (data size) + return ESP_ERR_INVALID_ARG; + } + + if (!isControlFrame && dest_board == BROADCAST_ADDR && type != FrameType::MISC_UDP_GENERIC_TYPE){ + //If broadcasting generic frames, we don't to spam acks to this board return ESP_ERR_INVALID_ARG; } @@ -293,17 +379,26 @@ esp_err_t DataLinkManager::send(uint8_t dest_board, uint8_t* data, uint16_t data if (data_len <= MAX_CONTROL_DATA_LEN){ frag_info = (1 << 16); //1 total fragment required } else { - frag_info = (data_len / MAX_CONTROL_DATA_LEN + 1) << 16; + uint32_t total_frags = (data_len + MAX_GENERIC_DATA_LEN - 1) / MAX_GENERIC_DATA_LEN; + frag_info = (total_frags) << 16; } } + uint16_t seq_num = 0; + + esp_err_t res = get_inc_sequence_num(dest_board, &seq_num); + if (res != ESP_OK){ + ESP_LOGE(DEBUG_LINK_TAG, "Failed atomic get increment sequence number map"); + return res; + } + SchedulerMetadata metadata = { .header = { .preamble = START_OF_FRAME, .sender_id = this_board_id, .receiver_id = dest_board, - .seq_num = sequence_num_map[dest_board]++, + .seq_num = seq_num, .type_flag = (uint8_t)((static_cast(type) & 0xF0) | (flag & 0xF)), .frag_info = frag_info, .data_len = data_len, @@ -313,10 +408,13 @@ esp_err_t DataLinkManager::send(uint8_t dest_board, uint8_t* data, uint16_t data .enqueue_time_ns = 0, .data = saved_data, .len = data_len, + .last_ack = 0, + .curr_fragment = 0, + .timeout = 0, }; uint8_t channel = 0; - esp_err_t res = route_frame(dest_board, &channel); + res = route_frame(dest_board, &channel); if (res != ESP_OK){ // ESP_LOGE(DEBUG_LINK_TAG, "Failed to route message to board %d", dest_board); @@ -424,6 +522,10 @@ esp_err_t DataLinkManager::get_data_from_frame(uint8_t* data, size_t data_len, u header->seq_num = (uint16_t)data[3] | ((uint16_t)data[4] << 8); header->type_flag = data[5]; if (IS_CONTROL_FRAME(data[5])){ + if (data_len < 9){ + return ESP_ERR_INVALID_SIZE; + } + header->data_len = (uint16_t)data[6] | ((uint16_t)data[7] << 8); if (header->data_len > data_len){ @@ -437,6 +539,12 @@ esp_err_t DataLinkManager::get_data_from_frame(uint8_t* data, size_t data_len, u } *message_size = header->data_len; + + if (*message_size > MAX_CONTROL_DATA_LEN || (10 + *message_size > data_len)){ + ESP_LOGE(DEBUG_LINK_TAG, "Invalid payload length: %u", *message_size); + return ESP_ERR_INVALID_SIZE; + } + memcpy(message, &data[8], header->data_len); geneate_crc_16(data, 8*sizeof(uint8_t) + header->data_len, &header->crc_16); @@ -452,19 +560,34 @@ esp_err_t DataLinkManager::get_data_from_frame(uint8_t* data, size_t data_len, u } else { //generic frame + + if (data_len < 13){ + return ESP_ERR_INVALID_SIZE; + } + uint16_t total_frag = (uint16_t)data[6] | ((uint16_t)data[7] << 8); uint16_t frag_num = (uint16_t)data[8] | ((uint16_t)data[9] << 8); header->frag_info = (total_frag << 16) | (frag_num); header->data_len = (uint16_t)data[10] | ((uint16_t)data[11] << 8); *message_size = header->data_len; - memcpy(message, &data[12], header->data_len); - - geneate_crc_16(data, 12*sizeof(uint8_t) + header->data_len, &header->crc_16); - uint16_t crc_calc = ((uint16_t)data[12 + header->data_len] | ((uint16_t)data[13 + header->data_len] << 8)); + if ((*message_size > MAX_GENERIC_DATA_LEN && total_frag != 1) || (14 + *message_size > data_len)){ + ESP_LOGE(DEBUG_LINK_TAG, "Invalid payload length: %u", *message_size); + return ESP_ERR_INVALID_SIZE; + } + + memcpy(message, &data[12], *message_size); + + if (total_frag != 1){ + geneate_crc_16(data, 12*sizeof(uint8_t) + *message_size, &header->crc_16); + } else { + header->crc_16 = 0; + } + + uint16_t crc_calc = ((uint16_t)data[12 + *message_size] | ((uint16_t)data[13 + *message_size] << 8)); - if (crc_calc != header->crc_16){ + if (crc_calc != header->crc_16 && total_frag != 1){ //CRC mismatch ESP_LOGE(DEBUG_LINK_TAG, "CRC Mismatch - Generic Frame"); ESP_LOGE(DEBUG_LINK_TAG, "Got 0x%04X but calculated 0x%04X\n", crc_calc, header->crc_16); @@ -479,7 +602,7 @@ esp_err_t DataLinkManager::get_data_from_frame(uint8_t* data, size_t data_len, u // printf("0x%02X %-12d %-13d %-15d 0x%02X %-10d 0x%04X\n", // header->preamble, header->sender_id, header->receiver_id, header->seq_num, header->type_flag, header->data_len, header->crc_16); - printf("Message received: %.*s\n", header->data_len, message); + // printf("Message received: %.*s\n", *message_size, message); return ESP_OK; } @@ -511,6 +634,19 @@ esp_err_t DataLinkManager::geneate_crc_16(uint8_t* data, size_t data_len, uint16 return ESP_OK; } +/** + * @brief Prints to console the encoded frame information from a byte array recevied from RMT + * + * @note Should only be used for debug purposes + * + * @warning This function may not be reliable/buggy + * + * @param data + * @param data_len + * @param message + * @param message_len + * @return esp_err_t + */ esp_err_t DataLinkManager::print_frame_info(uint8_t* data, size_t data_len, uint8_t* message, size_t message_len){ // printf("Received frame of size %d:\n", data_len); diff --git a/components/dataLink/DataLinkRIP.cpp b/components/dataLink/DataLinkRIP.cpp index adb8bfe..281c6a1 100644 --- a/components/dataLink/DataLinkRIP.cpp +++ b/components/dataLink/DataLinkRIP.cpp @@ -4,7 +4,7 @@ /** * @brief Initializes the RIP table - * + * */ void DataLinkManager::init_rip(){ for (size_t i = 0; i < RIP_MAX_ROUTES; i++){ @@ -42,7 +42,7 @@ esp_err_t DataLinkManager::rip_add_entry(uint8_t board_id, uint8_t hops, uint8_t return ESP_FAIL; } - if (xSemaphoreTake((*entry)->row_sem, (TickType_t)RIP_MAX_SEM_WAIT) != pdTRUE){ + if (xSemaphoreTake((*entry)->row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) != pdTRUE){ return ESP_FAIL; } @@ -54,11 +54,11 @@ esp_err_t DataLinkManager::rip_add_entry(uint8_t board_id, uint8_t hops, uint8_t (*entry)->ttl = RIP_TTL_START; (*entry)->valid = 1; - + // ESP_LOGI(DEBUG_LINK_TAG, "board_id %d now has hops %d from channel %d", (*entry)->info.board_id, (*entry)->info.hops, channel); - + xSemaphoreGive((*entry)->row_sem); - + if (uxQueueMessagesWaiting(manual_broadcasts) == 0){ bool dummy = true; xQueueSend(manual_broadcasts, &dummy, 0); //new row - send broadcast @@ -81,7 +81,7 @@ esp_err_t DataLinkManager::rip_reset_entry_ttl(uint8_t board_id){ return ESP_FAIL; //board doesn't exist } - if (xSemaphoreTake(entry->row_sem, (TickType_t)RIP_MAX_SEM_WAIT) != pdTRUE){ + if (xSemaphoreTake(entry->row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) != pdTRUE){ return ESP_FAIL; } @@ -97,7 +97,7 @@ esp_err_t DataLinkManager::rip_update_entry(uint8_t new_hop, uint8_t channel, RI return ESP_FAIL; //board doesn't exist } - if (xSemaphoreTake((*entry)->row_sem, (TickType_t)RIP_MAX_SEM_WAIT) != pdTRUE){ + if (xSemaphoreTake((*entry)->row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) != pdTRUE){ return ESP_FAIL; } @@ -108,9 +108,9 @@ esp_err_t DataLinkManager::rip_update_entry(uint8_t new_hop, uint8_t channel, RI (*entry)->channel = channel; // ESP_LOGI(DEBUG_LINK_TAG, "updated board_id %d now has hops %d from channel %d", (*entry)->info.board_id, (*entry)->info.hops, channel); } - + (*entry)->ttl = RIP_TTL_START; - (*entry)->valid = 1; + (*entry)->valid = 1; // ESP_LOGI(DEBUG_LINK_TAG, "refreshed board_id %d ttl", (*entry)->info.board_id); @@ -128,15 +128,15 @@ esp_err_t DataLinkManager::rip_update_entry(uint8_t new_hop, uint8_t channel, RI /** * @brief Finds the board_id in the table if it exists and stores that row in `entry` * TODO: use an unordered map instead of an array? - * - * @param board_id - * @param entry - * @return esp_err_t + * + * @param board_id + * @param entry + * @return esp_err_t */ esp_err_t DataLinkManager::rip_find_entry(uint8_t board_id, RIPRow** entry, bool reserve_row = false){ RIPRow* free_slot = nullptr; for (size_t i = 0; i < RIP_MAX_ROUTES; i++){ - if (xSemaphoreTake(rip_table[i].row_sem, (TickType_t)RIP_MAX_SEM_WAIT) != pdTRUE){ + if (xSemaphoreTake(rip_table[i].row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) != pdTRUE){ return ESP_FAIL; } if (rip_table[i].valid == RIP_VALID_ROW && rip_table[i].info.board_id == board_id){ @@ -144,7 +144,7 @@ esp_err_t DataLinkManager::rip_find_entry(uint8_t board_id, RIPRow** entry, bool xSemaphoreGive(rip_table[i].row_sem); // ESP_LOGI(DEBUG_LINK_TAG, "Found %d in table at row %d", board_id, i); return ESP_OK; - } + } if (rip_table[i].valid == RIP_INVALID_ROW && free_slot == nullptr){ free_slot = &rip_table[i]; } @@ -158,7 +158,7 @@ esp_err_t DataLinkManager::rip_find_entry(uint8_t board_id, RIPRow** entry, bool } if (free_slot != nullptr){ - if (xSemaphoreTake(free_slot->row_sem, RIP_MAX_SEM_WAIT) != pdTRUE) { + if (xSemaphoreTake(free_slot->row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) != pdTRUE) { return ESP_FAIL; } @@ -176,10 +176,10 @@ esp_err_t DataLinkManager::rip_find_entry(uint8_t board_id, RIPRow** entry, bool /** * @brief Returns the associated RIP Table row by row number. Information returned is read only. - * - * @param entry - * @param row_num - * @return esp_err_t + * + * @param entry + * @param row_num + * @return esp_err_t */ esp_err_t DataLinkManager::rip_get_row(RIPRow** entry, uint8_t row_num){ if (entry == nullptr){ @@ -190,7 +190,7 @@ esp_err_t DataLinkManager::rip_get_row(RIPRow** entry, uint8_t row_num){ return ESP_ERR_INVALID_ARG; } - if (xSemaphoreTake(rip_table[row_num].row_sem, (TickType_t)RIP_MAX_SEM_WAIT) != pdTRUE) return ESP_ERR_TIMEOUT; + if (xSemaphoreTake(rip_table[row_num].row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) != pdTRUE) return ESP_ERR_TIMEOUT; if (rip_table[row_num].valid == RIP_INVALID_ROW){ xSemaphoreGive(rip_table[row_num].row_sem); @@ -216,10 +216,10 @@ esp_err_t DataLinkManager::rip_get_row(RIPRow** entry, uint8_t row_num){ /** * @brief Sends RIP frame - * + * * @param broadcast True - broadcasts (sends rip table to all available channels); False - sends rip table via routing based on `dest_id` * @param dest_id Destination board (requesting board) to send the rip table to (ignored if `broadcast is true`) - * @return esp_err_t + * @return esp_err_t */ esp_err_t DataLinkManager::send_rip_frame(bool broadcast, uint8_t dest_id){ //use the control frame for the demo (as the number of rows increase, we will need to use the generic frame) @@ -231,22 +231,23 @@ esp_err_t DataLinkManager::send_rip_frame(bool broadcast, uint8_t dest_id){ esp_err_t res; RIPRow* entry = nullptr; + uint16_t seq_num = 0; if(broadcast){ for (size_t channel = 0; channel < num_channels; channel++){ for (size_t i = 0; i < RIP_MAX_ROUTES; i++){ res = rip_get_row(&entry, i); - + if (res != ESP_OK){ continue; } - + if (entry == nullptr){ continue; } // ESP_LOGI(DEBUG_LINK_TAG, "Found entry for board %d with hops %d", entry->info.board_id, entry->info.hops); - + if (entry->channel == channel){ //poisoned reverse rip_message[message_idx++] = entry->info.board_id; @@ -265,12 +266,18 @@ esp_err_t DataLinkManager::send_rip_frame(bool broadcast, uint8_t dest_id){ memset(send_data, 0, message_idx); memcpy(send_data, rip_message, message_idx); + res = get_inc_sequence_num(BROADCAST_ADDR, &seq_num); + if (res != ESP_OK){ + ESP_LOGE(DEBUG_LINK_TAG, "Failed atomic get increment sequence number map"); + return res; + } + SchedulerMetadata metadata = { .header = { .preamble = START_OF_FRAME, .sender_id = this_board_id, .receiver_id = BROADCAST_ADDR, - .seq_num = sequence_num_map[BROADCAST_ADDR]++, + .seq_num = seq_num, .type_flag = static_cast(FrameType::RIP_TABLE_CONTROL), .data_len = message_idx, .crc_16 = 0, @@ -279,6 +286,9 @@ esp_err_t DataLinkManager::send_rip_frame(bool broadcast, uint8_t dest_id){ .enqueue_time_ns = 0, .data = send_data, .len = message_idx, + .last_ack = 0, + .curr_fragment = 0, + .timeout = 0, }; res = push_frame_to_scheduler(metadata, channel); @@ -314,10 +324,10 @@ esp_err_t DataLinkManager::send_rip_frame(bool broadcast, uint8_t dest_id){ /** * @brief Determines which channel to route the frame to, depending on the dest (board) id - * - * @param dest_id - * @param channel_to_send - * @return esp_err_t + * + * @param dest_id + * @param channel_to_send + * @return esp_err_t */ esp_err_t DataLinkManager::route_frame(uint8_t dest_id, uint8_t* channel_to_send){ RIPRow* entry = nullptr; @@ -338,6 +348,15 @@ esp_err_t DataLinkManager::route_frame(uint8_t dest_id, uint8_t* channel_to_send return ESP_OK; } +/** + * @brief Fetches the current routing table at the perspective of the host board + * + * @details The routing table is based off of RIP + * + * @param table + * @param table_size + * @return esp_err_t + */ esp_err_t DataLinkManager::get_routing_table(RIPRow_public* table, size_t* table_size){ if (table == nullptr){ ESP_LOGE(DEBUG_LINK_TAG, "Invalid table pointer"); @@ -357,14 +376,14 @@ esp_err_t DataLinkManager::get_routing_table(RIPRow_public* table, size_t* table size_t curr_size = 0; for (size_t i = 0; i < RIP_MAX_ROUTES; i++){ - if (xSemaphoreTake(rip_table[i].row_sem, (TickType_t)RIP_MAX_SEM_WAIT) != pdTRUE){ + if (xSemaphoreTake(rip_table[i].row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) != pdTRUE){ return ESP_FAIL; } if (rip_table[i].valid == RIP_VALID_ROW){ table[i].info = rip_table[i].info; table[i].channel = rip_table[i].channel; curr_size++; - } + } xSemaphoreGive(rip_table[i].row_sem); } @@ -409,7 +428,7 @@ esp_err_t DataLinkManager::get_routing_table(RIPRow_public* table, size_t* table vTaskDelay(pdMS_TO_TICKS(RIP_MS_TO_SEC)); //run every second for (size_t i = 1; i < RIP_MAX_ROUTES; i++){ // ESP_LOGI(DEBUG_LINK_TAG, "Decrementing ttl on entry %d", i); - if (xSemaphoreTake(link_layer_obj->rip_table[i].row_sem, (TickType_t)RIP_MAX_SEM_WAIT) !=pdTRUE){ + if (xSemaphoreTake(link_layer_obj->rip_table[i].row_sem, pdMS_TO_TICKS(RIP_MAX_SEM_WAIT_MS)) !=pdTRUE){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to get sem from entry %d", i); continue; } @@ -427,7 +446,7 @@ esp_err_t DataLinkManager::get_routing_table(RIPRow_public* table, size_t* table link_layer_obj->rip_table[i].ttl_flush = RIP_FLUSH_COUNT; broadcast = true; } - } + } xSemaphoreGive(link_layer_obj->rip_table[i].row_sem); } @@ -452,5 +471,5 @@ void DataLinkManager::start_rip_tasks(){ ESP_LOGI(DEBUG_LINK_TAG, "Starting RIP Broadcast task"); xTaskCreate(DataLinkManager::rip_broadcast_timer_function, "RIPBroadcast", 4096, static_cast(this), 5, &rip_broadcast_task); ESP_LOGI(DEBUG_LINK_TAG, "Starting RIP TTL task"); - xTaskCreate(DataLinkManager::rip_ttl_decrement_task, "RIPTTL", 4096, static_cast(this), 5, &rip_ttl_task); -} + xTaskCreate(DataLinkManager::rip_ttl_decrement_task, "RIPTTL", 2048, static_cast(this), 5, &rip_ttl_task); +} \ No newline at end of file diff --git a/components/dataLink/DataLinkScheduler.cpp b/components/dataLink/DataLinkScheduler.cpp index 2f30f03..f54a0b5 100644 --- a/components/dataLink/DataLinkScheduler.cpp +++ b/components/dataLink/DataLinkScheduler.cpp @@ -2,18 +2,32 @@ #include "esp_log.h" #include "esp_timer.h" #include "freertos/semphr.h" +#include "esp_random.h" void DataLinkManager::init_scheduler(){ for (int i = 0; i < num_channels; i++){ sq_handle[i] = xSemaphoreCreateMutex(); async_rx_queue_mutex[i] = xSemaphoreCreateMutex(); + rx_fragment_mutex[i] = xSemaphoreCreateMutex(); + sliding_window_mutex[i] = xSemaphoreCreateMutex(); + send_ack_queue_mutex[i] = xSemaphoreCreateMutex(); } ESP_LOGI(DEBUG_LINK_TAG, "Starting Frame Scheduler task"); - xTaskCreate(DataLinkManager::frame_scheduler, "Scheduler", 4096, static_cast(this), 5, &scheduler_task); - xTaskCreate(DataLinkManager::receive_thread_main, "Scheduler", 8192, static_cast(this), 5, &receive_task); + xTaskCreate(DataLinkManager::frame_scheduler, "Scheduler", 4096, static_cast(this), 4, &scheduler_task); + xTaskCreate(DataLinkManager::receive_thread_main, "Receiver", 8192, static_cast(this), 5, &receive_task); + xTaskCreate(DataLinkManager::send_ack_thread_main, "Send ACKs", 8192, static_cast(this), 5, &send_ack_task); } +/** + * @brief Schedules which frame to send + * + * Scheduler: + * - All frames will be pushed to the back onto a queue + * - When a generic frame sends a chunk, it will be pushed back to the queue for the next chunk to be sent + * + * Scheduling may change (above scheduler will lead to starvation of control frames depending on the number of generic frames/fragments to send) + */ [[noreturn]] void DataLinkManager::frame_scheduler(void* args){ DataLinkManager* link_layer_obj = static_cast(args); if (link_layer_obj == nullptr){ @@ -30,7 +44,6 @@ void DataLinkManager::init_scheduler(){ } vTaskDelete(nullptr); - } /** @@ -79,6 +92,11 @@ esp_err_t DataLinkManager::push_frame_to_scheduler(SchedulerMetadata frame, uint return ESP_OK; } +/** + * @brief Scheduler sending the actual frame at the top of the heap on a channel + * + * @return esp_err_t + */ esp_err_t DataLinkManager::scheduler_send(uint8_t channel){ if (phys_comms == nullptr){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to send frame due to no RMT object"); @@ -136,71 +154,157 @@ esp_err_t DataLinkManager::scheduler_send(uint8_t channel){ return res; } - // ESP_LOGI(DEBUG_LINK_TAG, "Sending %d bytes", frame_size); + // ESP_LOGI(DEBUG_LINK_TAG, "Sending control frame with %d bytes", frame_size); + return scheduler_send_rmt(channel, frame, send_data, frame_size, false); } else { //generic frame - - if (frame.len > MAX_CONTROL_DATA_LEN){ + if (frame.len > (MAX_GENERIC_DATA_LEN)){ //fragment here - uint16_t curr_offset = frame.generic_frame_data_offset; - uint16_t fragment_size = 0; - //calculate fragment data size - if (curr_offset + MAX_CONTROL_DATA_LEN <= frame.len){ - fragment_size = curr_offset + MAX_CONTROL_DATA_LEN; + if (frame.timeout == 0){ + frame.timeout = GENERIC_FRAME_MIN_TIMEOUT; } else { - fragment_size = frame.len - curr_offset; + frame.timeout--; + res = push_frame_to_scheduler(frame, channel); + if (res != ESP_OK){ + ESP_LOGE(DEBUG_LINK_TAG, "Failed to schedule next generic frame fragment"); + vPortFree(frame.data); + return res; + } + return ESP_OK; } + + if (static_cast(GET_TYPE(frame.header.type_flag)) != FrameType::MISC_UDP_GENERIC_TYPE){ + FrameAckRecord record = { + .last_ack = 0, + .total_frags = 0 + }; + + res = get_record_sliding_window(channel, frame.header.receiver_id, frame.header.seq_num, &record); + + if (res != ESP_OK){ + ESP_LOGE(DEBUG_LINK_TAG, "Failed to get sliding window ack record for board id %d seq num %d", frame.header.receiver_id, frame.header.seq_num); + vPortFree(frame.data); + return res; + } + + if (record.last_ack == 0 && record.total_frags == 0){ + //no acks has arrived yet - can only send fragment 1 ... fragment GENERIC_FRAME_SLIDING_WINDOW_SIZE (inclusive) + // ESP_LOGI(DEBUG_LINK_TAG, "no ack received yet for board id %d seq num %d", frame.header.receiver_id, frame.header.seq_num); + if (frame.curr_fragment < GENERIC_FRAME_SLIDING_WINDOW_SIZE){ + frame.curr_fragment++; + } else { + frame.curr_fragment = 1; + } + } else { + //some acks has arrived + // ESP_LOGI(DEBUG_LINK_TAG, "some ack received for board id %d seq num %d last ack %d total frags %d", frame.header.receiver_id, frame.header.seq_num, record.last_ack, record.total_frags); + + //check if all acks are received + frame.last_ack = record.last_ack; + if (record.last_ack == record.total_frags){ + //all acks received, can simply exit + // ESP_LOGI(DEBUG_LINK_TAG, "All acks recevied for board id %d seq num %d", frame.header.receiver_id, frame.header.seq_num); + complete_record_sliding_window(channel, frame.header.receiver_id, frame.header.seq_num); + vPortFree(frame.data); + return ESP_OK; + } + + if (frame.curr_fragment - frame.last_ack < GENERIC_FRAME_SLIDING_WINDOW_SIZE && frame.curr_fragment - frame.last_ack < record.total_frags){ + frame.curr_fragment++; + } else { + frame.curr_fragment = frame.last_ack; + } + } + } else { + frame.curr_fragment++; + } + + // ESP_LOGI(DEBUG_LINK_TAG, "current fragment to be sent for seq num %d is %d", frame.header.seq_num, frame.curr_fragment); + + //calculate data offset from curr_fragment + uint16_t fragment_size = 0; + + if (frame.curr_fragment != (frame.header.frag_info >> 16)) { + fragment_size = MAX_GENERIC_DATA_LEN; + } else { + fragment_size = frame.len - (MAX_GENERIC_DATA_LEN * (frame.curr_fragment-1)); + } + + uint16_t curr_offset = MAX_GENERIC_DATA_LEN * (frame.curr_fragment - 1); + + // ESP_LOGI(DEBUG_LINK_TAG, "frame %d curr offset %d\n", frame.header.seq_num, curr_offset); + // ESP_LOGI(DEBUG_LINK_TAG, "frame %d fragment size %d\n", frame.header.seq_num, fragment_size); + frame.header.frag_info = (frame.header.frag_info & 0xFFFF0000) | frame.curr_fragment; //increment frag_num //create fragment res = create_generic_frame(frame.data, fragment_size, make_generic_frame_from_header(frame.header), curr_offset, send_data, &frame_size); if (res != ESP_OK){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to create generic frame fragment"); - vPortFree(frame.data); //free entire data for now - will need to implement retries/sliding window soon + vPortFree(frame.data); return res; } - //need to schedule the next fragment - if (curr_offset != MAX_CONTROL_DATA_LEN){ - frame.generic_frame_data_offset += fragment_size; - frame.header.frag_info += 1; //increment frag_num + res = scheduler_send_rmt(channel, frame, send_data, frame_size, true); + + if (res != ESP_OK){ + ESP_LOGE(DEBUG_LINK_TAG, "Failed to send generic frame fragment"); res = push_frame_to_scheduler(frame, channel); if (res != ESP_OK){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to schedule next generic frame fragment"); - vPortFree(frame.data); //free entire data for now - will need to implement retries/sliding window soon + vPortFree(frame.data); + } + return res; + } + + //need to schedule the next fragment (if total_frags != frag_num) + if ((frame.header.frag_info >> 16) > (frame.header.frag_info & 0xFF) || (frame.last_ack != (frame.header.frag_info >> 16) && + static_cast(GET_TYPE(frame.header.type_flag)) != FrameType::MISC_UDP_GENERIC_TYPE)){ + // frame.generic_frame_data_offset += fragment_size; + // ESP_LOGI(DEBUG_LINK_TAG, "scheduling frame %d with frag_info 0x%X", frame.header.seq_num, frame.header.frag_info); + res = push_frame_to_scheduler(frame, channel); + if (res != ESP_OK){ + ESP_LOGE(DEBUG_LINK_TAG, "Failed to schedule next generic frame fragment"); + vPortFree(frame.data); return res; - } - + } } else { //Done fragmenting, can free data array + ESP_LOGI(DEBUG_LINK_TAG, "finished fragmenting seq num %d frag_info 0x%X", frame.header.seq_num, frame.header.frag_info); vPortFree(frame.data); } } else { + //no fragmenting res = create_generic_frame(frame.data, frame.len, make_generic_frame_from_header(frame.header), 0, send_data, &frame_size); vPortFree(frame.data); - } - - if (res != ESP_OK){ - ESP_LOGE(DEBUG_LINK_TAG, "Failed to create generic frame"); - return res; + + if (res != ESP_OK){ + ESP_LOGE(DEBUG_LINK_TAG, "Failed to create generic frame"); + return res; + } + return scheduler_send_rmt(channel, frame, send_data, frame_size, false); } } + return ESP_OK; +} + +esp_err_t DataLinkManager::scheduler_send_rmt(uint8_t channel, SchedulerMetadata frame, uint8_t* send_data, size_t frame_size, bool wait_for_tx_done){ + esp_err_t res; uint8_t channel_to_route = MAX_CHANNELS; rmt_transmit_config_t config = { .loop_count = 0, .flags = { - .eot_level = 0 // typically 0 or 1, depending on your output idle level + .eot_level = 0, // typically 0 or 1, depending on your output idle level } }; if (frame.header.receiver_id == BROADCAST_ADDR){ // printf("Sending on channel %d\n", i); - phys_comms->send(send_data, frame_size, &config, channel); - + res = phys_comms->send(send_data, frame_size, &config, channel); } else { res = route_frame(frame.header.receiver_id, &channel_to_route); @@ -208,16 +312,133 @@ esp_err_t DataLinkManager::scheduler_send(uint8_t channel){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to find entry for %d", frame.header.receiver_id); return ESP_FAIL; } - // ESP_LOGI(DEBUG_LINK_TAG, "Sending message to %d", frame.header.receiver_id); - phys_comms->send(send_data, frame_size, &config, channel_to_route); + // ESP_LOGI(DEBUG_LINK_TAG, "Sending frame %d frag_info 0x%X", frame.header.seq_num, frame.header.frag_info); + res = phys_comms->send(send_data, frame_size, &config, channel_to_route); + // if (wait_for_tx_done){ + // phys_comms->wait_until_send_complete(channel_to_route); + // } } if (res != ESP_OK){ ESP_LOGE(DEBUG_LINK_TAG, "Failed to send message"); return ESP_FAIL; } else{ - // printf("Sent message to board %d\n", frame.header.receiver_id); + // ESP_LOGI(DEBUG_LINK_TAG, "Sent frame %d frag_info 0x%X", frame.header.seq_num, frame.header.frag_info); } return ESP_OK; } + +/** + * @brief Increases the head of the sliding window associated with the board id and sequence number + * + * @param channel + * @param board_id Receiving Board ID (the board who ACK'd) + * @param seq_num + * @param ack_record + * @return esp_err_t + */ +esp_err_t DataLinkManager::inc_head_sliding_window(uint8_t channel, uint8_t board_id, uint16_t seq_num, FrameAckRecord* ack_record){ + if (ack_record == NULL){ + return ESP_ERR_INVALID_ARG; + } + + if (ack_record->total_frags == 0 || ack_record->total_frags > MAX_GENERIC_NUM_FRAG + || ack_record->last_ack == 0 || ack_record->total_frags < ack_record->last_ack){ + return ESP_ERR_INVALID_ARG; + } + + if (sliding_window_mutex[channel] == NULL){ + return ESP_ERR_INVALID_STATE; + } + + if (xSemaphoreTake(sliding_window_mutex[channel], pdMS_TO_TICKS(SLIDING_WINDOW_MUTEX_TIMEOUT_MS)) != pdTRUE){ + return ESP_ERR_TIMEOUT; + } + + FrameAckRecord& record = sliding_window[channel][board_id][seq_num]; + + if (record.last_ack > ack_record->last_ack){ + xSemaphoreGive(sliding_window_mutex[channel]); + return ESP_ERR_INVALID_ARG; + } + + record.last_ack = ack_record->last_ack; + if (record.total_frags == 0){ + record.total_frags = ack_record->total_frags; + } + + xSemaphoreGive(sliding_window_mutex[channel]); + + return ESP_OK; +} + +/** + * @brief Gets the current record associated with the board id and sequence number from the sliding window + * + * @param channel + * @param board_id Receiving Board ID (the board who ACK'd) + * @param seq_num + * @param ack_record + * @return esp_err_t + */ +esp_err_t DataLinkManager::get_record_sliding_window(uint8_t channel, uint8_t board_id, uint16_t seq_num, FrameAckRecord* ack_record){ + if (ack_record == NULL){ + return ESP_ERR_INVALID_ARG; + } + + if (sliding_window_mutex[channel] == NULL){ + return ESP_ERR_INVALID_STATE; + } + + if (xSemaphoreTake(sliding_window_mutex[channel], pdMS_TO_TICKS(SLIDING_WINDOW_MUTEX_TIMEOUT_MS)) != pdTRUE){ + return ESP_ERR_TIMEOUT; + } + + if (sliding_window[channel][board_id].find(seq_num) == sliding_window[channel][board_id].end()){ + //record for this board id + seq number doesn't exist -- we don't want to create one + xSemaphoreGive(sliding_window_mutex[channel]); + ack_record->last_ack = 0; + ack_record->total_frags = 0; + return ESP_OK; + } + + FrameAckRecord& record = sliding_window[channel][board_id][seq_num]; + + ack_record->last_ack = record.last_ack; + ack_record->total_frags = record.total_frags; + + xSemaphoreGive(sliding_window_mutex[channel]); + + return ESP_OK; +} + +/** + * @brief Removes the board id + sequence number record fromt the sliding window (map) + * + * @param channel + * @param board_id Receiving Board ID (the board who ACK'd) + * @param seq_num + * @return esp_err_t + */ +esp_err_t DataLinkManager::complete_record_sliding_window(uint8_t channel, uint8_t board_id, uint16_t seq_num){ + if (sliding_window_mutex[channel] == NULL){ + return ESP_ERR_INVALID_STATE; + } + + if (xSemaphoreTake(sliding_window_mutex[channel], pdMS_TO_TICKS(SLIDING_WINDOW_MUTEX_TIMEOUT_MS)) != pdTRUE){ + return ESP_ERR_TIMEOUT; + } + + if (sliding_window[channel][board_id].find(seq_num) == sliding_window[channel][board_id].end()){ + //record for this board id + seq number doesn't exist -- we don't want to create one + xSemaphoreGive(sliding_window_mutex[channel]); + return ESP_ERR_INVALID_STATE; + } + + sliding_window[channel][board_id].erase(seq_num); + + xSemaphoreGive(sliding_window_mutex[channel]); + + return ESP_OK; +} \ No newline at end of file diff --git a/components/dataLink/README.md b/components/dataLink/README.md index 0da772f..1ba5937 100644 --- a/components/dataLink/README.md +++ b/components/dataLink/README.md @@ -1,36 +1,134 @@ WIP -# Data Link Layer - This component represents the data link layer. It will handle board to board communication (abstracting away the RMT specific details of transmitting physical raw bits over wires). -## Frame Definitions +This component is also the culmination of many 3-8 am work nights in front of vscode and/or at the labs. -See `./include/Frames.h` for frame definitions. +This component also uses many C style function parameters +- C++ is just C with classes >:) -There will be two types of frames: Control and Generic. +# Usage -Control frames will contain all control information (eg. Spinning a DC motor, moving a servo to a particular angle, sensor information). These frames will have a limit of 256B of data size with a total packet size of 41B. These frames will not be fragmented. +See [`main/main_rmt_test.cpp`](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/main/main_rmt_test.cpp?ref_type=heads) for details. -Generic frames will contain all other information. They will have a max data size of 16MiB if fragmented (max 2**16 fragments). Each fragment will still maintain a max 256B data size. +Simply create the object of the data link layer class with the desired board id and number of channels you wish the board to use (1-4 inclusive). See the [`RMTManager`](https://git.uwaterloo.ca/capstone-group2/firmware/-/tree/main/components/rmt?ref_type=heads) class for more details about channel pinouts/configurations. +The constructor will automatically create an object of the RMT class (physical layer) for you. + +Board IDs are stored in the ESP32-S3's NVS hashmap (under namespace `board` and key `id`). + +To send some data, simply use `send()` with the destination board id (or using `BROADCAST_ADDR` for all boards on the network), a `uint8_t` array of user defined data (up to `MAX_FRAME_SIZE` B), frame type (defined in enum `FrameType`), and any flags (defined in enum `FrameFlags`). + +To receive some data (if it exists), simply use `async_receive_info()` to see if there is any received data available and `async_receive()` to actually get the received data. Using either functions will also return the associated frame header. + +# Structure + +## Frames + +The data link layer has support for two types of frames: Control and Generic. Their definitions can be found in [Frames.h](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/include/Frames.h?ref_type=heads). + +Regardless of the type of frame, the maximum (raw) number of bytes that can be sent over RMT in a single transmission (per channel) is 121 B. The low MTU is being investigated as a [potential bug](https://uwaterloo-botchain.atlassian.net/browse/BTS-123). + +Each frame has a unique sequence number (16 bits wide) associated with the receiver id. An exception to this is the generic frame fragmentation, where there sequence number is shared amongst the fragments (associated with the same sequence number to the combined data). For example, the first frame sent from board 1 to board 2 will have a sequence number of 1. Any subsequent frame sent from 1 to 2 will have an increasing sequence number. + +Sequence numbers are also incremented when RIP frames are sent, however broadcasting RIP tables between boards uses a unique receiver id `BROADCAST_ADDR`, which tracks its own sequence number. + +Sequence numbers are interally tracked in an unordered map, where the receiever id is the key and the current sequence number is the value stored in the hash map. + +### Control Frames +Control frames will contain all control information (eg. Spinning a DC motor, moving a servo to a particular angle, sensor information). These frames will have a maximum user data size of 112 B with a 9 B overhead (headers). These frames will not be fragmented and will have the highest priority for transmission. + +### Generic Frames +Generic frames will contain all other information (eg. longer text, images/video frames, or a really large homework data). They will have a max data size of 6.7 MiB if fragmented (max 2^16 fragments). Each fragment will still maintain a max 107 B user data size with a 14 B overhead (headers). + +Generic frames are able to be received in out of order due to the sliding window + ACK frames. ACK frames will be sent by the receiver board to the transmitter board upon successful receive by the receiver board. ACK will contain the highest fragment number that is consecutive from the first fragment (eg. if fragments 1-5 have been received successfully, ACK will contain `5`. however, if fragments 1-3, and 7 were received successfully, ACK will only contain `3`). These ACK frames are generic frames. + +Fragments are stored in the unordered map `fragment_map`. The mapping of this hash map is as follows: +``` +channel -> receiver id -> sequence number -> [Vector of Generic Frame Fragments, size of total_frags] +``` + +Upon the successful store of a fragment, a `ACK_TYPE` frame will be created and queued (onto `send_ack_queue` to be sent back to the original sender). + +Note that if the fragment has type `MISC_UDP_GENERIC_TYPE`, no ACK frame will be sent in reply. + +Fragments will only be sent at most `GENERIC_FRAME_SLIDING_WINDOW_SIZE` from the last ACK'd fragment. For example, if fragment 2 was last ACK'd, the sender will only be able to send fragments 3 - `GENERIC_FRAME_SLIDING_WINDOW_SIZE`. It will continuously resend `GENERIC_FRAME_SLIDING_WINDOW_SIZE` fragments until a new ACK has been recevied, updating the last ACK'd count. + +ACKs, upon receiving a generic frame fragment, will be scheduled on a worker thread (apart from the receive thread). This is to (hopefully) limit blockages on the receive thread and minimizes unintentional dropped frames. To differentiate between the two frames, the `type` field in both frames will be compared against. If the MSB is set to 1, it will be determined to be a control packet. -## Routing Information Protocol (RIP) Table +Currently, if all fragments have been received, it will pass the combined data (across all user data in the fragments), to the queue `async_receive_queue`. -See `./include/Tables.h` for table definitions. See `DataLinkRIP.cpp` for function definitions. +### ACK Frames + +ACK frames have the following format in the data section: + +``` +[0] GENERIC_FRAG_ACK_PREAMBLE +[1] last_ack (MSB) +[2] last_ack (LSB) +[3] total_frags (MSB) +[4] total_frags (LSB) +[5] seq_num (MSB) +[6] seq_num (LSB) +``` + +Note that the multi-byte data is stored with big endian ordering. + +These ACK frames are sent automatically upon successful receive of a generic frame fragment. + +ACK frames themselves are sent via the `send_ack_thread_main` thread/task (after the receive thread pushes the ACK frame data onto queue `send_ack_queue`). + +Any ACK frames received will not be passed to the user. + +## User Receive + +Users will be able to access the first frame received from the queue `async_receive_queue` (separated by channel). Users will be able to peek/view the top of the queue (without popping) with the function `async_receive_info()`. Actual data popping/receiving is done with `async_receive()`. + +If the queue is empty, a `ESP_ERR_NOT_FOUND` error will be returned. + +This structure is set up with an "async" fashion is to avoid constant polling of RMT RX by the user and instead moving the RMT RX polling to a separate thread/task managed by the data link layer. The "async" fashion also allows the user to 'instantly' (as opposed to waiting for the RMT RX queue timeout) know if there were any received frames for the user to consume, to peak at the next received frame (to consume) by passing the frame header (important for dynamically allocating memory for the variable message data size), and to simplify dynamic memory management used by the link layer itself. + +# Routing Information Protocol (RIP) Table + +See [here](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/include/Tables.h?ref_type=heads) for table definitions. See [`DataLinkRIP.cpp`](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/DataLinkRIP.cpp?ref_type=heads) for function definitions. It handles all known (advertised) boards on the same network of ESP32-S3 boards. It will broadcast its stored routing table to its neighbours roughly every 30 seconds or upon receiving a routing table from its neighbours. All routes on a routing table will expire after 180 seconds, unless refreshed/updated/re-advertised by that respective board. The routing table itself will be used to route frames using the path with the least number of hops (known locally). -## Frame Management +All RIP related messages will be sent as Control Frames, giving the highest priority to discovering newly joined boards onto the network, determining the shortest path to other boards on the network, and to discover dead/disconnected boards from the network. -See `DataLinkFrames.cpp` for more information. +RIP broadcast messages uses the receiver id `BROADCAST_ADDR`. + +Users are able to get the current routing table via `get_routing_table()`. + +# Frame Management + +See [`DataLinkFrames.cpp`](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/DataLinkFrames.cpp?ref_type=heads) for more information. It handles generic frame fragmentation, user handling of receiving received frames (stored in a queue, per channel), and a thread to handle polling the available channels for receiving. -### Send Frames Scheduler +It is known that if a board is sending a lot of fragmented generic frames, it can lead to dropped received frames. This is especially important with RIP table control frames being dropped, which will eventually lead to being blocked on not detecting other boards on the connected network. -See `DataLinkScheduler.cpp` for more information. +Note that any RIP frames received will not be passed to the user receive queue. To get the RIP table, the user would need to call the public function provided by the class. -It handles all TX frames passed from the user and schedules them to be sent. The frames are stored in a priority queue (per channel), where Control frames has a higher priority than Generic frames (generally). The actual scheduler algorithm can be found in `Scheduler.h`. +## Send Frames Scheduler +See [`DataLinkScheduler.cpp`](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/DataLinkScheduler.cpp?ref_type=heads) for more information. + +It handles all TX frames passed from the user and schedules them to be sent. The frames are stored in a priority queue (per channel), where Control frames has a higher priority than Generic frames (generally). The actual scheduler algorithm can be found in [`Scheduler.h`](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/include/Scheduler.h?ref_type=heads). + +The scheduler uses an aging based priority scheduler that linearly increases the priority of the waiting frames with time with the formula: $P_f = B_f - A_f\alpha$ where: +- $P_f$ is the effective priority value (lower comes first) +- $B_f$ is the base priority +- $A_f$ is the age (amount of time the frame has waited in the queue) +- $\alpha$ is the aging factor (rate at which a frame increases priority) + +## Receive Structure + +See [`DataLinkFrames.cpp`](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/DataLinkFrames.cpp?ref_type=heads) for more information. + +The data link layer has a thread/task `receive_thread_main`, which simply starts the RMT RX job on a given channel. This essentially makes RMT start listening to the channel for any incoming frames (since RMT does not allow for continuous sensing/listening). This arrangement unfortunately will cause some frames to be missed or dropped due to data corruption (could be caused by sensing in the middle of a transmission). The period of checking all channels is defined by `RECEIVE_TASK_PERIOD_MS`. + +# Diagram + +![Wired Comms Diagram](images/wired_communication_diagram.png) diff --git a/components/dataLink/images/wired_communication_diagram.drawio b/components/dataLink/images/wired_communication_diagram.drawio new file mode 100644 index 0000000..1967882 --- /dev/null +++ b/components/dataLink/images/wired_communication_diagram.drawio @@ -0,0 +1,708 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/dataLink/images/wired_communication_diagram.png b/components/dataLink/images/wired_communication_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..5b856ed575caabcfa4f1b53e92c389b6dd882b16 GIT binary patch literal 78708 zcmeFZbySpX*ES9VLnAecfRuog(jh%aN|zwr-ObP=2GUA5f}|1>(xFn)NH-!4Lw5|n z3-P`meedUae`|g3`u_Ufe^@M->pJ(|=Z<3^=RW79ijoXI4ml1A3JU&1SxGe%6m&2O z3aB3o1NaNwb8=4<6dII=lHwX(2J5NVqZ%!Vo1uwcyCx-@78c20>JH{Hg-EMBK@-=2 zl1NHGNa>rONlDRzK!S!?swz=5nWe$O!R^Ev&DSAVl21TnDum(klKAxeBVdk1Ay>=K zhyZc-RiTs((ewQk(fYHV-FfT-t=u@np?vkt#%XWmtf~CYnC0;u-$>$ENlwB*6m%LC zR4gb8=&xVR==#p;U^%M!Qt-tKt{4OOKRyAa5eMn|^A6MC(2t@*@c(%F@7`IqX_$9naQ`WH0wDKiO6c}qrua*26!=># zKv}6Ymw(EQO#;YWg~mknPh}y1vTxhf+5RcFF(5a#CrXRNKa_oa8&DPk>v;B0xfKAp zzhBGn`lqsLfU>V|D_8$h?x)y*+>@vff`2OeKi(v$BGKbgyYLm?@AwuwPrv8P3{BzM zoc0COk4%dlSn?Ev=}NI3+Z)kg7b2?@wv^ zHA>+x7i7W#OqOZHpnjzz)DI-$O~7C5=-q~_GM{3{`Aic3i4p?FDbSc*tXjQknc9x~ z%j|GJKvNEuUoT>y={t%#uox>-?^>bsPW0p#HIG2HzWJzu*sB!V)wMXNTk1LxJEI<0 zl9}OGXN)Kb80a})PS4^iBg775xoyXp22OMt zZ<1ZqpN5w=Qtwn;Sg$%%4=-k&xu^CQJlnsqB?3OVcFTUTE8vsw_EO`hU^p2pNMI}Q z&c}wShEqyz>s8_8bYX~r?`ne|mIVp;^Q!CD!(LvQlr51?S@&Uv-jHhuCGIbd$XE8e z^DB+ABW;{JYuv6K?HDkHn2b|q(3QF>AAue3_-LDV^QUiV;KG>+?(rzI890Pn&h)uw zHbtZwCTPX=aHRV+43w|=DvD(3x9-#>n!YzK_F-UBNZo!aMItOp^ZgSxrfI8~orMVU z{l1))haD-maaW{b&-81hwDn9%zqhn@w`bNv2FuKhpa$t;Te9|= zvwk~#Mh8_~dYe%S=Q@`pu<_lgrV7;B5+qunAyojxsdu@s4qeBIbk*} z*V^fE(AVZY4q_{j!>1udD^*wyxdyez$kYgOe&x;A8@I%HuwtW-8bR6d^+zG~?=E=7@<^?eGn>j^q?Z`tJADFi`}s9Rt`@W7 z$XZ2t21ZaG!P>K+MaL(#PtmKlU-=kl&XyY9^8{30!JP4Bn1;~VlT zLHzwPR4n?3Kc>aPIgyAS28azs4 zY7E9Qv^ZvjV2{mdeXq!2t83xpyj&0Q7Rg%_%YNS!l^f{vI7TwOb*!&Tvk1Y2U~*9# z?#aYKqlkK1Gps-Ggd~8_2+1B;4jbi2{WO_ zXD0Q@pY(3_yv1-eu2^*V!+|mgL8GeA`nc~f3*jikOHv(rK0|ntqRG3!kCKvqmkz7=og6b~9a9D19bK7Hp`{Kehlq(09{cgZFiN41vo`eRfLG1a;^0vV4z7=W_@a<1 z$mHama!zs_g#~A_ggncvf&v#lW93KZ6+Kh^0Qkse2 z?>Qn4l?Yx^ z71^!$(#z%ge6*j4(?q1?K3&btA~{J8VBk&261969^hZ}Q$JnQ$3Z*FK+UgZK)Uze2 zW?jxlOi-UxuCtCw7V1=R-P0-OctP!7#d{RbrfYi%}MZid5 zXjX^%7@nir#E8<)K>v&L!@|@0T@0+Weyt^2QUe&G@dCMm$`Yh!Jr(Hs2tUo<8KYrm zBq&Qh=v%&x63lk8>Vx)2yTt3t z;eT@RV+S?%Jj7qjBcNFMt1J51qr;D|c_blQwzP1l$BPIwD^s52^Y3jUxDJ{f88cPR zS=HwU6NPOaTRV|AmK_^{XTQ~iKc*bgyd?nh?rid1CiU*p@u zG1XuYtq6oK!H@qe1NCg&ws_1G&7VUwAn<6(jOVeNUK0X&y0T6)y7oMi>ukzbD@Q19 zHrKTc(mF0cY1@m7Is|XCVs0!_jZt;%b7PO7)=tM7b*CM z8Y-#iJJ-SG%&QTSLbn|T+}4H*wGjk{99S3{o)pP~I|w_PnY3@xc^Bqr_NA*{aNKsb zWX0!=!k9%>b0K^EsFrBeD4WF8Zq-@i8^Pin`h(NbkYKq2^p(#TWtnmv-OZ69%>1PI zn)p-~c5+)?jhi9F8gI_5V&!s$uX{F;ZMbA%Z%nhMQhP!VWfLBk7{NuxGfdGpmIIyg z{Toh0k*Uo3gvA#n#|v^@DqHv!Vn_K=K#9VBjv@6M=m35t!Oi!}~#c7n+g^_&Ts_RnS`- zq3BwMeiheQ-Ri^*siV9ytdhw4PRdOl*UVaC?$fLWc+cup7o>mtO3C=%|3A1MpzV?2 z4HbJc8RppxP}Zr3avw5Ee+N)MM+|opQ^PZDEM)ACkm7^DbsBv^92y^{s{H&$>#||L z7O0`FYZ_YVjG60Kq`KV`GH#1e_HWhU#$!%`MfX0@sMqAZjlKjJfZ8*kZdF9vGU%%X zRcju7Q~JGX#?Yaz=Y95OxXh{mST1=*(W?A`$fGD!#E|RhA6cy<9ze3jenCtsHya;s zT5ym)=g$A6_qee74^%+N^c28Dw0mLUhEdInENLKPp(#b3p;H{FvA(X4CnIlyZ6wdV z-vKA|80fv2-n0KgLpT)G#%IK8RVI#DWPfs2uKY=B3@n_~uZ8E0Rbw{0xe95Q51pEkXut8=4xfNgxR+ExEM`U->^qZf2Xgve#d zL{crrs4H=Pc|j2AEpJtGiQ3>?MBuk<;Z!2yzS}LNi(%Y796(V>5!h-%3->t2#Jg!^ z;J5$CwVn1wf>h{@#Nk5SWB?c?)YJ$Ll$y%}2;|m8$jU%21-|S>+K))F>0ACs-}$CS zKbYc@zg2Zqvf+>^r2Zolpa2Q2nHi_tdZ4x3ab~(JO=LnLf#XvOP-b%iE|3<;vtx_K z^8@Z5t>N6~C;MgLQRf5iwAgotbsdMw5=+O_&@iv@kT5FoqzZW|VJ2Se4JdaL$=osq z5QIg9=*e=}LU%HMFCIBhyWLE~l%C6128*GBM;41+i8<=IN?>utj)(^kCNxzjMgztI zYjK^4t?Oc<P)?3BD}3LPtCa=0^k+d|l;M{hx8L)e2%9 znuCcJTSyJ>dPPZ7e!mQyeLBiNc9>8MeqRa>yeQEFF`oD}nsK6At@>1+K0(mE;5w?3 z*ty#-09O)vMNhkOT&1hmGwC9QzX1q}=iNO9&x=n%m=nGLO1C#&PAk-{95+Qt?C{yF zKU8RopbU3>@iomA26@1H84wwGlBoC%Euo~kL52n>*0zjoc5a`YPl#MA(pw3(bBsb=9X|g~4inn31x0^`O$QXxml4kz7J;|?t&tbX%jBNY)aZ5#il)>NONFVI%~Igb2A}?Xp%)If|^4dtTN*)aT&btLKd} z71{HzXxM`eX98yK8a7ONW6!hn&Nzj$wi~_nfB^h%W*|Chbw;}cG``qK`-gWiYbY|u zt>&!>*z+RwbM_C6o>(bsKhlKH)Vo#!Kp_8+WcfW0X^>nRXN*J0V_nuq!4}PJFi&*_ zU)56LE8Aw!P~@uu|8hW zS)d~*kwu4Dlk0Q1u_BB^mT^3pJZRLD8}ar}#(0haFcD31t7rd6z}h!w)G^VS)9J&o zFfW))r-cjW=-x~Sc2wlOY|~M}j;S)sUN@tIyoKr``{Mco9q;H$!pxuW06P@KVi2UI z%HzIrzX=Fy2QbKTu$G-zA&KYfwU4um7z=ZmrfB468&!d~jSm1MZU^A9v;xg`ns9GN zwIBhTb6LzkI>lyX8aCCY>b=@5AiX;ol13qZM96pYk#m^^i+B{WqgFLNRkdff?^vaJ ziOq(g8?z&+YzXb^-@N|>kEQV{PZ5IW0&YcjbLM|av3ti%`FpEZp$NP^LzDT=CE^5V z9%L7Qdrkjig68CK*~pti+?5TnVVg) z0tvY9cs>8*JDw3XMX)@jN&`LX4?T7O+GA+6S{2TJ`WR5@_DmWsTWOWc&ei#k3d8aW zC~?O1aWRxF+wds=0VB4hcUlyt7KO}9abVp;vZD0bz3h%)keGWYSHvJQzG9U5Lt*clv=xSAZMCrJk!9uD>ACFsDJ2ua%2 zEPxs;Hy#82!viz~;f3$0I2(2OhJ1g#7hMcKsAsJg_%KYZN~4*Q{S{9&gC~U<{QIsF z=3N7I28<7{BR4O20uBi-tON%Oiz1|325}_e3D7t$3Q4%yx177bhbc7UHFmrF?0HOl zpd?&6;39I7sSdpA4$uSO2nR_x&N@%Q6?gVm=A(bm1jDZSynQ2Y20s||60h?!jueC` zjQYRqPKEgFmzek_AD?=3BvRgx@8bLdS=y$XVaoCmT032VN-M)k1ZHu%NrR(dl&fm~ zr%3bYnqfA!$PMa76C{$l!3=4-bisEqI3JMMh&&8Pyg){>2j45H%tz1(!)Tm?FGgeod7I z^wvfG36qM0$OFIMHyQ=*!Wc+-eOe+Iv>@stvD#)-)TETv@s}-rLS1MkdI^Bah$#b| zZ}b>NMBjn^A}fErr~-;|S$S+)1%j$=YFq>}kY^UUOCSBs?r_Mb0z zCu#!HUtSVXw^312(OcR-|N9cl2ngU9tGw%tH!)nd$<#rAlvNe|pQ065NOC8<%VD*~ z`t!fH0s1Hy#6WJ-!v6e|o^NZ+e=#8`>LuPOAnV6lELf2v2mRrmF~KO8RpRAyo$XL# z4$^c^hCdY>lDbk`n&*Gj{u_4x?{5DeIeDojnCh=tfd6&){~K|h$3+4zu=R@l$U70= z#s30;dF9X4$p1(eC~%xRft0b;yGiN%y*%ToH7r#Dwgs!57`$ARjD7mNLn}Nt{-{Pw zK!(up@C^om@r%DrcNwwWbCmlNp0cF>%pnVrbM^O(IJ6YCz7hUe2qb^zFFBsU5JSA6 z>Z35`U+0a#5>+1C&kXj6JCm%d1<|1_c0RbbIWzNKr=sJ=V7awAx9#xVOCmZ9%x^Q; z4k3=C8#$MFajn8Ul2V9I?Z-s9wW)MCxw)YGYK&6x%y^|EwLl~j_?~uYv)ktMREpQ! zOTOd9?&R);cteLArPQSTgTrZ`-n;rWgL`Wu>~fsa3vL^eV|ze5XD|)$+uZR6-uYx) zX0q=QAsWoYzm)+E$j?+7LS8b)(rLuzpoM|&M3y$9=Ndj%VN03`4Gaw12RcN6GbTSJ z#b$}u_ec}~c*8Orv`?ol`+460nr!0E#7BEwLD(f%eRjM{1a?84-~6o_VEimHRA?Bk z&b4Ynt5Y@Z+(6r^OiKR-TD!;P-79wCTV~pJ?Np4cc^omU)adbnl-u;h4 zc-6w-lLLh98q1q6h;>X6dhdgE>xsKTzOzm6kMC*XIer)zpyZ~wgmh0->~4J_;HUOK zdXp&NnseD(DHI#jcePOm*tLdJSOT>EYj1^?PD^&_qFbDY^?XUZwiYp!yMctc0I#E4 zbjjUEGb;08Qh8-y+ZMk|9?$mGPghLjYVp>--w-KskRWifoE3g?3N(p!A04J_TA~#E z^d?p1HhweEG4W+3ZTIYovG=|-QY#GOmiO|T;ZfoJLG{A#EI-sR&M*7oaC1uynpe7%z_|i%li2Axw~r)Lx};;T zSV0Imw++yW+TxO+=N&5g3?c1N2b;UFm;C_0UEZsT7jKZ+j7jZlG{(}%nCA6)SpM7% zV967v7#sXa(2S|eOIT9?N8Ci|E z7uthWoGrx*X~Z4k5ET(UUz&QyJtbFzr-}FHDYWu5gqblxm&a%+8hv@lN=(6| z-f3+Eao(bo0*{oE3G%j$u)25EH|_(BOu5iv0~5^;mFJdxs!asY2DChU(|U3yJl7}I^fO(UDo z2u8t4H|4RSnBL0IJ>OO73ph0(_(b!{L18)j%k|VI)EVK<6z{3hW&Y-v*T+0}qRiBz z(I$aO@|c+&k3bc+$hFBcYe*>7dUzxn{r3&)s`K& zeCegfSxyKPqT8hAw*oqB-e&Uzj7Wm2EKIq8la<^NA?ou|(zsoMwJ7VdxStX6u+eE2X{x5rO>iYAHxo*|Byrsf*ft+2W7 zJ+BCQZ_-<3YVA#6-4KVGvT`%ohrqgLsP^HLV&S?T!L_@rbI&QM)eV$*oc3KF1kJSG zkDR>sxTNX5UbRblH#nB`4o+3^(Xy5Cmf!MIw~Gb^>zx(uZJ+1bIW?x}W!Hf-uQ=Tt(M5PiBvh>xrnays^J0*Y$q-~L)7x|Z zM_4(^EsuG{O*n_RPzNU;DZBJs9XbexzpPK<;j1u6&sSxNcT7cX)&5Ed*0O?g`qb%; zY7>lLRRnmdr;%MfX@`<_5D!F{M-QCC#}4WaUI!5}F{6@NHi3=zNV6FVWv`RQ#W<&F zR6m-Gkiwf$6~jVm>CA*?P`rmhd(H+zGVW7{70jUMbqf1;Fv z1h2KHJ~>#V!#Qfh&&MFHtg~ubN)p12Quux-UCAOaML7PD6$@ z+E(hPns;Q9Uegk?!xf4S1tS*bn$aWc@Tr8WreED%B4(!(19UwU&>`(?g7twTBdtgL zTSBhyN3;OW7QEY@D%_qK0_qX!^9yGhcqL>AX^*)xZNR{f1No_9d3RA}Y|UE&e) zsMVqm6IR+&P42Wui?>Ze%4pUfr|p`BW~+Zi2P~-#Sdw>QpXU|;5urQiueo}nS@>ad zga4ZA1j-3hQ}ERhUNaWGc?#nr2a^oun}1_UGaBFnegDk|fVoDDpG|khZ&!}fjZ^bDUzDmI<*d1kZ zf3>!E;gK6>n69HG7c2tdZ#(Y6B$x?*6VGWgc3V5 zbln2xFgR}g6q3dn^pI@nVQlh!CzgLT-Uq;Jj}g-qu`u_`OwO|!|1#6Rl+^o6NvB+@ zzm-H$Ms2-nH|dqG_K^fr3H&ckBMlUG)y6ZCUM;W7HkprkWf5SJCiOthD`8%eT#4Td zSN~VvADD|`dL>H7v#Y?1!}VOf()Ut?Er=1`e`WZj?3;x^3_T5cy z#CR{heV_E!KC@|2<91$G?s~GMY1w@;T6`XKjG#uc+9u_}c+2r8|6)m@Frp^)jJlJc z@yqq{9$qOk(Wlfyk0aSlpi0BS{OuP2w|N0X6=IL~-X-x1421sly~;O~L@nw@>v_f& zBSn;ph20e0tuu8N5rT_e-1Y~zU5{SLP#8k0R=@2kMBh10_Q?@3C>8_;0QV|&F$~O+ zdu@otcbL>B4oBPei>1^Dyagiy`fMD2j<+m!le{-m7l(!#dAJuv9n*AqW+qiV%j$C% zDwX&LmV`}{HUcuX*T!lTeYndvdY+qn7yZlYZ~zBaK@oPin!oeI zrNwQToFv9Yk=LRP8Q%VlZ3NwkGXiaTP6yU2HL_TbYb~-Ba|7O`MY8#RO>vWZ_x$#6 z^3VhF&_Er2j)ucOV_(Ij#7jV)kA8K$2vnLMr-l6dI;hZ0Xe4VfZ)cpaY1-+6bggN6 zBooc2rWWofCMWfoPW!MY1Y%yjDFci5%MJ=J?8|KZ&MrzX(u8c2#!9VCMI6x?6^{08 zm1l6 z&x_=?RHFv}WunFET++8_q#nodHx^rI-T7)? zjQ7p;qcin2qS*$EjQgM+oW7wtDR~ORrWX98v8t~tCMlJ0Zz! z?RCmkmV*CsMR2n89-oD)a_PVJw~h)6AXqoj9}c51eRy| zd-=M{?F2>K|DS9&&rDJLsYzb5*x9)^92DLcg;+7Xb+H>~b)4Ai@+? zC5KX?!i2F2#NzSxdZO{qimYkIsJhaORdPob&u<#MtJFzB#t&p9b0`XM*eFQ*9_KDf zN4aU9<~sUgXiG%-ZEl61MImIJo+b4r>M;7tH@&q+)7CJ$9~eL(#smB#Mw}7&Va=#g z_?plN^$~HGxuNXOrQ-ZvsC+8DO`~cA^urcSfv6Th3$q9uHu2d{eB=dso2tu0Xzt+( zU~{uuCT5lKd$4=A-A_EPt-@g9?~$wFbiV z;UV<-P6Y~9!yupI^krL5x+bs4{z(5>1Jjoq7$=G&z<`t$u#mZu@V4aXO!OT^F5s|s zI(I>?5jgnmo1rLOb_xxit^f2)s))A4>?^UlmKLcFzi08c<&YW_>n4L>Akd>wUDTcgQaZ=@Tl@t#q(BJwPl@dCu_4Q2Uh^K1YYYqLWFo zOoQDy*S#cNkf)oDGnU9&U6|YYX#ZW^k9YS{6W>i&kL$P3z;drYi1eZT>-vkROtlhZ z>pJq1kh%pN4(}UeE~uT`;i8efW7R6^ve6JiYfzIytx%1h_|!hcZu}r@p9|ofu?}A(@pjZ&w5si-ZcA8>ye_= zL}8dq9%)cBo<1>;pxd(1a{_9I3*BinVlX{=mArk5SU`i~4@o#chKz>bj7jb(Y)ULR zHxtPuJbI@|R&QIunHi48*>^$Zv(CvXTjd7Wv4Vnvm#d-RLv6Divw{LOmS8lKbE zQhtzj0R1r$1HpY8evfB@L$#@%hfyiT%JVIEec=9QcU+Vu@A#F4g)r@G>ibSc>j~s=ZDSTh&ir zf|U09K?)ZQz*uM(g=3wuqbqJ*#?kBzQJc1R#SJ#30XtBqG<*l+-IKNA5nZMlkGyV^ z?>GF7fAHB{Sc@;|iTcG=pKL~7jFk7aJv)6DcvZ4A#pC;*5)=0&L0v!Ksa3bwPKzSS z2fksHhpCd)_UI}|mxUSB)6GAe9mex!3@77mO@S>YF2-sZe2}h1|2YEWwlP(_C&zEn z94wm|s1imkCW@%YaBqJlLzT#PARwI-<^l8KL|Jc>b>`E zSOfE>6WJE7*QHc_rxxGp)JWamAeNY66>qfF&&;|;%&a7^09iZF<55!R7t%f37s`ZU zQ{#m^K|wd6BYelyx7}cvxUhMaKFXriNrp)CdgGUPng;68SHf5YSk(uHOE3mD!;}i6RbWP#H?KuQ*lk)BLCT82 zTlSoJ+}nINo+)FeV)xCNZ$lCFekB<9#;9G2%o8!`$;P1C`wpmYXBf_`jI*AlPnd6$ z`m0L970yXp)j|~*am;jhB96YKm1SSusUcK?+Jf}GsoRC1(iP2T(Mp0}8+^>I97juN z5gwZ^+cQKPQyGW()3(S8U>L8#~n1=^qa~EP39ePV*QH9_q*KMBGF- zY&zKl7zV5Ko2ZEffWdF^**(@-hh3k~#^tGHYUADd{>fVU^`pQ=&x@(IXKvMAs1a%Cj`b4f@>C8X zWP~2RO|Xh;MI1(#we!2iO)n2WO@9UcR`JC?F!&jt^cf$z$mHkg+D}}!T!q1}{WO{U z2v8Tzq#rZ@h-8OBGjq?l4Rg5FU>Qq*IsR_}M0p`ZS!V(?b ze!;t<0@7v10r_6C_>E`Ok09;)#MeSV0AF8Pbfg3cE?wTLZJ!zQY&>RSOxMXosYscVlw8(YR_VK5ix?%H)gxORsT?!Rp zwzoQDOU+5I{?x`05*miqW0Pm5IBNhh zI9p`>2?fO1`IT=k9AJDr75c?CmTHlw2EM@judkA^`N9q)sx5Vxv8T2lrVU&kIMk*& zv_ema&T_szG;;}4R;=0~>P_{tQ`Kj)xR0L~=*?FASjXcgix-q8JlNThLS4wu!mLSg zPFu-dVuz+Y{_as7Bp4^?f&8>Bj z>epXkegaV|RJ+7$48ZKQ2`agmx|q!2!w1+k-k8hZ`cdnP&6+UL@N0e;8)pViYdhe7 z-*Hao>w-A8l5K|MW{rw%Of7}38*hi5@#S>^B&ka}9oXBlhQ`moi?#w7{zF? zxZ^IfHaXtP&Ki;%_>EPWl;Yv09}Gv%%b6;K?MBcy43WL&j{O%VL{=mcesCt0NlW-- z7Lk!sMC(h906L(j%E_X=#JkQNd_1rE(%O8PHA0eO$Bo$D z7&R7se}|PsHRJ4rKArpnO7{y*q_sB5eDB?SA+KBp;O4L&sOxLk3txbenwNhsxuT6S zkEtVcdUD6LL8~wXlqiau$liGWTUlU8kjcUlVBImlc2IfgY2-LCax)|qC{SH0S;Ls3yhv59NDzQ?D82kp$A*{_PDUqWl61+(0Op?_93P&C{GXA>H4cPMk;8hRB9=HEB z3jqBezn1XB=3-Gjn~B_OfGldc?PR@%>0;4cmPA5?Eex`35bmyX@kp0d$P8;Vm0{;= zr0nOl^jB@c3SZhNbnHqrEWBfcs`E}nxfX!_F7!<)dJ*-+g-XGo{`+J%EQrKk;en)X z6S|kqY2Q=B)Uf^-P*wKqc)UbWK$q1047dd(NoM=R#vstZ1G%ucKT~HAIif{?ET}dg zRB<(^+%;Lq>ry(?!7V!`s7`-2ihD-_=n!qNG`J4hbJa2$BycCAl4vFX++{qs{$mhcIEL|$J6O%qG^=JUW#kk)N$psw8Kt$= zNu(LXV4Vtq?nymQ*P3XmxsGNs6xFevKqZRS#wrU6}xvs)A&7y!g&Ku zex!GOoe>;UfZ3Iv>yNb4it*x7=^Hhi#j+=F`d`#q%vYt4&a_36J1&ZH^`0&C25^!Z z!kkY$mzeu1^tD_+wU8#*I@S&6#1np4f3~o=y|id{R~fc3zW)s7vpaE$MaDoy3<20d zdfAMmrFrxZac`IN*4C?7gO~{URd<4*u_VEQ+Q6aQF*LXu77XG_b)4mNNFHkoRDuP}?!wlWa$s-D|wd-}@utl>;SPdD}I& zhmr{uR&l_n@Jq690l@+rPk+4Ue?kKGC4#Ozip2GCO7SxElqLSy#j0pCM?d%YX=5XjW>ZK z46$|Ni-V4kp@R$RM6Q7pzv;2oi}QvLhuXBCrdU6Guj5CAhvsxrY~#n4qiq5?VF=STpbjNak9 zKfm^3Fq9-JUsxC{Cw9P01X}oM2bXzD%T&M)Kkll-zBB*lXt@iO$4i;Jtd(Z8K&q?$ zLU*}sH*NzC!xJ^LI#~VLR(u?6PLI5U)Xh0{L9d8#gk#ly$LxFtA)+ zse0SNO^MsLvrcLQOx6zG0qSlC;_xyl=mrBZ*AMkqf~auZ_Cy@{zF0X(#qGYXW#~{; zzdepIl<@|`6`-0izT(=Z@xP#iJq}tO=}RUbFJf8%>qCbKw0w(mt@ja{2e&LmNi&EzgsyNwKkZb zkl<0zSc}Up!KQ#(#B1QWqQxlwm+sB!^VH+jPlmi%jMK)ROFzNc;b@0jA&LKi8l>NS$*QuWI6{%P{yjevO z$?fRqKjBT&?jwFtKidypq-gW~5?19`MaH?MsaqUcTzB8zmz8j!{3XG-OYBC^X=}ob z-1V0=>*EVM>ZfkUOYE^D8M=<8_FaP!vr#xgqy_$uD=qv^Ci)^?gf%Ff&+Wb%jb={m zNIz^p<1xHs7nG65^KJp*ezR<>O&Xtj90$J^d`lae^-|?=@*|xj-HVYv-|WF%)7zZN z=X~pYm;H%zbX%e#1;4H`>fx>B#55jPwei{}Y}}f*fIIWC92tj!du5rH?S8hChr(M@ zm;rT12KfGoZ1p}$Q@ar7j(gf%lJM7W*yP0TLPMX#DqJECo?rm=1eL_LC|)L6tsBbl zs+Sl$xFldvIVq9`uIq|b7m=sAplkXjb~6JIZy{) z5=@!4pwIN-bB9fBqmm75+zi@T?qB#;4$NLXwS1QzLDn9nDWs=670~H5jyy#y_Dhx7 z@z#_J^m^h?6VY~L?IXGplRs793K89rJW@S;*YyS0^6@8$_Zmy@iW@sV z&YTw^b<$3z_qiL#N%D2H1OiM2SIr)+WCotR+3(LyR@Y58VXIlcJ@C;_mjb;@pX;+e zy)&46VCid8_Q~PoW}58LsMFwagI1l7D8qC(Z<$)JVm=BZe?_f~N6U8xE1f^VujoYdm1cUHDYx41b zK)IJ(lyUnKk#0fqW;qGnQz<=3fGl^1yq#TL0TmI^i8VMQGsD-4oY3boU|)BBBd{JU zLH7~_WQ?;o=hpW-U+1T(_8?o4Sj%ZJ_AbTEQQOPA%JfF}wQRCuwVFc0JMGn<%&2K1 zxz3b@7bID|+EwDd3!hJ~tW2FK0A$kCJICTd{?yvhy7ST}GL&Z?M^mp@a{>blKYGZc zIQy1mpL(sySWL7{d^^wND@HC9hx^Y|tc7~Z+|Z*~>`jVfQkl2pN?+e!DJDDYd$_6nMfZmf@TB^=Pi427b-;P&&|)9mHSS99UO0E(eoFg&vD3P;f!6AY zmXX5_>Z()JEail1`6taH%x{#n*p%T)`a-(wXou@7RN;pdYSThB^n_+YJ5dDDCfUF! z{f)72^Px;CEOoCgf{!c_msq+T!ovV;5`QoCq~cNXz`@u)fl%x0>e(7l z!iQSaY381)d^QtQ%IFPQsR|5pCtEc>rwC)txQM%%u}yqOAs<^y|1hf$)T&c5)jv4!ZUWHgTm9HLlNbzFvWkInGs6j~I($;|s&#cJtD!h_FM@iPOHR`I@& z=%iU~P>F0bW!9<^5J^C7?&>WpTgm|79JeQWZSr?l&+78-C-R>NZO1Z+xU zMhxa_Y!E;w71mhT#HXj5&IyChyst|@+J_y6KE)>9n|jyiJrrR>+N|;clh4t2z;3KO zdwO#x&dTR3(PCe>_;E2dAVakHt7v9}CiUGLV@utQlVz-q1dRdiDYM;!qj9;=zTiVC zR2VpA1R?BG{1gLr)A#JV%qtOan&Fq!+^d30C059R{ihf&_zi)2Wt($iKV2e_ z#TeAl$$-OjbFQZsxI}dxp3I{ZN?D{20HU6$+62%!+h+Q7_Pys!QH4`%Rd2$)^v8~> zjtFsv^VlifYUe?&b6*+9tB8skA?o6Aaz8o(Wq2^j1ET1!k2lkHmRGp9#`m-ym_?18 zA2C{7qT5s<51q=hXZfQyiMPBB`Udozw!w=}H7+cGLj<0#G|>qFIV;f+ z;*mS6wq05DvoPU?fFh|E@~}zU=|czSmXi=Qmr(Kl9OY zy&}l>3&Eiz z5k}(B@LS4o6B0HDBv9-+<0mhR-MmDgfB?15LhKDy8j}ExB*2xl>4Tsxgh0!){a#Zc zK2A!C2&^^}s{~H26Wec87};kQm&?@1Vf}hK;&2`cvpI3w9Sj;^DMgxZ6RKbXZQpw= zdVyRVN!o=80ReaPo&5BfPbqquSuCFB08(^aiZR4#5RIZ{SChzC#Fk8b4}ANRf8IP8 z_>LKNJ^F~mz#B7T=tfJ5Bx_&|V+A{+S~jW+c_cHel&X zH?714$bf^*!N@q0Um?sWqi@+ZCG_uGPor;!yf4Y_jY-j{bmI15dC7v{N%T#1QF@gl zT&I_7`e3TkIAqRa!dV!BUL3egvjZn|-M##x785Epn7J14R2}ryO%ShSAdI%Ur^x)^ z5;7cK`}dLpU5fDAosOb7(hL~FIG5Yk`kHrp0$(On+ozJab zs&1<56?T6W4ZJk#X`YP~Dt^wX`bDRkzSvRC`32Mjc zK>9j`CMu2zl1q`Pr?@|~mboLDj1>Mqy52f0s_5++hJhgl6;x7*kq`zHlt#L{OOR4P zIwYl2x}>{HNu@g#q#L9W>F#FUJwDIx`QGpQ-uEBiy0~V}K6~G1pM9@;t#v-+H7<>(XQYfj~bn+W-jCjf?O=S8UHXJT^kX&nw?tlWzOF%_2Q7nH%<1+*V-i& zG;h4w>UZQKiM7dhWg3lXas2LbUB~0HGH9)*S8MqWTs=wsk|GFlb-K8zU&?9KGFmOH zTXbQ&OLNqxe|t@GH15}8Uhjm|YqQVMzrWIA-G3Q&v=lMulxVM=W-*;HHy@VaiLA}oIOw3{)Sc4tw9jZ;t$8!gS&@;hyEpgQs)Kg&y)41D@tVH1 zHL0r~PlaelB3EG!<9kS@4-*C|~|DN&_%j zxj}hg3Iq$QhrKLZK;+#o*m1{M4$$du^YmLhp({KN>q>4&ph@3a87)+%vHwYCGImws zyf+U`&{Q(6m@Rg~oQXmJ20{N$22g&hu>5LtIqJ(4_OopHf~&$^zLS0p(7q+j*8C}verw+xGDFE6wu>_$Dkwfs;w~MrVC@#5#s0zFZ$Uf z*acv7OV2849)GVO=#pih{L@~=w0X2-4`5gaHTLUUxls0#vr=9C#Lvr~?`9*0@f2JB z3ma?uqU%}n=J;oe6)T1-{)>M&n)1SR0GY=gsr|^8=V6{y9$ThY0>iUhW~;PU4Q^+t zLx-5EXUiFhs4TS9eJe+i>x|DK(roxptU;7WL+`b$pP_2#)|=9XAMquZo@ZAJRXam@ z;`?)7s?AIk_Vy5w^3`~6y=Hstvp)dp+jc5Ps-5HfhL{hal_V*oy~=xx5On|&4aDpuGN6C)BF+F zeA#@m$kAxLyv<6gGl%}KnBIP4?F?RY%?sv_4nAqlkyf|z6&7nGWRp9|TLS`nmP`uA zjrk_7dYb%Ck?tV?-g9Zf5^Py_Iod4Kt2jB@31aZ|W`(&etn2lk)K^{!S|4)r(qHWn zBPsrrnV^u+qhsHKvje%pF#5XMsxZ`sOUywBlY8W*f4MY$aB+{Vc7dSxsI6}F&#L(m zQx(G^mq<*+^te(-83Fw6%V&>N(w`=1SSjFf9J79l)UJUGu5b-~EzVJ4v`7e0tFheu z0#$~m^y;cm3=gFNbpDc`_{7*{d;Q014Nd*(_U?bEraeievDBIaJ=^jG)l&An8UyNT zp?y|VH}lLBPTNyv&K0|f9|Lt;e?>V{`@G3~u2(f>n((Egj$(Uu(-=|!l!0h+_d_zeVT|6TG?$mTlr15_UrSx!CmY3*Y5&!P17e=`HrrW*LDUH zh&#K|Y*R}@QzjkvO4E4zE2*1Cb53RHa(iiE$H3HTSIC0vO~Co~?+PpX=_(78r;6#8 z_xSdOa^_5eaqAUcZO|T_FGtRJo&C2a>$U+@&^Gvv7p8}Aua5>xl#65owo#HBAfX|4 z%@`?UwqNag8A$0`$aB5lArELBqWsYIFw1cd;B5i61i^nc7TDyr-W=cKB0W=pl!!<) z^`L~)BG3axZ{c=0E1H+l*VHuG8*cd_vU3isE=0GQ0hNfUxHirG25CRYZ!!RcP$*SN zvVh0s-{YT3GmaknZP+Nm$@}yDrPCI=X(>ViL1$nY=7zG?;0%8VWo|xyH!}|?4qC!O zK&*8hbHPGi$(G@9nRK%(h>Y}72*uzpYif7jkkyAZNgu5MASGDgGav1^>>Vb%M%}UL}45a{(Hbv!L~^eT961ti<)4 zs*22;uc`8nIg=iH)|!w=%FK8~%CYhaE+n0P?5;i{dp}lRy_q%UcQqwyZ#nPiJf1h! z|J=+`Wu@Cqr2SW6R*vP|>Gq4e3VX48%CEL8-`vbmS3UWq;(hQSltq{v2MISs?UO z8NSUknCq~2m3mz?2eoBvp5gDWe)w32_V2XTknH%*Ks||hIi)AkWP12yEoCu6RLN)` zIpgKT7H-obz{<>3I@5aKBSK$+HJ`Cz+3a*rA{u8U^l zWuxlkz=T`tg0Y>UQGbvAOfGAu$FlAoC-16CfP4NStIGyp0fd{4k1tq_aPvMpNdcgD zxtZ_|ivfrAiB7Rp|KMF+qg7bw0^hGwPu_V|tGM2#Ff+1a6w}K~ zl|OZf?|mOB8(=9_GA!F@=4u81^c zJ{Q(J8a;4ZtuB|9I6&1EZmo8(Ea;`+6j84N;6CsfzQT*1;FKOsBtHPm-*<+0SfM%8 zooyY4Zx~!$&b&#PuclOffWyvJPlNe;;wLlJnI}@a!mppI`sSraG5qmqCPSv3W8Lz@ z8vH9Q?ZP;K>8fJekDqAfE%3_})z?*(Op_C;%FONjdl`<-j zWS|^two!65MUu*WjPJCMGEPSi%3Kn5{!>0>3L1s!yI0`E>X32AY3J$If_CdVCE3RZ z&|@@~WTeBZ7VCw&p;^{VVz)unqxA1TQ%gM)u;Z%vnYV8L63|VlGAkQQ4(L`hr*K(T zQ~Nz69pltpE(ouo{<){hEB64QHpm2i=ctCV;gYz;4h(SW?tj%#ZaovQ{dt}f`abFD z71uWpkL!8eBK`&&H%!9Gy$26``Ed|uDyV-L1Q-ZUA*NmY1vB{;GKWqw4YCuFa;QW(&Zfl$UKm?$@JEsAK@&;oCHhmERyP zU~$^{{`Dq5JY{F#??QS^n_EUq1I=F8>a^DWT)Hu-*_jZF3oi6)-~cnHd_V6imR%>; zik3eb$n5%y(KtlGOoGR$5iku&H#c5q7a*|hMU zUPd{-URrk3?FL!<_@6k1Xptx*7Gz zHQ-FXo1k!3N_rsTP(7hMfiTl?YUHb2dAM;oxfveLhO z5o49`b3yq%bqfL8X^b5^S%x7;AUe}(dot?5q)}Y{&M#CvYVW|uz!ev7T0Y_96MTpZ z8sF)Zq0{67+3eQ@w&|Ozsv{OfbbW)UtkQ+{Y4>Tff^pfsH6n3B+m{$>EaO+1e)m{` zp-l4JK_oSdfwL2cF#9CvRsnc4Tz~VMU(ptxqB^ zRkR=jMf`5)*d`8Pwa$>*c~STM#?EoDkz_UCCm>QQ3vKJpu*VPZ?4`P1^mJwZhYN6n zP`r~i?!4T|AM$5aM~8xKO`c#jeDtRNn(z9kt@PgX%EI;KYOKn&2LIci5@cDl9Xw7K#<(M6a0L)ViK0I@OFSFGLs>5SVO5Tb_tJsSyU zbIebK+$ww)v{tWve3ZgvE%W%~QkRnD6(t-W5>B;dmf2D_=Y~A@_H>rSnH@&w61)&D zyEb`NyaVD`Fh28G`}*G1Z`;R3LN0Y_bVz|oiSe>5$-wN8><_2<(JnyW1?<%Ifb{ka zKMA2C^Jcx#Yfu)tx(Q(_EnIVi*SM$op&TVgFHGt6cK7QQ_)pX<_OY9YW<91?PBE~E z8DUaUNSe2`}#ht$IYO>yQx{|PX^^`&2`~z|91PNE{ z#BY(NOFgsX+(s?J^A{kkv#|fZ(1ikNT13rd2=@(PIJq-*F-uG}Ac}vyv@FmK$i%9e zp_^wRG6LqP_%HWzomgpM49G5ux9$a%A220oqcxy5J0bm z?1dBF))e+gZX9F3S6gP?G#Fri8GCu|y@$yB-r@Ud(>U5pdD9*j&mBQokDU1;UMHyG zceC?zq)fH6@$JttOpKd;s=-@GJ+YXNWf!(P^Y7T*%!ApeHQE`{GiTyTf)6bHi~MgT z8du54Y~E(%*rRi??Qo0Thq8v-oT;1%BK#Q$9G~{4F)xTK5h@E=-`1z5Y@BH7nLu-@ zcV?yswdzdAZe84we1)MT@UqWPpR-&%B}eTP4YQYgsxAX`oKjEZ2yGolcrVk(tYd!K z#l&`nh`ksW#k278*-Do`3uboqvi{>Gd;iRhDdT&LR0^1QwvnnFW`p?l){1-!`*W22q*2k~5|%kXOzM|&`2+ujo0(fH|VtGn@zkU>Hu zzia{&S(%-DLiz2@dQ_i0TMffRqX66vs$B-38L7Lc3INpdyaM=fGf~d202X!(l_1=- zHGoXnZl~F^`@~EU9T)v9vSA^eeo`Ue=!KG=OcC1x5QDWJj{05M_7IJ@U@@@ho2jPh zW(qC9pXV_w^5Lj)1ryf)<%!yP+wc4~rD%&SPTgD?UOThv7QN0La_(MvvV6>~+;Dt# z>{c*|7m&9wo{?koI3_|db0HNwB*HkPC;2qLV^qsRY7~M1N`w#!`0|0|T-o<;*iYwOY+h;j@M`Wd zSt+>Ndc}+oJJ1iZf4=bfdwq)S9KyEaeR%*?Tf5~ilf|RUbAR0{OlW(p>xF5kzyQzr zBga6x!c$;&W;Lh@>$Ejt^z^%=o{Hda_~7!DotcW>fai2oooH{3B_wiXW31MShtAiiq zmb~>zPUP-SI-6qCG<_ap?8@SX6lBV>xRTr#=%$OfRiy;DZ7Af!H~NfeLl$N4-q*|e z`a)5YzWyP={dC(fiX=3qM>SIf858w`QTE~wB1&+sa4Y-Tel%!o9Ko3bE^eF5 zBk?hX{p&0m3U`^MQdnT?3ku&xTW*3D6y%2X+S2YIZD5>SoAJs(o>p6S=lt{ajnoNj z*7-8YWXjD*%zV=2aFD*BMIf`)pOszr4ea7lD0UfxnKY*dZ}&yq;oI;xgg6o5FCyA< z9=bX8p6)v*v{>Xd7d?JsvdqejA$TtCZNNKr)?rO*?Ri!@6MppuDRCdlZp|@2OFBI8 z8vu<{-1wkv#f^N|JzssQpy>h>j2!~;%s`327e?+f&cXJV_l8U!3?BX_>#wd@^vd8L zb@mun02=MeoUK9qp5BEIwpJSOnj4k-r9_=WJMeR>V!`HyTxTIbWB2HnP^3B`3rnX# zBJd4u<3zNoXAai7ot+jg-pK&JOeA;0t0%;)1Iu}UwFoi&ngvxmJO;Nb~%HIh1sUjj=7eg=2VIK z+AIFw5C?z#D+4LeDrXM27WC}~ldL}DHLw34US&%;rt;lzEaL%rW9iIz`T)D_C;%vo znVfVE?~&fQwA>!_@xi5U6Enxb#LjJY3;iK=eYZUy|K{TX)U^>qEGQq(@b zdXeGxEcXY{z78$x{VSb;67g3bAylquRidq&nL5UQhFe=c(0i)YR({;3*#Cnc{-?X_ z(Oijd2E#Fr)on+9W4ZdPjDOIxPwk!2##gMef3#g!IVN`%zSVl}J3^O42^nyxxc*~M zs077Calfq1L9J!Q{Nu#}sg0BgHH_U~+x@Iq@7uJFn;BJ18NuRYrcT#;HJSekT~LKk zCi@#xI-PM*J4FNg%l1|3KV71PI35I{u+kk=wXXlO{*X}AXP$S9C98^F*D?QiO*dY% z3&-b6bnm;?c;#Apul^CbE)F%DEwLu=R<~Sbx8~nX>5Ht_H>T9%?x^I>6Ayk9T~{l^ z7EH+aqT#pHIvb zn%I@VmyDIy0cYgSz-41xDszbE(-oduf%<;_XDk;`ze}Hm=FJ)YTk;`8xXq7u(&+2a)aVA)zSttA8lO zE&U=3+r$LA!wmED}{C35um32o!l@;%P!7A1h6vwaLSl9oMz0Yw^5>;k3P}KkA0!vNu zT+LAAKN39^IP%-6;QteG|D+M^l<#Opb@009yZb6&o}9`3Ogh?Qxz4(1K@3)iX1MfS zkN%?XOseX~Q-(X`{&&9)4k?^~9X)_FJ70hf~?Kh$1BZhYZ_suHu~ zE4Ti@{AhNg((vZllgyn16KxD(uhHEK&&hkoadWOo!w>gfwCG(}fQ}v{?}tjblI#_D zC*|DN(<=*vgHxiv)fWCV9=nv7Yl}$Mf3o5G5_)Zj-sAi?DkJ%4_!-;e?8opOE|M+b zfW>-_t^Vb~{%_f>n>BjhvLmlbqF()QwE6Fw-)4fJe+_GG&}9=Sj{ku5C!I|AN2tRPmpK6uGH$T*pZO1=yKY9&E+1@!cz48lhhpj5*jltxCGUo0uv^mzeEp_< z9Z%M9wdds_guDe@zZyOA%bC_98`gw;-wwoT$6Y~k14>=?-Vol+qMCX4nV(^hv+}^@m^h z*&G{-qVJEQp0%XNE&C{Uk4$d1RTDMg&&sUA|@_P0)o){qmIdFJg zy7MdR1h(J$KIoIZZS&@ktll& zK^=5-`%X^K$&v>cY_WX9dQi}%&WDo~W3o4J=J(3sQROt?Ko_|l{Q#mM zcoY_!#ntl&i2{YvJ^uVYp2XI1$7$impTEj<+0NoIzW)Z!xb{CUu6JQs+k@9ipyO4` z&v2_}KKHrqaqYFltRyMA5Ibxsr490B3%!)ccsb*$V{v@+m6PcXw(#qtwa*@%%~2+E%iWpG61d41584;1sOr!zKO02m)=hyoseGj6Ct_MTqc zOVgpuSnj05*VErR9R4GVHyh0lN3}d5<8>;&*+Z!2Cq5AkNCcKd$qH$wn6Y>CWaFQ` zbaZqCLUxV~!Ht@MG~R+{na`Kc#5*n4hq5^Hn0U82$Jb`WaJ$I}i2f=m@Q4WgRk}SYd2Lv*@k>qdtj}Sv@e)XYM^sNX$IsNyj;|()G!X~{ zyFn}3ONHPy(2=Ilpv^aT2Y-2DljW01Z@hdM`b{>#8zsN!=g17@p*+}M_*{Q8>>Al$ z>JX0snEhy;Y(nANj)45Dn0lb=M9l`W1na$6$3?*B$Bm4IZu5nXmQE36vZ) zIttzz9T$gGY<4il<_a0ThSy8B<$B+ow%m?$9e1dv1${RuXyEHS+DYNsh^I$NSI^cV zOg5s`+~*$5yfRj4eH9Cb=2kSn`vGIYePKPzy~Iw*>m|pSV1pO;X9_%=-sAch4-z1d{Mjtw zjsRyt*3Xb;+p0~|t(Bi2r3`}UEr&tx2;plXD#G=dDvL?)ZtS9ZRz#+&^9Ozj_(z<= zW|Nr`^caW}P0yjFq|mrlRns!V!$Q;@hDiG`qzDlQ_U3wvquotLuK%ufa2(gJM^YIw zycuX%@6x1qQK0&m!R-1#JHP+Nn^Nb1a^=|4>wC@%gaL(k6y)`9$yl^h2P>Z(9PAeD zDsy(*MWH>IpvI+UnVyvtaqES+4@PQK)S_-M=jJk4kK?64s*qRFgr+mqCF`oPO6QOA z1XYAeyUTRyREnpZff?oFyJ-9*%sNuQ`6=fCos1Hw*ZeT4jksh0@$k?;xSBbes`5U5 z>$}adFV0aUwy`xf3%gAb-%8)qC~(hBOQCNl$+ALksD1yWInUo`y1J|fI`V9w7Y#m; z3L}t5YlqaUeN~et0Dg-YQ`ItYj1Y^k0<|wH?C&~pY>v^6xxH@r!l?xH!YE!ZCM$b2 zJN!6d)~ydZRS^`^AY@cyP!&WOFeF->3mb{tOq>)e8pXHbynw|2i>0w(VZ*1;ZHd^G z-x1zlE6m-xl%FaQnT!V##XyufeV*M*kVX$hd&G`hv3s?$Zz(By;j%_~c@W1{m`MNI z>;)_aGNBAbEL!A|+(V=`basjz(Bxn(wi-V6P8aj$v=et-8%S$c=65;FRZ@AC)|`D0 z{!n2DG-&t&m@MrFrmU_|~jcjv&?0C>K8cLIRAm00`kn0EYn+0pVZkOIp_bknjqlA^0J^3g`>eS&c)$1dO><;LOYl z>;BCIc~2;uJaogLj=5I*kN^I-y}9}%F!c&OWkVXB0J}GVg~aupPSDi)WEmA59UX4m zO6|=_VBtOedh@bg)5zmv2NtJw>|q?c8Jtbgy-_a33pNg~0Wf{S5<(~ZGu9m00fep1 zb6&2V?s2z%SIUBek!9^WB}*p8f1IpF!^=%lt;QmoFE-zp59JE*&)shD!mA7;-aF!V z-&3d3Sb7Q-vNKYTIuI=S_o35t6P4Cy?^ZXF*DHFL2YDaTG5tdOIMj;gRuzLC7*3+z zS(U!`N7KlupoR`%4SaXnYcAtIw}VoMp`}_C6ZDST5vjmAIO4#LLMJj)(L)FCS_&of zUdE-!ESMncg7E}l6F|ZKdm7MV(S>2+^eZ~-IrC_N;@RdCX>^^y<&x)MSx!=iVm+}N zThWHmab_fsg+W;FO$oqhU<4FTa0zjuIbTu}?AMX={;dD7EWr}|&L4M^Mg{$E8(6j< zHpkFI^!pU7T^Qt^UN=t|+od$8w7e+(b^!ZSGteo+;oy%rqf(}KE6${l3~-(lA$UQ` zL}CJeF=;O&*Z*quD2Q9sZK53p`MUR8;kDjy)c<7_Rl zhlu?%I)1ZH3&1;umNL!lVcq)%!!y5N%(~2tjgdD-nq>yuSf***HzK((fwi(2CBYyQ8MQL_=&lm!^7~y(uis zVjBsZB*ZXn#res0BX=HxJ`5zMXOb{9d>UP0n8B7eXC3V&2CmOH4B04rfEqtELfiCZ zXyt?sAPA@f2OGmPcf5>F>8_r(JH_qD5^(ser7tmt;RR7w7p!)wZMgQ z?+!^ncyTL*9(A|bVO%fJQ~MC@#+$I!J=*2*UnktB(Bg$ICn*D!)_a6=On%bn;xk`L z1sFrvba!S%7gP#}(>7!-i9*Vb89Zt^*&f0Nk-nivDDphae0vt|{dFp#( zaIAZM2Kl-kt~v&)rHmGw)`bN8qH3gg>|S5tzDAhsBX9$p_|S( z$H?x~%ogTHpwUwt&U+y}Y_f%2vi&?Yg!Y;}u0s5MS!*zYAd57b=ju}EWJ_6->TVPs zhAG}*nNb&nLic`25!9{tO8d0#>GQr}MHtX0@5cPd_0H~Zmxmp@l?qyEw@4e=G+m`P z{BSu|x6n`@OD}o}nIHgj`p8qk;%4Jg(M&2M%i*L){aeD(uY!!+;8C^#tjKB*H@43` zJro(!C=MBk@E?5c{|uSfp_fMAiuPqfSE%D8*U#hPu7wjuC9E$DW^a4R>hiC zNhGul$V2_0XwQSjKtj3$V+grF9AnaPdP+35_8!_^1e#v_TnU-B=a6W91d)Ti?ie&H zdBbHXuTORTvuJ|sj7|ybxab@yx9bFp?+D&3o`Pieng&K5{S9p)=Rp@%5Y# z%mDgGyun7_`0ua~Op02_D=Zr(pzx(5*PHDbI76{*6EHtdBvcX;NX>0socA*;S?gQV z_q>SP?RP7KWAE0TQMz6=eNo#w&<>$lG!GM6#Cd@r;C525sGE$rdwXHxHXPTh$@)d3 z$XY(R!XaXG>~6h)91N4>&(>8-b_Irh_8;V%N3ju!ggCI`XR-GUFtZ8JpF*>T){~#G zAu>&owx1y;3TauZj_KK{=^iam7*Q^$Wsdy7BWXe+&yL3bKUe+TD~jWO@Y@Oh*Et>$ zqfXQ=i?)BW;4S}Lt*766mLzfYubLl{dxXaWrF}BnWheQ&py?DZQbTNB6aSyaAO}n2 za;=r}`E4_pf3bHRDuMK1Ct^B)-`%|MI?j-1GHu(2vO7=nCD)l^#ktgmU7&x!lW4^R z>ye1o+otZtcSWT-#9u=Ws-z93O?X-6v>~?M`hdr}b-)uZy zJwzK72$W!NE60|km#Ry3N;>?p`tWOI@uW%=B#(;m`K@H75O^J=X1?!sFi?TlD(MTJ zbENHDQ4=ZNQ@BSSL5Nd&^ZFG{D~=dG7`|9!Nw`E0cm{4d#9^l6yti{7Hs`+KAH<`J z=X~IpL4`gi0|lLwB8*$6jsWoxrm`sZ&al3ojz^5fPLJzlT1M8@0yz=kkN?}cdeKKg z7O0Ruu6(0u6PEfpg&dlOnA^hM(&%os4#|X1p+O?TFn9H1X4k*RC335RFK?L{1)d#o zR*3Buk@@M%875gSH&3_FeY-EZP`|bq#!L5S(um zP=hIWP0i=}0+AWi@KDN!tzbYUaCLAbK=(0W)v4}XF3%6revJR&0>L#70FKXc6Pt zVncrY`bDUJqrAygn_>1T3H8EZdh`MTHdUsljNlSn5C2_)SqNN$gcK3P2#)?Zr4Oah zjqWL0Uf=Pk=h9N%Dwg(XciAgwx!JLaH~xm^4BrO~!jU>AlO)3Pew_oumaMV+_;np0 zg-4>L!TtNPSBX50r-6!KaX5E^@!yX?i-Fv?HW2JE1W|LV0EaTCwn&w1B9k}^tTo2K zt@jFvN1;81vObQH_Tg2e3d-Cl!ArgrU(aih!uH%^J2;O9C&C z7imJUTwR$QdJC?C5`8P>|LuDc35OI-A_y0y&}#($vU<}&hxVf#0nqJvhaSs?)_MOB_=A>a`rMfdk zAGNg~f!?_xz+k_OeHB!8lrjW7a9FFYROuC6&vxbAPPenh#?(S02VX-+Y9@Pi8l0Y& z=(nUll}pUbeN)Ty60Fw0k@#Qn7&#;5U{m3R6)RvYmRIFYyAojGoM#5Vo`Nw@uVbn# zu4R;|&Pi?#4dn0=RXMRB;1q|b13dr$;waoJjJzqcil^BSN@?lV$jX&El0vlcz_`t( z9v&!n0op3HBn;D4@>LE+3}m2Ow6GF9pK4O}g2O>z0K=vy3th#R=~i4aHqU3}RI%xl zs%O&w$bPK$p&H&n+@=wXyJ9@0AH}2Cg0d5Km9CUfWLoez^P{Sdf$t$kcKFKpcmusEJZv zbF08B)FDrx0(zG(=gu$kAND_vQc#^w6rpHv%54{iVUG!ng?l#LF!3Kau+?+zHB~!; zrMFTF5Le=s@|o2VKrDYhfkR6GY>d@@Fcft;Z%zSy z+RoG2LV}LOty7-#pIj~?OLZGU_EZVo7Y0&!*fPIijo?iEDR{ktjbS!m1vXM4bPzg( zLLrNcVA&o`g3w`Uxt39vRm*A;+*Ti(cIKEpSKyB(U}4sGKlr5SLI9DBAit07Sdu98 zdiRbxoSbLmN`zM5sj@{F1{yM`HP&Xz52o{PfL0B}_XPBqK~IOjF@#Yp@Q-byJ)ON& zFe$WdYy=uB+GVEo#o@}vVw+$5&ci$Caxfza4gwW}3*X2>w?XT+7mBZqCd!7rSDz)y z8&feqj=$}9y8PueskCwERUX#~HrryNRCPh}+}0wNuzUcMs3fr(V-APy(R1%>RL3OI zLHjHtV~8tcV6VwC#Q!?JHSW~N_jFw2Wd*> z2Etj)IBy9$&r4r~n2V~lCB8IV@8?<|Twr4TBOftNg7DsZHU^IUWkE`!w5csY+!y=- zI(*a3fByU_eD@>d53dzy5J){OPqp&&XiJF2z3f*ij|7jyepASvpcsKSY1;w=9`Q4{ zd!VoXV1}Te)qJDYV)jmpN}kO8OJT*PQc^#sSyJA8-4=_qq>VO5GVogculF<)qzLT3 zrfLOIkOOfhrOl0-5bcHx!d9GpJMV;hgk%VBbuY44Nzu`NZr)HK7DEa5Nf0QEh!G@7 zAC+H*5Q32OOCW5OO>i1#cu<4iIORn;ZgI?AC1v^6Wf#gQbn-UOwahNpdo2$bJ8>5X zWpd?;PM^3|CrHLv9uHt=;Tf|eAE66B>iGRB=B^3V4EDZ<-`?FF=eRI)znn%Ootdt) zFR-mN?o64rjv_+9X~y=OXlh1$xVxNVl*P!K9}i2cE~9^r*kk2hu^l)NOg#sf)B6xR z4CNO9AUUWD^9HFHyu;Xs(ysA*AV%7g4qXs5X$D;Mdbqq%3v0AO0|$h)!FkUUn;9-z zxg1Z+Ckf;J`_qtv`T=-es7H!>{8T&!HHZsef3}A)K=R6n!*kK}XaRO9^6^Q#jL&Ru zP(sv7Z$fAsP7)Ow3l-oe?ynLK#XvsZ2R)o+^7$~d!|2fA(iq2%8zXe)D4)COD%nOc zVeIX-SQej;bsZX*gi$1)rC_utGTBd`CyzYzy1mJJ(TX6qW%~!jY!a{`T0cWJD}E$# zGzgCRSUB zN-E3Yo6^5qNBiB)$I8|t2UzzFVpWA&JcPDpMfKeUsbS~~-?XguMyorVnW-Nf*P0&D zNgZO`uptP(n+;HiKS3RdvW7WCH30hfnC>YQBF6qm$_Fh=+5D*{+v4%^5Bk{P=vcx# z@93Cju(3|hy~e)FRFAPPj~U2 z5(nZ_WnG`G6aa56Ne4s8Kf)lXl?#RHpB6qT8;SOMj_WCzOj%yvVmeIy4aOX^BonAj zg~$vy?>NJU1sQVBbxV6w5qcaa>!?qzqVLD?b_EfleF!ha%;Do3S(=or1B4ZMOPhTn zRPeTP`U8K<;62rieMQhFF!Xa6VbtZ8G`baSW~X?{k)$k4E|vRbZuNvSr}J-}uUhne z1b^Cb#84@QSh9G3xFo=QQq_=ENkAt5`R!dW6PUX-@27~pr67d<_B|x57AkYY(=fzP zORxSHt2GmbEHjZQtfI?u7#*T~y-9p5$0V}+?E@={f_%!%s}SPsME95P)}3f6jZ|9a zD%P9G_J)&2P0ZE{pFDYtLk+EW*q~ORimHPQxd0s26nT5&ELLSk;pXx+T=~?KyB9c{ z5-vy4|HhPo8MyfjF#leWw!H*tpGCv%YD(fhJ)y1$@`C$i`1nbik;K9HTKd*IIKx=- z$?W%s3E}kHGOccla^_R;w}A-DA^WZ;sLKU;JDGC*yWHUabGg0;h@pzPqp{_(xsAvZ zBq=8?0Lj4R`o)Cz5<$u$x?O*dxTPlX9tF1;%>pSI>l|1Je2(na2CZU zX>?vCBeF2>m#9TM>q8;t{}r>b02T3BejhL8Q(DrXg3R*Dd*oG2`G2~`ZIc0F=gN+y z>D7k%otTD^P1RsR2tKX1V`Z)?`p=67Jpi`TZAcjihxn8*)rk)kHpp7rR zXBL6;@Fe{y5|p{YI%6wwToV+Olx9Ivsh4PtJG^OlR47pFD-G*Q<%`*EX$f+c3RJ-# zt{4>9x5ZeO=Z`y&WwlOK z6(VDl)VMZ1fK4|$@`k4!*3+CA=22sVu~K)%^F1)c{1_qmzfZszvkDrQXU_!T*QNbu z^+Wf6{Bo@qmNa14p};}xZ^uxq=Y69od^a9~KA^MJ4;H$O78W@IUXWD12wB1So>QjR; z_t|iu+qS}HhBP|8mY*Xo7FaJopRaC4UqMNMpBlAw{R;!UcWg`pP6XriqLoDaDB!?G zE=34G!HXf5(PUHh?3LPc@pC)DVTRp3I4zEgc66%=AsmUK{UzWM0<0k_awrBnPYkU;p9XYKT%zH^ot zfB+G?wE%A+u*Q3VSiFN*PTU5L)jkF^+m;uo(~6|yiL$az>$r&Yzl@{JBVY(X3I5Gf zs?Do{77S)!$GF^jtni2*A?tEWzI(5qSLI}SeEshkJ>n@RRe16_*J!=)&+Ku$rk#Bx znqvOVeSkJ#Q@XeEp2E}_NqbHUa#%i9-axR)&ot??BFt{oA7g%{|0}3`CGC3V=Un*l z%b%}vzx5RVy}y4(-UO&fCWg8Xtq~5ILf+W4d z4`Cvf1aTPdY5!B~5x;{&KGLL#BXnexO$v*9-zf?*lI3;#TTdi#xI^#ZJ)sNO$`=Jc z!4TxpN@&*4^lzQ6L4I{?tGIIqSDz(&hq2S`OI7dLwD=L8yN|BvwTmc{oA#3wR#=I_ zG8GqNcH12P`hSK9Mp1wRhVUZK#feu?so}fB+8XWr>=BqR~5r zJLKF^z)o5e^s^#p!FUcTW2c<*va&fq1`2g}%0EyAq{962i7$k;h&&!&FH~7*GAd{L zM=96Y87Bi}-gmz7kS4dY{IBXoj7#~G_c=j7o|ixpr&h)LPDP09Yo>-#Afj;pyDc`n z)qWOT0w)LdZwKy1?Z5%igfHy;mpaefv*`1773jFjcj_y19!e?>Y2&{{gP^zMRYb>%+8-Mlq!-Qt{$y+(LrET2FLK(=SbT{48rG!5s#YC1;xm(oXgC@xU(KG9efHu44= z!l{>;WHU7sU>ZWsu@o~-A?yBmcnJ?|FZMzd{UaU-UPpen9A-7YHZo+?`<}Q_2w}<< z>R=2vJ)ox=x)I;Qw_Vi+1`*}&K&f)#Gp&!b&mD`^=IB6)FjC=A5*A`)*N-2=po2B8 z!cDc+41}|;`UcdA`RHxfYiI|>jQuc=3A5Mw}HQsoZgmfgE*}9 zcwMg?z3EmxXJ`l>UolZ>SnC(hd{ycvmU`B7tv#=*@h#=&8Kuz0?ixUE5A%B4mE$5R z?*vZXQoVu4k1*#4pW51GSf2Pl&-D%?^lq-RTghHa-`l2x5Or{SrS<^r$ec$>qnM0IvD+OUrzLl1GQ2l38gz_iD7hy{_~8+hG{18vVD(3{$Vr>W9Ark?OvvN_HuDU1TSl!2i?4YNG`Yi${+rMML z3FXg?Ty+<;#P5!q;XTmwT0#tuoYyH#CjJ>B2-u*L2R4S=R=O~cT2 zY+7jI;_)lgS*YzK@8i=Nhk2U(B5n@DB3H)sv<+qWT*;s{luKt-Y7Ybj^+w zj4u+ksP+=M;HwQN0%wC+F<3W|HuodI0mug!03J5Z+d*2JQ(+0;0sTovCkroR(8Ul97}ruWm2nbh%%Ee&<90;e5U^RB1I6 zkE#q#`&LHXtH1LpK(rts+;ge1?LdT|`^|U$RD{(HC>X$WjSIP^>7G6fA+T7-d55k* zm?{^>hCuv!?0MH@6G(z{mpTF;E64-r%s^NHoqHAJ#l#A>pwRm%JWrLytC#1c>#=Dv zzgxAb-{4|x_Bsvv{%;a}_oW|{{%ETh+t7=Vc)$udel>G`M=Vz3=_LjN%?@$~fvw`M zhNa@caWzV`SHeHGdicH4RsnYO3pKk!B;EdeI~uq=HV0Z&=Hs1Bv|W*dFBY)xkVdT} z3Nv?*P)9~TJ8Bh zPSp#4|M$ed{qH9pvoO1)znJ@bHDmOra)ZrvmNnm`m)gS>5=qI&8}ml>Yx8b>4rUg* zAeG^k_5pGesb1n|Iqhf2=Ken`xe0geVXe4rjPx*#$KR-7YiJ6%5J=k9&^eSYrot3?ogU9mn8E1O*P>_9W8m7hDM&AwhG#%cVU!5 zB&bi=e#=VnZ*r${zoyE1|>y zgFp?G)s-RtvPBy~yH?jEyImOw?8LyHyZ2C_jSuq)?M~Tu521!Ysx?nc*>P2)|)Kj`2*bKWE` zqT)l5AJy8I=6@eOefcfs0=jMyisu0kVRY&q@G!PQza6A{KW)hn@OGPE7|xu)jfub`=k(W4U{vpEc*Tf5&f8;( z5r}?ICxz3>zavmxX5)o)l4+!cZKv^T_HOJAa%wrM2;TO*rR`}&fF-T7%&22DkzD5ko(v)%OYf(9x;IT@V(sJV5o zQ9aEIKT=m(KhiWwdR|j}FI!S!;czBU89IKkt$04ZEEsHxzcFMuZ<^+4m5a9OKXEZJ z!0+)+yR?$ z#%#~{DfGI3cgTI^7<=omsNVHo zm>C+RWB{eROS+|`L{b3}1VIF)Q<|Yex{)sFlLIM4Xq`<#94^E>bL z{^2DkGt64+S@(0_pIX0Qe;(oVk9n4g3_^pStK&#B>nIa>R~SA^5=CFT@hZ*ogGIl% zyByvO#G4NdhC#%drFlhBtS;hM;CL$CEw36=GG^oQmiEF1! z59tSKdi3u!O|rJ7;)>=xM!AAMULj$>hEmo&pQihO1z+if63LpTKBKnV8yo@REV#aK zJ3dCSZS13|OPs^kz|1tOEqf%^8vQ|(NgZYES2gU{rjhplNH?fVgw*8@<60;zrj%;-G=0%mko zuV-jweB!Dy{)y<~XkablKafwJ0&`~73rXaFF{P$O+xxk%Ehx&g3Ho&OqGHswV+2#KNH^ziUeRv+(no&?mqn>1tQKgWA4~S_ zR)NuoHU~@^SO$ctkHpyQ4u3r<)@)+lk*eYdVZ9(L``c1IOw2B(Q>PhY_W#^$EB_qs z8BIjuem*1hXC7{Iq`h)L&xi85gJhIIC8N1|yv4{}qjx3q;@M;88_>~{sgxTdQ8HC1 zY2MavUUY0d((QX->=ge3d!;E4K7-9V=(q?q#g!q2#xCDPq-#-a-Y~66E~`Bea`KP7 zrTZu-d3*|t_ES9dOm!4<@%tB`s`{JhObj6Qr>$0`I|9Z;&CnI?~2hYM8 z6F(&_x_6uN9C%)R5~uv3__qPZNo-McE2=#IfNR%X#dnjeF+w|s>c2<aW+=!Kk?= zn_D&b37i@mobr$oB%5&B0fsO_O(cH99r6|GT<2dHn~f+vGH8Cs)hc9lr`Gcm6CRZy zqxR)djng}=&urG>M{b4BMy4{ix(DCp!3|HX^g7=wZ47Kn<)5iUX|2!)1}a?K+CRzM z$bOM(b98lkoLh401{QE;u9J11w3>Qe2bTu}dU%$J7Og8W>y8PzJRO0;5zsO0l%r`@4R3`Kb_XCTmD=weGrV0sc z48b*NzptVIt;X6(YjR&_7c89!sq?vfWFh`*F$W*O2RS2an!?5ztD5Eqs;K`5^!xYZ zEF24sy(8jva3|kTUcnc~U<>%?Tx8f>`pCA0^0<$T5g~>+S$35Wd zD3mGHkthAfd^&^5!(#u6;BEgB#^l23{1ayyuQV6$djB@bBd%6H3r0K|{&03l9k#PD zI|8Bzl!MLid%S*ILY`?EHcRZGDcrtBoz zM-eY*ZVy%iIanm+LYZZQFWg3}a5wDC!TP2q!bwY- z9=6+<1Ih~pn?~vD2eWNVfwN9la@$fPv@h9pD^xSD_xMK>BZpwRS28NUla(xW%jpOO z7B1fx0PVzNo8e_|tuz+;_Gc-HyM8h_Y1Br(Vfb@<@1=_mqm&`-8nap}NU_zb8IAU? zL?ateLprSwlF-$AC7m2i%n;Qbb;{m@Se1B4v{5fKxqUbw8&)?)moD^onytCj9wbYR zk}*Luh(H;&*G(POSubnZ(9;Z1hHxN$jD3F+$r(gp6D+{dzYxMyN6;d8!_{>HN#l;@ zc+b7!+9t8fMDa$~PX3>MSt*!W6ZMRuedVl=BO+BbsubBY5y_vEfchc>PtjKe zVb3_QqRpC@X?G=xZj^i}`m`;23lxix=++>^cowL$-cLa(9UWmOUwKsb($h=!tb`Le z%&DI;ea`&^rJdGPSkAvaz%w`&IX7@;;V*u+9<@;)9 z*@9GLcS-&Ll=K|t^~UiSLD8P*XYctFV<|$J7)A)cf3!@ zGxrA9f8@?)Da$fzNh=WbD}lo5{m_f{su)tN-H z8A4n$>ZnNF=Tx4Auy{3dF!|9|44kRoS2sBPlTOBKl?w)JfBY;H%whtL`el1)rOK!>MIH+4NsGDBSbUTm3(m^JdOX>0n z!=(JTBkTQ(#!0+ZIcK`nk7W}uyuEGY-(Yp#gQ!?cba0UMg?!350r7b8^qTsjpj2M$ zJ6&JxFEOAy^lA9^)T=7u6v~1YVqOX7_hQ?eRo!bmG>t)ONm8^jYOYy;3P>`j&&r({oX;3ND>BqHe+;2idl#L zW<1&(X1}T$0ziVw`scs!7~g=+wEZ?@x3?iNyWF%=Q1hja8vD{bn>xsr6&9Gl^SD3} z$CKCNL9N@T+J8QSknKe{`?pf1zz?vx=MHu~zKD51c-sYheyT`6R{5&CkiOn6Qrv+Y z<5`hK>Z&S^s@f+qvG2GRT0qu^!6@e*xzdZ%Lo==(4#X)WUNuyO!PBO z(ngXW6kFs<=8V-4CJ7>YWRmZopog z?{p7uqP%_-v^{)8@bIGYlsxTyZqL(gsh2EUFjhTyo498@b%`d}t;AW&NjRQ|gFUtk z!Qtb3b)?5NYMx<${?Mpd&6#*hqw^AHVnr@^6YvmDAWlv@#lcM0G=TT?poC>W_k)o7 zc&pnU$w!1T)L?SM4e|XG#WB@<)H{7uz*sEB}_;?xv9%q z?n>FK8}_%BJJ&JV=GU{dJX!xaq-oM8U#wRPy?)>8vk4HnsT-ahIa3tO6L3l;6~+~D z@;ozSlX#5k6h$8If9P10yhPkIbis%zKzhF9ewHEr=~a#~<}&l*3@&~cs{wci8%00WW>k6=@3y5YC@dVM<$qdLkHLm&?O=au=91_^PFC$Pi;K z49`yG*=lwsB30tqch}}bESkVxMo{CfWxPAw7@wSM5oMS7lgwAn$ma<_Fo2CH(%=ENRHQB`IDg8UAdZa-0Rw(3p4&Sbh%&|0jov zai_t*COQs}5iKMD;FuTbKI|kpUtd*QMwS?FSBwCp>1|I4QH|@qiKZYocO+10Z^ps+ z9%EQsCRy9tw%p!a*7)3d%ih|yoqwvoEj_|JmE0j1DwT?=6SWBl1iLUvTEy(E3XXvL zCI9T%*C?0mdqfA)Xn98M>2EpR9L)>b=SR*QUTJkSr7ZlkYJQ|{L<%Ml(CAf49qK{j zpeMr+$$vAq1RepOVeMFX|C_qK9|KieQZr8Ke!V8$!6vhYlD3#+S4^ zW!mVN1||Me1bhk+)ko;5i&R$y$2A=&ZbQi%f3KLkY{(|ClLkx>I6Zis#&^{Faz?iEZ;6oB0g3+w@h zuPl|A6X7YgH$buIw@lOq-MFwhhc#cH2hRhJ{dri1CVb>+0w~f7%fQc*3f0N3F3W?< z`s574S?8pH=zfi)!QuK;$@k#V!5D}7qI%|VIuq|JEotYIv+@m6^Eoc}3t4^S)(<}x z-66#W8Z=Yne%<*%gKZoX{xp$sT#D+}?(yf9#=Z?0=2+Q-6Us>=g5}+GLEQ}9>1I?S zi{kHh^MD*A%z~^YDKhd3FZj8bm_qi57U{+KHhdHS$XrLLo3!2aD|a?8<4`AKp;|_p zi0;mbp;So^7v>yUF`tV{>rj#qY!NfQSd{Bx8%vG!&*Q&%MMGim2wrm*^$bqR8vs0i z*kK3I9pn8FZmYm?g}WAeMDkHbzkg^)TPJfINKF8#|12f}HRl#Q`31n-?T*IreI9E` zk31i4{$9o(`57G&cp~Y3MA!paGvUD9jT=nhz;!4AWDhX@uodgqvL|pGiVc-v6+2Fr zyN?U?Mc8SB?giJ8Em#@SOe7esyGNsl=u*EgiY|>oyJFl(-}vZBy-0}7*d(4<)4;Db z8@#_733{*9ZkmcVjOiZClkldR!%JEa&V6|8> z5N=DNMjggTdL)ViTE-A=>2Vtxtk*C6Q$#7jB8*dl49k_abgv|-3H`$R&7;gV{BWn$ zxBd7uBr#-SI>8a5iH5+>#T);+3eTn0pYFcq%jxqDR5Q zR^m=?Q-y6OcGH_Tr|0f#nj8FnM7!faE{Ra)4vUl50B6)5?*(r0RH=z=A4KKz(5r)5 zFBE*NlWtQcBK$xp`;S6e(qd!oeJ`3Fa1<4p-}qZKhDENJKf*bikZD$72hxoj#ufnf z(UK89rv=a52G*oucdZWAf{vQElkznIJR6Y==+LzJcEQhR>Cx9bC&Yh)w?LEt*$X|p%%aB_9fuamF;Ur1@YgsR;EV1Oq55OsWU?KPg2~^+KZ%metD-uZ#LLWCl-t=+05wg zTF|2tRHveeKDb;HTSZ3K@Y|A}aBnxtbQ z(u#7tHOJYDf)|m=UM=T5e3ZT^yS+M)4xmJX6A!hg5Wp8nZzW^SCueaI5&aQJ@rT^iZ zx`?5|wX$9WP`^lE^Knu-*B%@d+(+Rk#h{45oIdKo-hlCn7CC?0`MCPM=B!ol7uoM9 zH~$2;>l4TtOxgx#o&v-u4*@br9XM~oPoyR?DWw<|Zh~)BS<)9r6Ctec%^#XCV6B)rT*N6!Kp5{vG`M|0RCX;N~S zr(WxB`yLZ5b~Y}x6`i(nhi3%DSxTd=R}ZQ1wPveTGZ1hk?TDfJ!v42p?ap;Z|I zBX|x^tc%rVd~zDift?M-Yg|CM_^ux_w5nm zo<^Jkb4r`70-jsK#N@==Wi0iR9ahQMF)RUq4yxyiAMgVICAAy}(oG>puyO@da)b#n z;e^=}Hf#>faBoX#-lM)YM?&WAV1oK5o;9MXF+h}lE>&$UOMwM?Z<~O8-`{>$sDSUb%+ z3`{k`-O6Mkr=Lxp&(Or@Opm2Tw`nR8=yH}!b z>w}Pc)gR4UzsJR4-A4Mlkx@56FT zuKJ+rK|F`9+Pg7EI$|*L<2Ie{aVtR@y^Pl=Dm1Kom(l~VGBG{{1BlJ1|0oYGwZDAs zxUo4ku056aoVcRWp_e8bJf``AY(&t{PkLgRk^IjD$`BE+FKZvZHf>>J^AoVZB>EO4 zjZnv>{>~?HahrjWzGmw9kFd;X{Z4*a(>`TAfm+7u$*cQT%E+yD`|mFCe?I$1*dI&} zUG<#i_%gPe;{6R7*<}K=TWNl>uUVKM9$FM(0$5}!bnY&mekd$@BOeu0r0!qj_6NsO z`(K_wMc$k8t=eLHRUg#eK!$0MfUjR?l_HXhe1`hs>c+|MAFIwsUm~dhH{m`h-t>*um=9Y+}Fdy4ClT&;ho3!E5-I=sw zFH~RWz0~FvSbl(zNbzk0K?7)1GMvBX8{?4O`j?dWc=fS>Crk?8Ah=VUQ?9h;6dHs8e9wNFmJt?Z7v2+vEQu(X4V3k^!(&_&vsd)^6C zT8kW6elHzB(=;%kbl#nRZs0%3Ihq;#mqP{@zAKbQ$m$+2eP@9AkaMdWJCn~02aJna zrEQP9WW=s#NnDGP5@B#DT6PWTm(tWyNqHR|zNmZA5lu)7!>Y6-A^^JK1$w%aEq}Y{ z0F*5RHlaZrpR^4kssvT08jM@rmu&NSa0*I!VfnX>GK#9w^@z9ANl`DpY-30+WSI(# z*ynm6(Vqkl00eU&>|ZF*;vm;C=mi4f7|`T&(tQ+)=+d9TQ4Vf)7eaZ!h2Oqjo<8)oUdBbD=6|4!NbJ#D4GEA zIB2umzRy|Y^30c$i;Z?Jr|mmil2saH%-a^tSE=vZnong=I2YT#lZ48#Ih zaxyHWYkCHk!h(Xa!*fE@rH4qgMCY_Z2PP z#|C0uXA$3g0=)*szhl|!XwUSxP1^;1vhxt+vzVW`iLR%r}>we7Sw`Q?Nj zQYW{W#4{;Q(_*S1XfN^mF;D`M4A6vX8;J?*DSgo45nz&g@w_58{IbYKr(<7 zYCO74PU7^KWUuwJ%R2e~??MgHj0>l&)b(qawc~t$7&zg>U&Drhe7e$)y50HP5%l+QY;EPUd=RRA-mc5LDIUc93Fhh0rz%SAuZS`CTA#$BFUK6ZPj8y|xYQ zt=A`>9bLpvV|#re@qi;m%MZ>E%#2S*QlSrb&S(kpz5*UE^g_ID2R1U%vUwQL#uMeU zj!(}rOUdk$2d^O-wLf$;SVVQ#LeU$%q;dRns9rzOd2JNB(PMPsMDlw6isZ1>k(jXq zL1uI~yc*}1-0d~DR>b^Ms>l3=uysDF2Y$$<*UhlcInxXhu9Xx)GA!qdj!bOEW*wkF z8Kadl{IQC7>m3M(-CI~|_uh^$IL*_NZ1-!BoubX+yAAIEW~}N@ArfBFzi6?(APCJM z2c6TQ*lG(>SaDIFw;80Wf8A3%?T0XrAO!X$T8s6 z*_0TpDvE}7psR`FgkXw@cVKGb>(A$@Dt|1!bWJa0IsS4y_^o8@cfGj>NPW$hP_~d( z6j8J5=k+FJxF6uJap5f-S!a5wr zp;MilTyJ>kLUNiT^$znCMTuX2@$3U46p8qDti5*6Hf=Tb^!co+04K7;g3_Y5QIAhl z2o)b+;rzr2htr_Z$H44{VhnAP)9P&&bAF3fYlHnNunF+NJ0Nu(^fBCfcHk)Nl-8|&WaI*I85yYV?s5qcN{}M|o~~&j)C46+Xq3}WCL7R>ERoIjy7Ep$5{%=x zyID-vJr>VC_;~9{@6AB@;>F*#>_!ybGV+ohoi~%>;V}!*wN~kCdl|Kr`+iuY39xkf&N5czqL%ul$%Q zF5`c4NU8v~gLG@_wyzctI5^~wjpinC)xC(FiQtPuyT3* zJA}=>A80Sw8a^{Os?Au!Z-g=|V*-xRHSBdDm_0gEXmpGY(sy|W(ERwI3?i&=lxoAw zc%5;Btm?z3i!;fHUfjlv1Y*L(7C?Vkw`(+DH(ML5n| z6ayccD=KikW5IwKT9qD5D9RlTP1}Sa3R)=7v+He@iGB=Mo!-xPI37IuaVvF5JsFgz zF>@H|l?V80vX#;P%1BFJLY(r{d+lt)!12$yfnnZ*C#I0w-Q!ZVm+=}odC$ZmPfLTw zh`<&AxsW!wnvi2kLH@sb*Y5YRnSlA21SZfT&=rQYzApb&aSi_E?OJ~fKuLv|&ZFO7 zo!QT}`?Q}X=Vr?Vht>I})rQw8?11zN1%Q*@br`1^3?t#F?ooM*f{`#b4J6;F))__V z5^svtGo?PQeNBEKH>D_kwUDPwY)@TRY|~*61m7?k8lFFXPrhy$tGx0bRH*B**Fzd~ z1=PQPuV}j%w44OaPVz0x`(UJLGi|#}H3f+Wwbb?R#h~K~I2NNxeM@}9q9bwrT#Jq^ z@v3di#4ZURcs9P0c-%b^3PPKV?kknci#U+$?pobQHEV*#C_{L_~b@p&4@g6_Gk3~xKCfonS!hmbyS?%FC^GJt7i2Cd z%ET0iapxYbj`2Rf+rjGQ>bcZuZ<(j?rpN=q3&%5H(^r*|uq+Z8-|mC^`Ys`2)ob7U&iNO23kC@Wu> zoMjRaRbo?VtT{)EQHi_2(A1N-4f%dx9~;NX2I9C;nHb-8V$xuFtP}uGveQ~W5gqY~ zeuEty35QNNKD7j37U5B8WEU3LY?lDhTI|Q`_ci2s*}}SJneJRxRwFW!DjbC*sCdzY z?xhM9=Y!{$_@Vh3JSS+%k^1u`?a=ITQB)!Q6cTX9I(K@JTdKkho$;@?kuB;qvjR?!Q9g=#BkKW(RiSD$@;^F;sin+PK< zlt?O_qVs{;vJT0Q9R7T((0E^di1m2H{=Rt9}n4}Foy}fSf8dEe6Oakm?j;Cd00lgk^vX0xp=I{~FGO~bohhY-Vj6?b zPie;GOP}sk6g)0J90nU3DFd-uJdu@bUs$m@!zmcCLolo*5jgb9>Qac~F-07UxmV=_ zqQ2f$3n-?Er;w0nrpJj`G2KCU{AmT2G@B((1jRbVhSh{$_u|jP&2sBhaSG`Nk4usD z^%)vNbL&E0hi*|YqL$1kmm|Xfk3;IZ-{sF4(~^|Z|9C-M2)zH*6Ty2xOpRT1r9;#= zBM~<{9C6@B0O3+?rkS-;S4Lv4XJtHd^|l3o!*bL8v)^d7$D@V9v72^(>D0m>MUld&kO2Z_j$ z(a7fdr}B5;f-O>HnUh&h^1P%q1Dnr;nz9wy<=B7hL-*z|k34>^4;}(y6tJ&$@++_D zIbWn&XgtQTh+FL}>VC&3bqg{RAH9I_=fQPjlNYCk_f1a--+!xRqsTPEJ(nVVN@>DR-Hv;NAi&9yxkAbS8Sjk?p1Z3hE zlXUjm*e1ZvPR8nwnu71l)LYURUT%Iw+0O9T%Z~4!^M_Klugzg{n7*Y+bWt&Bo(X0~ ze%YA_f_mt?fPbbz=%W%Q>B_j?K+>x{hgu4{eW3LZNbi<;u3Is&DGK3$lf)OePTx-x9Q8aDRXVSVuZQEpPi4vNytLcCSX zap;fPeRLHZM7;~GzO(}Pn;^@m(F|%T__4rrQNPfYZ1zP2NP*dZ{k9GCRB&@eFo%OI ziRb&+UNvV7O*efF<69a0h%UC%18I8ut5NM2ete40I~iCxr4Cv z?Aj9nL=+5eW5GZS+u9&`-3|l*T_^p*bdG8k_ET}tN{(M!z{1iqv+jCyT;qOO%{061 zh@-@ZeF||9qP1so5J$1K&XM_1QAfkzk=dRSL&-Mv{*)U<*m8;u1DfgQpf8&Z-7k8eNsNtIla<-?;EP2O$Wuz69n z21@@jvflr9>Bkc4;>-l_3uP!6y#D>Er3sq6pIywSIQ~p-4q(P>dFIuMcy$S%7oxpY z+Y(GRF)?M;El-=uQifX39W@qyW^&^w15ijbTRpCm#bQkHbh(0cb4@M~?kcW%{t;&7 zh=Ja`p4%4%b=B7-=nhh4wG$6UA%Z8!Fa5bfk#6JR17sFR3@Fhc@kl;TYg`^jJ`W-% z!73aLy|Bim3sNd-mdn`TSRZ^?`c&8;0j%&!`=L-`mmfrtRstjY+oFe|J$a3`c|XvZ z08M~5n1u@@?g&ChOk{YHJTg2f=NY{=3rNzKEbk;wpiuG!SUQH~S>3>+Mf8I0O$@46 zg!O46ucp@^Y|BTD3_B(T861(n_9>sL961$b?)Yg9Q;9p*Jb93wh18OW0LOIck6s7l zryfUsYKuepcn2E>B$4%%kvyEWJMb;(gI$#+Mpz{<#9l8j(RBh zT1~aTl$l!&*Wt8AY)GiX5B)eRyS^RPnn_!H9&)JFfYhf?12JX@?=#o$r9~VMfm=d+_xZ&%`mJ zp48@3k^f!RIcxQ*=XL7#|4KOuEEeAlMy{N2uyXK))B=jWHz_dTYf<0sc4pkQ! zmdG&-BT{Kfhc!5@+y!friiF#}eVY0@b6frPYWm?`<>&!H;s?u9lD4R}6H08|0vW2= zgzCoz9ENoQ`MXc@Egu@@`kj*GHDNn%4(%9)-KI)>3jpaksx!sBwigm0M~nt3$`7e* zr}7u^*t%1@Ju$+8lTv-@&WqDm^>%!V_s1*6);nML?iK1M-7j-_g`5*X^y9;adQfCQ z+8ywX!5dz(l5H0)lrjH%4Q_{@rg5+nD6|eTBHrtneOXJHGS{%RHw3yv-3o(jdIDI! zLzI-Nc>9^wl=6>{vW^8`^ZC{X$F$2ba~giy$9s#Wt7V9=%}y6;clYYl>mGaTwz3c_ z1O1_o=fd&~AWUd?NF}dFacaqJ?pG|h^ZgU2^==faycZcx762|D(QDOU0;ao45Xqjl zmkL#0(l!*)|HXa!)>&T|O#O&$c_vSr<+QhCXhjx1hpEuEkJC#U;@n`?T|gZNy{W37 zdv&msdrodM7NZO~bisRu+q^;W&qXIJZce&<1ujz`@-msK677cpfQE4Yi&H-e$j-3E zYNleomHb$-fm17A2s#E9-KvX6TG=Y^~^S?ZVC;*B9PVp7?TC-^xF_}aY8AHaf*`?^!DSu+db zK#*@!xy{z)fP51{#CRIJuszq{3a_2H8SdLN#c31>nHNciNz)1pe;-hQ-Ac}urzAGK3G?$07T z_eL&bwNB=~lMJv4QT^=S1nCj|Rc3_>z}Q?E{mVNISs_NMM#iGlCO^t;#xETHoU3x@ z#5>o1wZYo=5nLWn3lz}&s=R2!yI0De`~$eU=LHLL56FF@^V++bhQFAMG^^O?h= z_0*|@bkn0a78Mlq2hir=g#6}e#~P56*`p8MOIif9tF&o|;C5SP^e$V}X$ut4Ui|D8 zuo$BSAq8mppFU~zMN+-}HJnlx4tbSUZ)@ICI=}~>dj3(wp5A(?E&bh8Asu&xVRNEF zB&9Nt+ww2$h2Q5dRE}eQ3KWK_*4kQH79DU%d}5-)lFzN=w<7IeQZ9XYbX?M-AHgwg z#W+Rb*)BV?0>FIyZnmZ+GR*Zlo>r|S@4Rc`5Z4TTcm7t7IFi&ZC{Pad6#QerAe z_jvH=S7M?(_P#H~RRPa<-UOJ^gK${K1_%(!^F_tf0^xvs zAn8)~jLzd=Z2*bO`NaYGq1Q*=S5UfHW5CZNm5BcVBqhK7J*G(!flSr|*2{E+dMr(J z6pcLFauX$)lU&T|K_F@l3`7UeUsOCTx(kphRYEF#S=q;~78Ry^^hnwF*D~lxO}X&@w0X>=7Gj;v&86?=`=_iy>FpO7o;G} zbJv^cIV!lS#%Nv0WWm1%WPY|~6o%wy*+YJ1H9IqIpTBZWw@a?SUFk5HL+RQk@0xq!|EO!BTnoIL zQWBW}Vue38G;pa{PdGk6W%59rxSzHWh=kK`a(c^5-<{;oS!5_b{!n_|`z8V31g(h~eTv z3vMEOmI-(KO3m4iDPx@v`VzSo_g*)6Z|jo(rbE9=J@Pm-!F2QMZ93SU7auKHl4Y%X zNQ|!JPFq+F(Z~Bc;s#7>%!`8^HUJ5Qbm92Shy&@$Z)V;K=>{DUvmBYmur?49t`Asp zyI(8v-Q(X9TigzDFb$izq{{=kWBRrP(k!0?QnzEnu7BlDZbwXlD0+BgTr9`U#Q5#9 zKS2w=x6b9!3KoNyF#xpa`LaP4UKddmkiLMdyrr1n4hsXUN#QQYJ((bbXQw1Y#!g-! zWt_gkuMV!HtfcgZOfm;fNkQr zZ5|wl%{Xth!tHTN+JZqkQHTVxyH0$Uj;~mmKBMmOZQnr+ zfl2$yMJhp3TnSgU9rl`qYG`~+n;~nf^#+^5KxJBoY9$yQ;P)F7C@;_ZiX}qO8wqGc zvBSUA8h1kFC^3N6nV#WwtOC$frXk?gI319cvsr6&WTr>nhdS%+?`4mif_PGZr@TX9 zi>@BKe+TtO31TF6Q*?aD-O{aRrqF?0jFn{SB@^JUFxq-BxzZtX^*KO<>e}fFRyjTyD|L|zW?j-81r%*Ho8~DW0Sl-nGfkg z<5?%kifeDBwdB3ZAqXyFa(cF035$W z(oya+JyF!(g|)vV83R3+h=EFqYIQshdWDSRq%B4E;W}sCi=vBJZE z{9xOW|9tHB8)>ah6C^`kWl22>WGjY&Y{k0qS0+GUw;i2rwh=QrC%o^8Tp0K@bb+bj zj;zQZ7~=I=LWIKpP(GRYjK2Y1ZT9!o|FxeP>-&Rv=}#o<7+|#^S3GD`J~IOg-bgj3 zWjFYK1R2n4K0{}q4?ZaO8rKnc=mz?q2DZOHOovRXB1GLSXdcK=@@)ZsHvYek4G5~E z?$;ZGPE>)`0D0itYY~?~M)&;073Ltjn;Oh^YFJ-*LlY@~rRN6!`_T*OEBBS2=gj>me3fGRG}W#ZOK$lG`J}8= z&cCOq)D6m`x$G^ke?iw8&SW*-;O-!=;YO?hPX92fySLb0c(d6mCE<`<}^XxoDY`0n=bnbf+glKt2LLJTF8HK4pj;v z?_D+If3sYS&k4stNv(iJ>A%nW2)I@#x>LXYP4I&B>o(ED50ZZL@;IPNH&IH$18MiT z7(j~#b)82hi{JAlMD`CMkkiS9_$R@v<|kHDd-jnqyI3=@z+we+GSl6tWCMZuqIut+q6 zz^tnID+CApVsO&fnVY&XL83l7Dli%S_xS`nG-n4%Ercx^w@15*sV`+NZtlasy2fGC>ik70NVIGLZP zAR?;em~Qp@bgAGjlZtD_+lK_M#t@-^av zT_Yq53fMkm&eXFhB4;?;U;s98%Na0yEnc=))2crLCoi{m4s&>zy4;cs+=Y75Aeb6= z*hHCMeRf1cFNLmaUy7Quk*?1wX)T}Z%)MkBOyW@oF^^gc#lN|r~`MF+B3gI(by^_Cx06# zm5K&S<$3(KZ9t<(l1$eSfC9p4j6Aph_iek=H>$mHS}*pP?R$`ox|_Z{4tSW)W&pL6 zXEJbD&}+nwgQo`E<28ocjlHO|V$%r&4`u*XH0!&^zeY3F$#`DEN=|`f5t%j?_ROaA zh(^>QV7AWMBUrW6APPiJgPi1EbuBHePvG$yY13sdbf=!zS>4ZWYX=iA8~oz4`RFIp zzQ}R#aG^(x-GE>25y^4{k<|gjk)zqdQgW~^K#KG>2df~_>q^0Kj=k>)g+Z5 zB0V5!nGeKIf8oH*+&1g_(W@fzy2~wqzkERoMHZsA2hzEEi$%K@0WSlxwvOFi)D)Pj5XTvEZ24ptXcaNd~lJJpN8 z_$7bKid4h$RnOv}ToaO1I;^XVv-D#{^Ed?3=qVZcx)rFU^KIhv8QBugNRvJjofQSo zi0NoJGUcnTA|+dtS{_tH=b(B8ZfxVutpA~8&8Kq^joH$`<$#u0x#~R)5!x)YPfKh- zA5(i9&LHgTlKHTX9xmUZ@{rPjA!RlVMIn2~uG~!2`>Mfi1{cN}ZKej9O1fOyuV*BR zet}~8d#=8M&<)4~i0*@jPMFaSU>Bu+XG_fV6&PP-IHZJ6MITFxDg6N9Gr4PPuLnW8 z@smuc1zs%_wN``d;PMb|lyUlXi}mc=$OKgoMPDB73XR8?)cI584#pJcV%>_2_s?iz zpw_cB`{nvWBxiuq_n>;Z$y;Z$pkF$C85cTQpqlbC0@k783M@8g*>I?2WndPFS_0c? zbd}?VnhbfrHQw0$ISRWc6l@^J7{yOs;fa#xT5&588=S;D`u>?J#dTJu2rWg;3syM) z7mjpSL?bXe5!q)&jldVOK7=!lDLm@;X59a&9;w6ApT=(<8FC@*s|I*K*y?x`_S}Q& zE&z7uO0ny0V*TBoFu?Zu-?e{Z*B}%Qc-WPFR;){f&Ua0B%91W`n_YI;DZLuosgB3g ze!<}WI0ZmVTZRN{5{ikz1ZN~-MLp6*%hFM?pOSbs?(SN0mXA&Y zXcYc`EKwA;jzBawUz*aNmJHZ_5fS4m-j$bk>ODbwVGY^MB%%c*ZWkwjr~ao?1ZwsD zHc~G#bDK$i&%zdv?2# ze_M*bW#7OTycOy2|F9>HEIdFq0?58A9L|Bn$^25lJN`${1DYh0jz;mn?*m#S(EXt! zw-sJMtCDuCe){|3fP0`&$=(rp--mpkf8MSf*|y=n0mt_rhxX@ou9?iW^^^GRYP*vH zj}pFE`u*acf#gZC8slRs#IpgPh|scah}c5~LX-%Jl%u0VUKres55bZ#_}Ih<%P%8* zmW{ADd;B`~WdwuM>{kEn73p@0SH_{i>15atUmgP^0(M8L$Q+@Ny+IEkfYeF2x zJ8Je=v~UzC7Hu>(L>3ZkLl3j-Fx5sQl%{`ppvtMAr9Q$puT?Z zxoh1&_s2bVo$m+Vi|oC-ySl2n>Z#CT2X8Yp1`s8o6|OK+iH#QVLc=aI!c|os%afmlC}OhGROy$#UaZ-1q&l!EBgeVC12zJfrB3>EH$UTkt!jzb5O! z+Y~19XhdC7ESSPl9}AfAjXP)r=Usex_Sn;4I7;e&EgsV? zkGTcz(Hj%7ui=yJbA2r(94HD+tn%oTml=ny=O%NdJvZ&ugYOZO#vG0ksVa9KXvbT* zHYEGvx~A8ggL3G2B}nEK_o-D_p~-!`F0ty?>fwlAZ(+s&P2{7PsRH2lnIRIN1tbn1 zGT|QBF6aaMG(H8kkdyR8EVOi9 zN(QP_QnjMLI0VB0_J9HQR0SF@9DGm1FXIk0IQRgx#qbcoK@^w|=b-VF!5;C}YhL(k zk2tRa7Wn^a`Jvdp2R}Z10=ZhIv9@Iwz4QT;vbnB6FMUSersx{!S?@QGf$7u)(huYC z<<8R@(P9to1rxLe*FnYj*jSj_D|TtmkTNHbW2id*`r-kp?m~Rh_-{gS@o1~PT01Ot z_eCSb}-+;r~HdwHYgtDu~1nY zb9jGP2h=`;3-%&G_gW=u>zvKRU2k9`O-z!I(*Y3oh~{H(*<3_^<7^WN3fwN~<49QR zjXg~6so^sj@74rzFik<9{0Tz;YxCx>l};++uJ7eHUALk^s!r1veS7}uMO-zwj57PX zG6wX+|D>rV-IM>U%Fh_2=$X0HgLc|{8F7w}ZpDhK;8x-nquQX$Kg?R9PJ#NuQ20y3 z1GR)O1U&w3it}GgrHHUeLtp^_n#|o_c)u2BpYarkptR47?llJ@j1zl zfV&}_k_q1*3pOcn$Dg@u-Wm>YzNnb#NB*|uL)xv<>junJQxTp+3)2~iufQsY1E_&Z z@nXJgF#o%&BD+Vb^WyLjDe;L57B#CTxE)c_yp%&Mde4FmZ!gx?W~I=Ql{_o+&YRV@ zuQ>}EOuLZP~#0L>HW<`SEe5 z!N5cGQ6QJ6sxW`#oPx7G6uz= ztMfLotE}hQy^SBCkpT7oRI@&8t-8@XYh2!yvstCgd5Z^IetF84emn{NMR9g}DkZe( zhb{LtaPNgs4wd^U#2I33x5HWGmN|mZ3_Sh*a|US$&W+18F$LVcu9i4j5(&2j8`bRj zFoKKj9=q4vUDda~gjrehnUOFE~0u(Pp{Egq53@9%P4Xg$ac6~^8 zsg5L#oOUJxC4Ia%m}-EW>JW!;rffO#ZYK8-@GwP7A&0Bd4T-Erz}E}fcqxW`5Vn#h zk69dlDr13|&A)q1h^1Yh3M7H{EXer}oU3_{CZ`n@x7cu>08)KvBv6>sA6mV{)4x`~ zub>f%XaxF{AAA}5a|`9~Q{X^(6M=txLQMLG8Aw9MS@6KY5pbZniNMkQfe1DX^mV`# z(;xkRAVFxNB%=F7#EbjNpYo6LKhW85Fyuuv+6@}AD&XHUg7efJgV#x7t}0;8DzeV7 z!K0|yDtaiF8wd0oY??%WoeKw(zc#wK{#7thW{1HW93`hPK5ir24})PfAJuMTdi*@R z(qC!cj12bX#liY6|2hz$`H`{QshTwETo0V2?sJTJ0v4~PT5|)azbbG{2Hd~=>uiD6 zX$8)3At{C%s^F-vkNItA>>qvLN9JiT+jcmoIG_c&^&dOp?`6Vgz%uC!fgN*TMEp8d zq0b&-xB(PRT@v*l3*tX0n+41TF=ygG=EJX*@6(6V1u~ojfcbJ@IPIUM;0FcSF%pVY z0my11`(rizy(O4#z!0oe*hMbi=NUfhSAwMrvl#mdd`ezbmk9$ymNQwYwRS) zfduvm@W~l-6{XwI98dfn;unW?GJ+vK#%quOTG5dIL;igZn+CK>{h^w*&x^lEON2QO z`zrH`^q8?+-mFJNeE;#?Toz**&gaj79+X%JZvs>JXI;>f2UL3Qc@#mc4ei8l%9GyV z1?+;{QK?+r~!ByE&&!WU7>k?e+16wP8cI@ znirEsyDrt*KGul|m+WWW7hk*i*xR+OW~@L^YB6`I?{c$A(_H^@cb=2Ne2$)U$u4s+ z{n0$90l~axf)4Vm;G3-&Z?`de39ZQ`+{mk(HtCNQGv-Lt50%ZXwgjv7%IPa3rzi9N5lI;;P^NVYf3XOMf#%tLm%ZP?rE zDNVG{Dd+a@1Kc*DM6lCfC;w(EAPT}jd_!Ros-ho}9;G{TI)YJQD$>UjMRpCu*PC)~ ztz^VMsPf)hlAAcQRz0$lE?(agY4pu!CbBl11L^hj$s3F8ouy%~&uwZFb3)7l;RP&( ziT%z$o|-OU$Ya{3X8W94BfMV8SnUoqJ_^+1BP&tes$Jh(KDrrdTOPq-B&J(7=xNl``%n~Eyi3v{@ zs@DkXD*9_HhN44SqO)K7Nh!BFN8z(&&G^AmYOA?j|8Gy(9uLt;el2M(I~#gGT=dlF zYv7f%)hG-tp97|HIs0d0FQB9QEVYgklg?0u2g5wqHru<}p6}LpM)UP}Ub2a-sjW17 z>iwgFx#jTE$wl2W<@`nlRmyqW;&ydJn!_U03(vXjHj_5Xjo4}*ET37i_u57$WRC3q zARk1TZAD!kA6lFJEaO6n!_kS)uWBr{&nXkzejHZxRZFP8kI^+MIQ1^u#ahK8slGvU z4`({9{AOXhhkPLtiQCG466;a9GZuX1lNo3=^Ycer*ih}8`;z2dFphvy)BZx}{7Mub zO${^M;T;hSJU^3m_wkUbitpCWO0nlqRgeP4xE)dcdJ_oWRiKp^#CavJVzYsU@aF;= z4AWhWrUEuQ4eY5DXsi)6kDB#_5nd14MetXZGzyT=zbIAPdDm@~BSRkLE9kj;G1{}? zX)^a_z3I>T2$(3m{V@4f=lW`z&d<+#_L2{K!=}0fDpQA)JkrchYU%T0b%sRVwewAF zEjHU#mX>VEso_K_?mSqOc3gj%=GYN;vZdDLeO;Xlszs?fFOv3>O*Nn43qd5=T?NeY zLT3+^-ZPv{&BvCCTjyvb-`}y^C#@L;dOloPXg+Us%J=8)D$cy zToV2L8c=U!z>QMGD3{Zd4(j>@8tv&9l+AYf7*^$Tmuz)1>uxj1RX>6+MwgcpO*O3h zare1$)E6iCjvp3x+M@CB8d@B?slQw8(JT;c@0x}_M4X{geU*K)zwNW5w_*04(O@Sk zF9m0=@MOi@kdNPXaXLFhnfT!sxrPuudIOqaySohm%jQ&lJ*4%6f~&+21>fLf-mGrT zP7nup&Z6^AWOj4+Y$+*V7Lh_qyCa>7%VJWN%&=i_*tm~e(-Kky8cckqC08^M!I>ki zSi=a%zCzywHWtX5&%?QnJWzB}!zJv@+$_M)ekwQgtKI9x3k1SMZx!-Uu38Z$467O= zRwg604^7E9f2x(fYcI;uUPai*kmV;ktan|gqA&;Me7j*tr$v~Ls{3B|I!;IL8-oGJ zqM)+y^7{hToBynRkX86XyFU3Uo>ZRL$DFYd(&DaLk7CS_K=p2;qBf5(P?_MUEdf_) zF*s0?&7qd7^lRvm{zTh#as*`slqC05B*!nFMap7>(M1(TH*q+VDYA&apZEqo0Fd0?4&SK{6P)agzb`CMgnueFi6%aLRl0 z``}m$35fYagRX`<6N^}DOC@g35C>sDRb&b%WC_zP9+bU=+v$y=zXdV~S zp0-#ZM)ZNV=EM6x4}CF(l@KUSvXmiigc(D8DDCB&+sSihFe;C@Gy86 z5U~g|f@9Qz8>{niEsg%87oq>oR8IDHlL4cLS_l=aSpB_ScAIX z7(kh(fBNP5NJj?v=pJM=&{CY?1`0Dy(v(uqG7ebeZw3DSOymu@0n!U5lu7#8%0R)%rSqnnqaVTFUNZ! zQR35=*qyMfwix152Xz^K3?%^-5;rHD} zUaYSRD%;z(9;}t^a#fU@{fS&o_R)gZ`=e=@q0A! zCxfRLy@pamp{LG*Z*^bPBKz~yzrIy_$Sr!kEUVi~>SkSSYtr@K1{|CUOph0>JaF3V4h;S!8U57WQ@Y7OaxdeHu1gGeJaAoF*Z~* z(qAiCb$FqrTzD9 zOilq}TCynS4{6Olj3GK`k9%)$pBLg0Slx>}Lr}4XpvF|N-j_!*q)3yQjT4T=o3ePFW(kphfda=FIWZlch6-9XMhralz1wtz z;vHX|)J3BavvpOT_S|EMibUY+VtrTMy$jx_jyxE2-}8`S085tRCd~#WypAv8B&j1; zUA@c|LnQ_1IYIEbH*-hM2f`I#EzBqHDbFbcz#gh=GQi$5jT$3!chgJ3#=twlo+v%m zWQTQ73aLG5z4S<$5!}?*D8m59`V*0R9Rj)vJQW9?dN5OLPx}2ZSV4jPYcD}99;|;T zV0;q=!!U5KlbJa^?y=%@9rG^l>RXkeY0ZexBLrF+U@mlaaXd z$JHoa2p?=LfwLwNt-QNMPkA0`Og!<-E?$jibmHR|3Qh(vIQ|%-|122(`DJik#<}o( zmaCIPSEi5{4WC( zj;jtM&8~xoK;bb6kyNWu(r0jBHeQ&T_^3>LMYilZ5#|`FSm8%>lK`|`aX>eZK~@ErJcOIHN`y~vj&jz0?H~?C)X|3Kfd#S? z)6M;?DAs|9p$6#YF{3izhmIw3QoJIoeW3Iy-f@CC9nx}r2+iphn3Fl1vJ-;?1DF%K zw~RLl9m}E51sOZ6efQy}kj0)cS+k|az{Ob#eT=MG5VF0tW$3Jn(}4Pt+NU-Y~( zATN-f6HH6eKp6TESC&tazB$a(`SnEvjIIGek0%7PIJOZ}+Cqj?CTZZ7L&nT4@IL~8}KeJJiv0kS;@FkyP;T?2yl${zZ(4#S6$yTc@Pv8q=k3`+hus9s+ zJn$Uhez0qjh1@r8szXz?0;|sI&=dmLG|#}-7l^vMH<%A_bxJCh`MLy7{%eqwWdS;; zURSH97&F3JI4J@r^_0qi>wAU=Q9|P7SHcnq=#vVWz9*!~xSo6cnp_a@ARwIl|INuc zcPF72{;Om(X2ClkI*YS43g-yHWZEDy2i;{&g6}1vSgqcHsKN69ct_`tGq-plb!DNA z4S|HiOp!8Cv5ua2WbzrH^^br9T%oZLy-1Fy>C$ikY=(tGAwgLioPbytMz{AVjs}1L z6v;S#WQkCha91z;86c%FII7!)4s%=u*f^PYq9hZQ7!AV#6v5d5!*TRozIC$)5`iF~ zJWiy4_Xl$-MlbH~4YB;e-k98}TPN`fvdoeI9MKL%NgA}g830&+WC^u!gJ)C-bbE(_ z92gqv4Ikq+A^zJ?yx{~0msmtSqTe@faQkaNMDc4E?-GyD&mB)sn}K+z0q_p3=1(~g zJ+bn&!acXhpL)2WqmcC zNse0_cl%IzX?Z)NlCBI5Yhj_<)7&-n_f zZ)xKyJ9jF2d%c=-kM~9|cdss6n`!064z=wBuC&O8vUz)7aB1mOMS<0PdRYan20C)z zHf`3%$1g_ou2z$?UpT7v=3NWY*-m6~Vs=c?O~z&-1Yi1n{OI^-3LR6tY{I60k=gK_ z>9objwq|D;d`_g1#rjWQ!rR(U?_P5&N(h#aO?j7k8_je|K4|0a!58aB##E-@oLjv& zyLHd*T_1RDwWfcGkZtKW-y$xc^7(7o!LA2sb#wnzUu;XV%(BfU4;!?rXoxErh?I_+ zZJXzyl%^n<{On3=Bi(Z+rO(GtmeN&leWba(UF2&rCpzwHVt}v;gy{{x^;!&>AI-$n z^)r8LOw%-rk+l#d-TXXTaH8S50V=-XZcx+iNeWHxx(<0Suo$uiLyA685>K~qTy?ex-zc556c*=?ZDP!M5 zS1ECrMm->>=Dj2+s>Z1f$a%GrnLl^n8e2T~w70SX5uv=*%V%ZFx_IZ)(VJ^s9z)vt zc0+fE4+GzhZFa}`y`T|)9wN$jGSAG#O6Yle`@P1c`!`pvNv>1n-{`6QzVZ6ps|gd= z+9CW<+R!8N_>}24w;Cw(+|rhtBvU&yGOow`&IQ;sso64+`l%7^*&j}KDx@Yv+b0k? zTmJcrp-OCtw5wMhvM{fHYlbYRdZD_@fZ{?^^MN|K@nj1KF+p6Izf`4Jfmqt%=?SlF z=jpHS4V21tN^2{6z7#jBR=-kJoqxCpMAc4$rJZDPz{Ps(-Thj@?fI_eGx7D2yAQ;% zZb&ENFU!G+4~lob7mY7>7U+~zN62+`Dsmt}FXJ_$%`ooBn4FosygbK^pTUhs%XjVt zGrPuC4XpOFZ!A`9CX{(P+xFr;*V_FZHamT)16p@a<#ZQ~mz$6ds_$+Z!@~wRe`1Y+ za%5*vCxgiC3dr5}P?HaWQk>4ktM!N3#$TSE#l3&5eAH&noQ_Q>v%xm@t^)CpYIFOj zoSIpNfhXqcHs{mU$TJ=}V__)3!^w4c4yJlTTHcRHyVY@!rCV-tk4xQE8_g9;Z?y zefH;kmiEza_-eb$+^e20M$NNbvqVmk7>oVr(Xg0 zQvD>8mSl$jvWnwYoy(qU;t8hi?BGL(BVLt?IBo~{r0YqZrwzCs8I&d(!o<@D&M6ov z3l!yoU~T~5zSG87wXskP%UCH88;WBE4W+Rwc_MpjWzKfhQChnfGOhzS$DC>kS5RqF zR!OEg8BL%Q%XDTuCl=bZ`68il@bS&93+HP3Qg1H!=jhwktlbNX*PJ%DkM>Q8?j4wf zPuE&U9DQf+ER*GQO}et+cA`~zo3`F(eHo%A+SS^e`L@;!|8km-qFAZEqJvXaj_EID zpvQ~7S>$XAcSu7UJuN3M?Z1MwepRwq*1V7;k6HdO;9rzaw{g9Va9##$*4M82*{hy> zl}xR!c~E^GM_86c)XTEy3DRD0R*DuV$X><9DX&qKeLU9_p`k}0Nj1X*AHOi(Q%-)9 zShlqO<-L75PEE3a80#Wntaq8rf|&!##M1R;H#_I!vV2E~)2O*U)vt4Sua9=VPdXq? z#M;LM?`{Lq>{U+r_eCou$}4$R^c`P3B5BFyyw!AEXBrCTt@^CSBO<$|yo(1KD&|*? zS{ZJ1c(^Tz>PqsI6zGjuizF#+;!FKVZ3n*v(+ISXTUwGGl?)5tE zFujp_qVqPc_Fd>GBg>uXQAVkDGPV4*;d9a!tu+L**H5f_2JJ=IsHPlqjL7G^?plWN zYwD2pO&;%?n0{C$FyA{!o*f8#n$MEy%uv4GWa)uFj}y3TUBW&-gqV(oZGAK!v0q~_ z!~lb6r*4fWvgr!6Rg&F7jpnVwoCYU?fFc+GLpy4aD82`yq_l*e>% zwVh_MSk0X6pNxT^D?>vGHv#DYp_X|PPgrf&v+8ghs&4q1LtnjO6p6u7>Oey3AVabq zPy5tmvh)1woxz``iu0GfdQRjidPL4VB0?EIQE{8ssh?_~5lIs$P~hStJK<5BYp%f8 zIRlKf(2}A#8bE_3Ef8wzdiD^j2M!>-)o!_`Z}lp}+ro1CZYr|5OTH+xaNKG(PDT-K zZ`dAoAB98j4z|`fSNbfO=uH|cD6;ERy%%<8vR%*HE*&Yno%4p%>GH~_>$94}PbFk! zJg2@*43azh*x1+h*qgPR+fJ7=3ZJB!dVj@^BV_dGIX^>Sx^fn4)DagnrT5@a@I?>b zRSdU;L40r8Es|{xE4sRfU39l(eUBAs;@j-KJhhQt^6tKZl%iAhO;>bc*5}-MzDP#X z`G6!b)H4*t-NI@7Bh-?dKVGTIcjL$6O?vAN65Euu%&XQUEJGPGm*qaUvP%!M)>)UP zd{x`4_I@wFno_qX%|x{^qSy^A+hswZJVs>lMSWk7h+&)8{Q1b{=3nB6_jq)uG98zO z-Q!23mqt-wQF97w&N6A-I~j@6#SP`R`-9D_W1Z<-=hV5wC!*@ZEWD`eD=xR%uJfz) zG*L??+LXvdT-RBOEnG!OC)HZKE$MV(0ZhBqzfA2WWzk+Rf|SR=eYL74x%&*qbrdPd zc22bD=BaGzG+IddjfBo>RAVedkJ6;6X1n!b&GUEunf-usuOppm!YxKTZ81~ zN&EN)9VSoVWZ-j1`0u+AH({Q}2JVY&6LOEn=})XaRkAN_KkF0|a&+^(GUoKUj4d$R zk-+Elo~E4n<_~{05#~wVFxv1;pe2t)Lgv7E*g3NA*I7yu8)~FA7ueNqi>^3v=ul0e zY;$^Zmy7L`=()l1rR0TRhup^?AX+D8!lz%uk4%K&MX9&*bY#4)>s~pqi)wy3fB$zJ z45!0X7xZ_ZY%0G+;fKrbm2dknakvmP*tc0i;dYRJFnJ^)2=YRSL3A{T1mGCgfV%;S zo~QrmnJ~MNb)7cK9_L5`L~-aS4@PwE5jq<==x>M{Jqf&b)vNn$qdQl@YSCE25$ z9F@VxkdIQ+h*B5?V7M4~`u()E-Xr*z-%r2Ie`A+kxn{iD`1%C9(=S)Y@hs%n==2Fg zz}v4lF%c%0V&AO+phnXo)7sU#laQM<3|D7_CUPAp>|+o50labb{JzJ>`2m5Q&Da0J zdMn3Bw|9Y%sl$F%;$=T@U&0};rt3E3Trqiv*PlY~OaUJ!`HE>MK#xLyIjugSzihpyAm|6DInf?nqZJ3L`2*eH^>F}tg zjol}HLbmr#g3S|zw%><(gB0R-6xgJ>^;7(CEDy9=UEWb4CLnqKXsc9&j$Yr09R`LdHmHPy&A_U)#(m5()Ka=QhGcLln)Ow>O%$CqDt z3Gutky{Bq`mTp$8Cm|pBI0!B{%w}?_iQP&-?M7!y9+zIeApWEK;_Z>%!&N#4UdIP@ z7%jdC=82#Cfn64RRwWDM8=T0QZWb+`Jct6+8;)A^A-*-$^dAM+2uw3W%9_6Pn>$yv z1b{EF((hG51!!sk)a0n>>EcTn53EgH%T#k@JJ0v7Cp;W@e_(fq-11CAE8OlEK8?ww zXJEXY(_oh@vH3K|$8!Ek3kjUBrw4GK9xfcpCOiWm@X_@62=S--e6L@-=n-CMSK`*6 zw5D0-gG?z@sQ(;Y(G)B&*1yAmdQE4tziOjPeAzW{#tIOvIo(2fl#BlHWsZgf{g z=_N`1j2;flh}igqhw16R-k%iWRu6!6?7TFw6a?=F9dFZ}2`-tP0m5j@(FDO3FQKeY z&1YN6nfkVU5_!9gO>GWxn(|Hr^Lgs7_vgBW4E8}mjt^% z8Vo|W90WLjG5_<3O53uCYx_F$9Sc>!@d|ZWii@|{`qInb+H`RNu%FLNfK2@?OQ?Z% z%LnlOMhAWO=|Pxo^q`r3Gy;2Xk6-*dVp`fqJ`?A%Niw?axTm*9{d$>`Md;)>NG;_Y zwmZWT(i^$|{!@yI7D~Q(*_p?eaf=0v_hrI-0VA4h^?_;gk;xnFS|#2isUMkFc|QtYN-V^Kdmb9K{?|+<9ts8q#q)GKGqpzdotg~7r%OC z`KIoCz~Wb>`{R{Jfw062J_F(QYB!n{9xmH06Nu)7a!(Ab;seV+rQU3ftiey6nhcF) z(G`3C?x9ENp>yh@NpOXR$NQm={XFN{^wEfR<(2G;$&iTMh1vH>_VjaH3eS$8=c@IM z(I;UZkjNId?AA%QU2!7}JX`)YvL|p~RZ>4FUhFhe#Ik6C9^n-Yn@8Lnp(o)XDMW_xS73kZ`rADn~d zU7yDm)TmV1z0R|cjgztp+4&Y)dquX^d*;G@!#rOt$KAIcm)44T50$DFkc@o{-N|&O z4t*uE*Q!76U+c{|BKf_qljAsB3P9AlZOj{TuX_a|u*7GGklqwyO}GXCApFD1eezwE~6!0dSvG-aF9J( zVoI%*bMBQsNeO1Rn@G&jF38q15}D7ONL5Ehm#x)o;{q@J{JsKmYeNTi%jH^GMOwvK zGlh+8dnosa#f7ZL==`Dj)r>80F}mJ4q9sh{bKeonXInPgl%N5>kOwW*VcKW-`M{=t-Cw+c;W{>!1|LKy8zn- z#b?LQZO;*0#O<5<*43A(Hf_N0PO3x*+V71cZrh$=X=h&R*BLh1 zCCXWB-79*m`>6b8D4TLQYN{vD%h$PFmslgmw`61=N++cNPklhEGc0KX2Pe;ZCJ^?ZjgjxO`0AsTZyz}{VtUzx zjAbEU=W<)2lN5kUxR)h@+o>5OIQl(v@=Q0{UpTg7?IR|52ZAOOkY;vgO96V1BN+pb zsg)b!_u2t@SiFuFU%{6=8uiagDKeC_&*;2PDf!|n+kEm_=xC(zCjAyEPh;3`l**rx z)?M66v(3T#$8!n9>~U%4=hJlPN9&JRN9a$C@ZcvU*1KeSj5*z{i|{|YrpZ;;*C>tsGUX7H3ay2#v+?fqjA64tgQq{s`0J&b)IZU(xLA5ye{9s z#`cX|gyPQL?v|_9*AjjMkMYWppz~=11XN7Ppll|dKH~_M+`v#|iNGB6DQcyaC-5e| zMvt)4WGxsgF|gexOjhQbx)$o?P^!GN$sm9N$*fj)3K^l3F%6uI`sE;dNvREz3Fp$J z*4eq9yI$X#T7S0g)Zf|cFU~kC#?c}4ZQ4A+O0vjX$B6KmZ(e}4&-G9uFLp(B`xZYf z3;^f3Wgho+UVksr@Tk9C95K=Bd3L}>^~5^sie}jKSu&Fi|yDWn9xJzVd?CfmiLnCbV z?Pu{RU#ibm>iwW3i(xQNpzbpp4-Oj}BX+TJ(o0B(*1&o8puQH0XIn%a zxBABudm>a+xPU3Ayt_N=SN5o9dmkVs4oRykK>f zBxCKnYFaP{{YlU4XeTW_CcA>uk52l`&K`z-sWYNN1!9=XgFZh#t;JD`$W(*sl^;OC#1K z^to!+=*a9TOmb($&NBChfpB$&$IGkj=Wts_9z0lE_nB|zEz(POjnp|f-*(sAF?*+@ zgNP>+rIlQVruio33%P3n3aaAjPr$Z4s#r+3HYqRjygi$Ul-jW55a6Gr?M_?LRX^TrN$zaY4)(_o))c`ufJ&ZkdC z--e0Ov@_3-esX_3vZFO04fE8`JanOcQohg8Mz+tRiZF4x##C!^u4-9F$A;85-{}TH zw=@Fg`F-SuZ}6td!+pDa8Cx%uG8Sf=>~jdMmV_o)!ELiqOGrR8b}d|=YwhzI**80b z6gKOmi?W?z3WjF+-!Qv(DTd8c$zQ$Zes)b9}RO8D|4wo-VkZ%Bxjz28mZv z+n#oc2goQWCrS%X_4yCJddqQYWZtc?vd?6Zi(ckO=8lQc`ViVuVMZm3@-Y81C!#i{E*1dVW zLk-L>JjS&%=QeCf@bsUH6yw|NvR>^PsL`x}n=(^7N4M*_UmmKxTXznJ2Nj~YjZZ%W z=?GH9);%^c19NhjFWUB|+k9V+?EQ30iy$5!tO$Zd%ph>9sdU#v&_2eWER)Mu?dwiu}fG1P~}J}*SV*&;~avWj($QlF$s zRqws4XcC#n#tyO;LNIOqYWm_+yuk zQdQ7|B%f^((6-Un<>Vt*mB+X%76Ryz!mqIsvEN04wQ!QUuA(Epn}^F;{skO6+ha(_X|BSc;B#b43!@T({$D2)9keiF=i_{(cIi0Fxc=$msode?YH8;<>oY%9N{Art%LG?fXnJJF+w zr@qmP2m>+JE8P?_0YJ@iwu8)nG_m?sOi6+%LfHBM*5Z2kzlqp$iU5zSdy4lM=Iig^ zwcoGcH5E)f4-3WYVf@#i$ZhmdfB<S%^c!M7I+XhNK!b6#;0;J^w^3)5jkwy z4QSpgVBXP-@+Z)66PUWJ0f3XC5PJKs5V{6%Rc;W+pN8o9go1^iC1gw4;(As8pj9V_ zj|*)Q97ZS_3sFd0-=L%n@5Y5(;FwF1h*n~ahcPbQ;LIN38tF0$ZOo#A(2e7m3vJ8| zoQkMU=5#un6<^qDFf!%T%q}3-or(yUI(_-B!uHj&W>2J&n0w>h;+Y5+k>)O9gW31^ zpIg^NkDdO?ct4r2`0f{G(W?YDty=R(-!TZE$wULKQTsB6J1A>?^pw9z|1#3K&l#X* zV^1_cY7M0wngghXZqItZOx$lIZukFy!L1DH9;y%j4dDzSrol)QY6X;{Wp; zln3`;=(1+av6cheeD%eb1b`d9gJ1$KJAvx`B3Fu2Agc{3+tu+?MCr(6_W6@UQ|FhI1YP**-;u#hRo{5QjA?W3C3t-46uMwmeij^}Gyvwgklk zFck2tCwR6awpfw$CDT4PKJUI^fn}w`({lb~B$Z+S`e1>W@ixS`3?X*_<=gN={fLi> zXbEBD8FJt(k~T%;(rOf&`u+$|JaFRSey(5<#fB8ftqDnM?&k&aV<0?vXl0L^Mv{za zf2R(9NKk+d6S8Be)B?{rR1+?ov|VkZIQ6^&=+y6HEO*WTRd;$#)b>{uFeptv8ug&r zAli{&BksE)bo|Qdy9u|tBNSpFuTczEEDkFLX2UTKKCJ_-+o6=P|Euhun;$V+KJuxD6I6d$8yKpC1mGbD@ey6cT4j)#k zDgKPyBNnaC)v7^GP{qk&a?)%trjXdaLfHS2P1$!FhDT{r3u$*ks!}2T5;aKdMMUMN zC;j=TChW2u?wWv&7f)$EQ=iF?rvL`n3G9KXP%eMV1anV*X(9`f%{f_&@BCQr|xlGNATtWkfX^x<`oXpNg*)dRbVM=gnhAaFE#PVi_0M@!T=Q049@B1I= zKH|R9Z$94V^r6|*{OOCuwY_J*D}w~7*}ZSHR)Kc1qPE$r?JL$or=N!a;-79|(a-|K zPsU5lUxzpc+T0UI3zOhK^p})CGU^SW|MMy5D2aW^CTh1%YF6HN>;E*Otnp7#8%B$a z?#-l+$JmmBMjlDvQGM*l(7I9vt!=@*%k7}~-q9#2kK(CxqQ?N_Dl?>#~d zhV;Z81-1??D(Kl!*E}aB#p=nIH=tp%$_p1~HR-^d&0j_X>fG z`adIdfsIxPE0UuD|9=r%d=uh*lHY$Nf~|qyXDEOAFo8dVgw5;U!0%MOQYFG^di78E+{zL{L;PTfnpcgCXE#P`G0uPlK zuCpim{4+iUCl-wSgoO0Z0{?jr4Icx4dl6QwKzbF-8dS0z{0)AQY}ow=t@v8E=J{c{^gKB8r~9?H&d z-J5S)4(fZ|vD=-aqpMwNk-bJ4HRxvbf{> z&2NfI&X#9mSJ1nsFDc!VB&zX}>9>3;LJbdUl&1d@?^St*waqgY+esX%=d_7{1N zrTy&QB5vC*82B&WFyKO+oC*!jJMrLp+^y02&!U654f7;DO(8|Pa}tx_E8>gBF_Y)& z8t#4F={xb8`*>cWQDVkRa%j+t=@lc_^&8;w1Q5ZlDj?to)h1fw^*uAOJ}2wJ&5`4v zd|i~De=HEr0zRhBQylu03QXy%D?jb89vH-=_ZZum*FmlSrm+rao93x)#|7r={gl>NkihzmbVOlW!w+To1)!?VFtS<9Lgi!iARAO4mJ zV3tsj6%V?3WQ!-k6FkGp-kk>Dxp&tz;}8G;s*rg@1Y(EDCo`c~;6I!T7#V9Jy}Y-rXciV5{NYxNFt7gMjIw_oeF&C+=DLcU z2&6FBK|(nY6q57Re>AWolr{aD?z4pxC>R`gpfzX@;@q{{!2|pC4bX@(P?)Kmx*G#k zSc6paU;5`4tvJoWKZwt^KM@T^aHg;+mJ*;yXti%9+wb{~LTa172F|vxvHoWQ|2-)% z75CGRT3{*Ze0NeE*m1H2?-=$xI8e|Kd>;QQ7*@ZY%pXznhimpZ5MuDRgGFay^Q1uK zoRXX?^fz$)boP?lf&rAk73co_p<}D~WMfkVpXuiEc*uXgZ3I}?y@yTfTr(`v$TJJ@ zwvx0y^Gr;S(0ShO3`d674jXEW6$59fC4!hrH zrrK%S+X(9iegL$9Fn!Do6QN%UY+@Z)3U2taX zKU4w5#(982TDKwolLkP0-vfdeay)A2uM-@Nu7yc^;ls@nQDq8bkr#ANqqgx+OTU9I zZV}+Ju~NPt*2wLcmKc$nV7nM^_LtqN>4`WB10&Rl{iPa-K;^duPy4}1<@p_?T*@3A zCDFXw&~cj*Dl@R7ukcXJ2vh@Qnt3IHWS9k6D^NW34-x5LrSceXC_?>Oa_f z6uoui!W~YiXLFom6YnM40pb38kNHzIGgP6DEzRICRIvq(xJ^_yTn_sg5qzhTf?Fp2 z3c!Io!ndbey1eS75Jd9=Tt)rqmA;*2(+L@Gcgt~d zfApD}7#Nzytbdd$m>c{q8Hn|GCPR%uV#jwp9Z@~Ebw0KE?mGQQ(^)GYa@7Z|AfHi^ zJ(F6#p*2UHoe>*`*8{bjyvFOgIdAgH29)zFzEeRq z4etunCI>W>j77lhmD)WApBuMh<qQc_h?42Q)#61ykU{ z-G`ca9 zHn`1+OZVP|WJ6hdq*9uk_FPx0@W6I3|CI2zzTmtM`y2op5UyGFX`sClr9A^`W4+b@ zc)f+F8@0}ecfCY^xulIcQ#*lB>9c~CaX{#>03F!~G|2$!bJBw31~8n6uF^8Pw;O*r zWc8%yEK3Muq~YIE3dzZzivD|tGgnh}^^KQ^FO{B8dg!oZ8m6~>bwKO{Viz4N)?}Rc z7a=(jG{6wNw|Y4*mx}>^wR-1M9-g-l&u9D{O|Rc8HuF~IZ+nw-5GZm;FgaepHy@S_ zyQQt)2e+!Ju6kM7*AiS;;$M#!C?hACc69RyQ&xUpFPrBy7LQl|cqZA>b>GE{;0d)z zidl^8S$xSR=77z5JY1f>UMN!a^3-W|SO34IT^#c1EI)SUPLTQ~)t$6|a|(3TK8ljJ z4rP~qCu6EzYn5)q!?0tMN3ggf1WpGJNVEmkK9zcY_g$!*j6sYxa)q)G9-Sn39w!Xz zqBvVXA4?U()e(?tvL=}L$IXKDY7q zeOza{vnIxHUwkf9<;%1$jdp9QML?~cR;RmEblarY<0#Mgji9W{r@vOdzMxlrOBE8DXE4{r>oCGAA+xX)x|n1K7j&f4cC4i6aDrk~Scle_=d=YLmB@V4k+MwM!P zCUbCeZmly+yFeGMEKkbr^?zOA@V@Ptj;1~ATq;*eU`4HVfB?eQaemEOoiF(;g(D}M zm5GsxG;8v|4S8VFasbk7PATer1HCrL=6Za#ZxKu1MHbz=R-Lm}Rsr-V2UP{Q=L+1S zy>&v^0x{iBT2FvHt}>wcn5FubuRl4~af)R$8upB>dE!6#4pcLviT&WQa1dQ+&)9=* z%K~|>s~Gfn4k=6iPBcv4t}?BX9}dE@f+(zU8iBM{9nNvSFGG!^0}RWViNP51Vz+tr z@Wiw{6)5!G-@W4YM^OhR=s~gRKZ}9>s}T#l) phys_comms; + std::unordered_map sequence_num_map; + SemaphoreHandle_t sequence_num_map_mutex; + esp_err_t get_inc_sequence_num(uint8_t board_id, uint16_t* seq_num); + esp_err_t get_sequence_num(uint8_t board_id, uint16_t* seq_num); volatile bool stop_tasks = false; //used by the tasks to know when to stop (set true when DataLinkManager is destroyed) TaskHandle_t rip_broadcast_task = NULL; @@ -76,6 +86,7 @@ class DataLinkManager{ esp_err_t create_generic_frame(uint8_t* data, uint16_t data_len, GenericFrame generic_frame, uint16_t offset, uint8_t* send_data, size_t* send_data_len); //==== RIP related functions ==== + void init_rip(); esp_err_t rip_find_entry(uint8_t board_id, RIPRow** entry, bool reserve_row); esp_err_t rip_update_entry(uint8_t new_hop, uint8_t channel, RIPRow** entry); @@ -108,59 +119,38 @@ class DataLinkManager{ void init_scheduler(); esp_err_t push_frame_to_scheduler(SchedulerMetadata frame, uint8_t channel); TaskHandle_t scheduler_task = NULL; - /** - * @brief Schedules which frame to send - * - * Scheduler: - * - All frames will be pushed to the back onto a queue - * - When a generic frame sends a chunk, it will be pushed back to the queue for the next chunk to be sent - * - * Scheduling may change (above scheduler will lead to starvation of control frames depending on the number of generic frames/fragments to send) - */ + [[noreturn]] static void frame_scheduler(void* args); - /** - * @brief Scheduler sending the actual frame at the top of the heap on a channel - * - * @return esp_err_t - */ + esp_err_t scheduler_send(uint8_t channel); + esp_err_t scheduler_send_rmt(uint8_t channel, SchedulerMetadata frame, uint8_t* send_data, size_t frame_size, bool wait_for_tx_done); + //Generic Frame Receive Fragments - /** - * @brief Store a fragment that has been received - * - * @param fragment - * @param channel - * @return esp_err_t - */ esp_err_t store_fragment(GenericFrame* fragment, uint8_t channel); /** * @brief Stores generic frame fragments * * Mapping: - * Board ID -> Sequence number -> Array of Generic Frame Fragments, with size of the number of expected fragments + * Board ID (of the receiver) -> Sequence number -> Array of Generic Frame Fragments, with size of the number of expected fragments * * TODO: - * - When receiving a fragment, insert it into the map - * - When all fragments have been received in a sequence, remove the entire entry (sequence) from the map, and push final data for async receive * - Sliding window + ACKs * */ - std::unordered_map> fragment_map; + std::unordered_map> fragment_map[MAX_CHANNELS]; esp_err_t complete_fragment(uint16_t board_id, uint16_t sequence_num, uint8_t channel); SemaphoreHandle_t async_rx_queue_mutex[MAX_CHANNELS]; + SemaphoreHandle_t rx_fragment_mutex[MAX_CHANNELS]; //Async receive /** * @brief Queue to store complete received frame data * - * TODO: - * - Replace the public `receive()` with the `async_receive()`. - * */ std::queue async_receive_queue[MAX_CHANNELS]; @@ -185,6 +175,33 @@ class DataLinkManager{ TaskHandle_t receive_task = NULL; + /** + * @brief Generic Frame Sliding Window + * + * Mapping: + * Board Id (of the receiver) -> Sequence Number -> FrameAckRecord + * + */ + std::unordered_map> sliding_window[MAX_CHANNELS]; + + SemaphoreHandle_t sliding_window_mutex[MAX_CHANNELS]; + + esp_err_t inc_head_sliding_window(uint8_t channel, uint8_t board_id, uint16_t seq_num, FrameAckRecord* ack_record); + + esp_err_t get_record_sliding_window(uint8_t channel, uint8_t board_id, uint16_t seq_num, FrameAckRecord* ack_record); + + esp_err_t complete_record_sliding_window(uint8_t channel, uint8_t board_id, uint16_t seq_num); + + /** + * @brief Thread for sending acks - Send ACKs on a separate thread to not hold up the receive thread (missing other frames) + * + * @param args + */ + [[noreturn]] static void send_ack_thread_main(void* args); + TaskHandle_t send_ack_task = NULL; + + SemaphoreHandle_t send_ack_queue_mutex[MAX_CHANNELS]; + std::queue send_ack_queue[MAX_CHANNELS]; }; #endif //DATA_LINK diff --git a/components/dataLink/include/Frames.h b/components/dataLink/include/Frames.h index 422aec2..d39e0b5 100644 --- a/components/dataLink/include/Frames.h +++ b/components/dataLink/include/Frames.h @@ -10,9 +10,9 @@ #define START_OF_FRAME 0xAB //0b1010_1011 - denotes the start of frame -#define MAX_CONTROL_DATA_LEN (1 << 8) // Max 256B +#define MAX_FRAME_SIZE 121 //Max 121B (due to rmt) - note this includes the overhead of the frame. the actual payload max depends on the frame type (eg. 121 - 9 B is the max control data length) -#define MAX_GENERIC_NUM_FRAG (1 << 16) // Max 2**16 Fragments can be made with a generic frame (total 2**16 *MAX_CONTROL_DATA_LEN B of data can be sent ~ 16 MiB) +#define MAX_GENERIC_NUM_FRAG (1 << 16) // Max 2**16 Fragments can be made with a generic frame (total 2**16 *MAX_GENERIC_DATA_LEN B of data can be sent ~ 6.7 MiB) #define MAX_FRAME_QUEUE_SIZE 15 //Size of the queue for the frame scheduler (per channel) @@ -30,17 +30,33 @@ #define CONTROL_FRAME_OVERHEAD 9 #define GENERIC_FRAME_OVERHEAD 14 +#define MAX_GENERIC_DATA_LEN (MAX_FRAME_SIZE - GENERIC_FRAME_OVERHEAD) +#define MAX_CONTROL_DATA_LEN (MAX_FRAME_SIZE - CONTROL_FRAME_OVERHEAD) + +//Generic Frame Fragment ACK +#define GENERIC_FRAG_ACK_DATA_SIZE 7 +#define GENERIC_FRAG_ACK_PREAMBLE 0x69 + #define CONTROL_FRAME_TYPE 0x80 //if the frame type MSB is set to 1, use the control frame //Types (total 2^4 = 16 different types) enum class FrameType : uint8_t { + //Control Frames MOTOR_TYPE = 0x80, //0b1000_0000 - SERVO_TYPE = 0xC0, //0b1100_0000 - DISTANCE_SENSOR_TYPE = 0xE0, //0b1110_0000 - DEBUG_CONTROL_TYPE = 0xC0, //0b1100_0000 - DEBUG_GENERIC_TYPE = 0x00, //0b0000_0000 - SYSTEM_TYPE = 0x30, //0x0011_0000 - used for statuses, discovery, and other maintainence requests RIP_TABLE_CONTROL = 0x90, //0b1001_0000 - using the control frame to broadcast the RIP table - RIP_TABLE_GENERIC = 0x10 //0b0001_000 - using the generic frame to broadcast the RIP table + DISTANCE_SENSOR_TYPE = 0xA0, //0b1010_0000 + SERVO_TYPE = 0xC0, //0b1100_0000 + MISC_CONTROL_TYPE = 0xD0, //0b1101_0000 + + //Generic Frames + MISC_GENERIC_TYPE = 0x00, //0b0000_0000 + MISC_UDP_GENERIC_TYPE = 0x10, // 0b0001_0000 - Same as MISC_GENERIC_TYPE except no ACK frames will be expected + SYSTEM_TYPE = 0x30, //0b0011_0000 - used for statuses, discovery, and other maintainence requests + ACK_TYPE = 0x60, //0b0110_0000 - ACK frames for Generic Fragments + RIP_TABLE_GENERIC = 0x70 //0b0111_0000 - using the generic frame to broadcast the RIP table (not used rn) +}; + +enum class FrameFlags : uint8_t { + ANY_FLAG = 0x0, }; #pragma pack(push, 1) //these structs will be transmitted as is (ensure the structs are structured using 1B alignment - no padding) @@ -51,7 +67,7 @@ typedef struct _control_frame{ uint16_t seq_num; //sequence number to differentiate frames being sent from sender to receiver uint8_t type_flag; //(type << 4) | flag - both are 4 bits uint16_t data_len; //Data Length (max 256B) - uint8_t data[MAX_CONTROL_DATA_LEN]; //Variable Length of Data + uint8_t data[MAX_FRAME_SIZE]; //Variable Length of Data uint16_t crc_16; //CRC-16 } ControlFrame; //this will have a max size of 9 + 256B = 265B @@ -64,7 +80,7 @@ typedef struct _data_link_frame{ uint16_t total_frag; //total number of fragments for this sequence uint16_t frag_num; //current fragment number uint16_t data_len; //Data Length (max 178B) - uint8_t data[MAX_CONTROL_DATA_LEN]; //Variable Length of Data + uint8_t data[MAX_FRAME_SIZE]; //Variable Length of Data uint16_t crc_16; //CRC-16 } GenericFrame; //this will have a max size of 14 + 2^8 B = 270 B #pragma pack(pop) diff --git a/components/dataLink/include/Scheduler.h b/components/dataLink/include/Scheduler.h index a05059a..756e6e7 100644 --- a/components/dataLink/include/Scheduler.h +++ b/components/dataLink/include/Scheduler.h @@ -3,23 +3,43 @@ #include "esp_timer.h" #include -//TODO: need to make a private send() to accept a Frame type. -//the public send() is fine to keep but needs to be modified to simply create the Frame type based on the flags, data size, and args, and then push to the priority queue based on routing -//TODO: receive also needs to be updated, when receiving a frame not destined for that board; need to route that frame towards the actual destination (requires pushing that frame onto the priority queue) -//TODO: generic frames receive needs to be created (handle fragmenting, resend on corruption). ethe resend on corruption will be a lot of work as it requires ACK frames to be send and currently there is 0 support for ACK since we don't save any recently sent frames (can't resend) - #define SCHEDULER_MUTEX_WAIT 10 //max time duration to wait -#define SCHEDULER_PERIOD_MS 25 +#define SCHEDULER_PERIOD_MS 140 +#define RECEIVE_TASK_PERIOD_MS 2 + +#define GENERIC_FRAME_SLIDING_WINDOW_SIZE 5 //defines the maximum size of the sliding window before resending previously un-ack'd fragments +#define SLIDING_WINDOW_MUTEX_TIMEOUT_MS 5 +#define GENERIC_FRAME_MOD_TIMEOUT 10 //be scheduled at most 9 + GENERIC_FRAME_MIN_TIMEOUT times before sending another fragment +#define GENERIC_FRAME_MIN_TIMEOUT 10 + +#define SEND_ACK_PERIOD_MS 50 +#define SEND_ACK_MUTEX_WAIT 10 //Metadata representing the frame to be sent but is currently scheduled typedef struct _frame_scheduler_metadata { FrameHeader header; //header of the frame - uint16_t generic_frame_data_offset; //For data greater than MAX_CONTROL_DATA_LEN to keep track of fragment positions + uint16_t generic_frame_data_offset; //For data greater than MAX_GENERIC_DATA_LEN to keep track of fragment positions int64_t enqueue_time_ns; //when the frame has been first enqueued into the priority queue uint8_t* data; //dyanmically allocated memory - contains the actual data uint16_t len; // length of the actual data + + //sliding window + uint16_t last_ack; //fragment number represnting the last ack'd fragment (from rx) - head + uint16_t curr_fragment; //fragment number of the current fragment being sent + uint32_t timeout; } SchedulerMetadata; +typedef struct _frame_ack_record { + uint16_t last_ack; //last ack'd fragment recevied from the rx + uint16_t total_frags; //total number of fragments associated with the sequence number + uint16_t seq_num; //sequence number this ack corresponds to +} FrameAckRecord; + +typedef struct _send_ack_metadata{ + uint8_t data[GENERIC_FRAG_ACK_DATA_SIZE]; + uint8_t sender_id; +} SendAckMetaData; + typedef struct _frame_compare { /** * @brief Uses aging based priority scheduling (linearly increasing priority with time) diff --git a/components/dataLink/include/Tables.h b/components/dataLink/include/Tables.h index 1b31884..8545af1 100644 --- a/components/dataLink/include/Tables.h +++ b/components/dataLink/include/Tables.h @@ -11,7 +11,7 @@ // #define RIP_BROADCAST_INTERVAL 3000 //temp broadcast every 3 seconds (3000ms) #define RIP_TTL_START 180 //seconds #define RIP_MS_TO_SEC 1000 //1000 ms to 1 sec -#define RIP_MAX_SEM_WAIT 30 +#define RIP_MAX_SEM_WAIT_MS 30 #define RIP_FLUSH_COUNT 8 //flush after 8*30 seconds = 240 seconds #define RIP_DISCOVERY_MESSAGE_SIZE 1 diff --git a/components/rmt/README.md b/components/rmt/README.md index 7c1ac4d..134e0db 100644 --- a/components/rmt/README.md +++ b/components/rmt/README.md @@ -2,6 +2,8 @@ WIP +The RMT component uses the ESP32 RMT library/API to perform the physical layer part of the network stack. This component simply encodes/decodes an array of characters (specifically `uint8_t`) and either transmits them via the corresponding GPIO pin (transmitting) or up to the caller (receiving). + The related ESP32-S3 latest documentation on RMT can be found [here](https://docs.espressif.com/projects/esp-idf/en/stable/esp32s3/api-reference/peripherals/rmt.html). # About @@ -10,20 +12,37 @@ This component is a wrapper around the ESP32-S3 RMT API and allows the operation ## Encoding Method -RMT uses the Ethernet Manchester encoding method, where a bit 1 is encoded as a falling edge transition and a bit 0 is encoded as a rising edge transition. +RMT uses the Ethernet Manchester encoding (Ethernet Standard) method, where a bit 1 is encoded as a falling edge transition and a bit 0 is encoded as a rising edge transition. Specific timings are defined in `RMTSymbols.h`, which includes bit timings, resolution HZ, and symbol definitions. +Note that using a high resolution frequency correlates with a higher rate of CRC corruption on the receiver board. + +### Mathematical Defintions Used + +Basis functions: $\phi_1(t) = \sqrt{\frac{2}{T_s}}\operatorname{rect}\left(\frac{t-3T_s/4}{T_s/2}\right)$ representing a bit 0 and $\phi_2(t) = \sqrt{\frac{2}{T_s}}\operatorname{rect}\left(\frac{t-T_s/4}{T_s/2}\right)$ representing a bit 1, using $T_s$ and the symbol/bit duration. The encoded symbols are $\vec{s_1} = \left[A, 0\right]$ and $\vec{s_2} = \left[0, A\right]$, where $A$ is some voltage. + +This leads to a bit error probability of: + $P_e(\vec{s_1}) = P_e(\vec{s_2}) \leq Q\left(\sqrt{\frac{E_{s}}{N_0}}\right)$, where $P_e(\vec{s_i}) \leq \sum_{i=1, i\neq k}^2Q\left(\frac{\lvert\lvert\vec{s_i}-\vec{s_k}\rvert\rvert}{\sqrt{2N_0}}\right)$ and $Q(\cdot)$ is the CDF of the standard Gaussian distribution. + +A visual representation of the above: + +![GRAPHS!!!!](images/manchester_math.png) + ## Usage This component is not meant to be used directly by the user (should only be exclusively be used by the Link Layer, found in `components/dataLink`). -For specific details, see `dataLink/DataLinkManager.cpp`. +For specific details, see [`dataLink/DataLinkManager.cpp`](https://git.uwaterloo.ca/capstone-group2/firmware/-/blob/main/components/dataLink/DataLinkManager.cpp?ref_type=heads). ## Channel Configurations RMT relies on the ESP32-S3's GPIO pins. This RMT component statically sets a predefined GPIO pin to either a TX or RX for a channel. +On the ESP32-S3, the pins are assigned as follows: + +![rmt_pinouts](images/rmt_pin_layouts.png) + For TX/RX pin definitions, see `RMTManager.h`. For example, `tx_gpio[]` is a `4` length array. Each index in the array represents one half of a pair that represents the TX/RX channel on the physical layer. ## RMT Internal Async Jobs diff --git a/components/rmt/RMTManager.cpp b/components/rmt/RMTManager.cpp index 3129013..a801ed7 100644 --- a/components/rmt/RMTManager.cpp +++ b/components/rmt/RMTManager.cpp @@ -384,7 +384,7 @@ esp_err_t RMTManager::send(uint8_t* data, size_t size, rmt_transmit_config_t* co } if (data == nullptr || size == 0 || size > (RMT_SYMBOL_BLOCK_SIZE*4)) { // printf("send() error: data pointer NULL or size 0\n"); - ESP_LOGE(DEBUG_TAG, "send() error: data pointer NULL or size 0"); + ESP_LOGE(DEBUG_TAG, "send() error: data pointer NULL or size 0. size: %d", size); return ESP_FAIL; } if (config == nullptr) { diff --git a/components/rmt/images/manchester_math.png b/components/rmt/images/manchester_math.png new file mode 100644 index 0000000000000000000000000000000000000000..07d1c8127a0810610006d74baafb3c090604a8a7 GIT binary patch literal 65637 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�$!msf9M!& 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
1{-2>2kOP(Wy;( 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 // #include @@ -19,3 +20,4 @@ extern "C" [[noreturn]] void app_main(void) { "metadata_tx", 3096, loop_manager.get(), 3, nullptr); loop_manager->control_loop(); } +#endif \ No newline at end of file diff --git a/main/main_rmt_test.cpp b/main/main_rmt_test.cpp index bbee486..7bc05da 100644 --- a/main/main_rmt_test.cpp +++ b/main/main_rmt_test.cpp @@ -1,292 +1,313 @@ -// //Used for link layer testing (change name to main.cpp to use) -// #include -// #include +#if defined(RMT_TEST) && RMT_TEST == 1 +//Used for link layer testing (change name to main.cpp to use) +#include +#include -// #include "sdkconfig.h" -// #include "freertos/FreeRTOS.h" -// #include "freertos/task.h" -// #include "esp_flash.h" -// #include "nvs_flash.h" +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_flash.h" +#include "nvs_flash.h" -// #include "RMTManager.h" -// #include "DataLinkManager.h" +#include "RMTManager.h" +#include "DataLinkManager.h" -// #include -// #include -// #include -// #include "driver/gptimer.h" -// #include "esp_log.h" +#include +#include +#include +#include "driver/gptimer.h" +#include "esp_log.h" -// #define DATA_SIZE_TEST 270 -// //current board id -// #define BOARD_ID 69 -// //board id to send to -// #define RECEIVER_BOARD_ID 1 +#define DATA_SIZE_TEST 600 -// struct TaskArgs{ -// DataLinkManager* link_layer_obj; -// uint8_t task_id; -// uint8_t receiver_id; -// QueueHandle_t receive_queue; -// }; +//current board id +#ifdef SRC_BOARD +#define BOARD_ID SRC_BOARD +#else +#define BOARD_ID 1 +#endif -// struct ReceviedFrame{ -// uint8_t buf[MAX_CONTROL_DATA_LEN + CONTROL_FRAME_OVERHEAD]; //max 41B -// size_t len; -// FrameHeader header; -// }; +//board id to send to +#ifdef RECEIVER_BOARD +#define RECEIVER_BOARD_ID RECEIVER_BOARD +#else +#define RECEIVER_BOARD_ID 69 +#endif -// void receive_frames(void* arg){ -// TaskArgs* args = (TaskArgs*)arg; +struct TaskArgs{ + DataLinkManager* link_layer_obj; + uint8_t task_id; + uint8_t receiver_id; + QueueHandle_t receive_queue; +}; + +struct ReceviedFrame{ + uint8_t buf[DATA_SIZE_TEST + GENERIC_FRAME_OVERHEAD]; + size_t len; + FrameHeader header; +}; + +void receive_frames(void* arg){ + TaskArgs* args = (TaskArgs*)arg; -// DataLinkManager* obj = args->link_layer_obj; + DataLinkManager* obj = args->link_layer_obj; -// if (obj == nullptr){ -// ESP_LOGE("thread", "bad pointer\n"); -// vTaskDelete(NULL); //should never get here -// } + if (obj == nullptr){ + ESP_LOGE("thread", "bad pointer\n"); + vTaskDelete(NULL); //should never get here + } -// QueueHandle_t shared_queue = (QueueHandle_t)args->receive_queue; + QueueHandle_t shared_queue = (QueueHandle_t)args->receive_queue; -// uint8_t curr_channel = args-> task_id; + uint8_t curr_channel = args-> task_id; -// printf("RX JOB for task %d starting...\n", curr_channel); -// esp_err_t res; + printf("RX JOB for task %d starting...\n", curr_channel); + esp_err_t res; -// uint8_t recv_buf[DATA_SIZE_TEST]; -// memset(recv_buf, 0, DATA_SIZE_TEST); + uint8_t recv_buf[DATA_SIZE_TEST]; + memset(recv_buf, 0, DATA_SIZE_TEST); -// ReceviedFrame recv_frame = {}; + ReceviedFrame recv_frame = {}; -// FrameHeader header = {}; + FrameHeader header = {}; -// while(true){ -// res = obj->async_receive(recv_buf, sizeof(recv_buf), &header, curr_channel); -// vTaskDelay(pdMS_TO_TICKS(10)); -// if (res != ESP_OK){ -// // ESP_LOGE("thread", "Failed to receive message on thread %d", curr_channel); -// if (res != ESP_ERR_NOT_FOUND) { -// recv_frame.len = 0; -// if (xQueueSendToBack(shared_queue, (void*)&recv_frame, (TickType_t) 10) != pdPASS){ -// ESP_LOGE("RX Job", "Failed to push received frame onto shared queue for channel %d", curr_channel); -// } -// } -// continue; -// } else { -// // printf("Successfully receive message\n"); -// } + while(true){ + res = obj->async_receive(recv_buf, sizeof(recv_buf), &header, curr_channel); + vTaskDelay(pdMS_TO_TICKS(10)); + if (res != ESP_OK){ + // ESP_LOGE("thread", "Failed to receive message on thread %d", curr_channel); + if (res != ESP_ERR_NOT_FOUND) { + recv_frame.len = 0; + if (xQueueSendToBack(shared_queue, (void*)&recv_frame, (TickType_t) 10) != pdPASS){ + ESP_LOGE("RX Job", "Failed to push received frame onto shared queue for channel %d", curr_channel); + } + } + continue; + } else { + // printf("Successfully receive message\n"); + } -// if (header.data_len == 0){ -// continue; -// } + if (header.data_len == 0){ + continue; + } -// recv_frame.len = header.data_len; -// memcpy((void*)recv_frame.buf, (void*)recv_buf, header.data_len); -// recv_frame.header = header; + recv_frame.len = header.data_len; + memcpy((void*)recv_frame.buf, (void*)recv_buf, header.data_len); + recv_frame.header = header; -// if (xQueueSendToBack(shared_queue, (void*)&recv_frame, (TickType_t) 10) != pdPASS){ -// ESP_LOGE("RX Job", "Failed to push received frame onto shared queue for channel %d", curr_channel); -// } + if (xQueueSendToBack(shared_queue, (void*)&recv_frame, (TickType_t) 10) != pdPASS){ + ESP_LOGE("RX Job", "Failed to push received frame onto shared queue for channel %d", curr_channel); + } -// } + } -// } +} -// void multi_transceiver(void* arg) { -// TaskArgs* args = (TaskArgs*)arg; +void multi_transceiver(void* arg) { + TaskArgs* args = (TaskArgs*)arg; -// DataLinkManager* obj = args->link_layer_obj; + DataLinkManager* obj = args->link_layer_obj; -// if (obj == nullptr){ -// ESP_LOGE("thread", "bad pointer\n"); -// vTaskDelete(NULL); //should never get here -// } + if (obj == nullptr){ + ESP_LOGE("thread", "bad pointer\n"); + vTaskDelete(NULL); //should never get here + } -// xTaskCreate(receive_frames, "receive_frame_job", 4096, arg, 5, NULL); + xTaskCreate(receive_frames, "receive_frame_job", 4096, arg, 5, NULL); -// uint8_t dest_board_id = args->receiver_id; //using a dummy number for now - there is no board with id 2 right now + uint8_t dest_board_id = args->receiver_id; //using a dummy number for now - there is no board with id 2 right now -// const char* message = "this is some other data that should not be corrupted."; + const char* message = "this is some other data that should not be corrupted."; + const char* generic_frame_additional_message = "This is some other extra data that can be sent that also shouldn't be corrupted while transmitting."; + const char* generic_frame_second_additional_message = "At this point we have reached 241 bytes. This is some other data that we can send using generic frames but this will be fragmented. however, this data shouldn't be corrupted and be sent as if it was sent all at once. total message size right here is 469 bytes:)"; -// uint8_t curr_channel = args->task_id; -// QueueHandle_t shared_queue = (QueueHandle_t)args->receive_queue; + uint8_t curr_channel = args->task_id; + QueueHandle_t shared_queue = (QueueHandle_t)args->receive_queue; -// uint8_t send_buf[DATA_SIZE_TEST]; -// uint8_t recv_buf[DATA_SIZE_TEST]; -// memset(recv_buf, 0, DATA_SIZE_TEST); -// memset(send_buf, 0, DATA_SIZE_TEST); + uint8_t send_buf[DATA_SIZE_TEST]; + uint8_t recv_buf[DATA_SIZE_TEST]; + memset(recv_buf, 0, DATA_SIZE_TEST); + memset(send_buf, 0, DATA_SIZE_TEST); -// size_t recv_len = 0; -// uint8_t iteration = 0; -// esp_err_t res = ESP_OK; + size_t recv_len = 0; + uint8_t iteration = 0; + esp_err_t res = ESP_OK; -// gptimer_handle_t gptimer = NULL; -// gptimer_config_t timer_config = { -// .clk_src = GPTIMER_CLK_SRC_DEFAULT, -// .direction = GPTIMER_COUNT_UP, -// .resolution_hz = 1 * 1000 * 1000, // 1MHz, 1 tick = 1us -// }; -// ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer)); -// ESP_ERROR_CHECK(gptimer_enable(gptimer)); -// ESP_ERROR_CHECK(gptimer_start(gptimer)); -// uint64_t start_count = 0, end_count = 0; + gptimer_handle_t gptimer = NULL; + gptimer_config_t timer_config = { + .clk_src = GPTIMER_CLK_SRC_DEFAULT, + .direction = GPTIMER_COUNT_UP, + .resolution_hz = 1 * 1000 * 1000, // 1MHz, 1 tick = 1us + }; + ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer)); + ESP_ERROR_CHECK(gptimer_enable(gptimer)); + ESP_ERROR_CHECK(gptimer_start(gptimer)); + uint64_t start_count = 0, end_count = 0; -// uint32_t num_incorrect = 0; -// uint32_t total_transactions = 0; + uint32_t num_incorrect = 0; + uint32_t total_transactions = 0; -// RIPRow_public_matrix matrix[RIP_MAX_ROUTES]; -// size_t matrix_size = RIP_MAX_ROUTES; + RIPRow_public_matrix matrix[RIP_MAX_ROUTES]; + size_t matrix_size = RIP_MAX_ROUTES; -// for (int i = 0; i < RIP_MAX_ROUTES; i++){ -// RIPRow_public* table = (RIPRow_public*)pvPortMalloc(sizeof(RIPRow_public)*RIP_MAX_ROUTES); -// matrix[i] = { -// .table = table, -// .size = RIP_MAX_ROUTES -// }; -// } + for (int i = 0; i < RIP_MAX_ROUTES; i++){ + RIPRow_public* table = (RIPRow_public*)pvPortMalloc(sizeof(RIPRow_public)*RIP_MAX_ROUTES); + matrix[i] = { + .table = table, + .size = RIP_MAX_ROUTES + }; + } -// ReceviedFrame recv_frame = {}; -// printf("task %d starting...\n", curr_channel); -// vTaskDelay(3000 / portTICK_PERIOD_MS); + ReceviedFrame recv_frame = {}; + printf("task %d starting...\n", curr_channel); + vTaskDelay(3000 / portTICK_PERIOD_MS); -// bool receive_only = false; + bool receive_only = false; + #if defined(RECEIVE_ONLY) && RECEIVE_ONLY + receive_only = true; + #else + receive_only = false; + #endif -// while(1){ -// if(!receive_only){ -// vTaskDelay(1000 / portTICK_PERIOD_MS); // wait 1 second before trying to send again + while(1){ + if(!receive_only){ + printf("waiting for 3 seconds...\n"); + vTaskDelay(pdMS_TO_TICKS(3000)); // wait 3 second before trying to send again -// snprintf(reinterpret_cast(send_buf), sizeof(send_buf), "This is a message from board %d sending on channel %d. %s", BOARD_ID, curr_channel, message); + snprintf(reinterpret_cast(send_buf), sizeof(send_buf), "This is a message from board %d sending on channel %d. %s %s %s", BOARD_ID, curr_channel, message, generic_frame_additional_message, generic_frame_second_additional_message); + // snprintf(reinterpret_cast(send_buf), sizeof(send_buf), "This is a message from board %d sending on channel %d. %s %s", BOARD_ID, curr_channel, message, generic_frame_additional_message); + // snprintf(reinterpret_cast(send_buf), sizeof(send_buf), "This is a message from board %d sending on channel %d. %s", BOARD_ID, curr_channel, message); -// ESP_ERROR_CHECK(gptimer_get_raw_count(gptimer, &start_count)); -// res = obj->send(dest_board_id, send_buf, strlen(reinterpret_cast(send_buf)), FrameType::DEBUG_CONTROL_TYPE, 0x0); -// ESP_ERROR_CHECK(gptimer_get_raw_count(gptimer, &end_count)); + ESP_ERROR_CHECK(gptimer_get_raw_count(gptimer, &start_count)); + res = obj->send(dest_board_id, send_buf, strlen(reinterpret_cast(send_buf)), FrameType::MISC_GENERIC_TYPE, 0x0); + ESP_ERROR_CHECK(gptimer_get_raw_count(gptimer, &end_count)); -// // snprintf(reinterpret_cast(send_buf), sizeof(send_buf), "%s RANDOM", mej.kssage); //modifying the data while it transmits shouldn't affect the actual transmission here + // snprintf(reinterpret_cast(send_buf), sizeof(send_buf), "%s RANDOM", mej.kssage); //modifying the data while it transmits shouldn't affect the actual transmission here -// if (res != ESP_OK){ -// ESP_LOGE("thread", "Failed to send message on thread %d. Error: 0x%x", curr_channel, res); -// continue; -// } else { -// // printf("Successfully sent message %s\n", send_buf); -// printf("Sent %zu B sized in %" PRIu64 " us from channel %d\n", strlen(reinterpret_cast(send_buf)) + CONTROL_FRAME_OVERHEAD, end_count-start_count, curr_channel); -// } -// } + if (res != ESP_OK){ + ESP_LOGE("thread", "Failed to send message on thread %d. Error: 0x%x", curr_channel, res); + continue; + } else { + // printf("Successfully sent message %s\n", send_buf); + printf("Sent %zu B sized in %" PRIu64 " us from channel %d\n", strlen(reinterpret_cast(send_buf)) + CONTROL_FRAME_OVERHEAD, end_count-start_count, curr_channel); + } + } -// //wait on a queue for a few ms (if there's nothing, just send another frame. otherwise pop from queue and read it) -// if (xQueueReceive(shared_queue, (void*)&recv_frame, (TickType_t) 50) != pdPASS){ -// memset(send_buf, 0, 256); -// continue; //nothing or failed to pop from queue -// } - -// total_transactions++; -// if (recv_frame.len == 0){ -// //receive fail -// num_incorrect++; -// } else { -// // res = obj->print_frame_info(recv_frame.buf, recv_frame.len, recv_buf, DATA_SIZE_TEST); + //wait on a queue for a few ms (if there's nothing, just send another frame. otherwise pop from queue and read it) + printf("waiting for rx\n"); + if (xQueueReceive(shared_queue, (void*)&recv_frame, pdMS_TO_TICKS(36000)) != pdPASS){ + memset(send_buf, 0, DATA_SIZE_TEST); + printf("didn't receive anything in time\n"); + continue; //nothing or failed to pop from queue + } + + total_transactions++; + if (recv_frame.len == 0){ + //receive fail + num_incorrect++; + } else { + // res = obj->print_frame_info(recv_frame.buf, recv_frame.len, recv_buf, DATA_SIZE_TEST); -// if (res != ESP_OK){ -// num_incorrect++; -// // printf("Received %ld bad frames on tx/rx round %ld for thread %d\n", num_incorrect, total_transactions, curr_channel); -// } else { -// // printf("Header information:\n"); -// // printf("Preamble\tTX ID\tRX ID\tSeq Num\tType/Flag\tFrag Info\tData Len\tCRC\n"); -// // printf("%X\t%d\t%d\t%d\t%X\t%ld\t%d\t%d\n",recv_frame.header.preamble, recv_frame.header.sender_id, recv_frame.header.receiver_id, recv_frame.header.seq_num, -// // recv_frame.header.type_flag, recv_frame.header.frag_info, recv_frame.header.data_len, recv_frame.header.crc_16); -// // printf("Received message '%.*s' on channel %d\n", recv_frame.len, recv_frame.buf, curr_channel); -// } -// } + if (res != ESP_OK){ + num_incorrect++; + // printf("Received %ld bad frames on tx/rx round %ld for thread %d\n", num_incorrect, total_transactions, curr_channel); + } else { + // printf("Header information:\n"); + // printf("Preamble\tTX ID\tRX ID\tSeq Num\tFrag Info\tType/Flag\tData Len\tCRC\n"); + // printf("0x%02X\t\t%-12d %-13d\t%-15d\t0x%02lX\t%d\t%-10d\t0x%04X\n",recv_frame.header.preamble, recv_frame.header.sender_id, recv_frame.header.receiver_id, recv_frame.header.seq_num, + // recv_frame.header.frag_info, recv_frame.header.type_flag, recv_frame.header.data_len, recv_frame.header.crc_16); + printf("Received message '%.*s' on channel %d from board %d seq num %d\n", recv_frame.len, recv_frame.buf, curr_channel, recv_frame.header.sender_id, recv_frame.header.seq_num); + } + } -// printf("Total received packets: %ld\tTotal packets corrupted: %ld\n", total_transactions, num_incorrect); + // printf("Total received packets: %ld\tTotal packets corrupted: %ld\n", total_transactions, num_incorrect); -// // vTaskDelay(1000 / portTICK_PERIOD_MS); // wait 1 second before trying to send again -// //reset temp buffers -// memset(recv_buf, 0, DATA_SIZE_TEST); -// memset(send_buf, 0, DATA_SIZE_TEST); + // vTaskDelay(1000 / portTICK_PERIOD_MS); // wait 1 second before trying to send again + //reset temp buffers + memset(recv_buf, 0, DATA_SIZE_TEST); + memset(send_buf, 0, DATA_SIZE_TEST); -// } + } -// while(true){ -// vTaskDelay(2000 / portTICK_PERIOD_MS); -// } + while(true){ + vTaskDelay(2000 / portTICK_PERIOD_MS); + } -// } +} -// void print_binary(unsigned char c) { -// for (int i = 7; i >= 0; i--) { -// printf("%d", (c >> i) & 1); -// } -// } +void print_binary(unsigned char c) { + for (int i = 7; i >= 0; i--) { + printf("%d", (c >> i) & 1); + } +} -// void print_string_binary(const char *str) { -// while (*str) { -// print_binary((unsigned char)*str); -// printf(" "); // space between bytes for readability -// str++; -// } -// printf("\n"); -// } +void print_string_binary(const char *str) { + while (*str) { + print_binary((unsigned char)*str); + printf(" "); // space between bytes for readability + str++; + } + printf("\n"); +} -// extern "C" [[noreturn]] void app_main(void) { -// esp_err_t ret = nvs_flash_init(); -// if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { -// ESP_ERROR_CHECK(nvs_flash_erase()); -// ret = nvs_flash_init(); -// } -// ESP_ERROR_CHECK(ret); +extern "C" [[noreturn]] void app_main(void) { + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); -// esp_netif_init(); -// esp_event_loop_create_default(); + esp_netif_init(); + esp_event_loop_create_default(); -// printf("finished esp init\n"); + printf("finished esp init\n"); -// printf("Hello world!\n"); + printf("Hello world!\n"); -// // uint8_t iteration = 0; -// // const char* message = "THIS IS A TEXT MESSAGE"; -// uint8_t num_channels = 4; -// std::unique_ptr obj = std::make_unique(BOARD_ID, num_channels); + // uint8_t iteration = 0; + // const char* message = "THIS IS A TEXT MESSAGE"; + uint8_t num_channels = 4; + std::unique_ptr obj = std::make_unique(BOARD_ID, num_channels); + + if (obj->ready() != ESP_OK){ + for (int i = 5; i >= 0; i--) { + printf("Restarting in %d seconds...\n", i); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + printf("Restarting now.\n"); + fflush(stdout); + esp_restart(); + } -// // uint8_t dest_board_id = 2; //using a dummy number for now - there is no board with id 2 right now + // uint8_t dest_board_id = 2; //using a dummy number for now - there is no board with id 2 right now -// // esp_err_t res; + // esp_err_t res; -// // uint8_t send_buf[256]; -// // uint8_t recv_buf[256]; -// // size_t recv_len = 0; + // uint8_t send_buf[256]; + // uint8_t recv_buf[256]; + // size_t recv_len = 0; -// // uint8_t curr_channel = 0; + // uint8_t curr_channel = 0; -// DataLinkManager* obj_to_send = obj.release(); + DataLinkManager* obj_to_send = obj.release(); -// TaskArgs args[4] = {}; + TaskArgs args[4] = {}; -// for (uint8_t i = 0; i < 1; i++){ -// args[i].link_layer_obj = obj_to_send; -// args[i].task_id = i; -// args[i].receiver_id = RECEIVER_BOARD_ID; -// args[i].receive_queue = xQueueCreate(10, sizeof(ReceviedFrame)); //queue storing up to 10 control frames -// xTaskCreate(multi_transceiver, "multi_transceiver", 4096, static_cast(&args[i]), 5, NULL); -// vTaskDelay(500 / portTICK_PERIOD_MS); -// } + for (uint8_t i = 0; i < 1; i++){ + args[i].link_layer_obj = obj_to_send; + args[i].task_id = i; + args[i].receiver_id = RECEIVER_BOARD_ID; + args[i].receive_queue = xQueueCreate(10, sizeof(ReceviedFrame)); //queue storing up to 10 control frames + xTaskCreate(multi_transceiver, "multi_transceiver", 8192, static_cast(&args[i]), 5, NULL); + vTaskDelay(500 / portTICK_PERIOD_MS); + } -// printf("Tasks have been created\n"); + printf("Tasks have been created\n"); -// while(true){ -// //do nothing -// vTaskDelay(1000 / portTICK_PERIOD_MS); -// } - -// for (int i = 5; i >= 0; i--) { -// printf("Restarting in %d seconds...\n", i); -// vTaskDelay(1000 / portTICK_PERIOD_MS); -// } -// printf("Restarting now.\n"); -// fflush(stdout); -// esp_restart(); - -// while(true){ -// //dummy wait -// vTaskDelay(2000 / portTICK_PERIOD_MS); -// } -// } \ No newline at end of file + while(true){ + //do nothing + vTaskDelay(1000 / portTICK_PERIOD_MS); + } +} +#endif //RMT_TEST \ No newline at end of file