diff --git a/.github/.gitignore b/.github/.gitignore deleted file mode 100644 index 8b13789..0000000 --- a/.github/.gitignore +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.github/actions/avr_setup/action.yml b/.github/actions/avr_setup/action.yml new file mode 100644 index 0000000..3b92db0 --- /dev/null +++ b/.github/actions/avr_setup/action.yml @@ -0,0 +1,18 @@ +name: "Get changed files list" +description: "Setup Node with caching for dependencies" +runs: + using: "composite" + steps: + - name: Set up Arduino CLI + uses: arduino/setup-arduino-cli@v2 + + - name: Install platform + run: | + arduino-cli core update-index + arduino-cli core install ${{ env.platform }} + shell: bash + + - name: Install popular libs + run: | + arduino-cli lib install LiquidCrystal + shell: bash \ No newline at end of file diff --git a/.github/actions/get_changed_files/action.yml b/.github/actions/get_changed_files/action.yml new file mode 100644 index 0000000..ecf73ac --- /dev/null +++ b/.github/actions/get_changed_files/action.yml @@ -0,0 +1,13 @@ +name: "Get changed files list" +description: "Setup Node with caching for dependencies" +runs: + using: "composite" + steps: + - name: Get changed files list + id: get_changed_files + run: | + echo "Changed files:" + git diff --name-only ${{ github.event.pull_request.base.sha }} > changed_files.txt + cat changed_files.txt + echo "The list is saved to changed_files.txt" + shell: bash \ No newline at end of file diff --git a/.github/workflows/Lab_01_CI.yml b/.github/workflows/Lab_01_CI.yml deleted file mode 100644 index 985573b..0000000 --- a/.github/workflows/Lab_01_CI.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Cheking of compile Arduino sketch for AVR/AtMega and ESP8266 - -on: - push: - branches: [ main, master ] - pull_request: - branches: [ main, master ] - -jobs: - test-matrix: - strategy: - matrix: - arduino-platform: - - "arduino:avr" - - "esp8266:esp8266" - include: - - arduino-platform: "arduino:avr" - fqbn: "arduino:avr:mega" - - arduino-platform: "esp8266:esp8266" - fqbn: "esp8266:esp8266:generic" - - runs-on: ubuntu-22.04 - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Arduino CLI - uses: arduino/setup-arduino-cli@v2 - - - name: Install platform - run: | - arduino-cli core update-index - arduino-cli core install ${{ matrix.arduino-platform }} - - - name: Compile Sketch - run: arduino-cli compile --fqbn ${{ matrix.fqbn }} ./mc_labs/mc_lab_01/*.ino diff --git a/.github/workflows/lab-validation.yml b/.github/workflows/lab-validation.yml new file mode 100644 index 0000000..7a489fa --- /dev/null +++ b/.github/workflows/lab-validation.yml @@ -0,0 +1,174 @@ +name: Cheking of compile Arduino sketch for AVR/AtMega + +on: + pull_request: + branches: [main, master] + +env: + platform: "arduino:avr" + fqbn_master: "arduino:avr:mega" + COMMIT_COUNT: $(( ${{ github.event_name == 'pull_request' && github.event.pull_request.commits || 0 }} + 1 )) + +jobs: + handle_bad_branch_name: + runs-on: ubuntu-22.04 + if: (contains(github.head_ref, 'mc_lab_1') || contains(github.head_ref, 'mc_lab_2') || contains(github.head_ref, 'mc_lab_3') || contains(github.head_ref, 'mc_lab_4') || contains(github.head_ref, 'mc_lab_5') || contains(github.head_ref, 'mc_lab_6') || contains(github.head_ref, 'mc_lab_7')) == false + steps: + - name: Fail the build + run: | + echo "The branch name is not correct. It should contain 'mc_lab_' prefix" + exit 1 + build_labs_1_to_4: + runs-on: ubuntu-22.04 + if: contains(github.head_ref, 'mc_lab_1') || contains(github.head_ref, 'mc_lab_2') || contains(github.head_ref, 'mc_lab_3') || contains(github.head_ref, 'mc_lab_4') + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: ${{ env.COMMIT_COUNT }} + + - name: Get changed files list + uses: ./.github/actions/get_changed_files + + - name: Set up Arduino CLI + uses: ./.github/actions/avr_setup + + - name: Compile Sketch + run: arduino-cli compile --fqbn ${{ env.fqbn_master }} --output-dir build $(grep -E '\.ino$' changed_files.txt | tail -n 1 | xargs) + # TODO: remove tail -n 1 + + - name: Uploud artifact + uses: actions/upload-artifact@v4 + with: + name: build-artifact + path: build + + build_lab_5: + runs-on: ubuntu-22.04 + if: contains(github.head_ref, 'mc_lab_5') + env: + fqbn_slave: "arduino:avr:nano" + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: ${{ env.COMMIT_COUNT }} + + - name: Get changed files list + uses: ./.github/actions/get_changed_files + + - name: Get master folder + run: | + cat changed_files.txt | xargs dirname | grep 'master' | grep -m 1 -vE '/(.*master.*|.*slave.*)/' > master_project.txt + echo "Master project:" + cat master_project.txt + + - name: Get slave folders + run: | + cat changed_files.txt | xargs dirname | grep 'slave' | grep -vE '/(.*master.*|.*slave.*)/' > slave_projects.txt + echo "Slave projects:" + cat slave_projects.txt + + - name: Check if there is at least one master and one slave project + run: | + if [ ! -s master_project.txt ] || [ ! -s slave_projects.txt ]; then + echo "There is no master or slave project" + exit 1 + fi + + - name: Set up Arduino CLI + uses: ./.github/actions/avr_setup + + - name: Compile master + run: while read master_folder; do arduino-cli compile --fqbn ${{ env.fqbn_master }} $master_folder/*.ino; done < master_project.txt + + - name: Compile slaves + run: while read slave_folder; do arduino-cli compile --fqbn ${{ env.fqbn_slave }} $slave_folder/*.ino; done < slave_projects.txt + build_lab_6: + runs-on: ubuntu-22.04 + if: contains(github.head_ref, 'mc_lab_6') + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: ${{ env.COMMIT_COUNT }} + + - name: It just passes + run: echo "It just passes. It's too complex" + build_lab_7: + runs-on: ubuntu-22.04 + if: contains(github.head_ref, 'mc_lab_7') + env: + register-bindings: "m2560def.inc" + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: ${{ env.COMMIT_COUNT }} + + - name: Get changed files list + uses: ./.github/actions/get_changed_files + + - name: Setup AVRA Assembler + run: | + git clone https://github.com/Ro5bert/avra.git + cd avra + sudo make install + + - name: Preprocess sketch - append register bindings to the top of the file + run: printf ".include \"${{ env.register-bindings }}\"\n\n" | cat - $(grep -m 1 -E '\.(asm|S)$' changed_files.txt | xargs) > pipeline_main_assembly_source_file.asm + + - name: Compile Sketch + run: avra pipeline_main_assembly_source_file.asm + + + test_lab_1: + runs-on: ubuntu-22.04 + needs: build_labs_1_to_4 + if: contains(github.head_ref, 'mc_lab_1') + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: ${{ env.COMMIT_COUNT }} + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: build-artifact + path: mc_labs/mc_lab_01/build + + - name: Extract Variant Number + id: extract_variant + run: | + variant= + echo "variant='$(echo "${{ github.head_ref }}" | sed -n 's/.*v\([0-9]\+\).*/\1/p')'" >> "$GITHUB_OUTPUT" + + - name: Generate Test Scenario + id: generate_scenario + uses: OleksiuDatsko/get-lab-test-scenario-action@main + with: + lab_number: 1 + variant_number: ${{ steps.extract_variant.outputs.variant }} + wokwi_toml_path: mc_labs/mc_lab_01/wokwi.toml + output: ${{ github.workspace }}/test_scenario.yml + + - name: Run a Wokwi CI server + uses: wokwi/wokwi-ci-server-action@v1 + + - name: Test on Wokwi + id: test + uses: wokwi/wokwi-ci-action@v1 + continue-on-error: true + with: + token: ${{ secrets.WOKWI_CLI_TOKEN }} + path: mc_labs/mc_lab_01/ + scenario: ${{ github.workspace }}/test_scenario.yml + + - name: Rerun test on Wokwi + uses: wokwi/wokwi-ci-action@v1 + if: steps.test.outcome == 'failure' + with: + token: ${{ secrets.WOKWI_CLI_TOKEN }} + path: mc_labs/mc_lab_01/ + scenario: ${{ github.workspace }}/test_scenario.yml diff --git a/mc_labs/mc_lab_01/Dubyk_Yura_Lab_01/Dubyk_Yura_Lab_01.ino b/mc_labs/mc_lab_01/Dubyk_Yura_Lab_01/Dubyk_Yura_Lab_01.ino deleted file mode 100644 index d6cc3bb..0000000 --- a/mc_labs/mc_lab_01/Dubyk_Yura_Lab_01/Dubyk_Yura_Lab_01.ino +++ /dev/null @@ -1,360 +0,0 @@ -#include -#include -#include - -#define ESP_WIFI_MODE 1 // WIFI_STA // WIFI_AP //WIFI_AP_STA -#define DELAY_BETWEEN_BUTTONS 500 -#define DEBOUNCE_DELAY 40 - -const char *ssid = "AsusLyra"; -const char *password = "123456qwerty"; - -const uint8_t btnGPIO = D8; - -typedef struct LED_STRUCT -{ - uint8_t GPIO_PIN; - - LED_STRUCT *nextLed; - LED_STRUCT *prevLed; -} LED_STRUCT_t; - -LED_STRUCT_t *currentLedPointer = NULL; -LED_STRUCT_t LED1 = {D5, NULL, NULL}; -LED_STRUCT_t LED2 = {D6, NULL, NULL}; -LED_STRUCT_t LED3 = {D7, NULL, NULL}; - -void initLedsArray() -{ - LED1.nextLed = &LED2; - LED1.prevLed = &LED3; - - LED2.nextLed = &LED3; - LED2.prevLed = &LED1; - - LED3.nextLed = &LED1; - LED3.prevLed = &LED2; - - currentLedPointer = &LED1; -} - -uint32_t timestamp; -uint32_t lastDebounceTime = 0; - -uint32_t buttonCounter = 0; - -uint32_t prevButtonCounter = 0; - -bool lastState = LOW; -bool btnPressed = false; -bool siteBtnPressed = false; -bool msgAboutButtonSended = true; - -// Create AsyncWebServer object on port 80 -AsyncWebServer server(80); - -const char index_html[] PROGMEM = R"rawliteral( - - - - - - - - - -

ESP Pushbutton Web Server

- - -
-
-
-
-
- - - - - -)rawliteral"; - -void notFound(AsyncWebServerRequest *request) -{ - request->send(404, "text/plain", "Not found"); -} - -void pinsSetup() -{ - pinMode(LED1.GPIO_PIN, OUTPUT); - pinMode(LED2.GPIO_PIN, OUTPUT); - pinMode(LED3.GPIO_PIN, OUTPUT); - pinMode(btnGPIO, INPUT); -} - -uint8_t initWiFi() -{ - if (ESP_WIFI_MODE == 1) - { - WiFi.mode(WIFI_STA); - // Connect to Wi-Fi network with SSID and password - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) - { - delay(1000); - Serial.println("Connecting to WiFi.."); - } - Serial.println(); - Serial.print("ESP IP Address: http://"); - Serial.println(WiFi.localIP()); - - Serial.print("RRSI: "); - Serial.println(WiFi.RSSI()); - } - else if (ESP_WIFI_MODE == 2) - { - WiFi.mode(WIFI_AP); - Serial.println("Setting AP (Access Point)…"); - // Remove the password parameter, if you want the AP (Access Point) to be open - WiFi.softAP(ssid, NULL); - - IPAddress IP = WiFi.softAPIP(); - Serial.print("AP IP address: "); - Serial.println(IP); - } - else - { - WiFi.mode(WIFI_OFF); - Serial.println("Wifi of"); - return -1; - } - // Send web page to client - server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) - { request->send_P(200, "text/html", index_html); }); - - server.on("/on_alg1", HTTP_GET, [](AsyncWebServerRequest *request) - { - siteBtnPressed = true; - request->send(200, "text/plain", "ok"); }); - - server.on("/off_alg1", HTTP_GET, [](AsyncWebServerRequest *request) - { - siteBtnPressed = false; - request->send(200, "text/plain", "ok"); }); - - server.on("/status_led_1", HTTP_GET, [](AsyncWebServerRequest *request) - { request->send(200, "text/plain", String(digitalRead(LED1.GPIO_PIN)).c_str()); }); - - server.on("/status_led_2", HTTP_GET, [](AsyncWebServerRequest *request) - { request->send(200, "text/plain", String(digitalRead(LED2.GPIO_PIN)).c_str()); }); - - server.on("/status_led_3", HTTP_GET, [](AsyncWebServerRequest *request) - { request->send(200, "text/plain", String(digitalRead(LED3.GPIO_PIN)).c_str()); }); - - server.onNotFound(notFound); - server.begin(); - - return 0; -} - - -IRAM_ATTR void ISRbtnChange() -{ - btnPressed = true; -} - -bool direction = true; - -void btnChange() -{ - if (btnPressed) - { - if (millis() - lastDebounceTime >= DEBOUNCE_DELAY) - { - lastDebounceTime = millis(); - bool presentState = digitalRead(btnGPIO); - if (lastState != presentState) - { - lastState = presentState; - direction = !direction; - } - } - } -} - -void chechSiteButton() -{ - if (siteBtnPressed) - { - btnPressed = true; - msgAboutButtonSended = true; - } - else if (!siteBtnPressed && msgAboutButtonSended) - { - btnPressed = false; - msgAboutButtonSended = false; - } -} - -void setup() -{ - Serial.begin(115200); - pinsSetup(); - - initLedsArray(); - attachInterrupt(digitalPinToInterrupt(btnGPIO), ISRbtnChange, CHANGE); - timestamp = millis(); - initWiFi(); -} - -void do_algorithm() -{ - if (millis() - timestamp >= DELAY_BETWEEN_BUTTONS) - { - timestamp = millis(); - - digitalWrite(currentLedPointer->prevLed->GPIO_PIN, LOW); - digitalWrite(currentLedPointer->GPIO_PIN, HIGH); - digitalWrite(currentLedPointer->prevLed->GPIO_PIN, LOW); - - currentLedPointer = direction ? currentLedPointer->nextLed : currentLedPointer->prevLed; - } -} - -void loop() -{ - chechSiteButton(); - btnChange(); - do_algorithm(); -} \ No newline at end of file diff --git a/mc_labs/mc_lab_01/Dubyk_Yura_Lab_01/Schematic_Lab1.png b/mc_labs/mc_lab_01/Dubyk_Yura_Lab_01/Schematic_Lab1.png deleted file mode 100644 index b84af41..0000000 Binary files a/mc_labs/mc_lab_01/Dubyk_Yura_Lab_01/Schematic_Lab1.png and /dev/null differ diff --git a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.eep b/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.eep deleted file mode 100644 index 7c166a1..0000000 --- a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.eep +++ /dev/null @@ -1 +0,0 @@ -:00000001FF diff --git a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.elf b/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.elf deleted file mode 100755 index a996ae3..0000000 Binary files a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.elf and /dev/null differ diff --git a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.hex b/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.hex deleted file mode 100644 index 8c11c1a..0000000 --- a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.hex +++ /dev/null @@ -1,208 +0,0 @@ -:100000000C941B010C944C010C944C010C944C016D -:100010000C944C010C944C010C944C010C944C012C -:100020000C944C010C944C010C944C010C944C011C -:100030000C944C010C944C010C944C010C944C010C -:100040000C944C010C944C010C944C010C944C01FC -:100050000C944C010C944C010C944C010C943D03F9 -:100060000C944C010C94B1030C9487030C944C0138 -:100070000C944C010C944C010C944C010C944C01CC -:100080000C944C010C944C010C944C010C944C01BC -:100090000C944C010C944C010C944C010C944C01AC -:1000A0000C944C010C944C010C944C010C944C019C -:1000B0000C944C010C944C010C944C010C944C018C -:1000C0000C944C010C944C010C944C010C944C017C -:1000D0000C944C010C944C010C944C010C944C016C -:1000E0000C944C010C9423050C946B050C94A20504 -:1000F0000C949C050C946F050C94F5010C948802EB -:100100000C94B1050C9486050C94A6050C94A501DD -:100110000C947C050C9494050C9480050C943B0283 -:100120000C948A050C948E050C9473050C9476053A -:100130000C9403020C9498050C9467050C94D2015E -:100140000C941E050C94E101000020002300260001 -:1001500029002C002F0032000001000003010601DD -:10016000090105050505070508080808020202023D -:100170000A0A080804040404010101010101010143 -:100180000303030303030303040707070C0C0C0C0E -:100190000C0C0C0C020202020606060606060606F7 -:1001A0000B0B0B0B0B0B0B0B010210202008081084 -:1001B00020401020408002010201080402010102D7 -:1001C00004081020408080402010080402018004B0 -:1001D000020180402010080402010804020101020B -:1001E0000408102040800102040810204080000014 -:1001F0000A0B02090C0D0E080703040100000000A1 -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000121110000000AB -:1002200000000000000000000000000000000000CE -:1002300000000000B10511241FBECFEFD1E2DEBFE8 -:10024000CDBF00E00CBF12E0A0E0B2E0E4E1FCE0D2 -:1002500000E00BBF02C007900D92A43CB107D9F794 -:1002600023E0A4ECB2E001C01D92AB36B207E1F787 -:1002700011E0CBE1D1E000E006C021970109802F19 -:10028000FE010E940006CA31D10780E00807A9F7E5 -:100290000E94E7030C9408060C9400003FB7F89402 -:1002A0008091CA029091CB02A091CC02B091CD0274 -:1002B00026B5A89B05C02F3F19F00196A11DB11DC1 -:1002C0003FBFBA2FA92F982F8827BC01CD01620FFD -:1002D000711D811D911D42E0660F771F881F991FB8 -:1002E0004A95D1F708958F929F92AF92BF92CF9285 -:1002F000DF92EF92FF924B015C010E944E016B0175 -:100300007C010E944E016C197D098E099F09683E8F -:10031000734081059105A8F321E0821A9108A10894 -:10032000B10888EEC80E83E0D81EE11CF11C8114D0 -:100330009104A104B10429F7FF90EF90DF90CF90D2 -:10034000BF90AF909F908F900895AF92BF92CF9241 -:10035000DF92EF92FF920F931F93CF93DF936C0185 -:100360007B018B01040F151FEB015E01AE18BF0866 -:10037000C017D10759F06991D601ED91FC91019018 -:10038000F081E02DC6011995892B79F7C501DF9120 -:10039000CF911F910F91FF90EF90DF90CF90BF9082 -:1003A000AF900895FC01538D448D252F30E0842FAC -:1003B00090E0821B930B541710F0CF96089501978D -:1003C0000895FC01918D828D981761F0A28DAE0F7A -:1003D000BF2FB11D5D968C91928D9F5F9F73928F01 -:1003E00090E008958FEF9FEF0895FC01918D828D2D -:1003F000981731F0828DE80FF11D858D90E00895FA -:100400008FEF9FEF0895FC01918D228D892F90E051 -:10041000805C9F4F821B91098F73992708958EEC02 -:1004200092E00E94030221E0892B09F420E0822F50 -:100430000895FC01A48DA80FB92FB11DA35ABF4F79 -:100440002C91848D90E001968F739927848FA689D3 -:10045000B7892C93A089B1898C91837080648C9327 -:10046000938D848D981306C00288F389E02D8081D6 -:100470008F7D80830895EF92FF920F931F93CF9308 -:10048000DF93EC0181E0888F9B8D8C8D98131AC0CF -:10049000E889F989808185FF15C09FB7F894EE89B6 -:1004A000FF896083E889F989808183708064808313 -:1004B0009FBF81E090E0DF91CF911F910F91FF905E -:1004C000EF900895F62E0B8D10E00F5F1F4F0F7306 -:1004D0001127E02E8C8D8E110CC00FB607FCFACFC1 -:1004E000E889F989808185FFF5CFCE010E94190244 -:1004F000F1CFEB8DEC0FFD2FF11DE35AFF4FF08292 -:100500009FB7F8940B8FEA89FB8980818062CFCFF7 -:10051000CF93DF93EC01888D8823B9F0AA89BB893A -:10052000E889F9898C9185FD03C0808186FD0DC025 -:100530000FB607FCF7CF8C9185FFF2CF808185FF46 -:10054000EDCFCE010E941902E9CFDF91CF9108953E -:1005500080E090E0892B29F00E940F0281110E9417 -:10056000000080E090E0892B49F080E090E0892B4A -:1005700029F00E94000081110E94000080E090E0BC -:10058000892B49F080E090E0892B29F00E9400003F -:1005900081110E94000080E090E0892B49F080E00A -:1005A00090E0892B29F00E94000081110C9400003A -:1005B0000895FC0101900020E9F73197AF01481B35 -:1005C000590BBC018EEC92E00C94A501CF92DF9206 -:1005D000EF92FF920F931F93CF93DF93CDB7DEB7C8 -:1005E000A1970FB6F894DEBF0FBECDBF282F30E025 -:1005F00050E040E019A28E010F5D1F4F6B01770F95 -:10060000EE08FF08CA01B901A70196010E94DE05A4 -:10061000605DF80162938F01211531054105510597 -:1006200089F73097C9F0CF010E94D9028C0182E18D -:1006300092E00E94D902800F911FA1960FB6F89404 -:10064000DEBF0FBECDBFDF91CF911F910F91FF9005 -:10065000EF90DF90CF90089510E000E0E8CFCF93C7 -:10066000DF930E94D902EC0182E192E00E94D9025C -:100670008C0F9D1FDF91CF9108951F920F920FB69F -:100680000F9211242F933F938F939F93AF93BF9318 -:100690008091C6029091C702A091C802B091C90290 -:1006A0003091C50223E0230F2D3758F50196A11D87 -:1006B000B11D2093C5028093C6029093C702A093F8 -:1006C000C802B093C9028091CA029091CB02A09156 -:1006D000CC02B091CD020196A11DB11D8093CA023A -:1006E0009093CB02A093CC02B093CD02BF91AF9177 -:1006F0009F918F913F912F910F900FBE0F901F9060 -:10070000189526E8230F0296A11DB11DD2CF1F9286 -:100710000F920FB60F9211240BB60F922F933F93A7 -:100720004F935F936F937F938F939F93AF93BF93F9 -:10073000EF93FF938EEC92E00E941902FF91EF91EC -:10074000BF91AF919F918F917F916F915F914F91E9 -:100750003F912F910F900BBE0F900FBE0F901F90E7 -:1007600018951F920F920FB60F9211240BB60F928D -:100770002F938F939F93EF93FF93E091DE02F0917D -:10078000DF028081E091E402F091E50282FD1DC06C -:1007900090818091E7028F5F8F732091E80282172A -:1007A00041F0E091E702F0E0E253FD4F958F809336 -:1007B000E702FF91EF919F918F912F910F900BBEC8 -:1007C0000F900FBE0F901F9018958081F2CF7894F4 -:1007D00084B5826084BD84B5816084BD85B5826046 -:1007E00085BD85B5816085BD80916E0081608093F7 -:1007F0006E00109281008091810082608093810060 -:10080000809181008160809381008091800081606F -:10081000809380008091B10084608093B1008091CA -:10082000B00081608093B0008091910082608093DD -:10083000910080919100816080939100809190005F -:100840008160809390008091A10082608093A100DC -:100850008091A10081608093A1008091A0008160BF -:100860008093A0008091210182608093210180917A -:10087000210181608093210180912001816080931A -:10088000200180917A00846080937A0080917A00C0 -:10089000826080937A0080917A00816080937A00F0 -:1008A00080917A00806880937A001092C100E09174 -:1008B000DE02F091DF0282E08083E091DA02F091C3 -:1008C000DB021082E091DC02F091DD028FEC80838C -:1008D0001092E602E091E202F091E30286E080836A -:1008E000E091E002F091E102808180618083E091FB -:1008F000E002F091E102808188608083E091E00273 -:10090000F091E102808180688083E091E002F091C3 -:10091000E10280818F7D808368EC70E080E090E070 -:100920000E94730184E192E00E942F0385E192E02E -:100930000E942F0381E292E00E942F038FEF81B982 -:1009400085E392E00E94D90281B162E070E00E94EA -:10095000E60280E492E00E942F0382E592E00E948A -:100960002F0307E711E0F801C49185E692E00E94A9 -:10097000D9026AE070E08C2F0E94E6029DEBE92E1E -:1009800091E0F92EF701C49186E792E00E94D90226 -:100990006AE070E08C2F0E94E60287E892E00E94F5 -:1009A0002F038AB162E070E00E94E6028AB1C0952E -:1009B000C82BCAB98AB162E070E00E94E6021092C8 -:1009C000C40285E992E00E942F0386EA92E00E9429 -:1009D0002F0323E0622E22E0722E55245394812CA3 -:1009E000912C54018394CC24C394D12CF301849191 -:1009F000F7012491F8019491992309F4ABC088235D -:100A000011F181508231F8F4E82FF0E08827E45F9B -:100A1000FA4F8F4F0C9400066F0573051E0567058E -:100A20006B05230576057C05800586058A058E0500 -:100A30009405980523059C05A205A60580918000D4 -:100A40008F7780938000E92FF0E0EE0FFF1FE85BC7 -:100A5000FE4FA591B4918C91282309F47BC082EBC1 -:100A600092E00E942F035092C4028091C402882316 -:100A700059F1D0E0C0E022B1D501C4010C2E04C070 -:100A8000880F991FAA1FBB1F0A94D2F7822B82B925 -:100A900088EB92E00E942F0382B162E070E00E9436 -:100AA000E60268EE73E080E090E00E94730182B19C -:100AB00096010C2E01C0220F0A94EAF7822782B910 -:100AC0002196C830D105B9F60E94A8028FCF809137 -:100AD00080008F7DB6CF80918000877FB2CF84B5B4 -:100AE0008F7784BDB0CF84B58F7DFBCF8091B00070 -:100AF0008F778093B000A7CF8091B0008F7DF9CF22 -:100B0000809190008F77809390009DCF809190008E -:100B10008F7DF9CF80919000877FF5CF8091A000E5 -:100B20008F778093A0008FCF8091A0008F7DF9CF29 -:100B30008091A000877FF5CF809120018F778093EF -:100B4000200181CF809120018F7DF9CF80912001FC -:100B5000877FF5CF60E370E080E090E00E94730152 -:100B600084CFEEECF2E01382128288EE93E0A0E0F4 -:100B7000B0E084839583A683B78384E092E0918379 -:100B8000808385EC90E09587848784EC90E097875C -:100B9000868780EC90E0918B808B81EC90E0938B4A -:100BA000828B82EC90E0958B848B86EC90E0978B27 -:100BB000868B118E128E138E148E0895A1E21A2E3A -:100BC000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FF1 -:100BD000A217B307E407F50720F0A21BB30BE40B41 -:100BE000F50B661F771F881F991F1A9469F7609588 -:100BF0007095809590959B01AC01BD01CF01089542 -:100C0000EE0FFF1F881F8BBF0790F691E02D199400 -:040C1000F894FFCF86 -:100C1400000000003B02A501D20188020302E101A9 -:100C2400F5010D0A00536574757020626567696E7D -:100C34000073657475704C656473506F72742062D0 -:100C44006567696E004C656420626974733A2000BC -:100C540073657475704C656473506F727420656E3F -:100C64006400736574757042746E506F72742062A0 -:100C74006567696E00427574746F6E2070696E20CA -:100C8400706F72743A00427574746F6E2070696E7E -:100C9400206D61736B3A0053657474696E67204408 -:100CA4004452443A00736574757042746E506F72A6 -:100CB4007420656E6400536574757020656E646598 -:100CC4006400505245535300506F72742073746122 -:040CD40074653A0009 -:00000001FF diff --git a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.with_bootloader.bin b/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.with_bootloader.bin deleted file mode 100644 index f67644a..0000000 Binary files a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.with_bootloader.bin and /dev/null differ diff --git a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.with_bootloader.hex b/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.with_bootloader.hex deleted file mode 100644 index bf5c843..0000000 --- a/mc_labs/mc_lab_01/build/arduino.avr.mega/mc_lab_01.ino.with_bootloader.hex +++ /dev/null @@ -1,675 +0,0 @@ -:020000040000FA -:100000000C941B010C944C010C944C010C944C016D -:100010000C944C010C944C010C944C010C944C012C -:100020000C944C010C944C010C944C010C944C011C -:100030000C944C010C944C010C944C010C944C010C -:100040000C944C010C944C010C944C010C944C01FC -:100050000C944C010C944C010C944C010C943D03F9 -:100060000C944C010C94B1030C9487030C944C0138 -:100070000C944C010C944C010C944C010C944C01CC -:100080000C944C010C944C010C944C010C944C01BC -:100090000C944C010C944C010C944C010C944C01AC -:1000A0000C944C010C944C010C944C010C944C019C -:1000B0000C944C010C944C010C944C010C944C018C -:1000C0000C944C010C944C010C944C010C944C017C -:1000D0000C944C010C944C010C944C010C944C016C -:1000E0000C944C010C9423050C946B050C94A20504 -:1000F0000C949C050C946F050C94F5010C948802EB -:100100000C94B1050C9486050C94A6050C94A501DD -:100110000C947C050C9494050C9480050C943B0283 -:100120000C948A050C948E050C9473050C9476053A -:100130000C9403020C9498050C9467050C94D2015E -:100140000C941E050C94E101000020002300260001 -:1001500029002C002F0032000001000003010601DD -:10016000090105050505070508080808020202023D -:100170000A0A080804040404010101010101010143 -:100180000303030303030303040707070C0C0C0C0E -:100190000C0C0C0C020202020606060606060606F7 -:1001A0000B0B0B0B0B0B0B0B010210202008081084 -:1001B00020401020408002010201080402010102D7 -:1001C00004081020408080402010080402018004B0 -:1001D000020180402010080402010804020101020B -:1001E0000408102040800102040810204080000014 -:1001F0000A0B02090C0D0E080703040100000000A1 -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000121110000000AB -:1002200000000000000000000000000000000000CE -:1002300000000000B10511241FBECFEFD1E2DEBFE8 -:10024000CDBF00E00CBF12E0A0E0B2E0E4E1FCE0D2 -:1002500000E00BBF02C007900D92A43CB107D9F794 -:1002600023E0A4ECB2E001C01D92AB36B207E1F787 -:1002700011E0CBE1D1E000E006C021970109802F19 -:10028000FE010E940006CA31D10780E00807A9F7E5 -:100290000E94E7030C9408060C9400003FB7F89402 -:1002A0008091CA029091CB02A091CC02B091CD0274 -:1002B00026B5A89B05C02F3F19F00196A11DB11DC1 -:1002C0003FBFBA2FA92F982F8827BC01CD01620FFD -:1002D000711D811D911D42E0660F771F881F991FB8 -:1002E0004A95D1F708958F929F92AF92BF92CF9285 -:1002F000DF92EF92FF924B015C010E944E016B0175 -:100300007C010E944E016C197D098E099F09683E8F -:10031000734081059105A8F321E0821A9108A10894 -:10032000B10888EEC80E83E0D81EE11CF11C8114D0 -:100330009104A104B10429F7FF90EF90DF90CF90D2 -:10034000BF90AF909F908F900895AF92BF92CF9241 -:10035000DF92EF92FF920F931F93CF93DF936C0185 -:100360007B018B01040F151FEB015E01AE18BF0866 -:10037000C017D10759F06991D601ED91FC91019018 -:10038000F081E02DC6011995892B79F7C501DF9120 -:10039000CF911F910F91FF90EF90DF90CF90BF9082 -:1003A000AF900895FC01538D448D252F30E0842FAC -:1003B00090E0821B930B541710F0CF96089501978D -:1003C0000895FC01918D828D981761F0A28DAE0F7A -:1003D000BF2FB11D5D968C91928D9F5F9F73928F01 -:1003E00090E008958FEF9FEF0895FC01918D828D2D -:1003F000981731F0828DE80FF11D858D90E00895FA -:100400008FEF9FEF0895FC01918D228D892F90E051 -:10041000805C9F4F821B91098F73992708958EEC02 -:1004200092E00E94030221E0892B09F420E0822F50 -:100430000895FC01A48DA80FB92FB11DA35ABF4F79 -:100440002C91848D90E001968F739927848FA689D3 -:10045000B7892C93A089B1898C91837080648C9327 -:10046000938D848D981306C00288F389E02D8081D6 -:100470008F7D80830895EF92FF920F931F93CF9308 -:10048000DF93EC0181E0888F9B8D8C8D98131AC0CF -:10049000E889F989808185FF15C09FB7F894EE89B6 -:1004A000FF896083E889F989808183708064808313 -:1004B0009FBF81E090E0DF91CF911F910F91FF905E -:1004C000EF900895F62E0B8D10E00F5F1F4F0F7306 -:1004D0001127E02E8C8D8E110CC00FB607FCFACFC1 -:1004E000E889F989808185FFF5CFCE010E94190244 -:1004F000F1CFEB8DEC0FFD2FF11DE35AFF4FF08292 -:100500009FB7F8940B8FEA89FB8980818062CFCFF7 -:10051000CF93DF93EC01888D8823B9F0AA89BB893A -:10052000E889F9898C9185FD03C0808186FD0DC025 -:100530000FB607FCF7CF8C9185FFF2CF808185FF46 -:10054000EDCFCE010E941902E9CFDF91CF9108953E -:1005500080E090E0892B29F00E940F0281110E9417 -:10056000000080E090E0892B49F080E090E0892B4A -:1005700029F00E94000081110E94000080E090E0BC -:10058000892B49F080E090E0892B29F00E9400003F -:1005900081110E94000080E090E0892B49F080E00A -:1005A00090E0892B29F00E94000081110C9400003A -:1005B0000895FC0101900020E9F73197AF01481B35 -:1005C000590BBC018EEC92E00C94A501CF92DF9206 -:1005D000EF92FF920F931F93CF93DF93CDB7DEB7C8 -:1005E000A1970FB6F894DEBF0FBECDBF282F30E025 -:1005F00050E040E019A28E010F5D1F4F6B01770F95 -:10060000EE08FF08CA01B901A70196010E94DE05A4 -:10061000605DF80162938F01211531054105510597 -:1006200089F73097C9F0CF010E94D9028C0182E18D -:1006300092E00E94D902800F911FA1960FB6F89404 -:10064000DEBF0FBECDBFDF91CF911F910F91FF9005 -:10065000EF90DF90CF90089510E000E0E8CFCF93C7 -:10066000DF930E94D902EC0182E192E00E94D9025C -:100670008C0F9D1FDF91CF9108951F920F920FB69F -:100680000F9211242F933F938F939F93AF93BF9318 -:100690008091C6029091C702A091C802B091C90290 -:1006A0003091C50223E0230F2D3758F50196A11D87 -:1006B000B11D2093C5028093C6029093C702A093F8 -:1006C000C802B093C9028091CA029091CB02A09156 -:1006D000CC02B091CD020196A11DB11D8093CA023A -:1006E0009093CB02A093CC02B093CD02BF91AF9177 -:1006F0009F918F913F912F910F900FBE0F901F9060 -:10070000189526E8230F0296A11DB11DD2CF1F9286 -:100710000F920FB60F9211240BB60F922F933F93A7 -:100720004F935F936F937F938F939F93AF93BF93F9 -:10073000EF93FF938EEC92E00E941902FF91EF91EC -:10074000BF91AF919F918F917F916F915F914F91E9 -:100750003F912F910F900BBE0F900FBE0F901F90E7 -:1007600018951F920F920FB60F9211240BB60F928D -:100770002F938F939F93EF93FF93E091DE02F0917D -:10078000DF028081E091E402F091E50282FD1DC06C -:1007900090818091E7028F5F8F732091E80282172A -:1007A00041F0E091E702F0E0E253FD4F958F809336 -:1007B000E702FF91EF919F918F912F910F900BBEC8 -:1007C0000F900FBE0F901F9018958081F2CF7894F4 -:1007D00084B5826084BD84B5816084BD85B5826046 -:1007E00085BD85B5816085BD80916E0081608093F7 -:1007F0006E00109281008091810082608093810060 -:10080000809181008160809381008091800081606F -:10081000809380008091B10084608093B1008091CA -:10082000B00081608093B0008091910082608093DD -:10083000910080919100816080939100809190005F -:100840008160809390008091A10082608093A100DC -:100850008091A10081608093A1008091A0008160BF -:100860008093A0008091210182608093210180917A -:10087000210181608093210180912001816080931A -:10088000200180917A00846080937A0080917A00C0 -:10089000826080937A0080917A00816080937A00F0 -:1008A00080917A00806880937A001092C100E09174 -:1008B000DE02F091DF0282E08083E091DA02F091C3 -:1008C000DB021082E091DC02F091DD028FEC80838C -:1008D0001092E602E091E202F091E30286E080836A -:1008E000E091E002F091E102808180618083E091FB -:1008F000E002F091E102808188608083E091E00273 -:10090000F091E102808180688083E091E002F091C3 -:10091000E10280818F7D808368EC70E080E090E070 -:100920000E94730184E192E00E942F0385E192E02E -:100930000E942F0381E292E00E942F038FEF81B982 -:1009400085E392E00E94D90281B162E070E00E94EA -:10095000E60280E492E00E942F0382E592E00E948A -:100960002F0307E711E0F801C49185E692E00E94A9 -:10097000D9026AE070E08C2F0E94E6029DEBE92E1E -:1009800091E0F92EF701C49186E792E00E94D90226 -:100990006AE070E08C2F0E94E60287E892E00E94F5 -:1009A0002F038AB162E070E00E94E6028AB1C0952E -:1009B000C82BCAB98AB162E070E00E94E6021092C8 -:1009C000C40285E992E00E942F0386EA92E00E9429 -:1009D0002F0323E0622E22E0722E55245394812CA3 -:1009E000912C54018394CC24C394D12CF301849191 -:1009F000F7012491F8019491992309F4ABC088235D -:100A000011F181508231F8F4E82FF0E08827E45F9B -:100A1000FA4F8F4F0C9400066F0573051E0567058E -:100A20006B05230576057C05800586058A058E0500 -:100A30009405980523059C05A205A60580918000D4 -:100A40008F7780938000E92FF0E0EE0FFF1FE85BC7 -:100A5000FE4FA591B4918C91282309F47BC082EBC1 -:100A600092E00E942F035092C4028091C402882316 -:100A700059F1D0E0C0E022B1D501C4010C2E04C070 -:100A8000880F991FAA1FBB1F0A94D2F7822B82B925 -:100A900088EB92E00E942F0382B162E070E00E9436 -:100AA000E60268EE73E080E090E00E94730182B19C -:100AB00096010C2E01C0220F0A94EAF7822782B910 -:100AC0002196C830D105B9F60E94A8028FCF809137 -:100AD00080008F7DB6CF80918000877FB2CF84B5B4 -:100AE0008F7784BDB0CF84B58F7DFBCF8091B00070 -:100AF0008F778093B000A7CF8091B0008F7DF9CF22 -:100B0000809190008F77809390009DCF809190008E -:100B10008F7DF9CF80919000877FF5CF8091A000E5 -:100B20008F778093A0008FCF8091A0008F7DF9CF29 -:100B30008091A000877FF5CF809120018F778093EF -:100B4000200181CF809120018F7DF9CF80912001FC -:100B5000877FF5CF60E370E080E090E00E94730152 -:100B600084CFEEECF2E01382128288EE93E0A0E0F4 -:100B7000B0E084839583A683B78384E092E0918379 -:100B8000808385EC90E09587848784EC90E097875C -:100B9000868780EC90E0918B808B81EC90E0938B4A -:100BA000828B82EC90E0958B848B86EC90E0978B27 -:100BB000868B118E128E138E148E0895A1E21A2E3A -:100BC000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FF1 -:100BD000A217B307E407F50720F0A21BB30BE40B41 -:100BE000F50B661F771F881F991F1A9469F7609588 -:100BF0007095809590959B01AC01BD01CF01089542 -:100C0000EE0FFF1F881F8BBF0790F691E02D199400 -:100C1000F894FFCF000000003B02A501D20188023A -:100C20000302E101F5010D0A00536574757020623D -:100C30006567696E0073657475704C656473506F99 -:100C4000727420626567696E004C65642062697425 -:100C5000733A200073657475704C656473506F72DD -:100C60007420656E6400736574757042746E506FA5 -:100C7000727420626567696E00427574746F6E20CD -:100C800070696E20706F72743A00427574746F6E82 -:100C90002070696E206D61736B3A005365747469DE -:100CA0006E6720444452443A007365747570427410 -:100CB0006E506F727420656E640053657475702099 -:100CC000656E64656400505245535300506F7274F2 -:080CD0002073746174653A00A1 -:020000040003F7 -:10E000000D9489F10D94B2F10D94B2F10D94B2F129 -:10E010000D94B2F10D94B2F10D94B2F10D94B2F1F0 -:10E020000D94B2F10D94B2F10D94B2F10D94B2F1E0 -:10E030000D94B2F10D94B2F10D94B2F10D94B2F1D0 -:10E040000D94B2F10D94B2F10D94B2F10D94B2F1C0 -:10E050000D94B2F10D94B2F10D94B2F10D94B2F1B0 -:10E060000D94B2F10D94B2F10D94B2F10D94B2F1A0 -:10E070000D94B2F10D94B2F10D94B2F10D94B2F190 -:10E080000D94B2F10D94B2F10D94B2F10D94B2F180 -:10E090000D94B2F10D94B2F10D94B2F10D94B2F170 -:10E0A0000D94B2F10D94B2F10D94B2F10D94B2F160 -:10E0B0000D94B2F10D94B2F10D94B2F10D94B2F150 -:10E0C0000D94B2F10D94B2F10D94B2F10D94B2F140 -:10E0D0000D94B2F10D94B2F10D94B2F10D94B2F130 -:10E0E0000D94B2F141546D656761323536300041AF -:10E0F000726475696E6F206578706C6F72657220DE -:10E1000073746B3530305632206279204D4C530099 -:10E11000426F6F746C6F616465723E004875683F52 -:10E1200000436F6D70696C6564206F6E203D200048 -:10E130004350552054797065202020203D20005FF9 -:10E140005F4156525F415243485F5F3D2000415658 -:10E1500052204C696243205665723D20004743437C -:10E160002056657273696F6E203D20004350552024 -:10E1700049442020202020203D20004C6F7720663D -:10E18000757365202020203D20004869676820665F -:10E190007573652020203D200045787420667573D6 -:10E1A00065202020203D20004C6F636B2066757336 -:10E1B000652020203D20004D617220203720323024 -:10E1C000313300312E362E3800342E332E350056A2 -:10E1D00023202020414444522020206F7020636F70 -:10E1E00064652020202020696E73747275637469E1 -:10E1F0006F6E2061646472202020496E74657272B3 -:10E20000757074006E6F20766563746F7200726A49 -:10E210006D702020006A6D70200057686174207056 -:10E220006F72743A00506F7274206E6F7420737541 -:10E2300070706F72746564004D7573742062652030 -:10E2400061206C6574746572002000577269747483 -:10E25000696E672045450052656164696E672045B7 -:10E26000450045452065727220636E743D00504F35 -:10E27000525400303D5A65726F2061646472003FF1 -:10E280003D43505520737461747300403D454550C3 -:10E29000524F4D207465737400423D426C696E6B41 -:10E2A000204C454400453D44756D70204545505215 -:10E2B0004F4D00463D44756D7020464C415348001B -:10E2C000483D48656C70004C3D4C69737420492F83 -:10E2D0004F20506F72747300513D51756974005234 -:10E2E0003D44756D702052414D00563D73686F7707 -:10E2F00020696E7465727275707420566563746FF0 -:10E30000727300593D506F727420626C696E6B00BD -:10E310002A0011241FBECFEFD1E2DEBFCDBF01E046 -:10E320000CBF12E0A0E0B2E0EEE1FDEF03E00BBFB6 -:10E3300002C007900D92A030B107D9F712E0A0E01B -:10E34000B2E001C01D92AE30B107E1F70F9460F367 -:10E350000D948DFE01E20EBF0FEF0DBF11241FBE05 -:10E360000D9460F30D9400F020E030E040ED57E0B4 -:10E3700005C0FA013197F1F72F5F3F4F2817390792 -:10E38000C0F308959C01260F311DC901A0E0B0E043 -:10E390002F5F3F4FABBFFC018791882361F08093D3 -:10E3A000C6008091C00086FFFCCF8091C0008064D1 -:10E3B0008093C000EACF08958DE08093C6008091DD -:10E3C000C00086FFFCCF8091C00080648093C000B5 -:10E3D0008AE08093C6008091C00086FFFCCF8091C8 -:10E3E000C00080648093C00008950F94C2F10F9420 -:10E3F000DCF10895FC019081992359F09093C600B7 -:10E400008091C00086FFFCCF8091C0008064809323 -:10E41000C0003196992379F70895282F982F929567 -:10E420009F70892F805D8A3308F0895F8093C600D2 -:10E430008091C00086FFFCCF8091C00080648093F3 -:10E44000C000822F8F70982F905D9A3308F0995FEB -:10E450009093C6008091C00086FFFCCF8091C000E1 -:10E4600080648093C00008959C01FB01853691056E -:10E470001CF46330710594F0C90164E670E00F94F8 -:10E480002EFE605D7F4F6093C6008091C00086FFC6 -:10E49000FCCF8091C00080648093C0002B30310598 -:10E4A00014F43297B4F0C90164E670E00F942EFEC4 -:10E4B0006AE070E00F942EFE605D7F4F6093C600AF -:10E4C0008091C00086FFFCCF8091C0008064809363 -:10E4D000C000C9016AE070E00F942EFEC0968093E0 -:10E4E000C6008091C00086FFFCCF8091C000806490 -:10E4F0008093C00008951F93182F8EE692EE60E07F -:10E500000F94C2F11093C6008091C00086FFFCCF2B -:10E510008091C00080648093C0000F94DCF11F9153 -:10E5200008952F923F924F925F926F927F928F92B7 -:10E530009F92AF92BF92CF92DF92EF92FF920F9392 -:10E540001F93DF93CF93CDB7DEB762970FB6F894E2 -:10E55000DEBF0FBECDBF382E622ECA01DB015C01CB -:10E560006D01772420E2222E2E010894411C511CBB -:10E570008BC081E0A81680E0B80681E0C80680E084 -:10E58000D80628F0C601AA27BB270F940DF2BB2797 -:10E59000AD2D9C2D8B2D0F940DF28A2D0F940DF225 -:10E5A0002092C6008091C00086FFFCCF8091C00001 -:10E5B00080648093C0009DE29093C6008091C0006B -:10E5C00086FFFCCF8091C00080648093C0002092C1 -:10E5D000C6008091C00086FFFCCF8091C00080649F -:10E5E0008093C00019828601750188249924A1E0D6 -:10E5F0003A1651F03A1620F0B2E03B1661F409C029 -:10E600000BBFF701779007C0C7010F9477FE782EF4 -:10E6100002C0F7017080872D0F940DF22092C60082 -:10E620008091C00086FFFCCF8091C0008064809301 -:10E63000C000872D8052F401EF70F0708F3520F408 -:10E64000E40DF51D708204C0E40DF51D8EE280839B -:10E650000894E11CF11C011D111D0894811C911CE2 -:10E6600090E18916910409F0C2CF80E190E0A0E02A -:10E67000B0E0A80EB91ECA1EDB1E198AC2010F9493 -:10E68000FAF10F94DCF16A94662009F072CF629679 -:10E690000FB6F894DEBF0FBECDBFCF91DF911F91B3 -:10E6A0000F91FF90EF90DF90CF90BF90AF909F9031 -:10E6B0008F907F906F905F904F903F902F90089534 -:10E6C0002F923F924F925F926F927F928F929F9282 -:10E6D000AF92BF92CF92DF92EF92FF920F931F9370 -:10E6E000DF93CF93CDB7DEB7CD53D1400FB6F894BB -:10E6F000DEBF0FBECDBF01E20EBF0FEF0DBF94B75F -:10E70000F894A89514BE80916000886180936000A1 -:10E7100010926000789493FF05C0E0910002F091A0 -:10E7200001021995279A2F9A8091C00082608093E8 -:10E73000C00080E18093C40088E18093C1000000A4 -:10E74000EE24FF24870144E0A42EB12CCC24DD2448 -:10E7500024C0C5010197F1F70894E11CF11C011DCB -:10E76000111D21E2E2162EE4F20620E0020720E06D -:10E77000120718F031E0C32ED12CC801B70127ECE5 -:10E780003BE140E050E00F9441FE611571058105C9 -:10E79000910519F485B1805885B98091C00087FD35 -:10E7A00003C0C114D104A9F2A6014F5F5F4FC25E3E -:10E7B000DE4F59834883CE51D140C25EDE4F8881FF -:10E7C0009981CE51D140019711F00D9410FEC05D9A -:10E7D000DE4F19821882C053D14060E0C15DDE4F28 -:10E7E0001882CF52D14088249924C35DDE4F19820C -:10E7F0001882CD52D140C05EDE4F188219821A8233 -:10E800001B82C052D140CE5CDE4F188219821A8220 -:10E810001B82C253D140EE24FF2487010BBFF701B6 -:10E8200007911691C45CDE4F19830883CC53D14005 -:10E830000D940BFEC25EDE4F28813981CE51D1404E -:10E840002130310509F52091C600C25EDE4F1982E4 -:10E850001882CE51D14022C02F5F3F4F4F4F5F4FA4 -:10E86000213082E138078AE7480780E0580780F0C6 -:10E87000C45CDE4FE881F981CC53D140EF5FFF4F9C -:10E8800019F0EE27FF27099420E030E040E050E047 -:10E890008091C00087FFE0CF2091C600C35DDE4FAE -:10E8A00048815981CD52D1404F5F5F4FC35DDE4FEC -:10E8B00059834883CD52D140213209F063C64A3092 -:10E8C000510508F05FC60894811C911C53E0851621 -:10E8D000910409F059C600E010E018C081E280936D -:10E8E000C6008091C00086FFFCCF8091C00080648C -:10E8F0008093C0002F5F3F4F2931310579F70F9486 -:10E90000DCF10F5F1F4F0530110519F020E030E0FA -:10E91000E5CF10920A0210920B0210920C02109294 -:10E920000D02109206021092070210920802109235 -:10E930000902109202021092030210920402109235 -:10E9400005028FEE90EE60E00F94F5F180E191EE1C -:10E9500060E00F94C2F18091C00087FFFCCF9091DE -:10E96000C600903608F09F759032B8F09093C600BC -:10E970008091C00086FFFCCF8091C00080648093AE -:10E98000C000A0E2A093C6008091C00086FFFCCF2B -:10E990008091C00080648093C000983409F4D7C18E -:10E9A0009934B8F4923409F459C1933458F490333B -:10E9B00019F1903308F4E3C59F33A1F1903409F0C5 -:10E9C000DEC5BDC0953409F470C1963409F0D7C5D1 -:10E9D00098C1923509F42BC2933538F49C3409F46C -:10E9E000F5C1913509F0CBC518C2963509F445C279 -:10E9F000993509F0C4C567C483E792EE62E00F94CD -:10EA0000F5F110920602109207021092080210927D -:10EA1000090210920A0210920B0210920C0210923C -:10EA20000D0213C18FE792EE62E00F94F5F18FEEC5 -:10EA300090EE60E00F94F5F181E291EE60E00F94CA -:10EA4000C2F187EB91EE60E00F94F5F180E391EE77 -:10EA500060E00F94C2F184EE90EE60E00F94F5F167 -:10EA60008FE391EE60E00F94C2F186E090E061E008 -:10EA700070E00F9434F20F94DCF18DE591EE60E0DC -:10EA80000F94C2F189EC91EE60E00F94F5F18EE401 -:10EA900091EE60E00F94C2F183EC91EE60E00F9490 -:10EAA000F5F18CE691EE60E00F94C2F18EE10F94E7 -:10EAB0000DF288E90F940DF281E00F940DF20F949E -:10EAC000DCF18BE791EE60E00F94C2F119E0E0E039 -:10EAD000F0E010935700E4918E2F0F940DF20F94F5 -:10EAE000DCF18AE891EE60E00F94C2F1E3E0F0E03F -:10EAF00010935700E4918E2F0F940DF20F94DCF1D8 -:10EB000089E991EE60E00F94C2F1E2E0F0E0109349 -:10EB10005700E4918E2F0F940DF20F94DCF188EAE8 -:10EB200091EE60E00F94C2F1E1E0F0E01093570045 -:10EB30001491812F0F940DF20F94DCF107CF8BE825 -:10EB400092EE62E00F94F5F18BE492EE60E00F94A8 -:10EB5000F5F10F94DCF100E010E019C0C8016F2D51 -:10EB60000F947FFEFF2031F489E492EE60E00F9471 -:10EB7000C2F10BC0F092C6008091C00086FFFCCFAE -:10EB80008091C00080648093C0000F5F1F4FC80158 -:10EB900081519F41A0E0B0E0ABBFFC01F790BAE229 -:10EBA000FB1621F0E2E000301E07C1F60F94DCF105 -:10EBB0000F94DCF187E592EE60E00F94F5F10F948D -:10EBC000DCF1CC24DD2400E010E01EC0C8010F946D -:10EBD00077FEF82E882331F489E492EE60E00F94FA -:10EBE000C2F10BC08093C6008091C00086FFFCCFAD -:10EBF0008091C00080648093C000FE1419F00894D6 -:10EC0000C11CD11C0F5F1F4FC80181519F41A0E063 -:10EC1000B0E0ABBFFC01E790FAE2EF1621F022E092 -:10EC20000030120799F60F94DCF10F94DCF182E6C4 -:10EC300092EE60E00F94C2F1C60161E070E00F94C3 -:10EC400034F20F94DCF10F94DCF110920202109276 -:10EC50000302109204021092050278CE89E992EE26 -:10EC600062E00F94F5F1279A2F9A16C02F9880E052 -:10EC700090E0E0EDF7E03197F1F7019684369105E9 -:10EC8000C1F72F9A80E090E0E0EDF7E03197F1F7DF -:10EC9000019684369105C1F78091C00087FFE6CFC9 -:10ECA0008091C00087FFFCCF64C485EA92EE62E0E9 -:10ECB0000F94F5F140910202509103026091040219 -:10ECC0007091050281E020E10F9491F2809102029F -:10ECD00090910302A0910402B091050280509F4FD1 -:10ECE000AF4FBF4F8093020290930302A0930402A0 -:10ECF000B093050280509041A040B04008F426CE69 -:10ED0000A4CF83EB92EE62E00F94F5F140910602FE -:10ED100050910702609108027091090280E020E1A1 -:10ED20000F9491F28091060290910702A09108023F -:10ED3000B091090280509F4FAF4FBF4F80930602A2 -:10ED400090930702A0930802B0930902FFCD80ECD4 -:10ED500092EE62E00F94F5F183E792EE60E00F949B -:10ED6000F5F18FE792EE60E00F94F5F18BE892EE0B -:10ED700060E00F94F5F189E992EE60E00F94F5F10F -:10ED800085EA92EE60E00F94F5F183EB92EE60E09D -:10ED90000F94F5F180EC92EE60E00F94F5F187ECC2 -:10EDA00092EE60E00F94F5F188ED92EE60E00F9442 -:10EDB000F5F18FED92EE60E00F94F5F18AEE92EEB0 -:10EDC00060E00F94F5F183E093EEBDCD87EC92EE19 -:10EDD00062E00F94F5F181E40F947BF282E40F94EA -:10EDE0007BF283E40F947BF284E40F947BF285E45E -:10EDF0000F947BF286E40F947BF287E40F947BF20E -:10EE000088E40F947BF28AE40F947BF28BE40F94F6 -:10EE10007BF28CE40F947BF299CD88ED92EE62E068 -:10EE20000F94F5F1772473948824992409C48FED05 -:10EE300092EE62E00F94F5F140910A0250910B02BC -:10EE400060910C0270910D0282E020E10F9491F22A -:10EE500080910A0290910B02A0910C02B0910D02D8 -:10EE600080509F4FAF4FBF4F80930A0290930B0289 -:10EE7000A0930C02B0930D0269CD8AEE92EE62E08F -:10EE80000F94F5F184EE90EE60E00F94F5F18FECC5 -:10EE900091EE60E00F94F5F1662477244301CC5D98 -:10EEA000DE4F19821882C452D140D401C301B695F5 -:10EEB000A79597958795CA5DDE4F88839983AA8326 -:10EEC000BB83C652D140CC5DDE4FA881B981C4520C -:10EED000D1401196CC5DDE4FB983A883C452D14096 -:10EEE000CD0162E070E00F9434F2B0E2B093C6005E -:10EEF0008091C00086FFFCCF8091C0008064809329 -:10EF0000C000EDE2E093C6008091C00086FFFCCF18 -:10EF10008091C00080648093C000F0E2F093C6004E -:10EF20008091C00086FFFCCF8091C00080648093F8 -:10EF3000C000CA5DDE4FE880F9800A811B81C6529D -:10EF4000D140BB27A12F902F8F2D0F940DF2CA5DBA -:10EF5000DE4F8881C652D1400F940DF2B0E2FB2EF5 -:10EF6000F092C6008091C00086FFFCCF8091C00067 -:10EF700080648093C0000DE30093C6008091C000C0 -:10EF800086FFFCCF8091C00080648093C00010E2B7 -:10EF90001093C6008091C00086FFFCCF8091C00016 -:10EFA00080648093C0008BBEF3012791C65DDE4F65 -:10EFB0002883CA52D140A22EBB24CC24DD2408943D -:10EFC000611C711C811C911C8BBEF3018791282E42 -:10EFD0003324442455240894611C711C811C911C09 -:10EFE0008BBEF3013791C55DDE4F3883CB52D140E4 -:10EFF0000894611C711C811C911C8BBEF30147910C -:10F00000C45DDE4F4883CC52D140ADEFEA2EAFEF66 -:10F01000FA2EAFEF0A2FAFEF1A2F6E0C7F1C801E57 -:10F02000911E142D032DF22CEE24EA0CFB1C0C1D5A -:10F030001D1D0F940DF220E22093C6008091C000A8 -:10F0400086FFFCCF8091C00080648093C000C65DC5 -:10F05000DE4F8881CA52D1400F940DF230E23093D6 -:10F06000C6008091C00086FFFCCF8091C000806404 -:10F070008093C000C45DDE4F8881CC52D1400F9494 -:10F080000DF240E24093C6008091C00086FFFCCFA5 -:10F090008091C00080648093C000C55DDE4F888190 -:10F0A000CB52D1400F940DF250E25093C6008091A4 -:10F0B000C00086FFFCCF8091C00080648093C000B8 -:10F0C0008FEFE8168FEFF80680E0080780E018075A -:10F0D00031F484E092EE60E00F94C2F1DFC0D80119 -:10F0E000C7018070907CA070B0708050904CA040A0 -:10F0F000B040D1F52FEF3FE340E050E0E222F322B1 -:10F1000004231523CA5DDE4FA880B980CA80DB8046 -:10F11000C652D140AE0CBF1CC01ED11EAA0CBB1CD7 -:10F12000CC1CDD1C8EE092EE60E00F94C2F1BB2798 -:10F13000A12F902F8F2D0F940DF28E2D0F940DF285 -:10F1400030E23093C6008091C00086FFFCCF8091F2 -:10F15000C00080648093C0004EE34093C60080915D -:10F16000C00086FFFCCF87C08EE09EEFA0E0B0E03D -:10F17000E822F9220A231B239CE0E91694E9F90608 -:10F1800090E0090790E0190709F088C0C45DDE4FE0 -:10F19000A881CC52D140EA2EFF2400E010E0102FCD -:10F1A0000F2DFE2CEE24C55DDE4FB881CB52D14031 -:10F1B000EB0EF11C011D111DD601C501817090706F -:10F1C000A070B070DC0199278827E80EF91E0A1F8D -:10F1D0001B1F20EF30E040E050E0A222B322C42207 -:10F1E000D52241E1AA0CBB1CCC1CDD1C4A95D1F7F1 -:10F1F000EA0CFB1C0C1D1D1D81E090E0A0E0B0E0BE -:10F20000282239224A225B2235E1220C331C441C7D -:10F21000551C3A95D1F7E20CF31C041D151D57013E -:10F220006801AA0CBB1CCC1CDD1C85E192EE60E0E1 -:10F230000F94C2F1C801AA27BB270F940DF2BB2778 -:10F24000A12F902F8F2D0F940DF28E2D0F940DF274 -:10F2500090E29093C6008091C00086FFFCCF809121 -:10F26000C00080648093C000AEE3A093C60080918C -:10F27000C00086FFFCCF8091C00080648093C000F6 -:10F28000C601AA27BB270F940DF2BB27AD2D9C2DDD -:10F290008B2D0F940DF28A2D0F940DF20F94DCF14B -:10F2A000CC5DDE4FE881F981C452D140F99709F471 -:10F2B0004DCBF4E0EF2EF12C012D112D6E0C7F1CA7 -:10F2C000801E911EF2CD83E093EE62E00F94F5F183 -:10F2D0008AE192EE60E00F94C2F18091C00087FF56 -:10F2E000FCCF1091C6001F751093C6008091C0001E -:10F2F00086FFFCCF8091C00080648093C0000F9493 -:10F30000DCF1812F81548A3108F036C1163409F4BA -:10F3100095C0173490F4133409F44EC0143430F40B -:10F320001134F1F0123409F01DC130C0143409F465 -:10F3300059C0153409F016C16BC01A3409F4C4C0A1 -:10F340001B3438F4173409F48FC0183409F00AC19B -:10F35000A1C01B3409F4D2C01C3409F003C1E8C0B9 -:10F360008FEF81B90DC082B1809582B980E090E0C5 -:10F37000E0EDF7E03197F1F70196883C9105C1F790 -:10F380008091C00087FFEFCF12B8EFC08FEF84B934 -:10F390000DC085B1809585B980E090E0E0EDF7E0A3 -:10F3A0003197F1F70196883C9105C1F78091C00033 -:10F3B00087FFEFCF15B8D9C08FEF87B90DC088B1DF -:10F3C000809588B980E090E0E0EDF7E03197F1F7C3 -:10F3D0000196883C9105C1F78091C00087FFEFCF6F -:10F3E00018B8C3C08FEF8AB90DC08BB180958BB9A7 -:10F3F00080E090E0E0EDF7E03197F1F70196883C8E -:10F400009105C1F78091C00087FFEFCF1BB8ADC059 -:10F410008FEF8DB90DC08EB180958EB980E090E0F0 -:10F42000E0EDF7E03197F1F70196883C9105C1F7DF -:10F430008091C00087FFEFCF1EB897C08FEF80BBD1 -:10F440000DC081B3809581BB80E090E0E0EDF7E0F6 -:10F450003197F1F70196883C9105C1F78091C00082 -:10F4600087FFEFCF11BA81C08FEF83BB0DC084B38C -:10F47000809584BB80E090E0E0EDF7E03197F1F714 -:10F480000196883C9105C1F78091C00087FFEFCFBE -:10F4900014BA6BC08FEF809301010FC080910201FD -:10F4A00080958093020180E090E0E0EDF7E03197F5 -:10F4B000F1F70196883C9105C1F78091C00087FF64 -:10F4C000EDCF1092020151C08FEF809304010FC065 -:10F4D0008091050180958093050180E090E0E0ED4A -:10F4E000F7E03197F1F70196883C9105C1F78091DB -:10F4F000C00087FFEDCF1092050137C08FEF8093DA -:10F5000007010FC08091080180958093080180E079 -:10F5100090E0E0EDF7E03197F1F70196883C910536 -:10F52000C1F78091C00087FFEDCF109208011DC088 -:10F530008FEF80930A010FC080910B01809580931B -:10F540000B0180E090E0E0EDF7E03197F1F70196F4 -:10F55000883C9105C1F78091C00087FFEDCF1092E4 -:10F560000B0103C085E292EEEEC98091C00087FFD7 -:10F57000FCCF8091C600EAC988E392EEE4C98CE131 -:10F5800091EEE1C988249924933011F1943028F444 -:10F59000913089F09230B8F408C0953061F195301F -:10F5A000F0F0963009F048C043C02B3109F042C951 -:10F5B00091E06BE13FC96227C15DDE4F2883CF52E6 -:10F5C000D14092E037C9B22FA0E0622793E032C960 -:10F5D000822F90E0A82BB92B622794E02BC92E3004 -:10F5E00009F039C3622795E0C05DDE4F19821882A9 -:10F5F000C053D1401FC9E1E0F0E0EC0FFD1FC05D3A -:10F60000DE4F08811981C053D140E00FF11F2083E4 -:10F610000F5F1F4FC05DDE4F19830883C053D14079 -:10F6200062270A171B0709F005C9D80196E002C92D -:10F63000261709F010C303C0973009F0FBC87724E0 -:10F640009981933109F412C19431C8F4963009F4C8 -:10F65000D8C0973050F4923009F406C1933009F4C1 -:10F660006DC0913009F059C253C0913109F477C08F -:10F67000923108F0BBC0903109F04FC2F5C098310B -:10F6800009F487C0993150F4953109F4EFC09531F0 -:10F6900008F4C6C1963109F040C2C2C19A3109F4DA -:10F6A0006CC09A3108F491C09B3109F45BC09D3164 -:10F6B00009F033C29D81903359F48F81882311F46E -:10F6C0009EE11CC0813011F091E018C098E916C08D -:10F6D000892F807591F0903539F4E0E0F0E089E011 -:10F6E0008093570094910AC0983539F4E3E0F0E034 -:10F6F00089E080935700949101C090E01A821B82A8 -:10F700008D818C831D829E831F8227E030E009C299 -:10F710001A8288E08B8381E48C8386E58D8382E581 -:10F720008E8389E48F8383E5888780E589878FE5E9 -:10F730008A8782E38B872BE030E0F3C18A818139AD -:10F7400041F0823941F0803911F48FE005C080E04A -:10F7500003C082E001C08AE01A828B8344C0772410 -:10F76000739482C08D81882311F48EE12CC0813086 -:10F7700011F081E028C088E926C01A82E1E0F0E0BB -:10F7800089E08093570084918B831C8224E030E0D1 -:10F79000C8C18B81803589F48C81883039F4E2E0EE -:10F7A000F0E089E08093570084910DC0E0E0F0E044 -:10F7B00089E080935700849106C0E3E0F0E089E09F -:10F7C0008093570084911A82DFCF8D81836C99E0FA -:10F7D000E1E0F0E0082E90935700E89507B600FCB2 -:10F7E000FDCF1A821B8223E030E09BC180EC8A832C -:10F7F000CE5CDE4F188219821A821B82C253D1401E -:10F800008EC18A8190E0A0E0B0E0582F44273327D2 -:10F8100022278B8190E0A0E0B0E0DC0199278827C7 -:10F82000282B392B4A2B5B2B8D8190E0A0E0B0E098 -:10F83000282B392B4A2B5B2B8C8190E0A0E0B0E089 -:10F84000BA2FA92F982F8827282B392B4A2B5B2BCF -:10F85000220F331F441F551FC05EDE4F288339839C -:10F860004A835B83C052D1401A8259C13A81C95C34 -:10F87000DE4F3883C753D140CA5CDE4F1882C6536F -:10F88000D1408B81C82EDD24CA5CDE4F488159816E -:10F89000C653D140C42AD52A933109F082C0CE5C28 -:10F8A000DE4F88819981AA81BB81C253D1408050AB -:10F8B000904CA340B04030F583E0CE5CDE4FE88052 -:10F8C000F9800A811B81C253D140F70100935B008C -:10F8D00080935700E89507B600FCFDCFCE5CDE4F65 -:10F8E000088119812A813B81C253D14000501F4FAA -:10F8F0002F4F3F4FCE5CDE4F088319832A833B8313 -:10F90000C253D140C05EDE4F488159816A817B81FC -:10F91000C052D140DE011B9631E08C9111962C91A2 -:10F9200011971296C75CDE4F2883C953D140C85C3B -:10F93000DE4F1882C853D14090E0C85CDE4FE881AA -:10F94000F981C853D1408E2B9F2B0C01FA01609393 -:10F950005B0030935700E89511244E5F5F4F6F4F67 -:10F960007F4F0EEFE02E0FEFF02ECE0CDF1CC114F8 -:10F97000D10499F685E0C05EDE4F088119812A81A5 -:10F980003B81C052D140F80120935B008093570027 -:10F99000E89507B600FCFDCF81E180935700E8951C -:10F9A00035C0C05EDE4F88819981AA81BB81C0527B -:10F9B000D140B695A795979587957C018601ABE0D8 -:10F9C000AA2EB12CAC0EBD1E0BC0D5016D915D01F0 -:10F9D000C7010F947FFE0894E11CF11C01501040F8 -:10F9E0000115110591F7A60160E070E0440F551F65 -:10F9F000661F771FC05EDE4FE880F9800A811B8199 -:10FA0000C052D1404E0D5F1D601F711F1A82C05E33 -:10FA1000DE4F488359836A837B83C052D1407FC0C5 -:10FA2000FA80C55CDE4FF882CB53D140C65CDE4F16 -:10FA30001882CA53D1408B81C82EDD24C65CDE4FAC -:10FA400008811981CA53D140C02AD12A1A828981DA -:10FA5000BE016D5F7F4F843121F59601C05EDE4FA0 -:10FA6000E880F9800A811B81C052D1400BBFF701A9 -:10FA700087919691DB018C9311969C936E5F7F4FDB -:10FA8000D801C7010296A11DB11DC05EDE4F88835B -:10FA90009983AA83BB83C052D14022503040F1F6F3 -:10FAA00036C0C05EDE4F288139814A815B81C052F9 -:10FAB000D1400894C108D108760100E010E0089414 -:10FAC000C11CD11C0894E11CF11C011D111DE20E8A -:10FAD000F31E041F151F21BDBB27A52F942F832FB5 -:10FAE00082BD2F5F3F4F4F4F5F4FF89A80B5DB01CC -:10FAF0008D93BD012E153F054007510761F7C05E8C -:10FB0000DE4F288339834A835B83C052D1409601FC -:10FB10002D5F3F4FFB01108204C080EC8A8322E0FE -:10FB200030E08BE18093C6008091C00086FFFCCF5F -:10FB30008091C00080648093C000C15DDE4FF88179 -:10FB4000CF52D140F093C6008091C00086FFFCCF19 -:10FB50008091C00080648093C000432F3093C60022 -:10FB60008091C00086FFFCCF8091C00080648093AC -:10FB7000C000922F2093C6008091C00086FFFCCF6A -:10FB80008091C00080648093C0008EE08093C600A6 -:10FB90008091C00086FFFCCF8091C000806480937C -:10FBA000C00065E1C15DDE4FE880CF52D1406E25D7 -:10FBB00069276427FE01319610C090819093C6009A -:10FBC0008091C00086FFFCCF31968091C000806498 -:10FBD0008093C0006927215030402115310569F715 -:10FBE0006093C6008091C00086FFFCCF8091C0006A -:10FBF00080648093C00085B1805885B9772081F4F6 -:10FC0000C15DDE4F0881CF52D1400F5FC15DDE4F35 -:10FC10000883CF52D14090E0A0E0B0E00D941AF4F8 -:10FC200027982F9880E090E020ED37E0F901319798 -:10FC3000F1F7019684369105C9F700008091C00064 -:10FC40008D7F8093C00081E180935700E895EE2777 -:10FC5000FF270994FFCF90E00D941AF497FB092E2B -:10FC600007260AD077FD04D02ED006D000201AF443 -:10FC7000709561957F4F0895F6F7909581959F4F08 -:10FC80000895A1E21A2EAA1BBB1BFD010DC0AA1FDD -:10FC9000BB1FEE1FFF1FA217B307E407F50720F0F5 -:10FCA000A21BB30BE40BF50B661F771F881F991F70 -:10FCB0001A9469F760957095809590959B01AC01B9 -:10FCC000BD01CF010895AA1BBB1B51E107C0AA1FAC -:10FCD000BB1FA617B70710F0A61BB70B881F991FED -:10FCE0005A95A9F780959095BC01CD010895F99991 -:10FCF000FECF92BD81BDF89A992780B50895262F31 -:10FD0000F999FECF1FBA92BD81BD20BD0FB6F89400 -:0EFD1000FA9AF99A0FBE01960895F894FFCF63 -:00000001FF diff --git a/mc_labs/mc_lab_01/mc_lab1_esp.ino b/mc_labs/mc_lab_01/mc_lab1_esp.ino deleted file mode 100644 index 2038edb..0000000 --- a/mc_labs/mc_lab_01/mc_lab1_esp.ino +++ /dev/null @@ -1,191 +0,0 @@ -// Add in references: http://arduino.esp8266.com/stable/package_esp8266com_index.json - -// Import required libraries -#include "ESP8266WiFi.h" -#include "ESPAsyncWebServer.h" - - -// Set to true to define Relay as Normally Open (NO) -#define LED_NO false -#define BUTTON_PULLUP true -#define ESP_WIFI_MODE 2 //WIFI_STA // WIFI_AP //WIFI_AP_STA - -// Assign GPIO to the relay and button -const int ledGPIO = D4; // Replace with the desired GPIO pin -const int btnGPIO = D5; // Replace with the desired GPIO pin - -// Replace with your network credentials -const char* ssid = "WEMOS_ESP8266"; -const char* password = "PASSWORD"; - -bool btnChangedFlag = false; -bool btnPressed = false; -bool btnReleased = false; - -const char index_html[] PROGMEM = R"rawliteral( - - - - - - -

