diff --git a/README.md b/README.md index d6ee1a8..867a87f 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,15 @@ What we need for functionality: ## Supported boards -| Board name | Support | Stream | Micro SD | FLASH LED | FW update | DHT22/DHT11 | Documentation | -|---------------------------|-------------|--------|----------|-----------|-----------|-------------|----------------------------------------------| -| Ai-Thinker ESP32-cam | Full | Yes | Yes | Board/Ext | Yes | Yes | [ here ](doc/AI_Thinker-ESP32-cam/README.md) | -| ESP32-S3-EYE 2.2 | Full | Yes | Yes | External | Yes | Yes | [ here ](doc/ESP32-S3-EYE-22/README.md) | -| Freenove ESP32-Wrover cam | Full | Yes | No | External | Yes | Yes | [ here ](doc/ESP32-Wrover-dev/README.md) | -| Freenove ESP32-S3-Wroom | in Progress | | | | | | | -| ESP32-S3-DEV-CAM | in Progress | | | External | | | [ here ](doc/ESP32-S3-DEV-CAM/README.md) | -| Seeed Studio XIAO ESP32S3 | Full | Yes | Yes | External | Yes | Yes | [ here ](doc/XIAO_ESP32S3/README.md) | -| ESP32-S3-CAM | Full | Yes | Yes | Board/Ext | Yes | Yes | [ here ](doc/ESP32-S3-CAM/README.md) | +| Board name | Support | Stream | Micro SD | FLASH LED | FW update | DHT22/DHT11 | Documentation | +|---------------------------|-------------|--------|----------|-----------|-----------|-------------|------------------------------------------------| +| Ai-Thinker ESP32-cam | Full | Yes | Yes | Board/Ext | Yes | Yes | [ here ](doc/AI_Thinker-ESP32-cam/README.md) | +| ESP32-S3-EYE 2.2 | Full | Yes | Yes | External | Yes | Yes | [ here ](doc/ESP32-S3-EYE-22/README.md) | +| Freenove ESP32-Wrover cam | Full | Yes | No | External | Yes | Yes | [ here ](doc/ESP32-Wrover-dev/README.md) | +| Freenove ESP32-S3-Wroom | in Progress | | | | | | [ here ](doc/Freenove ESP32-S3-Wroom/README.md | | +| ESP32-S3-DEV-CAM | in Progress | | | External | | | [ here ](doc/ESP32-S3-DEV-CAM/README.md) | +| Seeed Studio XIAO ESP32S3 | Full | Yes | Yes | External | Yes | Yes | [ here ](doc/XIAO_ESP32S3/README.md) | +| ESP32-S3-CAM | Full | Yes | Yes | Board/Ext | Yes | Yes | [ here ](doc/ESP32-S3-CAM/README.md) | The compiled firmware for each supported board is published with every release. diff --git a/doc/Freenove ESP32-S3-Wroom/Arduino_Configuration.png b/doc/Freenove ESP32-S3-Wroom/Arduino_Configuration.png new file mode 100644 index 0000000..d9947d8 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Arduino_Configuration.png differ diff --git a/doc/Freenove ESP32-S3-Wroom/Board.jpg b/doc/Freenove ESP32-S3-Wroom/Board.jpg new file mode 100644 index 0000000..4e0785b Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Board.jpg differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/C_Tutorial.pdf b/doc/Freenove ESP32-S3-Wroom/C/C_Tutorial.pdf new file mode 100644 index 0000000..204f881 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/C_Tutorial.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/DHT_sensor_library_for_ESPx-1.19.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/DHT_sensor_library_for_ESPx-1.19.zip new file mode 100644 index 0000000..455dc88 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/DHT_sensor_library_for_ESPx-1.19.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP32-audioI2S-2.0.0.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP32-audioI2S-2.0.0.zip new file mode 100644 index 0000000..bfbf63a Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP32-audioI2S-2.0.0.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP32Servo-3.0.4.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP32Servo-3.0.4.zip new file mode 100644 index 0000000..f70adb0 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP32Servo-3.0.4.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP8266Audio-1.9.8.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP8266Audio-1.9.8.zip new file mode 100644 index 0000000..0cddbda Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/ESP8266Audio-1.9.8.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/Freenove_IR_Lib_for_ESP32_v1.0.1.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/Freenove_IR_Lib_for_ESP32_v1.0.1.zip new file mode 100644 index 0000000..fc2a62e Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/Freenove_IR_Lib_for_ESP32_v1.0.1.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/Freenove_WS2812_Lib_for_ESP32-2.0.0.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/Freenove_WS2812_Lib_for_ESP32-2.0.0.zip new file mode 100644 index 0000000..0947a2b Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/Freenove_WS2812_Lib_for_ESP32-2.0.0.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/IRremoteESP8266-2.8.6.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/IRremoteESP8266-2.8.6.zip new file mode 100644 index 0000000..a91641c Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/IRremoteESP8266-2.8.6.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/Keypad-3.1.1.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/Keypad-3.1.1.zip new file mode 100644 index 0000000..cd49f00 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/Keypad-3.1.1.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/LiquidCrystal-1.0.7.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/LiquidCrystal-1.0.7.zip new file mode 100644 index 0000000..4bd0b6a Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/LiquidCrystal-1.0.7.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/LiquidCrystal_I2C-1.1.2.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/LiquidCrystal_I2C-1.1.2.zip new file mode 100644 index 0000000..b6eb2b7 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/LiquidCrystal_I2C-1.1.2.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/MPU6050_tockn-1.5.2.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/MPU6050_tockn-1.5.2.zip new file mode 100644 index 0000000..5e09cd8 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/MPU6050_tockn-1.5.2.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Libraries/UltrasonicSensor-1.1.0.zip b/doc/Freenove ESP32-S3-Wroom/C/Libraries/UltrasonicSensor-1.1.0.zip new file mode 100644 index 0000000..c4ed66e Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/C/Libraries/UltrasonicSensor-1.1.0.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_01.1_Blink/Sketch_01.1_Blink.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_01.1_Blink/Sketch_01.1_Blink.ino new file mode 100644 index 0000000..5a8a894 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_01.1_Blink/Sketch_01.1_Blink.ino @@ -0,0 +1,20 @@ +/********************************************************************** +* Filename : Blink +* Description : Make an led blinking. +* Auther : www.freenove.com +* Modification: 2022/10/19 +**********************************************************************/ +#define LED_BUILTIN 2 +// the setup function runs once when you press reset or power the board +void setup() { + // initialize digital pin LED_BUILTIN as an output. + pinMode(LED_BUILTIN, OUTPUT); +} + +// the loop function runs over and over again forever +void loop() { + digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) + delay(1000); // wait for a second + digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW + delay(1000); // wait for a second +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_02.1_SerialPrinter/Sketch_02.1_SerialPrinter.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_02.1_SerialPrinter/Sketch_02.1_SerialPrinter.ino new file mode 100644 index 0000000..97ff1cc --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_02.1_SerialPrinter/Sketch_02.1_SerialPrinter.ino @@ -0,0 +1,16 @@ +/********************************************************************** + Filename : SerialPrinter + Description : Use UART send some data to PC, and show them on serial monitor. + Auther : www.freenove.com + Modification: 2022/10/20 +**********************************************************************/ + +void setup() { + Serial.begin(115200); + Serial.println("ESP32S3 initialization completed!"); +} + +void loop() { + Serial.printf("Running time : %.1f s\r\n", millis() / 1000.0f); + delay(1000); +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_02.2_SerialRW/Sketch_02.2_SerialRW.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_02.2_SerialRW/Sketch_02.2_SerialRW.ino new file mode 100644 index 0000000..6eb4a13 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_02.2_SerialRW/Sketch_02.2_SerialRW.ino @@ -0,0 +1,30 @@ +/********************************************************************** + Filename : SerialRW + Description : Use UART read and write data between ESP32 and PC. + Auther : www.freenove.com + Modification: 2022/10/20 +**********************************************************************/ +String inputString = ""; //a String to hold incoming data +bool stringComplete = false; // whether the string is complete + +void setup() { + Serial.begin(115200); + Serial.println(String("\nESP32S3 initialization completed!\r\n") + + String("Please input some characters,\r\n") + + String("select \"Newline\" below and Ctrl + Enter to send message to ESP32S3. \r\n")); +} + +void loop() { + if (Serial.available()) { // judge whether data has been received + char inChar = Serial.read(); // read one character + inputString += inChar; + if (inChar == '\n') { + stringComplete = true; + } + } + if (stringComplete) { + Serial.printf("inputString: %s \r\n", inputString); + inputString = ""; + stringComplete = false; + } +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_03.1_BLE_USART/Sketch_03.1_BLE_USART.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_03.1_BLE_USART/Sketch_03.1_BLE_USART.ino new file mode 100644 index 0000000..9bd2051 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_03.1_BLE_USART/Sketch_03.1_BLE_USART.ino @@ -0,0 +1,79 @@ +/********************************************************************** + Filename : BLE_USART + Description : Esp32 communicates with the phone by BLE and sends incoming data via a serial port + Auther : www.freenove.com + Modification: 2024/07/01 +**********************************************************************/ +#include "BLEDevice.h" +#include "BLEServer.h" +#include "BLEUtils.h" +#include "BLE2902.h" + +BLECharacteristic *pCharacteristic; +bool deviceConnected = false; +uint8_t txValue = 0; +long lastMsg = 0; +String rxload="Test\n"; + +#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" +#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" +#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" + +class MyServerCallbacks: public BLEServerCallbacks { + void onConnect(BLEServer* pServer) { + deviceConnected = true; + }; + void onDisconnect(BLEServer* pServer) { + deviceConnected = false; + //pServer->getAdvertising()->start(); //Reopen the pServer and wait for the connection. + } +}; + +class MyCallbacks: public BLECharacteristicCallbacks { + void onWrite(BLECharacteristic *pCharacteristic) { + String rxValue = pCharacteristic->getValue(); + if (rxValue.length() > 0) { + rxload=""; + for (int i = 0; i < rxValue.length(); i++){ + rxload +=(char)rxValue[i]; + } + } + } +}; + +void setupBLE(String BLEName){ + const char *ble_name=BLEName.c_str(); + BLEDevice::init(ble_name); + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(new MyServerCallbacks()); + BLEService *pService = pServer->createService(SERVICE_UUID); + pCharacteristic= pService->createCharacteristic(CHARACTERISTIC_UUID_TX,BLECharacteristic::PROPERTY_NOTIFY); + pCharacteristic->addDescriptor(new BLE2902()); + BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX,BLECharacteristic::PROPERTY_WRITE); + pCharacteristic->setCallbacks(new MyCallbacks()); + pService->start(); + pServer->getAdvertising()->start(); + Serial.println("Waiting a client connection to notify..."); +} + +void setup() { + Serial.begin(115200); + setupBLE("ESP32S3_Bluetooth"); +} + +void loop() { + long now = millis(); + if (now - lastMsg > 100) { + if (deviceConnected&&rxload.length()>0) { + Serial.println(rxload); + rxload=""; + } + if(Serial.available()>0){ + String str=Serial.readString(); + const char *newValue=str.c_str(); + pCharacteristic->setValue(newValue); + pCharacteristic->notify(); + } + lastMsg = now; + } +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/Sketch_04.1_SDMMC_Test.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/Sketch_04.1_SDMMC_Test.ino new file mode 100644 index 0000000..2fceceb --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/Sketch_04.1_SDMMC_Test.ino @@ -0,0 +1,65 @@ +/********************************************************************** + Filename : SDMMC Test + Description : The SD card is accessed using the SDMMC one-bit bus + Auther : www.freenove.com + Modification: 2022/10/28 +**********************************************************************/ +#include "sd_read_write.h" +#include "SD_MMC.h" + +#define SD_MMC_CMD 38 //Please do not modify it. +#define SD_MMC_CLK 39 //Please do not modify it. +#define SD_MMC_D0 40 //Please do not modify it. + +void setup(){ + Serial.begin(115200); + SD_MMC.setPins(SD_MMC_CLK, SD_MMC_CMD, SD_MMC_D0); + if (!SD_MMC.begin("/sdcard", true, true, SDMMC_FREQ_DEFAULT, 5)) { + Serial.println("Card Mount Failed"); + return; + } + uint8_t cardType = SD_MMC.cardType(); + if(cardType == CARD_NONE){ + Serial.println("No SD_MMC card attached"); + return; + } + + Serial.print("SD_MMC Card Type: "); + if(cardType == CARD_MMC){ + Serial.println("MMC"); + } else if(cardType == CARD_SD){ + Serial.println("SDSC"); + } else if(cardType == CARD_SDHC){ + Serial.println("SDHC"); + } else { + Serial.println("UNKNOWN"); + } + + uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024); + Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize); + + listDir(SD_MMC, "/", 0); + + createDir(SD_MMC, "/mydir"); + listDir(SD_MMC, "/", 0); + + removeDir(SD_MMC, "/mydir"); + listDir(SD_MMC, "/", 2); + + writeFile(SD_MMC, "/hello.txt", "Hello "); + appendFile(SD_MMC, "/hello.txt", "World!\n"); + readFile(SD_MMC, "/hello.txt"); + + deleteFile(SD_MMC, "/foo.txt"); + renameFile(SD_MMC, "/hello.txt", "/foo.txt"); + readFile(SD_MMC, "/foo.txt"); + + testFileIO(SD_MMC, "/test.txt"); + + Serial.printf("Total space: %lluMB\r\n", SD_MMC.totalBytes() / (1024 * 1024)); + Serial.printf("Used space: %lluMB\r\n", SD_MMC.usedBytes() / (1024 * 1024)); +} + +void loop(){ + delay(10000); +} \ No newline at end of file diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/sd_read_write.cpp b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/sd_read_write.cpp new file mode 100644 index 0000000..fa0b15e --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/sd_read_write.cpp @@ -0,0 +1,154 @@ +#include "sd_read_write.h" + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + Serial.println(file.name()); + if(levels){ + listDir(fs, file.path(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print(" SIZE: "); + Serial.println(file.size()); + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("mkdir failed"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\n", path); + + File file = fs.open(path); + if(!file){ + Serial.println("Failed to open file for reading"); + return; + } + + Serial.print("Read from file: "); + while(file.available()){ + Serial.write(file.read()); + } +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("File written"); + } else { + Serial.println("Write failed"); + } +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("Failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("Message appended"); + } else { + Serial.println("Append failed"); + } +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("File renamed"); + } else { + Serial.println("Rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\n", path); + if(fs.remove(path)){ + Serial.println("File deleted"); + } else { + Serial.println("Delete failed"); + } +} + +void testFileIO(fs::FS &fs, const char * path){ + File file = fs.open(path); + static uint8_t buf[512]; + size_t len = 0; + uint32_t start = millis(); + uint32_t end = start; + if(file){ + len = file.size(); + size_t flen = len; + start = millis(); + while(len){ + size_t toRead = len; + if(toRead > 512){ + toRead = 512; + } + file.read(buf, toRead); + len -= toRead; + } + end = millis() - start; + Serial.printf("%u bytes read for %u ms\r\n", flen, end); + file.close(); + } else { + Serial.println("Failed to open file for reading"); + } + + file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + + size_t i; + start = millis(); + for(i=0; i<2048; i++){ + file.write(buf, 512); + } + end = millis() - start; + Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end); + file.close(); +} \ No newline at end of file diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/sd_read_write.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/sd_read_write.h new file mode 100644 index 0000000..9eb99a4 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_04.1_SDMMC_Test/sd_read_write.h @@ -0,0 +1,18 @@ +#ifndef __SD_READ_WRITE_H +#define __SD_READ_WRITE_H + +#include "Arduino.h" +#include "FS.h" + + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels); +void createDir(fs::FS &fs, const char * path); +void removeDir(fs::FS &fs, const char * path); +void readFile(fs::FS &fs, const char * path); +void writeFile(fs::FS &fs, const char * path, const char * message); +void appendFile(fs::FS &fs, const char * path, const char * message); +void renameFile(fs::FS &fs, const char * path1, const char * path2); +void deleteFile(fs::FS &fs, const char * path); +void testFileIO(fs::FS &fs, const char * path); + +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.1_WiFi_Station/Sketch_05.1_WiFi_Station.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.1_WiFi_Station/Sketch_05.1_WiFi_Station.ino new file mode 100644 index 0000000..049f78c --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.1_WiFi_Station/Sketch_05.1_WiFi_Station.ino @@ -0,0 +1,28 @@ +/********************************************************************** + Filename : WiFi Station + Description : Connect to your router using ESP32 + Auther : www.freenove.com + Modification: 2022/10/31 +**********************************************************************/ +#include + +const char *ssid_Router = "********"; //Enter the router name +const char *password_Router = "********"; //Enter the router password + +void setup(){ + Serial.begin(115200); + delay(2000); + Serial.println("Setup start"); + WiFi.begin(ssid_Router, password_Router); + Serial.println(String("Connecting to ")+ssid_Router); + while (WiFi.status() != WL_CONNECTED){ + delay(500); + Serial.print("."); + } + Serial.println("\nConnected, IP address: "); + Serial.println(WiFi.localIP()); + Serial.println("Setup End"); +} + +void loop() { +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.2_WiFi_AP/Sketch_05.2_WiFi_AP.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.2_WiFi_AP/Sketch_05.2_WiFi_AP.ino new file mode 100644 index 0000000..3a9d5ee --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.2_WiFi_AP/Sketch_05.2_WiFi_AP.ino @@ -0,0 +1,36 @@ +/********************************************************************** + Filename : WiFi AP + Description : Set ESP32 to open an access point + Auther : www.freenove.com + Modification: 2022/10/31 +**********************************************************************/ +#include + +const char *ssid_AP = "WiFi_Name"; //Enter the router name +const char *password_AP = "12345678"; //Enter the router password + +IPAddress local_IP(192,168,1,100);//Set the IP address of ESP32 itself +IPAddress gateway(192,168,1,10); //Set the gateway of ESP32 itself +IPAddress subnet(255,255,255,0); //Set the subnet mask for ESP32 itself + +void setup(){ + Serial.begin(115200); + delay(2000); + Serial.println("Setting soft-AP configuration ... "); + WiFi.disconnect(); + WiFi.mode(WIFI_AP); + Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!"); + Serial.println("Setting soft-AP ... "); + boolean result = WiFi.softAP(ssid_AP, password_AP); + if(result){ + Serial.println("Ready"); + Serial.println(String("Soft-AP IP address = ") + WiFi.softAPIP().toString()); + Serial.println(String("MAC address = ") + WiFi.softAPmacAddress().c_str()); + }else{ + Serial.println("Failed!"); + } + Serial.println("Setup End"); +} + +void loop() { +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.3_AP_Station/Sketch_05.3_AP_Station.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.3_AP_Station/Sketch_05.3_AP_Station.ino new file mode 100644 index 0000000..8c0e7d1 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_05.3_AP_Station/Sketch_05.3_AP_Station.ino @@ -0,0 +1,42 @@ +/********************************************************************** + Filename : WiFi AP+Station + Description : ESP32 connects to the user's router, turning on an access point + Auther : www.freenove.com + Modification: 2022/10/31 +**********************************************************************/ +#include + +const char *ssid_Router = "********"; //Enter the router name +const char *password_Router = "********"; //Enter the router password +const char *ssid_AP = "WiFi_Name"; //Enter the router name +const char *password_AP = "12345678"; //Enter the router password + +void setup(){ + Serial.begin(115200); + Serial.println("Setting soft-AP configuration ... "); + WiFi.disconnect(); + WiFi.mode(WIFI_AP); + Serial.println("Setting soft-AP ... "); + boolean result = WiFi.softAP(ssid_AP, password_AP); + if(result){ + Serial.println("Ready"); + Serial.println(String("Soft-AP IP address = ") + WiFi.softAPIP().toString()); + Serial.println(String("MAC address = ") + WiFi.softAPmacAddress().c_str()); + }else{ + Serial.println("Failed!"); + } + + Serial.println("\nSetting Station configuration ... "); + WiFi.begin(ssid_Router, password_Router); + Serial.println(String("Connecting to ")+ ssid_Router); + while (WiFi.status() != WL_CONNECTED){ + delay(500); + Serial.print("."); + } + Serial.println("\nConnected, IP address: "); + Serial.println(WiFi.localIP()); + Serial.println("Setup End"); +} + +void loop() { +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.1_WiFiClient/Sketch_06.1_WiFiClient.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.1_WiFiClient/Sketch_06.1_WiFiClient.ino new file mode 100644 index 0000000..84d7048 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.1_WiFiClient/Sketch_06.1_WiFiClient.ino @@ -0,0 +1,59 @@ +/********************************************************************** + Filename : WiFi Client + Description : Use ESP32's WiFi client feature to connect and communicate with a remote IP. + Auther : www.freenove.com + Modification: 2022/10/31 +**********************************************************************/ +#include + +const char *ssid_Router = "********"; //Enter the router name +const char *password_Router = "********"; //Enter the router password +#define REMOTE_IP "********" //input the remote server which is you want to connect +#define REMOTE_PORT 8888 //input the remote port which is the remote provide +WiFiClient client; + +void setup() { + Serial.begin(115200); + delay(10); + + WiFi.begin(ssid_Router, password_Router); + Serial.print("\nWaiting for WiFi... "); + while (WiFi.status() != WL_CONNECTED) { + Serial.print("."); + delay(500); + } + Serial.println(""); + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + Serial.print("Connecting to "); + Serial.println(REMOTE_IP); + + while (!client.connect(REMOTE_IP, REMOTE_PORT)) { + Serial.println("Connection failed."); + Serial.println("Waiting a moment before retrying..."); + } + Serial.println("Connected"); + client.print("Hello\n"); + client.print("This is my IP.\n"); +} + +void loop() { + if (client.available() > 0) { + delay(20); + //read back one line from the server + String line = client.readString(); + Serial.println(REMOTE_IP + String(":") + line); + } + if (Serial.available() > 0) { + delay(20); + String line = Serial.readString(); + client.print(line); + } + if (client.connected () == 0) { + client.stop(); + WiFi.disconnect(); + } +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.1_WiFiClient/sketchWiFi/sketchWiFi.pde b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.1_WiFiClient/sketchWiFi/sketchWiFi.pde new file mode 100644 index 0000000..82ce0e4 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.1_WiFiClient/sketchWiFi/sketchWiFi.pde @@ -0,0 +1,240 @@ +/* + ****************************************************************************** + * Sketch WiFi Client and Server + * Author Zhentao Lin @ Freenove (http://www.freenove.com) + * Date 2020/7/11 + ****************************************************************************** + * Brief + * This sketch is used to control a 2D ellipse through communicate to an + * ESP32 board or other micro controller. + * It will automatically detect and connect to a device (serial port) which + * use the same trans format. + ****************************************************************************** + * Copyright + * Copyright © Freenove (http://www.freenove.com) + * License + * Creative Commons Attribution ShareAlike 3.0 + * (http://creativecommons.org/licenses/by-sa/3.0/legalcode) + ****************************************************************************** +*/ +import controlP5.*; +import processing.net.*; + +ControlP5 cp5; +//Println console; +Server myServer; +Client myClient; +int dataIn=0; +int radioFlag1=0; +int radioFlag2=0; +int send_flag=1; + +void setup() { + size(600,400); + smooth(); + noStroke(); + cp5 = new ControlP5(this); + cp5.addTab("default") + .activateEvent(true) + .setHeight(30) + .setWidth(100) + .setLabel("TCP Server") + .setId(1) + ; + cp5.getTab("TCP Client") + .activateEvent(true) + .setHeight(30) + .setWidth(100) + .setId(2) + ; + + cp5.addTextfield("Local IP") + .setPosition(20,40) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .moveTo("default") + ; + cp5.addTextfield("Local PORT") + .setPosition(20,120) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .setText("8888") + .moveTo("default") + ; + cp5.addRadioButton("connect1") + .setPosition(20,200) + .setSize(100,25) + .addItem("Listening", 1) + .setColorLabel(color(0)) + .moveTo("default") + ; + + cp5.addTextfield("Remote IP") + .setPosition(20,40) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .setText("192.168.1.xxx") + .moveTo("TCP Client") + ; + cp5.addTextfield("Remote PORT") + .setPosition(20,120) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .setText("80") + .moveTo("TCP Client") + ; + cp5.addRadioButton("connect2") + .setPosition(20,200) + .setSize(100,25) + .addItem("connect Server",1) + .setColorLabel(color(0)) + .moveTo("TCP Client") + ; + + cp5.addTextarea("recvData") + .setPosition(200,40) + .setSize(350,150) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorBackground(color(100,255)) + .scroll(15) + .setColorForeground(color(0,100)) + .moveTo("global") + ; + cp5.addTextfield("sendData") + .setPosition(200,230) + .setSize(350,80) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setLabel("") + .setFocus(true) + .setColorBackground(color(100,255)) + .setColorForeground(color(0,100)) + .moveTo("global") + ; + cp5.addButton("clearRecv") + .setValue(0) + .setPosition(200,200) + .setSize(100,20) + .setColorLabel(color(255,100)) + .moveTo("global") + ; + cp5.addButton("clearSend") + .setValue(0) + .setPosition(200,320) + .setSize(100,20) + .setColorLabel(color(255,100)) + .moveTo("global") + ; + cp5.addButton("Send") + .setValue(0) + .setPosition(450,320) + .setSize(100,20) + .plugTo(this,"send_Textfield_SendData") + .setColorLabel(color(255,100)) + .moveTo("global") + ; + cp5.get(Textfield.class,"Local IP").setText(Server.ip()); +} + +void draw(){ + background(220); + if(radioFlag1==1){ + Client thisClient = myServer.available(); + if (thisClient !=null) { + String whatClientSaid = thisClient.readString(); + if (whatClientSaid != null) { + cp5.get(Textarea.class,"recvData").append(thisClient.ip()+": "); + cp5.get(Textarea.class,"recvData").append(whatClientSaid+"\n"); + } + } + + } + // myServer.active() + if(radioFlag2==1){ + if (myClient.available() > 0) { + String whatClientSaid = myClient.readString(); + if (whatClientSaid != null) { + cp5.get(Textarea.class,"recvData").append(cp5.get(Textfield.class,"Remote IP").getText()+": "); + cp5.get(Textarea.class,"recvData").append(whatClientSaid+"\n"); + } + } + } +} + +void controlEvent(ControlEvent theControlEvent) { + if (theControlEvent.isTab()) { + if(theControlEvent.getTab().getId()==1){ + cp5.get(Textarea.class,"recvData").clear(); + cp5.get(Textfield.class,"sendData").clear(); + send_flag=1; + } + else if(theControlEvent.getTab().getId()==2){ + cp5.get(Textarea.class,"recvData").clear(); + cp5.get(Textfield.class,"sendData").clear(); + send_flag=2; + } + } +} + +void connect1(int a) { + println("a radio Button event: "+a); + radioFlag1=a; + if(radioFlag1==1){ + String port_buffer = cp5.get(Textfield.class,"Local PORT").getText(); + int port = int(port_buffer); + myServer = new Server(this,port); + println(Server.ip()); + cp5.get(Textfield.class,"Local IP").setText(Server.ip()); + println(port); + } + else + myServer.stop(); +} +void connect2(int a) { + println("a radio Button event: "+a); + radioFlag2=a; + if(radioFlag2==1){ + String port_buffer = cp5.get(Textfield.class,"Remote PORT").getText(); + String IP_buffer = cp5.get(Textfield.class,"Remote IP").getText(); + int port = int(port_buffer); + if(IP_buffer.compareTo("192.168.1.xxx")==0){ + println("connect error!"); + } + else{ + myClient = new Client(this,IP_buffer,port); + println("connect success!"); + } + + } + else + myClient.stop(); +} +void clearRecv(){ + cp5.get(Textarea.class,"recvData").clear(); +} +void clearSend(){ + cp5.get(Textfield.class,"sendData").clear(); +} +void send_Textfield_SendData(){ + if(send_flag==1){ + myServer.write(cp5.get(Textfield.class,"sendData").getText()); + cp5.get(Textfield.class,"sendData").clear(); + } + else if(send_flag==2){ + myClient.write(cp5.get(Textfield.class,"sendData").getText()); + cp5.get(Textfield.class,"sendData").clear(); + } +} \ No newline at end of file diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.2_WiFiServer/Sketch_06.2_WiFiServer.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.2_WiFiServer/Sketch_06.2_WiFiServer.ino new file mode 100644 index 0000000..203cbb5 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.2_WiFiServer/Sketch_06.2_WiFiServer.ino @@ -0,0 +1,53 @@ +/********************************************************************** + Filename : WiFi Server + Description : Use ESP32's WiFi server feature to wait for other WiFi devices to connect. + And communicate with them once a connection has been established. + Auther : www.freenove.com + Modification: 2024/07/01 +**********************************************************************/ +#include + +#define port 80 +const char *ssid_Router = "********"; //input your wifi name +const char *password_Router = "********"; //input your wifi passwords +WiFiServer server(port); + +void setup() +{ + Serial.begin(115200); + Serial.printf("\nConnecting to "); + Serial.println(ssid_Router); + WiFi.disconnect(); + WiFi.begin(ssid_Router, password_Router); + delay(1000); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(""); + Serial.println("WiFi connected."); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + Serial.printf("IP port: %d\n",port); + server.begin(port); + WiFi.setAutoReconnect(true); +} + +void loop(){ + WiFiClient client = server.accept(); // listen for incoming clients + if (client) { // if you get a client, + Serial.println("Client connected."); + while (client.connected()) { // loop while the client's connected + if (client.available()) { // if there's bytes to read from the client, + Serial.println(client.readStringUntil('\n')); // print it out the serial monitor + while(client.read()>0); // clear the wifi receive area cache + } + if(Serial.available()){ // if there's bytes to read from the serial monitor, + client.print(Serial.readStringUntil('\n')); // print it out the client. + while(Serial.read()>0); // clear the wifi receive area cache + } + } + client.stop(); // stop the client connecting. + Serial.println("Client Disconnected."); + } +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.2_WiFiServer/sketchWiFi/sketchWiFi.pde b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.2_WiFiServer/sketchWiFi/sketchWiFi.pde new file mode 100644 index 0000000..82ce0e4 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_06.2_WiFiServer/sketchWiFi/sketchWiFi.pde @@ -0,0 +1,240 @@ +/* + ****************************************************************************** + * Sketch WiFi Client and Server + * Author Zhentao Lin @ Freenove (http://www.freenove.com) + * Date 2020/7/11 + ****************************************************************************** + * Brief + * This sketch is used to control a 2D ellipse through communicate to an + * ESP32 board or other micro controller. + * It will automatically detect and connect to a device (serial port) which + * use the same trans format. + ****************************************************************************** + * Copyright + * Copyright © Freenove (http://www.freenove.com) + * License + * Creative Commons Attribution ShareAlike 3.0 + * (http://creativecommons.org/licenses/by-sa/3.0/legalcode) + ****************************************************************************** +*/ +import controlP5.*; +import processing.net.*; + +ControlP5 cp5; +//Println console; +Server myServer; +Client myClient; +int dataIn=0; +int radioFlag1=0; +int radioFlag2=0; +int send_flag=1; + +void setup() { + size(600,400); + smooth(); + noStroke(); + cp5 = new ControlP5(this); + cp5.addTab("default") + .activateEvent(true) + .setHeight(30) + .setWidth(100) + .setLabel("TCP Server") + .setId(1) + ; + cp5.getTab("TCP Client") + .activateEvent(true) + .setHeight(30) + .setWidth(100) + .setId(2) + ; + + cp5.addTextfield("Local IP") + .setPosition(20,40) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .moveTo("default") + ; + cp5.addTextfield("Local PORT") + .setPosition(20,120) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .setText("8888") + .moveTo("default") + ; + cp5.addRadioButton("connect1") + .setPosition(20,200) + .setSize(100,25) + .addItem("Listening", 1) + .setColorLabel(color(0)) + .moveTo("default") + ; + + cp5.addTextfield("Remote IP") + .setPosition(20,40) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .setText("192.168.1.xxx") + .moveTo("TCP Client") + ; + cp5.addTextfield("Remote PORT") + .setPosition(20,120) + .setSize(160,40) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorLabel(color(0)) + .setColorBackground(color(100,255)) + .setText("80") + .moveTo("TCP Client") + ; + cp5.addRadioButton("connect2") + .setPosition(20,200) + .setSize(100,25) + .addItem("connect Server",1) + .setColorLabel(color(0)) + .moveTo("TCP Client") + ; + + cp5.addTextarea("recvData") + .setPosition(200,40) + .setSize(350,150) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setColorBackground(color(100,255)) + .scroll(15) + .setColorForeground(color(0,100)) + .moveTo("global") + ; + cp5.addTextfield("sendData") + .setPosition(200,230) + .setSize(350,80) + .setFont(createFont("微软雅黑 Light",20)) + .setColor(color(255,255,0)) + .setLabel("") + .setFocus(true) + .setColorBackground(color(100,255)) + .setColorForeground(color(0,100)) + .moveTo("global") + ; + cp5.addButton("clearRecv") + .setValue(0) + .setPosition(200,200) + .setSize(100,20) + .setColorLabel(color(255,100)) + .moveTo("global") + ; + cp5.addButton("clearSend") + .setValue(0) + .setPosition(200,320) + .setSize(100,20) + .setColorLabel(color(255,100)) + .moveTo("global") + ; + cp5.addButton("Send") + .setValue(0) + .setPosition(450,320) + .setSize(100,20) + .plugTo(this,"send_Textfield_SendData") + .setColorLabel(color(255,100)) + .moveTo("global") + ; + cp5.get(Textfield.class,"Local IP").setText(Server.ip()); +} + +void draw(){ + background(220); + if(radioFlag1==1){ + Client thisClient = myServer.available(); + if (thisClient !=null) { + String whatClientSaid = thisClient.readString(); + if (whatClientSaid != null) { + cp5.get(Textarea.class,"recvData").append(thisClient.ip()+": "); + cp5.get(Textarea.class,"recvData").append(whatClientSaid+"\n"); + } + } + + } + // myServer.active() + if(radioFlag2==1){ + if (myClient.available() > 0) { + String whatClientSaid = myClient.readString(); + if (whatClientSaid != null) { + cp5.get(Textarea.class,"recvData").append(cp5.get(Textfield.class,"Remote IP").getText()+": "); + cp5.get(Textarea.class,"recvData").append(whatClientSaid+"\n"); + } + } + } +} + +void controlEvent(ControlEvent theControlEvent) { + if (theControlEvent.isTab()) { + if(theControlEvent.getTab().getId()==1){ + cp5.get(Textarea.class,"recvData").clear(); + cp5.get(Textfield.class,"sendData").clear(); + send_flag=1; + } + else if(theControlEvent.getTab().getId()==2){ + cp5.get(Textarea.class,"recvData").clear(); + cp5.get(Textfield.class,"sendData").clear(); + send_flag=2; + } + } +} + +void connect1(int a) { + println("a radio Button event: "+a); + radioFlag1=a; + if(radioFlag1==1){ + String port_buffer = cp5.get(Textfield.class,"Local PORT").getText(); + int port = int(port_buffer); + myServer = new Server(this,port); + println(Server.ip()); + cp5.get(Textfield.class,"Local IP").setText(Server.ip()); + println(port); + } + else + myServer.stop(); +} +void connect2(int a) { + println("a radio Button event: "+a); + radioFlag2=a; + if(radioFlag2==1){ + String port_buffer = cp5.get(Textfield.class,"Remote PORT").getText(); + String IP_buffer = cp5.get(Textfield.class,"Remote IP").getText(); + int port = int(port_buffer); + if(IP_buffer.compareTo("192.168.1.xxx")==0){ + println("connect error!"); + } + else{ + myClient = new Client(this,IP_buffer,port); + println("connect success!"); + } + + } + else + myClient.stop(); +} +void clearRecv(){ + cp5.get(Textarea.class,"recvData").clear(); +} +void clearSend(){ + cp5.get(Textfield.class,"sendData").clear(); +} +void send_Textfield_SendData(){ + if(send_flag==1){ + myServer.write(cp5.get(Textfield.class,"sendData").getText()); + cp5.get(Textfield.class,"sendData").clear(); + } + else if(send_flag==2){ + myClient.write(cp5.get(Textfield.class,"sendData").getText()); + cp5.get(Textfield.class,"sendData").clear(); + } +} \ No newline at end of file diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/Sketch_07.1_CameraWebServer.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/Sketch_07.1_CameraWebServer.ino new file mode 100644 index 0000000..9c7dd48 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/Sketch_07.1_CameraWebServer.ino @@ -0,0 +1,119 @@ +/********************************************************************** + Filename : Camera Web Server + Description : The camera images captured by the ESP32S3 are displayed on the web page. + Auther : www.freenove.com + Modification: 2024/07/01 +**********************************************************************/ +#include "esp_camera.h" +#include + +// =================== +// Select camera model +// =================== +//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM +//#define CAMERA_MODEL_ESP_EYE // Has PSRAM +#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM +//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM +//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM +//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM +//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM +//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM +//#define CAMERA_MODEL_AI_THINKER // Has PSRAM +//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM +// ** Espressif Internal Boards ** +//#define CAMERA_MODEL_ESP32_CAM_BOARD +//#define CAMERA_MODEL_ESP32S2_CAM_BOARD +//#define CAMERA_MODEL_ESP32S3_CAM_LCD + +#include "camera_pins.h" + +// =========================== +// Enter your WiFi credentials +// =========================== +const char* ssid = "********"; +const char* password = "********"; + +void startCameraServer(); + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + Serial.println(); + + camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sccb_sda = SIOD_GPIO_NUM; + config.pin_sccb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = 20000000; + config.frame_size = FRAMESIZE_UXGA; + config.pixel_format = PIXFORMAT_JPEG; // for streaming + config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; + config.fb_location = CAMERA_FB_IN_PSRAM; + config.jpeg_quality = 12; + config.fb_count = 1; + + // if PSRAM IC present, init with UXGA resolution and higher JPEG quality + // for larger pre-allocated frame buffer. + if(psramFound()){ + config.jpeg_quality = 10; + config.fb_count = 2; + config.grab_mode = CAMERA_GRAB_LATEST; + } else { + // Limit the frame size when PSRAM is not available + config.frame_size = FRAMESIZE_SVGA; + config.fb_location = CAMERA_FB_IN_DRAM; + } + + // camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + return; + } + + sensor_t * s = esp_camera_sensor_get(); + // initial sensors are flipped vertically and colors are a bit saturated + s->set_vflip(s, 1); // flip it back + s->set_brightness(s, 1); // up the brightness just a bit + s->set_saturation(s, 0); // lower the saturation + + WiFi.begin(ssid, password); + WiFi.setSleep(false); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + while (WiFi.STA.hasIP() != true) { + Serial.print("."); + delay(500); + } + Serial.println(""); + Serial.println("WiFi connected"); + + startCameraServer(); + + Serial.print("Camera Ready! Use 'http://"); + Serial.print(WiFi.localIP()); + Serial.println("' to connect"); +} + +void loop() { + // Do nothing. Everything is done in another task by the web server + delay(10000); +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/app_httpd.cpp b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/app_httpd.cpp new file mode 100644 index 0000000..91a072d --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/app_httpd.cpp @@ -0,0 +1,1383 @@ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "esp_http_server.h" +#include "esp_timer.h" +#include "esp_camera.h" +#include "img_converters.h" +#include "fb_gfx.h" +#include "driver/ledc.h" +#include "sdkconfig.h" +#include "camera_index.h" + +#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) +#include "esp32-hal-log.h" +#define TAG "" +#else +#include "esp_log.h" +static const char *TAG = "camera_httpd"; +#endif + +// Face Detection will not work on boards without (or with disabled) PSRAM +#ifdef BOARD_HAS_PSRAM +#define CONFIG_ESP_FACE_DETECT_ENABLED 1 +// Face Recognition takes upward from 15 seconds per frame on chips other than ESP32S3 +// Makes no sense to have it enabled for them +#if CONFIG_IDF_TARGET_ESP32S3 +#define CONFIG_ESP_FACE_RECOGNITION_ENABLED 1 +#else +#define CONFIG_ESP_FACE_RECOGNITION_ENABLED 0 +#endif +#else +#define CONFIG_ESP_FACE_DETECT_ENABLED 0 +#define CONFIG_ESP_FACE_RECOGNITION_ENABLED 0 +#endif + +#if CONFIG_ESP_FACE_DETECT_ENABLED + +#include +#include "human_face_detect_msr01.hpp" +#include "human_face_detect_mnp01.hpp" + +#define TWO_STAGE 1 /* very large firmware, very slow, reboots when streaming... + +#define FACE_ID_SAVE_NUMBER 7 +#endif + +#define FACE_COLOR_WHITE 0x00FFFFFF +#define FACE_COLOR_BLACK 0x00000000 +#define FACE_COLOR_RED 0x000000FF +#define FACE_COLOR_GREEN 0x0000FF00 +#define FACE_COLOR_BLUE 0x00FF0000 +#define FACE_COLOR_YELLOW (FACE_COLOR_RED | FACE_COLOR_GREEN) +#define FACE_COLOR_CYAN (FACE_COLOR_BLUE | FACE_COLOR_GREEN) +#define FACE_COLOR_PURPLE (FACE_COLOR_BLUE | FACE_COLOR_RED) +#endif + +#ifdef CONFIG_LED_ILLUMINATOR_ENABLED +int led_duty = 0; +bool isStreaming = false; +#ifdef CONFIG_LED_LEDC_LOW_SPEED_MODE +#define CONFIG_LED_LEDC_SPEED_MODE LEDC_LOW_SPEED_MODE +#else +#define CONFIG_LED_LEDC_SPEED_MODE LEDC_HIGH_SPEED_MODE +#endif +#endif + +typedef struct +{ + httpd_req_t *req; + size_t len; +} jpg_chunking_t; + +#define PART_BOUNDARY "123456789000000000000987654321" +static const char *_STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY; +static const char *_STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n"; +static const char *_STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\nX-Timestamp: %d.%06d\r\n\r\n"; + +httpd_handle_t stream_httpd = NULL; +httpd_handle_t camera_httpd = NULL; + +#if CONFIG_ESP_FACE_DETECT_ENABLED + +static int8_t detection_enabled = 0; + +// #if TWO_STAGE +// static HumanFaceDetectMSR01 s1(0.1F, 0.5F, 10, 0.2F); +// static HumanFaceDetectMNP01 s2(0.5F, 0.3F, 5); +// #else +// static HumanFaceDetectMSR01 s1(0.3F, 0.5F, 10, 0.2F); +// #endif + +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED +static int8_t recognition_enabled = 0; +static int8_t is_enrolling = 0; + +#if QUANT_TYPE + // S16 model + FaceRecognition112V1S16 recognizer; +#else + // S8 model + FaceRecognition112V1S8 recognizer; +#endif +#endif + +#endif + +typedef struct +{ + size_t size; //number of values used for filtering + size_t index; //current value index + size_t count; //value count + int sum; + int *values; //array to be filled with values +} ra_filter_t; + +static ra_filter_t ra_filter; + +static ra_filter_t *ra_filter_init(ra_filter_t *filter, size_t sample_size) +{ + memset(filter, 0, sizeof(ra_filter_t)); + + filter->values = (int *)malloc(sample_size * sizeof(int)); + if (!filter->values) + { + return NULL; + } + memset(filter->values, 0, sample_size * sizeof(int)); + + filter->size = sample_size; + return filter; +} + +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO +static int ra_filter_run(ra_filter_t *filter, int value) +{ + if (!filter->values) + { + return value; + } + filter->sum -= filter->values[filter->index]; + filter->values[filter->index] = value; + filter->sum += filter->values[filter->index]; + filter->index++; + filter->index = filter->index % filter->size; + if (filter->count < filter->size) + { + filter->count++; + } + return filter->sum / filter->count; +} +#endif + +#if CONFIG_ESP_FACE_DETECT_ENABLED +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED +static void rgb_print(fb_data_t *fb, uint32_t color, const char *str) +{ + fb_gfx_print(fb, (fb->width - (strlen(str) * 14)) / 2, 10, color, str); +} + +static int rgb_printf(fb_data_t *fb, uint32_t color, const char *format, ...) +{ + char loc_buf[64]; + char *temp = loc_buf; + int len; + va_list arg; + va_list copy; + va_start(arg, format); + va_copy(copy, arg); + len = vsnprintf(loc_buf, sizeof(loc_buf), format, arg); + va_end(copy); + if (len >= sizeof(loc_buf)) + { + temp = (char *)malloc(len + 1); + if (temp == NULL) + { + return 0; + } + } + vsnprintf(temp, len + 1, format, arg); + va_end(arg); + rgb_print(fb, color, temp); + if (len > 64) + { + free(temp); + } + return len; +} +#endif +static void draw_face_boxes(fb_data_t *fb, std::list *results, int face_id) +{ + int x, y, w, h; + uint32_t color = FACE_COLOR_YELLOW; + if (face_id < 0) + { + color = FACE_COLOR_RED; + } + else if (face_id > 0) + { + color = FACE_COLOR_GREEN; + } + if(fb->bytes_per_pixel == 2){ + //color = ((color >> 8) & 0xF800) | ((color >> 3) & 0x07E0) | (color & 0x001F); + color = ((color >> 16) & 0x001F) | ((color >> 3) & 0x07E0) | ((color << 8) & 0xF800); + } + int i = 0; + for (std::list::iterator prediction = results->begin(); prediction != results->end(); prediction++, i++) + { + // rectangle box + x = (int)prediction->box[0]; + y = (int)prediction->box[1]; + w = (int)prediction->box[2] - x + 1; + h = (int)prediction->box[3] - y + 1; + if((x + w) > fb->width){ + w = fb->width - x; + } + if((y + h) > fb->height){ + h = fb->height - y; + } + fb_gfx_drawFastHLine(fb, x, y, w, color); + fb_gfx_drawFastHLine(fb, x, y + h - 1, w, color); + fb_gfx_drawFastVLine(fb, x, y, h, color); + fb_gfx_drawFastVLine(fb, x + w - 1, y, h, color); +#if TWO_STAGE + // landmarks (left eye, mouth left, nose, right eye, mouth right) + int x0, y0, j; + for (j = 0; j < 10; j+=2) { + x0 = (int)prediction->keypoint[j]; + y0 = (int)prediction->keypoint[j+1]; + fb_gfx_fillRect(fb, x0, y0, 3, 3, color); + } +#endif + } +} + +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED +static int run_face_recognition(fb_data_t *fb, std::list *results) +{ + std::vector landmarks = results->front().keypoint; + int id = -1; + + Tensor tensor; + tensor.set_element((uint8_t *)fb->data).set_shape({fb->height, fb->width, 3}).set_auto_free(false); + + int enrolled_count = recognizer.get_enrolled_id_num(); + + if (enrolled_count < FACE_ID_SAVE_NUMBER && is_enrolling){ + id = recognizer.enroll_id(tensor, landmarks, "", true); + ESP_LOGI(TAG, "Enrolled ID: %d", id); + rgb_printf(fb, FACE_COLOR_CYAN, "ID[%u]", id); + } + + face_info_t recognize = recognizer.recognize(tensor, landmarks); + if(recognize.id >= 0){ + rgb_printf(fb, FACE_COLOR_GREEN, "ID[%u]: %.2f", recognize.id, recognize.similarity); + } else { + rgb_print(fb, FACE_COLOR_RED, "Intruder Alert!"); + } + return recognize.id; +} +#endif +#endif + +#ifdef CONFIG_LED_ILLUMINATOR_ENABLED +void enable_led(bool en) +{ // Turn LED On or Off + int duty = en ? led_duty : 0; + if (en && isStreaming && (led_duty > CONFIG_LED_MAX_INTENSITY)) + { + duty = CONFIG_LED_MAX_INTENSITY; + } + ledc_set_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL, duty); + ledc_update_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL); + ESP_LOGI(TAG, "Set LED intensity to %d", duty); +} +#endif + +static esp_err_t bmp_handler(httpd_req_t *req) +{ + camera_fb_t *fb = NULL; + esp_err_t res = ESP_OK; +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + uint64_t fr_start = esp_timer_get_time(); +#endif + fb = esp_camera_fb_get(); + if (!fb) + { + ESP_LOGE(TAG, "Camera capture failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } + + httpd_resp_set_type(req, "image/x-windows-bmp"); + httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.bmp"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + + char ts[32]; + snprintf(ts, 32, "%ld.%06ld", fb->timestamp.tv_sec, fb->timestamp.tv_usec); + httpd_resp_set_hdr(req, "X-Timestamp", (const char *)ts); + + + uint8_t * buf = NULL; + size_t buf_len = 0; + bool converted = frame2bmp(fb, &buf, &buf_len); + esp_camera_fb_return(fb); + if(!converted){ + ESP_LOGE(TAG, "BMP Conversion failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } + res = httpd_resp_send(req, (const char *)buf, buf_len); + free(buf); +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + uint64_t fr_end = esp_timer_get_time(); +#endif + ESP_LOGI(TAG, "BMP: %llums, %uB", (uint64_t)((fr_end - fr_start) / 1000), buf_len); + return res; +} + +static size_t jpg_encode_stream(void *arg, size_t index, const void *data, size_t len) +{ + jpg_chunking_t *j = (jpg_chunking_t *)arg; + if (!index) + { + j->len = 0; + } + if (httpd_resp_send_chunk(j->req, (const char *)data, len) != ESP_OK) + { + return 0; + } + j->len += len; + return len; +} + +static esp_err_t capture_handler(httpd_req_t *req) +{ + camera_fb_t *fb = NULL; + esp_err_t res = ESP_OK; +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + int64_t fr_start = esp_timer_get_time(); +#endif + +#ifdef CONFIG_LED_ILLUMINATOR_ENABLED + enable_led(true); + vTaskDelay(150 / portTICK_PERIOD_MS); // The LED needs to be turned on ~150ms before the call to esp_camera_fb_get() + fb = esp_camera_fb_get(); // or it won't be visible in the frame. A better way to do this is needed. + enable_led(false); +#else + fb = esp_camera_fb_get(); +#endif + + if (!fb) + { + ESP_LOGE(TAG, "Camera capture failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } + + httpd_resp_set_type(req, "image/jpeg"); + httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + + char ts[32]; + snprintf(ts, 32, "%ld.%06ld", fb->timestamp.tv_sec, fb->timestamp.tv_usec); + httpd_resp_set_hdr(req, "X-Timestamp", (const char *)ts); + +#if CONFIG_ESP_FACE_DETECT_ENABLED + size_t out_len, out_width, out_height; + uint8_t *out_buf; + bool s; +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + bool detected = false; +#endif + int face_id = 0; + if (!detection_enabled || fb->width > 400) + { +#endif +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + size_t fb_len = 0; +#endif + if (fb->format == PIXFORMAT_JPEG) + { +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fb_len = fb->len; +#endif + res = httpd_resp_send(req, (const char *)fb->buf, fb->len); + } + else + { + jpg_chunking_t jchunk = {req, 0}; + res = frame2jpg_cb(fb, 80, jpg_encode_stream, &jchunk) ? ESP_OK : ESP_FAIL; + httpd_resp_send_chunk(req, NULL, 0); +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fb_len = jchunk.len; +#endif + } + esp_camera_fb_return(fb); +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + int64_t fr_end = esp_timer_get_time(); +#endif + ESP_LOGI(TAG, "JPG: %uB %ums", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start) / 1000)); + return res; +#if CONFIG_ESP_FACE_DETECT_ENABLED + } + + jpg_chunking_t jchunk = {req, 0}; + + if (fb->format == PIXFORMAT_RGB565 +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + && !recognition_enabled +#endif + ){ +#if TWO_STAGE + HumanFaceDetectMSR01 s1(0.1F, 0.5F, 10, 0.2F); + HumanFaceDetectMNP01 s2(0.5F, 0.3F, 5); + std::list &candidates = s1.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3}); + std::list &results = s2.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3}, candidates); +#else + HumanFaceDetectMSR01 s1(0.3F, 0.5F, 10, 0.2F); + std::list &results = s1.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3}); +#endif + if (results.size() > 0) { + fb_data_t rfb; + rfb.width = fb->width; + rfb.height = fb->height; + rfb.data = fb->buf; + rfb.bytes_per_pixel = 2; + rfb.format = FB_RGB565; +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + detected = true; +#endif + draw_face_boxes(&rfb, &results, face_id); + } + s = fmt2jpg_cb(fb->buf, fb->len, fb->width, fb->height, PIXFORMAT_RGB565, 90, jpg_encode_stream, &jchunk); + esp_camera_fb_return(fb); + } else + { + out_len = fb->width * fb->height * 3; + out_width = fb->width; + out_height = fb->height; + out_buf = (uint8_t*)malloc(out_len); + if (!out_buf) { + ESP_LOGE(TAG, "out_buf malloc failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } + s = fmt2rgb888(fb->buf, fb->len, fb->format, out_buf); + esp_camera_fb_return(fb); + if (!s) { + free(out_buf); + ESP_LOGE(TAG, "to rgb888 failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } + + fb_data_t rfb; + rfb.width = out_width; + rfb.height = out_height; + rfb.data = out_buf; + rfb.bytes_per_pixel = 3; + rfb.format = FB_BGR888; + +#if TWO_STAGE + HumanFaceDetectMSR01 s1(0.1F, 0.5F, 10, 0.2F); + HumanFaceDetectMNP01 s2(0.5F, 0.3F, 5); + std::list &candidates = s1.infer((uint8_t *)out_buf, {(int)out_height, (int)out_width, 3}); + std::list &results = s2.infer((uint8_t *)out_buf, {(int)out_height, (int)out_width, 3}, candidates); +#else + HumanFaceDetectMSR01 s1(0.3F, 0.5F, 10, 0.2F); + std::list &results = s1.infer((uint8_t *)out_buf, {(int)out_height, (int)out_width, 3}); +#endif + + if (results.size() > 0) { +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + detected = true; +#endif +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + if (recognition_enabled) { + face_id = run_face_recognition(&rfb, &results); + } +#endif + draw_face_boxes(&rfb, &results, face_id); + } + + s = fmt2jpg_cb(out_buf, out_len, out_width, out_height, PIXFORMAT_RGB888, 90, jpg_encode_stream, &jchunk); + free(out_buf); + } + + if (!s) { + ESP_LOGE(TAG, "JPEG compression failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + int64_t fr_end = esp_timer_get_time(); +#endif + ESP_LOGI(TAG, "FACE: %uB %ums %s%d", (uint32_t)(jchunk.len), (uint32_t)((fr_end - fr_start) / 1000), detected ? "DETECTED " : "", face_id); + return res; +#endif +} + +static esp_err_t stream_handler(httpd_req_t *req) +{ + camera_fb_t *fb = NULL; + struct timeval _timestamp; + esp_err_t res = ESP_OK; + size_t _jpg_buf_len = 0; + uint8_t *_jpg_buf = NULL; + char *part_buf[128]; +#if CONFIG_ESP_FACE_DETECT_ENABLED + #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + bool detected = false; + int64_t fr_ready = 0; + int64_t fr_recognize = 0; + int64_t fr_encode = 0; + int64_t fr_face = 0; + int64_t fr_start = 0; + #endif + int face_id = 0; + size_t out_len = 0, out_width = 0, out_height = 0; + uint8_t *out_buf = NULL; + bool s = false; +#if TWO_STAGE + HumanFaceDetectMSR01 s1(0.1F, 0.5F, 10, 0.2F); + HumanFaceDetectMNP01 s2(0.5F, 0.3F, 5); +#else + HumanFaceDetectMSR01 s1(0.3F, 0.5F, 10, 0.2F); +#endif +#endif + + static int64_t last_frame = 0; + if (!last_frame) + { + last_frame = esp_timer_get_time(); + } + + res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); + if (res != ESP_OK) + { + return res; + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + httpd_resp_set_hdr(req, "X-Framerate", "60"); + +#ifdef CONFIG_LED_ILLUMINATOR_ENABLED + enable_led(true); + isStreaming = true; +#endif + + while (true) + { +#if CONFIG_ESP_FACE_DETECT_ENABLED + #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + detected = false; + #endif + face_id = 0; +#endif + + fb = esp_camera_fb_get(); + if (!fb) + { + ESP_LOGE(TAG, "Camera capture failed"); + res = ESP_FAIL; + } + else + { + _timestamp.tv_sec = fb->timestamp.tv_sec; + _timestamp.tv_usec = fb->timestamp.tv_usec; +#if CONFIG_ESP_FACE_DETECT_ENABLED + #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_start = esp_timer_get_time(); + fr_ready = fr_start; + fr_encode = fr_start; + fr_recognize = fr_start; + fr_face = fr_start; + #endif + if (!detection_enabled || fb->width > 400) + { +#endif + if (fb->format != PIXFORMAT_JPEG) + { + bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); + esp_camera_fb_return(fb); + fb = NULL; + if (!jpeg_converted) + { + ESP_LOGE(TAG, "JPEG compression failed"); + res = ESP_FAIL; + } + } + else + { + _jpg_buf_len = fb->len; + _jpg_buf = fb->buf; + } +#if CONFIG_ESP_FACE_DETECT_ENABLED + } + else + { + if (fb->format == PIXFORMAT_RGB565 +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + && !recognition_enabled +#endif + ){ +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_ready = esp_timer_get_time(); +#endif +#if TWO_STAGE + std::list &candidates = s1.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3}); + std::list &results = s2.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3}, candidates); +#else + std::list &results = s1.infer((uint16_t *)fb->buf, {(int)fb->height, (int)fb->width, 3}); +#endif +#if CONFIG_ESP_FACE_DETECT_ENABLED && ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_face = esp_timer_get_time(); + fr_recognize = fr_face; +#endif + if (results.size() > 0) { + fb_data_t rfb; + rfb.width = fb->width; + rfb.height = fb->height; + rfb.data = fb->buf; + rfb.bytes_per_pixel = 2; + rfb.format = FB_RGB565; +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + detected = true; +#endif + draw_face_boxes(&rfb, &results, face_id); + } + s = fmt2jpg(fb->buf, fb->len, fb->width, fb->height, PIXFORMAT_RGB565, 80, &_jpg_buf, &_jpg_buf_len); + esp_camera_fb_return(fb); + fb = NULL; + if (!s) { + ESP_LOGE(TAG, "fmt2jpg failed"); + res = ESP_FAIL; + } +#if CONFIG_ESP_FACE_DETECT_ENABLED && ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_encode = esp_timer_get_time(); +#endif + } else + { + out_len = fb->width * fb->height * 3; + out_width = fb->width; + out_height = fb->height; + out_buf = (uint8_t*)malloc(out_len); + if (!out_buf) { + ESP_LOGE(TAG, "out_buf malloc failed"); + res = ESP_FAIL; + } else { + s = fmt2rgb888(fb->buf, fb->len, fb->format, out_buf); + esp_camera_fb_return(fb); + fb = NULL; + if (!s) { + free(out_buf); + ESP_LOGE(TAG, "to rgb888 failed"); + res = ESP_FAIL; + } else { +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_ready = esp_timer_get_time(); +#endif + + fb_data_t rfb; + rfb.width = out_width; + rfb.height = out_height; + rfb.data = out_buf; + rfb.bytes_per_pixel = 3; + rfb.format = FB_BGR888; + +#if TWO_STAGE + std::list &candidates = s1.infer((uint8_t *)out_buf, {(int)out_height, (int)out_width, 3}); + std::list &results = s2.infer((uint8_t *)out_buf, {(int)out_height, (int)out_width, 3}, candidates); +#else + std::list &results = s1.infer((uint8_t *)out_buf, {(int)out_height, (int)out_width, 3}); +#endif + +#if CONFIG_ESP_FACE_DETECT_ENABLED && ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_face = esp_timer_get_time(); + fr_recognize = fr_face; +#endif + + if (results.size() > 0) { +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + detected = true; +#endif +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + if (recognition_enabled) { + face_id = run_face_recognition(&rfb, &results); + #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_recognize = esp_timer_get_time(); + #endif + } +#endif + draw_face_boxes(&rfb, &results, face_id); + } + s = fmt2jpg(out_buf, out_len, out_width, out_height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len); + free(out_buf); + if (!s) { + ESP_LOGE(TAG, "fmt2jpg failed"); + res = ESP_FAIL; + } +#if CONFIG_ESP_FACE_DETECT_ENABLED && ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + fr_encode = esp_timer_get_time(); +#endif + } + } + } + } +#endif + } + if (res == ESP_OK) + { + res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); + } + if (res == ESP_OK) + { + size_t hlen = snprintf((char *)part_buf, 128, _STREAM_PART, _jpg_buf_len, _timestamp.tv_sec, _timestamp.tv_usec); + res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); + } + if (res == ESP_OK) + { + res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); + } + if (fb) + { + esp_camera_fb_return(fb); + fb = NULL; + _jpg_buf = NULL; + } + else if (_jpg_buf) + { + free(_jpg_buf); + _jpg_buf = NULL; + } + if (res != ESP_OK) + { + ESP_LOGE(TAG, "send frame failed failed"); + break; + } + int64_t fr_end = esp_timer_get_time(); + +#if CONFIG_ESP_FACE_DETECT_ENABLED && ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + int64_t ready_time = (fr_ready - fr_start) / 1000; + int64_t face_time = (fr_face - fr_ready) / 1000; + int64_t recognize_time = (fr_recognize - fr_face) / 1000; + int64_t encode_time = (fr_encode - fr_recognize) / 1000; + int64_t process_time = (fr_encode - fr_start) / 1000; +#endif + + int64_t frame_time = fr_end - last_frame; + frame_time /= 1000; +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO + uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time); +#endif + ESP_LOGI(TAG, "MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps)" +#if CONFIG_ESP_FACE_DETECT_ENABLED + ", %u+%u+%u+%u=%u %s%d" +#endif + , + (uint32_t)(_jpg_buf_len), + (uint32_t)frame_time, 1000.0 / (uint32_t)frame_time, + avg_frame_time, 1000.0 / avg_frame_time +#if CONFIG_ESP_FACE_DETECT_ENABLED + , + (uint32_t)ready_time, (uint32_t)face_time, (uint32_t)recognize_time, (uint32_t)encode_time, (uint32_t)process_time, + (detected) ? "DETECTED " : "", face_id +#endif + ); + } + +#ifdef CONFIG_LED_ILLUMINATOR_ENABLED + isStreaming = false; + enable_led(false); +#endif + + return res; +} + +static esp_err_t parse_get(httpd_req_t *req, char **obuf) +{ + char *buf = NULL; + size_t buf_len = 0; + + buf_len = httpd_req_get_url_query_len(req) + 1; + if (buf_len > 1) { + buf = (char *)malloc(buf_len); + if (!buf) { + httpd_resp_send_500(req); + return ESP_FAIL; + } + if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { + *obuf = buf; + return ESP_OK; + } + free(buf); + } + httpd_resp_send_404(req); + return ESP_FAIL; +} + +static esp_err_t cmd_handler(httpd_req_t *req) +{ + char *buf = NULL; + char variable[32]; + char value[32]; + + if (parse_get(req, &buf) != ESP_OK) { + return ESP_FAIL; + } + if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) != ESP_OK || + httpd_query_key_value(buf, "val", value, sizeof(value)) != ESP_OK) { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + + int val = atoi(value); + ESP_LOGI(TAG, "%s = %d", variable, val); + sensor_t *s = esp_camera_sensor_get(); + int res = 0; + + if (!strcmp(variable, "framesize")) { + if (s->pixformat == PIXFORMAT_JPEG) { + res = s->set_framesize(s, (framesize_t)val); + } + } + else if (!strcmp(variable, "quality")) + res = s->set_quality(s, val); + else if (!strcmp(variable, "contrast")) + res = s->set_contrast(s, val); + else if (!strcmp(variable, "brightness")) + res = s->set_brightness(s, val); + else if (!strcmp(variable, "saturation")) + res = s->set_saturation(s, val); + else if (!strcmp(variable, "gainceiling")) + res = s->set_gainceiling(s, (gainceiling_t)val); + else if (!strcmp(variable, "colorbar")) + res = s->set_colorbar(s, val); + else if (!strcmp(variable, "awb")) + res = s->set_whitebal(s, val); + else if (!strcmp(variable, "agc")) + res = s->set_gain_ctrl(s, val); + else if (!strcmp(variable, "aec")) + res = s->set_exposure_ctrl(s, val); + else if (!strcmp(variable, "hmirror")) + res = s->set_hmirror(s, val); + else if (!strcmp(variable, "vflip")) + res = s->set_vflip(s, val); + else if (!strcmp(variable, "awb_gain")) + res = s->set_awb_gain(s, val); + else if (!strcmp(variable, "agc_gain")) + res = s->set_agc_gain(s, val); + else if (!strcmp(variable, "aec_value")) + res = s->set_aec_value(s, val); + else if (!strcmp(variable, "aec2")) + res = s->set_aec2(s, val); + else if (!strcmp(variable, "dcw")) + res = s->set_dcw(s, val); + else if (!strcmp(variable, "bpc")) + res = s->set_bpc(s, val); + else if (!strcmp(variable, "wpc")) + res = s->set_wpc(s, val); + else if (!strcmp(variable, "raw_gma")) + res = s->set_raw_gma(s, val); + else if (!strcmp(variable, "lenc")) + res = s->set_lenc(s, val); + else if (!strcmp(variable, "special_effect")) + res = s->set_special_effect(s, val); + else if (!strcmp(variable, "wb_mode")) + res = s->set_wb_mode(s, val); + else if (!strcmp(variable, "ae_level")) + res = s->set_ae_level(s, val); +#ifdef CONFIG_LED_ILLUMINATOR_ENABLED + else if (!strcmp(variable, "led_intensity")) { + led_duty = val; + if (isStreaming) + enable_led(true); + } +#endif + +#if CONFIG_ESP_FACE_DETECT_ENABLED + else if (!strcmp(variable, "face_detect")) { + detection_enabled = val; +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + if (!detection_enabled) { + recognition_enabled = 0; + } +#endif + } +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + else if (!strcmp(variable, "face_enroll")){ + is_enrolling = !is_enrolling; + ESP_LOGI(TAG, "Enrolling: %s", is_enrolling?"true":"false"); + } + else if (!strcmp(variable, "face_recognize")) { + recognition_enabled = val; + if (recognition_enabled) { + detection_enabled = val; + } + } +#endif +#endif + else { + ESP_LOGI(TAG, "Unknown command: %s", variable); + res = -1; + } + + if (res < 0) { + return httpd_resp_send_500(req); + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); +} + +static int print_reg(char * p, sensor_t * s, uint16_t reg, uint32_t mask){ + return sprintf(p, "\"0x%x\":%u,", reg, s->get_reg(s, reg, mask)); +} + +static esp_err_t status_handler(httpd_req_t *req) +{ + static char json_response[1024]; + + sensor_t *s = esp_camera_sensor_get(); + char *p = json_response; + *p++ = '{'; + + if(s->id.PID == OV5640_PID || s->id.PID == OV3660_PID){ + for(int reg = 0x3400; reg < 0x3406; reg+=2){ + p+=print_reg(p, s, reg, 0xFFF);//12 bit + } + p+=print_reg(p, s, 0x3406, 0xFF); + + p+=print_reg(p, s, 0x3500, 0xFFFF0);//16 bit + p+=print_reg(p, s, 0x3503, 0xFF); + p+=print_reg(p, s, 0x350a, 0x3FF);//10 bit + p+=print_reg(p, s, 0x350c, 0xFFFF);//16 bit + + for(int reg = 0x5480; reg <= 0x5490; reg++){ + p+=print_reg(p, s, reg, 0xFF); + } + + for(int reg = 0x5380; reg <= 0x538b; reg++){ + p+=print_reg(p, s, reg, 0xFF); + } + + for(int reg = 0x5580; reg < 0x558a; reg++){ + p+=print_reg(p, s, reg, 0xFF); + } + p+=print_reg(p, s, 0x558a, 0x1FF);//9 bit + } else if(s->id.PID == OV2640_PID){ + p+=print_reg(p, s, 0xd3, 0xFF); + p+=print_reg(p, s, 0x111, 0xFF); + p+=print_reg(p, s, 0x132, 0xFF); + } + + p += sprintf(p, "\"xclk\":%u,", s->xclk_freq_hz / 1000000); + p += sprintf(p, "\"pixformat\":%u,", s->pixformat); + p += sprintf(p, "\"framesize\":%u,", s->status.framesize); + p += sprintf(p, "\"quality\":%u,", s->status.quality); + p += sprintf(p, "\"brightness\":%d,", s->status.brightness); + p += sprintf(p, "\"contrast\":%d,", s->status.contrast); + p += sprintf(p, "\"saturation\":%d,", s->status.saturation); + p += sprintf(p, "\"sharpness\":%d,", s->status.sharpness); + p += sprintf(p, "\"special_effect\":%u,", s->status.special_effect); + p += sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); + p += sprintf(p, "\"awb\":%u,", s->status.awb); + p += sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); + p += sprintf(p, "\"aec\":%u,", s->status.aec); + p += sprintf(p, "\"aec2\":%u,", s->status.aec2); + p += sprintf(p, "\"ae_level\":%d,", s->status.ae_level); + p += sprintf(p, "\"aec_value\":%u,", s->status.aec_value); + p += sprintf(p, "\"agc\":%u,", s->status.agc); + p += sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); + p += sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); + p += sprintf(p, "\"bpc\":%u,", s->status.bpc); + p += sprintf(p, "\"wpc\":%u,", s->status.wpc); + p += sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); + p += sprintf(p, "\"lenc\":%u,", s->status.lenc); + p += sprintf(p, "\"hmirror\":%u,", s->status.hmirror); + p += sprintf(p, "\"dcw\":%u,", s->status.dcw); + p += sprintf(p, "\"colorbar\":%u", s->status.colorbar); +#ifdef CONFIG_LED_ILLUMINATOR_ENABLED + p += sprintf(p, ",\"led_intensity\":%u", led_duty); +#else + p += sprintf(p, ",\"led_intensity\":%d", -1); +#endif +#if CONFIG_ESP_FACE_DETECT_ENABLED + p += sprintf(p, ",\"face_detect\":%u", detection_enabled); +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + p += sprintf(p, ",\"face_enroll\":%u,", is_enrolling); + p += sprintf(p, "\"face_recognize\":%u", recognition_enabled); +#endif +#endif + *p++ = '}'; + *p++ = 0; + httpd_resp_set_type(req, "application/json"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, json_response, strlen(json_response)); +} + +static esp_err_t xclk_handler(httpd_req_t *req) +{ + char *buf = NULL; + char _xclk[32]; + + if (parse_get(req, &buf) != ESP_OK) { + return ESP_FAIL; + } + if (httpd_query_key_value(buf, "xclk", _xclk, sizeof(_xclk)) != ESP_OK) { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + + int xclk = atoi(_xclk); + ESP_LOGI(TAG, "Set XCLK: %d MHz", xclk); + + sensor_t *s = esp_camera_sensor_get(); + int res = s->set_xclk(s, LEDC_TIMER_0, xclk); + if (res) { + return httpd_resp_send_500(req); + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); +} + +static esp_err_t reg_handler(httpd_req_t *req) +{ + char *buf = NULL; + char _reg[32]; + char _mask[32]; + char _val[32]; + + if (parse_get(req, &buf) != ESP_OK) { + return ESP_FAIL; + } + if (httpd_query_key_value(buf, "reg", _reg, sizeof(_reg)) != ESP_OK || + httpd_query_key_value(buf, "mask", _mask, sizeof(_mask)) != ESP_OK || + httpd_query_key_value(buf, "val", _val, sizeof(_val)) != ESP_OK) { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + + int reg = atoi(_reg); + int mask = atoi(_mask); + int val = atoi(_val); + ESP_LOGI(TAG, "Set Register: reg: 0x%02x, mask: 0x%02x, value: 0x%02x", reg, mask, val); + + sensor_t *s = esp_camera_sensor_get(); + int res = s->set_reg(s, reg, mask, val); + if (res) { + return httpd_resp_send_500(req); + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); +} + +static esp_err_t greg_handler(httpd_req_t *req) +{ + char *buf = NULL; + char _reg[32]; + char _mask[32]; + + if (parse_get(req, &buf) != ESP_OK) { + return ESP_FAIL; + } + if (httpd_query_key_value(buf, "reg", _reg, sizeof(_reg)) != ESP_OK || + httpd_query_key_value(buf, "mask", _mask, sizeof(_mask)) != ESP_OK) { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + + int reg = atoi(_reg); + int mask = atoi(_mask); + sensor_t *s = esp_camera_sensor_get(); + int res = s->get_reg(s, reg, mask); + if (res < 0) { + return httpd_resp_send_500(req); + } + ESP_LOGI(TAG, "Get Register: reg: 0x%02x, mask: 0x%02x, value: 0x%02x", reg, mask, res); + + char buffer[20]; + const char * val = itoa(res, buffer, 10); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, val, strlen(val)); +} + +static int parse_get_var(char *buf, const char * key, int def) +{ + char _int[16]; + if(httpd_query_key_value(buf, key, _int, sizeof(_int)) != ESP_OK){ + return def; + } + return atoi(_int); +} + +static esp_err_t pll_handler(httpd_req_t *req) +{ + char *buf = NULL; + + if (parse_get(req, &buf) != ESP_OK) { + return ESP_FAIL; + } + + int bypass = parse_get_var(buf, "bypass", 0); + int mul = parse_get_var(buf, "mul", 0); + int sys = parse_get_var(buf, "sys", 0); + int root = parse_get_var(buf, "root", 0); + int pre = parse_get_var(buf, "pre", 0); + int seld5 = parse_get_var(buf, "seld5", 0); + int pclken = parse_get_var(buf, "pclken", 0); + int pclk = parse_get_var(buf, "pclk", 0); + free(buf); + + ESP_LOGI(TAG, "Set Pll: bypass: %d, mul: %d, sys: %d, root: %d, pre: %d, seld5: %d, pclken: %d, pclk: %d", bypass, mul, sys, root, pre, seld5, pclken, pclk); + sensor_t *s = esp_camera_sensor_get(); + int res = s->set_pll(s, bypass, mul, sys, root, pre, seld5, pclken, pclk); + if (res) { + return httpd_resp_send_500(req); + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); +} + +static esp_err_t win_handler(httpd_req_t *req) +{ + char *buf = NULL; + + if (parse_get(req, &buf) != ESP_OK) { + return ESP_FAIL; + } + + int startX = parse_get_var(buf, "sx", 0); + int startY = parse_get_var(buf, "sy", 0); + int endX = parse_get_var(buf, "ex", 0); + int endY = parse_get_var(buf, "ey", 0); + int offsetX = parse_get_var(buf, "offx", 0); + int offsetY = parse_get_var(buf, "offy", 0); + int totalX = parse_get_var(buf, "tx", 0); + int totalY = parse_get_var(buf, "ty", 0); + int outputX = parse_get_var(buf, "ox", 0); + int outputY = parse_get_var(buf, "oy", 0); + bool scale = parse_get_var(buf, "scale", 0) == 1; + bool binning = parse_get_var(buf, "binning", 0) == 1; + free(buf); + + ESP_LOGI(TAG, "Set Window: Start: %d %d, End: %d %d, Offset: %d %d, Total: %d %d, Output: %d %d, Scale: %u, Binning: %u", startX, startY, endX, endY, offsetX, offsetY, totalX, totalY, outputX, outputY, scale, binning); + sensor_t *s = esp_camera_sensor_get(); + int res = s->set_res_raw(s, startX, startY, endX, endY, offsetX, offsetY, totalX, totalY, outputX, outputY, scale, binning); + if (res) { + return httpd_resp_send_500(req); + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); +} + +static esp_err_t index_handler(httpd_req_t *req) +{ + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "gzip"); + sensor_t *s = esp_camera_sensor_get(); + if (s != NULL) { + if (s->id.PID == OV3660_PID) { + return httpd_resp_send(req, (const char *)index_ov3660_html_gz, index_ov3660_html_gz_len); + } else if (s->id.PID == OV5640_PID) { + return httpd_resp_send(req, (const char *)index_ov5640_html_gz, index_ov5640_html_gz_len); + } else { + return httpd_resp_send(req, (const char *)index_ov2640_html_gz, index_ov2640_html_gz_len); + } + } else { + ESP_LOGE(TAG, "Camera sensor not found"); + return httpd_resp_send_500(req); + } +} + +void startCameraServer() +{ + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + config.max_uri_handlers = 16; + + httpd_uri_t index_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = index_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t status_uri = { + .uri = "/status", + .method = HTTP_GET, + .handler = status_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t cmd_uri = { + .uri = "/control", + .method = HTTP_GET, + .handler = cmd_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t capture_uri = { + .uri = "/capture", + .method = HTTP_GET, + .handler = capture_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t stream_uri = { + .uri = "/stream", + .method = HTTP_GET, + .handler = stream_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t bmp_uri = { + .uri = "/bmp", + .method = HTTP_GET, + .handler = bmp_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t xclk_uri = { + .uri = "/xclk", + .method = HTTP_GET, + .handler = xclk_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t reg_uri = { + .uri = "/reg", + .method = HTTP_GET, + .handler = reg_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t greg_uri = { + .uri = "/greg", + .method = HTTP_GET, + .handler = greg_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t pll_uri = { + .uri = "/pll", + .method = HTTP_GET, + .handler = pll_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + httpd_uri_t win_uri = { + .uri = "/resolution", + .method = HTTP_GET, + .handler = win_handler, + .user_ctx = NULL +#ifdef CONFIG_HTTPD_WS_SUPPORT + , + .is_websocket = true, + .handle_ws_control_frames = false, + .supported_subprotocol = NULL +#endif + }; + + ra_filter_init(&ra_filter, 20); + +#if CONFIG_ESP_FACE_RECOGNITION_ENABLED + recognizer.set_partition(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "fr"); + + // load ids from flash partition + recognizer.set_ids_from_flash(); +#endif + ESP_LOGI(TAG, "Starting web server on port: '%d'", config.server_port); + if (httpd_start(&camera_httpd, &config) == ESP_OK) + { + httpd_register_uri_handler(camera_httpd, &index_uri); + httpd_register_uri_handler(camera_httpd, &cmd_uri); + httpd_register_uri_handler(camera_httpd, &status_uri); + httpd_register_uri_handler(camera_httpd, &capture_uri); + httpd_register_uri_handler(camera_httpd, &bmp_uri); + + httpd_register_uri_handler(camera_httpd, &xclk_uri); + httpd_register_uri_handler(camera_httpd, ®_uri); + httpd_register_uri_handler(camera_httpd, &greg_uri); + httpd_register_uri_handler(camera_httpd, &pll_uri); + httpd_register_uri_handler(camera_httpd, &win_uri); + } + + config.server_port += 1; + config.ctrl_port += 1; + ESP_LOGI(TAG, "Starting stream server on port: '%d'", config.server_port); + if (httpd_start(&stream_httpd, &config) == ESP_OK) + { + httpd_register_uri_handler(stream_httpd, &stream_uri); + } +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/camera_index.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/camera_index.h new file mode 100644 index 0000000..fa42e69 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/camera_index.h @@ -0,0 +1,1571 @@ + + +//File: index_ov2640.html.gz, Size: 6787 +#define index_ov2640_html_gz_len 6787 +const uint8_t index_ov2640_html_gz[] = { + 0x1F, 0x8B, 0x08, 0x08, 0x23, 0xFC, 0x69, 0x5E, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, + 0x6F, 0x76, 0x32, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xED, 0x3D, 0x6B, 0x73, + 0xDB, 0x46, 0x92, 0xDF, 0xFD, 0x2B, 0x60, 0x24, 0x6B, 0x92, 0x25, 0x92, 0x22, 0x29, 0x4A, 0x96, + 0x15, 0x89, 0x3E, 0x5B, 0x96, 0x1F, 0xB5, 0x76, 0xE2, 0xB5, 0x12, 0xC7, 0x5B, 0xA9, 0x2D, 0x07, + 0x04, 0x86, 0x24, 0x62, 0x10, 0xE0, 0x02, 0xA0, 0x48, 0x26, 0xA5, 0xDF, 0x71, 0x3F, 0xE8, 0xFE, + 0xD8, 0x75, 0xCF, 0x03, 0x18, 0x00, 0x83, 0x07, 0x49, 0x89, 0xF4, 0xFA, 0x8E, 0x4E, 0x45, 0x78, + 0x4C, 0xF7, 0xF4, 0xBB, 0x7B, 0x66, 0x30, 0xC0, 0xF9, 0x43, 0xCB, 0x33, 0xC3, 0xD5, 0x8C, 0x68, + 0x93, 0x70, 0xEA, 0x0C, 0x1E, 0x9C, 0xB3, 0x3F, 0x1A, 0xFC, 0xCE, 0x27, 0xC4, 0xB0, 0xD8, 0x21, + 0x3D, 0x9D, 0x92, 0xD0, 0xD0, 0xCC, 0x89, 0xE1, 0x07, 0x24, 0xBC, 0xD0, 0xE7, 0xE1, 0xA8, 0x75, + 0xAA, 0xA7, 0x6F, 0xBB, 0xC6, 0x94, 0x5C, 0xE8, 0x37, 0x36, 0x59, 0xCC, 0x3C, 0x3F, 0xD4, 0x35, + 0xD3, 0x73, 0x43, 0xE2, 0x42, 0xF3, 0x85, 0x6D, 0x85, 0x93, 0x0B, 0x8B, 0xDC, 0xD8, 0x26, 0x69, + 0xD1, 0x93, 0xA6, 0xED, 0xDA, 0xA1, 0x6D, 0x38, 0xAD, 0xC0, 0x34, 0x1C, 0x72, 0xD1, 0x95, 0x71, + 0x85, 0x76, 0xE8, 0x90, 0xC1, 0xD5, 0xF5, 0xFB, 0xA3, 0x9E, 0xF6, 0xD3, 0xC7, 0x5E, 0xFF, 0xA4, + 0x73, 0x7E, 0xC8, 0xAE, 0xC5, 0x6D, 0x82, 0x70, 0x25, 0x9F, 0xE3, 0x6F, 0xE8, 0x59, 0x2B, 0xED, + 0xAF, 0xC4, 0x25, 0xFC, 0x8D, 0x80, 0x88, 0xD6, 0xC8, 0x98, 0xDA, 0xCE, 0xEA, 0x4C, 0x7B, 0xE6, + 0x43, 0x9F, 0xCD, 0xD7, 0xC4, 0xB9, 0x21, 0xA1, 0x6D, 0x1A, 0xCD, 0xC0, 0x70, 0x83, 0x56, 0x40, + 0x7C, 0x7B, 0xF4, 0x43, 0x06, 0x70, 0x68, 0x98, 0x5F, 0xC6, 0xBE, 0x37, 0x77, 0xAD, 0x33, 0xED, + 0xBB, 0xEE, 0x29, 0xFE, 0xCB, 0x36, 0x32, 0x3D, 0xC7, 0xF3, 0xE1, 0xFE, 0xD5, 0x4B, 0xFC, 0x97, + 0xBD, 0x4F, 0x7B, 0x0F, 0xEC, 0x3F, 0xC9, 0x99, 0xD6, 0x3D, 0x99, 0x2D, 0x13, 0xF7, 0x6F, 0x1F, + 0x24, 0x4E, 0x27, 0xBD, 0x3C, 0xEA, 0x39, 0xFC, 0x69, 0x31, 0x7C, 0x40, 0xCC, 0xD0, 0xF6, 0xDC, + 0xF6, 0xD4, 0xB0, 0x5D, 0x05, 0x26, 0xCB, 0x0E, 0x66, 0x8E, 0x01, 0x32, 0x18, 0x39, 0xA4, 0x10, + 0xCF, 0x77, 0x53, 0xE2, 0xCE, 0x9B, 0x25, 0xD8, 0x10, 0x49, 0xCB, 0xB2, 0x7D, 0xD6, 0xEA, 0x0C, + 0xE5, 0x30, 0x9F, 0xBA, 0xA5, 0x68, 0x8B, 0xE8, 0x72, 0x3D, 0x97, 0x28, 0x04, 0x88, 0x1D, 0x2D, + 0x7C, 0x63, 0x86, 0x0D, 0xF0, 0x6F, 0xB6, 0xC9, 0xD4, 0x76, 0x99, 0x51, 0x9D, 0x69, 0x47, 0xFD, + 0xCE, 0x6C, 0x59, 0xA2, 0xCA, 0xA3, 0x13, 0xFC, 0x97, 0x6D, 0x34, 0x33, 0x2C, 0xCB, 0x76, 0xC7, + 0x67, 0xDA, 0xA9, 0x12, 0x85, 0xE7, 0x5B, 0xC4, 0x6F, 0xF9, 0x86, 0x65, 0xCF, 0x83, 0x33, 0xAD, + 0xAF, 0x6A, 0x33, 0x35, 0xFC, 0x31, 0xD0, 0x12, 0x7A, 0x40, 0x6C, 0xAB, 0xAB, 0xA4, 0x84, 0x37, + 0xF1, 0xED, 0xF1, 0x24, 0x04, 0x95, 0x66, 0xDA, 0xA4, 0x85, 0xC6, 0x5D, 0xA8, 0x4C, 0x9F, 0x85, + 0x72, 0x53, 0x4B, 0xCD, 0x70, 0xEC, 0xB1, 0xDB, 0xB2, 0x43, 0x32, 0x05, 0x76, 0x82, 0xD0, 0x27, + 0xA1, 0x39, 0x29, 0x22, 0x65, 0x64, 0x8F, 0xE7, 0x3E, 0x51, 0x10, 0x12, 0xC9, 0xAD, 0x80, 0x61, + 0xB8, 0x99, 0xBD, 0xD5, 0x5A, 0x90, 0xE1, 0x17, 0x3B, 0x6C, 0x71, 0x99, 0x0C, 0xC9, 0xC8, 0xF3, + 0x89, 0xB2, 0xA5, 0x68, 0xE1, 0x78, 0xE6, 0x97, 0x56, 0x10, 0x1A, 0x7E, 0x58, 0x05, 0xA1, 0x31, + 0x0A, 0x89, 0x5F, 0x8E, 0x8F, 0xA0, 0x55, 0x94, 0x63, 0xCB, 0xEF, 0x96, 0x37, 0xB0, 0x5D, 0xC7, + 0x76, 0x49, 0x75, 0xF2, 0xF2, 0xFA, 0x4D, 0xA2, 0x63, 0xAD, 0x2A, 0x28, 0xC6, 0x9E, 0x8E, 0x8B, + 0xAC, 0x84, 0xF2, 0x9A, 0xED, 0x8C, 0xFB, 0x4D, 0xB7, 0xD3, 0xF9, 0x5B, 0xF6, 0xE6, 0x84, 0x30, + 0x33, 0x35, 0xE6, 0xA1, 0xB7, 0xBD, 0x47, 0x64, 0xDC, 0x2A, 0xC5, 0xC7, 0x7F, 0x4D, 0x89, 0x65, + 0x1B, 0x5A, 0x5D, 0x72, 0xE7, 0xD3, 0x0E, 0xD8, 0x54, 0x43, 0x33, 0x5C, 0x4B, 0xAB, 0x7B, 0xBE, + 0x0D, 0x8E, 0x60, 0xD0, 0x70, 0xE3, 0xC0, 0x15, 0x48, 0x1C, 0x33, 0xD2, 0x50, 0xB0, 0x5C, 0xE0, + 0x33, 0xB2, 0x44, 0xD4, 0x6E, 0x83, 0xBF, 0x0A, 0x21, 0x07, 0x7F, 0xA5, 0x0E, 0xA4, 0xE0, 0x91, + 0xA2, 0x2F, 0xD2, 0x97, 0x4C, 0x61, 0x9E, 0xCE, 0xF0, 0x37, 0x35, 0x96, 0xAD, 0x42, 0xDD, 0x89, + 0x46, 0x42, 0x87, 0x90, 0x66, 0xCD, 0x3A, 0x34, 0xBD, 0x99, 0x68, 0x2D, 0x0D, 0xA3, 0x64, 0x43, + 0x0D, 0xC3, 0x91, 0xAA, 0x55, 0x8E, 0x3F, 0xD9, 0x28, 0xD6, 0x60, 0x57, 0xCD, 0x6A, 0x1C, 0x3B, + 0xD8, 0x3F, 0x95, 0x0D, 0x31, 0x4E, 0x72, 0xA3, 0x08, 0xFE, 0xAA, 0x47, 0x92, 0x18, 0x59, 0x69, + 0x34, 0x51, 0x20, 0xCE, 0x8F, 0x28, 0x19, 0xBC, 0x79, 0xDE, 0xAD, 0xC0, 0x5A, 0x4C, 0x42, 0xD5, + 0xE8, 0xA2, 0x40, 0x5C, 0x44, 0x43, 0x69, 0x94, 0xC1, 0xDF, 0x6D, 0x85, 0x7A, 0xE3, 0xBB, 0xE1, + 0x3C, 0x0C, 0x3D, 0x37, 0xD8, 0x2A, 0x45, 0xE5, 0xF9, 0xD9, 0x1F, 0xF3, 0x20, 0xB4, 0x47, 0xAB, + 0x16, 0x77, 0x69, 0xF0, 0xB3, 0x99, 0x01, 0x25, 0xE4, 0x90, 0x84, 0x0B, 0x42, 0x8A, 0xCB, 0x0D, + 0xD7, 0xB8, 0x81, 0xB8, 0x33, 0x1E, 0x3B, 0x2A, 0xDB, 0x33, 0xE7, 0x7E, 0x80, 0x75, 0xDB, 0xCC, + 0xB3, 0x01, 0xB1, 0x9F, 0xED, 0x38, 0xE9, 0x83, 0x15, 0x3B, 0x6A, 0x99, 0x43, 0x45, 0x5F, 0xDE, + 0x3C, 0x44, 0x19, 0x2B, 0x35, 0xE1, 0x01, 0x3B, 0x76, 0xB8, 0x52, 0xDE, 0xE3, 0x9E, 0xA8, 0xB8, + 0x23, 0x5C, 0xB0, 0x30, 0x2D, 0x24, 0xE9, 0x3A, 0x33, 0x27, 0xC4, 0xFC, 0x42, 0xAC, 0x83, 0xD2, + 0x32, 0xAC, 0xAC, 0x3C, 0x6C, 0xDB, 0xEE, 0x6C, 0x1E, 0xB6, 0xB0, 0x9C, 0x9A, 0xDD, 0x8B, 0xCE, + 0xA9, 0x41, 0x0A, 0x16, 0x7B, 0xBD, 0xA2, 0xA2, 0xE2, 0x78, 0xB6, 0x2C, 0x16, 0x82, 0x4C, 0xEC, + 0xC0, 0x31, 0x86, 0xC4, 0x29, 0x22, 0x99, 0x3B, 0x43, 0x4E, 0xD8, 0xE5, 0xB1, 0x2A, 0xBF, 0x76, + 0xA3, 0x94, 0xC5, 0xC9, 0xAB, 0xFF, 0xF8, 0x6F, 0x95, 0xE5, 0x48, 0x8F, 0x9B, 0x89, 0x4B, 0x01, + 0x71, 0xC0, 0xC1, 0xF2, 0x4A, 0x6F, 0x68, 0xB3, 0x00, 0x1A, 0x0A, 0x3B, 0xF0, 0x0D, 0x77, 0x4C, + 0x20, 0x16, 0x2C, 0x9B, 0xE2, 0xB0, 0x78, 0x60, 0x50, 0x89, 0x7D, 0x0C, 0xD5, 0xC7, 0xC5, 0x03, + 0x11, 0x16, 0x10, 0x9A, 0x5A, 0x9B, 0x1D, 0x6C, 0x50, 0x95, 0x48, 0xFA, 0x2D, 0x24, 0xA4, 0xAB, + 0xB4, 0x0E, 0x56, 0x98, 0x28, 0x3D, 0x27, 0x69, 0x5B, 0xCA, 0x42, 0xBF, 0x34, 0x34, 0x88, 0x21, + 0xDF, 0x68, 0x54, 0x36, 0x68, 0x1C, 0x8D, 0x8E, 0x3A, 0x47, 0xFD, 0xD2, 0xCA, 0x49, 0xC9, 0x65, + 0x6A, 0xE0, 0xA8, 0x08, 0x1D, 0x51, 0x58, 0x29, 0x34, 0x82, 0xC0, 0xB8, 0x51, 0x16, 0xED, 0x5E, + 0x60, 0xB3, 0x91, 0x9B, 0x31, 0x0C, 0x60, 0xEC, 0x16, 0x2A, 0x86, 0x5E, 0xDC, 0xD0, 0x7B, 0x4A, + 0xFA, 0x68, 0x49, 0xA7, 0x74, 0x01, 0x21, 0x5E, 0x35, 0xD9, 0x09, 0x0D, 0xA8, 0x9B, 0x48, 0x0A, + 0x56, 0x16, 0x95, 0x21, 0x59, 0x86, 0x2D, 0x8B, 0x98, 0x9E, 0xCF, 0xAA, 0xC1, 0x9C, 0x91, 0x63, + 0x4A, 0x91, 0xE5, 0x16, 0x7B, 0x36, 0xF1, 0x6E, 0x88, 0xAF, 0x10, 0x56, 0x4A, 0xA9, 0xFD, 0x27, + 0x7D, 0xAB, 0x02, 0x36, 0x03, 0xD2, 0xA3, 0x52, 0xF6, 0x49, 0x74, 0xBD, 0xAE, 0xD9, 0x2B, 0xF4, + 0x63, 0x86, 0xAE, 0x0D, 0x3E, 0x63, 0x0C, 0x1D, 0x62, 0x15, 0x64, 0x33, 0x8B, 0x8C, 0x8C, 0xB9, + 0x13, 0x96, 0x58, 0xA5, 0xD1, 0xC1, 0x7F, 0x45, 0x3D, 0xD2, 0x30, 0xF4, 0x1B, 0xCE, 0x0B, 0x5D, + 0xD0, 0xC0, 0xF1, 0x2F, 0x45, 0x9F, 0xA2, 0xD4, 0x30, 0x66, 0x33, 0x62, 0x40, 0x2B, 0x93, 0xE4, + 0xE9, 0xA1, 0xD2, 0x10, 0x43, 0x1D, 0xE7, 0x2B, 0x8D, 0xDB, 0x4B, 0x1D, 0x36, 0x2A, 0x1E, 0xD7, + 0xE2, 0xF9, 0x6C, 0xE4, 0x99, 0x73, 0x55, 0x55, 0x53, 0xCD, 0xF1, 0xB2, 0xF8, 0xCE, 0x84, 0xC8, + 0x02, 0xC7, 0xA6, 0xEE, 0x3F, 0x77, 0x5D, 0xD4, 0x68, 0x2B, 0xF4, 0x81, 0x4D, 0x45, 0x47, 0xD5, + 0x04, 0xB7, 0x51, 0x0C, 0x4B, 0x08, 0x36, 0x6F, 0xEE, 0x2A, 0x15, 0xA6, 0x14, 0xE1, 0x34, 0x8A, + 0xB4, 0x1A, 0xC4, 0x10, 0xDB, 0x12, 0xA8, 0xB6, 0x93, 0x4B, 0x38, 0x99, 0x4F, 0x55, 0x75, 0x94, + 0xE8, 0xAC, 0x0B, 0x49, 0x9F, 0x75, 0xE7, 0x8F, 0x87, 0x46, 0xBD, 0xD3, 0xEC, 0x34, 0x8F, 0xE0, + 0x7F, 0x8A, 0xF1, 0x4C, 0xB1, 0x71, 0x71, 0xF1, 0xE6, 0x58, 0x5E, 0x2A, 0x44, 0x97, 0x4F, 0x2B, + 0xE5, 0x05, 0xFB, 0x52, 0x5D, 0x54, 0xF7, 0xA4, 0xE4, 0xFC, 0x52, 0xB7, 0x5D, 0x92, 0x87, 0x73, + 0x4C, 0x7A, 0x7D, 0x43, 0x54, 0x58, 0xCB, 0xBA, 0x2A, 0x9E, 0x7A, 0x7F, 0xB6, 0x58, 0x11, 0xF2, + 0x7F, 0xDE, 0xDA, 0x25, 0x51, 0x7C, 0xD3, 0x96, 0xBE, 0xB6, 0x5C, 0x82, 0x7D, 0xDB, 0x46, 0x27, + 0x5F, 0xEB, 0x2D, 0x5E, 0xF5, 0x01, 0x85, 0x2E, 0x8C, 0x41, 0x7D, 0x18, 0x8C, 0xE6, 0x56, 0x86, + 0x52, 0x9B, 0x0D, 0x64, 0x30, 0xB2, 0x1D, 0xA7, 0xE5, 0x78, 0x8B, 0xF2, 0x4A, 0xA4, 0xD8, 0x92, + 0x33, 0x76, 0x5A, 0x6E, 0xF2, 0x9B, 0x52, 0x3B, 0x87, 0xC8, 0xF5, 0x1F, 0x41, 0xED, 0xB7, 0xED, + 0x70, 0x85, 0xAE, 0xB1, 0x59, 0xA2, 0xD8, 0xC0, 0x1E, 0xB7, 0xEB, 0xA8, 0x92, 0x29, 0xB1, 0x4A, + 0xB0, 0x78, 0xD8, 0xB3, 0xB0, 0x43, 0x73, 0xB2, 0xC1, 0xD0, 0x33, 0x1E, 0x18, 0xF9, 0xC4, 0x31, + 0xB0, 0x82, 0xDF, 0x68, 0x86, 0xA2, 0x74, 0xF8, 0x26, 0x83, 0x57, 0xE1, 0x84, 0x8A, 0xEE, 0xEB, + 0x99, 0x5D, 0x6A, 0xB3, 0xDA, 0x21, 0x3F, 0x56, 0xAB, 0xCD, 0xBA, 0xA4, 0xDC, 0x4F, 0x7A, 0x86, + 0xBA, 0xD1, 0x1A, 0x11, 0x5D, 0x04, 0xED, 0xB1, 0x4F, 0x56, 0x15, 0x98, 0x69, 0xF2, 0xBF, 0x67, + 0x6C, 0xFE, 0x78, 0xF3, 0xA9, 0x12, 0x9A, 0x00, 0xB8, 0x15, 0xB5, 0xFB, 0x41, 0x85, 0xAE, 0xF3, + 0xBB, 0xAC, 0x62, 0x8F, 0xD1, 0xEC, 0xA8, 0xAE, 0x57, 0x08, 0x37, 0x05, 0x29, 0x54, 0x6D, 0xAA, + 0x22, 0xFB, 0xAA, 0xC7, 0xF3, 0x64, 0x14, 0xE6, 0x2C, 0xFE, 0xD0, 0x3A, 0xF5, 0xA8, 0x38, 0xBA, + 0xB5, 0xA4, 0xD9, 0x94, 0xD2, 0xC8, 0x11, 0x4D, 0x62, 0xE6, 0x5B, 0x9F, 0x12, 0x33, 0x46, 0xCF, + 0xB5, 0x91, 0xE7, 0xAB, 0x44, 0x94, 0xCF, 0x54, 0xCD, 0xD0, 0x66, 0xCA, 0x53, 0x3E, 0xA8, 0x87, + 0x7C, 0xAA, 0xF7, 0x4E, 0x94, 0x6B, 0x2B, 0x05, 0x8D, 0x8B, 0x48, 0xCB, 0x9D, 0x05, 0xCC, 0xA6, + 0xAC, 0xDC, 0x01, 0xB2, 0x1C, 0x8B, 0x94, 0x8A, 0x2A, 0xF6, 0xCA, 0xA2, 0x08, 0x93, 0x9D, 0xC9, + 0x2A, 0x34, 0x76, 0x7B, 0x6A, 0x40, 0xD9, 0x8B, 0xE6, 0x6A, 0x00, 0x46, 0x95, 0xFE, 0xAA, 0x98, + 0xBB, 0x34, 0xC7, 0xDA, 0x3D, 0xE9, 0x94, 0x74, 0x69, 0x3A, 0x5E, 0xB0, 0xE5, 0x04, 0x58, 0xFE, + 0xFC, 0x97, 0xF2, 0x4E, 0xA5, 0xD4, 0x5D, 0xE8, 0x53, 0xC5, 0xEE, 0x98, 0x92, 0x79, 0xB7, 0xA3, + 0x8C, 0xB4, 0x85, 0xB3, 0x94, 0x74, 0x06, 0x8D, 0xAE, 0x5F, 0x9E, 0x69, 0x26, 0x51, 0x87, 0xD1, + 0xE4, 0x44, 0x5D, 0x95, 0xA9, 0xD2, 0x42, 0x3D, 0x4C, 0x6C, 0xCB, 0x22, 0x85, 0x73, 0xC1, 0x38, + 0xE6, 0xAD, 0x58, 0x3C, 0x20, 0xFD, 0xAA, 0x49, 0xA9, 0x7B, 0x71, 0x8A, 0xC2, 0xC7, 0x1A, 0xBA, + 0xF7, 0xED, 0x31, 0x3C, 0xD1, 0xE4, 0xCD, 0xA4, 0x27, 0x4B, 0x91, 0x42, 0x52, 0x95, 0xCE, 0x1D, + 0xCD, 0xB5, 0xA2, 0xC8, 0x40, 0x0E, 0xD8, 0x2A, 0x1B, 0xCD, 0x53, 0x54, 0xD1, 0x85, 0x94, 0x36, + 0x5F, 0x5B, 0xE2, 0xCB, 0x80, 0xAD, 0xBC, 0xD5, 0x95, 0x3B, 0x5C, 0x6A, 0xA3, 0x16, 0x90, 0xEE, + 0x37, 0x57, 0x34, 0x7B, 0xAA, 0x8C, 0x0A, 0x88, 0x8C, 0x52, 0x8C, 0x78, 0xB8, 0x2A, 0xD9, 0x6A, + 0x53, 0xE7, 0x38, 0x3F, 0x94, 0x9E, 0x86, 0x3B, 0x3F, 0x8C, 0x1F, 0xDC, 0x3B, 0xC7, 0x47, 0xE2, + 0xE4, 0x87, 0xE6, 0x78, 0x3F, 0xA6, 0x63, 0x04, 0xC1, 0x85, 0x8E, 0x8F, 0x76, 0xE9, 0xC9, 0x67, + 0xE8, 0xCE, 0x2D, 0xFB, 0x46, 0xB3, 0xAD, 0x0B, 0xDD, 0xF1, 0xC6, 0x5E, 0xEA, 0x1E, 0xBD, 0xCF, + 0xB4, 0x0C, 0x79, 0xEC, 0x42, 0x4F, 0xAC, 0x2F, 0xEA, 0x14, 0x2A, 0xBE, 0xA4, 0x0F, 0x1E, 0x7D, + 0xF7, 0xE4, 0xF1, 0xE3, 0x93, 0x1F, 0x1E, 0xB9, 0xC3, 0x60, 0xC6, 0xFF, 0xFF, 0x33, 0x5B, 0x8E, + 0xFD, 0xE9, 0x63, 0xEF, 0xA4, 0x0F, 0xC3, 0x3D, 0x12, 0x86, 0x60, 0x7A, 0xC1, 0xF9, 0x21, 0x45, + 0x9A, 0x22, 0xE4, 0x10, 0x28, 0xC9, 0xA1, 0x8D, 0x97, 0x3B, 0x2A, 0xF2, 0x44, 0x93, 0x00, 0x32, + 0xF8, 0xD0, 0xF0, 0x15, 0x4D, 0x68, 0x33, 0x56, 0x4C, 0xD3, 0x50, 0xA2, 0x53, 0x9D, 0x0C, 0xBD, + 0x65, 0x9A, 0x03, 0xCA, 0x14, 0x57, 0x18, 0x6F, 0x45, 0xAC, 0x3C, 0x84, 0x00, 0x46, 0xC1, 0x71, + 0x71, 0x15, 0xDA, 0x28, 0x1B, 0x25, 0x54, 0x80, 0x8D, 0x97, 0xA6, 0xF3, 0x45, 0xE8, 0x5E, 0x17, + 0x4A, 0x71, 0xBD, 0x90, 0x85, 0xCA, 0x9C, 0xAE, 0x12, 0xAC, 0x72, 0x18, 0x69, 0xD9, 0x90, 0x71, + 0x01, 0xA2, 0x6D, 0x51, 0xEC, 0xEC, 0x5A, 0x31, 0x26, 0x8A, 0x4D, 0xD2, 0xAB, 0x00, 0xD6, 0x07, + 0x9F, 0x2E, 0xDF, 0xFE, 0x5D, 0x7B, 0xF7, 0xFA, 0x4F, 0xA5, 0x86, 0xCA, 0x88, 0xC2, 0x18, 0x5D, + 0xA1, 0x67, 0x0A, 0xC6, 0xF4, 0x21, 0x64, 0xA2, 0x73, 0xCD, 0x50, 0x0C, 0x98, 0xED, 0x1D, 0xE2, + 0x8E, 0xC3, 0xC9, 0x85, 0xDE, 0xD5, 0xF1, 0x91, 0x16, 0x71, 0xD6, 0xD3, 0x35, 0x8C, 0xDF, 0xF4, + 0xE0, 0xC6, 0x70, 0xE6, 0x78, 0xD4, 0xA9, 0xC2, 0x6B, 0xD6, 0xB4, 0x94, 0xCD, 0x78, 0x60, 0x89, + 0x64, 0x2C, 0x05, 0xE2, 0xA4, 0x94, 0xF5, 0xC1, 0x35, 0x09, 0xCF, 0x0F, 0xD9, 0xAD, 0x12, 0xAD, + 0x15, 0xF7, 0x0D, 0x9E, 0xCC, 0xCC, 0xA1, 0xC8, 0x84, 0x8A, 0x14, 0x3F, 0xF2, 0x8D, 0x29, 0x41, + 0xA9, 0x54, 0xD2, 0xBC, 0xAC, 0xF5, 0x08, 0x52, 0x1F, 0x7C, 0x20, 0xB4, 0x20, 0x02, 0x32, 0x2A, + 0x29, 0xFE, 0x9C, 0xD7, 0xA8, 0x89, 0xFE, 0x23, 0x7B, 0xE6, 0x6B, 0x52, 0x2D, 0x83, 0x99, 0x79, + 0x05, 0xB9, 0x3F, 0x6C, 0xB5, 0xB4, 0xDE, 0xBB, 0xF7, 0x5A, 0xAB, 0x55, 0xA1, 0xB1, 0x37, 0xA3, + 0xEE, 0xC4, 0xF5, 0xDF, 0x3D, 0xD2, 0x07, 0xBF, 0x7C, 0x7A, 0xF5, 0xAC, 0x0E, 0x75, 0x61, 0x67, + 0xD9, 0xED, 0x75, 0x3A, 0x8D, 0xF3, 0x43, 0xD6, 0x64, 0x7D, 0x5C, 0x3D, 0xD0, 0x2B, 0xC5, 0xD5, + 0x3B, 0x05, 0x5C, 0x9D, 0x5E, 0x7F, 0x0B, 0x5C, 0x5D, 0x7D, 0xF0, 0xFA, 0x05, 0xC3, 0xF4, 0xB8, + 0xB7, 0x0D, 0x51, 0x60, 0xE0, 0x94, 0x26, 0x20, 0x67, 0xF9, 0xF8, 0xE4, 0x74, 0x73, 0x4C, 0x4F, + 0x80, 0xBB, 0x8F, 0x80, 0xE9, 0x14, 0x04, 0x75, 0xB2, 0x8D, 0x9C, 0x4E, 0xF5, 0x01, 0xE2, 0x81, + 0x88, 0xBE, 0xEC, 0x9F, 0x6E, 0x81, 0xE7, 0x31, 0x88, 0x08, 0x11, 0x01, 0x92, 0xE5, 0xD1, 0x36, + 0x32, 0x3A, 0xD1, 0x07, 0x97, 0x6F, 0x5E, 0xD6, 0xFB, 0xC0, 0x58, 0xEF, 0xC9, 0xC9, 0xE6, 0x78, + 0x8E, 0xF5, 0xC1, 0x3F, 0x90, 0x20, 0x20, 0x66, 0xD9, 0xEB, 0x6F, 0x41, 0x50, 0x5F, 0x1F, 0x00, + 0x3C, 0xE2, 0xD8, 0x18, 0x05, 0xD8, 0xF5, 0x6B, 0x4A, 0x0C, 0x22, 0xEA, 0x3E, 0xDE, 0x82, 0x2B, + 0xB0, 0xEA, 0x7F, 0xA0, 0x78, 0x00, 0xC9, 0xB2, 0xDB, 0xDF, 0xC6, 0xA6, 0x01, 0x11, 0x25, 0x09, + 0x7C, 0x0D, 0x5D, 0x6D, 0x73, 0x4C, 0x60, 0xD3, 0x4F, 0x4E, 0x96, 0x4F, 0x4E, 0xAA, 0x21, 0xC0, + 0x18, 0x89, 0xF1, 0xA6, 0x28, 0x8A, 0x16, 0x07, 0xD9, 0xA2, 0x00, 0xFA, 0xEF, 0x39, 0x0C, 0x8B, + 0xC2, 0xD5, 0xDA, 0xE1, 0x93, 0xC3, 0x81, 0x4C, 0xD8, 0x41, 0xB5, 0xC8, 0x29, 0x51, 0x12, 0x3D, + 0xA1, 0xA3, 0x0F, 0xFA, 0x15, 0x32, 0x54, 0xA2, 0x84, 0xA1, 0xB0, 0x09, 0xFA, 0x69, 0xDA, 0x44, + 0xCB, 0xC3, 0x84, 0x09, 0x2E, 0x71, 0xA4, 0x4B, 0x11, 0x64, 0xA3, 0xD0, 0xAC, 0xA0, 0xD5, 0x58, + 0xEA, 0x83, 0x93, 0xA3, 0xD2, 0x94, 0xB6, 0xB9, 0x32, 0x86, 0x74, 0x00, 0xEE, 0x92, 0x20, 0x58, + 0x5B, 0x1F, 0x31, 0xA8, 0x3E, 0x78, 0x1E, 0x1D, 0x6F, 0xA3, 0x95, 0x56, 0x6F, 0x0B, 0xB5, 0x48, + 0xE4, 0x30, 0xCD, 0xB4, 0x7A, 0x5C, 0x35, 0x71, 0xF1, 0x72, 0xB7, 0x8A, 0x29, 0xA3, 0x76, 0x1B, + 0xBD, 0x60, 0x01, 0xEE, 0x1B, 0x41, 0xB8, 0xB6, 0x56, 0x04, 0x20, 0x44, 0x68, 0x7E, 0xB4, 0x37, + 0x8D, 0x44, 0xA4, 0x7C, 0x03, 0xFA, 0x08, 0x8C, 0x70, 0xCE, 0x9E, 0x85, 0x5A, 0x5B, 0x23, 0x31, + 0x28, 0xD4, 0x03, 0xD1, 0xF1, 0xDE, 0xB4, 0x22, 0x91, 0xF3, 0x2D, 0xE8, 0x65, 0x46, 0x4C, 0xDB, + 0x70, 0x3E, 0x93, 0xD1, 0x08, 0x12, 0xD6, 0xFA, 0xBA, 0x49, 0x80, 0x83, 0x7E, 0xD8, 0xB9, 0x76, + 0x45, 0xCF, 0xD7, 0xAE, 0xCD, 0x53, 0xE8, 0x36, 0x2F, 0xD0, 0xD3, 0xD9, 0x9B, 0x4F, 0x52, 0x13, + 0x3A, 0x24, 0x62, 0x47, 0xFA, 0xE0, 0x47, 0x2F, 0xA2, 0x73, 0xF3, 0x02, 0xE3, 0x47, 0x32, 0xA6, + 0x73, 0xC0, 0xDB, 0x54, 0x3B, 0xAF, 0x7C, 0x63, 0x45, 0x37, 0x19, 0x6E, 0x53, 0x7C, 0x7D, 0x20, + 0x96, 0xF6, 0xB3, 0xED, 0x6E, 0xCE, 0x4C, 0x1F, 0x09, 0x21, 0xC4, 0xDD, 0x0E, 0x0B, 0x94, 0xA4, + 0xCF, 0xE1, 0x60, 0x3B, 0x24, 0x27, 0x38, 0x5E, 0x9D, 0xD9, 0xC6, 0xD7, 0x50, 0x6E, 0x19, 0x8B, + 0xE1, 0xDA, 0x6E, 0x01, 0x30, 0xFA, 0xE0, 0xD9, 0xAF, 0xCF, 0xD7, 0x0E, 0x52, 0x6C, 0x25, 0xB5, + 0x8A, 0x85, 0xC7, 0xF3, 0x11, 0xD8, 0x59, 0x66, 0xA2, 0x48, 0xED, 0x39, 0x55, 0x27, 0x8B, 0x14, + 0x7C, 0x09, 0x02, 0xE9, 0xC2, 0x93, 0x2E, 0xB1, 0x59, 0x8D, 0xC7, 0xFB, 0x8B, 0x60, 0x40, 0xC4, + 0xE7, 0xB1, 0x61, 0xAF, 0x9F, 0x57, 0x04, 0x20, 0xD5, 0x94, 0xF6, 0x0A, 0x8E, 0x76, 0xA5, 0x2E, + 0xD6, 0xED, 0xDE, 0x74, 0xC6, 0xB9, 0xDE, 0xB7, 0xE2, 0x80, 0x90, 0xA9, 0x67, 0xAD, 0x3F, 0x0D, + 0xC4, 0xE1, 0xF4, 0x01, 0x68, 0xED, 0x1D, 0x1C, 0xAC, 0x9D, 0x65, 0x04, 0x82, 0x7B, 0x4E, 0x2F, + 0xCF, 0xE6, 0xA1, 0xB7, 0x4D, 0x66, 0xB9, 0x9E, 0xBB, 0xEE, 0x6A, 0x9B, 0xB4, 0x72, 0xE9, 0x78, + 0x73, 0x6B, 0x73, 0x0C, 0x90, 0x53, 0x7E, 0x1A, 0x8D, 0x6C, 0x73, 0xF3, 0xAC, 0x04, 0x19, 0xE5, + 0xB5, 0x37, 0xAD, 0x08, 0x7F, 0xCF, 0x51, 0x9C, 0x98, 0xEB, 0x07, 0x08, 0x62, 0x82, 0x16, 0xAF, + 0x2E, 0xB5, 0xEB, 0xAB, 0x1F, 0xAF, 0x7F, 0xFA, 0xB0, 0x9B, 0xE8, 0x00, 0x7D, 0xEE, 0x29, 0x30, + 0x20, 0xB7, 0xFB, 0x8E, 0x09, 0x40, 0x44, 0x6F, 0x13, 0x3D, 0xF5, 0x98, 0xA2, 0x5E, 0x5C, 0xBF, + 0xDF, 0x95, 0x96, 0x7A, 0xFB, 0x53, 0x53, 0xEF, 0x6B, 0xD0, 0xD3, 0x67, 0x87, 0xDC, 0x10, 0x67, + 0x03, 0x5D, 0x31, 0x40, 0xD4, 0x97, 0xF6, 0x16, 0x8F, 0xF6, 0x36, 0x90, 0x8B, 0x48, 0xF9, 0x06, + 0x86, 0x71, 0x60, 0x15, 0x9F, 0x29, 0xD1, 0x9B, 0x38, 0x0F, 0x83, 0xD4, 0x07, 0x57, 0xCB, 0x99, + 0x17, 0xCC, 0xFD, 0x8A, 0x09, 0x55, 0xAD, 0x91, 0xCE, 0x56, 0x0A, 0x11, 0xA4, 0x30, 0x8D, 0x74, + 0xB8, 0x42, 0x70, 0x91, 0x44, 0x5A, 0x3F, 0xEB, 0xDF, 0xA9, 0x56, 0x10, 0xF9, 0x7D, 0x2A, 0x66, + 0xBC, 0x41, 0xDE, 0x19, 0x63, 0xDE, 0x79, 0x75, 0xB9, 0x9B, 0x50, 0x36, 0xDE, 0x5B, 0xC2, 0x19, + 0xEF, 0x35, 0xE1, 0x68, 0x7C, 0x0D, 0x5B, 0x48, 0x61, 0xC3, 0x41, 0x04, 0x07, 0x84, 0xB1, 0xF3, + 0x26, 0x03, 0x08, 0xC9, 0x73, 0xBA, 0xCB, 0x6D, 0x5C, 0x47, 0x90, 0x91, 0xF4, 0x9C, 0xA3, 0xD8, + 0x6F, 0x8E, 0xEF, 0xD4, 0x6B, 0x8E, 0x4A, 0xA9, 0xDD, 0xC6, 0x69, 0x90, 0x13, 0x93, 0xD8, 0x0E, + 0x6E, 0x65, 0x5E, 0x57, 0x21, 0x12, 0x2C, 0xD3, 0x89, 0x76, 0xC9, 0xCE, 0xB6, 0xD1, 0x4D, 0x6F, + 0x1B, 0xDD, 0xC8, 0x14, 0x25, 0xD5, 0x73, 0x72, 0x4F, 0x99, 0xA6, 0xDB, 0x3B, 0xBD, 0x4F, 0xF5, + 0x0C, 0x67, 0xEB, 0xC7, 0x34, 0x80, 0xD1, 0x07, 0xCF, 0xDF, 0xEF, 0x26, 0xA6, 0x61, 0x67, 0x15, + 0x63, 0xDA, 0x56, 0x11, 0x8C, 0x32, 0xB5, 0xEF, 0x52, 0x6C, 0xB1, 0x81, 0x36, 0x16, 0x48, 0xF8, + 0xAF, 0x3B, 0xD2, 0xC6, 0xA2, 0xBA, 0x36, 0xEE, 0x38, 0xC3, 0x2C, 0xBE, 0x06, 0xFD, 0xF8, 0xC6, + 0xE2, 0xF3, 0x78, 0x6A, 0xAC, 0xAD, 0x23, 0x0E, 0xA7, 0x0F, 0x3E, 0x18, 0x0B, 0xED, 0xD5, 0xBB, + 0x67, 0x3B, 0xD1, 0x95, 0xE8, 0x74, 0x3F, 0xFA, 0x8A, 0x58, 0xDE, 0xB7, 0xCE, 0x1C, 0xE2, 0xAE, + 0xEF, 0x54, 0x08, 0xA4, 0x0F, 0xDE, 0x12, 0x37, 0xD0, 0x2E, 0x3D, 0x9F, 0xBF, 0x76, 0x6E, 0x27, + 0x5A, 0xA3, 0x3D, 0xEF, 0x47, 0x65, 0x8C, 0xE9, 0x7D, 0xEB, 0x6B, 0x32, 0xB5, 0x7D, 0xDF, 0xF3, + 0xD7, 0x56, 0x19, 0x87, 0xD3, 0x07, 0xAF, 0x5B, 0xEF, 0xE8, 0xD1, 0x4E, 0xD4, 0x25, 0x7A, 0xDD, + 0x8F, 0xC6, 0x22, 0x9E, 0xF7, 0xAD, 0xB4, 0x9B, 0x91, 0x63, 0xCF, 0xD6, 0x56, 0x19, 0x85, 0xD2, + 0x07, 0x1F, 0x5B, 0x2F, 0xE1, 0xEF, 0x4E, 0xD4, 0xC5, 0x7A, 0xDC, 0x8F, 0xB2, 0x38, 0xB7, 0xFB, + 0x56, 0x95, 0x65, 0x2E, 0xD6, 0x56, 0x14, 0xC0, 0xE8, 0x83, 0x17, 0x97, 0xBF, 0x6A, 0xF5, 0x17, + 0xDE, 0xC2, 0xC5, 0x07, 0x2E, 0xB5, 0xAB, 0x1F, 0x1B, 0x3B, 0xD1, 0x18, 0x76, 0xBD, 0x1F, 0x7D, + 0x51, 0xA6, 0xF7, 0xAD, 0x2D, 0xBA, 0xAF, 0x66, 0x68, 0xAC, 0x1F, 0x0E, 0x05, 0x20, 0x3E, 0xFB, + 0x02, 0x47, 0xDA, 0x73, 0x63, 0x37, 0x01, 0x31, 0xEA, 0x77, 0x17, 0x45, 0x7B, 0xCC, 0xE4, 0xBE, + 0xF5, 0xE4, 0x10, 0xAB, 0x82, 0x8A, 0x92, 0x25, 0x86, 0xF5, 0x19, 0xB7, 0xA8, 0xE0, 0xD6, 0xCD, + 0x15, 0xD4, 0x1A, 0x57, 0x2F, 0xB4, 0x37, 0xE2, 0xB4, 0x02, 0x37, 0x1B, 0xCF, 0xD9, 0xE5, 0x0D, + 0x6D, 0x93, 0xF4, 0x24, 0x07, 0xB7, 0xBD, 0xE3, 0xE3, 0xED, 0x86, 0xB7, 0x79, 0xD3, 0xA8, 0xC7, + 0xC7, 0xF7, 0xA8, 0x93, 0x91, 0x61, 0x92, 0xCF, 0x16, 0x09, 0x37, 0x79, 0x18, 0x46, 0x82, 0xD5, + 0x07, 0x2F, 0xE1, 0x44, 0x7B, 0x41, 0x4F, 0x76, 0x55, 0x06, 0xCA, 0xFD, 0xEF, 0xC2, 0x93, 0x12, + 0xFC, 0xEE, 0xDB, 0x99, 0x28, 0x31, 0x50, 0x74, 0x7B, 0x63, 0x77, 0xA3, 0xBD, 0x05, 0x09, 0x70, + 0xAE, 0xBE, 0x0F, 0xEC, 0x7C, 0xB7, 0x0A, 0x8C, 0x89, 0xD8, 0x99, 0x0E, 0x25, 0xBE, 0x77, 0xA1, + 0x46, 0x79, 0x83, 0x11, 0x7F, 0x33, 0x67, 0x99, 0xA6, 0xF8, 0x46, 0x17, 0x3A, 0x9D, 0x46, 0xC2, + 0x56, 0x10, 0xDA, 0x8E, 0xA3, 0x0F, 0x5E, 0x91, 0x50, 0xBB, 0xC6, 0xC3, 0x8A, 0x3B, 0x5B, 0x24, + 0x2C, 0x62, 0x5B, 0x5B, 0xE8, 0x13, 0x63, 0xAA, 0x0F, 0xAE, 0xF1, 0x9D, 0xA5, 0x80, 0x0B, 0xCF, + 0xD6, 0x47, 0x46, 0x85, 0x48, 0x5C, 0xDF, 0x03, 0xA2, 0x22, 0x25, 0xF1, 0x77, 0xA1, 0xE9, 0x9A, + 0x38, 0x92, 0xAE, 0x0D, 0xAE, 0x68, 0x63, 0x0D, 0xAD, 0xAC, 0xBC, 0xBB, 0xCA, 0x5B, 0x6E, 0xE8, + 0x1E, 0x3B, 0xDC, 0x34, 0x97, 0x7C, 0xA3, 0x31, 0x68, 0x95, 0xED, 0xA0, 0x1D, 0x9C, 0x07, 0x33, + 0xC3, 0x15, 0xCD, 0xE8, 0xF6, 0xD2, 0x05, 0xDF, 0x2F, 0x38, 0xF4, 0x1C, 0x0B, 0x1A, 0x3E, 0xB3, + 0x6E, 0xF0, 0xED, 0x4E, 0x96, 0x76, 0x1D, 0xED, 0x7C, 0x43, 0x10, 0x30, 0x0B, 0x81, 0xA1, 0x44, + 0xB7, 0x13, 0x5F, 0xA0, 0x67, 0x7B, 0x14, 0xF1, 0x7D, 0x38, 0x05, 0xCA, 0xCD, 0xD9, 0xAC, 0xE7, + 0x93, 0x71, 0x24, 0x48, 0xD5, 0x1E, 0x4E, 0xE5, 0xD6, 0xBD, 0x0F, 0x64, 0x6C, 0x07, 0x40, 0xA3, + 0x06, 0x66, 0x71, 0x48, 0xB7, 0x3B, 0x31, 0x53, 0xAE, 0xB6, 0x95, 0x4E, 0xEE, 0x92, 0x6F, 0x04, + 0x56, 0x6E, 0x90, 0x5C, 0xAB, 0x62, 0x4C, 0x6F, 0x67, 0x4C, 0x62, 0x2C, 0x33, 0xFA, 0x87, 0xAD, + 0xD6, 0xA4, 0x8F, 0x1B, 0xB7, 0x34, 0xC1, 0xDA, 0xF9, 0xE1, 0xA4, 0x5F, 0xB6, 0xE7, 0xA8, 0x74, + 0xD7, 0x1D, 0x70, 0xBA, 0xF1, 0xA6, 0x3B, 0x94, 0xD2, 0x00, 0xA8, 0x69, 0x6A, 0xEF, 0x8C, 0xE0, + 0x4B, 0x53, 0xFB, 0x88, 0xF9, 0x7D, 0x87, 0x7B, 0xEF, 0x90, 0x76, 0xC3, 0xB2, 0xFC, 0xDC, 0xFD, + 0x77, 0xFD, 0xC4, 0xFE, 0xBB, 0x13, 0xB1, 0xFF, 0x4E, 0x9A, 0x69, 0x5F, 0x76, 0xBB, 0xDD, 0x2A, + 0x9C, 0x57, 0xDC, 0x82, 0x77, 0x27, 0x2C, 0x4D, 0x41, 0x98, 0x15, 0x59, 0xEA, 0x0B, 0x96, 0xFA, + 0x12, 0x4B, 0xA7, 0x77, 0xB9, 0xA9, 0xF0, 0x4E, 0x38, 0xE2, 0xEB, 0xB8, 0x5F, 0x09, 0x4B, 0x95, + 0xF6, 0x49, 0x52, 0xDB, 0xBE, 0xAB, 0x6D, 0x92, 0xB4, 0x49, 0x3A, 0x18, 0x1E, 0x17, 0xC6, 0x42, + 0x0A, 0xC2, 0x7C, 0xFE, 0xD5, 0x5D, 0xFA, 0xFC, 0x78, 0x0B, 0x9F, 0x1F, 0x67, 0x7C, 0x7E, 0x87, + 0xCE, 0x2E, 0x08, 0xFF, 0xC6, 0x1C, 0x5E, 0xB0, 0xB5, 0x86, 0xD3, 0x2B, 0xD9, 0xDA, 0xAD, 0x87, + 0x44, 0x96, 0xF0, 0xEA, 0x2E, 0x3D, 0x24, 0xC7, 0x6E, 0x37, 0x32, 0x52, 0x1E, 0x73, 0x06, 0xBB, + 0xC9, 0x49, 0xB4, 0x92, 0x92, 0xD5, 0xC9, 0x7B, 0xC7, 0x8D, 0x86, 0x47, 0x7D, 0x5E, 0x36, 0xDD, + 0x85, 0x7A, 0xAA, 0xEF, 0xC7, 0xCE, 0x6D, 0x72, 0x37, 0x45, 0x19, 0xBE, 0x11, 0x61, 0x26, 0x55, + 0xB8, 0x95, 0x0B, 0xB3, 0xCB, 0xB7, 0x7F, 0x5F, 0xAF, 0x16, 0x4B, 0xF7, 0xB4, 0xBB, 0x7A, 0x6C, + 0x33, 0x6B, 0x95, 0x05, 0xC6, 0x69, 0x87, 0x88, 0x83, 0x6F, 0x26, 0xE8, 0x7D, 0x8A, 0x38, 0x57, + 0x8C, 0x0D, 0xA5, 0xA0, 0x10, 0x81, 0xE5, 0x0D, 0xFA, 0x68, 0x20, 0xE4, 0x73, 0x96, 0x70, 0x2C, + 0xE2, 0x9A, 0xE6, 0x8D, 0x46, 0xF4, 0x73, 0x57, 0x8F, 0x31, 0x60, 0x04, 0x5F, 0xF0, 0x7A, 0xA7, + 0x1B, 0x91, 0xA4, 0x1A, 0xF2, 0xC5, 0x14, 0x46, 0xB4, 0x51, 0x13, 0xE3, 0x86, 0x76, 0x67, 0x22, + 0x38, 0x62, 0x22, 0x78, 0xF1, 0xE6, 0xA3, 0x4A, 0x06, 0xCC, 0xD7, 0x3A, 0x59, 0x11, 0x1C, 0x6D, + 0xFE, 0x6E, 0x85, 0x6E, 0x65, 0x69, 0x75, 0x62, 0x69, 0x1D, 0x8D, 0xE2, 0x2D, 0xA2, 0xDB, 0x84, + 0x2C, 0x85, 0x04, 0x8E, 0xD9, 0x43, 0xE0, 0xDA, 0x7B, 0xD9, 0x03, 0x2A, 0xD9, 0xC1, 0xF1, 0x3A, + 0x76, 0x60, 0x1D, 0x6D, 0x61, 0x06, 0xC7, 0x39, 0x66, 0x70, 0x57, 0x32, 0xE8, 0xEB, 0x83, 0xF7, + 0x9B, 0x98, 0x41, 0xBF, 0xA2, 0x19, 0x1C, 0x09, 0x33, 0x88, 0xF7, 0x0F, 0xF7, 0xAB, 0x0A, 0x4B, + 0xB2, 0x82, 0xC7, 0x23, 0x7C, 0x6C, 0xE6, 0x71, 0x35, 0x4F, 0xD8, 0x5D, 0xCC, 0x5D, 0xD8, 0xEE, + 0xFA, 0xF1, 0xF6, 0x57, 0xDB, 0xB5, 0xBC, 0xC5, 0x7A, 0x21, 0x57, 0xEE, 0xE8, 0x6B, 0x0F, 0xB7, + 0xEB, 0x8D, 0x5A, 0x71, 0x66, 0xA7, 0xB5, 0xC4, 0xCA, 0xDE, 0x0D, 0x3C, 0x5F, 0xCB, 0xBE, 0x39, + 0x24, 0xB1, 0x01, 0x51, 0xB4, 0xAE, 0x56, 0x04, 0x64, 0xB7, 0x5C, 0xBC, 0x79, 0xA9, 0x6D, 0xF0, + 0x5A, 0x07, 0x05, 0xB2, 0x2E, 0x7B, 0xF9, 0x85, 0xB6, 0xC1, 0xDB, 0x2F, 0x14, 0xD8, 0x72, 0xB6, + 0xA8, 0xE0, 0x8B, 0x48, 0xB4, 0xCD, 0xDE, 0x44, 0x52, 0xBA, 0x5B, 0x83, 0xB5, 0xDA, 0x3C, 0xA5, + 0x44, 0xE3, 0x32, 0xE6, 0xAD, 0x50, 0x63, 0x55, 0xDB, 0x62, 0x4F, 0x71, 0x4A, 0x06, 0xC0, 0xC1, + 0x97, 0x74, 0x37, 0x4B, 0x40, 0xAA, 0x6D, 0x4A, 0x4D, 0x13, 0xB6, 0x46, 0x65, 0xF8, 0xE9, 0x4C, + 0x0A, 0x66, 0x51, 0xE7, 0x6B, 0x06, 0xB3, 0xB8, 0xCE, 0x07, 0x63, 0xDA, 0xFB, 0xE0, 0xE5, 0x9F, + 0x0A, 0x96, 0x56, 0x9B, 0xB3, 0x74, 0x74, 0x57, 0x2C, 0x6D, 0x91, 0xAA, 0x22, 0xEB, 0x0A, 0xBD, + 0xD0, 0x70, 0x36, 0x36, 0x2E, 0x06, 0x0D, 0xB6, 0xC5, 0x62, 0xAE, 0x76, 0x0D, 0xAC, 0xEE, 0xD4, + 0xC0, 0x04, 0x01, 0xD5, 0x94, 0xD1, 0xCF, 0x2A, 0xE3, 0xF4, 0x6B, 0xB3, 0x2F, 0xC6, 0x51, 0x55, + 0xF3, 0x52, 0x70, 0x74, 0xF2, 0x35, 0x99, 0x97, 0x37, 0x0F, 0xF1, 0xEA, 0xC6, 0xC1, 0x8B, 0x81, + 0x63, 0xF0, 0xA2, 0x47, 0xBB, 0x37, 0xB0, 0x88, 0x82, 0x8D, 0xF5, 0x71, 0x74, 0xA7, 0xAF, 0x3C, + 0xBB, 0x8B, 0x08, 0xC6, 0x58, 0xDA, 0xC2, 0xC4, 0x7A, 0xFD, 0x1D, 0x9A, 0x98, 0xB4, 0xD0, 0xC4, + 0xF3, 0x20, 0x2F, 0x60, 0x74, 0xBE, 0x36, 0x10, 0x17, 0x34, 0xEB, 0xAC, 0x24, 0xA9, 0xB3, 0xF2, + 0xF9, 0x21, 0x14, 0x85, 0x59, 0x04, 0x39, 0x74, 0x9E, 0xB3, 0x2F, 0x27, 0xAA, 0x3B, 0x8C, 0xDF, + 0x74, 0x48, 0x97, 0xD5, 0xE2, 0x77, 0xEA, 0x46, 0x85, 0x66, 0xFA, 0x5D, 0xBB, 0xA5, 0x6F, 0x15, + 0x3C, 0x37, 0xF8, 0x2B, 0x38, 0x6E, 0x08, 0x5F, 0x03, 0xD4, 0x26, 0x3E, 0x19, 0x5D, 0xE8, 0xDF, + 0x45, 0x38, 0xB9, 0xB4, 0xB0, 0x89, 0xAE, 0x41, 0x48, 0x76, 0x1D, 0xCF, 0xC0, 0x62, 0xD5, 0x98, + 0x85, 0x40, 0x69, 0xFB, 0x8F, 0x19, 0x4E, 0xF2, 0x1A, 0xF8, 0xBE, 0x06, 0xA3, 0xDA, 0x4A, 0x33, + 0x7D, 0x3B, 0x2F, 0x7F, 0xB0, 0x06, 0x0F, 0xA3, 0x35, 0xC3, 0xFF, 0xF9, 0xEF, 0xB2, 0xA9, 0x19, + 0xFC, 0x7E, 0x66, 0x2C, 0x00, 0x30, 0x23, 0xDF, 0xBC, 0xD0, 0x81, 0x52, 0xDF, 0x0B, 0xA0, 0x14, + 0xB5, 0xC7, 0x76, 0x8E, 0xAA, 0xF2, 0xA4, 0x7D, 0xA8, 0x12, 0x77, 0xAA, 0xB1, 0x62, 0x6C, 0x72, + 0x1E, 0x98, 0xBE, 0x3D, 0x83, 0x52, 0xCD, 0xF2, 0xCC, 0xF9, 0x94, 0xB8, 0x61, 0xDB, 0xB0, 0xAC, + 0xAB, 0x1B, 0x38, 0x78, 0x8B, 0x33, 0xCC, 0x20, 0xF9, 0x7A, 0xED, 0xC5, 0x4F, 0xEF, 0x2E, 0xD9, + 0x3B, 0x2B, 0xDF, 0x82, 0xBC, 0x88, 0x55, 0x6B, 0x6A, 0xA3, 0xB9, 0xCB, 0xAA, 0xF7, 0x3A, 0xC1, + 0xB6, 0xEC, 0x3B, 0xA6, 0x37, 0x86, 0xAF, 0x0D, 0x8D, 0x80, 0xBC, 0xF6, 0x82, 0x50, 0xBB, 0xD0, + 0x22, 0x8C, 0x8E, 0x67, 0xD2, 0x77, 0xA2, 0xB4, 0x19, 0x5F, 0xBC, 0x25, 0x63, 0xFC, 0x17, 0xDF, + 0x81, 0xA6, 0x11, 0xD4, 0x81, 0x56, 0x3B, 0x3B, 0xED, 0xD6, 0xD0, 0xFE, 0xA2, 0x2E, 0x46, 0xF8, + 0x65, 0x52, 0x68, 0x57, 0x9F, 0xFB, 0x4E, 0x53, 0x33, 0x87, 0x0D, 0xF6, 0x9E, 0x51, 0x7A, 0x19, + 0xAF, 0x89, 0x17, 0x50, 0xB7, 0xC3, 0x09, 0x71, 0xEB, 0x31, 0x65, 0xE0, 0x0C, 0x33, 0xCF, 0x0D, + 0x12, 0x1F, 0x59, 0xB5, 0x47, 0xF1, 0xF5, 0x36, 0x14, 0xF4, 0xE1, 0x3C, 0xD0, 0x1E, 0x5E, 0x5C, + 0x68, 0x58, 0xE0, 0x26, 0xDE, 0x5F, 0x6A, 0x0E, 0xD3, 0xED, 0x9A, 0x5A, 0xEA, 0xC2, 0xCF, 0x10, + 0x1A, 0xA4, 0x37, 0x65, 0xDF, 0x6A, 0xC4, 0x49, 0xBD, 0xAA, 0x39, 0x02, 0xC0, 0x28, 0x52, 0x6F, + 0x24, 0x09, 0xAC, 0x5B, 0x46, 0x68, 0x34, 0x92, 0xEF, 0x4C, 0x85, 0x5E, 0x81, 0x92, 0xA6, 0x46, + 0x6F, 0xC9, 0x2F, 0x70, 0xBD, 0x6D, 0xB4, 0x41, 0x86, 0xC0, 0x6F, 0x04, 0x4D, 0x7C, 0x3F, 0xFD, + 0xF5, 0x58, 0x80, 0x6E, 0x75, 0x9B, 0x1A, 0xDE, 0x49, 0xC2, 0x4A, 0x44, 0x3E, 0x10, 0xD7, 0x84, + 0xD0, 0x8A, 0xD1, 0x2A, 0x50, 0x32, 0x74, 0xB7, 0x09, 0x15, 0x41, 0xEC, 0xF9, 0x40, 0xC6, 0x20, + 0xB1, 0x71, 0x93, 0x0F, 0xA0, 0x9B, 0x74, 0xF4, 0xDC, 0x64, 0x41, 0x51, 0xD2, 0xDA, 0xE1, 0x21, + 0xB8, 0x34, 0x04, 0x25, 0x02, 0x56, 0x31, 0xAE, 0xD7, 0xF8, 0x02, 0x26, 0x58, 0x54, 0xAD, 0xB3, + 0xAC, 0x1D, 0x00, 0x82, 0x76, 0xE8, 0x5D, 0x87, 0xBE, 0xED, 0x8E, 0x61, 0xE8, 0xD1, 0x88, 0xB1, + 0xD1, 0xDB, 0x88, 0x32, 0x75, 0x9F, 0x5E, 0xA7, 0x9D, 0xA4, 0x6F, 0xD4, 0xF9, 0xF5, 0x83, 0x5A, + 0xA3, 0xC6, 0x89, 0xA7, 0xE7, 0x60, 0x6E, 0x75, 0x76, 0xF0, 0x88, 0xD2, 0xD8, 0xD0, 0xCE, 0xCF, + 0x79, 0x37, 0xAC, 0x15, 0x5E, 0x84, 0x46, 0xF4, 0x4F, 0xEA, 0x56, 0x64, 0x8A, 0xBF, 0x7F, 0xFF, + 0x97, 0xB0, 0xD9, 0xDB, 0x43, 0xA0, 0xFA, 0x29, 0xCE, 0x20, 0x7C, 0xFF, 0x17, 0xFC, 0xFF, 0xF6, + 0x11, 0x9D, 0x36, 0xF8, 0xFE, 0x2F, 0xFC, 0x73, 0xFB, 0x08, 0x7A, 0x82, 0x63, 0xDA, 0xDF, 0xED, + 0xEF, 0x54, 0x0E, 0x59, 0xE9, 0x8D, 0x73, 0xA5, 0x17, 0x89, 0x6D, 0x6D, 0x9A, 0xC6, 0x05, 0x44, + 0xFD, 0x1E, 0xFB, 0x6F, 0xDD, 0xF4, 0x2C, 0x50, 0x4F, 0x08, 0x96, 0x2C, 0x94, 0xEE, 0x80, 0x4A, + 0x84, 0xA0, 0xA2, 0x97, 0x08, 0xDB, 0x23, 0xDA, 0x52, 0xE3, 0xAE, 0x12, 0x1B, 0x88, 0x68, 0x39, + 0x33, 0xFC, 0x80, 0xBC, 0x71, 0xC3, 0x7A, 0x98, 0x70, 0x8A, 0x1C, 0x89, 0x0F, 0x06, 0x09, 0x16, + 0xF0, 0x07, 0x70, 0xD0, 0xAE, 0xC6, 0x95, 0x16, 0x19, 0xDB, 0x83, 0xC8, 0x0E, 0x63, 0x4A, 0xD9, + 0xCD, 0x1C, 0x3B, 0xFC, 0x64, 0x3A, 0x5F, 0xEA, 0xF8, 0x5A, 0xD3, 0x74, 0xA8, 0xC8, 0x88, 0x08, + 0x1B, 0x3D, 0xC5, 0xFF, 0x81, 0x5C, 0xF0, 0x4F, 0xAE, 0x7E, 0x00, 0x2B, 0x2B, 0xE1, 0xEB, 0x74, + 0x0A, 0xE0, 0xF3, 0xB2, 0xA9, 0xB1, 0x83, 0x15, 0x78, 0x86, 0x6B, 0xE1, 0x39, 0xFE, 0x59, 0x09, + 0xED, 0xE1, 0x05, 0x7E, 0x04, 0xD7, 0x68, 0xCD, 0x8A, 0x97, 0xD8, 0x01, 0xB6, 0xA2, 0x35, 0x06, + 0x6D, 0xC5, 0x8E, 0xE0, 0x1A, 0xBE, 0xE2, 0x07, 0x6C, 0xB7, 0xA9, 0x0D, 0x6D, 0xD7, 0xA5, 0x07, + 0x25, 0xD4, 0xC7, 0xA9, 0xFE, 0x69, 0xB0, 0x04, 0x0E, 0x38, 0x69, 0xB7, 0x8F, 0x82, 0x55, 0x74, + 0xB6, 0xBA, 0x7D, 0x44, 0xF0, 0x1E, 0x25, 0x12, 0x8E, 0x57, 0xFC, 0x18, 0xAE, 0x03, 0x7D, 0x78, + 0x47, 0x10, 0x4C, 0x2F, 0xAC, 0xE2, 0x0B, 0xD0, 0x22, 0xC4, 0xFB, 0x9C, 0x78, 0x38, 0x5B, 0x45, + 0x67, 0x08, 0x4D, 0x61, 0x39, 0x1B, 0x70, 0xBA, 0x8A, 0x4F, 0xE1, 0x2E, 0x7D, 0x5D, 0x11, 0x12, + 0xC1, 0x78, 0xBA, 0x7D, 0xC4, 0x79, 0x82, 0x4B, 0xFC, 0x28, 0x2D, 0x6A, 0x8C, 0x09, 0x21, 0x8F, + 0x22, 0xCF, 0x59, 0x92, 0x96, 0xF2, 0x07, 0xF8, 0xC7, 0x95, 0x43, 0xF0, 0xF0, 0xF9, 0xEA, 0x8D, + 0x55, 0xAF, 0xF1, 0x05, 0xD9, 0x1A, 0xC6, 0x30, 0x19, 0xA6, 0xED, 0xB9, 0xA6, 0x63, 0x9B, 0xE8, + 0x28, 0xF5, 0x86, 0x76, 0x31, 0xE0, 0x71, 0x0C, 0x0D, 0x1A, 0x9A, 0xCB, 0x46, 0x9A, 0x8B, 0x5A, + 0x2C, 0x29, 0xD6, 0x1A, 0x6D, 0x6A, 0x87, 0xDC, 0xD6, 0x10, 0x05, 0x77, 0xC1, 0x6A, 0x38, 0xB0, + 0xB1, 0x02, 0x47, 0xC6, 0x5B, 0x0A, 0x91, 0xD0, 0xD6, 0x12, 0x16, 0x8A, 0x46, 0x0E, 0xB5, 0x9D, + 0x54, 0x94, 0x2D, 0xF0, 0x6A, 0xE1, 0xC0, 0x0F, 0xD3, 0x0E, 0x0C, 0xAA, 0xF2, 0xC3, 0x7A, 0xED, + 0x0A, 0x9F, 0xFB, 0xFF, 0xAD, 0x76, 0x80, 0x8D, 0x0E, 0x6A, 0xFF, 0x3A, 0xD3, 0x6A, 0x07, 0xB2, + 0x27, 0xDF, 0xA6, 0x5D, 0x8E, 0x69, 0x6C, 0x5C, 0x51, 0x63, 0x63, 0x49, 0x63, 0xE3, 0xBB, 0xD5, + 0x98, 0xBC, 0x10, 0xBC, 0x8D, 0xD6, 0xE4, 0x95, 0xD7, 0x02, 0xCD, 0x95, 0xC2, 0x73, 0xA5, 0x71, + 0x6D, 0x8D, 0x55, 0xDA, 0xDA, 0x44, 0x4D, 0x2C, 0xC5, 0x81, 0xF7, 0x10, 0xFF, 0xF5, 0xCF, 0xEF, + 0xDE, 0x62, 0xA8, 0x54, 0xAB, 0x2C, 0xD2, 0x58, 0xBA, 0x1C, 0x51, 0x60, 0xC0, 0xDC, 0x99, 0x08, + 0xDC, 0x89, 0x1C, 0x7A, 0x50, 0xD3, 0xEA, 0x14, 0x25, 0x66, 0xD0, 0x12, 0x43, 0xE0, 0x81, 0xB7, + 0x9A, 0xEF, 0x62, 0xB0, 0x15, 0xCE, 0x1B, 0x43, 0x15, 0xD8, 0x02, 0x02, 0x54, 0x52, 0x22, 0xC3, + 0x9C, 0x71, 0x18, 0x29, 0x27, 0xEC, 0xDC, 0x45, 0xA8, 0xBF, 0x06, 0x55, 0x83, 0x9A, 0x88, 0xE9, + 0x71, 0x6C, 0x0B, 0x4A, 0xA5, 0xC3, 0x23, 0x7F, 0x25, 0x01, 0xF1, 0x39, 0x6C, 0x85, 0x81, 0x8B, + 0x4C, 0x50, 0x09, 0x8D, 0x98, 0xBA, 0xCC, 0xC7, 0xB3, 0x5A, 0x07, 0xCF, 0x4A, 0x81, 0x87, 0x67, + 0x9E, 0x4A, 0x68, 0xF8, 0x44, 0x57, 0x2E, 0x96, 0x6A, 0xC4, 0xF0, 0xC9, 0x25, 0x15, 0x4F, 0x3C, + 0xD3, 0x55, 0xE3, 0x89, 0x4F, 0x8A, 0xE4, 0xE3, 0xA9, 0x28, 0x1B, 0x3E, 0x13, 0xA1, 0xB0, 0xE7, + 0x74, 0x35, 0xD2, 0x11, 0xFF, 0x6D, 0x5E, 0x7F, 0x8C, 0x0C, 0x88, 0x16, 0xF1, 0x9F, 0xBD, 0x78, + 0xC9, 0xF8, 0xA3, 0xA8, 0x16, 0x89, 0xA3, 0xCC, 0x06, 0xC4, 0x69, 0x1B, 0x21, 0xC4, 0x27, 0x18, + 0xC7, 0x93, 0xA0, 0x8D, 0x15, 0x6E, 0x24, 0xC6, 0xCC, 0xAD, 0xB6, 0x0B, 0x04, 0x50, 0x84, 0x8D, + 0xB3, 0x4E, 0xDA, 0x3C, 0x33, 0xB8, 0xD8, 0xE5, 0x3C, 0x74, 0xEC, 0x6E, 0x0E, 0x46, 0x9E, 0x61, + 0x92, 0x10, 0x78, 0x31, 0x0F, 0x1B, 0x1D, 0xC5, 0x48, 0xB8, 0x7A, 0xC7, 0xC7, 0xD9, 0x3C, 0xC3, + 0x3B, 0xE0, 0x5F, 0x4F, 0x43, 0x0C, 0x38, 0x1F, 0x15, 0x0F, 0xCD, 0x4C, 0x28, 0x04, 0xB5, 0x9A, + 0x58, 0xB2, 0xAB, 0x9D, 0x65, 0x2A, 0x6E, 0x80, 0xE0, 0x8B, 0x70, 0xDA, 0x53, 0x46, 0x63, 0xE2, + 0x9B, 0x20, 0x43, 0x18, 0x7C, 0x47, 0x9F, 0xFE, 0x62, 0xC8, 0xE8, 0x3E, 0x8A, 0x08, 0x13, 0xBB, + 0x86, 0x03, 0xD7, 0xD4, 0x25, 0xB6, 0xB6, 0xD3, 0xF2, 0x5C, 0xA2, 0xEE, 0x35, 0x51, 0xBF, 0xF3, + 0x8E, 0xF8, 0x19, 0x7F, 0x38, 0x3D, 0x06, 0xF3, 0x49, 0x38, 0xF7, 0x5D, 0x5E, 0xCF, 0x67, 0xEB, + 0x1B, 0xE5, 0x50, 0x72, 0x87, 0xB6, 0x79, 0x78, 0xA8, 0x3D, 0x0B, 0x43, 0x03, 0x14, 0x80, 0xEB, + 0x94, 0x13, 0x94, 0x8F, 0x66, 0xF0, 0x49, 0x09, 0xCF, 0x47, 0xA3, 0x64, 0x0F, 0x15, 0x13, 0xE6, + 0xB7, 0xF8, 0xA5, 0x34, 0xE1, 0xCE, 0x14, 0x55, 0xFB, 0xDF, 0x73, 0xE2, 0xAF, 0xAE, 0xA9, 0xC0, + 0x3C, 0xFF, 0x99, 0xE3, 0xD4, 0x6B, 0xED, 0x78, 0xD9, 0xB9, 0xC6, 0xC6, 0xE0, 0x6D, 0x40, 0x75, + 0x05, 0x7D, 0x80, 0x8E, 0x63, 0x9B, 0x67, 0xDC, 0x44, 0x7A, 0x87, 0x71, 0xD7, 0x05, 0x57, 0x46, + 0x7A, 0xD0, 0x0F, 0x2D, 0x3C, 0xF7, 0x0B, 0x59, 0xCD, 0x67, 0x20, 0xFE, 0x78, 0x18, 0x9F, 0x9A, + 0x58, 0xE0, 0xD2, 0x21, 0x6D, 0x68, 0x79, 0xC9, 0x07, 0x72, 0xDD, 0x23, 0x45, 0xA3, 0x58, 0x05, + 0xD4, 0x3A, 0xD1, 0x13, 0xB3, 0x1F, 0x92, 0xB9, 0x7D, 0xA0, 0x3E, 0x53, 0x4C, 0x81, 0x70, 0x02, + 0xB9, 0xF0, 0x44, 0xF2, 0x4A, 0xF5, 0x90, 0x9A, 0x9E, 0xB8, 0x6D, 0x3C, 0x88, 0x23, 0xC3, 0x7C, + 0x66, 0x19, 0x21, 0x49, 0x06, 0x87, 0xC8, 0x16, 0xC4, 0xCD, 0xA9, 0x17, 0x92, 0x54, 0xC4, 0xB0, + 0x71, 0x6F, 0x86, 0xE1, 0x7C, 0x8C, 0xAD, 0xF1, 0x5E, 0xDD, 0x5F, 0xE1, 0xE3, 0x6B, 0xF8, 0x7F, + 0x66, 0x0E, 0xA2, 0xDA, 0xB8, 0x39, 0x63, 0x21, 0x51, 0x3C, 0x88, 0xAD, 0x44, 0x96, 0x43, 0x22, + 0x2C, 0xF0, 0xFB, 0xA2, 0xA7, 0x87, 0x0F, 0xE9, 0xD1, 0x83, 0x48, 0x69, 0x22, 0x7A, 0x5C, 0x68, + 0xF1, 0x8D, 0x94, 0x82, 0xB3, 0xB8, 0x53, 0x38, 0x04, 0x72, 0x09, 0x03, 0xF3, 0xAD, 0x48, 0xBD, + 0x33, 0xA8, 0x36, 0xD1, 0x16, 0xFE, 0x3F, 0xEA, 0x7F, 0x45, 0x51, 0xFF, 0xFE, 0x42, 0x7C, 0x81, + 0x6D, 0xA7, 0x3C, 0x80, 0xC1, 0xA9, 0xA7, 0x05, 0x0F, 0x6A, 0x50, 0xED, 0x28, 0xE7, 0xFD, 0x78, + 0xE8, 0x8E, 0xED, 0x6B, 0x62, 0x5B, 0x8C, 0xE8, 0xD8, 0xB2, 0x50, 0x46, 0x38, 0x7D, 0x8F, 0x13, + 0xDC, 0x38, 0xDB, 0x5D, 0xAF, 0xB1, 0xB5, 0x05, 0x1A, 0x8F, 0x6F, 0xE3, 0x92, 0x64, 0xE2, 0x2D, + 0x8A, 0x20, 0x7D, 0x88, 0x3A, 0x37, 0x24, 0x05, 0x1C, 0x41, 0xF3, 0xED, 0x3C, 0xA5, 0x5D, 0x8B, + 0x6D, 0x3F, 0x3C, 0x19, 0x40, 0x03, 0x71, 0x05, 0x40, 0x43, 0x9F, 0x7A, 0x8D, 0x84, 0x96, 0xB8, + 0x65, 0x58, 0x05, 0x59, 0x85, 0x88, 0x69, 0x99, 0x97, 0xC4, 0xCC, 0x42, 0xE9, 0x1A, 0x41, 0x56, + 0xBE, 0x0C, 0x10, 0xC9, 0xD3, 0x0B, 0xCD, 0x9D, 0x3B, 0x0E, 0xD8, 0x20, 0xB2, 0x00, 0x36, 0x28, + 0xDF, 0x55, 0x86, 0xE8, 0xFF, 0xDC, 0x78, 0x16, 0x51, 0x9E, 0x90, 0xC0, 0xA3, 0x47, 0x49, 0x6C, + 0xB8, 0xC8, 0xC0, 0xCA, 0xF8, 0xA8, 0x37, 0xD6, 0xFE, 0xD2, 0x73, 0x47, 0xF6, 0x38, 0xCE, 0xB3, + 0x9C, 0x24, 0x48, 0xD6, 0x0F, 0x13, 0x82, 0x97, 0x6A, 0x1C, 0x20, 0xC4, 0xB6, 0xA8, 0x80, 0xE8, + 0x8B, 0x39, 0x33, 0xB3, 0xB1, 0x4F, 0xA9, 0xD5, 0xD7, 0x09, 0x7F, 0x65, 0x5F, 0x03, 0xE4, 0x8F, + 0xC6, 0x1C, 0x5F, 0x10, 0xF5, 0x4E, 0xD4, 0x95, 0x8C, 0x71, 0x9C, 0xC0, 0x88, 0x8C, 0xA5, 0xE8, + 0xC6, 0x1F, 0xC5, 0x87, 0x2F, 0xAF, 0xE2, 0x2F, 0xD0, 0x92, 0x3F, 0x02, 0x4A, 0x3B, 0x07, 0x34, + 0xF8, 0x82, 0x2D, 0x29, 0xB5, 0x67, 0x6B, 0x03, 0xDA, 0x30, 0x07, 0x09, 0xED, 0x20, 0x8B, 0xA4, + 0x90, 0x72, 0xF1, 0xF6, 0x62, 0x85, 0x40, 0x28, 0xBA, 0xC5, 0x10, 0x45, 0x41, 0x7B, 0x85, 0xC3, + 0x22, 0x54, 0xA9, 0x9D, 0x8F, 0x0A, 0x84, 0xCC, 0x11, 0xEB, 0x6C, 0x63, 0x1F, 0x1B, 0xA2, 0x23, + 0x72, 0xEE, 0x63, 0xC9, 0xEB, 0xB9, 0x3D, 0x69, 0xA9, 0x4D, 0xD2, 0x99, 0x7E, 0x06, 0x5A, 0xAB, + 0x2B, 0xA8, 0x87, 0xA6, 0xAF, 0xF0, 0x29, 0x81, 0x88, 0x87, 0xE8, 0x42, 0xB2, 0x7C, 0x15, 0x6E, + 0x1D, 0x4D, 0x5F, 0xCB, 0x76, 0xC6, 0x92, 0x6C, 0x9C, 0x61, 0x63, 0x43, 0xBE, 0xA3, 0x9C, 0xD3, + 0xD5, 0xE4, 0xEF, 0x0B, 0xCA, 0x99, 0x61, 0xCB, 0x74, 0x53, 0x80, 0x93, 0x2D, 0xEB, 0xA6, 0x91, + 0xCE, 0x87, 0x53, 0x3B, 0x54, 0x20, 0xAC, 0x75, 0x6B, 0xEB, 0x64, 0x2E, 0xD9, 0xCB, 0x59, 0xA4, + 0xA4, 0x45, 0x3D, 0x20, 0x4A, 0x4C, 0xC7, 0xD3, 0xEF, 0x71, 0x78, 0xCE, 0xD3, 0x1B, 0xC3, 0xC7, + 0x49, 0x76, 0x54, 0x70, 0x6A, 0xF1, 0x87, 0xA1, 0x60, 0xAB, 0x96, 0x14, 0x45, 0x72, 0xDD, 0x52, + 0xAC, 0x15, 0x26, 0xC7, 0x00, 0xF2, 0x62, 0xD9, 0xEF, 0x3E, 0x01, 0xB8, 0x00, 0x27, 0x35, 0xB4, + 0xEF, 0xFF, 0xA2, 0x28, 0x6E, 0xB5, 0x11, 0x44, 0x99, 0x60, 0x42, 0x2C, 0xBA, 0x24, 0x11, 0xE2, + 0x27, 0x39, 0x71, 0xC1, 0x27, 0xB1, 0x4E, 0x79, 0xFB, 0x7B, 0x64, 0x21, 0x51, 0x92, 0x2A, 0x1D, + 0xA6, 0xD0, 0xE5, 0xEC, 0xE2, 0x11, 0x0A, 0x2B, 0xEC, 0x15, 0x93, 0x52, 0xF8, 0x63, 0x11, 0xC8, + 0x69, 0x43, 0x35, 0x04, 0xDD, 0xFC, 0x08, 0x75, 0x4F, 0xCA, 0x4C, 0x1B, 0x7C, 0x80, 0x05, 0x1A, + 0xB0, 0x44, 0xA8, 0x64, 0x3A, 0xC2, 0x61, 0x14, 0x13, 0x53, 0x42, 0xC2, 0x8C, 0x19, 0xCE, 0x4B, + 0xF9, 0x5A, 0x2F, 0xAF, 0x1F, 0x22, 0x59, 0xFC, 0x11, 0xC0, 0xB0, 0xA8, 0xF1, 0x20, 0x12, 0x43, + 0x16, 0x07, 0x76, 0x20, 0x21, 0x48, 0x88, 0x28, 0x4F, 0x4C, 0xC9, 0xED, 0xD6, 0xB5, 0x38, 0x52, + 0xE5, 0x8E, 0xEA, 0x34, 0x39, 0xD3, 0xD2, 0x34, 0x4B, 0xFB, 0xFD, 0x8D, 0x9A, 0xCC, 0xBF, 0xF8, + 0x0C, 0x8C, 0x14, 0xF1, 0x1A, 0xEB, 0x90, 0x93, 0x19, 0x5C, 0x96, 0x90, 0x72, 0x87, 0x65, 0xB6, + 0xF8, 0x41, 0x78, 0xA3, 0xF8, 0xA0, 0x98, 0xCD, 0x0C, 0x2F, 0xE5, 0x5A, 0x30, 0x62, 0x30, 0x71, + 0x96, 0x1C, 0xED, 0x49, 0xE2, 0x51, 0xD6, 0x81, 0xB9, 0xE2, 0x62, 0xD6, 0xC5, 0xDC, 0xF5, 0xC6, + 0x26, 0x8B, 0xC2, 0x89, 0x57, 0xFA, 0x1C, 0x02, 0x95, 0x57, 0x0C, 0x70, 0x19, 0x3D, 0x77, 0x52, + 0x0A, 0x19, 0x3F, 0xA3, 0x22, 0xE1, 0xA0, 0x0F, 0xA0, 0x54, 0x5B, 0x17, 0xA1, 0x4D, 0x13, 0xA0, + 0x88, 0xB5, 0x1C, 0x36, 0xB1, 0x4B, 0x5D, 0x82, 0x97, 0x53, 0x4F, 0x11, 0xBC, 0xB4, 0x31, 0x5D, + 0x82, 0xA6, 0x7E, 0x5F, 0x0E, 0x2C, 0x3F, 0xED, 0x22, 0xD3, 0x6E, 0xDC, 0x54, 0x00, 0x8E, 0x1F, + 0xD1, 0x91, 0x40, 0x45, 0x36, 0x2B, 0x02, 0x8C, 0x5E, 0x8A, 0x52, 0x93, 0xF4, 0x1B, 0x84, 0xDE, + 0x8C, 0x6D, 0xCE, 0x4F, 0x85, 0xA1, 0x05, 0x9D, 0x25, 0x6D, 0xE3, 0xFD, 0x3A, 0x2F, 0xAE, 0x64, + 0xD9, 0x26, 0x97, 0x42, 0xE4, 0x4D, 0xFE, 0xB5, 0x64, 0x65, 0x4C, 0xA7, 0x59, 0x95, 0x3D, 0xA0, + 0xA5, 0xB4, 0x03, 0xDF, 0x64, 0xC9, 0x20, 0x7A, 0xA0, 0x05, 0x63, 0x15, 0x1E, 0xFE, 0xCE, 0xFA, + 0xC4, 0xE4, 0x9D, 0xB0, 0xA9, 0x46, 0x29, 0x2D, 0xDE, 0x2C, 0x4D, 0x4A, 0x3C, 0x15, 0xC5, 0xFC, + 0x3B, 0xC0, 0x2C, 0xC0, 0x5F, 0x90, 0xF0, 0x40, 0x93, 0xED, 0x2D, 0x27, 0x28, 0xC7, 0x62, 0xE2, + 0x51, 0x30, 0x49, 0xBC, 0x94, 0xC9, 0xD8, 0xD3, 0x50, 0x4F, 0x3F, 0x9B, 0x43, 0x48, 0x5E, 0x2F, + 0xC0, 0xF9, 0xC0, 0xDB, 0x17, 0xF5, 0xC6, 0x6D, 0x11, 0x3B, 0x4C, 0x5C, 0xB1, 0xED, 0x54, 0x25, + 0x82, 0xA6, 0x09, 0x35, 0xB6, 0x84, 0x7C, 0xD4, 0xE8, 0x64, 0x87, 0xB9, 0x72, 0xC5, 0xE0, 0x26, + 0x4F, 0xB0, 0x17, 0x59, 0xD1, 0xB2, 0xFA, 0x36, 0x81, 0x20, 0x4E, 0x00, 0x19, 0x62, 0x53, 0x25, + 0xAC, 0x64, 0x17, 0xA2, 0x81, 0xA0, 0x5D, 0xF6, 0xC1, 0x1C, 0xDA, 0x93, 0xD5, 0x7F, 0xAA, 0x5C, + 0x64, 0x02, 0x88, 0x9C, 0x29, 0x07, 0x05, 0x3E, 0x45, 0x65, 0x1A, 0xEE, 0x8D, 0x11, 0xC8, 0x4E, + 0x63, 0x02, 0x41, 0x21, 0xE1, 0x7E, 0x53, 0xD7, 0x59, 0x03, 0x9D, 0x3B, 0x00, 0x3B, 0x6B, 0xD3, + 0x6D, 0x27, 0x38, 0x8E, 0x41, 0x1B, 0xA0, 0x27, 0x89, 0xDB, 0xEC, 0x43, 0xD1, 0xE2, 0x3E, 0x3B, + 0x63, 0x0D, 0xA2, 0x5E, 0xF0, 0xD3, 0xCC, 0x6D, 0x63, 0x36, 0x23, 0xAE, 0x75, 0x39, 0xB1, 0x1D, + 0xAB, 0xCE, 0x40, 0xA3, 0x07, 0x6D, 0x7C, 0x8D, 0x7E, 0xE6, 0x98, 0x3E, 0xD4, 0xC1, 0xB1, 0x82, + 0x37, 0x5F, 0xB2, 0x6B, 0xF5, 0x5A, 0xCF, 0x12, 0xCF, 0xE4, 0xF0, 0x66, 0x6D, 0xCB, 0x37, 0x16, + 0x6F, 0xF0, 0x99, 0x3F, 0x6A, 0x0E, 0xCD, 0x4E, 0xB3, 0xC3, 0x1B, 0x84, 0x50, 0x6C, 0x09, 0x91, + 0x23, 0x5E, 0x7C, 0x36, 0xEA, 0x97, 0x0F, 0x6F, 0x63, 0xBC, 0xA1, 0xF7, 0x82, 0x5D, 0xAA, 0xD7, + 0xE8, 0x43, 0x83, 0x87, 0x7F, 0xCC, 0x70, 0xA9, 0x59, 0xA4, 0x19, 0x49, 0x8C, 0xF8, 0x3C, 0x20, + 0x8A, 0x8A, 0x35, 0xFF, 0x41, 0x46, 0x0A, 0x97, 0x5D, 0xC8, 0x13, 0x68, 0xEE, 0x75, 0x15, 0xA8, + 0x78, 0x5A, 0x10, 0xC1, 0x91, 0x93, 0x97, 0x30, 0xBC, 0xFD, 0x27, 0x31, 0x7C, 0xD0, 0xC7, 0x81, + 0x56, 0xD7, 0x3B, 0xFA, 0x41, 0x9D, 0x5E, 0x7F, 0x07, 0xEC, 0x4C, 0xEA, 0x8D, 0x83, 0x6E, 0xA3, + 0xD1, 0x0E, 0x40, 0x67, 0xA4, 0xDE, 0xEA, 0x89, 0x26, 0xF0, 0x87, 0xB6, 0x61, 0x9D, 0xE4, 0xDF, + 0x7F, 0xED, 0xCD, 0xFD, 0xA0, 0xA8, 0xC1, 0x3B, 0xDB, 0xC5, 0x4C, 0x5C, 0xD4, 0xE4, 0x1A, 0x06, + 0x2F, 0xAE, 0x95, 0x69, 0xA2, 0xD3, 0x87, 0x1C, 0xC5, 0x48, 0x93, 0x3E, 0xFB, 0x05, 0x25, 0xBF, + 0x54, 0xEC, 0xF3, 0x7A, 0x93, 0xE0, 0x4C, 0x79, 0x5D, 0xAC, 0x5D, 0xDD, 0xCA, 0xC6, 0x11, 0x57, + 0x74, 0x7C, 0xAE, 0x21, 0xA3, 0xFF, 0x54, 0xC0, 0xE2, 0x35, 0x52, 0x66, 0x0E, 0xBD, 0x4A, 0x19, + 0xAA, 0xAC, 0xAF, 0x0A, 0xEB, 0xD1, 0xE4, 0x44, 0x73, 0x7A, 0x8C, 0x9D, 0xAC, 0x3D, 0x2F, 0xE7, + 0xE0, 0xE3, 0x53, 0x11, 0x51, 0xD9, 0x35, 0x1C, 0x70, 0x46, 0xA1, 0x1F, 0x06, 0xA0, 0x45, 0xF9, + 0x08, 0x6E, 0x4B, 0x19, 0x8C, 0x8F, 0x56, 0x4B, 0x00, 0xA4, 0x57, 0x89, 0x4B, 0xB0, 0xD2, 0x28, + 0xB8, 0xB0, 0x5E, 0x48, 0xBF, 0xFC, 0x9A, 0xA2, 0x00, 0xAC, 0x59, 0xCE, 0x15, 0x51, 0x06, 0xDA, + 0x35, 0xA2, 0xA0, 0x87, 0x40, 0x7C, 0xD8, 0x26, 0x85, 0xBC, 0x9C, 0x61, 0x7D, 0x76, 0x48, 0x9F, + 0x8A, 0x85, 0x79, 0x43, 0xF9, 0xEC, 0x30, 0xFE, 0x56, 0x32, 0x10, 0xF1, 0x51, 0x81, 0x58, 0x84, + 0xA4, 0x58, 0xDE, 0x44, 0x96, 0xB7, 0x98, 0xCE, 0x28, 0x81, 0x90, 0xBF, 0x7D, 0xC0, 0xC4, 0x45, + 0x2A, 0x8A, 0x8B, 0x70, 0x71, 0x21, 0x40, 0x3C, 0xC2, 0x2D, 0x9F, 0x5B, 0x89, 0xEC, 0xFF, 0xD7, + 0xE7, 0x31, 0x67, 0x8B, 0x61, 0x21, 0x9D, 0x7C, 0xEE, 0x42, 0x62, 0xAF, 0x18, 0x20, 0xF1, 0x81, + 0x24, 0xC6, 0xD6, 0x62, 0x58, 0x8D, 0x2D, 0x31, 0xF7, 0x81, 0x00, 0x31, 0x5B, 0xEA, 0x19, 0x12, + 0xC1, 0x4A, 0xF4, 0xB2, 0x32, 0xCD, 0x70, 0x2D, 0x2D, 0xFA, 0x4C, 0x76, 0x44, 0x2C, 0x7B, 0xD3, + 0x57, 0x69, 0xB9, 0xC9, 0x9A, 0x49, 0x4C, 0x46, 0x73, 0x2C, 0xA5, 0xA0, 0x51, 0x4B, 0x09, 0x3A, + 0xA2, 0xA3, 0x10, 0x5A, 0x34, 0x62, 0x45, 0x63, 0x74, 0x5A, 0x49, 0x58, 0x51, 0xEB, 0xD8, 0x71, + 0x62, 0x04, 0x62, 0x8E, 0xE6, 0x38, 0x3D, 0xA7, 0xC7, 0x06, 0x2F, 0x8C, 0xD9, 0xD4, 0x10, 0x45, + 0x6E, 0x10, 0xB1, 0x94, 0x68, 0x13, 0x39, 0x08, 0x83, 0xCF, 0x23, 0xB3, 0x94, 0x14, 0xB6, 0xE6, + 0xA9, 0xBF, 0x77, 0x08, 0xCE, 0x87, 0xF0, 0x7D, 0x8C, 0xB8, 0x07, 0xD1, 0xF3, 0x35, 0xC7, 0x5B, + 0x10, 0x5C, 0xBF, 0x14, 0x8F, 0x9B, 0x68, 0x43, 0x02, 0x31, 0x95, 0xB0, 0x59, 0x2D, 0x8C, 0x41, + 0xE1, 0xC4, 0x0E, 0x60, 0x10, 0x8E, 0x9F, 0xB3, 0x24, 0x0F, 0xF5, 0x28, 0x21, 0x96, 0xB2, 0x97, + 0x9D, 0xED, 0x4F, 0x88, 0x93, 0xC1, 0xC4, 0xB2, 0x7C, 0xC8, 0x79, 0xCC, 0x04, 0xA2, 0xA2, 0x79, + 0xB4, 0x35, 0x44, 0x18, 0xDD, 0xFE, 0x6A, 0xA5, 0xA8, 0x66, 0xA0, 0x54, 0x90, 0x11, 0x58, 0x2C, + 0xCB, 0x98, 0xD7, 0x8C, 0x34, 0x55, 0x93, 0x95, 0x05, 0x1A, 0xC5, 0x39, 0x7B, 0x65, 0x94, 0xCF, + 0xD7, 0x0A, 0x93, 0x38, 0x4B, 0xAC, 0xEC, 0x77, 0x7E, 0x28, 0x76, 0x16, 0xB0, 0x33, 0x2C, 0x18, + 0x07, 0x0F, 0xCE, 0x0F, 0x27, 0xE1, 0xD4, 0x19, 0x3C, 0xF8, 0x5F, 0x94, 0x18, 0xA6, 0xBF, 0xBA, + 0xAB, 0x00, 0x00 +}; + + +//File: index_ov3660.html.gz, Size: 8887 +#define index_ov3660_html_gz_len 8887 +const uint8_t index_ov3660_html_gz[] = { + 0x1F, 0x8B, 0x08, 0x08, 0xA3, 0xFA, 0x69, 0x5E, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, + 0x6F, 0x76, 0x33, 0x36, 0x36, 0x30, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xED, 0x3D, 0x69, 0x73, + 0xDB, 0x46, 0xB2, 0xDF, 0xFD, 0x2B, 0x60, 0x24, 0x6B, 0x51, 0x65, 0x91, 0xE2, 0xAD, 0x23, 0x12, + 0xFD, 0x6C, 0x59, 0xB1, 0x53, 0x1B, 0x67, 0xBD, 0x71, 0xE2, 0x24, 0xB5, 0xB5, 0xE5, 0x80, 0xC4, + 0x90, 0x44, 0x0C, 0x02, 0x5C, 0x00, 0xD4, 0x91, 0x94, 0x7E, 0xC7, 0xFB, 0x41, 0xEF, 0x8F, 0xBD, + 0xEE, 0x39, 0x70, 0x71, 0x00, 0x0C, 0x00, 0x11, 0x52, 0xF2, 0x1E, 0x5D, 0x65, 0xE1, 0x98, 0xEE, + 0xE9, 0x7B, 0x7A, 0x7A, 0x06, 0xC0, 0xD9, 0x53, 0xD3, 0x9D, 0x05, 0xB7, 0x6B, 0xA2, 0x2D, 0x83, + 0x95, 0x3D, 0x79, 0x72, 0xC6, 0xFE, 0x68, 0xF0, 0x3B, 0x5B, 0x12, 0xC3, 0x64, 0x87, 0xF4, 0x74, + 0x45, 0x02, 0x43, 0x9B, 0x2D, 0x0D, 0xCF, 0x27, 0xC1, 0xB9, 0xBE, 0x09, 0xE6, 0xED, 0x63, 0x3D, + 0x7D, 0xDB, 0x31, 0x56, 0xE4, 0x5C, 0xBF, 0xB2, 0xC8, 0xF5, 0xDA, 0xF5, 0x02, 0x5D, 0x9B, 0xB9, + 0x4E, 0x40, 0x1C, 0x68, 0x7E, 0x6D, 0x99, 0xC1, 0xF2, 0xDC, 0x24, 0x57, 0xD6, 0x8C, 0xB4, 0xE9, + 0xC9, 0x81, 0xE5, 0x58, 0x81, 0x65, 0xD8, 0x6D, 0x7F, 0x66, 0xD8, 0xE4, 0xBC, 0x17, 0xC7, 0x15, + 0x58, 0x81, 0x4D, 0x26, 0x97, 0x1F, 0xDE, 0x0F, 0xFA, 0xDA, 0x3F, 0x3E, 0x0E, 0xC6, 0xE3, 0xEE, + 0xD9, 0x21, 0xBB, 0x16, 0xB5, 0xF1, 0x83, 0xDB, 0xF8, 0x39, 0xFE, 0xA6, 0xAE, 0x79, 0xAB, 0xFD, + 0x91, 0xB8, 0x84, 0xBF, 0x39, 0x10, 0xD1, 0x9E, 0x1B, 0x2B, 0xCB, 0xBE, 0x3D, 0xD5, 0x5E, 0x7A, + 0xD0, 0xE7, 0xC1, 0x5B, 0x62, 0x5F, 0x91, 0xC0, 0x9A, 0x19, 0x07, 0xBE, 0xE1, 0xF8, 0x6D, 0x9F, + 0x78, 0xD6, 0xFC, 0xAB, 0x2D, 0xC0, 0xA9, 0x31, 0xFB, 0xBC, 0xF0, 0xDC, 0x8D, 0x63, 0x9E, 0x6A, + 0x5F, 0xF4, 0x8E, 0xF1, 0xDF, 0x76, 0xA3, 0x99, 0x6B, 0xBB, 0x1E, 0xDC, 0xBF, 0xFC, 0x1A, 0xFF, + 0x6D, 0xDF, 0xA7, 0xBD, 0xFB, 0xD6, 0xEF, 0xE4, 0x54, 0xEB, 0x8D, 0xD7, 0x37, 0x89, 0xFB, 0x77, + 0x4F, 0x12, 0xA7, 0xCB, 0x7E, 0x16, 0xF5, 0x1C, 0xFE, 0x38, 0x1F, 0xDE, 0x27, 0xB3, 0xC0, 0x72, + 0x9D, 0xCE, 0xCA, 0xB0, 0x1C, 0x09, 0x26, 0xD3, 0xF2, 0xD7, 0xB6, 0x01, 0x32, 0x98, 0xDB, 0x24, + 0x17, 0xCF, 0x17, 0x2B, 0xE2, 0x6C, 0x0E, 0x0A, 0xB0, 0x21, 0x92, 0xB6, 0x69, 0x79, 0xAC, 0xD5, + 0x29, 0xCA, 0x61, 0xB3, 0x72, 0x0A, 0xD1, 0xE6, 0xD1, 0xE5, 0xB8, 0x0E, 0x91, 0x08, 0x10, 0x3B, + 0xBA, 0xF6, 0x8C, 0x35, 0x36, 0xC0, 0xBF, 0xDB, 0x4D, 0x56, 0x96, 0xC3, 0x8C, 0xEA, 0x54, 0x1B, + 0x0C, 0xBB, 0xEB, 0x9B, 0x02, 0x55, 0x0E, 0xC6, 0xF8, 0x6F, 0xBB, 0xD1, 0xDA, 0x30, 0x4D, 0xCB, + 0x59, 0x9C, 0x6A, 0xC7, 0x52, 0x14, 0xAE, 0x67, 0x12, 0xAF, 0xED, 0x19, 0xA6, 0xB5, 0xF1, 0x4F, + 0xB5, 0xA1, 0xAC, 0xCD, 0xCA, 0xF0, 0x16, 0x40, 0x4B, 0xE0, 0x02, 0xB1, 0xED, 0x9E, 0x94, 0x12, + 0xDE, 0xC4, 0xB3, 0x16, 0xCB, 0x00, 0x54, 0xBA, 0xD5, 0x26, 0x2D, 0x34, 0xEE, 0x42, 0x45, 0xFA, + 0xCC, 0x95, 0x9B, 0x5C, 0x6A, 0x86, 0x6D, 0x2D, 0x9C, 0xB6, 0x15, 0x90, 0x15, 0xB0, 0xE3, 0x07, + 0x1E, 0x09, 0x66, 0xCB, 0x3C, 0x52, 0xE6, 0xD6, 0x62, 0xE3, 0x11, 0x09, 0x21, 0xA1, 0xDC, 0x72, + 0x18, 0x86, 0x9B, 0xDB, 0xB7, 0xDA, 0xD7, 0x64, 0xFA, 0xD9, 0x0A, 0xDA, 0x5C, 0x26, 0x53, 0x32, + 0x77, 0x3D, 0x22, 0x6D, 0x29, 0x5A, 0xD8, 0xEE, 0xEC, 0x73, 0xDB, 0x0F, 0x0C, 0x2F, 0x50, 0x41, + 0x68, 0xCC, 0x03, 0xE2, 0x15, 0xE3, 0x23, 0x68, 0x15, 0xC5, 0xD8, 0xB2, 0xBB, 0xE5, 0x0D, 0x2C, + 0xC7, 0xB6, 0x1C, 0xA2, 0x4E, 0x5E, 0x56, 0xBF, 0x49, 0x74, 0xAC, 0x95, 0x82, 0x62, 0xAC, 0xD5, + 0x22, 0xCF, 0x4A, 0x28, 0xAF, 0xDB, 0x9D, 0x71, 0xBF, 0xE9, 0x75, 0xBB, 0x7F, 0xDB, 0xBE, 0xB9, + 0x24, 0xCC, 0x4C, 0x8D, 0x4D, 0xE0, 0xD6, 0xF7, 0x88, 0x2D, 0xB7, 0x4A, 0xF1, 0xF1, 0x5F, 0x2B, + 0x62, 0x5A, 0x86, 0xD6, 0x8A, 0xB9, 0xF3, 0x71, 0x17, 0x6C, 0x6A, 0x5F, 0x33, 0x1C, 0x53, 0x6B, + 0xB9, 0x9E, 0x05, 0x8E, 0x60, 0xD0, 0x70, 0x63, 0xC3, 0x15, 0x18, 0x38, 0xD6, 0x64, 0x5F, 0xC2, + 0x72, 0x8E, 0xCF, 0xC4, 0x25, 0x22, 0x77, 0x1B, 0xFC, 0x29, 0x84, 0x1C, 0xFC, 0x15, 0x3A, 0x90, + 0x84, 0x47, 0x8A, 0x3E, 0x4F, 0x5F, 0x71, 0x0A, 0xB3, 0x74, 0x86, 0xBF, 0x95, 0x71, 0xD3, 0xCE, + 0xD5, 0x9D, 0x68, 0x24, 0x74, 0x08, 0xC3, 0xEC, 0xAC, 0x05, 0x4D, 0xAF, 0x96, 0x5A, 0x5B, 0xC3, + 0x28, 0xB9, 0x2F, 0x87, 0xE1, 0x48, 0xE5, 0x2A, 0xC7, 0x5F, 0xDC, 0x28, 0x4A, 0xB0, 0x2B, 0x67, + 0x35, 0x8A, 0x1D, 0xEC, 0x9F, 0xCC, 0x86, 0x18, 0x27, 0x99, 0x51, 0x04, 0x7F, 0xEA, 0x91, 0x24, + 0x42, 0x56, 0x18, 0x4D, 0x24, 0x88, 0xB3, 0x23, 0xCA, 0x16, 0xDE, 0x2C, 0xEF, 0x96, 0x60, 0xCD, + 0x27, 0x41, 0x35, 0xBA, 0x48, 0x10, 0xE7, 0xD1, 0x50, 0x18, 0x65, 0xF0, 0x77, 0xA7, 0x90, 0x6F, + 0x7C, 0x31, 0xDD, 0x04, 0x81, 0xEB, 0xF8, 0xB5, 0x86, 0xA8, 0x2C, 0x3F, 0xFB, 0x6D, 0xE3, 0x07, + 0xD6, 0xFC, 0xB6, 0xCD, 0x5D, 0x1A, 0xFC, 0x6C, 0x6D, 0x40, 0x0A, 0x39, 0x25, 0xC1, 0x35, 0x21, + 0xF9, 0xE9, 0x86, 0x63, 0x5C, 0x41, 0xDC, 0x59, 0x2C, 0x6C, 0x99, 0xED, 0xCD, 0x36, 0x9E, 0x8F, + 0x79, 0xDB, 0xDA, 0xB5, 0x00, 0xB1, 0xB7, 0xDD, 0x71, 0xD2, 0x07, 0x15, 0x3B, 0x6A, 0xCF, 0xA6, + 0x92, 0xBE, 0xDC, 0x4D, 0x80, 0x32, 0x96, 0x6A, 0xC2, 0x05, 0x76, 0xAC, 0xE0, 0x56, 0x7A, 0x8F, + 0x7B, 0xA2, 0xE4, 0x8E, 0x70, 0xC1, 0xDC, 0x61, 0x21, 0x49, 0xD7, 0xE9, 0x6C, 0x49, 0x66, 0x9F, + 0x89, 0xF9, 0xBC, 0x30, 0x0D, 0x2B, 0x4A, 0x0F, 0x3B, 0x96, 0xB3, 0xDE, 0x04, 0x6D, 0x4C, 0xA7, + 0xD6, 0x3B, 0xD1, 0x39, 0x35, 0x48, 0xC1, 0x62, 0xBF, 0x9F, 0x97, 0x54, 0x8C, 0xD6, 0x37, 0xF9, + 0x42, 0x88, 0x13, 0x3B, 0xB1, 0x8D, 0x29, 0xB1, 0xF3, 0x48, 0xE6, 0xCE, 0x90, 0x11, 0x76, 0x79, + 0xAC, 0xCA, 0xCE, 0xDD, 0x28, 0x65, 0xD1, 0xE0, 0x35, 0x3C, 0xFA, 0x9B, 0xB2, 0x1C, 0xE9, 0xF1, + 0x41, 0xE2, 0x92, 0x4F, 0x6C, 0x70, 0xB0, 0xAC, 0xD4, 0x1B, 0xDA, 0x5C, 0x03, 0x0D, 0xB9, 0x1D, + 0x78, 0x86, 0xB3, 0x20, 0x10, 0x0B, 0x6E, 0x0E, 0xC4, 0x61, 0xFE, 0xC4, 0x40, 0x89, 0x7D, 0x0C, + 0xD5, 0xA3, 0xFC, 0x89, 0x08, 0x0B, 0x08, 0x07, 0x5A, 0x87, 0x1D, 0x54, 0xC8, 0x4A, 0x62, 0xFA, + 0xCD, 0x25, 0xA4, 0x27, 0xB5, 0x0E, 0x96, 0x98, 0x48, 0x3D, 0x27, 0x69, 0x5B, 0xD2, 0x44, 0xBF, + 0x30, 0x34, 0x88, 0x29, 0xDF, 0x7C, 0x5E, 0x34, 0x69, 0x9C, 0xCF, 0x07, 0xDD, 0xC1, 0xB0, 0x30, + 0x73, 0x92, 0x72, 0x99, 0x9A, 0x38, 0x4A, 0x42, 0x47, 0x18, 0x56, 0x72, 0x8D, 0xC0, 0x37, 0xAE, + 0xA4, 0x49, 0xBB, 0xEB, 0x5B, 0x6C, 0xE6, 0x66, 0x4C, 0x7D, 0x98, 0xBB, 0x05, 0x92, 0xA9, 0x17, + 0x37, 0xF4, 0xBE, 0x94, 0x3E, 0x9A, 0xD2, 0x49, 0x5D, 0x40, 0x88, 0x57, 0x4E, 0x76, 0x42, 0x03, + 0xF2, 0x26, 0x31, 0x05, 0x4B, 0x93, 0xCA, 0x80, 0xDC, 0x04, 0x6D, 0x93, 0xCC, 0x5C, 0x8F, 0x65, + 0x83, 0x19, 0x33, 0xC7, 0x94, 0x22, 0x8B, 0x2D, 0xF6, 0x74, 0xE9, 0x5E, 0x11, 0x4F, 0x22, 0xAC, + 0x94, 0x52, 0x87, 0x27, 0x43, 0x53, 0x01, 0x9B, 0x01, 0xC3, 0xA3, 0x54, 0xF6, 0x49, 0x74, 0xFD, + 0xDE, 0xAC, 0x9F, 0xEB, 0xC7, 0x0C, 0x5D, 0x07, 0x7C, 0xC6, 0x98, 0xDA, 0xC4, 0xCC, 0x19, 0xCD, + 0x4C, 0x32, 0x37, 0x36, 0x76, 0x50, 0x60, 0x95, 0x46, 0x17, 0xFF, 0xE5, 0xF5, 0x48, 0xC3, 0xD0, + 0xBF, 0xB0, 0x2E, 0x74, 0x4E, 0x03, 0xC7, 0xBF, 0x25, 0x7D, 0x8A, 0x54, 0xC3, 0x58, 0xAF, 0x89, + 0x01, 0xAD, 0x66, 0x24, 0x4B, 0x0F, 0x4A, 0x53, 0x0C, 0x79, 0x9C, 0x57, 0x9A, 0xB7, 0x17, 0x3A, + 0x6C, 0x98, 0x3C, 0x96, 0xE2, 0xF9, 0x74, 0xEE, 0xCE, 0x36, 0xB2, 0xAC, 0x46, 0xCD, 0xF1, 0xB6, + 0xF1, 0x9D, 0x0A, 0x91, 0xF9, 0xB6, 0x45, 0xDD, 0x7F, 0xE3, 0x38, 0xA8, 0xD1, 0x76, 0xE0, 0x01, + 0x9B, 0x92, 0x8E, 0xD4, 0x04, 0x57, 0x29, 0x86, 0x25, 0x04, 0x9B, 0x55, 0xBB, 0x4A, 0x85, 0x29, + 0x49, 0x38, 0x0D, 0x23, 0xAD, 0x06, 0x31, 0xC4, 0x32, 0x05, 0xAA, 0x7A, 0x72, 0x09, 0x96, 0x9B, + 0x95, 0x2C, 0x8F, 0x12, 0x9D, 0xF5, 0x60, 0xD0, 0x67, 0xDD, 0x79, 0x8B, 0xA9, 0xD1, 0xEA, 0x1E, + 0x74, 0x0F, 0x06, 0xF0, 0x9F, 0x64, 0x3E, 0x93, 0x6F, 0x5C, 0x5C, 0xBC, 0x19, 0x96, 0x97, 0x0A, + 0xD1, 0xC5, 0x65, 0xA5, 0xAC, 0x60, 0x5F, 0xA8, 0x0B, 0x75, 0x4F, 0x4A, 0xD6, 0x97, 0x7A, 0x9D, + 0x82, 0x71, 0x38, 0xC3, 0xA4, 0xCB, 0x1B, 0xA2, 0xC4, 0x5A, 0xCA, 0xAA, 0x78, 0xE5, 0xFE, 0xDE, + 0x66, 0x49, 0xC8, 0xFF, 0x79, 0x6B, 0x8F, 0x89, 0xE2, 0x2F, 0x6D, 0xE9, 0xA5, 0xE5, 0xE2, 0x3F, + 0xB4, 0x6D, 0x74, 0xB3, 0xB5, 0xDE, 0xE6, 0x59, 0x1F, 0x50, 0xE8, 0xC0, 0x1C, 0xD4, 0x83, 0xC9, + 0x68, 0x66, 0x66, 0x18, 0x6B, 0x53, 0x41, 0x06, 0x73, 0xCB, 0xB6, 0xDB, 0xB6, 0x7B, 0x5D, 0x9C, + 0x89, 0xE4, 0x5B, 0xF2, 0x96, 0x9D, 0x16, 0x9B, 0x7C, 0x55, 0x6A, 0x37, 0x10, 0xB9, 0xFE, 0x14, + 0xD4, 0xFE, 0xB5, 0x1D, 0x2E, 0xD7, 0x35, 0xAA, 0x0D, 0x14, 0x15, 0xEC, 0xB1, 0x5E, 0x47, 0x4A, + 0xA6, 0xC4, 0x32, 0xC1, 0xFC, 0x69, 0xCF, 0xB5, 0x15, 0xCC, 0x96, 0x15, 0xA6, 0x9E, 0xD1, 0xC4, + 0xC8, 0x23, 0xB6, 0x81, 0x19, 0x7C, 0xA5, 0x0A, 0x45, 0xE1, 0xF4, 0x2D, 0x0E, 0xAE, 0xC2, 0x09, + 0x15, 0xDD, 0xE3, 0xA9, 0x2E, 0x75, 0x58, 0xEE, 0x90, 0x1D, 0xAB, 0xE5, 0x66, 0x5D, 0x90, 0xEE, + 0x27, 0x3D, 0x43, 0xDE, 0xA8, 0x44, 0x44, 0x17, 0x41, 0x7B, 0xE1, 0x91, 0x5B, 0x05, 0x66, 0x0E, + 0xF8, 0xDF, 0x53, 0x56, 0x3F, 0xAE, 0x5E, 0x2A, 0xA1, 0x03, 0x00, 0xB7, 0xA2, 0xCE, 0xD0, 0x57, + 0xE8, 0x3A, 0xBB, 0x4B, 0x15, 0x7B, 0x0C, 0xAB, 0xA3, 0xBA, 0xAE, 0x10, 0x6E, 0x72, 0x86, 0x50, + 0xB9, 0xA9, 0x8A, 0xD1, 0x57, 0x3E, 0x9F, 0x27, 0xF3, 0x20, 0x63, 0xF1, 0x87, 0xE6, 0xA9, 0x83, + 0xFC, 0xE8, 0xD6, 0x8E, 0x55, 0x53, 0x0A, 0x23, 0x47, 0x58, 0xC4, 0xCC, 0xB6, 0x3E, 0x29, 0x66, + 0x8C, 0x9E, 0xA5, 0x91, 0x67, 0xAB, 0x44, 0xA4, 0xCF, 0x54, 0xCD, 0xD0, 0x66, 0xC5, 0x87, 0x7C, + 0x50, 0x0F, 0xF9, 0xB9, 0xD5, 0x1F, 0x4B, 0xD7, 0x56, 0x72, 0x1A, 0xE7, 0x91, 0x96, 0x59, 0x05, + 0xDC, 0x1E, 0xB2, 0x32, 0x27, 0xC8, 0xF1, 0x58, 0x24, 0x55, 0x54, 0xBE, 0x57, 0xE6, 0x45, 0x98, + 0xED, 0x4A, 0x56, 0xAE, 0xB1, 0x5B, 0x2B, 0x03, 0xD2, 0x5E, 0x34, 0x57, 0x03, 0x30, 0xCA, 0xF4, + 0xA7, 0x62, 0xEE, 0xB1, 0x1A, 0x6B, 0x6F, 0xDC, 0x2D, 0xE8, 0x72, 0x66, 0xBB, 0x7E, 0xCD, 0x02, + 0x58, 0x76, 0xFD, 0x4B, 0x7A, 0x47, 0x69, 0xE8, 0xCE, 0xF5, 0xA9, 0x7C, 0x77, 0x4C, 0xC9, 0xBC, + 0xD7, 0x95, 0x46, 0xDA, 0xDC, 0x2A, 0x25, 0xAD, 0xA0, 0xD1, 0xF5, 0xCB, 0x53, 0x6D, 0x46, 0xE4, + 0x61, 0x34, 0x59, 0xA8, 0x53, 0x29, 0x95, 0xE6, 0xEA, 0x61, 0x69, 0x99, 0x26, 0xC9, 0xAD, 0x05, + 0xE3, 0x9C, 0x57, 0x31, 0x79, 0x40, 0xFA, 0x65, 0x45, 0xA9, 0x9D, 0x38, 0x45, 0xEE, 0xB6, 0x86, + 0xDE, 0xAE, 0x3D, 0x86, 0x0F, 0x34, 0x59, 0x95, 0xF4, 0x64, 0x2A, 0x92, 0x4B, 0xAA, 0xD4, 0xB9, + 0xC3, 0x5A, 0x2B, 0x8A, 0x0C, 0xE4, 0x80, 0xAD, 0xB6, 0xA3, 0x79, 0x8A, 0x2A, 0xBA, 0x90, 0xD2, + 0xE1, 0x6B, 0x4B, 0x7C, 0x19, 0xB0, 0x9D, 0xB5, 0xBA, 0x72, 0x8F, 0x4B, 0x6D, 0xD4, 0x02, 0xD2, + 0xFD, 0x66, 0x8A, 0xE6, 0x81, 0x32, 0xA3, 0x1C, 0x22, 0xC3, 0x21, 0x46, 0x6C, 0xAE, 0x4A, 0xB6, + 0x2A, 0xEB, 0x1C, 0xE1, 0xF9, 0xD9, 0x61, 0x6C, 0x3B, 0xDC, 0xD9, 0x61, 0xB4, 0x73, 0xEF, 0x0C, + 0xF7, 0xC4, 0xC5, 0x77, 0xCD, 0xF1, 0x8E, 0x66, 0xB6, 0xE1, 0xFB, 0xE7, 0x3A, 0xEE, 0xED, 0xD2, + 0x93, 0x9B, 0xE8, 0xCE, 0x4C, 0xEB, 0x4A, 0xB3, 0xCC, 0x73, 0xDD, 0x76, 0x17, 0x6E, 0xEA, 0x1E, + 0xBD, 0xCF, 0xD4, 0x0C, 0x03, 0xD9, 0xB9, 0x9E, 0x58, 0x60, 0xD4, 0x29, 0x54, 0x74, 0x49, 0x9F, + 0x3C, 0xFB, 0xE2, 0xE4, 0xE8, 0x68, 0xFC, 0xD5, 0x33, 0x67, 0xEA, 0xAF, 0xF9, 0xFF, 0x3F, 0xB0, + 0xF5, 0x58, 0xB6, 0xA9, 0x0F, 0xC6, 0xB6, 0x20, 0x00, 0xDB, 0xF3, 0xCF, 0x0E, 0x29, 0xD2, 0x14, + 0x21, 0x87, 0x40, 0x49, 0x06, 0x6D, 0x3C, 0xDF, 0x91, 0x91, 0x27, 0x9A, 0xF8, 0x30, 0x84, 0x4F, + 0x0D, 0x4F, 0xD2, 0x84, 0x36, 0x63, 0xD9, 0x34, 0x8D, 0x25, 0x3A, 0x55, 0xCA, 0xD4, 0xBD, 0x49, + 0x73, 0x40, 0x99, 0xE2, 0x1A, 0xE3, 0xAD, 0x88, 0x99, 0x85, 0x10, 0xC0, 0x28, 0x38, 0xAE, 0xAE, + 0x42, 0x1B, 0x69, 0xA3, 0x84, 0x0A, 0xB0, 0xF1, 0xCD, 0xCC, 0xFE, 0x2C, 0x94, 0xAF, 0x0B, 0xA5, + 0x38, 0x6E, 0xC0, 0x62, 0x65, 0x46, 0x57, 0x09, 0x56, 0x39, 0x4C, 0x6C, 0xDD, 0x90, 0x71, 0x01, + 0xA2, 0x6D, 0x53, 0xEC, 0xEC, 0x5A, 0x3E, 0x26, 0x8A, 0x2D, 0xA6, 0x57, 0x01, 0xAC, 0x4F, 0x7E, + 0xBE, 0xF8, 0xF6, 0xEF, 0xDA, 0xBB, 0xB7, 0xBF, 0x4B, 0x35, 0x54, 0x44, 0x14, 0x06, 0x69, 0x85, + 0x9E, 0x29, 0x18, 0xD3, 0x87, 0x90, 0x89, 0xCE, 0x35, 0x43, 0x31, 0xE0, 0x70, 0x6F, 0x13, 0x67, + 0x11, 0x2C, 0xCF, 0xF5, 0x9E, 0x8E, 0x7B, 0x5A, 0xC4, 0x59, 0x5F, 0xD7, 0x30, 0x80, 0xD3, 0x83, + 0x2B, 0xC3, 0xDE, 0xE0, 0x51, 0x57, 0x85, 0xD7, 0x6D, 0xD3, 0x92, 0x36, 0xE3, 0x91, 0x25, 0x94, + 0x71, 0x2C, 0x12, 0x27, 0xA5, 0xAC, 0x4F, 0x3E, 0x90, 0xE0, 0xEC, 0x90, 0xDD, 0x2A, 0xD0, 0x5A, + 0x7E, 0xDF, 0xE0, 0xC9, 0xCC, 0x1C, 0xF2, 0x4C, 0x28, 0x4F, 0xF1, 0x73, 0xCF, 0x58, 0x11, 0x94, + 0x8A, 0x92, 0xE6, 0xE3, 0x5A, 0x0F, 0x21, 0xF5, 0xC9, 0xF7, 0x84, 0x66, 0x44, 0x40, 0x86, 0x92, + 0xE2, 0xCF, 0x78, 0x92, 0x9A, 0xE8, 0x3F, 0xB4, 0x67, 0xBE, 0x28, 0xD5, 0x36, 0x98, 0x99, 0x2B, + 0xC8, 0xFD, 0x69, 0xBB, 0xAD, 0x0D, 0xDE, 0xBD, 0xD7, 0xDA, 0x6D, 0x85, 0xC6, 0xEE, 0x9A, 0xBA, + 0x13, 0xD7, 0x7F, 0xEF, 0x48, 0x9F, 0xFC, 0xF3, 0xE7, 0x37, 0x2F, 0x5B, 0xFD, 0xEE, 0xF0, 0xF8, + 0xA6, 0x37, 0x1A, 0x0F, 0xF7, 0xCF, 0x0E, 0x59, 0x93, 0xF2, 0xB8, 0xC6, 0xFA, 0xE4, 0x3D, 0x12, + 0xD2, 0x3A, 0x1E, 0x0F, 0xEB, 0xE2, 0x1A, 0x21, 0xAE, 0xB7, 0xAF, 0x5B, 0x47, 0xFD, 0xEE, 0x4D, + 0xAF, 0x7F, 0xDC, 0xAD, 0x81, 0x6A, 0xA8, 0x4F, 0xBE, 0x06, 0x4C, 0xBD, 0x13, 0x44, 0xD5, 0x2D, + 0x87, 0x0A, 0x45, 0xDB, 0xAF, 0x28, 0xDA, 0x81, 0x3E, 0xF9, 0x11, 0x45, 0x0B, 0x39, 0x37, 0xF2, + 0xD0, 0xAD, 0xC3, 0x43, 0x1F, 0x5C, 0x86, 0xE2, 0x02, 0x51, 0x00, 0x13, 0xFD, 0x3A, 0xA2, 0xED, + 0xE9, 0x13, 0x14, 0x07, 0x62, 0x02, 0xE9, 0xD6, 0x40, 0x04, 0xB1, 0x83, 0xD2, 0x04, 0xE4, 0xDC, + 0x1C, 0x8D, 0x8F, 0xAB, 0x63, 0x3A, 0x01, 0xEE, 0x3E, 0x02, 0xA6, 0x63, 0x10, 0xD4, 0xB8, 0x8E, + 0x9C, 0x8E, 0xF5, 0x09, 0xE2, 0x19, 0x0F, 0xBB, 0x37, 0xC3, 0x3A, 0x36, 0x03, 0x5E, 0xF1, 0x16, + 0x11, 0x01, 0x92, 0x9B, 0x41, 0x1D, 0x19, 0x81, 0x4B, 0x5C, 0x7C, 0xF3, 0x75, 0x6B, 0x08, 0x8C, + 0xF5, 0x4F, 0xC6, 0xD5, 0xF1, 0x80, 0x3B, 0xFC, 0x13, 0x09, 0x02, 0x62, 0x6E, 0xFA, 0xC3, 0x1A, + 0x04, 0x81, 0x33, 0x00, 0x3C, 0xE2, 0xA8, 0x8C, 0x02, 0xEC, 0xFA, 0x2D, 0x25, 0x06, 0x11, 0xF5, + 0x8E, 0x6A, 0x70, 0x05, 0x56, 0xFD, 0x4F, 0x14, 0x0F, 0x20, 0xB9, 0xE9, 0x0D, 0xEB, 0xD8, 0x34, + 0x20, 0xA2, 0x24, 0x81, 0xAF, 0xA1, 0xAB, 0x55, 0xC7, 0x04, 0x36, 0x7D, 0x32, 0xBE, 0x39, 0x19, + 0xAB, 0x21, 0xC0, 0xE1, 0x07, 0x43, 0x79, 0xDE, 0x00, 0x95, 0x3F, 0x7E, 0xE5, 0x8D, 0x4D, 0xFF, + 0xD9, 0xC0, 0x94, 0x33, 0xB8, 0x2D, 0x3D, 0x32, 0x71, 0x38, 0x90, 0x09, 0x3B, 0x50, 0x1B, 0x94, + 0x62, 0x94, 0x84, 0xBB, 0x9F, 0xF4, 0xC9, 0x50, 0x61, 0xF0, 0x4F, 0x64, 0x87, 0x14, 0x36, 0x41, + 0x3F, 0xCD, 0x48, 0xD0, 0xF2, 0x30, 0x17, 0x01, 0x97, 0x18, 0xE8, 0xB1, 0x08, 0x52, 0x69, 0xD4, + 0x93, 0xD0, 0x6A, 0xDC, 0xE8, 0x93, 0xF1, 0xA0, 0x30, 0x5B, 0xA8, 0xAE, 0x8C, 0x29, 0x2D, 0x6E, + 0x38, 0xC4, 0xF7, 0x4B, 0xEB, 0x23, 0x02, 0xD5, 0x27, 0xAF, 0xC2, 0xE3, 0x3A, 0x5A, 0x69, 0x17, + 0x71, 0x4A, 0x61, 0x33, 0xD4, 0x12, 0x23, 0x87, 0x69, 0xA6, 0x3D, 0xE0, 0xAA, 0x89, 0x34, 0x73, + 0xBF, 0x8A, 0xD9, 0xA5, 0x5E, 0x70, 0x6E, 0xE3, 0x19, 0x7E, 0x50, 0x5A, 0x2B, 0x02, 0x10, 0x22, + 0x34, 0x3F, 0x7A, 0x30, 0x8D, 0x84, 0xA4, 0xFC, 0x05, 0xF4, 0xE1, 0x1B, 0xC1, 0x86, 0xED, 0x33, + 0x2B, 0xAD, 0x91, 0x08, 0x14, 0xF2, 0x81, 0xF0, 0xB8, 0x96, 0x56, 0xEA, 0x84, 0xAF, 0x18, 0x39, + 0x5C, 0x2F, 0x22, 0x84, 0x0D, 0x77, 0xA4, 0x97, 0x22, 0x6A, 0x6B, 0xE9, 0x65, 0x69, 0x78, 0xEB, + 0x4A, 0xE1, 0x2B, 0x84, 0x04, 0xAD, 0x88, 0xC3, 0x07, 0x73, 0x95, 0x88, 0x98, 0xBF, 0x80, 0xAF, + 0x98, 0xC4, 0x71, 0x2D, 0xBF, 0xFC, 0xD4, 0x93, 0xC3, 0xE9, 0x93, 0xD7, 0xA4, 0xFD, 0x1D, 0x1E, + 0xD5, 0x51, 0xC7, 0xCB, 0x4D, 0xE0, 0xD6, 0x50, 0x88, 0xA0, 0x85, 0xA9, 0xA3, 0xCB, 0xB5, 0x71, + 0xBC, 0x23, 0x6D, 0x1C, 0xEF, 0x50, 0x1B, 0x06, 0xF9, 0x64, 0x93, 0x2B, 0x62, 0x97, 0x56, 0x87, + 0x00, 0xD4, 0x27, 0x97, 0x37, 0x6B, 0xD7, 0xC7, 0xA7, 0x77, 0xBE, 0xC5, 0xF3, 0x5A, 0x4E, 0x32, + 0xAA, 0xA1, 0x93, 0x90, 0x20, 0xEE, 0x23, 0x23, 0xAE, 0x95, 0xD1, 0x8E, 0xB4, 0x52, 0x44, 0x6B, + 0x1D, 0xAD, 0x2C, 0x0C, 0xCB, 0x99, 0x11, 0xCB, 0xC6, 0x27, 0x09, 0xCA, 0x2A, 0x26, 0x06, 0xAB, + 0x4F, 0xDE, 0x44, 0x27, 0x75, 0x14, 0xD3, 0xAD, 0xA1, 0x97, 0x38, 0x3D, 0x49, 0x7F, 0x19, 0xC1, + 0xAC, 0x7C, 0x47, 0xBA, 0xE9, 0xF5, 0x76, 0x39, 0xAA, 0xAC, 0xC9, 0xCC, 0x32, 0xEC, 0x4F, 0x64, + 0x3E, 0x87, 0x69, 0x50, 0xF9, 0xA1, 0x25, 0x01, 0x0E, 0xE3, 0x0B, 0x3B, 0xD7, 0x2E, 0xE9, 0x79, + 0xE9, 0x62, 0x5A, 0x0A, 0x5D, 0xF5, 0x8A, 0x5A, 0x7A, 0x4E, 0xC8, 0x97, 0x95, 0x09, 0xAD, 0x61, + 0xB2, 0x23, 0x7D, 0xF2, 0x9D, 0x1B, 0xD2, 0x59, 0x7D, 0xDA, 0xFA, 0x1D, 0x59, 0xD0, 0x55, 0xDB, + 0x3A, 0x73, 0xE8, 0x37, 0x9E, 0x71, 0x4B, 0x5F, 0x0B, 0x50, 0x67, 0x4A, 0xFF, 0x3D, 0x31, 0xB5, + 0x1F, 0x2C, 0xA7, 0x3A, 0x33, 0x43, 0x24, 0x84, 0x10, 0xA7, 0x1E, 0x96, 0x11, 0x4C, 0x91, 0xE0, + 0xA0, 0x1E, 0x92, 0x31, 0x16, 0x98, 0xD7, 0x96, 0xF1, 0x18, 0x26, 0xF1, 0xC6, 0xF5, 0xB4, 0xFC, + 0x80, 0x72, 0x3D, 0x85, 0x71, 0xF9, 0xA7, 0x57, 0xDA, 0x25, 0xDD, 0x67, 0x5C, 0x3A, 0x5C, 0xB1, + 0x2D, 0x50, 0x2A, 0x86, 0x1E, 0xAD, 0x23, 0x60, 0x9F, 0x5B, 0x0B, 0x3C, 0x72, 0x07, 0x52, 0x5D, + 0xE4, 0x91, 0xB0, 0x27, 0x08, 0xA4, 0x3B, 0x46, 0xF4, 0x18, 0xB7, 0x6A, 0x3C, 0xEE, 0x30, 0x15, + 0x9B, 0x5D, 0x97, 0x4F, 0xC3, 0x66, 0xD7, 0xA0, 0x26, 0xF3, 0x0A, 0xB7, 0xA0, 0x9B, 0x1A, 0xE8, + 0xAB, 0x11, 0x45, 0x61, 0xAF, 0x0F, 0xA3, 0x28, 0xCA, 0xEF, 0x43, 0x2B, 0x0A, 0xAC, 0xE5, 0x13, + 0x8E, 0xA3, 0x55, 0x9C, 0x8A, 0x02, 0xEA, 0x93, 0x77, 0x86, 0xB3, 0x81, 0x41, 0xA6, 0x29, 0x85, + 0x85, 0x1D, 0x3F, 0x98, 0x7B, 0x71, 0xBE, 0x1F, 0x5A, 0x75, 0x40, 0xC8, 0xCA, 0x35, 0xCB, 0x4F, + 0x77, 0x38, 0x1C, 0x0B, 0x89, 0xEF, 0xE0, 0xA8, 0x74, 0x62, 0x20, 0x30, 0xEC, 0x38, 0x23, 0x60, + 0x53, 0xA9, 0xEA, 0xC9, 0xC0, 0x87, 0x8D, 0xE3, 0xDC, 0xD6, 0xC9, 0x04, 0x2E, 0x6C, 0x77, 0x63, + 0x56, 0xC7, 0x00, 0x69, 0xC0, 0x3F, 0xE6, 0x73, 0x6B, 0x56, 0x3D, 0x91, 0x80, 0x24, 0xE0, 0xAD, + 0xBB, 0x52, 0x84, 0xDF, 0xF1, 0xC0, 0x4B, 0x66, 0x15, 0x66, 0x72, 0x33, 0xD0, 0xE2, 0xE5, 0x45, + 0xA3, 0x03, 0x2F, 0xF4, 0xF9, 0x40, 0x91, 0x01, 0xB9, 0x7D, 0xE8, 0xA0, 0x00, 0x44, 0x7C, 0xA2, + 0xC6, 0x53, 0x45, 0x59, 0x0C, 0x32, 0x8C, 0xE8, 0x62, 0xFA, 0xFD, 0x50, 0xF3, 0xBB, 0x88, 0xA2, + 0xE4, 0xEC, 0xAE, 0x37, 0x1A, 0x8C, 0xC3, 0xE9, 0xDD, 0xA0, 0x7F, 0xBF, 0x13, 0x3C, 0x44, 0xBE, + 0x5B, 0xFD, 0xF4, 0xAB, 0xA8, 0x06, 0xA2, 0xD1, 0x77, 0xB8, 0xCE, 0x50, 0x22, 0x60, 0xD7, 0x77, + 0xA4, 0xFE, 0xC3, 0x79, 0x52, 0xFF, 0x11, 0xB8, 0xD2, 0xA2, 0x42, 0xC4, 0x5B, 0x60, 0xC4, 0x7B, + 0x73, 0xD1, 0x8C, 0x86, 0x16, 0x0F, 0x16, 0xEA, 0x16, 0x0F, 0x1A, 0xEA, 0x34, 0xBE, 0x43, 0x4D, + 0x48, 0xA1, 0x62, 0x06, 0xCB, 0x01, 0x59, 0x2D, 0xAB, 0x4E, 0x90, 0xEB, 0xDD, 0xD4, 0x89, 0x72, + 0x82, 0x8C, 0x64, 0x90, 0x1B, 0x47, 0xAB, 0x22, 0xA3, 0xFB, 0x5D, 0xD6, 0x1D, 0x16, 0x51, 0x5B, + 0xC7, 0x69, 0x3C, 0xE3, 0xFA, 0xD3, 0x62, 0x65, 0x94, 0x56, 0x06, 0x87, 0x03, 0x5D, 0xBC, 0x7B, + 0xD9, 0x64, 0xBA, 0x20, 0xFA, 0x7D, 0x18, 0x3F, 0x0A, 0xB9, 0x7E, 0xE8, 0x58, 0x67, 0x13, 0xA7, + 0x7C, 0xB0, 0x43, 0x20, 0x7D, 0xF2, 0x2D, 0x71, 0x7C, 0xED, 0xC2, 0xF5, 0xF8, 0xBB, 0x18, 0x1B, + 0xD1, 0x1A, 0xED, 0xF9, 0x61, 0x54, 0xC6, 0x98, 0x7E, 0x68, 0x7D, 0x2D, 0x57, 0x96, 0xE7, 0xB9, + 0x5E, 0x69, 0x95, 0x71, 0x38, 0x98, 0x56, 0xB4, 0xDF, 0xD1, 0xA3, 0x46, 0xD4, 0x25, 0x7A, 0x7D, + 0x18, 0x8D, 0x85, 0x3C, 0x3F, 0xB4, 0xD2, 0xAE, 0xE6, 0xB6, 0xB5, 0x2E, 0xAD, 0x32, 0x0A, 0xA5, + 0x4F, 0x3E, 0xB6, 0xBF, 0x86, 0xBF, 0x8D, 0xA8, 0x8B, 0xF5, 0xF8, 0x30, 0xCA, 0xE2, 0xDC, 0x3E, + 0xB4, 0xAA, 0xA6, 0xEB, 0xF2, 0xE1, 0x10, 0x60, 0xF4, 0xC9, 0xAB, 0xF7, 0xCD, 0xE4, 0x7E, 0xD8, + 0x99, 0xA2, 0x86, 0x6A, 0xE9, 0x83, 0x32, 0xF5, 0xD0, 0xDA, 0xB8, 0xAE, 0xA0, 0x8D, 0x6B, 0x24, + 0xFC, 0xA7, 0x86, 0xB4, 0x71, 0xAD, 0xAE, 0x8D, 0x7B, 0xF6, 0x97, 0xEB, 0xC7, 0xA0, 0x1F, 0xFA, + 0xB0, 0xDF, 0xD4, 0x28, 0x3F, 0x1C, 0x09, 0x40, 0xDC, 0x34, 0x06, 0x47, 0xDA, 0x2B, 0xA3, 0x99, + 0x01, 0x29, 0xEC, 0xB7, 0x09, 0x17, 0x8A, 0x98, 0x7C, 0x68, 0x3D, 0xD9, 0xC4, 0xAC, 0x90, 0xE4, + 0x99, 0x9F, 0xF0, 0xC9, 0x39, 0x7C, 0xA2, 0xFC, 0x16, 0xB2, 0xBD, 0xCB, 0xD7, 0xDA, 0x37, 0xE2, + 0xF4, 0xA1, 0x0A, 0x43, 0x49, 0x9A, 0x92, 0xF3, 0xA6, 0xFE, 0x68, 0x57, 0xDB, 0x32, 0x00, 0xF3, + 0x0E, 0x75, 0x33, 0x37, 0x66, 0xE4, 0x93, 0x49, 0x82, 0x2A, 0xEB, 0xFE, 0x31, 0x58, 0x7D, 0xF2, + 0x35, 0x9C, 0x68, 0xAF, 0xE9, 0x49, 0x53, 0xE9, 0x78, 0xBC, 0xFF, 0x26, 0x3C, 0x2A, 0xC1, 0xEF, + 0x43, 0x3B, 0x15, 0x25, 0x06, 0x26, 0x3F, 0xEE, 0xC2, 0xA9, 0xF4, 0xDC, 0x53, 0x02, 0x9C, 0xAB, + 0xEF, 0x7B, 0x76, 0xDE, 0xAC, 0x02, 0x23, 0x22, 0x1A, 0xD3, 0x61, 0x8C, 0xEF, 0x26, 0xD4, 0x18, + 0x7F, 0xF8, 0x91, 0xBF, 0x36, 0xB8, 0x48, 0x53, 0xFC, 0x21, 0x3C, 0xBA, 0xDD, 0x88, 0x04, 0x6D, + 0x3F, 0xB0, 0x6C, 0x5B, 0x9F, 0xBC, 0x21, 0x81, 0xF6, 0x01, 0x0F, 0x15, 0x9F, 0xBA, 0x8B, 0x61, + 0x11, 0xCF, 0xDC, 0x06, 0x1E, 0x31, 0x56, 0xFA, 0xE4, 0x03, 0xBE, 0x50, 0x19, 0x70, 0xE1, 0x59, + 0x79, 0x64, 0x54, 0x88, 0xC4, 0xF1, 0x5C, 0x20, 0x2A, 0x54, 0x12, 0x7F, 0x51, 0xA3, 0xAE, 0x89, + 0xA3, 0xD8, 0xB5, 0xC9, 0x25, 0x6D, 0xAC, 0xA1, 0x95, 0x15, 0x77, 0x17, 0x7F, 0x1C, 0x30, 0xDF, + 0x39, 0xE8, 0x03, 0xC0, 0xF8, 0x44, 0x6F, 0xF2, 0x7D, 0xEB, 0xA0, 0x56, 0xF6, 0x7C, 0xFF, 0xE4, + 0xCC, 0x5F, 0x1B, 0x8E, 0x68, 0x46, 0x1F, 0x7E, 0xBF, 0xE6, 0x4F, 0x33, 0x4F, 0x5D, 0xDB, 0xFC, + 0x2A, 0xB6, 0xF0, 0xFF, 0x21, 0x7C, 0x2C, 0x17, 0x41, 0xC0, 0x2E, 0x04, 0x86, 0x02, 0xE5, 0x2E, + 0x3D, 0x81, 0x9E, 0x3D, 0x41, 0x8D, 0x6F, 0xEB, 0xCA, 0xD1, 0x6E, 0xC6, 0x93, 0xC4, 0x1E, 0x59, + 0x84, 0x92, 0x94, 0x3D, 0x61, 0x2E, 0x7D, 0xAE, 0xF8, 0x7B, 0xB2, 0xB0, 0x7C, 0xA0, 0x51, 0x03, + 0xBB, 0x38, 0xA4, 0xCF, 0x62, 0x32, 0x5B, 0x56, 0x7B, 0xCE, 0x37, 0xDE, 0x25, 0x7F, 0x4D, 0x81, + 0xF4, 0xF1, 0xED, 0x52, 0xA9, 0x63, 0xFA, 0x59, 0xEB, 0x24, 0xC6, 0x22, 0xAB, 0x7F, 0xDA, 0x6E, + 0x2F, 0x87, 0xF8, 0x54, 0xA9, 0x26, 0x58, 0x3B, 0x3B, 0x5C, 0x0E, 0x8B, 0x9E, 0xDA, 0x2B, 0x7C, + 0x24, 0x18, 0x38, 0xAD, 0xFC, 0x44, 0x30, 0x4A, 0x69, 0x02, 0xD4, 0x1C, 0x68, 0xEF, 0x0C, 0xFF, + 0xF3, 0x81, 0xF6, 0x11, 0x87, 0xF8, 0x06, 0x1F, 0x0C, 0x46, 0xDA, 0x0D, 0xD3, 0xF4, 0x32, 0x1F, + 0x0E, 0x1E, 0x26, 0x1E, 0x0E, 0x1E, 0x8B, 0x87, 0x83, 0xA3, 0x95, 0xAA, 0xEE, 0xCD, 0xA0, 0xDB, + 0x3D, 0x56, 0x61, 0x5D, 0xF1, 0x01, 0xE1, 0x7B, 0xE1, 0x69, 0x05, 0xD2, 0x54, 0xE4, 0x69, 0x28, + 0x78, 0x8A, 0x6D, 0xD8, 0xBF, 0x99, 0xCF, 0x1F, 0x1B, 0x47, 0x7C, 0xC9, 0xB0, 0x3A, 0x4B, 0xDD, + 0x7E, 0xD3, 0x4F, 0x71, 0x53, 0xE3, 0xBE, 0xAF, 0x87, 0xB8, 0x69, 0x93, 0x74, 0x34, 0x1C, 0xE5, + 0x06, 0x43, 0x0A, 0xC2, 0x9C, 0xFE, 0xCD, 0x7D, 0x3A, 0xFD, 0xA2, 0x86, 0xD3, 0x2F, 0xB6, 0x9C, + 0xBE, 0x41, 0x6F, 0x17, 0x84, 0xFF, 0xD5, 0x3C, 0x5E, 0xF0, 0x55, 0xC2, 0xEB, 0xA5, 0x7C, 0x75, + 0xBB, 0xF7, 0xEA, 0xF7, 0x85, 0x4E, 0x12, 0x1A, 0xC3, 0x9B, 0xFB, 0x74, 0x92, 0x0C, 0xD3, 0xAD, + 0x64, 0xA7, 0x3C, 0xEC, 0x4C, 0x9A, 0x19, 0x97, 0x68, 0x36, 0x15, 0x57, 0x28, 0xEF, 0x1D, 0x1F, + 0xD7, 0x1D, 0x0C, 0x79, 0xEA, 0x74, 0x1F, 0xEA, 0x51, 0x7F, 0x61, 0x44, 0x66, 0x93, 0xFB, 0x49, + 0xCC, 0xD6, 0xB1, 0x14, 0x57, 0x39, 0x31, 0x7B, 0xFF, 0xED, 0xB7, 0xE5, 0x72, 0xB1, 0x78, 0x2F, + 0x8F, 0x24, 0x17, 0xCB, 0x2D, 0x53, 0xDF, 0xAE, 0xE1, 0x06, 0x52, 0x5D, 0xC9, 0x74, 0x23, 0x70, + 0x7D, 0xF2, 0x8A, 0x1E, 0x6B, 0x31, 0x89, 0x95, 0x32, 0x5E, 0xE5, 0x59, 0x27, 0x05, 0x8C, 0xD5, + 0xB1, 0x23, 0x12, 0xD2, 0xBA, 0x51, 0xC4, 0x95, 0x53, 0xBB, 0x8E, 0xB1, 0xA7, 0xCE, 0x54, 0x6D, + 0x9F, 0xA0, 0x4D, 0x8A, 0x52, 0xE1, 0xD5, 0xC6, 0xAE, 0xAC, 0x36, 0x0E, 0xAB, 0x4F, 0xDE, 0xC1, + 0x64, 0xDC, 0x5A, 0xDB, 0x16, 0xCC, 0x3C, 0x5A, 0x5D, 0xAD, 0xAD, 0x0D, 0x7A, 0xFB, 0x0D, 0x8E, + 0x91, 0x82, 0x8C, 0x92, 0x6F, 0xCB, 0xE9, 0x45, 0x0F, 0xB3, 0x0D, 0xEE, 0xE9, 0x75, 0x39, 0x75, + 0x15, 0xE2, 0xB9, 0x6E, 0x50, 0x59, 0x1B, 0x02, 0x18, 0x12, 0x15, 0x38, 0xD2, 0x22, 0x9D, 0xA8, + 0xAB, 0x22, 0xB6, 0xB5, 0x36, 0xC2, 0xA6, 0xA6, 0x0E, 0xA5, 0x8D, 0xB4, 0xB8, 0x3F, 0x45, 0x75, + 0x07, 0xAA, 0x04, 0x6B, 0x4F, 0x9F, 0xF4, 0x4B, 0x60, 0x28, 0xDE, 0x87, 0xCA, 0x5A, 0xD5, 0x77, + 0x22, 0xFF, 0xB6, 0x7A, 0xEC, 0xE3, 0xB0, 0x90, 0x76, 0xDF, 0x42, 0xAA, 0xBB, 0xD2, 0x5E, 0x43, + 0x5F, 0xD4, 0x89, 0x7A, 0xA3, 0x26, 0x9D, 0x48, 0x90, 0x51, 0xDD, 0x89, 0x7A, 0x8F, 0xC3, 0x87, + 0x50, 0x1F, 0x6B, 0x8F, 0x54, 0xD6, 0x07, 0x87, 0xD5, 0x27, 0xEF, 0x3D, 0x82, 0xCA, 0xA8, 0xE4, + 0x3D, 0x21, 0x92, 0x6A, 0xCE, 0x73, 0x0F, 0x8E, 0xD2, 0xEB, 0x8C, 0xEA, 0xE1, 0xE8, 0x97, 0x73, + 0x36, 0x09, 0x86, 0x81, 0x3C, 0x08, 0x0C, 0x1E, 0xA7, 0x0B, 0x13, 0xDB, 0x1C, 0x55, 0x77, 0x62, + 0x01, 0x8D, 0xB3, 0x67, 0x38, 0xAC, 0x6C, 0x38, 0x31, 0x44, 0x8F, 0x2A, 0xEE, 0xD6, 0xC4, 0x70, + 0x1F, 0xC6, 0x34, 0xE9, 0x97, 0x32, 0xE9, 0x66, 0x4C, 0x67, 0x8D, 0x2F, 0x17, 0x24, 0x6A, 0x7B, + 0x3E, 0x29, 0xB2, 0x78, 0xA4, 0x61, 0xB0, 0x10, 0x69, 0xE8, 0xEB, 0x05, 0xE9, 0x5E, 0xF7, 0x46, + 0x73, 0x5E, 0x41, 0xC0, 0xF6, 0x32, 0x4B, 0xF9, 0xAD, 0x01, 0x31, 0xE6, 0x64, 0x29, 0x70, 0xC8, + 0xEB, 0x63, 0xCB, 0x7F, 0x29, 0x61, 0x95, 0xC7, 0x0A, 0x0E, 0xCC, 0x55, 0x18, 0x0E, 0xDD, 0xCD, + 0xE6, 0xBF, 0x21, 0x15, 0x35, 0xC6, 0xEE, 0x06, 0x13, 0xE0, 0xD8, 0xB2, 0x11, 0x55, 0x00, 0x0B, + 0x9A, 0x01, 0x9B, 0xF1, 0x95, 0x58, 0x09, 0xCA, 0x6C, 0x72, 0x3F, 0xF3, 0xFC, 0x6B, 0xCB, 0x29, + 0x3F, 0xCF, 0xFF, 0xC9, 0x72, 0x4C, 0xF7, 0xBA, 0xDC, 0x54, 0x3F, 0xDE, 0xD1, 0x9F, 0x60, 0xAA, + 0x4F, 0x07, 0x4B, 0x5C, 0x2C, 0x6C, 0x7B, 0x44, 0xED, 0xA5, 0x33, 0x69, 0x21, 0x33, 0xE8, 0x1B, + 0x5C, 0x6A, 0x03, 0x14, 0xBE, 0x46, 0x97, 0x1E, 0x77, 0xED, 0x2F, 0x3F, 0x9F, 0xC6, 0x93, 0x5D, + 0x4E, 0x81, 0x9A, 0xC3, 0x0C, 0x25, 0x85, 0xC7, 0x07, 0xAF, 0xA5, 0xFE, 0xB2, 0xCD, 0xCF, 0xED, + 0x83, 0xF3, 0x73, 0x1F, 0x01, 0x99, 0x38, 0x66, 0x65, 0xCB, 0x42, 0xD8, 0xC8, 0xAE, 0x2E, 0x1D, + 0xB3, 0x51, 0xAB, 0x62, 0xBD, 0x57, 0xD6, 0x41, 0xBF, 0x7B, 0x74, 0xF2, 0xB8, 0xCC, 0x0A, 0x19, + 0xAA, 0x61, 0x54, 0xBD, 0xD1, 0xF0, 0xE8, 0xF1, 0xD8, 0x95, 0x3B, 0x9F, 0xB3, 0x15, 0xAE, 0x6A, + 0xA6, 0xC5, 0xC1, 0x6F, 0xE8, 0xA3, 0xB4, 0x3E, 0x69, 0x36, 0x5E, 0x85, 0x9D, 0xAB, 0xE9, 0x62, + 0x20, 0xD1, 0xC5, 0xF8, 0x71, 0x99, 0x16, 0xE7, 0x48, 0xD5, 0xBA, 0x24, 0x1C, 0xDD, 0x13, 0x43, + 0xF7, 0x61, 0x5A, 0x81, 0x1B, 0x18, 0x76, 0x65, 0xCB, 0x62, 0xD0, 0x60, 0x58, 0x3F, 0xE0, 0x81, + 0xF6, 0x01, 0xF8, 0x6C, 0xD4, 0xB8, 0x44, 0xFF, 0xD5, 0x03, 0xD7, 0xA0, 0xFB, 0xC8, 0xC6, 0x43, + 0xC6, 0x52, 0xAD, 0xD0, 0x35, 0x1E, 0x3E, 0x1E, 0xFB, 0x72, 0x37, 0x01, 0x5E, 0xAD, 0x1C, 0xBA, + 0x18, 0x38, 0x86, 0x2E, 0x7A, 0xD4, 0xBC, 0x89, 0x85, 0x14, 0xD4, 0x18, 0x1C, 0x87, 0x0F, 0xBF, + 0x7E, 0xFD, 0x8B, 0x84, 0xA7, 0x5A, 0x46, 0x36, 0x78, 0x2C, 0x41, 0x6C, 0x66, 0x28, 0xBF, 0x88, + 0x8D, 0x22, 0x8B, 0x67, 0xF3, 0x0C, 0x16, 0xE6, 0x70, 0xEC, 0xA0, 0xD1, 0x0A, 0x86, 0xE8, 0xFC, + 0xDE, 0x97, 0xEC, 0x42, 0xAE, 0x1E, 0x53, 0xBD, 0x62, 0x6A, 0x39, 0x4E, 0x55, 0x35, 0x71, 0x58, + 0x7D, 0xF2, 0x8A, 0x1D, 0x34, 0xBB, 0xB8, 0xCA, 0x3B, 0xBF, 0xFF, 0x95, 0x55, 0xC1, 0x55, 0xD3, + 0x6A, 0x4A, 0x15, 0x31, 0xBC, 0xF0, 0x4B, 0x11, 0x3A, 0xDF, 0xAD, 0x18, 0x7D, 0x39, 0xE2, 0xF1, + 0x94, 0x34, 0x16, 0xC6, 0x0A, 0x9F, 0x30, 0x2E, 0x5B, 0xD4, 0x78, 0x83, 0x60, 0xE5, 0x6A, 0x1A, + 0xC9, 0x9E, 0x1E, 0x77, 0x55, 0x63, 0x92, 0x7C, 0xB5, 0x24, 0x10, 0xDE, 0x9E, 0x5A, 0x86, 0x8F, + 0x4F, 0xE3, 0xC3, 0xB1, 0xF6, 0x0A, 0x8E, 0xB5, 0xF7, 0xF6, 0x26, 0x7C, 0x37, 0xAE, 0xCC, 0x21, + 0xE2, 0x3B, 0x9B, 0x22, 0x0C, 0x59, 0xDB, 0xD7, 0xE9, 0x86, 0x2E, 0xFE, 0x14, 0x16, 0x1C, 0xE3, + 0x3E, 0xA6, 0xD1, 0xF0, 0xB8, 0xAB, 0x6B, 0x2C, 0x2B, 0xE6, 0xCF, 0x90, 0xF8, 0x9F, 0xE9, 0x06, + 0xA7, 0x5E, 0x48, 0xA0, 0xCC, 0x01, 0xE2, 0xF4, 0x86, 0x04, 0x52, 0xFB, 0xAD, 0xB3, 0xEF, 0x68, + 0x5B, 0x22, 0x3D, 0x21, 0x8E, 0xAE, 0xD4, 0x10, 0x12, 0x2F, 0xC3, 0x64, 0xED, 0x55, 0x9E, 0x86, + 0x91, 0x0B, 0xA2, 0x27, 0x15, 0x04, 0xEE, 0xF3, 0xBA, 0x5F, 0x9E, 0xFA, 0x82, 0xA7, 0x9E, 0x1A, + 0x4F, 0xFD, 0x1A, 0x3C, 0xF5, 0x1B, 0xE2, 0x69, 0x20, 0x78, 0xEA, 0xAB, 0xF1, 0x34, 0xA8, 0xC1, + 0xD3, 0xA0, 0x21, 0x9E, 0x86, 0x82, 0xA7, 0x81, 0x1A, 0x4F, 0xC3, 0x1A, 0x3C, 0x0D, 0x1B, 0xE2, + 0x69, 0x24, 0x78, 0x1A, 0xAA, 0xF1, 0x34, 0xAA, 0xC1, 0xD3, 0xA8, 0x21, 0x9E, 0xC6, 0x82, 0xA7, + 0x91, 0x1A, 0x4F, 0xE3, 0x1A, 0x3C, 0x8D, 0x1B, 0xE2, 0xE9, 0x48, 0xF0, 0x34, 0x56, 0xE3, 0xE9, + 0xA8, 0x06, 0x4F, 0x47, 0x0D, 0xF1, 0x74, 0x2C, 0x78, 0x3A, 0x52, 0xE3, 0xE9, 0xB8, 0x06, 0x4F, + 0xC7, 0x0D, 0xF1, 0x74, 0x22, 0x78, 0x3A, 0x56, 0xE3, 0xE9, 0xA4, 0x06, 0x4F, 0x27, 0x0D, 0xF1, + 0x84, 0x8B, 0x72, 0x8C, 0xA9, 0x13, 0xC5, 0x41, 0xB7, 0x5B, 0x83, 0x2B, 0xA3, 0x29, 0xAE, 0xC2, + 0x54, 0xA2, 0xA7, 0x9A, 0x4B, 0xD4, 0x49, 0x26, 0xA6, 0x4D, 0xB1, 0x15, 0x65, 0x13, 0x8A, 0xE9, + 0x44, 0xAF, 0x4E, 0x3E, 0x31, 0x6B, 0x8A, 0xAD, 0x30, 0xA1, 0xE8, 0x29, 0x66, 0x14, 0xBD, 0x3A, + 0x29, 0x85, 0xD9, 0x14, 0x5B, 0x61, 0x4E, 0xD1, 0x53, 0x4C, 0x2A, 0x7A, 0x75, 0xB2, 0x0A, 0xD2, + 0x14, 0x5B, 0x61, 0x5A, 0xD1, 0x53, 0xCC, 0x2B, 0x7A, 0x75, 0x12, 0x8B, 0x79, 0x53, 0x6C, 0x85, + 0x99, 0x45, 0x4F, 0x31, 0xB5, 0xE8, 0xD5, 0xC8, 0x2D, 0x4E, 0xE4, 0x13, 0xB1, 0x7B, 0x65, 0x8B, + 0x04, 0x7C, 0x8A, 0x1C, 0x4D, 0xDA, 0x94, 0x1E, 0x3D, 0xE1, 0x40, 0xF8, 0x6C, 0x14, 0x13, 0xC8, + 0x85, 0xEB, 0xCC, 0xAD, 0x45, 0x58, 0x64, 0x78, 0x34, 0x4F, 0x49, 0xF8, 0xB1, 0xB7, 0xF2, 0x2A, + 0x17, 0x1A, 0x3E, 0xBC, 0xBE, 0x2C, 0x57, 0x66, 0x88, 0xF7, 0xF2, 0x27, 0x2A, 0x32, 0x00, 0xD9, + 0xFD, 0xF8, 0x27, 0x02, 0x94, 0xEA, 0x0A, 0x14, 0xA8, 0x4C, 0x45, 0x61, 0x14, 0xAF, 0x28, 0x8C, + 0x95, 0x2B, 0x0A, 0x8C, 0xB8, 0xDD, 0xD4, 0x12, 0x00, 0xF7, 0x80, 0x7D, 0xD7, 0x40, 0x9D, 0xE9, + 0x41, 0x75, 0xA6, 0x47, 0x65, 0x98, 0x1E, 0x54, 0x61, 0xBA, 0xC2, 0xD3, 0x8D, 0x8A, 0x72, 0x02, + 0x7A, 0xBF, 0xB6, 0x6E, 0x88, 0xA9, 0xFD, 0xA2, 0x2E, 0xAA, 0x5E, 0x75, 0x51, 0x1D, 0x95, 0x11, + 0x55, 0x6F, 0x87, 0xF6, 0x31, 0x12, 0x7C, 0xFF, 0xA8, 0xCE, 0xF7, 0xA8, 0x3A, 0xDF, 0x83, 0x32, + 0x7C, 0x8F, 0x76, 0xC8, 0xF7, 0x50, 0xF0, 0xFD, 0x51, 0x9D, 0xEF, 0x61, 0x75, 0xBE, 0x87, 0x65, + 0xF8, 0x1E, 0xEE, 0x90, 0xEF, 0x3E, 0x04, 0x9B, 0x1F, 0x3F, 0x6A, 0x3F, 0x2C, 0x3D, 0xE2, 0x2F, + 0x8B, 0x2B, 0x71, 0x0C, 0xA2, 0xEA, 0xD8, 0x3E, 0x6A, 0x60, 0xEE, 0x86, 0x14, 0x0E, 0xE2, 0x3C, + 0x15, 0xE6, 0xCD, 0x0C, 0x42, 0xE5, 0xC3, 0x41, 0x72, 0x9E, 0xE4, 0x33, 0xB7, 0x9E, 0x2A, 0x53, + 0xBB, 0x8B, 0x61, 0xC7, 0xFA, 0xE4, 0xED, 0xA6, 0xC4, 0xF8, 0x76, 0x5C, 0xDD, 0x9E, 0xD5, 0x2B, + 0xE6, 0x8C, 0xAE, 0x9D, 0xD9, 0xF3, 0x09, 0xE5, 0x19, 0xF2, 0x32, 0x5F, 0x41, 0xED, 0xD5, 0xAB, + 0x10, 0xA3, 0x06, 0xAA, 0xE4, 0x18, 0xE9, 0x8F, 0x18, 0x3B, 0x3F, 0x22, 0x43, 0x1A, 0x64, 0x2C, + 0x25, 0x06, 0xA3, 0xA3, 0x92, 0xDA, 0x3C, 0xAE, 0x18, 0x9D, 0x90, 0xC6, 0x9D, 0xA9, 0x13, 0xA7, + 0x1E, 0x28, 0x80, 0x8F, 0x15, 0x04, 0x30, 0xAE, 0x2E, 0x80, 0x52, 0x99, 0x0B, 0xD2, 0xB8, 0x3B, + 0x01, 0x74, 0x99, 0x00, 0x3E, 0x44, 0x6F, 0xA6, 0xCE, 0x31, 0xE8, 0x1A, 0x15, 0xA8, 0x51, 0x03, + 0x6B, 0x24, 0x18, 0x69, 0x7B, 0xC2, 0xA2, 0x81, 0xA3, 0x72, 0x0A, 0xED, 0x97, 0xCD, 0xAF, 0xE4, + 0xC5, 0x4F, 0x85, 0xFC, 0x7B, 0x97, 0x09, 0x56, 0xBF, 0x2B, 0x2C, 0xBA, 0xBC, 0x00, 0xBA, 0xD5, + 0x05, 0xD0, 0x2B, 0x25, 0x80, 0xEE, 0xE3, 0x4A, 0xC6, 0xC7, 0xDB, 0x1F, 0x13, 0x2E, 0x96, 0x56, + 0x59, 0xF7, 0x8F, 0x8D, 0x66, 0xFD, 0x32, 0xC2, 0xDA, 0xA9, 0xF7, 0x0F, 0x22, 0xCE, 0xB5, 0x5F, + 0xB4, 0xE4, 0xD6, 0xD7, 0xBC, 0x38, 0x50, 0xBD, 0x08, 0x38, 0x6A, 0x60, 0xBD, 0x0A, 0x29, 0x3C, + 0x91, 0x70, 0x56, 0x32, 0xC0, 0x9F, 0x54, 0x77, 0x87, 0x52, 0x1A, 0x46, 0x5A, 0x77, 0xA7, 0xE2, + 0x51, 0x42, 0x10, 0xEC, 0x43, 0xE6, 0x2A, 0x2A, 0xAE, 0x5E, 0x39, 0x1C, 0x35, 0xB0, 0xD4, 0x85, + 0x14, 0x1E, 0x4B, 0x38, 0x2B, 0xA9, 0xE2, 0xB2, 0x29, 0xE9, 0x71, 0xC5, 0xA9, 0x65, 0x6F, 0x97, + 0x39, 0x29, 0x56, 0xBB, 0x63, 0x82, 0x88, 0x7F, 0x65, 0x22, 0x4F, 0xC1, 0xD5, 0x2B, 0xDE, 0xA3, + 0x9A, 0xEB, 0xB3, 0xBB, 0x8B, 0xE4, 0x47, 0xB2, 0x4F, 0x90, 0x17, 0xDB, 0x41, 0xD9, 0x5C, 0xB6, + 0x5B, 0x71, 0xE0, 0xDB, 0x69, 0x2A, 0x0B, 0xBD, 0x43, 0xD6, 0xB3, 0xCD, 0x7D, 0x8E, 0x09, 0x54, + 0x5F, 0x79, 0x1B, 0x35, 0xB0, 0x3D, 0x04, 0x29, 0xEC, 0xEB, 0x93, 0x8F, 0x25, 0x99, 0xAA, 0x53, + 0x3F, 0xA8, 0xBC, 0x3F, 0xA4, 0xB9, 0xD2, 0xFB, 0x6C, 0x75, 0x53, 0xBE, 0xF4, 0x7E, 0xF1, 0xEE, + 0xE7, 0x72, 0xA5, 0xF7, 0x78, 0x2F, 0xCD, 0x95, 0xDE, 0xAB, 0xD9, 0x4C, 0xA9, 0x8D, 0xB2, 0xC0, + 0x18, 0xBE, 0x3F, 0x62, 0x66, 0xF9, 0xB4, 0x4B, 0x10, 0x8C, 0xF6, 0x5E, 0x9C, 0x86, 0x22, 0x8A, + 0x3D, 0xB1, 0x9F, 0x6C, 0x9F, 0x67, 0x3D, 0x83, 0x9C, 0xB0, 0xA0, 0xB6, 0x11, 0x76, 0xFB, 0x75, + 0x28, 0x9D, 0x31, 0xFF, 0x10, 0x57, 0x8D, 0x47, 0xEB, 0xB3, 0x5E, 0x1A, 0xD0, 0x39, 0x2A, 0x89, + 0x7B, 0xE7, 0x8F, 0xDC, 0x4F, 0x52, 0x8A, 0xEA, 0x51, 0xFD, 0xF4, 0xF0, 0x5C, 0xB9, 0x4E, 0x4E, + 0xC1, 0xCA, 0x44, 0xF3, 0x41, 0xBC, 0xD4, 0xA2, 0x1E, 0xCD, 0x19, 0x79, 0xBB, 0x89, 0xE6, 0x88, + 0x3B, 0xC1, 0x7B, 0x89, 0xAC, 0x86, 0xC1, 0x96, 0x13, 0x80, 0x7C, 0x13, 0x85, 0x82, 0x00, 0xB2, + 0x24, 0x70, 0x2F, 0x22, 0xE8, 0x53, 0x09, 0xF4, 0x53, 0xDA, 0xCF, 0x08, 0xFC, 0xB4, 0x7D, 0xD5, + 0xB8, 0x3F, 0x68, 0xA0, 0x36, 0x81, 0xE2, 0x4A, 0x70, 0x54, 0x52, 0xA7, 0xE5, 0x16, 0x07, 0x13, + 0x3A, 0x2D, 0x67, 0xD4, 0x3B, 0x5B, 0x1D, 0x04, 0xE4, 0x03, 0x2A, 0x80, 0x81, 0xB2, 0x4A, 0xAB, + 0x4F, 0x33, 0x07, 0x0D, 0xE4, 0x27, 0x28, 0xAD, 0x04, 0x47, 0x25, 0x55, 0x5A, 0x6E, 0xE9, 0x33, + 0xA1, 0x52, 0xF5, 0xF9, 0x25, 0x27, 0x72, 0x67, 0x2A, 0x1D, 0x52, 0x01, 0x0C, 0x95, 0x55, 0x5A, + 0x7D, 0xD6, 0x31, 0x68, 0x60, 0xF7, 0x2E, 0x4A, 0x2B, 0xC1, 0x51, 0x49, 0x95, 0x96, 0x5B, 0xB2, + 0x4B, 0xA8, 0x54, 0x7D, 0x3E, 0xC9, 0x89, 0xDC, 0x99, 0x4A, 0x47, 0x54, 0x00, 0x23, 0x65, 0x95, + 0x56, 0xAF, 0x14, 0x0C, 0x1A, 0x28, 0x06, 0xA1, 0xB4, 0x12, 0x1C, 0x95, 0x54, 0x69, 0xB9, 0xD5, + 0xE7, 0x84, 0x4A, 0xD5, 0xD7, 0x39, 0x38, 0x91, 0x3B, 0x53, 0xE9, 0x98, 0x0A, 0x60, 0xAC, 0xAC, + 0xD2, 0xEA, 0xFB, 0xAB, 0x06, 0x0D, 0xEC, 0xDD, 0x46, 0x69, 0x25, 0x38, 0x2A, 0xA9, 0xD2, 0x72, + 0xA5, 0xDB, 0x84, 0x4A, 0xD5, 0x57, 0x6E, 0x38, 0x91, 0x3B, 0x53, 0xE9, 0x11, 0x15, 0xC0, 0x91, + 0xB2, 0x4A, 0xAB, 0x6F, 0x5D, 0x1F, 0x34, 0x50, 0xCF, 0x43, 0x69, 0x25, 0x38, 0x2A, 0xA9, 0xD2, + 0x72, 0x15, 0x9C, 0x84, 0x4A, 0xD5, 0xF7, 0x4E, 0x71, 0x22, 0x77, 0xA6, 0xD2, 0x63, 0x2A, 0x80, + 0x63, 0x65, 0x95, 0x56, 0xDF, 0xB9, 0x3F, 0x68, 0x60, 0xE7, 0x3E, 0x4A, 0x2B, 0xC1, 0x51, 0x49, + 0x95, 0x96, 0xAB, 0xCD, 0x26, 0x54, 0xAA, 0xBE, 0xDD, 0x89, 0x13, 0xB9, 0x33, 0x95, 0x9E, 0x50, + 0x01, 0x9C, 0x28, 0xAB, 0xB4, 0xFA, 0x96, 0x81, 0x41, 0x03, 0x9B, 0x5F, 0x50, 0x5A, 0xDD, 0x38, + 0x47, 0x25, 0x55, 0x5A, 0x6E, 0x81, 0x71, 0x90, 0xB1, 0xF5, 0x45, 0x41, 0xA5, 0x59, 0x0B, 0x8C, + 0x8F, 0xA0, 0x7E, 0x67, 0x5C, 0x4F, 0x2B, 0x7C, 0xFA, 0xE5, 0xE5, 0x4F, 0xAF, 0xB2, 0x0B, 0xFB, + 0x99, 0x55, 0xBC, 0x44, 0x5F, 0x8F, 0xBD, 0x8C, 0x17, 0x97, 0x17, 0x12, 0x0E, 0x5A, 0x66, 0x2F, + 0x4D, 0xD4, 0xB6, 0x98, 0xCF, 0xB7, 0x34, 0x06, 0x5C, 0xC2, 0xD2, 0x06, 0xC3, 0xAE, 0x3C, 0x69, + 0x29, 0xB0, 0x34, 0x4E, 0xE5, 0x6E, 0x82, 0x07, 0x22, 0x87, 0xB9, 0x38, 0xF2, 0xFE, 0xBD, 0xD2, + 0x9A, 0x0E, 0x03, 0x48, 0x86, 0x8F, 0x61, 0xF7, 0x44, 0x31, 0x7E, 0x80, 0x0C, 0xB2, 0x36, 0xC6, + 0xDF, 0x63, 0x00, 0x41, 0x1A, 0x07, 0x8C, 0xA9, 0x37, 0xCA, 0x4C, 0xA5, 0xAB, 0x00, 0xA5, 0x98, + 0xCA, 0xAA, 0xEC, 0xDC, 0x33, 0x53, 0x43, 0xC6, 0x54, 0x8E, 0x93, 0xA6, 0x98, 0x4A, 0xCF, 0x83, + 0x4B, 0x31, 0x95, 0x35, 0x11, 0x8E, 0x98, 0x7A, 0x0C, 0x81, 0x8E, 0xCC, 0x8C, 0xC5, 0xAC, 0x42, + 0xA8, 0xBB, 0xBC, 0x38, 0x7C, 0xF9, 0xE6, 0x42, 0xA3, 0x4B, 0x9A, 0xAE, 0x5D, 0x32, 0xE2, 0x25, + 0x3B, 0xFD, 0x53, 0xC5, 0x3C, 0x4A, 0x7A, 0x2C, 0xEA, 0xBD, 0xB9, 0x50, 0x0D, 0x78, 0x1C, 0xB2, + 0x4C, 0xC8, 0x1B, 0x75, 0x07, 0x55, 0x2A, 0x84, 0x21, 0x91, 0x3B, 0x0A, 0x7A, 0x14, 0x7D, 0x3F, + 0x92, 0xC1, 0x65, 0x39, 0x19, 0x94, 0xAA, 0x92, 0x26, 0x65, 0x50, 0x22, 0xEC, 0x0B, 0x22, 0x77, + 0x29, 0x03, 0x8C, 0x92, 0x97, 0x17, 0xDA, 0xFB, 0xBF, 0x6B, 0x97, 0x37, 0x6B, 0xD7, 0xDF, 0x78, + 0xA4, 0x30, 0xAA, 0x70, 0xB8, 0x64, 0x5C, 0x19, 0x8F, 0x46, 0x03, 0xD5, 0xC0, 0x32, 0xCA, 0x1E, + 0x02, 0xE6, 0xDD, 0x7B, 0x8C, 0x97, 0x94, 0xD0, 0x61, 0xC8, 0xE0, 0xF7, 0x04, 0x34, 0xAD, 0x14, + 0x37, 0x39, 0x60, 0x92, 0xC3, 0x5E, 0x17, 0xB7, 0x57, 0x2B, 0x32, 0x28, 0xCF, 0x28, 0x07, 0xF7, + 0x3A, 0x1C, 0x50, 0x2A, 0x47, 0x21, 0x7B, 0x1F, 0x7F, 0xF8, 0xA0, 0xC6, 0x58, 0xBA, 0x8E, 0x56, + 0x4E, 0x75, 0x59, 0x8F, 0x8C, 0xDE, 0xD3, 0xA0, 0x20, 0xBD, 0x71, 0x76, 0x08, 0xA1, 0x77, 0x1B, + 0x26, 0x43, 0x92, 0x67, 0x73, 0x6B, 0x01, 0x76, 0x2C, 0xEF, 0x83, 0x8A, 0x96, 0xBD, 0xEC, 0x14, + 0xBF, 0x51, 0xD9, 0x9E, 0x41, 0xF4, 0x07, 0x93, 0x40, 0xA7, 0x13, 0x02, 0x5F, 0x19, 0x0B, 0x12, + 0x5D, 0xD7, 0x58, 0x6C, 0xCF, 0x8B, 0xD9, 0x06, 0x43, 0x68, 0x5C, 0x11, 0xFE, 0x41, 0x4D, 0x6D, + 0xE9, 0x91, 0xF9, 0xB9, 0xFE, 0x45, 0x88, 0x93, 0x3F, 0x95, 0x87, 0x4D, 0x74, 0xCD, 0x74, 0xAF, + 0x1D, 0xDB, 0x35, 0x70, 0x3C, 0x30, 0xD6, 0x01, 0x50, 0xDA, 0xF9, 0x6D, 0x8D, 0x2F, 0xBE, 0x32, + 0xF0, 0x21, 0x2E, 0x23, 0xA7, 0x9F, 0x98, 0x55, 0xCC, 0x6C, 0xD7, 0x17, 0xB3, 0x39, 0x3C, 0x0C, + 0x3F, 0xC0, 0xF9, 0x3F, 0xFF, 0x5D, 0xB4, 0x83, 0xC0, 0x5A, 0x2D, 0x62, 0x02, 0xD0, 0x35, 0xDF, + 0x9B, 0x9D, 0xEB, 0x40, 0xA9, 0xE7, 0xFA, 0xBE, 0xEB, 0x59, 0x0B, 0x2B, 0x43, 0x3B, 0x59, 0xD2, + 0x3E, 0x94, 0x89, 0x3B, 0xD5, 0x58, 0xA2, 0xF8, 0x33, 0x7F, 0xE6, 0x59, 0xEB, 0x60, 0xF2, 0xC4, + 0x74, 0x67, 0x9B, 0x15, 0x71, 0x82, 0x8E, 0x61, 0x9A, 0x97, 0x57, 0x70, 0xF0, 0x2D, 0x7E, 0xAC, + 0x0D, 0x24, 0xDF, 0xDA, 0x7B, 0xFD, 0x8F, 0x77, 0x38, 0x3A, 0xE3, 0x35, 0x90, 0x17, 0x31, 0xF7, + 0x0E, 0xB4, 0xF9, 0xC6, 0x61, 0x03, 0x64, 0x8B, 0x60, 0xDB, 0x7D, 0xED, 0x0F, 0xC0, 0x78, 0x65, + 0x78, 0xDA, 0xD4, 0xF0, 0xC9, 0x5B, 0xD7, 0x0F, 0xB4, 0x73, 0x2D, 0xC4, 0x68, 0xBB, 0x33, 0xBA, + 0x9D, 0xA3, 0xC3, 0xF8, 0xE2, 0x2D, 0x19, 0xE3, 0x3F, 0x7A, 0x36, 0x34, 0x0D, 0xA1, 0x9E, 0x6B, + 0x7B, 0xA7, 0xC7, 0xBD, 0x3D, 0xB4, 0xDD, 0xB0, 0x8B, 0x39, 0x81, 0xE8, 0x0F, 0xED, 0x5A, 0x1B, + 0xCF, 0x3E, 0xD0, 0x66, 0xD3, 0xFD, 0x3F, 0x28, 0xF5, 0xF4, 0x32, 0x5E, 0xDB, 0xE7, 0xCC, 0x74, + 0x82, 0x25, 0x71, 0x5A, 0x11, 0x65, 0x1E, 0xF1, 0xD7, 0xAE, 0xE3, 0x13, 0x46, 0x1C, 0xFB, 0x59, + 0xF3, 0xE8, 0x7A, 0xC7, 0x0F, 0x8C, 0x60, 0xE3, 0x6B, 0x4F, 0xCF, 0xCF, 0xB5, 0x7E, 0xB7, 0x1B, + 0x6F, 0xA6, 0x41, 0x37, 0xE9, 0x76, 0x07, 0x5A, 0xEA, 0xC2, 0x0F, 0xE4, 0x26, 0xD8, 0xFF, 0x2A, + 0x84, 0xB9, 0xD3, 0x88, 0xED, 0x93, 0x04, 0x92, 0x10, 0x00, 0x5F, 0x27, 0xD7, 0xDA, 0x4F, 0x12, + 0xD8, 0x32, 0x8D, 0xC0, 0xD8, 0xFF, 0x23, 0xA1, 0x2F, 0xE8, 0x15, 0x28, 0x39, 0xD0, 0xE8, 0xAD, + 0xAF, 0x62, 0xB7, 0xEE, 0xF6, 0x3B, 0x20, 0x43, 0xE0, 0x37, 0x84, 0x26, 0x9E, 0x97, 0xA4, 0x98, + 0x42, 0xB7, 0x7B, 0x07, 0x1A, 0xDE, 0x49, 0xC2, 0xC6, 0x88, 0x7C, 0x22, 0xAE, 0x09, 0xA1, 0xE5, + 0xA3, 0x95, 0xA0, 0x64, 0xE8, 0xEE, 0x12, 0x2A, 0x82, 0x38, 0xF4, 0x3D, 0x59, 0x80, 0xC4, 0x16, + 0x07, 0x3C, 0x2C, 0x1D, 0xD0, 0x98, 0x74, 0xC0, 0xC2, 0x59, 0x4C, 0x6B, 0xE0, 0xD0, 0xBE, 0x6B, + 0x13, 0xB0, 0x89, 0x45, 0x6B, 0x8F, 0x7F, 0x0A, 0x14, 0xEC, 0x69, 0xAF, 0x7B, 0xB3, 0xF7, 0x1C, + 0xC0, 0x3B, 0x81, 0xFB, 0x21, 0xF0, 0x2C, 0x67, 0xD1, 0xEA, 0x8D, 0xF7, 0x23, 0x5C, 0xF4, 0x36, + 0x22, 0x4C, 0xDD, 0xA7, 0xD7, 0x69, 0x17, 0xE9, 0x1B, 0x2D, 0x7E, 0xFD, 0xF9, 0xDE, 0xFE, 0x1E, + 0x27, 0x9D, 0x9E, 0x83, 0xB1, 0xB5, 0xD8, 0xC1, 0x33, 0x4A, 0xE1, 0xBE, 0x76, 0x76, 0xC6, 0xBB, + 0x61, 0xAD, 0xF0, 0x22, 0x34, 0xA2, 0x7F, 0x52, 0xB7, 0x42, 0x43, 0xFC, 0xF5, 0xCB, 0x3F, 0x84, + 0xC5, 0xDE, 0x1D, 0x02, 0xD5, 0x2F, 0x30, 0x2E, 0x7F, 0xF9, 0x07, 0xFC, 0x7F, 0xF7, 0x8C, 0x86, + 0xE2, 0x2F, 0xFF, 0xC0, 0x3F, 0x77, 0xCF, 0xA0, 0x27, 0x38, 0xA6, 0xFD, 0xDD, 0xFD, 0x4A, 0xA5, + 0xB0, 0x2D, 0xBB, 0x45, 0xA6, 0xEC, 0x42, 0xA1, 0x95, 0xA6, 0x69, 0x91, 0x43, 0xD4, 0xAF, 0x91, + 0xF7, 0xB6, 0x66, 0xAE, 0x09, 0xCA, 0x09, 0xC0, 0x8E, 0x85, 0xCA, 0x6D, 0x50, 0x89, 0x10, 0x54, + 0x57, 0xA8, 0xDC, 0x9A, 0xD3, 0x96, 0x1A, 0x77, 0x94, 0xC8, 0x3C, 0x44, 0xCB, 0xB5, 0xE1, 0xF9, + 0xE4, 0x1B, 0x27, 0x68, 0x05, 0x09, 0x97, 0xC8, 0x90, 0xF8, 0x64, 0x92, 0x60, 0x01, 0x7F, 0x00, + 0x07, 0xED, 0xF6, 0xB8, 0xD2, 0x42, 0x53, 0x7B, 0x12, 0x5A, 0x61, 0x44, 0x29, 0xBB, 0x99, 0x61, + 0x85, 0x3F, 0xCF, 0xEC, 0xCF, 0xAD, 0x1B, 0xF8, 0x2F, 0x1D, 0x28, 0xB6, 0x44, 0x84, 0x8D, 0x5E, + 0xE0, 0x7F, 0x20, 0x17, 0xFC, 0x93, 0xA9, 0x1F, 0xC0, 0xFA, 0xDE, 0xB6, 0x5B, 0xEC, 0xB3, 0x5F, + 0xA0, 0x9A, 0x0D, 0x04, 0x21, 0xFF, 0x16, 0xC3, 0x81, 0xEB, 0x06, 0x9F, 0x0E, 0xB4, 0xB5, 0x07, + 0x84, 0xD1, 0x2F, 0x7D, 0xC0, 0x31, 0x20, 0x22, 0x0E, 0xFB, 0x5B, 0x48, 0xC1, 0xDA, 0xB6, 0x5F, + 0x30, 0xAC, 0x40, 0x02, 0x3B, 0x00, 0x4D, 0x6D, 0xD0, 0x62, 0xE0, 0xFF, 0xBB, 0x67, 0xD0, 0x09, + 0x1C, 0xC2, 0xFF, 0x77, 0xCF, 0xB0, 0x2B, 0xD4, 0x25, 0xF6, 0x78, 0xF7, 0x0C, 0x7A, 0x84, 0x13, + 0xF8, 0x1F, 0xDA, 0x60, 0xBF, 0xD8, 0x0A, 0xFF, 0xC2, 0x1D, 0xDA, 0x3F, 0xDE, 0xA4, 0x07, 0xEC, + 0x02, 0x3F, 0xCD, 0x63, 0x90, 0xBD, 0xE9, 0xBE, 0x45, 0xDF, 0x3C, 0xFE, 0xE9, 0x06, 0xD8, 0xA1, + 0x07, 0xB7, 0xE0, 0xF8, 0x8E, 0x89, 0xE7, 0xF8, 0xE7, 0x56, 0x98, 0x27, 0x5E, 0xE0, 0x47, 0x70, + 0x8D, 0xBE, 0x9D, 0x15, 0x2F, 0xB1, 0x03, 0x6C, 0x45, 0xDF, 0xA5, 0x49, 0x5B, 0xB1, 0x23, 0xB8, + 0xC6, 0xDF, 0xC0, 0x78, 0xA0, 0xF1, 0x77, 0xFC, 0x15, 0x0A, 0x27, 0x7A, 0x07, 0xDF, 0x0B, 0xFF, + 0x06, 0x19, 0x64, 0xA4, 0xA1, 0x54, 0xC2, 0xB3, 0xDB, 0xBB, 0x67, 0x04, 0xEF, 0x51, 0x22, 0xE1, + 0xF8, 0x96, 0x1F, 0xC3, 0x75, 0xA0, 0x0F, 0xEF, 0x08, 0x82, 0xE9, 0x85, 0xDB, 0xE8, 0x02, 0xB4, + 0x08, 0xF0, 0x3E, 0x27, 0x1E, 0xCE, 0x6E, 0xC3, 0x33, 0x84, 0xA6, 0xB0, 0x9C, 0x0D, 0x38, 0xBD, + 0x8D, 0x4E, 0xE1, 0x2E, 0xF2, 0x82, 0x0A, 0xE0, 0x3C, 0xDD, 0x3D, 0xE3, 0x3C, 0xA1, 0x16, 0xD9, + 0x51, 0x5A, 0xD4, 0x18, 0xF4, 0x02, 0x1E, 0x24, 0x5F, 0xB1, 0x1C, 0x24, 0x36, 0x3C, 0x42, 0x00, + 0xB8, 0xB4, 0x09, 0x1E, 0xBE, 0xBA, 0xFD, 0xC6, 0x6C, 0xED, 0xF1, 0x4F, 0xB7, 0xEE, 0x61, 0x88, + 0x8E, 0xC3, 0x74, 0x5C, 0x67, 0x66, 0x5B, 0x33, 0x8C, 0x04, 0xAD, 0x7D, 0xED, 0x7C, 0xC2, 0xC3, + 0x34, 0x7A, 0x2C, 0x34, 0x8F, 0x7B, 0x61, 0x26, 0x6A, 0x8F, 0x7F, 0x7C, 0x74, 0x6F, 0xBF, 0x43, + 0x1D, 0x8D, 0x3B, 0x13, 0xA2, 0xE0, 0x31, 0x46, 0x0D, 0x07, 0x36, 0x96, 0xE0, 0xD8, 0x0A, 0x07, + 0xB9, 0x48, 0x68, 0xEB, 0x18, 0x16, 0x8A, 0x26, 0x3E, 0x92, 0x74, 0x53, 0x83, 0x48, 0x4E, 0xD8, + 0x12, 0x11, 0xEA, 0x69, 0x3A, 0x42, 0x81, 0xAA, 0xBC, 0xA0, 0xB5, 0x77, 0xE9, 0x79, 0xAE, 0xF7, + 0xAF, 0xBD, 0xE7, 0xD8, 0xE8, 0xF9, 0xDE, 0xBF, 0x4F, 0xB5, 0xBD, 0xE7, 0xF1, 0x50, 0x75, 0x97, + 0x8E, 0x29, 0x4C, 0x63, 0x0B, 0x45, 0x8D, 0x2D, 0x62, 0x1A, 0x5B, 0xDC, 0xAF, 0xC6, 0xE2, 0x9F, + 0x8C, 0xAD, 0xA3, 0xB5, 0xF8, 0x27, 0x5A, 0x73, 0x34, 0x57, 0x08, 0xCF, 0x95, 0xC6, 0xB5, 0xB5, + 0x90, 0x69, 0xAB, 0x8A, 0x9A, 0xD8, 0x18, 0x0E, 0xDE, 0x43, 0xBC, 0xB7, 0x3F, 0xBC, 0xFB, 0x16, + 0xC7, 0x02, 0xB9, 0xCA, 0x42, 0x8D, 0xA5, 0xB3, 0x2D, 0x09, 0x06, 0x4C, 0x0E, 0x12, 0x23, 0x53, + 0x22, 0x49, 0x78, 0xBE, 0xA7, 0xB5, 0x28, 0x4A, 0x4C, 0x11, 0x0A, 0x0C, 0x81, 0x8F, 0x2C, 0x6A, + 0xBE, 0x8B, 0xA3, 0x89, 0x70, 0xDE, 0x08, 0x2A, 0xC7, 0x16, 0x10, 0x40, 0x49, 0x89, 0x0C, 0xF3, + 0x96, 0xC3, 0xC4, 0x06, 0xBD, 0xC6, 0x5D, 0x84, 0xFA, 0xAB, 0xAF, 0x1A, 0xD4, 0x44, 0x4C, 0x8F, + 0x62, 0x9B, 0x5F, 0x28, 0x1D, 0x1E, 0xF9, 0x95, 0x04, 0xC4, 0x3F, 0x05, 0x22, 0x31, 0x70, 0x3E, + 0x62, 0x94, 0xC0, 0x72, 0x2B, 0xC1, 0x42, 0x47, 0x1A, 0x25, 0x1C, 0xF4, 0xF3, 0x11, 0x19, 0x18, + 0xD4, 0xA8, 0xA0, 0xDF, 0x6B, 0x90, 0x60, 0x10, 0x63, 0x9A, 0x12, 0x12, 0xF1, 0xAD, 0x81, 0x6C, + 0x3C, 0x6A, 0xC4, 0x88, 0x37, 0xFC, 0x4B, 0xF0, 0xF0, 0x31, 0x54, 0x09, 0x0D, 0x7F, 0x3B, 0x7D, + 0x26, 0x16, 0x35, 0x62, 0xF8, 0x0B, 0xE1, 0x65, 0x3C, 0xF1, 0x31, 0x5B, 0x8D, 0x27, 0xFE, 0x1E, + 0xF3, 0x6C, 0x3C, 0x8A, 0xB2, 0xE1, 0xEF, 0x0E, 0x97, 0x59, 0x1D, 0x4B, 0x11, 0x72, 0x1D, 0x83, + 0x35, 0x01, 0x60, 0x5E, 0x96, 0x7E, 0xD1, 0x3B, 0xED, 0x46, 0x18, 0x78, 0x46, 0x91, 0x87, 0x81, + 0x37, 0x49, 0x63, 0x10, 0xD1, 0xE1, 0x01, 0x72, 0xBB, 0x87, 0x88, 0x42, 0x90, 0xA3, 0xAB, 0x45, + 0x21, 0x48, 0xBB, 0x45, 0xF8, 0x09, 0x61, 0x32, 0xC2, 0x0F, 0x2D, 0x68, 0xB0, 0x2F, 0x18, 0xE7, + 0xC9, 0x3F, 0xFC, 0x20, 0xB0, 0x4C, 0x89, 0x88, 0x03, 0xD2, 0x79, 0x25, 0x4B, 0xE2, 0xDF, 0xBE, + 0x4D, 0x19, 0x12, 0x2D, 0x96, 0xDC, 0xFA, 0x6A, 0xA1, 0xEB, 0xD6, 0xCF, 0xC0, 0x40, 0xE7, 0x0E, + 0x6A, 0xB9, 0x19, 0xFF, 0x58, 0xAC, 0x04, 0x09, 0xCC, 0x39, 0x94, 0x50, 0xF0, 0x2F, 0x66, 0xCA, + 0x18, 0xA1, 0x1F, 0x54, 0x54, 0x62, 0x45, 0x7C, 0x3C, 0x51, 0x46, 0x07, 0x9D, 0xDE, 0xE4, 0x29, + 0x85, 0x7F, 0xA2, 0x2E, 0x4B, 0x23, 0x6B, 0xD5, 0x21, 0x57, 0x7C, 0x8E, 0x4D, 0x32, 0xEC, 0x56, + 0x9C, 0x15, 0x3E, 0xCC, 0x10, 0xBD, 0xF8, 0x28, 0xE6, 0xE2, 0xC4, 0x96, 0xA6, 0xA2, 0xC4, 0xEE, + 0x18, 0x01, 0x24, 0x47, 0xD3, 0x4D, 0x40, 0xFC, 0x0E, 0xD6, 0x0F, 0x42, 0xE1, 0x6C, 0xDD, 0xEA, + 0x38, 0x40, 0x00, 0x45, 0xB8, 0x1F, 0x8F, 0x55, 0x2C, 0x70, 0x6C, 0xE1, 0x62, 0x97, 0xB3, 0xD0, + 0xB1, 0xBB, 0x19, 0x18, 0x79, 0x7A, 0x9B, 0x84, 0xC0, 0x8B, 0x59, 0xD8, 0x68, 0x8D, 0x28, 0x86, + 0xAB, 0x3F, 0x1A, 0x6D, 0x27, 0xB9, 0xBC, 0x03, 0xB6, 0xAC, 0x84, 0x02, 0xE9, 0x60, 0x89, 0x3E, + 0x2A, 0x7B, 0xCD, 0x60, 0x16, 0xAA, 0xED, 0x89, 0x35, 0xA5, 0xBD, 0xD3, 0xAD, 0x7A, 0x06, 0x40, + 0x70, 0xAB, 0xD2, 0x5E, 0x30, 0x1A, 0x4F, 0xA3, 0x62, 0x89, 0xA6, 0x4D, 0x3D, 0x62, 0x7C, 0xFE, + 0x2A, 0x81, 0x8C, 0x56, 0xFF, 0x43, 0x4C, 0xEC, 0x1A, 0x16, 0x05, 0x53, 0x97, 0xD8, 0x13, 0x37, + 0x6D, 0xD7, 0x21, 0xF2, 0x5E, 0x13, 0xD5, 0x11, 0xDE, 0x11, 0x3F, 0x33, 0xC9, 0xDC, 0xD8, 0xD8, + 0x41, 0x04, 0xE6, 0x91, 0x60, 0xE3, 0x39, 0xBC, 0x5A, 0xB2, 0x3D, 0xB9, 0x92, 0x96, 0xE9, 0x1A, + 0xB4, 0xCD, 0xC3, 0x43, 0xED, 0x65, 0x10, 0x18, 0xA0, 0x00, 0x5C, 0x66, 0x5D, 0xA2, 0x7C, 0x34, + 0x83, 0x17, 0x7C, 0x5D, 0x0F, 0x8D, 0x12, 0xEB, 0xCF, 0x1E, 0x70, 0x4D, 0xBD, 0xD1, 0x07, 0x10, + 0xE1, 0xA4, 0x14, 0x55, 0xE7, 0x3F, 0x1B, 0xE2, 0xDD, 0x7E, 0xA0, 0x02, 0x73, 0xBD, 0x97, 0xE0, + 0x8B, 0x7B, 0x9D, 0x68, 0xA9, 0x64, 0x8F, 0xD5, 0x37, 0x3B, 0x80, 0xEA, 0x12, 0xFA, 0x00, 0x1D, + 0x47, 0x36, 0xCF, 0xB8, 0x09, 0xF5, 0xAE, 0x9D, 0x9F, 0x9F, 0x73, 0x65, 0xA4, 0x0B, 0xAA, 0xD0, + 0xC2, 0x75, 0x3E, 0x93, 0xDB, 0xCD, 0x1A, 0xC4, 0x1F, 0x95, 0x48, 0x53, 0x45, 0x5B, 0x2E, 0x1D, + 0xD2, 0x81, 0x96, 0x17, 0xBC, 0x4C, 0xD6, 0x1B, 0x48, 0x1A, 0x45, 0x2A, 0xA0, 0xD6, 0x89, 0x9E, + 0xF8, 0xD5, 0x56, 0xA3, 0xBB, 0x27, 0xF2, 0x33, 0x49, 0x79, 0x99, 0x13, 0xC8, 0x85, 0x27, 0x86, + 0xAE, 0x54, 0x0F, 0x4F, 0x92, 0xA8, 0xEE, 0xF6, 0x9F, 0x44, 0x91, 0x61, 0xB3, 0x36, 0x8D, 0x80, + 0x24, 0x83, 0x43, 0x68, 0x0B, 0xE2, 0xE6, 0xCA, 0x0D, 0x48, 0x2A, 0x62, 0x58, 0x8E, 0x15, 0x58, + 0x86, 0xFD, 0x31, 0xB2, 0xC6, 0x9D, 0xBA, 0xBF, 0xC4, 0xC7, 0x4B, 0xF8, 0xFF, 0x56, 0x85, 0x57, + 0xAD, 0x2A, 0xB9, 0x65, 0x21, 0x61, 0x3C, 0x88, 0xAC, 0x24, 0x2E, 0x87, 0x44, 0x58, 0xE0, 0xF7, + 0x45, 0x4F, 0x4F, 0x9F, 0xD2, 0xA3, 0x27, 0xA1, 0xD2, 0x44, 0xF4, 0x38, 0xD7, 0xA2, 0x1B, 0x29, + 0x05, 0x6F, 0xE3, 0x4E, 0xE1, 0x10, 0xC8, 0x63, 0x18, 0x98, 0x6F, 0x85, 0xEA, 0x5D, 0xC3, 0x54, + 0x17, 0x6D, 0xE1, 0xFF, 0xA3, 0xFE, 0x23, 0x8A, 0xFA, 0xBB, 0x0B, 0xF1, 0x39, 0xB6, 0x9D, 0xF2, + 0x00, 0x06, 0x27, 0x5F, 0x74, 0x79, 0xBE, 0x77, 0xA0, 0xC9, 0x57, 0x55, 0x52, 0x69, 0xC5, 0xD2, + 0x32, 0x19, 0xC9, 0x91, 0x5D, 0xA1, 0x84, 0x70, 0x61, 0x14, 0x97, 0x0E, 0x71, 0x1D, 0xB1, 0xB5, + 0xC7, 0x56, 0x6D, 0x69, 0x34, 0xBE, 0x8B, 0x12, 0x92, 0xA5, 0x7B, 0x9D, 0x07, 0xE9, 0x41, 0xCC, + 0xB9, 0x22, 0x29, 0xE0, 0x10, 0xDA, 0xB4, 0x7C, 0x63, 0x6A, 0x17, 0x77, 0xCD, 0xDB, 0x99, 0x7C, + 0x28, 0x80, 0x06, 0xE2, 0x0A, 0x80, 0x06, 0x1E, 0xF5, 0x99, 0x18, 0x5A, 0xE2, 0x14, 0x61, 0x15, + 0x64, 0xE5, 0x22, 0x9E, 0x1B, 0xE0, 0xC4, 0x49, 0xCC, 0x2C, 0x90, 0x96, 0x08, 0xB1, 0xF1, 0xCB, + 0x00, 0x91, 0x3C, 0x3D, 0xD7, 0x9C, 0x8D, 0x6D, 0x83, 0x05, 0x22, 0x0B, 0x60, 0x81, 0xF1, 0xBB, + 0xD2, 0x00, 0xFD, 0xE7, 0x8D, 0x66, 0x21, 0xE5, 0x09, 0x09, 0x3C, 0x7B, 0x96, 0xC4, 0x86, 0xCB, + 0xB7, 0x2C, 0x35, 0x0F, 0x7B, 0x63, 0xED, 0xD9, 0xDB, 0x74, 0xA3, 0x51, 0x96, 0x93, 0x04, 0x43, + 0xF5, 0xD3, 0x84, 0xE0, 0x63, 0x19, 0x0E, 0x10, 0x62, 0x99, 0x54, 0x40, 0xB8, 0x49, 0x43, 0xDF, + 0x5A, 0xE9, 0x7A, 0x41, 0xAD, 0xBE, 0x45, 0xF8, 0x1E, 0x9D, 0x7D, 0x90, 0x3F, 0x1A, 0x73, 0x74, + 0x41, 0x64, 0x3B, 0x61, 0x57, 0x71, 0x8C, 0x8B, 0x04, 0x46, 0x64, 0x2C, 0x45, 0x37, 0xFE, 0x68, + 0x07, 0xD0, 0x14, 0x77, 0xC8, 0xC4, 0x06, 0xEF, 0xED, 0xD1, 0x9F, 0x76, 0xBC, 0xDD, 0x30, 0x97, + 0x82, 0xEB, 0xE9, 0xA7, 0x05, 0x34, 0x97, 0x31, 0x46, 0xD1, 0x5D, 0x4F, 0x91, 0x25, 0x4A, 0x02, + 0x1C, 0xE6, 0xA1, 0x9A, 0x1B, 0x33, 0xF2, 0xC9, 0x23, 0x33, 0x77, 0xE1, 0x58, 0xBF, 0x13, 0x19, + 0x42, 0xE6, 0x50, 0x2D, 0xE2, 0x78, 0xAE, 0x98, 0x66, 0x23, 0x72, 0xEE, 0x2B, 0xC9, 0xEB, 0x99, + 0x3D, 0x69, 0x3A, 0xB8, 0xD5, 0x27, 0x0B, 0x37, 0x1F, 0xF8, 0x56, 0x70, 0xBB, 0xDD, 0xCF, 0x44, + 0x6B, 0xF7, 0x04, 0xF5, 0xD0, 0xF4, 0x0D, 0x6E, 0xD0, 0x09, 0x79, 0x08, 0x2F, 0x24, 0x93, 0x50, + 0xE1, 0x9E, 0xE1, 0x0A, 0x58, 0xDC, 0x5E, 0xD8, 0x50, 0x19, 0x8D, 0x93, 0x91, 0x41, 0xDE, 0xD3, + 0xC8, 0xD1, 0xC3, 0x61, 0x43, 0x1A, 0xDF, 0x6B, 0x0E, 0x1A, 0x39, 0x38, 0xD9, 0xC6, 0x97, 0x34, + 0xD2, 0xCD, 0x74, 0x65, 0x05, 0x12, 0x84, 0x7B, 0xBD, 0xBD, 0x32, 0xE3, 0x4F, 0xDC, 0x5B, 0x59, + 0xC4, 0xA3, 0xA9, 0x39, 0x20, 0x4A, 0xAC, 0xE8, 0xCD, 0xD8, 0x06, 0xCF, 0x17, 0x30, 0xFD, 0xC6, + 0x75, 0x3A, 0x54, 0x70, 0x6A, 0x81, 0x9C, 0xA1, 0x60, 0xFB, 0x3A, 0x28, 0x8A, 0xE4, 0xCE, 0x0E, + 0xB1, 0x9B, 0x22, 0x99, 0xC9, 0xC7, 0x37, 0x14, 0xFC, 0xEA, 0x11, 0x80, 0xF3, 0xB1, 0x9A, 0xA8, + 0x7D, 0xF9, 0x07, 0x45, 0x71, 0xA7, 0xCD, 0x21, 0x5A, 0xF8, 0x4B, 0x62, 0xD2, 0xCA, 0x57, 0xB0, + 0xF1, 0x4F, 0x35, 0x5C, 0x14, 0x4F, 0xEC, 0xE4, 0xB8, 0xFB, 0x35, 0xB4, 0x90, 0x70, 0xB0, 0x29, + 0x9C, 0x6C, 0xD0, 0x0D, 0x3F, 0xF9, 0xF3, 0x0C, 0x96, 0x9E, 0x4B, 0x0A, 0x4B, 0xF8, 0x63, 0x91, + 0xC4, 0xEE, 0x40, 0x4E, 0x03, 0xDD, 0x7C, 0x07, 0xD9, 0x4B, 0xCA, 0x4C, 0xF7, 0xF9, 0x34, 0x09, + 0x34, 0x60, 0x8A, 0x90, 0xC7, 0x74, 0x84, 0x93, 0x21, 0x26, 0xA6, 0x84, 0x84, 0x19, 0x33, 0x9C, + 0x97, 0xE2, 0xDD, 0x30, 0x3C, 0x0B, 0x08, 0x65, 0xF1, 0x9B, 0x0F, 0x93, 0x9B, 0xFD, 0x27, 0xA1, + 0x18, 0xB6, 0x71, 0x60, 0x07, 0x31, 0x04, 0x09, 0x11, 0x65, 0x89, 0x89, 0x1B, 0x4D, 0x72, 0x5E, + 0x96, 0x23, 0x33, 0xF6, 0x8B, 0x8D, 0x99, 0x74, 0xC0, 0xA4, 0x3D, 0xFF, 0x8B, 0x1A, 0xCD, 0xBF, + 0x0F, 0xD8, 0x20, 0x1B, 0x8B, 0x79, 0xFB, 0x65, 0x08, 0xDA, 0x9A, 0x24, 0x16, 0x12, 0x73, 0x6F, + 0xE9, 0xB2, 0xF8, 0x41, 0x80, 0xA3, 0xF8, 0x20, 0x29, 0xDD, 0x9A, 0x26, 0xC6, 0x73, 0xBA, 0x90, + 0x41, 0x89, 0x6C, 0x62, 0x73, 0x3C, 0x21, 0x1E, 0x69, 0x3E, 0x97, 0x29, 0x2E, 0x66, 0x5F, 0xCC, + 0x61, 0xAF, 0x2C, 0x72, 0x9D, 0x5B, 0x37, 0xA5, 0x7B, 0xB5, 0xA8, 0xBC, 0x22, 0x80, 0x8B, 0x70, + 0x6F, 0x5E, 0x21, 0x64, 0xB4, 0x8F, 0x2F, 0x86, 0x83, 0x6E, 0xD2, 0x53, 0x5B, 0x5C, 0xA5, 0x4D, + 0x13, 0xA0, 0x88, 0xB5, 0x18, 0x56, 0xEC, 0xDB, 0x4E, 0x93, 0x1F, 0x1F, 0x7C, 0xF2, 0xE0, 0xE9, + 0x28, 0xC7, 0x1A, 0xC7, 0xA0, 0xA9, 0xE7, 0x17, 0x03, 0xC7, 0x77, 0x04, 0xC6, 0x69, 0x37, 0xAE, + 0x14, 0x80, 0xA3, 0x6D, 0x8C, 0x31, 0x50, 0x31, 0x9E, 0xE5, 0x01, 0x42, 0x1B, 0xB6, 0x4D, 0x75, + 0x2F, 0xA6, 0x5F, 0x3F, 0x70, 0xD7, 0x1F, 0x28, 0x21, 0xA9, 0x40, 0x74, 0x4D, 0x17, 0x07, 0x3A, + 0x78, 0xBF, 0xC5, 0xD3, 0xA4, 0xB8, 0x6C, 0x93, 0xEB, 0xA9, 0x1F, 0x70, 0xE5, 0x40, 0x63, 0x78, + 0xF6, 0x92, 0x39, 0x2E, 0x5D, 0x54, 0x90, 0xF6, 0x80, 0x96, 0xD2, 0xF1, 0xBD, 0x19, 0x1B, 0x0E, + 0xC2, 0x4D, 0x7F, 0x18, 0xAD, 0xF0, 0xF0, 0x57, 0xD6, 0x27, 0x0E, 0xDF, 0x09, 0x9B, 0xDA, 0x2F, + 0xA4, 0xC5, 0x5D, 0xA7, 0x49, 0x89, 0x4A, 0x4A, 0xCC, 0xBF, 0x7D, 0x1C, 0x07, 0xD8, 0xD0, 0x87, + 0x11, 0x33, 0x66, 0x6F, 0x19, 0x61, 0x39, 0x12, 0x13, 0x8F, 0x83, 0x49, 0xE2, 0x63, 0x63, 0x19, + 0xDB, 0x31, 0xFA, 0xE2, 0xD3, 0x6C, 0x0A, 0xC3, 0xD7, 0x6B, 0x70, 0x3E, 0xF0, 0xF6, 0xEB, 0xD6, + 0xFE, 0x5D, 0x1E, 0x3B, 0x4C, 0x5C, 0x91, 0xED, 0xA8, 0x12, 0x41, 0x07, 0x0A, 0x39, 0xB6, 0x84, + 0x7C, 0xE4, 0xE8, 0xE2, 0x0E, 0x73, 0xE9, 0x88, 0x69, 0x4A, 0x96, 0x60, 0xCF, 0xB7, 0x45, 0xCB, + 0x32, 0xD5, 0x04, 0x82, 0x68, 0x08, 0xD8, 0x22, 0x36, 0x95, 0xA8, 0xC6, 0xEC, 0x42, 0x34, 0x10, + 0xB4, 0xC7, 0x7D, 0x30, 0x83, 0xF6, 0x64, 0x1E, 0x9F, 0x4A, 0x18, 0x99, 0x00, 0x42, 0x67, 0xCA, + 0x59, 0xC2, 0x99, 0x19, 0xCE, 0x95, 0x91, 0x58, 0xC2, 0x99, 0x01, 0x41, 0x01, 0xE1, 0x7E, 0xD3, + 0xD2, 0x59, 0x03, 0x9D, 0x3B, 0x00, 0x3B, 0xEB, 0xD0, 0x87, 0x61, 0x70, 0x46, 0x82, 0x36, 0x40, + 0x4F, 0x12, 0xB7, 0x97, 0x84, 0xBE, 0x80, 0x90, 0xDF, 0x67, 0x67, 0xAC, 0x41, 0xD8, 0xCB, 0xD4, + 0x35, 0x6F, 0x3B, 0xC6, 0x7A, 0x4D, 0x1C, 0xF3, 0x62, 0x69, 0xD9, 0x66, 0x8B, 0x81, 0xC6, 0xD6, + 0x31, 0x30, 0x2C, 0x12, 0xBA, 0xF5, 0x8D, 0x63, 0x05, 0x6F, 0xBE, 0x60, 0xD7, 0x5A, 0x7B, 0x7D, + 0x53, 0xEC, 0x5C, 0xE4, 0xCD, 0x3A, 0xA6, 0x67, 0x5C, 0x7F, 0x83, 0xFB, 0xA2, 0xA9, 0x39, 0x1C, + 0x74, 0x0F, 0xBA, 0xBC, 0x41, 0x00, 0xE9, 0x96, 0x10, 0x39, 0xE2, 0xC5, 0xFD, 0xA3, 0x3F, 0x7E, + 0xFF, 0x6D, 0x84, 0x37, 0x70, 0x5F, 0xB3, 0x4B, 0xAD, 0x3D, 0xBA, 0xB1, 0xFA, 0xF0, 0xB7, 0x35, + 0xEE, 0x57, 0x11, 0xC3, 0x4C, 0x4C, 0x8C, 0xB8, 0x67, 0x1A, 0x45, 0xC5, 0x9A, 0x7F, 0x15, 0x47, + 0x0A, 0x97, 0x1D, 0x18, 0x27, 0xD0, 0xDC, 0x5B, 0x32, 0x50, 0xB1, 0xA3, 0x1A, 0xC1, 0x91, 0x93, + 0xAF, 0x61, 0xA2, 0xFA, 0x0B, 0x31, 0x3C, 0xD0, 0xC7, 0x73, 0xAD, 0xA5, 0x77, 0xF5, 0xE7, 0x2D, + 0x7A, 0xFD, 0x1D, 0xB0, 0xB3, 0x6C, 0xED, 0x3F, 0xEF, 0xED, 0xEF, 0x77, 0x7C, 0xD0, 0x19, 0x69, + 0xB5, 0xFB, 0xA2, 0x09, 0xFC, 0xA1, 0x6D, 0x58, 0x27, 0xD9, 0xF7, 0xDF, 0xBA, 0x1B, 0xCF, 0xCF, + 0x6B, 0xF0, 0xCE, 0x72, 0x70, 0x24, 0xCE, 0x6B, 0xF2, 0x01, 0xA6, 0x2F, 0x8E, 0xB9, 0xD5, 0x44, + 0xA7, 0x1B, 0xC1, 0xC5, 0x9C, 0x91, 0xEE, 0x8F, 0x85, 0xA4, 0x3F, 0x96, 0xEE, 0xF3, 0x8C, 0x93, + 0x60, 0xC5, 0xBB, 0x25, 0x96, 0xA5, 0xEE, 0xE2, 0xC6, 0x11, 0xE5, 0x74, 0xBC, 0x6A, 0xB0, 0xA5, + 0xFF, 0x54, 0xC0, 0xE2, 0x59, 0xD2, 0x56, 0x2D, 0x5C, 0x25, 0x11, 0x95, 0x66, 0x58, 0xB9, 0x19, + 0x69, 0xB2, 0x60, 0x9C, 0x9E, 0x2D, 0x27, 0xB3, 0xCF, 0x8B, 0x0D, 0xF8, 0xF8, 0x4A, 0x44, 0x54, + 0x76, 0x0D, 0xA7, 0x9C, 0x61, 0xE8, 0x87, 0x29, 0x68, 0xDE, 0x78, 0x04, 0xB7, 0x63, 0x23, 0x18, + 0x9F, 0xAF, 0x16, 0x00, 0xD0, 0x49, 0x6A, 0x38, 0x8A, 0x69, 0x08, 0xB5, 0x4D, 0xB6, 0x24, 0x44, + 0x40, 0xBB, 0xFD, 0x30, 0x62, 0x21, 0x10, 0x9F, 0x75, 0x45, 0xBA, 0xDB, 0x9E, 0x5D, 0xA7, 0x03, + 0xD6, 0xD6, 0xAC, 0xFA, 0x2E, 0xA6, 0x2D, 0xF1, 0x70, 0x4E, 0xC4, 0x0F, 0xC9, 0x67, 0x9E, 0xC4, + 0x99, 0x17, 0x55, 0x82, 0x02, 0x88, 0x4F, 0x34, 0xC7, 0x8F, 0xB3, 0x4F, 0x14, 0xD9, 0x27, 0x9C, + 0x7D, 0x04, 0x88, 0x26, 0x9C, 0xC5, 0x25, 0x8B, 0xD0, 0x18, 0x7F, 0x7A, 0x15, 0x71, 0x76, 0x3D, + 0xCD, 0xA5, 0x93, 0x97, 0x12, 0x62, 0xEC, 0xE5, 0x03, 0x40, 0xFB, 0x15, 0xF8, 0x43, 0x9C, 0xAD, + 0xEB, 0xA9, 0x1A, 0x5B, 0xA2, 0x14, 0x81, 0x00, 0x11, 0x5B, 0xF2, 0x82, 0x85, 0x60, 0xE5, 0x35, + 0x09, 0xF8, 0x23, 0x7C, 0x86, 0x63, 0x6A, 0x73, 0xCF, 0x58, 0x11, 0xFC, 0x62, 0x7B, 0x48, 0xAC, + 0x49, 0xEF, 0x17, 0xE6, 0x7E, 0xAC, 0x59, 0x8C, 0xC9, 0xB0, 0xE4, 0x51, 0x08, 0x1A, 0xB6, 0x8C, + 0x41, 0x87, 0x74, 0xE4, 0x42, 0x8B, 0x46, 0x2C, 0x83, 0x0B, 0x4F, 0x95, 0x84, 0x15, 0xB6, 0x8E, + 0x1C, 0x21, 0x42, 0x20, 0x4A, 0x26, 0xA3, 0x74, 0xA9, 0x8C, 0xCD, 0x24, 0x18, 0xB3, 0xA9, 0xF9, + 0x42, 0xBC, 0x41, 0xC8, 0x52, 0xA2, 0x4D, 0xE8, 0x20, 0x0C, 0x3E, 0x8B, 0xCC, 0x42, 0x52, 0xD8, + 0x42, 0xA2, 0xFE, 0xDE, 0x26, 0x58, 0x9E, 0xE0, 0x2F, 0x65, 0xBC, 0xF8, 0xE6, 0x6B, 0xCD, 0xF5, + 0x34, 0xDB, 0xBD, 0x26, 0xB8, 0x28, 0x28, 0x36, 0x90, 0x69, 0x53, 0x02, 0x01, 0x8E, 0xB0, 0x22, + 0x13, 0xEE, 0x8F, 0x09, 0x96, 0x96, 0x0F, 0x73, 0x62, 0x7C, 0x75, 0x28, 0x79, 0xAA, 0x87, 0xA3, + 0x53, 0x21, 0x7B, 0xDB, 0x25, 0xF4, 0x84, 0x38, 0x19, 0x4C, 0x24, 0xCB, 0xA7, 0x9C, 0xC7, 0xAD, + 0xC0, 0x92, 0x57, 0xD6, 0x2A, 0x21, 0xC2, 0xF0, 0xF6, 0xA3, 0x95, 0xA2, 0x9C, 0x81, 0x42, 0x41, + 0x86, 0x60, 0x91, 0x2C, 0x23, 0x5E, 0xB7, 0xA4, 0x29, 0xAB, 0x1D, 0xE6, 0x68, 0x14, 0x4B, 0xE1, + 0xD2, 0x68, 0x9E, 0xAD, 0x15, 0x26, 0x71, 0x36, 0xCA, 0xB1, 0xDF, 0xD9, 0xA1, 0x78, 0x14, 0x8A, + 0x9D, 0x61, 0xF6, 0x36, 0x79, 0x72, 0x76, 0xB8, 0x0C, 0x56, 0xF6, 0xE4, 0xC9, 0xFF, 0x02, 0x49, + 0x60, 0xC8, 0xA8, 0x55, 0x0C, 0x01, 0x00 +}; + + +//File: index_ov5640.html.gz, Size: 9124 +#define index_ov5640_html_gz_len 9124 +const uint8_t index_ov5640_html_gz[] = { + 0x1F, 0x8B, 0x08, 0x08, 0xD9, 0x6C, 0x6A, 0x5E, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, + 0x6F, 0x76, 0x35, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xED, 0x3D, 0x6B, 0x77, + 0xDB, 0xB6, 0x92, 0xDF, 0xF3, 0x2B, 0x18, 0xF5, 0x6E, 0x24, 0x9F, 0x58, 0xB6, 0xA8, 0x97, 0x1F, + 0xB1, 0x95, 0x4D, 0x1C, 0x27, 0xE9, 0xB9, 0x4D, 0x6F, 0x1A, 0xA7, 0x69, 0x7B, 0xBA, 0x3D, 0x29, + 0x25, 0x41, 0x12, 0x1B, 0x8A, 0xD4, 0x25, 0x29, 0xCB, 0x6E, 0x8E, 0x7F, 0xC7, 0xFE, 0xA0, 0xFD, + 0x63, 0x3B, 0x03, 0x80, 0x24, 0x48, 0x81, 0x24, 0x48, 0x4A, 0xB2, 0xDB, 0x5D, 0xE5, 0x9C, 0x98, + 0x0F, 0xCC, 0x60, 0xDE, 0x18, 0x0C, 0x40, 0xF2, 0xEC, 0xF1, 0xD8, 0x19, 0xF9, 0xB7, 0x0B, 0xA2, + 0xCD, 0xFC, 0xB9, 0x35, 0x78, 0x74, 0xC6, 0xFE, 0x68, 0xF0, 0x3B, 0x9B, 0x11, 0x63, 0xCC, 0x0E, + 0xE9, 0xE9, 0x9C, 0xF8, 0x86, 0x36, 0x9A, 0x19, 0xAE, 0x47, 0xFC, 0xF3, 0xDA, 0xD2, 0x9F, 0x34, + 0x8F, 0x6B, 0xC9, 0xDB, 0xB6, 0x31, 0x27, 0xE7, 0xB5, 0x6B, 0x93, 0xAC, 0x16, 0x8E, 0xEB, 0xD7, + 0xB4, 0x91, 0x63, 0xFB, 0xC4, 0x86, 0xE6, 0x2B, 0x73, 0xEC, 0xCF, 0xCE, 0xC7, 0xE4, 0xDA, 0x1C, + 0x91, 0x26, 0x3D, 0xD9, 0x37, 0x6D, 0xD3, 0x37, 0x0D, 0xAB, 0xE9, 0x8D, 0x0C, 0x8B, 0x9C, 0xEB, + 0x22, 0x2E, 0xDF, 0xF4, 0x2D, 0x32, 0xB8, 0xBC, 0x7A, 0xDF, 0x69, 0x6B, 0xFF, 0xFA, 0xD4, 0xEB, + 0x77, 0x5B, 0x67, 0x87, 0xEC, 0x5A, 0xD4, 0xC6, 0xF3, 0x6F, 0xC5, 0x73, 0xFC, 0x0D, 0x9D, 0xF1, + 0xAD, 0xF6, 0x35, 0x76, 0x09, 0x7F, 0x13, 0x20, 0xA2, 0x39, 0x31, 0xE6, 0xA6, 0x75, 0x7B, 0xAA, + 0xBD, 0x70, 0xA1, 0xCF, 0xFD, 0xB7, 0xC4, 0xBA, 0x26, 0xBE, 0x39, 0x32, 0xF6, 0x3D, 0xC3, 0xF6, + 0x9A, 0x1E, 0x71, 0xCD, 0xC9, 0xB3, 0x35, 0xC0, 0xA1, 0x31, 0xFA, 0x32, 0x75, 0x9D, 0xA5, 0x3D, + 0x3E, 0xD5, 0xBE, 0xD1, 0x8F, 0xF1, 0xDF, 0x7A, 0xA3, 0x91, 0x63, 0x39, 0x2E, 0xDC, 0xBF, 0x7C, + 0x8D, 0xFF, 0xD6, 0xEF, 0xD3, 0xDE, 0x3D, 0xF3, 0x4F, 0x72, 0xAA, 0xE9, 0xFD, 0xC5, 0x4D, 0xEC, + 0xFE, 0xDD, 0xA3, 0xD8, 0xE9, 0xAC, 0x9D, 0x46, 0x3D, 0x87, 0x3F, 0xCE, 0x86, 0xF7, 0xC8, 0xC8, + 0x37, 0x1D, 0xFB, 0x60, 0x6E, 0x98, 0xB6, 0x04, 0xD3, 0xD8, 0xF4, 0x16, 0x96, 0x01, 0x32, 0x98, + 0x58, 0x24, 0x13, 0xCF, 0x37, 0x73, 0x62, 0x2F, 0xF7, 0x73, 0xB0, 0x21, 0x92, 0xE6, 0xD8, 0x74, + 0x59, 0xAB, 0x53, 0x94, 0xC3, 0x72, 0x6E, 0xE7, 0xA2, 0xCD, 0xA2, 0xCB, 0x76, 0x6C, 0x22, 0x11, + 0x20, 0x76, 0xB4, 0x72, 0x8D, 0x05, 0x36, 0xC0, 0xBF, 0xEB, 0x4D, 0xE6, 0xA6, 0xCD, 0x8C, 0xEA, + 0x54, 0xEB, 0x74, 0x5B, 0x8B, 0x9B, 0x1C, 0x55, 0x76, 0xFA, 0xF8, 0x6F, 0xBD, 0xD1, 0xC2, 0x18, + 0x8F, 0x4D, 0x7B, 0x7A, 0xAA, 0x1D, 0x4B, 0x51, 0x38, 0xEE, 0x98, 0xB8, 0x4D, 0xD7, 0x18, 0x9B, + 0x4B, 0xEF, 0x54, 0xEB, 0xCA, 0xDA, 0xCC, 0x0D, 0x77, 0x0A, 0xB4, 0xF8, 0x0E, 0x10, 0xDB, 0xD4, + 0xA5, 0x94, 0xF0, 0x26, 0xAE, 0x39, 0x9D, 0xF9, 0xA0, 0xD2, 0xB5, 0x36, 0x49, 0xA1, 0x71, 0x17, + 0xCA, 0xD3, 0x67, 0xA6, 0xDC, 0xE4, 0x52, 0x33, 0x2C, 0x73, 0x6A, 0x37, 0x4D, 0x9F, 0xCC, 0x81, + 0x1D, 0xCF, 0x77, 0x89, 0x3F, 0x9A, 0x65, 0x91, 0x32, 0x31, 0xA7, 0x4B, 0x97, 0x48, 0x08, 0x09, + 0xE5, 0x96, 0xC1, 0x30, 0xDC, 0x5C, 0xBF, 0xD5, 0x5C, 0x91, 0xE1, 0x17, 0xD3, 0x6F, 0x72, 0x99, + 0x0C, 0xC9, 0xC4, 0x71, 0x89, 0xB4, 0x65, 0xD0, 0xC2, 0x72, 0x46, 0x5F, 0x9A, 0x9E, 0x6F, 0xB8, + 0xBE, 0x0A, 0x42, 0x63, 0xE2, 0x13, 0x37, 0x1F, 0x1F, 0x41, 0xAB, 0xC8, 0xC7, 0x96, 0xDE, 0x2D, + 0x6F, 0x60, 0xDA, 0x96, 0x69, 0x13, 0x75, 0xF2, 0xD2, 0xFA, 0x8D, 0xA3, 0x63, 0xAD, 0x14, 0x14, + 0x63, 0xCE, 0xA7, 0x59, 0x56, 0x42, 0x79, 0x5D, 0xEF, 0x8C, 0xFB, 0x8D, 0xDE, 0x6A, 0xFD, 0xC7, + 0xFA, 0xCD, 0x19, 0x61, 0x66, 0x6A, 0x2C, 0x7D, 0xA7, 0xBA, 0x47, 0xAC, 0xB9, 0x55, 0x82, 0x8F, + 0xFF, 0x9C, 0x93, 0xB1, 0x69, 0x68, 0x0D, 0xC1, 0x9D, 0x8F, 0x5B, 0x60, 0x53, 0x7B, 0x9A, 0x61, + 0x8F, 0xB5, 0x86, 0xE3, 0x9A, 0xE0, 0x08, 0x06, 0x0D, 0x37, 0x16, 0x5C, 0x81, 0x81, 0x63, 0x41, + 0xF6, 0x24, 0x2C, 0x67, 0xF8, 0x8C, 0x28, 0x11, 0xB9, 0xDB, 0xE0, 0x4F, 0x21, 0xE4, 0xE0, 0x2F, + 0xD7, 0x81, 0x24, 0x3C, 0x52, 0xF4, 0x59, 0xFA, 0x12, 0x29, 0x4C, 0xD3, 0x19, 0xFE, 0xE6, 0xC6, + 0x4D, 0x33, 0x53, 0x77, 0x41, 0xA3, 0x40, 0x87, 0x30, 0xCC, 0x8E, 0x1A, 0xD0, 0xF4, 0x7A, 0xA6, + 0x35, 0x35, 0x8C, 0x92, 0x7B, 0x72, 0x18, 0x8E, 0x54, 0xAE, 0x72, 0xFC, 0x89, 0x46, 0x51, 0x80, + 0x5D, 0x39, 0xAB, 0x51, 0xEC, 0x60, 0xFF, 0x64, 0x36, 0xC4, 0x38, 0x49, 0x8D, 0x22, 0xF8, 0x53, + 0x8F, 0x24, 0x11, 0xB2, 0xDC, 0x68, 0x22, 0x41, 0x9C, 0x1E, 0x51, 0xD6, 0xF0, 0xA6, 0x79, 0xB7, + 0x04, 0x6B, 0x36, 0x09, 0xAA, 0xD1, 0x45, 0x82, 0x38, 0x8B, 0x86, 0xDC, 0x28, 0x83, 0xBF, 0x3B, + 0x85, 0x7C, 0xE3, 0x9B, 0xE1, 0xD2, 0xF7, 0x1D, 0xDB, 0xAB, 0x34, 0x44, 0xA5, 0xF9, 0xD9, 0x1F, + 0x4B, 0xCF, 0x37, 0x27, 0xB7, 0x4D, 0xEE, 0xD2, 0xE0, 0x67, 0x0B, 0x03, 0x52, 0xC8, 0x21, 0xF1, + 0x57, 0x84, 0x64, 0xA7, 0x1B, 0xB6, 0x71, 0x0D, 0x71, 0x67, 0x3A, 0xB5, 0x64, 0xB6, 0x37, 0x5A, + 0xBA, 0x1E, 0xE6, 0x6D, 0x0B, 0xC7, 0x04, 0xC4, 0xEE, 0x7A, 0xC7, 0x71, 0x1F, 0x54, 0xEC, 0xA8, + 0x39, 0x1A, 0x4A, 0xFA, 0x72, 0x96, 0x3E, 0xCA, 0x58, 0xAA, 0x09, 0x07, 0xD8, 0x31, 0xFD, 0x5B, + 0xE9, 0x3D, 0xEE, 0x89, 0x92, 0x3B, 0x81, 0x0B, 0x66, 0x0E, 0x0B, 0x71, 0xBA, 0x4E, 0x47, 0x33, + 0x32, 0xFA, 0x42, 0xC6, 0x4F, 0x73, 0xD3, 0xB0, 0xBC, 0xF4, 0xF0, 0xC0, 0xB4, 0x17, 0x4B, 0xBF, + 0x89, 0xE9, 0xD4, 0x62, 0x2B, 0x3A, 0xA7, 0x06, 0x19, 0xB0, 0xD8, 0x6E, 0x67, 0x25, 0x15, 0xBD, + 0xC5, 0x4D, 0xB6, 0x10, 0x44, 0x62, 0x07, 0x96, 0x31, 0x24, 0x56, 0x16, 0xC9, 0xDC, 0x19, 0x52, + 0xC2, 0x2E, 0x8F, 0x55, 0xE9, 0xB9, 0x1B, 0xA5, 0x2C, 0x1A, 0xBC, 0xBA, 0x47, 0xFF, 0xA1, 0x2C, + 0x47, 0x7A, 0xBC, 0x1F, 0xBB, 0xE4, 0x11, 0x0B, 0x1C, 0x2C, 0x71, 0x6D, 0x61, 0xA4, 0x26, 0xE3, + 0xD0, 0x62, 0x05, 0x54, 0x65, 0x76, 0xE9, 0x1A, 0xF6, 0x94, 0x40, 0x74, 0xB8, 0xD9, 0x0F, 0x0E, + 0xB3, 0xA7, 0x0A, 0x4A, 0x02, 0xC1, 0xE0, 0xDD, 0xCB, 0x9E, 0x9A, 0xB0, 0x10, 0xB1, 0xAF, 0x1D, + 0xB0, 0x83, 0x12, 0x79, 0x8A, 0xA0, 0xF1, 0x4C, 0x42, 0x74, 0xA9, 0xBD, 0xB0, 0x54, 0x45, 0xEA, + 0x4B, 0x71, 0x6B, 0x93, 0xA6, 0xFE, 0xB9, 0xC1, 0x22, 0x98, 0x04, 0x4E, 0x26, 0x79, 0xD3, 0xC8, + 0xC9, 0xA4, 0xD3, 0xEA, 0x74, 0x73, 0x73, 0x29, 0x29, 0x97, 0x89, 0xA9, 0xA4, 0x24, 0x98, 0x84, + 0x81, 0x26, 0x5F, 0x17, 0xA7, 0x33, 0xE7, 0x9A, 0xB8, 0x12, 0x45, 0x24, 0xC8, 0xED, 0x9E, 0x74, + 0xC7, 0x0A, 0xD8, 0x0C, 0x18, 0x0A, 0xAE, 0x65, 0x81, 0x36, 0x8E, 0xAE, 0xAD, 0x8F, 0xDA, 0x99, + 0x16, 0xCA, 0xD0, 0x1D, 0x80, 0x35, 0x18, 0x43, 0x8B, 0x8C, 0x33, 0x22, 0xF7, 0x98, 0x4C, 0x8C, + 0xA5, 0xE5, 0xE7, 0xC8, 0xDB, 0x68, 0xE1, 0xBF, 0xAC, 0x1E, 0xA9, 0x7B, 0xFD, 0x8A, 0x35, 0x90, + 0x73, 0xEA, 0x12, 0xBF, 0x49, 0xFA, 0x0C, 0x86, 0x55, 0x63, 0xB1, 0x20, 0x06, 0xB4, 0x1A, 0x91, + 0xB4, 0xD9, 0xAA, 0x52, 0x3A, 0x2D, 0x8F, 0x69, 0x4A, 0x73, 0xD4, 0x5C, 0x53, 0x0C, 0x13, 0xA5, + 0x42, 0x3C, 0x9F, 0x4E, 0x9C, 0xD1, 0x52, 0x36, 0x82, 0xAB, 0x99, 0xD4, 0x3A, 0xBE, 0xD3, 0x40, + 0x64, 0x9E, 0x65, 0x52, 0xC3, 0x5E, 0xDA, 0x36, 0x6A, 0xB4, 0xE9, 0xBB, 0xC0, 0xA6, 0xA4, 0x23, + 0x35, 0xC1, 0x95, 0xF2, 0xCE, 0x98, 0x60, 0xD3, 0xEA, 0x34, 0x09, 0x07, 0x94, 0x04, 0x8A, 0x30, + 0x86, 0x68, 0x9E, 0x03, 0x4C, 0x05, 0xA8, 0xAA, 0xC9, 0xC5, 0x9F, 0x2D, 0xE7, 0xB2, 0x9C, 0x21, + 0xE8, 0x4C, 0x87, 0x01, 0x8E, 0x75, 0xE7, 0x4E, 0x87, 0x46, 0xA3, 0xB5, 0xDF, 0xDA, 0xEF, 0xC0, + 0x7F, 0x92, 0xDC, 0x3D, 0xDB, 0xB8, 0xB8, 0x78, 0x53, 0x2C, 0x2F, 0x11, 0x7C, 0xF2, 0x4B, 0x28, + 0x69, 0x61, 0x2C, 0x57, 0x17, 0xEA, 0x9E, 0x14, 0xAF, 0xA5, 0xE8, 0x07, 0x39, 0x23, 0x4C, 0x8A, + 0x49, 0x17, 0x37, 0x44, 0x89, 0xB5, 0x14, 0x55, 0xF1, 0xDC, 0xF9, 0xB3, 0xC9, 0x86, 0xD7, 0xFF, + 0xF3, 0xD6, 0x2E, 0x88, 0xE2, 0x6F, 0x6D, 0xE9, 0x85, 0xE5, 0xE2, 0xDD, 0xB7, 0x6D, 0xB4, 0xD2, + 0xB5, 0xDE, 0xE4, 0xF9, 0x0C, 0x50, 0x68, 0x43, 0xC6, 0xE9, 0xC2, 0xC4, 0x2B, 0x35, 0xE7, 0x11, + 0xDA, 0x94, 0x90, 0xC1, 0xC4, 0xB4, 0xAC, 0xA6, 0xE5, 0xAC, 0xF2, 0x33, 0x91, 0x6C, 0x4B, 0x5E, + 0xB3, 0xD3, 0x7C, 0x93, 0x2F, 0x4B, 0xED, 0x12, 0x22, 0xD7, 0x5F, 0x82, 0xDA, 0xBF, 0xB7, 0xC3, + 0x65, 0xBA, 0x46, 0xB9, 0x81, 0xA2, 0x84, 0x3D, 0x56, 0xEB, 0x48, 0xC9, 0x94, 0x58, 0x26, 0x98, + 0x39, 0xAB, 0xF3, 0x56, 0xA6, 0x3F, 0x9A, 0x95, 0x98, 0x54, 0x2D, 0x1C, 0xCF, 0x64, 0xCB, 0x37, + 0x2E, 0xB1, 0x0C, 0xCC, 0xE0, 0x4B, 0xCD, 0xC6, 0x73, 0x27, 0x26, 0x22, 0xB8, 0x0A, 0x27, 0x54, + 0x74, 0x0F, 0xA7, 0x92, 0x72, 0xC0, 0x72, 0x87, 0xF4, 0x58, 0x2D, 0x37, 0xEB, 0x9C, 0x74, 0x3F, + 0xEE, 0x19, 0xF2, 0x46, 0x05, 0x22, 0x7A, 0x10, 0xB4, 0xA7, 0x2E, 0xB9, 0x55, 0x60, 0x66, 0x9F, + 0xFF, 0x3D, 0x65, 0xB5, 0xD2, 0xF2, 0x45, 0x00, 0x3A, 0x00, 0x70, 0x2B, 0x3A, 0xE8, 0x7A, 0x0A, + 0x5D, 0xA7, 0x77, 0xA9, 0x62, 0x8F, 0x61, 0x25, 0xB0, 0x56, 0x53, 0x08, 0x37, 0x19, 0x43, 0xA8, + 0xDC, 0x54, 0x83, 0xD1, 0x57, 0x7A, 0xD3, 0x22, 0x13, 0x3F, 0x65, 0xA1, 0x83, 0xE6, 0xA9, 0x9D, + 0xEC, 0xE8, 0xD6, 0x14, 0xEA, 0x04, 0xB9, 0x91, 0x23, 0x2C, 0xD8, 0xA5, 0x5B, 0x9F, 0x14, 0x33, + 0x46, 0xCF, 0xC2, 0xC8, 0xD3, 0x55, 0x12, 0xA4, 0xCF, 0x54, 0xCD, 0xD0, 0x66, 0xCE, 0x87, 0x7C, + 0x50, 0x0F, 0xF9, 0xB9, 0xD1, 0xEE, 0x4B, 0xD7, 0x11, 0x32, 0x1A, 0x67, 0x91, 0xC6, 0x2A, 0x5E, + 0x4A, 0x43, 0x56, 0xEA, 0x04, 0x59, 0x8C, 0x45, 0x52, 0x45, 0x65, 0x7B, 0x65, 0x56, 0x84, 0x59, + 0xAF, 0xD1, 0x64, 0x1A, 0xBB, 0x39, 0x37, 0x20, 0xED, 0x45, 0x73, 0x35, 0x00, 0xA3, 0x4C, 0x7F, + 0x2A, 0xE6, 0x2E, 0xD4, 0x13, 0xF5, 0x7E, 0x2B, 0xA7, 0xCB, 0x91, 0xE5, 0x78, 0xD9, 0x7E, 0x65, + 0x0C, 0x41, 0x7E, 0x4B, 0x5F, 0xD2, 0x11, 0xAF, 0x6A, 0x4A, 0x2B, 0x4F, 0xD4, 0xB8, 0xA5, 0x77, + 0x94, 0x86, 0xEE, 0x4C, 0x9F, 0xCA, 0x76, 0xC7, 0x84, 0xCC, 0xF5, 0x96, 0x34, 0xD2, 0x66, 0xD6, + 0xDF, 0x7C, 0x72, 0x03, 0xF3, 0x4D, 0x5C, 0xAB, 0x3B, 0xD5, 0x46, 0x44, 0x1E, 0x46, 0x63, 0x83, + 0x9C, 0xAE, 0x52, 0x04, 0xCC, 0xD4, 0xC3, 0xCC, 0x1C, 0x8F, 0x49, 0x66, 0x95, 0x13, 0xE7, 0xBC, + 0xD9, 0xA1, 0xD2, 0x90, 0x96, 0xD3, 0x0A, 0x68, 0xB2, 0x9D, 0xAE, 0xCA, 0xCC, 0xE1, 0x2A, 0x25, + 0xF4, 0xC5, 0x24, 0x24, 0x6D, 0x22, 0x54, 0x61, 0xE5, 0x21, 0x12, 0x15, 0x31, 0x26, 0x23, 0xC7, + 0x65, 0x8B, 0xB8, 0x29, 0x13, 0xFF, 0x72, 0x33, 0x2B, 0x44, 0x2E, 0x2B, 0xDD, 0x6D, 0x25, 0x74, + 0x64, 0x6E, 0x74, 0xD0, 0xB7, 0x1D, 0x57, 0xF8, 0x70, 0x9C, 0x56, 0x49, 0x8F, 0x27, 0x6C, 0x99, + 0xA4, 0x4A, 0x43, 0x60, 0xA8, 0x46, 0x14, 0x19, 0xC8, 0x01, 0x5B, 0xAD, 0x2B, 0x34, 0x41, 0x15, + 0x5D, 0x5A, 0x39, 0xE0, 0xAB, 0x4D, 0x7C, 0x61, 0xB0, 0x99, 0xB6, 0xDE, 0xB2, 0xC1, 0xC5, 0x37, + 0x6A, 0x01, 0xC9, 0x7E, 0x53, 0x45, 0x73, 0x4F, 0xF9, 0x63, 0x06, 0x91, 0xE1, 0x40, 0x1C, 0x6C, + 0xB7, 0x8A, 0xB7, 0x2A, 0x1B, 0x42, 0xCE, 0x0E, 0x85, 0xFD, 0x71, 0x67, 0x87, 0xD1, 0x56, 0xBE, + 0x33, 0xDC, 0x24, 0x27, 0x6E, 0xA3, 0xE3, 0xFD, 0x8C, 0x2C, 0xC3, 0xF3, 0xCE, 0x6B, 0xB8, 0xD9, + 0xAB, 0x16, 0xDF, 0x55, 0x77, 0x36, 0x36, 0xAF, 0x35, 0x73, 0x7C, 0x5E, 0xB3, 0x9C, 0xA9, 0x93, + 0xB8, 0x47, 0xEF, 0x33, 0x2D, 0xC3, 0x68, 0x7F, 0x5E, 0x8B, 0xAD, 0x38, 0xD6, 0x28, 0x54, 0x74, + 0xA9, 0x36, 0x78, 0xF2, 0xCD, 0xC9, 0xD1, 0x51, 0xFF, 0xD9, 0x13, 0x7B, 0xE8, 0x2D, 0xF8, 0xFF, + 0x1F, 0xD9, 0x02, 0xAD, 0x47, 0x7C, 0x1F, 0x6C, 0xCE, 0x3B, 0x3B, 0xA4, 0xD8, 0x12, 0x14, 0x1C, + 0x02, 0x09, 0x29, 0x44, 0xF1, 0x6C, 0x50, 0x46, 0x57, 0xD0, 0xC4, 0x83, 0x04, 0x67, 0x68, 0xB8, + 0x92, 0x26, 0xB4, 0x19, 0x9B, 0x6B, 0xD0, 0x18, 0x52, 0xA3, 0xCA, 0x18, 0x3A, 0x37, 0x49, 0xD2, + 0x29, 0x37, 0x5C, 0x53, 0xBC, 0x15, 0x19, 0xA7, 0x21, 0x04, 0x30, 0x0A, 0x8E, 0xEB, 0xAC, 0xD0, + 0x46, 0xDA, 0x28, 0x26, 0x7B, 0x6C, 0x7C, 0x33, 0xB2, 0xBE, 0x04, 0x4A, 0xAF, 0x05, 0xDA, 0xB0, + 0x1D, 0x9F, 0x8D, 0x24, 0x29, 0x5D, 0xC5, 0x58, 0xE5, 0x30, 0xC2, 0x6A, 0x21, 0xE3, 0x02, 0x44, + 0xDB, 0xA4, 0xD8, 0xD9, 0xB5, 0x6C, 0x4C, 0x14, 0x9B, 0xA0, 0xD0, 0x00, 0xB8, 0x36, 0xF8, 0xF9, + 0xE2, 0xBB, 0x7F, 0x6A, 0xEF, 0xDE, 0xFE, 0x29, 0xD5, 0x50, 0x1E, 0x51, 0x18, 0x9C, 0x15, 0x7A, + 0xA6, 0x60, 0x4C, 0x1F, 0x81, 0x4C, 0x6A, 0x5C, 0x33, 0x14, 0x03, 0x26, 0x43, 0x16, 0xB1, 0xA7, + 0xFE, 0xEC, 0xBC, 0xA6, 0xD7, 0x70, 0x77, 0x4B, 0x70, 0xD6, 0xAE, 0x69, 0x18, 0xB8, 0xE9, 0xC1, + 0xB5, 0x61, 0x2D, 0xF1, 0xA8, 0xA5, 0xC2, 0xEB, 0xBA, 0x69, 0x49, 0x9B, 0xF1, 0x88, 0x12, 0xCA, + 0x58, 0x88, 0xC0, 0x71, 0x29, 0xD7, 0x06, 0x57, 0xC4, 0x3F, 0x3B, 0x64, 0xB7, 0x72, 0xB4, 0x96, + 0xDD, 0x37, 0xB8, 0x30, 0x33, 0x87, 0x2C, 0x13, 0xCA, 0x52, 0xFC, 0xC4, 0x35, 0xE6, 0x04, 0xA5, + 0xA2, 0xA4, 0x79, 0x51, 0xEB, 0x21, 0x64, 0x6D, 0xF0, 0x81, 0xD0, 0x2C, 0x03, 0xC8, 0x50, 0x52, + 0xFC, 0x19, 0x4F, 0xE1, 0x63, 0xFD, 0x87, 0xF6, 0xCC, 0x97, 0xEC, 0x9A, 0x06, 0x33, 0x73, 0x05, + 0xB9, 0x3F, 0x6E, 0x36, 0xB5, 0xDE, 0xBB, 0xF7, 0x5A, 0xB3, 0xA9, 0xD0, 0xD8, 0x59, 0x50, 0x77, + 0x0A, 0xF4, 0x0F, 0x16, 0xC2, 0xA8, 0x21, 0x54, 0x3F, 0xEC, 0xA8, 0x36, 0xF8, 0xE1, 0xEA, 0xE7, + 0x37, 0x2F, 0x1A, 0xED, 0x5E, 0xBF, 0x75, 0xA3, 0x9F, 0xB4, 0x5B, 0x7B, 0x67, 0x87, 0x0C, 0xAE, + 0x78, 0x07, 0x60, 0x60, 0xEF, 0xB5, 0xD7, 0x6F, 0x5F, 0x35, 0xF4, 0xD6, 0x71, 0x55, 0x64, 0xFA, + 0x49, 0x6D, 0xF0, 0xD3, 0x0F, 0x11, 0x65, 0xFD, 0x56, 0x15, 0x64, 0xC7, 0xC0, 0x26, 0xD0, 0xC5, + 0x50, 0x75, 0xBB, 0x85, 0x50, 0xA1, 0xC8, 0x3B, 0xE5, 0x44, 0xAE, 0x1F, 0x41, 0xBF, 0x94, 0x87, + 0x56, 0xF7, 0xF8, 0x46, 0xEF, 0xF5, 0xBB, 0x15, 0x78, 0xE8, 0xA3, 0x74, 0x81, 0x90, 0xC6, 0x71, + 0xBF, 0x5B, 0x15, 0x57, 0x0F, 0x71, 0x81, 0x40, 0x8E, 0xDA, 0x20, 0x8F, 0xF6, 0x71, 0x15, 0xD1, + 0x76, 0x6B, 0x03, 0xAA, 0xF2, 0x13, 0x44, 0xD5, 0x2A, 0x86, 0x0A, 0x45, 0xDB, 0x2E, 0x29, 0xDA, + 0x4E, 0x6D, 0xF0, 0x23, 0x8A, 0x16, 0x2D, 0x03, 0x78, 0xA8, 0x64, 0x1E, 0x6D, 0x88, 0x52, 0x14, + 0x57, 0x1B, 0xED, 0xB6, 0xD5, 0xAE, 0x22, 0x5A, 0xBD, 0x36, 0x40, 0x71, 0x20, 0xA6, 0xA3, 0x4A, + 0x0E, 0x00, 0xDE, 0x44, 0x69, 0x02, 0x72, 0x6E, 0x8E, 0xFA, 0xC7, 0xE5, 0x31, 0x81, 0x27, 0x5D, + 0x7D, 0x02, 0x4C, 0xC7, 0x20, 0xA8, 0x4A, 0x6E, 0x04, 0x5E, 0x84, 0x78, 0xFA, 0xDD, 0xD6, 0x4D, + 0xB7, 0x8A, 0xCD, 0x80, 0x57, 0xBC, 0x45, 0x44, 0x80, 0xE4, 0xA6, 0x53, 0x45, 0x46, 0xE0, 0x12, + 0x17, 0xDF, 0xBE, 0x6E, 0x74, 0x81, 0xB1, 0xF6, 0x49, 0xBF, 0x3C, 0x1E, 0x70, 0x87, 0x1F, 0x90, + 0x20, 0x20, 0xE6, 0xA6, 0x5D, 0x2C, 0x3A, 0xC4, 0x11, 0x81, 0x33, 0x00, 0x3C, 0xE2, 0x28, 0x8D, + 0x02, 0xEC, 0xFA, 0x2D, 0x25, 0x06, 0x11, 0xE9, 0x47, 0x15, 0xB8, 0x02, 0xAB, 0xFE, 0x01, 0xC5, + 0x03, 0x48, 0x30, 0xE8, 0x55, 0x30, 0x45, 0x40, 0x44, 0x49, 0xD2, 0xFB, 0xD4, 0xD5, 0xCA, 0x63, + 0x02, 0x9B, 0x3E, 0xE9, 0xDF, 0x9C, 0xF4, 0xD5, 0x10, 0xE0, 0x88, 0x8F, 0xA3, 0x54, 0x56, 0x4E, + 0x90, 0x9D, 0x32, 0x64, 0xA5, 0x03, 0xFF, 0x5E, 0x1A, 0x16, 0xCC, 0x6F, 0x0A, 0x27, 0x03, 0x1C, + 0x0E, 0x64, 0xC2, 0x0E, 0xD4, 0xF2, 0x00, 0x81, 0x92, 0x70, 0xA3, 0x59, 0x6D, 0xD0, 0x55, 0xC8, + 0xB7, 0x62, 0x09, 0x39, 0x85, 0x8D, 0xD1, 0x4F, 0x93, 0x40, 0xB4, 0x3C, 0x4C, 0xFF, 0xC0, 0x25, + 0x3A, 0x35, 0x21, 0x82, 0x94, 0x4A, 0x34, 0x24, 0xB4, 0x1A, 0x37, 0xB5, 0x41, 0xBF, 0x93, 0x9B, + 0xA0, 0x95, 0x57, 0xC6, 0x90, 0xD6, 0x68, 0x6C, 0xE2, 0x79, 0x85, 0xF5, 0x11, 0x81, 0xD6, 0x06, + 0x2F, 0xC3, 0xE3, 0x2A, 0x5A, 0x69, 0xE6, 0x71, 0x4A, 0x61, 0x53, 0xD4, 0x22, 0x90, 0xC3, 0x34, + 0xD3, 0xEC, 0x70, 0xD5, 0x44, 0x9A, 0xD9, 0xAC, 0x62, 0xB6, 0xA9, 0x17, 0x9C, 0x4E, 0xBA, 0x86, + 0xE7, 0x17, 0xD6, 0x4A, 0x00, 0x08, 0x11, 0x9A, 0x1F, 0xDD, 0x9B, 0x46, 0x42, 0x52, 0xFE, 0x06, + 0xFA, 0xF0, 0x0C, 0x7F, 0xC9, 0xAA, 0x85, 0x85, 0x35, 0x12, 0x81, 0x42, 0x3E, 0x10, 0x1E, 0x57, + 0xD2, 0x4A, 0x95, 0xF0, 0x25, 0x90, 0xC3, 0xF5, 0x12, 0x84, 0xB0, 0xEE, 0x96, 0xF4, 0x92, 0x47, + 0x6D, 0x25, 0xBD, 0xCC, 0x0C, 0x77, 0x51, 0x2A, 0x7C, 0x85, 0x90, 0xA0, 0x95, 0xE0, 0xF0, 0xDE, + 0x5C, 0x25, 0x22, 0xE6, 0x6F, 0xE0, 0x2B, 0x63, 0x62, 0x3B, 0xA6, 0x57, 0x7C, 0xB6, 0xCF, 0xE1, + 0x6A, 0x83, 0x57, 0xA4, 0xF9, 0x3D, 0x1E, 0x55, 0x51, 0xC7, 0x8B, 0xA5, 0xEF, 0x54, 0x50, 0x48, + 0x40, 0x0B, 0x53, 0x47, 0x8B, 0x6B, 0xE3, 0x78, 0x4B, 0xDA, 0x38, 0xDE, 0xA2, 0x36, 0x0C, 0xF2, + 0xD9, 0x22, 0xD7, 0xC4, 0x2A, 0xAC, 0x8E, 0x00, 0xB0, 0x36, 0xB8, 0xBC, 0x59, 0x38, 0x1E, 0x3E, + 0x3A, 0xF5, 0x1D, 0x9E, 0x57, 0x72, 0x92, 0x5E, 0x05, 0x9D, 0x84, 0x04, 0x71, 0x1F, 0xE9, 0x71, + 0xAD, 0xF4, 0xB6, 0xA4, 0x95, 0x3C, 0x5A, 0xAB, 0x68, 0x65, 0x6A, 0x98, 0xF6, 0x88, 0x98, 0x16, + 0x3E, 0xC6, 0x51, 0x54, 0x31, 0x02, 0x6C, 0x6D, 0xF0, 0x26, 0x3A, 0xA9, 0xA2, 0x98, 0x56, 0x05, + 0xBD, 0x88, 0xF4, 0xC4, 0xFD, 0xA5, 0x07, 0xB3, 0xF2, 0x2D, 0xE9, 0x46, 0xD7, 0xB7, 0x39, 0xAA, + 0x2C, 0xC8, 0xC8, 0x34, 0xAC, 0xCF, 0x64, 0x32, 0x81, 0x69, 0x50, 0xF1, 0xA1, 0x25, 0x06, 0x0E, + 0xE3, 0x0B, 0x3B, 0xD7, 0x2E, 0xE9, 0x79, 0xE1, 0xFA, 0x65, 0x02, 0x5D, 0xF9, 0x22, 0x66, 0x72, + 0x4E, 0x28, 0x2D, 0x4B, 0x7E, 0xEF, 0x84, 0x74, 0x96, 0x9F, 0xB6, 0x7E, 0x4F, 0xA6, 0x74, 0x1B, + 0x41, 0x95, 0x39, 0xF4, 0x1B, 0xD7, 0xB8, 0xA5, 0xEF, 0x64, 0xA8, 0x32, 0xA5, 0xFF, 0x40, 0xC6, + 0xDA, 0x47, 0xD3, 0x2E, 0xCF, 0x4C, 0x17, 0x09, 0x21, 0xC4, 0xAE, 0x86, 0xA5, 0x07, 0x53, 0x24, + 0x38, 0xA8, 0x86, 0xA4, 0x8F, 0x35, 0xFD, 0x85, 0x69, 0x3C, 0x84, 0x49, 0xBC, 0xB1, 0x1A, 0x16, + 0x1F, 0x50, 0x56, 0x43, 0x18, 0x97, 0x7F, 0x7A, 0xA9, 0x5D, 0xD2, 0x8D, 0xEF, 0x85, 0xC3, 0x15, + 0xDB, 0x93, 0xA7, 0x62, 0xE8, 0xD1, 0xD2, 0x0D, 0xF6, 0xB9, 0xB6, 0xA6, 0x26, 0x77, 0x20, 0xD5, + 0x75, 0x35, 0x09, 0x7B, 0x01, 0x81, 0x74, 0x0B, 0x53, 0x4D, 0xE0, 0x56, 0x8D, 0xC7, 0x2D, 0xA6, + 0x62, 0xA3, 0x55, 0xF1, 0x34, 0x6C, 0xB4, 0x02, 0x35, 0x8D, 0xAF, 0xF1, 0x99, 0x88, 0xB1, 0x06, + 0xFA, 0xDA, 0x89, 0xA2, 0xB0, 0xD7, 0xFB, 0x51, 0x14, 0xE5, 0xF7, 0xBE, 0x15, 0x05, 0xD6, 0xF2, + 0x19, 0xC7, 0xD1, 0x32, 0x4E, 0x45, 0x01, 0x6B, 0x83, 0x77, 0x86, 0xBD, 0x84, 0x41, 0x66, 0x57, + 0x0A, 0x0B, 0x3B, 0xBE, 0x37, 0xF7, 0xE2, 0x7C, 0xDF, 0xB7, 0xEA, 0x80, 0x90, 0xB9, 0x33, 0x2E, + 0x3E, 0xDD, 0xE1, 0x70, 0x2C, 0x24, 0xBE, 0x83, 0xA3, 0xC2, 0x89, 0x41, 0x80, 0x61, 0xCB, 0x19, + 0x01, 0x9B, 0x4A, 0x95, 0x4F, 0x06, 0xAE, 0x96, 0xB6, 0x7D, 0x5B, 0x25, 0x13, 0xB8, 0xB0, 0x9C, + 0xE5, 0xB8, 0x3C, 0x06, 0x48, 0x03, 0xFE, 0x35, 0x99, 0x98, 0xA3, 0xF2, 0x89, 0x04, 0x24, 0x01, + 0x6F, 0x9D, 0xB9, 0x22, 0xFC, 0x96, 0x07, 0x5E, 0x32, 0x2A, 0x31, 0x93, 0x1B, 0x81, 0x16, 0x2F, + 0x2F, 0x76, 0x3A, 0xF0, 0x42, 0x9F, 0xF7, 0x14, 0x19, 0x90, 0xDB, 0xFB, 0x0E, 0x0A, 0x40, 0xC4, + 0x67, 0x6A, 0x3C, 0x65, 0x94, 0xC5, 0x20, 0xC3, 0x88, 0x1E, 0x4C, 0xBF, 0xEF, 0x6B, 0x7E, 0x17, + 0x51, 0x14, 0x9F, 0xDD, 0xE1, 0xD2, 0x73, 0x38, 0xBD, 0xEB, 0xB4, 0x37, 0x3B, 0xC1, 0x43, 0xE4, + 0xDB, 0xD5, 0x4F, 0xBB, 0x8C, 0x6A, 0x20, 0x1A, 0x7D, 0x8F, 0xEB, 0x0C, 0x05, 0x02, 0x76, 0x75, + 0x47, 0x6A, 0xDF, 0x9F, 0x27, 0xB5, 0x1F, 0x80, 0x2B, 0x4D, 0x4B, 0x44, 0xBC, 0x29, 0x46, 0xBC, + 0x37, 0x17, 0xBB, 0xD1, 0xD0, 0xF4, 0xDE, 0x42, 0xDD, 0xF4, 0x5E, 0x43, 0x9D, 0xC6, 0x37, 0x05, + 0x06, 0x52, 0x28, 0x99, 0xC1, 0x72, 0x40, 0x56, 0xCB, 0xAA, 0x12, 0xE4, 0xF4, 0x9B, 0x2A, 0x51, + 0x2E, 0x20, 0x23, 0x1E, 0xE4, 0xFA, 0xD1, 0xAA, 0x48, 0x6F, 0xB3, 0xCB, 0xBA, 0xDD, 0x3C, 0x6A, + 0xAB, 0x38, 0x8D, 0x6B, 0xAC, 0x3E, 0x4F, 0xE7, 0x46, 0x61, 0x65, 0x70, 0x38, 0xD0, 0xC5, 0xBB, + 0x17, 0xBB, 0x4C, 0x17, 0x82, 0x7E, 0xEF, 0xC7, 0x8F, 0x42, 0xAE, 0xEF, 0x3B, 0xD6, 0x59, 0xC4, + 0x2E, 0x1E, 0xEC, 0x10, 0xA8, 0x36, 0xF8, 0x8E, 0xD8, 0x9E, 0x76, 0xE1, 0xB8, 0xFC, 0x45, 0x98, + 0x3B, 0xD1, 0x1A, 0xED, 0xF9, 0x7E, 0x54, 0xC6, 0x98, 0xBE, 0x6F, 0x7D, 0xCD, 0xE6, 0xA6, 0xEB, + 0x3A, 0x6E, 0x61, 0x95, 0x71, 0x38, 0x98, 0x56, 0x34, 0xDF, 0xD1, 0xA3, 0x9D, 0xA8, 0x2B, 0xE8, + 0xF5, 0x7E, 0x34, 0x16, 0xF2, 0x7C, 0xDF, 0x4A, 0xBB, 0x9E, 0x58, 0xE6, 0xA2, 0xB0, 0xCA, 0x28, + 0x54, 0x6D, 0xF0, 0xA9, 0xF9, 0x1A, 0xFE, 0xEE, 0x44, 0x5D, 0xAC, 0xC7, 0xFB, 0x51, 0x16, 0xE7, + 0xF6, 0xBE, 0x55, 0x35, 0x5C, 0x14, 0x0F, 0x87, 0x00, 0x53, 0x1B, 0xBC, 0x7C, 0xBF, 0x9B, 0xDC, + 0x0F, 0x3B, 0x53, 0xD4, 0x50, 0x25, 0x7D, 0x50, 0xA6, 0xEE, 0x5B, 0x1B, 0xAB, 0x12, 0xDA, 0x58, + 0x21, 0xE1, 0x3F, 0xED, 0x48, 0x1B, 0x2B, 0x75, 0x6D, 0x6C, 0xD8, 0x5F, 0x56, 0x0F, 0x41, 0x3F, + 0xF4, 0xE9, 0xD3, 0xA1, 0x51, 0x7C, 0x38, 0x0A, 0x00, 0x71, 0xD3, 0x18, 0x1C, 0x69, 0x2F, 0x8D, + 0xDD, 0x0C, 0x48, 0x61, 0xBF, 0xBB, 0x70, 0xA1, 0x88, 0xC9, 0xFB, 0xD6, 0xD3, 0xC4, 0x18, 0x91, + 0xCF, 0x63, 0xE2, 0x97, 0x59, 0x5B, 0x16, 0x60, 0x6B, 0x83, 0xD7, 0x70, 0xA2, 0xBD, 0xA2, 0x27, + 0xBB, 0x4A, 0xF9, 0xC4, 0xFE, 0x77, 0xA1, 0xB5, 0x18, 0xBF, 0x0F, 0x42, 0x71, 0x90, 0x60, 0x3B, + 0x53, 0xBB, 0xD4, 0xE3, 0x4C, 0x31, 0x70, 0xAE, 0xBE, 0x0F, 0xEC, 0x7C, 0xB7, 0x0A, 0x8C, 0x88, + 0xD8, 0x99, 0x0E, 0x05, 0xBE, 0x37, 0xA8, 0x46, 0xC5, 0xA7, 0x1A, 0xF9, 0x9B, 0x81, 0xF3, 0x74, + 0xC5, 0x9F, 0xAE, 0xA3, 0x9B, 0x5A, 0x88, 0xDF, 0xF4, 0x7C, 0xD3, 0xB2, 0x60, 0x2A, 0x4C, 0x7C, + 0xED, 0x0A, 0x0F, 0x15, 0x1F, 0xA7, 0x13, 0xB0, 0x04, 0x0F, 0xD1, 0xFA, 0x2E, 0x31, 0xE6, 0xB5, + 0xC1, 0x15, 0xBE, 0x33, 0x19, 0x70, 0xE1, 0x59, 0x71, 0x64, 0x54, 0x8C, 0xC4, 0x76, 0x1D, 0x20, + 0x2A, 0x54, 0x13, 0x7F, 0x3F, 0x65, 0x4D, 0x0B, 0x8E, 0x84, 0x6B, 0x83, 0x4B, 0xDA, 0x58, 0x43, + 0x3B, 0xCB, 0xEF, 0x4E, 0xF9, 0x39, 0x3F, 0xFA, 0x44, 0x2F, 0x3E, 0xA2, 0x1B, 0x7F, 0xA3, 0x3A, + 0xE8, 0x95, 0xBD, 0xD5, 0x60, 0x70, 0x46, 0xDF, 0x0E, 0xCB, 0x9B, 0xD1, 0x87, 0xD9, 0x57, 0xFC, + 0xE9, 0xE4, 0xA1, 0x63, 0x8D, 0x9F, 0x09, 0xAB, 0xCB, 0x57, 0xE1, 0xE3, 0xB6, 0x08, 0x02, 0x86, + 0x11, 0x60, 0xC8, 0x51, 0xFE, 0xCC, 0x0D, 0xD0, 0xB3, 0x27, 0xA2, 0xF1, 0x1D, 0x65, 0x19, 0xCA, + 0x4D, 0x79, 0x34, 0xD8, 0x25, 0xD3, 0x50, 0x90, 0xB2, 0x27, 0xC6, 0xA5, 0x0F, 0x0A, 0x7F, 0x20, + 0x53, 0xD3, 0x03, 0x1A, 0x35, 0x30, 0x8B, 0x43, 0xFA, 0x8C, 0x25, 0x33, 0x66, 0xB5, 0xE7, 0x77, + 0xC5, 0x2E, 0xF9, 0xCB, 0x19, 0xA4, 0x8F, 0x63, 0x17, 0xCA, 0x4F, 0x92, 0x0F, 0x4F, 0xC7, 0x31, + 0xE6, 0x19, 0xFD, 0xE3, 0x66, 0x73, 0xD6, 0xC5, 0xA7, 0x45, 0xB5, 0x80, 0xB5, 0xB3, 0xC3, 0x59, + 0x37, 0xEF, 0xD1, 0xB0, 0xDC, 0x47, 0x7D, 0x81, 0xD3, 0xD2, 0x4F, 0xFA, 0xA2, 0x94, 0x06, 0x40, + 0xCD, 0xBE, 0xF6, 0xCE, 0xF0, 0xBE, 0xEC, 0x6B, 0x9F, 0xB0, 0x00, 0xB7, 0xC3, 0x07, 0x7E, 0x91, + 0x76, 0x63, 0x3C, 0x76, 0x53, 0x1F, 0xFA, 0xED, 0xC6, 0x1E, 0xFA, 0xED, 0x07, 0x0F, 0xFD, 0xF6, + 0xA3, 0xDD, 0x6E, 0x37, 0x9D, 0x56, 0xEB, 0x58, 0x85, 0x75, 0xC5, 0x07, 0x7F, 0x37, 0xC2, 0xD3, + 0x1C, 0xA4, 0xA9, 0xC8, 0x53, 0x37, 0xE0, 0x49, 0xD8, 0x15, 0x7E, 0x33, 0x99, 0x3C, 0x34, 0x8E, + 0xF8, 0xBA, 0x54, 0x79, 0x96, 0x5A, 0xED, 0x5D, 0x3F, 0x9D, 0x4D, 0x8D, 0x7B, 0x53, 0x0F, 0x67, + 0xD3, 0x26, 0xC9, 0x68, 0xD8, 0xCB, 0x0C, 0x86, 0x14, 0x84, 0x39, 0xFD, 0x9B, 0x4D, 0x3A, 0xFD, + 0xB4, 0x82, 0xD3, 0x4F, 0xD7, 0x9C, 0x7E, 0x87, 0xDE, 0x1E, 0x10, 0xFE, 0x77, 0xF3, 0xF8, 0x80, + 0xAF, 0x02, 0x5E, 0x2F, 0xE5, 0xAB, 0xD5, 0xDA, 0xA8, 0xDF, 0xE7, 0x3A, 0x49, 0x68, 0x0C, 0x6F, + 0x36, 0xE9, 0x24, 0x29, 0xA6, 0x5B, 0xCA, 0x4E, 0x79, 0xD8, 0x19, 0xEC, 0x66, 0x5C, 0xA2, 0xD9, + 0x94, 0xA8, 0x50, 0xDE, 0x3B, 0x3E, 0x13, 0xDA, 0xE9, 0xF2, 0xD4, 0x69, 0x13, 0xEA, 0x51, 0x7F, + 0x11, 0x44, 0x6A, 0x93, 0xCD, 0x24, 0x66, 0x0B, 0x21, 0xC3, 0x55, 0x4E, 0xCC, 0xDE, 0x7F, 0xF7, + 0x5D, 0xB1, 0x5C, 0x4C, 0xEC, 0xE5, 0x81, 0xE4, 0x62, 0x99, 0xB5, 0xD0, 0xDB, 0x05, 0xDC, 0x40, + 0xAA, 0x4B, 0x99, 0x6E, 0x04, 0x5E, 0x1B, 0xBC, 0xA4, 0xC7, 0x9A, 0x20, 0xB1, 0x42, 0xC6, 0xAB, + 0x3C, 0xED, 0xA4, 0x80, 0x42, 0xB1, 0x34, 0x22, 0x21, 0xA9, 0x1B, 0x45, 0x5C, 0x19, 0x05, 0x52, + 0x81, 0x3D, 0x75, 0xA6, 0x2A, 0xFB, 0x04, 0x6D, 0x92, 0x97, 0x0A, 0x2F, 0x5C, 0x52, 0x5A, 0x6D, + 0x1C, 0xB6, 0x36, 0x78, 0xEF, 0x12, 0xED, 0x95, 0x79, 0xAD, 0xCE, 0x9B, 0xB0, 0x51, 0x30, 0x44, + 0xA2, 0x26, 0xE5, 0xE4, 0x0E, 0x3E, 0xE9, 0xAE, 0x40, 0x5C, 0x6C, 0x57, 0xDD, 0x4E, 0x27, 0xC1, + 0x0A, 0x69, 0x57, 0xBB, 0x1A, 0x86, 0x4E, 0x6D, 0xD0, 0xA9, 0x86, 0xA1, 0x5B, 0x1B, 0x74, 0xAB, + 0x61, 0xE8, 0x81, 0x1C, 0x0E, 0x7A, 0xD5, 0x70, 0xF4, 0x6B, 0x83, 0x7E, 0x35, 0x0C, 0x47, 0x20, + 0xCB, 0xAA, 0x54, 0x40, 0xE6, 0x72, 0x5C, 0x00, 0x43, 0xFE, 0x26, 0x47, 0xD6, 0xAA, 0xBA, 0xF3, + 0xCC, 0x97, 0x56, 0x69, 0xE7, 0xE1, 0xB0, 0xB5, 0xC1, 0xBB, 0xA5, 0xE5, 0x9B, 0x0B, 0xCB, 0x84, + 0x69, 0x7B, 0xA3, 0xAB, 0x35, 0xB5, 0x76, 0xAF, 0xBD, 0xB7, 0xC3, 0x0C, 0x33, 0xA0, 0x43, 0xED, + 0x1D, 0x52, 0x9D, 0x20, 0x09, 0xD3, 0x8F, 0xC5, 0x77, 0x0A, 0x3C, 0x88, 0x70, 0xE6, 0x3A, 0x8E, + 0x5F, 0x5A, 0x1D, 0x01, 0x30, 0xA4, 0xF9, 0x70, 0x54, 0x3A, 0x9A, 0x45, 0x68, 0xCA, 0x18, 0x7A, + 0xCA, 0x26, 0xE7, 0x8A, 0xE1, 0x4C, 0x2F, 0x16, 0xCE, 0x76, 0xE7, 0x3E, 0xDE, 0x6D, 0xF9, 0x94, + 0x81, 0xC3, 0xC2, 0x6C, 0xF5, 0x16, 0x66, 0x88, 0x73, 0x54, 0x98, 0xD6, 0x68, 0x81, 0xFB, 0xE8, + 0xBD, 0x5D, 0x7A, 0x4F, 0x40, 0x46, 0xC1, 0x37, 0xB0, 0x89, 0xDE, 0xF3, 0x30, 0x9C, 0x87, 0xEA, + 0x83, 0x58, 0xE3, 0x5E, 0x79, 0x8D, 0x04, 0xD0, 0x90, 0x0F, 0xE0, 0x7B, 0xF0, 0x2A, 0xF9, 0x91, + 0x80, 0xAC, 0x9C, 0x23, 0x55, 0x77, 0x1A, 0xA9, 0x2B, 0x56, 0xCC, 0x0B, 0xDA, 0x95, 0x47, 0xF5, + 0xCE, 0x43, 0x1C, 0x0B, 0x17, 0xF8, 0xEA, 0x44, 0xA2, 0xB6, 0xBD, 0x92, 0x22, 0x13, 0x93, 0x48, + 0x06, 0xCB, 0x8D, 0x86, 0x6D, 0x2B, 0xDF, 0x69, 0xE6, 0x1F, 0x10, 0xB0, 0xBE, 0xDA, 0x54, 0x7C, + 0x15, 0x5E, 0x60, 0x4E, 0x36, 0x11, 0x08, 0x79, 0x7D, 0x70, 0xB3, 0x00, 0x24, 0xAC, 0xF4, 0x34, + 0x80, 0x03, 0x73, 0x15, 0x86, 0x91, 0xB8, 0xA3, 0x17, 0x88, 0xC4, 0xE2, 0x8C, 0x20, 0xC4, 0x57, + 0x72, 0xB4, 0xBB, 0xF7, 0xF4, 0xBF, 0x2B, 0x0F, 0x1E, 0x15, 0x5D, 0xBF, 0x60, 0x1A, 0x2C, 0xC1, + 0x80, 0xEF, 0x0B, 0xD4, 0x8B, 0x24, 0xF4, 0x9B, 0x0B, 0x1F, 0xC2, 0x5A, 0x21, 0x35, 0x38, 0x3A, + 0x74, 0x13, 0x9F, 0xCD, 0xF3, 0x0B, 0x2C, 0xFF, 0xA5, 0x36, 0xD9, 0x4C, 0x75, 0x67, 0x65, 0xDA, + 0xC5, 0xAB, 0x3B, 0x3F, 0x99, 0xF6, 0xD8, 0x59, 0x15, 0x2B, 0xF0, 0x88, 0x1D, 0xFD, 0x05, 0x0A, + 0x3C, 0x34, 0x3D, 0xC0, 0x15, 0xE2, 0xA6, 0x4B, 0xD4, 0xDE, 0x67, 0x93, 0x14, 0x32, 0x83, 0xBE, + 0xC1, 0x05, 0x56, 0x40, 0xE1, 0x69, 0x74, 0xBD, 0x79, 0xDB, 0x99, 0xDA, 0xCF, 0xA7, 0x62, 0xAE, + 0xC6, 0x29, 0x50, 0xCB, 0xD5, 0xBA, 0x92, 0x72, 0xF3, 0xBD, 0x57, 0xD0, 0x7F, 0x59, 0xE7, 0xE7, + 0xF6, 0xDE, 0xF9, 0xD9, 0xC4, 0x00, 0x44, 0xEC, 0x71, 0x69, 0xCB, 0x42, 0xD8, 0xC8, 0xAE, 0x2E, + 0xED, 0xF1, 0x4E, 0xAD, 0x8A, 0xF5, 0x5E, 0x5A, 0x07, 0xED, 0x7E, 0xBB, 0xF3, 0xB0, 0xCC, 0x0A, + 0x19, 0xAA, 0x60, 0x54, 0xFA, 0x49, 0xEF, 0x01, 0x4D, 0x69, 0x9C, 0xC9, 0x84, 0xAD, 0x6B, 0x96, + 0x33, 0x2D, 0x0E, 0x7E, 0x43, 0x9F, 0xD2, 0xF5, 0xC8, 0x6E, 0xE3, 0x55, 0xD8, 0x79, 0xC1, 0xD2, + 0x8C, 0xA0, 0x8B, 0xFE, 0xC3, 0x32, 0x2D, 0xCE, 0x91, 0xAA, 0x75, 0x49, 0x38, 0xEA, 0x3E, 0x1C, + 0xD3, 0xF2, 0x1D, 0xDF, 0xB0, 0x4A, 0x5B, 0x16, 0x83, 0x06, 0xC3, 0xFA, 0x88, 0x07, 0xDA, 0x15, + 0xF0, 0xB9, 0x53, 0xE3, 0x0A, 0xFA, 0x2F, 0x1F, 0xB8, 0x8E, 0xBB, 0x1B, 0x52, 0x46, 0x05, 0x96, + 0x7E, 0x59, 0x67, 0xA9, 0x52, 0xE8, 0xEA, 0x6F, 0x68, 0x91, 0x7C, 0x23, 0xA1, 0x6B, 0xE9, 0xE3, + 0xD5, 0xD2, 0xA1, 0x8B, 0x81, 0x63, 0xE8, 0xA2, 0x47, 0xBB, 0x37, 0xB1, 0x90, 0x82, 0xF2, 0x36, + 0xD6, 0x3B, 0xD9, 0xE4, 0x16, 0x98, 0x4D, 0x44, 0x30, 0xC6, 0x53, 0x25, 0x23, 0xDB, 0x94, 0xDF, + 0x54, 0x36, 0xB2, 0x91, 0xA1, 0xFC, 0x8E, 0x37, 0x8A, 0x4C, 0xCC, 0xE6, 0x19, 0x2C, 0xCC, 0xE1, + 0xD8, 0xC1, 0x4E, 0x2B, 0x36, 0x41, 0xE7, 0x1B, 0x5F, 0xA8, 0x0D, 0xB9, 0x7A, 0x48, 0xF5, 0x99, + 0xA1, 0x69, 0xDB, 0x65, 0xD5, 0xC4, 0x61, 0x6B, 0x83, 0x97, 0xEC, 0x60, 0xB7, 0x4B, 0xEA, 0xBC, + 0xF3, 0xCD, 0xAF, 0xA7, 0x07, 0x5C, 0xED, 0x5A, 0x4D, 0x89, 0x22, 0x86, 0x1B, 0x7E, 0xF7, 0xA3, + 0xC6, 0xF7, 0xA8, 0x46, 0xDF, 0x01, 0x79, 0x38, 0x25, 0x8D, 0xA9, 0x31, 0xC7, 0x87, 0x97, 0x8B, + 0x16, 0x35, 0xDE, 0x20, 0x58, 0xB1, 0x9A, 0x46, 0xBC, 0xA7, 0x87, 0x5D, 0xD5, 0x18, 0xC4, 0xDF, + 0x5A, 0x09, 0x84, 0x37, 0x87, 0xA6, 0xE1, 0xE1, 0x83, 0xFE, 0x70, 0xAC, 0xBD, 0x84, 0x63, 0xED, + 0xBD, 0xB5, 0x0C, 0x5F, 0xBB, 0x2B, 0x73, 0x08, 0x71, 0x3F, 0x5B, 0x84, 0x21, 0xED, 0xA9, 0x05, + 0xBA, 0x8D, 0x8F, 0x3F, 0xE0, 0x05, 0xC7, 0xB8, 0x7B, 0xAD, 0xD7, 0x3D, 0x6E, 0xD5, 0x34, 0x96, + 0x15, 0xF3, 0xC7, 0xFA, 0xBD, 0x2F, 0x74, 0x5B, 0x9B, 0x1E, 0x12, 0x28, 0x73, 0x00, 0x91, 0xDE, + 0x90, 0x40, 0x6A, 0xBF, 0x55, 0x76, 0x9B, 0xAD, 0x4B, 0x44, 0x0F, 0xC4, 0xD1, 0x92, 0x1A, 0x42, + 0xEC, 0x3D, 0x9B, 0xAC, 0x7D, 0xFC, 0x05, 0x05, 0xED, 0x9E, 0xEC, 0xFD, 0xA7, 0x72, 0x41, 0xE8, + 0x52, 0x41, 0xE0, 0xEE, 0xBE, 0xCD, 0xF2, 0xD4, 0x0E, 0x78, 0xD2, 0xD5, 0x78, 0x6A, 0x57, 0xE0, + 0xA9, 0xBD, 0x23, 0x9E, 0x3A, 0x01, 0x4F, 0x6D, 0x35, 0x9E, 0x3A, 0x15, 0x78, 0xEA, 0xEC, 0x88, + 0xA7, 0x6E, 0xC0, 0x53, 0x47, 0x8D, 0xA7, 0x6E, 0x05, 0x9E, 0xBA, 0x3B, 0xE2, 0xA9, 0x17, 0xF0, + 0xD4, 0x55, 0xE3, 0xA9, 0x57, 0x81, 0xA7, 0xDE, 0x8E, 0x78, 0xEA, 0x07, 0x3C, 0xF5, 0xD4, 0x78, + 0xEA, 0x57, 0xE0, 0xA9, 0xBF, 0x23, 0x9E, 0x8E, 0x02, 0x9E, 0xFA, 0x6A, 0x3C, 0x1D, 0x55, 0xE0, + 0xE9, 0x68, 0x47, 0x3C, 0x1D, 0x07, 0x3C, 0x1D, 0xA9, 0xF1, 0x74, 0x5C, 0x81, 0xA7, 0xE3, 0x1D, + 0xF1, 0x74, 0x12, 0xF0, 0x74, 0xAC, 0xC6, 0xD3, 0x49, 0x05, 0x9E, 0x4E, 0x76, 0xC4, 0x13, 0xEE, + 0xA6, 0x62, 0x4C, 0x9D, 0x28, 0x0E, 0xBA, 0xAD, 0x0A, 0x5C, 0x19, 0xBB, 0xE2, 0x2A, 0x4C, 0x25, + 0x74, 0xD5, 0x5C, 0xA2, 0x4A, 0x32, 0x31, 0xDC, 0x15, 0x5B, 0x51, 0x36, 0xA1, 0x98, 0x4E, 0xE8, + 0x55, 0xF2, 0x89, 0xD1, 0xAE, 0xD8, 0x0A, 0x13, 0x0A, 0x5D, 0x31, 0xA3, 0xD0, 0xAB, 0xA4, 0x14, + 0xE3, 0x5D, 0xB1, 0x15, 0xE6, 0x14, 0xBA, 0x62, 0x52, 0xA1, 0x57, 0xC9, 0x2A, 0xC8, 0xAE, 0xD8, + 0x0A, 0xD3, 0x0A, 0x5D, 0x31, 0xAF, 0xD0, 0xAB, 0x24, 0x16, 0x93, 0x5D, 0xB1, 0x15, 0x66, 0x16, + 0xBA, 0x62, 0x6A, 0xA1, 0x57, 0xC8, 0x2D, 0x4E, 0xE4, 0x13, 0xB1, 0x8D, 0xB2, 0x45, 0x7C, 0x3E, + 0x45, 0x8E, 0x26, 0x6D, 0x4A, 0x0F, 0x1C, 0x71, 0x20, 0x7C, 0x22, 0x8E, 0x09, 0xE4, 0xC2, 0xB1, + 0x27, 0xE6, 0x34, 0x2C, 0x32, 0x3C, 0x98, 0x67, 0x63, 0x3C, 0xE1, 0x85, 0xBF, 0xCA, 0x85, 0x86, + 0xAB, 0x57, 0x97, 0xC5, 0xCA, 0x0C, 0x62, 0x2F, 0x7F, 0xA1, 0x22, 0x03, 0x90, 0xDD, 0x16, 0xBF, + 0x3E, 0xA0, 0x54, 0x57, 0xA0, 0x40, 0x45, 0x2A, 0x0A, 0x3D, 0xB1, 0xA2, 0xD0, 0x57, 0xAE, 0x28, + 0x30, 0xE2, 0xB6, 0x53, 0x4B, 0x00, 0xDC, 0x1D, 0xF6, 0xC9, 0x04, 0x75, 0xA6, 0x3B, 0xE5, 0x99, + 0xEE, 0x15, 0x61, 0xBA, 0x53, 0x86, 0xE9, 0x12, 0xCF, 0xB4, 0x2A, 0xCA, 0x09, 0xE8, 0x7D, 0x6D, + 0xDE, 0x90, 0xB1, 0xF6, 0x8B, 0xBA, 0xA8, 0xF4, 0xF2, 0xA2, 0x3A, 0x2A, 0x22, 0x2A, 0x7D, 0x8B, + 0xF6, 0xD1, 0x0B, 0xF8, 0xFE, 0x51, 0x9D, 0xEF, 0x5E, 0x79, 0xBE, 0x3B, 0x45, 0xF8, 0xEE, 0x6D, + 0x91, 0xEF, 0x6E, 0xC0, 0xF7, 0x27, 0x75, 0xBE, 0xBB, 0xE5, 0xF9, 0xEE, 0x16, 0xE1, 0xBB, 0xBB, + 0x45, 0xBE, 0xDB, 0x10, 0x6C, 0x7E, 0xFC, 0xA4, 0x7D, 0x9C, 0xB9, 0xC4, 0x9B, 0xE5, 0x57, 0xE2, + 0x18, 0x44, 0xD9, 0xB1, 0xBD, 0xB7, 0x83, 0xB9, 0x1B, 0x52, 0xD8, 0x11, 0x79, 0xCA, 0xCD, 0x9B, + 0x19, 0x84, 0xCA, 0x37, 0x89, 0xE4, 0x3C, 0xC9, 0x67, 0x6E, 0xBA, 0x2A, 0x53, 0xDB, 0x8B, 0x61, + 0xC7, 0xB5, 0xC1, 0xDB, 0x65, 0x81, 0xF1, 0xED, 0xB8, 0xBC, 0x3D, 0xAB, 0x57, 0xCC, 0x19, 0x5D, + 0x5B, 0xB3, 0xE7, 0x13, 0xCA, 0x33, 0xE4, 0x65, 0x9E, 0x82, 0xDA, 0xCB, 0x57, 0x21, 0x7A, 0x3B, + 0xA8, 0x92, 0x63, 0xA4, 0x3F, 0x62, 0xEC, 0xFC, 0x88, 0x0C, 0x69, 0x90, 0xB1, 0x14, 0x18, 0x8C, + 0x8E, 0x0A, 0x6A, 0xF3, 0xB8, 0x64, 0x74, 0x42, 0x1A, 0xB7, 0xA6, 0x4E, 0x9C, 0x7A, 0xA0, 0x00, + 0x3E, 0x95, 0x10, 0x40, 0xBF, 0xBC, 0x00, 0x0A, 0x65, 0x2E, 0x48, 0xE3, 0xF6, 0x04, 0xD0, 0x62, + 0x02, 0xB8, 0x8A, 0x5E, 0x7A, 0x9D, 0x61, 0xD0, 0x15, 0x2A, 0x50, 0xBD, 0x1D, 0xAC, 0x91, 0x60, + 0xA4, 0xD5, 0x03, 0x8B, 0x06, 0x8E, 0x8A, 0x29, 0xB4, 0x5D, 0x34, 0xBF, 0x92, 0x17, 0x3F, 0x15, + 0xF2, 0xEF, 0x6D, 0x26, 0x58, 0xED, 0x56, 0x60, 0xD1, 0xC5, 0x05, 0xD0, 0x2A, 0x2F, 0x00, 0xBD, + 0x90, 0x00, 0x5A, 0x0F, 0x2B, 0x19, 0xEF, 0xAF, 0x7F, 0xA7, 0x38, 0x5F, 0x5A, 0x45, 0xDD, 0x5F, + 0x18, 0xCD, 0xDA, 0x45, 0x84, 0xB5, 0x55, 0xEF, 0xEF, 0x44, 0x9C, 0x6B, 0xBF, 0x68, 0xF1, 0xAD, + 0xAF, 0x59, 0x71, 0xA0, 0x7C, 0x11, 0xB0, 0xB7, 0x83, 0xF5, 0x2A, 0xA4, 0xF0, 0x44, 0xC2, 0x59, + 0xC1, 0x00, 0x7F, 0x52, 0xDE, 0x1D, 0x0A, 0x69, 0x18, 0x69, 0xDD, 0x9E, 0x8A, 0x7B, 0x31, 0x41, + 0xB0, 0x6F, 0xA4, 0xAB, 0xA8, 0xB8, 0x7C, 0xE5, 0xB0, 0xB7, 0x83, 0xA5, 0x2E, 0xA4, 0xF0, 0x58, + 0xC2, 0x59, 0x41, 0x15, 0x17, 0x4D, 0x49, 0x8F, 0x4B, 0x4E, 0x2D, 0xF5, 0x6D, 0xE6, 0xA4, 0x58, + 0xED, 0x16, 0x04, 0x21, 0x7E, 0xC0, 0x22, 0x4B, 0xC1, 0xE5, 0x2B, 0xDE, 0xBD, 0x8A, 0xEB, 0xB3, + 0xDB, 0x8B, 0xE4, 0x47, 0xB2, 0xAF, 0x9B, 0xE7, 0xDB, 0x41, 0xD1, 0x5C, 0xB6, 0x55, 0x72, 0xE0, + 0xDB, 0x6A, 0x2A, 0x0B, 0xBD, 0x43, 0xD6, 0xB3, 0xCE, 0x7D, 0x86, 0x09, 0x94, 0x5F, 0x79, 0xEB, + 0xED, 0x60, 0x7B, 0x08, 0x52, 0xD8, 0xAE, 0x0D, 0x3E, 0x15, 0x64, 0xAA, 0x4A, 0xFD, 0xA0, 0xF4, + 0xFE, 0x90, 0xDD, 0x95, 0xDE, 0x47, 0xF3, 0x9B, 0xE2, 0xA5, 0xF7, 0x8B, 0x77, 0x3F, 0x17, 0x2B, + 0xBD, 0x8B, 0xBD, 0xEC, 0xAE, 0xF4, 0x5E, 0xCE, 0x66, 0x0A, 0x6D, 0x94, 0x05, 0xC6, 0xF0, 0x55, + 0x48, 0x23, 0xD3, 0xA3, 0x5D, 0x82, 0x60, 0xB4, 0xF7, 0xC1, 0x69, 0x28, 0x22, 0xE1, 0x19, 0xE5, + 0x78, 0xFB, 0x2C, 0xEB, 0xE9, 0x64, 0x84, 0x85, 0x52, 0xCF, 0xF0, 0xE2, 0x0B, 0x75, 0xFA, 0xFC, + 0x1B, 0x5F, 0x15, 0x9E, 0x05, 0x4E, 0x7B, 0xD7, 0xC8, 0xC1, 0x51, 0x41, 0xDC, 0x5B, 0x7F, 0xC5, + 0xC0, 0x20, 0xA1, 0x28, 0x9D, 0xEA, 0x47, 0xC7, 0x73, 0xE5, 0x3A, 0x39, 0x05, 0x2B, 0x12, 0xCD, + 0x3B, 0x62, 0xA9, 0x45, 0x3D, 0x9A, 0x33, 0xF2, 0xB6, 0x13, 0xCD, 0x11, 0x77, 0x8C, 0xF7, 0x02, + 0x59, 0x0D, 0x83, 0x2D, 0x26, 0x00, 0xF9, 0x26, 0x0A, 0x05, 0x01, 0xA4, 0x49, 0x60, 0x23, 0x22, + 0x68, 0x53, 0x09, 0xB4, 0x13, 0xDA, 0x4F, 0x09, 0xFC, 0xB4, 0x7D, 0xD9, 0xB8, 0xDF, 0xD9, 0x41, + 0x6D, 0x02, 0xC5, 0x15, 0xE3, 0xA8, 0xA0, 0x4E, 0x8B, 0x2D, 0x0E, 0xC6, 0x74, 0x5A, 0xCC, 0xA8, + 0xB7, 0xB6, 0x3A, 0x08, 0xC8, 0x3B, 0x54, 0x00, 0x1D, 0x65, 0x95, 0x96, 0x9F, 0x66, 0x76, 0x76, + 0x90, 0x9F, 0xA0, 0xB4, 0x62, 0x1C, 0x15, 0x54, 0x69, 0xB1, 0xA5, 0xCF, 0x98, 0x4A, 0xD5, 0xE7, + 0x97, 0x9C, 0xC8, 0xAD, 0xA9, 0xB4, 0x4B, 0x05, 0xD0, 0x55, 0x56, 0x69, 0xF9, 0x59, 0x47, 0x67, + 0x07, 0xBB, 0x77, 0x51, 0x5A, 0x31, 0x8E, 0x0A, 0xAA, 0xB4, 0xD8, 0x92, 0x5D, 0x4C, 0xA5, 0xEA, + 0xF3, 0x49, 0x4E, 0xE4, 0xD6, 0x54, 0xDA, 0xA3, 0x02, 0xE8, 0x29, 0xAB, 0xB4, 0x7C, 0xA5, 0xA0, + 0xB3, 0x83, 0x62, 0x10, 0x4A, 0x2B, 0xC6, 0x51, 0x41, 0x95, 0x16, 0x5B, 0x7D, 0x8E, 0xA9, 0x54, + 0x7D, 0x9D, 0x83, 0x13, 0xB9, 0x35, 0x95, 0xF6, 0xA9, 0x00, 0xFA, 0xCA, 0x2A, 0x2D, 0xBF, 0xBF, + 0xAA, 0xB3, 0x83, 0xBD, 0xDB, 0x28, 0xAD, 0x18, 0x47, 0x05, 0x55, 0x5A, 0xAC, 0x74, 0x1B, 0x53, + 0xA9, 0xFA, 0xCA, 0x0D, 0x27, 0x72, 0x6B, 0x2A, 0x3D, 0xA2, 0x02, 0x38, 0x52, 0x56, 0x69, 0xF9, + 0xAD, 0xEB, 0x9D, 0x1D, 0xD4, 0xF3, 0x50, 0x5A, 0x31, 0x8E, 0x0A, 0xAA, 0xB4, 0x58, 0x05, 0x27, + 0xA6, 0x52, 0xF5, 0xBD, 0x53, 0x9C, 0xC8, 0xAD, 0xA9, 0xF4, 0x98, 0x0A, 0xE0, 0x58, 0x59, 0xA5, + 0xE5, 0x77, 0xEE, 0x77, 0x76, 0xB0, 0x73, 0x1F, 0xA5, 0x15, 0xE3, 0xA8, 0xA0, 0x4A, 0x8B, 0xD5, + 0x66, 0x63, 0x2A, 0x55, 0xDF, 0xEE, 0xC4, 0x89, 0xDC, 0x9A, 0x4A, 0x4F, 0xA8, 0x00, 0x4E, 0x94, + 0x55, 0x5A, 0x7E, 0xCB, 0x40, 0x67, 0x07, 0x9B, 0x5F, 0x50, 0x5A, 0x2D, 0x91, 0xA3, 0x82, 0x2A, + 0x2D, 0xB6, 0xC0, 0xD8, 0x49, 0xD9, 0xFA, 0xA2, 0xA0, 0xD2, 0xB4, 0x05, 0xC6, 0x07, 0x50, 0xBF, + 0x33, 0x56, 0xC3, 0x12, 0x1F, 0xFC, 0x79, 0xF1, 0xD3, 0xCB, 0xF4, 0xC2, 0x7E, 0x6A, 0x15, 0x2F, + 0xD6, 0xD7, 0x43, 0x2F, 0xE3, 0x89, 0xF2, 0x42, 0xC2, 0x41, 0xCB, 0xEC, 0x25, 0x91, 0xDA, 0x1A, + 0xF3, 0xD9, 0x96, 0xC6, 0x80, 0x0B, 0x58, 0x5A, 0xA7, 0xDB, 0x92, 0x27, 0x2D, 0x39, 0x96, 0xC6, + 0xA9, 0xDC, 0x4E, 0xF0, 0x40, 0xE4, 0x30, 0x17, 0x47, 0xDE, 0x3F, 0x28, 0xAD, 0xE9, 0x30, 0x80, + 0x78, 0xF8, 0xE8, 0xB6, 0x4E, 0x14, 0xE3, 0x07, 0xC8, 0x20, 0x6D, 0x63, 0xFC, 0x06, 0x03, 0x08, + 0xD2, 0xD8, 0x61, 0x4C, 0xBD, 0x51, 0x66, 0x2A, 0x59, 0x05, 0x28, 0xC4, 0x54, 0x5A, 0x65, 0x67, + 0xC3, 0x4C, 0x75, 0x19, 0x53, 0x19, 0x4E, 0x9A, 0x60, 0x2A, 0x39, 0x0F, 0x2E, 0xC4, 0x54, 0xDA, + 0x44, 0x38, 0x62, 0xEA, 0x21, 0x04, 0x3A, 0x32, 0x32, 0xA6, 0xA3, 0x12, 0xA1, 0xEE, 0xF2, 0xE2, + 0xF0, 0xC5, 0x9B, 0x0B, 0x8D, 0x2E, 0x69, 0x3A, 0x56, 0xC1, 0x88, 0x17, 0xEF, 0xF4, 0x2F, 0x15, + 0xF3, 0x28, 0xE9, 0x42, 0xD4, 0x7B, 0x73, 0xA1, 0x1A, 0xF0, 0x38, 0x64, 0x91, 0x90, 0xD7, 0x6B, + 0x75, 0xCA, 0x54, 0x08, 0x43, 0x22, 0xB7, 0x14, 0xF4, 0x28, 0xFA, 0x76, 0x24, 0x83, 0xCB, 0x62, + 0x32, 0x28, 0x54, 0x25, 0x8D, 0xCB, 0xA0, 0x40, 0xD8, 0x0F, 0x88, 0xDC, 0xA6, 0x0C, 0x30, 0x4A, + 0x5E, 0x5E, 0x68, 0xEF, 0xFF, 0xA9, 0x5D, 0xDE, 0x2C, 0x1C, 0x6F, 0xE9, 0x92, 0xDC, 0xA8, 0xC2, + 0xE1, 0xE2, 0x71, 0xA5, 0xDF, 0xEB, 0x75, 0x54, 0x03, 0x4B, 0x2F, 0x7D, 0x08, 0x98, 0xB4, 0x36, + 0x18, 0x2F, 0x29, 0xA1, 0xDD, 0x90, 0xC1, 0x0F, 0x04, 0x34, 0xAD, 0x14, 0x37, 0x39, 0x60, 0x9C, + 0x43, 0xBD, 0x85, 0xDB, 0xAB, 0x15, 0x19, 0x94, 0x67, 0x94, 0x9D, 0x8D, 0x0E, 0x07, 0x94, 0xCA, + 0x5E, 0xC8, 0xDE, 0xA7, 0x8F, 0x57, 0x6A, 0x8C, 0x25, 0xEB, 0x68, 0xC5, 0x54, 0x97, 0xF6, 0xC8, + 0x68, 0xC1, 0x41, 0x41, 0xDE, 0xE8, 0xEC, 0x10, 0x62, 0xEC, 0xBA, 0x6C, 0x52, 0x44, 0x76, 0x36, + 0x31, 0xA7, 0x60, 0xB0, 0x72, 0x59, 0x52, 0x19, 0xB2, 0xB7, 0x9A, 0xE2, 0x17, 0x48, 0x9B, 0x23, + 0x08, 0xF3, 0xA0, 0x7B, 0xF4, 0xAE, 0x40, 0xB2, 0x73, 0x63, 0x4A, 0xA2, 0xEB, 0x1A, 0x0B, 0xE2, + 0x59, 0xC1, 0xD9, 0x60, 0x08, 0x8D, 0x6B, 0xC2, 0x3F, 0x97, 0xAA, 0xCD, 0x5C, 0x32, 0x39, 0xAF, + 0x7D, 0x13, 0xE2, 0xE4, 0x8F, 0xDF, 0x61, 0x93, 0x9A, 0x36, 0x76, 0x56, 0xB6, 0xE5, 0x18, 0x18, + 0xF8, 0x8D, 0x85, 0x0F, 0x94, 0x1E, 0xFC, 0xB1, 0xC0, 0x37, 0x5C, 0x19, 0xF8, 0xB4, 0x96, 0x91, + 0xD1, 0x8F, 0xA0, 0xFE, 0x91, 0xE5, 0x78, 0xC1, 0xB4, 0x0D, 0x0F, 0xC3, 0xCF, 0xAB, 0xFE, 0xCF, + 0x7F, 0xE7, 0x6D, 0x15, 0x30, 0xE7, 0x53, 0x41, 0x00, 0x35, 0xCD, 0x73, 0x47, 0xE7, 0x35, 0xA0, + 0xD4, 0x75, 0x3C, 0xCF, 0x71, 0xCD, 0xA9, 0x99, 0x32, 0x36, 0xA7, 0x49, 0xFB, 0x50, 0x26, 0xEE, + 0x44, 0x63, 0xC9, 0xB0, 0x7F, 0xE6, 0x8D, 0x5C, 0x73, 0xE1, 0x0F, 0x1E, 0x8D, 0x9D, 0xD1, 0x72, + 0x4E, 0x6C, 0xFF, 0xC0, 0x18, 0x8F, 0x2F, 0xAF, 0xE1, 0xE0, 0x3B, 0xFC, 0x16, 0x1F, 0x48, 0xBE, + 0x51, 0x7F, 0xF5, 0xAF, 0x77, 0x38, 0x0C, 0xE3, 0x35, 0x90, 0x17, 0x19, 0xD7, 0xF7, 0xB5, 0xC9, + 0xD2, 0x66, 0x23, 0x61, 0x83, 0x60, 0xDB, 0x3D, 0xED, 0x2B, 0x60, 0xBC, 0x36, 0x5C, 0x6D, 0x68, + 0x78, 0xE4, 0xAD, 0xE3, 0xF9, 0xDA, 0xB9, 0x16, 0x62, 0xB4, 0x9C, 0x11, 0xDD, 0xB7, 0x71, 0xC0, + 0xF8, 0xE2, 0x2D, 0x19, 0xE3, 0x3F, 0xBA, 0x16, 0x34, 0x0D, 0xA1, 0x9E, 0x6A, 0xF5, 0xD3, 0x63, + 0xBD, 0x8E, 0xF6, 0x17, 0x76, 0x31, 0x21, 0x10, 0xE6, 0xA1, 0x5D, 0x63, 0xE9, 0x5A, 0xFB, 0xDA, + 0x68, 0xB8, 0xF7, 0x95, 0x52, 0x4F, 0x2F, 0xE3, 0xB5, 0x3D, 0xCE, 0xCC, 0x81, 0x3F, 0x23, 0x76, + 0x23, 0xA2, 0xCC, 0x25, 0xDE, 0xC2, 0xB1, 0x3D, 0xC2, 0x88, 0x63, 0x3F, 0x73, 0x12, 0x5D, 0x3F, + 0xF0, 0x7C, 0xC3, 0x5F, 0x7A, 0xDA, 0xE3, 0xF3, 0x73, 0xAD, 0xDD, 0x6A, 0x89, 0xCD, 0x34, 0xE8, + 0x26, 0xD9, 0x6E, 0x5F, 0x4B, 0x5C, 0xF8, 0x48, 0x6E, 0xFC, 0xBD, 0x67, 0x21, 0xCC, 0x9D, 0x46, + 0x2C, 0x8F, 0xC4, 0x90, 0x84, 0x00, 0xF8, 0xDE, 0xB8, 0xC6, 0x5E, 0x9C, 0xC0, 0xC6, 0xD8, 0xF0, + 0x8D, 0xBD, 0xAF, 0x31, 0x7D, 0x41, 0xAF, 0x40, 0xC9, 0xBE, 0x46, 0x6F, 0x3D, 0x13, 0x6E, 0xDD, + 0xED, 0x1D, 0x80, 0x0C, 0x81, 0xDF, 0x10, 0x9A, 0xB8, 0x6E, 0x9C, 0x62, 0x0A, 0xDD, 0xD4, 0xF7, + 0x35, 0xBC, 0x13, 0x87, 0x15, 0x88, 0x7C, 0x14, 0x5C, 0x0B, 0x84, 0x96, 0x8D, 0x56, 0x82, 0x92, + 0xA1, 0xBB, 0x8B, 0xA9, 0x08, 0x02, 0xCE, 0x07, 0x32, 0x05, 0x89, 0x4D, 0xF7, 0x79, 0xFC, 0xD9, + 0xA7, 0xC1, 0x67, 0x9F, 0xC5, 0x2D, 0x41, 0x6B, 0x87, 0x87, 0xE0, 0xD2, 0x9E, 0x63, 0x11, 0xB0, + 0x8A, 0x69, 0xA3, 0xCE, 0xBF, 0xF5, 0x0A, 0x16, 0x55, 0x6F, 0xDD, 0xD4, 0x9F, 0x02, 0x82, 0x03, + 0xDF, 0xB9, 0xF2, 0x5D, 0xD3, 0x9E, 0x36, 0xF4, 0xFE, 0x5E, 0x84, 0x8D, 0xDE, 0x46, 0x94, 0x89, + 0xFB, 0xF4, 0x3A, 0xED, 0x24, 0x79, 0xA3, 0xC1, 0xAF, 0x3F, 0xAD, 0xEF, 0xD5, 0x39, 0xF1, 0xF4, + 0x1C, 0xCC, 0xAD, 0xC1, 0x0E, 0x9E, 0x50, 0x1A, 0xF7, 0xB4, 0xB3, 0x33, 0xDE, 0x0D, 0x6B, 0x85, + 0x17, 0xA1, 0x11, 0xFD, 0x93, 0xB8, 0x15, 0x9A, 0xE2, 0xEF, 0xFF, 0xF8, 0x1A, 0xD8, 0xEC, 0xDD, + 0x21, 0x50, 0xFD, 0x1C, 0x43, 0xF0, 0x3F, 0xBE, 0xC2, 0xFF, 0x77, 0x4F, 0x68, 0xD4, 0xFD, 0xC7, + 0x57, 0xFC, 0x73, 0xF7, 0x04, 0x7A, 0x82, 0x63, 0xDA, 0xDF, 0xDD, 0xEF, 0x54, 0x0E, 0xEB, 0xD2, + 0x9B, 0xA6, 0x4A, 0x2F, 0x14, 0x5B, 0x61, 0x9A, 0xA6, 0x19, 0x44, 0xFD, 0x1E, 0xF9, 0x6F, 0x63, + 0xE4, 0x8C, 0x41, 0x3D, 0x3E, 0x58, 0x72, 0xA0, 0x74, 0x0B, 0x54, 0x12, 0x08, 0xAA, 0x15, 0x28, + 0xDD, 0x9C, 0xD0, 0x96, 0x1A, 0x77, 0x95, 0xC8, 0x40, 0x82, 0x96, 0x0B, 0xC3, 0xF5, 0xC8, 0xB7, + 0xB6, 0xDF, 0xF0, 0x63, 0x4E, 0x91, 0x22, 0xF1, 0xC1, 0x20, 0xC6, 0x02, 0xFE, 0x00, 0x0E, 0xDA, + 0xD5, 0xB9, 0xD2, 0x42, 0x63, 0xE3, 0x7F, 0x13, 0x66, 0xF3, 0xA6, 0x90, 0xD9, 0x34, 0xA8, 0xD8, + 0xC2, 0x3E, 0xF7, 0x8A, 0x98, 0x10, 0x90, 0x25, 0x18, 0x10, 0x75, 0x88, 0x48, 0x64, 0xEC, 0x62, + 0x8A, 0x43, 0xFC, 0x3C, 0xB2, 0xBE, 0x34, 0x6E, 0xE0, 0xBF, 0x64, 0xCC, 0x5A, 0xD3, 0x15, 0x36, + 0x7A, 0x8E, 0xFF, 0x81, 0x82, 0xF0, 0x4F, 0xAA, 0xA1, 0x00, 0xD6, 0xF7, 0x96, 0xD5, 0x60, 0x1F, + 0x98, 0x03, 0x1B, 0x59, 0x42, 0x3C, 0xF4, 0x6E, 0x31, 0x32, 0x39, 0x8E, 0xFF, 0x79, 0x5F, 0x5B, + 0xB8, 0x40, 0x18, 0xFD, 0x96, 0x0A, 0x1C, 0x03, 0x22, 0x62, 0xB3, 0xBF, 0xB9, 0x14, 0x2C, 0x2C, + 0xEB, 0x39, 0xC3, 0x0A, 0x24, 0xB0, 0x03, 0x30, 0x99, 0x25, 0x9A, 0x2E, 0xFC, 0x7F, 0xF7, 0x04, + 0x3A, 0x81, 0x43, 0xF8, 0xFF, 0xEE, 0x09, 0x76, 0x85, 0x46, 0x85, 0x3D, 0xDE, 0x3D, 0x81, 0x1E, + 0xE1, 0x04, 0xFE, 0x87, 0x36, 0xD8, 0x2F, 0xB6, 0xC2, 0xBF, 0x70, 0x87, 0xF6, 0x8F, 0x37, 0xE9, + 0x01, 0xBB, 0xC0, 0x4F, 0xB3, 0x18, 0x64, 0x6F, 0xD7, 0x6F, 0xD0, 0xB7, 0x9D, 0x7F, 0xBE, 0x01, + 0x76, 0xE8, 0xC1, 0x2D, 0xC4, 0x20, 0x7B, 0x8C, 0xE7, 0xF8, 0xE7, 0x36, 0x50, 0x30, 0x5E, 0xE0, + 0x47, 0x70, 0x8D, 0xBE, 0x11, 0x16, 0x2F, 0xB1, 0x03, 0x6C, 0x45, 0xDF, 0xDF, 0x49, 0x5B, 0xB1, + 0x23, 0xB8, 0xC6, 0xDF, 0xFA, 0xB8, 0xAF, 0xF1, 0xF7, 0x0A, 0xE6, 0x0A, 0x27, 0x7A, 0xEF, 0xDF, + 0x73, 0xEF, 0x06, 0x19, 0x64, 0xA4, 0xA1, 0x54, 0xC2, 0xB3, 0xDB, 0xBB, 0x27, 0x04, 0xEF, 0x51, + 0x22, 0xE1, 0xF8, 0x96, 0x1F, 0xC3, 0x75, 0xA0, 0x0F, 0xEF, 0x04, 0x04, 0xD3, 0x0B, 0xB7, 0xD1, + 0x05, 0x68, 0xE1, 0xE3, 0x7D, 0x4E, 0x3C, 0x9C, 0xDD, 0x86, 0x67, 0x08, 0x4D, 0x61, 0x39, 0x1B, + 0x70, 0x7A, 0x1B, 0x9D, 0xC2, 0x5D, 0xE4, 0x05, 0x15, 0xC0, 0x79, 0xBA, 0x7B, 0xC2, 0x79, 0x42, + 0x2D, 0xB2, 0xA3, 0xB8, 0xA8, 0xE1, 0x7F, 0xF4, 0x23, 0x9F, 0x07, 0xEC, 0x4F, 0x81, 0x77, 0x12, + 0x6B, 0x4F, 0x3B, 0x1F, 0xF0, 0xB8, 0x8F, 0x01, 0x00, 0x3C, 0x0A, 0xAE, 0x13, 0xEB, 0xC0, 0xF0, + 0xC1, 0x21, 0x20, 0x6F, 0x22, 0xDE, 0x01, 0x46, 0x94, 0xD0, 0xCD, 0xD7, 0x6E, 0x1D, 0xD8, 0xE0, + 0x16, 0x14, 0xE1, 0xDE, 0x29, 0x0F, 0x1B, 0x88, 0x88, 0x71, 0xB9, 0x86, 0x8B, 0x5D, 0x4E, 0x43, + 0xC7, 0xEE, 0xA6, 0x60, 0xE4, 0xA1, 0x30, 0x0E, 0x81, 0x17, 0xD3, 0xB0, 0xD1, 0x51, 0x43, 0xC0, + 0xD5, 0xEE, 0xF5, 0x22, 0x6C, 0x89, 0x48, 0xC7, 0xE6, 0x94, 0x28, 0x90, 0x03, 0xCC, 0xCF, 0xA3, + 0xA1, 0x70, 0x04, 0xE6, 0xA0, 0xD5, 0x83, 0x09, 0x65, 0xFD, 0x74, 0x2D, 0xC2, 0x01, 0x04, 0x2F, + 0x20, 0x68, 0xCF, 0x19, 0x8D, 0xA7, 0x51, 0xF8, 0xD4, 0xB4, 0x21, 0x24, 0x3B, 0x5F, 0x9E, 0xC5, + 0x90, 0xD1, 0xD4, 0x3F, 0xC4, 0xC4, 0xAE, 0x61, 0xA2, 0x90, 0xB8, 0xC4, 0xB6, 0xDB, 0x35, 0x1D, + 0x9B, 0xC8, 0x7B, 0x8D, 0xC5, 0x4B, 0xDE, 0x11, 0x3F, 0x1B, 0x93, 0x89, 0xB1, 0xB4, 0xFC, 0x08, + 0xCC, 0x25, 0x90, 0xE8, 0xDA, 0x3C, 0x6C, 0xB1, 0x24, 0x3F, 0x77, 0xE8, 0xCE, 0x18, 0x2A, 0x82, + 0x51, 0xE1, 0x71, 0x72, 0x54, 0x00, 0xAB, 0x74, 0xFD, 0x46, 0xFD, 0xD2, 0x75, 0x1D, 0xF7, 0xD7, + 0xFA, 0x53, 0x6C, 0xF4, 0xB4, 0xFE, 0xDB, 0xA9, 0x46, 0xE3, 0xE9, 0x5E, 0x3C, 0xB8, 0x0B, 0xE1, + 0xF3, 0xF0, 0x50, 0x7B, 0xE1, 0xFB, 0x06, 0x28, 0x00, 0x6B, 0x2C, 0x33, 0x94, 0x8F, 0x66, 0xF0, + 0x24, 0xD0, 0x71, 0xD1, 0x28, 0xD9, 0xF7, 0xEE, 0x41, 0x22, 0x98, 0x58, 0x7A, 0x00, 0x12, 0x24, + 0x99, 0x14, 0xD5, 0xC1, 0xBF, 0x97, 0xC4, 0xBD, 0xBD, 0xA2, 0x02, 0x73, 0xDC, 0x17, 0x10, 0x2A, + 0xEB, 0x07, 0xD1, 0x3C, 0xA9, 0xCE, 0x72, 0x9E, 0x03, 0x40, 0x75, 0x09, 0x7D, 0x80, 0x8E, 0x23, + 0x9B, 0x67, 0xDC, 0x84, 0x7A, 0x87, 0x71, 0xEE, 0x9C, 0x2B, 0x23, 0x99, 0x64, 0x41, 0x0B, 0xC7, + 0xFE, 0x42, 0x6E, 0x97, 0x0B, 0x10, 0x7F, 0x94, 0x36, 0x25, 0x12, 0x39, 0x2E, 0x1D, 0x72, 0x00, + 0x2D, 0x2F, 0xF8, 0xC0, 0xA9, 0x77, 0x24, 0x8D, 0x22, 0x15, 0x50, 0xEB, 0x44, 0x4F, 0x7C, 0xB6, + 0xD6, 0xE8, 0xEE, 0x91, 0xFC, 0x4C, 0x92, 0x72, 0x72, 0x02, 0xB9, 0xF0, 0xC0, 0xB5, 0xA9, 0x63, + 0x27, 0x7A, 0x48, 0xA4, 0x83, 0x90, 0x0C, 0x46, 0x91, 0x61, 0xB9, 0x80, 0xE4, 0x93, 0xC4, 0x83, + 0x43, 0x68, 0x0B, 0xC1, 0xCD, 0xB9, 0xE3, 0x93, 0x44, 0xC4, 0x30, 0x6D, 0xD3, 0x37, 0x0D, 0xEB, + 0x53, 0x64, 0x8D, 0x5B, 0x75, 0x7F, 0x89, 0x8F, 0x17, 0xF0, 0xFF, 0xB5, 0x9C, 0x4F, 0x2D, 0x4F, + 0x59, 0xB3, 0x90, 0x30, 0x1E, 0x44, 0x56, 0x22, 0xCA, 0x21, 0x16, 0x16, 0xF8, 0xFD, 0xA0, 0xA7, + 0xC7, 0x8F, 0xE9, 0xD1, 0xA3, 0x50, 0x69, 0x41, 0xF4, 0x38, 0xD7, 0xA2, 0x1B, 0x09, 0x05, 0xAF, + 0xE3, 0x4E, 0xE0, 0x08, 0x90, 0x0B, 0x18, 0x12, 0x81, 0x7F, 0x01, 0xE9, 0x0D, 0xDA, 0xC2, 0xFF, + 0x47, 0xFD, 0x07, 0x14, 0xF5, 0xB7, 0x17, 0xE2, 0x33, 0x6C, 0x3B, 0xE1, 0x01, 0x0C, 0x4E, 0x9E, + 0x4F, 0x3F, 0x85, 0x44, 0x5B, 0x9E, 0x24, 0x87, 0xA1, 0x3B, 0x9C, 0xEC, 0xC3, 0x64, 0xE6, 0x92, + 0x85, 0xE7, 0x97, 0xB7, 0xDF, 0x8E, 0x1B, 0xF5, 0xF0, 0x8D, 0x46, 0xF5, 0x3D, 0x8C, 0x4B, 0x96, + 0x39, 0xFA, 0x12, 0x86, 0xA5, 0xC8, 0xF2, 0x20, 0xA5, 0xC1, 0xEC, 0x1F, 0x27, 0xD6, 0xE6, 0x88, + 0x9B, 0xEA, 0xAB, 0x0F, 0x2F, 0xDE, 0x7D, 0x7E, 0xF1, 0xF1, 0xE3, 0x07, 0x6D, 0x09, 0x36, 0xAB, + 0xF7, 0x3F, 0x63, 0xDA, 0x02, 0x93, 0x00, 0xF7, 0x33, 0xD0, 0xE7, 0x7D, 0xA6, 0x48, 0x5B, 0xBF, + 0xFE, 0xF6, 0x6B, 0xFB, 0x37, 0x00, 0xFD, 0xFA, 0x5F, 0x76, 0x9D, 0x31, 0x82, 0xA8, 0x9E, 0x02, + 0x2E, 0x3C, 0xFE, 0x5A, 0x7F, 0x1A, 0x18, 0x7C, 0x23, 0x9D, 0xC2, 0xF0, 0xF5, 0xBA, 0xF5, 0x3D, + 0x60, 0xF5, 0x6E, 0x1F, 0x50, 0xB1, 0x74, 0x10, 0xC6, 0x9C, 0x06, 0x96, 0x2A, 0x4C, 0xE8, 0x40, + 0x7F, 0x06, 0x7F, 0xCE, 0x34, 0xFD, 0x08, 0xFE, 0x3E, 0x7D, 0x1A, 0x99, 0x48, 0xC9, 0xEE, 0xEA, + 0x4F, 0x4D, 0xDA, 0x19, 0xCC, 0x4E, 0x1A, 0xE6, 0x19, 0x48, 0xF2, 0x79, 0x7D, 0xBF, 0x7E, 0x5A, + 0xAF, 0xC3, 0xB5, 0xA0, 0xFB, 0xBB, 0x18, 0x3B, 0x77, 0xCF, 0x42, 0x0E, 0xD9, 0xE8, 0x0A, 0x37, + 0x22, 0xF1, 0x8B, 0x59, 0xDD, 0x4B, 0x56, 0xE5, 0x3A, 0x4F, 0xD7, 0x09, 0x7B, 0x9B, 0xF5, 0x94, + 0x0E, 0x88, 0x22, 0x4C, 0x86, 0x82, 0x58, 0x68, 0x08, 0x7D, 0x2D, 0x15, 0x35, 0x1D, 0x6E, 0xC7, + 0x63, 0x17, 0xB4, 0x4D, 0xAD, 0x65, 0x6F, 0xCD, 0x85, 0xD5, 0x70, 0x60, 0x63, 0x09, 0x8E, 0xB5, + 0xE9, 0x66, 0x26, 0x12, 0xDA, 0x5A, 0xC0, 0xB2, 0x96, 0xF0, 0xB4, 0xEE, 0x2F, 0xD7, 0x61, 0x1A, + 0x9B, 0x2A, 0x6A, 0x6C, 0x2A, 0x68, 0x6C, 0xBA, 0x59, 0x8D, 0x71, 0xD4, 0x95, 0xB5, 0x16, 0xE0, + 0xC9, 0xD1, 0x5C, 0x2E, 0x3C, 0x57, 0x1A, 0xD7, 0xD6, 0x54, 0xA6, 0xAD, 0x32, 0x6A, 0x62, 0xB1, + 0x0B, 0x26, 0x45, 0xC4, 0x7D, 0xFB, 0xF1, 0xDD, 0x77, 0x18, 0x6D, 0xE4, 0x2A, 0x0B, 0x35, 0x96, + 0x4C, 0xAE, 0x24, 0x18, 0x30, 0x28, 0xC6, 0x2A, 0x1F, 0x89, 0xB0, 0xA9, 0x45, 0x15, 0x84, 0x1C, + 0x43, 0xE0, 0x05, 0x03, 0x35, 0xDF, 0xC5, 0x22, 0x41, 0xE0, 0xBC, 0x11, 0x54, 0x86, 0x2D, 0x20, + 0x80, 0x92, 0x12, 0x19, 0xE6, 0x35, 0x87, 0x11, 0x6A, 0x19, 0x3B, 0x77, 0x11, 0xEA, 0xAF, 0x9E, + 0x6A, 0x50, 0x0B, 0xA6, 0xEA, 0x51, 0x6C, 0xF3, 0x72, 0xA5, 0xC3, 0x27, 0xF4, 0x4A, 0x02, 0xE2, + 0x5F, 0x95, 0x93, 0x18, 0x38, 0x2F, 0x04, 0x14, 0xC0, 0x72, 0x2B, 0xC1, 0x42, 0x0B, 0x08, 0x4A, + 0x38, 0xE8, 0x97, 0xC8, 0x52, 0x30, 0xA8, 0x51, 0x41, 0x3F, 0xFD, 0x25, 0xC1, 0x10, 0x94, 0x2A, + 0x94, 0x90, 0x04, 0x9F, 0xAD, 0x4A, 0xC7, 0xA3, 0x46, 0x4C, 0xF0, 0xB1, 0x28, 0x09, 0x1E, 0x5E, + 0x1A, 0x51, 0x42, 0xC3, 0x3F, 0x74, 0x94, 0x8A, 0x45, 0x8D, 0x18, 0xFE, 0x6D, 0x21, 0x19, 0x4F, + 0xBC, 0x14, 0xA3, 0xC6, 0x13, 0xFF, 0x24, 0x4E, 0x3A, 0x1E, 0x45, 0xD9, 0xF0, 0xCF, 0xD0, 0xC8, + 0xAC, 0x8E, 0x55, 0x7E, 0x32, 0x1D, 0x83, 0x35, 0x01, 0x60, 0x9E, 0xAA, 0x3E, 0xD7, 0xC5, 0xCC, + 0x9A, 0x17, 0x8A, 0xB2, 0x30, 0xF0, 0x26, 0x49, 0x0C, 0x41, 0x74, 0xB8, 0x87, 0x92, 0xDD, 0x7D, + 0x44, 0xA1, 0xF7, 0x96, 0xA5, 0x16, 0x85, 0x16, 0x96, 0x15, 0x84, 0x9F, 0x10, 0x26, 0x25, 0xFC, + 0xD0, 0x25, 0x33, 0x5A, 0x6F, 0xCD, 0x94, 0x3F, 0x6D, 0xC1, 0xF0, 0xAE, 0x2B, 0x11, 0x71, 0xCC, + 0x97, 0x96, 0x92, 0x25, 0x41, 0x3B, 0x8E, 0x46, 0x34, 0x24, 0xBA, 0x1C, 0x77, 0xEB, 0xA9, 0x85, + 0xAE, 0x5B, 0x2F, 0x05, 0x03, 0x2D, 0x09, 0xAB, 0xE5, 0x66, 0xD0, 0x32, 0x05, 0xC9, 0xC2, 0x55, + 0x4B, 0xEF, 0xA0, 0x5D, 0x1A, 0x23, 0x58, 0x7F, 0x56, 0x63, 0x25, 0xF8, 0xEA, 0xB8, 0x8C, 0x0E, + 0x5A, 0xB5, 0xCE, 0x52, 0x0A, 0xFF, 0xBA, 0x73, 0x9A, 0x46, 0x16, 0xAA, 0x43, 0x6E, 0xF0, 0xFD, + 0x63, 0xC9, 0xB0, 0x5B, 0xB2, 0xD8, 0xBF, 0x7B, 0xE7, 0x30, 0xAE, 0x89, 0x82, 0x6B, 0x84, 0x2B, + 0xF3, 0x3C, 0xBB, 0x8B, 0xC0, 0x32, 0xBC, 0x63, 0x64, 0xD8, 0xD7, 0x46, 0xCC, 0x3B, 0x46, 0x30, + 0xFD, 0xF5, 0x09, 0x47, 0xDD, 0xA8, 0xB1, 0x06, 0x35, 0x4E, 0x23, 0x3B, 0x3B, 0xA0, 0x5B, 0xD6, + 0xB0, 0x10, 0x62, 0x92, 0x15, 0x3B, 0x89, 0xDD, 0x9E, 0x11, 0xFA, 0x9A, 0x10, 0x7E, 0x9F, 0x9D, + 0xB1, 0x06, 0x61, 0x2F, 0x43, 0x67, 0x7C, 0x7B, 0x60, 0x2C, 0x16, 0x10, 0xBC, 0x2E, 0x66, 0xA6, + 0x35, 0x6E, 0x30, 0x50, 0xC1, 0x44, 0x70, 0x6F, 0x02, 0xA1, 0xAB, 0x56, 0x1C, 0x2B, 0x30, 0x7C, + 0xC1, 0xAE, 0x35, 0xEA, 0xED, 0x71, 0xB0, 0x66, 0xC4, 0x9B, 0x1D, 0x8C, 0x5D, 0x63, 0xF5, 0x2D, + 0x6E, 0x6A, 0x68, 0x60, 0xA7, 0xFB, 0xAD, 0xFD, 0x16, 0x6F, 0xE0, 0xBB, 0xB7, 0x61, 0x96, 0x89, + 0x78, 0x71, 0xF1, 0xF7, 0xC7, 0x0F, 0xDF, 0x45, 0x78, 0x7D, 0xE7, 0x15, 0xBB, 0xD4, 0xA8, 0xD3, + 0x5D, 0x11, 0x87, 0x7F, 0x2C, 0x70, 0x2A, 0x10, 0x28, 0x45, 0x10, 0x23, 0x6E, 0x78, 0x40, 0x51, + 0xB1, 0xE6, 0xCF, 0x44, 0xA4, 0x70, 0xD9, 0x26, 0x2B, 0x0D, 0x30, 0x91, 0x86, 0x0C, 0x34, 0xD8, + 0x0E, 0x81, 0xE0, 0xC8, 0xC9, 0xEB, 0xA5, 0x65, 0xFD, 0x42, 0x0C, 0x17, 0xF4, 0xF1, 0x54, 0x6B, + 0xD4, 0x5A, 0xB5, 0xA7, 0x0D, 0x7A, 0xFD, 0x1D, 0xB0, 0x33, 0x6B, 0xEC, 0x3D, 0xD5, 0xF7, 0xF6, + 0x0E, 0x3C, 0xD0, 0x19, 0x69, 0x34, 0xDB, 0x41, 0x13, 0xF8, 0x43, 0xDB, 0xB0, 0x4E, 0xD2, 0xEF, + 0xBF, 0x75, 0x96, 0xAE, 0x97, 0xD5, 0xE0, 0x9D, 0x69, 0x63, 0x11, 0x27, 0xAB, 0xC9, 0x15, 0x01, + 0xC1, 0x8E, 0xD7, 0x9A, 0xD4, 0xE8, 0x2E, 0x0E, 0x5E, 0xFE, 0xD0, 0xE8, 0xE2, 0xB6, 0xD6, 0x10, + 0x2B, 0x3A, 0x7C, 0x19, 0x91, 0xA0, 0xA1, 0x37, 0x02, 0x8F, 0xBF, 0x13, 0x8D, 0x03, 0x5C, 0x16, + 0x0C, 0xE0, 0x7B, 0xF0, 0x80, 0x03, 0x97, 0xCC, 0x9D, 0x6B, 0xB2, 0xA6, 0x7F, 0x6C, 0x1E, 0x1A, + 0xFF, 0xCC, 0x1C, 0xB3, 0x32, 0x4D, 0x64, 0xB7, 0x58, 0x15, 0xC2, 0x0D, 0x22, 0xB8, 0x85, 0x02, + 0xF7, 0x53, 0x34, 0xEA, 0x6C, 0xF7, 0x0A, 0x1D, 0x15, 0xEE, 0x22, 0xB7, 0x99, 0x39, 0xAB, 0x2C, + 0x48, 0xD6, 0x7B, 0x02, 0x38, 0x84, 0x1E, 0x9B, 0x9E, 0x31, 0xB4, 0xF2, 0xBB, 0xE6, 0xED, 0xC6, + 0xBC, 0xFC, 0x0D, 0x0D, 0x82, 0x2B, 0x00, 0xEA, 0xBB, 0xB4, 0x4E, 0x28, 0xA0, 0x25, 0x76, 0x1E, + 0xD6, 0x80, 0xAC, 0x4C, 0xC4, 0x13, 0x03, 0x26, 0x4F, 0x71, 0xCC, 0xAC, 0x78, 0x5C, 0xA0, 0xAC, + 0x2C, 0x5E, 0x06, 0x88, 0xF8, 0x29, 0x98, 0x33, 0x58, 0xA8, 0xF6, 0x9C, 0xB2, 0xA0, 0x9D, 0xC6, + 0xEE, 0x86, 0xB9, 0x8D, 0x58, 0x30, 0x7D, 0xC4, 0xE2, 0xDF, 0x5F, 0xB0, 0x82, 0x1B, 0x52, 0x1E, + 0x93, 0xC0, 0x93, 0x27, 0x71, 0x6C, 0xB8, 0x8D, 0x85, 0x0D, 0x20, 0x61, 0x6F, 0xAC, 0x3D, 0x7B, + 0x7D, 0x78, 0xB4, 0xB2, 0xC0, 0x49, 0x82, 0xA1, 0xE0, 0x71, 0x4C, 0xF0, 0xC2, 0x18, 0x01, 0x84, + 0x98, 0x63, 0x2A, 0x20, 0xDC, 0x95, 0x56, 0x5B, 0x5B, 0xEF, 0x7F, 0x4E, 0xAD, 0xBE, 0x41, 0xF8, + 0xA6, 0xC4, 0x3D, 0x90, 0x3F, 0x1A, 0x73, 0x74, 0x21, 0x3E, 0x87, 0x4E, 0x60, 0x9C, 0xC6, 0x30, + 0x22, 0x63, 0x09, 0xBA, 0xF1, 0x77, 0x78, 0x48, 0x31, 0x4E, 0x0D, 0xD3, 0xBE, 0x20, 0x26, 0xA6, + 0x7F, 0x7B, 0xC2, 0x5D, 0xDA, 0x3D, 0x20, 0xC2, 0x0D, 0x83, 0xC2, 0x72, 0xC6, 0xFA, 0x7A, 0xC8, + 0xE1, 0x21, 0x6D, 0x9A, 0x82, 0x86, 0x76, 0xB1, 0x8E, 0x26, 0x93, 0xFA, 0xD5, 0xF0, 0x33, 0x62, + 0x93, 0x09, 0x85, 0xA2, 0x5B, 0x0D, 0x51, 0x1C, 0xB4, 0x57, 0x38, 0xCC, 0x42, 0x35, 0x31, 0x46, + 0xE4, 0xB3, 0x0B, 0x71, 0x6C, 0x6A, 0x9B, 0x7F, 0x12, 0x19, 0x42, 0xE6, 0x8C, 0x0D, 0x62, 0xBB, + 0x4E, 0x90, 0x48, 0x22, 0x72, 0xEE, 0x67, 0xF1, 0xEB, 0xF1, 0x21, 0x3A, 0x70, 0xBD, 0x70, 0x69, + 0x5D, 0xB4, 0x05, 0x56, 0xFA, 0x8F, 0x26, 0xC0, 0x91, 0xB1, 0x6D, 0xA8, 0x12, 0xAE, 0x63, 0x19, + 0x3C, 0x6C, 0x22, 0xD6, 0xAB, 0x2B, 0x16, 0xC1, 0x33, 0x70, 0xB2, 0xCD, 0x7D, 0x49, 0xA4, 0xCB, + 0xE1, 0xDC, 0xF4, 0x25, 0x08, 0xEB, 0x7A, 0x5D, 0x8A, 0x2B, 0xA5, 0x9E, 0x2E, 0x7A, 0x22, 0x8B, + 0x66, 0x74, 0xA9, 0x11, 0x10, 0xC5, 0xB6, 0x0A, 0x8C, 0xD8, 0x6E, 0xF5, 0xE7, 0x30, 0xE2, 0xE2, + 0x06, 0x00, 0x54, 0x75, 0x62, 0x0B, 0x10, 0x43, 0xC1, 0xF6, 0xAE, 0x51, 0x14, 0xF1, 0xDD, 0x6B, + 0xC1, 0x8E, 0xB1, 0xF8, 0xCA, 0xA4, 0xB8, 0xF7, 0xE5, 0x77, 0x97, 0x00, 0x9C, 0x87, 0xF3, 0x59, + 0xED, 0x1F, 0x5F, 0x29, 0x8A, 0x3B, 0x6D, 0x02, 0x91, 0xC0, 0x9B, 0x91, 0x31, 0x9D, 0x7B, 0xF9, + 0x4B, 0xEF, 0x54, 0xC3, 0x6D, 0x3F, 0xB1, 0xDD, 0x6A, 0x77, 0xBF, 0x87, 0x16, 0x12, 0x0E, 0x24, + 0xD1, 0x7A, 0x2B, 0x67, 0x7B, 0x6D, 0xDD, 0xF5, 0x91, 0xC2, 0x0A, 0x2B, 0x87, 0x55, 0x5A, 0x65, + 0x95, 0x2D, 0x4E, 0x26, 0xA3, 0x14, 0xCF, 0x31, 0x1F, 0xA9, 0xF4, 0x4D, 0x77, 0x5D, 0xAA, 0x74, + 0x29, 0xC9, 0x2E, 0xF1, 0xC7, 0xC2, 0x98, 0x25, 0x8C, 0xF9, 0x09, 0x3F, 0xDA, 0xE3, 0x72, 0x02, + 0x13, 0x19, 0x07, 0xF1, 0x96, 0x19, 0x11, 0xAE, 0x3E, 0x33, 0x3D, 0xC6, 0x4C, 0x80, 0x49, 0x9B, + 0x0B, 0x3B, 0x7F, 0x4B, 0x22, 0x5F, 0x76, 0x09, 0x95, 0xF5, 0x87, 0x07, 0x79, 0x7B, 0x28, 0x02, + 0x19, 0x0E, 0xEC, 0x40, 0x40, 0x10, 0x13, 0x51, 0x21, 0x15, 0x65, 0xC8, 0x8C, 0xFD, 0x84, 0x01, + 0x9B, 0x8E, 0xD6, 0xB4, 0xE7, 0x5F, 0xA9, 0x55, 0xFF, 0xB6, 0xCF, 0x46, 0x78, 0x21, 0x68, 0xEE, + 0x15, 0x21, 0x68, 0x6D, 0x55, 0x3E, 0x97, 0x98, 0x8D, 0xAD, 0x4F, 0x06, 0x3F, 0x88, 0xC5, 0x14, + 0xDF, 0xB9, 0xD6, 0x5A, 0x5B, 0x97, 0x17, 0x17, 0xD1, 0x42, 0x06, 0x25, 0xB2, 0x11, 0x16, 0xD5, + 0x03, 0xF1, 0x48, 0x17, 0xD0, 0x52, 0xC5, 0xC5, 0xEC, 0x8B, 0x45, 0x14, 0x9C, 0x16, 0x64, 0xCE, + 0x9F, 0xE8, 0x86, 0x59, 0x2A, 0xAF, 0x08, 0xE0, 0x22, 0xDC, 0x20, 0x9D, 0x0B, 0x19, 0x6D, 0xA6, + 0x16, 0x70, 0xD0, 0xF9, 0x98, 0xDA, 0xFA, 0x03, 0x9F, 0xBA, 0x09, 0xA0, 0x88, 0x35, 0x1F, 0x36, + 0x78, 0x4A, 0x26, 0x49, 0xBE, 0x38, 0x7A, 0x65, 0xC1, 0xD3, 0x61, 0x92, 0x35, 0x16, 0xA0, 0xA9, + 0xE7, 0xE7, 0x03, 0x8B, 0xDB, 0xB2, 0xEB, 0x82, 0xB0, 0x3D, 0xDF, 0x59, 0x5C, 0xD1, 0xAB, 0x89, + 0xA8, 0xB0, 0xA2, 0xC5, 0xAC, 0x03, 0xBC, 0x1F, 0xCC, 0x93, 0x44, 0x46, 0xE3, 0xF5, 0xFF, 0x2B, + 0xAC, 0x74, 0x69, 0x0C, 0x4F, 0x3D, 0x9E, 0xED, 0xD2, 0x22, 0x98, 0xB4, 0x07, 0x3A, 0xE7, 0xF4, + 0xDC, 0x11, 0x1B, 0x3C, 0xC2, 0x6D, 0xD0, 0x18, 0x3A, 0xF0, 0xF0, 0x77, 0xD6, 0x27, 0xA6, 0x12, + 0x31, 0x05, 0xEF, 0xE5, 0xD2, 0xE2, 0x2C, 0x92, 0xA4, 0x44, 0x01, 0x9E, 0x39, 0x9B, 0x87, 0xA3, + 0x06, 0x1B, 0x28, 0x31, 0x7C, 0x09, 0xCA, 0x4F, 0x89, 0x91, 0x91, 0x98, 0x78, 0x50, 0x8A, 0x13, + 0x2F, 0x8C, 0x7C, 0x6C, 0x0F, 0xFD, 0xF3, 0xCF, 0xA3, 0x21, 0x0C, 0x76, 0x38, 0x01, 0x04, 0xD7, + 0x5B, 0x35, 0xF6, 0xEE, 0xB2, 0xD8, 0x61, 0xE2, 0x8A, 0x14, 0xA9, 0x4A, 0x04, 0x8D, 0xDA, 0x72, + 0x6C, 0x31, 0xF9, 0xC8, 0xD1, 0x89, 0xD6, 0x7B, 0x69, 0x07, 0x13, 0x96, 0x34, 0xC1, 0x9E, 0xAF, + 0x8B, 0x96, 0xE5, 0xAC, 0x31, 0x04, 0x51, 0x3C, 0x5E, 0x23, 0x36, 0x91, 0x94, 0x0A, 0x76, 0x11, + 0x34, 0x08, 0x68, 0x17, 0x1D, 0x22, 0x85, 0xF6, 0xF8, 0x58, 0x99, 0x48, 0xFF, 0x02, 0x95, 0x5F, + 0x2C, 0x81, 0x88, 0x79, 0xA0, 0x72, 0x76, 0x0D, 0x33, 0xDC, 0xD0, 0x36, 0x21, 0xE3, 0xCD, 0xF2, + 0x19, 0xB8, 0x2D, 0x38, 0x1A, 0x4F, 0x8F, 0x73, 0x00, 0x68, 0x4E, 0xCC, 0x1E, 0x84, 0xA1, 0xB0, + 0x6C, 0xC3, 0xAE, 0xAF, 0x09, 0x89, 0x77, 0x66, 0x7C, 0x81, 0x66, 0x23, 0xD6, 0x4C, 0x40, 0x02, + 0x78, 0xD7, 0xD3, 0x05, 0x89, 0x20, 0xA0, 0xDD, 0x5E, 0xA8, 0x17, 0x04, 0xE2, 0x99, 0x68, 0xA4, + 0x95, 0xF4, 0xD9, 0xC4, 0xFA, 0x4C, 0x22, 0xA1, 0xB0, 0xF4, 0x19, 0xC4, 0xFA, 0xEC, 0xE1, 0x4E, + 0xD0, 0x42, 0xF0, 0xC4, 0x56, 0x24, 0x48, 0x92, 0x2D, 0x75, 0x22, 0x4A, 0x3D, 0x98, 0x49, 0xE5, + 0x40, 0x7C, 0xA6, 0xA9, 0x88, 0x28, 0x32, 0xA2, 0x28, 0x32, 0xC2, 0x45, 0x86, 0x00, 0x51, 0xE2, + 0x9E, 0x3F, 0xAD, 0x0B, 0xE3, 0xCA, 0x4F, 0x2F, 0x23, 0xCE, 0x56, 0xC3, 0x4C, 0x3A, 0xF9, 0x94, + 0x49, 0x60, 0x2F, 0x1B, 0x00, 0xDA, 0xCF, 0x61, 0xDC, 0x16, 0xD9, 0x5A, 0x0D, 0xD5, 0xD8, 0x0A, + 0xA6, 0x5C, 0x08, 0x10, 0xB1, 0x25, 0x9F, 0x98, 0x05, 0xAC, 0xBC, 0x22, 0x3E, 0x7F, 0xAE, 0xD3, + 0xB0, 0xC7, 0xDA, 0xC4, 0x35, 0xE6, 0xC4, 0x83, 0x09, 0x59, 0x48, 0xEC, 0x98, 0xDE, 0xCF, 0x1D, + 0xA2, 0x58, 0x33, 0x81, 0xC9, 0x70, 0x6A, 0x97, 0x0B, 0x1A, 0xB6, 0x14, 0xA0, 0x43, 0x3A, 0x32, + 0xA1, 0x83, 0x46, 0x6C, 0x6C, 0x0B, 0x4F, 0x95, 0x84, 0x15, 0xB6, 0x8E, 0x9C, 0x27, 0x42, 0xC0, + 0x26, 0x4A, 0x03, 0xAD, 0x97, 0x2C, 0x27, 0xB0, 0x84, 0x87, 0x31, 0x9B, 0x48, 0x6B, 0xC4, 0x06, + 0x21, 0x4B, 0xB1, 0x36, 0xA1, 0x83, 0x30, 0xF8, 0x34, 0x32, 0x73, 0x49, 0x61, 0xE5, 0xEA, 0xDA, + 0x7B, 0x8B, 0xE0, 0x34, 0x8F, 0xBF, 0xA9, 0xF3, 0xE2, 0xDB, 0xD7, 0x9A, 0xE3, 0x6A, 0x96, 0xB3, + 0x22, 0xB8, 0x59, 0x34, 0x58, 0x0A, 0xD6, 0x86, 0x04, 0x12, 0x4B, 0xC2, 0x26, 0xD3, 0x18, 0x87, + 0xFC, 0x99, 0xE9, 0x41, 0xEA, 0x8E, 0xEF, 0x93, 0x25, 0x8F, 0x6B, 0x61, 0x31, 0x34, 0x97, 0xBD, + 0xF5, 0xAD, 0x55, 0x31, 0x71, 0x32, 0x98, 0x48, 0x96, 0x8F, 0x39, 0x8F, 0x6B, 0xC1, 0x28, 0x6B, + 0xFA, 0x5E, 0x40, 0x84, 0xE1, 0xED, 0x07, 0x2B, 0x45, 0x39, 0x03, 0xB9, 0x82, 0x0C, 0xC1, 0x22, + 0x59, 0x46, 0xBC, 0xAE, 0x49, 0x53, 0x56, 0x23, 0xC9, 0xD0, 0x28, 0x96, 0x0B, 0xA5, 0x71, 0x3E, + 0x5D, 0x2B, 0x4C, 0xE2, 0x2C, 0x55, 0x67, 0xBF, 0xB3, 0xC3, 0xE0, 0xB1, 0x39, 0x76, 0x86, 0x8B, + 0x05, 0x83, 0x47, 0x67, 0x87, 0x33, 0x7F, 0x6E, 0x0D, 0x1E, 0xFD, 0x2F, 0x5E, 0x72, 0x0B, 0x89, + 0x42, 0x10, 0x01, 0x00 +}; + diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/camera_pins.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/camera_pins.h new file mode 100644 index 0000000..e1be287 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.1_CameraWebServer/camera_pins.h @@ -0,0 +1,273 @@ + +#if defined(CAMERA_MODEL_WROVER_KIT) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 21 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 19 +#define Y4_GPIO_NUM 18 +#define Y3_GPIO_NUM 5 +#define Y2_GPIO_NUM 4 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_ESP_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 37 +#define Y7_GPIO_NUM 38 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 35 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 13 +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_M5STACK_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_WIDE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_ESP32CAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_UNITCAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_AI_THINKER) +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_TTGO_T_JOURNAL) +#define PWDN_GPIO_NUM 0 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + + +#elif defined(CAMERA_MODEL_ESP32_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM 33 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 19 +#define Y7_GPIO_NUM 21 +#define Y6_GPIO_NUM 39 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 13 +#else +#define Y5_GPIO_NUM 35 +#endif +#define Y4_GPIO_NUM 14 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 35 +#else +#define Y3_GPIO_NUM 13 +#endif +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_ESP32S3_CAM_LCD) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 40 +#define SIOD_GPIO_NUM 17 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 39 +#define Y8_GPIO_NUM 41 +#define Y7_GPIO_NUM 42 +#define Y6_GPIO_NUM 12 +#define Y5_GPIO_NUM 3 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 47 +#define Y2_GPIO_NUM 13 +#define VSYNC_GPIO_NUM 21 +#define HREF_GPIO_NUM 38 +#define PCLK_GPIO_NUM 11 + +#elif defined(CAMERA_MODEL_ESP32S2_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 1 +#define RESET_GPIO_NUM 2 +#define XCLK_GPIO_NUM 42 +#define SIOD_GPIO_NUM 41 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 16 +#define Y8_GPIO_NUM 39 +#define Y7_GPIO_NUM 40 +#define Y6_GPIO_NUM 15 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 12 +#else +#define Y5_GPIO_NUM 13 +#endif +#define Y4_GPIO_NUM 5 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 13 +#else +#define Y3_GPIO_NUM 12 +#endif +#define Y2_GPIO_NUM 14 +#define VSYNC_GPIO_NUM 38 +#define HREF_GPIO_NUM 4 +#define PCLK_GPIO_NUM 3 + +#elif defined(CAMERA_MODEL_ESP32S3_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 15 +#define SIOD_GPIO_NUM 4 +#define SIOC_GPIO_NUM 5 + +#define Y2_GPIO_NUM 11 +#define Y3_GPIO_NUM 9 +#define Y4_GPIO_NUM 8 +#define Y5_GPIO_NUM 10 +#define Y6_GPIO_NUM 12 +#define Y7_GPIO_NUM 18 +#define Y8_GPIO_NUM 17 +#define Y9_GPIO_NUM 16 + +#define VSYNC_GPIO_NUM 6 +#define HREF_GPIO_NUM 7 +#define PCLK_GPIO_NUM 13 + +#else +#error "Camera model not selected" +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/Sketch_07.2_As_VideoWebServer.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/Sketch_07.2_As_VideoWebServer.ino new file mode 100644 index 0000000..3a4962d --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/Sketch_07.2_As_VideoWebServer.ino @@ -0,0 +1,106 @@ +/********************************************************************** + Filename : Video Web Server + Description : The camera images captured by the ESP32S3 are displayed on the web page. + Auther : www.freenove.com + Modification: 2022/11/01 +**********************************************************************/ +#include "esp_camera.h" +#include +#include "sd_read_write.h" + +// Select camera model +#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM + +#include "camera_pins.h" + +const char* ssid = "********"; //input your wifi name +const char* password = "********"; //input your wifi passwords + +void cameraInit(void); +void startCameraServer(); + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + Serial.println(); + + cameraInit(); + sdmmcInit(); + removeDir(SD_MMC, "/video"); + createDir(SD_MMC, "/video"); + + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(""); + Serial.println("WiFi connected"); + + startCameraServer(); + + Serial.print("Camera Ready! Use 'http://"); + Serial.print(WiFi.localIP()); + Serial.println("' to connect"); +} + +void loop() { + // put your main code here, to run repeatedly: + delay(10000); +} + +void cameraInit(void){ + camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sccb_sda = SIOD_GPIO_NUM; + config.pin_sccb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = 20000000; + config.frame_size = FRAMESIZE_UXGA; + config.pixel_format = PIXFORMAT_JPEG; // for streaming + config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; + config.fb_location = CAMERA_FB_IN_PSRAM; + config.jpeg_quality = 12; + config.fb_count = 1; + + // if PSRAM IC present, init with UXGA resolution and higher JPEG quality + // for larger pre-allocated frame buffer. + if(psramFound()){ + config.jpeg_quality = 10; + config.fb_count = 2; + config.grab_mode = CAMERA_GRAB_LATEST; + } else { + // Limit the frame size when PSRAM is not available + config.frame_size = FRAMESIZE_SVGA; + config.fb_location = CAMERA_FB_IN_DRAM; + } + + // camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + return; + } + + sensor_t * s = esp_camera_sensor_get(); + // initial sensors are flipped vertically and colors are a bit saturated + s->set_vflip(s, 1); // flip it back + s->set_brightness(s, 1); // up the brightness just a bit + s->set_saturation(s, 0); // lower the saturation +} + diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/app_httpd.cpp b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/app_httpd.cpp new file mode 100644 index 0000000..695cc24 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/app_httpd.cpp @@ -0,0 +1,335 @@ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "esp_http_server.h" +#include "esp_timer.h" +#include "esp_camera.h" +#include "img_converters.h" +#include "fb_gfx.h" +#include "driver/ledc.h" + +#include "sdkconfig.h" + +#include "Arduino.h" +#include "sd_read_write.h" + +#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) +#include "esp32-hal-log.h" +#define TAG "" +#else +#include "esp_log.h" +static const char *TAG = "camera_httpd"; +#endif + +typedef struct +{ + httpd_req_t *req; + size_t len; +} jpg_chunking_t; + +#define PART_BOUNDARY "123456789000000000000987654321" +static const char *_STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY; +static const char *_STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n"; +static const char *_STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\nX-Timestamp: %d.%06d\r\n\r\n"; + +httpd_handle_t stream_httpd = NULL; +httpd_handle_t camera_httpd = NULL; + +static int button_state = 1; + +typedef struct +{ + size_t size; // number of values used for filtering + size_t index; // current value index + size_t count; // value count + int sum; + int *values; // array to be filled with values +} ra_filter_t; + +static ra_filter_t ra_filter; + +static ra_filter_t *ra_filter_init(ra_filter_t *filter, size_t sample_size) +{ + memset(filter, 0, sizeof(ra_filter_t)); + + filter->values = (int *)malloc(sample_size * sizeof(int)); + if (!filter->values) + { + return NULL; + } + memset(filter->values, 0, sample_size * sizeof(int)); + + filter->size = sample_size; + return filter; +} + +static int ra_filter_run(ra_filter_t *filter, int value) +{ + if (!filter->values) + { + return value; + } + filter->sum -= filter->values[filter->index]; + filter->values[filter->index] = value; + filter->sum += filter->values[filter->index]; + filter->index++; + filter->index = filter->index % filter->size; + if (filter->count < filter->size) + { + filter->count++; + } + return filter->sum / filter->count; +} + +static esp_err_t stream_handler(httpd_req_t *req) +{ + camera_fb_t *fb = NULL; + struct timeval _timestamp; + esp_err_t res = ESP_OK; + size_t _jpg_buf_len = 0; + uint8_t *_jpg_buf = NULL; + char *part_buf[128]; + + static int64_t last_frame = 0; + if (!last_frame) + { + last_frame = esp_timer_get_time(); + } + + res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); + if (res != ESP_OK) + { + return res; + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + httpd_resp_set_hdr(req, "X-Framerate", "60"); + + while (true) + { + fb = esp_camera_fb_get(); + if (!fb) + { + ESP_LOGE(TAG, "Camera capture failed"); + res = ESP_FAIL; + } + else + { + _timestamp.tv_sec = fb->timestamp.tv_sec; + _timestamp.tv_usec = fb->timestamp.tv_usec; + if (fb->format != PIXFORMAT_JPEG) + { + bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); + esp_camera_fb_return(fb); + fb = NULL; + if (!jpeg_converted) + { + ESP_LOGE(TAG, "JPEG compression failed"); + res = ESP_FAIL; + } + } + else + { + _jpg_buf_len = fb->len; + _jpg_buf = fb->buf; + } + } + if (res == ESP_OK) + { + res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); + } + if (res == ESP_OK) + { + size_t hlen = snprintf((char *)part_buf, 128, _STREAM_PART, _jpg_buf_len, _timestamp.tv_sec, _timestamp.tv_usec); + res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); + } + if (res == ESP_OK) + { + res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); + } + if (fb) + { + esp_camera_fb_return(fb); + fb = NULL; + _jpg_buf = NULL; + } + else if (_jpg_buf) + { + free(_jpg_buf); + _jpg_buf = NULL; + } + if (res != ESP_OK) + { + ESP_LOGI(TAG, "res != ESP_OK : %d , break!", res); + break; + } + int64_t fr_end = esp_timer_get_time(); + + int64_t frame_time = fr_end - last_frame; + last_frame = fr_end; + frame_time /= 1000; + uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time); + /* + ESP_LOGI(TAG, "MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps)", + (uint32_t)(_jpg_buf_len), + (uint32_t)frame_time, 1000.0 / (uint32_t)frame_time, + avg_frame_time, 1000.0 / avg_frame_time); + */ + } + ESP_LOGI(TAG, "Stream exit!"); + last_frame = 0; + return res; +} + +static esp_err_t parse_get(httpd_req_t *req, char **obuf) +{ + char *buf = NULL; + size_t buf_len = 0; + + buf_len = httpd_req_get_url_query_len(req) + 1; + if (buf_len > 1) + { + buf = (char *)malloc(buf_len); + if (!buf) + { + httpd_resp_send_500(req); + return ESP_FAIL; + } + if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) + { + *obuf = buf; + return ESP_OK; + } + free(buf); + } + httpd_resp_send_404(req); + return ESP_FAIL; +} +const char index_web[]=R"rawliteral( + + + Video Streaming Demonstration + + +

Video Streaming Demonstration

+

+ +

+ + +)rawliteral"; + + +static esp_err_t index_handler(httpd_req_t *req) +{ + esp_err_t err; + err = httpd_resp_set_type(req, "text/html"); + sensor_t *s = esp_camera_sensor_get(); + if (s != NULL) + { + err = httpd_resp_send(req, (const char *)index_web, sizeof(index_web)); + } + else + { + ESP_LOGE(TAG, "Camera sensor not found"); + err = httpd_resp_send_500(req); + } + return err; +} + +static esp_err_t button_handler(httpd_req_t *req) +{ + esp_err_t err; + camera_fb_t * fb = NULL; + fb = esp_camera_fb_get(); + if (!fb) + { + ESP_LOGE(TAG, "Camera capture failed"); + err = ESP_FAIL; + } + else + { + String video = "/video"; + int jpgCount=readFileNum(SD_MMC, video.c_str()); + String path = video + "/" + String(jpgCount) +".jpg"; + writejpg(SD_MMC, path.c_str(), fb->buf, fb->len); + esp_camera_fb_return(fb); + fb = NULL; + err=ESP_OK; + } + return err; +} + +void startCameraServer() +{ + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + config.max_uri_handlers = 16; + + httpd_uri_t index_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = index_handler, + .user_ctx = NULL}; + + httpd_uri_t stream_uri = { + .uri = "/stream", + .method = HTTP_GET, + .handler = stream_handler, + .user_ctx = NULL}; + + httpd_uri_t button_uri = { + .uri = "/button", + .method = HTTP_POST, + .handler = button_handler, + .user_ctx = NULL}; + + ra_filter_init(&ra_filter, 20); + + ESP_LOGI(TAG, "Starting web server on port: '%d'", config.server_port); + if (httpd_start(&camera_httpd, &config) == ESP_OK) + { + httpd_register_uri_handler(camera_httpd, &index_uri); + httpd_register_uri_handler(camera_httpd, &button_uri); + // httpd_register_uri_handler(camera_httpd, &stream_uri); + } + + config.server_port += 1; + config.ctrl_port += 1; + ESP_LOGI(TAG, "Starting stream server on port: '%d'", config.server_port); + if (httpd_start(&stream_httpd, &config) == ESP_OK) + { + httpd_register_uri_handler(stream_httpd, &stream_uri); + } +} + + + + + + + + + + + + + + + diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/camera_pins.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/camera_pins.h new file mode 100644 index 0000000..e1be287 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/camera_pins.h @@ -0,0 +1,273 @@ + +#if defined(CAMERA_MODEL_WROVER_KIT) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 21 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 19 +#define Y4_GPIO_NUM 18 +#define Y3_GPIO_NUM 5 +#define Y2_GPIO_NUM 4 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_ESP_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 37 +#define Y7_GPIO_NUM 38 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 35 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 13 +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_M5STACK_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_WIDE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_ESP32CAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_UNITCAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_AI_THINKER) +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_TTGO_T_JOURNAL) +#define PWDN_GPIO_NUM 0 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + + +#elif defined(CAMERA_MODEL_ESP32_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM 33 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 19 +#define Y7_GPIO_NUM 21 +#define Y6_GPIO_NUM 39 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 13 +#else +#define Y5_GPIO_NUM 35 +#endif +#define Y4_GPIO_NUM 14 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 35 +#else +#define Y3_GPIO_NUM 13 +#endif +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_ESP32S3_CAM_LCD) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 40 +#define SIOD_GPIO_NUM 17 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 39 +#define Y8_GPIO_NUM 41 +#define Y7_GPIO_NUM 42 +#define Y6_GPIO_NUM 12 +#define Y5_GPIO_NUM 3 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 47 +#define Y2_GPIO_NUM 13 +#define VSYNC_GPIO_NUM 21 +#define HREF_GPIO_NUM 38 +#define PCLK_GPIO_NUM 11 + +#elif defined(CAMERA_MODEL_ESP32S2_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 1 +#define RESET_GPIO_NUM 2 +#define XCLK_GPIO_NUM 42 +#define SIOD_GPIO_NUM 41 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 16 +#define Y8_GPIO_NUM 39 +#define Y7_GPIO_NUM 40 +#define Y6_GPIO_NUM 15 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 12 +#else +#define Y5_GPIO_NUM 13 +#endif +#define Y4_GPIO_NUM 5 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 13 +#else +#define Y3_GPIO_NUM 12 +#endif +#define Y2_GPIO_NUM 14 +#define VSYNC_GPIO_NUM 38 +#define HREF_GPIO_NUM 4 +#define PCLK_GPIO_NUM 3 + +#elif defined(CAMERA_MODEL_ESP32S3_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 15 +#define SIOD_GPIO_NUM 4 +#define SIOC_GPIO_NUM 5 + +#define Y2_GPIO_NUM 11 +#define Y3_GPIO_NUM 9 +#define Y4_GPIO_NUM 8 +#define Y5_GPIO_NUM 10 +#define Y6_GPIO_NUM 12 +#define Y7_GPIO_NUM 18 +#define Y8_GPIO_NUM 17 +#define Y9_GPIO_NUM 16 + +#define VSYNC_GPIO_NUM 6 +#define HREF_GPIO_NUM 7 +#define PCLK_GPIO_NUM 13 + +#else +#error "Camera model not selected" +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/sd_read_write.cpp b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/sd_read_write.cpp new file mode 100644 index 0000000..4022aca --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/sd_read_write.cpp @@ -0,0 +1,211 @@ +#include "sd_read_write.h" + +void sdmmcInit(void){ + SD_MMC.setPins(SD_MMC_CLK, SD_MMC_CMD, SD_MMC_D0); + if (!SD_MMC.begin("/sdcard", true, true, SDMMC_FREQ_DEFAULT, 5)) { + Serial.println("Card Mount Failed"); + return; + } + uint8_t cardType = SD_MMC.cardType(); + if(cardType == CARD_NONE){ + Serial.println("No SD_MMC card attached"); + return; + } + Serial.print("SD_MMC Card Type: "); + if(cardType == CARD_MMC){ + Serial.println("MMC"); + } else if(cardType == CARD_SD){ + Serial.println("SDSC"); + } else if(cardType == CARD_SDHC){ + Serial.println("SDHC"); + } else { + Serial.println("UNKNOWN"); + } + uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024); + Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize); + Serial.printf("Total space: %lluMB\r\n", SD_MMC.totalBytes() / (1024 * 1024)); + Serial.printf("Used space: %lluMB\r\n", SD_MMC.usedBytes() / (1024 * 1024)); +} + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + Serial.println(file.name()); + if(levels){ + listDir(fs, file.path(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print(" SIZE: "); + Serial.println(file.size()); + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("mkdir failed"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\n", path); + + File file = fs.open(path); + if(!file){ + Serial.println("Failed to open file for reading"); + return; + } + + Serial.print("Read from file: "); + while(file.available()){ + Serial.write(file.read()); + } +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("File written"); + } else { + Serial.println("Write failed"); + } +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("Failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("Message appended"); + } else { + Serial.println("Append failed"); + } +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("File renamed"); + } else { + Serial.println("Rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\n", path); + if(fs.remove(path)){ + Serial.println("File deleted"); + } else { + Serial.println("Delete failed"); + } +} + +void testFileIO(fs::FS &fs, const char * path){ + File file = fs.open(path); + static uint8_t buf[512]; + size_t len = 0; + uint32_t start = millis(); + uint32_t end = start; + if(file){ + len = file.size(); + size_t flen = len; + start = millis(); + while(len){ + size_t toRead = len; + if(toRead > 512){ + toRead = 512; + } + file.read(buf, toRead); + len -= toRead; + } + end = millis() - start; + Serial.printf("%u bytes read for %u ms\r\n", flen, end); + file.close(); + } else { + Serial.println("Failed to open file for reading"); + } + + file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + + size_t i; + start = millis(); + for(i=0; i<2048; i++){ + file.write(buf, 512); + } + end = millis() - start; + Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end); + file.close(); +} + +void writejpg(fs::FS &fs, const char * path, const uint8_t *buf, size_t size){ + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + file.write(buf, size); + Serial.printf("Saved file to path: %s\r\n", path); +} + +int readFileNum(fs::FS &fs, const char * dirname){ + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return -1; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return -1; + } + + File file = root.openNextFile(); + int num=0; + while(file){ + file = root.openNextFile(); + num++; + } + return num; +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/sd_read_write.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/sd_read_write.h new file mode 100644 index 0000000..9486d5d --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.2_As_VideoWebServer/sd_read_write.h @@ -0,0 +1,27 @@ +#ifndef __SD_READ_WRITE_H +#define __SD_READ_WRITE_H + +#include "Arduino.h" +#include "FS.h" +#include "SD_MMC.h" + +#define SD_MMC_CMD 38 //Please do not modify it. +#define SD_MMC_CLK 39 //Please do not modify it. +#define SD_MMC_D0 40 //Please do not modify it. + +void sdmmcInit(void); + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels); +void createDir(fs::FS &fs, const char * path); +void removeDir(fs::FS &fs, const char * path); +void readFile(fs::FS &fs, const char * path); +void writeFile(fs::FS &fs, const char * path, const char * message); +void appendFile(fs::FS &fs, const char * path, const char * message); +void renameFile(fs::FS &fs, const char * path1, const char * path2); +void deleteFile(fs::FS &fs, const char * path); +void testFileIO(fs::FS &fs, const char * path); + +void writejpg(fs::FS &fs, const char * path, const uint8_t *buf, size_t size); +int readFileNum(fs::FS &fs, const char * dirname); + +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/Sketch_07.3_Camera_SDcard.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/Sketch_07.3_Camera_SDcard.ino new file mode 100644 index 0000000..919e27f --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/Sketch_07.3_Camera_SDcard.ino @@ -0,0 +1,114 @@ +/********************************************************************** + Filename : Camera and SDcard + Description : Use the onboard buttons to take photo and save them to an SD card. + Auther : www.freenove.com + Modification: 2022/11/02 +**********************************************************************/ +#include "esp_camera.h" +#define CAMERA_MODEL_ESP32S3_EYE +#include "camera_pins.h" +#include "ws2812.h" +#include "sd_read_write.h" + +#define BUTTON_PIN 0 + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(false); + Serial.println(); + pinMode(BUTTON_PIN, INPUT_PULLUP); + ws2812Init(); + sdmmcInit(); + //removeDir(SD_MMC, "/camera"); + createDir(SD_MMC, "/camera"); + listDir(SD_MMC, "/camera", 0); + if(cameraSetup()==1){ + ws2812SetColor(2); + } + else{ + ws2812SetColor(1); + return; + } +} + +void loop() { + if(digitalRead(BUTTON_PIN)==LOW){ + delay(20); + if(digitalRead(BUTTON_PIN)==LOW){ + ws2812SetColor(3); + while(digitalRead(BUTTON_PIN)==LOW); + camera_fb_t * fb = NULL; + fb = esp_camera_fb_get(); + if (fb != NULL) { + int photo_index = readFileNum(SD_MMC, "/camera"); + if(photo_index!=-1) + { + String path = "/camera/" + String(photo_index) +".jpg"; + writejpg(SD_MMC, path.c_str(), fb->buf, fb->len); + } + esp_camera_fb_return(fb); + } + else { + Serial.println("Camera capture failed."); + } + ws2812SetColor(2); + } + } +} + +int cameraSetup(void) { + camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sccb_sda = SIOD_GPIO_NUM; + config.pin_sccb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = 20000000; + config.frame_size = FRAMESIZE_UXGA; + config.pixel_format = PIXFORMAT_JPEG; // for streaming + config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; + config.fb_location = CAMERA_FB_IN_PSRAM; + config.jpeg_quality = 12; + config.fb_count = 1; + + // if PSRAM IC present, init with UXGA resolution and higher JPEG quality + // for larger pre-allocated frame buffer. + if(psramFound()){ + config.jpeg_quality = 10; + config.fb_count = 2; + config.grab_mode = CAMERA_GRAB_LATEST; + } else { + // Limit the frame size when PSRAM is not available + config.frame_size = FRAMESIZE_SVGA; + config.fb_location = CAMERA_FB_IN_DRAM; + } + + // camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + return 0; + } + + sensor_t * s = esp_camera_sensor_get(); + // initial sensors are flipped vertically and colors are a bit saturated + s->set_vflip(s, 1); // flip it back + s->set_brightness(s, 1); // up the brightness just a bit + s->set_saturation(s, 0); // lower the saturation + + Serial.println("Camera configuration complete!"); + return 1; +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/camera_pins.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/camera_pins.h new file mode 100644 index 0000000..e1be287 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/camera_pins.h @@ -0,0 +1,273 @@ + +#if defined(CAMERA_MODEL_WROVER_KIT) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 21 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 19 +#define Y4_GPIO_NUM 18 +#define Y3_GPIO_NUM 5 +#define Y2_GPIO_NUM 4 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_ESP_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 37 +#define Y7_GPIO_NUM 38 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 35 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 13 +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_M5STACK_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_WIDE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_ESP32CAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_UNITCAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_AI_THINKER) +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_TTGO_T_JOURNAL) +#define PWDN_GPIO_NUM 0 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + + +#elif defined(CAMERA_MODEL_ESP32_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM 33 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 19 +#define Y7_GPIO_NUM 21 +#define Y6_GPIO_NUM 39 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 13 +#else +#define Y5_GPIO_NUM 35 +#endif +#define Y4_GPIO_NUM 14 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 35 +#else +#define Y3_GPIO_NUM 13 +#endif +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_ESP32S3_CAM_LCD) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 40 +#define SIOD_GPIO_NUM 17 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 39 +#define Y8_GPIO_NUM 41 +#define Y7_GPIO_NUM 42 +#define Y6_GPIO_NUM 12 +#define Y5_GPIO_NUM 3 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 47 +#define Y2_GPIO_NUM 13 +#define VSYNC_GPIO_NUM 21 +#define HREF_GPIO_NUM 38 +#define PCLK_GPIO_NUM 11 + +#elif defined(CAMERA_MODEL_ESP32S2_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 1 +#define RESET_GPIO_NUM 2 +#define XCLK_GPIO_NUM 42 +#define SIOD_GPIO_NUM 41 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 16 +#define Y8_GPIO_NUM 39 +#define Y7_GPIO_NUM 40 +#define Y6_GPIO_NUM 15 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 12 +#else +#define Y5_GPIO_NUM 13 +#endif +#define Y4_GPIO_NUM 5 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 13 +#else +#define Y3_GPIO_NUM 12 +#endif +#define Y2_GPIO_NUM 14 +#define VSYNC_GPIO_NUM 38 +#define HREF_GPIO_NUM 4 +#define PCLK_GPIO_NUM 3 + +#elif defined(CAMERA_MODEL_ESP32S3_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 15 +#define SIOD_GPIO_NUM 4 +#define SIOC_GPIO_NUM 5 + +#define Y2_GPIO_NUM 11 +#define Y3_GPIO_NUM 9 +#define Y4_GPIO_NUM 8 +#define Y5_GPIO_NUM 10 +#define Y6_GPIO_NUM 12 +#define Y7_GPIO_NUM 18 +#define Y8_GPIO_NUM 17 +#define Y9_GPIO_NUM 16 + +#define VSYNC_GPIO_NUM 6 +#define HREF_GPIO_NUM 7 +#define PCLK_GPIO_NUM 13 + +#else +#error "Camera model not selected" +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/sd_read_write.cpp b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/sd_read_write.cpp new file mode 100644 index 0000000..4022aca --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/sd_read_write.cpp @@ -0,0 +1,211 @@ +#include "sd_read_write.h" + +void sdmmcInit(void){ + SD_MMC.setPins(SD_MMC_CLK, SD_MMC_CMD, SD_MMC_D0); + if (!SD_MMC.begin("/sdcard", true, true, SDMMC_FREQ_DEFAULT, 5)) { + Serial.println("Card Mount Failed"); + return; + } + uint8_t cardType = SD_MMC.cardType(); + if(cardType == CARD_NONE){ + Serial.println("No SD_MMC card attached"); + return; + } + Serial.print("SD_MMC Card Type: "); + if(cardType == CARD_MMC){ + Serial.println("MMC"); + } else if(cardType == CARD_SD){ + Serial.println("SDSC"); + } else if(cardType == CARD_SDHC){ + Serial.println("SDHC"); + } else { + Serial.println("UNKNOWN"); + } + uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024); + Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize); + Serial.printf("Total space: %lluMB\r\n", SD_MMC.totalBytes() / (1024 * 1024)); + Serial.printf("Used space: %lluMB\r\n", SD_MMC.usedBytes() / (1024 * 1024)); +} + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + Serial.println(file.name()); + if(levels){ + listDir(fs, file.path(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print(" SIZE: "); + Serial.println(file.size()); + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("mkdir failed"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\n", path); + + File file = fs.open(path); + if(!file){ + Serial.println("Failed to open file for reading"); + return; + } + + Serial.print("Read from file: "); + while(file.available()){ + Serial.write(file.read()); + } +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("File written"); + } else { + Serial.println("Write failed"); + } +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("Failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("Message appended"); + } else { + Serial.println("Append failed"); + } +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("File renamed"); + } else { + Serial.println("Rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\n", path); + if(fs.remove(path)){ + Serial.println("File deleted"); + } else { + Serial.println("Delete failed"); + } +} + +void testFileIO(fs::FS &fs, const char * path){ + File file = fs.open(path); + static uint8_t buf[512]; + size_t len = 0; + uint32_t start = millis(); + uint32_t end = start; + if(file){ + len = file.size(); + size_t flen = len; + start = millis(); + while(len){ + size_t toRead = len; + if(toRead > 512){ + toRead = 512; + } + file.read(buf, toRead); + len -= toRead; + } + end = millis() - start; + Serial.printf("%u bytes read for %u ms\r\n", flen, end); + file.close(); + } else { + Serial.println("Failed to open file for reading"); + } + + file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + + size_t i; + start = millis(); + for(i=0; i<2048; i++){ + file.write(buf, 512); + } + end = millis() - start; + Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end); + file.close(); +} + +void writejpg(fs::FS &fs, const char * path, const uint8_t *buf, size_t size){ + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + file.write(buf, size); + Serial.printf("Saved file to path: %s\r\n", path); +} + +int readFileNum(fs::FS &fs, const char * dirname){ + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return -1; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return -1; + } + + File file = root.openNextFile(); + int num=0; + while(file){ + file = root.openNextFile(); + num++; + } + return num; +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/sd_read_write.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/sd_read_write.h new file mode 100644 index 0000000..9486d5d --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/sd_read_write.h @@ -0,0 +1,27 @@ +#ifndef __SD_READ_WRITE_H +#define __SD_READ_WRITE_H + +#include "Arduino.h" +#include "FS.h" +#include "SD_MMC.h" + +#define SD_MMC_CMD 38 //Please do not modify it. +#define SD_MMC_CLK 39 //Please do not modify it. +#define SD_MMC_D0 40 //Please do not modify it. + +void sdmmcInit(void); + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels); +void createDir(fs::FS &fs, const char * path); +void removeDir(fs::FS &fs, const char * path); +void readFile(fs::FS &fs, const char * path); +void writeFile(fs::FS &fs, const char * path, const char * message); +void appendFile(fs::FS &fs, const char * path, const char * message); +void renameFile(fs::FS &fs, const char * path1, const char * path2); +void deleteFile(fs::FS &fs, const char * path); +void testFileIO(fs::FS &fs, const char * path); + +void writejpg(fs::FS &fs, const char * path, const uint8_t *buf, size_t size); +int readFileNum(fs::FS &fs, const char * dirname); + +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/ws2812.cpp b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/ws2812.cpp new file mode 100644 index 0000000..7ffcd95 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/ws2812.cpp @@ -0,0 +1,35 @@ + +#include "ws2812.h" + +Freenove_ESP32_WS2812 strip = Freenove_ESP32_WS2812(1, WS2812_PIN, 1, TYPE_GRB); + +void ws2812Init(void) +{ + strip.begin(); + strip.setBrightness(10); + ws2812SetColor(0); +} +void ws2812SetColor(int color) +{ + if(color==0) + { + strip.setLedColorData(0, 0, 0, 0); + } + else if(color==1) + { + strip.setLedColorData(0, 255, 0, 0); + } + else if(color==2) + { + strip.setLedColorData(0, 0, 255, 0); + } + else if(color==3) + { + strip.setLedColorData(0, 0, 0, 255); + } + strip.show(); +} + + + + diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/ws2812.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/ws2812.h new file mode 100644 index 0000000..91f9e41 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_07.3_Camera_SDcard/ws2812.h @@ -0,0 +1,12 @@ +#ifndef __WS2812_H +#define __WS2812_H + +#include "Freenove_WS2812_Lib_for_ESP32.h" + +#define WS2812_PIN 48 + +void ws2812Init(void); +void ws2812SetColor(int color); + +#endif + diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_08.1_CameraTcpServer/Sketch_08.1_CameraTcpServer.ino b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_08.1_CameraTcpServer/Sketch_08.1_CameraTcpServer.ino new file mode 100644 index 0000000..166cd62 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_08.1_CameraTcpServer/Sketch_08.1_CameraTcpServer.ino @@ -0,0 +1,182 @@ +/********************************************************************** + Filename : Camera Tcp Serrver + Description : Users use Freenove's APP to view images from ESP32S3's camera + Auther : www.freenove.com + Modification: 2024/07/01 +**********************************************************************/ +#include "esp_camera.h" +#include +#include +#include + +#define CAMERA_MODEL_ESP32S3_EYE +#include "camera_pins.h" +#define LED_BUILT_IN 2 + +const char* ssid_Router = "********"; +const char* password_Router = "********"; +const char *ssid_AP = "********"; +const char *password_AP = "********"; + +WiFiServer server_Cmd(5000); +WiFiServer server_Camera(8000); +extern TaskHandle_t loopTaskHandle; + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(false); + Serial.println(); + pinMode(LED_BUILT_IN, OUTPUT); + cameraSetup(); + + WiFi.softAP(ssid_AP, password_AP); + IPAddress myIP = WiFi.softAPIP(); + Serial.print("AP IP address: "); + Serial.println(myIP); + server_Camera.begin(8000); + server_Cmd.begin(5000); + ///////////////////////////////////////////////////// + WiFi.begin(ssid_Router, password_Router); + Serial.print("Connecting "); + Serial.print(ssid_Router); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + while (WiFi.STA.hasIP() != true) { + Serial.print("."); + delay(500); + } + Serial.println(""); + Serial.println("WiFi connected"); + ///////////////////////////////////////////////////// + Serial.print("Camera Ready! Use '"); + Serial.print(WiFi.softAPIP()); + Serial.print(" or "); + Serial.print(WiFi.localIP()); + Serial.println("' to connect in Freenove app."); + + disableCore0WDT(); + xTaskCreateUniversal(loopTask_Cmd, "loopTask_Cmd", 8192, NULL, 1, &loopTaskHandle, 0); //loopTask_Cmd uses core 0. + xTaskCreateUniversal(loopTask_Blink, "loopTask_Blink", 8192, NULL, 1, &loopTaskHandle, 0);//loopTask_Blink uses core 0. +} +//task loop uses core 1. +void loop() { + WiFiClient client = server_Camera.accept(); // listen for incoming clients + if (client) { // if you get a client, + Serial.println("Camera Server connected to a client.");// print a message out the serial port + String currentLine = ""; // make a String to hold incoming data from the client + while (client.connected()) { // loop while the client's connected + camera_fb_t * fb = NULL; + while (client.connected()) { + fb = esp_camera_fb_get(); + if (fb != NULL) { + uint8_t slen[4]; + slen[0] = fb->len >> 0; + slen[1] = fb->len >> 8; + slen[2] = fb->len >> 16; + slen[3] = fb->len >> 24; + client.write(slen, 4); + client.write(fb->buf, fb->len); + esp_camera_fb_return(fb); + } + else { + Serial.println("Camera Error"); + } + } + } + // close the connection: + client.stop(); + Serial.println("Camera Client Disconnected."); + } +} + +void loopTask_Cmd(void *pvParameters) { + Serial.println("Task Cmd_Server is starting ... "); + while (1) { + WiFiClient client = server_Cmd.accept(); // listen for incoming clients + if (client) { // if you get a client, + Serial.println("Command Server connected to a client.");// print a message out the serial port + String currentLine = ""; // make a String to hold incoming data from the client + while (client.connected()) { // loop while the client's connected + if (client.available()) { // if there's bytes to read from the client, + char c = client.read(); // read a byte, then + client.write(c); + Serial.write(c); // print it out the serial monitor + if (c == '\n') { // if the byte is a newline character + currentLine = ""; + } + else { + currentLine += c; // add it to the end of the currentLine + } + } + } + // close the connection: + client.stop(); + Serial.println("Command Client Disconnected."); + } + } +} +void loopTask_Blink(void *pvParameters) { + Serial.println("Task Blink is starting ... "); + while (1) { + digitalWrite(LED_BUILT_IN, !digitalRead(LED_BUILT_IN)); + delay(1000); + } +} + +void cameraSetup() { + camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sccb_sda = SIOD_GPIO_NUM; + config.pin_sccb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = 20000000; + config.frame_size = FRAMESIZE_UXGA; + config.pixel_format = PIXFORMAT_JPEG; // for streaming + config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; + config.fb_location = CAMERA_FB_IN_PSRAM; + config.jpeg_quality = 12; + config.fb_count = 1; + + // if PSRAM IC present, init with UXGA resolution and higher JPEG quality + // for larger pre-allocated frame buffer. + if(psramFound()){ + config.jpeg_quality = 10; + config.fb_count = 2; + config.grab_mode = CAMERA_GRAB_LATEST; + } else { + // Limit the frame size when PSRAM is not available + config.frame_size = FRAMESIZE_SVGA; + config.fb_location = CAMERA_FB_IN_DRAM; + } + + // camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + return; + } + + sensor_t * s = esp_camera_sensor_get(); + // initial sensors are flipped vertically and colors are a bit saturated + s->set_vflip(s, 1); // flip it back + s->set_brightness(s, 1); // up the brightness just a bit + s->set_saturation(s, 0); // lower the saturation + + Serial.println("Camera configuration complete!"); +} diff --git a/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_08.1_CameraTcpServer/camera_pins.h b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_08.1_CameraTcpServer/camera_pins.h new file mode 100644 index 0000000..e1be287 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/C/Sketches/Sketch_08.1_CameraTcpServer/camera_pins.h @@ -0,0 +1,273 @@ + +#if defined(CAMERA_MODEL_WROVER_KIT) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 21 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 19 +#define Y4_GPIO_NUM 18 +#define Y3_GPIO_NUM 5 +#define Y2_GPIO_NUM 4 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_ESP_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 37 +#define Y7_GPIO_NUM 38 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 35 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 13 +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_M5STACK_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_WIDE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_ESP32CAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_UNITCAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_AI_THINKER) +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_TTGO_T_JOURNAL) +#define PWDN_GPIO_NUM 0 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + + +#elif defined(CAMERA_MODEL_ESP32_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM 33 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 19 +#define Y7_GPIO_NUM 21 +#define Y6_GPIO_NUM 39 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 13 +#else +#define Y5_GPIO_NUM 35 +#endif +#define Y4_GPIO_NUM 14 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 35 +#else +#define Y3_GPIO_NUM 13 +#endif +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_ESP32S3_CAM_LCD) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 40 +#define SIOD_GPIO_NUM 17 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 39 +#define Y8_GPIO_NUM 41 +#define Y7_GPIO_NUM 42 +#define Y6_GPIO_NUM 12 +#define Y5_GPIO_NUM 3 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 47 +#define Y2_GPIO_NUM 13 +#define VSYNC_GPIO_NUM 21 +#define HREF_GPIO_NUM 38 +#define PCLK_GPIO_NUM 11 + +#elif defined(CAMERA_MODEL_ESP32S2_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 1 +#define RESET_GPIO_NUM 2 +#define XCLK_GPIO_NUM 42 +#define SIOD_GPIO_NUM 41 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 16 +#define Y8_GPIO_NUM 39 +#define Y7_GPIO_NUM 40 +#define Y6_GPIO_NUM 15 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 12 +#else +#define Y5_GPIO_NUM 13 +#endif +#define Y4_GPIO_NUM 5 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 13 +#else +#define Y3_GPIO_NUM 12 +#endif +#define Y2_GPIO_NUM 14 +#define VSYNC_GPIO_NUM 38 +#define HREF_GPIO_NUM 4 +#define PCLK_GPIO_NUM 3 + +#elif defined(CAMERA_MODEL_ESP32S3_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 15 +#define SIOD_GPIO_NUM 4 +#define SIOC_GPIO_NUM 5 + +#define Y2_GPIO_NUM 11 +#define Y3_GPIO_NUM 9 +#define Y4_GPIO_NUM 8 +#define Y5_GPIO_NUM 10 +#define Y6_GPIO_NUM 12 +#define Y7_GPIO_NUM 18 +#define Y8_GPIO_NUM 17 +#define Y9_GPIO_NUM 16 + +#define VSYNC_GPIO_NUM 6 +#define HREF_GPIO_NUM 7 +#define PCLK_GPIO_NUM 13 + +#else +#error "Camera model not selected" +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/Linux/Linux.png b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/Linux.png new file mode 100644 index 0000000..887fcf0 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/Linux.png differ diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux.zip b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux.zip new file mode 100644 index 0000000..f9464a1 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux.zip differ diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/README.md b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/README.md new file mode 100644 index 0000000..55d9984 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/README.md @@ -0,0 +1,29 @@ +# ch343 linux serial driver + +## Description + +​ USB to UART(s) chip ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103 are fully compliant to the Communications Device Class (CDC) standard, they will work with a standard CDC-ACM driver (CDC - Abstract Control Model). Linux operating systems supply a default CDC-ACM driver that can be used with these USB UART devices. In Linux, this driver file name is cdc-acm. + +​ The CDC-ACM driver has limited capabilities to control specific devices. This generic driver does not have any knowledge about specific device protocols. Because of this, device manufacturers can create an alternate, or custom driver that is capable of accessing the device specific function sets, such as hardware flow control or GPIO functions. + +​ If you use this VCP driver, please check that the CDC-ACM driver was not installed for the USB UART devices mentioned above. You can use command "ls /dev/ttyACM*" to confirm that, to remove the CDC-ACM driver, use command "rmmod cdc-acm". + +​ This directory contains 2 parts, ch343 driver and gpio testing utility. This driver and application support USB to single serial port chip ch343/ch347/ch9101/ch9102, USB to dual serial ports chip ch342/ch347/ch9103, USB to quad serial ports chip ch344, etc. + +1. Open "Terminal" +2. Switch to "driver" directory +3. Compile the driver using "make", you will see the module "ch343.ko" if successful +4. Type "sudo make load" or "sudo insmod ch343.ko" to load the driver dynamically +5. Type "sudo make unload" or "sudo rmmod ch343.ko" to unload the driver +6. Type "sudo make install" to make the driver work permanently +7. Type "sudo make uninstall" to remove the driver +8. You can refer to the link below to acquire uart application, you can use gcc or Cross-compile with cross-gcc + https://github.com/WCHSoftGroup/tty_uart + +​ Before the driver works, you should make sure that the usb device has been plugged in and is working properly, you can use shell command "lsusb" or "dmesg" to confirm that, USB VID of these devices are [1A86], you can view all IDs from the id table which defined in "ch343.c". + +​ If the device works well, the driver will created tty devices named "ttyCH343USBx" in /dev directory. Operating the device in the /dev directory under Linux requires root permission by default, if users want to access the device in a non root mode, they can create udev rule file related to the device. + +## Note + +​ Any question, you can send feedback to mail: tech@wch.cn \ No newline at end of file diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/Makefile b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/Makefile new file mode 100644 index 0000000..0535ecb --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/Makefile @@ -0,0 +1,22 @@ +ifeq ($(KERNELRELEASE), ) +KERNELDIR := /lib/modules/$(shell uname -r)/build +PWD :=$(shell pwd) +default: + $(MAKE) -C $(KERNELDIR) M=$(PWD) +clean: + rm -rf *.mk .tmp_versions Module.symvers *.mod.c *.o *.ko .*.cmd Module.markers modules.order *.a *.mod +load: + insmod ch343.ko +unload: + rmmod ch343 +install: default + mkdir -p /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial + cp -f ./ch343.ko /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial + echo "ch343\n" >> /etc/modules + depmod -a +uninstall: + rm -rf /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial/ch343.ko + depmod -a +else + obj-m := ch343.o +endif diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/ch343.c b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/ch343.c new file mode 100644 index 0000000..5466302 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/ch343.c @@ -0,0 +1,2000 @@ +/* + * USB serial driver for USB to UART(s) chip ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104, etc. + * + * Copyright (C) 2022 Nanjing Qinheng Microelectronics Co., Ltd. + * Web: http://wch.cn + * Author: WCH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * System required: + * Kernel version beyond 3.4.x + * Update Log: + * V1.0 - initial version + * V1.1 - added support of chip ch344, ch9101 and ch9103 + * V1.2 - added gpio support of chip ch344 + * V1.3 - added support of chip ch347 + * V1.4 - added support of chip ch9104 + * V1.5 - added gpio character device + * - added supports for kernel version beyond 5.14.x + * - removed the gpio ioctl commands + */ + +#define DEBUG +#define VERBOSE_DEBUG + +#undef DEBUG +#undef VERBOSE_DEBUG + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)) +#include +#endif + +#include "ch343.h" + +#define DRIVER_AUTHOR "WCH" +#define DRIVER_DESC "USB serial driver for ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104, etc." +#define VERSION_DESC "V1.5 On 2022.12" + +#define IOCTL_MAGIC 'W' +#define IOCTL_CMD_GETCHIPTYPE _IOR(IOCTL_MAGIC, 0x84, u16) +#define IOCTL_CMD_CTRLIN _IOWR(IOCTL_MAGIC, 0x90, u16) +#define IOCTL_CMD_CTRLOUT _IOW(IOCTL_MAGIC, 0x91, u16) +#define IOCTL_CMD_GICOUNT _IOR(IOCTL_MAGIC, 0x92, u16) + +static struct usb_driver ch343_driver; +static struct tty_driver *ch343_tty_driver; +static struct usb_interface *g_intf; + +static DEFINE_IDR(ch343_minors); +static DEFINE_MUTEX(ch343_minors_lock); + +static void ch343_tty_set_termios(struct tty_struct *tty, struct ktermios *termios_old); + +/* + * Look up an ch343 structure by minor. If found and not disconnected, increment + * its refcount and return it with its mutex held. + */ +static struct ch343 *ch343_get_by_minor(unsigned int minor) +{ + struct ch343 *ch343; + + mutex_lock(&ch343_minors_lock); + ch343 = idr_find(&ch343_minors, minor); + if (ch343) { + mutex_lock(&ch343->mutex); + if (ch343->disconnected) { + mutex_unlock(&ch343->mutex); + ch343 = NULL; + } else { + tty_port_get(&ch343->port); + mutex_unlock(&ch343->mutex); + } + } + mutex_unlock(&ch343_minors_lock); + return ch343; +} + +/* + * Try to find an available minor number and if found, associate it with 'ch343'. + */ +static int ch343_alloc_minor(struct ch343 *ch343) +{ + int minor; + + mutex_lock(&ch343_minors_lock); + minor = idr_alloc(&ch343_minors, ch343, 0, CH343_TTY_MINORS, GFP_KERNEL); + mutex_unlock(&ch343_minors_lock); + + return minor; +} + +/* Release the minor number associated with 'ch343'. */ +static void ch343_release_minor(struct ch343 *ch343) +{ + mutex_lock(&ch343_minors_lock); + idr_remove(&ch343_minors, ch343->minor); + mutex_unlock(&ch343_minors_lock); +} + +/* + * Functions for CH343 control messages. + */ +static int ch343_control_out(struct ch343 *ch343, u8 request, u16 value, u16 index) +{ + int retval; + + retval = usb_autopm_get_interface(ch343->control); + if (retval) + return retval; + + retval = usb_control_msg(ch343->dev, usb_sndctrlpipe(ch343->dev, 0), request, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, value, index, NULL, 0, DEFAULT_TIMEOUT); + + usb_autopm_put_interface(ch343->control); + + return retval; +} + +static int ch343_control_in(struct ch343 *ch343, u8 request, u16 value, u16 index, char *buf, unsigned bufsize) +{ + int retval; + + retval = usb_autopm_get_interface(ch343->control); + if (retval) + return retval; + + retval = + usb_control_msg(ch343->dev, usb_rcvctrlpipe(ch343->dev, 0), request, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, value, index, buf, bufsize, DEFAULT_TIMEOUT); + + usb_autopm_put_interface(ch343->control); + + return retval; +} + +static int ch343_control_msg_out(struct ch343 *ch343, u8 request, u8 requesttype, u16 value, u16 index, void *buf, + unsigned bufsize) +{ + int retval; + char *buffer; + + buffer = kmalloc(bufsize, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + retval = copy_from_user(buffer, (char __user *)buf, bufsize); + if (retval) + goto out; + + retval = usb_autopm_get_interface(ch343->control); + if (retval) + goto out; + + retval = usb_control_msg(ch343->dev, usb_sndctrlpipe(ch343->dev, 0), request, requesttype, value, index, buf, + bufsize, DEFAULT_TIMEOUT); + + usb_autopm_put_interface(ch343->control); + +out: + kfree(buffer); + return retval; +} + +static int ch343_control_msg_in(struct ch343 *ch343, u8 request, u8 requesttype, u16 value, u16 index, void *buf, + unsigned bufsize) +{ + int retval; + char *buffer; + + buffer = kmalloc(bufsize, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + retval = usb_autopm_get_interface(ch343->control); + if (retval) + goto out; + + retval = usb_control_msg(ch343->dev, usb_rcvctrlpipe(ch343->dev, 0), request, requesttype, value, index, buffer, + bufsize, DEFAULT_TIMEOUT); + if (retval > 0) { + if (copy_to_user((char __user *)buf, buffer, retval)) { + retval = -EFAULT; + } + } + + usb_autopm_put_interface(ch343->control); + +out: + kfree(buffer); + return retval; +} + +static inline int ch343_set_control(struct ch343 *ch343, int control) +{ + if (ch343->iface <= 1) + return ch343_control_out(ch343, CMD_C2 + ch343->iface, ~control, 0x0000); + else if (ch343->iface <= 3) + return ch343_control_out(ch343, CMD_C2 + 0x10 + (ch343->iface - 2), ~control, 0x0000); + else + return -1; +} + +static inline int ch343_set_line(struct ch343 *ch343, struct usb_cdc_line_coding *line) +{ + return 0; +} + +static int ch343_get_status(struct ch343 *ch343) +{ + char *buffer; + int retval; + const unsigned size = 2; + unsigned long flags; + + buffer = kmalloc(size, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + retval = ch343_control_in(ch343, CMD_R, CMD_C3 + ch343->iface, 0, buffer, size); + if (retval != size) + goto out; + + /* setup the private status if available */ + spin_lock_irqsave(&ch343->read_lock, flags); + ch343->ctrlin = (~(*buffer)) & CH343_CTI_ST; + spin_unlock_irqrestore(&ch343->read_lock, flags); + +out: + kfree(buffer); + return retval; +} + +/* -------------------------------------------------------------------------- */ + +static int ch343_configure(struct ch343 *ch343) +{ + char *buffer; + int r; + const unsigned size = 2; + u8 chiptype; + + buffer = kmalloc(size, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + r = ch343_control_in(ch343, CMD_C6, 0, 0, buffer, size); + if (r != size) + goto out; + + chiptype = buffer[1]; + + switch (ch343->idProduct) { + case 0x55D2: + if (chiptype == 0x48) + ch343->chiptype = CHIP_CH342F; + else if (chiptype == 0x41) + ch343->chiptype = CHIP_CH342K; + break; + case 0x55D3: + if (chiptype == 0x08) + ch343->chiptype = CHIP_CH343GP; + else if (chiptype == 0x02) + ch343->chiptype = CHIP_CH343J; + else if (chiptype == 0x01) + ch343->chiptype = CHIP_CH343K; + else if (chiptype == 0x18) + ch343->chiptype = CHIP_CH343G_AUTOBAUD; + break; + case 0x55D4: + if (chiptype == 0x08) + ch343->chiptype = CHIP_CH9102F; + else if (chiptype == 0x09) + ch343->chiptype = CHIP_CH9102X; + break; + case 0x55D5: + if (chiptype == 0xC0) { + if ((buffer[0] & 0xF0) == 0x40) + ch343->chiptype = CHIP_CH344L; + else + ch343->chiptype = CHIP_CH344L_V2; + } else + ch343->chiptype = CHIP_CH344Q; + break; + case 0x55D7: + if (chiptype == 0x4B) + ch343->chiptype = CHIP_CH9103M; + break; + case 0x55D8: + if (chiptype == 0x08) + ch343->chiptype = CHIP_CH9101UH; + else if (chiptype == 0x0A) + ch343->chiptype = CHIP_CH9101RY; + break; + case 0x55DA: + case 0x55DB: + case 0x55DD: + ch343->chiptype = CHIP_CH347T; + break; + case 0x55DF: + ch343->chiptype = CHIP_CH9104L; + break; + default: + break; + } + + if (ch343->chiptype != CHIP_CH344L && ch343->chiptype != CHIP_CH344L_V2 && ch343->chiptype != CHIP_CH9104L) { + r = ch343_get_status(ch343); + if (r < 0) + goto out; + } + + dev_dbg(&ch343->data->dev, "%s - chip hver : 0x%2x, sver : 0x%2x, chip : %d\n", __func__, buffer[0], buffer[1], + ch343->chiptype); +out: + kfree(buffer); + return r < 0 ? r : 0; +} + +/* + * Write buffer management. + * All of these assume proper locks taken by the caller. + */ +static int ch343_wb_alloc(struct ch343 *ch343) +{ + int i, wbn; + struct ch343_wb *wb; + + wbn = 0; + i = 0; + for (;;) { + wb = &ch343->wb[wbn]; + if (!wb->use) { + wb->use = 1; + return wbn; + } + wbn = (wbn + 1) % CH343_NW; + if (++i >= CH343_NW) + return -1; + } +} + +static int ch343_wb_is_avail(struct ch343 *ch343) +{ + int i, n; + unsigned long flags; + + n = CH343_NW; + spin_lock_irqsave(&ch343->write_lock, flags); + for (i = 0; i < CH343_NW; i++) + n -= ch343->wb[i].use; + spin_unlock_irqrestore(&ch343->write_lock, flags); + return n; +} + +/* + * Finish write. Caller must hold ch343->write_lock + */ +static void ch343_write_done(struct ch343 *ch343, struct ch343_wb *wb) +{ + wb->use = 0; + ch343->transmitting--; + usb_autopm_put_interface_async(ch343->control); +} + +/* + * Poke write. + * + * the caller is responsible for locking + */ +static int ch343_start_wb(struct ch343 *ch343, struct ch343_wb *wb) +{ + int rc; + + ch343->transmitting++; + + wb->urb->transfer_buffer = wb->buf; + wb->urb->transfer_dma = wb->dmah; + wb->urb->transfer_buffer_length = wb->len; + wb->urb->dev = ch343->dev; + + rc = usb_submit_urb(wb->urb, GFP_ATOMIC); + if (rc < 0) { + dev_err(&ch343->data->dev, "%s - usb_submit_urb(write bulk) failed: %d\n", __func__, rc); + ch343_write_done(ch343, wb); + } + return rc; +} + +static void ch343_update_status(struct ch343 *ch343, unsigned char *data, size_t len) +{ + unsigned long flags; + u8 status; + u8 difference; + u8 type = data[0]; + u8 handled = 0; + + if (len < 4) + return; + + if (ch343->chiptype == CHIP_CH344L) { + if (data[0] != 0x00) + return; + type = data[1]; + } else if (ch343->chiptype == CHIP_CH344Q || ch343->chiptype == CHIP_CH344L_V2 || ch343->chiptype == CHIP_CH9104L) { + type = data[1]; + } + + if (type & CH343_CTT_M) { + status = ~data[len - 1] & CH343_CTI_ST; + if (ch343->chiptype == CHIP_CH344L || ch343->chiptype == CHIP_CH344L_V2) + status &= CH343_CTI_C; + + if (!ch343->clocal && (ch343->ctrlin & status & CH343_CTI_DC)) { + tty_port_tty_hangup(&ch343->port, false); + } + + spin_lock_irqsave(&ch343->read_lock, flags); + difference = status ^ ch343->ctrlin; + ch343->ctrlin = status; + ch343->oldcount = ch343->iocount; + + if (difference) { + if (difference & CH343_CTI_C) { + ch343->iocount.cts++; + } + if (difference & CH343_CTI_DS) { + ch343->iocount.dsr++; + } + if (difference & CH343_CTI_R) { + ch343->iocount.rng++; + } + if (difference & CH343_CTI_DC) { + ch343->iocount.dcd++; + } + spin_unlock_irqrestore(&ch343->read_lock, flags); + wake_up_interruptible(&ch343->wioctl); + } else + spin_unlock_irqrestore(&ch343->read_lock, flags); + handled = 1; + } + if (type & CH343_CTT_O) { + spin_lock_irqsave(&ch343->read_lock, flags); + ch343->oldcount = ch343->iocount; + ch343->iocount.overrun++; + spin_unlock_irqrestore(&ch343->read_lock, flags); + handled = 1; + } + if ((type & CH343_CTT_F) == CH343_CTT_F) { + spin_lock_irqsave(&ch343->read_lock, flags); + ch343->oldcount = ch343->iocount; + ch343->iocount.frame++; + spin_unlock_irqrestore(&ch343->read_lock, flags); + handled = 1; + } else if (type & CH343_CTT_P) { + spin_lock_irqsave(&ch343->read_lock, flags); + ch343->oldcount = ch343->iocount; + ch343->iocount.parity++; + spin_unlock_irqrestore(&ch343->read_lock, flags); + handled = 1; + } + if (!handled) + dev_err(&ch343->control->dev, + "%s - unknown status received:" + "len:%d, data0:0x%x, data1:0x%x\n", + __func__, (int)len, data[0], data[1]); +} + +/* Reports status changes with "interrupt" transfers */ +static void ch343_ctrl_irq(struct urb *urb) +{ + struct ch343 *ch343 = urb->context; + unsigned char *data = urb->transfer_buffer; + unsigned int len = urb->actual_length; + int status = urb->status; + int retval; + + switch (status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(&ch343->control->dev, "%s - urb shutting down with status: %d\n", __func__, status); + return; + default: + dev_dbg(&ch343->control->dev, "%s - nonzero urb status received: %d\n", __func__, status); + goto exit; + } + + usb_mark_last_busy(ch343->dev); + ch343_update_status(ch343, data, len); +exit: + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval && retval != -EPERM) + dev_err(&ch343->control->dev, "%s - usb_submit_urb failed: %d\n", __func__, retval); +} + +static int ch343_submit_read_urb(struct ch343 *ch343, int index, gfp_t mem_flags) +{ + int res; + + if (!test_and_clear_bit(index, &ch343->read_urbs_free)) + return 0; + + dev_vdbg(&ch343->data->dev, "%s - urb %d\n", __func__, index); + + res = usb_submit_urb(ch343->read_urbs[index], mem_flags); + if (res) { + if (res != -EPERM) { + dev_err(&ch343->data->dev, "%s - usb_submit_urb failed: %d\n", __func__, res); + } + set_bit(index, &ch343->read_urbs_free); + return res; + } + + return 0; +} + +static int ch343_submit_read_urbs(struct ch343 *ch343, gfp_t mem_flags) +{ + int res; + int i; + + for (i = 0; i < ch343->rx_buflimit; ++i) { + res = ch343_submit_read_urb(ch343, i, mem_flags); + if (res) + return res; + } + + return 0; +} + +static void ch343_process_read_urb(struct ch343 *ch343, struct urb *urb) +{ + if (!urb->actual_length) + return; + + tty_insert_flip_string(&ch343->port, urb->transfer_buffer, urb->actual_length); + tty_flip_buffer_push(&ch343->port); +} + +static void ch343_read_bulk_callback(struct urb *urb) +{ + struct ch343_rb *rb = urb->context; + struct ch343 *ch343 = rb->instance; + int status = urb->status; + + dev_vdbg(&ch343->data->dev, "%s - urb %d, len %d\n", __func__, rb->index, urb->actual_length); + + if (!ch343->dev) { + set_bit(rb->index, &ch343->read_urbs_free); + dev_dbg(&ch343->data->dev, "%s - disconnected\n", __func__); + return; + } + + if (status) { + set_bit(rb->index, &ch343->read_urbs_free); + dev_dbg(&ch343->data->dev, "%s - non-zero urb status: %d\n", __func__, status); + return; + } + + usb_mark_last_busy(ch343->dev); + ch343_process_read_urb(ch343, urb); + set_bit(rb->index, &ch343->read_urbs_free); + ch343_submit_read_urb(ch343, rb->index, GFP_ATOMIC); +} + +/* data interface wrote those outgoing bytes */ +static void ch343_write_bulk(struct urb *urb) +{ + struct ch343_wb *wb = urb->context; + struct ch343 *ch343 = wb->instance; + unsigned long flags; + int status = urb->status; + + dev_vdbg(&ch343->data->dev, "%s, len %d\n", __func__, urb->actual_length); + if (status || (urb->actual_length != urb->transfer_buffer_length)) + dev_vdbg(&ch343->data->dev, "%s - len %d/%d, status %d\n", __func__, urb->actual_length, + urb->transfer_buffer_length, status); + + spin_lock_irqsave(&ch343->write_lock, flags); + ch343_write_done(ch343, wb); + spin_unlock_irqrestore(&ch343->write_lock, flags); + schedule_work(&ch343->work); +} + +static void ch343_softint(struct work_struct *work) +{ + struct ch343 *ch343 = container_of(work, struct ch343, work); + + dev_dbg(&ch343->data->dev, "%s\n", __func__); + + tty_port_tty_wakeup(&ch343->port); +} + +/* + * TTY handlers + */ +static int ch343_tty_install(struct tty_driver *driver, struct tty_struct *tty) +{ + struct ch343 *ch343; + int retval; + + dev_dbg(tty->dev, "%s\n", __func__); + + ch343 = ch343_get_by_minor(tty->index); + if (!ch343) + return -ENODEV; + + retval = tty_standard_install(driver, tty); + if (retval) + goto error_init_termios; + + tty->driver_data = ch343; + + return 0; + +error_init_termios: + tty_port_put(&ch343->port); + return retval; +} + +static int ch343_tty_open(struct tty_struct *tty, struct file *filp) +{ + struct ch343 *ch343 = tty->driver_data; + + dev_dbg(tty->dev, "%s\n", __func__); + + return tty_port_open(&ch343->port, tty, filp); +} + +static void ch343_port_dtr_rts(struct tty_port *port, int raise) +{ + struct ch343 *ch343 = container_of(port, struct ch343, port); + int res; + + dev_dbg(&ch343->data->dev, "%s, raise:%d\n", __func__, raise); + + if (raise) + ch343->ctrlout |= CH343_CTO_D | CH343_CTO_R; + else + ch343->ctrlout &= ~(CH343_CTO_D | CH343_CTO_R); + + res = ch343_set_control(ch343, ch343->ctrlout); + if (res) + dev_err(&ch343->control->dev, "failed to set dtr/rts\n"); +} + +static int ch343_port_activate(struct tty_port *port, struct tty_struct *tty) +{ + struct ch343 *ch343 = container_of(port, struct ch343, port); + int retval = -ENODEV; + int i; + + dev_dbg(&ch343->control->dev, "%s\n", __func__); + + mutex_lock(&ch343->mutex); + if (ch343->disconnected) + goto disconnected; + + retval = usb_autopm_get_interface(ch343->control); + if (retval) + goto error_get_interface; + + /* + * FIXME: Why do we need this? Allocating 64K of physically contiguous + * memory is really nasty... + */ + set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); + ch343->control->needs_remote_wakeup = 1; + + // retval = ch343_configure(ch343); + // if (retval) + // goto error_configure; + + ch343_tty_set_termios(tty, NULL); + + retval = usb_submit_urb(ch343->ctrlurb, GFP_KERNEL); + if (retval) { + dev_err(&ch343->control->dev, "%s - usb_submit_urb(ctrl cmd) failed\n", __func__); + goto error_submit_urb; + } + + retval = ch343_submit_read_urbs(ch343, GFP_KERNEL); + if (retval) + goto error_submit_read_urbs; + usb_autopm_put_interface(ch343->control); + + mutex_unlock(&ch343->mutex); + + return 0; + +error_submit_read_urbs: + for (i = 0; i < ch343->rx_buflimit; i++) + usb_kill_urb(ch343->read_urbs[i]); +error_submit_urb: + usb_kill_urb(ch343->ctrlurb); + // error_configure: + usb_autopm_put_interface(ch343->control); +error_get_interface: +disconnected: + mutex_unlock(&ch343->mutex); + + return usb_translate_errors(retval); +} + +static void ch343_port_destruct(struct tty_port *port) +{ + struct ch343 *ch343 = container_of(port, struct ch343, port); + + dev_dbg(&ch343->control->dev, "%s\n", __func__); + + ch343_release_minor(ch343); + usb_put_intf(ch343->control); + kfree(ch343); +} + +static void ch343_port_shutdown(struct tty_port *port) +{ + struct ch343 *ch343 = container_of(port, struct ch343, port); + struct urb *urb; + struct ch343_wb *wb; + int i; + + dev_dbg(&ch343->control->dev, "%s\n", __func__); + + usb_autopm_get_interface_no_resume(ch343->control); + ch343->control->needs_remote_wakeup = 0; + usb_autopm_put_interface(ch343->control); + + for (;;) { + urb = usb_get_from_anchor(&ch343->delayed); + if (!urb) + break; + wb = urb->context; + wb->use = 0; + usb_autopm_put_interface_async(ch343->control); + } + + usb_kill_urb(ch343->ctrlurb); + for (i = 0; i < CH343_NW; i++) + usb_kill_urb(ch343->wb[i].urb); + for (i = 0; i < ch343->rx_buflimit; i++) + usb_kill_urb(ch343->read_urbs[i]); +} + +static void ch343_tty_cleanup(struct tty_struct *tty) +{ + struct ch343 *ch343 = tty->driver_data; + dev_dbg(&ch343->control->dev, "%s\n", __func__); + tty_port_put(&ch343->port); +} + +static void ch343_tty_hangup(struct tty_struct *tty) +{ + struct ch343 *ch343 = tty->driver_data; + dev_dbg(&ch343->control->dev, "%s\n", __func__); + tty_port_hangup(&ch343->port); +} + +static void ch343_tty_close(struct tty_struct *tty, struct file *filp) +{ + struct ch343 *ch343 = tty->driver_data; + dev_dbg(&ch343->control->dev, "%s\n", __func__); + tty_port_close(&ch343->port, tty, filp); +} + +static int ch343_tty_write(struct tty_struct *tty, const unsigned char *buf, int count) +{ + struct ch343 *ch343 = tty->driver_data; + int stat; + unsigned long flags; + int wbn; + struct ch343_wb *wb; + + if (!count) + return 0; + + dev_vdbg(&ch343->data->dev, "%s - count %d\n", __func__, count); + + spin_lock_irqsave(&ch343->write_lock, flags); + wbn = ch343_wb_alloc(ch343); + if (wbn < 0) { + spin_unlock_irqrestore(&ch343->write_lock, flags); + return 0; + } + wb = &ch343->wb[wbn]; + + if (!ch343->dev) { + wb->use = 0; + spin_unlock_irqrestore(&ch343->write_lock, flags); + return -ENODEV; + } + + count = (count > ch343->writesize) ? ch343->writesize : count; + + memcpy(wb->buf, buf, count); + wb->len = count; + + stat = usb_autopm_get_interface_async(ch343->control); + if (stat) { + wb->use = 0; + spin_unlock_irqrestore(&ch343->write_lock, flags); + return stat; + } + + if (ch343->susp_count) { + usb_anchor_urb(wb->urb, &ch343->delayed); + spin_unlock_irqrestore(&ch343->write_lock, flags); + return count; + } + + stat = ch343_start_wb(ch343, wb); + spin_unlock_irqrestore(&ch343->write_lock, flags); + + if (stat < 0) + return stat; + return count; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) +static unsigned int ch343_tty_write_room(struct tty_struct *tty) +#else +static int ch343_tty_write_room(struct tty_struct *tty) +#endif +{ + struct ch343 *ch343 = tty->driver_data; + /* + * Do not let the line discipline to know that we have a reserve, + * or it might get too enthusiastic. + */ + return ch343_wb_is_avail(ch343) ? ch343->writesize : 0; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) +static unsigned int ch343_tty_chars_in_buffer(struct tty_struct *tty) +#else +static int ch343_tty_chars_in_buffer(struct tty_struct *tty) +#endif +{ + struct ch343 *ch343 = tty->driver_data; + /* + * if the device was unplugged then any remaining characters fell out + * of the connector ;) + */ + if (ch343->disconnected) + return 0; + /* + * This is inaccurate (overcounts), but it works. + */ + return (CH343_NW - ch343_wb_is_avail(ch343)) * ch343->writesize; +} + +static int ch343_tty_break_ctl(struct tty_struct *tty, int state) +{ + struct ch343 *ch343 = tty->driver_data; + int retval; + uint16_t reg_contents; + uint8_t *regbuf; + + dev_dbg(&ch343->control->dev, "%s\n", __func__); + + regbuf = kmalloc(2, GFP_KERNEL); + if (!regbuf) + return -1; + + if (state != 0) { + if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) || + (ch343->chiptype == CHIP_CH344L_V2) || (ch343->chiptype == CHIP_CH9104L)) { + regbuf[0] = ch343->iface; + regbuf[1] = 0x01; + } else { + regbuf[0] = CH343_N_B; + regbuf[1] = 0x00; + } + } else { + if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) || + (ch343->chiptype == CHIP_CH344L_V2) || (ch343->chiptype == CHIP_CH9104L)) { + regbuf[0] = ch343->iface; + regbuf[1] = 0x00; + } else { + regbuf[0] = CH343_N_B | CH343_N_AB; + regbuf[1] = 0x00; + } + } + reg_contents = get_unaligned_le16(regbuf); + + if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) || (ch343->chiptype == CHIP_CH344L_V2) || + (ch343->chiptype == CHIP_CH9104L)) { + retval = ch343_control_out(ch343, CMD_C4, reg_contents, 0x00); + } else { + if (ch343->iface) + retval = ch343_control_out(ch343, CMD_C4, 0x00, reg_contents); + else + retval = ch343_control_out(ch343, CMD_C4, reg_contents, 0x00); + } + + if (retval < 0) + dev_err(&ch343->control->dev, "%s - USB control write error (%d)\n", __func__, retval); + + kfree(regbuf); + + return retval; +} + +static int ch343_tty_tiocmget(struct tty_struct *tty) +{ + struct ch343 *ch343 = tty->driver_data; + unsigned long flags; + unsigned int result; + + dev_dbg(&ch343->control->dev, "%s\n", __func__); + + spin_lock_irqsave(&ch343->read_lock, flags); + result = (ch343->ctrlout & CH343_CTO_D ? TIOCM_DTR : 0) | (ch343->ctrlout & CH343_CTO_R ? TIOCM_RTS : 0) | + (ch343->ctrlin & CH343_CTI_C ? TIOCM_CTS : 0) | (ch343->ctrlin & CH343_CTI_DS ? TIOCM_DSR : 0) | + (ch343->ctrlin & CH343_CTI_R ? TIOCM_RI : 0) | (ch343->ctrlin & CH343_CTI_DC ? TIOCM_CD : 0); + spin_unlock_irqrestore(&ch343->read_lock, flags); + + return result; +} + +static int ch343_tty_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear) +{ + struct ch343 *ch343 = tty->driver_data; + unsigned int newctrl; + + dev_dbg(&ch343->control->dev, "%s\n", __func__); + + newctrl = ch343->ctrlout; + set = (set & TIOCM_DTR ? CH343_CTO_D : 0) | (set & TIOCM_RTS ? CH343_CTO_R : 0); + clear = (clear & TIOCM_DTR ? CH343_CTO_D : 0) | (clear & TIOCM_RTS ? CH343_CTO_R : 0); + + newctrl = (newctrl & ~clear) | set; + + if (ch343->ctrlout == newctrl) { + return 0; + } + + return ch343_set_control(ch343, ch343->ctrlout = newctrl); +} + +static int ch343_get_serial_info(struct ch343 *ch343, struct serial_struct __user *info) +{ + struct serial_struct tmp; + + if (!info) + return -EINVAL; + + memset(&tmp, 0, sizeof(tmp)); + tmp.flags = ASYNC_LOW_LATENCY; + tmp.xmit_fifo_size = ch343->writesize; + tmp.baud_base = le32_to_cpu(ch343->line.dwDTERate); + tmp.close_delay = ch343->port.close_delay / 10; + tmp.closing_wait = + ch343->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE : ch343->port.closing_wait / 10; + + if (copy_to_user(info, &tmp, sizeof(tmp))) + return -EFAULT; + else + return 0; +} + +static int ch343_set_serial_info(struct ch343 *ch343, struct serial_struct __user *newinfo) +{ + struct serial_struct new_serial; + unsigned int closing_wait, close_delay; + int retval = 0; + + if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) + return -EFAULT; + + close_delay = new_serial.close_delay * 10; + closing_wait = + new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10; + + mutex_lock(&ch343->port.mutex); + + if (!capable(CAP_SYS_ADMIN)) { + if ((close_delay != ch343->port.close_delay) || (closing_wait != ch343->port.closing_wait)) + retval = -EPERM; + else + retval = -EOPNOTSUPP; + } else { + ch343->port.close_delay = close_delay; + ch343->port.closing_wait = closing_wait; + } + + mutex_unlock(&ch343->port.mutex); + return retval; +} + +static int ch343_wait_serial_change(struct ch343 *ch343, unsigned long arg) +{ + int rv = 0; + DECLARE_WAITQUEUE(wait, current); + struct async_icount old, new; + + do { + spin_lock_irq(&ch343->read_lock); + old = ch343->oldcount; + new = ch343->iocount; + ch343->oldcount = new; + spin_unlock_irq(&ch343->read_lock); + + if ((arg & TIOCM_CTS) && old.cts != new.cts) + break; + if ((arg & TIOCM_DSR) && old.dsr != new.dsr) + break; + if ((arg & TIOCM_RI) && old.rng != new.rng) + break; + if ((arg & TIOCM_CD) && old.dcd != new.dcd) + break; + + add_wait_queue(&ch343->wioctl, &wait); + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + remove_wait_queue(&ch343->wioctl, &wait); + if (ch343->disconnected) { + if (arg & TIOCM_CD) + break; + else + rv = -ENODEV; + } else { + if (signal_pending(current)) + rv = -ERESTARTSYS; + } + } while (!rv); + + return rv; +} + +static int ch343_get_serial_usage(struct ch343 *ch343, struct serial_icounter_struct __user *count) +{ + struct serial_icounter_struct icount; + int rv = 0; + + memset(&icount, 0, sizeof(icount)); + icount.cts = ch343->iocount.cts; + icount.dsr = ch343->iocount.dsr; + icount.rng = ch343->iocount.rng; + icount.dcd = ch343->iocount.dcd; + icount.frame = ch343->iocount.frame; + icount.overrun = ch343->iocount.overrun; + icount.parity = ch343->iocount.parity; + icount.brk = ch343->iocount.brk; + + if (copy_to_user(count, &icount, sizeof(icount)) > 0) + rv = -EFAULT; + + return rv; +} + +static int ch343_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) +{ + struct ch343 *ch343 = tty->driver_data; + int rv = 0; + unsigned long arg1, arg2, arg3, arg4, arg5, arg6; + u32 __user *argval = (u32 __user *)arg; + u8 *buffer; + + dev_dbg(&ch343->control->dev, "%s\n", __func__); + + buffer = kmalloc(512, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + switch (cmd) { + case TIOCGSERIAL: /* gets serial port data */ + rv = ch343_get_serial_info(ch343, (struct serial_struct __user *)arg); + break; + case TIOCSSERIAL: + rv = ch343_set_serial_info(ch343, (struct serial_struct __user *)arg); + break; + case TIOCMIWAIT: + rv = usb_autopm_get_interface(ch343->control); + if (rv < 0) { + rv = -EIO; + break; + } + rv = ch343_wait_serial_change(ch343, arg); + usb_autopm_put_interface(ch343->control); + break; + case IOCTL_CMD_GICOUNT: + case TIOCGICOUNT: + rv = ch343_get_serial_usage(ch343, (struct serial_icounter_struct __user *)arg); + break; + case IOCTL_CMD_GETCHIPTYPE: + if (put_user(ch343->chiptype, argval)) { + rv = -EFAULT; + goto out; + } + break; + case IOCTL_CMD_CTRLIN: + get_user(arg1, (u8 __user *)arg); + get_user(arg2, ((u8 __user *)arg + 1)); + get_user(arg3, (u16 __user *)((u8 *)arg + 2)); + get_user(arg4, (u16 __user *)((u8 *)arg + 4)); + get_user(arg5, (u16 __user *)((u8 *)arg + 6)); + arg6 = (unsigned long)((u8 __user *)arg + 8); + rv = ch343_control_msg_in(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); + break; + case IOCTL_CMD_CTRLOUT: + get_user(arg1, (u8 __user *)arg); + get_user(arg2, ((u8 __user *)arg + 1)); + get_user(arg3, (u16 __user *)((u8 *)arg + 2)); + get_user(arg4, (u16 __user *)((u8 *)arg + 4)); + get_user(arg5, (u16 __user *)((u8 *)arg + 6)); + arg6 = (unsigned long)((u8 __user *)arg + 8); + rv = ch343_control_msg_out(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); + if (rv != (u16)arg5) { + rv = -EINVAL; + goto out; + } + break; + default: + rv = -ENOIOCTLCMD; + break; + } + +out: + kfree(buffer); + return rv < 0 ? rv : 0; +} + +static int ch343_get(CHIPTYPE chiptype, unsigned int bval, unsigned char *fct, unsigned char *dvs) +{ + unsigned char a; + unsigned char b; + unsigned long c; + + if (((chiptype == CHIP_CH347T) || (chiptype == CHIP_CH344Q) || (chiptype == CHIP_CH9104L)) && bval >= 2000000) { + *fct = (unsigned char)(bval / 200); + *dvs = (unsigned char)((bval / 200) >> 8); + } + + switch (bval) { + case 6000000: + case 4000000: + case 2400000: + case 921600: + case 307200: + case 256000: + b = 7; + c = 12000000; + break; + default: + if (bval > 6000000 / 255) { + b = 3; + c = 6000000; + } else if (bval > 750000 / 255) { + b = 2; + c = 750000; + } else if (bval > 93750 / 255) { + b = 1; + c = 93750; + } else { + b = 0; + c = 11719; + } + break; + } + a = (unsigned char)(c / bval); + if (a == 0 || a == 0xFF) + return -EINVAL; + if ((c / a - bval) > (bval - c / (a + 1))) + a++; + a = 256 - a; + + *fct = a; + *dvs = b; + + return 0; +} + +static void ch343_tty_set_termios(struct tty_struct *tty, struct ktermios *termios_old) +{ + struct ch343 *ch343 = tty->driver_data; + struct ktermios *termios = &tty->termios; + struct usb_ch343_line_coding newline; + int newctrl = ch343->ctrlout; + + unsigned char dvs = 0; + unsigned char reg_count = 0; + unsigned char fct = 0; + unsigned char reg_value = 0; + unsigned short value = 0; + unsigned short index = 0; + + dev_dbg(tty->dev, "%s\n", __func__); + + if (termios_old && !tty_termios_hw_change(&tty->termios, termios_old)) { + return; + } + + newline.dwDTERate = tty_get_baud_rate(tty); + + if (newline.dwDTERate == 0) + newline.dwDTERate = 9600; + ch343_get(ch343->chiptype, newline.dwDTERate, &fct, &dvs); + + newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 1; + if (newline.bCharFormat == 2) + reg_value |= CH343_L_SB; + + newline.bParityType = + termios->c_cflag & PARENB ? (termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0; + + switch (newline.bParityType) { + case 0x01: + reg_value |= CH343_L_P_O; + break; + case 0x02: + reg_value |= CH343_L_P_E; + break; + case 0x03: + reg_value |= CH343_L_P_M; + break; + case 0x04: + reg_value |= CH343_L_P_S; + break; + default: + break; + } + + switch (termios->c_cflag & CSIZE) { + case CS5: + newline.bDataBits = 5; + reg_value |= CH343_L_C5; + break; + case CS6: + newline.bDataBits = 6; + reg_value |= CH343_L_C6; + break; + case CS7: + newline.bDataBits = 7; + reg_value |= CH343_L_C7; + break; + case CS8: + default: + newline.bDataBits = 8; + reg_value |= CH343_L_C8; + break; + } + + /* FIXME: Needs to clear unsupported bits in the termios */ + ch343->clocal = ((termios->c_cflag & CLOCAL) != 0); + + if (C_BAUD(tty) == B0) { + newline.dwDTERate = ch343->line.dwDTERate; + newctrl &= ~CH343_CTO_D; + } else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) { + newctrl |= CH343_CTO_D; + } + + reg_value |= CH343_L_E_R | CH343_L_E_T; + reg_count |= CH343_L_R_CT | CH343_L_R_CL | CH343_L_R_T; + + value |= reg_count; + value |= (unsigned short)reg_value << 8; + + index |= 0x00 | dvs; + index |= (unsigned short)fct << 8; + if (ch343->iface <= 1) + ch343_control_out(ch343, CMD_C1 + ch343->iface, value, index); + else if (ch343->iface <= 3) + ch343_control_out(ch343, CMD_C1 + 0x10 + (ch343->iface - 2), value, index); + + if (memcmp(&ch343->line, &newline, sizeof newline)) { + memcpy(&ch343->line, &newline, sizeof newline); + dev_dbg(&ch343->control->dev, "%s - set line: %d %d %d %d\n", __func__, newline.dwDTERate, newline.bCharFormat, + newline.bParityType, newline.bDataBits); + } + + if (C_CRTSCTS(tty)) { + newctrl |= CH343_CTO_A | CH343_CTO_R; + } else + newctrl &= ~CH343_CTO_A; + + if (newctrl != ch343->ctrlout) + ch343_set_control(ch343, ch343->ctrlout = newctrl); +} + +static const struct tty_port_operations ch343_port_ops = { + .dtr_rts = ch343_port_dtr_rts, + .shutdown = ch343_port_shutdown, + .activate = ch343_port_activate, + .destruct = ch343_port_destruct, +}; + +/* Little helpers: write/read buffers free */ +static void ch343_write_buffers_free(struct ch343 *ch343) +{ + int i; + struct ch343_wb *wb; + struct usb_device *usb_dev = interface_to_usbdev(ch343->control); + + for (wb = &ch343->wb[0], i = 0; i < CH343_NW; i++, wb++) + usb_free_coherent(usb_dev, ch343->writesize, wb->buf, wb->dmah); +} + +static void ch343_read_buffers_free(struct ch343 *ch343) +{ + struct usb_device *usb_dev = interface_to_usbdev(ch343->control); + int i; + + for (i = 0; i < ch343->rx_buflimit; i++) + usb_free_coherent(usb_dev, ch343->readsize, ch343->read_buffers[i].base, ch343->read_buffers[i].dma); +} + +/* Little helper: write buffers allocate */ +static int ch343_write_buffers_alloc(struct ch343 *ch343) +{ + int i; + struct ch343_wb *wb; + + for (wb = &ch343->wb[0], i = 0; i < CH343_NW; i++, wb++) { + wb->buf = usb_alloc_coherent(ch343->dev, ch343->writesize, GFP_KERNEL, &wb->dmah); + if (!wb->buf) { + while (i != 0) { + --i; + --wb; + usb_free_coherent(ch343->dev, ch343->writesize, wb->buf, wb->dmah); + } + return -ENOMEM; + } + } + return 0; +} + +static int ch343_open(struct inode *inode, struct file *file) +{ + struct ch343 *ch343; + struct usb_interface *interface; + int subminor; + int retval = 0; + + subminor = iminor(inode); + + interface = usb_find_interface(&ch343_driver, subminor); + if (!interface) { + pr_err("%s - error, can't find device for minor %d\n", __func__, subminor); + retval = -ENODEV; + goto exit; + } + + ch343 = usb_get_intfdata(interface); + if (!ch343) { + retval = -ENODEV; + goto exit; + } + + /* save our object in the file's private structure */ + file->private_data = ch343; + +exit: + return retval; +} + +static int ch343_release(struct inode *inode, struct file *file) +{ + struct ch343 *ch343; + + ch343 = file->private_data; + if (ch343 == NULL) + return -ENODEV; + + return 0; +} + +static long ch343_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct ch343 *ch343; + int rv = 0; + u8 *buffer; + unsigned long arg1, arg2, arg3, arg4, arg5, arg6; + u32 __user *argval = (u32 __user *)arg; + + ch343 = file->private_data; + if (ch343 == NULL) + return -ENODEV; + + buffer = kmalloc(512, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + switch (cmd) { + case IOCTL_CMD_GETCHIPTYPE: + if (put_user(ch343->chiptype, argval)) { + rv = -EFAULT; + goto out; + } + break; + case IOCTL_CMD_CTRLIN: + get_user(arg1, (u8 __user *)arg); + get_user(arg2, ((u8 __user *)arg + 1)); + get_user(arg3, (u16 __user *)((u8 *)arg + 2)); + get_user(arg4, (u16 __user *)((u8 *)arg + 4)); + get_user(arg5, (u16 __user *)((u8 *)arg + 6)); + arg6 = (unsigned long)((u8 __user *)arg + 8); + rv = ch343_control_msg_in(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); + break; + case IOCTL_CMD_CTRLOUT: + get_user(arg1, (u8 __user *)arg); + get_user(arg2, ((u8 __user *)arg + 1)); + get_user(arg3, (u16 __user *)((u8 *)arg + 2)); + get_user(arg4, (u16 __user *)((u8 *)arg + 4)); + get_user(arg5, (u16 __user *)((u8 *)arg + 6)); + arg6 = (unsigned long)((u8 __user *)arg + 8); + rv = ch343_control_msg_out(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5); + if (rv != (u16)arg5) { + rv = -EINVAL; + goto out; + } + break; + default: + rv = -ENOIOCTLCMD; + break; + } + +out: + kfree(buffer); + return rv; +} + +static const struct file_operations ch343_fops = { + .owner = THIS_MODULE, + .open = ch343_open, + .unlocked_ioctl = ch343_ioctl, + .release = ch343_release, +}; + +/* + * usb class driver info in order to get a minor number from the usb core, + * and to have the device registered with the driver core + */ +static struct usb_class_driver ch343_class = { + .name = "ch343_iodev%d", + .fops = &ch343_fops, + .minor_base = USB_MINOR_BASE, +}; + +/* + * USB probe and disconnect routines. + */ +static int ch343_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_cdc_union_desc *union_header = NULL; + unsigned char *buffer = intf->altsetting->extra; + int buflen = intf->altsetting->extralen; + struct usb_interface *control_interface; + struct usb_interface *data_interface; + struct usb_endpoint_descriptor *epctrl = NULL; + struct usb_endpoint_descriptor *epread = NULL; + struct usb_endpoint_descriptor *epwrite = NULL; + struct usb_device *usb_dev = interface_to_usbdev(intf); + struct ch343 *ch343; + int minor; + int ctrlsize, readsize; + u8 *buf; + unsigned long quirks; + int num_rx_buf = CH343_NR; + int i; + unsigned int elength = 0; + struct device *tty_dev; + int rv = -ENOMEM; + + /* normal quirks */ + quirks = (unsigned long)id->driver_info; + if (!buffer) { + dev_err(&intf->dev, "Weird descriptor references\n"); + return -EINVAL; + } + + while (buflen > 0) { + elength = buffer[0]; + if (!elength) { + dev_err(&intf->dev, "skipping garbage byte\n"); + elength = 1; + goto next_desc; + } + if (buffer[1] != USB_DT_CS_INTERFACE) { + dev_err(&intf->dev, "skipping garbage\n"); + goto next_desc; + } + + switch (buffer[2]) { + case USB_CDC_UNION_TYPE: /* we've found it */ + if (elength < sizeof(struct usb_cdc_union_desc)) + goto next_desc; + if (union_header) { + dev_err(&intf->dev, + "More than one " + "union descriptor, skipping ...\n"); + goto next_desc; + } + union_header = (struct usb_cdc_union_desc *)buffer; + break; + default: + /* + * there are LOTS more CDC descriptors that + * could legitimately be found here. + */ + break; + } + next_desc: + buflen -= elength; + buffer += elength; + } + + control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); + data_interface = usb_ifnum_to_if(usb_dev, union_header->bSlaveInterface0); + + if (intf != control_interface) + return -ENODEV; + + if (usb_interface_claimed(data_interface)) { + dev_dbg(&intf->dev, "The data interface isn't available\n"); + return -EBUSY; + } + + if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 || + control_interface->cur_altsetting->desc.bNumEndpoints == 0) + return -EINVAL; + + epctrl = &control_interface->cur_altsetting->endpoint[0].desc; + epwrite = &data_interface->cur_altsetting->endpoint[0].desc; + epread = &data_interface->cur_altsetting->endpoint[1].desc; + + /* workaround for switched endpoints */ + if (!usb_endpoint_dir_in(epread)) { + /* descriptors are swapped */ + dev_dbg(&intf->dev, "The data interface has switched endpoints\n"); + swap(epread, epwrite); + } + + ch343 = kzalloc(sizeof(struct ch343), GFP_KERNEL); + if (ch343 == NULL) + goto alloc_fail; + + ch343->idVendor = id->idVendor; + ch343->idProduct = id->idProduct; + ch343->iface = control_interface->cur_altsetting->desc.bInterfaceNumber / 2; + + minor = ch343_alloc_minor(ch343); + if (minor < 0) { + dev_err(&intf->dev, "no more free ch343 devices\n"); + kfree(ch343); + return -ENODEV; + } + + ctrlsize = usb_endpoint_maxp(epctrl); + readsize = usb_endpoint_maxp(epread); + ch343->writesize = usb_endpoint_maxp(epwrite) * 20; + ch343->control = control_interface; + ch343->data = data_interface; + ch343->minor = minor; + ch343->dev = usb_dev; + ch343->ctrlsize = ctrlsize; + ch343->readsize = readsize; + ch343->rx_buflimit = num_rx_buf; + + dev_dbg(&intf->dev, "ep%d ctrl: %d, ep%d read: %d, ep%d write: %d\n", usb_endpoint_num(epctrl), + usb_endpoint_maxp(epctrl), usb_endpoint_num(epread), usb_endpoint_maxp(epread), usb_endpoint_num(epwrite), + usb_endpoint_maxp(epwrite)); + + INIT_WORK(&ch343->work, ch343_softint); + init_waitqueue_head(&ch343->wioctl); + spin_lock_init(&ch343->write_lock); + spin_lock_init(&ch343->read_lock); + mutex_init(&ch343->mutex); + ch343->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); + tty_port_init(&ch343->port); + ch343->port.ops = &ch343_port_ops; + init_usb_anchor(&ch343->delayed); + ch343->quirks = quirks; + + buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &ch343->ctrl_dma); + if (!buf) + goto alloc_fail2; + ch343->ctrl_buffer = buf; + + if (ch343_write_buffers_alloc(ch343) < 0) + goto alloc_fail4; + + ch343->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); + if (!ch343->ctrlurb) + goto alloc_fail5; + + for (i = 0; i < num_rx_buf; i++) { + struct ch343_rb *rb = &(ch343->read_buffers[i]); + struct urb *urb; + + rb->base = usb_alloc_coherent(ch343->dev, readsize, GFP_KERNEL, &rb->dma); + if (!rb->base) + goto alloc_fail6; + rb->index = i; + rb->instance = ch343; + + urb = usb_alloc_urb(0, GFP_KERNEL); + if (!urb) + goto alloc_fail6; + + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + urb->transfer_dma = rb->dma; + usb_fill_bulk_urb(urb, ch343->dev, ch343->rx_endpoint, rb->base, ch343->readsize, ch343_read_bulk_callback, rb); + + ch343->read_urbs[i] = urb; + __set_bit(i, &ch343->read_urbs_free); + } + for (i = 0; i < CH343_NW; i++) { + struct ch343_wb *snd = &(ch343->wb[i]); + + snd->urb = usb_alloc_urb(0, GFP_KERNEL); + if (snd->urb == NULL) + goto alloc_fail7; + + usb_fill_bulk_urb(snd->urb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), NULL, + ch343->writesize, ch343_write_bulk, snd); + snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + snd->instance = ch343; + } + + usb_set_intfdata(intf, ch343); + + usb_fill_int_urb(ch343->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress), ch343->ctrl_buffer, + ctrlsize, ch343_ctrl_irq, ch343, epctrl->bInterval ? epctrl->bInterval : 16); + ch343->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + ch343->ctrlurb->transfer_dma = ch343->ctrl_dma; + + dev_info(&intf->dev, "ttyCH343USB%d: usb to uart device\n", minor); + + usb_driver_claim_interface(&ch343_driver, data_interface, ch343); + usb_set_intfdata(data_interface, ch343); + usb_get_intf(control_interface); + + rv = ch343_configure(ch343); + if (rv) + goto alloc_fail7; + + if (ch343->iface == 0) { + /* register the device now, as it is ready */ + rv = usb_register_dev(intf, &ch343_class); + if (rv) { + /* error when registering this driver */ + dev_err(&intf->dev, "Not able to get a minor for this device.\n"); + } else { + g_intf = intf; + } + } + + tty_dev = tty_port_register_device(&ch343->port, ch343_tty_driver, minor, &control_interface->dev); + if (IS_ERR(tty_dev)) { + rv = PTR_ERR(tty_dev); + goto alloc_fail7; + } + + return 0; + +alloc_fail7: + usb_set_intfdata(intf, NULL); + for (i = 0; i < CH343_NW; i++) + usb_free_urb(ch343->wb[i].urb); +alloc_fail6: + for (i = 0; i < num_rx_buf; i++) + usb_free_urb(ch343->read_urbs[i]); + ch343_read_buffers_free(ch343); + usb_free_urb(ch343->ctrlurb); +alloc_fail5: + ch343_write_buffers_free(ch343); +alloc_fail4: + usb_free_coherent(usb_dev, ctrlsize, ch343->ctrl_buffer, ch343->ctrl_dma); +alloc_fail2: + ch343_release_minor(ch343); + kfree(ch343); +alloc_fail: + return rv; +} + +static void stop_data_traffic(struct ch343 *ch343) +{ + int i; + + usb_kill_urb(ch343->ctrlurb); + for (i = 0; i < CH343_NW; i++) + usb_kill_urb(ch343->wb[i].urb); + for (i = 0; i < ch343->rx_buflimit; i++) + usb_kill_urb(ch343->read_urbs[i]); + cancel_work_sync(&ch343->work); +} + +static void ch343_disconnect(struct usb_interface *intf) +{ + struct ch343 *ch343 = usb_get_intfdata(intf); + struct usb_device *usb_dev = interface_to_usbdev(intf); + struct tty_struct *tty; + int i; + + dev_dbg(&intf->dev, "%s\n", __func__); + + /* sibling interface is already cleaning up */ + if (!ch343) + return; + + /* give back minor */ + if ((ch343->iface == 0) && (g_intf != NULL)) { + usb_deregister_dev(g_intf, &ch343_class); + } + + mutex_lock(&ch343->mutex); + ch343->disconnected = true; + wake_up_all(&ch343->wioctl); + usb_set_intfdata(ch343->control, NULL); + usb_set_intfdata(ch343->data, NULL); + mutex_unlock(&ch343->mutex); + + tty = tty_port_tty_get(&ch343->port); + if (tty) { + tty_vhangup(tty); + tty_kref_put(tty); + } + + stop_data_traffic(ch343); + + tty_unregister_device(ch343_tty_driver, ch343->minor); + + usb_free_urb(ch343->ctrlurb); + for (i = 0; i < CH343_NW; i++) + usb_free_urb(ch343->wb[i].urb); + for (i = 0; i < ch343->rx_buflimit; i++) + usb_free_urb(ch343->read_urbs[i]); + ch343_write_buffers_free(ch343); + usb_free_coherent(usb_dev, ch343->ctrlsize, ch343->ctrl_buffer, ch343->ctrl_dma); + ch343_read_buffers_free(ch343); + + usb_driver_release_interface(&ch343_driver, intf == ch343->control ? ch343->data : ch343->control); + + tty_port_put(&ch343->port); + dev_info(&intf->dev, "%s\n", "ch343 usb device disconnect."); +} + +#ifdef CONFIG_PM +static int ch343_suspend(struct usb_interface *intf, pm_message_t message) +{ + struct ch343 *ch343 = usb_get_intfdata(intf); + int cnt; + + dev_dbg(&intf->dev, "%s\n", __func__); + + spin_lock_irq(&ch343->write_lock); + if (PMSG_IS_AUTO(message)) { + if (ch343->transmitting) { + spin_unlock_irq(&ch343->write_lock); + return -EBUSY; + } + } + cnt = ch343->susp_count++; + spin_unlock_irq(&ch343->write_lock); + + if (cnt) + return 0; + + stop_data_traffic(ch343); + + return 0; +} + +static int ch343_resume(struct usb_interface *intf) +{ + struct ch343 *ch343 = usb_get_intfdata(intf); + struct urb *urb; + int rv = 0; + + dev_dbg(&intf->dev, "%s\n", __func__); + + spin_lock_irq(&ch343->write_lock); + + if (--ch343->susp_count) + goto out; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) + if (tty_port_initialized(&ch343->port)) { +#else + if (test_bit(ASYNCB_INITIALIZED, &ch343->port.flags)) { +#endif + rv = usb_submit_urb(ch343->ctrlurb, GFP_ATOMIC); + + for (;;) { + urb = usb_get_from_anchor(&ch343->delayed); + if (!urb) + break; + + ch343_start_wb(ch343, urb->context); + } + + /* + * delayed error checking because we must + * do the write path at all cost + */ + if (rv < 0) + goto out; + + rv = ch343_submit_read_urbs(ch343, GFP_ATOMIC); + } +out: + spin_unlock_irq(&ch343->write_lock); + + return rv; +} + +static int ch343_reset_resume(struct usb_interface *intf) +{ + struct ch343 *ch343 = usb_get_intfdata(intf); + + dev_dbg(&intf->dev, "%s\n", __func__); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) + if (tty_port_initialized(&ch343->port)) +#else + if (test_bit(ASYNCB_INITIALIZED, &ch343->port.flags)) +#endif + tty_port_tty_hangup(&ch343->port, false); + + return ch343_resume(intf); +} + +#endif /* CONFIG_PM */ + +/* + * USB driver structure. + */ + +static const struct usb_device_id ch343_ids[] = {{USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D2, /* ch342 chip */ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D3, /* ch343 chip */ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D5, /* ch344 chip */ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DA, /* ch347 chip mode0*/ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DB, /* ch347 chip mode1*/ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DD, /* ch347 chip mode3*/ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D8, /* ch9101 chip */ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D4, /* ch9102 chip */ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D7, /* ch9103 chip */ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DF, /* ch9104 chip */ + USB_CDC_ACM_PROTO_AT_V25TER)}, + + {}}; + +MODULE_DEVICE_TABLE(usb, ch343_ids); + +static struct usb_driver ch343_driver = { + .name = "usb_ch343", + .probe = ch343_probe, + .disconnect = ch343_disconnect, +#ifdef CONFIG_PM + .suspend = ch343_suspend, + .resume = ch343_resume, + .reset_resume = ch343_reset_resume, +#endif + .id_table = ch343_ids, +#ifdef CONFIG_PM + .supports_autosuspend = 1, +#endif + .disable_hub_initiated_lpm = 1, +}; + +/* + * TTY driver structures. + */ +static const struct tty_operations ch343_ops = { + .install = ch343_tty_install, + .open = ch343_tty_open, + .close = ch343_tty_close, + .cleanup = ch343_tty_cleanup, + .hangup = ch343_tty_hangup, + .write = ch343_tty_write, + .write_room = ch343_tty_write_room, + .ioctl = ch343_tty_ioctl, + .chars_in_buffer = ch343_tty_chars_in_buffer, + .break_ctl = ch343_tty_break_ctl, + .set_termios = ch343_tty_set_termios, + .tiocmget = ch343_tty_tiocmget, + .tiocmset = ch343_tty_tiocmset, +}; + +/* + * Init / exit. + */ +static int __init ch343_init(void) +{ + int retval; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) + ch343_tty_driver = tty_alloc_driver(CH343_TTY_MINORS, TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV); + if (IS_ERR(ch343_tty_driver)) + return PTR_ERR(ch343_tty_driver); +#else + ch343_tty_driver = alloc_tty_driver(CH343_TTY_MINORS); + if (!ch343_tty_driver) + return -ENOMEM; +#endif + ch343_tty_driver->driver_name = "usbch343", ch343_tty_driver->name = "ttyCH343USB", + ch343_tty_driver->major = CH343_TTY_MAJOR, ch343_tty_driver->minor_start = 0, + ch343_tty_driver->type = TTY_DRIVER_TYPE_SERIAL, ch343_tty_driver->subtype = SERIAL_TYPE_NORMAL, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) + ch343_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; +#endif + ch343_tty_driver->init_termios = tty_std_termios; + ch343_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; + tty_set_operations(ch343_tty_driver, &ch343_ops); + + retval = tty_register_driver(ch343_tty_driver); + if (retval) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) + tty_driver_kref_put(ch343_tty_driver); +#else + put_tty_driver(ch343_tty_driver); +#endif + return retval; + } + + retval = usb_register(&ch343_driver); + if (retval) { + tty_unregister_driver(ch343_tty_driver); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) + tty_driver_kref_put(ch343_tty_driver); +#else + put_tty_driver(ch343_tty_driver); +#endif + return retval; + } + + printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); + printk(KERN_INFO KBUILD_MODNAME ": " VERSION_DESC "\n"); + + return 0; +} + +static void __exit ch343_exit(void) +{ + usb_deregister(&ch343_driver); + tty_unregister_driver(ch343_tty_driver); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) + tty_driver_kref_put(ch343_tty_driver); +#else + put_tty_driver(ch343_tty_driver); +#endif + idr_destroy(&ch343_minors); + printk(KERN_INFO KBUILD_MODNAME + ": " + "ch343 driver exit.\n"); +} + +module_init(ch343_init); +module_exit(ch343_exit); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_VERSION(VERSION_DESC); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_CHARDEV_MAJOR(CH343_TTY_MAJOR); diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/ch343.h b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/ch343.h new file mode 100644 index 0000000..c53a875 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/CH343/Linux/ch343ser_linux/driver/ch343.h @@ -0,0 +1,243 @@ +#ifndef _CH343_H +#define _CH343_H + +/* + * Baud rate and default timeout + */ +#define DEFAULT_BAUD_RATE 9600 +#define DEFAULT_TIMEOUT 2000 + +/* + * CMSPAR, some architectures can't have space and mark parity. + */ + +#ifndef CMSPAR +#define CMSPAR 0 +#endif + +/* + * Major and minor numbers. + */ + +#define CH343_TTY_MAJOR 170 +#define CH343_TTY_MINORS 256 + +#define USB_MINOR_BASE 70 + +/* + * Requests. + */ + +#define USB_RT_CH343 (USB_TYPE_CLASS | USB_RECIP_INTERFACE) + +#define CMD_R 0x95 +#define CMD_W 0x9A +#define CMD_C1 0xA1 +#define CMD_C2 0xA4 +#define CMD_C3 0x05 +#define CMD_C4 0xA8 +#define CMD_C5 0x5E +#define CMD_C6 0x5F + +#define CH343_CTO_O 0x10 +#define CH343_CTO_D 0x20 +#define CH343_CTO_R 0x40 +#define CH343_CTO_A 0x80 +#define CH343_CTI_C 0x01 +#define CH343_CTI_DS 0x02 +#define CH343_CTI_R 0x04 +#define CH343_CTI_DC 0x08 +#define CH343_CTI_ST 0x0f + +#define CH343_CTT_M 0x08 +#define CH343_CTT_F 0x44 +#define CH343_CTT_P 0x04 +#define CH343_CTT_O 0x02 + +#define CH343_LO 0x02 +#define CH343_LE 0x04 +#define CH343_LB +#define CH343_LP 0x00 +#define CH343_LF 0x40 +#define CH343_LM 0x08 + +#define CH343_L_R_CT 0x80 +#define CH343_L_R_CL 0x04 +#define CH343_L_R_T 0x08 + +#define CH343_L_E_R 0x80 +#define CH343_L_E_T 0x40 +#define CH343_L_P_S 0x38 +#define CH343_L_P_M 0x28 +#define CH343_L_P_E 0x18 +#define CH343_L_P_O 0x08 +#define CH343_L_SB 0x04 +#define CH343_L_C8 0x03 +#define CH343_L_C7 0x02 +#define CH343_L_C6 0x01 +#define CH343_L_C5 0x00 + +#define CH343_N_B 0x80 +#define CH343_N_AB 0x10 + +/* + * Internal driver structures. + */ + +/* + * The only reason to have several buffers is to accommodate assumptions + * in line disciplines. They ask for empty space amount, receive our URB size, + * and proceed to issue several 1-character writes, assuming they will fit. + * The very first write takes a complete URB. Fortunately, this only happens + * when processing onlcr, so we only need 2 buffers. These values must be + * powers of 2. + */ +#define CH343_NW 16 +#define CH343_NR 16 + +struct ch343_wb { + unsigned char *buf; + dma_addr_t dmah; + int len; + int use; + struct urb *urb; + struct ch343 *instance; +}; + +struct ch343_rb { + int size; + unsigned char *base; + dma_addr_t dma; + int index; + struct ch343 *instance; +}; + +struct usb_ch343_line_coding { + __u32 dwDTERate; + __u8 bCharFormat; +#define USB_CH343_1_STOP_BITS 0 +#define USB_CH343_1_5_STOP_BITS 1 +#define USB_CH343_2_STOP_BITS 2 + + __u8 bParityType; +#define USB_CH343_NO_PARITY 0 +#define USB_CH343_ODD_PARITY 1 +#define USB_CH343_EVEN_PARITY 2 +#define USB_CH343_MARK_PARITY 3 +#define USB_CH343_SPACE_PARITY 4 + + __u8 bDataBits; +} __attribute__((packed)); + +typedef enum { + CHIP_CH342F = 0x00, + CHIP_CH342K, + CHIP_CH343GP, + CHIP_CH343G_AUTOBAUD, + CHIP_CH343K, + CHIP_CH343J, + CHIP_CH344L, + CHIP_CH344L_V2, + CHIP_CH344Q, + CHIP_CH347T, + CHIP_CH9101UH, + CHIP_CH9101RY, + CHIP_CH9102F, + CHIP_CH9102X, + CHIP_CH9103M, + CHIP_CH9104L, +} CHIPTYPE; + +struct gpioinfo { + int group; + int pin; +}; + +struct ch343_gpio { + int gpiocount; + struct gpioinfo io[64]; +}; + +struct ch343_gpio ch343_gpios[] = { + { 0, {}}, + { 0, {}}, + { 0, {}}, + { 0, {}}, + { 0, {}}, + { 0, {}}, + /* CH344L */ + { 8, {}}, + /* CH344L-V2 */ + { 8, {}}, + /* CH344Q */ + { 8, {}}, + /* CH347T */ + { 4, {}}, + /* CH9101UH */ + { 5, {{3, 2}, {3, 3}, {1, 3}, {1, 2}, {1, 5}, {2, 4}}}, + /* CH9101RY */ + { 4, {{1, 3}, {3, 3}, {3, 2}, {2, 4}}}, + /* CH9102F */ + { 5, {{2, 1}, {2, 7}, {2, 4}, {2, 6}, {2, 3}}}, + /* CH9102X */ + { 6, {{2, 3}, {2, 5}, {2, 1}, {2, 7}, {3, 0}, {2, 2}}}, + /* CH9103M */ + {12, {{1, 3}, {1, 2}, {3, 2}, {2, 6}, {1, 0}, {1, 6}, {2, 3}, {2, 5}, {3, 0}, {2, 2}, {1, 5}, {2, 4}}}, + /* CH9104L */ + {24, {}}, +}; + +struct ch343 { + struct usb_device *dev; /* the corresponding usb device */ + struct usb_interface *control; /* control interface */ + struct usb_interface *data; /* data interface */ + struct tty_port port; /* our tty port data */ + struct urb *ctrlurb; /* urbs */ + u8 *ctrl_buffer; /* buffers of urbs */ + dma_addr_t ctrl_dma; /* dma handles of buffers */ + struct ch343_wb wb[CH343_NW]; + unsigned long read_urbs_free; + struct urb *read_urbs[CH343_NR]; + struct ch343_rb read_buffers[CH343_NR]; + int rx_buflimit; + int rx_endpoint; + spinlock_t read_lock; + int write_used; /* number of non-empty write buffers */ + int transmitting; + spinlock_t write_lock; + struct mutex mutex; + bool disconnected; + struct usb_ch343_line_coding line; /* bits, stop, parity */ + struct work_struct work; /* work queue entry for line discipline waking up */ + unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ + unsigned int ctrlout; /* output control lines (DTR, RTS) */ + struct async_icount iocount; /* counters for control line changes */ + struct async_icount oldcount; /* for comparison of counter */ + wait_queue_head_t wioctl; /* for ioctl */ + unsigned int writesize; /* max packet size for the output bulk endpoint */ + unsigned int readsize, ctrlsize; /* buffer sizes for freeing */ + unsigned int minor; /* ch343 minor number */ + unsigned char clocal; /* termios CLOCAL */ + unsigned int susp_count; /* number of suspended interfaces */ + u8 bInterval; + struct usb_anchor delayed; /* writes queued for a device about to be woken */ + unsigned long quirks; + u8 iface; + CHIPTYPE chiptype; + u16 idVendor; + u16 idProduct; + u8 gpio5dir; +}; + +#define CDC_DATA_INTERFACE_TYPE 0x0a + +/* constants describing various quirks and errors */ +#define NO_UNION_NORMAL BIT(0) +#define SINGLE_RX_URB BIT(1) +#define NO_CAP_LINE BIT(2) +#define NO_DATA_INTERFACE BIT(4) +#define IGNORE_DEVICE BIT(5) +#define QUIRK_CONTROL_LINE_STATE BIT(6) +#define CLEAR_HALT_CONDITIONS BIT(7) + +#endif diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/MAC/CH34XSER_MAC.ZIP b/doc/Freenove ESP32-S3-Wroom/CH343/MAC/CH34XSER_MAC.ZIP new file mode 100644 index 0000000..1eabc47 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/CH343/MAC/CH34XSER_MAC.ZIP differ diff --git a/doc/Freenove ESP32-S3-Wroom/CH343/MAC/ReadMeFirst.txt b/doc/Freenove ESP32-S3-Wroom/CH343/MAC/ReadMeFirst.txt new file mode 100644 index 0000000..9b6f9f6 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/CH343/MAC/ReadMeFirst.txt @@ -0,0 +1,5 @@ +For MAC users, the CH343 driver will always need to go to the official website to download the latest version, +as older versions may not be suitable. + +Below is the official download link: +http://www.wch-ic.com/search?t=all&q=ch343 \ No newline at end of file diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/74HC595.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/74HC595.pdf new file mode 100644 index 0000000..0dac860 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/74HC595.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32-S3 Pinout.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32-S3 Pinout.pdf new file mode 100644 index 0000000..3b2fc1c --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32-S3 Pinout.pdf @@ -0,0 +1,2532 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[6 0 R 49 0 R 91 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + 2023-04-06T10:04:32+08:00 + 2023-04-06T10:05:25+08:00 + 2023-04-06T10:05:25+08:00 + Adobe Illustrator CS6 (Windows) + + + + 256 + 116 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAdAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AkUn5N+YZPI2k2qaZYHVb vWDcXaSWXFo4UgvlRr2RZqz/ABzJxYceNRscFMrRHl/yNrkWuW91f6JdyOmhWVnBcXdtDdypdQ29 xHMpuWkVoaO60ZFbkKeGKCULov5e+botC8p2+k6XLpWtaRcG9ubhrSG0jNzDpriNZmilkM6SXCCK SQ0LK/TGk2ti/Lzzinl+ztpdCup9X/Q+n2vlq7E0ajSLyGeRrl5WLx+mSGjYsinmF4+2K2iPM35a +a7mw8xab+jHuNP0Z0i8soAk3rQajrEOoXPCNmUEQQwrHRiKioxQCn3nHyfcXvkrydY2OhP9U0/U JJr3Txp1v+7Qw3Kl2sPVENHlkDU9Tvy64qClXmHyf5kk1/Wp9H8t3j2+s+XLmzaa6EEa27DTGjgj tfSuHZQ8hETW7x0VvjU0xULNW/KbWdK8hiwi0+bWtSvbyK+t7XT0S3t7B0jiUwoJ7sPCZShrOnLg a/CNqq2yzy/p+vf8rH8w6tY6FNo/rW62sE94We3vHSf1JbmV1kYg/FwgUL9itabKChj8flTXYNX8 7wy+Vr280rV1ef6zN9WluGuHnWiRL9bVLqDiPUCyFGUD0960wJVNb8iebbn8u/I2n2thPFqcEbaN rCNMsk0FjqNs1vczM5Lii8Uk4CvHZRsMVYff/lR+YuqaTa3F3pyya4sWp+vLMoZuVtaafZ2jROJE 9OaZbJ3ic1AJ3FMaTbMF8neZH81RXNvpN8mrNqtld2Xme5ljIh0aO1iWWzlPqeoHJWRHi9M8mblX vihI4vy080XOiTaauiXem3E2kix8zXjSxv8ApC/e/gf6xHSSQylI0lk9RgKBgvtitpvZeSPzEXTP O8muxfW9a1yz0hFaL97Az2k88LJGKqSPQWOR18XO+JSCm8vk7zhomqxWWkTutrdmL6zfadaw26Wy XOoq1xFbJL9ZMUaQEsE5MAat1wUm9kNaH85WS2ike/OorGkVu5W2W0aBUkWeS6JHIXBcIU/2NNi+ O67Jhoh8+ajq2j6rq9vqlpa215BG1oRCrcZdOjjlklRC1Yvraty3qA1aAdCuz1TCwdirsVdirsVd irsVdirsVdirsVdirsVdirzvR/zYudSjZm0N7BlLUjvJZY2YKFqQVt3X9rapqd/A5rR2gT/D9v7H o9R2BHEf7wT/AKoB/wB8idJ/M+6v/wBJ18uX1dOaJEWAGVrj1ZxByh5rFVV5cyT+zvl2n1RyEiq/ HucTtHsoaaEZiYnxdOo9+5TLS/zBs9R1e20tNG1m3muU9RZ7iwmitkHpiX45z+7U8T0r1+HrQHMd OynFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXg XlvyXqP1O6aPzXf6mkh4CW4gkDQtxO6D9Ip/MDuCtetemZmTSyiaNfj4OPj1UZCxZROh6d+g7LzN d3fnTUwhSKNphbSFrNnu0UGJDcXRb4jwIp9nvlefTyhEE9WWHURmSB0Tvy95606XXrRpPPV7q9qJ 0iFi2lCFZHu42S2SSSKCN6k/Gu1DttmLbkUnUX58flawX1NYMBZVbjLbXSn4xWlfTpUd6HDaOEr3 /PD8t0e456hOLe04i7u/qd2YIZGqVhkcRHhIVBYA9QDja0ul/O/8sogS2rOQr+mxW0vCAwNGFfRp Ve+NheEsu0fV9N1nS7XVdMnFzp95Gs1tOoYB0bcMAwB+8YUIzFXYq7FXYq7FXYq7FXYq7FXYq7FW PfmF5u/wf5M1XzL9U+vfoyIS/VPU9H1Kuq09TjJx+1/KcVDwYf8AOZl8bQ3Y8kJ6IT1T/uYj58OX Dl6f1bnTlt0xS6X/AJzLv4rY3L+SE9JVSRqaxGzhZQChZBbFxy5DqMVVh/zmDqhFf8EwjdVIOuW4 IZwSqkG3qCQDQYoZ7+S356yfmVqesWEmg/oaTSEjZz9bF1zMjshXaGGnHh1qcU09XxQ7FXYq7FXY q7FXYq7FXYqwaK0vZLQGOe3dynETrGzLzCkFtrYDY78for3zSY+0JzjcchPmOI/7xrOkyDY1fwWX N1qenaZqNxb6vpmnXEUcHp3OoApbI7TIKTVS2IEobgvxfaYU8MydJqzkmYmfEQOW+3zAZRwThueS Vt5s89NcGOPzX5M9N6mE8puZf1axpx+sH4WgR+RrXkNtvs7G2yl2nz/mbqOsy2cHmXyzqNlDIJJI 0R5rpYmlIkDRxsFTiq8EqT9pgxJAbAqZ/UPzo+riIah5eJYFZZJbW7eRhw4hmZJYo2avX92BTt2w 7o2Zdoq60ul241t7aTVKH609kkkduW5GnprK0jgcadW64UIxEREVEUKigBVAoAB0AGKt4q7FXYq7 FXYq7FXYq7FUpvvNvliwv/0feapbW998P+iySqsnxiq/CTXftlUs8Imid3Mxdn58kOOMJGHfWyhJ 568mxSpDLrVnHLJQpG8yKxDbCgJ75H81j/nBnHsvUkWMcq9yM8w+YdH8u6RPrGsXH1XTrcxrNNwe ShmkWKMBI1dzykdV2GXk04Dx786vza8g61+W+teX9N1CWbWdVs+enWTWd5G86rLu0fqQoCo9JxWt KqfDImQq2QBt8kJb6zb+mh0a4mH1X6rcQywzKP74yfscW7DDaKaC62Zrhn0KV4LiOKI25iuAqrAq qlGBD/sDqcbWlSOz1WdZpZrCeCSS9tJBEIJyBHGsoZh8LbLyXvXfASnh2eyf844+b9A8i+ZvM935 snl0q21b0l02Wa2uSJyJZG+ALGx3B7jESBUgvp3y3+ZHkrzIl/JpGpLNHpaRy6g8sU1sIo5Q5R2N wkXwkRPv7YQQeSCKTltY0pZBEbuL1CoYKGBJVgCp27GuQOWINE7tkcEyLANLTrujL9q8iFSFFWA3 PQYPHh3hl+WyfzS1Pr+iQXLWs19ClwhAaFnAYE9NvpzKGGZFgGnEOWANEi1svmLQ4V5S30Ma1pV2 CipFab4jBM8gVOaA5lEHU9PBQG4jrIoeMch8St9kj55Hw5dyTkiOrm1PT1BLXCKBsSTSmPhy7lOW PeiVYMAwNQRUH2yDN2KvPbHV1SBFlktoSWbkkVwgUDt/u/v/AJjx02Ls0wjQhKI8jL/incZBivY3 +P6rbfW9QsdXgsdN03WZGjg9GzuXSSKakqFvWBeUfAAWWo6gZkaTReFOUuDhvrvv8y42p4OEUd/x 5JJb+WPMNnA0Mn5Y+WbyJ5F9SG0NtbITuPW/eQyV48jsRWh2PY57hbJpZxec9P1Ce50nyBpOn3Eq OjajFdQLI8YR5Y0aOOKMk+rwVv3lCd9h9kqyHQtZ8+XWqG31fy5Dp2nhj/pyXyTkjhUUiVFP2zxq T9GKGT4UOxV2KuxVA3mvaFZTGC81G1tpwATFNNHG9D0PFmByYhI8gUiJKh/izyt/1ebH/pJh/wCa sPhT7ingPciJtb0WCUxT39tFKKExvNGrDkKjYmu4NcxpZ4RNGQB97UckQaJCweYdAJAGp2hJNBSe Pc/8Fg/M4v50fmF8WPeF8uu6JDM8MuoW0c0ZpJE80asp8CpNRmWMGQixE17mB1OMGjKN+8Kf+I/L 3Hl+lLTiBUt68VKdK/aw/lsn82XyLH83hq+OPzDCPM3lvy7decl1ieKD62noul59aZHXgg4sEE0Y 27bZymvlnGpqMY8G2/X5cQeo0XaGeOm8OJPAb24bG/nRSvVvJ/lW91GC5kit72aMKEmlvHB2ctSn 1jf4mJ6Zi55agTAhGMo9Tf8Ax9ysPaeqhAxFxB6cA/4lK/z3tHt/yz1n1NI0jS2gk06Sa8sJzLd2 6PqMAWRIvqcJNSpH2h369M62fIvLxO7548kTWsn5l6G1rqE116dpcxTyTgw+lKv1gmJf95NgrK3X 9r6Br9f/AIudu77/AHS/S5GH6/x+x9Yx/wB2vfYfq+ZzYR5BxjzXZJDsVeJf85IT2scnloXN01rC l/DJNNGeTxRgvylVOTVKjcfuz8+2Ydf4QT/Q/SfL9Pwbwf3f+cqf846RJeTebbmCKPWfqyaVJFf6 kfq7Wx5XbiZgVj5RD7cwDjkKj48yMfJhJ7StrBY6i0ZtNO0tBAPgspRwqwDERrztaBvtV4D+OYGf +9N1y/HV2uns4RVnfu2/3JdeyxywRxrLa3X71G9BpiqgUPxA/WDvX2yqZsdDv3/8eb8YIJNSG3Ov +OoXVbcx+brpxb2duqkfv/XPMVQUrGJ46e3wD+OdNDW4Y4xEzHF3WP1PGZInxSaHvv8AaoayY7iy RIvqt4EeoSWfgBQGpB+tH+bxw4tfgBvxIj4j9THMLjtR+P8Ax5lUen3n+hSwWMQUW0PxxsWANBUC jgHbod/nkI5IkHfmW+UJWCB0H45r7nTb94JQLT1GZgeB5AN03/vcMckb5/j5IlikQdvx802l13RL DhbX2oWtpcKiloJpo0YAjwZq5jcEjuAS58YmuSz/ABZ5W/6vNj/0kw/81Y+FPuLLgPcw2w0KNbGK 343kMYqEik4vwCig+I27MKjYUzSYu3c0wDLHwk3/ADvt2dlPTxB2lfy/Ws1DSbM6ZqwvNFvddjEN rB9SRijzJHco6+kUSAj0nPPlXtl+l7TyZ5yhKHDGPXff5hp1GKMYgiXP8d7FG07yGHkr+W3m6kci vNKWuy4aJHiiaIrfMXASdx8B6McznDRkHljy+Fkhl/LrW4Va5Ek7xX8sjASUCPCzXS7H1qSICoQV /l2VvzVNH8ueR73XbWKT8vvMNlL6jRx6lcyz+iqs3MtcP9cLEMwJPwuPvxXd6h5b8raH5bs5bLRo Gt7aaU3EiPLNOTIyqleUzyMBxjUBQaCmSY2muKuxV2KvJPzK02e48zySJpi3S+lGPWMxQ7DpxDrm w08qhzcnEduaTa3ptxPdqyWC34CU9ZpDCR8THjx9U161r75bCVDnTKJZ1dwSRXtwFEdqpMZEYBcH 9xGC3VQOlD8s5XUA+JL3/oDq5j1FB20d0ImWix8hKDD8R5hz0Zg7byfhmNASr5/jn1YAFEPBNBrG o8Smnq8zFSoaQPVU+LZl4g06U7Z2cSDjj12cMxIyT/hs++9h5/ikDLFdHRzB8FTb8DYKGCiq7xCQ PT25ZcCOO/Pn+mqaJRl4VUPp+n9F39qZSWskWsBxClmv1eNfXQl/2F+EKGX785TUj99I/a9ppZD8 vEc/JDapbzT/AFb92L7i5+FiYygPHepfetPwzHyAmurlYZgX/D9v6GE/ndpsFt+Xev3P6Gh0VLa5 sJEvxIJri3L6hbh5liXkDCwWkaKf2W2GbafI9XRg783gPkHU2n8+aKI9Yl1IwDUAqyxmBIFaIkLE Wkg+FvtcQy0P7Pjga8XgNju+/wB0vuLfhPrfWMW8afIfq+Z/XmfHkHGPNdkkOxV4Z/zkyGZPL4E8 kNbyMBoQzyoTz+NIxKvJh2+EEnblmH/yIP8AU/SfL9Pwbx/d/FX/AOcb0S+PmmQRL5glt49K43c4 FsLaQPdn99y4O8VfimpXkKg8syMY8qYSPm9tg01rPU0WPTotJjWICkL+qiErUqoUpUE9DQZgZgfF J+12mCQ8AC735NahaySi3PAXhDKODlkKgd2Jc8j9+UzjddW/FMC/4fx7kwuNL1FdW1B4rb6tFJIh UxxvKslEA5bFQKdPv+mzJin4kiBV+V28uYniKEGmaylvOFtXVmEgESxv+9DKB8TctufTfplIw5AD t39ObHhlR2TgXAsxa2strawKLeIuZAGYNQAgiqnbN1h8MYxxGpVytkckokDpTpdVgWN2jSykdSOC cAvIbdy+2WiWL+cPmGJzSramGeefLuq3uufWLXy/9aieGP8AfRO4WtNxRSo2zLwZIiP1OyxT9O5S 3WPKOtvec49Elvww5NO3rRmpYniVZzlkMsa50zjMd7KNJ02KNpT6xfkoX/S0BAqa1X4uu2RyX/Y8 xg04F73/AFlBrOO10XVlE2svySEFtIWt8KXCCsHHke/x7fY5ZTqeQcns/FwSO5PvSnUI7f1pAdW/ MFjwi/d29rOFI+rJRVcWgFQPtnlX1K1Na5hO2QrWywSSIlz+ZEnpuLkyAF1ZWCO0S80+yoFONK9e NTTFXonlTykum3EeqrretXwuLOOJrPVbgyICFjpK0LIhjnonxUpuWqKnCgsnwodirsVdiryH8zNO mn80ySJo91ej0Yx68PqcDQdPhRht882OmPo5uRjkAOaSa3YXVxdKx0e/vOKcBL6bxbB2NKLFv1rX 3y2BocwyjMd4Z3exTJf3JWCaCvp7CIyk/uIxUN6bDtT7XUZyWpB8WXP5eQ8nVz+ooW1huUjK/V54 gySkxmN3L8+tW9NuLSd9xxzHhEjoRz6fs6/YwA8kVfxyzX97byRSxW7u8bRtC7q6ON6OkTHfmdw2 3Y+HaYiBGJHP3/tcTKOKUokGuXI/fX6fihG+ux2DSMtx66oWNokDSEMRXgsnokHf4ag0y30mVbV3 3+1qJkIWRK65VfwvhRksEia0JBaTW/8Ao0amco0q/YX4ePBxXOV1I/fyP2vZ6Qj8tEWPdy/SELqk U0xt0a1uLxVdiOMbR8a03J9NSa0zGyAmtifx7nLwkC9xH43+lh350aeth+XHmC6i0y50mJLjTymp T3AuJoyuo25LzxerIJYF/wB0rV6HlsubeYuJ6uhid3z95A1d7j8wNJJ1b696JvwrmIW/FWgryB9S HZzX9vamYGvjeAiu7z6+4/c34T631nGaxofYfq+ZzPjyDjHmuySHYq8N/wCcl7l4f8OlLv6m0d5F KtyCS0JXnSYKr8vg67R/7LtmHX+EE/0P0ny/T8G8f3fxVf8AnHgzatceZnZX8yyRw6ZGLlXNpBEX e8PC6j5KZoXZv3lVb4SdsyMUavamEj5vcEs3t9TYDT7nTwtuqfGWuwtAv7tGAmqBT4TXptt0zAzD 96TXTm7XBIeCBYO/Ll+lrUFuJII4zBPdD1UJjWJoyKDZi3pL06UrlUwSORPw/Y3YiASbA27/ANrN S6A0MFCOoMi/81ZuKefsNepH/vkf8jF/5qxpeIPOfO1tOfOtlcRaTcORHCv15A0sUYZ2BLKscqtx BqRmo1kT4oNH8fB1GrH7+JESeXq7vsSzzJBcy6dHaixvNShWUMIVgeFgQHHMsIeR+0Rue+Y2SJqq JHu/Y16sXADhlPfuI/Q9f04U0+2HEpSJBwPUfCNjm9x/SPc7qPIIjJsnmOgatc3mmQTQ3N3qCcqf WRNdIz/Ey0K+r/kkdO2YwhIcz9pej1OEQmQRGPlUf1KEvmO3tYNYF95kutFEEFrI11Kk0/1cSXMa q4ExkB9YyBOnQ198njjIcy4uuw1ijIRjXEdxXy2UL3zXZG4u1X810tIbSNGuVks7IcQFSFn9Vo0B DysGHD+YAdjljqEAvmHRE1YSH842kjkJIsuFoSOJJpVU+EAELuPxOKp9oXnHyto2ryJqX5jpqpWE W02nXH1cEXEbrF6oMaiRSSjArWhZifChWmQP+bf5bJctbN5hsxMsQnpzJBjKCQMrAcWqjBhQ7jG0 UyPS9V07VtPh1HTrhLqyuByhnjNVYAkGn0imFCKxV2KvPvNFmX84esLK4kPoqPrKmsOwO1PRk3Hz zaaeX7qrHP4/e67NH97dHl8PuSrWLKWSxZHsry5pKh9OMKp2VgGUi3+zTr+OXYpgHmB+P6zVmhce RO/46J1fWbnU7l1tZ1qY92IJP7iMdTC9V2pTkdx27cfqYXlkaPP9A/o/pcuUfUfx09yFNhLzl5Wk or6rbcW58zvxP1c8WbqOlP1Y/hmzsev4+ljw+X4+TriKdvMGoxiwnSMTcxPKFdHLLQla28vhT7R+ 7p28CPCibHL8fxB18hI5pjhNXz6Hb+qfx9gG9tJYNMkij064lWL9xHDHu7RkceSk2xp8Pc0bx7Zd CYM7Mh3/AI9X7GjNAxxkCMjW1Du/0v7U5uLZhfzMLW5jBtoQXNHrSMbL+6k3Hz+jw5DVD97I0fx8 C9zpJfuICx7v17hC6hZMyRg2lxP+8Q8Y/hYUHWvoDb6fuzGnDyP4+Dl4snPcDb8fxMK/O+zWD8vt evV0m/silzYg6ve3XqhCuoWx43ERmYzwLX91vKAS2ydc28/pLohzeA+WfMlrpvnby/f6pq1pLYxC 9Vp4BxaH1Y2p6vB6nm5FCW7nc5g6zDLJgMYjfb727FMRnZfSlt5+8lzW0c0et2bRugZW9ZRUUJ6E 1/ZOZHjwjsefuP6mrwyd1U+ePJwJB1mzqta/vk7cvf8AyDj+ah5/I/qXwpOPnfyeK11mz2rX98nb lXv/AJBx/NQ8/kf1L4Unj353eePLuoaloFvo+vQR3thfpJLcoPWS3KBxzYV4GjEdvpplcYE5vEH0 mAH2/NndQ4etpt/zj0DfT+bAfV8wHhpUatZP9XtmLSXgEV5GHPOGQn4j6b8UO4WmZGIc9qYSezQa b9W1ArHpt7ZBLdV4zzfWuAAX4FdlueXH9n4zttQdBgZo/vSaPL8dHa4J/uQLHPl+CFS/s2a2QG2m lHqofTjAV9gfiJFuNvp+7K5w25Hn+P4W3Hko8wNvx/ErXVsx8waios7hElClp3IZH4hRxU+lJ4/z Z0UT6Bv+Pm8ROH76fpO/Xp/uf0oa7tZ/0a6tZTMCqqbdCjMeg2YQH7Pj92SiRxc/x82rJA8B9J93 4ilPmTTDJ5q0qQaZekpZwqLosHgSgf4ZFNvOD7/8RzntdG810ff0+4ssuK8sDwy+kb9Bz5+kpf5i 0xpdMiX9H392olFIYwI5BQP8RItDtv0r3zDnDblL8f5rHWY7gNpS36fH+i9h05eOn2y8SlIkHFuo +EbHYb5vcf0j3O8jyCIybJ55p9n5eC8pbbT2gdRw9G0twGG+9fRpShzT6fRdpgnxTfu4P1Np7XlL cZJf6aS4+nZWmqT6aNEtr1I4+El/ElvAoM6gfWHiSN6bEL/l0y7R6fWwkTnN4/4fp/QB0YnXHL6T MyreiT+lAW93+ZSWplupPJTygcrlo3uo4xFH+8aTkwkPwenWh271+HfYIR2nWn5kzwpNBB5T9BlH pz263UqyAIykCgQKOYWhq1ACKYVZ2LCxDchbxcqk8uC1qTU9vHCxUzpGlEqTZQEqoRSYk2VaUUbd BxG3sMVtExxxxII40CIv2UUAAfIDFV2KuxV5z5vt4282PIbKSZhAv71nCwkU6U9GX4h16/0za6aX 7rn1/HV1uoj+95dPh9xSvWbSM6eitYCUIyitrKPWOx+1W2Gw7nLsUvVz+f8A0k1Zo+nl8v8ApFO9 RgQ6ncn6irEtHV7iUBz+4jG1YpPh2p9rrXpnG6qI8WW17/oHk5ch6jt+K9yD+rxxvKf0fGORmFFk 5E8j1j/0c7n9jcf0xuEAn09/4Hp+TGvL8fJTubVP8U6s400sWdeUl5KPTbb9j9xKfn8R7fR3kJfu Y+r5c/j6nVyx/wCEZCIXy+o7H3ek/elmrWyCyuI30osJJ68bZwZCdjyjP1TaM/PL8UvUDxdOv/SX NxdTD0EGHM/wnf4ejkyS7hQX8zC0YH6tDV52DbemPsD0ZasP8xnF6ofvpbfjy2L6Foz+4gL+H6/U EHf2sZWMmzLfvE+C2kAatOv9wu305iziO75f2OZjmd/V06/9JMP/ADuhSP8AL/zBMNP1GCRp9PjG qanOXhQx6jAfSnQSHnBHyrGx51LNQ983M+RdAOb5W8y2l7fXGnWttc2mpXNzJKsNvp9XdGZ1UI+7 V5UBXc/M5GHJMuaW/wCEfM3/AFbpv+Bydop3+EfM3/Vum/4HG1p3+EfM3/Vum/4HG1pE6Npeq6R5 m0s3vpaXM5Fzbzaih+rlVZlBYUIKs8bJU0FepUVIVe//APOPsQv7jzX9YjfUi8WlwlNEmZLV/Ua8 Uw3a8yDHL9ksUPpoa/BkMXI+9M3s8UUY1FmXTbm1It1HDUZTKUpx2qyXRZh2+I7fdmBmH707dPx0 LttOf3IF9enP/dBvUIY/QiQ2SsDKjf6Mw9SoHc+gPh38cpmBXL5f2N2KRs+rp15f7pL9W1hovOmo WX6GdlkMam+upW9H7KHYpbTkdaH4j75vhmIiB3Orh7O4Zw8c5PVP+GokivfIdyG1bU5bbSWA0eG4 VQicbW5drg9B+1ZivHv94wjUG7WHs1gyejxDHzMI/fxvU9GfnpFi/AxcreI+mxqy1QfCTRdx8sqJ vdxJYhjPADYjt8kXgQ7FXYq8r0lPMtvZy/pPTE0q2jCrHQ3rIAKAc/8ASwoH2QN+3yzGHaOqkbkB /pXS6bBkEalHh7t5f8UrImtiz16XV/LMV/AscaWlvPM0K3QWcGMPJezSxxhTSTxr4nbJ49XnyXHI AIjltTk6KExkkZRruO+4+JKS6XomloYZdP8AylsIbowyfuzeacrLMnqwmA058g0R+0tVox8N7HZp 9Z+dfNulJb6cn5ePp8TtMVSPUbH6vG7s0gDuh4o0rluo+144bWmeaFf3uoaRa3t7YSaZdTpzlsJW V5IiT9lmXatN8LFHYq7FXYq7FXkH5m/Uf8Uyet9e5+jH/vNx9OlPfvmx018HRycV0k2vHSzdoT9Z /u+tgIxF9puoFPi/hTLIXX62UbZ1e/Uhf3IdQW/d1a5K8v7iPZamtKe3WucnqeHxZXX4AdVOuIoK 2+oek1BQkSmsnD1Tv1QUFK/7r2zGhw18/wAfqYCq/H49yMm0+yGvahK5d2kcVW74lAafsVIPzzay 9pOGRw8FcG13VuYOwwScvFfH0q6QepaPp5tJlEjANIHrbmP1F5U+GMih4bdDWmCftX4Y4uDirahK 786Yn2dGQGPGY3vdVXkj5ltE1yh5swt4/wDeor6NOC/zftZj5JieTi7xe/J3eCEo4AB0PTmhdVNj /o2x+2xrZcOX7P26dvD6cqyVt+hyMPFv/vv0MM/Odopfy68wTq2pMzT6dGk2rq6WRK6jbn0LiPiA scXLlzYDlyO7EZt5/SXRR5vnXyZdt/ytXyZDLHpzrBqcEhOmqOLh7gVWQ/tMOG3LehwR5LJ9ozfk 3+V891NdTeW7OS4uJnuJpGUktJKaudz0JPToO2CWKJO9/MoEyFFPyP8AymVCg8sWfEgA1VidvctX B4MfP5n9aeMuk/JD8ppOXLyxZfEamisu9COzDxxGGPn8z+teMvnX/nIiws7D88fLGn6dDptrbWuk 2kUMWqj/AHHhVuLmgn6nhTY96++WICa/kC/+kebYJQrmWPTYxD5cUm1nDSXg9CeQikZm5emrkrQE EEUyGLrz59WUvg9rQ2Q1M0+tbW6impjdaBdj6vxFx07198wM1eKfd8Ha4OLwR7+nNdfmy+qoKJ/e pva8PW6e37Pj75VOq+PTm24uKz7uvJjWsHTU/MS+9Q3Al5JyN6I2svsx/wA4b/OubYubpxP8nGqr yvi6qXmNtJ/REgMcQ3T49NaL6z1GygN/wW2AM9J4niDc/wCdfC9c0Lj+hNP48uP1aHj6n26emKcv fxyYeX1H95L+sfvR2LS7FXYqleq+WNC1W4juNQtFuJIwFHImjKKkI6g0dQzcqNtWh7YptVvNB0a+ 0s6Te2cd1prFC1pMPUjYxyCVOQataOobfFDG2/Jr8sTam1Hl+3SBm5lYzJGeVFH2kdTtwWm+2Ck2 3B+Tv5ZQCYR+X7YicFZQ/NweQpWjs1GHZhuDuN8aWyy21tbe0tYbW3QRW9uixQxr0VEAVVHyAwoV cVdirsVdirEPM35l6V5f1RtOubWeWVUVy8fDjRxUfaYHMjHpjMWC2RxGQtBX/wCb+h2cwia1ml5L yDwtE60qR15ddsnHSSPVkMJKez+cbCK5kgaJgY+IJZkSpeNZB8LEN0fqRmoy6yMJGJ6e5xJZQCQo xeetPkXkIHAo5+J4wSI+tBy3r2p1ysdoxPT7mIzgsev9St5fMeoRC6mRoHo8ThUT41oOJaVD+A3y Ob2Xy5J+N4tRn/DUjXyk5EPaDFEnFweqFb2AgtV1u1ET3DXUsSwN6bRwhCWNftCk/wAQ+LqPo6bO X2Rz5ZCs3Dt0jL7fUx/0TYcUSTjuj3x+zyTa6uom1eSMXThpLaJh66AIo9MGorLHvv4ZDLHgyGBO 4FfL4u60/qwidbE/H7kJqU8SJBW7ZOcnwvbqGY8QNiBO23xeGVTI23+X9rkYok3t06/9IsO/OyT6 x+X3mBo9Q1G9b6zp8TfX4BHp8hXULci3uE9JfS9LlyLBY+fKlXpQbif0l0Meb5evpo4PMOiX1/Fp 9jawOYnOlsyEiGdpDLP9WIlST96Btxfio+EbZGHJJ5vRtD1Ce/0mfUNO1OwS0SeSKP6zqWr2/No4 g5b/AEi6ShQunICo+L7VcjLFGXMJEiORZVYxac1vrv6R1O0t7lIpf8PRQ69dSqZleXgl0z3MRdeE aAtGoNQx40oBHwMf80J45d7H7iW8t9LvNRutT0yS2tolmvJLTVtTuCscskNuSVgupJP72QLsOlDh GGI5AI4z3vKPMF/Z6x5i0dreeGeRkjhuTPNePZrIbmTivqXjGdYvSZC+/UtTLWL3X/nHk/VpPNsT zGzEkekp9W0OLnHc8nu19FpigMTyV4Rv6qdQeTdcji5Jk9lSWMamoOoXkhjgUkanEI3pxA/eAtb/ ABCv8m/Wp65r85Hinf8AV97ttOD4A269Of3Fu/kT0YXa8MYWRFJgVObEjuonO30ZVM7Df5f2t+Ib kcPTr/0iiNWuIh5icG7nBEifumQCM7LsxMkex77DOd7QyxGtI45D1DavT068Y2RponwB6RyPv+4q Orz26ekBdvH9qv1cc69PtVnNPbKe0MsBw+sjn9O/z/efJs08Sb9N+/8A6RZ7p5BsLYglgYk+Jup+ Ebnc53WlP7qP9Ufc8/m+s+8q+XtbsVdirsVdirsVdirsVdirsVdirsVeRfmTqZtvNjINWvbMiKIi GBA0Q267zRj5/Dmw08bhyDk4h6eSTa/qrw3EUUmq39tII+TGAB1epPxHjdlR06DLYR8h+PgyiPJn V3PI99c8ZrtwDGK/YoTBEacTNH48vsjfxzlNST4kufP9A/pfodVM+o8/x8ULDNKglUzXZKCbmXYV Uqd2QfWATx7Dfan048ZEXvLr+PqYA+/8fFSkvHk80arGl1e3Hputbdv3SICOi1ni6/6o3p8j3EY/ uYmojz/EXWGZOoyC5Gq26D3eofcgdXvmTT7l/rl9bhJuLSowdkO3wKBdbp4Hf5mm12HHchtE7fj+ Fo1WWscjxTjv8v8AZ8k9uLsm/lC3dwxFtC1JAEVQUHxbyxfM7fT48fqpVmkL/V94e80cbwQND9J+ woXUrxoyitdXVuRIlWjo5NQdqeudvo+/Mac66kfj3uZihd7RO34/hYZ+dUv1r8u9fRdU1PVmFxp8 Dw3NusFlIRqMH+jzkQqIpI+VWZRFy5KDy40G3mfSXQxG7xbyDZKt9q1/H5VtNQ1DSrCeSw06Jxyk kN1bxszgoFLJFM1Bx36AA5i54xliqUuEbb3X2tkSRLYWyXzNFb6L+YWi+XrBoPLukeZrZrvXYZo9 Pu1juJo1klCm7jmSIM0EYKhuJIqB0yyFRxjhNihvz+O3NidzuoeYm062sLie38xabdSwtEsYFh5d PIStaJITwtuTUF1Mf9if8rBGcif2FJAUfzBksdJ886V5V0jWLDzL5f1W2ifUlt7PR42f0JjIlr69 nboUTlbRsVr89svLAK35paHbQ6Y0Efk+GxXRPMFjp2iMXVlvraRJKo3D4ir+kgJep3pXkGzD0+OE ZzMZmRJ3F3w8/k2TlIgWKTj/AJx5drKXzaJfV0T1o9JX6npqCX6xza7X0VlCqYpZD8ELeoprQ8n6 5lYjswkHtMFy/wCkWjGoahclbdWpfxrbuo+H4pFrabjp/divv1zBzS/ekWeXw+92mCP7kGhz59fu K6/u2jgj5XE8BaZAskbcmO260Fw230ZTOVDmRv8Aj+JuxQs8gdvx/CnFx5T1aTWrq/GqM9vOtI7S T1QqGi/EPTdBX4fDvmxliJN24cNbAYxDh3HXbf7FK/8AJuq3EJjg1NrVioAkRpyahqk7yeG2ROE9 7LHr4RNmN/L9TKLKB4LOCCRzLJFGiPKerFVALb165kRFB12SQlIkbWVbCwdirsVdirsVdirsVdir sVdirsVdiryL8yb6WLzY0S6vc2YMUX7iPmI9x1qJEAr3zYaePo5OTiG3JJtcu7i2Nqp1O8si8fIl JZZll3+0D67hflXLYC+gLKI8mc3oll1G4KyXVwq+mOSTPEo/cRnjRXQd+XTv3zlNTZyy58++ug83 VTFyPNCcZy0pR7tAhlLFp5T6fpneg9bf0/etcxt964uvU/r6MK9/z/avuba8m13UZBPeXkBlKxxR zPCsZRQWpwlTswP2c7eEojHEVEGu67+x188UjlmblIXyBIr/AGSWzxXU+lyXNrdXscb/AL6O6E8r mOPiHKcTPv8AD4iuXxIE6Ij3VQ/4lxpwMsZlGUxe98RND3cX7U8uZJJb+YJczz8LaF6GRolT4B8Z pJHWvfOQ1V+LL8V9r3ejrwIGhv1qyfsKEv3mhRGNzc2v7xF9T1Xk6gniV9VuvXMaZI6kfj3uXjAN 7RO3cB+hhX506jFc/l5r1o+tSa3NPPp8IsTEtvbziPUYD6CyABUmTl+9YEbFajbNvM1E9HRRG750 srTzTZ+ZNEt9Ehg8u6hd/WIbe5ikEpdBuwnoGqRTuv0ZVLFHLDhl6gWXEYmxsnOk/lr+YEmpR+a5 9UjTWYZWuSLhbgyCUVY7IoPXp6e3hlkYCIAHIMDIk2Ut80XP5hSTWHlvWrqFh5hW3tbeJ1YfV1jl ggRunJS4tIuXX4QBQZKltMrf8sPzC1DWTrtzq8UGsWbpDFcPG6txs0FvA6ERqjD0ol4kVPj8VcaR aUeYdN8/tJ5a03zFPJq9jLfC007SmZoWlEbxxCrFFdfVVuKs3xDrTKcenhAmURRlzZnIZUD0erf8 48IdLuPNcLSt5aSaLTUNpAVu5boM14hEMg+JJjusVN+VDRsnjN3vayHk9qt70X1+Wg1KfU4/q6sC S1sNuI5uFeEAjowoN8wMxPikWeX46u1wADCDQG/Or/QV+oevDBDIZLi0X1VUzerJJyqK8eJlO3fp lU7AHMb9/wC1txUSRUZbdwH6GYnXLT621oiSPMlK8QAN6d2I8cul2pjGY4gJGY936T5ui4Vk3mC0 hVmkilVUYKxopoSAw6N4HK8vbOLGCZRkADXId196eFqbzFapJ6aQTS0RJCyBAAJK8RV2XfbfMz83 HYgE2Afn8WqU6NIdfNtmzugtrjlGwVwREKEqHpvJ/Kcj+dj3H7P1sfFHctuPOmlQ3osxHNLOYlmo irTgwrWrMvSu+bPFp5TgJjkWMtRES4eqne+eNMsYRNdW9xHGWVa0iY1YMV2WQncIcnDSSkaBH4+D GeqjEWQWRZiuS7FXYq7FXYq7FXYq7FXYqwbzb5J8xatrZvrG7tY7bgi+lOnJiV61PBjQ/PMrFmjG NEFthMAJZe/lv5kmMZtZ7G1oKSinqBmr1XlDVflU5MamPW2QyBkd35X1Ce7lnc28/PgFLEoQFjVa UEb/ALSnv3zR5tLKczLbf8dzgyxkklS/wlqXIlhbMfi9MlmqgP8Adgfu9/T/AByr8lP+j+OXTojw j5Mkl0nSpZDLLZwSSsas7RoWJ8SSK5uBlmBQJ+bYcMCbIF+5a2jaO7FmsbdmO5YxIST92IzT7z80 HBA/wj5PPPN3nDy/pnm6fSrtw106Qpb24iais6gL8So1a16VzS6nIBkN7vWdn9mZsmmGSA9Iuzfd 8Un1XzxoFlqS6dNL9RvlePlG0JegYVFfgp8XINWvTMeWQd1OZg7KzTx8YHFCj1/ahvzzuDcflnrw k1qw1Y3c+nodGtOEQlRdQt+IjIleRJGqRI5LCgFAtM3k+R6PHRG75r8s2BsvzL8tJ+i00pZI2kRE nNwZgWnHqs3J+J+HgB4KDvWpEDsmT6AMKFXXejmrfEfw32ybB5P+Z/8A5M7yZ/xnt/8AqLXFIesG JKud/jFG3Py28MUPL/zps/rN/wCUrQQpcCW7eP6vK0ipICYhwdo/3gDdCV+Lw3wFIZR/zjhAbW78 12sd1a+V0lj0wTRSyLOZQHu1MtvLLIfTeP8AZqGowFQMhjN9bZyHk9I1n8xNBtPNraRd3q6xemON Fa2hVY3coGD81Mi/Z+18VOvTMfJppSkZbU5mLVQjAR3Evx5oPV/zJ8u6dNBBdRTWE87r6LPDzqEY o4oF7mn+0cgdHM8q/HwbRrYDnxH8e96tLo19JfvO7xSwtSkZHA9ANzxbMLN2blnnMyYmB6cvt4S6 y9lOfQb51IjeJDWq134j+X7G/jlObsnNIekxHd1ry+n8WkSUb/y3e3Nysr+hOFijjHM+nQpWvSN6 1r45sZaSRq6NRA+XwcecCTaF/wAIX1TVbZgTUKWI4DiBxB9I1+KrV96ZD8jL+j+Pgw8I+S3U/KOt XeopcfWLaSBYUjMTrxJZRStQj7f57Zv9PnjDGIm7YZMEpSuxSHvfJOrSw8LX6pbSclPqVMnwgEMK NFTckH6Muhq4g72fx72E9NIjah+PczjNc5zsVdirsVdirsVdirsVdirsVdirsVdirsVdirGNb/5V l+lW/Tn6F/S1E5fXvqn1ilPgr6vx9OmY8/Cs8XDfnTtNL+e8P914vh/0eLh8+WyCP/KmfrAr/hz6 zyHH/eHny240718Mj+4r+D7G/wD1z4f8vw/59Jp5+/wd/hO+/wAZel/husP171+fp19dPRr6fxf3 3ClO+ZJdKHlVh/0Kl+lYPqP1P9K1P1f0vr3r1+Llwp8X83T3wCk7sn/5A1/y8/8Ac2woSbVv+hbP 0rY/pb0/0ryX9HfWf0j6/LmOHo8/irz6ce+K7pz/AMga/wCXn/ubYql9/wD9C9/pHTP0jT6/6w/R X1r9I8/Wqv8Ac+p+1Xj0xVkX5Yf8ql+s6x/gL0PrNbf9M+l6/P8A3b6Hqevv/vylMRXRTfVHa9/y qX9Mv+n/ANAfpr4PV+v/AFP619kcOXq/vPs04+2S3QgG/wCVEc4+X+Fuf+6q/o6vX9n6cd1Z7gV2 KuxV2KuxV2Kv/9k= + + + + + + uuid:f6f902fa-7019-428a-a7c9-4bd3356e59b8 + xmp.did:5c4bb5af-f394-4ff8-b967-e7649e496c1a + xmp.did:F13915551FD4ED119B21824070DFCF55 + proof:pdf + + xmp.iid:F03915551FD4ED119B21824070DFCF55 + xmp.did:F03915551FD4ED119B21824070DFCF55 + xmp.did:5c4bb5af-f394-4ff8-b967-e7649e496c1a + proof:pdf + + + + + converted + from application/x-indesign to application/pdf + Adobe InDesign 16.0 (Macintosh) + / + 2021-03-05T12:52:19Z + + + saved + xmp.iid:0f285f92-6b59-6d47-9f29-262fa81e0f04 + 2021-08-30T17:36:46+08:00 + Adobe Illustrator 24.0 (Windows) + / + + + saved + xmp.iid:F13915551FD4ED119B21824070DFCF55 + 2023-04-06T10:04:32+08:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + application/pdf + + + ESP32-S3 Pinout + + + + + Adobe PDF library 10.01 + False + + + 1 + False + True + + 173.801794 + 77.577866 + Millimeters + + + + + 3ds + 3ds + Regular + TrueType + Version 1.000 + False + 3ds Regular.ttf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + 默认色板组 + 0 + + + + + + AIRobin + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 97 0 R/TrimBox[0.0 0.0 492.667 219.906]/Type/Page>> endobj 93 0 obj <>stream +HWM s.5S9 l $HU3bmk`XDOo7xkrbKe-&.5ƴ\ۇ.]u1k5?Υ˛?/yybGi9řՒF~\1] \[.W/ծ&7[r}&Cg̉Lm|]erAx+oZ̊|^ecy}E"DyJx3<-+f[-B~rΐ=לDf0k ԉ_.0_8QnWe0xYJ|,:D2b7G$ +g7 >s|,Q(I|# ),aII޳nb;>RػIAGVЁ"h+ʊq-=(cZ-/F"&Z1kN +Llb"$7A8jM5=%RxtSE +\"Y)Jq/)DќHA s&LVLVXQ<Ia_JpnRPG +•_+Rt^4Dqξ!^s&+&+vV8bKibcuk2~֊o6IIk +WB |x12!`7t! gϡyiP$7K)PL&)&)vRx2yLMRdgG;Iё"d$$EO +LB"")bD9h92I1Iѓi&NRLRHA KMVLVXQG +?IRAqMd>YWAGZЁEExȟX{hUZxa;^e wE]GBe]d3kqYa_ʊӲ•9DS +^8__o1Η̟hbcEüNVnMgOVk`wDJk|@S2 O:~֔V\K:ƅl*ZN"*aoQi%U$!-8N 늎Np X@OpPqwx+Io+Io+YqVdZVw\ guǕ8;e5bJ#S:ޥ}wy]x!ޥ~wC~KP?_p#x@ǀxǁo=Zmwaͭ.9*#6hK(,vB/<ţ>Gͅk.lw\;/OklGQa6X;<>P+wǥJmkYk++YmUn|KXпI_Uք~2 բA]q +L?~4SDǪ$= *&V7cP{0PKb>^Yclnt πgRӊ ڐx4ٍ- 5 %+]6k6R)'7#E]WbUJ_iSdט +}bx#s[Uݺ(* +OT:H›7(u"<&a~ܝqh,0Cj:~9kptXƲzp ,W.q_mU1*|{e::hUW[Yn. Ɏ}'HL#cv9de +Ӏ=Y[ED8SS/)o*9$ZQ8(UٌU$USK¹8e55ۂt0qSҤ4Сj`rt%-M5q*$B6ÁρWV< #ϙLO4l>5ES#&Rtԑw Ͳ2ZQ`4`_ kN5=4Q'&wzCA9dOpfR4 +s9۬@ cL5mc;*km'Z-dQ s u;GLm(8YCݒp &H:h t'nĉA̠rbP]-G^3Ix@950Tt6k mGzݠm#j`:3(D \#u6} ksCu}ߤat쨕{lפq{3𐾺 vyjj+FO}R ZmUZ -(N b 5Mޠ6fa+e)zlͲ<ç)yp~=k8_iB)f]nP[-klyfpp֑G~Cv-\lL+0x)K7l3dž%tAh.D8u-Vز̓iɠMirYrIZ/g2#QW#VK V1.u Wjk4ۗjJ\nq6yn_% |{%oܱZSMpi .;A|7OAlš>6`ZUdG ~DQI8kKuzkMQe$a#-y B![uW⻁mTU܆ĥ'WOD5 grѶr-}ѩso+>%d|0' Fꂑ`= kH#-NmVo+``w:Sg|}`dnIH"M~׷?FiІ꧆e$4[ rTHpbW`09|h+gLNDqT P@g O@,0Py0D3b b{KPK#iMI[.]> qo)7lWꃑ)xQ<8hM |a+_8 |+_xE|/| /Dbvo"XG9LTC".yL++?M5$Vܪ΁*,䃴!x%ƹ[yȀ_@@d?sðiQ9e<Z"aΩa-%[@ <y0}WpFΣ3oT'C@Y1<ؐ/sxq[g8l>1QQqz4/_/5 +˚D2@J-K$\O=tnqbGS=i(?;`n uݯ}ayUA#u.JS=7 cjq\r0Qggpߕ"0˝(%l` P(E34Cvn)`ZBuR=[di"bf"L)[-h(b1b/O_+ Km-C$MW/ưaNWGtK$PV#_cG\m݈~{?ua Y~;Q^mhScqC$68;v=7XS:[@V%/~H p5I o42fZ$[D;r'ݔ$swP &i0 HTnPAnЀZ7zQ4+z! z XwvRo~&~ѣ¶b{*GV|zOx;6wA +^[AnNR}+`J酝ed HǏm4%8J-ο.?wg*Q!5+HU 7 T> +*L:9-O}mKv;_vQǹvb^ 4"ݯEC aPQn ~HU߫O܊!V}/&9 y_z{yǴ \0e<3B桱D^n8'a-`\{`Dd؇ +* S¾[lf7% T[r6K{oi#S`#)ѯܣ9CkL)UW1m,{n[Y18f_Y3fPY'T uB:&1Dhf~n~=XG)О\a:$$$KҍEỤL.^b)SN#,kz|ɩbcFa'?r̹'}xlE4+jB\K=xm1 >Ջkp\3r5)T1 Nq;0w<X8eQ]=ohV & yJx67Aq;:o<찟m6BL~C!K @ t <0TzL _^׳7B/z;(ox@5_5xGjeҧpS@Ye栂dXB@ I UȩO wN6Ii6~Ͽ2[R +'}}L7/"zV-5:+]sfm2~0Smr1(Lyk2ik3u6zWe͍ʤ ձNO˗T2[Y VX"FĖY_(X..qX~?T>rjDM<"u"0F 0](՛S۩[bV▣QQ:}>9H-}(=wS}l^%O$4HU2\z{M/5YW:MeliI"Q$ Z 56K-14n.*a[];RZ,- % ! Le.`)& +7{\@g?avӰ ׂ]Ϛ&HpyضiZ" Yx̳$ޅī|G$d h?_zK8PNrC$OuuKGQ Syˑ+xY>i:J)3Wmm]?plNoe1MFTl7 z-.~ %h%l+|ᇭ[l?F/37S??եzب+ǡލ})uឺi|RT[ïT-g.`>ʿ^zB'd] p̣h\fde±b~,ɍ{E'r0xC>X3w(bnoz6c Ө(œa&-x<,3lqErE.lъA'o + Wz3h|`w~"a5S*USrXVso;%=4_e|U18[V,el8fUp1/b_6r%¸٣\Cli<~3+O7pa fxw(pRƚ|qoc5,2?(pǝIQfr`vB`E7+yJJ1 6Ltw9S=Qgݤ߿H/?O\ҟ=SZ%ӟjfG|ja'řG_fmP3KE [5_ɄJ1cS׃göK$މc'I.W$ҹ ¾JKE2tcBP2BOjWl@~hmgԀ5=E@Fxg]1*\Nwf2^ze_ǜl_@}vΏΎ8X X#ʁ)Obt? j#>_p()]i#d@L*3e*80P&!ⷶ1/]x(OP?A~‹y%3L)bzZ3~HZOj+| +~BإjxfGs< 5}eBb,+:g#,fc=rDJ·9)m;> eSnQ{ YF@OY7IQ"1QgNYEw;w'2^xxnM 9v -ǖ U2o*+ a=^-V2TgZpRkVM҉MZA$6'wx#.L\I^~BPEZg㫷o[/IUoF[]Z/wOwmmtk__̼CK?g)rN>Ҍ%2ډB')ڦx|$%:Kf[N%}$}oXXIJ"LYc٘PJJpt?& IcE <6ro `{dB4YTa9#=o8qJ6_P_Ӧ3~NFʔFIvt@`"n-4v +KP<'M((]'9VVHs(+WCX 7bۼa6<.Ie3,4ɵR.b<`*ݢzFN+ 86c^N}m-%3ț,a =H*z'ȞJD ;4Bu bWa di:%gVi`h_J}}aϿ ZЄJukN8,Bج[Z0ow{y +N):KVjbP8fPxQtoL7&kkSt0#,'|ɶ fIᖳxda F~2{KKsjSe9.斩 4bE9vحy 2]` +aE ;»jwVNA^3/Sxط1Kp#l:CDY{??>zv( yYlhgjwkٷ[aRǎⱣqVGQ?R9Ҟ3pc1ByVq7|f**Ft[HS(o1wY6/t^Yq¶-V[ +XER +<# ҫ}*t+9,[?\D[k|nx8xy}5;gdkXv*c:R|S喏2= U~ bZ(NSDI  `UfXH[ e5ire +R"QDA>XPv 0\1v -PN6omdl3Om㧭;߼b9q]ȿX S"$52.*>^"_`nؔˣe:V}7#Jsjy;[?q茻)2K (AN $Q 4BgnWNŕiK +1Iѡ +ƌ5nV`$Y&IVdBAUn`b˖F~b/_ +p;nO\Gů +_"Dˮ.:5O?}Eyowf蔴X;YRюݽ)j_+vnOkD֌d+i4̿ٯ,q)t D<±L]CwdU,250n5r9ՒbR +*F8k2Z! d/ڙʚS8~+جLVjQY5δjo;:_8+?$yNR!HCIe9eNMA'*mxL^+ Tl@,4ni&uy.;#[D'/ڮC.,g,-낝NaN.#?e߲+7UxTY/,5E1gK+6^H!(x-I*0z=2-*|GL4[X1ez)GCАXTˡV4db:bCE2cflO'a_ 'jHFakȩGU?hS]+?H5ղ9A!xzY!~*q 0˧`& @[[ؤjKݽ?oR9&zH#}lgl7bBѧtͿE!*/`}3zgj&zjvw‹ ֍ 4qG*1d[y?@e^+df*O>K¾숼Mv 4hp߂T) Kb 0AL߀^g#o_mhGyW}i\Gy8C5x wclݍns`7:{Y'ë#t#/d $Nj,2QLz,ղfsϩg7wcm@[edĻQOn[|:"ccXξ@s9B%X$W6-K[`K? Ca6G4ɀ``ҷ > \֌Q9:7!]Xu׮zZђ=2v{f,p`5/{s&5)N,?QY&$, +NK1vA#%:IE2FT۝YocݨYr0}J_0Qneb'yG0}h"tw79<,6F8k.rͬg@՚Ϥ=ȸKʼn;o%F20ڤg[)R11t ۑUSxq?.VH 5LJccg;|^쫂}vY8LiNj" +~3^f(Is Vs7wCXIcJ{=O~嗤jcDK#G2U'$fV Bn\eat`u9X3/]}]ħ])MCUxT +J>qZ -i'wR;yǤ𱼙YET؉NFHR OE4k>f +4D :~'/YQ'܏V4tD>;Z\i4K 켯@?cR o߶_[ݾKou#Z}W̳ylA ML¸\0+`X{;&ߤmYߙ>>;onE$QQ>~{B/7z&ºڎ=_Yt5ko-xCDC/~R^k}|> Kwsdf#/gJZZS8~P>"p[.aC~)wF=ke? uT܇ܲ ي~c:#KDlӉx_oTfy&~_ѹ :d>D9|F\ӷ%`I&웍B0{qe@Q͐1„Ֆ-ӌ@ֹr-D*3,Fq )qbg|,ƣb76\i'"(bAjgN5 N?R:wh59e co+ \<-hoaF,'Aq\t,[;Wܹ?vD(%W&5/`#GgXwoolg𥶲v;SE:Vf@N`=牸L D$, l2U 3^viَ{'G%wQUF2NfDꑮc5R,"2|@`&~c?s,'[柰Eɡ8n֏ ;ⱚ#O9a9 {Eu0=]-̀ʆ`Am'Q=g`6f Akҟ܇#^1(?Xnc6e#0=0nm*DZQ:fg4ܯf[*]5~;W F|I[ laRY7dVdwln3"FV#3'>[Ѳ‰ih8 g4MZH-Ca5a HV:ɧ1 NYQ4iAlA~ b@:;1^"%~,ɍ{~@9me")U3ˎ[(IH eRۍV7]Z +$bK +>Lܦ\R7?ۤ|gz8y*W*ORob}_b?N{G0W-0tM*B_Y(ݵ?ҭ9căgO33Dz^+;2,_&M7.,A׽/j ݱmZdq>3n$%C~xWi#7w2 H>A"2qeYی=2+O׺d=[-+niWw]84ev4䜸c:dnH+BtȄr˩b.AKR85l(dX46~α2WAZYOmeH].7]f!]5[Uﵬ-2x:@ta +cMbfs@dpu2r +גEK9=+#uRBnfcѧ_Bً6ei*F ;\;5:rwꛩ>4wgm:)6'ijJpng8YrJu: U|( GΙ 1\ygEmb'F>ԮmM(Q7}B?TS j*b^jIoð_: xC_5ָ/3ڦV]Ai4q6,4뢹+Z +n-Q}90 8_:(n!]Wq*nSz'w-6y .nͺDfm{#"rD'$0؞Gf5ȔC:!ԛondQmv+Ҧ̂hUTj; +;+uumYm(@Z8r%_H)B *M+yyi0df3ߑ86Ɠ,@Vb,ٮlm 7|Y$xּ^dRN3닿n5#3{-$6)e %|ݓ TGDP]%i0~:`eP` F-i^ h`T0m(d&+yM6a +G'Qq ?G@fa9 lpEu쀋 c19c19cɛu<[\-PakACd`1`Rϻ(s0]Jtj"qŀ5bi濣Wy(]260?4'k,4!@ Eb0rՓze˥Œ_*V:Y +k'OEKeXZoB2FPj`rj / +_~Igc +6b;,53duCM툦H\U骱Ws^SO33H7(+q$ l0MȜLƴy5B~UaI$8a<0F7XO+O-_Gx['sع-9&?5+J~i.] K4$mAZZDXWd;8FFc!beX۱ڮHȭERG@?i +|)OiP q,sաONogɈ%@C +}"ڝN/ٰPSr1chϚ-jȹ$A^'X=Y=1|yk͚kAvV)3f +6VsŻoIƹ)'"%RB/GJ %)R8JE*R򁠍rұ4#DX4F/RS<p\os'*v܏-W)@QH*cSB=*~%3gUDVHi/Z|IzcP:~ + lqbVHQU7BZQ{6K0CR橃bgLi/Y1+"w +Mή#,Aܳ \R<꠹*ˣ٢q"ۯq}Bq\8j OrAkwzOv, x[6dǫ$m|Q [!_ґqm-=E)8cPDž(*2I16<5YRG$^p3S%%5<% JauH?-qj TjX_,1?e1Kްz7qYEʶpB4# TeR#QUYvmBS4"X{c_#.+3vgܱ6v({ +x +쾒ՊdU8gczBv +"BOO(]y\7#bL5~wQ2j7rsGE|QğUL7?RY"?_ )Ym:#P9;У-Z޾QBŢϳ+K4]ZDStT+M\D?OkG{#g ({_yK輯BcK}F]Z~tuʜP=̥NӪ.!RjvqinӞtԃ:4s2f{? ;35֘I.uzq@l-uO骢{ +k)Zңj!%Yp %[XԂj\Q` 0򯸼CN6mqu~1h!҂A/hnvYf;\d{-) n ]ZtȊ:O=z,1S{=Cx8Z/ڈK˰ *PԵ$sSh|6#wJ<\rNO;#dDh3)$\E aP̲hk|LX}W|r&]m{!O-}84u"ɩw7ϏNHǹǔ\e$^5Htփ%_yv\CxO~zk"#tzP{'_Dt$?[C^(5zuE F궴)~ .Xż#E]Wo8]qd`&[rtw:/zw ^ExT,v!KϙfE iiC]([- +d%V1K:5=40 Di@" dS":F0LJQ„)RDx-yœ490AzPLˑB!B!䶱WF +Z:XA.<((" NUश{3U&K#mP5}JN=<2յUۖ-JFB",D~Տ~̆:_3Qs)EBv_inP03 F%20F8.lV>1 {uॽb]!w}$DXrb&Ě2N9$s-W- +nM:az)r +#tD y + 0EDi9< +'yLWu⩁,ԢΓ*oιd?›Ż5OroQ3״xA"{&e<+ n !5|!QVu]>X!zk2O^}DžL^=QN-j}0}vl,AA~ӧ=33 rp9m?#3<##א;}bLN}ͼF)"6ۻ +Ѳ,8;v *rEؤJ©ǘ-):\Aɷ\sCBXɝ#dѯm[YeI6h?wu +cn߄FLfmTX閧 yMÈ88 6ίv_LF G(9Bid*_Fj + ָ;*y\u̷15iҨPLfZ(Tz?XjQpEڦNF}1s iO,gˤ|Uw)6F8h;*y?3>/8?zqqq? 3>3~ypSfվg/f EkWUu f y މ9yw='j+&!_~ejj@iԫdD'eOPYZтP; J0*?W`vYvFMs  GD]C8ڛjS[uQrIۈާ +yqo]x {,-Fku8Cl~̗IWmidsNj#]vyM>v:`ׄ] /6e&)2n/̧#b>$͵ =`1Ƞ3k%?Jl*+ xMBYuaSnL/WqbK ! +ýhjڝiR/RZ|\5ԅ\vl21RPӻ!5>6duT \ˣr4oWEfgN7;+cK܂-jxXOvL28]{R=Y +V-ǽEAbV)w +{w +RؙW{w +Vivڇ}w{ +aŎEC Y[H(ZjCŠuQPM\/8kӛ w0||⺯caziUٿYEVUE6;8U9t&_9^UXR!mek~ ] LNZO\$MqҰww=35߹ch`!-K6qdJމqDClHB6PU[;Fumns88yi%|yfw~4H?YUt) DU]&4xMP~wNW{+j-R6iR J=W-j06 tvd,3`7]sNzh] yD!J|If !/ +ւ_?))ʧW|%)} )(Uc5MUQ;DZE-!< Wf_#|&E6ąǧ];^cGE]q 0OP9De-l-cRrwfZt2kTDžKjҸHVF]C6֒@ȝ P^L7'IH[jwg" +;<7^Е/$TgcFW>R[VD_&y +1i鸮L 5MkmUIVEMHDܹiUuwcK΋_ +BIɒ]QӟfJV&)d S`Cˢ,4?TZ +9VZ5OcRou<2 +N Nkwea4+H+Ԇw/,ިJ}q?2~\2o|jo\W[_z|>XZ&xc=eM͙v6Y 6Jmh#6F Zv5! +]\Wrstov,& +*SO<:[֖)TN,k:n6LZ'"/3:UzReȊCFҴͮaSˢM[t]ó+^mʼF+8F\$ᓙ̆ +f?ϲ =}M$b@ K6ӖfcMQEJm# +]=+m4窖)~O+t'+6gUJ{l{%O7rfچ< mҙ3Xz:.ZZr'KI9?Hĭi) GL|nEXEE="D4ۑFv7"qE]s'p+e8= -,ˁi^B!2cX!}U`75oxmΧ)ʏ2@VץY Ʒ^"Sz紩v F }{|,zb?\1JM^y8ל KWJU)CDs0}V \qoZZ Yl]"P>8$kdw^S8%֮4+X@OZs~T0O U9$-l-M8XL/7Y6 * #R, ^ģJ葸96Āx |x-#kHgM->dsR m&/k o{_]bi2+e{p]xmh6^XF{]ԙ,yE"2z9wN0y4i\s*2 +H.sM3y+iʒ;甕P9V^e: {+Xi).upf"h+k3w7SՈ +#,cI9E}hY6F(h_!ZҝNlքs^z9KzSuK73'=ZE$K2x1:s|D{pTǓe0c4:3ѭ9hMsɬoFe1X>hZ-r(W^WgfdZEyrw8Ur: +\oβy u2x Yv7o^e%ܸcMW,k[oQsu.gۋRx"2`0Ie%b9x$S)PbiFb0N~{3r`Ysz]Dc +(LFt봬զ"~v +CءR[;˷pQ8AjN׍nc=ǂV|Nxܭ#Fôf#iT-9`Z Z·Sjb}*mLM"'ksg047UdG[9F&JеRj(VͅNk ;m"Ѩ&n⊪´=\Zr+QyI6cGt 5N6csau>ϑ -'b7uypt]'0ƌ4CNT;0Rhq[q ſgkZ; +iuC%2 sLG[O5uiNgâF,I.dYh7[̀sWs lYaZfSX˷hpeVWP'LmɗQF5fxʓ7pq]5Z'/02 xl7C3 S*I->庾_a]::1[C)Za'*1&p^(/ D/z |/&z;u +$pS<֎u P^Ư:1mf{ڃ}M^4b_ +| 5׬2;3%X1YBmz* +~KPk]{˭xk?lӤ}_[:)0X\W0uӍi;9OKGFC_Tk}"ˁWp QifRZT5Ft*e>p8QM{63<}L P>>5x7# rh(ޠkXl +0c3:leFec+9\6wH8 5$٤9C%Ih>%W1WZMtrrbh"Rx[&O_s>;Ho{q% 7#zG}B uT;.>K͸`#ŧ=9& S[$Xh o۸Rw_Vމw"L,vΖ@w W-{h瀛f,՞e)N~ ~ .1TQwA n`DҙiW>>O_n%_sBPV>U4Ӡ‘m!?[qq:٘'rf?  +&y[KW oZ5Y^{,quԲz^=DۡEMݥWFD=@4\s,HdžLȖ#`J3&wD2j r4S{:%5_5!Q=ZEC%nn w;`L_-6̇=*7kpo V]R~(Ĕ V?, ~H#At? $@rKYS^@XRH=cEmOZ! +WAΉiÚITY1֮]{2pESW}2AvNbNm$%%,/e,k0æ{RȞ^1)Дں_G6՛rYTbGQ1{Y4ݦ7%}kP`P ៊J9~2qUƓ\s앃zu/svd'=e꧁O{xӓ񞌇}Xx;DO DoGSnA sc~YߩBS?"t1r?whR"cn!?w=}?\ +y6@>qUgQqʖJt\T}UL\#N!RH pO-eX5HLyU BJ R{,5WQ.z5vg$\ˌa}0S:Y {([zkhznQEşh~~ҰkoWO֨dIHTybާlNCj*고xBM UT)ȫ'$Kpx+BCBR6LG)8E) qS~~HO2ʇ3Xk|nvn?j ^{pXU=ǚHtљ\$IJ>s]a@.zݴPCG\aM +d3tOPBclEwK\x 4',:j>9s%.5#EfY  6[8Ldgk/ke47?71=%T#f6I% |W2QsXH)Ǜdבm#i''L0?ޤǾN#)'E"Bvr.3`\XP|ǘƇ.PŰf +J5Ъ7qt)xFk]Gu6jK:DWOZEnӺ覆psLkz֏=<9 63?"M8;wwj`R&8v^FUN[Z7'Lu= {-{-"B]noig _s#wVy5km)~p-^8~*Yz|Jb)h\A)tVPQf8odWcxjz]ߚmb`M77\c5[H8eY)'n'[78=]^l5hhZqAq,!b'=tW^7F^x= ϣZߡZF/[}_sC _Jbwbbt۠- hMۻ(u\Bm9 #|h껞'+'ٟ+QŒt7Q[9L֔!9_B/G;iSrߡak|YU܂xPY={:9SAI|SYu?z1)V.j'V/;sX[&9a 3>ʃn'Ȝ߄ɕklXd/reUHǏ$X߆U-B5?x`wɺ01 &Rcԣ@ e(`4 +Wxئf}5s*.a1v'ʌf6q;] ;ތϡrpZKʓaolڪ:k22^646r/v6>5饁l) D,]=P`a] +pP->ץُ*BOewj:mc5M; 榇+c1"[MU܉Vz{*AzNw+)N,Iж/lԾ+F`&+$SdEvTyk_P*`A]_@RTiSK֙Y*s_t+?lbY^|swª^;@_af8kϝQH ڟ7&\$`,U~f~&8S, i[ls{U'u-/Ɵl&_%n\^7xO/ +:Azp#D: @=ꤖNlߦ52]q+Lh`~y]وFJ-|)N}tάuxg h"#+f/1)F' + 5E@O)rJ<ΉŘz5"C=hb;mi-%)avWr[̩gUa$25vF鍥 ث|݈3uչ u0GkG .yp:z^ U6x[8ݴ04=fdK;T<4dRuwpm6:Nަv:')~4Xe検Hʢ}ŷn4 U}zƩ4Tj9 }kbcs@TѵaBd٪Ő@ DB/tillE̎uŧqN4D#ENouM&<,jo5Ol!o<8qȚbwTg#"9ap+uO%k(F#IYT{9^F ĦkRn`m'c$DhpmPZݒȕ0;ddǽr@rfN?+?FM_Y X=%a|BnXWrjd38'HSLew+d +m/MmnS'M4eE!aO )l"T׎'l zݲwv]B]@Chvz1BeYQ8Ȓt,b.U6ʶ |TE؇a(=5D wO[k~ k?b'{Q dJ Z,!)Nc׆Wa.q^9ܕ +#/ \8$^#6@or@(D%W ]XzԶhA s->W{-][Vb4}IB{n\lBă;=\^EG#u!D`HiM]g>!AkҖҧeNʡ;rp-TrUzR~+*N!yIT7kq:AE8xEb2:N!8Y*'^$4 +h<_[YwϺ{WoO5^|2 loDQ{v}z5.{}#xo' S3_إ\?y^C1KPD +S:饲 ڸ926|K} F-ʸ"5vb 7V49i:wcD{ԩ5ZCHu*DHÍfÏCI;ۡtΪhg56AEN65 H]ԎOfyZ2+|66UGtZ W_.DiْF^w mw?hr*'pXc=&BD:aZMɷMv 0`9igЫ*]xM)"6A 5O*ǑurʢYD)ZV^~9+dWhD%~;֌qfyW$_-V`u4 =vEQiwXd%D18 Ojh3VijySX n9Ṷ_%z t.>;"%>/Ƴ1>_ -62{w n-na]9na}na:n#CP.ac{u2cTsq虌!!LE~)V*5 u ntLƇ*";\BYyh +^VW懒e*Jpt,_r켿'S+ox~ԝI J A_$VTۛX~^v6-rjՏQF5>ićȮ--Xc} O _,8~ec/uKetGXG.B/ -FoT5pAHHaB>75B H|hrSgD三.Iv늰hM7B\8FU.k0@BĹit`8O3459@L(ξeήq/ܸi~*s fc*^/]1Wd e(6,^-R\P-} Ku45ޛUKܡ15q'󹣨` P{Z N-x +cgNSY{Odt"]jSLvtFcd'/z>Sk˼&!H:wL,|Q](dBlqTܡZ<=IRݤRA !o\\g/m`PzJk*vf&TtJIl|}y.mq"3j!L'Z"YZ<ikOg},[bzY t ~2{6{*ih8txYj1-^{Zإc72L62afiއ[_w[ko_̣lrزRuf#)qE6OݮSrY<*2w;A4R#]ܳPCxw]+FYYU0`+h H*ɤIi%,L3ҧg-1P Tv:D*37FWL&XW@#'xҢLjFFA*cO"Pu_-r{*fpKeEⰾT6:Ie$}@Uj/D5LY~m 68U|n vHô*iv"Ѩxu8gʛlJ>Zz=&%z5l[kٮAz +}N !FV %cO$u&*\YQĦoys:Q92)B[M5GVHhlQw4z*=u1)7Ys.mzY?Yl<X/=&7 .ً\ԷG}ƫ Zp u#03Z`}`DZ+꧝t8r^OZ$5`S|r$M )XdK(+Slgr!+XoIrbG}А9Vͻꒄԣ OY^&9DiK/$)r%_/:ۑ̪bx , EKB~Q}xX\ U#^ ]g_p2qz]1)[7խ +{S.@1nV]r/9j4$)ۿYWt&}_evѵn62Hfkbo򾑢P$/&kkeQ͏Ŋԡjn.i,jt bMo)>$uIW7PlY#HusBb6=Ѯ\'Bcj;=S!F{H_V@x +q*jU_X4^/ ;sL)^v(bʆrr9m ǒ$9E5 +&%ʡ +3pQ~2 >EdV^[( Yq:ϯ,aBRƓ6c5GQ9l5t,jӂsxRKsA4{lSKpy5NKakF@=ȸǤ4(Ըu|uV%0Paf@P}:^| ^s3[-^f *+1T3`sz{1Ul1}?h"}ʬ>q"J18ڍ)()4=ϓ~A>aVl +FLJf(ft?]",8\l 5e-L8m⥬ضU[9?)q\O?\M̺n4[Cfrm'>C?hw /Z**睍ٿUܹHW~;IΛ*;?d4^dbE x#ą{uu"u6S[J%-ߝH](_c7I/7DV{Cs=7Sil:??3+ +Zք߫"W|y]:O^Gx<1Bm- 7 ybZ5n*ŰT|:n>^cb=3Ӛ\2>5q}67-p(ҿ4˻U1tljxU5&ͤAQ/::hK4Qi^sNvr`1?`HFPeCx5~y,ZD!򛭨*N*+sY6 K "nQڄIif:D.bP8IU=֨Xue$E7P9*x^#KTNY7{/yqQ)MzZJ8 3[Fshv!`gLv L}26HxvES{] +% u;5$GupI 'pZy_"/S%km٧Jo~zyq>1.! `sψu9W֦87a;.9]I$%{OZxc+E`3qvJy̷\-{ #?Vh"C_: hi%G󩏌H5:8^/2Y{"u+JjYm8)/Ha1_OFfגY KA3V\c׊ӰIH|(S*ɛOK z`Lm&4ץ%_%U쌗mpZZ ڢVmRvU놿9%*uS8ɚ6 srQ'9=Tj#iI+Kr3\}b#E H8o =z|"\ )LUc3:p580_WrI붡ܫ\>AS{o"E&Qɾ$A<UjrDl5yL¢&DQ$k'[45妄twHNfh){R8=8ʤO\KKÇX73UO%4 Å=[3e[ꘜMWWDKѹ+hgE)x惋G]#AcVJL+JSǺYNy"g=fOL:1kf[7溨4 mh ЅU~P2 ٰ&\4U]"Vw8uir.ҙnP[@T.]cMSH|5{E<q؅XCquV +'..c%*PVa;[QG cΘ;RT'S ./tr]ԪHқ%@`x H׳fSp/!ލu5?0gLgȊb#Ώx911<|vڪGeK헴=#b&Py)G*Ӹu(6. pw]ޚcv+ +]V2}QO{.T0bUETi( g#uwJC]L +| ( +ѯ/7)|ΔJuhz)XDh6۵ǫcR17Om% mx8ڏڏڏICvCyۓY?>ݾ[0QA.1m +A u6hNWp& kKX0;ut}&4T<䊃kGfV|k2o, y''F)}UKa6Ν:ExM(tҞm_ۼՈb4O!vȖ33qC$n-l8EsT\ebT*|ĵҕEx[H$1 +02_/r?5}<:oEK}lHw %>~! +`txǠ;h6vRkFݍ$o,"l4[wPN-<Ѐ}vkE!]CuDHhƯjzE۝˄g^ϣW;Ӷ֠]=t])OW^68kI9Bomn^3|Q@CB"_*o#VMA|hCT ,CO*^Wq/\7}UOBX7vuTGP:;ߩu`alTgYi"ɧ@&oa^oB!$Fiwߏa D LڰKWYrC >_p_~' +bB6lXGT5+e3c %{<R{eEc.sJR*adyOcЎ Z=D"(yFA*]BH0ًWJFtU`n,!r 3 &U;Jo%C\"q]ApQ97{][`Wѥ?K{G0)a*ʚ QAJT:9rnE7,1u+_G ,sh5s_L6:LN *wyAYanqQR^ &Wt䖎.+yR/n }iAr>[cUkDBU%M +;GoEW=w]$䇈Τ>ASO&-p.Ds߀Ls64+oAls +. ZUeXP-{q*`I&(Y2Fųg]v{͕ I~l&c;~y-Zu2)p701}YU +T<#nEV5xM F|Wj6W 9Vu3p;&xJʚ9T +ːlՅyM}Y:ϩd22D:\Bi=ԹQf3aQ[3*HX3=m6~W/l+wuޢ4â2%HէVUeclTr}+ц 9m}x8ő8hS_XQ^0P1$KL7~(R}n0zC/8lt2]7@_7GLHPx*s~8Rw*2kND)a9(2&dt1O#~'?ݹ>|-C9瓘=I=-c>c`?xײ͖D|"y[⮋bo id8t}uzYdץٗwHt0oo#/s&H&=:<ϼBՋS`"#x2 5w 5lQ guS:x}y#r=N)5 SF6ף5K.) `P$:ˈQ*NwF-&wn$uI'JHiIUJ--CnSUa!PF$Z1S Wk`- !&]~ތ.V3r0E^EgJTwu"T[Ay޹XYئ^D^j#w1&Q( wh/2FDlf%m=CQ/'wAQ N=:߄jLm,A2IХѬQY%y -=Y$c<ȸ%K:,۱/ ! ^N us/]]rbͭqhjR?0AgJ% @mc=79LӅe SGiMJmv!1Hjl.}ǃy3ݵ,H9cpQ!^dY:vGM6k۠FU~Z-;-Qtufi +]%4UhYȒiCcNzH,OOTonez<^C@Jzgg~!.l'L%Ҫc#uQCT<<'L8Ն"'x:Rse#ڝH.#|t.?cmFzߟ#p"yQZ +s4[.X9^?qcN + +7x+>d1Hm5>"DaNp6ʚ5NI*4cBZMp6j|k&An"K0z.`'5i,Q\G` UE]&H)-eec{O>f)AA0YB8L7֠vn&!TGqި4M{%[at6F5Qq#{v/oYEɾR(4USpX +k +NZUDW21c;DF'Z“*d-%kKMG|E +( +[j k宩_j{4 FɅ8`ŵ)/X(i9k̀vbD3u0zBg& 11uf[=F@K`3-"'k'9nmR9Dp FD> +xdz!vTXzKfl%ܹW;=S2b T-9!ZJWw#t:svz?EHUw_GݬlK`8s<|o` LLT?2#0[:^i=87Si]+dUߊ}A +,,%qM'rE>.4qE]7D +)8w6(޶ka1(9 *T%- ,%1{&6W <&M_\#(E2hɔi(Kފ=0f#qe9$68Z{譞EK 5 +Hiw}$#] 'ƛ[\)SW( J߉sT*Yf@4˝ra5dY<oN)4)[PQ#]]{v[cV>W(Pov޹&*(nԆToT7 q⯿sĐQ3ɭ8=*/@8RE%^vx_#eȇX>Og00?CgҿQ)HHHV/?VGREw MYs4a6Ǩ J 2Ûg;2U'poO^D/QB`ԩ+9.Mk^lѫg [g,g+[vE=(OE <Yo$2w t)@,OoP DfC8?]q1:Mvnl5U +]r (r VJwD7gܛoxn粕ԐL2[Pksԙ +PMQzLiNƞWWp55Df{怃]B[x&popRяԇ\Xa~KH[uib?\6%R`gQl1A  G4/ߊBnXe jrp/gGd8^ىq& =KgC?bYYĪ6hҎz炡lщyo_﯏6ZY }azMIق` ̆ܤD5^VH (ӻ$= WkkV4z$,(铑T_]px6rGrDlt }w"OK]u.~ߞm#>"YSc32F4к_u;*9 =slmje#V'zr{Wק_ 0"^DeeLLm +[u@tpnyfM_BˬG2?Y^LBQ18I̡Sm(eSYɤ@!(8`@M*n>+JdgHW"0eLO$YѼ v+1n[ɴRwrM f%<ОGח +Wƺג]`H{eG;𡛿 +%ZTC~ IW)r"mgev/2̄mL(p؀!ptN@hF X)\w[Q.)OhyJs%n/[nṱq|W8fpsj_e lR zZM,rt}/_K/USšvT*C-y=POIL]{enoxTnjRYјw)9^7J~  #.#UB>GHw.Kn΢|V#G9=yyE l7+lqL}>CFm?u07a%S$m&ķabsueiy.-`c &8WD1Hj:(Cf3O%L>N:ur3&b^ݪ1hdg/rqb^o?=P $:,):#FA;ջ0,JT'}WP3y9,/3)v~-t\:#Rc?^Ȅzh/e#GDѫT6z'.X"$`H +()a4254 %K@M֤F +L<ܠ\*гB~w2_AO=l À +`Ě01Ep)77BL@=dZkD()[jH`snKigOn C` {SoyȉFHSOz +p]}ۇHp8 za( R;U:҂\FxM%mmC 6;kfh#l5xy?L5%\_ l-8I\ SuhaQV)qSU}8Ang?J9,MIVP\ƕ9-h+k#g1C+e5vnR3-x z=2EVNm| Ƥb-h0ش|4w,Hy.VgTgHEv>x*^Xj5TiMW@mEf7r-zZ! xInNq BwXOmɗ>njzя5>z'tfԬ4)Bm)Rkeq.K^0BteBD",SK߱-NY͊¥ 2u-wv`V_ja2x@+01NOL hbi6r +,8*pEL?,nGt2W?>GejQRK~}a#lԺ6ra6?$&iDJ>d[]\;䟰<#N F=O6>/:qW"z2UaP3HJy/J:ϋMDG9?e>(9BJrAG4NǨ9M4 ]ژ2&l; D [ G r] xi`^Q FQHYmfTJUk^4Β\ʅwYvPѦ31n|rwRGR}D$ɲ6,U!gmuH`2x Sus:/\F~6;H)yۋb(ȼdi%+}0=͠-i5d.i{|s-osOaHcQ]U52pKzr𗭻=}mD /&fT=sv; TcMAZJ %iJe3hđm!2UU%15He%po"LWBԲ LeeR/q{a=-~z V\u^H󉆎].&/DtǤU-\Fdp]CķL+M! b]m +јwMئ*:*[jZ|Aaf.Qۄ<'e(\eH,:_],Vm@TnCNnu#-WSV-L{=U6繥ۦߺZH0q +HJhFqGY C(Sn t('}g!Y=j#ʁߣ:u?WjJ}_'ɞՈsz T{ԥ]ih}ЊR 9O42]q`km 2BiD#,\.`5xP #AHifXOݎ΅m&w;$󿰺~2'8zv>PlLc?j,'o=OeҸ[ov`fj,fO ?b7p|U_/96A.O{%tղo6Uٜ?Mz!Y^.Gi j4q5F,jy?`siya;lk~y1赓#yQE] 7ʇ૛3R4 zlWܼ{wSl'a=\=YkFm3IZ'YP/[i pfrY~T6[O 4&W +.{ZӹyNr{i.4:cme>FY_2N;+l4e{^BPY(&L.3̦G2GFSj r6j .HTJ`5@_R6\Ȋw8>of5dV|Wݮ5gǶ52댰$udIq{emtmjlƖօ}t#Qx޷6*@mJʑKk8b,;u٪ _3aۮsWC#6/&wiVkzc !5=~XnW%,fKd;ܿW`Z~5-2^;PRۥ݀g?YR*g57q_khr +ZI":C3ۨSxfAe\֪-C{ Ymh)ʽ&-O IQh!ig9u`m'PhSZCg:%j 6. Irc 1)!k%|.]hmROD]G%^T7+>/^;=z1I/t4a3Psr*3SStSVH#FkZ~@g ;* (חZ/m͉בd*f+sm s+c.M:1Aq=r/or\9\m݌Q1Q{wzILzPӈkN%y-^]Jο%%}|7~Gnԡrj8C~{i8Pΐ> +dzڕs$~*>5@6z0wF9^Fd;|}d+fVJKsn*VR|<e۹ZԜr[TΒIYN&ʓk=bmaﹲlAzciDѭlܭ,# Fnu6@iԨ=٪_BCw1)iu;߽])װ!ݎl}u,G>G*=~]~ReI_/-}ΰM>K<[g.O +Z7ʲh|}DYL.Mյn79Ԍ/m?Kc\rгH#cHZ +G?B# lR.Yr7ք8|^mՌY3]0q=n@']'fod.\b(H;OܜmRW5IAyƼ_3=٭P 9/D6Z4̉ +wN_Ck[I8-[V9&uQM.ҘtkxdjOc*FshQuIF5.+$P'TɪA#d:34SX5 c S}a +'gu;-PPʾK1 U`*+DŽf;u 9h9MbۭC9atu.d΍\w| "_n1i~V|͖yz{~fK6G*t#/<%:Z%ǓOpV[HWd2anJ#-*~6(\b@0V׸a)Me[9PN1-4Е?^fP3H"1H8 .QB9oz=7^}WN{n^QԖ1v}W:(ҵP^&z r]Psՠ^c>c>](̧ݧ*zH"ZpVݮg"3q0qXQrO9hl4 jbtቍ Fi126@b;ӝjJ+&jkجbЫB~=;M/34NO =ieε^UBّZ=WXZYFD85_)Vu3/Dӂl +O#Sv0`42NL7xRd(n}Я{b+W^ԗk2y U*bC8+]d5tJFLV8fq<\^MϬ|Ll)NN kʸRB1$JBF$&nb"lP$ +j AAA V̳B^b?P`iO40+⶙IG^86iY^NoFnA-5k3`^6u;CMDp]OgʢYgX[)`1MkGdh;zEOQV8I?{UQ"V_B~5K{&@ixR_3nƫ9׈1Xd{a}' ^C6wY)VѦ>R{6uۥg)gwGL"IO(Maa*iJk>^Wt5s|sK6kj9l2&@*‹U\a2_kB\ "JP|[ZC껐.͆l_%DF'yW2zKJ},:G+ckΝʥ66~;Kx4M\$wC[1[Ve5US 4M eNt᳕Dc_ |.79t)fdN`l"n|-egƂ~lQ'":_(li=Rm2tTY?t^Nveԋ]ȗ=şrTO|KiGtufI geDiUgb"J笂BPZE7z}o!Ѓ'FwΘg 坠:{?we{e'eYkzo+%a2M5wZi{Yh,ƍ&2wu)Z,5 +C@轎gtK&t36KXe")XQ]s$l/$ɱž.DTo@k-1n_>U^# c; >1͞rmB囱kSi<'YӢ,j'[\>5ӟUmٽGҫ*G}UxȾ҈;友4Vqn}odmp*h_MqtgDjw &'ʀ*,Ge%nOv@E&KTElcљ*;iMz`_1(@o97jNpݱe1x+ۏ>ђ;m p I̥>4.siC3h!_DeӢ;BU +5T>\ByBW +5(9<$uܶ7cLVPi-ȳޑ(hF$#۸зyٮqWNPs7vȎ +pn܇g#vsť.4_%Ԩ'p̴r W3,%{.y vI~FN\ة*QK&=): Xil +a :>A-TWp 2.!c|cBcx5ĝc ] &6/.pR;򙴐v\!G_e5&fLW`)G}MUyqRXluǭfKC=,rIg-=NYNI\W_S@,q ~/r,@*ur$’s]4唁"*`BP/g w`4 .Љ*ɫaK(-+tr-d*X\lOD2Ul"+,"=|uY{h| -*| >a'5uqESp&;l$SWeikZ8MѨ~@y raE]vh {*H à +!7{ĉPD"hљͩK~$Yr@tߧ Ȍ)!;砾@m 9?3;O  Rl:ڃXNuGF.Z%`q*$Yy@Iy]E[Lsw,Ѹ9ô[zEҴI'@r~ 6RTK7q_])TC1xkɨBJ&ec㛀Y>Nȗ%%9z`:{>\N#*PN^Лiӟ盬:`z=Ld8T i+DEQ}G428O.vj>dk[SUW>9a~Um]y#)tPhWD4`L6w3DS:5tr.X QQUȠcǁ +qMI,zͦ~[ s.DV8gKc0 0`HEJFs4QdltX +xFgPNGeQ@Lrb|lQj[6W^ TaY"ӷ6-b|z2te4B/[b׳d!ՅYSra[56G4ކ94gTʛx. S8E{f;5Pz+9X)B(I͉R| u$4V= +K |T8f"$C7B \ѓzqk7H|;+d`BntqRhuY%q"7D/QSzߩ3(7>鷺>N`-; Zy|n܋.'c~z_&_\A fH !T|(6 +Kp D$5\a_y"E(pI($-W(܏5j >FB+:]p rMG[vi<DlI,1Bz[V$b0@]{P.)z o5s6a\Kj$M]gKeH:sM"jQ&wХ{_*rq-p>zxsSœvJvS-LBrQPv`;z/Sf +6E7u49~R59peHwjZ4rnPvf&v}^r3zh+|GH1poʤ^3yťK ^܉`XK2cs +$2 KMתwP6S{.gYP%PS.>T#6Fۛ^җ82*^h8M +_Mz'CT{Sgy.SjYKtjvh{#ƹöTR(YN̶XK욋M75%Y]kxMpAL1Sw}vɝǧ +9<-ꛨ r&@. +Mdϳˏ4椑ۋޥ1xш͠)t;Q-y.D?A?D!ﭽ(2E6)3E땮"L\hBHm"حҾ|%@L)v;r6٪7J.oƆd4=_/(&S*(ț$X̌Py ]T# Rf1{j}6KuKx};u6[&;oKgpzHwu#2f,4GW9;aʕ )'z׶՟HVKë4%<Ҋ]$,룴=]cJϡR$^՝``qv] k8w?/q?˼#ׁc)fV31q{eh}+mRgn[|9E3r*((BѰ7n|V}=@Ƭ4JR"^Bļom`6;35J{Dk"1?7wdh<6N'qз'Ck}z~=ע12Y 7 + U4'hM2vm,b%õJ!ضpJ*NݒzrRѽmzk#F̻ѯ}G~ xxp;_Y`oaim?Og?ɸz"thUQ?!yéڻjb5{Lc$hUTMb3{<ܧ[v`ųB;>p䙀MK UX>W!EvS} /գ̨HfoVG`?ezT.UYJ>08합}( >Uq'R-\| +_ƺ\*<=hc zѥūMiױu9ն"mi[RF$ 2kHpF<{8TЕ&SVИ4d>S&=2 dIFއ\:P1z6 RLͭU4LQ]RoOeTj/bR/ 9Xe-C2uUM,A +E&$$(*.YPd$6JI?E\G839MB*QRQ&l!cjn!Cز"N(14$Uu>Tx(fLa^7^h>g YLN"_ T"$D&ZҨ}yTR\zlL%wi.ER 4*TAQ)`gy@WZ6D)H!'8MQnEq/6uR#7OpСtj}wJZW>d>KsrXscO^ +>U*YJU3'2GM@ J^$I5nzƮN +pb r9S:?ҐJț62t,jud^$#/gXA![\1k 0-EëJ%z Ja&t  + 0j+ u%FjPDNLJ엖]Aod=l! ¬$8+-81E:xXV' 7c| ٹ0ۼSeQ#7%=1/#[ֆgpະVE +guʨ14;]P=FMRS' R Sg?^ dN Ke ƖU clq(=:Ư?vL#BdF1s]YPMsm~ )}^ t-/#LM<̗2 +g$-a_nCQJ!ןsޖk{cHoy?|b f -o;<̈́ؕ}OXe5E7̐ڞ0Z5dX[e_4>^JX'y5HrX"&L,#^HL%+}(;]/=kUBL/+thJY*ݐ|Go&1b<*?ky4ml|eYF:DdJ9ς!\$3vfWˆɾl`crL¹F׊/g0Yc_sǹPDc+ݮ9/*RI=}f4[yO=G?/n#n +zRh M' =s"=qpBpTd.[fkD ʽ{Xz<b+gͫdwX 4mAv]ckl}UVm۫E-߱o8.^ +)w^e LQ d zԨkaN.׭D["akS s.0_AbB.-j?L'žPqeߢZy% d MVasY<v߿]~TFEv"ZGi=T2qE֎d\F'kmX +eA׼ح{=~'4uaRN|n5 ? +3Ƃ^c[컼V˩Xx{PfvD48j۰zh6"k9?G=.3|-d(o2bז|S8f L,؁hY)>nI[ +,Z{al#+n9YH+K`RwGUN.jn݌oD +L? Gt"ƞ:\(l5bǸ+.gvGa4Ԣ%5/\mJ1e m$KCDx/+cBGݒ*C<,L=Bb6bc $۷kAbFR:d[ћjQ+rxg(oK.>|uE`>aTQíg ͣ +,hQ Lu hWE }ݲ> ch]τҩnr9EzPީw%pT+ƴ\58͏CwlΒUK[O.luŭo&7M6'&DN\4ûsdҊ&gxL]pu +(GQ!bAz42twT3S32L<VJ4֌yᡞv}yPV"p.4q)ɳ[vhq*eZʄ!Zl WO4k aG׺{@b 4\ZfP;ذNjc?6ϳXk.ի uۅdTIW :dL;dѹ%oglL E +FVSIKDPzuRj pШZժ7"M!Hsq%\Aa+u + +zHZȖC<&Í w4riX~xa-Jsϻ^/PVm|[ڒwc/e/F N5DždpXPI@$,DseXINeuHy4VDkuPR1uytS?>A?DK%G >zf%x MyY +|τvAnn㒡GZܴ++վ86[EE:+n;RI#">𽣋(ps\uggC'qx@dL^ 18L&}EF"n#:v,pBwXbx%-659=ɢAS+wY fe@-5r&gT.f-G>e'a]ퟥZ}m#gnH 4} +mn=L. +$A±$~mV%h@DL@,hGN4lzr?XVHt}2dJY_*}L2mn@Q"S],TڒafHYkn1R ջ{23.V٬4/Au=Ffw)J-+ Xخ*ϏXx)L[ ˃j95dݰ"(꯹oA߶^Bْߞ56i {ډd)k6wω q:y{UM +8*B8ՠ P[Ul^7|7|?CQϖJg6^(x~mW fy+.'<(|YR QϺLx +3jaK^W"qu@Z^ʎ]KoNת-3K|f!3.ͥDΐ(/U 딥tqF3$}5uGFGu@c*gfd') )$=S +Pq. 5;=U7}7}fh@JyC_VYpBN_^ *uߔz K"9=8}WűN3وmkP $`ueUʃ8X>[d ֡”/sdKvZEo;Hpz:$"NU7ZW7d==Cf"k2~aCū#Uf%)?{ZQ\[EgMχ9T&"U˚$TT ;k8L[ + El8ϲ{xr@ޚ<)ʉpD9)Eon5W(PqrY(BfWȜJG +] S^x S,ǜb QM%|ԫPf'JK2BHz@7UaD#;wo;n<˼)O`/A2x8N G|2vSl ķ XHI1?7{flY|O}PN~N²E6E%vבb5NԭKiLyQ̒=eю&;,vр>R.L̶ 琎h\cn1ȷ߹1p%'W 8wBZY;V] 墝! UŢ 88,֎9ۼ^. ξhNg\+N8`p +`/ Z'Lꭕ.,=Ч%dױyXaa}mg~-B`¬R\dvOY9}X(l^tiKm]ʤ3jҖnQޭ2.+92@ݺH*0v,Œ2 +PV_]m;M],2P{,c. Љ64}jBJFSG=KBbnvTBSj=S)yN*qtʹjɊv,#qu#t ϛ:S۝d՘<à'IWPY*\*/e_S#!uTۉqfn9XEХ}Ƅ#l-p!D^/B}I3I3.jt:b{WЗ!Cpb֨{!mDf:nG%.kˬҸ $fEdrWA4IJ;u" \%~A:'xB8|୦uGW: +5\)q1R(T LUɏ=3$~j;1i<6 +ǤdFi +%4^٩d8J!es)3Z*xc;(;g6*JvCF,6?<3-韅-Bm{ )j/e/vx(|HbQ 'KӞj$mZjFݸmjeSuEzMb (ghT}:Ioy|oҜ.2csJNvJi\)BʋFq}.v*ҧ}Qg2' Q;|3xHݧ5{-(@S>T2{( Q敿#^ﶴ\Do_(O8OWX{DR/${4Mҽ%?Rƚ5.&jwX,;'7[-ε'E]dCćoBucpXUPi4\ ;%' !ڻ0xHKJj3thUBDVlP(M؅m}0 WD{% ꩚ԜǴ{)JoyY\S-zp~lk X75'ZJЄn(yM֯WN_;l\w*6>jcaKOiܔ]H{΢E|IvDZ +xfe4b鹠@,fDT3Co@3 +PMkܗV֬p*nvT$]!r3^:O~nuUA9͠ujY+ɋڳ Qc*U8E6yDA:!Begr8 KӛCFMk :QCBcboLyh1'ۀ]%fpмl -ТŷȢ ;]Ed^؇Ll\(M@n;s-̙4~c+kG8q^|AD0L68=JkG4{|{xfL f, +-cVb?()goaFm jS4 ACR,ygd5%%7ðzbrR.TjCobK% L6  2 f|HSVJL˅SRڿ)bid%w3Wb3=[ 眸)~Ro(&#G @#$MDA(ۦ{xBĹB3,i(\p[ԳZr%qr0F)M} Qu,xW /,Ul(sSws{-u*n-X_ed*Hr5,߱/DFdsʮa=D YBI8؁ߩ!+%AkS9)U˜xe4lPbΤdz=&r) vr-x}f=e;}! qQ˛&k{G@zI@%pB,ESx`UQC$ +˜_6ɕ6@Ow^x6ė{%kۣM7!UDf"§J;g)m6_B:*u5ũL9 LPp) 8فUvz:芠>ytUߙkr֖i.cw&Ơ +W ?ӚG/xs鱘M~E:i` T#5u4~9mJ̳zqٺ0IS`to=QH\~#4_C +ہME?{|Z# l2/IQADB,d >&PK"Rn٪?n  {l|~s'6N:K|o) +EKEJkLjv<юRYOՠjߚJv΄x-_D|t9~RU5[j O<(ce/3Yy') /uxfT;cz~Lϯ?釰{|oa3ygpBR,RTڑ lM3ךssy}8Ħ sD@!,<5UpqŞD"&e ?XXS]q +jpa B{1%QNwd;&O2#kv(֓&gf&˽mW"V\  l~מQL@Jٜ#w:ݏGwupTP<oo?u}a|ܤ?1͎&8|vxN2kmB7ΩsֲuIHcC_"* $hs?$߂4Esr g}5^N[lAOYzT#BEV89+ " h%=Bk l` +b޹&{K i5*A^L];ptOL>R=ZҶR"eܰw.Vi7b}kn= +۹u:3lWt$B +Gklv\WG6M+hdk?[9l66}.4]3Rv<p[[?R]glPX+;HΣ9440t\35eiwu~}}x?4vE9d+ ilв\.!Ks䥴; o:~x/8)@w[wyL ӌ q]95ut,]#ء l|v5q=o@-u֖Nzh\qTf>?^;ai.MR1zWG6O.4M 7lCp"ϵr1Љ3w&IqR#J26Rg UC\\vE3= 'JOZMϠ- Xf.ˀsoi(?4sbJs\_0狋#zx#/w%gJMn]xYD&E!R)R.œ CSJ=-!#޽nV{`zBqp3+|f+@7ıjfPsȰ5=a,ǤւFCћ\;ZJ+?#X ^cLYy,#ʼ^l? auב]NWJOdvH͕0Ӿ"+oL Y=e-w6U ]V-ġYb_Y8vةgvQ̶hњ|=U/IWg13p<+؋|Ȩ䳆vbJ2@떽(pkC~Ј2i-,IλȤTDX:/U96ȸܶ VT[!R`&B%LnE^c;- +=\>!`KÜ( [Yc[^{Q_S /sŝdaEa/T:FC Yi$ G5'X *Us)jsw2Z譿v1 F + +/q+})rUWbq=5m02 ) H{ vZ5tMS,M.eoaHL)2(=TF&lz)4o;狖"+xUo~Ȗ0et_O˃g+ PIJ%GzNB#IIqo2xh +~-հ5%`U>_zc?`z{ȿDR|T.dmmo'&hhzʿ$U&t +g!=x1Zg{yA{2ƝFg4P Ul0l2nU.k| 8;%?!#hLGS#i!ԇb>4v 몲XYґuY}AjB٘Ơh 10JQfcH7{(kx쨗 H;jV}<Eh7DEa0d;Xǵ59I}VLƤD%7\z63ix~ѸKj]fnPL3<_p~|a c0jTS7aO.P%NYU9#8s*uPm&՜h)]:IIȔn +){O5V}tHb|G{`O 4H)ֶ)!0I&Ttqz孰o3NNW:D[ i?A,߶sZZo!(fEW>/jn +o%zYzZuzLlJRQyuxMTk*FovJJtAvcb `CS :A6FSpX?*^o \/"^t,#f}'Y':sQj +5=4Ko{ljj܀rtTu=R(&ڤ糮̪όS\31M0|FcO0R2Z!xE{-#DzTr)gX|_P>*Hr0e i\!.ڝl.om`@0ߝ+K2wqJ1YUjϟfQIq_|5cs)dUOaPa- ڕhAo[$Gl G`smtđ +יCR"!hV q,e^V|~{0Zh3HyQH2@jaD.ct-{d{uu~!?#EvγB*r'ˊ7$UQ PؒfX~Iʥ L9̴\0l(,@o ТV9g+K} W&ݛlܟo ps!*{&B&+ˤL0Mk)Y|U!SNuHg f ꗐd+*ܩ:/"UFl;6=2mЯthcYB3T%uCY|g&|A[pQI"8ʵUXNy֖r<ӨH+P`apceU59[xCjIA*3=r~,mOi-Kۤ[i8fc."`$s0xUB=T3R"Wڕ.^m^r햀t%veilMT-myףC+T u7J{֭J1 Th2a&s@n(k?dxېU< j\z FbiEoe֮B&t]z[}D bVt dVJ@ep[om`pD$|!bƔeDU]֊Xy4IK x "%/R>zv\3PG6u(DOnSz5rk벍tYa1ֲ +hXf~G(uxs rE +5 ,(>S 1d hſ]yC?|UŚ}Y]XQUC5 +WTQ.ԌEf)e(Ug({NyÚ[,Ę!Qt3]#ٸK^ϒ#j;s(P|P ¿/߄.WkUݠ*4«'2ۍ + +ڔY3{v%fǶG_VJ{hyC~L!Lŗ2mtjbs-͏`™s |"BܟqSj6_4ϲ='kvvvPw!Wd^6S]p@"mC^)d5%ԧe8qY +1KRgBHg]u!QXNH{tmۜc-,b= ۝f5hntW&TŔ5Rj˕fc?sU=~%F}mTkzE!q*t}?x&92v/*"ȝrurG]ǡT<Wy}O[XstՉMR2 y񊅴nI)FFȔ Riܥ@("gbg|}ua"纥O|hA+NJ\.MCHcv4 hߨyvt;O40EH@jcPZDjLʩK +_Ə-z8U<+Z?LL5{lH!؏|@%q%S$u̇s/vv:!DV)2pe7pvMF#dAˠԢ..]LFkFRHBiaAXg3e`| #U>a}IJЙ-5( fT:6A~I1مV~~o +`~ Y5e\TWO+¶MVL~oU}tSNz]?sMQ֥}KSq)Q)oR}&-ܚYk74K8ߚ[ C/u'&n=Ff + 툚X @̦3[?Sױ!6Tb=)J"&H'Wȏŧ'y*}${pC/ @I\`rdP֍A(c:SQIriZ%/bgf3M iנ:7ydRPywOW# c]n'*C^J-:*I*Un]}~6a}M<21vM*QRjՋ`,jaJͮoa?tQxgq1ג+Lqxʣ8UP2-}R߫iU"3+b^O ɝ|Q]K Q1v}CUHQmT]y=+v Lr}U&p7\β_8Eсik+jY@t Wņ= -Oʾy5KTꎺ.k!FN2 aXB ᵒc $(YtiD 5; %)l3s!/a%#d][ѡwLF6SU+׳ޥ] A෌XГNIՒ)X0sU`cA]/WXST_JAh'Gx$}t5F?E"}'ހ>ɁQF LBѬ&~ss':KSg.M +>b?#eՅ;Mz2EO_6!mg̗H/kj5F]4i5E-N=B+( +.ꄾ A[qE`#8LڵиQ)9qJZAj-8)pcJzn9^:?Mj鬟}˱u峞*8R|p).iٮ.SܹZn*07U{ƱjgB +ؓ'x7P]`Bm6>\P#Uz-} E,:\fy.A=wHT;zx>B:47J|n'kâU) +p +@ŪI+,`c[vVMUU [--224]0Gj&5HտORݻTQUƷԽRsLz U $}m5/Zi}D޴g\n;MjCaU5Ȫn; h ߪ hdOJ t 5WH;?j\%'5%HxڧLL+OȄbr!QH3u5Vb?b3YsfR .Ns`SN'D ÅH &K'Hx}pї#>Y[Z=D\T BFꖘȒ{^ψ\\Wq ylhCǸ#[Slq:CGR3W {t:*Yj%k]ҞiC\-H(]3`h;}VBp0ϳGhh?m³kɏPT +DRX9UP_-} Ha %"ҿR9~1줈XM}Jé6E@~7;ciChrU\_)KULRCTVDӠ +(l(>m Ռ/YQ$b5ۘ͸D[7V4Vr>HCFeVklJH0Lt%1 6f$ ie$InCѽN( pЬ`5]Lmr@uBBaY-6& + mC zE ʿS*EhJ@p)q=wJ.O9R;Idvj|M CDŽ:y&;baOuxfmpJ<4 x,A +FK5[ȠZ}9ō&ܪ^ G9є8kFkR2HZ[Ί*#8%VAܥRcGA}Ck<5ڠ.K9 F'eUX*v2lfIKSlU5JT/,i|*)夷s2dlK, +p"ڋlS[C]wk*z鵾u:JZ2Co,پN߽1@\ڗ蕑Ӱ &R@.LYY y\'*W;{kʹ[H1t]2hJ,kv= 4 )6`%]9_9yƹ+()Ƅ!I.izve/L$ +1{jfuz#EhT8.nOc!}Cx1kNMP$WMEr0;Egb +9@"+V󜩓BOXtiF&Tw/ؚb3s-%GfS[ѥO1{[:S8 z$<>/*BRl2 +,fA•7OWElRǎhdAOp%8b~d|H}dΕ7MD&4m]eNQ?@h R9PKYmE;[iWݨʽ%H) % c\=qVdAI6H~G؇!ȜwQymF,Ԫ6Bg}8#䈦(LJJnw{%=Cm|1Q1x77T^ v$#T3͎=!GcI~Av(?}$xϑtG Æ-x0SIp;w甠`ł +Y[kUgQD[o¡ Ǖq/Clx| 5(\չc2LGu.IioP +5Yi39Ve=G)7@q1IWO=82α{+uDv&wrÑ!Wnsȵ PW)3gXd/Wrv)$(pg3-TuVx:U]k@MB#7u3/sИ(Is=[^y*e ̾?D=$2LwG}5_v( ҏF u2_^TQ`YOx~Ưw~U,ANp ,lDpإZI. +Σѣx٪ "r c']tnHq@\~{. + ޒ7dvE +-hh5zg|bz\7kyN#@ Xq G!QEHćfY$zK:AjcvtW7{H"Q2>R1xQ +[ +3q# %·1i=wBHi O@ ƑAAQ>l834x y}Rl {o)tbxBW01CK f +Ø@R~%{ +d0V>D95aʈq*D21{o>ۢ Cp8g`s^^k&t)_$I܆W D yVGdVɴzI}cCWlMf}nFQg(-1"^-L?>g]NԕIlJ!_!yϟ_oi!6xk+ֵSY_fOM}\5!t%}[nk}*_ +j #/Kl|HD}JVRAVifr~-U"_Eb)_n~10wzgk0W|v`Qz/ 4j@AIaz$K9^>D쀐B͵mGj9҅ `2&MpV0Yo3CC'lDlH~f$}5ҍ^ 7^lң궰F1&mESNmE<{]LQzNSQxMso2& {&-T*G_1MO#jУdh~RJAիqeހ:֮dW-TcC& +ZDEU2vΩܫ=:ԜSgGLރ]gb,ޛc';Y&iAtiN+6Rq(ĝ}ԫUt[bO2& ڕ EEQ-ݽfYuBC8ƒ.ĠPmtgH{){5{ݞ~>۳gljxͿ! m-b]$-ՒnaziKMY|;@o)2XNr fb5,"ZzT1%_ZݶUԠL~oUfB_WNHEYU0#-墕d)Y=uoxxʂve뾑j1ƳkB^^罞^)([ګ-X)MkoekŻ+^Rㅱxo$Tc֔e!P"+4 -V +9Ԓ_` P*MmR`Id MZV Us|Ej*w܆h*#h CRRPj6C."| wEp3_-%JD +M$H B' |AՁ1Ti2f6>b$e)d%?QG-yF>XRUm–m ^-,cyۧ.'k6N%8Wr,oژJ4{cRN-鮅Erkޏ +Hr&SSvzmҶ]J/qU_YPK2./vhLX3-qj4(Y4[C[%UffZ!d}W\kĩ:F/jr =irfj lHUXsۏ6z]?y]"(M*qNqO7;;{$D֥V@k&g'fWg`/) +"2gh:EY_ĸ7laHOwK״MJFG*KQ;3=V;< vF2texnP&-O~T_\;qpޚU tz0QK=^̦dU}1A- },H5YzB6QCSsߕ}D ug=@lj`ˆi+}K9FI5ܕ-SǴh*.Ƴx[qbz_H6@E=hs7Ւ1rb>&9)ߊiյ]֢ RHyQJگ S>)n[d)88:4qt+rl=Ul|蠻nʌ"[f9wF">2/N7ju eS +=!X?>¢<3 +H\sG´vQ<4 'i"ˡT qGcԉxjHwk,{" +{r=¼Է A˟$)ƙsd4b/A?n XZ>e?>v +v`@!06=)wѪfܥD΢MwK(5c/(rr젻GP!}"1]iH*F1g*|F# `oѬ9FB?_s3PkX!L1^]Q:Zk9G{;Ƒ=S$"Uq +26-x˳'ϯȕDJ[`[u=z.ҷtp46E9Qe@#4Ԟ EPo)TړjjGR6e呪<mNyGr[&v"BinLp'YHJSh\ . /x >i'X1o}ua*ud">duM.R_0 K!;F2a?2P:_y8jzJキ;b@eB]& 0UNøLlJsז$N6F)9I^ysQ6s&`iMm?;t~Q! ufmԺfsew S挿 TqSbL /P@=Ƣ NKnIr Ű-^PO D!Z +d(1 EMɋFuZ4~7 2  USbX[Qq[)XR5͗PK +vzqMѳko?𬶄fK_9M.~]h* +nɗq/ N&8(0L&U8dg $Q'A?_H6Jm '(4!hsY2d*TM& J@\K +lɿnz=HQQ>N?Io?QS,H]WE8avȸ4IY;,㙋J-_[}jmt4b<"[_hrׇC(ܠ\p_E|T>&f8 +5$M0cN3OT +n$ԝ7*>)E쿐bx%Ra_5WI)(O3ހ[jw\Qa[Euk0L*?ב%"S N+8 Z[=ܮswCW~̶AE 7T7L""El76b޲MRkc . iب-A}M6Ǽ8iUMmkɵ[ʶD$X>eiN9V?BLRb%9O\.?++ ߳{ϋw컮ӫHB$(Ϡ|U5ZG(*958Jc e=Ȧ/7[JZߞd|/vmE 볭MUZ)瑇*`N3nG\_r2&% ĺ0 9OUK!se +R1B9-WIƪEɑ<.BBd FsQaXey s#:]9|~۴%_x +q3CDeJ +z04K FT&`EY,pVzhb)I N:18rNG5-hD"#4T0F6rc Vҷ =hEMzU#C)/(e1# +9+oע\Vvrʢg\Cg5ӉroȾ;FD f%ud쌵M;fB‡R}~ID˩bۆCv E% m3.sfmlLOA:Bѿ|Suf+y/(mtG#+Bz8=ģNUqVkNz6k +8IIUM@6FO%rޕOAU}pK-SZڶEA4N86D +bm`U-c@:QG?1NFvc3X30we3*il v| wM>U t}04xH. B3m%h|r+e,Y B:*R E +ќQ+gt7@usj3mvְg+ +1C,aŨăAXENQ W IʭOIGAs/qͿN*?ojgYGx zC;ֹCMMZ'΄}V \ʔi/ꔿ{xg;vP#?(.LX|MБQ@z=F+ϧ7AG'st=Ϯn9Wt@5#G㜭>t^;:@W9WJ_t-C(/ϜT"Wbk9s]a.΍L.XH.">nMMv1ٴ][ +l) _vⓂ'AHِm-ttpIcaﰥ9}D4w؉r\FRDmUU8Z>tT] +X Uy`tؤb]2:>$R]-=i\AC.@&w꣦Ҋ]Sߊ ] s% B}4.aa*۫>ήTeZIuuJVSoQiRuINCvZ +qt[_*DN +.qo^%2Z[뒵RE lA)@ M H‰ + [ӭn'NFN +' e:9ƒ0 +\ 9Rj־lJz[?7n͞>5"J_u)f-b]&wՒk0ah1Cd1^Nj\YDkiǔ sַ6E7WJib2!WBh)@A cvSm( *.QtY?ozz*{>Q?"Jb`8Nͪ4OKTT-:% gLlMY%B/P+S7ȩ':fsuup'r,g&yV!X5;)(KGwWs$W>zko=}LxZG廅K7%qa/E(LAraS"\I2k΀,Ψ,ԌKU:ϥX +?ZˮFu9U$++ebJ~90O'A?NQKѕ8ʻ.u1"tZd@v޽PWYڼwQy\VQ$IDe6dH)kP6ʼ7l3u]/j9 }%οф6T. LN2ޣP t+FVw/ &*ogу7qQнvI* G6uvCCo={V{>D`ͭiWӡ3%UM5(vqL(W'qD9dgu)b5l. aUWvHjP3#՝l"я&uxRڊZL+DA{/ ´iΛ*kTߏ]{ZdJNTeSԛu< 'Yz"_Q!>%8u]%ݕ}??QUR.z\INg6T~?sk|ZiJK@r)?F"UD g;dךͱM{})S"1I +;2+V'5 \N(vq"?ğPk/UzW7¤R*'@'``NrN8GN`'-+5-BƠ̇Q|vicCq4XTaݔ\<8 H\}*i@(LV?Vɧ䒔lCCz񮉆{5"!Θ*e-ފMEi2 ƨ +sHj8vDZ!#%6% 'aìK?_my2xlɆI=3,G4~ĸId)8kQw)a$b6rͮTҌJU &O;Qe˘VQL!iE<(np픞UƤCIK7RnCr[6iTKs wpݒײR|T4aBVt,T~^ӳ\ ~Ќ,5jaL, zeWBEZiFoD "| J.)FuGޟY+?*o3||ߛ޴Y5Z4ūs~ zaw5/!GhOu:Gdꗫ2_̥US`h +2I`ȼoL&qEB &n_mlAF ]a-벃Fy.K&j^2ƍ ;JiNەxrY)yϜn"+YL⦫7t̗Ixv+cG!9L'sgXvn =%O_؈[m8.MX^{ +Ɵ R/aZP[$5q?1Rl7&x^H擁d>2̹DHsqs}BٸjEˢk -z?Xeg[7maJ\&BQU7g9u_ ~Ƒ)!{yK qݕl'DWP`k Gt~sF\pn( SyR3{acB3jpXUlq #W__/[0>>: Tp?klTl FBc?Pp~j\Y?FSR"?%Oۃ;Hݥpl -8SWs|v}*j;J +wg.V&%")$g:R#4DI*O.AZGQ@ںf->O&{A9 PJi?"3"K϶{ȪB E}9xSsN +}+.'p ZZx4SXk;*q #8y{8tpqRK._} % "1#Ut)6Nl FFYC4VY4Fhv\s؆tᰲᮞY͗Qab+C~Oq(Yasq{ܘX~f`"9ac +G#!Nq>jBe+Y<3Ρ)zbC6[{`ӓƴXϴ5gKet[Q4#wzW9] r.[-QUЋG[WqvNxnl3rC9(hPHZ*jA;%& X<Mj_U>5[Կ٫="ѽ `p/HG|Gڐ%$*JF2MD\1YJEru,m3i^ٛe)b4c8 QzdQP##n0WeV)Cb݅2`mo˧ަI%%aS7=22ւqPѿD?s7HX7w3LikK+,T{dPxaqc%t?o%6{~Μ:Y@e w Fyd F͈Zwv&fZ3.%zzFgE/[SPϲ=1d*hj1]O3+2G6UH aHh&U~|V#xUb-=Og.G]h(泮&QC)Gތ^e{AUI ykI]'5 ct$sґ"-kc5Җe M*#h蛐oP%7{K^ӷ\RDʳWtcfdR*M2'ܗD4AuOu|KV>D95}_3%#Urp6IO#0f $0l΋J" R]o"JXvDmMkL *ohEr] +c. 2ȍa6SuҬ^H*=b5Vj+NjdBD*ZI}]}qaBMw8K*Ť%T1K{^shIR]fO@@frg蹂hZiw+;Z/3YSϪ5V63"1izIij WcXȝy̹iMEQ!v/gE92o'Jm o.#0(tkҭ YJdY;-Gʂ ƍWZz0RLYcȒJm}TLCa5 $H˾)o4Q]薡uu&l͆J6\ax1PTr+HϨ=v5s:'~GtϪUB:DC52KqKw5j-.I+GVBf $Y"'G.6}tYWo,LzَmWؔIk'@E?0#=];П5SR_lƝG5#9F="O3O03”VAÄ9ZfUԨD1VLMr1aͲoqCTu./5ة4 }Z0e}p0DP dkK>)]7]]snޣA ;e  @RD87c^"}ݗ!'7N`vύeJɃy SoBUvHͭ u纾Y{KJsXqq%|qQ>TY`dfz!Pr.Hnܪn~ɗ iPxNXzciԷ%jsM]ѶMD޷g}dwiKN^2 ,gGZ@P?O`Yt]~K)oBCH6y| ;TB +쟓 KN_M#%Ņm yKD-C}rND+J@€uO&*f}o]_x~ + C9mIڙMyi7m:jxL%My[gǴ/Y@{ɺ|I$i[<~H*.E@FW%MkU,@X UCY3NTSudۦJTfě)am"@R S"y#OQ5 'qjݩ P}%{ܞt +Mf"b +J'ʟJ~BM^j+G*lK82݀5^*s775a%0ULH bPτ eA\ +MHYvϾ>FnI +z2PZhZɳ[4K +dD(Qg>wy^: etҺԽV,n@wN Xm%v:m9O๩k y&.Ein<˴ڧL^b%KǸ?S'G:l ]dھjV~DKOOM_;S{ѥ7d y]rm0'2V7nq֘ڛ +lI7h_J@05R)c z\+b+p3&wuBՈv@_{jd颱&Dm NPo + K$]bzXIL(e[ IA>Re y9]yrK 1*ѕ=r]DS6dT &.h!;-;nGNblq20%!.g(2=1{B*WE O8 +>`747 \?{ +U{R/U9*8NdyGɰ( 9kbM'XU;>2*i[ $qL`8<)qǛDc r-O{Η` ^(8򺝆:p@>bLB~ۖf)VK3)l@!S۩ RC0Mպ0"XoH{3YJ7&0;NgXGFrjo?}%x5Bb?kqem3)^OK'Җw bf!,jd"D]=5~Ɛw: <Ǥ+nui][;pv +{ +Y.d]yl8.)FJ ̊C׻3f)Pت!3% hxʆpM9O?AMFS%OkGIaT[R׳VFZ&ieg[UuIa%)_r!]}[s$0ca#z Q;51}+yuŕ+jG#4 I0``0DZXQXlZ4nk^15#6bG[bMvyGED<W4WǘHQCoɌMv5kLNjF׿(,gX)8&ݳ4 _@]V&Dv&mͬ1z{xu|_bSP?!+"aA`о=!s*BV.48J壉5F`;ً ,)4 KQt yQLX,'eƩvQc$q!y䡒*;9q`VINY)4zU-H$.Yb $wf͓7~$JK3DogE?~8\< Do3Uxaj"ȍdxPĿV_zoa")eF%`/ɗ~㽶TCdΨsG>+"/B"E۾\ݗqu>/\S>5V7 fA~A +OթځG %MV ץF6Nfz"m1O0q^ ;Q͎@lhA$ȡ3.D#u&a™P~>%34s2i9"Qgeʖ*H8M]8]I ֒P`- a`o Kvu{S9Uӳ3A1P)dKv"ٍ܌CQ>Of'4Z+9dmol+ :_IIS-r0 )=7KO./9>ߖ+J Q]2lʵ3`^bQ Pݵh,<@NN/V-B!FwkyZ]'ª[UZBZPTc~&i(q͙QN[`l3ˍ*SEY[5(V |&Жn|3鄢^Vw"۔<'O;H^R%_VPvN_dCZC}"[I#K?.zBW_D6 F2(4O_AĆ{~0")=u?i 2u(:>VFJ=у^hjw)36WeNS{ࡶQm(9=6m~ ^{I-WUW]{wƼ9jr:F;=JMd '/"`dj/,?b^ާNT JLTԶF[{!+5 +TW&sWMN~78L{i{ + k'g" ]ҁΗ|1Hv(j@$؟MqpPy!m5+@^F59մn\Zyi +Q^wXC"F% KU%VvہRֺi n77>&EBzL6 +w-՛5 _5 q3ҽ|(8iHZ)i/z"DcpK\)?rt)H.5p]7f#~Jh;Z0;NTn9/ ddzwx{bCmEcэ?2"ݮ\󚘋_.2H4uF;k?F3:#2RD\Nb]J8S&O&Z}v~0t+@zL}iJ, n]߽~ '(%=觍Wx{{-ƅTߊ^(d15kγ+ŠΦ=P#~Ƽ ; VL >|S0]y0R{ɵ[䪖=qt‚"n\Ϊ5^NJ=&XWyB>1[&Z?Pk٪ + ewZ&*LSnPnNr ۣ\ ݽZ.8ʧc6 +v?.vU\~_?rGf7q ъ+*:Umm +IoNz#(EYN4n2X0+O;zbR+OP8)OW +.jqEr|ؘ &Na \ oBy\gm l57QSqSMBFQb?!.{~Z@vPS(݃دlgΜ.B;L_)[ޑ&d]iR042S;iR7ӘCģG~?Q,$Fnp<එS5a iTwW! now\"2L ҷeN#{N Ȃ 0ޞ_# 8qvVcIQ [Q/}!T@ifxnݧ>pGJɃaI_!Z3AD:`-oPJ=qKV'p^OϜJ,qnkYHxm W$:5iM"A;7{S(=H{%궀?y8H +V{<{EĢӮbdQeiG+B9JxPduUV1 G10ӣ> ^K#jz>a<-R&8}`4y.sYFXLx56sH]hJ I][FrFtu«Q 9j0DɲT zP,є.h_$yE y0Q9ƺ'"BUqjSޓw"Dα!+^';tPq&%iJuP]ק輮V~5s%/W|"nV6^}: !$ӝM0mUJn9ОRӃ]l}e"Q».0э)x)=lX<}W}t@AW͠ +9K겇ȯV'4ZHY 5(=^ ,Z??^vu#r 5P\y=!' +g,9[ jֆ մh;yjR誅+yDBq^KFaɌ:9&Ms3{S#Ό}J(&-29q˩&E=7A1ǽnWGy4f(,ZKlٟV{6q!EE:Sn.B8J\Cm7]$=AMXUHƁXaZQ;##Xjn&Db&5!s}tnBÙIa _Qsyi(-o5\ +e ilCљVZ +\I]_օ`{v*,p7E]aù" GmVu,VJ#uLW֕ +uj^ʋ$]p;o}~a))qtB1s%`<nģ;%;D⑋qͣLClޤg,T(8d%ueȪܼ!̂*UpsNrGPL)0yER:ė$SEJ}!)>k!ԝXܙ1hJD_m8>UK:M ǃ3}bjQLzK$WoS%'Գl~K5[ #e_Vى<X͎B`C溾R~-]h/i@hŲ*k~jhn22Đޮ^(a4όcgm@dؑ/g ZK*0D"<(PZLFF O$&j&WEpaxa6E^#Ud b;mE6]fnk"TL, zOC%H3ij}欹~/ݯ7;W$̣:"/"j{]*M{x26n\ Ok 7:;\!QUϺq{8GYN6fkh[1#ɜzg`Dq*G9޳ѫ5^VMEJg{Kol!FlJ?2̪!3̪EI[ oޞ_cj,6CX*_}U +ZkdZIZV=`GA,Eno{6๒fJyXXyi?;H•Ҍ/lX8/FbNTS`H/mRVqEBT_t, +KTkvgq]f&@~\n +gg{VO97v )>^7.jk +_┟K=:"?}^E%#V5Mʂu Q EV`E>~ )kmHF|N=n`: Q rܟcο{|%G1a-IS3Oٶ9#ɓu퍽FX?(!qU=% ( +0Wu]N; LFzcbh8f]-;Ͱmy]֩Chy=֯<d[:mH&G%)5sɞGtYtg"<91ntoP- :Vw5۪$pFkm·hPRn7$^!b <>l{gNק/5kw5ʴebО7՗7GlFz{:{m3nkE0kEvgη{;uP= 3҆?o51U<, ,;Z4>o5{H[0EAMIvoj0 m@mFڗ-6V:}Køps2CWDqb!(EJ9`d.TSb%yϜubR!{!#B |o@iZ)UyDsjgTs,usشHKصۦIXF{_Ӳ:i¼ODUL[]~dWc]l"WXf꟩U#ݖ75Ūj/t~*Hg[ =Rcj3%j&mDk-a6Bl:h%7D&`P"$1ݐi`H@مf n(,r56+ꋜa*標rAQ"-`\B߹V+1xj19J)0R>KJAO/%d̗R2Jm%S3dx`#3 (s:T TƻZ[_UGaDepެ;o!j鐬fjU+)g /f <{NюbFyjRNH:S+!o̵ ܺQrԘ섷 ,ry) ^)#;hL.;#N.!tgI(l+uiz0SIy;=Lvnt\ +k)r%>3|J5Np =I>6,w|#5 еլ@nʪ:5\t@eAE.Rhш veHb {V3v hUdnb=kiSn6 +eaJPe̎}|#O:).Z:»#~NXi;\r.Cr +ڎ1wFej7讞D8(w/5(pfG8Ԣ=.ÚEK,Gn7iO^E5cD^Yk(m>3ݙmGԦd|]5ѣ*YS翎8j?J|gioXRΕkQ'߼$:0/ \Vݍtu!$(Q:?,0u,t3|hxql>ledV,6 ^/#׭ѹVhz4yODު 6\`3,^/2" χ`}B| }- zÔ3A5f!WrQTiڐ7E2В6-`2kXq{؊CV qٟ75WJY𨓇c/grwC)<@^9mUDƢmҏ90Z6lSLYO7]Y~jb(+'KTٿZϋ.UvG*;n'˟Pe/`z ~*LdUY EUݑb/AZ/h!uBihC{sX誝YZ2͕#~Op]@Q leUazQ#~5X9UK/4c#j<\q{i?>uH.-f- e.aKUo9E9mΫe,ϴ˸ՇI&2\[OgkJ*GㅹJn2ߏrtJ>uPyۖYg9:C*7?RF I)B+%TKJcjVw$ 6gQ 16nPuTfnjҩoN>ny -zz'SFPN)j H:riYt2z&9JqV)PE1ߺghy}Yl50>4*Zڟ6t3m )+02P#D9YvLJceSѿެu&-LpF:ܶS ZX}`F&a~=1ݜ&Ԗc ]gMub1x^!.N-z +s~Vo f2O#-Gw*z6q,SXfMgãM:FS߿lMVu}{Q6>ӣ3]''j, T`@f0tAUH&#gI ;mQ: l0j{KjAdW 5?7]RE1s ~ ^iW~&zݭtYIdǩtuvJWJ-(7$rS6\ Te]u9zmDkszK1$UpG.9=ݕ4R +3OѯUBL_,DBkdVZ2*]`rJ h齬)YX4"2jDNtwة ՜;jT^.&ڨ̂|qx?x-vfYnчUдc7qǣ1.ߩG҉Ҥ?2i*>l<rm6@Qҵ"#zCu_Gef2Փۭ(Hd2&n,{y?9\S5d9 N$ҲCgPVQ#.ļۣF \%Ȑ><k:;˴!g̱֡ {yXBO?Ȇ$vǁD4 1Iÿ~׋^k,eFAd!2pVgt3Z򌮝- +p:yŸ h=@C o8ޤL)^hLu2E"J) _ VR|ua[7@}|q]c|X3@֚\V/C +I]1r3Q$E(pmeo&}&y^[P@)ƌ3.G#)(25+!GZhWक" +蚀tțESذ5FD\_FT9&7&5 ĖT:FQ1qY5hR+ +CxEQQ.fR+^%X[G4";f݅˨D ec+B-s |Nr}uޝI.o?h9cHw)ckr5x Pk1XIwyB,եVt ջKjr?)Grθq![.bq\|F^^%~^oN'{\4}|a],fJRvZ!بl\hJyc=ֆP]mO[q=hzJ+ܜFy2BRd1@J6pMJ]4Sȇ%7uzH9u +tVw NN}i&{^2SJzE}|C7gۜaa5=_asHlL.쉌s<p+IJmf2N:EAH-,F=P+q +:@s!}ьRIbOChS/z׋P@ Jӳ"f];[]ux?yQtڲu͉Askp!Y:f}HkT&J* j;fڶT>="ɸc23(n۞0 +据e'@˥' ܡC~eW Ypffy|h +xm+* iFeUܱdBtDk4c$v9P3BȰ)U﬷@aRۢޯ3=ˮ?+ϰVN7L@pw|=U\ +_N>e.vksZͬ$αS}/R"~VeB+^ICkFp r}B5wq`BV%3mr \=˩WϷB%6GAa)BI*O؏vc8 V 'S`Q1|l4xƔ@I[{ٙ;0[H_aoG4!;e݅˨@ _v/2h+OH4 #4ώgh]$Ug?(yc4ZSFA]Ct#Oxa j;Hcf]LeFu)|plZیj9r#^^g.U{YgZx̗}IߗwYVOklDWeIR|.NJ "fuF)#)ߢp +ǯsǛ(ɬLj R.2%PA`u[26eM|N_lX#B?}(x[:Rp g+c_6lfHOXvG/.YIz@2 +_v|)ō "NjiG6eq@umĒלsI}lOUvl[2'f F8!q <ԞRP<\po9Fvt}`L)m$?XCLJ$לڗfL&a_b,M\Kڸy.ͼM21A^ q +|@0%R=o;5Ni[mB5c#{MIȌK9-zҞiR"nȻ ~n _ac +)u[}XԺ]cJW YkR}ɩO>K&B7fܒd +9g$ +d> >9kCMg\sHnScJQa ꈀ?<@`v&Oh9B;y$7;U{cQC->?W zXGbV˾Q;[Je"n \G.zw2PŸ](Z +."nqo]&ٝ4O h4ݮwe* g1]w)ckr5x ;@Ƙ}dD "bվ*AL%5 y=[O\ ^֙.]㼠'<˃< ~r5]_=dxn(oq= +F5WI$7+%pu'ӗW93CUFQa +f-7 'l3iU0Jr N\Q!Evʍ.U[N# P<ϢMI=\Vf%66J@0r@m4}uelth<2?xQmGWN8:|XxacRV wsNzRȅɓJF# 7saҋ3tAVk*=Ykl+ip 30C\hQ]8z-:KWD|&M ,rE{&\E0졜!䇬gvηmg9fLd=46c.%}/YPRv8fHA=w^jAQ7N堄=Eg3ňLvBvf.3wֵ] +U]YF|!Mt|B.u ^f_$hSIRIޥ.7QOR~~ +}nq}[\-:?wqsp!5FuPQM VKYYPDf!Vi6e!U]&%^7o_ Þ6!n;->KqR/7*ݨt7ҊG~A%rǑm"ّOQy*_wy5*&Wx;1)53ZwfIoՔقNo'I}Z_ϐ\D{q2ݧ5]N\P:YΚLNtKkm袽9%:[3Jf +Իb*ڱNW.v" +x/Fp~LڇT$%\ysCrB7c~Bk-sY h+ CO9Bs!VWU&x} +kb JM8 F-8ElHjm˥[jhkf s{,h#X襜i+hd(tO*q{uqWڤ+覷e89ÖZGa@hOeݦ@#!#z8_M.63e79zf&sW~[i0^=6lp5)w "}p,q:P!s -M@nNGP*kSvo"C |TB,Q*.ΰ8KZBCh; Sxlٙ:4xLQaVLH 0C읅;dҭTl>Ce vZÁX#DR\ĨKCnz ϩ[:RcvG܄.'lR*y mt7;Z[)»; +k2Tew& ,>= dcq9`.|u-zWds,#G t\x/ UDBlm5P{ QlEMETj'n=7@xwaPFm;"v\!*&YZL9&M AhN%A}#+9 у + +s}]Ъ&A?l ;Y IڇJoE P%zZS՘,G={EkϾAqO5?#?_ W8s]7ןq?QUHNI1EC&Z ѷ%5FT'aKK3/);`,]m^`Z.T!§prH]QM!mEA.q.%Hie3[ʮ^:8ydH>~mTȠ!0Mh$*C-l +;6"'[ QOjBFń(<UihTP$&@6L)E =RVkm*uell=ʨ9a:67=oCTׇ#ZЁ0rޤ2e;:+l)`6Z/H~ѣM&'+Rogjɟ_ 34)>PLY, VRxehqe#00A]0p@OfY^@Zu4iTf<ژiv' ii{JQ!`>hE'Y}l]T~B~|^{{͍OށD_qW~pstet9:v:gQJ_׺No>G%6RE^w +ݑn>6NT ę88ߧ s\32PČ}|?gO b@M\ +g?ȕ+GMȤgU-#޳$FhqP^1͗sb el5Ҽ ~;3e*WK.n)Xkqb<6{\uw:4hn]肯 RI%V%/G%}=>6($_Rח~cumcߠP^x8`nAZj㋽.kn|艾̼Iޟ-#ѱ|=}W:uz9J/ٵbrĘO\ن^0IuS.=3 A;NuI,:Bo@T[C7Vfa6k"D9Ov/a*Ø0cYMS$Ƙچª%~IOF +6q>dn\9yMJ\:PFVȠjY9'5)9)aQZH4Zhï@@xYKw}]Gc5'r_ME}Y΢MAn{ &M3{5#V/Cǯ%KxS\YYFJХBBMhoߛ +_WASLX:ND0 {Ӈݝnt4tl&n jwm⁞1v+)Ev&~)1̘eDv\KmҤ&AH|H'+(5w tP|lU|TV|=Dۇ{Ź5!4BFe^hm*=hq[_3*$i Әvo{hlCόS<υa&Pu e85`d{P -dIm)@Ocrc axZ @Zߐ\`BC[[1U9 ׳~ʿ8Ɯ*>R}c%?G$O֒@R7?]φ2L|yM  +MTWcMrI}` z,^\1۩ m{$ V(Nuu)*ۯnEi&lbs& +I/TW:OJpbjhwENr~H:)bSih=kbpjNOgc:}D }JSUN,^'uziE,/qxr6v6a6?a.&X_2gME.V}K^ևob5?b$ b3;K𪉝gK3]^.v^sқX`EexXS>:|, }l}c>?|lc+>v?cYca7#>ֿ%˨=>>ɿr{X +>7ll;+6v}c.v|1>#˿?edQ +kdl]Fu#ۿcd?d3'[83V+vg ='v/. }IKB{$tۯrMۜ$%m#>JsH蹟&Ou04/ z硻N۬n˝R_9J}6H&$<Q4F00[*"3#^Xgb"Prj/X9J|NX%i'gFSDqg2SgIb)*2ⲶbT.՛jxyכ_o~WWכ_/~~aɯ|j7z7uVuhuW-7.cT¦zzծ9sC PD;(Y/Pd,c Z,LUݳr`Z>!S2Q=Fa9_*N. m~@Gu1փέ++Sw{+0vd _vTO,+_ݱС`$ +,!j.틽&P)*I" ƣ_ +.K5Ѻ UlvvGފ9mX]oǜ쨵6vcs [~ӧsǜqL,MǜP}N9wʹSΛ)'({g +  )vJwtꣵ;P]z4)_Gzj>/鉟FlXgő>X,ۊIR'W?ڏ +9n &_M7_^ zYM7}MoCqAW隠6pzBa˽@ǯLB3V"@ +pu /`d;r-ANcIp*õjC\IVImඉ*/hK_;cl&D \5q2Ez +GRisjzt@';i=fݴVQ;iNk\Z;״;i-Zl֛i {;a6)0beks%Xq}h N\",E 9Sg nq OJ2:aMMҭ-q]:6)5TdTn:Hqps)>ȱ/ X[ ; ^ +FT` eמ6{[!G Kr]AII\ߡa* 4gTIFݤ;䢍+BQW/rhNI N+mX^!{bRmBv45c]^a_vo{\K5j]5Q7ic۪J"#;IjGi)ʭ\hڏ_TLC}9z{ vdg+ݧH GsMj6Sltă|`;(K|x:GN$WJsޢA5ߦ[4b=0qkoɕI޶P"g$V;5u˯)hvYb˧R_|і5sq}'F_pe\tH0֮RN/wRx}MHVYLk5%g- +vV+RL@R,1<K)29l'oC1=(:LMud.E`cvTSp7Vb&v%c4͔NA!j(WCє4| ;+{]fXf)^3jrۉ;.4x|u8*ntQ^=%ܡE0VViCr&IjzkhsTm(;G7?dt. GǟY|a-Qǖ,8 +)Cʷ8E(V~xͰԭ +`Iw/EQݮvN)r|v{u;YX7rU|^M9hWh8,lfɵ|"xLlV6lv vaS,2+Q& +Z6.},qGRb HN`7b-HvrɽI”MhYXSzɊz¥{K^\CM>.S8r]SJfHJBw"iicOwyv`ǚD_cc罞ũ̡8X]H[R˅"%ǗSG@郃]cs]#;F4 w%7#GCy6P w==i>\Ff*EB!QG1疺>QjAOv[y>!iuS֬ TZLȁ4 (y*Je>N fz6<=8LX CC|=jX;P!> Xʞ"" :D-nȰE ( VPaD䰖٫@&Yڐ$[yPЩ1$_qk7Z17uJӣ}I'VC^QfPq1ѭ9oP'l^O1 }2'NQUV]AWE)O}/-{:A9 j=~MS+ ɻ ]"=˳nj҃sMhzȲ"82fr0x'7Z 4(٣ Jzx",`Nɺ[Oޭoqo鎔<LћѲ ,-, +i(9+ERŮ]$76??cf%(9*3;CdȮMsӖ|g.Eեv2g[Hڔ!r8 +ZaYz,I&W4אַ/ܐzcʻ8Z.#dRu;%Ғhj.F|(XЧl٨x0.簺Sx!BTW,>5VuדxH T&x^J,꒫ +J)(VZ*KII]NI"S@46@&;3b*v`:Oi!*tpg 'zK[-\ۮ.]L6;g}@l$>Z0KY o_>\_'җߙqK~Qs~`x4E!L ]:yQASYq"O+ ;(efH ~ήg*49OU)oi}߁LC`uUKl[פuL Vu0Ħ]Ij9 +@3|*YlM<ף:868^U=pz¢=ݱ5Gv7SK@ע ͥ2GuN_]ٻL(Չ(r%1qk"0n Ѡ ;(@d( +33g{2GAVj #zj#J3MQҜj 1VM \o(ouީnLX1$jЖI%xG[<[HH9C4WNJϟ=uԙ|{K07.6gg`C6i\R!ܚrfUɁ-[+/knnYYQFCc].bCjJJ^2sqURڸWpZZ"ų2 YIytoK\NwIyek.p k^!c&?b&/8GKmq?s\zcntu3q(^mq(RVSsK1h4?╁paEGZdgTWnmp׬ TZL,ѭ2bH {KDDAAh 2*l:!0LD +$lҜ I)q& :U2Urk7Z17uJӣ}I'VCi^QfPq1Ѭ9oP'plh^1w2,W]99vXp Z[U|[u]F\<4K:@(7$Z-ڏXi/GO]hiA]~4+UiQ 4=dWf'U۹{adR<)=*Y. +/^l;@1G-5P}ӢTUseI"zʟ\mspPוo9C' 0ZqI_~bq?|i/R~) d_XO}p9q{B yE2BkR7E!yQ-\A +ˬ#tlrP~!6y5LYt/?`Q yDX߁LC.dLD'dmґme( ֐ +?HUI S5!- $ BF)0i!7|&c +9)HU90Ut4/)iܢ\iC@~䵔:Kw.\Z4J6,7;coZ wHWh2*h8o2-ŝ>3'+UKȵmpUZ2UGB=%/u-i+d'P)ge[GUA7g1pNZ͐An.[QQфw +_ JjwDY3 2[oqEPt'3b:ؠE9(~7&1"~U3$$T^֤%4"G,]@mOVw@dKH D>E]$w `_Pjl)IFPeν.rު(woWl WpYYg'&Gُ&o@%9^>~z]Ta7V:' }.sZrCZifa+B㇢Ʀ- +i DFBOŸQ4hψ +)f- o@}ezcM$. +K6Ἔ1Śr+M"6T[f086q9CYru"&yK|-XWpW{bɦ7شLBs!`t/+Slw}=x{NVNs~R6&x}۵(x 9؉ٗouP4r9X[cR{'쇱;m S2@^xᦙ9  +df8\t3LN p:`QjL:Om]g>I?:sFФK1U}v0eO:j؎yRZ2+u0l1e-vPcsFw"9{H"bBQl5aT4/ي;/u +řʙLrSPJq&ܪ_S=I~[p/UϱO VR̨7c04ܪ-u/bSI{ yf$Ə*ICs9>}w%A]YԊt+-ăй&$,WlKG.x0$XP"n}3q$wr}Ris Q/|R3+W,ˌqĠrv%Yt=Igʫ# U^c FŰ@..p!Ŝ + Ada*3CZ8C[J' jo9pGRJ7D-R[r:dzehhz&0geL,x4͖?Ǐ,ڤC]OLHBkQ^IU$\c1dO^O'|J(sEJWѕZ= KojV$26%9̔V=BsNz 9|ZY萌H㒉6dk\_K~~c u>CK9/+h| S?6c0_x(s2Dgň0iu/("KEsv]sNA(+ %E\2?*鳰cRˡhet]1+d6:- ]O.cTc6c|sTR> + k$|c71~M~h<:Ahs+dXm4ZUሼt3v4.ҍ_J+28!;LyF{녥-{C2~ڵt{g٤!.>o/@⩝?Jy$KbӷWmGkJeҽ5'L&Wrٮh_MzLm25iJ˱`!){wGwɝ:}v^'oL1א#k]ֽI$:ʯ/ڥ2_\d3 tu0؄Ɇtc \o_d/&M7+aƴV]d&Zh;>Ԡm'5Zʜ{xSrު(wo\Xr9xu=Ⱥ?{qYYg_<끴-tkK]N%bbwHx{mwQԹ@`;'t"[sV(+ =lOa,UM_T,qn~Պܟ-]“5iۡ{^+.t~%CgV Õ gXb ; yGd4 )_5oWjkV\^uB-h*5p|unՔ@4;m s/*s535'ଫ޶SW@C)jȧ+}n _|*q#:6WY~4u})?۽o9`Cn5hou>iE3ĺa)oy/{}3rC97J$Yp(8΃T(f:[vgN83د9䦂ա2j7cS_(I~[/UϱO VR̨iY +tYn:1}$=Z1Gm{.>HT[O&Ncc\_+Uj5ZҟrkK. Qt^òu%.f[=_(t5ь`{{:klB4]fkE9d P0͹b2Srl#I7D:E]2yTۆ?ϦuS6L?@!@ya涙6;}gݶDĩ*ܼt܋A=!BjiW X +z?k +1:'L= ư,fS`2\SHrf[1Lmb[BWHj$Ʊ ZBnÝ:{ uFfY7pW +W4ncƟf +Ѽ9 ;Hۢ)J[`2DVM [u=vDzzSWPďw kɾͣ8iKє=[ATwy>[Ƚ`c! Cl&9a\Ѡ%I6yMJ!kmE||k Z:#%$1zuܷێmkS B9!٬.FsZ{}3~BNsӀ`LP8>G 5ӲVydkLοBb gJ7a&{_-{L" +h;oYÀeqPd0l--E@;3:l2,k%N>{`u ` +H]*"mӛѱʈqv[F>+gpHU;?McYM+cw~d4Zp7ZnGFKgSA3KӆORl-ȕAOoۥ0CNuveF?o>o꟣&j7x15 + gh"O 8Ivlךroc-*n*׉0!Īyϟ<*J:CtC+ SF;D֭ajbaUo53.qL<gOl}Xi7 B铟OOwt' '@}'@%^5+3i#Bo??Ѳ r"~{Gmz}Hl?I ;}lB깿6yKޤm)m N ʵ[1rIB\q: }Le^" ި6mßb>~ީjF"4e۪ ..鲛 k|ٌ% ':Ú\jQe/,SFL6)*)(3<$T;6fI8Hq\#N?<O"ߌ*^:9݊v=d⯕.e[mRgvg^3$nL\ްU-K5}[53+*]T4.Y~[e%)#4^3^7,6kζ㨜 4WZ PVFh^l판mqmw'Ϥ +_Pls7Hڋ\AlSX T?eV\>51ۿ3)^aZ&*"M2~E,-轼+{ ^\yFBVT7"{] +d$I6BolmZ%O9RkfpR.3RB-dl.V.o+~?-2t;!Dlm 7F۟Jus3UTYyּBS%C׿۫sG~ȍ,Atߧ T#<|@o3'3KE$ =m9+:-~=UrhVX27gEyʑ)έV:狽*)#$x䐢7% +bENK|}lW #Cɀc˹1\6o#65#Fmg-#3HN<+u~FC_1|2qUkXɩgwm <=VcVʐz1d 4.ue9>,1 ߽nC4߸M8E@ҧ d)݅?'99EB p)>GS x;Omx_ xrzwW+wmw{wO>NxNxLxIQ~W9OxlÊ~W._=#|u\E9+Vz1v6kX{B3tMhuܞE%۔KJu3FznܪXCb:NSF)&pxIAu1,^ivyFن2KiwO- 5qRaH&M,^x8Ih+/'P-kb^\Az07J&ʹn5[Sy +E v-qtj԰8Ffe<.\erټ\ +2z^}o tdeU58$/yz?o˰cV*朆8P+x<2݉uߣȉ(gv)OiV Nsup%1Gu5ӵя#eL(etd$[+G鷤+}GZﯫ4 ~TTb#DzWE#T줮 g3EO<юmCfe_, nJ {ŏđ)6j`;;>"jNVבKX֠lHAݜZ _S{ؕ emc] +!fUVli͋Mlf;#d  vFyٯv +]$qjTMKIo?w_ϲM |iߔ#0-{`siR%How%h8sF +7)(z_y^'9,}m56.)! q"js:tRo϶<~=ڏD(t˥ma&gCqx[]J0lEdd4@^$7!FY͒EX)JGM^ 3qWaK SHmlؒEa +PW!9pI40t#FYeKO4=Ңުo62t +Ikmfgs5--6lzvf_iw{e*dz[.3m#~~!miK*;_6d$^3P'ײz\b<[V?^R)Of~WΦLq"$ٖb@G [#z tj[0uĽ=tFhx1}sr{VƗXlT+9˛xmN +t(<)(0UI4 *;4ŋ<ʴg=nnj,h"$%32x7'IJO*qq 'N?S0 Z̍k5%9`q:/K +ͼ*,&وCBon-Z>5}[}]T]&'mV2y$Tk?n 52p C/Fy1D(~1u Xea~S|he>qWrjx׭=~Yj`UyS[Ii}~#VǠ%0O3;%jO[+e_ӂ0kFAvz3\9t8G@t 2y6!P0maNu^,/.Ꞿ=j5 sʿT”+Zk7>&ɍX~N ȨhMY  0"+322"v ٘;>4Is^6܏{m&"2Jxd +Ǧ6T p<`$;Юv$rezc[Uռ)Gr-X0*5l딵7M*SE?7WC4It x5xs53`xsC.̇ٳrcx8/U2,Uri:Mq^v[ysEi#UX|CF4KCbZ+DsO> ;?|L0ڲ<$އ@f28­g: :Vؖ#Wϻ$kM+]}7 iXk"R4Jm~eg:N1uj/]ע\X]26u:D̏sY` +7wUbԵJ UxXg 7 +m@:m¶ R%Nfd iPsu кBf4[U.LwXtrb3c-D;_f==n yb(=VBvG$y~>,)qIf\&m͒CrGq{jC\Nr; +E kќ줍,Gܣtkoj= !D +o^o'-|>>G"F9ԩ`xQ6C71Z_ShyUp4ڵr2k'qct+|pb 0$OmWP>׋~޲o(y C\+v3/U{.Sw1:* 岎[j@21q=< 1iy0vq˃=*'5_ۯ(<9ycY$IӃ8OwHDk"ѷj;gepU̓V`eS4)D`Ż4K=5tc +[hǭy՘ +mKc4Kc{( Vź㦱ufQ|. T!j0[l:Hґv3E-Z4g"1#-D;_^==n y"(=V>vGncwQ>y܂ fqx3I*mpg=vJ_Hkg[cA=ZHcQւG;Q\'@'nˠrYǏb⴦ +_u; 7mJ? es2y|2e&;*VHJ^1"skM-Le gz2#%^l66K2)ǵ*"%WO.'Nfy < pA\J:_ްKMh6kkʘܝ-jk7t/kOQcӳX99w|Гc)eiBGWBnfWIc%Rfӓ?޽2PeQ3oQ ssgQ!TfeŸƶcD|/A؞ bvTVi'6ލÈK +ϔ:~kV30Y QX˴/5EuڰZIÆV`1fD]ǽP+ ^%^f}R앩0l|<\_09"~ wO͜ƭ{1t&OQGJqmc I'EbTD􇑱p 9^m' UT!BqB=nUn缢>;3mRq_ ҟcV$?miۦjhΗo{o{{oo[( g/Aںj|I|aR6Ƹ_f*Aɺ=Woܘ$o:yO5q]ױн)캭zf鵇GPڼv;̌iRYRZ +Z; @D؎U_ :bHhxu[`Q5iB(bz#{d5X'A@~^P}f +~gLa()L# +\uћ]5H֙S^3J& 9Ak/UT N͒k|m1n+ +nQOg*L)%ߞ694y%F)(=~}KJ{>G ߢƿ_ˤhj©/S)xT] ÚT6]'X>q}w;.?v;ٯq oNq:yWNbIͻ1:ymt.FZrpiy +!rE*ג;;:h6Z8LD=Jo&FwNG&[ R脖>`~i~}WEHPlzG;VwЫtzrbҿ}0>N9\0SoSC,ծs|U{,=π _=d^+)Ϗo9aDKOiIf9^+i*`]Lj~"=5.*2|-KTaVRy8ĞWfְMSwA9CjUG(ï>$)`E޵*_UqzB b 'ګ,cdekvʫs)ky#꼞9|<]0)A |pcbЎ KYW4D `Iܲ^d3 PPNhucQ"k(|xi (GWKj Bbs+YZ!Hd\=Ǟ]"քɞFYvJb n-=%9V1טiÿ2f btU|F6U0\-cPN _i-Զhrz'u%,+g YQ~eK]۵Gېߵs\WeѲVǠWΈ9[ .|Pe&@[GWV [>t73e4+dMAh ŋ]NGK)a~>Kg[̩).X +CWK\gu +;ʺm]w뎘m(65iB|Cczq0MT@z,A9v:Ar0!')pK!N ީ;ƥ`zFA3"8HSށ}(鞥bgmjeqdE41dZAv!`DSzXfKyQUpUu%('`LgD#{=,S/i$=SKTة*lRytQ!'],P{xFSu$8񭔘RwYo)1u/{2x +@(jeqL.|nt,,Z1UyͬU3WwPC\y[6 k?;1یJ{ )/AV(;< aI\lA%F9 Tv +ԷgGرXMP,b,eIJxŎDz<,ey,/XcYz,ݲ=oz,K{,,4ݲ_,oxXDz|cYvml]XcY^ey,,ˆLjxdz\e7Fs{,mg\)z;wϒ_,[.WtcהKg9A +U( SiRH3]e Jmf}Wpd.Ѵ? s$?J1;x3xz#OѴ~%caih7 N% f#!s#E2etV(w8D Wf;dHwGsn~|*ꓫ +2S,h2_A"%㺷*\ M^z >hSa/ LLhKZvoRA,2G1{lkG.PNx.Es|&\ar; K%Or40#K_8-̡`>IvI.km4əyG=6,xE$7Rv Ql}6 -]Q%)"хGJ¢MQe0Яf.QVuoYZ .B=JMCƦُV {k3T$˔=iBؑ?|&)٧d];d.\DWdRi"UOW ǒxU}U28eƻ}Fbe +MGQxwĹa~\AYǛa]_?B巰py_Uhq ^&0"AMq )q]z"꿔1NcOӴ~.Gۻ[J۫m\F*]΄SJdNƌYG'a.@\ bn7֖Vn>uwuno-o-RN1n4-ධwm٥,bwM>(v| +>%ıt6T~;s=mӌt[u)ݱ7GH8]DSE_-%NvCVX ~[Ob$zWL[Ene Hsi1c}68q//{UUU7]~dՏU?GVWYU%t.doVF_*Nދj2\wDLwbB5tUF9;o~p,DJ1^71̔/#z.8$΅B5S RnrZfhB /IgXxF*\ w .<@`?&6xORR0"N`)lo#\+@:3n4LWxTdHv4~Яdza+Ws2ug:lUr! ~egmzFdR*bnǡikĕKcH]q윞#B( 2Ő(Iȁ#{Щ E PM~/2c 򀵔;X L$GlYB"JT4إ ]) :)2VrF׮F|-_= /s7V?G?3__oy^u]~E/Յ:]G +uy6ܵݢFOjjAehFxuv + }Lup<v}`r6.יטw i^*u{Ȫ_̽xZVI}/. [ڶ&x]zDj5?3Ʃv2 8!4UxDV毚߭~_E |O4+04eGii*}nCmG-͑?ْ|b5`@j=0+"a($>hr}[ 羚:IbmT$,@VEh-tӉo+S;,lnd&Jr;jFO +bΞi ˻’s "TԱv"wn9y}^X8TЌ U3j)A;p\#+iV(5l)rM0yvW"L_ģ(rU1Ne>RN qLч񓬶:1aR/zՄ2J0R,FD+& +CkHW>jD]i< +ux1@Ȫ,Qfu>/bGhFˈ/2r Uv֓qVmQr,tuxysjnf`]iZjvUXyKD*tj'v::v$*ɒց{h=A<~Fs.d[~HNVzP˞1?4D5'-n2NTRQWïXb|)0]w] sYoмpT.f={f?9. }X }(:BD;el{ 0f'kȚm% {J*EV)\,Y!%GKM||ٷ*W]U._ I}<{j )dC ~8ɕYJ=6s,}ÐYpa;C-y*h$U h`ۀAP|rSר glH+`gsAThl;#)d88@󑈐T +rJw]s^N#Eux?b֯W8~$ZJFBP;[aiԊ`1pbaP'aw16)ROGִ(l1l1i ]#lSFѠ:5oȧ%"bcN}/*q)9ft g% :9=‘7prwYSY7DM0zJ 1qDJhɾV&z=pkS_gJݍ^ {p(FS#\_K"{=rC8f)B`J48J/ MaMkqcj` >6,Ŵ]Q+67u>k%"5?y{n˔JƠyCE]*˒M59%VPdE YxhI~p0 "6(R_0Ny@6'4^kƕ`(,CH]64U 5E!(+m@!ٽEhyNңC4ʮƅ8uH ]&6ġ[+QXB!)&HO0J7I[g3fRQbn2C%iOnÇ809j<˨Afq~k%kYF(rPڒ:H 7yfO, + jjX/: 8lΓrkB ܕɝ|F~#7L:D} Uj mLn0)ōqiT3T1"7|?UZW!qP-2NJ)NK,}uT'&u3[=6=hQj tDf7y>=,LWsURNUb<b{*uUIɌhP~%{1\t`VDTzN\JnЪW2() A[w,)u' NFݶ|Pge#7嗚{r-<'KTJ+p=uiuu,%Ŧ~:2fؠae쉁-Sr5R&s]n> '`3@9\A&6_w:$I$a2ҍb˂3{Hh' )ȳ.)4}3+'MEpt;{A)׶)LDz6NNXǯbqN[ x=u]U/ڈFmDww66}F?k#쩍h7n6b<OmD>yqn#F6b\6"+>n>}|DS|#SqF>G+>?>)a>o>o>?~#K>||=񪏰hh0*se`$ʺZ/W}H/.jΑ~qsp @>2Wq]đ"cW}e'׵ >;ɻA'\̔Ppp*#ֱ(Ğ¡(M,UWM~ @Ia "Bk[7&8? + ++?O -AccW o}P"ҟBp(m!+U:Pz +)DE 5 +KRhcbcۻ2DMc+30:2ȁ2}[7[0E%Bz62XP+!(x5ȐUIe0xJm8A`œܛ1hG?ĺ&r2ksN[zڵ`J6YȘƊ /ZyC)]a:mDp`l*B|>OINķbTV3a?po@/<p}ZwƠ}>7FyڙYv;4>(y=WV XRn{RzveJ L%&ȣڨ5&*v?$m$ W d[yßPdS*Lե 7 )[pSNgu +m_' )mq([S"wVN7: ,fƶr"ƾC9>P"q>N;]JEWTI{Jڝ*ߦJESDM쬇_$I#!ϒ$c࢝'Updyo7ۍn-`yA WimBӮ\6 A!S5πb  ʹ:vqb QwRv1i)eVue k_4g,gYNd|*aR3Bt?QҺJZJ՟gXU5KʺeJ?֘¨;ZcUa~]ZO 0 M Ռ4ʸ_xY5ѯe1=;SwOcktej.e)( ',):r'eT(h9MT$,%Nw2BmFkl Ϊ}yWh49Ra ̦龏,d_7t; 링~b>S>zsϲFũL?`*EP0E]B6U.r~{z,QnFEy] iO>GNr}.Xo#]ѥ{HR>Y)3zujsFJFtТ 1'9FGWۤ1l0G`=RFZpwBDMc +(9aUH?4(L6=mK*XO[m# +;_HYBcx2}Luxuuvё', 2 հ0l?Iq"y" +d ZfXBZf +qTL||I^+H~.L$a)BYc4>͑p`J2/P޻Yg?LF:I[pAqR]MW̢ TQO>@weW}ɖ:d1;L]'s/pJ_ L0XF,2rF +[EieS@[\k|ٍ\Zg)0<XVo)oå"{yk1e e]37[ ٜyw9+Se[1L 38 ?eDq{ ,Tcw(9k;,;0DI-[]a[y>Be*`n2ԑsМuwTU(_4tLR- i]IqdPq$,3\JWd#년)~uogbi58F k>ow{bG@}Le7|$%zhhr_E*]bԥNfNhs6@ $ܢNaqQs]-5^\OIZDэ,x4C{{;323}N;ĵ#7>H; +KPPܣ66Q-kb_)^,SL%[_qLST1')c]9;C +C0C<C "U0{P`w]C|Y0`(Bꅛ(xnZ{!}*W> +/wdH%C^XHǤAq'ţ1uy#{¢U+8d2{lK )eYna=%ExJ-7'ض0p-S`(pz[ +p "%m*prnu7`KmoB(YAztkX4}S~ҦҡIS= +bgMg}#l)֐ *`>yNVq.K>[)73g^"^iwхo&M8vmې>hF)ft~&uD`wS:Mx_ujWj~ lx_uX>{x g~UvWJ?kt|ϯp[}ȑ#^Pt)Ie73'#RYUSzP'\|3ץw+\VV)ԓ;ߟYc#zu)"n +J݆ܽ57oE[6R,Z6m`6dnuKV[PmxU~*~18"ƺ@-6şH]hRs}[DK|[V~f$ylnҊQ- +2W&)PptI=sh#"T]& z6fPWռBj0\İf[0@!6jJ0mΰB0&rGՁvd(,5FoP&9+X8rLXu"IWp +'V).|7jnaq ʧ1ĬhqSmv$tke٪dg/NJd/g& d(Y@`v#=W:3r +I:?o=rI'w?lC*=ǽI(l`7vR '%e4"頢T*q, -ܲd?j~N$j¬1+Jq]_"u6ޡ]y _E"ESgb8J7g*2F\w,bXΔ )2蠛נxˢ/qFs^rbpT莃&gᘈ"rlj)]6VNi +EKJuަ +ZFi}-mk ؑ i0 +#2Ƨʨ}]2jʨʨ}U}(旄3aTtQ'"POuQT)_~]STⲣYYq"8yIʭDŠ lgj<>rT^vv,6ƒ؎E6KK7c*[xgeEff, Z/OŢD{50B/=J6Dl";xUo(W+|FIq@!TILc+zU.o+nA;ѥW2ٕD632l!xA:D,S% ~dHDx$5r&є*>h!S 3.Ac~齖&~ >ů5?ůuwF_ůl| Ɵ…``C+"XG<(5uC/֐YlwʘwkD^YJKYVzO+{d~F\MN/l[܂~1%u]s#!L gu.oN Ȭx㒴ݠTLlOJ9FPUfaNu^;plJH iVZ&jI;:֙3x&v>!2UU- EnWNU (&I&-\EM;b{W@!a-<9cnL+ؖ(˯Yn^'8+i% TE`5(gݿȺyRv D&3XZĕS@#V,RhW ^c#1&Z&3 G`]#LƭÅ;J&$> +b 7/"T^h!=ܸ2CN!f d(.| s[,wM!С +ZX{iYޫӞZQ ܳ|'P03`g[. D]W& 6o ׼؃__^6w`ƕqi|m8/?\D5nNVf5OkXf_<* +Ek 7}y06QZ|_~~9O 5tvR;뇈xn#ێulvzcu@xuS½6;v,p߱c[k}1'tytsU\[c{n =`FM>#KD\)Xy'd=Z*|_o>?9MHGex++j x_izSfwpkC5Fw] c9z˔W~Eڃ + H Ɣ[Kxf[NaiF ؁da͌+'z`z-ְzMao(vrՓ9jiIĶ'G΋OlʁKo$2$ʖqX6-d]at?ۍk*2<Py{QNeFo?r\Si z9!jNO2eI K췯fOҸ>F#EX3vJMqI=ediqUS=3F)lNK`Ge˦u9Eɔz0ߢ)vf j +W䇠\KĹ6 j,ǞɯxmW"dEZU-vq;9}PWhĴ=֊UE6ɤƞH#=$(0Iy趬`ӕSx1RdKM41S^9є(dal~Z1:7q5'{-8օkt45H',IfEl!8T>C_B[ť3߾>E:j8׃+ UUa&7P e{1yu+czyou)'j 0~HVjYDQ%'/#y@A1'vt@nL&`C+((gďs(b0r^)S]ug*e$Ov dj%sШv[!2RS7Z^u 'nz;76 l?/OkE,m)ڻ񘜔!mpJ`J> +xT1.oSVJ$# :헍/|<{mkMfˋi1ÆS \TQνQ:e$' ˭; !u?xwW&uܱ-x3ED6e6FY ޴>'c c"SZTr%a }΂]He]vX:m}Ý*[ ZF6AkÀ91!c,4!po[vp].u~~SA 7di{y4 p^e"Gá4ާ ~{Eq"0X<5d&RΞ8 +K4ISóܹaYv{7)[v6<&y30$e,uwPZ+ (6(`1X%Q(8V8BcgE7<6's;6=}@27yb~ k7;^96#$q9b+Q;T>NídP;a 2T'X5 ,}n^r} !x^e ̽%޳bajTൻH٩SJ;Rϖ=܉vQ0ڙsUpSeQr'Wr"Ȭy/9:=vm.rdP\ܝL#ؒ#I"|hi$װu?TA 427JxkO&6q0XogƋnഒ1X|UX (PM + eqBrGe^;f?bl\,ƝOy,znN%u`݊bD<[R.Ju2}B +[2C%80SNIvޤMWڪ`67|לaP3H&F4Ӊ( YˎacS3I/h$7\KJc6.fx~+/>2V/yҖ-ίy n% 껙?hѢA,Z^umo [_fĜ_ p-z#ͧ6=7vTb"Ud勹 !-˴(,f%9mt(T@>L>Umܱ-lbV ҧ kl ;tӪ3!n5(JWsӽ}Gסu諹G7VtVj;K%*6 a5+Á;?$!Ĺu/MF?5?(wlmTH26e;` .WaFr<{O,n7bf: ai6?g:D|c4pmp(1`L59#BW:8 2$M>KHap~X;"ҸUNIWI˯m1!r)\+Z']zJBENBH*NNNFᵁX + K@3vxq47VZhAmd" j߰d5x jK8,rG,Ō2!dx\ +Tmud[Mk>3t SE +ƭ-jvN%%=IޓiR|ͅI#MMs TNV-fiِq)p(zF:S(]*Q' z 1PL~]dTۈK]!w">miq()dH^Ht:.4_fh:fCjub<=(WS4A)MnEfHU!AH4q(n?tُQS} +_G_㟿ǿ+SrdNͷF0FKیA݋,} +0oHKIVv?qfV_é28l5\}ue5:xerX{5!KΣ)hʽ> +!ueŅ'+QZ erVw|w_]. `ToUA!ul_&"zXg/ԛMe_(9畛;S92]f\ ity q$09/:c@Ѥ^*mzU k2JrV A%`XLZNBcB.6ozn$0]'npb#WVe]*BOq:B"kGd~8MK܎HLtƝg"-WM%_1G0JA ̰2F+$V2738,ʏH(LG^CrHb Z#I /gUœ4 7 W:k,}9^ŧIv4#27 r&]wࠜLCMM +LO+h2;$om!M+mwHN?Zf;"n-G8M #+:dIÌd)ͰnT5' tCSudyi6؁}u-Y5 .dr0muPGT%]WD=}\zy4 *nI-3B5˱. -iԡ˗*]"K"bfy-vIG X,H(vӁCvfU/kCeK5IyGDdYREGZes/ + +?@^Zt`J54ͣ[a  P&T~UH 'MFQwJ %Ej.fǔxdU .)Vb-Db:g/k"mHnea3,z*[c + ASGI1K0$ A)1.s=|.a0Y UëZyw ,۷&*Sl>xtZv_qĘۆn0|nT9dڛ#&i5EGB>P,\N WiБ.p2n>sͼ %F`BJ# z:oga&Pd> K*#`yT=U_EyASF$ث5ArIRXbE3p,t'buw,c6 ^ Xps\CgH^ Fcf.V瑯71['}R(iXݓ& +.3~_9`aȃ. +Gor4-ZVZia)#_ ǂ|aU݁>:n +,xwYh,w]01&:,OMuEz`Jx +͛{X/ \^Ad@jx7iLaqI3 I[4:'CyljxD20+7wm[[mp*j#ݳ=|o?~ lɐ*-ѽNO8VLl.-sPYj1Pw*H8W?md/n?:5(Hҫ#6 z[ȏ/Xy>|Awo 4dCd)"z``r5/ +~ Sx%j"|(C| 8߀nNl/icƽoa=C(X }މ~ E!{cM+_aPl.F +G̨@-6}"C!`3"mF(n)a7VlCQ1lh.t._RQLي,V*j* {_9Hޯәl{Q?Q=mhFC8ߙ&*24KVer7-jub]k\"J>m^T <̿v=Bj` @ԕZ +l-65͕Yk ɫ֖/,h0Oѯ07Ej̝؃f06ThW{{DÐ;9זc3l89)=He;zPchCuE X!}K"$U3hTqs$" 0Gdw@L5†h_+ + +u&:zU*y?YC֚߫^kfS/SD3˃C׭/ +ϐT]Ut4ٱv!-mH;<s^i3o^HmnjKp)0S~>=|ϡ|zznMC_|en_o>ݾ۟ fZc +endstream endobj 97 0 obj <>stream +8;X.,^M\ZX&B=Y_49:q>Z:&^JWP!m?6ul:l5"2agWDU!E.pZ8?KnuFL[WEo+l$BP^ +o,5ce!j25K$TRbJ]CR0J9G(oiA(]!bk6#daI:6%eG:0m8/+i-Wj)QKWm/=YV7^pu# +8T(02#CHPsAao)`@_0VQ.nY#)rp8.CBTuchp6Y$M7Gs,.ep/sIMHf-\RHrq%NV9Cs +(V=O"`mA_D]WlZLc/js^T8/q5qsR-t.8>i+nb$g2LWEmIg?hc.Ei])=e## +endstream endobj 98 0 obj [/Indexed/DeviceRGB 255 99 0 R] endobj 99 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 91 0 obj <> endobj 100 0 obj [/View/Design] endobj 101 0 obj <>>> endobj 90 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <>stream +HlV \e~ckPD0u%! A@Q!3ICm4c-w;ʤێͭ<3CD~fkۡvc3}A(W1K41mzmy}KAE93ju'sWnӀn 򊟏~CIV'T64eOx~\ Jj˛-!DWk+Ƕϙǁ=x>Z%ɬldWʒh6[#)S%Y WG1qNڠj:u/`(8Bx$5Z>(8$#+<"2*:&6;G I}00yPJjZz#s𐬡Æܒ{kވF^4xWrҲ;'LtSN++*gTU̜5nNy4.ljgѽ[re._AYG}ObßSO?M=ח_yugk{7n߱s{{>8ᑏ'='O>~i5ݬ` HW}x>&EEQ*&D<"|RO:#?&ɻݖVJX)Ô|e͚dl:[O[/[bh+MU&,|`V6jb(E4S˯RW:ޭ_%\Qz+_KMZLiA-sU;[׾(}I\Ej}wW#tԕS.[Lg;Z;M36oԾ +h_>}j{j{KڷKg +U1"NXQB#^f6@+s,Sh n2Vy|8V]4^|c^ëӱvJA|CfcG؊*|qST|15ZF5sQyh@#"pq/xKX?-c`v3t$N:hǛx u=XwBͱzK/!lC9@@"B яJNh"VO[/aeRVtR1}36IaLI1&%ZCKfO-ϰR8=*;SiBVB/YzDe.6<.>8e\B+ˌi(`/T5 +1B ]b`~ + +1B + +ccuA.QPI᪤Påڝ`5 EV Y (Ph&Q!C"©.ܕA33hf̠43 A37LKOmI382,\-ekT AKb4*) ]kcc +~Fc@#]{.56}'_^|UNU鳞>鳞> O\pD& +1r1(9Qb_DSB +1oE7"H%#Ap7S%z^;x4D3fᠭY0 +{X&M22oܵڜ1jr'P9gΏT qȜ=wia78Ú=iUW{̌ZMPjkk) +C)LP1133M[g*.mbnLƿĪ!1u]6vcb!;wތ0BCpU.λ{~w) +9=&]1Acڕfb5PN{kHynh;Q8V{-ǺL$z?!cxxvsOr2LGΑSo#}:ՃawT }R;&S|KHMfmIm=,i%p\@RQI٣r J2RRSBϒvү7Po-q >$Qҋʩ3/8J:)Taonle|ѡ^f*!'SV㝄sg&+K:=?~c>KWMuoQ +#x?{}slŬtjmkrvq]X*ktµ\Ilkgn"s<o Nݵ8ڣ=ڎ8Dfn0y3<'yw|#!1E }2#N#KK̗] %H]5O =οqj0A{y +be.]ҬPs- +m\r.An<;Ds;|x5B/p"b :6,@j"T&1?WKnF]I`V` )i^`WK,Vl)|c'gF`o +endstream endobj 95 0 obj <> endobj 96 0 obj <> endobj 94 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.0 +%%For: (DESKTOP-LIN) () +%%Title: (ESP32-S3 Pinout.pdf) +%%CreationDate: 4/6/2023 10:05 AM +%%Canvassize: 16383 +%%BoundingBox: 16 365 461 563 +%%HiResBoundingBox: 16.6958 365.7705 460.667 562.2588 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 682 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%CMYKProcessColor: 1 1 1 1 ([套版色]) +%AI3_Cropmarks: 8.3335 351.0942 501 571 +%AI3_TemplateBox: 420.5 297.5 420.5 297.5 +%AI3_TileBox: -166.2031 163.4473 675.6572 758.4668 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 1 +%AI9_ColorModel: 2 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -52.75 577.25 4 1363 914 18 1 0 2002 117 0 0 0 0 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:73 85 +%AI7_GridSettings: 2.83465 1 2.83465 1 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 106 0 obj <>stream +%%BoundingBox: 16 365 461 563 +%%HiResBoundingBox: 16.6958 365.7705 460.667 562.2588 +%AI7_Thumbnail: 128 60 8 +%%BeginData: 10737 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45527D7D277D527D7D527D527D7D7D52527DA87D277DFF7D52A852A8 +%7D4B7D7D52FF52A8FFA827FF527DFFFD047D5252A85252A87D52A852FF52 +%FF767D7DCAA8FFFFA8FFFFCF7DA8FD38FF27A87D277D7D7DA852FF524B52 +%52FF7D52527D52A8FF527DA87D7D7D277DA852FF7D7DFF7D52A8A852FF52 +%52277D525252A8A8277DFF52522752A876527D7652527D52527D7D52A8FD +%38FF52AFA8527D527D7D52A87D7D527D7D52A827FF52A8FF7D52A87D5252 +%7DFFA852A827A8A8A8277D7D52FF7D52527D7D52A8527D7D7D527D7D7D52 +%FF52FF7D767D7D527D525276A1A8FD38FFA8FFA8FFA8A87DA87DA8A8FFA8 +%FF7DFFFFA8A8A87DFFFD05A8FFA8FFA8A8A87DA8FFFD05A8FFA8A9A8FFA8 +%FFA8A87DFFA8A8A8FFFFA8A8A8FFFFA1A8A8A87DFF7DA8A8A8FDBAFFCFFD +%7DFFBCC2C9C3C2BBCA7DFFA8A8FD75FF8CBBA0C999B5A77D525252FD75FF +%A1A1A7A1A77DFD7AFF0028527D27277D76527D52FD75FFA27DA87EA87DFF +%A8FFA8CAFD40FF52272751274B2751274B2751274B27FD26FF5A85A8A97E +%5AA876527C527D5252527C52525176527652527CFD32FF27F827F8F8F827 +%F8F8F827F827F8F87DFD25FF8584FFA9A984FFA7A87DA8A8A87D7D7DA87D +%FF7DA77DA87D7DFD32FF27270527F827F852F827F8272727F8A8FD25FFA7 +%AEA7ADA7A7A8CAA8CFA8CAA1FD04A8FFA8CAA8FD36FF27F827F82727F827 +%2727F8F827F8F8A1FD25FFADA7AD82AD83AE52765252527D2752527D5252 +%4B7CFD36FF272705F8F827F8F8F827F827F827F8FD26FFA7CFA7CFA7CECA +%FFFFFFA8FFA8FFCFFFA8FD2CFFCFCACAA8CFCACFFFFFFF7D527D5227FD0E +%F8527D527DFD04FFCAFFA8FFCAFFFFFFA9FFA8FFA9FFA9FFA9FFA8FFA9FF +%A9FD07FFC7C9CFC9CEA4CF4C52527C527D52A8FD2EFFB5B0BBC9BBB093CA +%A8A8267627F8757D767D527D7C7D527D767D527D7C27F85226A87DA8C2C9 +%C9CAC9C9C2FF5A6184AFA98536AFA985A9AFA9AF84FD08FFA6CEA7C9A7C9 +%CFFFA8FFFFFFA8FD30FFC299C2A0C299C2A8FFA826F827F8A0A7AFA8A8A8 +%A9A8A8A8A9A8A8A8C926F82027A8A8A8C9A1CAA7CAA7C9A8857EA984A984 +%84A8FF84AFA8AFA9A9A9FD07FFC3C3CACACAA0FF7C76767D7DA7FD047D76 +%A8FD2AFFA6CCC8CFA6CCA6A8A8A8275227277BFD0CA8A9A727275220A8A2 +%A8A0C9CACAC9C9C3FF5A8584A984855AAFA9AFA9AFA9AF85FD08FFA0C9A1 +%CAA7C3A8A87DA8FD047D7CA87D7C7DFFFFFFCAFD17FFA8FFFFFFA8FFFFFF +%A9FFFFFFA9FFFFC9A5CEA7C9A5C9A8A87D272727F8A0A7FD0CA8A7202727 +%277DA8A8C9A1CAA7CAA1C9A8845AA9A8A97E84A8AF84AFA9AFA8A9AFFD07 +%FFA8A8A9A2A9A2FFA8CFFD05A8FFA8CAFD05A8FD0FFF7E7E7EA27EA278FF +%82AD838382ADA7AF60AF858585AF61AFC3C9C9CAC9C9C3FFA8A8FD04279F +%FD0CA8A9A74BF82726A8A8A8C3C9C9CAC3C9C3FF82AEA78382AE83AEFD08 +%FF7E7E7EA277A27877A87EFD04A27D5252527652527C52527C277D527DFD +%0FFFA2777E7EA2777EA8A783AD82A783AEA88584A984A98485A8C9A1CAC9 +%CAA0C9A1A87D272627F8A0A7FD0CA8A720F826277DA8A8C3A0CAA7CAA0C9 +%A88283AE83A783A7A7FFA8FFFFFFA8FFFFA2777E7E7E777ECAA7CAA7CAA7 +%FD1FFFA2A27EA97EA27EFF83AD83AD83A7A7FF85858485858560FFC9C9C9 +%CAC9C9A1FFA8A82027F8277BFD0CA8AFA727F82720FFA8FFC9C9C9CAC9C9 +%C3FF82AD83AD83AD82CFAFAFA9FFAFFFA9FFA2A27EA87EA27E9EC8C8C9A6 +%C6A75227524BFD04527652524BA8FD11FFA2777EA2A2777EA8A7A7AE82A7 +%A7AD8485A8A984AF8461A8C9A1CFA7CAA0C37DA87D272627F87B7DFD0CA8 +%A726F827277DA8A1C3A0CAA7CAA0C3A882A7AE82A7A782A7AF84AFA8AFA9 +%85A8A25378A2A27777CFCACFA7CFC9FFA8CFA8FFA8FFFFFFA8FFA8A8CAFD +%11FFA8A8A2A9A2A8A2FFA7ADA7AEA7AEA7FF85AF85AF85AF85FFC9CAC9CF +%CACAC9FFA8FFF827F8279FCAFD0BA8AFA727F827F8FFA8FFCACAC9CACACA +%C9FFFFFFAEFFCFFFAEFFA88383AEA8AE83FFFFFFCBFFFFFFCB366084AF36 +%60A87D7D7D7C7D517C52767652A1FD12FFA277787EA27778A8A7A7A782A7 +%A7ADA8A9858560A98485A8C3A0CAA7CAA0C37DA87D27274BF89FA7FD0CA8 +%A726274B4B77A27DC3A1CAA7CFA1C3A8FFFFFFA9FFFFFFCB83118382AE82 +%33A8FD07FF8560AFA88560FFA8A87DA8A1A17DA87DA87DA8FD12FFA2A27E +%A87EA2A2FF83ADA7AD83ADA7FF8485858584A985FFC9C9C9CAC9C9C9FFA8 +%FFF826F8277BFD0CA8A9A14BF826F8FFA8FFC9C9C9CAC9CAC9FD09FF8382 +%82A7828382FD08FF848584AF8485A87DA8A87DA1FD047DA8FD14FF7E4D78 +%7E7E4D77A88283A7828383AD848584A95AA9846184C2A0CAA7C99AC37D7D +%7D4B2727F8A0A7FD0CA8A720274B2752A17DC2A0CAA7CAA0C2A8FFA8FFA8 +%FFA8FFCB82118283835733A8FD07FFAF85FFAFAF85FF7DA87DA17DA87DA8 +%7DFD15FFA8A97EA97EA97EFFA7AEA7AEA7ADA7FF85AF85AF85AF85FFC9CA +%C9CAC9C9C9FFA8FFF826F8277BFD0CA8A9A74BF827F8FFA8FFC9CAC9CAC9 +%CAC9FFAFFFAFFFAFFFAFFFA78283AD838382FD08FFA1CAA7CAA7CAA8FFA8 +%FFFFFFA8A8A8FFA8A8A8FD12FF855AA984A9845BA88383AE838383ADA885 +%84A95AA98485A8C3A1CAA7CAA0C37D7D52274B52F8A0A7FD0CA8A7265251 +%277DA87DC3A0CAC9CAA1C3A860848584A98460A883118382A75839A8FD07 +%FFC2C9CAC9CA9ACA52A15252527D4B52527D52A1FD12FFA98584A985A97E +%FFA7ADA7AEA7ADA7FF85A984A985A984FFC9CAC9CAC9C9C9FFFFFFF827F8 +%279FCAFD0BA8A9A74BF82720A8A8FFC9C9C9CAC9C9C9FF84AF84AF84AF84 +%FFA78282AD83835EFD08FFA1CAA1C4A1C3CAFD1EFF855AA97EA97E5AA8A7 +%83A7828383A7843D60A984858437A8C9A1CAA1CAA0C3A17D7727274BF8A0 +%A7FD0CA8A726274B277D7D7DC3A0CAA1CAA1C3A86084AF60AF8460A88311 +%8382A75833A7FD07FFB7C3CAA1CA94C4527D527D527D52527DA1527C52A1 +%5276527DFD0CFF8585A8AF85A97EFFA7AEA7AEA7ADA7FF85A985AF85A960 +%FFC9CAC9CACACAC9FFA8CAF84B272027527C7C757C757C757C767C757C27 +%27F82726A8A8FFC9CAC9CACACAC9FF84AFA8AFA8AF84FFA782A7ADA7A75E +%FD08FF9BCAA1CAA1C4FD06A87DA8A1A8A7A77DA87DA87DA77DFD0CFF855A +%857EA97E5AA8A783A7828383A7A86184855A858461A8C9A1CAA1C9A0C3A8 +%A87D272627FD11F84B27277DA27DC9A1CAA1CAA1C3A860848484AF8460A8 +%FD0FFFACA5CECFCEA5CFA27D7DFD06A8FD15FF8485FD04A97EFFA7AEA7AE +%A7AEA8AF5AAFA9A984AF61FFC3CAC9CAC9C9C9A8A8FF2627F827F8F8F820 +%F8F8F820F8F8F820FD04F8274B20A8A8FFA1FD05CAC9FF84AFA8AFA8AF84 +%FD10FFA5A6A7CFA6A5A77D277D52765252527DA8FD14FF855A8584855A85 +%A88382A7828382A7A8615A855A855A61A8C9A1C9A1C9A0C9A8A87D272627 +%FD11F8272627A1A87DC3A0C9A1C9A0C9A89B94C4A1C39BBDA2FD0FFFAFA9 +%AFA8AF84FFA8FFFFFFCAFD19FF848585A9A9A95AFF83AEA7AEA7ADA7AF5A +%AFA9A985855AFFC3CAC9CAC9C9C3A8A8A827512727274BFD0B274B272727 +%5126A8A8A8A0FD04CAC9C9FF9ABDC3CAC4CA94CAFD0FFF5A8584A9846184 +%7627524B7D52FD18FFA877A27E7E77A2A8A782A782A782ADA86184858485 +%5A85A9C9A0CAA7C9A0C9FFA8A827F827F87D764B2751274B27514B51274B +%7D52F8272026A8A8A8C9A1CAA1C9A1C9CA9B9BC4A1C39BBDCAFD0FFFAE84 +%AE84AE84FD1FFFA27877A9A27877FFA7AEA7A7A7AEA7AF36A9A985858536 +%AFC3C9CACFCAC9A1A87DA8275127F876FFA8CFA8CFA8CFA8CFA8CFA8FF52 +%F8527627A17DA8C3C9CACFCACAA0FF94BDA2CACACA94CAFD0FFF113982A7 +%5711A77D527D527D4B7D527D76FD14FFA97EA27EA87EA2A8AD83A783AD83 +%AEA8C9A7CAA7CAA7C9A8CAA1CAA7CAA1CAA8A8A820F8F8F876FD0DFF52F8 +%26F826A8A8A8CAA1CAA7CAA7CAA8C3A1C4A1C4A1C3A8FD0FFF8383AEA7AE +%82FF7D7DA1A8A8A87D7C7DA7FD14FF7E7877A97E7877FF82ADA78283AD83 +%CFC0C9C9CEC9C9C0CFC3C9CACFCAC3A0A87DA8275227F852FD0DFF52F852 +%7C277D7DA8C2C9FD04CAA0FF94BDA2CAC4C48ECAFD11FF7D7DA8FFCA7652 +%7D7C7652767D52A8FD15FFA8A9A8CBA8A9A8CFA8AEA8CFA8CFCAFD04C8C9 +%C8C8CACAA1C9A1C9A1C9FFFFA826F8F8F84B767D7CA17CA17CA17C7D7C7D +%7D27F8F8F827A8FFA8CAA1C9A1CAA1CACAC9A0C9A0C9A1C3CAFD10FFCBA8 +%A8FFFFFFFD04A87DA87DCAA8FD24FFCFC0C7C8C9C8C6C0CFA0CAC9CAC9C9 +%C2A87D7D277C27F82752275251524B7651524B524B52F8F8265226A27DA8 +%A0C3C9CAC9C9C2CFC0C6C8CEC8C7C0CFFD35FFA8FFA8CBA8FFFFCFA8FFA8 +%CFA8FFA8A7A7CAA7A7A7C9A8CAA1C9A1C9A1CAA8FFA827F8F8F852524B27 +%522727A876264B2752274BF8F8F820A8FFA8C9A1CAA1C9A1CACAC8A0C9C9 +%C9A0C8CAFD34FF7E7877A8787877FF82ADA78282ADA7AF14858585608514 +%AFC2C9CACACAC9C3A87DA827512727F82752A8767D7CA87D7D7CA12727F8 +%F8277627A87DA8A0C9FD04CAC3CFC1C7C8CFC9C7C0CFFD34FFA877A2A2A2 +%7DA2A8A783AD83A783AEA98584A984858485A9C9A1CAC9CAA1CAA8A8A827 +%F827F827F8277D525252275227527CF8F827F8F8F826A8FFFFC9A1CAC9CA +%A1CACAC9A0C9C9C9A0C8CAFD34FF7E7877A9A27E77FF83AD83A782ADA7AF +%36FD058536AFC3C9C9CAC9C9A0A87D7D26522752C8A027524B5252522752 +%515227A7C84B277627A87DA8C2C9CACACAC9A0FF9AC3CACAC3C39ACAFD34 +%FFA8777E7EA87DA2A8A7A7A783AD83ADA88584A984A98485A8C9A7C9A1CA +%A1C9A8FFA82720275252A17DF852515251277D52F8767D5252F82027A8A8 +%A8C9A1CAA1CAA7C9A8C3A1CAA7CAA1C3A8FD34FFA27E78A97E7E77FF82AD +%A7AD82ADA7AF5AFD058536FFC3C9C9CAC9C9A1FFA2A8274B277D27A77D20 +%7DA87C7D4BFF7DF8527D277DF85127A87DA8C3C9CACAC9C9C3FD3DFFA877 +%A2A2A277A2A8ADA7AEA7ADA7AEA88584AF84A98461A8C9C9CAA7CAA1C9A8 +%A8A827202752C8A752F85251764B275227F852A7CD512727277DA8A8C9C9 +%CAA7CAA1C9FD3DFF7E7E7EA27EA27EFF82AD83A782ADA7AF5A8585856085 +%5AAFC3C9C9C9C3C9C3FF7DA8262727275127F8F84B7D277CF84BF8F8274B +%5127F827F8A8A8A8C3FD05C9C3FD3DFFA2777E7EA8777EA8A783AEA7A783 +%ADA86184AF84858461A8C9A1CAA7CAA0C97DA87D272727FD05F827FD0BF8 +%2727277DA8A8C3A1CAA7CAA0C9FD3DFFA2A27EA97EA27EFF83ADA7AD83AD +%A7FF85A9858585A985FFC9CAC9CAC9C9C9FFA8CA202727275252527D5252 +%27F82752527D7D524B27F827F8FFA8FFC9C9C9CAC9CAC9FFA7CECFCFA7CF +%A6FFA8AEA7AEA7AEA7FFA8A9A9AFA9A984FD25FFA2537EA2A25378A8A7A7 +%AE83A783AE848584A95A858485A8C3A1CAC9CAA0C37DA27D274B4BF8FD06 +%7D52F852FD047D767DF82751277DA87DC2A1CAC9CAA1C3A8A5A6CFA7CEA6 +%ABA7A883AD838283A7A8845AA984A97E5AFD25FFA2A27EA8A2A27EFFA7AD +%83ADA7ADA7FFAFFFA9FFA9FFA9FFC9C9C9CAC9C9C9FFA8FFF827F8F8527E +%7D7D7DA852F827A8FD057D27F827F8FFA8FFC9C9C9CAC9C9C9FFA7CEA7CE +%ADCEA6FFA8A783AD83AD83FFA98584A985A97EFD25FFA24D777EA25377A8 +%8283A7828383A7A8FD07FFCFC9A7CAA7CAA1C37D7D7D274B27F87CFD057D +%52F827FD067DF8274B27767D7DC3A1CAA7CAC3C3A8A5A5CFA7ADA6A4A7A7 +%83A783A783A7A7855A8584A97E5AFD25FFCBFFA8FFA9FFA8FFAECFA8FFAE +%CFAEFD09FFC3C2C2C9C2C2C3FFFFFFF827F82052A87D7D7DA852F827A87D +%7D7DA87D27F827F8FFFFFF7DA17DA17DA17DFFCFCFCFFFCFCFCFFFCFCFAE +%FFCFCFAEFFAFFFA9FFA9FFA9FD3DFFB58CB5A0B08CB5A7A87D274B27F876 +%FD057D52F827FD067DF8274B277DA8A128055252520028FD55FFC3C9C3C9 +%C3C9C3FFFFFF4B52275176FD057D524B52FD067D52527627FFFFFF7D7D7D +%A87D7D7DFD64FFA8FFA8FFA8FFFFFFA8FFA8FFA8FD26FFFF +%%EndData + +endstream endobj 107 0 obj <>stream +HtW ?v0Xd,p2 +I.F!7Bx,0,ŏjY@{,w~/tFokLd +|qc܈`s&f a![yb&v[ފ"a A"}Zu* +Y 9f qy1zjpӉ MWDFP9Dކ>Fkm7$ 6yv#!UmB,/$FȘ9eБm0iGFp1#AZHVQ܎G$WmҾjj:]9kFXCXzFDl{!˞R`|"8= ?E*CWl +tFr~!U!Mc4*SxVW=+݈5x晌+rE$x'[Mż;:nnZ\D +;5G|&EB~a9pнem;1'raߏ].N x[ *MjtAۇ%q+-Ig.Elz~tI#J,];w acB`n"{]¨V0+Rw^ߴhvFR;Fi[#F/ӃNC&Od ߏqդHEK8u #,UWGPUel k )k_70?+eA@OUmF^v!Fi|j`G_B :fvM= -HaKrIۆcآb6?aL7@ VĝRL+Z +4\SL |]{;h^@[]ոS)c2ch9޸pC3&j XW4,؎/HOy Ws-F`dVz4ǍF?[?9FGa#Vo@%a0|Ğ]'K 'rx#ױQ!B9E+1b+ R!7Y«4 ֱ дaKЧ Ԑ7/TiZdO]IE&ӗCuxťϰMByv((rP0u6>hb0+XDIG_kHL247UN{uQ)\e&<#w1?v3S=,`f}Hv7b~b2m.ݤrJF$Jxt vGj@ϽJ>3la9c^2//Ox8GڎIQ{{*|/ǿGR_=H< {[3^|'g[yՖb>vg:8HcD-~:C,r|6uX6@B챐NƲ +~Bc0vZj5ew2wjXLd8H#_#BF8=LpmY f߭h@𡐚-<7 g]vTʡ?$ 18qc'ȔR{@bzBrDY^׆Av>S'2h}{={G"I:?5mRL-w!eHEG:*VޫwߖCl"-eT? 9ujEKd~&P/"r\ E*>4vlka%=_@bV3 +rIWS!bHEjLJR,L$]u +Z)/sʮ`u]GH'2 eci%XLJfnPtFTzBRG(Z-!R8fl0oŇ6!1Gc;#񻓯@܂2gj~׆zs3@Ujmo@ْHL5`LC:y<̔A{1nDժ:pK+9 sВUxkN{H; V e@ ΁-˕F}׵[9#Tz\dg`V;LdUԊ$׍eR"bXdW}yZ[Sӑ6Cƭ!k jNpACO)G`As)M@[y(|ls[VGAgXƸ_BzLa}kAh#lyUw{YZ?Fx@Xa؎hNԴ]H>FOc  +Sar{}ټ/ AyBH~xGd6-';ACt,s+8cx Զre@jʄgUuBfm ʻGzd+nabbw{g/ʅYસj2eR/@y3WjPc+"v{N|*Mj.&S6`VjybbXWݣbFIUҭIlK~O Ri5~]~lNY^cr3nI&ܛG=QG ը'il-3gCR~_iک!g͖+rt  x~̟&yclㇼ @T;Zz !:, F[>E2/o>Epk J8C;G2pzY'JPk. t +6,CWZn|tYP iE +0{ \=7whW,f^~qcg $y j WO|0[+0Pκ}PjVVH{-Qׇ9 z P`/`i[,7NO@k,j[=^/qoWx}r,-Y*pfyqtW4%F  1π +=gBȄyv*> +U#~!1YdXAwux kid%YIjqv11(t%x{4{~M@5g4gI9Y1,(+Н珯Fs+Mv9)D0+4 e!i<l}^s\z;&߆@P=`s.5tI +$2W){I=m1  U- [7JUҦQd{g _i8ϣQK)ˠ=Yf,;'E-踅[4&H#j*&rw~4fJ!KLPndDD5]@0Sہkd5}·Dm8T_ !߳x'w 0z?&(kQq GpkcY('<3nE/ +"-d$sfvctVDL`],QdsfjבȁmJ΁79֗)AeGw8@HCH.Gc!C(TkFsX**hБ];0,c%D$Z =~C"3x̮kqDm v}wAbo`j@ԖRA46C!$,X 4IoCA2"h*Cc=*QYsmMǜ*;jjq/dExI\7o Kr-n00iٙ6k :> +04 L .l7l€f&8SjvaBdwpxhAsZ&}Qg HIW,LWv|:C3LWꤷOaƖz3J"hD3?Xc~Cl<' Z5}lAf7{").55GB}Gy/I߫:|T:][0:68UTKSv_naaitdJm!J"9=v_/}^zz< _t { +N^3p[2J:ÀͭZN {;t?*Pf\O/9:8OkħO>(dkG3xA³7)0{PMkY{z-_߿/>~Ul_o~ots^N> (9>/yu'=7cE!}CC&ث$!s<($6KBWfYq1 y:3ZЭ[Ih'N4XId3M籯efkl JĎ+ L,08!fl{4HcXjzĸecJ^nAi~ V*&`v=Ę:̯uIcDHOct:ڄ;^. i=O6]2Tu3`8[ڭNcLd:+Z tywx*9mejGĔ)mdbD-n "yXpߴYÔkhPЖ%؝"RND^ºlY[U$R<E!uszT"<%C +W:zZ$%?CdIh!'f?*\'-hCUh{ز`@Q#Ei&0-` O_|sP|/"GK7e:4M5[C:+/Cxd'2haj n䮇1 +@~lN7Dе'޵4<' &n(VF@\jZMM~ t i0pNå,TۅDxo|rd=ٓMꚞxNߥZ3nE:(ğy[ǶSCka3H1˹H2iz?eR&_Tq+2k;TnP&T=܍\%Iמ2 lk,{_sފ?pGJM ^&engeb~2ŷD"m?qGY>ѝfӄweǗkg=si2 +ʑ] v]7o l3>/ú~d6lA<PVV(`{m, f1! +}G!z;@u)i9 +ig(Vk_]Uvk20c[3d,>;liÏpDZk5E05ts x7ǟ^+?k6 "){^/yzu/z"۟nGwPWF:\ٮ򎲵·9@1"#S䕷ۍvY)ε3*T(tϳW(>J q> GM9?Iӏt%9Px\Sb DLҶ:}C°nL8MJi*hՏh7 +d\jB6 -"JV81nk%,)qU\pO;Vp*نen+)?V\ r-:շC6d[yCW TpC2pU!>&>r]>%u[!A !C358v$>Qvc{tamyUT[jiǀ7j sF`N"GV @ٹa͔*1xPPiwZMa՛(yj=f׬A^81Msma Ƙ +dyi9w~# r*:}@D,kn&|J a?$4^H=X0!gDe]ԍ ɦc l3 8wVdIiz RoWQKT:nPW6(e]H;9jvonenDvL ϯ~~o7Ao ~ ÿ~,H_*8h#WAA Gwr!{oq}  ҴpBuGު6/1i\xŷ,8jS4[ :؈IjW\INjX"P8Xni@i)Auoխt?5-L*w˘ix@k vK0 A1!`p `~ kb^o]Gbl&&  &{T"R4Q-|DF1/^專Z*Œn¬ V1 t7&כ ExnVu+p97eU6ExB"m?h6VU!Ilb%epeLẪ}= `= -h0̦I'=lm4 `~1uW"q76qMGO)\ Qi߀" D} }mt!-J >D17` +8x5l{׏}nf` >SG/b3ۻ44!D1y/M;Ng$z~{] \ux+ٕU + xN#7fք7!{ 4u@xv6m\UXu ,JD|g$˨R`ȭ{=g=Q/A3|u}uzm:>;U 6c]۳|#p=fH[ƱRuVciII #]7 rx6= uP +o"ݕHϪ?%aZgzR8:2p ~&HڊT)SDh?K5Hlx4j:xGm;ȤcY1%"čKGJFsv$B.@ 2>"Rݏx"M1aw7Q}OD\"aGxtw+ՠ$:ԃ +bE3YI!S8s;X,*xi>B\ *bm'^JsT'. sfnk2[ke -iozeZQhe20 T2 Ltij%f^Vb*,y nvǶԳ5R g;.Q*{wTу<^#ISL܉pu(!!rgw,KGqbZei.[ tpZZ9:f+Gb&7HAhX$0S11H;0#3o~X<'bnTV*WJ)ЅX[YxchMDRLiy V wQ`9#2[F{0*u2Ɗ7>quY8ݩD3Ƥ[&O `HYNy*6"+^5]+g ,~_{_J~ӷ?oǿ ol'Qe Dяy!Y :l;Ⱥw|?^ΐy#3җrsR6d;2i?H6DgW~$esyVuneR_.n'3q<+HBWQi[XU_ck[r,0/]7O=IifN@n.{Zʤ fs̍ػ#s w{\淛51T;d AV@ :4@W!4_Ǭ^FU}M݈>{s3 NnWDDxD]T(HM>+jaԡ^6*oWr |C0@r{(z{;=0 AWos 6*DzXp<&I]F͈!\uʆ9W柯μԹ.W.І\e<·nαܞ)`Abf)fKAlDV)qf…1@f,y Ѻ ~zֶ:P=v LemND%wpq]eb.N智7`D7*\h" +G#Wa"A)NϮlۖlw&G!E}}xO:sVc*?x_HRڥ&xT5˸TB?^kK%,$JM.,UUƣ6שȨئ@~`O,ԘvHŮ +Rv'"=] [5ҮR.PZ)Fk 9<4kR4+Fȡ\#QnA/|hVk}nC#($FdZ.nkEa"Fx>hM4gK#s4@Vn ʮ =A;3ˮXS#h_]#ITv}5"A۷C$Iy"!]$lHP.HPGSD<[@. `-!HG$!NEzK$ K`\"aH@آ>DvnDoH Zc"Z"fWD [^L  Z-="A˚.!#gS$AښH.p8KpK#^ %/Ht[$_+4rxs7:Hkb:%(Op.l%t>Z"AG|  HH#BK$g?sgMs+ 2pJ|vw~7s-:%ܾtx>9羈[z +{cQ ԝUs8< +`<<)r2 xu{_QSxO&C (_l@צF&Q^T3 ֬\e A1*?C#Eq56_]闺aL) ]&7{aYgR8>ͣZbˏR>-sO7:в[;G 2ꞣƚ':##j-2fLcg!I6J밧y95 |{vtčD%2N@C!{ @g߯Q^%Y*p+^DqMs5?uH{|23R" `K?|a\ͯw,3~d!Ocq%|[: UQW8~`z<_?!5if"åH}~6U@v3S uU|U:{c#W2-\AuݏC, d_blb&Э4Fɨwɕk Dex@" wlN"[չ,|& Ħ?UFU l n~zᆔEao<@01䋋顦{s/ cQWe޺I;Uf~ )ZCؠ$pKt&.Jj%'%>BF;}pQ='pP|yf;\fc@l0-[;EnedHz^ɉW^D *ҪfHԃbp-*6إݬqBʐ^džTUUzBFU 汖 bf7򦑱?u5{\H؋!H,df{Jkbr},,yjDKQr2Oepl(bФs|^}R"1e>a)N7R[s}b6?=#\A+#`h% +V&% < c|o=e_$V'bXHs_bRA µ֤-0fG |= FpKГAqŁ e =)%蜧bZtjy~ +ul\-wBvcle5uNvOL8II1KçmYEr`dvn9I -ڑ4`<\][ٱOR<Tvs\ok>P}NcH'@DjP!+.$ $9D" +ѿ̶պj}-MCi3y`GoUaU}oaVZ+n +8CJ=ڪ`XԪ3Ya!Ӟ̒,{PZI;HA%vpۑSK}Eӽ/^U4cRZܲJ΄^&.)@jR=q35Uzxzr,ZTgt6ѽ^K;mHB\UtJyw/"cQANO9b]\ƞE.i̓^9/":yHfHT -,GTs;w-7A|71b8z>E<70K<@+" rF_U##]Pj}+;-%Z9ScU|FqBvFM5Vy͝T1Il+OqT#ؠ8vs$U+%y9 1l^ +>Zy"l7@d$53yD?$%*UBYs_׶U)6b݃gM~C6;1~z/ .U7͘5kKQ'Dc|jBDג4C7twiA"h \Ѵ$A]z=@$F̄F ()\IY-Y 򝯀b+vw@.q`ȨHl* D"vB2 AF4D '2[ɐ;KC9%^ +yطCW@1Oc.MCBPL\~!"̷clyLm2S|KN!=4<]Ѐ r K8+?.">4)6X6_h[,~n{Fl^ȦRZDSZd=J{)OFRw}`yhbpDb+u=r+)ZR\eŒHV^cXK)EQ0 O[Y CȅT.z-້`HmYt<_D#R6 {Rդ`m+̩1 7yJĆ+hUW,w/P]#͟ۮk`< o1`{Ahѐ}GӴ.w}+:89IFb4kTϧZŦ=r,nы{C]ob;/MsѸhzgl#ͦjV6k,5mHW.!Ӟ-~{{[ʽܱ|m?l5}S6'9k^3$LTswV7P Ow}jz({w>|dQU\A{<"pP\Aˍk-q~P[Hvjj8}|= &.I㨢i8lG0Ԓ+U7P`88]w916$. c"?I/&1AP̸UZѪT[ODzM3ݬHһ\zPw2iQD) +r ]2^$i_[ϵ@У"I|oBN*/ODzrR{C<A[l]*Ι G-3m%^T6[ޟFtWCֶN|ȖˢlPfDj㘽ՊeTM`n ,L!~j~Fr2j=7j/zDHW(E-oYT8F eCZ-q)'}jBqG+#^٭)U?ɽlU.!CJEi̶@$uxcب"S^W&ih\ǭ}!4~R&"+shאpό++t /=JAvmmz~n Q|گ{z>*v!yKI:V(1oZOW:Ӂޏl}YYl" yFoF\J7gs!Z!'7ҍ2 ^F G_Xekojitc5Th!A`P6&f8lC +Rt%eӉkv6.nyQ[:%:?G܋Řt.Sw.eBn5_L`(prI>fa* +![)RK3[ULyA8ә|*v[mDK 5 +WR,$Io<me;(.hٳ&[b +Z"y&C%scT&ل+@b=Q|%|!I,s53=م&0a2*KS?~?%^,%Q,$@KnggODa꟞,i" ld,i,}͒(z14WYdI3l4aP?$Y$ϢH?H.EvFҹ#4o5݉ңz8/ő尔ij_+%5:i +ÑM'GHHWXɭ;_(惒AbQҔ9@.$J 㰤AKۨAX2aIWaɭyOzR͒Hky'Ys@ H-'PKvB| #~kaǟvQ#*LWثt-;^Y]s݌\-ڱֺ I|K@Uc `Qs`TΩR@@{WVNVaνDZ31 Dŕ]Kf q6B_({(1uьO 'v3{80b~5nP9AµVlUeU{p"G9.OeW{Y~X~&v-lI^͌d$>E3^-qhZ%vxA+8 ~;X{VIhN-Lhn<6NHpZYgHf}L6s1Gҷ`向wh#֫UK4o4fVޓ`x^rl?>; X&Xn4r*J7x+ /uk1C':_ނ*w+F'ZN]_{|=a_Oq+Ko&nZx2WU.|B_Qn|=I+|M_v!kKܤjU5KDT}Wk~WLlJ_z^[LzE> Hzײ^|+Yb^m)^-#R i>5[\[08Ę9[-WVjRfޕ:N&+U*GU:/xfYJEl\ݵg i{sKWH?c?u>xUKj fVv }-a#vum7eX(!qyYӮDAz-0`yomJZ8ydi^⠨kÄN,r?0*1QTM!&:(_9oŷRĝOK>Jf#*< ea{/ő{): Y7,{ѧ~{lwE#*_?)[VWY tM|#~^P>stream +HW\9 *ݠ R(=a vr/6Y;Çn[]=` Qu(ucKo}Ϳj+߾~qp-N:qYȸ7YtEA=Z_kߊ8SQ۠D +` +EpCHDRu ᰼)o5s; ׽|7 +6uYq[* ݒ9%cYô2.)tTXa茔V|dɣW>dV4 +V_-cC3ŞۥFm }ӝ5$^fQfZNHc22 Ink&m9ifvNŵs1@*aI YuJf2HbxZ.Uˉ6v*<], K: UvךJKudӝ; +08pD: DIT]ZYN $J^,"3~O76~?)5te2/4aR 5Ico~ʎ~VWg~؎b5"'E$}O!6S𡎤gˤWv^Hb(MqˇzQ_BtP<<P~ ͹>/O>ٜ~WoǼ@MSW6%h}Noi:R^Wg'Ө#}}?'*M`gNc]b z Ho(hCSnF bbӈS| wF7GC'x ߊ3^/bN'/Q֚M(B9k; +3eMf~-Ƈlhnإx4xSi%OB+8h+}3 Vy/K1^Vq/d4/o]>T@2M;+Q_<$\pF,ki͑F+KFhXH9w6bGPfGtj*[Ѥll^&4u>̑NoU=7(C3+N,E)B{823[ag]/4<DP[gbCp) ~u˭zl|)/5VaBPߕ5X&aA ŨnwͤqD9'ˇu2ŠְDn(j.I^oعKradOSHI~B}8L{< FxG"s#8cc͂acm&)7;LM0ϸз"GFIHv9{dzi!rmجQ6"2V6*XM;m(vCLWDpQ6m,C:(hQ̛kG;ZVK(DV]PsQ> +&:ZvTd iB.Wg9 g'1=,ŋWNe+iR~p@,_bW. EZqRu7-*cDZvd7x5sPw8֡+WHa},o@md2Тcl7pfJ=/H-KI sM@jR*zvU芈ȣoP䔢OdUyѵ*9xr,yx_Lo$_Am6Dؿ}2֊(mҹ'Ӣy˫Ӣ5H1i'z Տ& +&ŢԑL?. ~w%u{eslWd%"TȒlcYaҪoM/ӫyڜQq 5[cRƫCP"^G?걕iJԵYs:ѵ򒬏Ǒ^md~\Zq@ +do5@=8cWIG;/@u DQ} cl02;} ٳzV#qY 펬n笁E| AbO4݅WJ1a We>'ZyY6~'S=~Q 7@ŚT/'Ql[Qͥe%&VHT(\:b:X`CQ8@Xs 3՟K3VJ`1Qa,sXG̰V@⇫kb +#YF| i[Vd@#bޣ X.&(jR-v{KgH= x{=u$q8qH>ܪp֋o'Ux<bYᮖH f;b4eyuV@x1N?/D6*@rي1'Ya UR/[J.E_5^"W.bPT.C(-3p<5QH=hsJϻ)_Y|CzT%49E~]z ݔ-$k?|..*imkFcf&&8WE &I̭Pk?+ue,YT@a4ﵬ%7FfG*l8V6+;~t}χRL:#&xo9{ޛ2! #6:h^CAS,䪭B!c̡eWO`ydg 8ds㚐lyr6[+I4xCg%#UkLձa Z_?ge]Ha6^+͖%9OqcxˤZXˋv+?Msd9aږ8WXgVY"}M>bus&4K 3֦~ >i]ol]Dz|̾+17DzY55꛶Og t.)M0ŒD^5qqPT .D}hHxZ*xgg&~?|8ijء +i7qo.ov/0fa8-vԖH>^-ж.G6G>^F5}levs"א\Y)@DDfOڔ_38Fdoє]+NTܖ^pgܙomedVu_qYYPUb@)DŽ +Ӫ# +8*L;'nւm%܇Y54 +ѹ(S:'Dx&˰>ԣQR{f vF3̼Vȣ׾_7/?83zzk=Xځy +ߝZut 3 x`]< =4 P__QgH~}y x0wp hߎf@7>03ݻm Ʀy^Xэb~&qjB}Id֊3~`2y. _=: P0 4V^o`MAӼ6cyiiD{Uy1Bc٠) "DBz@<"qg ೼D/98"C$oG> +m `(ETZ~=ޱLՌ]<<;aeBwgw 8yy.ӮGF5{u=,x.v/59><Ǵr2g (۞X.qG"X F.e>[8Cd +^Gc7ɗ!lmXg0 ]q&0(E8YX}Llǰ;C?=X/expmyw+ӿ_Z)fehyfBʋcXƔ~"_-n ?Ǎc9PU^Iԥ:c5Yh7(\Ʈ|l1>{l_9~>$e7d!Ĵ>`;`Kr0nHؐ6(+%ӣemy;YOnǢx&Ra(~m +jk(}f"˭Yi>̠2# Yc\BrT k-28C5teW<ɬ₇lFj3x,(y6_dS#4`XekN5Fc0O2RO΄3n8iD" ˚ b$moQ $ 9C +ɑ`S|r i9jr:9<\N%Fزgjױ,w%w 82΄YyuFF#Qj z&m;[޸J* Zb/ТN$6nU}*)Uuس#wQY-c +ɱhu'ɠq]֎iɂs^|R7Kʬ@ YJDl܈N>b'ɧdOO]uq>Hjtь(scXtkRFVf'x#dnU'N1GFտ(sX;KgW)[[D T9b‚>ݰzm7j)5]pV㦪EŹ*ۧ( b- \)'|/Џ_0`$GAtQ*/W)bxCYhWPPr~_oWgR/g{5G' Pf?|@58r\RHKqSdyw@]e*T: f n)Nr،eJ=rz}r5@mM4xh(>p[5] ^C?G$gV e ۈ]c[a`o*HtB {1iHq LIɳ:7a 6VڹZN$sR-QF$*嚾ڱQVkga`^_UC?;,/]6d56#H p s次ɀk92W)SqkD`7,K\oNޫ01 (Q XsA[|g+8}1N7 MsF}yL?|q;ɂk'9ZE0VLmZ,#`.,-/7sa&YɍI^G|};< ɱڼlAW 5?oW;ԌF-j ^%3V8M7;Hg$o>%xf5iğ5By~>v{%;TFeL釶YUMUsL"ɧEYsd˧_j"edݍzJKW^01C36~X[w$"yHk9pd{prKǛ6;1d/l@emlw(&#ea5|.#`m# hVtJp.ՒM.~)[z2 TavמU%ڍ Qz9md%&x>-W):7ΔyҟV.#L떶Dp +vA ]va7ЗguمB@NY]X" ^R+)OK>֖}|52Pmז + d,#Zlewnw">6c,sj7QUF&(lqM'9%AtƩʼ#4 +]S +,F2Q~vlug0xI}n*(8pY);CۉFmYg@YF$GLqKqM ǥ~˷Dh^_Ug 65A U +׋mt 6Bۈ{Z%EQ%XMsd|*t .h~7ݐ}i#+B-XFk*LXڇqW|FZoce#ңpp Xqƾ"V]j<ϭb5LȪ},%;9GZ|\^5ZDΆ(0ԽFm $cEP@ 퍘P(7^ J^uȔHRk̷X'=llrIeAF_3gj.lIZ  sBhs~P3 )t_B,FX cy7+QꉼX|_[|MqU1Chv&'!n[e1 ^Ce\;BY'6xʋ"d!W4iÌ9#8@|mҔ`WoX$W62:BHU`TU}Βj+WMNWK- 3[g k0bt2-<@M4=V D1Kqim>(vm}1 WB6ɽLYB6V>m5rM$ UX| T +[qb$$̢cSgj +#Ex^F3Ӝ]46.j{Nڛ+jױdÄvbCRpd̻$RwϞ{'JMQ,%:kfע$kK7b; +dV>lK*ȂI Hj(D\B:+l{6d/"^c/v8(ԩ\-B]^6="Av_ͻhZ&v/ڭJ!DT]kи +"j ^͝-G[(ǥC.K$O &,yV/Q} &b o 1n[ -[rGvf?ܠVIYRɥu0Tk_qf%rO2s fgWNS|{$WY19o/}_5J?O,b8c؆J6,UPx_ 7\;_B QH; ;ym9ZWu'1^,_ypM=CE~&nJFl,I%bm8s?y,aBB?(O9g!3djLU; e4+FsBX`q)AW4sp=b *P0pΘn9lJUӳvl*5bڨñÓ:zM䙈GC)A +!@q@W"K^t4EQ F/JLfKKPq}i*UFQ2R e * T4-E(m_c +dҩNrm +7#P@?7*mpy |Ljf\Ć#*FW\H}\;ČH.t*af)Ri*iu^cdFnZAuZpBF5A4 U>P 6CESi)"ITdpتb /)D-/X*;JmEG)R~|գ^@QT17;ea&` ̮Ʌ6f;b% uiD\PĤ]78ًc[rśVѹNmY/(d'WָE2q!ΔZ_sBE_-Qŏ=zP_zh_k=5&|>N|}HנoO5X.g=Dcg]zź 'vҸiq#c(kpb ȅ9$Jm숎pҶ 94zWaJ^49pqYSVj\F]<+bMnNc~Wwz~S %MsTζ_=_+?߾z@|w}P"9q+u6B.2\c9VBd3ofkb"2#{1^}o53.Ss:>`Wh2?I٫ʆq']]}.mK@?$t -(z/C.p?vSr?CgDžd)~WxF+H!|rrߙ{2{"S :o{<CU%Q%PThmd>ͼbجK9ӣGS 6Chh9'҅0 ך!|ct#"c%vDq>׫3%;Rs9Wjs0 ! -2'>-NUȳ\➉tzK)F+UYuK< +3bF Xc!kec\/ź+ݐjfQMkex⵺-ѝw=rGzln'4IfDFn֕*-ijԖcڅ~֟fh}QtЧݜƦ{?~!UB9s6T .I#JW)V{Ų[{5s!hONQ@sWLBxszT! +`*_a`o"E҃Acf=}RQu8]a<(ʡ z:w:9 +BA:@PHn X8Ӕ\7]i=Wz=<iUI Pڅj)@(R" ^1X(.SjE۲ڳoP\U<a2@cax`QP]< b=d]͔n#vHKJ?z +-ژ8 6][.p oFwP;u Z6ijmH +[# UVl +O-Fہt[l95<ՓOjdPoe\0X`Zf)-r.CЃz.az9Y{ nx2Dc&wG3Y rr|RZn1ڷrHүJGȊѹ̟SCRiT),HYQ@VQQC.Wz ˌr{hRjXa׼q[i~n^۴mL/$k0~+jKڇ(cr$Lcte|>ȿU::SG5~=:妣SgJM2}G0z[߱tt?i)t `Q 騂: +$o:H7/SGj::4}Q Bz(tfE by\k˃uI3X=𛷦r>:QKꞶ6AYYb!AL=9EzG".9Q*KԜ.|oGsVB:"m7ؘRX5SJ\VY3pHݛ9<|C +V \KpjK5b˷OZ¼@D+ڛ+n,1*ǔMAW-|!SRmdeGԭ +}xI +U[5FZɾ\&9/g 28Tϩh]U =q ~ŮlDt.#:zG^Z_2iHl8"h,(7GBD+,IV/ǍGmID +/0rԷ?8rYe {U._}9@Jyx3͆:/@@Q[~Oَx5g7)TNM0K 5drnm[eJ#s$Ns<hd'N~|W►z n#Ň[әvKj6tK 9;$xm+-8ii< DY6xl^I$Jsy% u)_ /z%,y%销4NesJ@zmcsJ)M[Q[7i?t +,'A+)no䏟4֕u{OSE +[Ѿhzr((Ci^6(6ܰ6Oķ+df S>Wo8vA ^oPyw8v!Rm{:qdT4O'?$80@ + +x^B`CaC)YI Q0&WQ-Ja_F7 ?(i>n{f@ɷ,p=WQbCP@I#hJC4]2.7vRk:7bzpHE@ yjQQD+rC05qqOTH֋zk%~Q.ŲwRwUAsDcCB:ȗ}YnÛ&T"-J*R6yZ?]S")Uf E8ka T*&+j,R(4J9+ޚ' 11(<%F*d< iVZmpfEij̹zqAD_P Q!9}bf? +V\):ǐ#oD%KFIr jir˦ָDi怴đpt,DGWk.=6fƲ.FBlcnٗhͳtt/kĆvQcJ +FQtVCJ#8\Jma&=U';؛V +̦S?qnL5e7՗5fƏ[zɝ1jXdJ +)nHl|eNoe&qtOA:)5h.r/wg{!VCUͨbK.LRf!1TB@IBr2o/U^#U,K?0Ў@rZȬʒ,k6zBE+"3:wa'G"zk$ ICAEޗ54el";BP%yJ6uiDJ" K] l+R¤Ed`A.!i[q'@#$ոK;}fm=Pz3`-y }(2Iӥ5#iz.c>ؠDv,Lf|tl`{}>1y=T,oq6`i˨"^h/\)jwdVe,L[3-,{ï<ҢR 23--ҳAxb3|w;-,gǧ1m o4QS̍?D6NF띌9Y$->N6P֞hElNfold(Fa~dOhl4my[߃bL6V&'ἑmb#\+! ;uddBndWY"2h:CY뉌jI5lu#gi}"#5wd_rfnuD^0.2+ +IN.bf\dd92Eٰݸֶ+e&'E\փb^Rp1IS /2K%q7><_:qҭ}[[ _dXd$#6|sSzb#i1e} dZ*ׂ"^5$>O?52ΨsDPAKp0LY)ڍI*Ԍ}R :R״ qCay}Y&V㤅Ol#SY[,[B1DldU\NsU)ĔMgv[dD7b"vw[V%¡}gy$?l-09ՑQ뼐iYϪJZs]ɨFVkTBUډ\6Q)Ldն8y{QgB ICv.cF ''"Gkq!W%4tVPoaLA)cWcfs9^{+mq뼄b:o.>}Y{jodYS=HAۢ*VYvmEIYT~bNWf;*؋=J'grklZux[ui+9L3QԷ& *4Y;'c/ncLkBqڢ=tOWh\}7L+RY@Y+? AֱSmVzqv m86" ]S 1MzvݠcǿO|O?ѪEbv xc D}wlR|))+0!t̃BD0bP;L`&USn30VN!on3f69lx̑bjtWҷPفV6#\d3v!o~/\ti+vv=d/}`} $2bz2l̹e;=v 0tvkq@& 9:hBdyKy0{&"k7_ +M%Z6zqyIsw%e qShr +\Ee^ZܰEERζ5QYGDԗ"kI}S4n5_7)ډ~;j7[ZB@͙؋VM}[KyׁgD(ni덱jhݬqV渷c=z.Trh(~, +6v9ЏZ߇C߸v+O@:쁟fp'"ɘWvOCF=,u㩱-VX( YA29ڠzx1i) 9xGyml53 HQlX'0(lʱc=cʹ]PDJ;9q]G*~%Lyh Vev?jiV!|E 3hf]EV52SE>Ay_1|#¤:; Pk~cW#dd3&sT?"7!)sRrrhu)IJ X-c/YpJ@#3vs[cPZaIr˲"P8p,T%a2B3B h0{b޽AK]Qg:9ƽ3!~ڡkQqK˗#C6u##Ikpk! !Gz? +<|P'R%CL5i'@R].{ 1ؖG}DGaLݗ %5_ +<HBUHz'i"O)9_E-Y3ǖX˽({B@nȭ㈇^S^Cȗ̦jT۾-x1A@BȽĮCO%<0yvvLS"2`W2| +vAjpJxG^9PLTz&.A@k.X0]z6}cPs[ZQnо^z,J!=;}PC""BF_ESẂ.ad-+ZS۟7? +f=3+qϋKcv*l$3iL)! @Uɻvu K:z3UyF] wstU'`^a 01GX;@zŪ{Ů9s iaL#" wPqÀilsn5B |(UF1=Ӣ[Աw9XpgFw)fi< +S.*d(؜2)\V 7U9D] tH + ]cٌ ˮ#6G]\kV[.5H +Ʈ%I-*[4K IkPH21iTYVE`܏Y<g\]$t{=G;Io\N!W^\?BU4fҞX0d4~7K[Xr9n8jV*[Pi»11֖[XU.wjCH"2 @DArYLCENN{jE{ʉibgQZFAxKy Uoڍ ri }p~O yŨJ`cv jP4$Ϟi@-] E IFIz-={AQ]5ˇUhx!|a$=f]HiN~;qz6ldxT$OkvߤGFxS/r ]kJIS]4ቘP> `qQLzӳHt(MOcUoAr_#:"g̡da'a^U~Zurz#*>fKi} =|\sҚ<| Va֮bM)l wqv]g9ZxSZqFWB eS84ތëU+W_A]Q~HN%au݁:b`rh { ue=PO%rZ{bʵuW灕am(,D!{ yۻpc۱HR T*4T"ېA S+?>/B ;G۠; +빹,lB'o};Asc"r_t7;YVwvy6H8|z OEݏkǪ!8DJPX X,|s),r/ZCR~?I,MDPo%I~uH|a.ZK`=8X40yycWGUMZتMΗrvBc/xaO5~#)=XV-7mrׅlМJ]6pNQ^5N^mdAjYo lE,Apoͪ]pj;QajLegݰf!PA?G-}&֚FKa^Z&RSj}rQtd &7omǢ.f/ CgdOkBM +=#My*bIT3 9ԭFDq>GAS0~TI#'/KZlv.#ϗ>e 4X'dWz?xS /쿀X[g*d1MCM[,XurLh{,):;\V M6=#@3Z5C$ڞc9 ~kLmT-[UM{VaR1ziڴ VNo@G^RM?a +s@(r`6/00vOM_O{Cn=s쏘[5ΘSٔQ+lMl4F;qojJ66h">䮶3h `wxͿa8bѪ]hqnT}H [2Z>]m\p1҅uʥY]1n@ȇm@QoPç0 G4}ej&| Ŧx^Kr^K7\=NxfOLV=4v,zk_@G4a$4I>/" 5e]zd.&*@&)T!vV2"p~u+'&}.4\*uxDA)Jdm(s|QYVv*_zl=) +r$Lԗi2~tzn)Hm}1] p.xcVm(.G ] ݁;&ƃA`ʑ[||Tu8NF#3/EgC'cZ&Oi0~ϛ^PIQ(;`I+Gr\#wŅԙ9("BhM2]ChfOAi3RVZd<)|gQ4ÊL wAƞ>ݠ8ƋkץCKnfNjAbf'_WVX&?I&=̻_3tW؃7W>͏?¢1^ԭUVc3ϻa $f %CoXDT~L]u*c} }RpXz杓@,LX%f5du琶Wl13asO]_ +]왂7v 7Gx |ܲB:`,v:Sۣ28GwC]8 7ngwZ(7moWiU@xzrNu-t*U{E:.2.^󅻠}+Y".K&Ch8=ےij༷vM10Ff|\a'sM3s0JS#ٳ+s35X33W_ (߿_&a߉܆ǂI)U"+[I]qVFsˡeIK@L"gI4z7wцki#,M Ї]TUkn +ojb'Ń #vK"BzLo|Lɡ5x9RbAGo*kLJ~O?YJ7n+^4Ee+Kk׮,3"m+; \ʽ:+3L0z`v'^.VW(h[|XU(O܁=1N[sigKY##խYD@E@FQl 5,Whv6/ye[-}P֨)1Zp)>m21Y)R)v]Ӧx,|yq?i; S7J]$9?&zWpru +8pAtH*Rx++6yyP;b89&m_\rz0|ߪ]P8|_ڡ1 +endstream endobj 109 0 obj <>stream +HWd vP(>ĸ›Ęp߇UݪNA=-JuxH~F[M溓n6 -@{<2M|H+mdαFN#lfuGz_l}K8n?_1c0YN'|ֺpl;6XF ?m jХE?ӈ,5s͘_<ϵ^d*^(**_:.زx:a0Wtuug-sh(O:_ᑥN]FF f3' XtaX%1^)ϴS߃W/Gփsm$QqÏjn xvB +4i" v3Xsu2bZmwXx_Up zW 1H$0]&wn_`[Ed+)O0F`6+v}Swǿ4n/TdD5m0uS155r4^HK0!A׬3B `MaU\jypmX+aD-o{#ԕYCّzCn~vH\h1ApkBo?2 +'GFaDz@C+,V!Ne3?#xxcTVYG>Cը~מ>]08&c>^F>!kyiVN 2\Rq uI">X6" +[n*DBa3Efyt>(D-zCCT+uLBAY;.3|NIP$C\+hA6N"a|_j_7 z&=}UR$Fks'5Z$( O^[>p""’ڗؐ]\@/bs9L2_-?Pe{Js5zZc@(Rdwvdb^PT 2+5Kv`< `Z;rh[ۊimd9J9ؒj"V(&~JEϜrqCbB`Bs][w%I+ }B`QBs8jXa9Gek{=*Cp5e_"^[i?5.Fi'խ\3Sv*׶n=eŞdhb8Q3D]!@b&ji|DGguvf!f8%q-fW5ɻ]k¯,%;$.P@_ - $D~k9o6e2)8TAخX=Uzn;)_^r?zȀVkFjF-O4Bkvrh~=(^G8{(_IIrlkPnwQhRqu/G>*hy0鍉A&eh`HM*olwF.3pwQ>՝X\"ax3sM2{K 1)raGrҘk<9]09Z:ݹ.@hglX'O!GV4\Zct eb +Z \h"hEz-'y#:7wi٫MޘF;9)֟1 j2&4}PW:[apПPymc].Dϴf-1?{ 8KU1Oc]m@(IflJs8ͤr6m 2/⛯Y;7A S8 HJZi)l}s8E7}~ +ikbL +z)P kԷ$ +z)my~v4]stp C+&[:543iџ 5Z ~U]c0j֜]ssrU.]Q8[)c*c6_~ML\rw-j캺5AmRc,X۵>K۔*֮Kٟ 8LAݹG% pt 4CJ:ȓ'6 N.]Xڵ8PRe1\WN+7S5Z?b0ά7]PU4IcZ.+ۡ?B`'p-FFcs nPƴ0z!O,Go=G1y|I3Y"pY"{ ]eqJd^} Vg_sDzז5nO_6ʄ]ZPh{tJƮ|]p%|!h1kh)D:S"s"2|{cuݡ $2^oD@tYg-lK-b놰&* KUn(s{MDo)_͏_/=??`x#NpY]9z/lt?߰kLpQG~+/(s'l'aO )\Ir8*h-|Hلuiޛ@5a:Og96p7:@ e17)!"~"sZJ8Lo##i89lBbJvYmWyA^7P[2[ +Rę/1W8&\oIv;0Ԗ4_>z92Qm,(j'ɺW]R<ߋ5\E. gWف vgVX~1, F7]@[>Xwl8x +uMU@3<+!JE,<^9ӹU!ӬpP/>Yž2]Km&|Hnj[CzK:f?rk,±+q+AU5{2IA>*f]MG:Eģ~ԼḮ]Xf%#*b]nKr/*LH`;F; `'OFR@vH'ih[ϙ=.$|S\uz͹j^C,m c@^+/"EjLwZD 6)#;;e}UJ]" Ik.xQ]Gf՘1+&U|Yuҹ5Hg)B06܅n[LѿZh<%èj^ɲm11V)+kêˆ%"%; I*!C#k0h#kh9z>ˮ\1 PmEXV!xr&Ə &G㊼RbWa"û6i|N%׮Zkͪ45gˮ@jZzHiEƬ2"rS DSLx+֝v_i0drUgϪDfi:.џuʻa?^{kWX0og {}kV +:*WC~5W1)Lm;gF 9!o0h6wDfZ1Ug{5%9yǥ^렖kbJ[:p8r|Ӓ+h\ ɼU- j}˗^qv,I#td/ǯ}o};ҩ4 vqdZ8'6VIb䴝̱YlM&O1>s9Ìj勻mrΡ D[j6;_҃ +au[gս0DWǩo ]n0~ôM<T?f:wmS޳OMq8p@Mh7TGzK ׸Ӯ6>bP(C< +8`i ;ø-8\kсC gf&@4RM}5.)&!V^04Oח9H=5j2|1<<_ZcmŰ , H{ЌAҷy}څ&2x EFM}sEi+{s^6}X³P\ \Q6d`f,,Tۓxce8ƋQ^Eh'yJSJE}ɧT J:w# IEB Bq*eѵ]s%S|rPoT=ԗYވhXM^zOTg=f-D<[0H s/rd/C}`x(}g$(UˈJr{,= uúgɲ1N +ۚ㪡Ns-z3,fbʽiCb('F|dx>VÀizTYm{c/(QeEK7X>틪QoM=0ı2FNI\4sW=Ǜĸ\]KO_ kXNm.hJksKomhxbϹв͎JW: :1JM= zJt(kv:޵ɑ2{D+- ӥUr5C7{6! +#]J=p&pQ}Q`V v&~P:!m]bTEb9`s*•޻7煡TtJ3 +d87CQ_qT~b 6MKy νC)/nPVy!Mʇ(9acOۗy]swlv/FV>ߜ/ƴ*8:hs8;c7vu~#/i|s6vNCoC^ߌsV]j}9/?s6Fp+%{H0j3z7>[լ0~K- { f]#^5^~.ǟs[׾8G ]L~ue9̟TWdS80W%#l"aUcqs Dh^Q8#ʟ3CU$,c9u{asһD]ڣ!}>chH/hx* x +g*E ̓oRM7tP=q(;EʊR^yE%jlݵ SPorֱٯ"EԽ9kw"tcK?*/YLY x j,_ƸGZ"r& +.l# +|(jܵ.I^x56E>Du_NQ6QgKР6H9xGZEn?j +IIjNmof,*5wlqr,}Llc +̠3@9&Ө BMgEo̮zrOE|PI]q C띱BsT&0\+!Bɲ`Dj"*82|Q-3ق-&)'Ťd,N"nKaB{|JNsa;@:ΈEz4֞*DRg|3H&E^nm੶p1I/b06bf7͎h %y4H  +tЙ**iW;z3<$Y1N囉nizyA.!2U°rT6VTֵ+0JYąLїJ*!dZ}_Z%S(FO$z/lK"-E^^qiTTj٪as_*8sLt]<<>vktS ċXo^y&#Ry'MW4jLvXՋtGFyx ;O@,ƍPnRq!xlp^J^?04_ g̶555ʫOf1 O p(s,ԮxԬjcAעyG,غK$(!2|U 2)w,S[IpڴtIl- +PU~{֖ȭ?_t7NޟuЯU!v6xȚ]0ÿRE(4s?sTyS}(z'3 ,]'7/,;:U>8oɌi,mE4jZ1T.3r:!kmdP{rvmv.ΟՋ> C]_1QV3[j7P1\E:[nUwJNlRh+(qXĦH]F8M +}aXj[7;o(MM}- @a#oك+ƬE+u·nITs]r:H(k_c*Tf 2MyIyHge;a6fes :ɭǑ9\YOQ7Q Ovgs]VIr ~ ?ʩ!|)8ѿ}||+q~mG+f0TMgLD8\/F~؉q͆+@|I[1>@r|@3\#ac1.{>U4T~3#: ̟)Ӿ8\ɀHu I ۟3?q-E,|jQGb;L@sK4: 4%aGkB[[ZxРEEq8HM =d>2r@rjwbpE'+9rYUun#ZXO`תIqn3FNcY?F1b +`q9jJk#Z +־K扼NXƐN":,Jzqs@ c$=3@l/I/ BsXƓ}}XdnO.C,K +}2b1)𷓹u$Yv8{c#Pe0yQE$}.%B#ae,z%Ys[G񳼖x8;R@NK$s`:&^N/x-dMp3(d`P @TDvGQiW]]INy6L{!;yClwƆ4OcIbbβU٦-K]̪1U6H7^V:ӮE^SlrB}RXG-:^=@'A Z'XM 9Þ枣^SaWmcD{IUh)"KoeEf$8i =SYU-1fAx3 +VmlVqYGZOG "ACZ|"FN@fjpQ-w^^uK]@;%YC(v D_ن +oEõLp3/R ޗ=٫"ы3bv- $J n DT>?9SZM!s8:vb+yrcۺQ/1%A$䪽v%$'262@UI|T* k~"\4T'k|Ǿg EŤ\MrfgҀH-RC^vZ PWN0LV)7\cZlDʓp=S#bIvn?t $6\lѡU$u^}XF<(GtJO-2e3+=o( +Ʀt֦}-?QV +EO4>^dܘ𷼕?7{׿JiTCFuHkʩxSBʃ4*%p4@υXUxM"+tq*Pl.Ld~FZL[mϱxOc7O[@xh+z'6b$Xm6}0$V`bCe_d +@kRO5*||#u1=JpX5v?Vo)5`d4-\vKWؠ| C̶a b˝կjk$-am ((}KFyNG_!#ϔYpZ"etɎcKVi#17fqHi4qZVc;XWFq"iUO +]˔9ϓ,2X9ƳlUhE${|jK.Y Chib'T RQUzPQ7R6~A⽘S,b}ۿR ?*,6H*r'"/ څj,]ANo\[VO tMabtZ%=ݤNaܧM)E:O)B@N)BqJjI`" \޴(D8~)AroIo&n:)8V Q -5ZJ:heaHWl-~md C 7?ɚV0igtK1M\m~h;7k@p7*^gk+CR…$c) +jRhEu@&y$!e cYj[QFcP3Yh-@Bd#ޫm =r=C^e5V B).TxAGQ"+u V>wݷYG.ˡr4mM!:MAG ȩw٢AS-˯+PeLVb2cmMӇjBpӵI˸bXfRrO\wCn<\ğ^;Kd-(AMo\@X3$RCճB!:aL&Iz\,H Y^xm+&vjFy=Bfhx$Vzq.h˓)m+VXP>EM]f!PEn|} `-ӐDF4Y;q-#^ikp(X6Z3H@ln-`N/Ԑ{ÿhQt G /Zr)hwB`m SJؗz'7d1@\_] +Rg rL]$k ~OIz@`Dk +}#E!_t3G\&pńT }ǚ1txa80JߨW}fla^=xW%F-D50+kQF0ite(z$%W֍띩:3޴_%eLFj* k2t9>=`y;vmg K+;Wv +bx@gz/hX&VN/ǔʊXcEb=(%sFơ9d[CLp:`e("'@+0",+P367`oo.AXجŭHo%;m%+xmg]d>2UT(iY:i)37ڙ) +3LH87ָA)2N Uj5SfeSĮvPz&VIfͿ ͤƃUi&t. @;\:_-``naݴYP 0ځy@H@#JK?+i 48(KjzjIh76yelHoLq}v1$.8$JMJRr;c;vp:3)Ƶ=jR̿.w$Ha̞W=5_$`Hp srﲬ?^DB]sļ% +nrnWs9,ز_Pk[|gl֓2S[Xv_6)p($>S^fLxn$j$ sLLҎ% 4h ȬE>S.Ѳ`q!\a +Cj@'BϋNτҌpBUo%:C4hhO]oEɯ'&l0OsՋh%.`>( +إ"!e̔kkmΡC@_ȞIĐߌɟjRv7o7W,:sS~-Z,Ju!n,7l+">Z~{䦶 / _wP^{PB%=20x"LRi- 60Lf!3z2Fբ3ט%_lﺰx)#cK-5Ƹf(^-47jzV#Wh2~2S$/e}&W`6; A ,uCă &JܥҰA T.ҨR|W^$-B ׯbkP5]WV3ciOzёؤ-<.&xԼMfFb&#X-T=Ӛ4{F)u[J88F }OزѵջdqMq5ݏ $!$= +m#ca&mdT>CĄ89|j|Ee1YkKq/t뱓IKE IV(dr;?|2w.lVKљeuiYq^% 1$[CfF:QW $!c?.#,ȎYa0fOXpy+;O]%~]u&q b.&D2ob~ bl05Vܒ:bL Z]pkå/B]eoOcݸv >#f{yaC2z.Vhq59#Qn֍RPX)sA/92Iq8r><"=!G 9GC1%>Th,ӝ6؟Z,KhB5 <\ ? MŹ$Eʱ+qVj}4zHp+&F=Jk0lso:󢾲juu1:-kdhA|ǠzqaS*k@"f+x@_EHR;OX,ywFPAN=^|&3ʽ {̤C>&9[+w>[bQ$Uò49byv|Z9iE,n`sm1"0I' +:ܵ\nj˂b  6HP3;^mw ]{Lax,[DDv[[٘@Nʦ~P v]2eH~Gg5BC^ :u(45f:޵gp63˜@nPUW{*8YU5쐣:@ +L.2S +u< B.][3A VO _0%vYKJͥBv\BrJ^ Kj~^U=2.R\,K# +2`<٣{XjMTV|%_Vss3<5t,{ɣy +qgle#MCkQ9l!|gp{F7n Bag$]L:SvAۈeKd8{yd[W .%Zh#a= ߙִZ\\LW-ZqXYR +emŞvo>5LpWU:wzɾol"<φ~;c: 0 :nxI*8kHW3Ԗ.%SY&M9Ͱ[%D q3^>.w}{У/9oSZR1. |m뢺!#dlRxEKү ] aF67}:F8[!RLJf{~13߿X?*6V%4M)s0DfŒ}hP[-pr cD/Ķބ'x|G➪:E;^$}[i&vv˕:Ҫ??6<{a-f:^ҚE\k Lzrk2p'AH=)SKc3R\Mm>R]o|FlISFV^a(rGݓ{b_,̣+5cG)xz }D?Xb}û}^٫9]{?6z z}wY01nzIk[OU9#waҌo4ӅK 䦡M?_ڤBز/? D8?j~JVb+^AmT ];C*G& gzf4 ߈W ԝԷȦyKUۃ2\2}El!SRv*QanE/ uc0NVKħP@n'BtGPdvr?NW?FCv:Y\[祯h&.w󻘢N֟2k g:T!Ϝ /"}4)~OwtŎ7`~F2k;ݕw?$5ݹ>/=Q󵨭3t)([iȎ;=q|,#v9%^*t&&w} @& /KWv.q"0UE9=6F]"]ayG-L!e|w#5NO￱ ^5 kt;iG+[B KpZd݊F>mkt;\1+LߘU*]@(e>h2~` j҂-GiB`h)l`h,m}ﴰmNviKV +R ﬒Yy"t!iٛQآ`ŠaeG&Tc*\N XԝgFh a +iiP,!P"Q MI!KVp*(U'-M B] D5/AaU Uɭ\lapDXLY*trNZF ++h x9Ӎ\+ pBdV!d_ F\z ofbAXEE v tF-+x囻{Y\'ByrU/K!<4IToޤOlzj +endstream endobj 110 0 obj <>stream +HtWn%ILv)wڜ^Y +% ~.loT_sa",{ k $,sbc>"]$>kbE n?P6"UNy +U8f-hlоr'21B~:`pX܌?h[?Nd''{k-:}xZ8 H˪cu]DP]B*hAN/:e?W' N^nwpUHiCf匭QD׷vqC`|AEZAFtu7a!(jcF :=0 Z`d`X(9 +2>epoޕoQZDjJTNQ*dh1j|"]ĞEEqmm8UfNN\}hQkcgpq< ;0YT~\gOH xLVWʪ +SV6@G[56M=AOs r )[paMY}13?`c|˹+n[~nzU|yiʯ¢w4h؆L@UN9%=}kXhh  눊ڧmfs!ݒ1 j me0PL2VSZ}8&}iZb*+]LC{`,M}G94ҝX\ ++r^s?A*^RtNsLetXV*c1tSZF^@[]CJ/䗶MW0"d +L.9s1W|©Qxƃl +1a^ZI>d(VoOX!vzYzWKe檳HP-ed`=`6| { VℛNg*b̡" Zz{- Pv (VFޱXxaY@!C#5u#28BuǸGɛ2c*#8E7漋[ٕV]yf6trQME6@CJ2x|lW5LD%E5"$z}di$7O&) tf;)S:#s(_vtj,m' LEPʊp)Mp%|ѐ"{y3ݽij:]PB!GԿKH0^!0R^imoT/jHA#vw]F|ՐΒfhفV;TalVy@[(kOL͟ ƳMiGH.@N+r* * Ρu4~ ^@7"gc7L4=V6$ s BsǮ~nYfoYn˙ #'N8@|b3WlY 3K]}W; O>=30;El=* E'[ G?I@y. 4Dl#Zy( hQV}SL7R .*#SPTN`RO|0f,Z{" 7ۉYLW^ +ޒ$|5CΔV~}E@Lc݋ a轟㷬ۋZz Do9h#4-5|l:j"D;׈NG&/2*tUJ|#_/-67YtHoj0ia +dó\؍P$n$pɌ9$ssIOuFw<F6m37tK< nJ"@C(j5mA-QkزζZ8lG KY, +R/TlPX x&+6I3cm YQ\E{T|$#/~ͅKh5 { 0)do(1 &@W[$ \sXKw$֑kosY)~Y% 4HR)C1"vLLk=REe{IV;ʎFS-ѦM#|qJ # + 0E wZy=nqf:-xEOGDrYcyjq vM&{ +[ίV +ZGF1)3斜SjjM}d@h;]y$텱eɈw>knwrKmXOml9.-==BlwQqLQMQfJ3 5 ĮE|/RizFDCnk% +[:`@3jgK8K-AHR +O7mT}{egMךG0!-κ#ܔM&VvCmeCs5w}8QBkK&KϚ- Fż 590 Uc,=w]MQafeK#9 uQ݆(Zɨ젘OAZඈu fnZ^ k$\»l扇8rԲlrc|*sT9ƺҌ.*z!ľhrYENkHc۞W9U-aΉRt*ud5hn=wkZ EcVSLj,m.o"Z@ʉ' p7dh6Jy";GWJ7@!\Na W}C,ӕᛲqL[4b67%诊^#UW+xTPq[!EC!@2܀oO?G,d|[ǧZ\q:dm2n|˸!ަ[0!w̍j!)e-'VO2/3}2n@[ƁqxƔqsN;rWʊytܸۡNuAگEnJ=ފ_:uJyCF@[O̓9[:nw2_6H;t|ک|L:n|QŮ[H?!/,?=FunSPMe ={|8/ >ex{lj_#BƐsvg]XAFMw "ՙE4J{S3w1eG-J;C| TعznZ]S}M?v' ꧤx\1.@,߱+#xdV ?oGr8U+du ` Qad?O.G߽eIYm aFA!%SmJ{r+C>+Zo6>pF3j_;?~ Xt0tX~1{#e%#aT?^HHc|K@9wo r= \p0~-;E.),/'0msp~rモA(ub[lf4-`R(.8dpeH%zR>|nSiXa"O"GB5k =7;ցn].%pY%^+Uv r(c{c 5ԴQB2Ns^W]^ 9.u`L:l!=1[ZpI 8>Ju-eOwdٱ°d9l=]q?}-WQQr@?dH9*AEutp-IOu%(ŖDl_j ש*N>dHX433-|i-7-x!g׫9VrI$|S?>F!C!6”OlK091kH@.W +H5c@v,+G(؅NըGMG"Ԧ"4zSdծ@(-V +gcKW}JS;̠"OI>8C'sǾ5ֳ +a@E ,,MS?T@E{Albѐ MlW!VpX]mjW18(Ư+Zߐk^lrC$ojYݾ9@UxY;z.Q:c;`JgNӹif֦dJd}} +@ُ[깎ci2ee5]Z 7CbE]yc8D2~za_?rɅg2`!=RfgےˆNp2O)_VֱM~2(Y.D^߂%1q9wku5JW:t7ѳxj.(HHzdy} gE%/I,SE2bdcrm {c!XWҼ bU)\gbl Aqqg . + `>vzF}69E\c+Uح-`p`Nc}bCF|1f`81=reV(ѳVs} keS6C䦑YPy53!cvҁ*]G~&BcXCx s]݊Q =.BpQo=Skn~pt6ρRB@FerFͱnu5rUF8_xfGȗ7n^I-U,\r׵%d>E=]-D`soua?H]7p7Kt1Nk(ovt,Rk Ck9gj˧׹E:G%EzjG´JGĔJVJ~JCCoiR\ xu,y7ݮnk4V&g;-ºb׵@LgT}";u,]9]'r,dɁ.JS^>kWb,w&m쑂_)bI q |*\øk_BK2˲{mfR9ΑJrB!e12Ɲ+C| j- \t`M൯LT F9Gn%UTMjG6;$Hꇨ@lv_A (ZॡFaS}]ӾXJ )aFϘTH-2tmI2tU╺ͿZJ,^&6jK&-ɮ/ߺ1"fh~Kט.|(A{eQM[wlڻ&2F'k +߉I}2)?ewNG dGk)*L4^pf,efUN>u۴#m_a`Ԙ}UITi dO2NATHNO9FTy{cZX1c|#!*JUslóM l'dJ_Sm*S=#j tѶN6f]iO"LtvclwmvTz-Hc41E)wᕶ`.@+gĴoK# e\d\rlP7>FHtMP:3Fx|73`'f W `PS;a5V||q`4܁CTiJq2j3K{yb3x[tw'wLJ@]9M]wrndI'Ir?7vpoQČ#s?"s8ZWP8| ۻ(FZ+(Wڰ䟉Y?+vA& +^'6[(v?~Kg#d0~nH<>vρ%-Z, P'-h Bf)BoF 5Ak̘bʝKs?ծcYnnh' G6Л3CX9:wzcoYґb(2@)@&P} Ѕ0;\m wj75x2G0Pƹ%s%@@ &S} +RNBT@p)Ѕ{7zUA +taey Bw,D8Wxyo,6t|6f A>3f,!l(%ԧHKΔ1Bdj>\KS_z4?!ʒn88LJikd "f tC٠7 ;6ƌl0u~a2{bV [DPF#&=COt1ջz\\{$C!I\Nn/)U:q|+6APO !\*w8iPqG-*cȉ,>U;wu'RұHD]ƛ8 C:0ՈўQY\J^>{V7~c|v#CtHMi1[:؝GVdӂbtJi[s,n>~TߐW^Q lgg8<8rNY]x˱oBt.Ip, +@L˜6ܵ&65L#Xz_G P+@;H'|Tw5ܻcQqcQhPr#oh).cP` E)wT "A_hTzpй֖glv H%vM䅍(bOubyEmS f*P;} + r1*~.5Y%v"`V.ZyXdevzhɣ>]T+cz$ ߥQ7{0dvEAظ1$ E4`k +G >M8<_oB'"h֌y.#~ky7RzrLӣ:fQh('HZrz0 I:(iOR"T\c{XiA6NSZE/\@ ܻ.ElvoՈr$B+(S5e;W0@]i5g צְp&RD)L4:gTdI8.>" :S3fw\ξ35.OCFuG0w >1AT4qVrƞ":-{ , Jte1" ۫e E + ҺFm~1N$+yc"<qn D![Aa %ĢY=l`m9K vZ:m,2^TIr8Dr؅H]я7?˘3ZAEr(v?Zb +; ]\.byJ\켕y[>$ϲuXVjEc/]v'˸= s(mc.j{=|j{X`#k,aDS=dqp'#Lx,"'PmFf$ޝ,Cc~Xn+*bXoo)n[yX\?lR;Œy::2\T6Idb(o\eP?drTzW}I&baoļYm8clbmtIu>c*'eFۤ=IKxҒzX% y~mFs?ckKڍswYKj:8X 2fmS6Ճf[$Ƭ[`ܒr0ATKfnss2i0(TBi ?SPZ`̅SN`!|6|u{ R5u( >/fq w^uyn`؛iڷ u؛@`Y}0҇A]3߰Uݍcfr H cވ*E,.ìzF@mgI5kb{ծ'@> p0AOʍ {"FJ+n4/WI }"P[QSJ)YAc ~v[е¼)x><?CKn24$=Z*xWQ~L1f LK;rbJݑȼ~{#q+ m|8f=:ԙ|="eXToo&~?pmA44|5>pv7N'`|N@nœemE1җF@B6P> |Xݤ09~IΒړmffU0a=͚~HxrK5&o$=E))iOFm7Vk1ZAGYLfWPQg0j:Ν6" 7i]>${"-y%j캏Z4R-BXd]%CeUVW(8nމ$i;ӒɞL(zTb4Ikf"KW{]=% x ֋TR_Q/#\#N]=%0[SD~5+#`Y˥G惆c)GM[52VF2Ub{2 2S2Sf<!3O e={-3ti@<~Bf,~|oV?cϕV{Vle9C5fLU{%*<%r[3{E=:a }*g=Wp˰)(@;qKem+f2✪> +'g1kc4ȗeꉭqo璍xFE +BE0FL0EJJy3]c"uxzG$7u3-4|P5Sű`g}<֘P.31UX%T8]%ҳqlA3%2]E,^^f|q(jm> +Qt[xN~A.Q:idC^+x*=5DEzooɿT*H/VE;PU*DkUQHU=ɋ/7t~;l%_bqϧK* +j*S +z@rMv2AYPR0dv`! ?:CdihL,;9 Ɏ TT6gm^BWɀBТLi@*f{o@Nbg\?\ E@q B3=Vn`LOBcV+ehнS4BycAa +X@wG[~eVxZen*jĤAy ++_nZ63[%ya>ɯep|~PDYσvqR_zVX]k5wҜZCpdb3 5,USIJ!ǁAUc+c%^fu .~VI}MPUs}R0oz0NP!KSk<ٓTTŏb8wl,.P; tQt-FвLO:5$l +TfsvACzx24AL&낖6Ha!8q a:=b_aGS{[S[jN#3z߆r=!"n3D{j>3 ?x\~?]cʈd`o'ǰY# +wXD;Tѻ)0,]󆪥'~^Dd0-Oh:kkd"կA0O1Ylj% +B{qYڇ1ʸO,wiM4m2,+4D>pLKQw-uxC)P=fnNQEYKZU߰,ex%Xօ`5rVbtP1dM{DĮA'HXW5"AR(I*Q@ZnNͷ9.)5;th-+̸#cRlCl)=Js5hy j#N!V(9+kGuH3dЃ!/ v?1~@PmO!U-a&z̮[v$[! E3fHYEX)9 9Ww_9k'"Ȍ̍kxp_ J<10q{=jpX[SYj(ڋ&wƾ[T0$F؇=(O܏{*yA1ޣkߙ~6ZYtir5NV~'=q_Y" +V9swuH +(kN\X ` SL30^34hlV{Ntt+=,-}TV6nֳESD?@"XT8T(KDQ; +*#NE +SIB$  o[BUTNbu9=火P-eNƜƭS=g<˗eokn KfsӞoa8[&K 4r " ~!Cana8엇ʨgQM]iIhh]/}1"6 (SY`So# , L< Nř۩D/AvyyzRh)~aV +w>ڔa?xyHe?,X~;4=t%-UY tbNI58Mt~o.IyYH8|~M[R!Ilh}7 ˾-yNli_!%&Ɓ` uKƅj4ua<8.+}Ќȷ̹z<%ޱiLN>IeF<[H>0nSᠣǡ8AOoAa:r`\>s?pT AjT3IXb'XPE### Kt2Ða.YR92d`h1* +Bgj@R@Gx˶ձuR0 +UJעaGeO{2MOn3f?(-A Y_4v#}رL=[;Tor*|.ڊ;ag9B(zMdֆ1 $\S`˪Ty1 =:_]@"~-a> O&?YHSb[m]> +ol¿vm.sϟ[ !vZhc0hɗx6RRqlXs0ǫ]-@.{6\sg1鳌w_PxnZ=&ds" @5fw)yTe\^'1 +: _hWtGPw1+ޘk>ɓSEFP|u5Q={O>c)c`++Z/NxԢ9S"M2 +IU;e\!W),Jطf}j4WwaWe C_(]-ٵ*l*A-0}" T+(BLV|Y8VN ]m&IEf.8,pRֳk—6/llb*{,ᴺe񿣜vT,An(y¨ [Q m˜u`k4_0 Rft)㚟E.`=fsتHߠ;+r/Ν@|E 5sEyQO7]x67F}Bۢ%:lC}c"=%Tm!ÙKū^+2~YR},JYӋoNtƞy9t՚ +~Z<ca8Me k%GV]Ŵ)/eo뤎j$h"͍]=bo,Wfc}b%R]:]o{1R @'0ʎpF;%k['9vVd꫸ 7 !(c5BzE{DPӣ||qS,2C^~ewO?&ZPmF܎)(EN'd IJKf\ t蔳mF]Zmh=>de7`fMlp6S]3s!עEy*q,Eī0MF:OA۬z3`j>Y9Ϊ$`Rsi:t﹕418F۹3:\ykK_ubE~}68{3zNVa`JЍ?gd##L +9-xuoVMզ82{T:K9:Y`E٩f0 sIm^Qf@| b~"!QQ<0_r6/( ~G}!eW1i{(^O`IeG./%`؁ks)!qy\hCP~J6ܨ8g${IմC^P'dž<~gM'i wCL(i]N#at(NvUH19 Z7uܥ2+W18]8F*dV_cÌPMjle#[pE;RbBiTGMK d$ h'Qd3ѳu-D.m\-Ld_y (̏5*GEr[Bj/9㩎xO#.ZhR4tʬ9!)~Iݵ{>EwO,Ua8 ]ziQ han w{YąDN;Pʠ)4#):jYTzcR37ڳxڎeAE&0/n!,:ܬK}{~9QG!%vWiEKFO'+Z{Ǹ{>O1{Zlhdx̘'$Ʈex5U0v7vYtVCtx؟m1kQ11AgLKǃΆGRt33[%|gퟒAfBgTW #Nrݾlm{PB/*#? '0c?ltc̓ +>['ʊ.'O*:=|7HY?M6?,AtيDJFߌΓ8|9VAc6q =gbObOռX\ϑ9:eL:Ƨ. qTDI[|u {nUZ%a~ fm/ؐh9՝'-Z׭cxLMIdt"%\Ҩ5, +m> +;<[ͻRƎ|{wz]ÃF)s{i/G||1?׏?{wCY]d4""Py^ߺU7Bd +'`m He 4AƂv7l+}5V=wpf .o=:R`H<[(McO`Hj)-R,뻆>~aYYyJޱ%&9ʨA`aU{ 󔶢SNTVkKe*\;uօ@>H*pN<*zJ?K'|eCMϛZ``*x<8ޯߟM%u60=ƗT1O0ᾥjNI̠O|=n hlOqX0238ILC]rUK]ֈ稒JZ[Xzpud糈E/ !_}辞u"Q3#罕%j]=stf?>PgMn?hs;U86 MѬ|,.OŽ]Cjɼ@1$Zήm')TȭgPp"8-y 4m[|.I~p]+ Sߠh[~][[.w&kQxU՚&vB}< +yjS][/q~x#үz{2f9~bl$1vƱK7K^U8ႧM|1D4\R)Y^pb'_'jpIQGU1=\p;vx^(1.K팦b͙!`mnBDWл"YԄ9jR=s뻲Lקb\?cwvS,|= C l<[-dv9͐bPSK ; {>M"=$tk%k!C, a {f~dvI {n*IL;oM=V4~ǢQocxbL7LF[R;3Z8ض8RDd*sYTA O ԢlpG@psA_}1wfLEwڂ@qYq8Xzba[чDᑦ*8uv_p:}$$ Eɐ[1ŊH/сWd +HPӮ1LӛH `9cV{NˤMӸhT >+*P +i\O?=OJ-8']}&CvG'gO}onҿQ);% a|.l L&1Ҽ0qX_6Map͙rgt4붥'S._swd"oW7Ƌ=ݓejrAk~gJMv~Jȗ$h̚-WuS:iS ImM(~@?)ؕ|6SؾI'CQ(GV7~#no$G_,İA XoWiwLT/lq .0 ާἐU {ze3]}/ A k^;f&0_fS,GTh9cֻB5$:"Ц ֢IFGSkv) cF"1(O]գW0ގ]o~U劰7Z;ǟ-v;GK'Zka5Y$VrF/2S&Ц&ٛ"s5+Y5=* 2 +w䓻qD:x1ߡw8LU~U{cxYK}Lq3v+2ztFAͤL{hEC.i0%5E p_= +endstream endobj 111 0 obj <>stream +HtW9;;=FAbc;'Px2baVPK"!kw[tYVo^??zWa6d +'& *@Y +ioҊtRaj,y|m08a]8>iD .W1khzo"VF6LUM@%dP[|GyK^/MLtPZ3sUi#Y۪9R1әcQF"q:Eۗq>Z^7'I L1 +lã#d%@dθ'0q%5FKfѢ[톅/Xg^ȀN$߻Q5k+]"Έ\Ze^,2֒Y%7⡵bë83idĵBd +2DU0$]RI/_X$cHo (Z!'ugY3{ra=ƚͽ4$ucqrelΑQߠr2-A (4Aq2r+0=91;$үη|u6\U?ӥ'M,BnrAgEg< i{0U;rO6急$V>3[/(THlbCUZ^Y/ġUQ" `UST&jI3:wj_jPmͳ"N`-!pԘ;Tl+kJ#. Q4WwO" I*d'==:"hnnI*υAvHķTyG<0H(YQ{$ؗQ?나NwU]9^[+8G- Aҁ$!PVxrA6mҁ{K^W='dNwtv7F7@n`sVQL$}=Ҍ.ctY?M/t;)\M# +y_c&!p^h6V&xHȣo3軒'. '&^'e"0Y4<an0fq悹h8K1H+E8(+^lYM)ϚӚ]U#H._$,A 8IQeE kMlVOQ=[:CY,B=z0mhzu4mrx$%t}ͦ_/e6)2 yӜ֊I4/m0{]l2W0OHtSKM:R9fH 8j<bBq %3w!'"0 ubmo*Xua.Iϣ(H +rLW :5#l~ 3e11ubJ]3߰1"͇8cj3SK/{݄WuLcx' +T%PoGw]FsjqO!X]K6iDkk +RHP/X|y Qy%hiТ]X]~^ʉ)kDGQnsokI(`h]ϯ!ۥYڈ+;/3|jyϳ^b4*t;yU`bnqLM cHp8ux+!y,RWY(P縢[*Hh Ys +RfFbAJ^XL\gb.WlbfldAwji C7(ʔ2w5xl6 GV~|MZ^d1-1{8/z#WRPbZ-q v9(29% k{'gds `O#c"R)200+rFm>v7 \쇣+ )~}BMǢ3V| ڢM$~i[-+"z,ѽYД+T4%0_S;ٌᵏʓ:>ɺ(~X@97ŹV7H4J|z ^_r ~Dy"Zg߻\ȒV>5!):۬ uD|Kwر\v"4:̸EVU)4|.*b(=q+ -#8SZ[ +;՜ћ:wRWЩ6]0$$\G +?:hZGvNuh쩲4oehIR4!0,2 @eKex2K +/0~.]9,K&V>jBSC&bDU ^ͥ r? riBv҄X\DFM1*&p% +Q]Mz0r=~_1<+ +?SnT0*mR@({]@~ҪmC6.YJ; YW>bߣ>ea`*9+B,|col~b}~0B0,tQ,Û];ѶB+©xE!;#9WQL[*|6EX:t.z/>גV߀z8t݅FuC!A ˍӸ +b:$ #mwNC3dIlS@HXe149QfWmf[jHHއ?X&.I;4E=TYY!]l9 {&A;u^Y(H{6GJ Q3=2RA4IRFsuRB+|_1%Q|3fpC}@ [ȶ Tt>ZP*c4Nv4IjZO@lhtF4CCTdҟpǏYu{[E6_@{|QE,X"s Oq/{$v(8;b|Ҝ e'1&BoUWщw;^ؙ*c>40 XIo\8FT`my;uN +G5쌲KϨ) {z۱S|1JljҘun,-/a$].ļ7+!<4QM)4#l*\VCYB1Z9duQ&x`|UȪWN8$!N vv޶e٩i)&,oP箝j'l+L EPkashgvfq)w/f&1yK; xWuvAd4T'59 Z ~ӨGYgFԀK)gW +Қ1 rg,sX`3 }W3nV<"%T$ JÆ(WMy8DDCӖT} L)逅'޳e$Qe"re ̝| ͠L`-l)Ya?okUe*nX +B;B3riU[VH4kƶXgzLX AS QLѹ$U{(kn۾:ɔs,d|Q@ +P琗C%. ة j, N$3  8*4%-A†wfMp Wt\g&%qHE\m<6>>m$s'ӪIuvË]iNݒq`C, bP4d5"XTl{GKmqhDw9~'yiC{ 2]f]qL9tij-TOwlCpN_`NwYQ;P+JݮjXU0%gXV^cG7!D^zB7 +%Wd嚤QLVZNKV6BW_, r0/J獱Dol0PW͋4P758X֤ 赮$uJ Vu?9tp]CMVx5Vƕ7XXЋNJhK3m"E*KC&`N-C$;P0=Pm|i`CNW>^3Ih`7fan,u1 ta`ڃb'Ō(vL +ŠǼS鮖V0؆qE?\2 +زHm\P>)eC8(blzR B18O/'ߊlarSݽoazP՛b,͕Zĵ5n'%чbyyju֛a6tDȦ]-#OKRGoB-Q/k:Jߧ 6<5K*vF,K0)J6tYgLj>M.vYc3r3J8HM||T<v]/,2ύO`'A' "W!#W}5l0Ol~RXSuǻœ[jM~ubhnZlOɘCPc L̷cI ]twPkҙb< +yek J-պtRUǰRQ9=VP^(szàx1#uP2SH +d%-h*<:?zhm%a#Od`iK)GSx y4za>UEdZejh~,fTLGkG4r "Q%$(=@VGoZԍEȚ9蜾^gҢdfKjY?y~oLl;ČR[OQn:H/RTMQ6=e-RKR%[3,G%Q UWD@-ʷH#(~ jGHN cչqP\ D"TDEyH_:>fR9ZC<)C9|OJk⚤&yWL51v8 u6{XPs^ +.RX1Wq80BԁVjdъ枰["5 Oe+jaQHX@庳 RIiQWO*c#k>-Uwž4fCRђDJ"`ɖ[xUu/q{Բܘ]k3b:aa0iQt-¬ m:Lop~ߣ +Ƣg׀YAj"lChqFw&\D {-=AaF_b>=En)Ә6 +g +[WH8sZ[tM3V8^{2QHttv24Vۥg<ކn] ZtJ 0 Γ'0jv>ajf=CM5€#F^z0EAr`*u# fO2'6”'f$kap +ah3l4#̀&X#lccXV#|yGI[#ia|y"T# O2׸fi1З+I @AҠX`V?˷{m`_ل׈uc(`niakV汲y+]J^b9Q2&^K_zϩMOI-jy\GPw\pAYNmM4 ػei|QlOr!GG-Q~dxf-$U`MwBK iWqÜz`)A1ƺN=xyZ428o!^$\P,I,jFVXkhle|g Ykxp[K8/D+|Gо UaY٢ѬucFV=nﻟ1|b\]@]R-@Fp.g$_u<[mע( -+Ghb2gT^ӤZ,M? uRfTʩ1@"[~vtwD-JwC5Z?g@5Gļdmʉ\qO+By$ +VKq*](!EŠCK I\f5ρRv-EVy-ʗQ"[ f1yχbmnv<ӳ'jJI<`W76xШ^ + ֯ة"~NINjJKa X 13hXƶ"0sֹEv2jax8yȑXn wCobo8Eܗ?VLsn,r: w eꨅ +U$8\O;})Xki<$r*͓VJLI +ԑRY{^EvbuZc;pm`v̕aX_lu\Ħ93%U>^0 \N MD_SID^V$r\QD(t{bzPo GK~Lt9 O  +-`h#(|*a:5%2J i'[YZtE14sgꂠiWl*v.Ro-yP*^`W =բ=֨+ +Ih\U6 +D{U=ЖqAr$ud]QLj*|ﲨpU5 +`jeutuL4^IQKvܢXVE+soyFKmi_~=j.v?*Z:3MM8)O\$]`yϷH*˶xn iCuW3]$} +>Q(-8FYJq`l Z%rc"ID$T9a\H,KhRJOV(*lQrv'B"5xqAyE 8G" +6P7_5ԏ5LDCmI2i[R!6"Kx럿~VjDËJ&euTu뗖9pyu?>SeqJвyA5VP`\7!CZl#Q-|^uł9YĭٴD=8ypׁT5"֊o`j.}kR,!ة@O\+O>hzѮNt Sp=/Wozq/is_1ЊKOp2iq {֕txCYo_\^*2ֱlhPA%^wt[\q9g˘tap^/4Ϳ|XɪҼҢ%>`g6 +WPŬro*fUJ*FIuy\5R'Լ$YeE \آw l40Kji# N/t2 \ *:b" Pt]-dբɁZ@ʖ(^/*x ƦWSpCݠLsF8n{>$"s <e9VYޏOkB#ǩ/ s[  +30(1T5ٹL&Id]UqO8*=Z BD‹ƶ`O||~HY.G><{FhhTozrhyh54Fr ~xG5jN<>R Ǹ) fq;0>ҥnb1s W{زz,b5ťZQ 5"9wfư7Um&XM&^.e&w^# +]ǮL:U>|_ (I"Qqtub8=^wxbodtD۴tsO T2T8 )́Fp `ttsϘm<X1i-(V]=GG83|l,hx>xga)9mYM=M]rl3C9 i_d/S$GߩECVKG7{aEkj-[81=j@l[֯;8#>IY >*Vjн+2yߊapǘ9O=S1u8c#c+h̚r9)T>8<}WN3gu,rsO P 7E0SQ'4ua ޟ|o#L&S̿BTm&gJGˌ:%3NU{43T(B2.55A`$TtV)Håҟ@Q. CؿS%)cWM)v\Q\ŎI#M-VdZQTKCL i&0 UK +X:`γVxeWe?UdInhSr&Hak)SW&V^YcT6G"a)(q7c:T[R_qU:%bfGX?lxb>p:n ڝ-#ZN(xݎ0R`PhF h4j1A 4JϰrX(Aܰ8f )yM+ (H֕%VͲX/R2d%~)c[AHE=M)I0̓9A<i- +bOo-TL4> bڂVwFv}lu߸kvnYlm b$eYSpy xҪ[sc-؎3s`~(bL.Vrk{pYN34B]>hB\MĿ޴\E/_N_'6CzF#q/lJplz3m$TJjôB,R2r+ǓT p@Xi?͞ dJ5T~i`]WG#UOz8X5u G@fj-CaTzBTqޓZO CTmU+>^cLD7/zٸx* +CVu$|Ǣc4[דX4d[桌JYH?=Tef[]Qwk}kzeȳEz&wzh㿞X_daQpUݓlK8 ړTL_n fڽTE,u"Tn+(v-xm6#F[*,?H"ELL#[Ɍ\%R)4-){(pD-Tfg>yY7Œ8v mo#^O}RL4}nh%HQyLw UXwx5{3&<}hOHZotAU 1mNFpC~ +@\ `$2]iq&ݭTTryM"O`SƉUH)_]2ÇJE~؈MzU Ј ˆaojWпp[J:شu_4G6ZR LNƭmq83evK&BRyv8̶Rz['f,۽ᘕ-Ksub%mn]AN29em}D,gN0 +a5vԴD1^c +U(PY#Deٸ#2덤 +\..š@b)ܕ1nI%O7 +ԉ{ׂ]j^B +#+ܐEuy Kg@- w 4[($F(2xr'͑# +4ŻGH59?\ -B*bZIUukvz>հtVsT>%@@TNF!T.*=.z x嵣J^=L2+˚P#o z[xw-.-aw|0ذ<[ϙ;/$+(PXC9ͬ9"8X>{ދ)`́L{~ Dœ@m%65QcG_!-ی'ؾ 0^HÈy|Vz3M~#8ؽ`:7LثIC/s 1ApbJxKUn^۪%-_c=Coňta:eq2 f6~xEMF%+(aפs_P b$ X +n?? +Q<ٽ*n +1Wܫt)>HVԃ6# @Z!+_#^-ql f-ߘ5X4ZJV'/I,A!y]#'=?|A(q0'!ԡNe*G ~5jcִJN;}PXS].Cq+C|@ sr +jF<,4xO+w[28Sf`h\ﵬ5\ ǓX\'[>N,k}klijNsA! +fExՈNJVVZ]؜UM PQ;"!}ʈ30Z\)n1Y+V!FHZ?b@̔XJJdpÛ])<2:Ƿ.+PL!Θ". `rljż*Yҍ4̖ U )Ad"-SiLd03|XV C$wdb,,*Sfʾ+0\aUSe (V_K-ƑKa|hH8^kea += `me5V QD@XՕًJ[OJYia.ISӻc14H y ugؒ^S)*y'JNHٰˀ3+!_w{9kخpny"Qwa𫭞FqS2gC yVkY""mZD"i%omTgpԢf=՟g瞶pKJp_*\Bg[|*ƚkqC+zz*R_1:Ԡj›,.!ρks҃ ZqJc0`xC<45n=>Ӳ +dU4ތIR6&xP6QWj0ud_jZ=,f @b9|:H +oZ^OZGcUk~Dw Ct50|b(bEc;/_kV+9 F ZYմC\gr' u'f~Ƨ?Qx#%aT`xp{IzOTr^y'"؁lqSiLw|uv*d3U A W>,.chmz, Ȓ׃EQį,%MSVe܋_sן90}q9 _^Ϝ+OB=I +WcR#^w`EJm '/v35\7}Vo F>INRgEz9ݮZЃ4gWTؖ.G†~iT6p$ |ye o»g-C3'.<Q] 6'1 PYSm/h'QqG'nqjCw #J2R;f|`k-0і[U)Uoɼ Y3 lrD؛3:U<ْÝ8(![N|'fW+ +]-`Aet՜Ճv@wN\֦4yt{Yw!ئ +3y?̲(׸-qG +\ >`vSPȻZ Sc޽Ȩ yIyedQJhXl\I]_g#u~8=}ieRZ<&}}gIs{#ѫ`:^kzy7lOM [pP{Ga +~ 7|f e g0b UG]2c vl0ۨTAѵ7s]L79*ƺ+.&MStqܔE7'ڴR{9Zb%<|-Bpzi%/֛{Jö}_`>+DAY_O|R%:@Wܓf,f gFC\w6"1V5́a^3j/Ҁo\v +khMفqhڶu0DVuz5 ,%<] +O>RBKQ2K{;V]'l'B{o\tڭTjJa9R6V",&:l#4B*".z, [F(埄t^g3&ēYcxĦFd*=⊤=Y#S :%Ed'aʐtCh\nգ&zu +ju?MK/* qZ*01X>Z4.JW [3V͐6es +/" `9JOzg# FT^\EQmU{{RL5$Oy9֧=MMRSٛM 'ν)XQ?-8ə6LK-yx΢!, CK S}4A89?5M grW^Bhf`\=^`W0-&cC=>lxGMwe5@āYnڍ r@O'}s$$ *!}z|mjmH mrm$UfSgM&0~Z}y] 7ȝ\|F;oj\l}I=>XRjw>_D;"A"P xf-]i{|_!w~uq` M+%n l.p 9:G>cQrHb +,}2oX.I. ^}cDzxt*H^lL),mM ̠' 8n.0KxL2k;襩:ULD f.dO̢/r= +c͍խrAl@kJíz.RW$Xbc n( 9or.rx"iThYv. [wō"6P%1p~hd5XVCp8 ߨOn5k"yŁSVHwExvy@Ϣ`т/AG57K$ԃ,FgM5gU |H٣qN u)^]}/=;BGA<#C![D(E}E+|80Gjߥ nE5ͽ ݓz)(@F;<6wRIdTSUI 'JN*kMҥ|zsSL2J=X.<5}WԷh}?(!Y>O`!t|P c;ky2u\Yx[ +5vH)/VV (aHWuB%zp;CcEԌNz^wR&·塂6>[ Q1P +}1dd^S@+*|7}_t>tg3]e*3I@{9/)cP9ьyHyƶrˌ0jC q,Y^*[XvP+goJɚ^_~{'@~%hWZ~A~O@)LLd G?|ו3*lM?8;m3Zl@+h̎{-űZaszqV=8|uƂe /0HX tx7Cm/߆@YZ?w99(U~U@Yu(@fp +{{vB`Vf@ͥ+Xw53PIǼ30|'8vv.ol[8I3z8Λ+eѥÙ9]>ƛsq{j㛫YsHB:bZyc1i97Jo)_68:gcgYj;rV$UgMM#6g23RZQ|@u>&X +2bSh_[# +3?hq$Tk-L}7Be6T+($yƉֈ +[(^3~uK#f2.=wfGG49H}r/*QԀ<ۚm'T*MvP9,tբ/Sx +&)_?y?>縨H4BߕwDA-iCa9~bY+d?g.%V4n45 +]ݒ1MwY2찘5e[Hk3sع]^-.~a ]L4Ţ)n>դPBJM\LO#|_}JtΚ \kYϡ%Ɣ`TɄ"M_>@zפ8D)+# +B.tXV,F-$%WAu:6w kb./y%:mzSه]ef6g>ZѡTT=cX.@<6M̠R\Gz?1"oh=-i-$y !,W/ɘqjYhX]LZ/;=% zZ(4Yٰ_q*98j*MVOb"pՀO&eڼ0O7]D<?iWr!OTWv/O|b@0/2iͭ55>գO#3.gbњiH)&CXl>#(c}lz8fx~I}+nSԥ5ZUv?, ~)^|* qgF<_9n~E1dbX37zIѼ{ƫ{SP_*ctV} 0|-Uu \5 |e M Ąd\jjfZMk]J~ +ؗ3`ļB;W2rmMrL|J#6?w=0Ie]qO (sЀTɒ).Euʴ*j C_zUflSsm.Cix\jGWKgSiE 2VCiqi=\gB`΅`-),LH꿍 yvn4K%Vbeu`ܵF6VKĄu/e9o6+L78 YVk&phv +R(tL P`' AE+\ůx8 z>%$Hnlu˼oMQUKEhӭ슾faϯK(iI4jֱvvCҖhUVN%+#wY8V۟fXPWR9l9ރ!j.9B֐^S^ еLm)M` |{-brV .܄qt6J~BVcO@1ן(_ljιPk99OsKME!7 >>@tD? &yS-q:mڒF}g(靿(=Dq - +FX2TZ$lc MB-oI\ɇLMT:6t)vJ4*W|_3)-_ZUCQpz&SY +uu&3Y]:&b@mVJR7G߻ȴSٹ1>#/\/ɒ\^SvƯ>DEh'1L6! '6 . y;71B,Lc+;|* A'Z+ɐ!s):̺7N'6vaZEm@:>$l^!"9<)kPkڸIL+qL5$]kw 7I{& -*E?)KFϋZIwжjO:|XG%hHNIqcTYZA<{xO'2rr uE`I+&*ܵȪ.cKV~h)[H[fK|3a]v3>_E,MxPk5!`QrYE$Jp!kS򈙻^cEFѴVB}|Rsk(9(c>6cGYSᾆv%鋗rXu€be1+L`"ۇպv~ͨ:GSf'In*ͥm[jhE> >0+QjtqnX{AU c0P1TFg[!,[FJ0JY4+1Y]g5NҠD'X(zX\?_;7D En襂e?wԦwΤ3Xyx'*?>oNZ|U789GP?Ua25],˘b)dV2}MuR.Ύ N`h8@pngR8-& ,_.F~Q< +\WIr0 9I{K0-{zYID(<'ߋʌA=$=@zbt`_ud#ŗM LD'!4`WKX}n$Jy a6*kdoF{3kotf{ۧXY.lvtHHcӦ̮_XY%ͰxrKT#k#哴΂DoL(D+1}7Jb%R }]wYd6.*?P 9=5r(>_smA!'# cE1KbMwhۼz1dN{@]D9)F#n#?[6>stream +HlW & j=2 +p#%X\o?}F2L,u0h<15%$ - &ԒwAъ]eh+sƭnCfp~+oO`(% >^,\RcGy7o_`"zP~؜>  `UB9ɾiLW|.B w:eE&G8DxG|g>nXĺd9k곟 G] K+==F6UEG +1si,uPeihYC9'"tnTJnLa'1 `읖.ʱSNew8LWŻ@Vؤhg +mݩ\577PF. vzU3rۇf6*g6M0A/(#͐Mhv缁RgzΆc +}Msn, Cѭ +Y^A.S+NW ͽWPay B]7PJkzurNra-N#@ 2\?MsD+~ C@u|p6$}cBР"TMX< `}DS@2-جRoj;=2$cپ߸_zԸ8 kt׏EkaD7^旟O8ǹ/U- l]a`Ƨ_hj-ͨ\tuϙBDV0̑h)yȆ` ȻM!@iwf 0+I]Z5bcdrB`+fZ[Ht'ÿfw ^҃=ڵɴ.-¤B ɍ4K`67. +?;e3a4i#G:?d6wKsdp+=d7+26g\}-XOtm1|8%:!h%j%Q0ȋ1{:\uնYyKf|./Z^"r//, dyo/ _( ("5:Ow@Zt^xdtc;bw΀ VϨE!KQr 21pW>JWBBXJ>irtɶC0x6jLi#^>ݤt +}ޣ f\@rc+'~}3_tZDQ97g|eW?8Wt׿.+%j@RkO!MǖdA37#{TQ.'?3D#gjRa ~)ˉ`//c>:빘`(dnc(Qeކ+~qG1DЕ =zl]m`nU:2zZB6WoAz54e;g|SUC8A_`|?y 7D}'%6{$T", {X(_'k(;B]]h6_f,>K#d\3(oN 8'$KDh@-x.# t+-t?AsrqNLw`vv$ѫ_@h&R1sڣ͒u#rm # Q[H:^R&"ua6XopU<jaOۢh0jUVx]B4 'qpӾC%HAq~!0(:# v%w8)5eQrʜCY{?7C1ZeDUa:*c!t$l^ZJĚ95SI`T8 /XiF^tȻl0=1%@JojObQ^XT}dm'6Gx==o-cSu?4"k24j7V7"Ud ě5T{iϖKEF(A_n 2 +zl1)T CUY,MTNs`\&#OI7Q>=dCbFMct6 +^M9968R=KO4[A'p!>B3X1(?rBF-5dI1N~$ +rC߫n҈qگ'RaJv 3۪M#:\WdQ}Vhh^PJ,;AYCHG +6R 8%MNr=F2D/ wH{,}θֈ`S6VUo|B@ 7M#s+Rv զ˕,9tn,f"ȠP OĴIi_PFѬ]lm$9:G[P7V,% +jֈ0\8=ŖCP0 қZ=Dx}]uݦC\K%7YV[PDNA|9C(Zr D=|9j’uK@QTF +Q#!^0͇V gm2@|*eKy)|&DytySy*쨐 [n*C9d69eZ= oaQq]FY!JסqpD7Ykd5Z'l&Eg)'P"tX&^`9R,?^ϸaNQ+w!vW`>䖑wJNb !< K rj Yؗda4HqOQ^X}f +}_\ljY9yq!+Hsd- +O{͟l'{-ltmnÀ41 GzhOoס@>%v +k.\sq-Sj*&xa1BXQJ(7~;h]{EF@72,+rk۱A<dr>,7!/42g! +)'GMT@c9]'a=V10ډjH(<|uϪVw13ڴ}??@HC-֡o;VT``kTR?'&5_˜6só D e$)E:ZKI2B/#X E@X i~j13-#\Ω$K]O6unQZ +y~js+"W| +X4C${@~ʪq0آ1Q7Ӣ0G @Gd-U7c6crdIi5I&&~CZ0t7PFf(]>Grr2x*RB\w՟1EM$Ha*s@]{MHcsr#C@K%ύF>BЭ.cSXjC|5rpԅq| iZVQ}B~"_tFX=`E) 7\^nN[tr$[2~} +ocS=.xOSJ(MB)*PqopSDCt[h']rJs^'L6QEz$(hS{W6TYۻ~ޭr1S"!<"1L׍f"J*vY-ZZs2l|q4e̗:6rWC9e|V!&Й>(gM`g6_EYCx]POaVO=fxU.:Tm \GPVPvH`;~X袹/^G +FDw6JY@y_o~@’sxTe4^ObY.TdSrdY}7u-tS#XewyFV\'xg29X7Ƀ!; ?VsaK֍H0f&&d0JQ0ǰo\Zo"÷hg p!9jhybC#'4PmH>ӊ59čړ\΀0G3#Z*.RHcĆ"evSp)~vdrtFgʌJcuk'Qc>p m UB1Im*Uݚ9 ЕWM{5Dv9aIrhN9Ԕ1 Vਤ)sXBu>PNgDʕ73f7L.^Dx5l +?lWbӼkrf{f7;ה"y6It¾_|$ .w4Z3ZhmqFG젴 XA:jpf e =e3w.̙yk}M(-/!Rx]u +V.BCg3n/2r!*J +&;_֜9:+ߘ:W)9ؙ| K_?Wo\Եwn{Ցkp,8ZCM + *phR=0d~-2SsRxEhJŴQa=e5鱍W ht Jȱjn|M7+kCRuhZv-(mBç@ bB+T+wPv0-ȿ:Ǖ/ &G# +'"-P vk)rKr#/Ц x$+"3YdUv1yqᰫy\(@V}n*zV+J4mѐÇOCǝOU\Bj=(R}Jkr2BT#dT} ͋+UMN`wmw@&3$KזG7h +s)>".6kz v:KR dlcR >f||;<j)ueC 3جZ kJiP1$m]46-nh߁{i`3"v;"^Qk~[~ǎywZOr;nc{k`6l0`kLYyRWdY')pM0E6(襱'X39#}  'i{(6!# ad<2vb6|lh2o3Xm0s wCΗFELP - q.)$Xi1`#fS%o=vX ?Ϗ[AF/.R,K̅9C;YҾNLhwTAf/ uFiՌ%Q;L.(Q='{vlwwI k$T5A%nr-=:KG$űM#H}G\JɔuaC"<|w6:n@7xhgkAn_'ve%fh|۱t{f#yn:$RZA`9ϑtPfgCS/Ս%vrk,fWw݆%U)5ō.&!QFtQ"F3Ϡe٣rgQ6G)Ǣݡ)T 7`сVgXUuwW-qFtHSpu{xvOH%h-zgX-.&hR$}Q \iҐ?tސ%P[+.*1,0S +qkPy^Lx@kAKj;T$ݭ='M|腋tR|x%Ǭ''KBy5[vzoØ'Lk> %>jѡ^Iu Y'2G.:g_#u0qS 8%sQ;,TI#wP.hnq9=GZ"b+9?)_AzTU=n6EKPE؄eRu${ ]sZ"ɺЄKSJz&_4-w=v o|tuIݖ}Y`bςeWfp]ms;)YDY{`yUhmx +bsQh l 2g+EDpuM+ek*m:/4g]ݹ)XLZ:@pEHCḊ̯Ĵg # +czaUOJ_HlnƑ ?$+&],8sڑ q5_7m,Qr O6AwAF feH՞Yr#t(tm3bW}v,5B]+݇E7ioDUv ̝d +jD/[EcEy@q%!Dy`= +7[s<ܖ}8?dijM1WsDC*Mvk +zbRu& 4(9;qSj\]|&M=^p~hN?[׻>7( LR:m7_Bm]_p5 FU~RވA!".m콅sS,H u`szq$w<r׶w_0g%9F>$ocpb640 +]۱E`~G+ϵiu{ 5Tی0 Zs~0'>e.m<첡MŻplXm@#Y˄#\}|r>s/k4D_gs]$F[3JiF"7=ضnCSԑC\'/(BQJ7!p{V6NGE|9_T+x2Vn`$7ȂM YZآR v$m/0 +kWa=p^>dZgi $֞(MMT>Zh#h}+EE(qѠ +G\^ x+Oo[?ޭbPkut) e0nj6679lVK7Y!J +ʲˀMrlϨIr'BBgj  ݀ȘB^ Hc;pRSIYHgb@nA]gjVT:ΤYh^6*8BU'WM#\0uע ƙԢnAoU܅;w#/ӹ)j^/ϐ0g,R7y luF21uQ\~-Z%FYɍ,sS%"Tz"/SNRK VѼeA^pvsh1 5hqwUáN=V*F7}ɡ^^ѱpǕ+:W%-stQ, 0KӖW4?STک+z-l%+Wt`z W`WоW{@٬x]`Wcں]3慭X@|ks-2f簎!fȾf魮nXz/:d +Ak1F}W-t IedDMSC:Ake6,HY^DvnˌL|w}&tJfʛkx?L £дr,9vv?mxR±~qօBqA2C;"+w%v8k>}טPF\~i"jxIЈx&M8SȓCGѺMX4GG 0^팕#h^dkƮҖ,sHZ1xho +rPAU^Jz@VH-tDVŠ hb]/d@%P4K~WWwPqh ,סds!x._$`H!bǚ#Qd}&+>00]b+a_௓ 5<^˼G;Zg,;N\ڷu D_Yw3[ZW{}0XKK![{vpʻy&7LzJlao~AlQG 2قRXK.G +-?j"-bR$VY u ZeK)H٢B +Aթ{w;#uʘHkW*"QAi"9"yՋ`"9P$4{4ߦ}gE, +].AXn An^WGM rrK$.#'ȋCR*=rBG =g;BxY Z 6l8`rV葔#AJ9G;F,U#;'jD}z⋖BM}\c=lݎTv7i`xֵȤO2+N 껠j̵FeԪĞ>%W劣rkQhо#nnj +t,z0ī]RDZ} ӂ;=k7{Ga`7vt?oGVZlW+T f.~u޸!)9_%H͈;0\pэC"^)``©`㦲5l;2v?B{fr.s(M^]1tˎH5?%xW>/=#VYK1,9k+i,kՌ1!)]mk0Wc`ɴz56UìBVV$j|๥ug~G쎾,*rm^ݥ.ͩ(h,W9qdqr}ns+D51L%WAtnEy[&,lu e){&f{&5g2[o, +]{mB|ebR +& +H첢Y^5LLu`Y9wm5~JM1o$f4G"=xe?OyZ)))AfM+cHvEhT-[j>%! lb{0&yYY}EZgT$1 扸gM2g~\C_ Bg_I>{SyJ wPTns1x΅IwLzFnNV"`5ihʱZ0̨v%;v*Ævr$MUu#o.g.w͙9G@^x%.!Gi74`!7~ jXpbm"ҧ=?pX\^At>WQ715:B5 u5r4޴^n\.G)]Տ,>b|Eaw:⓪@Jz`)'$uo';p5Uv7&e +$KRIԵ*-"ciq Dv:Bt=VD)ٕhݳzz)#{{Ye/6u?+f(.ĆR{KoE 3aZx%1rB!)D&5IGNVY3(v& j|VM:&0jGQu5*-G,L 9;q0Y!6=1fg^` hb} *VÓ.k|fLz=`0s&1]F37hؖ12(_ˡagP9c2I}-QC>_h e=b>gSh 9CF)٣ouT∊gg+IĚBuЖ+;^m$mV6@9J^}Qhiy=o f+l[hYGi{%31R8ȆTR 3<WZ']k,E~w#Y*HPZ! G,ߊkMTYJj3{Kie3D +4 +z*48kع+.yTtV \lŴ%.ՏMB+ek-%9b(6d>J*zS֩tov^ʬ, :ΌۖWk3zX,6~vՎgw=kJIP(#<,'GvP<(Ƭ"SdFqsڔJGLLPz\k-[XoR1vD"*)C(+,86͸ω< wFWy +o-.iZMj;Nbgs(ЫY_{>xobIzA:,!MzۘdZ9I>0Z96쮘6dU xF{e=X,ߟ[P +Kx+~nGatq( +#bU3P?XF{^]^3r9}v]Lcju}d@V=5D7f̒; A*,ZD(W7|\Q_TƄ&Зg8݀b8䙔v&}Pxyrcb$~iS2>?_;*&'w֢`A4%sI<|o>?_MChk>DQc: +blyLS'-klZ#!PW$d-)`ϲz=M?`K"6RN^fd|y65= +X?'X%7+4+̵>1 r 0R{XA%B dգ 5 +sh^uMi5k,!Hxg\6kI\/]GTbo_o ߮)EFJ}"K8ط"x:U._#a!Nb^EDJK #  +by@2]g%qͮIǵLv.a1wNU`SI;,g\хUghUZӰ.~Gd;fa}\UVͤP8TRZPiwY3HQJk+20{^SC:a;z,~r2?L T2:-^4j*gJJ(#{&tM5vMv +CTqij5I/(4;>O(tENH9ra`0C?cFJ;.6Œ6,ٺP1dV˅@_=5yGgZM 2_YPz .-"bbJ p: \[)D`v +@V2SUi5zaJsٔB`l^=!hUk4#c(G`0JaP;.,b\PMV,iMv#yZa$ N @cuPT|5e?U]9îHlU'vUG(K@(&TLI'e&6gOq]va[7fc|bQ_KO15Fx0Ͳ~R2(>1 +wc +Pd:^,[=k+w%o;}` +pteℬ/ +qJBcczښsyަ[\IQE9٘v6x͢jlW| ]7]3g>tGPa/yl/wsD(6BZ[.AB +=u bE@( f *`OSS~i..-! Vf2:mTIniXB zHg0VFVbT]N*8uaƶ +L `H 8.sfvW\>ur;cEEfڪN(:-31{Qgy~j5F^؝GC s,-ϝ#[\{P%Ge;clxz7ql;ĬRR/6'C.vcJ*9,-]~d9le_.p=sǃņ@X)S~V+t plP҄]r~3ysGh2+I `}!5!`<6f+zm8M9P +跍U/ݱPb ;}FK@n9Qk@ i0Z%N O& w1g%蹩휜V)7ќ_3bxL36sh4,LFZr[t!ҠƩlF3w0Q}Z"oU5 u :FFȱE zjTWQ"_%2JH؛xn# IB-JY{Xי5R3ʌXR?ꋾRgu6Vl(ᥴ0u }o]ٺ1cP4<8<@8 A?1Ny#ޝ#:Q]},\Q1C^wӣ;dU + :X1cFE,%XR!ҖRM64=E2[ʲ<.V#K2P6 rg=]F#V-,!f +t`y4r B%l 5|<!R Zط yz|Q2)B~aW?0m]n *emų>]I˓{_?zlzC)dg'ɻuhVRcۈ0,4"=Nɰc7[!*>O]2fmaqpEws 85=Rܭ)o6^Mߠ<ܶ컕ʳxe?KozFz8߻EJ׵*N9Ԋ upSehI*n5*.` 40l4qzQ Pi@_I+8F.J㪒'=i iJЋƝyn;4^ 4G)Yy8kŵ,~8km59\MNxbl/8~{[]+ZpݱuZ*#]Veq"~_$TO!wgW]pH`No$"q-&}UJfQ'0Z3Eĵ(/EsP%qkHxg$bhu=I\]BpH\#K߹EP9 .F7,~~~ͅ},x}'V7Tu7v˟zՃc掊i"!^׫mSM̠ CGbOM,0TFwFUxUp$*=JVy@zZcH#d=®nm6 cA`Y3s/}rQ8<=HZ/Tz юnmt^?5F(u\j%B)XNG9T`)E|)JU*XP[dCl)!LlDJ@b `Q3F||洐h#n@v>YOClu-z[l̇һv dNcs+[0NZ ~h-KO[)@R";H>ޟ?}g~-}/!RZOCk̛ogf  s- ]@hjb졺r_Ֆby}7eRm+|.VUFD- 4B%-K R\9:M +endstream endobj 113 0 obj <>stream +HtW=d С!Hs _c.~;`1W-JY$KC7N&S~AL=~K=44H{b՞c $"ƻ+ !x7?߿߿Oy~ qoi{oz +@2*:?4y>>MdW,XH +m[3X`fb^8ڊu$" 8׾{ +ib(VeEcfpyTU 9~,J^FĖ>2fouF>$K334lf)L0ĬZkZ\ywYw`W0fWu& ɳ E +OʧDkcd=G7'q|۫D@(R-K|7le$&>*'fkad;#F>,4raOi @W5nOަw gp0]3FB:͒}qsTJuw1E}0hK籧n^%^#r$/>QCrU<ȆLnRE3N;Z]69_T@o{=wza;/eV,^7Kr~0 +rtY%mS kvwセwʼ˲6n鈖i*rqnCS& #\.]V}=*hJLI嫅s0]gj;vJĀZ +:B 1oXTohe P{fM*4ݧ+H9=L(_mER +}hb̵=-rY;dmGFb H5%Ym@٘Zu?@d+lH0|2J[{l\{Z݌'#V?l% XGze n 15cw߯˄}uI(z RoBB J/ Go:K]6Y6"9̑ ZޑJHl3쑻HyFb CQ`]XұZ~zE3YC% q8rV|PRRv-J&)ƯNJFd#ʚpj?-3ADTn7PZߋTiBOF7p +C2*eb:(ʬŒVRNز·zEW9Zi3|V3o*:k|Ux+cmAiP9{šf:/%Τ=,ҧղp'}u³6k/BL=e- yWZ֕Nװ~Tatg%U^Yv-ZViXehM|yz]gL/3粒  wIc8TyDGg{ +*pyXX nWǫ^gG>=gƬ_ d/Ds'd4u'ՁYZ]{Lx*:͎E(w2pNJ?]ڏd1^rgB* +ch+ %aM#|[)4/ %_-z:xM"ӻrEGup,+g+5*[TujI$c/,`ֲgQ >th۱Ni-W"e%<bʹ}H =e"ĎRj7F+j$IVw?H@moIaM_YyiSA~H#mF0c 8xQT<+ԏ7GQW/mYL5wVB0̭UCSXD܊W C͝;jvQ= wۘxm6M=_ע"Ć[ Xz3^VyZ)NC<`e=~Տ_hJItQ jX&%dM{z|C w4[xQ>nj~#=dK}Q`-KǮ-_j~n WɝeUhB_< LJA;%7z`E]J6Wڔw"d)$Ik $X=qw9dD =YĶm虆Cm醞m9 c0?sCOlNCﴑކ =\7MOGO3CU~am_<2~7, U#9@ϧGky*p8-ゖ=K4W|jj]x^Z0==S&w COOQEluOOwŞOOOlwV'=ݞ<<}Jeu:zzCVS=IJwOȮ?gmO琢﹥h'fyzzDOTɕ[ECfY{k\t-=~ZzKp;zzn8؎ѯ`m󲿗zHXzB:S,칤 hnOKnK ▞jOK-KYؖG?XyS8waaУB"V^z^jdd+5~y{||.Kfr +jR`SQIp`fڄL]0eI.4@XYWkv4们J$+m*YOcN$uEB1EWQs2;]kIN2_p8mڴ-O%7x{TV橩W{87UK 6HBE9i[l?algt!ZbP|fԲ7mH5L"XtAHh1:]uXTB}ti;),::v׏t}2ەmnhٔ|BAzl5'Ŷ=#ig-NkڃI8"2dN+cEeJކuLظ7i &4mү3q;ea\6[I{u 4o2-kx,+Q/7 e  t =#@@p#6Q'^ȑWrK۔15w(!2,(An# a]7}bg7 3ȳfȖY:NlcjC9# nk.\J{kw@@Z":sY<Ӓ%IorP2BAPؑ +d {z~+7Ђ֢*jA\恺$L{WFӫ/j==Qo vլF4]·_N5vp ba3@F6=v흴7JM__'_xׂc": 09J /x2֍}}eq86 /$ ]%4Rg$K=`6j߻?@[DD<@zkq +MLz'A%{<,U4LG +7RE"s@@}oOg,ím~Py=+xf`z\M[7HS:ₖ׮ I_`*oNcƞc57f[q LLH;Wb lĬUAvzU\)sSή{At}|T"gIReH Y\`/}F<_EHZ O3DG 9.%5#ITT Idf~1ʮHu5fs v9W쫥D1 Eqcn96..қ/k9JvDʬWj.qٰbi5^wNs.#h[ݚa*lQe;PHiOUSR|=&S2?i X`&n $8L7THOU GG P+oWU0Gt(ߘe`AM)>)V^DA=n +״.\:%J)crˢGjq6ؖ4۵˯NswX,$ZɜN]GK%hCڤCzюESq$Rz\FH_+.)LѠfJM咻mպL]o RLM +ޤƵT\/8<ŧZmsY_~ +K̚Ҋb:2mƔFg|#9_  B@x8qYq xNVZa_CQjkLڋVmľ|.N:.fFԸaJ~- *R3L|B9z+#yKk+d} #]Q4qH Iݍ/Bj5'iqRҺT5'Mv.Lci.3͝ՍN2&=H1 +sq w=$,B1,\vrRL%A]\!7m`r]%}"|p\~%5$ 6NEbc>HPFmT$V,Փʴ"d>Yo*SQTjݩQߩDf^S <ݩHc nce4AEsS`3D<վ3IߙHB̞L(L3цLD &SDk ٩ϴK*BɄݩHnTd+CxPB_lK:䰤"|rs&=6XGtB,KǮ +h+p-mrO.w\Q`E aRY{#'p7kf3N'FVS߼pyT??0?߿2_Ws'[N, r*l#DPMflbMǎlN^ pbmN |oo{";3d Cce'o t`0?ats(^i%߄ ĆvN`gjJߎ`S]y) ]B)sԈ!&{.۳=Kr|&z +#:Ғ!H^fO@YQ\bCf/VLXOAȅuu^H,qUmq7Ww#khFgBˠAR76ۑ_0zx +?#Xj.,#"ImSq'b#wE`fC5nYIcHvy [Ԟ%ӱi} Dpjfi^e4!X\ ΁0Aܯ7xPFq1"^%(JIe^Ԍq_՜8cZS9?Pl>[GNZTW-LCpNކ妏MN~Vk΂Kޠ/ uӚX\! u2|~y@-@h ĐtdP~SSt}I 8υր0;ȚwL;3bHaC ЅԍLMMN Տ#MVzMr;LxNGs}:7Ȣ}n"x}py8X̼i^4ӼQ!;썈>Y ! 4& mdxo]1UaTV4ɘpY*k7y_N0k$Z7dtDcs=r d+RecjZSl̘Uޞ&0ZacsDja0q#4\ pJ2:O>} &%9cBTls9-\3,Š\FFH[؈3, v)[J7ݑʣ=癷 ~}zd|TqS= s(d`,w .UZt]C+qYwkHl\eT|q-%XͱJOQWHI5m܇l\NOqnMZk:m̚$6{gu6YkՈL/%S#:;b!5kfםAh&;#z&ތ_Ʉ tje,)<,Q\ ?P FZCSZ7,y.C'2X2VNѥHyѮ80=bƣ(t!ΤZ.B\t ^'\.it)|amYUaqG4W/Ӛ~-X&hE-ޞ=DȞM\IH"@$SX.WxQsGE̳&:.[g5qgkn38@VUD-WUV^S~QY)ʱ-S~UZz[ Ҳ_^tlc_߄ecZ~@k2_ߝ"T"+>S`T"GRW1%/)!R_v;)E]%Ejh6!E $"DK=RR䖢 RGi?n)½8H,R"5[w* ~*[z T#ij`V3DͫW-EjYsYwgMH<̫so0dcv)7\,!Odr쩪\INe9`s[฼y[xFqǦ޵aQ0ki~sXVZ0il,Dve.aς!uZZFe8|x׊LYw5r#,2H~v^,@f'gKzFˍWRȋ?qDe Ya"F;{^ +[r>p| ;4?@ƭĄ.WWv Frt3#}^Fe7'Nj,1VVv^p+I^) .+fܝ+a_nᬄ +QQ8W;8kK4|[sjfAņy Dk@T7j'7j,k\Aqۧ)|& Y3h歽s*fZt칸-TpN ,{ia>3]2[]oŗG7+uS keV_#<_DV7^]q@p*d[ܷVܫ=}M}{?H܈Գ0Ә̃qpYIJ:E—E2&)~WEJ^gLAHz#qQ*ݚ3z֊shQoD\JK9Xh1k|3'!|<bY*E#N9?-ބ j!U'S?BO$ iM*CsdN ++ 9ul),wN9MA9<*ydCt|-]+Qo3" wIP%88\=3 ,->V͔~pT5ժw E{WZ!27n.Dzg\aK/,FkslxUt>9qvڌe 5yLEt8-(]lZy͍F{W\ 9 gx#wswhݦAs얞sE"b;aG2nRe +3oƋ;h߽Pʜ[ed $%֏)^Dh KdşÄ@|'cEV ;f:## +*TþP^]uzyZﳍY4%L"a,v"p`ls=$Sa:Goƒnϻn7\e+^ Jð*yW>0=OyJʃvwTu/<>]\X6"kgdYȵ\肋LmVxՌ,}^D 'MejiOBMTuχ׃efnaܯy3$[3)(yБUJA2w:J{M<㛚KaۈXllxzGs2#NK^^I Bq5Ao=ںﵘ݊W6[FbKfbyN[0IY 1ÕkXۼO3d/060606aUNC㲈gCa/󥬟0 K c֓,b /3N'l+#՚Ob* Yb1{ؘ2vxUb1 v1NT ֟_r?LVO9zăߊ]2/GF^"~_:^<#eif鈻 fo(0}C_\NPfn3Y=>JXh:Rs5q,A(\skP3*]A<25\($Zl\D quy$D =I%)3ŋcO1p;MoOE+SLR]u-y0ηv8gX$BPiKq cegAT kߧVe0U>.e +1=2""oEny<CT[ Hf'`;*kX+xqQ\ko\O!yZS4G=CYnsڲ;,} ͙%֟ +Klcfxɼ9@\'VS)| xZ8`<%JHTP>1] Vd#A#BjLJqvF{Xsl!e=|MRQ;[|z}%,ٖrba\wՔ8 ά=%zf5&4ȌP0ܝ{P9Ea*+w4I-Ȟ6SegX{ Y/ϼ=ڕ^X?Bu+sX%Rvw:/sPGbȸgҜcEe *2bC[կYz+υy78u|T)#:!WσiIV8c0lP:\ 43[Ϋ:2Ba˸̉[fZSK3?QI E&8|-i:Ҧ,%#]fTut|y(W:?K nyΑlr'!}2{M3{YRҴH:yj.ɷJcG+y lwFGŌ8;;zٍ7 +aXxU{ҖM@Q_߭FUeM@d_@nƪD9lyAd-og}>9mO"3AIdNO#M۟&Jyд,2Pn";D/e$28vi # v2sp\pSFd[vC`t d__dsg7A"[QJn P dXT^@Q02=^G F@]: ]胴<7)9 +VOn7'!*KC1eǦ_ ! +#ɓed=L@Zd 2[Xƹ5W +(#,|PkYzΏXOd@88h󸙚M: aJx,V;*qcYަ-qB3G$k D`\5vU+AT׃Td p8y8viyM>x`ik L굲9oH$*z:}˜g) #8'=+w$rxJ5.ݩMSdoDA`N`#9lY jkWD$_Rzh15bKhuxܽ/eĿJxь7̡a U/>(;5d5Ӵb\5e߯vtuϗַJxZۂ:X(x6芎@ l6K F<_(~6-3Y!H/p݁D6!XbɲK8@ +"Z}OODk]9Si#`eݲ3+xOKD̡B!p U%ztA80ĝ* aUA0 3$WwR>(fDAAdP n)`1nع8,舓VDwFN1]@<-RH AÒT/cFрA%:ݳU_փ}ŝ[u;ȡ(CJDM}Dp/\4J!4D>&uy7c [%k끘EdPP֞2 +lSV ӈS5fF",h;b܈%.Dzh2Mz0)[#@YClOXG(g[ap~ `=Ę~"('Ҷ!\Js +kHiw ?ӛO9ziVh)A]a 'Ų> +SK/+Y RD 4sx|.%3O%Kh+#^K3Qie)SHj jwعd&ugHTr݉EsbӋ y/3Rmn,MI1ÁPempٙVI^^8X3`B ) ԝZ7d݋Nv Q#EIYHN Ѷ!s@-^B|R F?ctw)9c_"Tv|~MX݋i~b3|{13ӌ*ӌq1vOaPÌMDz~1d|0cH0cG fL73Fi"GRO3v ;0cjӌqKÇwj4PӋs!qZC~I=!5}Ӌ+MŔ2>O3aWb$OxbËQq| N"lӋ30YdQ/Ʈ$UvZ1j}p[1<|b`wm&|X1IińoO+v ;@b)VlÊaub>!>tbP‹^db?|z.SjQ^LW^z3ԣѺ,7E"Epz05w!5x+KE]ӑZ}O0x^KZa@cNCJb恽K5 0 +ȇQ +7SPjˠ%^YlW pm!>,`=)f)<t}n23]jM%s1<)ʼ*}m_+9a~K=v";>1'wGI.=-}D AY!щPE:UY2TxqtH7͇%艳5g$28:ӡT3E`1CV"<,4 z!YA_fd4\&Y歭M7 :keݼFove"p+Ō/Vnַa2M5|ăqc[t=N|YnŹ_bXf#-oҢ3-;! ;bwjiJ^ւH[k@WE5v2d= Vx K$ID?v#Jx~_jױ츁Äv7*˙4U$>ggi1SXMg^īҙ&ԈrZ?"#}X +߀cÎN6B 2Qru[o+z eryl)?\Xqx zH7󧛟G;Qߩ=){e[l0DQAG@իq;8"py" o CF1^x{"%+-+e?sl׺31⳥vU086[%dB%X.8bymƤA:zc.Έ!XXC#1ߒȘ' NE$ Ad5]aO^}tGj*)`8VZetA)PB^-Dd23HOB/vkOQz^ʹ5 +֤P%׮lBwlWt(:#Pe-?ע]f1"}/ª!Dڻe(T@Xa9(/I}G\Y-cIRԾ2%@2N2Fa7WX hS$";le:k\+^yRwyC;֥ׯu8J4g<DV|T_,naqQkH:.6V5)8K#w-jxa} +'"s,U#?eW\\4T%oFNpLV_l^-^o=ig,w>D)c#h9Sc#GsԺ€qGкX =W(g*;smteIBנWV-Ubk6"6(}D/Yg: i7Iø6(.Mv Eү֢tˮ3h)s]U,j2,jiw2 UEOdeKPrƸKCMn7MƮ9 kHA[Ϋ>ZnMSː֔i!yL.ę\\.f~YOH^7Ҫ:NxA=H4Y8Vh\9_7q+oK~sI}8$gX%"dMP$LЛ: $wDɴT69Q},"hU8Hʉ:A86Wv~-|9Eaߋ@sܶJX\U71lV{Ws\ԶٚW Ò˸VGF`3yEnusMըh +A74՚O?joXEz$W/Cx]O*C9!ewpd֨9)9ba'ZTHIW&:Wg y& +pl+:Swxhz]oɳo77"hI@udIO>|39Ȉ܍p  !m/̻"3> `ŶxH2I2#ۮCA^徵$Siju[)8$U$*99 h!<7dXZ, S])0%qJ2* IR"SŹNETu*2DJIx"Cԫ3W=b=kb)<"3_AC20Ȱy_>|ͱSI-E3Sq +2~]fC)gf . (C[]%pU%(rAS)B=&C{]IEXLHӚEȗe1dG\頸>VdVd$t=%ٓ 6%5 d%ϜFI=~ " ȯjY.oAN/6ӥdnЄYuՓqVܻ&*†UVͶ:͏®S:1iN5Zduؖ33В x_ePqҺWAR@ gmSdPRD@L)2;?orN)+_ж.g e҃0G_r++`y]Qh81;*6׸Cηep'c,(7(9ŶΓl8Q=fgZl7A㷸fԸeوuu"Lp:O'1i^pkHAIw-u:&'~"-.M.w6(E'>oY3JB%A"H^foRFaz +:θX?"!?:5f%%[:bgL׊☕.{=؆(CkT88;4 ! ]P{M + 5 Y)e"{ `מQmqlU2++^VLkfGd ϽF^ߕέS V|gl7Kh(.^H+eC5oDUA5'epXfK[rc"Hĸ#&JI(2E6 ,q;^,bG]YjX@HKeJYh^nJ$~ +2]7ɂqPe$3V 0{&zv0YFT6Y(E 9z꿯!s6uu$ +Rce'(et֔X~*$h ZTH4++ ~W7$O䪐7 +a=U*EIcypfflT\{ ON{3vQZèE 39ܑ44mcuͳVCA4'>ږCd.hR{}x/6*7 JXG߈662\EbES!]3Z =gb֎e'D8*UN/gMODm;kX\Z e(!//!>?Ǵ4{uo02ȵ/8YXr&D^J w,LG׮e Ńݕ <`;UЃȊ@"ȝ2sp R @ $WC"sVK8҈@yV Koƈ:Tc#܇Ȁko@*˚ϼtcٶ)5Odo7[eR;TJqT VY*{ŶDIj6>' D. yBVQ} Q+4}.u{eOa +M!ҒK 'hWC/uo|-AbH ?=dR_-4ҾVz\"dJ]Wqп8Gnq+*~ﳪo"zm j夲`5efDaYliDbr.! OъZO٨ؕ +qfGI:I6/Ks`vQD,6zg:)ch` hmӨQP^߳fD/+.3xH@P,5ʓ!K~lsQSW/%gZ.1 Խf6}ѢJ> ޲+igj N+E\Y%Ё"tn"4N ?43K>}X%A0{I)A-Aؕ{>$hKnCNQd߭Av2igk!isn.ж5/iE׼?d^ +endstream endobj 114 0 obj <>stream +HtWl /pCACEg| ' ]|<̣Q-JYdQKEU^7\??ޢF^<~@{|}&d| 껑P=wռX.Ϳ{҇K_W?7_O9s~1;^ȴ@HbqyH`JmŪAۛ[kHiƽIR@,!ɰe8U{5cȲz-lGi%FJ'@5#:vˈV syigao6IVSBʰ2ɩ29wR'8rT{!m,G~Ӟՙ&swç̪YYձ@ʅY +`qj˲ Ҍe֜,y$ݢ3eϮ뎌#/Um"ƕx£/ux$dI[zJkG^F4eJ#) &ZiؔliUݚ|P]YrsNEy̡U+ӣ_৽1_:wykS͔Qnl&jLٕp=`Ao_]kl&)r{y":?@CۺVZw<$|+qz|ʒ0o.IMLw8+o8'Eh`8U{0s^p[irŹ~ 9wjy#^3`(~:AG +][k&2%9:% J9[d%26-PHWU=Tn;rjFc 1JuیP5#܇Ѣ6Rd8"k\A=s@:YKE!!\F3 dȪ\̬F\xeZ/7||ŝ[@B5 U:b !W wQ-/rܷmT+SDweXL-C4̦cm:֒-("#ASeS9K:3--ljIn'j#U#BZ٤jyU5|2VWi.װ@UEq Ya_ehF="g+A^baՎ1cu-m,w%XW%gݮRL?p 4BuW!Baܒ3*4tT3"c3qpzl?D"(LwD6(<* Ş[^G/E62 ]oZi6u&P<2~m&V݌af 莨)m\ZG1s5-ɚ)ݞ;ESF%dFdm^U ɝA!봚lDǁnxꬍ|kbWY5iT]gP1ƳS +xcpK('kyO<tծk [&M@ʸwe?3hW{| XR|Ͱ[+S/wW#}M#2LghbHedG1(]39)i کXWUwV}1ߢ2>cez,*$`01}M47Y%&n7m=G w;~q\emc=+'&\ 7X혫>uKjp'^r/ٕ]1Fkf]eJɅL~yI+YTL㷋'xŸ?:f8`5g'1[$(zc'ٍ! @'v B>tvd AM]x.781%nk?mQ&B;PGl͏c⚖Z(D|N:Iz.ppb`HHt&ZD)y"5 +IÈ#׾SҥxT=rg k}MT}dE N +4O?`I=Mja&Hbjs4\F!N\,UZy:88cT#dZ큔\6bS6ܑb*8m$fݞ06GiQt0Y">5$b V'JrDz>,MQ)KFE'9^g)Ϩj֐]CE EH`@8$TXڊB1*Ev{KH r, tқ(Fz"%yt=fژ5g<;G$01S|+Q4kٲU}2(=9n*VE#m?>gĸ@1bC4,u*ɞ>HU<$P7DmCèjz4b7{D1,y&}qo.Բ꣨ +'[6C6ࠟY ~#G A=TвFa_>E$Ç5$'ȱC}qU#cFHcn3|9P:F=sXv +Iȼ\3bUyWqv@rDQ9qˡ[0U.J4 VjWވ c;g,^ͮ2 ȡ5ySV!U~,W/Eu rh񊔡@[xzsDuXɸi8_w/Y5M]5˒i즞#.#y#2]>aIbF"]Gʨ`' K {̂CN~,g̀K 6P2؈mw,I2N7wY@z[B.q9=.peMw;fOZ4aޗA`RzR9F9oja1Hḡ}|Ǐ0wxNbq2]qLEȬ2V@CSi!(9+vBD+$ADR0!X sRy!"0Y=hʖNDZʓ&MBJDͶd'"PDīD<_~CCƙ_xt'!VD!=z:2z!$IF:x!\f=<Wj;yS!iՓ&O:.P4_АQWCp|N4yTߊ7 h[<擇8/伈uO;Vuyz)A9@_Mgi^b xm)L~u4},_yG2u.HkMP65kEȐ=۫nmDrqCAyjkIlXe}0p37YcmIK)ù_oǶم =Dz]Fi'$fMSM65AUQR7l7 ^-c% +)x7k\vebuDLk]{Hj:-XYߢq" +X3"QhήYιҶ>¿*l'?M[SȰF&ݝT4[P!r;%nt ^2"kĸ[]#uH}ko?ά틚cJ퓖?1yFR$!/{gU1ƍ0l1<ʰL Ċ1cGgo}${" v2;i VflaL} )i] 3%lcywUN4|EY׿e׿|ϟ8Y. +?(QW4r.!>ٍɴX)ɧM`<~eZ?T J 't/n~MkZ[f!=Tܭ Jak>"R!`=W{9w):OdBEOɓEX{" &#c!}l +B!!`|8Y +L1"eq 2W}" N*x2H]q]<607B;9蓤pw97w,u߾ZI-bnϯU{nYH=Y[BV(lm#jT[\.3T, IKAEJ\CL$UD zzD~t6iЏbh;Agҙlٜ30f iU{ @ ]uʽŹZɹ$>Bلz;2l=*HbK4-soBrZ,cH<$'؛S"2*/ZM777EъӨ?QH-tDN6"49yDrw2Fˊ`;SJ5V0A~[e\͆4}JE]ҽ\ ?26_kb}b3.LFqYg].tYJL6LbO ƼGV ^r#AVG<+P&kv;HtIv!qq){K8MzFY*Z ܈}\96# 悸Øks .J͠RH_٪6 ^`qK@f[k*&:l+D1IE۠KX&F_)K-ro;YVhٓ~mlIJIrJR[D/Pa,(-Ҥ4PÇi$\ϣ`F4z.ԧf<3ZŠl(7͇㉙xUuJd, +(lB6˽n-YpoҮ܊_2Z'p@p[7rEZ(L.j?juh~@FC= ͆'"WpY3Tţt)}A([R + +uo#qB*&}%6B&yef+FitZGQf5%,yJ'=~ӛ iTb^3N}O'Fdd=<<<Fkv4en k~˛)c͜{4e)%FS7Z{3e ,n)Ӕ Me4e~))'s͓YΏ'Cl#iN=s~ROO<ʉ0exYɜ9坞 ٬o `'8=[(AezMBAg6tHrVeYZ[ Dֽs#4uˇ$GЛ8]喃+jh[dzZfRDm%82J\HZ"e0u +JY(pҲ'"lk6nw.ֱfܐ$Z.cohYA1߀p~h'_`]Z +% %- N1odPjֺWXӟBމkԆޮ'rsuO4+y%Y5)ߕ!xn۝GHYLm/Bhy.}m{\J>^ >{ܼCБ@@kE`?.T|6߼XGm%U/?H,/@)Z*VsY`&UrZ~n,ˇ)q1 ZܲKDCY羲l1gY I阬"2E2%R1f b̒> !'3VxʬcདOy +$+?+)rBmtb8udΑR* +1k+k:U#dyoD AV +&܈Y1 0Vxp~hRydZO$jv紒u3C- rZrt9UrY,61)(^`ؠHi͓r8d4VN _g6)Z"f, HNwP;"3ߣ'|1iF2}Dd輑X-0AG1 /ʍMV89FL\$Ju!:R.'r'Ί8ʨ[T~Xkc4ȷKW\}_(c6Z}j~w7VqxH({DgJ&qWpHvPyqiفErEQǘ8bk8Dj7=.wKvɅ673ۡߛV`8#$>jqoUX7>q+ث{Y,,A_a0J:Ǻ1U%s+KTqsIś񡔌HnY25ə߳2rE:|ȤeҘ+yزOnSgx +I-n4ẉ_f)!qT|0Q0 +-e7S@?qQ,V1҅|\cKl!icL}*T[Wfݡɍu8lfR\i ^\Q5v-O66W ugSeo)\13W~pX%v[!P* ʜyR1[i\JۭKw*DǞ2kV*}1/riڼdQrk]fJɬX,b G1Vx[EbA^WzyG!rh*LsSz*!ވ)3BǛ{>534 䵬C0 +&3Yp Ʈl53(ڈ3E)̩`A#f .g5<goL3V")l|%?Z3q\R"fD-S>WbO k(2}4Zc(|c,p WZ6 P f1E#4)o0,qPn ('Svk8iQ4fN1C!1ʶ&OE۱ȧ)'yZEcn5ıh1Ic4O14#:i 3fynDS +0aw ߤ0P)a ޚl7A,0] c0dcl54fN +rE7=`,5Nj`2׹ QžsӘc{dςF_]B6܎9 kGѻW>﷿Bs,}lӽI[j_[ĈrR6|;a3 CIq27 +T#G. "yk 1-z[N<ΕI+@>ͶşOm|?i~_Å*@{4ulᙉ*nftb +~ :ZN> IϨ[04u;cN'F蒧I}J4W'/;A5A<>N1"Qo(jikyq2BN:9;rG`PȍZ.B̓/Ғ2D|8OL{Y^JtP_u1I|6bY1:{ B8cбbˇ,Y>i3?e퍗jXf&T7*{WuZѳ +6M4a+'(1&HQ2|L418SP^np>Ɖ[;LEdWǐ[1Tܢ+x e7́B-[kZܕϝ6FU! ՚MueIk&N+ǠᾒT Rmҥ.V.- ۥX%Whbh~iU\MB)>K%Oe2*3'(|J5J -\h4g, :܊S{x524H渒螫eFծ>O;+304Vbr,cQnR66{v\ 4>kumk3NǫXR895<*(S&Yq 1%[^=-7.zi$(si3\¤n[-̼qNMx6vy{kr04\Sur2eG͛_6[ aZv"aEDkZh[Ǝt|.D@r%vUCn +e`93V;EJF4 Dh8xf#vӖ* +Q +jyP1[e\k|Ej0)gz+~dV:Or]27!>0[m…-&hu϶u+=]Z+2 [zi{L!6 N^f>D6 +W:_?74#k-7cj|:% k,YX}\:3 WeBEHސ66mmf/^hfcHKa%Sytʻd9Ĉ͈"EC_bϧ_ĜQuĎ^"$MKe +$$K$b-dʋ`v.oY{ Iv۹H /O{!dnr*X&GXZkO|oE4_~qw_O>>hC+霄TW_!Za%<~~@mRg$^jb=;{R*-uQ9?V0(ʰ>nJ"3AwHHuAI% rA)&R+D@_=9*2ɦOKS+\2XZ:f5ήZۓt %Boy3jtcx0;mFu&j '5jfOt?mzN"yGi Q`95֝QObS FLx=ҳ'Zdͨ`ᝌopM-pu3۔ @TQ9jɨw +/O?IϸJW46}u.U&)*LSs_݉ye m/>NVct@/%8ODX޻5yfߨ=E_Տ?U߀wy[oXV} 3\L|׸%8qE8FZ]s`DRiyPij{TEN+xzW`t EWGg4fG0A++JWY\Qelis-;,_@[ǂa202&CjxHzx2PTȐ1JxlsS竏}6,U9K/K@+sϘ.AOQ9Z'&χ(~}瘙%Ň_)&Y/%zsϛ~%Ce `WM ^=!QBl܋[<})5UfEbUg2*E F(OV,5x+JNqDXZ⪬_XhEri: 4e s +Ky(ܑs|DG҅;sP4o!2fz,ޥf,L|' b¨w+/R,?4u`Do$r+8em hZ4vK彂PrFt"3eH_tEeaɍ8*+ P(Ǎ:ޖ1R4D]f2+o/޲ܦ +7\/v@qzQXjCLQF` _gE|c(W:ŋMQ5jܳPZ*ؒMUMɠ1}Qإr#6EG~ o^>&5WQH` ??d(VCKlD]"@vAF'JsQez+ ^=amZkbF27WLZ=R!Wo/f((FtMro[8n@aTy_ӕ_A@erY|-^J$ϣT\d!O\DD\&Ģ4I>'3Gnla G(e B) K{!4ٙUӪbw'iMy"Բ.O$X2/$@:vL]O&č[> F⢨3}ngׅ>n,"my$r50XP`^Jl +Ye .EܰPklY"9,aJܢgWQU%4I#Jrs[SZ̕J }RI+sGz|Ƿ? :s݊__`RiVP~7~\?3MxN⍠/9wF ^0d0J0KԘ#Rd &z1TDFK7|}Xcݽr8k[31 ׃ũÑzg+bP zƼ㪚KG2 GK#(T>:1 6ИFkEFV] j(J>IP#9Pcd2K]G" F^X4#f#Q=4  +ToC%h_V nXb~I!ؚDka 75_5 +gW Q~bm7 TgNŗ&Zy5`}6Oܑv=`KmNj{:Jn߾d8kd`:0ۈ=KX&BYR"<]ଃ2@2cHhޔ5Cz%` bԭHK)*%)[d7L|Skc NK2?n uQPS:,XJEn˦X)i;}U46޶!O TZ F!+y$5űH+Վ)  ;| "ȏV"Ybb;H?o.yLn~S +WLs/38aAT \2WX4 g2_LQ <%?KiEj]yk" >bY + D&~J =?צ: Fhȅ59ͨ 2]RU1%s$md (^H,jH<0ӗSs @4eqvUL1"<:%aڶ3M10!4b"xTu_)ޔ`R9b`4;1\X Ѝ3( ]3wy(P(y?I:$.) ɾڑc3xma#8]b O+o;&R̦[mj~e|8?^FV +0OITO#idN=ɟea+q=SD0J'-_isKGjsRgHmEm5`ı:n:Ddzz96lweQ 3%SLZ3c?!n %GWvB$Q6"v%s~cxt[~J$Ɗn٠ >h dv/EM`KoDk +D>`yc RQZ%~=.M'ZS 1Vs-"s$!ղm8&0RL:m=ٕVv)i-'7iݨ~ A|L_>OA Xx}pI̝͉K9^&ϔT$]*et o +RA*X5$zRb>vo@'C^&>(lIK®s*傠6ZO,ZH3Izrg4Zj]a/ŠQ>eVCD8"YHQά±I U9q|Ƿ~~|Ӂ?GX&O #o|Wh@C%R_ϋyw'޿{B29KNZC.PX- A z +m_nNFÒFcADgo./c>  #(&$#|OBle۵^G"-#h86+2Jv[˚7e uˎ!F6tyX|rb@ DⵞE|=tZ%D>yvfl ۄ$܈ٟϙ"AoL2\5$ bxpZ"~0NQzDE vtjzfUc$Q^$xZ 5y.}%D q;xL ~ی@TfqL,wU'c=TUVuE2[U bcZ6 ;/.VA [ai}Om26̍Tb*1%4!4/ Rpil &ʨ)$"%(|Gu6&VZq qX NБő௮ ʬ۰4:}XEEچ ~qj$?ծc [&MEJRqtJ0J:jD0YITTnQ3QfrG[Wz#*#|uwoA[jơ'[c0U|a <ix˽c86`p +hL+@8 Q}$5ѳq}K m3D4ֳh}).iDĉ: QWvP-iSeϋfd"wTacrUoO{_|egzKP=AnW@zy$t`OOxeSǙO$6Up=I ,5ZeW+i5~8# o1'͕vK- L9Ŋоmθ<2eo`[@N-gcXה}%_RJݷ44SgFH˼Q(v_~6IwLIm$$o +r=gNC*ҹAsVڂ>.-?^F^*ûL16׃Mb5n"G2$`f\3jxQZ^˸lH%q6 PɃf(EMYZ;Q,h&Ui_N#YQPrANA=ˊԤk4nu36L4cdV 97py% 58> CտRfmZOϼ.~x2He+xnwbg5"Q_ pɘYQ>g'Jg^|gZ2|wOQ˃\_}?: <2.du1Nk +/{owg4 CWD?^01; +rl!6]'kA3 +2D(G +w{@U}Nelآ{ gKo2' UkSQ;q j1b..%"jg0D7Dzj+h',@whFkFq!׈ѳCDz"CmUHi=O)}*B0j{݁L]|3t /lƩ̳i۪,#! Jct ^_+72YN7(3)♑$uΡO Z6}q3Qw~c=V-KD俷抢L|qb"4QM8%W3& ֡7VGƴ@͞)%!]j9iUW||Ǔ= ݞ= ~wrؽj<)xM뙯M UcT/'l0:M.ѩb9-gjeI51!#mPNA-e6xF c}fTY˸#/Y<)iy̭!a}qW3Bڙn{cSŐR=M]+25,E;hlKpBXNѐXh.9ejv%aǂ~d8ڑ8k~}|1\}|Uo.1 5)'<[KSCY +Ő6x-~~`w_QMvCTF(o*'e>F?hO|,w[l2DITgY=KjUnmGSؔx:xooARU bLHHrԒHmmw=ʟ)Z>pFJAs yY}eeV1V#f?Je2)9 zx n3h ~s,.>~o-+^5ԋ+]]Pvݰ 1g L^]VOiÏ?!ERtַg@]}"99&n /1^0.{ Y\eR'O +6yf,*ba@m @ d9GzuAdhȣj /:΁iך.P6m\@Dbz$".86B^DT$`RJ,cBdqgT t`Mx)18O Z(DnჀg  c +c*Lv`7wQnsD>w'\AXVT%fD2=<κ[ZORGfjbUc{ͳj$e +AeOo`@_M8, e+u؍`npB;1n2VzGo.g +*rfv @ZՒUzw,nZ5,&d8y <>uaڷLtOfڈoGGjJú!_mYX ip 483*(2 +-_` u:9zYiEQo (]`مX+qO06H> +&6Aqp%-lQyaI$oM<^S*w?4Ͼ 3Bh7ߐm}^3eD+jp|՝@_`ó_5\Mz]CL5N=D@|ESwi1WbT.Ƅs}ɲ:WDCNlc_x9/APj)}b2`W;6Q +񖉚-`R5c.V4jⅣQJ"so=͕cfH%zjPsUˠ2ynNFrZNn5 S)}p#EUF_߫xs_BRmϲ<&hiXb^X'^s?TPI$-=`YBTI.l"3٢4"#i_)I^ٹ +!P{ S<XXKЦ/xUYmI_G,M&YYݐh-!\Ii< o yRXҒdߕ4I +~s{e[ҥA̚q$Bg-% *4I묲ot~9*<ȼh#\]6^R44n&!U-}i%.vbQWvɃ="QܣTHS } %o&J.Y/?x??MGR Lje)ͣ8 0(߼wm^< ڿx}x/ e9]2?Д*N92#DyPV2L*$?G;i2euXȀ:7h3)egLw|q K&M7;_GkwV.@(ISËIB8FVw$h zVEBТ}w'@j]zT|ڞAk p=Bbи-3Sbx!nF//lbƣP3Hۋ_\eq} H'04xRaW0 +H07j [ ͗G ˫iV$AZҌƠhEi4N\[k&X.-`&zP+$Fkϫ>stream +HtW\I +-:٠UPU߆-M4mq8n_[p)8yױ>]tl MXo(ȺhOdιaqEFWq)r+g$&*fDZ{ <lxYfx Wd<Pې%0@DC/ 'B26غ~23՟648q"sTlfrcm&#CC +@z儆3SADp!d/Th?1g~ϟ_vko~}+?{qtcvnS??Cz_ >ΠF|=[yg G9cxuc@[ +1sp.ZH:RC<,vbu(ژ`.[-1 ;t 99suU!+LbkMyC z{xrlRLz!=BP@VPd 3ڧnʘw28i#Syd}I~9fs,J@sbr*IvW[ d*b݋\2&&GףXψVZ|{F*79h.b +)S ERܷ!EY]{$h;g6Ոj hOZCKg$ 7lFL}:OT͈Tu;}.?x}N}lêNošTl w^jRtuӨЉ>0B P; +eHCnSПIS&*6w7M?K42/?`fՕwhoڽKRjUQb}b9\+Expzi+~y2ɱޞ}l_؟[7 ty](;nˬ[OQN*]LO|\]ZŌ95V:ʟHCa$bɭk3>bb˩H9PܠX)E-dN{-#z[@FaPg-þ|y\hD.MX4_%Kh/~ZƂI +~ BH5Ԛ%"U ʮMYc=c;UO$cq14VuX)b\ ER+źǀ⎉N>1}[oQ6A*}DhV[} >&6X؊G_+ zckD%%X031b{]UG֜ʥ#3V;,Ljqdn5X26Oڊ~Rv٥oϽǿZ1&J7w]Z3X㱭8HSZF6,)XےDMSC%r4}!dr֒QH5gU-|n@ ksTg_hi-]UZXPrBB]j5A&ӻdZ&hl|k<\<֝d/g{8^ޞ+;9_cǧOuqd>=s޾z;n brZ ŁUo(G2 oɐy~ tuӦ;~XԉFU «UëI/j"5(zA p" +K 8mw|ψv}_d4o84G,@ޑM1g v F!gOygi??.';|}43]@7(-+t7OB3sl:Kā4pw1q WN +b8WBbN5kL$@|'9PF s~m4֓C90ѭooHYsVm@^y' QZKB"-d"ji!"EʔO*Z1<+b43-qBHHqƕ;4>QRչiJr|X rEJ뱰Z੊,Ez:9" ]恩g<@sƷS%Rѱ^ĆS= H +s9 &`i*3xJ +Y/RŠ~.#e]bxEf)OC}C.q+Owɻ'3GZTֳ su$m`n%JTv~ .Ş9pح%Y$;xqm<E/gS&Ĵ _bLUW:ٴWGG˞Cqae2<ACX?b0Xދ3A[3 Y1G$I{p9d XdfSYbs[jďo gCl0J۩dSp;ϊ5]it ְ侊T+?Y&c3JXBgҏ.>Xz т7.$JF&#Z>^:Ci*&Vd7520$Q\:z9B$S5_ǽhη#zmqGG6,M -m5NMjrQ-"J!V'urqFG(.*;b16^1> +C9ע²Z~RO?%zk]P6b;%[އΞa؋/7"Ee֬Qj,uˋQצ;(&5Gۯ?Bo }6=dLnGB#xsPf;3v|Q>ֺ+vl42¸'=u_ rԁ&t 6MRtbO_;\Κ,wDq;o6=B}?)]p^5bf #ģYy.Y0j7zb4F18܁HEy⏳~\ӖwfRh;D,msD}v*D܆kYz(d[pa5n?.I|gგ}.| ȝ(}LN5bs5~xq;.T-{{~ COg&/닠&)#/f\mvTp ^jtJZ!tӬ'5>|0{L;G*vJɯؕ5ioU__wJͷ=aB +|{B~j9̂.?_}}ƚ@M܍~:pLz'b_XY!Y2sk7 +0#جҬ*6\.~4oc4[BpLsZ:8qDw.G<83F]DyXy\c@e@DB-Z~x]Wyvd/' 8Ҩ"`4҈(Z&{!ZfFG=k2* 01[eEś\_3=yxzG,;#G9GIP΢[R5gBt-f?yٹOct>ȉS:bI"ifnDY9ʣ$=3o.I9KIؾ{azrksdX=@'֑ig{R}^jmT6r#W0@lNNg)Y¯jыkVt%ca )ǹ:ۑt%kzFDow yGؒ?@ \QE Ţ^2pamMd]{dԍۭNw(Ycjw0XNJjp)R~zmꞝ+=ytuJ}=ɫ(y9&o_.9.Y5뜝)4RƲeU衸QsE?v2D|k?B= +#yiJWl嵨㱍ssDA9bgR)"ou {(dwx-m+fӎp|\d* >?<ɯM R~d p}z4p^&!(C/؎U|2"h^$ԕT;G|ꎆDRm6[0AكL\Lk n@_QU9/$ܠgLAB.FvC=[:݁[y":_P](̓VɢL庾W=:ix4cuyz,x35dg3ăӔ!A%edo&k*/vES_H^iHW/pfLa ,g`pA)UD }SB6VYa5CXR p^, +0nYי mt#3d^ԋg(-}4X,UvǼa>G$fO`U& ꊗi%N1vI;YզJ3טoHr,ɣɦ,ꢣ 6N:Bq#0"IXtWe?p%wzG;<OU^o 4kZiXbrfbl^_bYp7 p lKM =Լ 枑GunG87qSؓMu385?..{L +(] [8-ի*q-|.oיxOb k~}MVS +Z [_Bf}ϙ@> ޽ͼm͡XuE{e`:"r\S)XW&h!D%o*Kަ][= *pLR}Ƕχz鑖5xNkĤ B;nb62`e}9*k"XcLF$JSBd4BcC1:z%c|u͕R g{snD3a5mY[!$yH];8$ܛ%bxs4}=dκBC'#u 3QGWTmfj+ Z"3QtTvm"36ittFsNhZw-.n!%):9+r:3 +3J +I`Unث2fdLکʦ~_.ZXdvgVon!fkU*.j`,|`ANv2{*_eZ[[OQX<O_h*__(/l e5g >wrF"PSYLd,O'qPc/~ fΌ$`!-FmDD lzH!IR: fRl9/oփ.cG=T@P8{(`_ԡ4 IgtwJx$)'0m_<Y=$G| $.|XNi ;b*U n b4v AIQ$JMٿyaёYy693囇C;ڭҪj1@RiGIU!;12z_^YeBGu󪶊^h:Eeba8JuHG3 Qj@]G9r}՛ӾuBڕA<%T׸5SXM?NqFeYP4+rqhT O,,RyN(h5;dW58˗D-ԤTֺN6&ڏ#b0Ndwb7 r+5CRQCXhЕh\fQm3kƠa n-zaG#tnV05}uKf4% + ݚI6.:34&Ҳ2 s܂fSZq9?u3=sA谌IҘ*[P s#%Ƞy@pZ4;wDviclA/;f&\N H-=q~B@QGo$wuQ$E:&e0"qeTZR?=KݸL-duѪp¬wfs;VHD2 ۏ1笒G5 Ө +!Xw8w+Zr>TuJ&"Ҥ/e&]ɣb6Scx{BKΚ[K"H7۵H}ݧK7:GecP5wp1Х9SzA?@ 1ᘿR+dƅ|GaE{]Ū7;q#)V|P-ͳk؆G5+`91+oŚ&v/A|V N3Oe34+] +b\hn8)-=󴹪}r 7 !V }=ql[L iFuV"c(訌=5{dl<^}$~x;7u}ŵaGʊk`*q{E[Egk__ ${Snv,^j%jW0Zo:qXLS0Gch2܅o,mIH +wF1y +. +3MZ.Qv +^1o&lkbEk[@4ۗWI3lMI +I üpҰQ.U$ =_fQ䚵O#P%Q~@2\.1KJ!-:g18~.j;dD[D]4D pC^T^MC+fm\DzU&ߦ܋!f}.~# ll\v Zar|AA]"8d)3< [WT@zjJ{; =u0!QtؽͫO58/}B^ٴZ4=)%|2?Y73ߐ 23TcU{"o6;wdԽ5!JZOL-!0̵,U )"M|`er zU)ul>űRד3eHf(buhVmc[ZilT2J}"Uh_K0X/%c-;^WLC7oG|T|8>:٬g'!*ߏK=!* sH!]ElQ<65e<5h)=sElyM}Ȯzv1נ 3dZ m-eaUcVhub͌hٛ](V%(i6F& ͥ8vX+4R1Pa|ڏ{Ka@(6v 2=FFbJ, $#ʁ2@6* ^~ _%9A-J/S~eg.N~q`x?ޘ4뵳*TQUiUϙU԰Z@ eM%\t +UKZUr? ګϕis渾ٕq#\K&A(H XCD'#P>9!O$ 1;: nl%XyU?v,)MvXk~Erw:v 0J(.rŞFսc/ݣr@!YZƶ..O ȍK$$"jz@a.+P<&1hzEV[W/p_J&K&tH9_qhjO$XM)DdXڰ`'j$n*k?j`5&`{!ZW\i.u Bޗl(Y9./h;oC 퉜^A?(7Y5/@!X-@.m9aUPH.A3Da7!a%Ii1jDor-oI6]j.֑J3ZB?;5wM;ny 6'~R]s<缀z;Uiw^2]\9d$dV;}|oR71SAgÚ`R?:3T(a6LE©Ԃ@%41f*ب4+I` h{1lj~x u36_)}YrfXKۘS[UQx#+ߘ"C&o'c^xl6Idط"\?U̟֞߿2Wv1LN*K9!4R!6_@y1Ww:hm1Lb,(.pR$X83 t9,X=P Mc64/-o'xE':KC-u-m`npB;YHG|^ǙEVO1S#)>Šx/c{>bPtDzyl ՙc\Hďr MrBBZ[X\.饇#v̖'yRĖDVM'DFשd3ɤ5z~R ŊdDV07tzMWhK^I\R {LdED~7egqc[<*i +PWVreU}{w>gZ5W|ڤ&82{H`}!*﷩ٍZ\xvgy x-2O'X1ձWhr[dUpT򊠒 +s+FCՕ:9Pը BZ늶D a*pug"9Qhg7!)ߏ͘K0v"XhhM_e᭩+9ڔ9b8bn7~p8lBol>^Nǐkי10F}Q8*EeҲʑC*D9{iQ@*~93}K +w̶NFcͷXc| UU#׹ǝxRDS W~WAwʖ0 @C )U1rЭޏ!KstB\5eʯE;>R"CԳ%n~[';&ճuV5cw2Aǫh/GCG j)ʿ,&!W9)iYՍ][.p,Ÿ }K!$"zc>\8w/:F*2V#؄2lϮ,L}~2Z;䁯Z>=G`ÎVuLm.(k>KZwIPu-OQجKe`CLf*kͮ*|`'´6[2c<i7_Rwӵ"ddfC)=мsHD-$~ן4^jG)9VBK`QD//`o|/1'k +g t. a0_,P/]# 6#H\RF"c7T[}2P0*nGL;UxuRF=$ $dH]śo9OosTRoRADceEs`a/rT^?%uSc09”Cq~Ϝ|)sě̳>m/ M>W'6q Amd"фXWѤE꓎hbԪLjIYԋDȢp{h.P#4E7̅O}Tb}Ou{a[3ߛ2%M")%Mn+`uvhZ|yGS߼kpv7>:&_h$(X[ag#GA 'ʘ6<+{XhZwI~e^tlfkLC#fK/rs]'Ǵj`e!\?J|=+dmeLM̚hrpoՐ[ݎ#v + :Y50ru|0%Qbsk UH96@ŐP^I84s \kic͠œ/U⢞pR8v .ǎæeiƎΫhb ~DDNg*N*Kׄ +BPڕ-1zg Ά3}2L 2Hem =`rQ`;&GΛf?5fCpU]['J$3uUc\ȡYf?D$#ykM( +5U$9G=SqV1/bҰ>aY/E0-Hs=Uemȯ[O(qvdeA;[jj!eqmdgUF{K:_<6*ˬg޳N[rFZpJD 1O:ë">@ܧSb!KARR6\ј^2li~v%v v6dYe5Hl r<`jFGl*O74ukQ "~ WI| Ϥl~2}>??#v-A/໽~+RhT̞t+.-}ϿnOP^\@1&! t!s,Be<7!w#yAI3%rb ~#h.ZX`ݧ칦k C%FA3CDfJ5 ҕACGyFe|1 +.A +&=q)n3f+m|O>ϴxXa( +A@Rhk'P"'a;śIq{ +ej !ۑhdmSx5Q~Ё7E5UG"ݮWLr`ϰJfzwIj(ACQ%c +Rd6oD@&.A'&~=%Z@D 7"h'U/ į +>&Hj3 !J: +U3 xH22WXч(ΒTt\5#Py,;Y B|Ygc` k,tvO4oOcroǘ뗒ro\#Ees245c] +/̙ ~{Ԓ]XRkaw!qFu{_EcNwO_CB>{*1]2X|Ew#g734r uonArm-0KA&\-y}?lMgBqS + +`7Owhrð>@+&%? +rKRCgf;,Xp-mQ2j[kg;Gp* c\* MžsHXō Ssn8VN~Mcl8Sâ;Zm!Jt\gO+:8>-Y&-%؈ep¸t"; IzQˡЃ}&ڷ໥BY7 X))>?yi8x&/ly)d.dSЬߗM~;YrpԚz8h,x@< |=9kgə`@HJEymw d;kS̞UouxXD=*n%QbZ4JF¥{'l9kr_үLm8fD6h%eK1uεdX{z ]s*'nvZkeFFɮ7E :D^N_ y +0"oOu{rsM;;XSQ|7ϻ=ےʟ@4Q]4w0#Sі` VH, vMR:9Rg*z%bABH1؎,o<.L_{,ڌph#^m#}q *9b#dbdk[gƼ:_q$62Q"ϹAlUQv ̓ "]  Re߳Ff*}xɰiC[W,[HNdrRkZNr7Aʸ}jS} +66(U+ǗjvK1I1嵣^Hf'XXֲܪs+򃭟@mCUeV9 ,a1ޡ:ɫs^q^ēvKI N +hT-a2Do*YZX_f) ?~,CW,Ut1^ZBTa2w WnN Sd |Լ-UπZVꡍ岐ۈ>+݌b%N?^6FC,жטAGPWkK\5+{4rr7.ӽpd'U%g\W bն8E$^܋%|!n:|믭~<ǻ}=m这9/,s1^ L 7U\l?2P-o8h)TBe28(#=mk$pnSQJc;3t̵GLFwg2x̆*+"jS!xO=?Wm)aF \g!cfYLGÓ۽r!}1St"Sj/+G5f£c3Mv5Y +?dP;sSX~ `[<=.e/kۻٻ|e?b lEEH?.nݛ: bRtRV͛p++U=]@>8溮ec;3h'jPV8eEÓ8(1 e팵 @xe_'yO`uIt i07/Fp_hr7z]5@DI΄o-Ao\/iy>jse\̧,>l@r12l'Jj/wǹi`ޑ;-eg ").P:gO~5B"O p$ܚD3 vr$W?/Y|rw 󢺕LJ ʩasrm"1?V?ߧPBzbg*$8> զ(,+n\Es@3:mT IXH) 8Ag{.ԑu׬2I+C +4 H;" nX6ֺ[G _daݷjבeÄvrE*tGoMJ9X`1(jbqVKkM~!i`* UT40&YLᙞM ٙV+lAǧK%vD?i3Yj1 +;b%樌]*TTPt™g +VKdm9u7P;Xc2y@]X12_Dގ^d'rtX^%Y +xZHFU|1`eAȎj1ۣsb^VNt/ +DGCk.>W[إ>2N;W<1;#SpgC +|y9:(vn0w}T+SPZ_7;S \' <@sޓb7^7*-7e6 +9,oV5\eތ\q_*bBNz:CS XxGFoLEi/ +Orxm!s^vjC]zA]CS8;u#ó^]F7vZ|r|wD!'e\i ##̑ yVb<5wvqJAߕ*Fażnj } m5WU4^N c: +pߕǙ_KܶazU#I[bfLs^ b 6h,=aT8HCْ\6LePAѰD>163 +dhE1Ҏ`t޴](p{ŨvV$RS}J!=Zo<ۇݏtO yB6T+C.(8%׸!}P%H\1VuiѾafLNed/,;زc> >n0,[OU٩XXNHͪauއ]$_'`Cos)7Y`ErLEj[U9]j}ACDg?T86:3Jg~]H !t bboh ltt֞t.@ O!2[d h%uTo̭%D6SZ)\oEǩP;* a[:vԜOyzl'?ؙ!x/Qʽf=W,5q[2ؾ; +$y?~1p@%cs"a)p9驳9WLNSR!䛣"8\uMzy1p1teTm^sVw`>x ?7.<_- *}.}!;:4DQa(]fVe}od?c.ǟ_o/@#xƏ㮹};t8b|^$c$OwBFoחnx>T_NWuwmm`Ñz&2$F# +~ðN`V_ >p,x6B2}A* x9<(DDWշ ҚpX$Xu3ZӁHhb Dʶ1E-8f2‘U>^`a},2Sx*=ӵ'\Z= H]f> +VyY WG|A\[HPN@r)rd].DٙގWU\u]q䢴Wt.^/S+9>J"|Cj8#&59R^Jdޑʩ[1!O4Ve+pT- +'@cmecVQk0@ fpY(sA:̆RlD^( +UR]`׿[ wյnZ"\Qr) ?`VGFohFṡtdVR .PeUw/\c| :Qi莚%y/z$T)J{fB'S򞗕e ds8?h/9\ ?kt7˄a jcN5dM"WۘAp-(Лݛ)ܓA)*,-Y?ծG +zQR@ ir]e c r{U~ + 󹚛^083I 4i6K8j& +;êtX[TU%Kku_M>u$ٌp?3D˱]1T5ggtGOFLxN i~"`Zˎ=7Ț+D,۪P$aju=ڴVu +Q\+Ziv_UG z a4E\:sgT{{OE?QPUO[7mRE%tS]QlK-e6>]n >LN9XwJc Uev9*tL I&G%Wse88Fi9cbJ|jEEljr)| ,.>'0!BBERmYI9Lynw j#q F'q n,go7^.t}E|3))Ƕ]owJUo?cM|G,igi=0 :(N ZqHsU+J e*,9DbJ$ƺix+ǜSJ,P;wwg$~R[*|c.Qbw/aѹV\kUN:a=C/wi;sR+_/~u;rHaLfLZ0xnO^ >.c:OAxJYWؽ/@%eq`esDQ@ư2+i`[8D4;OϜ6g u +endstream endobj 116 0 obj <>stream +HtW\ &\4_:b7Vo>],߿M|L%2}Z!ζ +5=>~|/G5y-/3ٳ +0ns2>7tʍ1E?̫Bq, pZmMYa1d>YR\cYpMa~]ڦe`6uT#OMm+C0v45>Iund/91(mE k Ow`;.xRq(e%tO^xL73(QLWMd"Pa(4 쭸DYecJ>4fpvyV3Y,NHR|l% ^ U,HN)2btOpt+$xWN_h-pDW'/j*8st k^6n++CEBq[`"%wD,y?)yg0;Se 8yDO5,ښivkH}uH}-G.vg?,9_棒.ZM8EmAd3&䣏`t)";#H}H +u&oԙ' ޟSWCqϷc<nR4q4KPVkwX6Z}X" o$^[e6<YdĄ8Fn0jP&pT#o8W;B6 ] ޿JkK d_cF{_4ؤ^//ωo^`2 T)>擞ɺ?gfjZ|FzN@l ?rf+"pݲbN1zvTծYb-i&:x&9(~ ]fءSND+'NJN|'A~GԬ1r5)HuNIHTW1Ub3)SSĩ-1qVܹz0oGg\2ɟ~aۏg\f8PUp=&tDco\9zn)3E+鞽pјG HdMC/.Z+b bP+y!H6S|NY'̼xSӺ̌JGn" \֝BZj +dMeOE^C/u=/Q +RBרRl=$cM/0kC@W-K̖ X{+%K^vv ܒ3c+hPwiU윦MP|0IUdb86{d1 &|CGDD"=w>0!+vYgCMv/Ӊ̉[H;ly1f潋z`!|-qNw 1S"A׉5JtW0 ֻ~Zƻk/ҒBNj6Qk>A\kW8߻k|"z Jy5tU]SDj)#ڥ_[#P Z#7?d<9kꭲ>nK^*e-!MC6>h)"^#xX5/5SR˛1"m]%۽r0ͬKt dss irﳔv%^˰?JdH +$&('U*-}o=?G>V<ƴ +5S^֕Kd d_Wg"?Ÿzp;/G38'NXz4(8@%5}g ZZ${[ &-j(]}vPABwE7TyC{wyb`RqhK + Djs9g5!3$LxCfٞ1M(⅞S~:0t GbeBPBa8$. +~2}2"hO( n}Y*f%E2#}fP[u_I K-$hqjFtHT#8Y-@| VDp{.sh 0F^m$9%G%\;Tp~MKZٗ@ 4gU^񓧀dPdG$R_d.VYɚ@> nv_ťz >rEt`]-U3NY"KlR=atu"/b->+ %(M4XR1n٪7v]r?th' G<|]d:=wo#bؗL?)evn:m-펑2?6̄s~ +?lY&=DN PoQEI}7W.QC_n=rnڵhxטO@K)Xrr! [Y큄O Vf'wwBmi^F=zaϔk<1mZJc䑶zP5=*էJ + @{dKUGhuOM=zoHMV~J)uf,t_w^3C=~ǧ2hA3ˍGV&bxOMiza{>1c`l<|nɯY:uyN+m +!oU9+?QƑ( aove2L 1GLC#ҥ.`?_.*'JvOȴ< HlqʅϩeMq#Tn DB~@ g 6+pOlT7K9$b{T&"[B2w@p b|-q}m휸 +tɃN DRKv/C1 +lP wf 2{BV“|:Tʪ Li78_ark˻[ؐsr[\=4,N*Ѣ`>̮p | +x,e5/(;7;!Wr_"j\ܪs7ȿRU^[u *MVdNFGYTOhl61qok'^UcVBg4[:؞?>e. vUMOTJ}DNpdX[RQ@f ΅&<22?D_̿eLk-=Wd!"{q)*{ֲ-pwzոJb48ҧH +,UU˧ T]`^K +)K1xLvo-]j=gsvvUp/OW͏e鷨t?),S14[ycs 2h_9z(SU|tnz3}3<ϒ8yJ7Ζ0?sYlY'Q5 8c2K/^x< ,Djse[jzaQm$^mk0u/6^W5 QnzZ&dMԦhJ e)ITs:[KAOAUE\=NU+P$\Ɓ@]K Lj,?Gq;dUܹ* FJxa5*JC3nF- .DWg-JQMѡiY(emDW 4K=%(N?0uԩkVR쐶4&: {A]n4Y>^ kW}Nw [U} ]ZLhLIbbg1lwg˅`rkg#A5yY=Ț|[e\IFE$+{LF~0kKx_Py.y_GA[d7)^n*#SM/CV) fLY-Sڿ؅Ժެ-Q/2'6},E觥8#6g2~}gQ%ǠYYsco + <:r!3[4~78[ @YVQ|nf]Qf#]{w< +=v7j>p~'n abyCn}]Ow@VYw@ku}2  p~p?f׉~왢ս/mӚj,,hF@Ӿ(0e(u*8 &pꖑ!ʈΪ77M FڇB= s(_2Oá0ۛL c3s+e?>kpQBWf|/C>i-%I&oеktiZCH~ ~_u7&ϡjZ>eKUm6.iW-]EEl 9t =3R1'7ֲ# ,\~_I1ׯ6bhس[w@ i-zq +}ekF>1GP{^`xP/,g( %GqSifϗm6^l-ޯѶi g8{+Wm,_hX'{aY F.󔠕0{gDS'p 'i=!>غI(nֈ>f*}eaΪUVt v%j,"1WS|eU:oS6g@ͳ9Kv]U-Us<_A*QB L7>l(av6Ns!CF_,*a`429${%P6c6Ǫ;R<}Z z=xkyUO5 ڇ-:x5L+E@{f_BWzC+zoќ!ba[Qd_XC @;:ԫ.ٖu1fX9D쳱NVŽwyQC5ޯj-#s[@8 Y0~.bCd) .L}MI[<=1 JUU*qX{ݯm=7E9}7El8Q\1PEm%z<h;:A(Q |a|!EwObqF cR;U3nRHzN[ɡMiuZ1}QzsÇճFYCqA.KYLjNm]`UmP yjQoSk^w,T]ΘiMi~DN#эޚ_#a[|*@1n,<_7;LbCyH4D0Që֒Ca#43*6w޳Inӽy^:36=?LxKsI9ەSsWt z8>])~&AEd>=k._?3Kk0`P<ut`^!vm?ߝ| |fAbuoN1vo Fv~mJx'f`8L3;fo{߃Wv#؜8Sk9d^A7Z7K*ȬXϺeQ8G#,y< +D}m{FBWpU[Nv}\` 9/צ'ka@ o5@F1f_f>\31g[f+h3< H /uD,w9V +5 -rV_zݱ ?]]4U, t P<1Sj* Coh WaH>@//0㩺ko19v9m}ȩ&SΞVxnkʍ,7:3!5Us0'2jr쑙E&>hbwpJhi$:dH,F'5F+<)'HRyOox}*ae֑z~S3qN"C~p%f!)0a 5܇3>WL4,0}NaX}aEQ5fE1jc3^ @exn\̛rռʛL*K/Nk,ي+2᝙ +@b6DiЦ}cE擟V֐CN]seJdkG|맧+ +ms> ]LS<_` mr_d5 ֽ7j@ UN%Myo@+Rew؂pGw+R*aCH(/V{[{zm,-9X+:rT 2)@@)eBvRt11/sR +/}V'{3KF_`5%LJ]ɺk(uKpk\(!-k)B4!߮їm@l6( Dh^b޵""D;E%џ\Dh](D}#M72c  { .yBx.Hh!;M]8(Շ+y +lEOY;o-oAy' O]k#ҷɷ/$%னϻmՃ*;DcljI lLo&,/)Rc[<ѽ # +HUo#d26j 6%8A_GF7oYcIlY_ pmHY=w߇A{mvƲ9Bڸ@˺5B(x]vRc¢,<[bXz]x\Sͅ ={zқ /q~?%d&"yZ1,ҮGjUkpfE6Gڼ YTe(k *rS>\,EDOd(Q"E2jwTI!Ե=!-Fe2z$ӌRr&Zy\yLH*uu*ۏۏ? ?_B Y{fI:1ӉUȇ~`F*Loy?ei}]J\vR$9RɰKTǵ=V/`Bއ6r% ?W0r}|.p݀|k%.`0H Θs-&P' ?ætm;=.`R{da{i+1nOpZ U-ҼdFj}`a-ɝ: sON*kd0bCtC#Pqm\`3 &b>8΍[en`Ӿ"XoC uEIp^ &36IkBΑKBCD"FU:j?޼y{cDz_ oYNx"$Ϩ7XxJܵUxExc +1mY⶜HEH(OeWݽZ/(LY6c*qU uy_r0F:g]I4ppp\dz9ۈB}C/s@0ixTOQ3\gpkkMFTztCzMVгOMg=rC %rJAV\Q @Hm,Atm,4*zx _ +,xll5z*"#uouVtΐ\V/eXb- TP~WwfU>{gT]$ xي js>cqh ވ|6 3zQp"YΠ^. {Q?WS EafZwvgИ3ԨEEj&Cw2&wHL;#ɗig#$zڧdx? Pk(:i-}lHXiӍ5= hR{Y$*1ItŽ +#sz~ '@+YB,ZɆtQԠSte >H/΅> F ?\rO0Ve6FZ3P9&[^ GVRvDcY U*?ZG4hqv<4lǫ_Vjzʐndj;%C4R)C02]}:"\Mpg9uX:r! 2)C@fBvҡt1/!/8Ch 6"}qҗ6/v%B ShӥDu}W"pAJ$}:Vl]&"xRDw)K6is`9.E`1Zw)w)"RCX¾I)Iю\R.EvnR>Pu"ܰ"<PHr3Wh Z<ig]} ,9:! ^߂(|Zwཽ&쾂w?߶+4ۗ^>~<5&ZMDZF1&Is\Mi4^ 5c 4?F[XK|F[#mmi4޲vkTީoO4g4͆_&h3޼ZaY^8o3=xY3Q ~:(Bpк!HuN!-QS(w-*@a#I  \fI~Vz4)"p @CDr%̰, /A +96 2izm\(kc+KIJ̤G7]6PUꅯO6jN~RXizTܐ·P; { ҝ1c Pem\`C|#9b C5"8Z ?Σ[Rs$Äۏ^9dˆlcWs+50]0ƌe.NFo=;^< hQ xu#67.m? lF4t mI5h8sN,"f 6Ym(NRݚE//|{?`tp?4+5YY֬ +`Bb!ZѪ>$+"=!]`=$+- DƚoaHV !Y +deZXy+3%wyJW{KV%Yyڞ/n-Z9:σE41ߢD+:!ZDxC%\7xJw\ڕ2+hc?+g`8ڕIڅ>DұyNC~o+kuD>%##vFכN9g!M?{KHNtafMae{\Cd+)du^b/z2}oncOygwxm?33lSa>a\iTG&*`*J6o0\)<~<C_I7 7퐛^n^ ͋^Ud~;#Lv_?_˿n+:ȆDl.>~M4"Y"BC*jn \)mo =q"ϯFc"1GBf-@NPЪRm 5qD izaeC᳽zuʆHpP6#%6jP HwBFzݞk?CkɅ(dg~&V_9 ;34TL0 Ցdѵ3NGL}b:xU;kS|9Rڌ'fI$"ga>1]_?9B(4禒 ERY+ȑT{⢲({ZJl3uRINe ^(jga n +$v]~440ufYɌCݼ@|]K*6U3j~fTbX3snkN\NFnx!W!{ѓ&lmqp^e6bӴĽSA$1A[8B.N7r@=?@M nZ w*^k4u:[Ztui@(Z, %Dx/lM$6ۥ7eeç^g9;{ +E؅7).V:^j ܆BJ(f67z,½ +qhǩ?(:kSm꨹I1zdgA1\hN+"⺂lPzvy{ivV6h.{Ȯt0FC\o+e .N1(qi?~fl1J?kDTlKhg=fnI]؇`irq@.xOse#b/8Qzt>  + 3_D]׎ډX^avf+`w] >$zbcnޣHw|PZ6' + 518 +--xG~ EzyAoe}6O@ +땒(s~)ZXXmPۤ0N'DFB1\Qʨ q2nWVn#(dvhƗi>*̐ezԞ c%R2>)ZC)b!kQ#<[t՘$ŀ3t`"kO27C Er=<Ӣ~iܰEJ3cZQ[efxǓZOe^߆G%h)LsƵty}_|WV4YG㔲@#fKt;>-;݌0?Lx7'("ȵhC޴ r븲;g^&s假nld}gRѡosV^_?/P qبH+fĭW]h̹+ďqk=>;-7ۯsc:<5z:"( +c٠ eBA9kxS,(lIZ*nqưA}de/F$T>K HH)l O{'S[tI6(˝l7`3f*9?^oK Q\TE#YUkOu{s-bvRA#\^@ h)q_Ixލo% +4 486H#ІگЫmǻ,SW(S<&jĥd%&e]\hsn=qX©Fn$\" PVheʡglW0h2C_Ut{{m0N^Cs}vejU/ QibZǫ+pK*Z #0GuPH_QSJ.]#ZG SK :XO$V`JeD iBɰe>(Q%#xߠ"dh>FT~V)YCo6QCΚ£߾߂vT~|DTi$fD*z(vaW <˼L ZF$6o +'OEm +mEj" +Q;6󮴖 tr=Sސ/E++*;3;CA]Nh.;g<,_V>r=z_X AYwV@^U *s/E3?v\j3G4+%i8#7% ΈO5FUw(#V(ƥvQʨ389"kW /٣/\,+vxqFdjCn^;rQ>Kp\y9s9lfY8`>]ZCiuX>\-o.%C,=*ϵ'_eψ1(OV-/T`c*"eb]m}XCgo*CLR;a]=YWkWoEw +͛8" +ǫv^0gm%e5 + H1Df6L며؋N=Bl[ۢƘPӃ #^l@q̹$"Vvy;&NMdϕOwSx]vOQHIFZbW0%YQ *@J L32T.$l +CI~$a66D<& cE{~Td]2-ІZI@1M|% +D-0p S{ܠgs'a0/v!T$}͢QHT v9< £BG@a{/e lV@޼$CP*{z4~(IћT뀰4R:Avֽ @؞pG7O%-לQ +v|yՐ߉3_?Gpqy6Z3`"o$l {?b[tZ Q=>;ӭ77Z3{u cS\$H3t6(]B^Sl(6@,D(G )1UxPs֪-FVKm9ňU1Vר4C[.XAύ)a \jfBUP\Ŵ3s_T~Fg)N.>>sݽ\JJ +1\4K?Xǒڙ$JOG/?gYoLR8jkW ] }&WHu{8|8ISںH3Z@&izjPi`5U8u.Zk]yn;+'5d[^gL +o]йl(L1󵳱edf.^X Z~r}޻.VTiyx*P2gi[/>4YEC,z3L\DxΧ<ⵕBܡH) O'u.nMiˆxA<vyVTBUIe{6 qm_Q;E/ Fk Y/X98vmTY qӗH\eSG.3ZEysp+1I7w9=]kჩ-R$QV !S9&E쉀~qV7r$!afb"fmMQ\N3Vm^/Bi^$4jHw맴{1 +K[",mvo"(ǣQpD(.@DZf~,^dؑD^1g0 %nXìK,S^2_p("_bOL]-Þ.UMݡKz[dZ8~ߏlTs>mxcfn dsb!vǣ4{G2DfWhn[F1rñnZ<@|U5Ġ[\IPq^s-O+|/K/0&4a &4W~5(-,hcg!Ä8X|&;x"cKیc2TNg{_I,0)ujE5,w:".4.45 SyVkIiIޛfjvEZdl0`x&Oy:nY 20l` 1d(15p>OpgnI j3t{3v,9VKJ6L4L8P*Dp$ 2'оp,C怏`l^;be20q7neDL6Zh6WA X#@SKha? +`͊Fќν8<Ȳ~n>L]Fqo_ۿB@bO3b +-ar;^|O~`x}֨&Z +VXo3{t&aקaH|[ XMڬJf񀁘W!cDls#ZQ{"+;Ͼ]HjN@ӈSuQ} B9b̵֜>:1X*d $4x"hh.2Fd.c +F},GںT^?]&P Vʌt!c# DjSCNWw7,Rs9_Go["s8­j#2bl_Ŭڈ lb1~EryVC<:B7 2xJM)Ag*u'VrdF]߉>b ጖˔F 5MH oDW ee|llc 0-ND8ZI6c}WYJMD=S^lqQ}9̮/1 5sY1LWk8*֘`RҼasr9LdA$[uz]eQ0r\.gUpD,?Ly/@ )Jo V%</pY_'_{ov& [r~$i'8zR=Y/|[)?tvu,0Pj>!#@otNWwv<#%goz,"' 6i\3"obx)DK4WDŽN(]^8w_mUIFax&&Vxٷ,@==brNtW$ Nh'Dz'=#ÛzC-(u1)Hjb[/{KyڌeM]$rvӸ %2fOV5:~={^ Jkl+ 3xmer\Z ɿ}~ڧ3\Ԅ4ahG3a90g.`D_[wp̍r(C,jj?q|s j\<#8RX1F.AE3]Q  l*虔8cSRr16sU݂DY.CF{ tm/9=p2^Km 㮒>g"VfiҘ:*Ec,ju 0"(}wR|D:Xzy5bn=+;xrǷǷ?:NDCǗ,J0PQ\Gomfڞ?EU?(Ys_@ z@ &2 +puE_H`-}Tn0L;7jAH(1 dQw@ւ`EP:R@ξ :xsS#SW-'d\hDwxa" s3O_wg1!#?2c $n+;ϑO(Gd xG z"A#_ +g,OS5 nMnŻרɍMkmpp>8sW>F F:رƅ)Ygҽ + eUgF e_4ThEys}1`g.hY/HE]._V5ŌDݧb }|bVجZAmt'0C!ʚgwg!Q1Ex1ў5xԔUyF/٣3c`E@AD׏X&Qpx@[%gw]WE-`HF}{MVLrd{pdqY]HF9wΒYY|a{AOTi#G^Xi&bI,6Lӻ=ѻ˯Μ56Q}S2­ IM}!%U|jfI\l*Ҟ3&9%0q3O W"΋] l#ZD XY =+T7rL" r 6ȥP js=?wjQ FDXwJvG^c1Ҩg}"a'>抆Jx}|u FCw +=PdSM[@g[ekmÙʼnv!<$.1 Y((CR}=׈z]t6}/~( Jm_VdQr%)Q%(BT>>@Ҥʙb$$sVÿ\܌}ۼ/y9=2^'K2 M9 Y(3fio侚3=N޽APF=Shuo[=]wR|<:X ww$UrĞ ?<9??~۟`vtY>({M9_wi2{gyw&/"BX<Cc{P\kRw|teJF'18+M+uKHّ)'Y徹:7ָ֬HgR®5A>Ax6MB hѬ28A޷ +#_DLfˋ +φI->ΐ74}TA978M.s20$Kz0r<(lneLv"WvHJH5'3VҮ0e |W/d=QdE\u] Xj229۹{{Q.[%M&2F1 Pj+7qȉ)Ӓ$~XV`F+6 ִ4s`1>̪eT=Y+ŘJ7:kdիIs{1@ga5k<hf+ma6[#kt?~ 8'l3'$o5_iKDCk[{Rͷ&…hǪa7XNv.AD0CWztxe\®\g{sC9d&}_.ɂ ~Tyu+ M}n3oY @cH@&쀀$˾amWÈ +endstream endobj 117 0 obj <>stream +HrƵϚ?l45)?Q0DIv-f ,ɍ]dHf ~L:4KK;&vgwA+ vN,g_Gn$&6-GL=yIڹli)n}^P>2eiQ;ѽ`8좝],ꍆhȸȳfMwK d@>v,Egy{I i~OF*yl_2Pmٻ})D~A2d;:ݾ,NńBR47#༿Јf +,<8~t_yW_x<]I"YMu=zvY.tĐic5=tW&kؾt,VoZk^k7[.x^iFZ-2~Syʙcu,"!g-NLt^c"g4qiZ !GdIeE |,hS !+zdYȔє.gCYHb.2<_&sʱT,+$ '03Oqv)Ƅ\RZ0(^P.ְ(ki!XYrA y-jHQ9FGLqpWJ6&rw{04;ifҫJ +Mes|aAa`l|9 J'}>[;p(Sxߙk{gNЂgpkggul )ٚ%7Q#)2XկgC:sZ9>XrJԁO߇V O8c_X$Aˡ> 'iZk;`W@ݛڶHtZN:CU+ZeZ.j+́_?|ŷ/p}_ҿ[18ظFpr%ohyoo~ YPt HFlĴ@Sz= åzVC Eۀ.p=@>[L-a֛f^'FD Nz<= 2 4 pzyI+I_}Cu)jiEzk#:NB͌hvh}}}PꅂILkuFL 7ۂ݌W~yl?jD >_?E߀Afϫ1 >۸m-k GB\Ddp8l \fk&$9 y' paǂf$#{0U$|AyBAV۷mtX>ɌHd`z{??Wrt!$JRƥ&]= b`̀"T9/~H*oyP*9q3R$Ez0TU$qiM``ԂN)Ż@[r\J-!Ji@ yX=vMz%5mCyï$> 2dGXOC\UVE"8 9 5tÿC5e*IӖF9zkxIXcX_=xd˵ 6(I&,CpT=`S6 itblˈt(Î'zUTtn휸L8D4A@[:"zK3?pgPI*,j#hh +2tޣVF5IܥQvjUj6Tc(Ċ1n X DQSLs|ɤ]`hd +9WJa iZ!YZ"ر%-8 7&N|hVAw6w/m0(% |FTZv=*݃{|=YB{p+9d(})[U+\hB'X}~D6tza`}p;tr1wf.bG\f8Ub ˋød~\h䗣1z@kbߍa'Z4,,1h΢&$끸u3SPӊ4!\A4|ˬ8;4"YU+rIVAt\ j׀P޽dfs=Vz%#c^ ZVzY!dS +|ke4ܲ&:;a~ / <]kH8Rř`Br{Wk<{"6Jr`2n:$ͥg`<n.,/jȫ\h 5*$>mJm)n5ji^ߪJm9k() or5bبBOg8W9&\ +M&ЧWhkuͥ?Gz6$,v&X;\;n(ZS+/9>U <|BŅDųႾ31A=aN"%.-WNn+1Qr9viw0F8({%烋e$-ŜnKHJw,UۧtFMȰc\6 l]#LPWF {=/9C1)j4#[]\֒мs }2[c" kLQW_?R_{m2%XLYc̋9L[AB+![gZ>.[_޼Rё׷mg s*JB_:U# 9wRʘA&̰)+}0#iQGP?ϟ퇷~o᦬.ӒF7FDc.[(ƠiS”#A" 3҉ 6CŻ̻Q qh8vյj*eĜf!0yBs1k)98]\RʄQ 8V()lSʡ0Y E`N-Ld/90dv.c LKFٕ> Ͳ!fdJ s˴Q,ܝPs@Rੂ^8#м'Ih&ޫ,Z&|sd t`1[LFA3&V.ruGa^u/pL1c E^J8U`T=^0H;Ga6nA|KiҖG / @dtR48,Z-Ro,`E 7Il-q<{~?{ˏoo?|mG t ,ct)Ʈ啋aX(BEד63a+6E>%u8EKj $(Ӵ'?p +fW9M 2K4ADlYc%/fޥK6dʒG`ّV[}E\J54ad 1=`Uo t40.9HZ VZ}iA:tөtL@P*RO,RcKx+j}V/}2lxfۛfҶvFy{_+<[d}|htfucwc}uc ު=z[|wraqzoW=lV*u'[͝gͻ6m/Mp9}֞\L+vnוּ\jYy`{7;h-e-,-bTE%`YLT3a)u8k6_k\1 + $46wWB=C0>"Np}T1fԚaW3"\fy&ȧʙ][ rׂiGyb-' d1 ⎩-/9w[ +MOӌt\kOPSM<4wô6]=P-Fm 9t.w04<!-Hӏ|*gڊnKŰQ]**C2e+j|Sl>-bDieKՠ"\aOfu8Ao +Yan84Tk(sYG؅0iE׶ +^z}=aSWPy]{/p΍I˕refM`zT{*]MGV n`Fqafe^$v4BT6ZY>UvIU(<5kfcD:Xn"sB/nn;Bc:t%JP3W_ೡWl~h`qeD=&:@Ї/S8 y]gv} +Fna^GĭV,s^?q&]v + wcE@ / MOY๜"F ̃W${P7S$ gx/JQjrx w Op֠ )fzAZ7v.:Vc.R at_'m:z ?PؾTĞ}L,5 v"؟f<yFjEmL)RaXNTNSe2v!j 2@y) y<"{TC:vSɓ&MB{'DİQnD3L + +e車qMt99>R `@VI[1CE< & a I; +Lh &gg}h~*hcRgeA5݄VbegLcy˷ͥye={tLح;YsNRא2eVcW˾Iͷ|zEKx!r.S@D؍_: `}@['ehE:@ĘKyWr, + A>ۻe/;uE!}gw㡠bm @ÂzwA?]QĻ}o~}.tyhzh"U=968imBWT/r @bŪgxCCD UCr~LE1cZBC(7uPM+cBi^e6Se9,@U9xy_[1eY<--/*w<`39et6o ^P[Z \ `x(a8mbF& [*BgÙH;J{Т)S ~aqT\ |qfVjPXw_Mw=BTo 㠽a>z f{V)^ˋ˯pt(K ˪M$2IW0Y)P^>91z 2м lR>sh-S%_>Ə`t} `]TuVMG]Ž^_nP;fZ.(k*D1E ^{%>o~lmc%=e3DG9Kvwު ,GGȬHJ*֭KΟ:|U !K94xtCuYT,0 ;TJX܅j$[?HԌ`KAddFJo3NGD*VZ_B>,܎D% К ?S4Q.z ('Jx֖9o>1447 (UnpѢN`F6ARսߑE;%D~>NHu!i偝҃aґAZۼl&<,Tȡi#*TAy{p ܄>`-j8E~%HMǺB/ =A@EB/oLv~0Ec:HW*!6m{bgjT"!3dbY#lc9n :C۳,7<^vL~GEDQX Qlj ;IJ]P]kb =r [am M "%$FG̢ ⶤ"v2O;Jn<WDzHم!IOFMh\C"Vn)WrS1L_J}.탮gҜRX7ہN`fQDo[ER|>2Sd&R&&yc@cQ<٪W0Un'hk:ʬY&)X~9k}d`?:g&1<LQ`PIj0!'lb +Z 32$iD&9aTb|kP_6z -q,WG`mhW5<h=:!G;iq';iBԍ&e{Kw-i/K a_z@-N;cuܕy`bL>I#,[mDpgxEeKX3eCģQCJ:_7s,f8 @/q|{o|z@ĪIl-@܊7,Zf+@bq׫t 0AW m)i5Nēx29NbD +}YkKt"vM]-Y4Mu~RTf2~學3/v]ԍțobEWYw߂~Zu"ޕ?*2J+uW}̎k +z}Thtۿ'PN5A*0(huT A_ 1xYG }cSNWwq>6TQ?l1F~17# ۀ!$K"intv2n/tOLڦy#qBIg_|śo=Z7ՏOcׯ;1jj%bz¸Z#ajH3e IZzdyx-`Q`4 o0+^;VZ]ud!=R^ +1ɍ8zA1y1̏<5O] MgHh̀1߅ Idk6l6 ݺ>9lRwsqc:&ÉE4rz],zl"/޼|W_V U{@rX u 6 S a>5 h`>*ȁyy%h$`!Kͤ.5a>Y}a8/{ړ6g @hږt+K`EZU_: +|t:^ +'/sE\8qdFc e7Ntˏ!Uy!0e:ƒhQL`գd~0#ZxdL?Kp2vD:fhLRӂXL)/;ܳ_kP? l.gWfnڰeml#}4k`vVê܈Qi/H :?𰘷{"7 XpB'n턌b,[H[y 1h)ʜTH5V) +@vE"82aSHDκֵb hGFf &ܞm\fQ-;E(O7njP̩4_|y[w!= G1)(kaNvY<-ȷs`N3=Vԩ,x*s cTv7#ӳPBݱhMf1*7`֝ 7AZn֜!%j;t%9*0 jmr9wٍX U"չE2F@S.Z!NƵ>5U/R [Q +1BmU[ ƕ jTZkDXiy^ZcXuK۲J^OABu„:cfbH:2N]h(QL֜lO1xN!A#K3v:L8z*PQč +.Yj z|{*[YKWDJ5=&OM{%6XP!F.K:Ej9hn*Q{Hu_fbh[YwOEjoO)POHDT8gڠasREFmZa}lZimߴ񯝽s\YҔlKuא6=fHkM1oڣ(OYm٢V)@>+5) $Cbn![|g!xꮄʌz`pU 56E\P3eF1U +{(SmOEV|-O܎!5P0Ql凒Z'Q[IԄbEu$k̤ʦN'g%ӞB.9 -eiF;8S:n*F;RHQ[@@@n6rhD7^u}CNYZ3EA9pVpc- Y#eEYN͚;*T]QՙŽH[/ +ZS:6$2HM>[:"bRz1~Dwca[xːo 1ҷCT9 Rx$`‹^}i3A@ !\!o "V + +E +r|wwsnvsHj`9Ty˘`#["$tlP4r[J9<ܡc ,jI\3b ^=t֗'1+P̫ts*]ͳ-_뷈{-ǐWȽ<( +ҙtkz&'O^yuJwzEg+&SVW=v +O )3L P|7+)d]c |!p^]ez^ 9YU$uD@֣ KE+F\z^ 6_痕LPR?Mz*w}g'rAO :#N<%-6=`ĕ%2 }U)Ƒ!: /C-qltPg1ec_hq.}cjn+T􃚆')c԰ƭ|:ިC g _a!_/C`QrOdbd5SCD60x_ !=of~j~/KAוּ=ПNzi_lBdHW$i4 dQz 0Ah57| +p;7ݴݼ |dWI9%w"㹭|;y$6@@vG$B'M}N6S"qtL+ 6JuzF, fy e`>fh?ձ`'[ӂy9_d{ӈll& dAbΨ#QP&T8*lb 3|: ߜྙlނ4O,Yڄnܫ5 80w)ت:/Vfs,Ӆ5j{C {!vyqCSmr l bmk{bD37G"{=fÆWk'9"pÇ}n$Φ4"/YDy{^mȳE :m<eESz2JU_ZR⑪9 4J_\Nj@) Wڊ[i:TR:^Asj5 mAETJͪD&4CYՠ;]WJh~TP q`sokjk +$s+z|O544b8 +JU +TgZ+0n4zxۭ=[UYRwr3~(Nzo4gni83ܞAgdM+rwC<nAC{)~!hac8 +隻@yM"68 yʼn GәL2ly1X{/8|s`#O4@ 2A;^8jȪ{ӻ-$,i2ƽpA7T2UQg1n_W$6Z5u|>BS2Uʚڹ>F/7G nzVd;mbh+,3<ۂ=dz}=#;c^_DQ@^!hdL\'or(O^YN۱ r[To)+c=vJNxx=ootg<}ih +΀UdCO{]Zj `2,}g,Ti 'XbHϺNh2ZVT?]eMDzcSl7-&0^^8M\a2:71NL0wX<7"j|`}gx^ wbcm +`oL7Z?Z "}`mOW{v`I7{7Ò< -eC% kgLaxNLsCю6$IhځSeIp}h4(qB΋gGz+\O8ɍ7T~iȽQƍWcy-zY'54ܔl{g,"*Je64VzqüR#b[SC^vtpqS5˿;=X/EA~F2uJE1|8!˃gDؽo'kQk޼-@GV@Bxa--8aމc勖^>dݯMwN&y&f7֞%/aJ"9o`]vo_Ϟ7\˼` ^6}j[c6|>lPVZ׎U,=xll=cWvB͏\hM%Ihۜ +SpI~|heH@!R (W)GE +h-Pzԅms#@Fx U[lAKqPF+-6z֠FۨCO(+xzb!u=R*!YyՑK.{ɀC"/dYcQ^ q ݿI+7kX2!eKβ' r;/PrP Xt"(1(Q{[1X8YcHF 8(1o@>Q +g5cN/{ŀJl| Qb2R7G5(U? AszrvkѨQD+cZ|a z^(mn|^C7cTM]0rA5TBcmP# Qn"Gjz^s=l XՉfoE?YOͼ EϰZ>GTt+|D|D&"N +|)JRpg eQRϓtCǙ.kG@CNdAP?uEcwV{h+zܾUlhlצu*h ދ ŢQEVoY#>kh9㗝R`Fu/Ok誹dAi"FN;kW~W&_}] +endstream endobj 118 0 obj <>stream +HW=] ?2Iq!IN@i\gġ56ֳEM[mʺy_%>b66H3"3z e(fȸG'Aqд~.\MGXvw>^);K_R=7g =ꥫ޵hc}AE׉8FD"˼: C:4\LBʰBtWsPuÊvL1f>9os`"7MeQ}>-m#3 +HfzJ}CzQeՇ0"T[ q]!ǰZVz>eB\p PzȤ/0S OpiO5s%1'up~5֕+Lë.1>+Eqo/Rf)()r?.^in7寷][ݷ" m0FG(ԼP ]\;?pTa,d_vi=0/{>>Gw$wXQ_+ + uLֲ qU 4צpk+3X*/rKPSA[T*)wsVy<[mYB2P·[hݰ7=MBv-MU2u%"}7^8|D\_#h-$2؟q] +*04똍xC z /0d:_Cu= 6o}edՖ [i8#@]܏M < N캫tD_<-q7D9oN䉬IǬKɢPǮA!@$xl> `ﶈX$LDLp0z&%)g2Dx D% S"ӱ))ZX}O.0J$7"rLiW&Fe N3`5݂"vz&}1i U`}91LKX5惂Qw&D QE|JQDG*Ħ m5Ȉ)*X|TBzgudU0lC2x[ ;b)ǥ$V%H+)PKnuSc72Ey $U^hE 4*iPENqVe?Md6$.ćlfh?-@&5rHTV\j`|۫-?#ur6GN{֕iR &'hbidʑPv1Km&sU֒ v|^SEx,'N1*ct$"s>#H>FSJu"moD[7ZFsW+|޳Ǚs5|fL?Ϫ;VѼNRzBRK'ihfэ:-ސ7<& ͟|O`,}F +L!OWOBWe!~Y oCFD^QW}v>QK9w~_TcmHDoSs42iO*uy:my*ϯ(W۶yIc/cF=6GIP {Lб0İs{FNdI,N =}l@A^krv~,85 +m/]vĝ&yK$;$_|\dɌzz+$gv5tVȷmy'Yz (=ʾUjXnu"U<󰤭fPk>>Wf\;Sԇ=exm6Èg'2a9(60!ޫi3%$rn`SD҃ڌ ?l +04f6]/:"( .;k)aΛbBjg0|#2 ݗL*Z.{9$j;6 56,jx~U>]jgX}va[VR 7tAJ[+@#y~uלGJ6=Z;P1VOf\:B"8X![>su\9-- 75뼠D8tTd㹥156􉯚'gNq p6|YoHGn<`J05XKÕyZ2DXfz![2pjjNej9%N!؍Hf.:ϽY8S͔ n ikZ3lWQ2tv!BDŽ:HNxG%UHTqP|\/>ЫJ;94bcqG{Ș62:rlāKFjHE]1 VV gv-zܨ2PʣQCM)?7V3רPС$D=7p|.?(lrH?Yi|< &KTN_$UiJuKX:eko<`D@l {_+{WEe={O={}*}{kRqzG/UL6>un<`< +|f< +v˼/Χ__~g7ӢCVa䑥]:UZ͹c ޺-,=f[i;^7l[Eь=:siQnG .lك`qqe,DWw$"*m \7c&_/\ԍSAD|χ/'sA/@) )?m|_%,Fb76ttŴ8zt,g:3o|Zs 7lTI%8CUIolV/n_'!V }1dʣ +pkD`w7dn G)'V>lQ@nҶH2/ːw[Ҁ}x-`enY0oz>ܖuJ*>w-ly샱g-wd>Wۤ +dK^+ +NQD4A.gdU^+^+0HazD +kj8Ole@BuSmcQ* -ihu-/)ݖ0ۊ&k:-G䢚?}^k^fyףXPZ˟-URHxxxl'DC3Ƣh+nM/k } 1D\@˱Df, +Peslƨu I),&]>!SLR{GjfyU3';""{LFk6TzyGfG8 Ah@&]3?=1;c~Ju\y1] 辤'Hp#Po8}\G8߳Ts ~]߱VeU;+baVq g]%<=Y07$rП-#yd%AnyGB sbFLU>P#2':q1" +-HܰWZ baՑ&+װQ]\7.)$"6e +ae>K@+btK׉mO>,i4(2x`qd4Oa3ǝg)d Zb;fmY pL q-"paj0pܨiyʙIo-7Dk=+j pF 5r/*W3En$*nwr$30WԷK4*E)]lef4058[iy09'+˴UvqtFnD/aWvmxnvֱoḋewaIH6IHM?@4;9D'qdFB I mH%beγBR]DNGsQ;.Q65jvΘ4Ʀ\ӗau?s$2obRM<2K^ pdJQcFq +jwX$z3ɶ* !oNwC?-u,lZԒZ.G/ Q X T_U0,: ?3CuM:Ah;~:iw}Z.Ƽ; h-vT $ IuJ9fTy0v#wԧnLiuɜd6oDUiZ@e^]`$v8\+G|*esP1BVk%`Z: MӕfY3 2*oCLѶD +g/Hvu:CUUmd!Yjcnɤ\2E @]n,e¬6/)\ptԎIY?V8;/Ӻ4;֥Joy"Bw-0vysF&=LFK`{^!=Z3sdb,η٨j 1m7XۍKRgm`wiu!/i .[^b=:!cO^|n o0e\7={e-CG\}OjsX am.&ٌbLf±PUzy*ziA=$bArR% wdn Ds1hH (j,TʃCl|auWla n1\\4"XYeO]Dj[l+lylZЖi^]OӂCEC)됒K{04B7GE,Q8lVSe7҇5n϶$4d H|בY%[^蒜wp:ҶYaWNU^)997I{ sp)ҧd.\:YϥT]PK M}%3o0~zoj?O+~aĦcmsucn(CFrMwafKxHm/2eEjh-0 `/snKw~>'uX|{zi-<:Se F$S:PÒ*L+FJH 20_-mM:=C 'k\ne#: '.9-'Y ` 7 | 61ѹ!zy%_nn 1c%{w /\z$Fw%y`x +8Yh~HHjײ2x'Xud'+:nt,ƴ*b@ycG dbCoX惧6X-e Ӫsziy)Ku2}zBPfL#ul lMn=kkFTq!2QXԷ?Wu +vDhXcE (X뤰{$W}#[bj 5 rt;# :$Ώs jr|Xic0}  =|CWwePNTc%"Hzu݈_ſBYL(9KYK{EbBT* +iXu3uTj,Ӱ$Fk|$Sk\Czxޓs6|C!R:ZkNjz|Ok6dpZQBR$u$VWb{|Cpdm) U&Ҭ\.$ 7XOs8^M9^LJ4LM0Tc|J=m|ỌG+DP?h'XH||2E{eg.]ݘc!kZBpͯVSX.@,·)$!VUqE%\Y];'AEv'R*,-Hk[ M0/ix*C;GŬA? Hwcj;!j³bOf} o ;YYV:и=v5c}kxZ?Pz/tq_m:Cճh3o=+Qu9,2q@۠Ҙ{+[Y,Og-R34V'mPY{9lac,d6U^ dGzQ,RyPM.V)v}ଝ*+T [j /NU$F+PȭHq -135iI-y;qO~[֩pe쎽hVp>SR٭*ou[n)ToLKH cR }ʳ:/,Hv+&\L;e%bkq숮ZYH͵ QNRHfx>ԇ݋ݥ}:pEa6+1+]1鶋ucN0%O2 mHŪv7xPy0]pӡeyg۬Sa{2Fa` ۳Q7cim@F6l~Rn( 'K[,̿zMn;|IDJ83ۡ,JalmSS,C*p}JXe+<7WK쳲mxNIX8B-C_5ܼH5# +dNZ֎BHW*M+ +Gኟ%}aprF-IW씖;jN-kM!ޭ3

%,_y׷?I_Ѓ/z _X i )0ccɭ2NNn,yww~5l + +Kh]o [Oh4 ",r wbե4Pp% Qks:1?'ݟ@IHxLÍ@%х>ɏo`ԞeG@Jjcޑ G^*'[fG16#,}`ÿn5|`zzdxUԌZw$\(""XJa*>-dd>*7!ݕ2 ? .u'PG0iUJR* ,Ze-%25gZHKȌE*AI)Sxb + dlFOTbUo @ >=r8Jخb|{q롭Ljo\gu λυquA|+`ƫGt8=Y2b:]I2g$j4=f^Nr9Z}KBQ}/AÁ,yȴZFXU~-m;Tpn>pj~1- t|."J~{CAaLj)4l:'TeLvdK2zVټzꇊAlgg™o$@l; )96zo M}v֞=׌.0c*)0b4"!DQ;UX8,114Y(oBd~*,ԁ#?`@" 8X&:HÇ.XmGggߟH>ɪDG娼u8Ndsxhl@w˼~j%uf5By@ +Ÿ_un\.Z +%NccaH^-%ϡvsQ*@s$K$Y:&<eAQ>zi8!9\d\khn+XSYbƏ$ nsvR?MSx_Esfu]9Cv?{z6"=):aI;Yde$XjKl6lF-NCv*<[Zb͔N' bsZ)}hCH]sDGN.S iσtjh㧋OgҧSX1 ߻Xɕl-%|r$oDT U8ʽURұ1Ҵ-cg@1<ՔG}3cf6QHeT'c2}M%Dv6X,?S1fͲ +u=9Pf!LUmDLXlvk$ geBKaw ٫9eD N\fmf눴r_ +Hix@uGaIRklor*tp5 Ȭ̕U1SjEuK8@Ft2>9%-m dKͤ:fTݘR4 gǕDy}˯o8;~fZA +y-pm-2ހ%oAcEs]L? ՙ n?qKO_ zdI|Cˠnh>~%_&e`Qzzv.k1|Ƽׇn/26ʰ~ƛ=ΰ?ȼ-2 k@<"sWZEIuY`h-:Ŭ*"WRAP{{8|a 0fnxƎ̝bnpcA]3^@  @ 6i5{H tT~hkBhaFD pC3u6s.fwTo~~qUdvw{Gc{kt\UFҹFW2j ɠN+|1m*imB~JuW!DY&OdVON jN4 ȀE4ldbd"SDt-2؟"c\LVnB>Iwjm( ~'x#ݍU~;S+@lGv;ču$sݚeq +zrA"!>h'>g}cjF7b뽻6)~ܝ!ipErrezpo{`Ɖ6||+)^ș:*{)S-6ݹ@n?o` KjIOKx*ZVˮʾ+٦!Zy,/Y>uȁ֏Yϧ3Mgj@1@wYRоL]4GަC?}ìqϋ(Ƣ qn?@;c(e&'(܍~>n$w*l(~~+N%&ﮨv9 + C>Q6qji) BAȉT91IcPL<Als#jXM&t4dC2yE3QMr!kLy]\s.5Ho0ޔ5UoNCJ>%zOg۾f]kϸI_G\qrHpd +2(3͸͵]g-n+*W^f{)qs *ίAkkߒeLg)\ ,|Qy+bd3Ѡ< V"_G}[?zhTTvʶ~_xNتhi ;U&0zDlFxdmدMs2˜Ǯo7eBc@ۺoZ酄 +n՝$>zSфŦx%e6(޹o2T.&nF΢@'ϫ$xX.3'COy[G^(hV%4:X,(=w*qL5O.8|&xAGR}1YOl.֟ȑ~^Koͥ͗ڳY D4.LUafZ2Bkcˢ,P_28ʀN݆C+kob3;+)ZjY}-5+Xi; l me-Fj٪0/n~jlAܢ^/6D.rt~ +}IQT"Bu(~:Xn`YR3?}V{z͞0>e~Dz\,X,7 <߮Ėq]?Iד M%~I ДM2]>N ōӕ.,ܸ|nU.OM:n}PsWB\#\e:Mx.{r&%(Zc)ʌ074Q/|i{o>*,wyaȈR=bW#m)FFa7 +|D/ex1Xodi2.ݧtNe +7Zf$Fۃ5Qt˓%@o2s&ن2˷LK$|Osk ElE@ giʴ_0F" Rj}$^.A"ƭv] MbHtGОtT˨>-IqkۓA4䆸ZjƇA6KgEŞ Z\fׂ0A|*YHG̏i^ؐe7w! +7eF)T_l%j96s_s݀*K3cKDB]/%H,շ/XPi @0P/HOg rd/9krR;u6eY-l Y! 0Kz,غ'x)%ĕ=?rc3Vk\֖#߈}"Ո}1v&6ޘ Q+Ix>)jfH0F~!ƙuy%NBꡋ f1ea&ZD)ʘi)0dHteaXa**7Bmݲ;A]WJ*=uSzC`}5ʬ1B)Nb֮/OJ;Hl\dc`Ņ!E.֭l/@]##t߹PrdX8GiBHR"*^:[g#fx:MAl]/ Dǖ~#W;Qˮ/1Eـb`WIre9J CEqZ-rum7خ@zaIʷSr.\nYqe2fML`M=["m*oCOZ{~,k$)\=E,*!3wjm@6/kfZ"-(&Ȧw\5,b۲}v$Eσ,=B? ɸ^keDO3~J k݂v]kݩtFzi|1~ABCaz7Jf!1?}M+&ȫi4nrGXWGW=@V=m ws%O6=Qc/}պ`n&c!u1K?ÿ\E+]Y/swX]0l~O{#o~i>mY@#vˬ36xfkaQt $`;o]( h+`hN#˘1&W 5n(t:a (%T¤7y$> >,&i|'x^\Pk>%.ӢpUSjY'yi)hJ+ƐQ_9IKLsiJGy]28T:'G=N6LINk*MesO̬0t61WBMtr |>KXE0+S1灝QNff&:rC>I{;O(L8n-7C_ߚD1|5 >uav:?_}fmaBح@ww)>HJӜFTGdDywh[ n !"#aOёinl^=}}Űx/wpy t7p+)xg.Emo3תypl!ot=o%{~ ==ZbyבF֡cDwΰ,Ĥ;}Lj@e.>:FhqC4a1J +!pLKvGJr}0-y>fJe7`yɨ mQr%BG'96(f冈Yeog\|#YڍZn 6&OUjzs!VXa[CĶwmwVv0*~76%x+Tyb~:s*+e>Y +Νݪ=AZ)W\< |gG2tTS<\߹'@Y/=>}8uUZ7ʳ) ?vRF ]QtH`&bٴAB6sYэhs׈ EM̘<*eJbͱ[ch3ĵ';?ҙyt +k;q(/DG!CAY^%6U jyNj#oA s-[4 X~5;V8q:~*%,}0NWnmI~,2CbPX®'.$GLFegé7Pɺf#V~ebUm=,@>S|"M vY#'a ImPż6׹qh{#Aj]-7`꼐 \1ܗ~X.yɣ* O[0j)J/тb)>;} WZd\zHx{-0Z[Yj >NTG/8ao ?CB:@99X-=7w9pǘPrmS|)` ϕp(*4?aSnF6RG|eFp +'X9⃆$͖;YROH5.K +vO?Px+坘sO21 :bce$H4]@S +RAVռ8ct۪}O[ZVYǁz'J)J_ ڵc!:LZh~]:607p,$Q7l7]dQ:=`0F<(u@mՇaufHŵ#Ptt62yx#2B{&蓴3N@ DlB޿G *[4za\5n{]Wsk-+msw%;X5'va/a{cZBE>Q]'/u fiLy"{){,jBo}sY#hSH X`e/Bą2vBvsQͮ ?PRm՟/j;lی-P̶ju>k9K ^j#Z4ԼӜ^HSDz/&|XT#*yvGǻ2= (z*P{ÒkSԪ>` `lb6 +,D;W5V-n)) np UwP{kLEeo;Tv6ؑVabĎh@=:--7,޿c/ SyμaB\R7a~ w|pZMX4ZjO-\o%֠@58z9&[SiES,UHK5׺%b.!v#G-Zn_h9ԏktRb(z)1O[KJ Ȍl!$W桱5)dbndLbZ(4P9b>uCMYtt_ѓÚ0/%Tȫh{^\[+6Ǿ!ح o/0p|Hy12Hr 4xtw," KJP*s wߒDuL˽ Tf:ս"0@U%K 54g1UqX\.ُ݈)M hFbV8VpVF)J϶v6TL>9V|SrIL#uk]o{nT7љr9L^ftߩtGr6딎-p159}Rx&\] 4gOM 9疪W{trm剀5 Ʋ‘]#kr$c|bxBmoV%hrBnF>Ҷ .78c勉 +`+|}#[c.Y}}s+y$ŀyHX}PiYt=ݴ*)Dc7 I6,/mM"!:vv(85VeOR,(a=e٧Kd3I<{}iPczSЭ8<)q_x_oǁ?/4lh8 VTz/υ@GU8y\t2O}3fٷ#%tר;Wgzb`^sf}7S| uUR=OQNԮKn~F0Bbt*Agp2bs$ؐ0Ịl >vqu(VLWWD6Kn,ᘇx d W]3'0K` y@>cCXM+SAbt9l@ yt}ޔ^BC^خ -AG,#]n{RCW*en>W|, SׁA ;+1=2YxHfa,y"hƓdXE=[<L{Pכ.4; tQ0d{!%],f%X $h}ed-z&{@z/ueF/d<] ;?UbqD oQA7. c$# 9Uo7ofqu8ujfE]=ON%/TވT!9kwz'ùji9fsBzD-C`z\fHN +9l%1sDU4wtwb.mKJ@Z G>$g)Z*R;2@|W} qde.{6]X|NU9e=?K0 +֑$IP $΃< ]#UNp*MhYZ&tդNt' Zf^ Y*{560 1  B"5$%wͰ]Y1y~SVW''x +d;M^rWPkTZ~if@O[+%ֹ i RH2d4|kl#2~OmZ +̳XA-$\njOȥ] b0A$yYf1!hY$w;^P[pQ}#EF[ sd'C-2:JR鼰5"DZ9dJUh}ĶjBghk1w3bh +fUJQyεD% a &{Æhomf_ٯj仞{_̞U[Jz2VLOtܧ+0U%Ms-zUO4oF3/| +;TZcܦS :41p]%MY 9PE|d +ͺz5Ϩ +C "f'E>F,ŵz<2X$?.~M|ÿyb?(2mfU: iGP7o@!0?P)qx  [`D ?жщH*'P".-_P*o;24MMlqrx1O^ D'zܾ~F`nr\h* +!sK43lHT-=ہA쩽V@M:>Pw{&x[`p3xxW1ଯV"2^%{ ܮ4A,;jWK^;zsx#[7X+~\@ ܏@Mt\3 z{Rߔ#uDM"!)5B.iҹncIfT$A <0E KNfqԾߴ!tM@ ְ ?|{ߟ۷?yW?we/_-<ߧURܺ_?7ϏϏOi?x5h +endstream endobj 119 0 obj <>stream +HW[k~?K^¸yr ryZb,KFߧn=3(Kރ@؟jW?n?|yo_wo>޼x~_[o8(tR!6a&D>)Ek;)n1族/VZD_vo>`u~Vr&4W#,S/"'J}P!1ȕ*\[[1 bۚ fjI$r垺_[}1uB>՛Wok~8Mw*v@՟ӿ_fLz_-tx$qY^޿;?Kӛ/{@5Ӥ.ERj%OiR П C95g+0Lu.Y,sb7ޞyiv~7u>dkIZmʻõHsR6ޤqّm?եl- '&֤U U^ !F` A݁D>g-LMp,!Ȇd'ysT6wn0[y+ +I=Pp^cb?6%G_ ݱq<3xz﹙XA(hﱀQqYǵ5&x"x>j$֐#~ &-$/vC85W0Xع"SDׄ29E3( ]LlV !\V# cW| 'bzt⊈JlHI5Rኘvj*aҀTOE.!gvS T59>hӶK1)(F^CH3L2ۇ^B2Gd%[$r1(D.,Xy)`$1a |}aKξX'T6"#uH5;pF\l -:s2 eWF.G[RJ)M}Y{orxs0;هsY3Egx|CUeXrV q2_=ㅏ 28%r_.)vǔk[N~6do1$AXrna%yA00CfaqMxzūNH]:eg|l,.s_`)[|Iͻ npi՗4Yϩ; d#Xmf5f"ۺGJ%5*,e%a؇bS=rQODuGTQ +Ȣ\(nG/ALHٰ/teXG傣f8Hf'ro}}~V/b&K*툈9#CW'nMJF .dZ#8E=S6ocP'?ڔQZgǬvvyU]C*]״)jqr7:E2P:ilH~=挫QĺՋEĚ߂ՋX lTL[}qK,`)Jv|c=,ZE|11"pzúE"&5L'1U SIn/ 鲲g1/Ee K!^[m $:/BL 5)#2ς; w +_daAa u\`gi%vqc9E2 +7ewӯĢ&,/}#Aqj R р-뭱b +z4z|5 E?GbW?XJE}@^WEB Yqs)!8@lnJlRS+"mx ] 52&[-9"=~(ֆ%~zvYd <(kDW1%fOn\-T iĐ#-^=2,k ŒE.AM\J&R-4r«譡xX;D7Z5ACKDХbT  M"%ӂʔ >Xx! $oܽmʙLܩ% Xl܅ʼnVjrKҐQ%+qU_Yݫȅ03EM3*:"w+J+2:l4㋶5{OyU6]Dzډ!z1G7_g .%=݅C"dL:&C4<`-恈*ib$l%ɫdU?[+>VK8 ˳m<Ͻ"ԐQx[XaO[O끮Jn3B8eX6WO^υ"Ʈ\guQݲVpA<ƣZ?M1䙍^VNO:Ұv>b]ѫ6ݤմrDbS {s~=1@J.Lt ~-㉩slPYӸLwD +SSdWt1pF d6vݪl"I +GtWy!e2?}cĹ&&[+nXqhO2Y Y&]~JIөʹ{R$j vYF|5e-Dc&)x< %{Q=jlq<σw^ݽR[6(j\wev 5ՙDt=xRZus{Lx|=OSF2]7 +`Nܩj6 +ee.ơq" +^]"+;@v5*qh;QJ*V_ȭl n?jjNf0irVh]fl'BH$:!q5Z4WVv!_l)mde6d1P@!>caג $c6\/f˩LsY7Ms1 gh 3vK6uqfk7m7-Ek^ EYt%.u.5֒pT.(k{wm `u@甊c,:nC,{Qy1e>__v.nk9.e9y֏grCeȎ"R=*84U$Lr`(1昗r͹_Ha@k6ˡtyL?GDNjj3tN3)")QRY$km9eg]2HYj"m-}MTzc˲ T| m_eԜK(N_9We.=?|_ǧ??@HMi1'swlp u-BbBJo3D?rS +U`,1]ly9=0l`]G+7kw E$>6yUGTi+ۯxfuKDjހ^Hz?VyHDƳZsZӭ>K!u暹D#hDDh3<#SS8HQW?`ovJǯ%#ejˈ~LZajHviR/p!Oռq"ؚ%$z O\k1F|` DJȌ o6+ wGVs'%=CY%8jƔD1/]Z<%gͳygԏkbC#1PKUw/ 4xa^ZiCR:B N Ǘ\gڇ@ZQi7A*Ą#`";V_iKg/=Y &j|-TcA5\ H6-6F%!vvݷѮ>g + =>#1,fyN:S!Mk2t-yơ>dm3Љw GU@7f4U]ͺ7;2 pg}+6TH]=!PJFW)qHM=~6n% wR,sNvĸ͔}d*:tm}XY&̋OwȖ|BԋRpdxuflws&=u("Eҹ-eV tUB!JmH^xkI;QٹI:|%kf8q*! kKAع<ؼfXB=p I{ :.%F2Dl%@Հ5xQ3VElGKgHxǿnExT,{ehY% ?͌nx +ʹ@[=Bu * s{J~:G$2a%1Zع-֞13U4JF,!rm @3/RDV RMtK\6y^.~˂#f2dbapu>aSgCl1p+gº!Kv-'T/_kCoRkG V:B0(>U,_0+'3tjt?rz>c>1 }N {NF +X\UqT^ Nb>u,+ S aCciDXeƜy풟12ΖQ$EkӚ0\'D?k :%*497ǩ9/fMJ/U +UyUܣ)M o4 ^$f&PJɰdW-?4ԟtuԱ_TP#zo3<zQLŞbl`{q 8k{[+uMgai3?s Շ +o( EQ+`6]%`!eqc׀Jpi,s7P}&>ޭ\?J +gАRc;,ݐ͖3XjeDr -ypрLzDkEՙz0^(sKh#zCٗ MR,+`Ơs,&i.2qT#(K?h.IBE! !+_Iloƙq9 b2AIW0TvSj~~D1r933wi 򀯀c-Y/0Cp5Cj鮢.gx4Wus!_vl5T&Y4˹L23ȖLUD IDAWzk:?/PI1R9#QLan@`#x;sdwȭ@sbgɭ@3-N6ftVNo-/jF--O Ks-@d'\-;Iߡy'?7'sg;PGrm(6G~fjVn[}->5MUTK^21)6==̔99ƅ|ӭ>fN}rDN}ĩ. c%ܶ-?xGT[hmb!9ł:)z+,zVI)8rXo1;¶4 NFR'c*)8AS,@aenX[TgұnBzԤ^EtKB~ْA>rae JNlċV`t'Z9-ZFң:ž;r'ZD У񽂯61G-ߊ9ZBwz(nVQ3hpPJ8`OG6R:*W'l#U4~` 0Eo/Ur٘4J9 + H}DF.{\וSx,jư#_?C4j"g6L9pvD\r$8eU4x,VUnhy`ԷŷX6u}LdRPH҇\^)1zA`lKo\۹w# +Bۙ"ɶrm#WtM>1#=}gV(` ƹ@&nK_2=q.ָ BSh4_kRhBsWzqMu6}5sI^WTp~0ܜЎIa&ޞ7>z~wwD1?@: ''"hk[x{i01tSU! %Ts¨0x9AH?$J3;^,B́M8y>g& \PHfS02ٽH2)΄@+C *[WmٲvC!u&ZΥG~ TB%G7h^F(߫3#t2NJʾnU_6Y^Z;%XZvIvPnf4غ )X]~Σ,۰a͝!G>8u 8uĤǑtDNsW)iHA+ZI cmʼPA +,b+%@b0h) .jb 7ͯgElcKI:=`qyL\]K*r/0,~l>؏K0d/VR6vn|?j,WWGhMQ#yyÔJ)Rіˠ5)'50n:"k +ʮnS[T,Rg&*2h/e +B12Pw!B"~i "L&eR-]H I#%8RR% ^ @S@'j'TD4Db]CIT\/_GS kL>,G~foeBz/*;u(DhɘJmɔy:kHK)O# H]Z.9 $yI^JFӃaײ+ +pSQͼtXl/}pRWM?Usji3d +dhWpE$L'C댆QQeȒ{c!clleޒ(J3Eot#n1CjrJ\dҍM%H,cld b}cNeVMhOȌj$9*Ee]Jnc!QSۈTe(g[I=%AmxyTe!2EX7֬qYIgI"5\PF5#Ya"cȭ@̰B8o"`% u1NT}^ N,&]5~ԋey?d7-"%'{Vh]5' +@n Ng;>غ]MCD=PEd 1ɇ:erYpEw6xQh"![ԤQ.ZeԱ7OÇx{,.yy|.e~~|Ffn<>_vwOg|{_!ox [ +endstream endobj 120 0 obj <>stream +HWV}c܏]H*A l#n?U p㚫kDV#m8["'cJjB#'#_qZאSNf+heI ɚi$̕|?ZGYb5#ds!LLpw`hnI3SxO@U^儝/e8[@;Zߢ:W݀ܵZI_&3|o2KyĤyy4`|.t+2|u>ѭb.ƫĞߥlYgtF;gCR!o9:fy`VP `Yaڄ K:;)GpwPUv"UܓP ?p!`'7{ - ۨZx6 TeWeD}:P**DBI 7V+ɑΗ4鱆Zh +5GEeIP |RҺ +CEe.SN&>lzSro ,^?ښLP6T7+q|cV 4G|=aRSExc'M85#Xvp[]|iMg,j<~.0SET %U{5$q*WEĵ$ nlZ |WAbq4U0 sE}29-)=SeaLäʥ69ͧfN>/V`R R + ԭ/}r t:;ܙ?O/k׽j#6ZB {d!Z-Ykƨ -G +q^w +(}NPrq¤Ģ3W!GN8[d$l38ObHgr\xh#.YKٻ},ޥcZ^&¸旘8-Ӆ%5AMДojQӝE(J?p^%4 UeGЎQA(vYW5qq"ogp lNhT.mښo~Ku tOp͹/s3^yO0< +u r]؈Ɛ0Y0lOe,.;|3F@kْ֮5;IZdySjbH_C5{`tZ&2mŔcܞwxv3 +X&u .kݭQDh"ύk2<&ha[30u yi[̑O7+dꌉ3 5 !%j'wOxK!4601_XfB+rk3G&tPur,` -(OL&+j*;POfh>~Q8X - ۨg%/ 2jv00.`G +TT\zu%DBM B +.BSDxeוUg&=L&Ӵ#v^s)2;BwZq^*7TH^E6fMe6a*&2]0չj-1V߬P*(`;HAdNe9n9yĴ+5]119>Iۘ{ 7 Czt?<>}h=F2Gm=['Dc$ƵyɲqWrLy'Ӯq!l=su6߬ Vaw +@(W +7T\>[ETLjMH S'%W +8of93GYeTKmݴu-8tIð:glmao&_b0> s4љOZg=Xoh Ps_tk,(A7>v /p:/0F +QfZo(B_c{Cy*8+(?L+} 91c7(ٔ3hyiwLMЕke$7(O[ c2h~lh )!'GdZ!>b{貂B>ZoL`M8p(܌[̓m& a&_͠bP}iba?tIcRoh 2̀ZThCFhpl Mc8397Qx--w>K&̃;дՕZ{('2B"GU݄kg=:ٖNeg[>ڥ]6 f1Wx]\i{eko!y4@/dzV*9J~{H%LP a,i P4~˔{s=`$]3DJ@ijBuL.SOro"dЭDSM6|j{YcP6V4Jp4t&2f<6QiW26>E,\1U+-AkKyk#/1 EWf9PTdlwΖ2XŚ}ܵVq?q20!fM񤻶JVŔzR?O{yPg+eeI+#><T wLFW( ūkq|J|--YR{}VKM\ DzR}*7NCfXUiYNJFSzGv{V]G}a7VCo1> WouxnzH挟snX nS5&ny_Rxudyˉ +WFDd=U' YȥM3 6n3 S@|~*euQ|$k[A"]>X_Y&"_o41bX a" 0Сv2O&*7I3bmQWq x\W߄oEῢ˔ u$[oʕTZJsTznwipiNX/Ƌh{1?_/ڒ_)`6 ݘݻr-X峻VjIH?t$#'B6؁{h9pcnt݊Oo#iSpxgm}Eн .;fKXXcf5PCJB:M|=X>~WNkyζ [HM#D@AfAQlB/ O{vvΜ9c m-^$Ijĝq,^ VbXG:DGn~ޓ5Vtl[3 %~S]URe֮G_ Ԋ^+=ӽ exnXaarraTLѰ+vJbͯ*Bk1KTT:"\7j5? +,%{6_{&/Lj\SG]48"OtkWJ3Ѯ6xѰT(2>MM  1wNBY®ӫ=[wKft-F_TMUouqQusCg;'au.)?ZAŭ*D %O%.!NK.HrPFz[9Af hYf5gS,.WiB6ǭe5#)yz[LId i/~!o1NFǼADO2Rzk4zsVGj]yc_<ii fw7̭ײ=]0$\fiNWYo67-yH7 +0_]Wv1]n& nrI"v$$M,uo^`Hul ~\(s(ϣ3Hso]S>[@E jr%bB8Ō^uМպ"ps@3vx-KzhR:ہڦ3V-eM~S-?_dpďV,;*ZGm1R@#G>u#N ʮl 1b42Oo-,L r6ArKG 'V'2+Պ@_QdQ&ǙY4}⌒YmN~Oa_J)Nm8uWd%89FPS-rEH[dm$:W<0\͆.5fJ9ue@rkx_'M3yJۭ,Kf6#CGn8^W^buh}iT-Y)z:y Jy,[1-* ŶL1/?e(lFS4q`UI1ޠ8s\p09r/SPuُ#Q 0c>x3Эj/-z:XFr98(l)M1XYKRlRym4SD1t2ce+˱7ft 0?K:i8Ebp`Ѝ0ϓV;p3`~)X J } |{ʃT%EFY˒"d>̞O(֚IOr˓UAqs! =Zݔ'do>) \)V^ޥydTD}ʟ^ D$72 O"&'I*% ^:Ÿ"m@䦜NdžiggqFS0&,ɽ ۚ~n0UܜpgmkU9sS:Xo[zN5-V2ƨ<UԺO.X%}Lm_탟)<[ړMX^&R/O*'+r­eͱR^m5h/̴h9h 촉Uzjl۾F~sV 0&b&bÌwEM\Q ng覙 ,}s&#a gEsuFt6fHuj&bs@Ydr ga u1D 0ّEvK<םF['I(ZP ڭ- T9r'>,E>xRh!L'߉8%Ǽ?,`ي59{֤sw}rs$)p$`Γ&9GgaΒ{s*B@{al$¨vԪ}c mioP +e݉ "v9l՟^v$$7RZ}kxhΪR$T&n b-Bm@eZj;룇=de&Uڕ:ߵ8(CK n2-3(  **ȰtMW=$;y$)/8ܸ48tw 0Xc+ +џ ;qz]Ar if"LzsYU %߃!S#]B*87oϹKy5:/uQC>@,|WS'BW:7"OwE&R:D\t +lD fD )}5wqQIƭ +5وةQnؒww52+) !{IF@,h:pQb#ڗ%H^S Et…4I}U"SC`:V54?q5iRjeD9d#]ϛBvTZn-KѴ's2Ww~rrV1F L;Yy$8uy{;/rV83Φ^,WY.h5aYK!/٢>1pUwcz]\U6nuDlpۻ`c{c:Rw.еr{9QDW8ےߞuυ,̑2=zܘNt=*&Kk>F.ʰu{2Y #98T +ٙ*PAkZ@K)nj ܴ6{U +o[*.J_ZF]4ToX<IśT=ηT_uF˲U2j{oUݠ*QkMj~xTA@s&̍ijj2 s&^opMjR&ADZ @@’&9SjO/!|92G zVFv W1)("fд?heB+|;5"d6Y =D,4 +7keiܕ'5 }Ĭ Ac/SئQ[ +vp=n8~aJH6śŃ yo {C&JU雙,J+WYw8ab!Мy|HB3m_e4J@*F^>Fu 9u v/L9@B/} {+r{3So8CcVy-<֗Tan&z }|QȪg$m`fFzmƁH4Bhkw@(}YbSADEYUV<ż}yY[=rNeė2Q>3Rkᣀ1Z};D\“YeEAc'CMSc.ILfmr +J`v&j ?Nf-G̔ߨRbꕔ$031ɞ=n %Elue;}d%M)_7y|@9 vIG3RރU7*ⱴ-8#q-uJqDީNy`!g{E 첊+gd7W}RJs!^ãu$DABY^_Z)#-@aB䈟d g:xIؐ ) ,UeuT +|mGwZkTe\Кۏ| fC/W2JzA/ HB @Lþ!8(3uA{4ILg6:1*:Z vqVG!8YYcלa`ƍ,Pwm +exY8*!:S槜3:|fx~v oϣW}n#{ 04GCkC ~Q%*ï&9^fgª"!F 8Fֱ +b\ko y;_ !sU0bKh;B~+x'Kq]Z%o # *M9lJ](qPz>ys"7rn-67R?G@e"irTzljEtYYqGǰ ',:ὤ_e';cc +Q,miai/z =dھȒ^֔vݛe#=R?Jj<Inᱲ5]4#Q";w7mguf}qysZ>>簍Zm/4( 302do%A#P4 %GH+Tj*J^a_Y/JL1\>8gzĐ9k"8wŽw ~ܜ8s#Ȏ#^Y#<GƙNBG῍$Lc_K y;E?1Y촢'1|,*Y"Kx=kh&+gΡ@r: fLqϲڪqČ3dcoeߴb-woشHnIzcRmGz$疗S*_҇f~P\Z#0^ͳ%R%.:nt$fԼO\v[\sd$`exJ;##,BG\N7-9y@Fr =p"H@ tD8dj"k~(LS9ZIʡ`0>ѓ53ѶM HN\9YPt +UNQDk:H$N4(\\Q s>9PeWX +(XTUQtjl4Q6aP5J\D✡`mD2LW  T Q8YC%9YԨP4sNA +$*(8X lI|&n9AVt*T0)pVD@DD?ex9BV +GDAz8uK 0f15kBY^dy^&{օ?.gX6i=[]&xʓw"5N瘗_{sڏQyF[ ,wذwٹ!§n \%uw/ʡZE ?9Ef|¿ebG9Hx4v`v俴ɍQ㴶!G5|x_o\E iQU ?ؼƅ.UDjԸ0a'oӤF[ Ųu0L]CS䣇yg=öd&PvKʧ C?@Pp8Hė=p|.AG +PM Gk Ozل&Ad P(u.1~| ^=~,L 9W=0*lr~44u~<0A6G $+4>`Ik{@UCOBw6nzapt+N|p>ֱэpq' nFRlq[9;Yx7U<$;~ُXݻhɺkV/{o%X1(؁Q(ہ)nx>n0pd5P@Ed5׫Clo1!U5Of47Y + g5J%*#] @ӑy_oW} bROmUaո01ֳ3J,^l .@QK#O folB1:"5=#F:ÉjRa{nGfj44cX?7@d76 0$ ?ENrG9@fΰ#f *3+5)G5|mRPcD %#18*ɁɲH*?r3n>?Y F7j0:K{H6#< ,KV6p--j|ȣ䶂NhRaA Oi=ˁi !W=#ujcAF׬ >'}5IWQn3E 1!y`&}M vMrYo&]jLjɍ ?9xlܸ%3|ݨО1+^_Z&ɍqCU XnN/ar"p(#f*SVPc-A-HקWlF3fl+Hc14Vá>v1@v?1r / /D,YG:f~Г`ՁWl Dž!S<^8+L +gD~?oµK[LTtݸ$;n@)6mcCXT +endstream endobj 121 0 obj <>stream +HMo]9QWhIWŅ:@S{HjhC>3&)Ca%6%"f['m0hKbJ UMaERCMf,FjR(JY>wK@ +svbj9W#0YtB!5vn@!s2JB!Gz[)q1֠%پC֔k3 +[WFC"kH;ď +CmI2߆$HYB1,vn\tьN9KJ : k1'QB-d>˞iXaNٷz=tBwYT,GAm-ű&Z'F)j:` J[AӲ%"z9<Mz9@tr(- r`B"Y@% @䆷L24wrz94VBrTR&9&@WP÷.$&&K%@tHycR/;Ɏz`(z>Q^lEܯn%]UB^-1,aD2>T:?H:=:=@HA=0 K!mz񏥌~/T&?y/`<5@*(,X' ~hAG4Qa*+`fDkI=Ag?|`lw? +#wxf4豲PtT~Wޞoy?ݾyd#~ǏMW4yu{z8xud ӛtx?yiU ـ]4J +^oO(yc3G_93a֟<> V7?/:=to>^#oIE J9R;y9|Q~_tfPP(L2ݐ2 nck$x) r|oϾ:|ݗ_$K!d=ΐEr*d'pTB4(fOn1 F=8i?}g% tĥvJIK +"t1 f"JK,)Tʔ Q4lhV!簄X|T)TG4\뇀] +zs2B\'m2Wteڒ|Ԡ".+=FA +҆ᐴ."J>_&٪Q֞N8#d #μ-v5D+ S%I֠aWs;vZu۹ 뮫Kxe{=nbRz;T|y4ڱ j<1ò$,NðJ;f*d?g;T b +)p;;sNH&;t)hgF&; 3˽ Y;0';oUF;|[v s$I,>v=@R^Jlapû +{``(iOP(5b0 E:=@4r44aeagPcU @袃ySV27 Wb @b-b871*AA +I.A:1 cy#Sۉ‘4xJQ l"܎,a F0K 0dz- vKUx1ZޫhS!-@4v 6Yi:ZэixΙ-@rc%׍QqRn`ٍ&8 +jdgD$f{e>7}Ȍ1ɮ׌Q{2a/ɌQ=NLG36kr9ΑJf la gbYOblXz" +iQw_~pH0{QR$7R(]'G* RpB0Tz>'R['3B)͢ś*;᠋`B-\�*Gjb^QhJtn&scy02Gs{sÁE30/E30}If| f\ +~f4rhi^ m=6323&ʮ5bjA5Ǯ f!A [R8gc5@pc5YTcj4 h~#It/ 1DReD56Q 0jRa59rIK*(fr +'gĿ$ܯ_ug */ )Pa T8uMPZJT ss|#jʑxwXZ&1R +ĢԊ%;P}hue9nXd CrɁWZOvKG*Z#,Q +lSfhCSrmT2(*j)SnmO=%l؎\]Gg=v_(ϋbr8S՝%rtLh$Džo]rX=qac yrdQ!,Gr\r<7G̱xRr /rIr Z#NZOr8ux"q[c+G96[QlVKr.Iw(ڄKp a9}XjiH,&3ɱ>n$$g WЩǎ?ך8&_9zv\~[p=h kG[[x{} !;>%J^= ^;aڤG-JztܴɅno8v8X:ɁTi\7{H䶜+G䅏"c~h~ ^Q,@{W(ƅ#ևF1.Mм123\Ղx3}=Elb`CQlQ @lvAbNhpڊf8FSׄ h=+ 363n j]$= O 񳸝!~8wPD4P>ToE;w ہ]8q!*LٜCZs:78BUz}L%qr*[%A+~9@$DžA-I d90b9-퀠5cF G`Bɷգ +SsAb8AF1#Kbu/I Lbvum^ 6;o H4hfd3@}f` ;3U + + a1Z\(8Gt8b-kMZVV$gDG+l8.vH}_109#j31=RNfjpRWf8,Rj]dDkE303ckvRcנ3='𲆙})szhE5jO|A @DNnFr8Ң ulyL!(p(Bc7nu' +G{Oy rCXt[PϘc{x1*Du k$=v֌Pԩ9MyJ'L8O epp- }M!7B7:)1\>58q5l8-ħ9u 2`zjulkX>)Nj#1|s~ծ 1|չkjf,j8N}ŝǕƅFjGTOPϘ5Y~>4qHt}aX 7Ś'7 $7 _ʝ^7 Qs/>;3RwX%7@جG7*VpXjr8\Ţ~ I8WLwU(RؤG96#9^6=rF K)Gh~mNJr1v# 45V+&YoQ.QWo&>oZYxGsw(QdhA]4͇Q; t1\3TFӃ6hm˨F6䱮i=vXX(Ib2V}Q+q+#>%4hك6 A;fJBm=$JEKނ[KiF +42{y@iP/.!4+i𛒫%ilG Rڠ[k +Tmi;AܣmC*tܨ6!_ڠMpNÃm 3v:^6U:Uu0r"^E(+y0$r>2]Pt&f꣜Ӡ<Ҁ>6|u}01cM ޜO*Q |^ d%kK@VXL0f}h +>>&#7̓>. +AUs/ymhQw$nw4(ޑ": 6Hdm *Hԟ9 #\݃:{PJGӲ \'=D_Ě}P׍V`E :olX׃\EUba=X +܃ ۇd +f$eaLAdAX>\YKMVsgE V+(gC.ǯ?oS-%U.=rz<t}8^[BvY;{ߞo?wڍ1r쏧_o?]n?_ngt3_4UE[q{pG?}lUyx==|wJO>=}bֻna%ҕ?\ g2O8Gç<{Ws|m;(m5<=߈ }R4TjP*:kX@PB]g`aVzZ >Vh+A | +[YV5QS(lE l§lE8JO"P§PيpmE` e+V$%J >VaI 9 +Bh+=- + *| +V7PAY@JVbSVl DPJ)a^-\ A$| +  A$| +5Ӣ ) +g -s0I +`w+ B$-x@p+ BmaIZ V>: bBu) ,YŃnS9Xn%S-s0I >O0baR-rf_BBIꆄ!!tTBCņۅ`=>А /I5(S3ےUneOjŽ {VlB0| + ;Ǜū\>7`!xM/D{ çP5`4tTRhNأP$9@ka#lt-O{45O!v`t +`kj>꺭'ck[Z8Ւb§j6V3t.SVfp2C^8fp2C^UpڴPFx2CVlӺ +B.if(w8O؅.ivnq u ]Rͬ`U.& I @" | +dd6LMc4(~yέ M"EЏ%Y貌q<5e7Na` YײΓ|>Y[$S\] 콏eZMcDSy.vɼ[hG 6,{SKh `>d;OE +}9jצO4o KrI$_olr9BR] چ%Aٔp:; 16tvkˈư68ȍSJ^o 'HZzleI^߆HHթeƘp.r;*Ó'6}'i,$n@3 ~ٻqI'*XJܓ4v<[[i%.m.$/:;9ӠnΓ|[oX`of&y1}|dҟ@\gwyۿIs+Aq!ej",k#?;WH>i#k>%/V9`CYKrl(!8r|<3#iF:ztyi4ΔL;yQO>7߿O]>L]^}ϗ_/_{ysO-IemL>\}FhjNeBh[)>ջo?sV=\u^~xyϵz([>w ꇒ U&kKaЅ8  pgZۛ._~ޯ0(ݦbYOe'h0eaΡ46ݬuSeDy+24"u?xi!gRZyy6eb'<{k\9mSNF'a,"D?0Y_m=KTSܶ̄@̙p!zNz"$W ]O3!!4FB(UQ671A"D"$D%Hss$~"Hssn$DveC(O^VRIh.}OBZ3!POwj7NBiυ0Ҝ\a'–5Y7?B,]e#d%%_>-M21l@Hs|n UV%~ ] }n!aU%4g[B7˚ +)4gǗ s !rA<6JJ JWs!+ՒZE5iΚoYBH *--TZZ-H|Ŷ:HsN|>".c˄Z#\; !Z#Ghi`>7.灷)qf]gW{w7!o#k*c֜h~BvQ_M⃹w:=hz" gZRi\8F`W9HcwЧkEH"50'!BY(Ĝ%HNBC4!o$D9g#NP4aoFx8 Q&.5gRkGW :H]Z%''uF񘠹|!wp)n.B$g<S\{F}[ =㾈6"D}HxSEykg!O%,CAB8a.07,}Y[1A͟O@[ÖB!2WGxLPÁ'"asM"B<6" 31NB/< z-)4g0>Bwymy5G1A"DB~=/)d7:ְ*iG `.} p taEit}tOGyw"e[&'\|!98 2ԙ,Abe>GNB$ET0!o$Dƨ"DEj$DY Q'.K$1>I?o%=𘠁OEaRKd't + E}Lc x\+|USex\)VuSeSă"XAjq!G |@8io28io2IR$qV8AHAs~ 8ƣa>o8io 8i<^h 8Qj(5NgysIj,5N'I9,4QB dqV73uuw_?},\^_*[㪭I^Dl*bʥ?3ӝә5\bd21s>Br֢NB"DpYp,\h> +B 8 ὐ B@yI\LÆ2bU,D +/4!#D +NB$+,ð^Y>#|<3"{D&@ 0!AB,m؛3@ӡz, 5] tr?:ȯkm_k ov^70'S-!s0 +e*+/Ӏ!K +eLnVlpkě؎LsUc)I:$eRmpL\G:Ŀ!Nѯ 87 Q_0qsA(܀dⅵpy[7-Aѯb x?MGqX 7prD˰;ΐC`7T8~O8qqjlPd/dBxǕ=QQOAk/=8~q*܈X2*1U +[:s2+SnRL$+/I:@?w\!a>L_RszlUbw\8߂ٓ7a让f]I?ꄜ9uT [%[_IΊӯSX +nBlG~$qVU8QMd -*aU8pH W*ĎlR8pѯG0X MwGS REF#h{)J:Dc*>stream +HW[V|K@p64!&É!FE}eZ9!euU/k(7GXxYrGx>~|cŻO'?OO7O/G/? +x ǯWs˓Wu_㦧\۶MyJ}KeGg%9kIf)rYz;*d 5!xkHld^' +HĪ" ?X<'V ~ZtA Nf;!ee7;"hr!? 7/lXϿjSC!@RV(GUZJ9H:QA#mTNw=Ќ@HH83rh"Y֬@G n!jeTui{ʆ\٥ݴ=59A#eC=,@ێ$j!HԭD> {iTlBe6TO]PusA뉂䳊nFYTu;:!@HnE"њt` ]@PjĄ|1 NZUIG5@@UXrjQF鉙uw=k5U7jZ ߨA˺[,Ne8Q8t;-bXr>K>D$ݨ,\H53֠7:ag_\t컃Ԫ٨fߏ1!-@8A 4F5;[Pan:KR[u_T䱛.ZiC' +:ͦy6?kӵnyݧsJ%/tYb?=&ͪfw٭򘀄s?;{ e3"CqG &!r'J Iqc eN3rjyeAuBf8ٿuYqbQ7IM 0۠+[/,4a}P/{ GƳWo/O޿{kw'߿ն³MωY\r$?'ܲ[EgрsIwTA49ɺ9C@;7{it"^]H/b E7@*0;D;nTmQ݂s,qa`ܥ{1u^.t$Q6 mzH]0k&J"hv;v 'Bxp"m0S0LJA&1L(5H?L"PiU7J`pu~j8Y{ Co{}w m/K7T9 ɓq?ı; 8T`fI1k,d\ Q C$w͍1I-11`E#n F {/ #M fO]O#e5]6cȚW_]hC6_'lFRo{u4fAp"#>$G}yn1}e_Nj.}ۻ􇲽_QG=bL@NUvʋ' T4IgФ\/?|%=Hl.8hf'?y0 ,0maywnAW`1l6 lF0/ +52j̬!?eCgsu6 $}n69 }_&kP5zșESeW[qɞg˴jչ+Pus¿X b H"i3@`䎅TMTo +7ѳ`:k5@놬V jQQ1 NUIG3@!<0.Cv#OV"vB\Ȧ!vMȚpZAfv!$bzg$˚k EaIdC*0lE`H3ւSG@@*7?'*MY0 W +g4qh),;g|+=5A2/4\j <@=옵 #ª^,"P5Bq _3qC֠l//(f Ѝ-$N\ 6 ⭰K7>ctṽFr/Q~Ʒ<-B6#gJs +ݬ U^ԭd+{չK&U Y7g,7$n2k) 䀤Sl0@*6X`VX5:$Ѩ-8",'ɍƽ,] @ԽMQ} u͘bYwHn'bN2HŁ薌،k)\6]tQMO`J8QҲSqيY\J uU>;]UïCavk+q8+c3ҟ$/jkPԸ%-!Q;,A" 'e;Y?y^u4$X, jď_9N &JɄzlwidD%1-v U[R,pqZD/)v҃@E/Yܠq♔x{.$'+LrEs 5}dh/^6/YB:%"ś|&H.X}ڪVb[`_@Ve#o6*tG5r'.M/(+!q^_IѤDY@TTgl#q^2Hw}9 CHB!Hv4VVaPa`Ox#(_Z0/u{y=T,I7)3/Miz ! 9s [`Vgv%%%=\jHW0/w˫(U)\_ZVٗT^d?ˬg^~B|hDiG+˪_HI."{ ?GV{uQP!BJ%wb_q_vTv Jnkz*vld3Ś0kƒ/1/dB?R8^ >r/ +;mna}RqxP ֩BoRa^ghQ6~=3 '~{'hw2ò+W\r}, [x@D[6y>k˚kINoG+Ch@h?̞M;*Pl*L; ?vj~와զh0wX#uf{R7vcD'Nwcӧå.f+h'2* \]zZIJ~/[[ݾձG&Ɔ _>D83ip* Ll/ֻ#*kv VqvvҬ \S/:z'h{t_A)om¬FOvIWD@NVT(Ɲ ),)oq 5y#K겤*~#\el' 7ã92UaeLѓ/Q\9{ lxX -wwyɺ*o:g}Fr}w=oE@${KDM肧 + ;=T~;ELqhB2hYu!B+\9{$q3!mfbUFPK*ʫa7zf1>T^ =l&4&TPY:xz xj9ju9ʫ$(d7L&C6Wm$THr{ l<*Vrږ+P!ʡ*.ݲ_Fe#oEN=D?tabb NT(y0]yܤB)b i8*I[I*$jV*nF* +C'PUzWǟmC-EY1+;AKl'ܝx}$'d$&7rlEP)TMH.-\%+0)@`@TrGOѧ&ul_$P]ίzy貝t+fCMuVW-ችmɡ!*naR<\j}?eCUdkTyI.h͖9l 0!fe1|.xW(WMREdwZ& 8Im}}GtBN oW(*G;I;݄㡮{| +Zn¤K5qfMxb_2Nb7Ibgdle. 'NP#+guxxc\fH\. v1N@4ܻ.pc~dQ i%G3^cuJ1@ty2ވNYL3؏k*v-hikN>!3׳ߪ*!AjnOGto_PO"$0}Be B%iοR,l%U,o=p(+i){ʱPd5;Y쏓=Rp=>|TuJ8N<}B,=V$YKB"x"; +yjٛ$ ݊^86;{1G-(= ɍɴ-s猘&BؤRi?=5LtQYdUղtJ*Vb3g,kZy걼G-JwV${d_峆ʒh*7 ;g,"-9mid55~yF H% D',,ur̆EH&PBTϮq}p2ݿRH lP_,%~+c\2kab-9CAG/|6Wֽsztrlc(F~p9-oT I8F HYNduD]XT͝ZTVIZOF}9J n4W +ܓyqXSBeBAPH9ř~>%{`%`^ ##*ȿf}MLP~թ%IyXEPEԍd n_?_`vӉXTҰ&}"}J'rxEvMJUc.r#[ 0Bk޸%eBHΑs.7n;7jsu_#-_me 6%fc8O]#OP%37Ģڤ^,8[C.1-Bp ̂B8+ިnq,{.b*R0{dS a¢z(inZiʡw\!"cPkG% BKdY4e)O94%ZVyr_򟄮=Qy؞|Q%xď xHf~"'G쉴ɩ鱕P@y[&2J'1V%d]/˪Qɘb[= +lrnFR,%%-]#i4UL*Ύ^~n6bɱ4as3bo0ּqLzKkĢI$g<[ kpި &BE`.kkIGoF ;eG8K= |MulBXHgθ!iY#0:=o{Y B6cen89A +kpƴb=HM&"YUeFOZ!Zb_3tߺ͵}.+iprW +V+G} J9uTOf(Û}~i7Ĥ[`~.6t,z;=8㍘h޸U"Cӕ< @Yʁ;!~:~U)7bm ƌ܄r(,~ͽĭG|]z5`-X 5!V3~Y( Ugo_r]~ +kT; ]7 ]+U|Epl%w::_BjQ'1Q@Wo *#Y H,,%&dg7|b&1$[ mGDXѿhVz4lR[1 *-Edi5kd蚘)a> kXwj7 x/L&@Mx պğf Ს()TkBfYDc%rpYO/Bm9C_4ui7Q|Rd  > ݏĢS9cJB|+Q4cyTnTc+AY͆KdJlr #95[Tn=wΈYP'<6B_#-_3t?0t[ N-'~ +y7U"nypOWUE_sk7XEޝ"; B/B/Z= +i~!BE xyr,x }|Pר{B,TS9,=oy|7oT  q'u~KE+xY\ Y8fWո&:hC]%?B*d鉐Hxc+{i/da1&ût;PEjQŔ  -:`L'б NewR&)K}銾SO]A`o>1K{$֖X]zt9aEJu~.L9*G@%w!jrұͯҎD1a ud ru6/Ȍ|7Bb" ˿7^2\z!;z^%"1-TȘ݋YGdYUKX:$T1"6%j"VR8e;tAK|OǾ@Y.aZBj_Qι⍘(rh麦 P/!(Wֲ*$:GCC} @JϒuNUHQ4@4ہ-pfä窀 +QRعi_Q ) M]TRA(kbvֆ7*7Lx éQ"GW7N';u gae7M2iӇ=gFS{̻ثϯ. oIGlb#cj5 Z=eDhkfmlԼpSC`{auǓ+JO0ꑼ`؋]6:pXsڽ2 aNqF _PíL޾?rU(;hL!)3"% rhPlA4!iMEdR 2':wUluK";XQբ*rp]s>}>5jД\ pD3>L DjhWRJT@(KU#%ǵW""ɢ25T=DM/3D;&ڕ[n¤H4_dD SՃɸOJII+'FdG!s8GE7r4Qx. Mvo߿А?Oci_ʍDx<=;d>*_s$cZc6W$c_ +rPBC]0D'V OpI !F?[r{z1#"f]Ѯ՜ڤTѬ tuͱ9`6O"X?Z W# >X"/ő'uK|Q{s[v9N孫;2m6i&2n'KAҀ\E_1; 8UCSn5%|ǰ}&MtD +HaWju]6M(]R !X{މ;`ݹaƍnⱌٹo$iux̻(#~h,a@7H*5GVUDʈ L2W@%~SMxOZ"Xs<%= + i^pġ9oLoߗhȧR[߉9*4=4܊ +endstream endobj 123 0 obj <>stream +Hԗ]M@鏱 !JBDdbпOtSU=jVzzNTz[B<<f`^m-$Kj `j 5oTdnu}Ś.^w3$Vt#sg`lGT]ZV`[e.go< D:XqסHC(XeZBEy.572~ç?˷W./_}tyOz>^?.n|k77+wu12]iTT?}Oq?lr#wS6{zF+>#-[e+Wp<$y/ Qb_!@qЙ+.<8a`q@*լR~H`vӘD%G5+0ʅI_ +:A`3iԕ%uCZq(xiLvߣh{7W?\xûO-ˋ_v<4 ~G(S14*^}df<DR-u)j /XصSyl(<.j#Եkg#TM6QwiU3KZPNJS+B-U9+60T* hE_*TH5!責9C<7~)R۪MDz*Wg*P!Y9{A0ZFf:@#]s(VX3r%T}g?@A[Jvh+AnpzJp23ke:vߴa%REUW_ 'F.,-xI~LbZڰPrWwd|EFF+U&@],*zjl%Ρc't)(c7V&h{cXdVR$oLx`J{QM^!e .1ѿ=X3 vNꗤI[.5fD%@ܚ\c{()zV'uX5u|(yj|mɡ"/OAY+g۞XgFm[3GobK~ܭ v|nb^qwYK 痵e+^捝Uz3];G6Ȧ,Q9`dQY@vtӥ[f- ZsPMH5QԒ/=ٷdߔ\ r՜E7aJɾ) >,Aףy2.tx,v@̨ +BUqsBve.g$)9V 1]/{W9,[IպeLvV[TAMa#zs +Fy^`59 e'X=0=z\SGE , W @q1 QuYrj?|p^P&$?d9Ӗ4C Ჶl9y"ch%gACcٛBvȦ Dp6Wզ_Â.:=A~1V0"|#[+˭!I+Af$2s/^$P22U`T` X64"364 +92H +;[+7y4UTp\ Q}D: 8Hnr AܭMMBUcO,0oT(Uj= >juјI::>Zn@$&ך8 Ne͋QQ/VVLCX2JyX7BzF^GcƜBͥ˨$*Ⱦ^GgAl( +ģXmTEVY$e1Lq^EX +n;@t[)P7׏诂;|t<3ViY-&y\r,q(^$s!5qOk4HЁ7=%b 5ܦ9is re{kB*1Kߪh  VlY/dC%#'ь'J[F|N"éEfvkzC3j+jP#Gn;"[#}dq %; 6(,Qķ0mpkY6Tx?Htx Ld&>- xg|Hs}H&?~FT{%0C1?0 X +W +a +Dt**>`8 uu8ӽrbNzk)r>8'%^@vV@w%)nxہhA_1D_[&!' mY[R1D(bsC>'"(R٤SnrZ.#bνn+):-Ek kE>n+ASw^A\|eVwm%v$Y/?ȋ1ŏ7G_X! x#7&̯ 9nD:/,Ņoj1+i!7K s l8LlOS⻭ΰJl6ݞގ AL|7GРTA g<\yvfw|H^x>t}J hmRA;m4k绔@H'Ѷ6qxpY󜗍׹ĴFp;LѤ[!d :c=K!HQ L$uRv֫ӁLt ^}:6 tLigIm ŴnON(m@}ZUbnGHҋ v HM^|&"RJrȪzPՍodbsi+*&85_N@C3+j8 bsPCb\&hE^`磰͆Cwܫ34.F~-k(Y zPz JET3> }A)A +=-`jf2ߟ,8|a\v/6k@\(2pEI!`3c~'Ř{_dU5]0 +odM=<&۩ɲwƲJ i?6F=d`s Q?Ѯ2rJs KYeΛy== ALs,k BR4(䌇~LUlxMFw\t ܓnq_ +9 oQ;uR0Lc߸ =}rkwunagY +ݾ:f<otH-~mWMw<5^;mΙGh.Rˤ/tq|G+N?aԂ+aT!HQAZU!ҮJET9ܯ?ric[|VLgcY%8;5-?>#ɽ27qJmI*;s%͘[c!#xF8T‰xx#pj~;2 d;S *Ad^;J{[洤›3;g0`d`b|;\rjH??-Z[fPڳ#JRp|tɜĈ@꫓Qx?iRa'uFUwɟyō[42.N5/ycY&R,w<sw܊$?< mXvDe9W%ٽ?\NuWržQ:*#p9t?q9e 3.;jMzcsyn|UVJ<09P=JhDTGڊ7r` qjc&'M[3ʰuVwӇdOɌZsP@zM-t(38 l>GaLɐ?Xa21.ܗc]B/(gB8q9HwKxȐO Y_,r<.p*GM\{Giյ9ϧu +]]8$#nj3j\Le(|AFW BȪa٫Qwx>HR((d/b^, 7Q 6xDK]Ѵn꼍ZI"z( (UÈ+TtGM%7:F]BFg-8]hx@Bx/w/6R_90?X9pBof,[M"YdGZh~wՊPqڦnSُEWU.a3nmYŸ͈OK*=@! m0AzӎW q/4Kd^hWxu,V(ֱ>=<*&Dm{e n ϼb:YMٌ!aE-F; 6)~/qhS4^_FiVmBBg _+mA>p-w>/A>"wQ|r̟ʩ!r6еvi4^# w94s%h@FUհϥ!|۟SMD +<R1".El]g}K#Rĭ}mwOe;jbjXK +&<,JGM +0'Q^軾3rz] ۯAWbqah(`%L]_ 9R@c"PLp2lIA%ieH=0F,4Lq/Yi@1;a~,)cXļdg%∥W.v ȈJ<m^% #[\p| 7jal|gY. _t'>$SQڞ {>׫?rS@!p#^G#F+G7հЍ֕2&3 MHWvxqb0q#'$rNvgYSYy11EΏ1Ąp̈́RNċ31fw8v| #e"",RG@̘t| ']f$Q' 7 =;9lb6JKNH%c~=վ/c5uȝ>lU绂-'YR;mY;mQx da.ZBFRzRzRz@.E6_|܉~Q@>^{vr~ D}]ouO*I$//ZT^N?b4RIW z=!/$W OŽol,SQ:e;MޭOH S2G7&luX63A1 +*3S|o|T q XAE61}s )7K[.դDgv|46pCQaIj (~AGiGƭYg)bJ;k<>I+_lڒ:P$2UH {IUm)ᢴJgd6Zrўл7ő\lU<`vZё#;(H@TLb2+L?C^`Cj[r2!*Ԓ -J_׀ CSbóBvaKb:[KxTZE},H"#Sd 5z[^_^]⹡NlY\UNYK+6gY=pq{ZUU5(h{`! m/6btF$Dm2Bc&) cIqq5/0.di~4^8OHPCkk hdÐg2"vM)!dI?;t͕_=VycS%:yc2a80<>'ۻo$@Ns چC=JBaIŁf3O*YG^veӦ_Hl~)T }0KMgYLen8,MnL W3FA6sY{ HFP7ϡ0t7)Uj7XᰬrT>M3e7h_H]F!*~!~!E*b?WcYR5lV߲3@ɮ=V,KP^t\duTSF*vN??a5Ǘoڱ>!+V8l+Cy@ل^%D5SPd<,'n.0A|`7u"YZ}N9;v"/3=''X`nk0}+/(F8fRe;_ѸSyBd *EIGp j#!sA\yF nsɔbegX&>gX&>gXg>OF +5LH,;yh"O*Wlo$"nmLF2.@HjSȚ,\cnlSb v0.I0Vi;TIg)'V-Eu]F:雱wHAsUBP%Uӏ6&Cq0TИi[SyD:7284Dn)}Mob5%p ZE9L! r5iW8ήT7egSEH A!8.o&H Fc\(NaqBu +xApp7 =aa6x%+vBqj"j+J\ *jX1ٮɆKKZSj %iP ,@| k.A_܋R%~<l0UovlFL@`77," (g7Uk3"^ 1,~ +endstream endobj 124 0 obj <>stream +HW[}_0/I}%Oa!f!1FzпLKJ,+hTթ㲺x&t 9 V\X,ť#>G#uG\iGRqqyOH!u2>! W#ЎKtTGx` mCr^ #!diݷ_o||?׏:V/__~_~x;EAL`A |)S zSsȼq_c7yyzy-_n?.>xRf8)I~y&Bʑ-[18 +cW%OrW]$͑P!"L$]%B0?_^ +P Sg9o׈HscWc_)DtA'KĒA//7kDqD2f7k|K "\>!A9 ә/ж}u4G"@0?_۲]Ͳ/P( +"ҜRʘa~ +"ssk !@)nfg>Dg tS5Q*Ϸcة^ŭ{d!T'-RS&5zܑPet[. nAkpOs0TyO|0?hVt +"6'Z>~u5+17ܯc:.k7|< q^pd7\ @p~8ݍq*s2X@j37q#Y13"_`ڑ;*9BWFTH9n|TR| YNEceUUX9(0Tf0YrA~1:1ϲAx TeM*+bWv6QD|#rUY ܘUrW|d#(SiwBPHw>IUT + <cVJ,MRpJWͣJ̩E#"܏Ϭ)sprrPD *rsRW(V}#CQ\vg[1 R0DUT|f9,*.9 +;FR ^}s'sTo<My?v UYIeR)0R +KЌ4Ra=qP8."@Npdlhr}h\%KIԑ=ⰱm#!͙ #Za`=( x<\ȑ5*$!zT^c + h(nDgQei6^MgXur\A $*FYM<-{ɑkg㮡lf;){q\HifoS=B] vccuܨbjdߝL^*WRR2{Hl3ĬЊY;q5\xgV꾁|!W8)FfH%Y13g,j^l6e fX(dQJ 2El6L|f# +g]|=zo@*,WNe6Y*+>O4O2y,@RTA v`PuziBzQI5@S:cV+o8ߙ-&7^\A:^ ^}ұGuhUѬ,NgMtMMC!=6BsŞ"C=:2WȨE!{ +լ*a8=::@tא~ +\yLIuEW΋ +UK!2p6#Fe± #"ǣVtl,(W+cS=RV٦'^cIXl>nUaVnlճzf›B%j.C#zruC4Q7#s*$W|+;ʉnc "2x;:ƛjcs& +X3[m>m~{Wono>O[:(k۰[NCw 0y&Oצv"9R)[:SYsmKi#Aщa/NKcxA";XY lg"IU4]TUL~b"LMSs͇#zeUu +):]r;EG0, +ͣbbк3߈e,1eW3udyaCҥoL9]w ,n + ws10Q##L}܎qA^(zIV)(z/ocPS"Jiێ*{TVT5J#xTøb$*.L-N\YUB^ϒrd3)_\RnC"0t$# +bTq)H7&S?VǾշ#fM=]tc$qTBYDQiMp~&쏊xFf!|:9C]9RIV3YVVV\nbL k$iH=*Q|#V8'糉 "W(m}{'v ykB!\2ɶtT2oYJ2ۛ}?rV%erD~?nw2Iq4H\lyE}F#񏴶v/XC|$&Ve J4k!T-RfH(*JõtoԆ=oLAtⓂP13Eiþ }Qr.*bB> tTѬ੒PʹK&RK=.LFU;Bpn@^s^#d"ܨ@Ct'5*F->}鰾ܺEՁꎮ:N%7?;/xi2T6`J:d/V /=!si +OJ?jp(QoJ 7IIw``Z`E1bSg445x/b߰& ` o"RϬ9@!0C0ܨ?Idt/!g'"RlLNs!:Jbd.QtLڦ3F:_Ս\M喴xv%$4LmmjDR0JR6H}?d IeH%1͛ܗ`_uCn4@>;WUIυi-nԕ퐦$2ZgTT<>h^yvE"a"!l@]B9ف|6po)2&ױk@!snA!s'ϰ.ja^< +do:4dEKP5XA0_θM3rZlr} ߆y(ΟFR̺BAo7 +|4]M@:;MWھxeVJ.=s2xHnF##/ϐNGp: 7 StˈrOɒ$lWh>ɬ6B9j|$\:olcͭWцh*y!VkȘaz±jn<N)bA;S"-=dF! +"ŋKAp2AϹ Y؀jGT]\+@7o`x_ן}|/)1h9LCǵB@[PdvQݧ2}u$SǼfU8a& PG 0#|&Ys%.a>\S% 81[{5n$,ǷvFDQ9G|?va/1ρ;Ђֆ9#¼Ž1awQ|~ÇSp5"$O"C8fQtcaFKQ或Lrݡ,/!)r*AyIny-/5f 1kTUW0U)E+lpqUa]I/"ںUxA`C쩊9|O6+tjLqa"fdn .p +c,&F>+V +> nD5gE,mgM!U*).bWK!q߸7.%qoW -\u +ctdͯ(<_vaw oo<}ʱ x{<j w\Q]DtgZZ4)#ހwVbn,ˍv>>Q" #W8(Bd7Qcč4M!ϙoDyե8 Y1hT~l b @ր4S'/&p*GnT5F% + (0ťz w mbZI7N0QE@ؗvq #HdYC@U +b2Dz +H3DoW4?jóK6q)!G:p1-3Uݩ*t |ѺDx09#_ΓfhA(';)yM +Ir\ȋlOl :IΧayWxȀcH9Ved@HGeyKz:dwQx)pBug*F]S@t1TT*;+g + ng%*Tj-X XY5mbZI7HfBX;+gH1I# шUv- jш )1fMe4JvVRYynaz*:B#:pWreaQǑcj v qO)clo!~_mِEZaǃ2n!1no+.߫ܩs_ 1_(k &i7I|T:r"gTW<.18F*M+p N; Lcϳ:T2~wi<tO:`"-H[lnyK )WoOt8u^ M2,l^TuiBQ@?>@@ܘ]ͺS4;)0UJ7}7{*v6eNjTa7(~9R>#Whw|T=M5:[PvTєN +" x8*RnA ѕGL^u^ _:!?8E309_._`7hiѲS.a6BĆ8űUa!ELj'!WdSnrFꖅC43R'\q%W&fRv1W<8Ыe߃aE_WH\D[r׺ +VZ7ec*WW֗F,9Zf,wJ@do5ҰZ]w؃LO@m@θ>۬[>=[̋%h R7 1/22_ʕ8Wng6(b=Hddžf:f D4ˈt[EBnAySNFUW}M7;ԑ!K\0e^|"kkl w:ZH@_AnjXElv *e1l˫*BnCpSͽМͭa4ñ0RV1҆9|C㴄FǙ.rFLDzS,/`┣p6$Bh Sc?n"Kfm*EΔDAm?zůy) Y!'; kLim6A؍^t:?r/h# +54:C04x#V!} +yW{ 6ǬG)[ng!E9DԫbO/FWY#^Ujp .=xqBċ#:"'d!&*GjvcűFd,q* f 1G [c XѕPq"_@k>IkNSR7Owbs+/,#ǚiet~afee^MCmBĊh!Gblxn,$7͎SZ"TM_͎ڗcҝT#4.o|ֆw| ܿa0Կth ;# n2q߂ayt7 0 =qk0!" re<~"*/bJTF\+vxGj.@N!Ms@[ʣ^@p<ijZ2n8epyf9;c#}@sKJAZ]].WCX4Ƶl' =*թ5 .G0e{~=n{Ԡd4#Jy!4_ilEl0ں* 7e=MŬny3SA~i֠~ýI/>~=3@LG'Ƿ8F}9OȰ3,p6YfGٍITÍN#ȡ;eE\=\cCA8ED,[^#0peO@AK)pȔ{c9ǺE0B LҠA ₑ *W68]dv'e"HCsk^Z?AٸĀLڒ0KmcBsԍ޼O@<#(eXM>WElwLA;J[!W>ߩ⤉,衼2XO/܍:\ |T7E \7['*E\4sܭƜLnkg,"8YDMH1d?:CᏧq4N 2*x u|?G._ѴߞS|]|{Hw)#wwqߑS|]|{oOw)=ŷŷ+w^:/kI4&P=L!侢0_/0F:XEc +/nTX'iӚb([ Fs7SYɺ]ԈBm U{(?v/.FQ׾z%_{WO]I-W! 7o@*5WAV׋U9V#^32L'ajXJgK.؍X ` /=1zM08>FLoN,n ҦOnO2ui(jwDQK;Z%aE )[jGL+o~1 emXsy>@OWPsѬ +ZI4A:=.~Wܧ +VOpՕ+˕z>=!L +Q_}y׮>ɴ!KmnrK; +Nr9Qmk0V/*l5k~̺2/0F1?fJ ]f-pw,B6S@\@,2U|\/˸ʙb@3DFQ,Hh"0^sKLI~iB3sW{ecX,خYċb +u vf#KȶB +bTX 6ll2$Yq)/R/"w{Ĉ@z "*.%#S*NV1>%|DH󿟺H@ A"g2sMews eȌRMx@x#DG\^|f6»a[pҨCNN'azRwJ"IV>(gi_>+Zfְ34:A71 ]2p?5~ nM{3<)@D 971 9r"{"{p;My1gv@o jۛtc21c+S6ODXC^&כ@v"rl?\\?1"b܏]nW"wcW@+wq\=S|w?T!d>M.9Vv%m?IRn/xB!h޺ڴ4;4%Th 2C&w _R\Q/@*s(f$_ َD0sv4J)Ia]bЇim9 3Ѽx|E9Ʋ`#Sp34L&)8t7O$NND'XajDm?RldwdRSD'86ٮvÕ>+#SI +t}=ʻR3>+7,f-e$I[9cxvku[Ha"F@n\K\%$:t7ɡel2 N$0"}^OFeDNcu;F_u%} dr@f*Ѽx|wa}vݹ'ϖlÉWoACL9㦷 m)4@2?Xlñ}pÇ)Èq.V3`&Z@XX:/18V" c\Lt(p>l "r }<@CF 1q #6Ƈ@:fä>*ffuD?k/i߹wF[Wyڏ#H 9tFp\{!}OothDe2F$=ñ4TP_$YEjDH\W Gͬn2o*%ki]!5 L&OTWoıW}r4z&}NOi F舚*E'4DFDS4:M4Z\r<LS4:4:NADOߜFhA>)N5Ys5!bi:ODS4:4:NALLS4:4:NAD9c@G> VzO]oc4u$SBV>pl6H1.Q1YMCz!D=FqyqG7JǬ('sCSC<L)8%9#!\hZmIFPDk(D ǐ'c11.EUfJ(4?o.ItZJg6>?_{FĴltX1[͒KAy؜Yn;ˮ 1lݴH1띤bY-Z|"JD7Ǫn@ÇɖfXkѕ@l0qv C Yr7 r{uh#ӠH 8@"죢,qfs?c#U҈RFv!xŬqPώqۍMw1/xui4n I.RIʉ ~!LX\RE.+dR>Fec5\DV8rUT%ϙ:OA|_i'u o+/pɭ lnj_\;Xid5ׇj/KKIm6}4cu=UO&z^nAW? th +endstream endobj 125 0 obj <>stream +HW݊_w؛-º{g& + r(11R@oNI +)baNU +[I.o~[tLK0ܯK.%M,@&޽lKFMKHN7Y1 xu{o_oop`7W~ooʆXB?ooW_}ۛ7M,M]L&uX::s0%d M,)^Ak*r} HCK6d>%AfY576&$Q7l>/^@fzU@^?4D̨qƋ=E$ ri>F޴!G=qH7! HPa.X ~1jYCe"\<"0FHQ u7,ר6dhCo2Zyhx@Z<*rAC33 +2{5'K*` +H =!m谁%A2Z"eީzjXk&ɝ fgӪ*5qjrppѕM'*J݀LgՑ"- %f*h;` hkw5G\ Np֞yl{ūOMQFO]y"pw q뵊`ѝ!δaGQh;gVZmɊ-zr%F^Wx0d1y8 +2Cjx5]'OpB 8RB: SŠP݁61RBʑnc_{j='[Է mzlUAT$f蘭D%;M] &#G6aY QRS$`T]UTU؂c}?$rDYD0YlD?8$7j @!hdV˕ベ&u(jqjF#ydU5yIj&)'0؄0D݃I^=.0r`'yR{4 ^Ob'< YcxqS6ؒl:O_nY c~87Y2=@tAw:pyкӁu%݌vwiiQ8L4OO?) +z=?lUr3 ]q+"#?pwh[[0q~Ԩ68~PAE?*AE?t6ab%( M'@݁~x4X3+emdi gɠ +*/^Z NIG L ;+pn FmxDȍ"H&PE68ݏI0Wf'#ɐ".HBBU$M!|ƨE#ݛY1꒴/B!0)68ʿȴeyџK \G +j-Lɛuɞ<zm`t< >NH\Ap,dy-!@݀,_D?XɦZXUG^b@h`F-󑗝 +[H|?R;;Ѝ0%! =ZƐC%LdwѻIUt̍XA:E;Q ` |7upt"RLbp [Ցcqpz*pMꬓ p yt rWk#dߗ JDwd"$y$LCИEˈM2xB3+[m#-i> @ey ڡXriw`_rV{$UKh* W~h| 8mKl^w^=E"X%+m>qFNʘa],=g.`Rxjs'm>2P-1`@} +6RgFCC󮹴ntiB7?Y>B;i>@?=Mtbg=iY JX;ښ~Fl4y i~1-#)XϘ( U1.lS,_f?qq^w_{LXiqYFmقٚa1K-`W?qŸf˸{4l0.>@x)7ZÄ(֘/ ԾKbƦz1 H 4}Ƥ%E$%)em+E! fp +2XKB,v +*v_%7Bh8 kZ#9Vهvp^LU6P{j%S !4Uӆǁ hتpV@_!@Ρ2ƉRw]th{ #f{S$mN!"*(;~:\y;1*+_zk͆e>^"T Ndk>o| ܿAV/#Jlj#-[ [ $[T9_f\x 5~-"z!$% Mv + VK_ نL}5w@d ȫ^3/ Le kv c234wWꖿJ#u?,j)F6)3lv0AcS]0$WWX4¡fG;*$uL94*T^ӮT?z ܿ+bQ\h.;?Oڛf"Sj4Ŭ`} U elW4B 5Ka1}K Lb0,: eF9-B#*r̲" Vi?Qmm+E! fp +2X D;bvAP9#ڎF5Q uY\;N֐# AJ^ѧ hB Ms_`oR1^#( bɦ9%)Ɨcc3hlێG*{aYy~jm*-0*NpM^n>L [G/OpS vpt3t4Vs~h7p83yҨFT.) hq :|/6xuT/!#`j0zYC1l͉`cq BMKgJrC#\h@xlEACFUtר<q$F>Y')u:=ƙ$?$;"3J}:ݯIA%>jn:uqZkr,׼ǒ4h>es5?!9Ǐ\y`]|np VZd6@/&r>EBBH66^|zו]݀Y[ĕ*ف"#mLxxm>,$ +jk;-އWoˇw~N066WoP\,`vДY3/\VN=ƏikWRM@m .$ `{.'Uۙݍr3KTx1\mQb{NƒEmNڕ^?6 h@Z-7DGe%Ɵ>~0h_7OE# o>,?Xh ",@i=0(,4,,4B?b(7 )Py*ǐB1b8G@, )DUP}'hf!*tx}Y(zwPt`XRW@e+iA0?)f~ X@),}> j)ړR4:e(H  >~pnXhMBjlۀhܞB:h3,}?E /BBd*5 j|kfWB9Ժ7w?7?/_߾;oϞL?=鷿7zI_CV꧱ОkZ +U+SU|1 -> 5c| q_TǪcYğ]~9;> 5 03@M%L{KmܦXii,{ Lc~Rj^qmn\w`\|c3Gl3zJB[HKxGaj )0rQqH#E,9q\-Lh)Dbh~6'D*E.. uX? >Fɭ5f2Qpt,dI ?{ _ "UK +Dk`"!%efя>29TAvg-;~Hv\Z¬;{ơ?[Ao-&&ɺ>-rRn}Ꝋ2^e /$îu1}F$ङ=+njw=뫿Z`}lu ~K(h~$$}N$9d=?dQ&I1Y#a:HGUiJ.q KKtn!$*Ky íW.ϕU+LʚvVyZXwܧ\BKߥmF!>ZUלxY_PRx$Y env$Qcfe!$;_퀫+ރE\ {2b>[9Z#4Jrkb{& + +U)_IƋu<7?"urt:艺Y'u~lmi\6ܬ눟b]ͺͺ7rXyެ_Tzn&z#ͺqGm/us߬"}n›'uqnZoź\߬wdHF[72ͺ7rXzn&uX7j|nDfݸM{ndb\LoFOY7n7fsГu S?V7`]Glu0Z/֍,Y7fݸ6ًu#;lܬ?Y7 +fhb]]{úҋuod%1zn~mX7|n7:2zn#^unͺ0Ƈu6f+xk\gs1tޮӥS:'/9"Ya=/P)H{` ,ʼnȋW[يjȥc d +AEޱq N^{iz;(Oăgi6I8f@?6a9a]!:Zs[5k@E fX早m: ;!,ȈQF?/Y3ޠIyfO>5k kIMWEi< #<\)/-|~LԾ^9G c;ρޮM/ywzI>*2++a, g!5S)89-*2kE%s$H|z E㹍/sVkr>(g-/b' (>:!۶64"aZ;pbc-)ʛ2[l5cf2멑 $13{t< +dFeQNp7^WAj[y.KH/,[sSUsnG`!fM.`{/l"2сzNpkr}FD>:4~_CB2[~E!G29g$d z3hVT6KQa %$dURCϲUXJL*H)F{nv, +1:(X3wİDpgsi OiGZQdjOtqURmer5Cxyڔg9R7 )7tَY֙.\Q&Ng;(PqK\(h`aYGR}4rϲ,5[&,=z L55zEO4$} +4V^H.Z6w䆞ʮ.X[e{{j ٵ zD'V**) I5QMWI*6FLы +-|==3/V"mIo _>kE -/-m5l5pU\o%6MThuT"UgA{.+uGR_l|FVa"D\bs +iT' ̷z֯?IӧKx~Xg =LHH3R4;¯Dz5ª: ﰇiOvi/nӶ8M7ϊ&>Zz GO T|Ad/SH=5NS; ,n[n/#veU.NJ(n{UTCN;*Ι&ѓ5ǣqb9@Q8LpQ#Dϡf_arܠ7UGq"kQFW׶ PLb zs9VM BV5ZTBYet(xą,F@.2vsqV9I рxyVg?Ul=#+ę0U? [:JF({דr@*>MUHmL Xt먆HRQ<.xJsہ +Dl&rWcI>J&Iw5KT4- |@ 8saCD9љ'n׫Wad"a)5T 2EFgײh4kaM.4C*%w)0u~OϚvHzly > un!6cʡ\VjU;T{ k5թWɌF@>7="V#itȊ~\u[RW?R <>^4`w)b!˪+Xi̪äS+מFuO`=Oom:K^pP_~A B)\ˑ`ۈu<>@hjYךȚ6VQ.OPGE"#RW5.~ݰYy>C_&KwCPV~&G ) 3E{.R.?9NNX,6VN_ A +\TSCOHtb^-F,c71ϱO֋Ӿr(9-څ8x8"[4 ]:v0ezT] UqϐC{} ,C97ìl|iؑIeaF~te"b"qաGڥÖ)B1Yfɽ6 mFI5c{6*&c}ަWy"|K w{_ʗw@ ,2pveg+|q*噲TvJQS#Jh.uگ*h?A:$ubu]G{ȃ\V +f]<6$ 7rU3tZvUM9VR:dc? He@TPYz GqvV_g~x}~ ]G_w_뻷;5Ao5d<_o?.?Ba;ϵ,RbL1 Og/d1׸{&>"7Bj͛+mlE~F3XJ=J+{:b wWL?o6+h 2?B_va`F+G+A{fZ[2=kPA&r2eS`Ȼps.h%Pȴ*cQVxfVeL \K;W6juvh\#]Nي*fjA)=nH{1royUgI ZZOb%-D!VymOT*Ah2KQ PdTޢKN@iXE"Ʊs/Ŕ bc.;U[z4љAFGzcj!_ϼ +1kTN͸ pfr黫jpM,fǻA2&5QVM ]`h1jLK!-EJga5YYZB5ԪU]UZ 3%do%u[@XF*p)Vj:@|(øI ̢s^ȓDDYx;)N_0ge8/;# yWԛVq^qIp̼C2{_4eT`J9}s8{qˢꭝ68&Ͱr[h [? FA̩=u[@vAdGyzT|ƺ@칳,EAkG(M!D߭ £Jօl[}6lל(\ Ƀ*D_X|g{1n !)Em+@e))cP؉͞сNڈ?σg7u➏dmej>PNJL!sGDH&fI6puOTuU˛F:Ҩ$ePQbn[⬕63kr"Vbˡ?>U?l>c x-a:rN`j|]D +1_%eN%`ͧ#UQ#xSSİcMuPFvua&Qꎵ6 +WA0뚽E!o($i0$v}WQuO6f>" 2ؑ"Wk-c)^N2HlKԫ񜑭ڨ s$nܹ8e$J'o$Zag1;2YCA*cBÿ"k,aI  gH5+PS"儳dh[Z4G@'K7!jPzuT-!_q!~5' ji +f1@RGnY-ށzER&oh179t@6FW#1j) j62[hq*YNzmLYURz 55p:㌁| +~? r>~]7=DFX!/QTeO~O'ɩ۳U0Ivu &S7PP ]_@;Ysҝ EBۑBZG8r3)5DG +U/65e37)@0k7fOlz\Q'F_wAheMpzwbz #߳fOj^3= ͛+!X[`J+ԇ26̤ QoG0#DB>*c,)D5>znh_|9m223#@ +,V_]nxE{Ed9J7p|eS gd$E5GkE 1D-#Z[K%C<~JY+@|0V21̆d"iQX}c +1ruGzdN ?qh +!pk8?+JZg jaI{:9W:ؔHʚ҈nr3t?BJ#ݐ< !ͫBxo bmXR%5u5bԩzM,ǻiD2[©ihMNrStTd-Aq@Gu3bBBf%]hU.d=I֗ ]e[$mɅm-ٚ7wiY9A,Vzs9Egu$XnС\譪x|/H>;`tz,cS3<@|0-T>Jm|c^t[ذ1'b5M< nNaސAۊ2ߦR-X_S2eʬ܈fԒ07UژcErN1}+˟k6~~/6T|o u((=g26dX#G8KX ޥ\3@3-}!U5"@S?ƆViuZ6-+s~c M>ʐ9.,G.)^}ƴ LE#>u tG0o?>Ęo=pn~"Ɛ\2y%̌Eؽ*vaLn /v!,!o@%Y_Ë6P0Kr:g8g El=~7rr1 + nc^ D:I%g؎gh3`d2pPNۯ8IKYZҊHL/2!˾QO WMSiuJdT(JP mFθ}>WtI̒2Dy/OMpi~֔ڭZrs>~/qD:{Kv{cp6hDMzF).ŌH)чX˒,/^t'_]g|c,GX$E&^MNTq+7cG#ˢ^jy#qɻQj2I[PMpRt-,OMF5C5Su)S\1N͕Uv]m ڵKʻ7 +Jw)A* +o d{O /Ser=ޚb +k E$- 3v>rSy8!W"7h#͗eIr>jv?^ +|>k}&D&l:݉)sZϫ(v^O&>g8qYb:\@琇&t[B7$?CC߿D?_HSߑ;ħ;ZR Viסy)*zb4jOWD*PF!jkǤ9Tdk_6* +ȶ `b"랻f<H k׾2.x1_򊀺tbQ=QJ IlVBJ#Mq&^116 brPHu!]'p2Eq7V"Z"ueHj{a"pW>ߢ^fϛ͸ +D%725eiU}hjDFSL)yXW5R>MGy-M0WA_lQ 0XUv ;'}O^ ve"id5z`!f4uSd4iPeޝkҠLՖM FjW +K?_f7$w0Zl2fO ۖ!@W]s=GvyHp˘\IȲh;'OGwnYށaӮml#S55Y:Aq$ex rFSMV)D>}PI*s77y?'d|/(al.] +$9!Q p2OrX {g\NJ{jњ2d‟_ +c:Rw(dd41pz8`䤅]eU +9M5j! Z}]NA8 +  y\Z74i֬Wr0GF` +kސ~6^ 岔4_}1ڻ\faY滘^4Nd/2{\Ft EོXU kI5p$= = +rY)u>qT6h̒^Zs}ϱȫQl94(-g.y>1^;s7.8ˣN%ۯeDAj +SнBnr1ؽ ٔH0J.T}XS5,e:$T)4.֜ ?6"ꖏeO_&m fQM/C|&A -Ϣcv}<$.QC &|%'R!󶽊zyΟ!J4V&ѽ6 +Úsn\⓴?Wz`{ ћ +˩4CtY桲hSo ]̇]^{" =tƥW{ +џo?=xL ޅ?tpOy-u4̪/׬Q ~%v yNuڍ`n|4d72|s93H%6OUFd=zâ0L[x OpfsM3DIƣK@Hvc=<[IJVѳCn +"K 6>Nd)91]FJZ Ϋfδ+8Z: + +^Y35c ݯys6 N J[q4:!og'_ǭ0zL_UqD^ NOd!(!VOaꬊbH'9tH9T%qS +k|ѥZZ0sZ䌣!78WW92:nLS٘'h;veL9CpM8EKtV)-K ^k?oc'[tY2!zF[$zٳmQx J<+SF9^>*qi.c\ðX,xSm|\}汛^T3ha҇CX=X{Tkeh 9DcxѾ|vUTsMCqǯt 5-3`+^`nXLD"DقiէIú$kjTx QrPM!'Eu\ۋ߬yYhqrjXK@hHHY>_&],߶ LJ` fIl QL +u&X+Ɏ'lOc:VPc PXE k[~ +$gx>'iUZ3QٳÃEs8ȰI7w8b`e]kr ۙuri$؜Ǩcmud]Oy+(q; w> }lVC^E9Ul}!Z~?v 8wWbIoLb_ +x^&Crō3C -m[??cDrRgǰD0ӍPMcBޟW+m?;?D}5?>p/|ibd;TWhZ< iH~s#RJupc/?z0ow% O-A\zf,kFG C +''5 z]fk9BW(Cl)2TpDXEVdqN`;^[>xq<&?@W՟@ޞHfqx |㻴15/T"P*O00y *^/l  k^粹B#(4:j,+Y2k0|,3 eUY/l?λc-rdX{".TlzQ=wMeO>mI*6LT4`Ot:R[F3N 'w^?4;=jl ^4.]\cȰkَrR!捋-ul /@U].#A"Ud%r3 *+U ɼO!^G,* |.$6hYQRAZ:u(7 " /K +endstream endobj 126 0 obj <>stream +HtW\ :4"c9›pb+_V]>Yj`'/dkH4^0dh P @72S1o<߯_,/Hr}D%.A#ky>n4eҹJ)ϳ+KOvlYma$L/ + + +B+VFO#KL=8FС [Mcbm.DJPҢ2:<6Mktv)Q"ʎCoB{7lBi!ڠmYÙ #-kLOF`fk zP>`sF[oP8*A|a tŮ-6v& +Cl啛PHk xsk>geXڬe4l6%Ch@״sII:w@5뭓̵ǦO-Hh?wL ֙ +k|!U\iG xF*m_C1~K.l.|&fxePݮvhfޟWZF;&㋵̧쀾Rp{]PmOSd|#ѵ G WU^?~^ZH*O uމlK^w~nb9BxǶ*#v?ľ{gK'c>ꊆLꕢg69M/BȰ r\hAkЪs륒așt1ܧ}u[2{H\,^"G_%:{ ;cl9x l6V̓e'DZGqeղ*esifM@ax(cU?mI>M*zD@L7t,wDfQΑ2. Q ߺ/Ƶc0}Y~gYΘ`Ƒ&lBD)+m~*Blq kOR5I 2Y SgߋQ'ծ#٭sL/RR< ooU:}= fjEbJ /q#vnjr1/|P~3Lcr1ߕ;H"݊烆 +L8Ҵ{ +Y>^!joZSJq u5}gt:]UY"sT_xu0(Y;zG|v.@S'y{HZ;忧REA]ѳ4{yAX-&TLd}e9s,jx ٘lym5BB4dc80vT euam%h;/Z*8F#f;5}ܔ ?S*i٩} sSnMݴ 뉾RkbLByyT)tcM~qIA橝Bڥʥ Үdf,b24BY3dguX{c Ʉ>O.Zq}0XUSA0iz(am5j]:5(*̷"1Y^W1s:Z0UlŰPtjNjx}ʏdW +D[^YuRbؕ ZG.΂fkʮj1F\r꽴z QWQ] ڸ^U3(3;xڋtTUL߷IL>lш69):VW5f@mi},uz#X (jPP:t_,F1xQ?^{Af cx@l[~&[SRSStEFr= [<*my ,xOTKOPcNbu!`% )^* Ah|-m 34hhX|q5 ZY2M`6՚eye^BC `2F{"Uh?X{zlKO}fP* +b.?_1}B9qht&_-?}-?mml15cp4u_b#WS_["cc•ɽ LycPx|k;u$kyaAk&"RbQ2V136^(CyMoCvXodVlXNZ!O4ۜ\={es,zQ?Sgo~-I(9q |.K8*ò&P,P[YOT{ ޺if,cʯvE@XW +|ngB.zj*P:I|?gzQBȊA&22rjyױVAҤʾ +֢9 \[SZ_ jĮ[tQ#VJl.0FL7, YgZ! !׫58urseP,YFqma<,6&V/&&$;c2!1dz?}+!M7M.Uڤ[0m vԱi%C2>9sF᪱y*?xǰ6 $+|61h$r"cFBUU1m_(z7S)W%#Dc TsՋj⼚ ӈE3%R !uC<=lK-{&˪SO_%MnPdISL+?b4>UП!߿~|K<Lǹ8Q  (7l;l<$耟/ R7e-/n5O( 3P?\ScD$BM!UYYA{Ļ'b[bՇBѯN r2:Uw@|u"*<@ !bS R PŃ^vI8[cB8"oȎ@^L~e *@x +kmg'†;2t u +2z;Jr 1ٳ + ά> t2|Sr H +2'#9S+]F!^1"(9en" r(5܈l*HE'^;+4oa+|I A)oǠ Ы_r8Jڮl/GTX zlbúJˣ4 +j+/6xy{'wUn Đu5u&q`~ ϙDv|dݳc,vEւVi'T)Ȳ +F9C: MFA_Ǫ "rCh^9*Zf8UOդpT(*xSĒu_mko菿`L'ØhKkԟ@Oظ@45p%2B5ߣB38yW,p;Vgj,fMC_, ;_+;[lEy}G֩77\O̽efX"# U##:׺o^A_Yz}J2\>Bȸ@v;Ȍ%1B5j?t ƣtf}CbCphgEIwš*B0Y4]f# |8::R|&1B gO$|V{cC ;ߚ9ֈ3+ +zRVXAg~{Kj!! ֨y1C IC _|p(9aX"k.Jtf:-k[\ҩe-g1gri!qLǥSAoXh=׼0lЎ LC~[c9XSjqCTPdfCcO(7ޑI+~l̳Ɲy6 E0BpZ{@#"q$BT '->n88^01aul\F>VpROWnlm5T1mHG1m7 *]5(D11F66c.=4eOAEl n1KJy"ecKUT݂Ol3?>0c>-g/joJ6;GM"qi euPLI-h-l564VqBq;E FΧ\OPՐo=J[YVF~!i)jz?ƭ*CבfQu ]sI<6:ɼAcHͤĉlz0FgFwpobQ|b_:<-1]Ov$ Hn-OҶ0&`اq'L2/8i R'<`;PP3%L.2 ‘D^t@mL< Ehע٪WئpJ`|;uǰQ^[wGuOfB^ ;^eF vmI69[SHg~T.v\dNi2@fb[8r@kU + +U8dlT:4B!vWɫɟbm̯ ycxjvYPSOr@z%1t('M[vAN/Bvz| Numָ3'.$=eAz)xGf]s\12'LR+raUS7^x2 ;ڶ%dRzQ'_)i.Z;7,K0.KnDݏc +cF_fEcH1\x6S+-6UBY3쒊ˣdbQ6G}"s/HC״t f d"\hJ!sc\*d*ww⦠*]P1(&Zf8ΌS4XUe(Nd5M¯'̓?;;ֽ F\yQ}h {ȔȘ;.{=cqx\fþ! b>;;[(H,C[agnRdƺx ֺxЁ2MdJxgu:"UDdu!  ma_?@Ed TRjV _X:m;SRO] ٺ1{Q23vM!8SQ2%/{e7C]w|qd!Lư y&Sh=Us:େzO=w5DizA] 'Hvx0F| +H0ř;HS1Ț %i ۬=_~g6{!8ZxXtmx>rm奄jp6 triy*i ̌ +[yUGj:r =רQ)pYka|WCBɜ37Zq#((#̺PwMŘ.j +UqV'as5#6.`b_yj=kc!RսζXP[flua` I'J"%*KgH369QKg8y CשU:Wb#ZՅ9J TՕi.M!{rǚΤ7EEcCXT~բSI;O?GaܗEzG*Dї+ V)=pUcbOȽZ۬bI('2~!4\14|VE960Xzޏiqd$DR[hXKvm2W +]gէ̓&y*}0לo±1CVK첍cfv!tb<;J"t͙/[F( il 3`pHKKc/#R,Db|"BX">Zc*{:f.vǰk:`&lPlN6(S"R閥+UҐ,YF]'WM)[bM$cE5CON!R w|2%)ɶ:jٴ^Fk'ж Z/O)y7( !vEVwŷņڟmw:A~;7\cA#]lނa*|} 2<';ź(踕Y61!Ԟ:93`Jy}_: (Q\A?.HF=5I1S|;~?_ܘ"=?ݺB#RwJ1! Xp8b5j$")AUXH@h+ 0syf:%:ftIs5#ۑ> DXHOZc\lU1P$+3㡀 yb?byjWZ;a7;"X=^:Sy(>_TŋrmtkOM0VF A Q x ǚώ*yUU@-0Tw_Fˤ+Gzp_[ ;eA~AosR4hc5hl[X%H3^A:)Y7 Է˨=!iM, +$b+\iDķmi+LYj$ƢchF-1a&Pf,)t3?@e^%5#}R#*9S1WA-/+Ff0bxHPcL}uY3JP]=jŲfzgYA=;JPKI:bQMJQOξ~E4g~! +~LrE89dF-0‹!m.Qݰ’N/Ӷ!,jBvIͺ!*9֝xʊj䴴SQ"ZB}-ฃ!߳t3p]6?üg)|x}>_\_ [Q8zo`z-_+7)F&H$}l^Y:h7(iS!l&*mFJ>uh߆uTWcA'TGF!ޗ HX])D,/:1%zhz?etGķ P?y7ܶ Ek棞Dб NDn!Uk3PY"]ɺ)q$}=qz,Mmg"̡oZtd5> >910~59}V,.Ů ZdToOU&O +QTX!c_a7A&w8:A[5s +;E`;+@<@I[6MH:j̟:MB--35a+n=KލUlZ(u!||vYcl[m'nsW[,̩E^}h/`ڨr5 MnMX)lzsdY5j{܃{>Nݲ Dޯyׯ_\)o ~,sW5dd -/~wn M~?_ܘ#=?ݜ]A :d{.B7lrVAH,ÖI7MzIr;|,$7"×3BROg,Y$NUR,\ݏ~>}a <#v|`ޝZYUթ3ԠBO%vl,F -Y@8Yrc1ܶNQ-f!G42]4G%zu.h,\=J?U*9nTy\AR/^ 2Py}3Dja+bm6U']T+ +i2ls3֝Hh[1TWnwXӝM#emM$$PHz?ML]7~*ٍ-0'osqbUo0;16*@'WwYkyG#')6.;RPKMg1^)!«:"2;G'uATZ2/ +un!D~2t_Piz}{CIc\>ߠrۼ dB&+U]zbq'pshjȞK] z,Μ՝_isYSELx sj!<1؈e" g6 +uʺ[9V x U6ij.lZTHHԋ(f5!@]c<濃c7<l'펆_i:"hTbu b! v,.k1,wr ر!F1J?˔kE AyeKV^ĒfE]V5+edkZֱiX/͕A#öehr=̳_mNls#`ɖarJ]>%m)m1Nλr!kR}lRi*IMO[ObBٓ,:H@#f_n"ȼDnPB 5c--t .("6T71yJAS˷&zsjKHJ3鍈nAOym/%;ВQUI ɉ !jyjC9EX}Ne1tv!RV=!Udc hi`&9 dgVR#y7Y]vK4m3x"1ʮ" v>2pZ;E;uvWV:BۘZq #Z-a"wҲ\7)C㉬ +2h7󋚊iT]+'`|,y#'2GXͱę3s߃7D.Y@RfIg\[-@in70zc3)GdaN]LfV BNnc0(sVF8duhxΐY7,)^wMOCsyy=Z~c-Umm!?{I?Ah\-lA9K0ND]:֫ g"^tl]DTcDc.#x+H7E+#e1˽"[Mj9TjE={-]cyO{j#V_߿~X Z %dDo|/Zz( \Hn-?gO|ڐ T@);{" O0JFbZ(H$/rQcĈ.ׂ(@@Emr9H~,~ $d dSw  %Vr |!WCF,QMc|$u qGly՜W5}1j"n}D9hg:\ݫ%IF!Wr (o=@F6(?fAGNJ:p@Reч:c?(c%S"3)8=8xpFQ>9P]tcʛby!db ' VOBdcQ$#!\J;:GR:Aưq{rUI& 㐛%ȬTɁP ~JL||WOr ܂gL"_*TR*& ]] 5nMU,Uw̿!2j qfVuAX" 0Nz,EaCdO`pizqXr{ĉz2_<6uQG,@{#%EEcEjX0$H^rL;QDl=7:}_vENZlSSY\\]:?r JwÆ(]ź02iDIT@ ;%e?CrvoaEacubL*-f#:SHlw3aCkA5V"6Y'CLux6 +kc2w"K>HUUyg?>x:h}݌ $TObGVHˈiM&cʓVV\\3kbq6J(p8Ms?9,B'}ݷQ|W4siԿ@ (Z[B@;+?D}x8JUD6ǐ8}O4l_٬5c5?LJQ+`@1_4S:w;7 TUopz[Hp}nz"v7?p"{/"6:Ef<1R>HUi|]!|lUǬ'):ZXۖ>pzܓ>~J5P8"V s=+??tOWәcj m"9y`1{x 6Ăm,i}JpYY 8*`#JJEI}.g +Dk*h1oF(bt@xSm?XŲ(*f]{E`o0 ?T4R1@zH/2ڇ; +Z*̴$QX> UHVv|ƔM+dH͕-<j ׽NM gs|rnɞ, 쮹:hYVZ%kW5(ؕq7a5H7+KɀHEuMiXVDxQy1 WIrV*=h%[2#as&RĈeEf>d^yņ t1YbZ#^ ̃Mrrƹ +֚,/!#8A]hdQ^K*;;_y! DЙ& 6YjV_~"^ +2v8,CCs7 +׏Vh+lXe\"ٳ,l+Qа֤E%i!Ҳq!';|: "t-1!Rz +]ԩcEka 1 +Ҏ}]hpͼ( +܅tlJEa\&ޒia/P5*Wٵz:tnH#p2XӚUgXQ.#4Fダ|κ"F^.7gfqtڶѸ"+Z8k6&+t/x +w|:r>GDHwԞ{4Ut +jh6PdnvxڗU!ϡ4xCe{_CyO'vy|_rB菏AQMsq.`L)9;F Kyscz.]O2nu~ 4emPP!P/˓ @_U+O4sdž VKTTD?>Xg0@ѼMXxF`E.._r cj4Y5cڢ'\0חшtWd &%(QoE] .ׯ{bFғb)XNRw= r`N^8$`9״WN@j['K +$=PnYIPk/7V ]d_]LY`cuLjc0fGFiN?b|z]"%1ːVG)I1 Ҷ$ݥ0ymh;Gt:}͸F1F1#nz'.ciw{6)ª^߬Rʤδn /4 L8(SYW  {Cb}g&dlQt 5"͒Rjo*1&x4I߇ (q;uI+zT[X#"A5YTh IU z'J|еUˎ",ħBn8UV, +Kp;VoٗI^{~(sQ5bz`60%'94rw)qېt?ĩ1uy@2˜l"YRR]e羵Jy@7D i/GWL37NeNdDU/sMʄv1ڟk* +|| +2bVS|)ɵ +|Iu Wyw i'24:G,U,WmGOŮ>$:.54ݸQ5gz +nU9X^$`^>GژwҜ8GZ8jZ94x/g"ȴy"*9H!e.w1jB.y@r̓6s-]=ξZ)ی-:>ݴ50koTy# ._ս\< +Ψ }"fr_Iz|m+15͋s+.t.S{n|ڋ]X֊* +^E&}[k,7㗡r]Ե*Fӹ]i5?ol +tFKs8wV`N[QXXXe W~jeO>s G]dcJz, _ |he沴ܼi-yS@PSeWXyiŤr(0֎-̺BaVr7)d4 +eo_H`Eնl+,N:$/`D.N-wŧ~^ 4r,`G7=`yB @@|a[H_F)} eݝXʸI"q Z#ˣz`laz:{`yӠ9$udۨiw;!lF !]6GP_L+!;7m4ݢ2he Pݯ'nȁFhi!2;ME%1+k"g]*[_n>h,T@Vgqf%B$4@BvwqYZ_Tr܊Cc.0[B%ZXZ<gKǏDv_*6v=!322&yJjt#!XLAnMń +(ms51NyhuRvU%w"hAӫ*/ldgTX5lZYJ.*UBONt^t5gv׳/eS35ipo!{xecaKOU4KJ-F8Ⱆ`XlB)UycٟX#"4XF,ek"n=& >@VuNaFYiRD`!>rM:2Vr2dgATg9 $/HEnv.)c:ia3hnd/`)qLx?fŨ;I+C2Y-gKmz_n-_\C&HGnQ K3hTt2@qQeJ-Ƨ*5|^aJH1nZꇹ2fǧVScaZ{8g2|yEKH7w9Kr5j@a"UpZ5M0|4m[׸mDװ@@if,am2=VaҰjt&!5J(YOˉ#,`y( b,qQv<#p}}!Q;KF^>&l+^?7:2#:of2ŨI9 W߳rYչ)N[Ȏ *l皽j٧J'c|³7щZw?Owq܀aC;1~V~7"gvaUb(% =70ڳ0CWU]¿newTW4)_|fȯF3-%tlq7H}yS(Nyb@J8L/̖\o|*}鰱HіY !WIAOҼ nf@lÁ(ī)`m"ׇoR>k4ZU,Er͊s9_:U.w>t88@H.w*zКğDrAkM`+m3_*s\ܘe ;_cg/mte4x{B*t>x@KQFhCEM] 6@uNU8~!Tեߌ"rVeQH b Պky"&2\5efho- _w|z<{ˑAuYRV,K>N%}?GTNŖvPѦzrFѥ:vUKn~OZ{íckc/ά,MkoUNq{mh`遣i+l@0PR +2[BldJW*RRS+6ܭ缐C>U˫\]8" U8GS|m52T8%8SO_~}|ˁ?zw,!$?@mz|LJtacahmHN|%sZ?onwk OW[NcYk U _A ,ùz|!ۑDVշs){3TI (YB@C[6LVS}iS+4L$ckZ.u.uq'RaQl}sp":Wf|q 0lcA3Zw7^Dc'b+Ɩ2!+d܈R̺4}V(`r}Ap4&>6wᡎ@ڍ@Z>XUz6 EWЙ_ߚ竒/'b^}rZxngw!hFAM+XKQ|9mxIR`_fHM]WM&yLea^b:+뵠׬4iVd\oIW2'QDHwX8Veu_|<3Q,fUP܅*Jf.AFY35or{Ͱ*[䢑;m|fd1qtO]\wdPbM4 7!]|}5=UvXjBP-|pa0fCanul +NzssraɉjU[#=g IyQ)ZjRy:Snsb:+y@UV/9B}K\B)/P f7KG q:lE7i)a<NL!b5!xk,u3fVḒ1& *"} :lP3 ,cp`dXd|J?R*xor? £2̙bQ3N%)5<&H}Ƀkz!q0Wej-,UK'%P1 Ybseπ; l ڱ`ĹsJ@Aehu?zpIUfIҘvN%bZk2 kQ1E|LMAT!Ez20-+<)g1u-jx@(z~p瘼 '|jb/lچuOêBɊLfy("4r*z̖ IQ Q+~e)˚v_h3 @b?nd۳Y, u^>1ԫoj@Fִy?B&]_b󫮻>ھi i7`eG{P|>>L~޿~|r)H]J +5z9Ƿ?~/wz5+ f)28r?`wɕ}zc>[S͘x}bV$lc vb(%p#%k } ,KG VG ѱU ~O4rt4fFUYKn!a/p!МpaHrNe?*HqeuDY7xЪ>Ep-oWW7?3W`йxuVŕX .*~%-]ZI eo # $@t9 Al16d)LqDe(dvy7夣욼.FЍ*S7|H.NW2ج`oET*뢥B*$[ +|cwi?NZ'3' CTHxd.ȏWl w8 {rbBE!IXO063҂&@Pfg0 (-HӸy.Dg$n;\E٤$x+/ +KO)5$8 +`#W vm-:%u9Y/#R1@y]3A^ʮx;^ e}XcTVa<=Cl 7r +#/;5\ +y3$Xx@ݒ'ܜ^6">7Eaj=S`Ng%4Y3#/mh_\^$鋱W׭;JV#wB%iZ +ԸWqh \7./z-/d$M@E՟ 8r9ϊ2 BPCbdJL GL\\dxD^f63*~qLJg֫fsܯC$DNU+[.ϨV±bTD$1[+{6H#TdxT <\do>r&¿ XJb +endstream endobj 6 0 obj <> endobj 49 0 obj <> endobj 58 0 obj [/View/Design] endobj 59 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 92 0 obj [91 0 R] endobj 127 0 obj <> endobj xref +0 128 +0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000027749 00000 n +0000000005 00000 f +0000000007 00000 f +0000571395 00000 n +0000000009 00000 f +0000027800 00000 n +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000018 00000 f +0000571660 00000 n +0000571691 00000 n +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000036 00000 f +0000000037 00000 f +0000000038 00000 f +0000000039 00000 f +0000000040 00000 f +0000000041 00000 f +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000000 00000 f +0000000000 00000 f +0000571469 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000571544 00000 n +0000571575 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000183811 00000 n +0000183616 00000 n +0000571776 00000 n +0000028198 00000 n +0000188093 00000 n +0000187869 00000 n +0000187982 00000 n +0000182390 00000 n +0000183054 00000 n +0000183102 00000 n +0000183693 00000 n +0000183725 00000 n +0000184051 00000 n +0000184294 00000 n +0000188168 00000 n +0000188837 00000 n +0000189922 00000 n +0000200866 00000 n +0000222183 00000 n +0000243955 00000 n +0000266747 00000 n +0000288796 00000 n +0000311250 00000 n +0000333213 00000 n +0000355143 00000 n +0000377172 00000 n +0000399734 00000 n +0000421968 00000 n +0000438823 00000 n +0000460381 00000 n +0000470382 00000 n +0000486472 00000 n +0000498054 00000 n +0000508906 00000 n +0000519715 00000 n +0000531322 00000 n +0000548632 00000 n +0000571801 00000 n +trailer +<<06DE57EE45DB3749823D9594A7A19BEF>]>> +startxref +572008 +%%EOF diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf new file mode 100644 index 0000000..9135ad1 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3_datasheet_en.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3_datasheet_en.pdf new file mode 100644 index 0000000..0ba8ed8 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3_datasheet_en.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3_technical_reference_manual_en.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3_technical_reference_manual_en.pdf new file mode 100644 index 0000000..48f1d57 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/ESP32_S3/esp32-s3_technical_reference_manual_en.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/L293D.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/L293D.pdf new file mode 100644 index 0000000..3940da2 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/L293D.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/LCD1602.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/LCD1602.pdf new file mode 100644 index 0000000..053e6c0 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/LCD1602.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/MPU-6050 Product Specification.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/MPU-6050 Product Specification.pdf new file mode 100644 index 0000000..0b891ff Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/MPU-6050 Product Specification.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/MPU-6050 Register Map and Descriptions.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/MPU-6050 Register Map and Descriptions.pdf new file mode 100644 index 0000000..428baca Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/MPU-6050 Register Map and Descriptions.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/HDF3M-811-2640.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/HDF3M-811-2640.pdf new file mode 100644 index 0000000..99d127f Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/HDF3M-811-2640.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640 Camera Module Hardware Application Notes 1.04.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640 Camera Module Hardware Application Notes 1.04.pdf new file mode 100644 index 0000000..06e3da7 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640 Camera Module Hardware Application Notes 1.04.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640 Software Application Notes 1.03.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640 Software Application Notes 1.03.pdf new file mode 100644 index 0000000..19f9935 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640 Software Application Notes 1.03.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640.pdf new file mode 100644 index 0000000..43e18b0 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640_DS(1.6).pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640_DS(1.6).pdf new file mode 100644 index 0000000..a81d1ce Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OV2640_DS(1.6).pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OmniVision Technologies Seril Camera Control Bus(SCCB) Specification.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OmniVision Technologies Seril Camera Control Bus(SCCB) Specification.pdf new file mode 100644 index 0000000..3cd7bf6 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/OV2640/OmniVision Technologies Seril Camera Control Bus(SCCB) Specification.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/PCF8574_datasheet.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/PCF8574_datasheet.pdf new file mode 100644 index 0000000..699fa8d Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/PCF8574_datasheet.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/Datasheet/PCF8591_datasheet.pdf b/doc/Freenove ESP32-S3-Wroom/Datasheet/PCF8591_datasheet.pdf new file mode 100644 index 0000000..2176cf9 Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Datasheet/PCF8591_datasheet.pdf differ diff --git a/doc/Freenove ESP32-S3-Wroom/ESP32S3_Pinout.png b/doc/Freenove ESP32-S3-Wroom/ESP32S3_Pinout.png new file mode 100644 index 0000000..9bf889e Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/ESP32S3_Pinout.png differ diff --git a/doc/Freenove ESP32-S3-Wroom/LICENSE.txt b/doc/Freenove ESP32-S3-Wroom/LICENSE.txt new file mode 100644 index 0000000..a354af8 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/LICENSE.txt @@ -0,0 +1,58 @@ +Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License (CC BY-NC-SA 3.0) + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + +"Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. +"Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(g) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. +"Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. +"License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike. +"Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. +"Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. +"Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. +"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. +"Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. +"Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + +to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; +to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; +to Distribute and Publicly Perform the Work including as incorporated in Collections; and, +to Distribute and Publicly Perform Adaptations. +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights described in Section 4(e). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + +You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(d), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(d), as requested. +You may Distribute or Publicly Perform an Adaptation only under: (i) the terms of this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-NonCommercial-ShareAlike 3.0 US) ("Applicable License"). You must include a copy of, or the URI, for Applicable License with every copy of each Adaptation You Distribute or Publicly Perform. You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License. You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. +You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in con-nection with the exchange of copyrighted works. +If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(d) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. +For the avoidance of doubt: + +Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; +Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, +Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c). +Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING AND TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + +This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. +Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. +8. Miscellaneous + +Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. +Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. +If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. +No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. +This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. +The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. \ No newline at end of file diff --git a/doc/Freenove ESP32-S3-Wroom/README.md b/doc/Freenove ESP32-S3-Wroom/README.md new file mode 100644 index 0000000..c04fef3 --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/README.md @@ -0,0 +1,5 @@ +# Freenove ESP32-S3-WROOM CAM + +In progress + + diff --git a/doc/Freenove ESP32-S3-Wroom/README_freenove.md b/doc/Freenove ESP32-S3-Wroom/README_freenove.md new file mode 100644 index 0000000..32247eb --- /dev/null +++ b/doc/Freenove ESP32-S3-Wroom/README_freenove.md @@ -0,0 +1,86 @@ +## Freenove_ESP32_S3_WROOM_Board + +A kit with a Freenove® ESP32-S3 Board for learning programming and electronics. + + + +ESP32-S3 chip is manufactured by Espressif®. +>Espressif® is a trademark of Espressif Systems (Shanghai) Co.Ltd (https://www.espressif.com/). + +Freenove ESP32-S3 Board can be uploaded code using Arduino® IDE. +> Arduino® is a trademark of Arduino LLC (https://www.arduino.cc/). + + + +### Download + +Click the green "Code" button, then click "Download ZIP" button in the pop-up window. +Do NOT click the "Open in Desktop" button, it will lead you to install Github software. + +> If you meet any difficulties, please contact our technical team for help. + +### Use + +1. Download the ZIP file as above. +2. Unzip it and you will get a folder contains tutorials and related files. +3. Please start with "Start Here.pdf". + +### Support + +Freenove provides free and quick customer support. Including but not limited to: + +* Quality problems of products +* Problems of products when used +* Questions of learning and creation +* Opinions and suggestions +* Ideas and thoughts + +Please send an email to: + +[support@freenove.com](mailto:support@freenove.com) + +We will reply within one working day. + +### Purchase + +Please visit the following page to purchase our products: + +http://freenove.com/store + +Business customers please contact us through the following email address: + +[sale@freenove.com](mailto:sale@freenove.com) + +### About + +Freenove provides open source electronic products and services. + +Freenove is committed to helping customers learn programming and electronic knowledge, quickly implement product prototypes, realize their creativity and launch innovative products. Our services include: + +* Kits for learning programming and electronics +* Kits compatible with Arduino®, Raspberry Pi®, micro:bit®, etc. +* Kits for robots, smart cars, drones, etc. +* Components, modules and tools +* Design and customization + +To learn more about us or get our latest information, please visit our website: + +http://www.freenove.com + +### Copyright + +All the files in this repository are released under [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/). +You can find a copy of the license in this repository. + +![markdown](https://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png) + +> It means you can use these files on your own derived works, in part or completely. But not for commercial use. + +Freenove® brand and logo are trademarks of Freenove Creative Technology Co., Ltd. Must not be used without permission. + +Other registered trademarks and their owners appearing in this repository: + +Arduino® is a trademark of Arduino LLC (https://www.arduino.cc/). +Raspberry Pi® is a trademark of Raspberry Pi Foundation (https://www.raspberrypi.org/). +micro:bit® is a trademark of Micro:bit Educational Foundation (https://www.microbit.org/). +Espressif® is a trademark of Espressif Systems (Shanghai) Co.Ltd (https://www.espressif.com/). diff --git a/doc/Freenove ESP32-S3-Wroom/Start Here.pdf b/doc/Freenove ESP32-S3-Wroom/Start Here.pdf new file mode 100644 index 0000000..5ea436c Binary files /dev/null and b/doc/Freenove ESP32-S3-Wroom/Start Here.pdf differ