ESP Pushbutton Web Server

- - - - -)rawliteral"; - -void notFound(AsyncWebServerRequest *request) { - request->send(404, "text/plain", "Not found"); -} - -// Create AsyncWebServer object on port 80 -AsyncWebServer server(80); - -void initWiFi() -{ - -#if(ESP_WIFI_MODE == 1) - WiFi.mode(WIFI_STA); - // Connect to Wi-Fi network with SSID and password - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(1000); - Serial.println("Connecting to WiFi.."); - } - Serial.println(); - Serial.print("ESP IP Address: http://"); - Serial.println(WiFi.localIP()); - - Serial.print("RRSI: "); - Serial.println(WiFi.RSSI()); -#else// (ESP_WIFI_MODE == WIFI_AP) - WiFi.mode(WIFI_AP); - Serial.println("Setting AP (Access Point)…"); - // Remove the password parameter, if you want the AP (Access Point) to be open - //WiFi.softAP(ssid, password); - WiFi.softAP(ssid, NULL); - - IPAddress IP = WiFi.softAPIP(); - Serial.print("AP IP address: "); - Serial.println(IP); -#endif - - // Send web page to client - server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ - request->send_P(200, "text/html", index_html); - }); - - // Receive an HTTP GET request - server.on("/on", HTTP_GET, [] (AsyncWebServerRequest *request) { - btnChangedFlag = true; - btnPressed = true; - request->send(200, "text/plain", "ok"); - }); - - // Receive an HTTP GET request - server.on("/off", HTTP_GET, [] (AsyncWebServerRequest *request) { - btnChangedFlag = true; - btnReleased = true; - request->send(200, "text/plain", "ok"); - }); - - server.onNotFound(notFound); - server.begin(); -} - -IRAM_ATTR void btnIsrHigh() -{ - btnChangedFlag = true; -#if (BUTTON_PULLUP == true) - btnReleased = true; -#else - btnPressed = true; -#endif -} - -IRAM_ATTR void btnIsrLow() -{ - btnChangedFlag = true; -#if (BUTTON_PULLUP == true) - btnPressed = true; -#else - btnReleased = true; -#endif -} - -void setup(){ - Serial.begin(115200); - - pinMode(btnGPIO, INPUT_PULLUP); - // attachInterrupt(digitalPinToInterrupt(btnGPIO), btnIsrHigh, CHANGE); - attachInterrupt(digitalPinToInterrupt(btnGPIO), btnIsrHigh, RISING); - attachInterrupt(digitalPinToInterrupt(btnGPIO), btnIsrLow, FALLING); - - pinMode(ledGPIO, OUTPUT); - if(LED_NO){ //! NOTE1 - digitalWrite(ledGPIO, HIGH); - } - else{ - digitalWrite(ledGPIO, LOW); - } - initWiFi(); - -#if (LED_NO == true) //! NOTE: tell the difference with NOTE1 - digitalWrite(ledGPIO, LOW); -#else - digitalWrite(ledGPIO, HIGH); -#endif - -} - -void loop() { - if (btnChangedFlag) - { - if (btnPressed) - { - digitalWrite(ledGPIO, LOW); - btnPressed = false; - } - if (btnReleased) - { - digitalWrite(ledGPIO, HIGH); - btnReleased = false; - } - btnChangedFlag = false; - } -} \ No newline at end of file diff --git a/mc_labs/mc_lab_01/mc_lab_01.ino b/mc_labs/mc_lab_01/mc_lab_01.ino index e3d025e..203f69b 100644 --- a/mc_labs/mc_lab_01/mc_lab_01.ino +++ b/mc_labs/mc_lab_01/mc_lab_01.ino @@ -36,7 +36,7 @@ #define MY_PORT PORTA #define BUTTON_PIN 21 //PD0 -#define TIMER_LEDS 1000 +#define TIMER_LEDS 400 // #define PORT_PIN_0 (1 << 0) // 0b00000001 // B 0000 0001 // #define PORT_PIN_1 (1 << 1) // 0b00000010 // B 0000 0010 @@ -132,7 +132,7 @@ void ledsHandler() MY_PORT ^= 1< + +#define DDR_KEYPAD DDRF +#define PORT_KEYPAD PORTF +#define PIN_KEYPAD PINF +#include "keypad4x4.h" + +const int buzzerPin = 21; + +// initialize the library by associating any needed LCD interface pin +// with the arduino pin number it is connected to +const int rs = 22, rw = 23, en = 24, d4 = 26, d5 = 27, d6 = 28, d7 = 29; +LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7); + +const PROGMEM char sixty[60][3] = { + {"00"}, {"01"}, {"02"}, {"03"}, {"04"}, {"05"}, {"06"}, {"07"}, {"08"}, {"09"}, + {"10"}, {"11"}, {"12"}, {"13"}, {"14"}, {"15"}, {"16"}, {"17"}, {"18"}, {"19"}, + {"20"}, {"21"}, {"22"}, {"23"}, {"24"}, {"25"}, {"26"}, {"27"}, {"28"}, {"29"}, + {"30"}, {"31"}, {"32"}, {"33"}, {"34"}, {"35"}, {"36"}, {"37"}, {"38"}, {"39"}, + {"40"}, {"41"}, {"42"}, {"43"}, {"44"}, {"45"}, {"46"}, {"47"}, {"48"}, {"49"}, + {"50"}, {"51"}, {"52"}, {"53"}, {"54"}, {"55"}, {"56"}, {"57"}, {"58"}, {"59"} +}; + +struct Time +{ + unsigned char second, minute, hour; +}; + +Time TClock = {0, 0, 0}; +Time TAlarm = {0, 0, 0}; +char isAlarmOn ='f'; +char displayTime = 't'; +char isButtonCPressed = 'f'; +char isButtonAPressed = 'f'; +char isButtonBPressed = 'f'; +short counter = 0; +char arr[4] = {}; + +void clearTime() +{ + counter = 0; + arr[0] = '0'; + arr[1] = '0'; + arr[2] = '0'; + arr[3] = '0'; +} + +void LCD_WriteStrPROGMEM(char *str, int n) //вивід масиву символів, +{ //записаних у флеші + for (int i = 0; i < n; i++) + lcd.print( (char)pgm_read_byte( &(str[i]) ) ); +} + +void coutTime(Time* FuncTime) +{ + lcd.setCursor(3, 0); + LCD_WriteStrPROGMEM(sixty[FuncTime->hour], 2); + lcd.write(':'); + LCD_WriteStrPROGMEM(sixty[FuncTime->minute], 2); + lcd.write(':'); + LCD_WriteStrPROGMEM(sixty[FuncTime->second], 2); +} + +void countTimeForChange() { + lcd.write(arr[0]); + lcd.write(arr[1]); + lcd.write(':'); + lcd.write(arr[2]); + lcd.write(arr[3]); + lcd.write(':'); + LCD_WriteStrPROGMEM(sixty[TClock.second], 2); +} + +ISR(TIMER3_COMPA_vect) // Таймер Т1 по співпадінню А, кожної 1 сек. +{ + if (++TClock.second == 60) + { + TClock.second = 0; + if (++TClock.minute == 60) + { + TClock.minute = 0; + if (++TClock.hour == 24) + TClock.hour = 0; + } + } + if (displayTime == 't') + { + coutTime(&TClock); + } + isItAlarm(); +} + +void setTime(char arr[], Time* FuncTime) +{ + unsigned char hour = (arr[0] - 48) * 10 + (arr[1] - 48); + unsigned char minute = (arr[2] - 48) * 10 + (arr[3] - 48); + if (hour < 24 && minute < 60) { + FuncTime->hour = hour; + FuncTime->minute = minute; + } + else + { + lcd.setCursor(0,1); + lcd.print(" Incorrect! "); + delay(2000); + } +} + +void isItAlarm() +{ + if (isAlarmOn == 't' && TClock.hour == TAlarm.hour && TClock.minute == TAlarm.minute) + { + for (int i = 15; i >= 0; i--) + { + delay(2000); + digitalWrite(buzzerPin, HIGH); + delay(2000); + digitalWrite(buzzerPin, LOW); + } + } +} + +void disableAllButtons() +{ + isButtonCPressed = 'f'; + isButtonAPressed = 'f'; + isButtonBPressed = 'f'; +} + +void setup() +{ + noInterrupts(); // disable all interrupts + + // Таймер#1: Скид при співпадінні OCR1A (1sec) + дільник=256 + TCCR3A = 0x00; + TCCR3B = (1 << WGM32) | (1 << CS32) | (1 << CS30); //CTC mode & Prescaler @ 1024 + TIMSK3 = (1 << OCIE3A); // дозвіл на переривання по співпадінню + OCR3A = 0x3D08;// compare value = 1 sec (16MHz AVR) + + //KeyPad 4x4 + initKeyPad(); + + //LCD 16x2 + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + interrupts(); // Enable global interrupts + + //Buzzer + pinMode(buzzerPin, OUTPUT); + digitalWrite(buzzerPin, LOW); +} + +void loop() { + if ( isButtonPressed() ) + { + digitalWrite(buzzerPin, HIGH); + lcd.setCursor(0, 1); + //lcd.write(readKeyFromPad4x4()); + delay(100); + digitalWrite(buzzerPin, LOW); + + switch(readKeyFromPad4x4()) + { + case 'A': + disableAllButtons(); + clearTime(); + lcd.clear(); + isButtonAPressed = 't'; + lcd.setCursor(0,1); + lcd.print("Ins: "); + clearTime(); + break; + + case 'B': + disableAllButtons(); + clearTime(); + lcd.clear(); + isButtonBPressed = 't'; + lcd.setCursor(0,1); + lcd.print("Ins al: "); + clearTime(); + break; + + case 'C': + disableAllButtons(); + clearTime(); + displayTime = 'f'; + isButtonCPressed = 't'; + lcd.clear(); + coutTime(&TAlarm); + lcd.setCursor(1,1); + if (isAlarmOn == 't') lcd.print("On "); + else if (isAlarmOn == 'f') lcd.print("Off"); + break; + + case 'D': + if (isButtonCPressed == 't') + { + lcd.setCursor(1,1); + if (isAlarmOn == 'f') + { + isAlarmOn = 't'; + lcd.print("On "); + } + + else if (isAlarmOn == 't') + { + isAlarmOn = 'f'; + lcd.print("Off"); + } + } + break; + + case 'E': + if (isButtonAPressed == 't') + { + setTime(arr, &TClock); + clearTime(); + lcd.clear(); + disableAllButtons(); + } + else if (isButtonBPressed == 't') + { + setTime(arr, &TAlarm); + clearTime(); + lcd.clear(); + disableAllButtons(); + } + break; + + case 'F': + lcd.clear(); + displayTime = 't'; + clearTime(); + disableAllButtons(); + break; + + default: + if (isButtonAPressed == 't') + { + lcd.setCursor(5, 1); + if (counter < 4) + { + arr[counter] = readKeyFromPad4x4(); + counter ++; + } + else + { + counter = 0; + arr[counter] = readKeyFromPad4x4(); + counter ++; + } + countTimeForChange(); + } + else if (isButtonBPressed == 't') + { + lcd.setCursor(8, 1); + if (counter < 4) + { + arr[counter] = readKeyFromPad4x4(); + counter ++; + } + else + { + counter = 0; + arr[counter] = readKeyFromPad4x4(); + counter ++; + } + countTimeForChange(); + } + break; + } + } +} \ No newline at end of file diff --git a/mc_labs/mc_lab_03/wokwi-project.txt b/mc_labs/mc_lab_03/wokwi-project.txt new file mode 100644 index 0000000..50d50fb --- /dev/null +++ b/mc_labs/mc_lab_03/wokwi-project.txt @@ -0,0 +1,3 @@ +Downloaded from https://wokwi.com/projects/416524568230448129 + +Simulate this project on https://wokwi.com diff --git a/mc_labs/mc_lab_03/wokwi.toml b/mc_labs/mc_lab_03/wokwi.toml new file mode 100644 index 0000000..99e8edc --- /dev/null +++ b/mc_labs/mc_lab_03/wokwi.toml @@ -0,0 +1,4 @@ +[wokwi] +version = 1 +firmware = 'build/mc_lab_01.ino.hex' +elf = 'build/mc_lab_01.ino.elf' \ No newline at end of file