mirror of
https://github.com/OpenEPaperLink/OpenEPaperLink.git
synced 2026-03-21 03:04:25 +01:00
Compare commits
152 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb0064363f | ||
|
|
c1324c5089 | ||
|
|
df3c615eef | ||
|
|
d5e19d20fa | ||
|
|
e62a1b07bf | ||
|
|
4d06ef546d | ||
|
|
7096f7e756 | ||
|
|
1abedff388 | ||
|
|
8d2546a2aa | ||
|
|
c5a8058d62 | ||
|
|
ef59b87ae0 | ||
|
|
d526c43fd8 | ||
|
|
86abc112dd | ||
|
|
af50f96671 | ||
|
|
46c8b73fa0 | ||
|
|
c65c8b749e | ||
|
|
f61c2e3d04 | ||
|
|
0dc406b865 | ||
|
|
25b185da28 | ||
|
|
496d4d382f | ||
|
|
d09e89c9dd | ||
|
|
ce319bb499 | ||
|
|
4dbcc753fd | ||
|
|
6951cd79b7 | ||
|
|
eeb18f204d | ||
|
|
bfff2ef0b9 | ||
|
|
ef5ddac368 | ||
|
|
0e8e7b5b75 | ||
|
|
e8a92c4fcb | ||
|
|
299b8f300e | ||
|
|
0b0802ad02 | ||
|
|
f8ce3a51d2 | ||
|
|
0e63e064fc | ||
|
|
8d6c763aba | ||
|
|
764747fb45 | ||
|
|
6bb2e0362b | ||
|
|
54dd05e698 | ||
|
|
328f00a559 | ||
|
|
14fda5c32a | ||
|
|
624bf49ee3 | ||
|
|
ab48cbe747 | ||
|
|
2a5094993c | ||
|
|
49d981f006 | ||
|
|
fb2abf933d | ||
|
|
b78e4a6099 | ||
|
|
e0df4490b3 | ||
|
|
7226793e41 | ||
|
|
934d33f950 | ||
|
|
a143b49492 | ||
|
|
f048cfb296 | ||
|
|
89fec64e91 | ||
|
|
bdb1e8af82 | ||
|
|
f40238a49d | ||
|
|
957b94469f | ||
|
|
c2255a3de7 | ||
|
|
caf5e49595 | ||
|
|
7782a37c97 | ||
|
|
f86f2ce587 | ||
|
|
7d1b81690b | ||
|
|
ac6a46262a | ||
|
|
bde464e8c1 | ||
|
|
b2e73c9360 | ||
|
|
863e18a4d7 | ||
|
|
d90f4e181a | ||
|
|
33c7053121 | ||
|
|
5f06f5b0a9 | ||
|
|
18baa45433 | ||
|
|
43c9a69f88 | ||
|
|
b313d07669 | ||
|
|
eb00a1d9c4 | ||
|
|
f1c9ac0a75 | ||
|
|
0b2a8b38ac | ||
|
|
561dd82236 | ||
|
|
66e0b5d9f6 | ||
|
|
08329b89c5 | ||
|
|
e8eb87e7c1 | ||
|
|
c621050f18 | ||
|
|
2fc5c54b8e | ||
|
|
e2fb26c0ad | ||
|
|
d53cc834c4 | ||
|
|
5755e4aad9 | ||
|
|
87ce6d949d | ||
|
|
e102f8e4e9 | ||
|
|
0fb0c6f74d | ||
|
|
5dfd0e4582 | ||
|
|
f311239c9c | ||
|
|
c3e729744a | ||
|
|
447611ba4a | ||
|
|
6637405358 | ||
|
|
32c74ba5b4 | ||
|
|
177f93844c | ||
|
|
d76d110f39 | ||
|
|
1584f35624 | ||
|
|
ac0c3ccfc9 | ||
|
|
3810fbf68c | ||
|
|
20b4f728e4 | ||
|
|
047230de25 | ||
|
|
107764c6be | ||
|
|
0819b19db2 | ||
|
|
4aedce7839 | ||
|
|
2d486d7c66 | ||
|
|
ba8a5c6990 | ||
|
|
1ae015c65f | ||
|
|
92681aa4c5 | ||
|
|
004438cee9 | ||
|
|
b7546cf6d4 | ||
|
|
cce5f56d67 | ||
|
|
eb58b7fc02 | ||
|
|
8f0362455a | ||
|
|
79fe05581c | ||
|
|
658b3b8635 | ||
|
|
77da5964bf | ||
|
|
0232725711 | ||
|
|
ff7f397705 | ||
|
|
d8fa96b20e | ||
|
|
15a9728f45 | ||
|
|
6c9439822b | ||
|
|
4b667d0039 | ||
|
|
19bbba5202 | ||
|
|
ad76d122e5 | ||
|
|
5ec69153b5 | ||
|
|
45427148f6 | ||
|
|
c5fb16836f | ||
|
|
63b6f911b6 | ||
|
|
dec9b17655 | ||
|
|
b8c4d4420e | ||
|
|
0b064a9cee | ||
|
|
4d186c81ff | ||
|
|
5cc7869c0f | ||
|
|
6a8450cbcb | ||
|
|
ca8781f956 | ||
|
|
311ae1a570 | ||
|
|
06b2718d7d | ||
|
|
0f574bc3e8 | ||
|
|
7e49c2a09e | ||
|
|
23cbadb9f6 | ||
|
|
fce2e43ef7 | ||
|
|
4f7a381eed | ||
|
|
6a0f1310e1 | ||
|
|
bb36185066 | ||
|
|
be8eac2fc5 | ||
|
|
e4ecf08e29 | ||
|
|
99c048a29d | ||
|
|
f49731a240 | ||
|
|
375662c69e | ||
|
|
e246ac578d | ||
|
|
d8dcd498a3 | ||
|
|
91b01c5fca | ||
|
|
30812dff49 | ||
|
|
31a90d1498 | ||
|
|
2d02da1574 | ||
|
|
33f77b2192 |
14
.github/workflows/conditional-build-test.yml
vendored
14
.github/workflows/conditional-build-test.yml
vendored
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
||||
jobs:
|
||||
determine-builds:
|
||||
name: Evaluate Required Builds
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 1
|
||||
# Map a step output to job output
|
||||
outputs:
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
tag-build:
|
||||
name: Build Tag FW
|
||||
needs: [determine-builds]
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Code (with submodules)
|
||||
uses: actions/checkout@v4
|
||||
@@ -70,16 +70,22 @@ jobs:
|
||||
#- OpenEPaperLink_AP_and_Flasher
|
||||
- ESP32_S3_16_8_YELLOW_AP
|
||||
- OpenEPaperLink_Mini_AP_v4
|
||||
runs-on: ubuntu-22.04
|
||||
- OpenEPaperLink_ESP32-PoE-ISO_AP
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup-pio
|
||||
|
||||
- name: Build ${{ matrix.environment }}
|
||||
- name: Build ${{ matrix.environment }} binary
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
pio run --environment ${{ matrix.environment }}
|
||||
- name: Build ${{ matrix.environment }} filesystem
|
||||
if: ${{ matrix.environment != 'OpenEPaperLink_ESP32-PoE-ISO_AP' }}
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
pio run --target buildfs --environment ${{ matrix.environment }}
|
||||
|
||||
|
||||
|
||||
|
||||
155
.github/workflows/release.yml
vendored
155
.github/workflows/release.yml
vendored
@@ -5,6 +5,12 @@ on:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
env:
|
||||
INCLUDE_C6_H2: true
|
||||
INCLUDE_MINI_AP: false
|
||||
INCLUDE_Nano_AP: false
|
||||
INCLUDE_S2_Tag_Flasher: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
@@ -20,14 +26,14 @@ jobs:
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.9'
|
||||
|
||||
# - name: Commit zipped files
|
||||
|
||||
# - name: Commit zipped files
|
||||
# run: |
|
||||
# git config --global user.name 'Bot'
|
||||
# git config --global user.email "bot@openepaperlink.de"
|
||||
# git commit -am "Zipped web files"
|
||||
# git push origin HEAD:master
|
||||
|
||||
|
||||
- name: Install PlatformIO Core
|
||||
run: pip install --upgrade platformio
|
||||
|
||||
@@ -41,37 +47,45 @@ jobs:
|
||||
run: |
|
||||
mkdir espbinaries
|
||||
|
||||
#- name: esp-idf build
|
||||
# uses: espressif/esp-idf-ci-action@v1
|
||||
# with:
|
||||
# esp_idf_version: latest
|
||||
# target: esp32c6
|
||||
# path: 'ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/'
|
||||
- name: build ESP32-C6 firmware
|
||||
if: ${{ env.INCLUDE_C6_H2 == 'true' }}
|
||||
uses: espressif/esp-idf-ci-action@v1
|
||||
with:
|
||||
esp_idf_version: latest
|
||||
target: esp32c6
|
||||
path: 'ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/'
|
||||
|
||||
# - name: esp-idf build
|
||||
# uses: espressif/esp-idf-ci-action@v1
|
||||
# with:
|
||||
# esp_idf_version: latest
|
||||
# target: esp32h2
|
||||
# path: 'ARM_Tag_FW/OpenEPaperLink_esp32_H2_AP/'
|
||||
- name: Add C6 files to release
|
||||
if: ${{ env.INCLUDE_C6_H2 == 'true' }}
|
||||
run: |
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/build/OpenEPaperLink_esp32_C6.bin espbinaries/OpenEPaperLink_esp32_C6.bin
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/build/bootloader/bootloader.bin espbinaries/bootloader_C6.bin
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/build/partition_table/partition-table.bin espbinaries/partition-table_C6.bin
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink//binaries/ESP32-C6/firmware_C6.json espbinaries
|
||||
|
||||
#- name: Add C6 files to release
|
||||
# run: |
|
||||
# cp /home/runner/work/OpenEPaperLink/OpenEPaperLink/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/build/OpenEPaperLink_esp32_C6.bin espbinaries/OpenEPaperLink_esp32_C6.bin
|
||||
- name: build ESP32-H2 firmware
|
||||
if: ${{ env.INCLUDE_C6_H2 == 'true' }}
|
||||
uses: espressif/esp-idf-ci-action@v1
|
||||
with:
|
||||
esp_idf_version: latest
|
||||
target: esp32h2
|
||||
path: 'ARM_Tag_FW/OpenEPaperLink_esp32_H2_AP/'
|
||||
|
||||
#- name: Add H2 files to release
|
||||
# run: |
|
||||
# cd ARM_Tag_FW/OpenEPaperLink_esp32_H2_AP/
|
||||
# dir build
|
||||
# esptool.py --chip esp32h2 merge_bin -o merged-firmware.bin --flash_mode dio --flash_size 4MB --flash_freq 48m 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/OpenEPaperLink_esp32_H2.bin
|
||||
# cp merged-firmware.bin ../../espbinaries/OpenEPaperLink_esp32_H2.bin
|
||||
- name: Add H2 files to release
|
||||
if: ${{ env.INCLUDE_C6_H2 == 'true' }}
|
||||
run: |
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink/ARM_Tag_FW/OpenEPaperLink_esp32_H2_AP/build/OpenEPaperLink_esp32_H2.bin espbinaries/OpenEPaperLink_esp32_H2.bin
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink/ARM_Tag_FW/OpenEPaperLink_esp32_H2_AP/build/bootloader/bootloader.bin espbinaries/bootloader_H2.bin
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink/ARM_Tag_FW/OpenEPaperLink_esp32_H2_AP/build/partition_table/partition-table.bin espbinaries/partition-table_H2.bin
|
||||
cp /home/runner/work/OpenEPaperLink/OpenEPaperLink//binaries/ESP32-H2/firmware_H2.json espbinaries
|
||||
|
||||
# - name: Zip web files
|
||||
# run: |
|
||||
# run: |
|
||||
# cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_AP-Flasher
|
||||
# python gzip_wwwfiles.py
|
||||
|
||||
|
||||
- name: Build firmware for OpenEPaperLink_Mini_AP
|
||||
if: ${{ env.INCLUDE_MINI_AP == 'true' }}
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
|
||||
@@ -88,8 +102,9 @@ jobs:
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp OpenEPaperLink_Mini_AP/firmware.bin espbinaries/OpenEPaperLink_Mini_AP.bin
|
||||
cp OpenEPaperLink_Mini_AP/merged-firmware.bin espbinaries/OpenEPaperLink_Mini_AP_full.bin
|
||||
|
||||
|
||||
- name: Build firmware for OpenEPaperLink_Nano_AP
|
||||
if: ${{ env.INCLUDE_Nano_AP == 'true' }}
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
|
||||
@@ -106,11 +121,10 @@ jobs:
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp OpenEPaperLink_Nano_AP/firmware.bin espbinaries/OpenEPaperLink_Nano_AP.bin
|
||||
cp OpenEPaperLink_Nano_AP/merged-firmware.bin espbinaries/OpenEPaperLink_Nano_AP_full.bin
|
||||
|
||||
# - name: move files for big APs
|
||||
# run: |
|
||||
# cp -a binaries/ESP32-C6/. ESP32_AP-Flasher/data/
|
||||
|
||||
|
||||
- name: Build firmware for OpenEPaperLink_AP_and_Flasher
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
@@ -128,7 +142,6 @@ jobs:
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp OpenEPaperLink_AP_and_Flasher/firmware.bin espbinaries/OpenEPaperLink_AP_and_Flasher.bin
|
||||
cp OpenEPaperLink_AP_and_Flasher/merged-firmware.bin espbinaries/OpenEPaperLink_AP_and_Flasher_full.bin
|
||||
|
||||
- name: Build firmware for ESP32_S3_16_8_YELLOW_AP
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
@@ -183,6 +196,24 @@ jobs:
|
||||
cp ESP32_S3_16_8_LILYGO_AP/firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_AP.bin
|
||||
cp ESP32_S3_16_8_LILYGO_AP/merged-firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_AP_full.bin
|
||||
|
||||
- name: Build firmware for ESP32_S3_16_8_LILYGO_T3
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
|
||||
pio run --environment ESP32_S3_16_8_LILYGO_T3
|
||||
pio run --target buildfs --environment ESP32_S3_16_8_LILYGO_T3
|
||||
mkdir /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3
|
||||
cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/boot_app0.bin
|
||||
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/firmware.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/firmware.bin
|
||||
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/bootloader.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/bootloader.bin
|
||||
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/partitions.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/partitions.bin
|
||||
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/littlefs.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3
|
||||
esptool.py --chip esp32-s3 merge_bin -o merged-firmware.bin --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0000 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin 0x00910000 littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp ESP32_S3_16_8_LILYGO_T3/firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_T3.bin
|
||||
cp ESP32_S3_16_8_LILYGO_T3/merged-firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_T3_full.bin
|
||||
|
||||
- name: Build firmware for OpenEPaperLink_Nano_TLSR
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
@@ -200,7 +231,7 @@ jobs:
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp OpenEPaperLink_Nano_TLSR/firmware.bin espbinaries/OpenEPaperLink_Nano_TLSR.bin
|
||||
cp OpenEPaperLink_Nano_TLSR/merged-firmware.bin espbinaries/OpenEPaperLink_Nano_TLSR_full.bin
|
||||
|
||||
|
||||
- name: Build firmware for OpenEPaperLink_PoE_AP
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
@@ -254,7 +285,65 @@ jobs:
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp BLE_ONLY_AP/firmware.bin espbinaries/BLE_ONLY_AP.bin
|
||||
cp BLE_ONLY_AP/merged-firmware.bin espbinaries/BLE_ONLY_AP_full.bin
|
||||
|
||||
- name: Build firmware for OpenEPaperLink_Nano_TLSR_C6
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
|
||||
pio run --environment OpenEPaperLink_Nano_TLSR_C6
|
||||
pio run --target buildfs --environment OpenEPaperLink_Nano_TLSR_C6
|
||||
mkdir /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Nano_TLSR_C6
|
||||
cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Nano_TLSR_C6/boot_app0.bin
|
||||
cp .pio/build/OpenEPaperLink_Nano_TLSR_C6/firmware.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Nano_TLSR_C6/firmware.bin
|
||||
cp .pio/build/OpenEPaperLink_Nano_TLSR_C6/bootloader.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Nano_TLSR_C6/bootloader.bin
|
||||
cp .pio/build/OpenEPaperLink_Nano_TLSR_C6/partitions.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Nano_TLSR_C6/partitions.bin
|
||||
cp .pio/build/OpenEPaperLink_Nano_TLSR_C6/littlefs.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Nano_TLSR_C6/littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Nano_TLSR_C6
|
||||
esptool.py --chip esp32-s3 merge_bin -o merged-firmware.bin --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0000 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin 0x00910000 littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp OpenEPaperLink_Nano_TLSR_C6/firmware.bin espbinaries/OpenEPaperLink_Nano_TLSR_C6.bin
|
||||
cp OpenEPaperLink_Nano_TLSR_C6/merged-firmware.bin espbinaries/OpenEPaperLink_Nano_TLSR_C6_full.bin
|
||||
|
||||
- name: Build firmware for ESP32_S3_16_8_4inch_AP
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
|
||||
pio run --environment ESP32_S3_16_8_4inch_AP
|
||||
pio run --target buildfs --environment ESP32_S3_16_8_4inch_AP
|
||||
mkdir /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_4inch_AP
|
||||
cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_4inch_AP/boot_app0.bin
|
||||
cp .pio/build/ESP32_S3_16_8_4inch_AP/firmware.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_4inch_AP/firmware.bin
|
||||
cp .pio/build/ESP32_S3_16_8_4inch_AP/bootloader.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_4inch_AP/bootloader.bin
|
||||
cp .pio/build/ESP32_S3_16_8_4inch_AP/partitions.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_4inch_AP/partitions.bin
|
||||
cp .pio/build/ESP32_S3_16_8_4inch_AP/littlefs.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_4inch_AP/littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_4inch_AP
|
||||
esptool.py --chip esp32-s3 merge_bin -o merged-firmware.bin --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0000 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin 0x00910000 littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp ESP32_S3_16_8_4inch_AP/firmware.bin espbinaries/ESP32_S3_16_8_4inch_AP.bin
|
||||
cp ESP32_S3_16_8_4inch_AP/merged-firmware.bin espbinaries/ESP32_S3_16_8_4inch_AP_full.bin
|
||||
|
||||
- name: Build firmware for OpenEPaperLink_ESP32-PoE-ISO_AP
|
||||
run: |
|
||||
cd ESP32_AP-Flasher
|
||||
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
|
||||
pio run --environment OpenEPaperLink_ESP32-PoE-ISO_AP
|
||||
mv data data.bak
|
||||
mkdir data
|
||||
pio run --target buildfs --environment OpenEPaperLink_ESP32-PoE-ISO_AP
|
||||
rmdir data
|
||||
mv data.bak data
|
||||
mkdir /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_ESP32-PoE-ISO_AP
|
||||
cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_ESP32-PoE-ISO_AP/boot_app0.bin
|
||||
cp .pio/build/OpenEPaperLink_ESP32-PoE-ISO_AP/firmware.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_ESP32-PoE-ISO_AP/firmware.bin
|
||||
cp .pio/build/OpenEPaperLink_ESP32-PoE-ISO_AP/bootloader.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_ESP32-PoE-ISO_AP/bootloader.bin
|
||||
cp .pio/build/OpenEPaperLink_ESP32-PoE-ISO_AP/partitions.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_ESP32-PoE-ISO_AP/partitions.bin
|
||||
cp .pio/build/OpenEPaperLink_ESP32-PoE-ISO_AP/littlefs.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_ESP32-PoE-ISO_AP/littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_ESP32-PoE-ISO_AP
|
||||
esptool.py --chip esp32 merge_bin -o merged-firmware.bin --flash_mode qio --flash_freq 80m --flash_size 4MB 0x0000 bootloader.bin 0x8000 partitions.bin 0xD000 boot_app0.bin 0x10000 firmware.bin 0x3D0000 littlefs.bin
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp OpenEPaperLink_ESP32-PoE-ISO_AP/firmware.bin espbinaries/OpenEPaperLink_ESP32-PoE-ISO_AP.bin
|
||||
cp OpenEPaperLink_ESP32-PoE-ISO_AP/merged-firmware.bin espbinaries/OpenEPaperLink_ESP32-PoE-ISO_AP_full.bin
|
||||
|
||||
- name: generate release json file
|
||||
run: |
|
||||
mkdir jsonfiles
|
||||
@@ -268,10 +357,11 @@ jobs:
|
||||
tag: ${{ github.ref }}
|
||||
file_glob: true
|
||||
overwrite: true
|
||||
|
||||
|
||||
# this is down here intentionally to be able to modify the binary folder before adding it to the Tag_Flasher later (ota binaries can be removed)
|
||||
|
||||
- name: Build firmware for Tag_Flasher
|
||||
if: ${{ env.INCLUDE_S2_Tag_Flasher == 'true' }}
|
||||
run: |
|
||||
cd Tag_Flasher/ESP32_Flasher
|
||||
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
|
||||
@@ -288,7 +378,6 @@ jobs:
|
||||
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
|
||||
cp S2_Tag_Flasher/firmware.bin espbinaries/S2_Tag_Flasher.bin
|
||||
cp S2_Tag_Flasher/merged-firmware.bin espbinaries/S2_Tag_Flasher_full.bin
|
||||
|
||||
- name: Add esp bins to release
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
with:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
menu "OEPL Hardware config"
|
||||
menu "OEPL config"
|
||||
|
||||
choice OEPL_HARDWARE_PROFILE
|
||||
prompt "Hardware profile"
|
||||
@@ -16,6 +16,12 @@ menu "OEPL Hardware config"
|
||||
config OEPL_HARDWARE_PROFILE_LILYGO
|
||||
bool "LILYGO-AP"
|
||||
|
||||
config OEPL_HARDWARE_PROFILE_4inch
|
||||
bool "4inchAP"
|
||||
|
||||
config OEPL_HARDWARE_PROFILE_ELECROW_C6
|
||||
bool "ELECROW-C6-AP"
|
||||
|
||||
endchoice
|
||||
|
||||
config OEPL_HARDWARE_UART_TX
|
||||
@@ -28,6 +34,16 @@ menu "OEPL Hardware config"
|
||||
int "GPIO - UART RX"
|
||||
default 2
|
||||
|
||||
config OEPL_HARDWARE_UART_TX
|
||||
depends on OEPL_HARDWARE_PROFILE_4inch
|
||||
int "GPIO - UART TX"
|
||||
default 16
|
||||
|
||||
config OEPL_HARDWARE_UART_RX
|
||||
depends on OEPL_HARDWARE_PROFILE_4inch
|
||||
int "GPIO - UART RX"
|
||||
default 17
|
||||
|
||||
config OEPL_SUBGIG_SUPPORT
|
||||
bool "Enable SubGhz Support"
|
||||
default "n"
|
||||
@@ -102,6 +118,16 @@ menu "OEPL Hardware config"
|
||||
USE SPI3_HOST. This is also called VSPI_HOST
|
||||
endchoice
|
||||
endmenu
|
||||
|
||||
config OEPL_DEBUG_PRINT
|
||||
bool "Enable OEPL Debug logging"
|
||||
default "n"
|
||||
|
||||
config OEPL_VERBOSE_DEBUG
|
||||
depends on OEPL_DEBUG_PRINT
|
||||
bool "Enable OEPL Verbose Debug logging"
|
||||
default "n"
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
|
||||
@@ -13,24 +13,16 @@
|
||||
|
||||
#include "radio.h"
|
||||
#include "proto.h"
|
||||
#include "utils.h"
|
||||
#include "second_uart.h"
|
||||
#include "cc1101_radio.h"
|
||||
#include "logging.h"
|
||||
#include "SubGigRadio.h"
|
||||
|
||||
void DumpHex(void *AdrIn,int Len);
|
||||
bool CC1101_QuickCheck(void);
|
||||
|
||||
#define LOGE(format, ... ) \
|
||||
printf("%s#%d: " format,__FUNCTION__,__LINE__,## __VA_ARGS__)
|
||||
|
||||
#if 0
|
||||
#define LOG(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__)
|
||||
#define LOG_RAW(format, ... ) printf(format,## __VA_ARGS__)
|
||||
#define LOG_HEX(x,y) DumpHex(x,y)
|
||||
#else
|
||||
#define LOG(format, ... )
|
||||
#define LOG_RAW(format, ... )
|
||||
#define LOG_HEX(x,y)
|
||||
#endif
|
||||
|
||||
#define wait_Miso(level) CC1101_WaitMISO(__FUNCTION__,__LINE__,level)
|
||||
|
||||
// SPI Stuff
|
||||
#if CONFIG_SPI2_HOST
|
||||
@@ -39,6 +31,9 @@ void DumpHex(void *AdrIn,int Len);
|
||||
#define HOST_ID SPI3_HOST
|
||||
#endif
|
||||
|
||||
// Wait for up to 2 milliseconds for MISO to go low
|
||||
#define MISO_WAIT_TIMEOUT 2
|
||||
|
||||
// Address Config = No address check
|
||||
// Base Frequency = xxx.xxx
|
||||
// CRC Enable = false
|
||||
@@ -247,10 +242,10 @@ SubGigErr SubGig_radio_init(uint8_t ch)
|
||||
SubGigErr Ret = SUBGIG_ERR_NONE;
|
||||
|
||||
do {
|
||||
gpio_reset_pin(CONFIG_CSN_GPIO);
|
||||
gpio_set_direction(CONFIG_CSN_GPIO, GPIO_MODE_OUTPUT);
|
||||
gpio_set_level(CONFIG_CSN_GPIO, 1);
|
||||
|
||||
if(!CC1101_QuickCheck()) {
|
||||
Ret = SUBGIG_CC1101_NOT_FOUND;
|
||||
break;
|
||||
}
|
||||
spi_bus_config_t buscfg = {
|
||||
.sclk_io_num = CONFIG_SCK_GPIO,
|
||||
.mosi_io_num = CONFIG_MOSI_GPIO,
|
||||
@@ -297,6 +292,7 @@ SubGigErr SubGig_radio_init(uint8_t ch)
|
||||
}
|
||||
// Check Chip ID
|
||||
if(!CC1101_Present()) {
|
||||
LOGE("CC1101 not detected\n");
|
||||
Ret = SUBGIG_CC1101_NOT_FOUND;
|
||||
break;
|
||||
}
|
||||
@@ -314,7 +310,7 @@ SubGigErr SubGig_radio_init(uint8_t ch)
|
||||
} while(false);
|
||||
|
||||
if(ErrLine != 0) {
|
||||
LOG("%s#%d: failed %d\n",__FUNCTION__,ErrLine,Err);
|
||||
LOGA("%s#%d: failed %d\n",__FUNCTION__,ErrLine,Err);
|
||||
if(Err == 0) {
|
||||
Ret = ESP_FAIL;
|
||||
}
|
||||
@@ -453,8 +449,6 @@ int8_t SubGig_commsRxUnencrypted(uint8_t *data)
|
||||
if(RxBytes >= 2) {
|
||||
// NB: RxBytes includes the CRC, deduct it
|
||||
Ret = (uint8_t) RxBytes - 2;
|
||||
LOG("Received %d byte subgig frame:\n",Ret);
|
||||
LOG_HEX(data,Ret);
|
||||
}
|
||||
}
|
||||
} while(false);
|
||||
@@ -477,7 +471,7 @@ int CheckSubGigState()
|
||||
}
|
||||
|
||||
if(Err != SUBGIG_ERR_NONE) {
|
||||
LOG("CheckSubGigState: returing %d\n",Err);
|
||||
LOGE("Returning %d\n",Err);
|
||||
}
|
||||
|
||||
return Err;
|
||||
@@ -558,5 +552,96 @@ void DumpHex(void *AdrIn,int Len)
|
||||
LOG_RAW("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Quick and hopefully safe check if a CC1101 is present.
|
||||
// Only the CSN and MISO GPIOs are configured for this test.
|
||||
// If they are and there's a CC1101 then MISO should go low when
|
||||
// CSN is low
|
||||
bool CC1101_QuickCheck()
|
||||
{
|
||||
// Init CSn and MISO
|
||||
esp_err_t Err = ESP_OK;
|
||||
bool Ret = false;
|
||||
int Line = 0;
|
||||
int MisoLevel;
|
||||
|
||||
do {
|
||||
Err = gpio_reset_pin(CONFIG_MISO_GPIO);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
|
||||
Err = gpio_set_direction(CONFIG_MISO_GPIO,GPIO_MODE_INPUT);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
|
||||
Err = gpio_set_pull_mode(CONFIG_MISO_GPIO,GPIO_PULLUP_ONLY);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
|
||||
Err = gpio_reset_pin(CONFIG_CSN_GPIO);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
Err = gpio_set_direction(CONFIG_CSN_GPIO,GPIO_MODE_OUTPUT);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
Err = gpio_set_level(CONFIG_CSN_GPIO,1);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
|
||||
// The CC1101 is not selected and MISO has a pullup so it should be high
|
||||
if(wait_Miso(1) != 1) {
|
||||
LOGA("Error: SubGhz MISO stuck low\n");
|
||||
break;
|
||||
}
|
||||
// Select the CC1101
|
||||
Err = gpio_set_level(CONFIG_CSN_GPIO,0);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
MisoLevel = wait_Miso(0);
|
||||
|
||||
// Deselect the CC1101
|
||||
Err = gpio_set_level(CONFIG_CSN_GPIO,1);
|
||||
if(Err != ESP_OK) {
|
||||
Line = __LINE__;
|
||||
break;
|
||||
}
|
||||
|
||||
if(MisoLevel == 0) {
|
||||
Ret = true;
|
||||
}
|
||||
} while(false);
|
||||
|
||||
|
||||
if(Line != 0) {
|
||||
LOGA("%s#%d: gpio call failed (0x%x)\n",__FUNCTION__,__LINE__,Err);
|
||||
}
|
||||
|
||||
if(Ret) {
|
||||
// Disable pullup, it's no longer needed
|
||||
gpio_set_pull_mode(CONFIG_MISO_GPIO,GPIO_FLOATING);
|
||||
}
|
||||
else {
|
||||
// CC1101 not present, deinit MISO and CSn GPIOs
|
||||
LOGE("CC1101 not detected\n");
|
||||
gpio_reset_pin(CONFIG_MISO_GPIO);
|
||||
gpio_reset_pin(CONFIG_CSN_GPIO);
|
||||
}
|
||||
return Ret;
|
||||
}
|
||||
#endif // CONFIG_OEPL_SUBGIG_SUPPORT
|
||||
|
||||
|
||||
@@ -34,34 +34,12 @@
|
||||
#include <stdbool.h>
|
||||
#include <driver/spi_master.h>
|
||||
#include "proto.h"
|
||||
#include "utils.h"
|
||||
#include "second_uart.h"
|
||||
#include "cc1101_radio.h"
|
||||
#include "logging.h"
|
||||
#include "radio.h"
|
||||
|
||||
#define ENABLE_LOGGING 0
|
||||
|
||||
// LOGA - generic logging, always enabled
|
||||
#define LOGA(format, ... ) printf(format,## __VA_ARGS__)
|
||||
// LOGE - error logging, always enabled
|
||||
#define LOGE(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__)
|
||||
|
||||
#if ENABLE_LOGGING
|
||||
#define LOG(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__)
|
||||
#define LOG_RAW(format, ... ) printf(format,## __VA_ARGS__)
|
||||
#else
|
||||
#define LOG(format, ... )
|
||||
#define LOG_RAW(format, ... )
|
||||
#endif
|
||||
|
||||
#define ENABLE_VERBOSE_LOGGING 0
|
||||
|
||||
#if ENABLE_VERBOSE_LOGGING
|
||||
#define LOGV(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__)
|
||||
#define LOGV_RAW(format, ... ) printf(format,## __VA_ARGS__)
|
||||
#else
|
||||
#define LOGV(format, ... )
|
||||
#define LOGB_RAW(format, ... )
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
@@ -197,7 +175,7 @@ uint8_t CC1101_readReg(uint8_t regAddr, uint8_t regType);
|
||||
void CC1101_writeReg(uint8_t regAddr, uint8_t value);
|
||||
void CC1101_setTxState(void);
|
||||
|
||||
void setIdleState(void);
|
||||
static void setIdleState(void);
|
||||
|
||||
spi_device_handle_t gSpiHndl;
|
||||
|
||||
@@ -288,7 +266,7 @@ static uint8_t gRfState;
|
||||
|
||||
#define cc1101_Select() gpio_set_level(CONFIG_CSN_GPIO, LOW)
|
||||
#define cc1101_Deselect() gpio_set_level(CONFIG_CSN_GPIO, HIGH)
|
||||
#define wait_Miso() while(gpio_get_level(CONFIG_MISO_GPIO)>0)
|
||||
#define wait_Miso() CC1101_WaitMISO(__FUNCTION__,__LINE__,0)
|
||||
#define getGDO0state() gpio_get_level(CONFIG_GDO0_GPIO)
|
||||
#define wait_GDO0_high() while(!getGDO0state())
|
||||
#define wait_GDO0_low() while(getGDO0state())
|
||||
@@ -633,14 +611,13 @@ int CC1101_Rx(uint8_t *RxBuf,size_t RxBufLen,uint8_t *pRssi,uint8_t *pLqi)
|
||||
// Any data waiting to be read and no overflow?
|
||||
do {
|
||||
if(rxBytes & CC1101_RXFIFO_OVERFLOW_MASK) {
|
||||
LOGE("RxFifo overflow\n");
|
||||
// This occurs occasionally due to random noise, so do don't log
|
||||
Ret = -2;
|
||||
break;
|
||||
}
|
||||
|
||||
if(rxBytes < 2) {
|
||||
// should have at least 2 bytes, packet len and one byte of data
|
||||
LOGE("Internal error, rxBytes = %d\n",rxBytes);
|
||||
Ret = -2;
|
||||
break;
|
||||
}
|
||||
@@ -786,5 +763,24 @@ void CC1101_logState()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Wait for up to 2 milliseconds for MISO to go low
|
||||
#define MISO_WAIT_TIMEOUT 2
|
||||
int CC1101_WaitMISO(const char *Func,int Line,int level)
|
||||
{
|
||||
uint32_t Start = getMillis();
|
||||
int MisoLevel;
|
||||
|
||||
while((MisoLevel = gpio_get_level(CONFIG_MISO_GPIO)) != level) {
|
||||
if((getMillis() - Start) >= MISO_WAIT_TIMEOUT) {
|
||||
LOGA("%s#%d: timeout waiting for MISO to go %s\n",
|
||||
Func,Line,level ? "high" : "low");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return MisoLevel;
|
||||
}
|
||||
|
||||
#endif // CONFIG_OEPL_SUBGIG_SUPPORT
|
||||
|
||||
|
||||
@@ -29,6 +29,14 @@
|
||||
#ifndef __CC1101_RADIO_H_
|
||||
#define __CC1101_RADIO_H_
|
||||
|
||||
// Log to all
|
||||
#define LOGA(format, ... ) \
|
||||
uart_printf(format "\r",## __VA_ARGS__)
|
||||
|
||||
// Error log to all
|
||||
#define LOGE(format, ... ) \
|
||||
uart_printf("%s#%d: " format "\r",__FUNCTION__,__LINE__,## __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* CC1101 configuration registers
|
||||
*/
|
||||
@@ -113,6 +121,7 @@ void CC1101_DumpRegs(void);
|
||||
void CC1101_reset(void);
|
||||
void CC1101_logState(void);
|
||||
void CC1101_setRxState(void);
|
||||
int CC1101_WaitMISO(const char *Func,int Line,int level);
|
||||
|
||||
#endif // __CC1101_RADIO_H_
|
||||
|
||||
|
||||
23
ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/logging.h
Executable file
23
ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/logging.h
Executable file
@@ -0,0 +1,23 @@
|
||||
#pragma once
|
||||
|
||||
#if CONFIG_OEPL_DEBUG_PRINT
|
||||
#define LOG(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__)
|
||||
#define LOG_RAW(format, ... ) printf(format,## __VA_ARGS__)
|
||||
void DumpHex(void *AdrIn,int Len);
|
||||
#define LOG_HEX(x,y) DumpHex(x,y)
|
||||
#else
|
||||
#define LOG(format, ... )
|
||||
#define LOG_RAW(format, ... )
|
||||
#define LOG_HEX(x,y)
|
||||
#endif
|
||||
|
||||
#if CONFIG_OEPL_VERBOSE_DEBUG
|
||||
#define LOGV(format, ... ) LOG(format,## __VA_ARGS__)
|
||||
#define LOGV_RAW(format, ... ) LOG_RAW(format,## __VA_ARGS__)
|
||||
#define LOGV_HEX(x,y) LOG_HEX(x,y)
|
||||
#else
|
||||
#define LOGV(format, ... )
|
||||
#define LOGV_RAW(format, ... )
|
||||
#define LOGV_HEX(x,y)
|
||||
#endif
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include "logging.h"
|
||||
#include "SubGigRadio.h"
|
||||
|
||||
|
||||
@@ -35,6 +36,30 @@ static const char *TAG = "MAIN";
|
||||
|
||||
const uint8_t channelList[6] = {11, 15, 20, 25, 26, 27};
|
||||
|
||||
#if CONFIG_OEPL_VERBOSE_DEBUG
|
||||
const struct {
|
||||
uint8_t Type;
|
||||
const char *Name;
|
||||
} gPktTypeLookupTbl[] = {
|
||||
{PKT_TAG_RETURN_DATA, "TAG_RETURN_DATA"},
|
||||
{PKT_TAG_RETURN_DATA_ACK, "TAG_RETURN_DATA_ACK"},
|
||||
{PKT_AVAIL_DATA_SHORTREQ, "AVAIL_DATA_SHORTREQ"},
|
||||
{PKT_AVAIL_DATA_REQ, "AVAIL_DATA_REQ"},
|
||||
{PKT_AVAIL_DATA_INFO, "AVAIL_DATA_INFO"},
|
||||
{PKT_BLOCK_PARTIAL_REQUEST, "BLOCK_PARTIAL_REQUEST"},
|
||||
{PKT_BLOCK_REQUEST_ACK, "BLOCK_REQUEST_ACK"},
|
||||
{PKT_BLOCK_REQUEST, "BLOCK_REQUEST"},
|
||||
{PKT_BLOCK_PART, "BLOCK_PART"},
|
||||
{PKT_XFER_COMPLETE, "XFER_COMPLETE"},
|
||||
{PKT_XFER_COMPLETE_ACK, "XFER_COMPLETE_ACK"},
|
||||
{PKT_CANCEL_XFER, "CANCEL_XFER"},
|
||||
{PKT_PING, "PING"},
|
||||
{PKT_PONG, "PONG"},
|
||||
{0,NULL} // End of table
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#define DATATYPE_NOUPDATE 0
|
||||
#define HW_TYPE 0xC6
|
||||
|
||||
@@ -44,7 +69,7 @@ const uint8_t channelList[6] = {11, 15, 20, 25, 26, 27};
|
||||
struct pendingData pendingDataArr[MAX_PENDING_MACS];
|
||||
|
||||
// VERSION GOES HERE!
|
||||
uint16_t version = 0x001e;
|
||||
uint16_t version = 0x001f;
|
||||
|
||||
#define RAW_PKT_PADDING 2
|
||||
|
||||
@@ -124,7 +149,7 @@ uint8_t getBlockDataLength() {
|
||||
}
|
||||
|
||||
// pendingdata slot stuff
|
||||
int8_t findSlotForMac(const uint8_t *mac) {
|
||||
int32_t findSlotForMac(const uint8_t *mac) {
|
||||
for (uint8_t c = 0; c < MAX_PENDING_MACS; c++) {
|
||||
if (memcmp(mac, ((uint8_t *) &(pendingDataArr[c].targetMac)), 8) == 0) {
|
||||
if (pendingDataArr[c].attemptsLeft != 0) {
|
||||
@@ -134,7 +159,7 @@ int8_t findSlotForMac(const uint8_t *mac) {
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int8_t findFreeSlot() {
|
||||
int32_t findFreeSlot() {
|
||||
for (uint8_t c = 0; c < MAX_PENDING_MACS; c++) {
|
||||
if (pendingDataArr[c].attemptsLeft == 0) {
|
||||
return c;
|
||||
@@ -142,7 +167,7 @@ int8_t findFreeSlot() {
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int8_t findSlotForVer(const uint8_t *ver) {
|
||||
int32_t findSlotForVer(const uint8_t *ver) {
|
||||
for (uint8_t c = 0; c < MAX_PENDING_MACS; c++) {
|
||||
if (memcmp(ver, ((uint8_t *) &(pendingDataArr[c].availdatainfo.dataVer)), 8) == 0) {
|
||||
if (pendingDataArr[c].attemptsLeft != 0) return c;
|
||||
@@ -151,14 +176,14 @@ int8_t findSlotForVer(const uint8_t *ver) {
|
||||
return -1;
|
||||
}
|
||||
void deleteAllPendingDataForVer(const uint8_t *ver) {
|
||||
int8_t slot = -1;
|
||||
int32_t slot = -1;
|
||||
do {
|
||||
slot = findSlotForVer(ver);
|
||||
if (slot != -1) pendingDataArr[slot].attemptsLeft = 0;
|
||||
} while (slot != -1);
|
||||
}
|
||||
void deleteAllPendingDataForMac(const uint8_t *mac) {
|
||||
int8_t slot = -1;
|
||||
int32_t slot = -1;
|
||||
do {
|
||||
slot = findSlotForMac(mac);
|
||||
if (slot != -1) pendingDataArr[slot].attemptsLeft = 0;
|
||||
@@ -289,7 +314,7 @@ void processSerial(uint8_t lastchar) {
|
||||
if (bytesRemain == 0) {
|
||||
if (checkCRC(serialbuffer, sizeof(struct pendingData))) {
|
||||
struct pendingData *pd = (struct pendingData *) serialbuffer;
|
||||
int8_t slot = findSlotForMac(pd->targetMac);
|
||||
int32_t slot = findSlotForMac(pd->targetMac);
|
||||
if (slot == -1) slot = findFreeSlot();
|
||||
if (slot != -1) {
|
||||
memcpy(&(pendingDataArr[slot]), serialbuffer, sizeof(struct pendingData));
|
||||
@@ -474,7 +499,7 @@ void processBlockRequest(const uint8_t *buffer, uint8_t forceBlockDownload) {
|
||||
lastBlockRequest = getMillis();
|
||||
} else {
|
||||
// we're talking to another mac, let this mac know we can't accomodate another request right now
|
||||
pr("BUSY!\n");
|
||||
pr("BUSY!\n\r");
|
||||
sendCancelXfer(rxHeader->src);
|
||||
return;
|
||||
}
|
||||
@@ -496,9 +521,9 @@ void processBlockRequest(const uint8_t *buffer, uint8_t forceBlockDownload) {
|
||||
if (forceBlockDownload) {
|
||||
if ((getMillis() - nextBlockAttempt) > 380) {
|
||||
requestDataDownload = true;
|
||||
pr("FORCED\n");
|
||||
pr("FORCED\n\r");
|
||||
} else {
|
||||
pr("IGNORED\n");
|
||||
pr("IGNORED\n\r");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -599,7 +624,7 @@ void processXferComplete(uint8_t *buffer) {
|
||||
if (memcmp(lastAckMac, rxHeader->src, 8) != 0) {
|
||||
memcpy((void *) lastAckMac, (void *) rxHeader->src, 8);
|
||||
espNotifyXferComplete(rxHeader->src);
|
||||
int8_t slot = findSlotForMac(rxHeader->src);
|
||||
int32_t slot = findSlotForMac(rxHeader->src);
|
||||
if (slot != -1) pendingDataArr[slot].attemptsLeft = 0;
|
||||
}
|
||||
}
|
||||
@@ -647,7 +672,7 @@ void sendPart(uint8_t partNo) {
|
||||
}
|
||||
void sendBlockData() {
|
||||
if (getBlockDataLength() == 0) {
|
||||
pr("Invalid block request received, 0 parts..\n");
|
||||
pr("Invalid block request received, 0 parts..\n\r");
|
||||
requestedData.requestedParts[0] |= 0x01;
|
||||
}
|
||||
|
||||
@@ -660,7 +685,7 @@ void sendBlockData() {
|
||||
pr(".");
|
||||
}
|
||||
}
|
||||
pr("\n");
|
||||
pr("\n\r");
|
||||
|
||||
uint8_t partNo = 0;
|
||||
while (partNo < BLOCK_MAX_PARTS) {
|
||||
@@ -763,11 +788,27 @@ void app_main(void) {
|
||||
housekeepingTimer = getMillis();
|
||||
while (1) {
|
||||
while ((getMillis() - housekeepingTimer) < ((1000 * HOUSEKEEPING_INTERVAL) - 100)) {
|
||||
int8_t ret = commsRxUnencrypted(radiorxbuffer);
|
||||
int32_t ret = commsRxUnencrypted(radiorxbuffer);
|
||||
if (ret > 1) {
|
||||
led_flash(0);
|
||||
|
||||
uint8_t PktType = getPacketType(radiorxbuffer);
|
||||
#if CONFIG_OEPL_VERBOSE_DEBUG
|
||||
LOGV_RAW("Received %d byte ",ret);
|
||||
for(uint8_t i = 0; gPktTypeLookupTbl[i].Name != NULL; i++) {
|
||||
if(gPktTypeLookupTbl[i].Type == PktType) {
|
||||
LOGV_RAW("%s",gPktTypeLookupTbl[i].Name);
|
||||
break;
|
||||
}
|
||||
if(gPktTypeLookupTbl[i].Name == NULL) {
|
||||
LOGV_RAW("undefined (0x%02x)",PktType);
|
||||
}
|
||||
}
|
||||
LOGV_RAW(" packet:\n");
|
||||
LOGV_HEX(radiorxbuffer,ret);
|
||||
#endif
|
||||
// received a packet, lets see what it is
|
||||
switch (getPacketType(radiorxbuffer)) {
|
||||
switch (PktType) {
|
||||
case PKT_AVAIL_DATA_REQ:
|
||||
if (ret == 28) {
|
||||
// old version of the AvailDataReq struct, set all the new fields to zero, so it will pass the CRC
|
||||
|
||||
@@ -54,7 +54,11 @@ void esp_ieee802154_transmit_failed(const uint8_t *frame, esp_ieee802154_tx_erro
|
||||
void esp_ieee802154_transmit_done(const uint8_t *frame, const uint8_t *ack, esp_ieee802154_frame_info_t *ack_frame_info) {
|
||||
isInTransmit = 0;
|
||||
ESP_EARLY_LOGI(TAG, "TX %d", frame[0]);
|
||||
esp_ieee802154_receive_handle_done(ack);
|
||||
if(ack != NULL) {
|
||||
if(esp_ieee802154_receive_handle_done(ack)) {
|
||||
ESP_EARLY_LOGI(TAG, "esp_ieee802154_receive_handle_done() failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
static bool zigbee_is_enabled = false;
|
||||
void radio_init(uint8_t ch) {
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
#include "soc/uart_struct.h"
|
||||
#ifdef CONFIG_IDF_TARGET_ESP32C6
|
||||
#include "soc/lp_uart_reg.h"
|
||||
static const char *TAG = "SECOND_UART";
|
||||
#endif
|
||||
static const char *TAG = "SECOND_UART";
|
||||
#include "second_uart.h"
|
||||
|
||||
|
||||
@@ -45,6 +45,8 @@ void init_second_uart() {
|
||||
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
|
||||
.source_clk = UART_SCLK_DEFAULT,
|
||||
};
|
||||
ESP_LOGI(TAG, "HARDWARE_UART_TX %d, CONFIG_OEPL_HARDWARE_UART_RX %d",
|
||||
CONFIG_OEPL_HARDWARE_UART_TX,CONFIG_OEPL_HARDWARE_UART_RX);
|
||||
ESP_ERROR_CHECK(uart_driver_install(1, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0));
|
||||
ESP_ERROR_CHECK(uart_param_config(1, &uart_config));
|
||||
ESP_ERROR_CHECK(uart_set_pin(1, CONFIG_OEPL_HARDWARE_UART_TX, CONFIG_OEPL_HARDWARE_UART_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
|
||||
|
||||
@@ -21,6 +21,9 @@ void uart_printf(const char *format, ...);
|
||||
#elif defined(CONFIG_OEPL_HARDWARE_PROFILE_POE_AP)
|
||||
#define CONFIG_OEPL_HARDWARE_UART_TX 5
|
||||
#define CONFIG_OEPL_HARDWARE_UART_RX 18
|
||||
#elif defined(CONFIG_OEPL_HARDWARE_PROFILE_ELECROW_C6)
|
||||
#define CONFIG_OEPL_HARDWARE_UART_TX 0
|
||||
#define CONFIG_OEPL_HARDWARE_UART_RX 1
|
||||
#elif defined(CONFIG_OEPL_HARDWARE_PROFILE_CUSTOM)
|
||||
#if !defined(CONFIG_OEPL_HARDWARE_UART_TX) || !defined(CONFIG_OEPL_HARDWARE_UART_RX)
|
||||
#error "No UART TX / RX pins defined. Please check menuconfig"
|
||||
|
||||
@@ -7,4 +7,4 @@ CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||
CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE=y
|
||||
CONFIG_PARTITION_TABLE_CUSTOM=y
|
||||
CONFIG_OEPL_SUBGIG_SUPPORT=y
|
||||
|
||||
CONFIG_IEEE802154_RX_BUFFER_SIZE=100
|
||||
|
||||
@@ -1,14 +1,8 @@
|
||||
menu "OEPL Hardware config"
|
||||
menu "OEPL config"
|
||||
|
||||
choice OEPL_HARDWARE_PROFILE
|
||||
prompt "Hardware profile"
|
||||
default OEPL_HARDWARE_PROFILE_DEFAULT
|
||||
|
||||
config OEPL_HARDWARE_PROFILE_DEFAULT
|
||||
bool "Default"
|
||||
|
||||
config OEPL_HARDWARE_PROFILE_POE_AP
|
||||
bool "PoE-AP"
|
||||
default OEPL_HARDWARE_PROFILE_LILYGO
|
||||
|
||||
config OEPL_HARDWARE_PROFILE_CUSTOM
|
||||
bool "Custom"
|
||||
@@ -102,6 +96,16 @@ menu "OEPL Hardware config"
|
||||
USE SPI3_HOST. This is also called VSPI_HOST
|
||||
endchoice
|
||||
endmenu
|
||||
|
||||
config OEPL_DEBUG_PRINT
|
||||
bool "Enable OEPL Debug logging"
|
||||
default "n"
|
||||
|
||||
config OEPL_VERBOSE_DEBUG
|
||||
depends on OEPL_DEBUG_PRINT
|
||||
bool "Enable OEPL Verbose Debug logging"
|
||||
default "n"
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
|
||||
BIN
ESP32_AP-Flasher/data/fonts/tahoma11.vlw
Normal file
BIN
ESP32_AP-Flasher/data/fonts/tahoma11.vlw
Normal file
Binary file not shown.
Binary file not shown.
@@ -10,6 +10,7 @@
|
||||
"/www/painter.js",
|
||||
"/www/setup.html",
|
||||
"/www/setup.js",
|
||||
"/www/flash.js",
|
||||
"/www/upload-demo.html"
|
||||
]
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ESP32_AP-Flasher/data/www/jsontemplate-demo-v2.html.gz
Normal file
BIN
ESP32_AP-Flasher/data/www/jsontemplate-demo-v2.html.gz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
7
ESP32_AP-Flasher/esp32_sdcard_only.csv
Normal file
7
ESP32_AP-Flasher/esp32_sdcard_only.csv
Normal file
@@ -0,0 +1,7 @@
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, 0x9000, 0x5000,
|
||||
otadata, data, ota, 0xe000, 0x2000,
|
||||
app0, app, ota_0, 0x10000, 0x1E0000,
|
||||
app1, app, ota_1, 0x1F0000,0x1E0000,
|
||||
spiffs, data, spiffs, 0x3D0000,0x20000,
|
||||
coredump, data, coredump,0x3F0000,0x10000,
|
||||
|
@@ -4,9 +4,9 @@
|
||||
|
||||
class SPIFFSEditor: public AsyncWebHandler {
|
||||
private:
|
||||
fs::FS _fs;
|
||||
mutable fs::FS _fs;
|
||||
String _username;
|
||||
String _password;
|
||||
String _password;
|
||||
bool _authenticated;
|
||||
uint32_t _startTime;
|
||||
public:
|
||||
@@ -15,10 +15,10 @@ class SPIFFSEditor: public AsyncWebHandler {
|
||||
#else
|
||||
SPIFFSEditor(const String& username=String(), const String& password=String(), const fs::FS& fs=SPIFFS);
|
||||
#endif
|
||||
virtual bool canHandle(AsyncWebServerRequest *request) override final;
|
||||
virtual bool canHandle(AsyncWebServerRequest* request) const override final;
|
||||
virtual void handleRequest(AsyncWebServerRequest *request) override final;
|
||||
virtual void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) override final;
|
||||
virtual bool isRequestHandlerTrivial() override final {return false;}
|
||||
virtual bool isRequestHandlerTrivial() const override final {return false;}
|
||||
virtual String listFilesRecursively(String path, bool recursive = false);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <Arduino.h>
|
||||
#include <LittleFS.h>
|
||||
#include <TFT_eSPI.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "makeimage.h"
|
||||
#include "tag_db.h"
|
||||
@@ -19,9 +20,9 @@ void checkVars();
|
||||
void drawNew(const uint8_t mac[8], tagRecord *&taginfo);
|
||||
bool updateTagImage(String &filename, const uint8_t *dst, uint16_t nextCheckin, tagRecord *&taginfo, imgParam &imageParams);
|
||||
void drawString(TFT_eSprite &spr, String content, int16_t posx, int16_t posy, String font, byte align = 0, uint16_t color = TFT_BLACK, uint16_t size = 30, uint16_t bgcolor = TFT_WHITE);
|
||||
void drawTextBox(TFT_eSprite &spr, String &content, int16_t &posx, int16_t &posy, int16_t boxwidth, int16_t boxheight, String font, uint16_t color = TFT_BLACK, uint16_t bgcolor = TFT_WHITE, float lineheight = 1);
|
||||
void drawTextBox(TFT_eSprite &spr, String &content, int16_t &posx, int16_t &posy, int16_t boxwidth, int16_t boxheight, String font, uint16_t color = TFT_BLACK, uint16_t bgcolor = TFT_WHITE, float lineheight = 1, byte align = TL_DATUM);
|
||||
void initSprite(TFT_eSprite &spr, int w, int h, imgParam &imageParams);
|
||||
void drawDate(String &filename, tagRecord *&taginfo, imgParam &imageParams);
|
||||
void drawDate(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgParam &imageParams);
|
||||
void drawNumber(String &filename, int32_t count, int32_t thresholdred, tagRecord *&taginfo, imgParam &imageParams);
|
||||
void drawWeather(String &filename, JsonObject &cfgobj, const tagRecord *taginfo, imgParam &imageParams);
|
||||
void drawForecast(String &filename, JsonObject &cfgobj, const tagRecord *taginfo, imgParam &imageParams);
|
||||
@@ -48,4 +49,5 @@ void getLocation(JsonObject &cfgobj);
|
||||
void prepareNFCReq(const uint8_t *dst, const char *url);
|
||||
void prepareLUTreq(const uint8_t *dst, const String &input);
|
||||
void prepareConfigFile(const uint8_t *dst, const JsonObject &config);
|
||||
void prepareTIME_RAW(const uint8_t *dst, time_t now);
|
||||
void getTemplate(JsonDocument &json, const uint8_t id, const uint8_t hwtype);
|
||||
|
||||
@@ -1,4 +1,20 @@
|
||||
#include <Arduino.h>
|
||||
#include <LittleFS.h>
|
||||
|
||||
bool doC6flash(uint8_t doDownload);
|
||||
#if defined HAS_H2
|
||||
#define SHORT_CHIP_NAME "H2"
|
||||
#define OTA_BIN_DIR "ESP32-H2"
|
||||
#define ESP_CHIP_TYPE ESP32H2_CHIP
|
||||
#elif defined HAS_TSLR
|
||||
#define SHORT_CHIP_NAME "TSLR"
|
||||
#elif defined HAS_ELECROW_C6
|
||||
#define SHORT_CHIP_NAME "ELECROW_C6"
|
||||
#define OTA_BIN_DIR "ESP32-C6"
|
||||
#define ESP_CHIP_TYPE ESP32C6_CHIP
|
||||
#elif defined C6_OTA_FLASHING
|
||||
#define SHORT_CHIP_NAME "C6"
|
||||
#define OTA_BIN_DIR "ESP32-C6"
|
||||
#define ESP_CHIP_TYPE ESP32C6_CHIP
|
||||
#endif
|
||||
|
||||
bool FlashC6_H2(const char *Url);
|
||||
|
||||
@@ -93,6 +93,46 @@ extern Arduino_RGB_Display *gfx;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAS_4inch_TPANEL
|
||||
|
||||
#define LV_ATTRIBUTE_TICK_INC IRAM_ATTR
|
||||
#define TOUCH_MODULES_CST_MUTUAL
|
||||
|
||||
// esp32-4848S040
|
||||
#define LCD_WIDTH 480
|
||||
#define LCD_HEIGHT 480
|
||||
#define LCD_VSYNC 17
|
||||
#define LCD_HSYNC 16
|
||||
#define LCD_PCLK 21
|
||||
#define LCD_R0 0
|
||||
#define LCD_R1 11
|
||||
#define LCD_R2 12
|
||||
#define LCD_R3 13
|
||||
#define LCD_R4 14
|
||||
#define LCD_G0 8
|
||||
#define LCD_G1 20
|
||||
#define LCD_G2 3
|
||||
#define LCD_G3 46
|
||||
#define LCD_G4 9
|
||||
#define LCD_G5 10
|
||||
#define LCD_B0 15
|
||||
#define LCD_B1 4
|
||||
#define LCD_B2 5
|
||||
#define LCD_B3 6
|
||||
#define LCD_B4 7
|
||||
#define LCD_BL 38
|
||||
#define LCD_DE 18
|
||||
|
||||
#define SPI_LCD_CS 39
|
||||
#define SPI_LCD_SCLK 48
|
||||
#define SPI_LCD_MOSI 47
|
||||
|
||||
#include "Arduino_GFX_Library.h"
|
||||
|
||||
extern Arduino_RGB_Display *gfx;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAS_TFT
|
||||
|
||||
extern TFT_eSPI tft2;
|
||||
|
||||
@@ -26,6 +26,7 @@ const uint8_t PROGMEM gamma8[] = {
|
||||
void ledTask(void* parameter);
|
||||
void setBrightness(int brightness);
|
||||
void updateBrightnessFromConfig();
|
||||
void ledcSet(uint8_t channel, uint8_t brightness);
|
||||
|
||||
#ifdef HAS_RGB_LED
|
||||
extern CRGB rgbIdleColor;
|
||||
@@ -34,7 +35,6 @@ void shortBlink(CRGB cname);
|
||||
void showColorPattern(CRGB colorone, CRGB colortwo, CRGB colorthree);
|
||||
void rgbIdle();
|
||||
void addFadeColor(CRGB cname);
|
||||
|
||||
#endif
|
||||
|
||||
void quickBlink(uint8_t repeat);
|
||||
|
||||
@@ -17,7 +17,6 @@ struct imgParam {
|
||||
bool hasRed;
|
||||
uint8_t dataType;
|
||||
uint8_t dither;
|
||||
// bool grayLut = false;
|
||||
uint8_t bufferbpp = 8;
|
||||
uint8_t rotate = 0;
|
||||
uint16_t highlightColor = 2;
|
||||
@@ -40,6 +39,7 @@ struct imgParam {
|
||||
|
||||
uint8_t zlib;
|
||||
uint8_t g5;
|
||||
uint8_t ts_option;
|
||||
};
|
||||
|
||||
void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams);
|
||||
|
||||
@@ -26,6 +26,7 @@ extern void processDataReq(struct espAvailDataReq* adr, bool local, IPAddress re
|
||||
extern void processTagReturnData(struct espTagReturnData* trd, uint8_t len, bool local);
|
||||
|
||||
extern bool sendTagCommand(const uint8_t* dst, uint8_t cmd, bool local, const uint8_t* payload = nullptr);
|
||||
bool sendTagMac(const uint8_t* dst, const uint64_t newmac, bool local);
|
||||
extern bool sendAPSegmentedData(const uint8_t* dst, String data, uint16_t icons, bool inverted, bool local);
|
||||
extern bool showAPSegmentedInfo(const uint8_t* dst, bool local);
|
||||
extern void updateTaginfoitem(struct TagInfo* taginfoitem, IPAddress remoteIP);
|
||||
|
||||
@@ -12,8 +12,8 @@ extern struct espSetChannelPower curChannel;
|
||||
#define AP_STATE_NORADIO 7
|
||||
|
||||
struct APInfoS {
|
||||
bool isOnline = false;
|
||||
uint8_t state = AP_STATE_OFFLINE;
|
||||
volatile bool isOnline = false;
|
||||
volatile uint8_t state = AP_STATE_OFFLINE;
|
||||
uint8_t type;
|
||||
uint16_t version = 0;
|
||||
uint8_t channel;
|
||||
@@ -29,6 +29,17 @@ struct APInfoS {
|
||||
|
||||
extern struct APInfoS apInfo;
|
||||
|
||||
enum ApSerialState {
|
||||
SERIAL_STATE_NONE,
|
||||
SERIAL_STATE_INITIALIZED,
|
||||
SERIAL_STATE_STARTING,
|
||||
SERIAL_STATE_RUNNING,
|
||||
SERIAL_STATE_STOP,
|
||||
SERIAL_STATE_STOPPED
|
||||
};
|
||||
|
||||
extern volatile ApSerialState gSerialTaskState;
|
||||
|
||||
void APTask(void* parameter);
|
||||
|
||||
bool sendCancelPending(struct pendingData* pending);
|
||||
@@ -38,5 +49,5 @@ void APEnterEarlyReset();
|
||||
bool sendChannelPower(struct espSetChannelPower* scp);
|
||||
void rxSerialTask2(void* parameter);
|
||||
void APTagReset();
|
||||
bool bringAPOnline();
|
||||
bool bringAPOnline(uint8_t newState = AP_STATE_ONLINE);
|
||||
void setAPstate(bool isOnline, uint8_t state);
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include "FS.h"
|
||||
|
||||
#ifdef HAS_SDCARD
|
||||
#ifndef SD_CARD_SDMMC
|
||||
|
||||
#ifndef SD_CARD_SS
|
||||
#error SD_CARD_SS UNDEFINED
|
||||
#endif
|
||||
@@ -18,6 +20,8 @@
|
||||
|
||||
#ifndef SD_CARD_MOSI
|
||||
#define SD_CARD_MOSI 23
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -36,7 +40,9 @@ class DynStorage {
|
||||
extern SemaphoreHandle_t fsMutex;
|
||||
extern DynStorage Storage;
|
||||
extern fs::FS *contentFS;
|
||||
#ifndef SD_CARD_ONLY
|
||||
extern void copyFile(File in, File out);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@ class nrfswd : protected swd {
|
||||
|
||||
uint8_t nrf_read_bank(uint32_t address, uint32_t buffer[], int size);
|
||||
uint8_t nrf_write_bank(uint32_t address, uint32_t buffer[], int size);
|
||||
uint8_t nrf_erase_all();
|
||||
uint8_t erase_all_flash();
|
||||
uint8_t erase_uicr();
|
||||
uint8_t erase_page(uint32_t page);
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#define WAKEUP_REASON_NFC 3
|
||||
#define WAKEUP_REASON_BUTTON1 4
|
||||
#define WAKEUP_REASON_BUTTON2 5
|
||||
#define WAKEUP_REASON_BUTTON3 6
|
||||
#define WAKEUP_REASON_FAILED_OTA_FW 0xE0
|
||||
#define WAKEUP_REASON_FIRSTBOOT 0xFC
|
||||
#define WAKEUP_REASON_NETWORK_SCAN 0xFD
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#define NO_SUBGHZ_CHANNEL 255
|
||||
class tagRecord {
|
||||
public:
|
||||
tagRecord() : mac{0}, version(0), alias(""), lastseen(0), nextupdate(0), contentMode(0), pendingCount(0), md5{0}, expectedNextCheckin(0), modeConfigJson(""), LQI(0), RSSI(0), temperature(0), batteryMv(0), hwType(0), wakeupReason(0), capabilities(0), lastfullupdate(0), isExternal(false), apIp(IPAddress(0, 0, 0, 0)), pendingIdle(0), hasCustomLUT(false), rotate(0), lut(0), tagSoftwareVersion(0), currentChannel(0), dataType(0), filename(""), data(nullptr), len(0), invert(0), updateCount(0), updateLast(0) {}
|
||||
tagRecord() : mac{0}, version(0), alias(""), lastseen(0), nextupdate(0), contentMode(0), pendingCount(0), md5{0}, expectedNextCheckin(0), modeConfigJson(""), LQI(0), RSSI(0), temperature(0), batteryMv(0), hwType(0), wakeupReason(0), capabilities(0), lastfullupdate(0), isExternal(false), apIp(IPAddress(0, 0, 0, 0)), pendingIdle(0), rotate(0), lut(0), tagSoftwareVersion(0), currentChannel(0), dataType(0), filename(""), data(nullptr), len(0), invert(0), updateCount(0), updateLast(0) {}
|
||||
|
||||
uint8_t mac[8];
|
||||
uint8_t version;
|
||||
@@ -38,7 +38,6 @@ class tagRecord {
|
||||
bool isExternal;
|
||||
IPAddress apIp;
|
||||
uint16_t pendingIdle;
|
||||
bool hasCustomLUT;
|
||||
uint8_t rotate;
|
||||
uint8_t lut;
|
||||
uint16_t tagSoftwareVersion;
|
||||
@@ -64,7 +63,7 @@ struct Config {
|
||||
uint8_t language;
|
||||
uint8_t maxsleep;
|
||||
uint8_t stopsleep;
|
||||
uint8_t runStatus;
|
||||
volatile uint8_t runStatus;
|
||||
uint8_t preview;
|
||||
uint8_t nightlyreboot;
|
||||
uint8_t lock;
|
||||
@@ -76,6 +75,7 @@ struct Config {
|
||||
uint8_t discovery;
|
||||
String repo;
|
||||
String env;
|
||||
uint8_t showtimestamp;
|
||||
};
|
||||
|
||||
struct Color {
|
||||
|
||||
@@ -16,7 +16,8 @@ enum WifiStatus {
|
||||
WAIT_CONNECTING,
|
||||
CONNECTED,
|
||||
WAIT_RECONNECT,
|
||||
AP
|
||||
AP,
|
||||
ETHERNET
|
||||
};
|
||||
|
||||
class WifiManager {
|
||||
@@ -41,6 +42,7 @@ class WifiManager {
|
||||
bool waitForConnection();
|
||||
void pollSerial();
|
||||
static void terminalLog(String text);
|
||||
static String buildHostname(esp_mac_type_t mac_type);
|
||||
|
||||
public:
|
||||
WifiManager();
|
||||
@@ -53,6 +55,8 @@ class WifiManager {
|
||||
void startManagementServer();
|
||||
void poll();
|
||||
static void WiFiEvent(WiFiEvent_t event);
|
||||
void initEth();
|
||||
IPAddress localIP();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
114
ESP32_AP-Flasher/lib2/gt911-touch/src/Touch_GT911.cpp
Normal file
114
ESP32_AP-Flasher/lib2/gt911-touch/src/Touch_GT911.cpp
Normal file
@@ -0,0 +1,114 @@
|
||||
#include "Arduino.h"
|
||||
#include <Touch_GT911.h>
|
||||
#include <Wire.h>
|
||||
|
||||
Touch_GT911::Touch_GT911(uint8_t _sda, uint8_t _scl, uint16_t _width, uint16_t _height) :
|
||||
pinSda(_sda), pinScl(_scl), width(_width), height(_height) {
|
||||
}
|
||||
TPoint::TPoint(void) {
|
||||
id = x = y = size = 0;
|
||||
}
|
||||
TPoint::TPoint(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _size) {
|
||||
id = _id;
|
||||
x = _x;
|
||||
y = _y;
|
||||
size = _size;
|
||||
}
|
||||
bool TPoint::operator==(TPoint point) {
|
||||
return ((point.x == x) && (point.y == y) && (point.size == size));
|
||||
}
|
||||
bool TPoint::operator!=(TPoint point) {
|
||||
return ((point.x != x) || (point.y != y) || (point.size != size));
|
||||
}
|
||||
void Touch_GT911::begin(uint8_t _addr) {
|
||||
addr = _addr;
|
||||
Wire.begin(pinSda, pinScl);
|
||||
}
|
||||
void Touch_GT911::calculateChecksum() {
|
||||
uint8_t checksum;
|
||||
for (uint8_t i=0; i<GT911_CONFIG_SIZE; i++) {
|
||||
checksum += configBuf[i];
|
||||
}
|
||||
checksum = (~checksum) + 1;
|
||||
configBuf[GT911_CONFIG_CHKSUM - GT911_CONFIG_START] = checksum;
|
||||
}
|
||||
void Touch_GT911::reConfig() {
|
||||
calculateChecksum();
|
||||
writeByteData(GT911_CONFIG_CHKSUM, configBuf[GT911_CONFIG_CHKSUM-GT911_CONFIG_START]);
|
||||
writeByteData(GT911_CONFIG_FRESH, 1);
|
||||
}
|
||||
void Touch_GT911::setResolution(uint16_t _width, uint16_t _height) {
|
||||
configBuf[GT911_X_OUTPUT_MAX_LOW - GT911_CONFIG_START] = lowByte(_width);
|
||||
configBuf[GT911_X_OUTPUT_MAX_HIGH - GT911_CONFIG_START] = highByte(_width);
|
||||
configBuf[GT911_Y_OUTPUT_MAX_LOW - GT911_CONFIG_START] = lowByte(_height);
|
||||
configBuf[GT911_Y_OUTPUT_MAX_HIGH - GT911_CONFIG_START] = highByte(_height);
|
||||
reConfig();
|
||||
}
|
||||
void Touch_GT911::read(void) {
|
||||
uint8_t data[7];
|
||||
uint8_t id;
|
||||
uint16_t x, y, size;
|
||||
|
||||
uint8_t pointInfo = readByteData(GT911_POINT_INFO);
|
||||
uint8_t bufferStatus = pointInfo >> 7 & 1;
|
||||
uint8_t proximityValid = pointInfo >> 5 & 1;
|
||||
uint8_t haveKey = pointInfo >> 4 & 1;
|
||||
isLargeDetect = pointInfo >> 6 & 1;
|
||||
touches = pointInfo & 0xF;
|
||||
isTouched = touches > 0;
|
||||
if (bufferStatus == 1 && isTouched) {
|
||||
for (uint8_t i=0; i<touches; i++) {
|
||||
readBlockData(data, GT911_POINT_1 + i * 8, 7);
|
||||
points[i] = readPoint(data);
|
||||
}
|
||||
}
|
||||
writeByteData(GT911_POINT_INFO, 0);
|
||||
}
|
||||
TPoint Touch_GT911::readPoint(uint8_t *data) {
|
||||
uint16_t temp;
|
||||
uint8_t id = data[0];
|
||||
uint16_t x = data[1] + (data[2] << 8);
|
||||
uint16_t y = data[3] + (data[4] << 8);
|
||||
uint16_t size = data[5] + (data[6] << 8);
|
||||
x = width - x;
|
||||
y = height - y;
|
||||
return TPoint(id, x, y, size);
|
||||
}
|
||||
void Touch_GT911::writeByteData(uint16_t reg, uint8_t val) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(highByte(reg));
|
||||
Wire.write(lowByte(reg));
|
||||
Wire.write(val);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
uint8_t Touch_GT911::readByteData(uint16_t reg) {
|
||||
uint8_t x;
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(highByte(reg));
|
||||
Wire.write(lowByte(reg));
|
||||
Wire.endTransmission();
|
||||
Wire.requestFrom(addr, (uint8_t)1);
|
||||
x = Wire.read();
|
||||
return x;
|
||||
}
|
||||
void Touch_GT911::writeBlockData(uint16_t reg, uint8_t *val, uint8_t size) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(highByte(reg));
|
||||
Wire.write(lowByte(reg));
|
||||
// Wire.write(val, size);
|
||||
for (uint8_t i=0; i<size; i++) {
|
||||
Wire.write(val[i]);
|
||||
}
|
||||
Wire.endTransmission();
|
||||
}
|
||||
void Touch_GT911::readBlockData(uint8_t *buf, uint16_t reg, uint8_t size) {
|
||||
Wire.beginTransmission(addr);
|
||||
Wire.write(highByte(reg));
|
||||
Wire.write(lowByte(reg));
|
||||
Wire.endTransmission();
|
||||
Wire.requestFrom(addr, size);
|
||||
for (uint8_t i=0; i<size; i++) {
|
||||
buf[i] = Wire.read();
|
||||
}
|
||||
}
|
||||
|
||||
116
ESP32_AP-Flasher/lib2/gt911-touch/src/Touch_GT911.h
Normal file
116
ESP32_AP-Flasher/lib2/gt911-touch/src/Touch_GT911.h
Normal file
@@ -0,0 +1,116 @@
|
||||
|
||||
#ifndef Touch_GT911_H
|
||||
#define Touch_GT911_H
|
||||
|
||||
#include "Arduino.h"
|
||||
#include <Wire.h>
|
||||
|
||||
#define GT911_ADDR1 (uint8_t)0x5D
|
||||
#define GT911_ADDR2 (uint8_t)0x14
|
||||
|
||||
// Real-time command (Write only)
|
||||
#define GT911_COMMAND (uint16_t)0x8040
|
||||
#define GT911_ESD_CHECK (uint16_t)0x8041
|
||||
#define GT911_COMMAND_CHECK (uint16_t)0x8046
|
||||
|
||||
#define GT911_STRETCH_R0 (uint16_t)0x805E
|
||||
#define GT911_STRETCH_R1 (uint16_t)0x805F
|
||||
#define GT911_STRETCH_R2 (uint16_t)0x8060
|
||||
#define GT911_STRETCH_RM (uint16_t)0x8061
|
||||
#define GT911_DRV_GROUPA_NUM (uint16_t)0x8062
|
||||
#define GT911_CONFIG_START (uint16_t)0x8047
|
||||
#define GT911_CONFIG_VERSION (uint16_t)0x8047
|
||||
#define GT911_X_OUTPUT_MAX_LOW (uint16_t)0x8048
|
||||
#define GT911_X_OUTPUT_MAX_HIGH (uint16_t)0x8049
|
||||
#define GT911_Y_OUTPUT_MAX_LOW (uint16_t)0x804A
|
||||
#define GT911_Y_OUTPUT_MAX_HIGH (uint16_t)0x804B
|
||||
#define GT911_TOUCH_NUMBER (uint16_t)0x804C
|
||||
#define GT911_MODULE_SWITCH_1 (uint16_t)0x804D
|
||||
#define GT911_MODULE_SWITCH_2 (uint16_t)0x804E
|
||||
#define GT911_SHAKE_COUNT (uint16_t)0x804F
|
||||
#define GT911_FILTER (uint16_t)0x8050
|
||||
#define GT911_LARGE_TOUCH (uint16_t)0x8051
|
||||
#define GT911_NOISE_REDUCTION (uint16_t)0x8052
|
||||
#define GT911_SCREEN_TOUCH_LEVEL (uint16_t)0x8053
|
||||
#define GT911_SCREEN_RELEASE_LEVEL (uint16_t)0x8054
|
||||
#define GT911_LOW_POWER_CONTROL (uint16_t)0x8055
|
||||
#define GT911_REFRESH_RATE (uint16_t)0x8056
|
||||
#define GT911_X_THRESHOLD (uint16_t)0x8057
|
||||
#define GT911_Y_THRESHOLD (uint16_t)0x8058
|
||||
#define GT911_SPACE_TOP_BOTTOM (uint16_t)0x805B
|
||||
#define GT911_PANEL_TX_GAIN (uint16_t)0x806B
|
||||
#define GT911_PANEL_RX_GAIN (uint16_t)0x806C
|
||||
#define GT911_PANEL_DUMP_SHIFT (uint16_t)0x806D
|
||||
#define GT911_DRV_FRAME_CONTROL (uint16_t)0x806E
|
||||
#define GT911_CHARGING_LEVEL_UP (uint16_t)0x806F
|
||||
#define GT911_MODULE_SWITCH3 (uint16_t)0x8070
|
||||
#define GT911_GESTURE_DIS (uint16_t)0X8071
|
||||
#define GT911_GESTURE_LONG_PRESS_TIME (uint16_t)0x8072
|
||||
#define GT911_X_Y_SLOPE_ADJUST (uint16_t)0X8073
|
||||
#define GT911_GESTURE_CONTROL (uint16_t)0X8074
|
||||
#define GT911_GESTURE_SWITCH1 (uint16_t)0X8075
|
||||
#define GT911_GESTURE_SWITCH2 (uint16_t)0X8076
|
||||
#define GT911_GESTURE_REFRESH_RATE (uint16_t)0x8077
|
||||
#define GT911_GESTURE_TOUCH_LEVEL (uint16_t)0x8078
|
||||
#define GT911_NEWGREENWAKEUPLEVEL (uint16_t)0x8079
|
||||
#define GT911_FREQ_HOPPING_START (uint16_t)0x807A
|
||||
#define GT911_CONFIG_CHKSUM (uint16_t)0X80FF
|
||||
#define GT911_CONFIG_FRESH (uint16_t)0X8100
|
||||
#define GT911_CONFIG_SIZE (uint16_t)0xFF-0x46
|
||||
// Coordinate information
|
||||
#define GT911_PRODUCT_ID (uint16_t)0X8140
|
||||
#define GT911_FIRMWARE_VERSION (uint16_t)0X8140
|
||||
#define GT911_RESOLUTION (uint16_t)0X8140
|
||||
#define GT911_VENDOR_ID (uint16_t)0X8140
|
||||
#define GT911_IMFORMATION (uint16_t)0X8140
|
||||
#define GT911_POINT_INFO (uint16_t)0X814E
|
||||
#define GT911_POINT_1 (uint16_t)0X814F
|
||||
#define GT911_POINT_2 (uint16_t)0X8157
|
||||
#define GT911_POINT_3 (uint16_t)0X815F
|
||||
#define GT911_POINT_4 (uint16_t)0X8167
|
||||
#define GT911_POINT_5 (uint16_t)0X816F
|
||||
#define GT911_POINTS_REG {GT911_POINT_1, GT911_POINT_2, GT911_POINT_3, GT911_POINT_4, GT911_POINT_5}
|
||||
|
||||
class TPoint {
|
||||
public:
|
||||
TPoint(void);
|
||||
TPoint(uint8_t id, uint16_t x, uint16_t y, uint16_t size);
|
||||
|
||||
bool operator==(TPoint);
|
||||
bool operator!=(TPoint);
|
||||
|
||||
uint8_t id;
|
||||
uint16_t x;
|
||||
uint16_t y;
|
||||
uint8_t size;
|
||||
};
|
||||
|
||||
class Touch_GT911 {
|
||||
public:
|
||||
Touch_GT911(uint8_t _sda, uint8_t _scl,uint16_t _width, uint16_t _height);
|
||||
void begin(uint8_t _addr=GT911_ADDR1);
|
||||
void setRotation(uint8_t rot);
|
||||
void setResolution(uint16_t _width, uint16_t _height);
|
||||
uint8_t getGesture(void);
|
||||
void read(void);
|
||||
uint8_t isLargeDetect;
|
||||
uint8_t touches = 0;
|
||||
bool isTouched = false;
|
||||
TPoint points[5];
|
||||
private:
|
||||
void calculateChecksum();
|
||||
void reConfig();
|
||||
TPoint readPoint(uint8_t *data);
|
||||
void writeByteData(uint16_t reg, uint8_t val);
|
||||
uint8_t readByteData(uint16_t reg);
|
||||
void writeBlockData(uint16_t reg, uint8_t *val, uint8_t size);
|
||||
void readBlockData(uint8_t *buf, uint16_t reg, uint8_t size);
|
||||
uint8_t addr;
|
||||
uint8_t pinSda;
|
||||
uint8_t pinScl;
|
||||
uint16_t width;
|
||||
uint16_t height;
|
||||
uint8_t configBuf[GT911_CONFIG_SIZE];
|
||||
};
|
||||
|
||||
#endif // Touch_GT911_H
|
||||
File diff suppressed because it is too large
Load Diff
23
ESP32_AP-Flasher/prepare_sdcard.sh
Executable file
23
ESP32_AP-Flasher/prepare_sdcard.sh
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
if [[ -d $1 ]]; then
|
||||
rm -rf $1/*
|
||||
cp -r data/* $1
|
||||
rm $1/www/*
|
||||
cp -r wwwroot/* $1/www/
|
||||
cp ../binaries/ESP32-C6/firmware.json $1
|
||||
for f in bootloader partition-table OpenEPaperLink_esp32_C6
|
||||
do
|
||||
if [[ -e ../ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/build/bootloader/${f}.bin ]]; then
|
||||
cp ../ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/build/bootloader/${f}.bin $1
|
||||
else
|
||||
cp ../binaries/ESP32-C6/${f}.bin $1
|
||||
fi
|
||||
done
|
||||
mkdir $1/current
|
||||
echo "[[]]" > $1/current/tagDB.json
|
||||
echo "OK"
|
||||
else
|
||||
echo "$1 is not a directory"
|
||||
exit 1
|
||||
fi
|
||||
@@ -8,7 +8,7 @@ SPIFFSEditor::SPIFFSEditor(const fs::FS &fs, const String &username, const Strin
|
||||
: _fs(fs), _username(username), _password(password), _authenticated(false), _startTime(0) {
|
||||
}
|
||||
|
||||
bool SPIFFSEditor::canHandle(AsyncWebServerRequest *request) {
|
||||
bool SPIFFSEditor::canHandle(AsyncWebServerRequest *request) const {
|
||||
if (request->url().equalsIgnoreCase("/edit")) {
|
||||
if (request->method() == HTTP_GET) {
|
||||
if (request->hasParam("list")) {
|
||||
@@ -34,7 +34,6 @@ bool SPIFFSEditor::canHandle(AsyncWebServerRequest *request) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
request->addInterestingHeader("If-Modified-Since");
|
||||
return true;
|
||||
} else if (request->method() == HTTP_POST || request->method() == HTTP_DELETE || request->method() == HTTP_PUT) {
|
||||
return true;
|
||||
@@ -91,7 +90,7 @@ void SPIFFSEditor::handleRequest(AsyncWebServerRequest *request) {
|
||||
if (request->header("If-Modified-Since").equals(buildTime)) {
|
||||
request->send(304);
|
||||
} else {
|
||||
AsyncWebServerResponse *response = request->beginResponse(_fs, "/www/edit.html");
|
||||
AsyncWebServerResponse *response = request->beginResponse(_fs, "/www/edit.html", "text/html");
|
||||
response->addHeader("Last-Modified", buildTime);
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ uint8_t gicToOEPLtype(uint8_t gicType) {
|
||||
}
|
||||
}
|
||||
|
||||
struct BleAdvDataStruct {
|
||||
struct BleAdvDataStructV1 {
|
||||
uint16_t manu_id; // 0x1337 for us
|
||||
uint8_t version;
|
||||
uint16_t hw_type;
|
||||
@@ -73,6 +73,16 @@ struct BleAdvDataStruct {
|
||||
uint16_t battery_mv;
|
||||
uint8_t counter;
|
||||
} __packed;
|
||||
struct BleAdvDataStructV2 {
|
||||
uint16_t manu_id; // 0x1337 for us
|
||||
uint8_t version;
|
||||
uint16_t hw_type;
|
||||
uint16_t fw_version;
|
||||
uint16_t capabilities;
|
||||
uint16_t battery_mv;
|
||||
int8_t temperature;
|
||||
uint8_t counter;
|
||||
} __packed;
|
||||
|
||||
bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
|
||||
Serial.print("BLE Advertised Device found: ");
|
||||
@@ -91,11 +101,16 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
|
||||
uint8_t manuData[100];
|
||||
if (manuDatalen > sizeof(manuData))
|
||||
return false; // Manu data too big, could never happen but better make sure here
|
||||
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||
memcpy(&manuData, (uint8_t*)advertisedDevice.getManufacturerData().data(), manuDatalen);
|
||||
#else
|
||||
// [Nic] suggested fix for arduino 3.x by copilot, but I cannot test it
|
||||
memcpy(&manuData, (uint8_t*)advertisedDevice.getManufacturerData().c_str(), manuDatalen);
|
||||
#endif
|
||||
Serial.printf(" Address type: %02X Manu data: ", advertisedDevice.getAddressType());
|
||||
for (int i = 0; i < advertisedDevice.getManufacturerData().length(); i++)
|
||||
Serial.printf("%02X", manuData[i]);
|
||||
Serial.printf("\r\n");
|
||||
memcpy(&manuData, (uint8_t*)advertisedDevice.getManufacturerData().data(), manuDatalen);
|
||||
if (manuDatalen == 7 && manuData[0] == 0x53 && manuData[1] == 0x50) { // Lets check for a Gicisky E-Paper display
|
||||
|
||||
struct espAvailDataReq theAdvData;
|
||||
@@ -120,23 +135,63 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
|
||||
|
||||
processDataReq(&theAdvData, true);
|
||||
return true;
|
||||
} else if (manuDatalen >= sizeof(BleAdvDataStruct) && manuData[0] == 0x37 && manuData[1] == 0x13) { // Lets check for a Gicisky E-Paper display
|
||||
} else if (manuDatalen >= 3 && manuData[0] == 0x37 && manuData[1] == 0x13) { // Lets check for a Gicisky E-Paper display
|
||||
Serial.printf("ATC BLE OEPL Detected\r\n");
|
||||
struct espAvailDataReq theAdvData;
|
||||
struct BleAdvDataStruct inAdvData;
|
||||
|
||||
memset((uint8_t*)&theAdvData, 0x00, sizeof(espAvailDataReq));
|
||||
memcpy(&inAdvData, manuData, sizeof(BleAdvDataStruct));
|
||||
/*Serial.printf("manu_id %04X\r\n", inAdvData.manu_id);
|
||||
Serial.printf("version %04X\r\n", inAdvData.version);
|
||||
Serial.printf("hw_type %04X\r\n", inAdvData.hw_type);
|
||||
Serial.printf("fw_version %04X\r\n", inAdvData.fw_version);
|
||||
Serial.printf("capabilities %04X\r\n", inAdvData.capabilities);
|
||||
Serial.printf("battery_mv %u\r\n", inAdvData.battery_mv);
|
||||
Serial.printf("counter %u\r\n", inAdvData.counter);*/
|
||||
if (inAdvData.version != 1) {
|
||||
printf("Version currently not supported!\r\n");
|
||||
return false;
|
||||
uint8_t versionAdvData = manuData[2];
|
||||
|
||||
switch (versionAdvData) {
|
||||
case 1: {
|
||||
if (manuDatalen >= sizeof(BleAdvDataStructV1)) {
|
||||
struct BleAdvDataStructV1 inAdvData;
|
||||
memcpy(&inAdvData, manuData, sizeof(BleAdvDataStructV1));
|
||||
printf("Version 1 ATC_BLE_OEPL Received\r\n");
|
||||
/*Serial.printf("manu_id %04X\r\n", inAdvData.manu_id);
|
||||
Serial.printf("version %02X\r\n", inAdvData.version);
|
||||
Serial.printf("hw_type %04X\r\n", inAdvData.hw_type);
|
||||
Serial.printf("fw_version %04X\r\n", inAdvData.fw_version);
|
||||
Serial.printf("capabilities %04X\r\n", inAdvData.capabilities);
|
||||
Serial.printf("battery_mv %u\r\n", inAdvData.battery_mv);
|
||||
Serial.printf("counter %u\r\n", inAdvData.counter);*/
|
||||
theAdvData.adr.batteryMv = inAdvData.battery_mv;
|
||||
theAdvData.adr.lastPacketRSSI = advertisedDevice.getRSSI();
|
||||
theAdvData.adr.hwType = inAdvData.hw_type & 0xff;
|
||||
theAdvData.adr.tagSoftwareVersion = inAdvData.fw_version;
|
||||
theAdvData.adr.capabilities = inAdvData.capabilities & 0xff;
|
||||
} else {
|
||||
printf("Version 1 data length incorrect!\r\n");
|
||||
return false;
|
||||
}
|
||||
} break;
|
||||
case 2: {
|
||||
if (manuDatalen >= sizeof(BleAdvDataStructV2)) {
|
||||
struct BleAdvDataStructV2 inAdvData;
|
||||
memcpy(&inAdvData, manuData, sizeof(BleAdvDataStructV2));
|
||||
printf("Version 2 ATC_BLE_OEPL Received\r\n");
|
||||
/*Serial.printf("manu_id %04X\r\n", inAdvData.manu_id);
|
||||
Serial.printf("version %02X\r\n", inAdvData.version);
|
||||
Serial.printf("hw_type %04X\r\n", inAdvData.hw_type);
|
||||
Serial.printf("fw_version %04X\r\n", inAdvData.fw_version);
|
||||
Serial.printf("capabilities %04X\r\n", inAdvData.capabilities);
|
||||
Serial.printf("battery_mv %u\r\n", inAdvData.battery_mv);
|
||||
Serial.printf("temperature %i\r\n", inAdvData.temperature);
|
||||
Serial.printf("counter %u\r\n", inAdvData.counter);*/
|
||||
theAdvData.adr.batteryMv = inAdvData.battery_mv;
|
||||
theAdvData.adr.temperature = inAdvData.temperature;
|
||||
theAdvData.adr.lastPacketRSSI = advertisedDevice.getRSSI();
|
||||
theAdvData.adr.hwType = inAdvData.hw_type & 0xff;
|
||||
theAdvData.adr.tagSoftwareVersion = inAdvData.fw_version;
|
||||
theAdvData.adr.capabilities = inAdvData.capabilities & 0xff;
|
||||
} else {
|
||||
printf("Version 2 data length incorrect!\r\n");
|
||||
return false;
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
printf("Version %02X currently not supported!\r\n", versionAdvData);
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
uint8_t macReversed[6];
|
||||
memcpy(&macReversed, (uint8_t*)advertisedDevice.getAddress().getNative(), 6);
|
||||
@@ -148,11 +203,6 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
|
||||
theAdvData.src[5] = macReversed[0];
|
||||
theAdvData.src[6] = manuData[0]; // We use this do find out what type of display we got for compression^^
|
||||
theAdvData.src[7] = manuData[1];
|
||||
theAdvData.adr.batteryMv = inAdvData.battery_mv;
|
||||
theAdvData.adr.lastPacketRSSI = advertisedDevice.getRSSI();
|
||||
theAdvData.adr.hwType = inAdvData.hw_type & 0xff;
|
||||
theAdvData.adr.tagSoftwareVersion = inAdvData.fw_version;
|
||||
theAdvData.adr.capabilities = inAdvData.capabilities & 0xff;
|
||||
processDataReq(&theAdvData, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,14 @@
|
||||
#include "storage.h"
|
||||
#include "tag_db.h"
|
||||
#include "web.h"
|
||||
#include "espflasher.h"
|
||||
#include "util.h"
|
||||
|
||||
#define LOG(format, ... ) Serial.printf(format,## __VA_ARGS__)
|
||||
|
||||
#ifndef FLASHER_DEBUG_PORT
|
||||
#define FLASHER_DEBUG_PORT 2
|
||||
#endif
|
||||
|
||||
esp_loader_error_t connect_to_target(uint32_t higher_transmission_rate) {
|
||||
esp_loader_connect_args_t connect_config = ESP_LOADER_CONNECT_DEFAULT();
|
||||
@@ -120,150 +128,197 @@ esp_loader_error_t flash_binary(String &file_path, size_t address) {
|
||||
|
||||
bool downloadAndWriteBinary(String &filename, const char *url) {
|
||||
HTTPClient binaryHttp;
|
||||
Serial.println(url);
|
||||
bool Ret = false;
|
||||
bool bHaveFsMutex = false;
|
||||
|
||||
LOG("downloadAndWriteBinary: url %s\n",url);
|
||||
binaryHttp.begin(url);
|
||||
binaryHttp.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS);
|
||||
int binaryResponseCode = binaryHttp.GET();
|
||||
Serial.println(binaryResponseCode);
|
||||
if (binaryResponseCode == HTTP_CODE_OK) {
|
||||
do {
|
||||
int binaryResponseCode = binaryHttp.GET();
|
||||
if(binaryResponseCode != HTTP_CODE_OK) {
|
||||
wsSerial("http error " + String(binaryResponseCode) + " fetching " + String(url));
|
||||
break;
|
||||
}
|
||||
int contentLength = binaryHttp.getSize();
|
||||
Serial.println(contentLength);
|
||||
LOG("contentLength %d\r\n",contentLength);
|
||||
if(contentLength < 0) {
|
||||
wsSerial("Couldn't get contentLength");
|
||||
break;
|
||||
}
|
||||
xSemaphoreTake(fsMutex, portMAX_DELAY);
|
||||
bHaveFsMutex = true;
|
||||
File file = contentFS->open(filename, "wb");
|
||||
if (file) {
|
||||
wsSerial("downloading " + String(filename));
|
||||
WiFiClient *stream = binaryHttp.getStreamPtr();
|
||||
uint8_t buffer[1024];
|
||||
size_t totalBytesRead = 0;
|
||||
time_t timeOut = millis() + 5000;
|
||||
// while (stream->available()) {
|
||||
while (millis() < timeOut) {
|
||||
size_t bytesRead = stream->readBytes(buffer, sizeof(buffer));
|
||||
if(!file) {
|
||||
wsSerial("file open error " + String(filename));
|
||||
break;
|
||||
}
|
||||
wsSerial("downloading " + String(filename));
|
||||
WiFiClient *stream = binaryHttp.getStreamPtr();
|
||||
uint8_t buffer[1024];
|
||||
size_t totalBytesRead = 0;
|
||||
// timeout if we don't average at least 1k bytes/second
|
||||
unsigned long timeOut = millis() + contentLength;
|
||||
while(stream->connected() && totalBytesRead < contentLength) {
|
||||
size_t bytesRead;
|
||||
size_t bytesToRead;
|
||||
if(stream->available()) {
|
||||
bytesToRead = min(sizeof(buffer), (size_t) stream->available());
|
||||
bytesRead = stream->readBytes(buffer, bytesToRead);
|
||||
if(bytesRead == 0 || millis() > timeOut) {
|
||||
wsSerial("Download time out");
|
||||
break;
|
||||
}
|
||||
file.write(buffer, bytesRead);
|
||||
totalBytesRead += bytesRead;
|
||||
if (totalBytesRead == contentLength) break;
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
} else {
|
||||
vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||
}
|
||||
file.close();
|
||||
xSemaphoreGive(fsMutex);
|
||||
binaryHttp.end();
|
||||
|
||||
file = contentFS->open(filename, "r");
|
||||
if (file) {
|
||||
if (totalBytesRead == contentLength || (contentLength == 0 && file.size() > 0)) {
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
wsSerial("Download failed, " + String(file.size()) + " bytes");
|
||||
file.close();
|
||||
}
|
||||
} else {
|
||||
xSemaphoreGive(fsMutex);
|
||||
wsSerial("file open error " + String(filename));
|
||||
}
|
||||
} else {
|
||||
wsSerial("http error " + String(binaryResponseCode) + " fetching " + String(url));
|
||||
}
|
||||
file.close();
|
||||
|
||||
if(!stream->connected()) {
|
||||
wsSerial("Connection dropped during transfer");
|
||||
break;
|
||||
}
|
||||
file = contentFS->open(filename, "r");
|
||||
if(!file) {
|
||||
wsSerial("file open error " + String(filename));
|
||||
break;
|
||||
}
|
||||
if(file.size() == contentLength) {
|
||||
Ret = true;
|
||||
} else {
|
||||
wsSerial("Download failed, " + String(file.size()) + " bytes");
|
||||
}
|
||||
file.close();
|
||||
} while(false);
|
||||
binaryHttp.setReuse(false);
|
||||
binaryHttp.end();
|
||||
return false;
|
||||
if(bHaveFsMutex) {
|
||||
xSemaphoreGive(fsMutex);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
bool doC6flash(uint8_t doDownload) {
|
||||
String filenameFirmwareLocal = "/firmware.json";
|
||||
DynamicJsonDocument jsonDoc(1024);
|
||||
if (doDownload) {
|
||||
const String githubUrl = "https://raw.githubusercontent.com/" + config.repo + "/master/binaries/ESP32-C6/firmware.json";
|
||||
if (downloadAndWriteBinary(filenameFirmwareLocal, githubUrl.c_str())) {
|
||||
File readfile = contentFS->open(filenameFirmwareLocal, "r");
|
||||
if (!readfile) {
|
||||
Serial.println("load firmware.json: Failed to open file");
|
||||
return false;
|
||||
}
|
||||
DeserializationError jsonError = deserializeJson(jsonDoc, readfile);
|
||||
bool FlashC6_H2(const char *RepoUrl) {
|
||||
String JsonFilename = "/firmware_" SHORT_CHIP_NAME ".json" ;
|
||||
bool Ret = false;
|
||||
bool bLoaderInit = false;
|
||||
bool bDownload = strlen(RepoUrl) > 0;
|
||||
int retry;
|
||||
JsonDocument jsonDoc;
|
||||
|
||||
if (!jsonError) {
|
||||
JsonArray jsonArray = jsonDoc.as<JsonArray>();
|
||||
for (JsonObject obj : jsonArray) {
|
||||
String filename = "/" + obj["filename"].as<String>();
|
||||
// String binaryUrl = "https://raw.githubusercontent.com/" + config.repo + "/master/binaries/ESP32-C6" + String(filename);
|
||||
String binaryUrl = "http://www.openepaperlink.eu/binaries/ESP32-C6" + String(filename);
|
||||
for (int retry = 0; retry < 10; retry++) {
|
||||
if (downloadAndWriteBinary(filename, binaryUrl.c_str())) {
|
||||
break;
|
||||
}
|
||||
wsSerial("Retry " + String(retry));
|
||||
if (retry < 9) {
|
||||
delay(1000);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
wsSerial("json error fetching " + String(githubUrl));
|
||||
return false;
|
||||
LOG("%s#%d: ",__FUNCTION__,__LINE__); util::printHeap();
|
||||
|
||||
do {
|
||||
if(bDownload) {
|
||||
String FileUrl = RepoUrl + JsonFilename;
|
||||
if(!downloadAndWriteBinary(JsonFilename, FileUrl.c_str())) {
|
||||
LOG("%s#%d: ",__FUNCTION__,__LINE__); util::printHeap();
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
File readfile = contentFS->open(filenameFirmwareLocal, "r");
|
||||
if (!readfile) {
|
||||
Serial.println("load local firmware.json: Failed to open file");
|
||||
return false;
|
||||
|
||||
File readfile = contentFS->open(JsonFilename, "r");
|
||||
if(!readfile) {
|
||||
wsSerial("load " + JsonFilename + ": Failed to open file");
|
||||
return true;
|
||||
}
|
||||
DeserializationError jsonError = deserializeJson(jsonDoc, readfile);
|
||||
}
|
||||
|
||||
const loader_esp32_config_t config = {
|
||||
.baud_rate = 115200,
|
||||
.uart_port = 2,
|
||||
.uart_rx_pin = FLASHER_DEBUG_TXD,
|
||||
.uart_tx_pin = FLASHER_DEBUG_RXD,
|
||||
.reset_trigger_pin = FLASHER_AP_RESET,
|
||||
.gpio0_trigger_pin = FLASHER_DEBUG_PROG,
|
||||
};
|
||||
if(jsonError) {
|
||||
wsSerial(String("json error parsing") + JsonFilename);
|
||||
break;
|
||||
}
|
||||
|
||||
if (loader_port_esp32_init(&config) != ESP_LOADER_SUCCESS) {
|
||||
wsSerial("Serial initialization failed");
|
||||
loader_port_esp32_deinit();
|
||||
return false;
|
||||
}
|
||||
if(!bDownload) {
|
||||
Ret = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (connect_to_target(115200) == ESP_LOADER_SUCCESS) {
|
||||
if (esp_loader_get_target() == ESP32C6_CHIP) {
|
||||
wsSerial("Connected to ESP32-C6");
|
||||
int maxRetries = 5;
|
||||
esp_loader_error_t err;
|
||||
JsonArray jsonArray = jsonDoc.as<JsonArray>();
|
||||
for(JsonObject obj : jsonArray) {
|
||||
String filename = "/" + obj["filename"].as<String>();
|
||||
String binaryUrl = RepoUrl + filename;
|
||||
|
||||
JsonArray jsonArray = jsonDoc.as<JsonArray>();
|
||||
for (JsonObject obj : jsonArray) {
|
||||
String filename = "/" + obj["filename"].as<String>();
|
||||
const char *addressStr = obj["address"];
|
||||
uint32_t address = strtoul(addressStr, NULL, 16);
|
||||
|
||||
for (int retry = 0; retry < maxRetries; retry++) {
|
||||
err = flash_binary(filename, address);
|
||||
if (err == ESP_LOADER_SUCCESS) break;
|
||||
Serial.printf("Flash failed with error %d. Retrying...\n", err);
|
||||
for(retry = 0; retry < 10; retry++) {
|
||||
if(downloadAndWriteBinary(filename, binaryUrl.c_str())) {
|
||||
break;
|
||||
}
|
||||
wsSerial("Retry " + String(retry));
|
||||
if(retry < 9) {
|
||||
delay(1000);
|
||||
}
|
||||
if (err != ESP_LOADER_SUCCESS) {
|
||||
loader_port_esp32_deinit();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Serial.println("Done!");
|
||||
} else {
|
||||
wsSerial("Connected to wrong ESP32 type");
|
||||
loader_port_esp32_deinit();
|
||||
return false;
|
||||
if(retry == 10) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
wsSerial("Connection to the C6 failed");
|
||||
if(retry < 10) {
|
||||
Ret = true;
|
||||
}
|
||||
} while(false);
|
||||
|
||||
if(Ret == true) do {
|
||||
Ret = false;
|
||||
const loader_esp32_config_t config = {
|
||||
.baud_rate = 115200,
|
||||
.uart_port = FLASHER_DEBUG_PORT,
|
||||
.uart_rx_pin = FLASHER_DEBUG_TXD,
|
||||
.uart_tx_pin = FLASHER_DEBUG_RXD,
|
||||
.reset_trigger_pin = FLASHER_AP_RESET,
|
||||
.gpio0_trigger_pin = FLASHER_DEBUG_PROG,
|
||||
};
|
||||
|
||||
bLoaderInit = true;
|
||||
if(loader_port_esp32_init(&config) != ESP_LOADER_SUCCESS) {
|
||||
wsSerial("Serial initialization failed");
|
||||
break;
|
||||
}
|
||||
|
||||
if(connect_to_target(115200) != ESP_LOADER_SUCCESS) {
|
||||
wsSerial("Connection to the " SHORT_CHIP_NAME " failed");
|
||||
break;
|
||||
}
|
||||
|
||||
if(esp_loader_get_target() != ESP_CHIP_TYPE) {
|
||||
wsSerial("Connected to wrong ESP32 type");
|
||||
break;
|
||||
}
|
||||
wsSerial("Connected to ESP32-" SHORT_CHIP_NAME);
|
||||
int maxRetries = 5;
|
||||
esp_loader_error_t err;
|
||||
|
||||
JsonArray jsonArray = jsonDoc.as<JsonArray>();
|
||||
for(JsonObject obj : jsonArray) {
|
||||
String filename = "/" + obj["filename"].as<String>();
|
||||
const char *addressStr = obj["address"];
|
||||
uint32_t address = strtoul(addressStr, NULL, 16);
|
||||
|
||||
for(int retry = 0; retry < maxRetries; retry++) {
|
||||
err = flash_binary(filename, address);
|
||||
if(err == ESP_LOADER_SUCCESS) {
|
||||
Ret = true;
|
||||
break;
|
||||
}
|
||||
Serial.printf("Flash failed with error %d. Retrying...\n", err);
|
||||
delay(1000);
|
||||
}
|
||||
if(err != ESP_LOADER_SUCCESS) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
Serial.println("Done!");
|
||||
} while(false);
|
||||
|
||||
if(bLoaderInit) {
|
||||
loader_port_esp32_deinit();
|
||||
return false;
|
||||
}
|
||||
loader_port_esp32_deinit();
|
||||
return true;
|
||||
|
||||
LOG("%s#%d: ",__FUNCTION__,__LINE__); util::printHeap();
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "storage.h"
|
||||
#include "time.h"
|
||||
#include "zbs_interface.h"
|
||||
#include <WiFi.h>
|
||||
|
||||
#ifdef HAS_EXT_FLASHER
|
||||
#include "webflasher.h"
|
||||
@@ -178,7 +179,7 @@ bool flasher::getInfoBlockType() {
|
||||
}
|
||||
|
||||
bool flasher::findTagByMD5() {
|
||||
DynamicJsonDocument doc(3000);
|
||||
JsonDocument doc;
|
||||
fs::File readfile = contentFS->open("/tag_md5_db.json", "r");
|
||||
DeserializationError err = deserializeJson(doc, readfile);
|
||||
if (!err) {
|
||||
@@ -207,7 +208,7 @@ bool flasher::findTagByMD5() {
|
||||
}
|
||||
|
||||
bool flasher::findTagByType(uint8_t type) {
|
||||
DynamicJsonDocument doc(3000);
|
||||
JsonDocument doc;
|
||||
fs::File readfile = contentFS->open("/tag_md5_db.json", "r");
|
||||
DeserializationError err = deserializeJson(doc, readfile);
|
||||
if (!err) {
|
||||
@@ -265,7 +266,7 @@ bool flasher::getFirmwareMac() {
|
||||
void flasher::getMacFromWiFi() {
|
||||
mac[0] = 0x00;
|
||||
mac[1] = 0x00;
|
||||
esp_read_mac(mac + 2, ESP_MAC_WIFI_SOFTAP);
|
||||
WiFi.softAPmacAddress(mac + 2);
|
||||
}
|
||||
|
||||
bool flasher::backupFlash() {
|
||||
@@ -447,7 +448,7 @@ bool flasher::writeFlashFromPackOffset(fs::File *file, uint16_t length) {
|
||||
}
|
||||
|
||||
bool flasher::writeFlashFromPack(String filename, uint8_t type) {
|
||||
DynamicJsonDocument doc(1024);
|
||||
JsonDocument doc;
|
||||
fs::File readfile = contentFS->open(filename, "r");
|
||||
DeserializationError err = deserializeJson(doc, readfile);
|
||||
if (!err) {
|
||||
@@ -507,7 +508,7 @@ bool flasher::writeBlock(uint16_t offset, uint8_t *data, uint16_t len, bool info
|
||||
|
||||
#ifndef C6_OTA_FLASHING
|
||||
uint16_t getAPUpdateVersion(uint8_t type) {
|
||||
StaticJsonDocument<512> doc;
|
||||
JsonDocument doc;
|
||||
fs::File readfile = contentFS->open("/AP_FW_Pack.bin", "r");
|
||||
DeserializationError err = deserializeJson(doc, readfile);
|
||||
if (!err) {
|
||||
|
||||
@@ -12,16 +12,21 @@
|
||||
#include "ips_display.h"
|
||||
|
||||
#define YELLOW_SENSE 8 // sense AP hardware
|
||||
|
||||
#ifdef HAS_ELECROW_ADV_2_8
|
||||
#define TFT_BACKLIGHT 38
|
||||
#else
|
||||
#define TFT_BACKLIGHT 14
|
||||
#endif
|
||||
|
||||
TFT_eSPI tft2 = TFT_eSPI();
|
||||
uint8_t YellowSense = 0;
|
||||
bool tftLogscreen = true;
|
||||
bool tftOverride = false;
|
||||
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
|
||||
#if defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL
|
||||
|
||||
#if defined HAS_LILYGO_TPANEL
|
||||
static const uint8_t st7701_type9_init_operations_lilygo[] = {
|
||||
|
||||
BEGIN_WRITE,
|
||||
@@ -41,14 +46,14 @@ static const uint8_t st7701_type9_init_operations_lilygo[] = {
|
||||
|
||||
WRITE_C8_D8, 0xCC, 0x10,
|
||||
|
||||
WRITE_COMMAND_8, 0xB0, // Positive Voltage Gamma Control
|
||||
WRITE_COMMAND_8, 0xB0, // Positive Voltage Gamma Control
|
||||
WRITE_BYTES, 16,
|
||||
0x00, 0x0F, 0x16, 0x0E,
|
||||
0x11, 0x07, 0x09, 0x09,
|
||||
0x08, 0x23, 0x05, 0x11,
|
||||
0x0F, 0x28, 0x2D, 0x18,
|
||||
|
||||
WRITE_COMMAND_8, 0xB1, // Negative Voltage Gamma Control
|
||||
WRITE_COMMAND_8, 0xB1, // Negative Voltage Gamma Control
|
||||
WRITE_BYTES, 16,
|
||||
0x00, 0x0F, 0x16, 0x0E,
|
||||
0x11, 0x07, 0x09, 0x08,
|
||||
@@ -142,7 +147,7 @@ static const uint8_t st7701_type9_init_operations_lilygo[] = {
|
||||
// WRITE_C8_D8, 0xD1, 0x81,//Test
|
||||
// WRITE_C8_D8, 0xD2, 0x08,//Test
|
||||
|
||||
WRITE_COMMAND_8, 0x29, // Display On
|
||||
WRITE_COMMAND_8, 0x29, // Display On
|
||||
|
||||
// WRITE_C8_D8, 0x35, 0x00,//Test
|
||||
// WRITE_C8_D8, 0xCE, 0x04,//Test
|
||||
@@ -152,41 +157,201 @@ static const uint8_t st7701_type9_init_operations_lilygo[] = {
|
||||
// 0xF0, 0xA3, 0xA3, 0x71,
|
||||
|
||||
END_WRITE};
|
||||
|
||||
Arduino_DataBus *bus = new Arduino_XL9535SWSPI(IIC_SDA /* SDA */, IIC_SCL /* SCL */, -1 /* XL PWD */,
|
||||
Arduino_DataBus* bus = new Arduino_XL9535SWSPI(IIC_SDA /* SDA */, IIC_SCL /* SCL */, -1 /* XL PWD */,
|
||||
XL95X5_CS /* XL CS */, XL95X5_SCLK /* XL SCK */, XL95X5_MOSI /* XL MOSI */);
|
||||
Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel(
|
||||
-1 /* DE */, LCD_VSYNC /* VSYNC */, LCD_HSYNC /* HSYNC */, LCD_PCLK /* PCLK */,
|
||||
LCD_B0 /* B0 */, LCD_B1 /* B1 */, LCD_B2 /* B2 */, LCD_B3 /* B3 */, LCD_B4 /* B4 */,
|
||||
LCD_G0 /* G0 */, LCD_G1 /* G1 */, LCD_G2 /* G2 */, LCD_G3 /* G3 */, LCD_G4 /* G4 */, LCD_G5 /* G5 */,
|
||||
LCD_R0 /* R0 */, LCD_R1 /* R1 */, LCD_R2 /* R2 */, LCD_R3 /* R3 */, LCD_R4 /* R4 */,
|
||||
1 /* hsync_polarity */, 20 /* hsync_front_porch */, 2 /* hsync_pulse_width */, 0 /* hsync_back_porch */,
|
||||
1 /* vsync_polarity */, 30 /* vsync_front_porch */, 8 /* vsync_pulse_width */, 1 /* vsync_back_porch */,
|
||||
10 /* pclk_active_neg */, 6000000L /* prefer_speed */, true /* useBigEndian */,
|
||||
0 /* de_idle_high*/, 0 /* pclk_idle_high */);
|
||||
Arduino_RGB_Display *gfx = new Arduino_RGB_Display(
|
||||
LCD_WIDTH /* width */, LCD_HEIGHT /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */,
|
||||
bus, -1 /* RST */, st7701_type9_init_operations_lilygo, sizeof(st7701_type9_init_operations_lilygo));
|
||||
Arduino_ESP32RGBPanel* rgbpanel = new Arduino_ESP32RGBPanel(
|
||||
-1 /* DE */, LCD_VSYNC /* VSYNC */, LCD_HSYNC /* HSYNC */, LCD_PCLK /* PCLK */,
|
||||
LCD_B0 /* B0 */, LCD_B1 /* B1 */, LCD_B2 /* B2 */, LCD_B3 /* B3 */, LCD_B4 /* B4 */,
|
||||
LCD_G0 /* G0 */, LCD_G1 /* G1 */, LCD_G2 /* G2 */, LCD_G3 /* G3 */, LCD_G4 /* G4 */, LCD_G5 /* G5 */,
|
||||
LCD_R0 /* R0 */, LCD_R1 /* R1 */, LCD_R2 /* R2 */, LCD_R3 /* R3 */, LCD_R4 /* R4 */,
|
||||
1 /* hsync_polarity */, 20 /* hsync_front_porch */, 2 /* hsync_pulse_width */, 0 /* hsync_back_porch */,
|
||||
1 /* vsync_polarity */, 30 /* vsync_front_porch */, 8 /* vsync_pulse_width */, 1 /* vsync_back_porch */,
|
||||
10 /* pclk_active_neg */, 6000000L /* prefer_speed */, true /* useBigEndian */,
|
||||
0 /* de_idle_high*/, 0 /* pclk_idle_high */);
|
||||
Arduino_RGB_Display* gfx = new Arduino_RGB_Display(
|
||||
LCD_WIDTH /* width */, LCD_HEIGHT /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */,
|
||||
bus, -1 /* RST */, st7701_type9_init_operations_lilygo, sizeof(st7701_type9_init_operations_lilygo));
|
||||
|
||||
#else
|
||||
static const uint8_t st7701_4848S040_init[] = {
|
||||
BEGIN_WRITE,
|
||||
WRITE_COMMAND_8, 0xFF,
|
||||
WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x10,
|
||||
|
||||
WRITE_C8_D16, 0xC0, 0x3B, 0x00,
|
||||
WRITE_C8_D16, 0xC1, 0x0D, 0x02,
|
||||
WRITE_C8_D16, 0xC2, 0x31, 0x05,
|
||||
WRITE_C8_D8, 0xCD, 0x00, // 0xCD, 0x08 !!
|
||||
|
||||
WRITE_COMMAND_8, 0xB0, // Positive Voltage Gamma Control
|
||||
WRITE_BYTES, 16,
|
||||
0x00, 0x11, 0x18, 0x0E, 0x11, 0x06, 0x07, 0x08,
|
||||
0x07, 0x22, 0x04, 0x12, 0x0F, 0xAA, 0x31, 0x18,
|
||||
|
||||
WRITE_COMMAND_8, 0xB1, // Negative Voltage Gamma Control
|
||||
WRITE_BYTES, 16,
|
||||
0x00, 0x11, 0x19, 0x0E, 0x12, 0x07, 0x08, 0x08,
|
||||
0x08, 0x22, 0x04, 0x11, 0x11, 0xA9, 0x32, 0x18,
|
||||
|
||||
// PAGE1
|
||||
WRITE_COMMAND_8, 0xFF,
|
||||
WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x11,
|
||||
|
||||
WRITE_C8_D8, 0xB0, 0x60, // Vop=4.7375v
|
||||
WRITE_C8_D8, 0xB1, 0x32, // VCOM=32
|
||||
WRITE_C8_D8, 0xB2, 0x07, // VGH=15v
|
||||
WRITE_C8_D8, 0xB3, 0x80,
|
||||
WRITE_C8_D8, 0xB5, 0x49, // VGL=-10.17v
|
||||
WRITE_C8_D8, 0xB7, 0x85,
|
||||
WRITE_C8_D8, 0xB8, 0x21, // AVDD=6.6 & AVCL=-4.6
|
||||
WRITE_C8_D8, 0xC1, 0x78,
|
||||
WRITE_C8_D8, 0xC2, 0x78,
|
||||
|
||||
WRITE_COMMAND_8, 0xE0,
|
||||
WRITE_BYTES, 3, 0x00, 0x1B, 0x02,
|
||||
|
||||
WRITE_COMMAND_8, 0xE1,
|
||||
WRITE_BYTES, 11,
|
||||
0x08, 0xA0, 0x00, 0x00,
|
||||
0x07, 0xA0, 0x00, 0x00,
|
||||
0x00, 0x44, 0x44,
|
||||
|
||||
WRITE_COMMAND_8, 0xE2,
|
||||
WRITE_BYTES, 12,
|
||||
0x11, 0x11, 0x44, 0x44,
|
||||
0xED, 0xA0, 0x00, 0x00,
|
||||
0xEC, 0xA0, 0x00, 0x00,
|
||||
|
||||
WRITE_COMMAND_8, 0xE3,
|
||||
WRITE_BYTES, 4, 0x00, 0x00, 0x11, 0x11,
|
||||
|
||||
WRITE_C8_D16, 0xE4, 0x44, 0x44,
|
||||
|
||||
WRITE_COMMAND_8, 0xE5,
|
||||
WRITE_BYTES, 16,
|
||||
0x0A, 0xE9, 0xD8, 0xA0, 0x0C, 0xEB, 0xD8, 0xA0,
|
||||
0x0E, 0xED, 0xD8, 0xA0, 0x10, 0xEF, 0xD8, 0xA0,
|
||||
|
||||
WRITE_COMMAND_8, 0xE6,
|
||||
WRITE_BYTES, 4, 0x00, 0x00, 0x11, 0x11,
|
||||
|
||||
WRITE_C8_D16, 0xE7, 0x44, 0x44,
|
||||
|
||||
WRITE_COMMAND_8, 0xE8,
|
||||
WRITE_BYTES, 16,
|
||||
0x09, 0xE8, 0xD8, 0xA0,
|
||||
0x0B, 0xEA, 0xD8, 0xA0,
|
||||
0x0D, 0xEC, 0xD8, 0xA0,
|
||||
0x0F, 0xEE, 0xD8, 0xA0,
|
||||
|
||||
WRITE_COMMAND_8, 0xEB,
|
||||
WRITE_BYTES, 7, 0x02, 0x00, 0xE4, 0xE4, 0x88, 0x00, 0x40,
|
||||
|
||||
WRITE_C8_D16, 0xEC, 0x3C, 0x00,
|
||||
|
||||
WRITE_COMMAND_8, 0xED,
|
||||
WRITE_BYTES, 16,
|
||||
0xAB, 0x89, 0x76, 0x54, 0x02, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0x20, 0x45, 0x67, 0x98, 0xBA,
|
||||
|
||||
//-----------VAP & VAN---------------
|
||||
WRITE_COMMAND_8, 0xFF,
|
||||
WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x13,
|
||||
|
||||
WRITE_C8_D8, 0xE5, 0xE4,
|
||||
|
||||
WRITE_COMMAND_8, 0xFF,
|
||||
WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x00,
|
||||
|
||||
// WRITE_COMMAND_8, 0x21, // 0x20 normal, 0x21 IPS !!
|
||||
WRITE_C8_D8, 0x3A, 0x50, // 0x70 RGB888, 0x60 RGB666, 0x50 RGB565
|
||||
WRITE_COMMAND_8, 0x11, // Sleep Out
|
||||
END_WRITE,
|
||||
|
||||
DELAY, 120,
|
||||
|
||||
BEGIN_WRITE,
|
||||
WRITE_COMMAND_8, 0x29, // Display On
|
||||
END_WRITE};
|
||||
Arduino_DataBus* bus = new Arduino_SWSPI(
|
||||
GFX_NOT_DEFINED /* DC */, SPI_LCD_CS /* CS */, SPI_LCD_SCLK /* SCK */, SPI_LCD_MOSI /* MOSI */, GFX_NOT_DEFINED /* MISO */);
|
||||
Arduino_ESP32RGBPanel* rgbpanel = new Arduino_ESP32RGBPanel(
|
||||
LCD_DE /* DE */, LCD_VSYNC /* VSYNC */, LCD_HSYNC /* HSYNC */, LCD_PCLK /* PCLK */,
|
||||
LCD_R0 /* B0 */, LCD_R1 /* B1 */, LCD_R2 /* B2 */, LCD_R3 /* B3 */, LCD_R4 /* B4 */,
|
||||
LCD_G0 /* G0 */, LCD_G1 /* G1 */, LCD_G2 /* G2 */, LCD_G3 /* G3 */, LCD_G4 /* G4 */, LCD_G5 /* G5 */,
|
||||
LCD_B0 /* R0 */, LCD_B1 /* R1 */, LCD_B2 /* R2 */, LCD_B3 /* R3 */, LCD_B4 /* R4 */,
|
||||
1 /* hsync_polarity */, 10 /* hsync_front_porch */, 8 /* hsync_pulse_width */, 50 /* hsync_back_porch */,
|
||||
1 /* vsync_polarity */, 10 /* vsync_front_porch */, 8 /* vsync_pulse_width */, 20 /* vsync_back_porch */,
|
||||
10 /* pclk_active_neg */, 6000000L /* prefer_speed */, true);
|
||||
Arduino_RGB_Display* gfx = new Arduino_RGB_Display(
|
||||
LCD_WIDTH /* width */, LCD_HEIGHT /* height */, rgbpanel, 0 /* rotation */, true /* auto_flush */,
|
||||
bus, -1 /* RST */, st7701_4848S040_init, sizeof(st7701_4848S040_init));
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined HAS_GT911_TOUCH
|
||||
#include <Wire.h>
|
||||
#include <Touch_GT911.h>
|
||||
#define TOUCH_GT911_SCL 45
|
||||
#define TOUCH_GT911_SDA 19
|
||||
int touch_last_x = 0, touch_last_y = 0;
|
||||
uint32_t last_touch_read = 0;
|
||||
uint8_t is_new_touch_checked = false;
|
||||
Touch_GT911 ts = Touch_GT911(TOUCH_GT911_SDA, TOUCH_GT911_SCL, max(480, 0), max(480, 0));
|
||||
|
||||
void touch_init()
|
||||
{
|
||||
ts.begin();
|
||||
}
|
||||
void touch_loop()
|
||||
{
|
||||
if (millis() - last_touch_read >= 50) {
|
||||
last_touch_read = millis();
|
||||
ts.read();
|
||||
if (ts.isTouched)
|
||||
{
|
||||
touch_last_x = map(ts.points[0].x, 480, 0, 0, 480 - 1);
|
||||
touch_last_y = map(ts.points[0].y, 480, 0, 0, 480 - 1);
|
||||
Serial.printf("Touch position X: %i Y: %i\r\n", touch_last_x, touch_last_y);
|
||||
if(is_new_touch_checked == false)
|
||||
{
|
||||
is_new_touch_checked = true;
|
||||
if(touch_last_x <= 240)
|
||||
sendAvail(WAKEUP_REASON_BUTTON1);
|
||||
else
|
||||
sendAvail(WAKEUP_REASON_BUTTON2);
|
||||
}
|
||||
}else{
|
||||
is_new_touch_checked = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
void touch_init()
|
||||
{
|
||||
}
|
||||
void touch_loop()
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
void TFTLog(String text) {
|
||||
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
#if defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL
|
||||
|
||||
gfx->setTextSize(2);
|
||||
|
||||
gfx->setTextSize(2);
|
||||
|
||||
if (tftLogscreen == false) {
|
||||
gfx->fillScreen(BLACK);
|
||||
gfx->setCursor(0, 0);
|
||||
tftLogscreen = true;
|
||||
}
|
||||
}
|
||||
if (text.isEmpty()) return;
|
||||
gfx->setTextColor(WHITE);
|
||||
gfx->println(text);
|
||||
|
||||
#else
|
||||
|
||||
|
||||
#else
|
||||
|
||||
if (tftLogscreen == false) {
|
||||
tft2.fillScreen(TFT_BLACK);
|
||||
tft2.setCursor(0, 0, (tft2.width() == 160 ? 1 : 2));
|
||||
@@ -220,7 +385,7 @@ void TFTLog(String text) {
|
||||
tft2.setTextColor(TFT_GREEN);
|
||||
}
|
||||
tft2.println(text);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
int32_t findId(uint8_t mac[8]) {
|
||||
@@ -240,11 +405,13 @@ void sendAvail(uint8_t wakeupReason) {
|
||||
memcpy(&eadr.src, mac, 6);
|
||||
eadr.adr.lastPacketRSSI = WiFi.RSSI();
|
||||
eadr.adr.currentChannel = config.channel;
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
#ifdef TFT_HW_TYPE
|
||||
eadr.adr.hwType = TFT_HW_TYPE;
|
||||
#elif defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL
|
||||
eadr.adr.hwType = 0xE2;
|
||||
#else
|
||||
#else
|
||||
eadr.adr.hwType = (tft2.width() == 160 ? 0xE1 : 0xE0);
|
||||
#endif
|
||||
#endif
|
||||
eadr.adr.wakeupReason = wakeupReason;
|
||||
eadr.adr.capabilities = 0;
|
||||
eadr.adr.tagSoftwareVersion = 0;
|
||||
@@ -253,50 +420,65 @@ void sendAvail(uint8_t wakeupReason) {
|
||||
}
|
||||
|
||||
void yellow_ap_display_init(void) {
|
||||
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
|
||||
tftLogscreen = true;
|
||||
#if defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL
|
||||
|
||||
tftLogscreen = true;
|
||||
|
||||
pinMode(LCD_BL, OUTPUT);
|
||||
digitalWrite(LCD_BL, HIGH);
|
||||
|
||||
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||
ledcAttachPin(LCD_BL, 1);
|
||||
ledcSetup(1, 1000, 8);
|
||||
ledcWrite(1, config.tft); // brightness
|
||||
#else
|
||||
ledcAttachChannel(LCD_BL, 1000, 8, 1);
|
||||
ledcWriteChannel(1, config.tft);
|
||||
#endif
|
||||
|
||||
ledcWrite(1, config.tft); // brightness
|
||||
|
||||
#if defined HAS_LILYGO_TPANEL
|
||||
Wire.begin(IIC_SDA, IIC_SCL);
|
||||
|
||||
#endif
|
||||
gfx->begin();
|
||||
gfx->fillScreen(BLACK);
|
||||
|
||||
#else
|
||||
|
||||
#else
|
||||
#ifdef HAS_ELECROW_C6
|
||||
YellowSense = 0;
|
||||
#else
|
||||
pinMode(YELLOW_SENSE, INPUT_PULLDOWN);
|
||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||
if (digitalRead(YELLOW_SENSE) == HIGH) YellowSense = 1;
|
||||
#endif
|
||||
pinMode(TFT_BACKLIGHT, OUTPUT);
|
||||
digitalWrite(TFT_BACKLIGHT, LOW);
|
||||
|
||||
tft2.init();
|
||||
#ifdef ST7735_NANO_TLSR
|
||||
#ifdef ST7735_NANO_TLSR
|
||||
YellowSense = 0;
|
||||
tft2.setRotation(1);
|
||||
#else
|
||||
#else
|
||||
tft2.setRotation(YellowSense == 1 ? 1 : 3);
|
||||
#endif
|
||||
#endif
|
||||
tft2.fillScreen(TFT_BLACK);
|
||||
tft2.setCursor(12, 0, (tft2.width() == 160 ? 1 : 2));
|
||||
tft2.setTextColor(TFT_WHITE);
|
||||
tftLogscreen = true;
|
||||
|
||||
ledcSetup(6, 5000, 8);
|
||||
ledcAttachPin(TFT_BACKLIGHT, 6);
|
||||
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||
ledcSetup(1, 5000, 8);
|
||||
ledcAttachPin(TFT_BACKLIGHT, 1);
|
||||
ledcWrite(1, config.tft);
|
||||
if (tft2.width() == 160) {
|
||||
GPIO.func_out_sel_cfg[TFT_BACKLIGHT].inv_sel = 1;
|
||||
}
|
||||
ledcWrite(6, config.tft);
|
||||
#endif
|
||||
#else
|
||||
ledcAttachChannel(TFT_BACKLIGHT, 5000, 8, 1);
|
||||
ledcWriteChannel(1, config.tft);
|
||||
if (tft2.width() == 160) ledcOutputInvert(TFT_BACKLIGHT, true);
|
||||
#endif
|
||||
#endif
|
||||
touch_init();
|
||||
}
|
||||
|
||||
void yellow_ap_display_loop(void) {
|
||||
@@ -338,19 +520,19 @@ void yellow_ap_display_loop(void) {
|
||||
void* spriteData = spr.getPointer();
|
||||
size_t bytesRead = file.readBytes((char*)spriteData, spr.width() * spr.height() * 2);
|
||||
file.close();
|
||||
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
long dy = spr.height();
|
||||
long dx = spr.width();
|
||||
|
||||
|
||||
#if defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL
|
||||
long dy = spr.height();
|
||||
long dx = spr.width();
|
||||
|
||||
uint16_t* data = static_cast<uint16_t*>(const_cast<void*>(spriteData));
|
||||
|
||||
gfx->draw16bitRGBBitmap(0, 0, (uint16_t *)spriteData, dx, dy);
|
||||
spr.deleteSprite();
|
||||
#else
|
||||
gfx->draw16bitRGBBitmap(0, 0, (uint16_t*)spriteData, dx, dy);
|
||||
spr.deleteSprite();
|
||||
#else
|
||||
spr.pushSprite(0, 0);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
tftLogscreen = false;
|
||||
|
||||
struct espXferComplete xfc = {0};
|
||||
@@ -359,6 +541,7 @@ void yellow_ap_display_loop(void) {
|
||||
}
|
||||
last_update = millis();
|
||||
}
|
||||
touch_loop();
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -29,8 +29,8 @@ void updateLanguageFromConfig() {
|
||||
return;
|
||||
}
|
||||
|
||||
DynamicJsonDocument doc(1024);
|
||||
StaticJsonDocument<80> filter;
|
||||
JsonDocument doc;
|
||||
JsonDocument filter;
|
||||
filter[String(currentLanguage)] = true;
|
||||
const DeserializationError error = deserializeJson(doc, file, DeserializationOption::Filter(filter));
|
||||
file.close();
|
||||
|
||||
@@ -36,6 +36,14 @@ struct ledInstruction {
|
||||
bool reQueue = false;
|
||||
};
|
||||
|
||||
void ledcSet(uint8_t channel, uint8_t brightness) {
|
||||
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||
ledcWrite(channel, brightness);
|
||||
#else
|
||||
ledcWriteChannel(channel, brightness);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAS_RGB_LED
|
||||
|
||||
void addToRGBQueue(struct ledInstructionRGB* rgb, bool requeue) {
|
||||
@@ -132,13 +140,9 @@ void rgbIdleStep() {
|
||||
|
||||
void setBrightness(int brightness) {
|
||||
maxledbrightness = brightness;
|
||||
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
ledcWrite(1, config.tft);
|
||||
#else
|
||||
#ifdef HAS_TFT
|
||||
ledcWrite(6, config.tft);
|
||||
#endif
|
||||
|
||||
#if defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL || HAS_TFT
|
||||
ledcSet(1, config.tft);
|
||||
#endif
|
||||
#ifdef HAS_RGB_LED
|
||||
FastLED.setBrightness(maxledbrightness);
|
||||
@@ -150,12 +154,8 @@ void updateBrightnessFromConfig() {
|
||||
if (newbrightness != maxledbrightness) {
|
||||
setBrightness(newbrightness);
|
||||
}
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
ledcWrite(1, config.tft);
|
||||
#else
|
||||
#ifdef HAS_TFT
|
||||
ledcWrite(6, config.tft);
|
||||
#endif
|
||||
#if defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL || HAS_TFT
|
||||
ledcSet(1, config.tft);
|
||||
#endif
|
||||
if (apInfo.state == AP_STATE_NORADIO) addFadeMono(config.led);
|
||||
}
|
||||
@@ -176,11 +176,9 @@ void addFadeMono(uint8_t value) {
|
||||
}
|
||||
|
||||
void showMono(uint8_t brightness) {
|
||||
#ifdef CONFIG_IDF_TARGET_ESP32
|
||||
ledcWrite(7, 255 - gamma8[brightness]);
|
||||
#else
|
||||
ledcWrite(7, gamma8[brightness]);
|
||||
#endif
|
||||
if (FLASHER_LED != -1) {
|
||||
ledcSet(7, gamma8[brightness]);
|
||||
}
|
||||
}
|
||||
|
||||
void quickBlink(uint8_t repeat) {
|
||||
@@ -222,11 +220,13 @@ void ledTask(void* parameter) {
|
||||
|
||||
ledQueue = xQueueCreate(30, sizeof(struct ledInstruction*));
|
||||
|
||||
ledcSetup(7, 5000, 8);
|
||||
if (FLASHER_LED != -1) {
|
||||
digitalWrite(FLASHER_LED, HIGH);
|
||||
pinMode(FLASHER_LED, OUTPUT);
|
||||
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||
ledcSetup(7, 5000, 8);
|
||||
ledcAttachPin(FLASHER_LED, 7);
|
||||
#else
|
||||
ledcAttachChannel(FLASHER_LED, 1000, 8, 7);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct ledInstruction* monoled = nullptr;
|
||||
@@ -297,7 +297,7 @@ void ledTask(void* parameter) {
|
||||
if (monoled->fadeTime <= 1) {
|
||||
showMono(monoled->value);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (monoled->fadeTime) {
|
||||
monoled->fadeTime--;
|
||||
@@ -313,4 +313,4 @@ void ledTask(void* parameter) {
|
||||
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
#include <Arduino.h>
|
||||
#include <WiFi.h>
|
||||
#include <time.h>
|
||||
#ifdef ETHERNET_CLK_MODE
|
||||
#include <ETH.h>
|
||||
#endif
|
||||
|
||||
#include "contentmanager.h"
|
||||
#include "flasher.h"
|
||||
@@ -48,7 +51,12 @@ void delayedStart(void* parameter) {
|
||||
}
|
||||
|
||||
void setup() {
|
||||
#ifdef UART_LOGGING_TX_ONLY_PIN
|
||||
Serial.begin(115200, SERIAL_8N1, -1, UART_LOGGING_TX_ONLY_PIN);
|
||||
gpio_set_drive_capability((gpio_num_t)FLASHER_AP_RXD, GPIO_DRIVE_CAP_0);
|
||||
#else
|
||||
Serial.begin(115200);
|
||||
#endif
|
||||
#if ARDUINO_USB_CDC_ON_BOOT == 1
|
||||
Serial.setTxTimeoutMs(0); // workaround bug in USB CDC that slows down serial output when no usb connected
|
||||
#endif
|
||||
@@ -114,6 +122,7 @@ void setup() {
|
||||
}
|
||||
*/
|
||||
|
||||
wm.initEth();
|
||||
initAPconfig();
|
||||
|
||||
updateLanguageFromConfig();
|
||||
@@ -150,7 +159,12 @@ void setup() {
|
||||
// We'll need to start the 'usbflasher' task for boards with a second (USB) port. This can be used as a 'flasher' interface, using a python script on the host
|
||||
xTaskCreate(usbFlasherTask, "usbflasher", 10000, NULL, 5, NULL);
|
||||
#else
|
||||
|
||||
#ifdef ETHERNET_CLK_MODE
|
||||
if (!(ETHERNET_CLK_MODE == ETH_CLOCK_GPIO0_IN || ETHERNET_CLK_MODE == ETH_CLOCK_GPIO0_OUT))
|
||||
#endif
|
||||
pinMode(0, INPUT_PULLUP);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAS_EXT_FLASHER
|
||||
|
||||
@@ -75,14 +75,43 @@ struct Error {
|
||||
int32_t b;
|
||||
};
|
||||
|
||||
uint32_t colorDistance(Color &c1, Color &c2, Error &e1) {
|
||||
e1.r = constrain(e1.r, -255, 255);
|
||||
e1.g = constrain(e1.g, -255, 255);
|
||||
e1.b = constrain(e1.b, -255, 255);
|
||||
uint32_t colorDistance(const Color &c1, const Color &c2, const Error &e1) {
|
||||
int32_t r_diff = c1.r + e1.r - c2.r;
|
||||
int32_t g_diff = c1.g + e1.g - c2.g;
|
||||
int32_t b_diff = c1.b + e1.b - c2.b;
|
||||
return 3 * r_diff * r_diff + 6 * g_diff * g_diff + b_diff * b_diff;
|
||||
if (abs(c1.r - c1.g) < 20 && abs(c1.b - c1.g) < 20) {
|
||||
if (abs(c2.r - c2.g) > 20 || abs(c2.b - c2.g) > 20) return 4294967295; // don't select color pixels on black and white
|
||||
}
|
||||
return 3 * r_diff * r_diff + 5.47 * g_diff * g_diff + 1.53 * b_diff * b_diff;
|
||||
}
|
||||
|
||||
std::tuple<int, int, float, float> findClosestColors(const Color &pixel, const std::vector<Color> &palette) {
|
||||
int closestIndex = -1, secondClosestIndex = -1;
|
||||
float closestDist = std::numeric_limits<float>::max();
|
||||
float secondClosestDist = std::numeric_limits<float>::max();
|
||||
for (size_t i = 0; i < palette.size(); ++i) {
|
||||
float dist = colorDistance(pixel, palette[i], (Error){0, 0, 0});
|
||||
if (dist < closestDist) {
|
||||
secondClosestIndex = closestIndex;
|
||||
secondClosestDist = closestDist;
|
||||
closestIndex = i;
|
||||
closestDist = dist;
|
||||
} else if (dist < secondClosestDist) {
|
||||
secondClosestIndex = i;
|
||||
secondClosestDist = dist;
|
||||
}
|
||||
}
|
||||
if (closestIndex != -1 && secondClosestIndex != -1) {
|
||||
auto rgbValue = [](const Color &color) {
|
||||
return (color.r << 16) | (color.g << 8) | color.b;
|
||||
};
|
||||
|
||||
if (rgbValue(palette[secondClosestIndex]) > rgbValue(palette[closestIndex])) {
|
||||
std::swap(closestIndex, secondClosestIndex);
|
||||
std::swap(closestDist, secondClosestDist);
|
||||
}
|
||||
}
|
||||
return { closestIndex, secondClosestIndex, closestDist, secondClosestDist};
|
||||
}
|
||||
|
||||
void spr2color(TFT_eSprite &spr, imgParam &imageParams, uint8_t *buffer, size_t buffer_size, bool is_red) {
|
||||
@@ -112,11 +141,6 @@ void spr2color(TFT_eSprite &spr, imgParam &imageParams, uint8_t *buffer, size_t
|
||||
Error *error_bufferold = new Error[bufw + 4];
|
||||
Error *error_buffernew = new Error[bufw + 4];
|
||||
|
||||
const uint8_t ditherMatrix[4][4] = {
|
||||
{0, 9, 2, 10},
|
||||
{12, 5, 14, 6},
|
||||
{3, 11, 1, 8},
|
||||
{15, 7, 13, 4}};
|
||||
size_t bitOffset = 0;
|
||||
|
||||
memset(error_bufferold, 0, bufw * sizeof(Error));
|
||||
@@ -138,23 +162,36 @@ void spr2color(TFT_eSprite &spr, imgParam &imageParams, uint8_t *buffer, size_t
|
||||
break;
|
||||
}
|
||||
|
||||
int best_color_index = 0;
|
||||
if (imageParams.dither == 2) {
|
||||
// Ordered dithering
|
||||
uint8_t ditherValue = ditherMatrix[y % 4][x % 4] << (imageParams.bpp >= 3 ? 2 : 4);
|
||||
error_bufferold[x].r = ditherValue - (imageParams.bpp >= 3 ? 30 : 120); // * 256 / 16 - 128 + 8
|
||||
error_bufferold[x].g = ditherValue - (imageParams.bpp >= 3 ? 30 : 120);
|
||||
error_bufferold[x].b = ditherValue - (imageParams.bpp >= 3 ? 30 : 120);
|
||||
// special ordered dithering
|
||||
auto [c1Index, c2Index, distC1, distC2] = findClosestColors(color, palette);
|
||||
Color c1 = palette[c1Index];
|
||||
Color c2 = palette[c2Index];
|
||||
float weight = distC1 / (distC1 + distC2);
|
||||
if (weight <= 0.03) {
|
||||
best_color_index = c1Index;
|
||||
} else if (weight < 0.30) {
|
||||
best_color_index = ((y % 2 && ((y / 2 + x) % 2)) ? c2Index : c1Index);
|
||||
} else if (weight < 0.70) {
|
||||
best_color_index = ((x + y) % 2 ? c2Index : c1Index);
|
||||
} else if (weight < 0.97) {
|
||||
best_color_index = ((y % 2 && ((y / 2 + x) % 2)) % 2 ? c1Index : c2Index);
|
||||
} else {
|
||||
best_color_index = c2Index;
|
||||
}
|
||||
}
|
||||
|
||||
int best_color_index = 0;
|
||||
uint32_t best_color_distance = colorDistance(color, palette[0], error_bufferold[x]);
|
||||
if (imageParams.dither == 1 || imageParams.dither == 0) {
|
||||
uint32_t best_color_distance = colorDistance(color, palette[0], error_bufferold[x]);
|
||||
|
||||
for (int i = 1; i < num_colors; i++) {
|
||||
if (best_color_distance == 0) break;
|
||||
uint32_t distance = colorDistance(color, palette[i], error_bufferold[x]);
|
||||
if (distance < best_color_distance) {
|
||||
best_color_distance = distance;
|
||||
best_color_index = i;
|
||||
for (int i = 1; i < num_colors; i++) {
|
||||
if (best_color_distance == 0) break;
|
||||
uint32_t distance = colorDistance(color, palette[i], error_bufferold[x]);
|
||||
if (distance < best_color_distance) {
|
||||
best_color_distance = distance;
|
||||
best_color_index = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,34 +238,44 @@ void spr2color(TFT_eSprite &spr, imgParam &imageParams, uint8_t *buffer, size_t
|
||||
color.g + error_bufferold[x].g - palette[best_color_index].g,
|
||||
color.b + error_bufferold[x].b - palette[best_color_index].b};
|
||||
|
||||
error_buffernew[x].r += error.r >> 2;
|
||||
error_buffernew[x].g += error.g >> 2;
|
||||
error_buffernew[x].b += error.b >> 2;
|
||||
float scaling_factor = 255.0f / std::max(std::abs(error.r), std::max(std::abs(error.g), std::abs(error.b)));
|
||||
if (scaling_factor < 1.0f) {
|
||||
error.r *= scaling_factor;
|
||||
error.g *= scaling_factor;
|
||||
error.b *= scaling_factor;
|
||||
}
|
||||
|
||||
error_buffernew[x].r += error.r / 4;
|
||||
error_buffernew[x].g += error.g / 4;
|
||||
error_buffernew[x].b += error.b / 4;
|
||||
|
||||
if (x > 0) {
|
||||
error_buffernew[x - 1].r += error.r >> 3;
|
||||
error_buffernew[x - 1].g += error.g >> 3;
|
||||
error_buffernew[x - 1].b += error.b >> 3;
|
||||
error_buffernew[x - 1].r += error.r / 8;
|
||||
error_buffernew[x - 1].g += error.g / 8;
|
||||
error_buffernew[x - 1].b += error.b / 8;
|
||||
}
|
||||
|
||||
if (x > 1) {
|
||||
error_buffernew[x - 2].r += error.r >> 4;
|
||||
error_buffernew[x - 2].g += error.g >> 4;
|
||||
error_buffernew[x - 2].b += error.b >> 4;
|
||||
error_buffernew[x - 2].r += error.r / 16;
|
||||
error_buffernew[x - 2].g += error.g / 16;
|
||||
error_buffernew[x - 2].b += error.b / 16;
|
||||
}
|
||||
error_buffernew[x + 1].r += error.r >> 3;
|
||||
error_buffernew[x + 1].g += error.g >> 3;
|
||||
error_buffernew[x + 1].b += error.b >> 3;
|
||||
|
||||
error_bufferold[x + 1].r += error.r >> 2;
|
||||
error_bufferold[x + 1].g += error.g >> 2;
|
||||
error_bufferold[x + 1].b += error.b >> 2;
|
||||
error_buffernew[x + 1].r += error.r / 8;
|
||||
error_buffernew[x + 1].g += error.g / 8;
|
||||
error_buffernew[x + 1].b += error.b / 8;
|
||||
|
||||
error_buffernew[x + 2].r += error.r >> 4;
|
||||
error_buffernew[x + 2].g += error.g >> 4;
|
||||
error_buffernew[x + 2].b += error.b >> 4;
|
||||
error_bufferold[x + 1].r += error.r / 4;
|
||||
error_bufferold[x + 1].g += error.g / 4;
|
||||
error_bufferold[x + 1].b += error.b / 4;
|
||||
|
||||
error_bufferold[x + 2].r += error.r >> 3;
|
||||
error_bufferold[x + 2].g += error.g >> 3;
|
||||
error_bufferold[x + 2].b += error.b >> 3;
|
||||
error_buffernew[x + 2].r += error.r / 16;
|
||||
error_buffernew[x + 2].g += error.g / 16;
|
||||
error_buffernew[x + 2].b += error.b / 16;
|
||||
|
||||
error_bufferold[x + 2].r += error.r / 8;
|
||||
error_bufferold[x + 2].g += error.g / 8;
|
||||
error_bufferold[x + 2].b += error.b / 8;
|
||||
}
|
||||
}
|
||||
memcpy(error_bufferold, error_buffernew, bufw * sizeof(Error));
|
||||
@@ -295,16 +342,17 @@ void rewriteHeader(File &f_out) {
|
||||
uint8_t *g5Compress(uint16_t width, uint16_t height, uint8_t *buffer, uint16_t buffersize, uint16_t &outBufferSize) {
|
||||
G5ENCIMAGE g5enc;
|
||||
int rc;
|
||||
uint8_t *outbuffer = (uint8_t *)ps_malloc(buffersize + 16384);
|
||||
uint8_t *outbuffer = (uint8_t *)ps_malloc(buffersize+16384);
|
||||
if (outbuffer == NULL) {
|
||||
Serial.println("Failed to allocate the output buffer for the G5 encoder");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
rc = g5_encode_init(&g5enc, width, height, outbuffer, buffersize + 16384);
|
||||
rc = g5_encode_init(&g5enc, width, height, outbuffer, buffersize);
|
||||
for (int y = 0; y < height && rc == G5_SUCCESS; y++) {
|
||||
rc = g5_encode_encodeLine(&g5enc, buffer);
|
||||
buffer += (width / 8);
|
||||
if (rc != G5_SUCCESS) break;
|
||||
}
|
||||
if (rc == G5_ENCODE_COMPLETE) {
|
||||
outBufferSize = g5_encode_getOutSize(&g5enc);
|
||||
@@ -317,9 +365,59 @@ uint8_t *g5Compress(uint16_t width, uint16_t height, uint8_t *buffer, uint16_t b
|
||||
}
|
||||
#endif
|
||||
|
||||
// The "ts_option" is a bitmapped variable with a default value of 1
|
||||
// which is black on white, long format @ bottom right.
|
||||
//
|
||||
// b2, b1, b0:
|
||||
// 0 - no timestamp
|
||||
// 1 - bottom right
|
||||
// 2 - top right
|
||||
// 3 - bottom left
|
||||
// 4 - top left
|
||||
// 5 -> 7 reserved
|
||||
// b3:
|
||||
// 0 - long format (year-month-day hr:min)
|
||||
// 1 - short format (month-day hr:min)
|
||||
// b4:
|
||||
// 0 - black on white
|
||||
// 1 - white on black
|
||||
// b5 -> b7: reserved
|
||||
//
|
||||
void doTimestamp(TFT_eSprite *spr, uint8_t ts_option) {
|
||||
time_t now = time(nullptr);
|
||||
struct tm *timeinfo = localtime(&now);
|
||||
char buffer[20];
|
||||
strftime(buffer, sizeof(buffer),
|
||||
(ts_option & 0x8) ? "%m-%d %H:%M" : "%Y-%m-%d %H:%M",timeinfo);
|
||||
int ts_chars = strlen(buffer);
|
||||
|
||||
uint16_t char_color;
|
||||
uint16_t bg_color;
|
||||
|
||||
if(ts_option & 0x10) {
|
||||
char_color = TFT_WHITE;
|
||||
bg_color= TFT_BLACK;
|
||||
}
|
||||
else {
|
||||
char_color = TFT_BLACK;
|
||||
bg_color = TFT_WHITE;
|
||||
}
|
||||
|
||||
ts_option = (ts_option & 0x3) - 1;
|
||||
|
||||
int32_t ts_x = (ts_option & 2) ? 1 : spr->width() - ts_chars * 6 - 2;
|
||||
int32_t ts_y = (ts_option & 1) ? 1 : spr->height() - 10;
|
||||
|
||||
spr->drawRect(ts_x - 1, ts_y - 1, ts_chars * 6 + 1, 9, bg_color);
|
||||
spr->setTextColor(char_color, bg_color);
|
||||
spr->setCursor(ts_x,ts_y);
|
||||
spr->print(buffer);
|
||||
}
|
||||
|
||||
void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
long t = millis();
|
||||
|
||||
if (imageParams.ts_option) doTimestamp(&spr,imageParams.ts_option);
|
||||
#ifdef HAS_TFT
|
||||
extern uint8_t YellowSense;
|
||||
if (fileout == "direct") {
|
||||
@@ -338,7 +436,7 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
size_t dataSize = spr.width() * spr.height() * (spr.getColorDepth() / 8);
|
||||
memcpy(spriteData2, spriteData, dataSize);
|
||||
|
||||
#ifdef HAS_LILYGO_TPANEL
|
||||
#if defined HAS_LILYGO_TPANEL || defined HAS_4inch_TPANEL
|
||||
if (spr.getColorDepth() == 16) {
|
||||
long dy = spr.height();
|
||||
long dx = spr.width();
|
||||
@@ -363,7 +461,7 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
case 1:
|
||||
case 2: {
|
||||
long bufw = spr.width(), bufh = spr.height();
|
||||
size_t buffer_size = (bufw * bufh) / 8;
|
||||
size_t buffer_size = ((bufw * bufh) + 7) / 8; // round up: not all dimensions are multiples of 8
|
||||
#ifdef BOARD_HAS_PSRAM
|
||||
uint8_t *buffer = (uint8_t *)ps_malloc(buffer_size);
|
||||
#else
|
||||
@@ -439,7 +537,6 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
} else {
|
||||
height *= 2;
|
||||
}
|
||||
|
||||
}
|
||||
uint16_t outbufferSize = 0;
|
||||
uint8_t *outBuffer;
|
||||
@@ -457,7 +554,6 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
if (outbufferSize > buffer_size) {
|
||||
printf("That wasn't very useful, falling back to raw\n");
|
||||
compressionSuccessful = false;
|
||||
f_out.seek(0);
|
||||
} else {
|
||||
f_out.write(outBuffer, outbufferSize);
|
||||
}
|
||||
@@ -471,6 +567,7 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
} else {
|
||||
imageParams.dataType = DATATYPE_IMG_RAW_1BPP;
|
||||
}
|
||||
f_out.seek(0);
|
||||
f_out.write(buffer, buffer_size);
|
||||
}
|
||||
#endif
|
||||
@@ -488,7 +585,7 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
case 3:
|
||||
case 4: {
|
||||
long bufw = spr.width(), bufh = spr.height();
|
||||
size_t buffer_size = (bufw * bufh) / 8 * imageParams.bpp;
|
||||
size_t buffer_size = ((bufw * bufh) + 7) / 8 * imageParams.bpp;
|
||||
uint8_t *buffer = (uint8_t *)ps_malloc(buffer_size);
|
||||
if (!buffer) {
|
||||
Serial.println("Failed to allocate buffer");
|
||||
|
||||
@@ -275,7 +275,8 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) {
|
||||
case DATATYPE_IMG_RAW_1BPP:
|
||||
case DATATYPE_IMG_RAW_2BPP:
|
||||
case DATATYPE_IMG_G5:
|
||||
case DATATYPE_IMG_RAW_3BPP: {
|
||||
case DATATYPE_IMG_RAW_3BPP:
|
||||
case DATATYPE_IMG_RAW_4BPP: {
|
||||
char hexmac[17];
|
||||
mac2hex(pending->targetMac, hexmac);
|
||||
String filename = "/current/" + String(hexmac) + "_" + String(millis() % 1000000) + ".pending";
|
||||
@@ -338,8 +339,7 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) {
|
||||
break;
|
||||
}
|
||||
case DATATYPE_NFC_RAW_CONTENT:
|
||||
case DATATYPE_NFC_URL_DIRECT:
|
||||
case DATATYPE_CUSTOM_LUT_OTA: {
|
||||
case DATATYPE_NFC_URL_DIRECT: {
|
||||
char hexmac[17];
|
||||
mac2hex(pending->targetMac, hexmac);
|
||||
char dataUrl[80];
|
||||
@@ -348,7 +348,7 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) {
|
||||
snprintf(dataUrl, sizeof(dataUrl), "http://%s/getdata?mac=%s&md5=%s", remoteIP.toString().c_str(), hexmac, md5);
|
||||
wsLog("GET " + String(dataUrl));
|
||||
HTTPClient http;
|
||||
logLine("http DATATYPE_CUSTOM_LUT_OTA " + String(dataUrl));
|
||||
logLine("http DATATYPE_NFC_* " + String(dataUrl));
|
||||
http.begin(dataUrl);
|
||||
int httpCode = http.GET();
|
||||
if (httpCode == 200) {
|
||||
@@ -447,9 +447,11 @@ void processXferComplete(struct espXferComplete* xfc, bool local) {
|
||||
contentFS->remove(dst_path);
|
||||
}
|
||||
if (contentFS->exists(queueItem->filename)) {
|
||||
if (config.preview && (queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_3BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_G5 || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_ZLIB)) {
|
||||
uint8_t dataType = queueItem->pendingdata.availdatainfo.dataType;
|
||||
if (config.preview && dataType != DATATYPE_FW_UPDATE && dataType != DATATYPE_NOUPDATE) {
|
||||
contentFS->rename(queueItem->filename, String(dst_path));
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
if (queueItem->pendingdata.availdatainfo.dataType != DATATYPE_FW_UPDATE) contentFS->remove(queueItem->filename);
|
||||
}
|
||||
}
|
||||
@@ -505,9 +507,9 @@ void processXferTimeout(struct espXferComplete* xfc, bool local) {
|
||||
if (taginfo != nullptr) {
|
||||
taginfo->pendingIdle = 60;
|
||||
clearPending(taginfo);
|
||||
while (dequeueItem(xfc->src)) {
|
||||
};
|
||||
}
|
||||
while (dequeueItem(xfc->src)) {
|
||||
};
|
||||
|
||||
checkQueue(xfc->src);
|
||||
|
||||
@@ -558,15 +560,14 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP
|
||||
taginfo->apIp = IPAddress(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
if (taginfo->pendingIdle == 0) {
|
||||
taginfo->expectedNextCheckin = now + 60;
|
||||
if (taginfo->pendingIdle == 0 || countQueueItem(eadr->src) > 0) {
|
||||
if (taginfo->expectedNextCheckin < now + 60) taginfo->expectedNextCheckin = now + 60;
|
||||
} else if (taginfo->pendingIdle == 9999) {
|
||||
taginfo->expectedNextCheckin = 3216153600;
|
||||
taginfo->pendingIdle = 0;
|
||||
} else {
|
||||
taginfo->expectedNextCheckin = now + taginfo->pendingIdle;
|
||||
taginfo->pendingIdle = 0;
|
||||
}
|
||||
taginfo->pendingIdle = 0;
|
||||
taginfo->lastseen = now;
|
||||
|
||||
if (eadr->adr.lastPacketRSSI != 0) {
|
||||
@@ -605,6 +606,7 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP
|
||||
if (local) {
|
||||
sprintf(buffer, "<ADR %02X%02X%02X%02X%02X%02X%02X%02X\r\n\0", eadr->src[7], eadr->src[6], eadr->src[5], eadr->src[4], eadr->src[3], eadr->src[2], eadr->src[1], eadr->src[0]);
|
||||
Serial.print(buffer);
|
||||
checkQueue(eadr->src); // experiemental 3/26/25: redundant check
|
||||
}
|
||||
|
||||
if (local) {
|
||||
@@ -750,6 +752,35 @@ bool sendTagCommand(const uint8_t* dst, uint8_t cmd, bool local, const uint8_t*
|
||||
}
|
||||
}
|
||||
|
||||
bool sendTagMac(const uint8_t* dst, const uint64_t newmac, bool local) {
|
||||
struct pendingData pending = {0};
|
||||
memcpy(pending.targetMac, dst, 8);
|
||||
pending.availdatainfo.dataType = DATATYPE_COMMAND_DATA;
|
||||
pending.availdatainfo.dataTypeArgument = 0x23;
|
||||
pending.availdatainfo.nextCheckIn = 0;
|
||||
|
||||
|
||||
pending.availdatainfo.dataVer = newmac;
|
||||
pending.availdatainfo.dataSize = 0;
|
||||
|
||||
pending.attemptsLeft = MAX_XFER_ATTEMPTS;
|
||||
Serial.printf(">Tag %02X%02X%02X%02X%02X%02X%02X%02X Mac set\r\n\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]);
|
||||
|
||||
tagRecord* taginfo = tagRecord::findByMAC(dst);
|
||||
if (taginfo != nullptr) {
|
||||
taginfo->pendingCount++;
|
||||
wsSendTaginfo(taginfo->mac, SYNC_TAGSTATUS);
|
||||
}
|
||||
|
||||
if (local) {
|
||||
return queueDataAvail(&pending, true);
|
||||
} else {
|
||||
queueDataAvail(&pending, false);
|
||||
udpsync.netSendDataAvail(&pending);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void updateTaginfoitem(struct TagInfo* taginfoitem, IPAddress remoteIP) {
|
||||
tagRecord* taginfo = tagRecord::findByMAC(taginfoitem->mac);
|
||||
|
||||
@@ -802,7 +833,7 @@ bool checkMirror(struct tagRecord* taginfo, struct pendingData* pending) {
|
||||
for (int16_t c = 0; c < tagDB.size(); c++) {
|
||||
tagRecord* taginfo2 = tagDB.at(c);
|
||||
if (taginfo2->contentMode == 20 && taginfo2->version == 0) {
|
||||
DynamicJsonDocument doc(500);
|
||||
JsonDocument doc;
|
||||
deserializeJson(doc, taginfo2->modeConfigJson);
|
||||
JsonObject cfgobj = doc.as<JsonObject>();
|
||||
uint8_t mac[8] = {0};
|
||||
@@ -955,20 +986,23 @@ bool queueDataAvail(struct pendingData* pending, bool local) {
|
||||
taginfo->data = nullptr;
|
||||
} else {
|
||||
newPending.data = nullptr;
|
||||
|
||||
// optional: read data early, don't wait for block request.
|
||||
fs::File file = contentFS->open(newPending.filename);
|
||||
if (file) {
|
||||
newPending.data = getDataForFile(file);
|
||||
Serial.println("Reading file " + String(newPending.filename));
|
||||
file.close();
|
||||
} else {
|
||||
Serial.println("Warning: not found: " + String(newPending.filename));
|
||||
|
||||
if (pendingQueue.size() < 5) { // maximized to 5 to save some memory
|
||||
// optional: read data early, don't wait for block request.
|
||||
fs::File file = contentFS->open(newPending.filename);
|
||||
if (file) {
|
||||
newPending.data = getDataForFile(file);
|
||||
Serial.println("Reading file " + String(newPending.filename));
|
||||
file.close();
|
||||
} else {
|
||||
Serial.println("Warning: not found: " + String(newPending.filename));
|
||||
}
|
||||
}
|
||||
}
|
||||
newPending.len = taginfo->len;
|
||||
|
||||
if ((pending->availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || pending->availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || pending->availdatainfo.dataType == DATATYPE_IMG_RAW_3BPP || pending->availdatainfo.dataType == DATATYPE_IMG_ZLIB || pending->availdatainfo.dataType == DATATYPE_IMG_G5) && (pending->availdatainfo.dataTypeArgument & 0xF8) == 0x00) {
|
||||
uint8_t dataType = pending->availdatainfo.dataType;
|
||||
if (dataType != DATATYPE_FW_UPDATE && dataType != DATATYPE_NOUPDATE && pending->availdatainfo.dataTypeArgument & 0xF8 == 0x00) {
|
||||
// in case of an image (no preload), remove already queued images
|
||||
pendingQueue.erase(std::remove_if(pendingQueue.begin(), pendingQueue.end(),
|
||||
[pending](const PendingItem& item) {
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <MD5Builder.h>
|
||||
#include <Update.h>
|
||||
|
||||
#include "flasher.h"
|
||||
#include "espflasher.h"
|
||||
#include "leds.h"
|
||||
#include "serialap.h"
|
||||
@@ -15,6 +16,7 @@
|
||||
#include "util.h"
|
||||
#include "web.h"
|
||||
|
||||
|
||||
#ifndef BUILD_ENV_NAME
|
||||
#define BUILD_ENV_NAME unknown
|
||||
#endif
|
||||
@@ -30,9 +32,11 @@
|
||||
|
||||
#define STR_IMPL(x) #x
|
||||
#define STR(x) STR_IMPL(x)
|
||||
#define LOG(format, ... ) Serial.printf(format,## __VA_ARGS__)
|
||||
|
||||
|
||||
void handleSysinfoRequest(AsyncWebServerRequest* request) {
|
||||
StaticJsonDocument<250> doc;
|
||||
JsonDocument doc;
|
||||
doc["alias"] = config.alias;
|
||||
doc["env"] = STR(BUILD_ENV_NAME);
|
||||
doc["buildtime"] = STR(BUILD_TIME);
|
||||
@@ -41,11 +45,20 @@ void handleSysinfoRequest(AsyncWebServerRequest* request) {
|
||||
doc["psramsize"] = ESP.getPsramSize();
|
||||
doc["flashsize"] = ESP.getFlashChipSize();
|
||||
doc["rollback"] = Update.canRollBack();
|
||||
#if defined C6_OTA_FLASHING
|
||||
doc["hasC6"] = 1;
|
||||
#else
|
||||
doc["ap_version"] = apInfo.version;
|
||||
|
||||
doc["hasC6"] = 0;
|
||||
doc["hasH2"] = 0;
|
||||
doc["hasTslr"] = 0;
|
||||
|
||||
#if defined HAS_H2
|
||||
doc["hasH2"] = 1;
|
||||
#elif defined HAS_TSLR
|
||||
doc["hasTslr"] = 1;
|
||||
#elif defined C6_OTA_FLASHING
|
||||
doc["hasC6"] = 1;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_EXT_FLASHER
|
||||
doc["hasFlasher"] = 1;
|
||||
#else
|
||||
@@ -66,7 +79,7 @@ void handleCheckFile(AsyncWebServerRequest* request) {
|
||||
const String filePath = request->getParam("path")->value();
|
||||
File file = contentFS->open(filePath, "r");
|
||||
if (!file) {
|
||||
StaticJsonDocument<64> doc;
|
||||
JsonDocument doc;
|
||||
doc["filesize"] = 0;
|
||||
doc["md5"] = "";
|
||||
String jsonResponse;
|
||||
@@ -85,7 +98,7 @@ void handleCheckFile(AsyncWebServerRequest* request) {
|
||||
|
||||
file.close();
|
||||
|
||||
StaticJsonDocument<128> doc;
|
||||
JsonDocument doc;
|
||||
doc["filesize"] = fileSize;
|
||||
doc["md5"] = md5Hash;
|
||||
String jsonResponse;
|
||||
@@ -135,12 +148,13 @@ void handleLittleFSUpload(AsyncWebServerRequest* request, String filename, size_
|
||||
file.write(uploadInfo->buffer, uploadInfo->bufferSize);
|
||||
file.close();
|
||||
uploadInfo->bufferSize = 0;
|
||||
xSemaphoreGive(fsMutex);
|
||||
} else {
|
||||
xSemaphoreGive(fsMutex);
|
||||
logLine("Failed to open file for appending: " + uploadfilename);
|
||||
final = true;
|
||||
error = true;
|
||||
}
|
||||
xSemaphoreGive(fsMutex);
|
||||
|
||||
memcpy(uploadInfo->buffer, data, len);
|
||||
uploadInfo->bufferSize = len;
|
||||
@@ -153,11 +167,12 @@ void handleLittleFSUpload(AsyncWebServerRequest* request, String filename, size_
|
||||
if (file) {
|
||||
file.write(uploadInfo->buffer, uploadInfo->bufferSize);
|
||||
file.close();
|
||||
xSemaphoreGive(fsMutex);
|
||||
} else {
|
||||
xSemaphoreGive(fsMutex);
|
||||
logLine("Failed to open file for appending: " + uploadfilename);
|
||||
error = true;
|
||||
}
|
||||
xSemaphoreGive(fsMutex);
|
||||
request->_tempObject = nullptr;
|
||||
delete uploadInfo;
|
||||
}
|
||||
@@ -289,22 +304,29 @@ void handleRollback(AsyncWebServerRequest* request) {
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef C6_OTA_FLASHING
|
||||
void C6firmwareUpdateTask(void* parameter) {
|
||||
uint8_t doDownload = *((uint8_t*)parameter);
|
||||
char* urlPtr = reinterpret_cast<char*>(parameter);
|
||||
|
||||
LOG("C6firmwareUpdateTask: url '%s'\n", urlPtr);
|
||||
wsSerial("Stopping AP service");
|
||||
|
||||
setAPstate(false, AP_STATE_FLASHING);
|
||||
gSerialTaskState = SERIAL_STATE_STOP;
|
||||
config.runStatus = RUNSTATUS_STOP;
|
||||
setAPstate(false, AP_STATE_FLASHING);
|
||||
#ifndef FLASHER_DEBUG_SHARED
|
||||
extern bool rxSerialStopTask2;
|
||||
rxSerialStopTask2 = true;
|
||||
#endif
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
Serial1.end();
|
||||
setAPstate(false, AP_STATE_FLASHING);
|
||||
|
||||
wsSerial("C6 flash starting");
|
||||
wsSerial(SHORT_CHIP_NAME " flash starting");
|
||||
|
||||
bool result = doC6flash(doDownload);
|
||||
bool result = FlashC6_H2(urlPtr);
|
||||
|
||||
wsSerial("C6 flash end");
|
||||
wsSerial(SHORT_CHIP_NAME " flash end");
|
||||
|
||||
if (result) {
|
||||
setAPstate(false, AP_STATE_OFFLINE);
|
||||
@@ -314,36 +336,65 @@ void C6firmwareUpdateTask(void* parameter) {
|
||||
|
||||
wsSerial("starting monitor");
|
||||
Serial1.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD);
|
||||
#ifndef FLASHER_DEBUG_SHARED
|
||||
rxSerialStopTask2 = false;
|
||||
#ifdef FLASHER_DEBUG_RXD
|
||||
xTaskCreate(rxSerialTask2, "rxSerialTask2", 1750, NULL, 2, NULL);
|
||||
xTaskCreate(rxSerialTask2, "rxSerialTask2", 1850, NULL, 2, NULL);
|
||||
#endif
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
|
||||
wsSerial("resetting AP");
|
||||
APTagReset();
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
|
||||
apInfo.version = 0;
|
||||
wsSerial("bringing AP online");
|
||||
if (bringAPOnline()) config.runStatus = RUNSTATUS_RUN;
|
||||
// if (bringAPOnline(AP_STATE_REQUIRED_POWER_CYCLE)) config.runStatus = RUNSTATUS_STOP;
|
||||
if (bringAPOnline(AP_STATE_ONLINE)) {
|
||||
config.runStatus = RUNSTATUS_RUN;
|
||||
setAPstate(true, AP_STATE_ONLINE);
|
||||
}
|
||||
|
||||
wsSerial("Finished!");
|
||||
} else {
|
||||
wsSerial("Flashing failed. :-(");
|
||||
// Wait for version info to arrive
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
if(apInfo.version == 0) {
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (result) {
|
||||
wsSerial("Finished!");
|
||||
char buffer[50];
|
||||
snprintf(buffer,sizeof(buffer),
|
||||
"ESP32-" SHORT_CHIP_NAME " version is now %04x", apInfo.version);
|
||||
wsSerial(String(buffer));
|
||||
}
|
||||
else if(apInfo.version == 0) {
|
||||
wsSerial("AP failed to come online. :-(");
|
||||
}
|
||||
else {
|
||||
wsSerial("Flashing failed. :-(");
|
||||
}
|
||||
// wsSerial("Reboot system now");
|
||||
// wsSerial("[reboot]");
|
||||
free(urlPtr);
|
||||
vTaskDelay(30000 / portTICK_PERIOD_MS);
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void handleUpdateC6(AsyncWebServerRequest* request) {
|
||||
#if defined C6_OTA_FLASHING
|
||||
uint8_t doDownload = 1;
|
||||
if (request->hasParam("download", true)) {
|
||||
doDownload = atoi(request->getParam("download", true)->value().c_str());
|
||||
if (request->hasParam("url",true)) {
|
||||
const char* urlStr = request->getParam("url", true)->value().c_str();
|
||||
char* urlCopy = strdup(urlStr);
|
||||
xTaskCreate(C6firmwareUpdateTask, "OTAUpdateTask", 6400, urlCopy, 10, NULL);
|
||||
request->send(200, "Ok");
|
||||
}
|
||||
xTaskCreate(C6firmwareUpdateTask, "OTAUpdateTask", 6144, &doDownload, 10, NULL);
|
||||
request->send(200, "Ok");
|
||||
else {
|
||||
LOG("Sending bad request");
|
||||
request->send(400, "Bad request");
|
||||
}
|
||||
#elif defined(SHORT_CHIP_NAME)
|
||||
request->send(400, SHORT_CHIP_NAME " flashing not implemented");
|
||||
#else
|
||||
request->send(400, "C6 flashing not implemented");
|
||||
request->send(400, "C6/H2 flashing not implemented");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -355,7 +406,7 @@ void handleUpdateActions(AsyncWebServerRequest* request) {
|
||||
request->send(200, "No update actions needed");
|
||||
return;
|
||||
}
|
||||
DynamicJsonDocument doc(1000);
|
||||
JsonDocument doc;
|
||||
DeserializationError error = deserializeJson(doc, file);
|
||||
const JsonArray deleteFiles = doc["deletefile"].as<JsonArray>();
|
||||
for (const auto& filePath : deleteFiles) {
|
||||
@@ -367,4 +418,4 @@ void handleUpdateActions(AsyncWebServerRequest* request) {
|
||||
wsSerial("Cleanup finished");
|
||||
request->send(200, "Clean up finished");
|
||||
contentFS->remove("/update_actions.json");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
#include "settings.h"
|
||||
#include "leds.h"
|
||||
|
||||
#ifdef HAS_EXT_FLASHER
|
||||
#include "soc/rtc_cntl_reg.h"
|
||||
@@ -34,16 +35,21 @@ void rampTagPower(uint8_t* pin, bool up) {
|
||||
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
|
||||
#endif
|
||||
if (up) {
|
||||
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||
ledcSetup(0, 50000, 8);
|
||||
ledcWrite(0, 254);
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
pinMode(pin[0], OUTPUT);
|
||||
ledcAttachPin(pin[0], 0);
|
||||
#else
|
||||
ledcWriteChannel(0, 254);
|
||||
ledcAttachChannel(pin[0], 50000, 8, 0);
|
||||
#endif
|
||||
pinMode(FLASHER_EXT_RESET, OUTPUT);
|
||||
digitalWrite(FLASHER_EXT_RESET, LOW);
|
||||
ledcAttachPin(pin[0], 0);
|
||||
vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||
for (uint8_t c = 254; c != 0xFF; c--) {
|
||||
ledcWrite(0, c);
|
||||
ledcSet(0, c);
|
||||
delayMicroseconds(700);
|
||||
}
|
||||
digitalWrite(pin[0], LOW);
|
||||
@@ -52,14 +58,14 @@ void rampTagPower(uint8_t* pin, bool up) {
|
||||
digitalWrite(FLASHER_EXT_RESET, INPUT_PULLUP);
|
||||
} else {
|
||||
ledcSetup(0, 50000, 8);
|
||||
ledcWrite(0, 0);
|
||||
ledcSet(0, 0);
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
pinMode(pin[0], OUTPUT);
|
||||
pinMode(FLASHER_EXT_RESET, INPUT_PULLDOWN);
|
||||
ledcAttachPin(pin[0], 0);
|
||||
vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||
for (uint8_t c = 0; c < 0xFF; c++) {
|
||||
ledcWrite(0, c);
|
||||
ledcSet(0, c);
|
||||
if (c > 250) {
|
||||
vTaskDelay(2 / portTICK_PERIOD_MS);
|
||||
} else {
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <HardwareSerial.h>
|
||||
#include <system.h>
|
||||
#include <WiFi.h>
|
||||
|
||||
#include "commstructs.h"
|
||||
#include "contentmanager.h"
|
||||
@@ -13,6 +15,9 @@
|
||||
#include "storage.h"
|
||||
#include "web.h"
|
||||
#include "zbs_interface.h"
|
||||
#include "wifimanager.h"
|
||||
|
||||
#define LOG(format, ...) printf(format, ##__VA_ARGS__)
|
||||
|
||||
QueueHandle_t rxCmdQueue;
|
||||
SemaphoreHandle_t txActive;
|
||||
@@ -25,7 +30,9 @@ SemaphoreHandle_t txActive;
|
||||
volatile uint8_t cmdReplyValue = CMD_REPLY_WAIT;
|
||||
|
||||
#define AP_SERIAL_PORT Serial1
|
||||
#ifndef FLASHER_DEBUG_SHARED
|
||||
volatile bool rxSerialStopTask2 = false;
|
||||
#endif
|
||||
|
||||
uint8_t channelList[6];
|
||||
struct espSetChannelPower curChannel = {0, 11, 10};
|
||||
@@ -42,6 +49,8 @@ struct espSetChannelPower curChannel = {0, 11, 10};
|
||||
volatile uint32_t lastAPActivity = 0;
|
||||
struct APInfoS apInfo;
|
||||
|
||||
volatile ApSerialState gSerialTaskState;
|
||||
|
||||
struct rxCmd {
|
||||
uint8_t* data;
|
||||
uint8_t len;
|
||||
@@ -150,12 +159,28 @@ void setAPstate(bool isOnline, uint8_t state) {
|
||||
CRGB::Red,
|
||||
CRGB::YellowGreen};
|
||||
rgbIdleColor = colorMap[state];
|
||||
#ifdef BLE_ONLY
|
||||
rgbIdleColor = CRGB::Green;
|
||||
#endif
|
||||
#ifdef BLE_ONLY
|
||||
rgbIdleColor = CRGB::Green;
|
||||
#endif
|
||||
rgbIdlePeriod = (isOnline ? 767 : 255);
|
||||
if (isOnline) rgbIdle();
|
||||
#endif
|
||||
#ifdef FLASHER_DEBUG_SHARED
|
||||
// Flasher shares port with AP comms
|
||||
if (state == AP_STATE_FLASHING) {
|
||||
LOG("Shared COM port, gSerialTaskState %d\n", gSerialTaskState);
|
||||
gSerialTaskState = SERIAL_STATE_STOP;
|
||||
for (int i = 0; i < 100; i++) {
|
||||
vTaskDelay(1 / portTICK_RATE_MS);
|
||||
if (gSerialTaskState == SERIAL_STATE_STOPPED) {
|
||||
gSerialTaskState = SERIAL_STATE_NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
LOG("gSerialTaskState %d\n", gSerialTaskState);
|
||||
}
|
||||
#endif
|
||||
wsSendSysteminfo();
|
||||
}
|
||||
|
||||
// Reset the tag
|
||||
@@ -384,46 +409,49 @@ void rxCmdProcessor(void* parameter) {
|
||||
txActive = xSemaphoreCreateBinary();
|
||||
xSemaphoreGive(txActive);
|
||||
while (1) {
|
||||
struct rxCmd* rxcmd = nullptr;
|
||||
BaseType_t q = xQueueReceive(rxCmdQueue, &rxcmd, 10);
|
||||
if (q == pdTRUE) {
|
||||
switch (rxcmd->type) {
|
||||
case RX_CMD_RQB:
|
||||
processBlockRequest((struct espBlockRequest*)rxcmd->data);
|
||||
if (apInfo.isOnline) {
|
||||
struct rxCmd* rxcmd = nullptr;
|
||||
BaseType_t q = xQueueReceive(rxCmdQueue, &rxcmd, 10);
|
||||
if (q == pdTRUE) {
|
||||
switch (rxcmd->type) {
|
||||
case RX_CMD_RQB:
|
||||
processBlockRequest((struct espBlockRequest*)rxcmd->data);
|
||||
#ifdef HAS_RGB_LED
|
||||
// shortBlink(CRGB::Blue);
|
||||
// shortBlink(CRGB::Blue);
|
||||
#endif
|
||||
quickBlink(3);
|
||||
break;
|
||||
case RX_CMD_ADR:
|
||||
processDataReq((struct espAvailDataReq*)rxcmd->data, true);
|
||||
quickBlink(3);
|
||||
break;
|
||||
case RX_CMD_ADR:
|
||||
processDataReq((struct espAvailDataReq*)rxcmd->data, true);
|
||||
#ifdef HAS_RGB_LED
|
||||
// shortBlink(CRGB::Aqua);
|
||||
// shortBlink(CRGB::Aqua);
|
||||
#endif
|
||||
quickBlink(1);
|
||||
break;
|
||||
case RX_CMD_XFC:
|
||||
processXferComplete((struct espXferComplete*)rxcmd->data, true);
|
||||
quickBlink(1);
|
||||
break;
|
||||
case RX_CMD_XFC:
|
||||
processXferComplete((struct espXferComplete*)rxcmd->data, true);
|
||||
#ifdef HAS_RGB_LED
|
||||
// shortBlink(CRGB::Purple);
|
||||
// shortBlink(CRGB::Purple);
|
||||
#endif
|
||||
break;
|
||||
case RX_CMD_XTO:
|
||||
processXferTimeout((struct espXferComplete*)rxcmd->data, true);
|
||||
break;
|
||||
case RX_CMD_RSET:
|
||||
Serial.println("AP did reset, resending pending\r\n");
|
||||
refreshAllPending();
|
||||
sendChannelPower(&curChannel);
|
||||
break;
|
||||
case RX_CMD_TRD:
|
||||
// received tag return data
|
||||
processTagReturnData((struct espTagReturnData*)rxcmd->data, rxcmd->len, true);
|
||||
break;
|
||||
break;
|
||||
case RX_CMD_XTO:
|
||||
processXferTimeout((struct espXferComplete*)rxcmd->data, true);
|
||||
break;
|
||||
case RX_CMD_RSET:
|
||||
Serial.println("AP did reset, resending pending\r\n");
|
||||
refreshAllPending();
|
||||
sendChannelPower(&curChannel);
|
||||
break;
|
||||
case RX_CMD_TRD:
|
||||
// received tag return data
|
||||
processTagReturnData((struct espTagReturnData*)rxcmd->data, rxcmd->len, true);
|
||||
break;
|
||||
}
|
||||
if (rxcmd->data) free(rxcmd->data);
|
||||
if (rxcmd) free(rxcmd);
|
||||
}
|
||||
if (rxcmd->data) free(rxcmd->data);
|
||||
if (rxcmd) free(rxcmd);
|
||||
}
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
void rxSerialTask(void* parameter) {
|
||||
@@ -435,7 +463,9 @@ void rxSerialTask(void* parameter) {
|
||||
static char lastchar = 0;
|
||||
static uint8_t charindex = 0;
|
||||
|
||||
while (1) {
|
||||
gSerialTaskState = SERIAL_STATE_RUNNING;
|
||||
LOG("rxSerialTask starting\n");
|
||||
while (gSerialTaskState == SERIAL_STATE_RUNNING) {
|
||||
while (AP_SERIAL_PORT.available()) {
|
||||
lastchar = AP_SERIAL_PORT.read();
|
||||
switch (RXState) {
|
||||
@@ -506,8 +536,8 @@ void rxSerialTask(void* parameter) {
|
||||
packetp = (uint8_t*)calloc(sizeof(struct espBlockRequest) + 8, 1);
|
||||
memset(cmdbuffer, 0x00, 4);
|
||||
lastAPActivity = millis();
|
||||
if (apInfo.isOnline == false)
|
||||
setAPstate(true, AP_STATE_ONLINE);
|
||||
// don't set APstate heree, as it interferes with the flashing process
|
||||
// if (apInfo.isOnline == false && config.runStatus == RUNSTATUS_RUN) setAPstate(true, AP_STATE_ONLINE);
|
||||
}
|
||||
if (strncmp(cmdbuffer, "ADR>", 4) == 0) {
|
||||
RXState = ZBS_RX_WAIT_DATA_REQ;
|
||||
@@ -516,8 +546,8 @@ void rxSerialTask(void* parameter) {
|
||||
packetp = (uint8_t*)calloc(sizeof(struct espAvailDataReq) + 8, 1);
|
||||
memset(cmdbuffer, 0x00, 4);
|
||||
lastAPActivity = millis();
|
||||
if (apInfo.isOnline == false)
|
||||
setAPstate(true, AP_STATE_ONLINE);
|
||||
// don't set APstate heree, as it interferes with the flashing process
|
||||
// if (apInfo.isOnline == false && config.runStatus == RUNSTATUS_RUN) setAPstate(true, AP_STATE_ONLINE);
|
||||
}
|
||||
if (strncmp(cmdbuffer, "XFC>", 4) == 0) {
|
||||
RXState = ZBS_RX_WAIT_XFERCOMPLETE;
|
||||
@@ -540,8 +570,6 @@ void rxSerialTask(void* parameter) {
|
||||
packetp = (uint8_t*)calloc(sizeof(struct espTagReturnData) + 8, 1);
|
||||
memset(cmdbuffer, 0x00, 4);
|
||||
lastAPActivity = millis();
|
||||
if (apInfo.isOnline == false)
|
||||
setAPstate(true, AP_STATE_ONLINE);
|
||||
}
|
||||
break;
|
||||
case ZBS_RX_BLOCK_REQUEST:
|
||||
@@ -666,10 +694,26 @@ void rxSerialTask(void* parameter) {
|
||||
}
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
} // end of while(1)
|
||||
|
||||
AP_SERIAL_PORT.end();
|
||||
gSerialTaskState = SERIAL_STATE_STOPPED;
|
||||
LOG("rxSerialTask stopped\n");
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
#if defined(FLASHER_DEBUG_RXD) && !defined(FLASHER_DEBUG_SHARED)
|
||||
uint32_t millisDiff(uint32_t m) {
|
||||
uint32_t ms = millis();
|
||||
if (ms >= m)
|
||||
return ms - m;
|
||||
else
|
||||
return UINT32_MAX - m + ms + 1;
|
||||
}
|
||||
|
||||
#ifdef FLASHER_DEBUG_RXD
|
||||
void rxSerialTask2(void* parameter) {
|
||||
char rxStr[100] = {0};
|
||||
int rxStrCount = 0;
|
||||
uint32_t modemResetHoldoff = millis();
|
||||
char lastchar = 0;
|
||||
time_t startTime = millis();
|
||||
int charCount = 0;
|
||||
@@ -681,6 +725,33 @@ void rxSerialTask2(void* parameter) {
|
||||
|
||||
// debug info
|
||||
Serial.write(lastchar);
|
||||
|
||||
rxStr[rxStrCount] = lastchar;
|
||||
if (lastchar == '\n' || lastchar == '\r') {
|
||||
if (strncmp(rxStr, "receive buffer full, drop the current frame", 43) == 0 && millisDiff(modemResetHoldoff) > 20000) {
|
||||
modemResetHoldoff = millis();
|
||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||
config.runStatus = RUNSTATUS_STOP;
|
||||
Serial.println("IEEE802.15.4 modem stuck case detected, resetting...");
|
||||
APTagReset();
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
Serial.println("bringing AP online again");
|
||||
if (bringAPOnline()) {
|
||||
config.runStatus = RUNSTATUS_RUN;
|
||||
Serial.println("Finished!");
|
||||
} else {
|
||||
Serial.println("Failed!");
|
||||
}
|
||||
logLine("IEEE802.15.4 modem reset " + (config.runStatus == RUNSTATUS_RUN) ? ("ok") : ("failed"));
|
||||
}
|
||||
rxStrCount = 0;
|
||||
memset(rxStr, 0, sizeof(rxStr));
|
||||
} else if (rxStrCount < sizeof(rxStr) - 2) {
|
||||
rxStrCount++;
|
||||
} else {
|
||||
rxStrCount = 0;
|
||||
memset(rxStr, 0, sizeof(rxStr));
|
||||
}
|
||||
}
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
|
||||
@@ -688,7 +759,7 @@ void rxSerialTask2(void* parameter) {
|
||||
if (currentTime - startTime >= 1000) {
|
||||
if (charCount > 6000) {
|
||||
rxSerialStopTask2 = true;
|
||||
Serial.println("Serial monitor stopped because of flooding (" + String(charCount) + " characters per second");
|
||||
Serial.println("Serial monitor stopped because of flooding (" + String(charCount) + " characters per second)");
|
||||
}
|
||||
startTime = currentTime;
|
||||
charCount = 0;
|
||||
@@ -733,7 +804,7 @@ void checkWaitPowerCycle() {
|
||||
#endif
|
||||
}
|
||||
void segmentedShowIp() {
|
||||
IPAddress IP = WiFi.localIP();
|
||||
IPAddress IP = wm.localIP();
|
||||
char temp[12];
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
sendAPSegmentedData(apInfo.mac, (String) "IP Addr", 0x0200, true, true);
|
||||
@@ -746,12 +817,36 @@ void segmentedShowIp() {
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
|
||||
bool bringAPOnline() {
|
||||
#ifdef BLE_ONLY
|
||||
bool bringAPOnline(uint8_t newState) {
|
||||
#ifdef BLE_ONLY
|
||||
apInfo.state = AP_STATE_NORADIO;
|
||||
#endif
|
||||
#endif
|
||||
if (apInfo.state == AP_STATE_NORADIO) return true;
|
||||
if (apInfo.state == AP_STATE_FLASHING) return false;
|
||||
|
||||
if (gSerialTaskState != SERIAL_STATE_INITIALIZED) {
|
||||
#ifdef HAS_ELECROW_ADV_2_8
|
||||
// Set GPIO45 low to connect the wireless interface to the multiplexed pins
|
||||
pinMode(45, OUTPUT);
|
||||
digitalWrite(45, LOW);
|
||||
#endif
|
||||
|
||||
#if (AP_PROCESS_PORT == FLASHER_AP_PORT)
|
||||
AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD);
|
||||
#elif defined(HAS_EXT_FLASHER)
|
||||
#if (AP_PROCESS_PORT == FLASHER_EXT_PORT)
|
||||
AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD);
|
||||
#elif (AP_PROCESS_PORT == FLASHER_ALTRADIO_PORT)
|
||||
AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD);
|
||||
#endif
|
||||
#endif
|
||||
gSerialTaskState = SERIAL_STATE_INITIALIZED;
|
||||
}
|
||||
if (gSerialTaskState != SERIAL_STATE_RUNNING) {
|
||||
gSerialTaskState = SERIAL_STATE_STARTING;
|
||||
xTaskCreate(rxSerialTask, "rxSerialTask", 1750, NULL, 11, NULL);
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
}
|
||||
setAPstate(false, AP_STATE_OFFLINE);
|
||||
// try without rebooting
|
||||
AP_SERIAL_PORT.updateBaudRate(115200);
|
||||
@@ -788,18 +883,18 @@ bool bringAPOnline() {
|
||||
}
|
||||
|
||||
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||
setAPstate(true, AP_STATE_ONLINE);
|
||||
setAPstate(newState == AP_STATE_ONLINE ? true : false, newState);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool checkRadio() {
|
||||
#ifdef BLE_ONLY
|
||||
#ifdef BLE_ONLY
|
||||
return false;
|
||||
#endif
|
||||
#ifndef C6_OTA_FLASHING
|
||||
#endif
|
||||
#ifndef C6_OTA_FLASHING
|
||||
return true;
|
||||
#endif
|
||||
#endif
|
||||
// make a short between FLASHER_AP_TXD and FLASHER_AP_RXD to indicate that no radio is present
|
||||
// e.g. for flasher only, or just to use the S3 to generate images for smaller AP's
|
||||
pinMode(FLASHER_AP_TXD, OUTPUT);
|
||||
@@ -823,25 +918,11 @@ void APTask(void* parameter) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if (AP_PROCESS_PORT == FLASHER_AP_PORT)
|
||||
AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD);
|
||||
#endif
|
||||
#ifdef HAS_EXT_FLASHER
|
||||
#if (AP_PROCESS_PORT == FLASHER_EXT_PORT)
|
||||
AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD);
|
||||
#endif
|
||||
#if (AP_PROCESS_PORT == FLASHER_ALTRADIO_PORT)
|
||||
AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
xTaskCreate(rxCmdProcessor, "rxCmdProcessor", 6000, NULL, 15, NULL);
|
||||
xTaskCreate(rxSerialTask, "rxSerialTask", 1750, NULL, 11, NULL);
|
||||
#ifdef FLASHER_DEBUG_RXD
|
||||
xTaskCreate(rxSerialTask2, "rxSerialTask2", 1750, NULL, 2, NULL);
|
||||
#endif
|
||||
|
||||
#if defined(FLASHER_DEBUG_RXD) && !defined(FLASHER_DEBUG_SHARED)
|
||||
xTaskCreate(rxSerialTask2, "rxSerialTask2", 1850, NULL, 2, NULL);
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
#endif
|
||||
bringAPOnline();
|
||||
|
||||
#ifndef C6_OTA_FLASHING
|
||||
@@ -876,7 +957,7 @@ void APTask(void* parameter) {
|
||||
if (FLASHER_AP_MOSI != -1) {
|
||||
fsversion = getAPUpdateVersion(apInfo.type);
|
||||
if ((fsversion) && (apInfo.version != fsversion)) {
|
||||
Serial.printf("Firmware version on LittleFS: %04X\r\n", fsversion);
|
||||
Serial.printf("Firmware version on FS: %04X\r\n", fsversion);
|
||||
|
||||
Serial.printf("We're going to try to update the AP's FW in\r\n");
|
||||
flashCountDown(30);
|
||||
|
||||
@@ -2,22 +2,63 @@
|
||||
|
||||
#ifdef HAS_SDCARD
|
||||
#include "FS.h"
|
||||
#ifdef SD_CARD_SDMMC
|
||||
#include "SD_MMC.h"
|
||||
#define SDCARD SD_MMC
|
||||
#else
|
||||
#include "SD.h"
|
||||
#include "SPI.h"
|
||||
#define SDCARD SD
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SD_CARD_ONLY
|
||||
#include "LittleFS.h"
|
||||
#endif
|
||||
|
||||
DynStorage::DynStorage() : isInited(0) {}
|
||||
|
||||
SemaphoreHandle_t fsMutex;
|
||||
SemaphoreHandle_t fsMutex = NULL;
|
||||
|
||||
#ifndef SD_CARD_ONLY
|
||||
static void initLittleFS() {
|
||||
LittleFS.begin();
|
||||
contentFS = &LittleFS;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SDCARD
|
||||
static bool sd_init_done = false;
|
||||
#ifdef SD_CARD_SDMMC
|
||||
static void initSDCard() {
|
||||
if(!SD_MMC.begin("/sdcard", true, true, BOARD_MAX_SDMMC_FREQ, 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);
|
||||
|
||||
contentFS = &SD_MMC;
|
||||
}
|
||||
#else
|
||||
static SPIClass* spi;
|
||||
|
||||
static void initSDCard() {
|
||||
@@ -45,15 +86,19 @@ static void initSDCard() {
|
||||
contentFS = &SD;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
uint64_t DynStorage::freeSpace(){
|
||||
this->begin();
|
||||
#ifdef HAS_SDCARD
|
||||
return SD.totalBytes() - SD.usedBytes();
|
||||
return SDCARD.totalBytes() - SDCARD.usedBytes();
|
||||
#endif
|
||||
#ifndef SD_CARD_ONLY
|
||||
return LittleFS.totalBytes() - LittleFS.usedBytes();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef SD_CARD_ONLY
|
||||
void copyFile(File in, File out) {
|
||||
Serial.print("Copying ");
|
||||
Serial.print(in.path());
|
||||
@@ -127,14 +172,25 @@ void copyIfNeeded(const char* path) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void DynStorage::begin() {
|
||||
fsMutex = xSemaphoreCreateMutex();
|
||||
if(fsMutex == NULL) {
|
||||
fsMutex = xSemaphoreCreateMutex();
|
||||
}
|
||||
|
||||
#ifndef SD_CARD_ONLY
|
||||
initLittleFS();
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SDCARD
|
||||
initSDCard();
|
||||
|
||||
if(!sd_init_done) {
|
||||
xSemaphoreTake(fsMutex, portMAX_DELAY);
|
||||
initSDCard();
|
||||
xSemaphoreGive(fsMutex);
|
||||
sd_init_done = true;
|
||||
}
|
||||
#ifndef SD_CARD_ONLY
|
||||
copyIfNeeded("/index.html");
|
||||
copyIfNeeded("/fonts");
|
||||
copyIfNeeded("/www");
|
||||
@@ -143,6 +199,7 @@ void DynStorage::begin() {
|
||||
copyIfNeeded("/tag_md5_db.json");
|
||||
copyIfNeeded("/update_actions.json");
|
||||
copyIfNeeded("/content_template.json");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (!contentFS->exists("/current")) {
|
||||
@@ -155,7 +212,17 @@ void DynStorage::begin() {
|
||||
|
||||
void DynStorage::end() {
|
||||
#ifdef HAS_SDCARD
|
||||
#ifndef SD_CARD_ONLY
|
||||
initLittleFS();
|
||||
#endif
|
||||
#ifdef SD_CARD_SDMMC
|
||||
#ifndef SD_CARD_ONLY
|
||||
contentFS = &LittleFS;
|
||||
#endif
|
||||
SD_MMC.end();
|
||||
sd_init_done = false;
|
||||
#else
|
||||
#ifndef SD_CARD_ONLY
|
||||
if (SD_CARD_CLK == FLASHER_AP_CLK ||
|
||||
SD_CARD_MISO == FLASHER_AP_MISO ||
|
||||
SD_CARD_MOSI == FLASHER_AP_MOSI) {
|
||||
@@ -171,7 +238,8 @@ void DynStorage::end() {
|
||||
|
||||
contentFS = &LittleFS;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -264,7 +264,19 @@ void nrfswd::write_register(uint32_t address, uint32_t value) {
|
||||
bool state3 = DP_Read(DP_RDBUFF, temp);
|
||||
// if (showDebug) Serial.printf("%i%i%i Write Register: 0x%08x : 0x%08x\r\n", state1, state2, state3, address, value);
|
||||
}
|
||||
|
||||
uint8_t nrfswd::nrf_erase_all() {
|
||||
nrf_port_selection(1);
|
||||
nrf_write_port(1, AP_NRF_ERASEALL, 1);
|
||||
long timeout = millis();
|
||||
while (nrf_read_port(1, AP_NRF_ERASEALLSTATUS)) {
|
||||
if (millis() - timeout > 1000) return 1;
|
||||
}
|
||||
nrf_write_port(1, AP_NRF_ERASEALL, 0);
|
||||
nrf_port_selection(0);
|
||||
nrf_soft_reset();
|
||||
init();
|
||||
return 0;
|
||||
}
|
||||
uint8_t nrfswd::erase_all_flash() {
|
||||
write_register(0x4001e504, 2);
|
||||
long timeout = millis();
|
||||
|
||||
@@ -14,7 +14,7 @@ void timeSyncCallback(struct timeval* tv) {
|
||||
}
|
||||
|
||||
void initTime(void* parameter) {
|
||||
if (WiFi.status() != WL_CONNECTED) {
|
||||
if (!(WiFi.status() == WL_CONNECTED || wm.wifiStatus == ETHERNET)) {
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
}
|
||||
sntp_set_time_sync_notification_cb(timeSyncCallback);
|
||||
|
||||
@@ -67,25 +67,24 @@ bool hex2mac(const String& hexString, uint8_t* mac) {
|
||||
}
|
||||
|
||||
String tagDBtoJson(const uint8_t mac[8], uint8_t startPos) {
|
||||
DynamicJsonDocument doc(5000);
|
||||
JsonArray tags = doc.createNestedArray("tags");
|
||||
JsonDocument doc;
|
||||
JsonArray tags = doc["tags"].to<JsonArray>();
|
||||
|
||||
for (uint32_t c = startPos; c < tagDB.size(); ++c) {
|
||||
const tagRecord* taginfo = tagDB.at(c);
|
||||
|
||||
const bool select = !mac || memcmp(taginfo->mac, mac, 8) == 0;
|
||||
if (select && taginfo->version == 0) {
|
||||
JsonObject tag = tags.createNestedObject();
|
||||
JsonObject tag = tags.add<JsonObject>();
|
||||
fillNode(tag, taginfo);
|
||||
if (measureJson(doc) > 5000) {
|
||||
doc["continu"] = c + 1;
|
||||
break;
|
||||
}
|
||||
if (mac) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (doc.capacity() - doc.memoryUsage() < doc.memoryUsage() / (c + 1) + 500) {
|
||||
doc["continu"] = c + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return doc.as<String>();
|
||||
@@ -126,7 +125,7 @@ void fillNode(JsonObject& tag, const tagRecord* taginfo) {
|
||||
}
|
||||
|
||||
void saveDB(const String& filename) {
|
||||
DynamicJsonDocument doc(2500);
|
||||
JsonDocument doc;
|
||||
|
||||
const long t = millis();
|
||||
|
||||
@@ -138,8 +137,10 @@ void saveDB(const String& filename) {
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
String backupFilename = filename + ".bak";
|
||||
if (!contentFS->rename(filename.c_str(), backupFilename.c_str())) {
|
||||
xSemaphoreGive(fsMutex);
|
||||
logLine("error renaming tagDB to .bak");
|
||||
wsErr("error renaming tagDB to .bak");
|
||||
xSemaphoreTake(fsMutex, portMAX_DELAY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,7 +157,7 @@ void saveDB(const String& filename) {
|
||||
doc.clear();
|
||||
|
||||
if (taginfo->version == 0) {
|
||||
JsonObject tag = doc.createNestedObject();
|
||||
JsonObject tag = doc.add<JsonObject>();
|
||||
fillNode(tag, taginfo);
|
||||
if (c > 0) {
|
||||
file.write(',');
|
||||
@@ -186,7 +187,7 @@ bool loadDB(const String& filename) {
|
||||
bool parsing = true;
|
||||
|
||||
if (readfile.find("[")) {
|
||||
DynamicJsonDocument doc(1000);
|
||||
JsonDocument doc;
|
||||
while (parsing) {
|
||||
DeserializationError err = deserializeJson(doc, readfile);
|
||||
if (!err) {
|
||||
@@ -210,7 +211,7 @@ bool loadDB(const String& filename) {
|
||||
taginfo->nextupdate = (uint32_t)tag["nextupdate"];
|
||||
taginfo->expectedNextCheckin = (uint32_t)tag["nextcheckin"];
|
||||
if (taginfo->expectedNextCheckin < now) {
|
||||
taginfo->expectedNextCheckin = now + 1800;
|
||||
taginfo->expectedNextCheckin = now + 60;
|
||||
}
|
||||
taginfo->pendingCount = 0;
|
||||
taginfo->alias = tag["alias"].as<String>();
|
||||
@@ -279,11 +280,11 @@ uint32_t getTagCount(uint32_t& timeoutcount, uint32_t& lowbattcount) {
|
||||
if (!taginfo->isExternal) tagcount++;
|
||||
const int32_t timeout = now - taginfo->lastseen;
|
||||
if (taginfo->expectedNextCheckin < 3600) {
|
||||
// not initialised, timeout if not seen last 10 minutes
|
||||
if (timeout > 600) timeoutcount++;
|
||||
} else if (now - taginfo->expectedNextCheckin > 600) {
|
||||
// expected checkin is behind, timeout if not seen last 10 minutes
|
||||
if (timeout > 600) timeoutcount++;
|
||||
// not initialised, timeout if not seen last 5 minutes
|
||||
if (timeout > config.maxsleep * 60 + 300) timeoutcount++;
|
||||
} else if (now - static_cast<time_t>(taginfo->expectedNextCheckin) > 600) {
|
||||
// expected checkin is behind, timeout if not seen last 5 minutes
|
||||
if (timeout > config.maxsleep * 60 + 300) timeoutcount++;
|
||||
}
|
||||
if (taginfo->batteryMv < 2400 && taginfo->batteryMv != 0 && taginfo->batteryMv != 1337) lowbattcount++;
|
||||
}
|
||||
@@ -308,7 +309,7 @@ void clearPending(tagRecord* taginfo) {
|
||||
}
|
||||
|
||||
void initAPconfig() {
|
||||
DynamicJsonDocument APconfig(768);
|
||||
JsonDocument APconfig;
|
||||
File configFile = contentFS->open("/current/apconfig.json", "r");
|
||||
if (configFile) {
|
||||
DeserializationError error = deserializeJson(APconfig, configFile);
|
||||
@@ -319,29 +320,30 @@ void initAPconfig() {
|
||||
}
|
||||
configFile.close();
|
||||
}
|
||||
config.channel = APconfig.containsKey("channel") ? APconfig["channel"] : 0;
|
||||
config.subghzchannel = APconfig.containsKey("subghzchannel") ? APconfig["subghzchannel"] : 0;
|
||||
config.channel = APconfig["channel"].is<uint8_t>() ? APconfig["channel"] : 0;
|
||||
config.subghzchannel = APconfig["subghzchannel"].is<uint8_t>() ? APconfig["subghzchannel"] : 0;
|
||||
if (APconfig["alias"]) strlcpy(config.alias, APconfig["alias"], sizeof(config.alias));
|
||||
config.led = APconfig.containsKey("led") ? APconfig["led"] : 255;
|
||||
config.tft = APconfig.containsKey("tft") ? APconfig["tft"] : 255;
|
||||
config.language = APconfig.containsKey("language") ? APconfig["language"] : 0;
|
||||
config.maxsleep = APconfig.containsKey("maxsleep") ? APconfig["maxsleep"] : 10;
|
||||
config.stopsleep = APconfig.containsKey("stopsleep") ? APconfig["stopsleep"] : 1;
|
||||
config.preview = APconfig.containsKey("preview") ? APconfig["preview"] : 1;
|
||||
config.nightlyreboot = APconfig.containsKey("nightlyreboot") ? APconfig["nightlyreboot"] : 1;
|
||||
config.lock = APconfig.containsKey("lock") ? APconfig["lock"] : 0;
|
||||
config.sleepTime1 = APconfig.containsKey("sleeptime1") ? APconfig["sleeptime1"] : 0;
|
||||
config.sleepTime2 = APconfig.containsKey("sleeptime2") ? APconfig["sleeptime2"] : 0;
|
||||
config.ble = APconfig.containsKey("ble") ? APconfig["ble"] : 0;
|
||||
config.discovery = APconfig.containsKey("discovery") ? APconfig["discovery"] : 0;
|
||||
config.led = APconfig["led"].is<uint8_t>() ? APconfig["led"] : 255;
|
||||
config.tft = APconfig["tft"].is<uint8_t>() ? APconfig["tft"] : 255;
|
||||
config.language = APconfig["language"].is<uint8_t>() ? APconfig["language"] : 0;
|
||||
config.maxsleep = APconfig["maxsleep"].is<uint8_t>() ? APconfig["maxsleep"] : 10;
|
||||
config.stopsleep = APconfig["stopsleep"].is<uint8_t>() ? APconfig["stopsleep"] : 1;
|
||||
config.preview = APconfig["preview"].is<uint8_t>() ? APconfig["preview"] : 1;
|
||||
config.nightlyreboot = APconfig["nightlyreboot"].is<uint8_t>() ? APconfig["nightlyreboot"] : 1;
|
||||
config.lock = APconfig["lock"].is<uint8_t>() ? APconfig["lock"] : 0;
|
||||
config.sleepTime1 = APconfig["sleeptime1"].is<uint8_t>() ? APconfig["sleeptime1"] : 0;
|
||||
config.sleepTime2 = APconfig["sleeptime2"].is<uint8_t>() ? APconfig["sleeptime2"] : 0;
|
||||
config.ble = APconfig["ble"].is<uint8_t>() ? APconfig["ble"] : 0;
|
||||
config.discovery = APconfig["discovery"].is<uint8_t>() ? APconfig["discovery"] : 0;
|
||||
config.showtimestamp = APconfig["showtimestamp"].is<uint8_t>() ? APconfig["showtimestamp"] : 0;
|
||||
#ifdef BLE_ONLY
|
||||
config.ble = true;
|
||||
config.ble = true;
|
||||
#endif
|
||||
// default wifi power 8.5 dbM
|
||||
// see https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiGeneric.h#L111
|
||||
config.wifiPower = APconfig.containsKey("wifipower") ? APconfig["wifipower"] : 34;
|
||||
config.repo = APconfig.containsKey("repo") ? APconfig["repo"].as<String>() : String("OpenEPaperLink/OpenEPaperLink");
|
||||
config.env = APconfig.containsKey("env") ? APconfig["env"].as<String>() : String(STR(BUILD_ENV_NAME));
|
||||
config.wifiPower = APconfig["wifipower"].is<uint8_t>() ? APconfig["wifipower"] : 34;
|
||||
config.repo = APconfig["repo"].is<String>() ? APconfig["repo"].as<String>() : String("OpenEPaperLink/OpenEPaperLink");
|
||||
config.env = APconfig["env"].is<String>() ? APconfig["env"].as<String>() : String(STR(BUILD_ENV_NAME));
|
||||
if (APconfig["timezone"]) {
|
||||
strlcpy(config.timeZone, APconfig["timezone"], sizeof(config.timeZone));
|
||||
} else {
|
||||
@@ -352,7 +354,7 @@ void initAPconfig() {
|
||||
void saveAPconfig() {
|
||||
xSemaphoreTake(fsMutex, portMAX_DELAY);
|
||||
fs::File configFile = contentFS->open("/current/apconfig.json", "w");
|
||||
DynamicJsonDocument APconfig(500);
|
||||
JsonDocument APconfig;
|
||||
APconfig["channel"] = config.channel;
|
||||
APconfig["subghzchannel"] = config.subghzchannel;
|
||||
APconfig["alias"] = config.alias;
|
||||
@@ -372,6 +374,7 @@ void saveAPconfig() {
|
||||
APconfig["repo"] = config.repo;
|
||||
APconfig["env"] = config.env;
|
||||
APconfig["discovery"] = config.discovery;
|
||||
APconfig["showtimestamp"] = config.showtimestamp;
|
||||
serializeJsonPretty(APconfig, configFile);
|
||||
configFile.close();
|
||||
xSemaphoreGive(fsMutex);
|
||||
@@ -388,7 +391,7 @@ HwType getHwType(const uint8_t id) {
|
||||
File jsonFile = contentFS->open(filename, "r");
|
||||
|
||||
if (jsonFile) {
|
||||
StaticJsonDocument<150> filter;
|
||||
JsonDocument filter;
|
||||
filter["width"] = true;
|
||||
filter["height"] = true;
|
||||
filter["rotatebuffer"] = true;
|
||||
@@ -398,7 +401,7 @@ HwType getHwType(const uint8_t id) {
|
||||
filter["g5_compression"] = true;
|
||||
filter["highlight_color"] = true;
|
||||
filter["colortable"] = true;
|
||||
StaticJsonDocument<1000> doc;
|
||||
JsonDocument doc;
|
||||
DeserializationError error = deserializeJson(doc, jsonFile, DeserializationOption::Filter(filter));
|
||||
jsonFile.close();
|
||||
if (error) {
|
||||
@@ -412,17 +415,17 @@ HwType getHwType(const uint8_t id) {
|
||||
hwType.rotatebuffer = doc["rotatebuffer"];
|
||||
hwType.bpp = doc["bpp"];
|
||||
hwType.shortlut = doc["shortlut"];
|
||||
if (doc.containsKey("zlib_compression")) {
|
||||
if (doc["zlib_compression"].is<const char*>()) {
|
||||
hwType.zlib = strtol(doc["zlib_compression"], nullptr, 16);
|
||||
} else {
|
||||
hwType.zlib = 0;
|
||||
}
|
||||
if (doc.containsKey("g5_compression")) {
|
||||
if (doc["g5_compression"].is<const char*>()) {
|
||||
hwType.g5 = strtol(doc["g5_compression"], nullptr, 16);
|
||||
} else {
|
||||
hwType.g5 = 0;
|
||||
}
|
||||
hwType.highlightColor = doc.containsKey("highlight_color") ? doc["highlight_color"].as<uint16_t>() : 2;
|
||||
hwType.highlightColor = doc["highlight_color"].is<uint16_t>() ? doc["highlight_color"].as<uint16_t>() : 2;
|
||||
JsonObject colorTable = doc["colortable"];
|
||||
for (auto kv : colorTable) {
|
||||
JsonArray color = kv.value();
|
||||
|
||||
@@ -10,6 +10,9 @@ std::unordered_map<size_t, TagData::Parser> TagData::parsers = {};
|
||||
void TagData::loadParsers(const String& filename) {
|
||||
const long start = millis();
|
||||
|
||||
if (!contentFS->exists(filename)) {
|
||||
return;
|
||||
}
|
||||
fs::File file = contentFS->open(filename, "r");
|
||||
if (!file) {
|
||||
return;
|
||||
@@ -17,7 +20,7 @@ void TagData::loadParsers(const String& filename) {
|
||||
Serial.println("Reading parsers from file");
|
||||
|
||||
if (file.find("[")) {
|
||||
DynamicJsonDocument doc(1000);
|
||||
JsonDocument doc;
|
||||
bool parsing = true;
|
||||
while (parsing) {
|
||||
DeserializationError err = deserializeJson(doc, file);
|
||||
@@ -145,4 +148,4 @@ void TagData::parse(const uint8_t src[8], const size_t id, const uint8_t* data,
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "serialap.h"
|
||||
#include "tag_db.h"
|
||||
#include "web.h"
|
||||
#include "wifimanager.h"
|
||||
|
||||
#define UDPIP IPAddress(239, 10, 0, 1)
|
||||
#define UDPPORT 16033
|
||||
@@ -34,7 +35,7 @@ void UDPcomm::init() {
|
||||
if (config.discovery == 0) {
|
||||
if (udp.listenMulticast(UDPIP, UDPPORT)) {
|
||||
udp.onPacket([this](AsyncUDPPacket packet) {
|
||||
if (packet.remoteIP() != WiFi.localIP()) {
|
||||
if (packet.remoteIP() != wm.localIP()) {
|
||||
this->processPacket(packet);
|
||||
}
|
||||
});
|
||||
@@ -42,7 +43,7 @@ void UDPcomm::init() {
|
||||
} else {
|
||||
if (udp.listen(UDPPORT)) {
|
||||
udp.onPacket([this](AsyncUDPPacket packet) {
|
||||
if (packet.isBroadcast() && packet.remoteIP() != WiFi.localIP()) {
|
||||
if (packet.isBroadcast() && packet.remoteIP() != wm.localIP()) {
|
||||
this->processPacket(packet);
|
||||
}
|
||||
});
|
||||
@@ -88,7 +89,7 @@ void UDPcomm::processPacket(AsyncUDPPacket packet) {
|
||||
}
|
||||
case PKT_APLIST_REQ: {
|
||||
APlist APitem;
|
||||
APitem.src = WiFi.localIP();
|
||||
APitem.src = wm.localIP();
|
||||
strcpy(APitem.alias, config.alias);
|
||||
APitem.channelId = curChannel.channel;
|
||||
APitem.tagCount = getTagCount();
|
||||
@@ -154,7 +155,7 @@ void autoselect(void* pvParameters) {
|
||||
|
||||
void UDPcomm::getAPList() {
|
||||
APlist APitem;
|
||||
APitem.src = WiFi.localIP();
|
||||
APitem.src = wm.localIP();
|
||||
strcpy(APitem.alias, config.alias);
|
||||
APitem.channelId = curChannel.channel;
|
||||
APitem.tagCount = getTagCount();
|
||||
|
||||
@@ -306,6 +306,7 @@ typedef enum {
|
||||
|
||||
CMD_ERASE_FLASH = 26,
|
||||
CMD_ERASE_INFOPAGE = 27,
|
||||
CMD_ERASE_ALL = 28,
|
||||
CMD_SAVE_MAC_FROM_FW = 40,
|
||||
CMD_PASS_THROUGH = 50,
|
||||
|
||||
@@ -420,6 +421,16 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) {
|
||||
}
|
||||
sendFlasherAnswer(CMD_ERASE_INFOPAGE, NULL, 0, transportType);
|
||||
break;
|
||||
case CMD_ERASE_ALL:
|
||||
if (selectedController == CONTROLLER_NRF82511) {
|
||||
if (nrfflasherp == nullptr) return;
|
||||
nrfflasherp->nrf_erase_all();
|
||||
} else if (selectedController == CONTROLLER_CC) {
|
||||
if (ccflasherp == nullptr) return;
|
||||
ccflasherp->erase_chip();
|
||||
}
|
||||
sendFlasherAnswer(CMD_ERASE_ALL, NULL, 0, transportType);
|
||||
break;
|
||||
case CMD_SELECT_PORT:
|
||||
wsSerial("> select port");
|
||||
selectedFlasherPort = cmd->data[0];
|
||||
@@ -453,7 +464,7 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) {
|
||||
break;
|
||||
}
|
||||
nrfflasherp->init();
|
||||
temp_buff[0] = (nrfflasherp->isConnected && !nrfflasherp->isLocked);
|
||||
temp_buff[0] = nrfflasherp->isConnected ? (nrfflasherp->isLocked ? 2 : 1) : 0;
|
||||
sendFlasherAnswer(CMD_SELECT_NRF82511, temp_buff, 1, transportType);
|
||||
currentFlasherOffset = 0;
|
||||
selectedController = CONTROLLER_NRF82511;
|
||||
|
||||
@@ -26,13 +26,12 @@
|
||||
#include "tag_db.h"
|
||||
#include "udp.h"
|
||||
#include "wifimanager.h"
|
||||
#include <sys/time.h>
|
||||
|
||||
#ifdef HAS_EXT_FLASHER
|
||||
#include "webflasher.h"
|
||||
#endif
|
||||
|
||||
extern uint8_t data_to_send[];
|
||||
|
||||
AsyncWebServer server(80);
|
||||
AsyncWebSocket ws("/ws");
|
||||
WifiManager wm;
|
||||
@@ -41,7 +40,7 @@ SemaphoreHandle_t wsMutex;
|
||||
uint32_t lastssidscan = 0;
|
||||
|
||||
void wsLog(const String &text) {
|
||||
StaticJsonDocument<250> doc;
|
||||
JsonDocument doc;
|
||||
doc["logMsg"] = text;
|
||||
if (wsMutex) xSemaphoreTake(wsMutex, portMAX_DELAY);
|
||||
ws.textAll(doc.as<String>());
|
||||
@@ -49,7 +48,7 @@ void wsLog(const String &text) {
|
||||
}
|
||||
|
||||
void wsErr(const String &text) {
|
||||
StaticJsonDocument<250> doc;
|
||||
JsonDocument doc;
|
||||
doc["errMsg"] = text;
|
||||
if (wsMutex) xSemaphoreTake(wsMutex, portMAX_DELAY);
|
||||
ws.textAll(doc.as<String>());
|
||||
@@ -68,8 +67,8 @@ size_t dbSize() {
|
||||
}
|
||||
|
||||
void wsSendSysteminfo() {
|
||||
DynamicJsonDocument doc(300);
|
||||
JsonObject sys = doc.createNestedObject("sys");
|
||||
JsonDocument doc;
|
||||
JsonObject sys = doc["sys"].to<JsonObject>();
|
||||
time_t now;
|
||||
time(&now);
|
||||
static int freeSpaceLastRun = 0;
|
||||
@@ -109,7 +108,7 @@ void wsSendSysteminfo() {
|
||||
strftime(timeBuffer, sizeof(timeBuffer), languageDateFormat[0].c_str(), &timeinfo);
|
||||
setVarDB("ap_date", timeBuffer);
|
||||
}
|
||||
setVarDB("ap_ip", WiFi.localIP().toString());
|
||||
setVarDB("ap_ip", wm.localIP().toString());
|
||||
|
||||
#ifdef HAS_SUBGHZ
|
||||
String ApChanString = String(apInfo.channel);
|
||||
@@ -208,8 +207,8 @@ void wsSendTaginfo(const uint8_t *mac, uint8_t syncMode) {
|
||||
}
|
||||
|
||||
void wsSendAPitem(struct APlist *apitem) {
|
||||
DynamicJsonDocument doc(250);
|
||||
JsonObject ap = doc.createNestedObject("apitem");
|
||||
JsonDocument doc;
|
||||
JsonObject ap = doc["apitem"].to<JsonObject>();
|
||||
|
||||
char version_str[6];
|
||||
sprintf(version_str, "%04X", apitem->version);
|
||||
@@ -230,7 +229,7 @@ void wsSerial(const String &text) {
|
||||
}
|
||||
|
||||
void wsSerial(const String &text, const String &color) {
|
||||
StaticJsonDocument<250> doc;
|
||||
JsonDocument doc;
|
||||
doc["console"] = text;
|
||||
if (!color.isEmpty()) doc["color"] = color;
|
||||
Serial.println(text);
|
||||
@@ -324,7 +323,7 @@ void init_web() {
|
||||
return;
|
||||
}
|
||||
}
|
||||
request->send_P(200, "application/octet-stream", queueItem->data, queueItem->len);
|
||||
request->send(200, "application/octet-stream", queueItem->data, queueItem->len);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@@ -338,7 +337,7 @@ void init_web() {
|
||||
taginfo->data = getDataForFile(file);
|
||||
file.close();
|
||||
}
|
||||
request->send_P(200, "application/octet-stream", taginfo->data, taginfo->len);
|
||||
request->send(200, "application/octet-stream", taginfo->data, taginfo->len);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -516,13 +515,21 @@ void init_web() {
|
||||
UDPcomm udpsync;
|
||||
udpsync.getAPList();
|
||||
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
||||
String HasC6 = "0";
|
||||
String HasH2 = "0";
|
||||
String HasTSLR = "0";
|
||||
|
||||
response->print("{");
|
||||
#ifdef C6_OTA_FLASHING
|
||||
response->print("\"C6\": \"1\", ");
|
||||
#else
|
||||
response->print("\"C6\": \"0\", ");
|
||||
#ifdef HAS_H2
|
||||
HasH2 = "1";
|
||||
#elif defined(HAS_TSLR)
|
||||
HasTSLR = "1";
|
||||
#elif defined(C6_OTA_FLASHING)
|
||||
HasC6 = "1";
|
||||
#endif
|
||||
response->print("\"C6\": \"" + HasC6 + "\", ");
|
||||
response->print("\"H2\": \"" + HasH2 + "\", ");
|
||||
response->print("\"TLSR\": \"" + HasTSLR + "\", ");
|
||||
#ifdef SAVE_SPACE
|
||||
response->print("\"savespace\": \"1\", ");
|
||||
#else
|
||||
@@ -628,6 +635,9 @@ void init_web() {
|
||||
if (request->hasParam("discovery", true)) {
|
||||
config.discovery = static_cast<uint8_t>(request->getParam("discovery", true)->value().toInt());
|
||||
}
|
||||
if (request->hasParam("showtimestamp", true)) {
|
||||
config.showtimestamp = static_cast<uint8_t>(request->getParam("showtimestamp", true)->value().toInt());
|
||||
}
|
||||
if (request->hasParam("repo", true)) {
|
||||
config.repo = request->getParam("repo", true)->value();
|
||||
}
|
||||
@@ -639,6 +649,28 @@ void init_web() {
|
||||
request->send(200, "text/plain", "Ok, saved");
|
||||
});
|
||||
|
||||
// Allow external time sync (e.g., from Home Assistant) without Internet
|
||||
// Usage: POST /set_time with form field 'epoch' (UNIX time seconds)
|
||||
server.on("/set_time", HTTP_POST, [](AsyncWebServerRequest *request) {
|
||||
if (request->hasParam("epoch", true)) {
|
||||
time_t epoch = static_cast<time_t>(request->getParam("epoch", true)->value().toInt());
|
||||
if (epoch > 1600000000) { // basic sanity check (~2020-09-13)
|
||||
struct timeval tv;
|
||||
tv.tv_sec = epoch;
|
||||
tv.tv_usec = 0;
|
||||
settimeofday(&tv, nullptr);
|
||||
logLine("Time set via /set_time");
|
||||
wsSendSysteminfo();
|
||||
request->send(200, "text/plain", "ok");
|
||||
return;
|
||||
} else {
|
||||
request->send(400, "text/plain", "invalid epoch");
|
||||
return;
|
||||
}
|
||||
}
|
||||
request->send(400, "text/plain", "missing 'epoch'");
|
||||
});
|
||||
|
||||
server.on("/set_var", HTTP_POST, [](AsyncWebServerRequest *request) {
|
||||
if (request->hasParam("key", true) && request->hasParam("val", true)) {
|
||||
std::string key = request->getParam("key", true)->value().c_str();
|
||||
@@ -652,7 +684,7 @@ void init_web() {
|
||||
});
|
||||
server.on("/set_vars", HTTP_POST, [](AsyncWebServerRequest *request) {
|
||||
if (request->hasParam("json", true)) {
|
||||
DynamicJsonDocument jsonDocument(2048);
|
||||
JsonDocument jsonDocument;
|
||||
DeserializationError error = deserializeJson(jsonDocument, request->getParam("json", true)->value());
|
||||
if (error) {
|
||||
request->send(400, "text/plain", "Failed to parse JSON");
|
||||
@@ -679,7 +711,7 @@ void init_web() {
|
||||
server.on("/get_wifi_config", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
Preferences preferences;
|
||||
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
||||
StaticJsonDocument<250> doc;
|
||||
JsonDocument doc;
|
||||
preferences.begin("wifi", false);
|
||||
const char *keys[] = {"ssid", "pw", "ip", "mask", "gw", "dns"};
|
||||
const size_t numKeys = sizeof(keys) / sizeof(keys[0]);
|
||||
@@ -693,13 +725,13 @@ void init_web() {
|
||||
|
||||
server.on("/get_ssid_list", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
||||
DynamicJsonDocument doc(5000);
|
||||
JsonDocument doc;
|
||||
|
||||
doc["scanstatus"] = WiFi.scanComplete();
|
||||
JsonArray networks = doc.createNestedArray("networks");
|
||||
JsonArray networks = doc["networks"].to<JsonArray>();
|
||||
for (int i = 0; i < (WiFi.scanComplete() > 50 ? 50 : WiFi.scanComplete()); ++i) {
|
||||
if (WiFi.SSID(i) != "") {
|
||||
JsonObject network = networks.createNestedObject();
|
||||
JsonObject network = networks.add<JsonObject>();
|
||||
network["ssid"] = WiFi.SSID(i);
|
||||
network["ch"] = WiFi.channel(i);
|
||||
network["rssi"] = WiFi.RSSI(i);
|
||||
@@ -725,7 +757,7 @@ void init_web() {
|
||||
const size_t numKeys = sizeof(keys) / sizeof(keys[0]);
|
||||
for (size_t i = 0; i < numKeys; i++) {
|
||||
String key = keys[i];
|
||||
if (jsonObj.containsKey(key)) {
|
||||
if (jsonObj[key].is<String>()) {
|
||||
preferences.putString(key.c_str(), jsonObj[key].as<String>());
|
||||
}
|
||||
}
|
||||
@@ -868,10 +900,11 @@ void doImageUpload(AsyncWebServerRequest *request, String filename, size_t index
|
||||
file.write(uploadInfo->buffer, uploadInfo->bufferSize);
|
||||
file.close();
|
||||
uploadInfo->bufferSize = 0;
|
||||
xSemaphoreGive(fsMutex);
|
||||
} else {
|
||||
xSemaphoreGive(fsMutex);
|
||||
logLine("Failed to open file for appending: " + uploadfilename);
|
||||
}
|
||||
xSemaphoreGive(fsMutex);
|
||||
|
||||
memcpy(uploadInfo->buffer, data, len);
|
||||
uploadInfo->bufferSize = len;
|
||||
@@ -885,10 +918,11 @@ void doImageUpload(AsyncWebServerRequest *request, String filename, size_t index
|
||||
if (file) {
|
||||
file.write(uploadInfo->buffer, uploadInfo->bufferSize);
|
||||
file.close();
|
||||
xSemaphoreGive(fsMutex);
|
||||
} else {
|
||||
xSemaphoreGive(fsMutex);
|
||||
logLine("Failed to open file for appending: " + uploadfilename);
|
||||
}
|
||||
xSemaphoreGive(fsMutex);
|
||||
request->_tempObject = nullptr;
|
||||
delete uploadInfo;
|
||||
}
|
||||
@@ -903,6 +937,18 @@ void doImageUpload(AsyncWebServerRequest *request, String filename, size_t index
|
||||
if (request->hasParam("dither", true)) {
|
||||
dither = request->getParam("dither", true)->value().toInt();
|
||||
}
|
||||
if (request->hasParam("alias", true)) {
|
||||
taginfo->alias = request->getParam("alias", true)->value();
|
||||
}
|
||||
if (request->hasParam("rotate", true)) {
|
||||
taginfo->rotate = atoi(request->getParam("rotate", true)->value().c_str());
|
||||
}
|
||||
if (request->hasParam("lut", true)) {
|
||||
taginfo->lut = atoi(request->getParam("lut", true)->value().c_str());
|
||||
}
|
||||
if (request->hasParam("invert", true)) {
|
||||
taginfo->invert = atoi(request->getParam("invert", true)->value().c_str());
|
||||
}
|
||||
uint32_t ttl = 0;
|
||||
if (request->hasParam("ttl", true)) {
|
||||
ttl = request->getParam("ttl", true)->value().toInt();
|
||||
@@ -946,7 +992,7 @@ void doJsonUpload(AsyncWebServerRequest *request) {
|
||||
uint8_t mac[8];
|
||||
if (hex2mac(dst, mac)) {
|
||||
xSemaphoreTake(fsMutex, portMAX_DELAY);
|
||||
File file = LittleFS.open("/current/" + dst + ".json", "w");
|
||||
File file = contentFS->open("/current/" + dst + ".json", "w");
|
||||
if (!file) {
|
||||
request->send(400, "text/plain", "Failed to create file");
|
||||
xSemaphoreGive(fsMutex);
|
||||
|
||||
@@ -466,9 +466,9 @@ void webFlasherTask(void* parameter) {
|
||||
}
|
||||
|
||||
void handleWSdata(uint8_t* data, size_t len, AsyncWebSocketClient* client) {
|
||||
StaticJsonDocument<200> doc;
|
||||
JsonDocument doc;
|
||||
DeserializationError error = deserializeJson(doc, (const char*)data);
|
||||
StaticJsonDocument<250> response;
|
||||
JsonDocument response;
|
||||
response["flashstatus"] = 1;
|
||||
|
||||
if (error) {
|
||||
@@ -476,7 +476,7 @@ void handleWSdata(uint8_t* data, size_t len, AsyncWebSocketClient* client) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (doc.containsKey("flashcmd")) {
|
||||
if (doc["flashcmd"].is<int>()) {
|
||||
uint16_t flashcmd = doc["flashcmd"].as<int>();
|
||||
switch (flashcmd) {
|
||||
case WEBFLASH_ENABLE_AUTOFLASH:
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include <WiFi.h>
|
||||
#include <esp_wifi.h>
|
||||
|
||||
#include <ETH.h>
|
||||
|
||||
#include "newproto.h"
|
||||
#include "system.h"
|
||||
#include "tag_db.h"
|
||||
@@ -16,6 +18,13 @@ uint8_t WifiManager::apClients = 0;
|
||||
uint8_t x_buffer[100];
|
||||
uint8_t x_position = 0;
|
||||
|
||||
#if defined(ETHERNET_PHY_POWER) && defined(ETHERNET_PHY_MDC) && defined(ETHERNET_PHY_MDIO) && defined(ETHERNET_PHY_TYPE) && defined(ETHERNET_CLK_MODE)
|
||||
static bool eth_init = false;
|
||||
static bool eth_connected = false;
|
||||
static bool eth_ip_ok = false;
|
||||
static long eth_timeout = 0;
|
||||
#endif
|
||||
|
||||
WifiManager::WifiManager() {
|
||||
_reconnectIntervalCheck = 5000;
|
||||
_retryIntervalCheck = 5 * 60000;
|
||||
@@ -43,6 +52,24 @@ void WifiManager::terminalLog(String text) {
|
||||
}
|
||||
|
||||
void WifiManager::poll() {
|
||||
|
||||
#if defined(ETHERNET_PHY_POWER) && defined(ETHERNET_PHY_MDC) && defined(ETHERNET_PHY_MDIO) && defined(ETHERNET_PHY_TYPE) && defined(ETHERNET_CLK_MODE)
|
||||
|
||||
if (eth_connected) {
|
||||
wifiStatus = ETHERNET;
|
||||
if(!eth_ip_ok && eth_timeout != 0 && millis() - eth_timeout > 2000) {
|
||||
eth_timeout = 0;
|
||||
eth_connected = false;
|
||||
}
|
||||
} else if(!eth_connected && wifiStatus == ETHERNET) {
|
||||
wifiStatus = NOINIT;
|
||||
_APstarted = false;
|
||||
WiFi.mode(WIFI_STA);
|
||||
connectToWifi();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (wifiStatus == AP && millis() > _nextReconnectCheck && _ssid != "") {
|
||||
if (apClients == 0) {
|
||||
terminalLog("Attempting to reconnect to WiFi.");
|
||||
@@ -68,6 +95,10 @@ void WifiManager::poll() {
|
||||
}
|
||||
|
||||
#ifndef HAS_USB
|
||||
|
||||
#ifdef ETHERNET_CLK_MODE
|
||||
if (!(ETHERNET_CLK_MODE == ETH_CLOCK_GPIO0_IN || ETHERNET_CLK_MODE == ETH_CLOCK_GPIO0_OUT)) {
|
||||
#endif
|
||||
// ap_and_flasher has gpio0 in use as FLASHER_AP_POWER
|
||||
if (digitalRead(0) == LOW) {
|
||||
Serial.println("GPIO0 LOW");
|
||||
@@ -99,12 +130,37 @@ void WifiManager::poll() {
|
||||
ESP.restart();
|
||||
}
|
||||
}
|
||||
#ifdef ETHERNET_CLK_MODE
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
pollSerial();
|
||||
}
|
||||
|
||||
void WifiManager::initEth() {
|
||||
#if defined(ETHERNET_PHY_POWER) && defined(ETHERNET_PHY_MDC) && defined(ETHERNET_PHY_MDIO) && defined(ETHERNET_PHY_TYPE) && defined(ETHERNET_CLK_MODE)
|
||||
if(!eth_init) {
|
||||
eth_init = true;
|
||||
ETH.begin(
|
||||
ETH_PHY_ADDR,
|
||||
ETHERNET_PHY_POWER,
|
||||
ETHERNET_PHY_MDC,
|
||||
ETHERNET_PHY_MDIO,
|
||||
ETHERNET_PHY_TYPE,
|
||||
ETHERNET_CLK_MODE,
|
||||
false);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool WifiManager::connectToWifi() {
|
||||
#if defined(ETHERNET_PHY_POWER) && defined(ETHERNET_PHY_MDC) && defined(ETHERNET_PHY_MDIO) && defined(ETHERNET_PHY_TYPE) && defined(ETHERNET_CLK_MODE)
|
||||
if (wifiStatus == ETHERNET || eth_connected)
|
||||
return true;
|
||||
#endif
|
||||
|
||||
Preferences preferences;
|
||||
preferences.begin("wifi", false);
|
||||
_ssid = preferences.getString("ssid", WiFi_SSID());
|
||||
@@ -136,6 +192,11 @@ bool WifiManager::connectToWifi() {
|
||||
}
|
||||
|
||||
bool WifiManager::connectToWifi(String ssid, String pass, bool savewhensuccessfull) {
|
||||
#if defined(ETHERNET_PHY_POWER) && defined(ETHERNET_PHY_MDC) && defined(ETHERNET_PHY_MDIO) && defined(ETHERNET_PHY_TYPE) && defined(ETHERNET_CLK_MODE)
|
||||
if (wifiStatus == ETHERNET)
|
||||
return true;
|
||||
#endif
|
||||
|
||||
_ssid = ssid;
|
||||
_pass = pass;
|
||||
_savewhensuccessfull = savewhensuccessfull;
|
||||
@@ -145,26 +206,7 @@ bool WifiManager::connectToWifi(String ssid, String pass, bool savewhensuccessfu
|
||||
delay(100);
|
||||
WiFi.mode(WIFI_MODE_NULL);
|
||||
delay(100);
|
||||
char hostname[32] = "OpenEpaperLink-";
|
||||
uint8_t mac[6];
|
||||
esp_read_mac(mac, ESP_MAC_WIFI_STA);
|
||||
char lastTwoBytes[5];
|
||||
sprintf(lastTwoBytes, "%02X%02X", mac[4], mac[5]);
|
||||
strcat(hostname, lastTwoBytes);
|
||||
|
||||
if (config.alias[0] != '\0') {
|
||||
int len = strlen(config.alias);
|
||||
int j = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
char c = config.alias[i];
|
||||
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-') {
|
||||
hostname[j] = c;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
hostname[j] = '\0';
|
||||
}
|
||||
WiFi.setHostname(hostname);
|
||||
WiFi.setHostname(buildHostname(ESP_MAC_WIFI_STA).c_str());
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.setSleep(WIFI_PS_MIN_MODEM);
|
||||
|
||||
@@ -177,6 +219,11 @@ bool WifiManager::connectToWifi(String ssid, String pass, bool savewhensuccessfu
|
||||
}
|
||||
|
||||
bool WifiManager::waitForConnection() {
|
||||
#if defined(ETHERNET_PHY_POWER) && defined(ETHERNET_PHY_MDC) && defined(ETHERNET_PHY_MDIO) && defined(ETHERNET_PHY_TYPE) && defined(ETHERNET_CLK_MODE)
|
||||
if (wifiStatus == ETHERNET)
|
||||
return true;
|
||||
#endif
|
||||
|
||||
unsigned long timeout = millis() + _connectionTimeout;
|
||||
wifiStatus = WAIT_CONNECTING;
|
||||
|
||||
@@ -209,7 +256,7 @@ bool WifiManager::waitForConnection() {
|
||||
}
|
||||
|
||||
void WifiManager::startManagementServer() {
|
||||
if (!_APstarted) {
|
||||
if (!_APstarted && wifiStatus != ETHERNET) {
|
||||
terminalLog("Starting config AP, ssid: OpenEPaperLink");
|
||||
logLine("Starting configuration AP, ssid OpenEPaperLink");
|
||||
WiFi.disconnect(true, true);
|
||||
@@ -225,6 +272,37 @@ void WifiManager::startManagementServer() {
|
||||
}
|
||||
}
|
||||
|
||||
String WifiManager::buildHostname(esp_mac_type_t mac_type) {
|
||||
char hostname[32] = "OpenEpaperLink-";
|
||||
uint8_t mac[6];
|
||||
esp_read_mac(mac, mac_type);
|
||||
char lastTwoBytes[5];
|
||||
sprintf(lastTwoBytes, "%02X%02X", mac[4], mac[5]);
|
||||
strcat(hostname, lastTwoBytes);
|
||||
|
||||
if (config.alias[0] != '\0') {
|
||||
int len = strlen(config.alias);
|
||||
int j = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
char c = config.alias[i];
|
||||
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-') {
|
||||
hostname[j] = c;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
hostname[j] = '\0';
|
||||
}
|
||||
return String(hostname);
|
||||
}
|
||||
|
||||
IPAddress WifiManager::localIP() {
|
||||
if (wifiStatus == ETHERNET) {
|
||||
return ETH.localIP();
|
||||
} else {
|
||||
return WiFi.localIP();
|
||||
}
|
||||
}
|
||||
|
||||
String WifiManager::WiFi_SSID() {
|
||||
wifi_config_t conf;
|
||||
esp_wifi_get_config(WIFI_IF_STA, &conf);
|
||||
@@ -296,6 +374,46 @@ void WifiManager::WiFiEvent(WiFiEvent_t event) {
|
||||
// eventname = "Assigned IP address to client";
|
||||
break;
|
||||
|
||||
#if defined(ETHERNET_PHY_POWER) && defined(ETHERNET_PHY_MDC) && defined(ETHERNET_PHY_MDIO) && defined(ETHERNET_PHY_TYPE) && defined(ETHERNET_CLK_MODE)
|
||||
|
||||
case ARDUINO_EVENT_ETH_START:
|
||||
eventname = "ETH Started";
|
||||
//set eth hostname here
|
||||
ETH.setHostname(buildHostname(ESP_MAC_ETH).c_str());
|
||||
eth_timeout = 0;
|
||||
break;
|
||||
case ARDUINO_EVENT_ETH_CONNECTED:
|
||||
eventname = "ETH Connected";
|
||||
WiFi.mode(WIFI_MODE_NULL);
|
||||
WiFi.disconnect();
|
||||
eth_connected = true;
|
||||
eth_timeout = millis();
|
||||
break;
|
||||
case ARDUINO_EVENT_ETH_GOT_IP:
|
||||
if (ETH.fullDuplex()) {
|
||||
eventname = "ETH MAC: " + ETH.macAddress() + ", IPv4: " + ETH.localIP().toString() + ", FULL_DUPLEX, " + ETH.linkSpeed() + "Mbps";
|
||||
} else {
|
||||
eventname = "ETH MAC: " + ETH.macAddress() + ", IPv4: " + ETH.localIP().toString() + ", " + ETH.linkSpeed() + "Mbps";
|
||||
}
|
||||
eth_ip_ok = true;
|
||||
init_udp();
|
||||
eth_timeout = 0;
|
||||
break;
|
||||
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||||
eventname = "ETH Disconnected";
|
||||
eth_connected = false;
|
||||
eth_ip_ok = false;
|
||||
eth_timeout = 0;
|
||||
break;
|
||||
case ARDUINO_EVENT_ETH_STOP:
|
||||
eventname = "ETH Stopped";
|
||||
eth_connected = false;
|
||||
eth_ip_ok = false;
|
||||
eth_timeout = 0;
|
||||
break;
|
||||
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -44,8 +44,27 @@
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Current date",
|
||||
"desc": "Shows the current date",
|
||||
"param": [ ]
|
||||
"desc": "Shows the current date. In some templates, the sunrise and sunset times are shown as well, when you fill in your location.",
|
||||
"param": [
|
||||
{
|
||||
"key": "location",
|
||||
"name": "Location",
|
||||
"desc": "Name of the city. This is used to lookup the lat/long data, and to display as the title",
|
||||
"type": "geoselect"
|
||||
},
|
||||
{
|
||||
"key": "#lat",
|
||||
"name": "Lat",
|
||||
"desc": "Latitude (set automatic when generating image)",
|
||||
"type": "ro"
|
||||
},
|
||||
{
|
||||
"key": "#lon",
|
||||
"name": "Lon",
|
||||
"desc": "Longitude (set automatic when generating image)",
|
||||
"type": "ro"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
@@ -140,7 +159,7 @@
|
||||
{
|
||||
"id": 8,
|
||||
"name": "Weather forecast",
|
||||
"desc": "Weather forecast for the next five days. Weather data by Open-Meteo.com. Parameters Lat, Lon and Time Zone are filled automatically from the entered location. In case of an ambiguous location, you can alter those manually.",
|
||||
"desc": "Weather forecast for the next five days. Weather data by Open-Meteo.com. Parameters Lat, Lon and Time Zone are filled automatically from the entered location. In case of an ambiguous location, choose from the drop down list.",
|
||||
"param": [
|
||||
{
|
||||
"key": "location",
|
||||
@@ -389,6 +408,7 @@
|
||||
"NO4": "Norway NO4",
|
||||
"NO5": "Norway NO5",
|
||||
"PL": "Poland",
|
||||
"PT": "Portugal",
|
||||
"RO": "Romania",
|
||||
"SK": "Slovakia",
|
||||
"SI": "Slovenia",
|
||||
@@ -431,6 +451,29 @@
|
||||
"0": "No",
|
||||
"1": "-Yes"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "interval",
|
||||
"name": "Display interval",
|
||||
"desc": "Data averaging interval for better readability on smaller displays",
|
||||
"type": "select",
|
||||
"options": {
|
||||
"0": "-Native (15-min or hourly)",
|
||||
"30": "30 minutes",
|
||||
"60": "1 hour"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "cheapblock",
|
||||
"name": "Cheap block hours",
|
||||
"desc": "Number of hours for cheapest consecutive block (e.g., 3 for dishwasher, 2.5 for 2h30m). Set to 0 to disable. Shows up to 2 non-overlapping blocks.",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"key": "updatefreq",
|
||||
"name": "Update frequency",
|
||||
"desc": "Tag refresh interval in minutes (e.g., 15, 30, 60). Default is 15 minutes to match 15-minute data intervals. Higher values save battery.",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -606,6 +649,19 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"name": "Set Tag Mac",
|
||||
"desc": "Sets the tags mac-address to a specific value. Must be 16 characters, hexdecimal (8 bytes)",
|
||||
"param": [
|
||||
{
|
||||
"key": "mac",
|
||||
"name": "MAC",
|
||||
"desc": "Set Mac address",
|
||||
"type": "text"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"name": "Set Tag Config",
|
||||
@@ -728,5 +784,12 @@
|
||||
"type": "binfile"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"name": "Current Time",
|
||||
"desc": "Displays the current time on the tag, only rarely supported even if shown here! It uses a fast LUT when possible otherwise a full refresh which is not very battery friendly and will anoy by flickering every minute",
|
||||
"param": [
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
<!--This is the plain html source of the hex encoded Editor-Page embedded in SPIFFSEditor.cpp -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
@@ -462,26 +461,23 @@
|
||||
imageData.data[i * 4 + 2] = is16Bit ? (rgb & 0x1F) << 3 : ((rgb & 0x03) << 6) * 1.3;
|
||||
imageData.data[i * 4 + 3] = 255;
|
||||
}
|
||||
} else if (tagTypes[hwtype].bpp == 3) {
|
||||
} else if ([3, 4].includes(tagTypes[hwtype].bpp)) {
|
||||
const bpp = tagTypes[hwtype].bpp;
|
||||
const colorTable = tagTypes[hwtype].colortable;
|
||||
|
||||
let pixelIndex = 0;
|
||||
for (let i = 0; i < data.length; i += 3) {
|
||||
for (let j = 0; j < 8; j++) {
|
||||
let bitPos = j * 3;
|
||||
let bytePos = Math.floor(bitPos / 8);
|
||||
let bitOffset = bitPos % 8;
|
||||
let pixelValue = (data[i + bytePos] >> (5 - bitOffset)) & 0x07;
|
||||
if (bitOffset > 5) {
|
||||
pixelValue = ((data[i + bytePos] & (0xFF >> bitOffset)) << (bitOffset - 5)) |
|
||||
(data[i + bytePos + 1] >> (13 - bitOffset));
|
||||
}
|
||||
imageData.data[pixelIndex * 4] = colorTable[pixelValue][0];
|
||||
imageData.data[pixelIndex * 4 + 1] = colorTable[pixelValue][1];
|
||||
imageData.data[pixelIndex * 4 + 2] = colorTable[pixelValue][2];
|
||||
imageData.data[pixelIndex * 4 + 3] = 255;
|
||||
pixelIndex++;
|
||||
}
|
||||
let bitOffset = 0;
|
||||
|
||||
while (bitOffset < data.length * 8) {
|
||||
let byteIndex = bitOffset >> 3;
|
||||
let startBit = bitOffset & 7;
|
||||
let pixelValue = (data[byteIndex] << 8 | data[byteIndex + 1] || 0) >> (16 - bpp - startBit) & ((1 << bpp) - 1);
|
||||
let color = colorTable[pixelValue];
|
||||
imageData.data[pixelIndex * 4] = color[0];
|
||||
imageData.data[pixelIndex * 4 + 1] = color[1];
|
||||
imageData.data[pixelIndex * 4 + 2] = color[2];
|
||||
imageData.data[pixelIndex * 4 + 3] = 255;
|
||||
pixelIndex++;
|
||||
bitOffset += bpp;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -629,9 +625,9 @@
|
||||
leaf.onclick = function (e) {
|
||||
treeRoot.removeChild(treeRoot.childNodes[0]);
|
||||
if (name == "..") {
|
||||
httpGet(treeRoot, "/");
|
||||
httpGet(treeRoot, path === "/" ? "/" : path.substring(0, path.lastIndexOf('/')) || "/");
|
||||
} else {
|
||||
httpGet(treeRoot, "/" + name);
|
||||
httpGet(treeRoot, path + (path != "/" ? "/" : "") + name);
|
||||
}
|
||||
};
|
||||
leaf.oncontextmenu = function (e) {
|
||||
@@ -657,9 +653,6 @@
|
||||
sortByKey(items, 'name');
|
||||
var list = ce("ul");
|
||||
parent.appendChild(list);
|
||||
if (path != "/") {
|
||||
list.appendChild(createDirLeaf("/", "..", 0));
|
||||
}
|
||||
var ll = items.length;
|
||||
for (var i = 0; i < ll; i++) {
|
||||
if (items[i].type === "file") {
|
||||
@@ -669,7 +662,9 @@
|
||||
list.insertBefore(createDirLeaf(path, items[i].name, items[i].size), list.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
if (path != "/") {
|
||||
list.insertBefore(createDirLeaf(path, "..", 0), list.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
function isTextFile(path) {
|
||||
@@ -782,8 +777,10 @@
|
||||
if (typeof lang === "undefined") {
|
||||
lang = getLangFromFilename(file);
|
||||
}
|
||||
|
||||
if (typeof theme === "undefined") theme = "textmate";
|
||||
if (typeof theme === "undefined") {
|
||||
const currentTheme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
|
||||
theme = (currentTheme === 'dark') ? "tomorrow_night" : "textmate";
|
||||
}
|
||||
|
||||
if (typeof type === "undefined") {
|
||||
type = "text/" + lang;
|
||||
@@ -866,7 +863,7 @@
|
||||
editor.loadUrl(vars.file);
|
||||
};
|
||||
</script>
|
||||
<script id='ace' src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js" type="text/javascript"
|
||||
<script id='ace' src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.37.2/ace.js" type="text/javascript"
|
||||
charset="utf-8"></script>
|
||||
<script>
|
||||
if (typeof ace.edit == "undefined") {
|
||||
|
||||
@@ -25,11 +25,11 @@
|
||||
<div class="tablinks material-symbols-outlined" data-target="hometab" title="Dashboard">home</div>
|
||||
<div class="tablinks material-symbols-outlined" data-target="tagtab" title="Tags">sell</div>
|
||||
<div class="tablinks material-symbols-outlined" data-target="aptab" title="Access Points">cell_tower</div>
|
||||
<!--<div class="tablinks material-symbols-outlined" data-target="templatetab" title="Templates">browse
|
||||
</div>-->
|
||||
<!--<div class="tablinks material-symbols-outlined" data-target="templatetab" title="Templates">browse</div>-->
|
||||
<div class="tablinks material-symbols-outlined" data-target="flashtab" title="Tag flasher" style="display:none;">flash_on</div>
|
||||
<div class="tablinks material-symbols-outlined" data-target="configtab" title="Settings">settings</div>
|
||||
<div class="tablinks material-symbols-outlined" data-target="logtab" title="Logging">text_snippet</div>
|
||||
<button id="theme-toggle" class="theme-toggle-btn material-symbols-outlined" title="Toggle Theme">light_mode</button>
|
||||
</div>
|
||||
<!-- /tabs -->
|
||||
<div><span id="runstate"></div>
|
||||
@@ -182,6 +182,7 @@
|
||||
<div class="nextcheckin"></div>
|
||||
<div class="nextupdate"></div>
|
||||
<div class="corner">
|
||||
<div class="waitingicon" title="New content is scheduled to be generated (as soon as possible, or shortly before the next expected checkin time)">⏳</div>
|
||||
<div class="pendingicon" title="A new message is waiting for the tag to pick up">↻</div>
|
||||
<div class="warningicon" title="This tag has not been seen for a long time">⚠
|
||||
</div>
|
||||
@@ -290,24 +291,24 @@ options:
|
||||
<option value="27">27</option>
|
||||
</select>
|
||||
</p>
|
||||
<p title="Enable SubGhz support and select channel. This requires an AP that has an optional CC1101 SubGhz radio module attached.">
|
||||
<label for="apcfgsubgigchid">SubGhz channel</label>
|
||||
<select id="apcfgsubgigchid">
|
||||
<option value="0" selected>disabled</option>
|
||||
<option value="100">100 - 864.000 Mhz (Europe, etc)</option>
|
||||
<option value="101">101 - 865.006 Mhz (Europe, etc)</option>
|
||||
<option value="102">102 - 866.014 Mhz (Europe, etc)</option>
|
||||
<option value="103">103 - 867.020 Mhz (Europe, etc)</option>
|
||||
<option value="104">104 - 868.027 Mhz (Europe, etc)</option>
|
||||
<option value="105">105 - 869.034 Mhz (Europe, etc)</option>
|
||||
<option value="200">200 - 903.000 Mhz (US, etc)</option>
|
||||
<option value="201">201 - 907.027 Mhz (US, etc)</option>
|
||||
<option value="202">202 - 911.054 Mhz (US, etc)</option>
|
||||
<option value="203">203 - 915.083 Mhz (US, etc)</option>
|
||||
<option value="204">204 - 919.110 Mhz (US, etc)</option>
|
||||
<option value="205">205 - 923.138 Mhz (US, etc)</option>
|
||||
</select>
|
||||
</p>
|
||||
<p title="Enable SubGhz support and select channel. This requires an AP that has an optional CC1101 SubGhz radio module attached.">
|
||||
<label for="apcfgsubgigchid">SubGhz channel</label>
|
||||
<select id="apcfgsubgigchid">
|
||||
<option value="0" selected>disabled</option>
|
||||
<option value="100">100 - 864.000 Mhz (Europe, etc)</option>
|
||||
<option value="101">101 - 865.006 Mhz (Europe, etc)</option>
|
||||
<option value="102">102 - 866.014 Mhz (Europe, etc)</option>
|
||||
<option value="103">103 - 867.020 Mhz (Europe, etc)</option>
|
||||
<option value="104">104 - 868.027 Mhz (Europe, etc)</option>
|
||||
<option value="105">105 - 869.034 Mhz (Europe, etc)</option>
|
||||
<option value="200">200 - 903.000 Mhz (US, etc)</option>
|
||||
<option value="201">201 - 907.027 Mhz (US, etc)</option>
|
||||
<option value="202">202 - 911.054 Mhz (US, etc)</option>
|
||||
<option value="203">203 - 915.083 Mhz (US, etc)</option>
|
||||
<option value="204">204 - 919.110 Mhz (US, etc)</option>
|
||||
<option value="205">205 - 923.138 Mhz (US, etc)</option>
|
||||
</select>
|
||||
</p>
|
||||
<p title="Enable Bluetooth (BLE) support. Only enable this if you have BLE capable tags. Changing this value requires a reboot to take effect.">
|
||||
<label for="apcfgble">Bluetooth</label>
|
||||
<select id="apcfgble">
|
||||
@@ -479,6 +480,13 @@ options:
|
||||
<option value="1">Broadcast</option>
|
||||
</select>
|
||||
</p>
|
||||
<p title="Show a timestamp on the screen when the tag is updated">
|
||||
<label for="apcshowtimestamp">Enable timestamp</label>
|
||||
<select id="apcshowtimestamp">
|
||||
<option value="0" selected>no</option>
|
||||
<option value="1">yes</option>
|
||||
</select>
|
||||
</p>
|
||||
<p>
|
||||
<input type="button" value="Save" id="apcfgsave"><span id="apcfgmsg"></span>
|
||||
</p>
|
||||
@@ -522,7 +530,13 @@ options:
|
||||
<button id="confirmSelectRepo">Confirm</button><button id="cancelSelectRepo">Cancel</button>
|
||||
</div>
|
||||
<h4>Releases</h4>
|
||||
<div id="releasetable"></div>
|
||||
To update to the latest version, use the big 'update now' button if it is shown on top of this screen.<br>
|
||||
To up/downgrade to other versions: for the smoothest experience, first update the ESP32 part and<br>
|
||||
without rebooting, update the filesystem, then reboot the AP and reload the webpage.<br>
|
||||
<div id="releasetable" class="releasetable"></div>
|
||||
<h4 id="radio_release_title"></h4>
|
||||
<div id="radio_releasetable" class="releasetable"></div>
|
||||
<div id="radio_releasetable1" class="releasetable"></div>
|
||||
<h4>Other actions</h4>
|
||||
<div>
|
||||
<p id="rollbackOption" style="display:none">
|
||||
@@ -609,8 +623,7 @@ options:
|
||||
</p>
|
||||
</dialog>
|
||||
|
||||
<ul id="context-menu"
|
||||
style="display: none; position: absolute; background: white; border: 1px solid gray; padding: 0; list-style: none;">
|
||||
<ul id="context-menu" style="display: none; position: absolute;">
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
|
||||
415
ESP32_AP-Flasher/wwwroot/jsontemplate-demo-v2.html
Normal file
415
ESP32_AP-Flasher/wwwroot/jsontemplate-demo-v2.html
Normal file
@@ -0,0 +1,415 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>JSON Template Publisher - Flat Dark</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
background-color: #1e1e1e;
|
||||
color: #dcdcdc;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
min-height: 100vh;
|
||||
}
|
||||
.main-wrapper {
|
||||
display: flex;
|
||||
gap: 25px;
|
||||
width: 100%;
|
||||
max-width: 1200px;
|
||||
padding: 20px;
|
||||
}
|
||||
.input-column, .preview-column {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.preview-column {
|
||||
position: sticky;
|
||||
top: 20px;
|
||||
align-self: flex-start;
|
||||
}
|
||||
|
||||
.container {
|
||||
background-color: #2a2a2a;
|
||||
padding: 25px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #383838;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.input-column .container {
|
||||
|
||||
}
|
||||
|
||||
|
||||
h3 {
|
||||
color: #4dabf7;
|
||||
text-align: center;
|
||||
margin-top: 0;
|
||||
margin-bottom: 20px;
|
||||
font-size: 1.6em;
|
||||
font-weight: 600;
|
||||
}
|
||||
p, label {
|
||||
line-height: 1.6;
|
||||
}
|
||||
a {
|
||||
color: #4dabf7;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
color: #74c0fc;
|
||||
}
|
||||
input[type="text"], textarea, select {
|
||||
width: 100%;
|
||||
padding: 10px 12px;
|
||||
margin-bottom: 15px;
|
||||
border: 1px solid #4a4a4a;
|
||||
border-radius: 4px;
|
||||
box-sizing: border-box;
|
||||
font-size: 0.95rem;
|
||||
background-color: #303030;
|
||||
color: #dcdcdc;
|
||||
}
|
||||
input[type="text"]:focus, textarea:focus, select:focus {
|
||||
outline: none;
|
||||
border-color: #4dabf7;
|
||||
box-shadow: 0 0 0 2px rgba(77, 171, 247, 0.3);
|
||||
}
|
||||
textarea {
|
||||
min-height: 140px;
|
||||
resize: vertical;
|
||||
}
|
||||
input[type="submit"], button {
|
||||
background-color: #0078d4;
|
||||
color: white;
|
||||
padding: 10px 20px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
transition: background-color 0.15s ease-in-out;
|
||||
}
|
||||
input[type="submit"]:hover, button:hover {
|
||||
background-color: #005a9e;
|
||||
}
|
||||
.form-group {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
.form-group label {
|
||||
display: block;
|
||||
margin-bottom: 5px;
|
||||
font-weight: 500;
|
||||
color: #b0b0b0;
|
||||
}
|
||||
#previewArea {
|
||||
margin-top: 0;
|
||||
padding: 20px;
|
||||
border: 1px solid #383838;
|
||||
border-radius: 8px;
|
||||
background-color: #2a2a2a;
|
||||
text-align: center;
|
||||
overflow: auto;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#previewArea h4 {
|
||||
margin-top: 0;
|
||||
color: #4dabf7;
|
||||
}
|
||||
#previewCanvas {
|
||||
border: 1px solid #4f4f4f;
|
||||
max-width: 100%;
|
||||
max-height: 450px;
|
||||
height: auto;
|
||||
display: block;
|
||||
margin: 12px auto;
|
||||
transform-origin: center center;
|
||||
background-color: #fff;
|
||||
}
|
||||
.info-text {
|
||||
font-size: 0.85em;
|
||||
color: #999;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.status-message {
|
||||
margin-top: 10px;
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
word-break: break-word;
|
||||
border: 1px solid transparent;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.error-message { color: #ffcdd2; background-color: #c62828; border-color: #b71c1c; }
|
||||
.success-message { color: #c8e6c9; background-color: #2e7d32; border-color: #1b5e20; }
|
||||
.warning-message { color: #fff9c4; background-color: #f9a825; border-color: #f57f17; }
|
||||
.info-message { color: #bbdefb; background-color: #1565c0; border-color: #0d47a1; }
|
||||
|
||||
.flex-group { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
|
||||
.flex-group > div { flex: 1; min-width: 180px; }
|
||||
.flex-group > button { flex-shrink: 0; margin-bottom: 15px; padding: 10px 15px; }
|
||||
#clearMacHistoryBtn { background-color: #d32f2f; }
|
||||
#clearMacHistoryBtn:hover { background-color: #b71c1c; }
|
||||
</style>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js"></script>
|
||||
<script>
|
||||
|
||||
const MAX_IMAGE_FLIPS=640,HORIZ_SHORT_SHORT=0,HORIZ_SHORT_LONG=1,HORIZ_LONG_SHORT=2,HORIZ_LONG_LONG=3,G5_SUCCESS=0,G5_INVALID_PARAMETER=1,G5_DECODE_ERROR=2,REGISTER_WIDTH=32;const code_table=[0x90,0,0x40,0,3,7,0x13,7,2,6,2,6,0x12,6,0x12,6,0x30,4,0x30,4,0x30,4,0x30,4,0x30,4,0x30,4,0x30,4,0x30,4,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,0x20,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3,0x11,3];
|
||||
function TIFFMOTOLONG(p,ix){let val=0;if(ix<p.length)val|=p[ix]<<24;if(ix+1<p.length)val|=p[ix+1]<<16;if(ix+2<p.length)val|=p[ix+2]<<8;if(ix+3<p.length)val|=p[ix+3];return val>>>0}
|
||||
class G5DECIMAGE{constructor(){this.iWidth=0;this.iHeight=0;this.iError=0;this.y=0;this.iVLCSize=0;this.iHLen=0;this.iPitch=0;this.u32Accum=0;this.ulBitOff=0;this.ulBits=0;this.pSrc=null;this.pBuf=null;this.pBufIndex=0;this.pCur=new Int16Array(MAX_IMAGE_FLIPS);this.pRef=new Int16Array(MAX_IMAGE_FLIPS)}}
|
||||
function g5_decode_init(pImage,iWidth,iHeight,pData,iDataSize){if(!pImage||iWidth<1||iHeight<1||!pData||iDataSize<1)return G5_INVALID_PARAMETER;pImage.iVLCSize=iDataSize;pImage.pSrc=pData;pImage.ulBitOff=0;pImage.y=0;pImage.ulBits=TIFFMOTOLONG(pData,0);pImage.iWidth=iWidth;pImage.iHeight=iHeight;return G5_SUCCESS}
|
||||
function G5DrawLine(pPage,pCurFlips,pOut){const xright=pPage.iWidth;let pCurIndex=0;const len=(xright+7)>>3;pOut.fill(255,0,len);let x=0;while(x<xright){const startX=pCurFlips[pCurIndex++],run=pCurFlips[pCurIndex++]-startX;if(startX>=xright||run<=0)break;let visibleX=Math.max(0,startX),visibleRun=Math.min(xright,startX+run)-visibleX;if(visibleRun>0){const startByte=visibleX>>3,endByte=(visibleX+visibleRun-1)>>3,lBit=255<<8-(visibleX&7)&255,rBit=255>>(visibleX+visibleRun&7);if(endByte===startByte)pOut[startByte]&=lBit|rBit;else{pOut[startByte]&=lBit;for(let i=startByte+1;i<endByte;i++)pOut[i]=0;if(endByte>startByte)pOut[endByte]&=rBit}}x=startX+run}}
|
||||
function Decode_Begin(pPage){const xsize=pPage.iWidth;for(let i=0;i<MAX_IMAGE_FLIPS-2;i++)pPage.pRef[i]=pPage.pCur[i]=xsize;pPage.pCur[MAX_IMAGE_FLIPS-2]=pPage.pRef[MAX_IMAGE_FLIPS-2]=32767;pPage.pCur[MAX_IMAGE_FLIPS-1]=pPage.pRef[MAX_IMAGE_FLIPS-1]=32767;pPage.pBuf=pPage.pSrc;pPage.pBufIndex=0;pPage.ulBits=TIFFMOTOLONG(pPage.pSrc,0);pPage.ulBitOff=0;pPage.iHLen=xsize>0?32-Math.clz32(xsize):0}
|
||||
function DecodeLine(pPage){let a0=-1,a0_p,b1,pCurIndex=0,pRefIndex=0;const pCur=pPage.pCur,pRef=pPage.pRef;let ulBits=pPage.ulBits,ulBitOff=pPage.ulBitOff,pBufIndex=pPage.pBufIndex;const pBuf=pPage.pBuf,xsize=pPage.iWidth,u32HLen=pPage.iHLen,u32HMask=(1<<u32HLen)-1;let tot_run,tot_run1;while(a0<xsize){if(pBufIndex+(ulBitOff>>3)>=pPage.iVLCSize&&ulBitOff>REGISTER_WIDTH-8)return pPage.iError=G5_DECODE_ERROR;if(ulBitOff>REGISTER_WIDTH-8){pBufIndex+=ulBitOff>>3;ulBitOff&=7;ulBits=TIFFMOTOLONG(pBuf,pBufIndex)}if((ulBits<<ulBitOff&2147483648)!==0){a0=pRef[pRefIndex++];pCur[pCurIndex++]=a0;ulBitOff++}else{const lBits=ulBits>>(REGISTER_WIDTH-8-ulBitOff)&254,sCode=code_table[lBits];ulBitOff+=code_table[lBits+1];switch(sCode){case 1:case 2:case 3:a0=pRef[pRefIndex]-sCode;pCur[pCurIndex++]=a0;if(pRefIndex==0)pRefIndex+=2;pRefIndex--;while(a0>=pRef[pRefIndex])pRefIndex+=2;break;case 17:case 18:case 19:a0=pRef[pRefIndex++];b1=a0;a0+=sCode&7;if(b1!==xsize&&a0<xsize)while(a0>=pRef[pRefIndex])pRefIndex+=2;if(a0>xsize)a0=xsize;pCur[pCurIndex++]=a0;break;case 32:if(ulBitOff>REGISTER_WIDTH-16){pBufIndex+=ulBitOff>>3;ulBitOff&=7;ulBits=TIFFMOTOLONG(pBuf,pBufIndex)}a0_p=Math.max(0,a0);const lBitsH=ulBits>>(REGISTER_WIDTH-2-ulBitOff)&3;ulBitOff+=2;switch(lBitsH){case HORIZ_SHORT_SHORT:tot_run=ulBits>>(REGISTER_WIDTH-3-ulBitOff)&7;ulBitOff+=3;tot_run1=ulBits>>(REGISTER_WIDTH-3-ulBitOff)&7;ulBitOff+=3;break;case HORIZ_SHORT_LONG:tot_run=ulBits>>(REGISTER_WIDTH-3-ulBitOff)&7;ulBitOff+=3;tot_run1=ulBits>>(REGISTER_WIDTH-u32HLen-ulBitOff)&u32HMask;ulBitOff+=u32HLen;break;case HORIZ_LONG_SHORT:tot_run=ulBits>>(REGISTER_WIDTH-u32HLen-ulBitOff)&u32HMask;ulBitOff+=u32HLen;tot_run1=ulBits>>(REGISTER_WIDTH-3-ulBitOff)&7;ulBitOff+=3;break;case HORIZ_LONG_LONG:tot_run=ulBits>>(REGISTER_WIDTH-u32HLen-ulBitOff)&u32HMask;ulBitOff+=u32HLen;if(ulBitOff>REGISTER_WIDTH-u32HLen&&u32HLen>0){pBufIndex+=ulBitOff>>3;ulBitOff&=7;ulBits=TIFFMOTOLONG(pBuf,pBufIndex)}tot_run1=ulBits>>(REGISTER_WIDTH-u32HLen-ulBitOff)&u32HMask;ulBitOff+=u32HLen;break}a0=a0_p+tot_run;pCur[pCurIndex++]=a0;a0+=tot_run1;if(a0<xsize)while(a0>=pRef[pRefIndex])pRefIndex+=2;pCur[pCurIndex++]=a0;break;case 48:pRefIndex++;a0=pRef[pRefIndex++];break;default:return pPage.iError=G5_DECODE_ERROR}}}pCur[pCurIndex++]=xsize;pCur[pCurIndex++]=xsize;pPage.ulBits=ulBits;pPage.ulBitOff=ulBitOff;pPage.pBufIndex=pBufIndex;return pPage.iError}
|
||||
function processG5(data,width,height){try{let decoder=new G5DECIMAGE,initResult=g5_decode_init(decoder,width,height,data,data.length);if(initResult!==G5_SUCCESS)throw new Error("G5 Init failed: "+initResult);Decode_Begin(decoder);let outputBuffer=new Uint8Array(height*((width+7)>>3));for(let y=0;y<height;y++){let lineBuffer=outputBuffer.subarray(y*((width+7)>>3),(y+1)*((width+7)>>3));decoder.y=y;let decodeResult=DecodeLine(decoder);if(decodeResult!==G5_SUCCESS)console.warn("G5 Decode error line "+y+": "+decoder.iError);G5DrawLine(decoder,decoder.pCur,lineBuffer);const temp=decoder.pRef;decoder.pRef=decoder.pCur;decoder.pCur=temp}return outputBuffer}catch(error){console.error("Error in processG5:",error.message);return new Uint8Array(0)}}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="main-wrapper">
|
||||
<div class="input-column">
|
||||
<div class="container">
|
||||
<h3>JSON Template Publisher</h3>
|
||||
<p class="info-text">Use this form to push JSON templates to an E-Paper Tag. Ensure your JSON is valid. Check syntax at <a href="https://jsonlint.com/" target="_blank">jsonlint.com</a>.<br>
|
||||
Documentation: <a href="https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/Json-template" target="_blank">OpenEPaperLink JSON Template Wiki</a>
|
||||
</p>
|
||||
|
||||
<form id="jsonUploadForm" method="POST" action="/jsonupload">
|
||||
<div class="form-group flex-group">
|
||||
<div>
|
||||
<label for="macInput">MAC Address:</label>
|
||||
<input type="text" id="macInput" name="mac" pattern="[0-9a-fA-F]{12,16}" title="12 or 16 Hex characters" required>
|
||||
</div>
|
||||
<button type="button" id="refreshTagDbBtn" title="Reload Tag Database from AP">↻</button>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="macSelect">Available Tags (grouped by type):</label>
|
||||
<select id="macSelect" style="margin-bottom: 5px;"></select>
|
||||
<button type="button" id="clearMacHistoryBtn" title="Clear locally stored MAC history">Clear History</button>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="jsonInput">JSON String:</label>
|
||||
<textarea id="jsonInput" name="json">
|
||||
[
|
||||
{ "text": [5, 5, "Bahnschrift 20", "fonts/bahnschrift20", 1] },
|
||||
{ "box": [10, 30, 20, 20, 2] }
|
||||
]
|
||||
</textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<input type="submit" value="Upload JSON & Generate Preview">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="preview-column">
|
||||
<div class="container">
|
||||
<div id="globalStatus" class="status-message" style="display:none;"></div>
|
||||
<div id="previewArea" style="display:none;">
|
||||
<h4>Image Preview</h4>
|
||||
<canvas id="previewCanvas"></canvas>
|
||||
<p id="previewStatus" class="status-message" style="display:none;"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const ge=id=>document.getElementById(id);
|
||||
const macInputEl=ge('macInput'),macSelectEl=ge('macSelect'),jsonInputEl=ge('jsonInput'),previewAreaEl=ge('previewArea'),previewCanvasEl=ge('previewCanvas'),previewStatusEl=ge('previewStatus'),jsonUploadFormEl=ge('jsonUploadForm'),clearMacHistoryBtnEl=ge('clearMacHistoryBtn'),globalStatusEl=ge('globalStatus'),refreshTagDbBtnEl=ge('refreshTagDbBtn');
|
||||
const MAX_HISTORY_ITEMS=10,BASE_SERVER_URL='';
|
||||
let localTagDB={},localTagTypes={},currentPreviewMac=null,currentPreviewHwType=null,currentPreviewVersion=null,currentPreviewTagTypeDef=null;
|
||||
let offscreenCanvas = document.createElement('canvas');
|
||||
let offscreenCtx = offscreenCanvas.getContext('2d');
|
||||
let socket;
|
||||
|
||||
if (typeof window.processZlib === 'undefined' && typeof pako !== 'undefined') {
|
||||
window.processZlib = function(rawDataFromDotRawFile) {
|
||||
try {
|
||||
const EXTERNAL_HEADER_SIZE = 4;
|
||||
if (rawDataFromDotRawFile.length <= EXTERNAL_HEADER_SIZE) {setStatus(previewStatusEl, `Zlib error: Raw data too short.`, 'error',true); return new Uint8ClampedArray(0);}
|
||||
const zlibStream = rawDataFromDotRawFile.subarray(EXTERNAL_HEADER_SIZE);
|
||||
const inflatedBuffer = pako.inflate(zlibStream);
|
||||
if (!inflatedBuffer || inflatedBuffer.length === 0) {setStatus(previewStatusEl, 'Zlib error: Inflation resulted in empty data.', 'error',true); return new Uint8ClampedArray(0);}
|
||||
const internalHeaderSize = inflatedBuffer[0];
|
||||
if (internalHeaderSize >= 0 && inflatedBuffer.length > internalHeaderSize) {return inflatedBuffer.subarray(internalHeaderSize);}
|
||||
else if (internalHeaderSize === 0) {return inflatedBuffer;}
|
||||
else {console.warn("Zlib: Unusual internal header. Length:", inflatedBuffer.length, "Header byte:", internalHeaderSize); return inflatedBuffer;}
|
||||
} catch (err) {
|
||||
let msg = (err && err.message) ? err.message : (typeof err === 'string' ? err : 'Unknown Zlib error');
|
||||
console.error('pako.inflate error:', err); setStatus(previewStatusEl, `Zlib error: ${msg}`, 'error',true); return new Uint8ClampedArray(0);
|
||||
}
|
||||
};
|
||||
} else if (typeof window.processZlib === 'undefined') {
|
||||
window.processZlib = function(data) {setStatus(previewStatusEl, "Zlib (pako) not loaded.",'warning',true); return data;};
|
||||
}
|
||||
|
||||
function setStatus(element, message, type = 'info', append = false) {
|
||||
element.classList.remove('error-message', 'success-message', 'warning-message', 'info-message');
|
||||
element.classList.add(`${type}-message`, 'info-message');
|
||||
|
||||
if (append) {
|
||||
let currentBaseHTML = element.innerHTML.split("<br>")[0];
|
||||
element.innerHTML = `${currentBaseHTML}<br>${message}`;
|
||||
} else {
|
||||
element.innerHTML = message;
|
||||
}
|
||||
element.style.display = message ? 'block' : 'none';
|
||||
}
|
||||
|
||||
|
||||
function connectWebSocket() {
|
||||
const protocol = location.protocol === "https:" ? "wss://" : "ws://";
|
||||
let basePath = location.pathname;
|
||||
if (basePath.includes('.')) { basePath = basePath.substring(0, basePath.lastIndexOf('/'));}
|
||||
if (!basePath.endsWith('/')) { basePath += '/';}
|
||||
if (basePath === '//') basePath = '/';
|
||||
const wsUrl = `${protocol}${location.host}${basePath}ws`;
|
||||
|
||||
socket = new WebSocket(wsUrl);
|
||||
socket.onopen = () => { console.log("WebSocket connected."); setStatus(globalStatusEl, "WebSocket connected.", 'success');};
|
||||
socket.onmessage = event => {
|
||||
try {
|
||||
const msg = JSON.parse(event.data);
|
||||
if (msg.logMsg && typeof msg.logMsg === 'string') {
|
||||
const log = msg.logMsg;
|
||||
if (log.startsWith("Updating ") && log.length === ("Updating ".length + 16) ) {
|
||||
const macFromMsg = log.substring("Updating ".length).toUpperCase();
|
||||
if (macFromMsg === currentPreviewMac) {
|
||||
setStatus(previewStatusEl, `Server is updating tag ${macFromMsg}. Waiting for .pending file notification...`, 'info', false);
|
||||
}
|
||||
} else if (log.startsWith("new image: /current/") && log.endsWith(".pending")) {
|
||||
const pendingFileWithPath = log.substring("new image: ".length);
|
||||
const pendingFilename = pendingFileWithPath.substring(pendingFileWithPath.lastIndexOf('/') + 1);
|
||||
const macInFilename = pendingFilename.substring(0, pendingFilename.indexOf('_'));
|
||||
|
||||
if (macInFilename.toUpperCase() === currentPreviewMac && currentPreviewTagTypeDef) {
|
||||
console.log(`.pending file reported for ${currentPreviewMac}: ${pendingFilename}`);
|
||||
const pendingImagePath = `${BASE_SERVER_URL}/current/${pendingFilename}`;
|
||||
setStatus(previewStatusEl, `Loading pending image: ${pendingFilename}...`, 'info', false);
|
||||
loadAndRenderImage(pendingImagePath, currentPreviewMac, currentPreviewHwType, currentPreviewVersion, currentPreviewTagTypeDef);
|
||||
}
|
||||
} else if (log === "new image is the same as current image. not updating tag.") {
|
||||
if (currentPreviewMac && currentPreviewTagTypeDef) {
|
||||
console.log("Image is the same. Loading .raw for " + currentPreviewMac);
|
||||
setStatus(previewStatusEl, `Image is same as current. Loading existing .raw file for ${currentPreviewMac}...`, 'info', false);
|
||||
const tagData = localTagDB[currentPreviewMac];
|
||||
if (tagData) {
|
||||
const cacheTag = tagData.hash !== '00000000000000000000000000000000' ? tagData.hash : Date.now();
|
||||
let imagePath = '';
|
||||
if(tagData.isexternal && tagData.apip && tagData.apip !== '0.0.0.0'){imagePath = `http://${tagData.apip}/current/${currentPreviewMac}.raw?${cacheTag}`}
|
||||
else{imagePath = `${BASE_SERVER_URL}/current/${currentPreviewMac}.raw?${cacheTag}`}
|
||||
loadAndRenderImage(imagePath, currentPreviewMac, currentPreviewHwType, currentPreviewVersion, currentPreviewTagTypeDef);
|
||||
} else {
|
||||
setStatus(previewStatusEl, `Cannot load .raw for ${currentPreviewMac}: Tag data not found.`, 'error', false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) { console.error("Error processing WebSocket message:", e, event.data); }
|
||||
};
|
||||
socket.onclose = event => { console.log("WebSocket disconnected. Code:", event.code); setStatus(globalStatusEl, "WebSocket disconnected. Reconnecting in 5s...", 'warning'); setTimeout(connectWebSocket, 5000);};
|
||||
socket.onerror = error => { console.error("WebSocket error:", error); setStatus(globalStatusEl, "WebSocket connection error.", 'error');};
|
||||
}
|
||||
|
||||
async function fetchTagDB(pos=0){if(pos===0)localTagDB={};setStatus(globalStatusEl,'Loading Tag Database...','info');try{const response=await fetch(`${BASE_SERVER_URL}/get_db?pos=${pos}`);if(!response.ok)throw new Error(`Failed to load Tag DB: ${response.status}`);const data=await response.json();(data.tags||[]).forEach(tag=>{localTagDB[tag.mac.toUpperCase()]={hwType:tag.hwType,ver:tag.ver,alias:tag.alias,hash:tag.hash,isexternal:tag.isexternal||false,apip:tag.apip||'0.0.0.0'}});if(data.continu&&data.continu>pos){await fetchTagDB(data.continu)}else{setStatus(globalStatusEl,`Tag DB loaded. ${Object.keys(localTagDB).length} tags. Refreshing types...`,'success');await refreshTagTypeDefinitionsForDropdown();populateMacDropdown()}}catch(error){console.error("Error fetchTagDB:",error);setStatus(globalStatusEl,`Error Tag DB: ${error.message}`,'error')}}
|
||||
async function getTagTypeDefinition(hwType){if(localTagTypes[hwType]&&!localTagTypes[hwType].busy)return localTagTypes[hwType];if(localTagTypes[hwType]?.busy){await new Promise(resolve=>{const interval=setInterval(()=>{if(!localTagTypes[hwType]?.busy){clearInterval(interval);resolve(localTagTypes[hwType])}},100)});return localTagTypes[hwType]}localTagTypes[hwType]={busy:true};try{let response;try{response=await fetch(`${BASE_SERVER_URL}/tagtypes/${Number(hwType).toString(16).padStart(2,'0').toUpperCase()}.json`)}catch(e){}if(!response||!response.ok){const repo='OpenEPaperLink/OpenEPaperLink',ghUrl=`https://raw.githubusercontent.com/${repo}/master/resources/tagtypes/${Number(hwType).toString(16).padStart(2,'0').toUpperCase()}.json`;response=await fetch(ghUrl)}if(!response.ok)throw new Error(`Def for ${hwType} not found (Status: ${response.status})`);const jsonData=await response.json();const definition={name:jsonData.name,width:parseInt(jsonData.width),height:parseInt(jsonData.height),bpp:parseInt(jsonData.bpp),rotatebuffer:jsonData.rotatebuffer||0,colortable:Object.values(jsonData.perceptual??jsonData.colortable??[]),zlib:parseInt(jsonData.zlib_compression||"0",16),g5:parseInt(jsonData.g5_compression||"0",16),busy:false};localTagTypes[hwType]=definition;localStorage.setItem("localTagTypesCache",JSON.stringify(localTagTypes));return definition}catch(error){console.error(`Error getTagTypeDef ${hwType}:`,error);localTagTypes[hwType]={busy:false,name:`Unknown (${hwType})`,width:0,height:0,bpp:0,colortable:[]};return localTagTypes[hwType]}}
|
||||
function loadCachedTagTypeDefinitions(){try{const cached=localStorage.getItem("localTagTypesCache");if(cached)localTagTypes=JSON.parse(cached)}catch(e){console.warn("Error loading Tag Type Defs from cache:",e)}}
|
||||
async function refreshTagTypeDefinitionsForDropdown(){const hwTypesInDb=new Set(Object.values(localTagDB).map(tag=>tag.hwType));for(const hwType of hwTypesInDb){if(!localTagTypes[hwType]||localTagTypes[hwType].name?.startsWith("Unknown")){await getTagTypeDefinition(hwType)}}}
|
||||
function populateMacDropdown(){macSelectEl.innerHTML='<option value="">Select a Tag...</option>';const groupedByHwType={};for(const mac in localTagDB){const tag=localTagDB[mac];if(!groupedByHwType[tag.hwType])groupedByHwType[tag.hwType]=[];groupedByHwType[tag.hwType].push({mac,alias:tag.alias})}const sortedHwTypes=Object.keys(groupedByHwType).sort((a,b)=>{const nameA=localTagTypes[a]?.name||`Type ${a}`;const nameB=localTagTypes[b]?.name||`Type ${b}`;return nameA.localeCompare(nameB)});for(const hwType of sortedHwTypes){const group=document.createElement('optgroup');const typeDef=localTagTypes[hwType];group.label=typeDef?.name?`${typeDef.name} (${typeDef.width}x${typeDef.height}, Type ${hwType})`:`Type ${hwType}`;groupedByHwType[hwType].sort((a,b)=>(a.alias||a.mac).localeCompare(b.alias||b.mac));groupedByHwType[hwType].forEach(tag=>{const option=document.createElement('option');option.value=tag.mac;option.textContent=tag.alias?`${tag.alias} (${tag.mac})`:tag.mac;group.appendChild(option)});macSelectEl.appendChild(group)}}
|
||||
function saveToMacHistory(mac){if(!mac||!/^[0-9a-fA-F]{12,16}$/.test(mac))return;let history=JSON.parse(localStorage.getItem('macStorageHistory'))||[];const upperMac=mac.toUpperCase();history=history.filter(item=>item.toUpperCase()!==upperMac);history.unshift(upperMac);if(history.length>MAX_HISTORY_ITEMS)history=history.slice(0,MAX_HISTORY_ITEMS);localStorage.setItem('macStorageHistory',JSON.stringify(history))}
|
||||
macSelectEl.addEventListener('change',()=>{if(macSelectEl.value){macInputEl.value=macSelectEl.value;const tagInfo=localTagDB[macSelectEl.value.toUpperCase()];if(tagInfo)setStatus(globalStatusEl,`Selected: ${tagInfo.alias||macSelectEl.value}, HW: ${tagInfo.hwType}, FW: ${tagInfo.ver}`,'info')}});
|
||||
macInputEl.addEventListener('change',()=>{const mac=macInputEl.value.toUpperCase();const tagInfo=localTagDB[mac];if(tagInfo)setStatus(globalStatusEl,`Tag: ${tagInfo.alias||mac}, HW: ${tagInfo.hwType}, FW: ${tagInfo.ver}`,'info');else if(mac.length===12||mac.length===16)setStatus(globalStatusEl,`Details for ${mac} not in local DB.`,'warning');else setStatus(globalStatusEl,'','info');macSelectEl.value=mac});
|
||||
clearMacHistoryBtnEl.addEventListener('click',()=>{if(confirm("Clear MAC history from browser storage?")){localStorage.removeItem('macStorageHistory');macInputEl.value='';setStatus(globalStatusEl,'Local MAC history cleared.','info')}});
|
||||
function loadLastMacUsed(){const lastMac=localStorage.getItem('lastMacUsed');if(lastMac)macInputEl.value=lastMac}
|
||||
function saveLastMacUsed(mac){if(mac&&/^[0-9a-fA-F]{12,16}$/.test(mac)){localStorage.setItem('lastMacUsed',mac.toUpperCase());saveToMacHistory(mac.toUpperCase())}}
|
||||
|
||||
jsonUploadFormEl.addEventListener('submit',async event=>{event.preventDefault();const mac=macInputEl.value.trim().toUpperCase();if(!mac||!/^[0-9a-fA-F]{12,16}$/.test(mac)){alert("Please enter a valid MAC address.");return}saveLastMacUsed(mac);let tagInfo=localTagDB[mac];if(!tagInfo){setStatus(globalStatusEl,`Info for MAC ${mac} not in local DB. Reloading...`,'warning');await fetchTagDB();tagInfo=localTagDB[mac];if(!tagInfo){setStatus(previewStatusEl,`Could not load hardware info for MAC ${mac}.`,'error',false);previewAreaEl.style.display='block';previewCanvasEl.style.display='none';return}}currentPreviewMac=mac;currentPreviewHwType=tagInfo.hwType;currentPreviewVersion=tagInfo.ver;currentPreviewTagTypeDef=await getTagTypeDefinition(currentPreviewHwType);if(!currentPreviewTagTypeDef||currentPreviewTagTypeDef.width===0){setStatus(previewStatusEl,`Could not load Tag Type Definition for hwType ${currentPreviewHwType}.`,'error',false);previewAreaEl.style.display='block';previewCanvasEl.style.display='none';return}previewAreaEl.style.display='block';setStatus(previewStatusEl,'Sending JSON... Waiting for image update status via WebSocket...','info',false);previewCanvasEl.style.display='none';if(offscreenCanvas)offscreenCtx.clearRect(0,0,offscreenCanvas.width,offscreenCanvas.height);else{const ctx=previewCanvasEl.getContext('2d');if(ctx)ctx.clearRect(0,0,previewCanvasEl.width,previewCanvasEl.height)}try{const formData=new FormData(jsonUploadFormEl);formData.set('mac',mac);const response=await fetch(jsonUploadFormEl.action,{method:'POST',body:formData});if(!response.ok){const errorText=await response.text();throw new Error(`JSON Upload Error: ${response.status} ${errorText}`)}setStatus(previewStatusEl,'JSON sent. Waiting for image update notification via WebSocket...','success', false);
|
||||
}catch(error){console.error("Error JSON submission:",error);setStatus(previewStatusEl,`Error: ${error.message}`,'error',false);}});
|
||||
|
||||
refreshTagDbBtnEl.addEventListener('click',()=>fetchTagDB());
|
||||
|
||||
async function loadAndRenderImage(path,mac,hwType,ver,tagTypeDef){
|
||||
setStatus(previewStatusEl,`Loading image: ${path.substring(path.lastIndexOf('/')+1)}...`,'info', false);
|
||||
|
||||
if(!tagTypeDef||tagTypeDef.width===0){setStatus(previewStatusEl,`Error: Tag Type Def for hwType '${hwType}' invalid.`,'error', false);return false}
|
||||
|
||||
let offscreenDrawWidth = tagTypeDef.width; let offscreenDrawHeight = tagTypeDef.height;
|
||||
const rotateBuffer = tagTypeDef.rotatebuffer || 0;
|
||||
if (rotateBuffer % 2 !== 0) {[offscreenDrawWidth, offscreenDrawHeight] = [tagTypeDef.height, tagTypeDef.width];}
|
||||
|
||||
if (offscreenCanvas.width !== offscreenDrawWidth || offscreenCanvas.height !== offscreenDrawHeight) {
|
||||
offscreenCanvas.width = offscreenDrawWidth; offscreenCanvas.height = offscreenDrawHeight;
|
||||
}
|
||||
offscreenCtx.clearRect(0, 0, offscreenCanvas.width, offscreenCanvas.height);
|
||||
|
||||
try{const response=await fetch(path);
|
||||
if(!response.ok){throw new Error(`Image not found or server error: ${response.status} on ${path}`);}
|
||||
const buffer=await response.arrayBuffer();let data=new Uint8ClampedArray(buffer);
|
||||
if(data.length===0){setStatus(previewStatusEl,"Received image data empty.",'error', true);previewCanvasEl.style.display='none';return false}
|
||||
|
||||
let originalDataLength = data.length;
|
||||
if(tagTypeDef.zlib>0&&ver>=tagTypeDef.zlib){
|
||||
let decompressedZlib = window.processZlib(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
|
||||
if (decompressedZlib && decompressedZlib.length > 0 && decompressedZlib.length !== originalDataLength) {
|
||||
data = new Uint8ClampedArray(decompressedZlib.buffer, decompressedZlib.byteOffset, decompressedZlib.byteLength);
|
||||
} else if (decompressedZlib && decompressedZlib.length === originalDataLength && originalDataLength > 0) {
|
||||
} else { setStatus(previewStatusEl,"Zlib error: Empty result.",'error', true); return false; }
|
||||
}
|
||||
|
||||
originalDataLength = data.length;
|
||||
if(data.length>0&&tagTypeDef.g5>0&&ver>=tagTypeDef.g5){
|
||||
const headerSize=data[0];
|
||||
if (data.length > headerSize) {
|
||||
let bufw=(data[2]<<8)|data[1],bufh=(data[4]<<8)|data[3];
|
||||
if((bufw==tagTypeDef.width||bufw==tagTypeDef.height)&&(bufh==tagTypeDef.width||bufh==tagTypeDef.height)&&(data[5]<=3)){
|
||||
if(data[5]==2)bufh*=2; let g5Stream = data.subarray(headerSize);
|
||||
let decompressedG5 = window.processG5(g5Stream, bufw, bufh);
|
||||
if (decompressedG5 && decompressedG5.length > 0 && decompressedG5.length !== originalDataLength) {
|
||||
data = new Uint8ClampedArray(decompressedG5.buffer, decompressedG5.byteOffset, decompressedG5.byteLength);
|
||||
} else if (decompressedG5 && decompressedG5.length === originalDataLength && originalDataLength > 0) {
|
||||
} else { setStatus(previewStatusEl,"G5 error: Empty result.",'error', true); return false; }
|
||||
} else { }
|
||||
} else { }
|
||||
}
|
||||
|
||||
if(data.length===0){setStatus(previewStatusEl,"Image data empty post-decompression.",'error', true);previewCanvasEl.style.display='none';return false}
|
||||
|
||||
const offscreenImageData = offscreenCtx.createImageData(offscreenCanvas.width, offscreenCanvas.height);
|
||||
const bpp=tagTypeDef.bpp,colorTable=tagTypeDef.colortable;
|
||||
if(!colorTable||colorTable.length===0){setStatus(previewStatusEl,`Error: No color table for hwType ${hwType}.`,'error', true);return false}
|
||||
if(bpp==16){const is16Bit=data.length===offscreenCanvas.width*offscreenCanvas.height*2;for(let i=0;i<Math.min(offscreenCanvas.width*offscreenCanvas.height,data.length/(is16Bit?2:1));i++){const dIdx=is16Bit?i*2:i,rgb=is16Bit?(data[dIdx]<<8)|data[dIdx+1]:data[dIdx];offscreenImageData.data[i*4]=is16Bit?((rgb>>11)&31)<<3:(((rgb>>5)&7)<<5)*1.13;offscreenImageData.data[i*4+1]=is16Bit?((rgb>>5)&63)<<2:(((rgb>>2)&7)<<5)*1.13;offscreenImageData.data[i*4+2]=is16Bit?(rgb&31)<<3:((rgb&3)<<6)*1.3;offscreenImageData.data[i*4+3]=255}}
|
||||
else if([3,4].includes(bpp)){let pxIdx=0,bitOff=0,totalPx=offscreenCanvas.width*offscreenCanvas.height;while(bitOff<data.length*8&&pxIdx<totalPx){let byteIdx=bitOff>>3,startBit=bitOff&7,pxVal=0;if(startBit+bpp<=8)pxVal=(data[byteIdx]>>(8-startBit-bpp))&((1<<bpp)-1);else{let bitsFirst=8-startBit;pxVal=(data[byteIdx]&((1<<bitsFirst)-1))<<(bpp-bitsFirst);if(byteIdx+1<data.length)pxVal|=data[byteIdx+1]>>(8-(bpp-bitsFirst))}if(pxVal<colorTable.length){let c=colorTable[pxVal];offscreenImageData.data[pxIdx*4]=c[0];offscreenImageData.data[pxIdx*4+1]=c[1];offscreenImageData.data[pxIdx*4+2]=c[2];offscreenImageData.data[pxIdx*4+3]=255}else{offscreenImageData.data[pxIdx*4]=255;offscreenImageData.data[pxIdx*4+1]=0;offscreenImageData.data[pxIdx*4+2]=0;offscreenImageData.data[pxIdx*4+3]=255}pxIdx++;bitOff+=bpp}}
|
||||
else{const offsetR=(bpp>=2&&data.length>=(offscreenCanvas.width*offscreenCanvas.height/8)*2)?offscreenCanvas.width*offscreenCanvas.height/8:0;let pxVal=0,totalPx=offscreenCanvas.width*offscreenCanvas.height,currPxIdx=0;let bytesIter=offsetR?offsetR:Math.ceil(totalPx/8);for(let i=0;i<bytesIter&&i<data.length;i++){for(let j=0;j<8;j++){if(currPxIdx>=totalPx)break;if(offsetR&&(i+offsetR>=data.length))pxVal=(data[i]&(1<<(7-j)))?1:0;else if(offsetR)pxVal=((data[i]&(1<<(7-j)))?1:0)|(((data[i+offsetR]&(1<<(7-j)))?1:0)<<1);else pxVal=(data[i]&(1<<(7-j)))?1:0;if(pxVal<colorTable.length){offscreenImageData.data[currPxIdx*4]=colorTable[pxVal][0];offscreenImageData.data[currPxIdx*4+1]=colorTable[pxVal][1];offscreenImageData.data[currPxIdx*4+2]=colorTable[pxVal][2];offscreenImageData.data[currPxIdx*4+3]=255}else{offscreenImageData.data[currPxIdx*4]=0;offscreenImageData.data[currPxIdx*4+1]=255;offscreenImageData.data[currPxIdx*4+2]=0;offscreenImageData.data[currPxIdx*4+3]=255}currPxIdx++}if(currPxIdx>=totalPx)break}}
|
||||
offscreenCtx.putImageData(offscreenImageData,0,0);
|
||||
|
||||
previewCanvasEl.width = offscreenCanvas.width;
|
||||
previewCanvasEl.height = offscreenCanvas.height;
|
||||
previewCanvasEl.style.transform = (rotateBuffer >= 2) ? 'rotate(180deg)' : 'none';
|
||||
|
||||
const visibleCtx=previewCanvasEl.getContext('2d');
|
||||
visibleCtx.drawImage(offscreenCanvas,0,0);
|
||||
previewCanvasEl.style.display='block';
|
||||
|
||||
setStatus(previewStatusEl,`Image ${path.substring(path.lastIndexOf('/')+1)} rendered.`,'success', true);
|
||||
return true;
|
||||
}catch(error){
|
||||
console.error("Error loading/rendering image:",error);
|
||||
setStatus(previewStatusEl,`Error loading ${path.substring(path.lastIndexOf('/')+1)}: ${error.message}`,'error', true);
|
||||
previewCanvasEl.style.display='none';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded',async()=>{loadCachedTagTypeDefinitions();await fetchTagDB();loadLastMacUsed(); connectWebSocket();});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,3 +1,112 @@
|
||||
/* CSS Variables for Theming */
|
||||
:root {
|
||||
--color-background: #e4e4e0;
|
||||
--color-text: #000000;
|
||||
--color-module-bg: #ffffff;
|
||||
--color-text-light: #444;
|
||||
--color-text-error: red;
|
||||
--color-header-bg: #646260;
|
||||
--color-header-text: #ffffff;
|
||||
--color-nav-bg: #ffffff;
|
||||
--color-tab-bg: #f2f2f2;
|
||||
--color-tab-hover-bg: #ddd;
|
||||
--color-tab-active-bg: #ccc;
|
||||
--color-tab-border: #ccc;
|
||||
--color-card-bg: #ffffff;
|
||||
--color-card-border: #cccccc;
|
||||
--color-card-hover-shadow: rgba(0, 0, 0, 0.63);
|
||||
--color-dialog-bg: #f0e6d3;
|
||||
--color-button-bg: #ccc;
|
||||
--color-button-text: black;
|
||||
--color-button-hover-bg: #aaaaaa;
|
||||
--color-input-bg: #ffffff;
|
||||
--color-input-text: #000000;
|
||||
--color-input-border: #cccccc;
|
||||
--color-console-bg: black;
|
||||
--color-console-text: white;
|
||||
--color-console-mono-bg: #666;
|
||||
--color-console-mono-text: #ccc;
|
||||
--color-console-quote-text: white;
|
||||
--color-tag-pending-anim-bg: #d4d4f5;
|
||||
--color-tag-group-bg: #6d6e6e;
|
||||
--color-tag-group-text: white;
|
||||
--color-tag-group-border: #c0c0c0;
|
||||
--color-context-menu-bg: white;
|
||||
--color-context-menu-border: gray;
|
||||
--color-context-menu-hover-bg: #e0e0e0;
|
||||
--color-link: #0000ee;
|
||||
--color-readonly-bg: #ccc;
|
||||
--color-tag-deepsleep-bg: #e4e4e0;
|
||||
--color-tag-boot-bg: #b0d0b0;
|
||||
--color-tag-wakeup-bg: #c8f1bb;
|
||||
--color-tag-scan-bg: #c0c0d0;
|
||||
--color-tag-reset-bg: #d0a0a0;
|
||||
--color-tag-failed-ota-bg: #f0a0a0;
|
||||
--color-tag-timeout-bg: #e0e0a0;
|
||||
--color-log-new-bg-start: rgba(255, 255, 204, 1);
|
||||
--color-log-new-bg-mid: rgba(255, 255, 204, 0.5);
|
||||
--color-log-new-bg-end: rgba(255, 255, 204, 0);
|
||||
}
|
||||
|
||||
body.dark-mode {
|
||||
--color-background: #1c1c1e;
|
||||
--color-text: #f0f0f0;
|
||||
--color-module-bg: #3a3a3c;
|
||||
--color-text-light: #cccccc;
|
||||
--color-text-error: #ff8a8a;
|
||||
--color-header-bg: #2a2a2d;
|
||||
--color-header-text: #f0f0f0;
|
||||
--color-nav-bg: #1f1f22;
|
||||
--color-tab-bg: #3a3a3c;
|
||||
--color-tab-hover-bg: #4a4a4c;
|
||||
--color-tab-active-bg: #5a5a5c;
|
||||
--color-tab-border: #5a5a5c;
|
||||
--color-card-bg: #2c2c2e;
|
||||
--color-card-border: #444444;
|
||||
--color-card-hover-shadow: rgba(255, 255, 255, 0.2);
|
||||
--color-dialog-bg: #3a3a3c;
|
||||
--color-button-bg: #5a5a5c;
|
||||
--color-button-text: #f0f0f0;
|
||||
--color-button-hover-bg: #6a6a6c;
|
||||
--color-input-bg: #3a3a3c;
|
||||
--color-input-text: #f0f0f0;
|
||||
--color-input-border: #555555;
|
||||
--color-console-bg: #3a3a3c;
|
||||
--color-console-text: #f0f0f0;
|
||||
--color-console-mono-bg: #444;
|
||||
--color-console-mono-text: #ddd;
|
||||
--color-console-quote-text: #ffffff;
|
||||
--color-tag-pending-anim-bg: #3c3c5c;
|
||||
--color-tag-group-bg: #4a4a4c;
|
||||
--color-tag-group-text: #f0f0f0;
|
||||
--color-tag-group-border: #555555;
|
||||
--color-context-menu-bg: #2c2c2e;
|
||||
--color-context-menu-border: #555;
|
||||
--color-context-menu-hover-bg: #4a4a4c;
|
||||
--color-link: #58a6ff;
|
||||
--color-readonly-bg: #4a4a4c;
|
||||
--color-tag-deepsleep-bg: #3a3a3c;
|
||||
--color-tag-boot-bg: #3a5c3a;
|
||||
--color-tag-wakeup-bg: #4a6c4a;
|
||||
--color-tag-scan-bg: #4c4c5c;
|
||||
--color-tag-reset-bg: #6c4c4c;
|
||||
--color-tag-failed-ota-bg: #7c4c4c;
|
||||
--color-tag-timeout-bg: #6c6c4c;
|
||||
--color-log-new-bg-start: rgba(88, 166, 255, 0.3);
|
||||
--color-log-new-bg-mid: rgba(88, 166, 255, 0.15);
|
||||
--color-log-new-bg-end: rgba(88, 166, 255, 0);
|
||||
}
|
||||
|
||||
/* Tag State Classes */
|
||||
.tagcard.state-deepsleep { background-color: var(--color-tag-deepsleep-bg); }
|
||||
.tagcard.state-boot { background-color: var(--color-tag-boot-bg); }
|
||||
.tagcard.state-wakeup { background-color: var(--color-tag-wakeup-bg); }
|
||||
.tagcard.state-scan { background-color: var(--color-tag-scan-bg); }
|
||||
.tagcard.state-reset { background-color: var(--color-tag-reset-bg); }
|
||||
.tagcard.state-failed-ota { background-color: var(--color-tag-failed-ota-bg); }
|
||||
.tagcard.state-timeout { background-color: var(--color-tag-timeout-bg); }
|
||||
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
@@ -16,11 +125,12 @@ body {
|
||||
font-size: 12px;
|
||||
font-family: Helvetica, Arial, Verdana, sans-serif;
|
||||
line-height: 1.5;
|
||||
background-color: #e4e4e0;
|
||||
background-color: var(--color-background);
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: #646260;
|
||||
background-color: var(--color-header-bg);
|
||||
z-index: 999;
|
||||
position: sticky;
|
||||
top: 0px;
|
||||
@@ -35,7 +145,7 @@ nav>div {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
padding: 10px;
|
||||
background-color: white;
|
||||
background-color: var(--color-nav-bg);
|
||||
}
|
||||
|
||||
nav label {
|
||||
@@ -50,11 +160,13 @@ footer {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
background-color: white;
|
||||
background-color: var(--color-nav-bg);
|
||||
border-top: 1px solid var(--color-card-border);
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
#sysinfo {
|
||||
float: right;
|
||||
}
|
||||
footer #sysinfo {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.logo {
|
||||
@@ -63,12 +175,13 @@ footer {
|
||||
text-indent: 12px;
|
||||
overflow: hidden;
|
||||
font-size: 2.5em;
|
||||
color: white;
|
||||
color: var(--color-header-text);
|
||||
}
|
||||
|
||||
h3 {
|
||||
padding-bottom: 10px;
|
||||
font-size: 1.5em;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
/* tabs */
|
||||
@@ -79,7 +192,8 @@ h3 {
|
||||
}
|
||||
|
||||
.tablinks {
|
||||
background-color: #f2f2f2;
|
||||
background-color: var(--color-tab-bg);
|
||||
color: var(--color-text);
|
||||
padding: 5px 10px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
@@ -87,12 +201,12 @@ h3 {
|
||||
transition: all 0.2s ease-in-out;
|
||||
|
||||
&:hover {
|
||||
background-color: #ddd;
|
||||
background-color: var(--color-tab-hover-bg);
|
||||
}
|
||||
}
|
||||
|
||||
.tab-container .active {
|
||||
background-color: #ccc;
|
||||
background-color: var(--color-tab-active-bg);
|
||||
margin-top: 10px;
|
||||
margin-bottom: -10px;
|
||||
padding-bottom: 0px;
|
||||
@@ -100,7 +214,7 @@ h3 {
|
||||
|
||||
.tabcontent {
|
||||
display: none;
|
||||
border-top: 1px solid #ccc;
|
||||
border-top: 1px solid var(--color-tab-border);
|
||||
}
|
||||
|
||||
|
||||
@@ -109,11 +223,11 @@ label {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
padding: 4px 20px;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.container {
|
||||
padding-bottom: 20px;
|
||||
;
|
||||
}
|
||||
|
||||
#hometab {
|
||||
@@ -121,9 +235,10 @@ label {
|
||||
|
||||
& table {
|
||||
margin: 20px;
|
||||
background: #fff;
|
||||
background: var(--color-card-bg);
|
||||
padding: 5px 20px;
|
||||
border-spacing: 0px;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
& td {
|
||||
@@ -136,7 +251,7 @@ label {
|
||||
}
|
||||
|
||||
& tr:hover {
|
||||
background-color: #ccc;
|
||||
background-color: var(--color-tab-active-bg);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@@ -167,14 +282,14 @@ label {
|
||||
}
|
||||
|
||||
.tabheader {
|
||||
background-color: white;
|
||||
background-color: var(--color-nav-bg);
|
||||
padding: 5px 10px;
|
||||
display: flex;
|
||||
gap: 2em;
|
||||
}
|
||||
|
||||
#filterOptions {
|
||||
background-color: white;
|
||||
background-color: var(--color-nav-bg);
|
||||
max-height: 0;
|
||||
padding: 0px 10px;
|
||||
overflow: hidden;
|
||||
@@ -205,6 +320,9 @@ label {
|
||||
& p {
|
||||
padding: 3px;
|
||||
}
|
||||
& a:not(#downloadDBbutton):not(.wifibutton) {
|
||||
color: var(--color-link);
|
||||
}
|
||||
}
|
||||
|
||||
#updatetab, #flashtab {
|
||||
@@ -226,7 +344,7 @@ label {
|
||||
margin: 0px 5px;
|
||||
}
|
||||
& input:read-only {
|
||||
background-color: #ccc;
|
||||
background-color: var(--color-readonly-bg);
|
||||
}
|
||||
& .warning {
|
||||
padding: 5px;
|
||||
@@ -243,10 +361,15 @@ label {
|
||||
}
|
||||
|
||||
.apcard {
|
||||
background-color: #fff;
|
||||
border: 1px solid #ccc;
|
||||
background-color: var(--color-card-bg);
|
||||
border: 1px solid var(--color-card-border);
|
||||
padding: 10px;
|
||||
width: 300px;
|
||||
color: var(--color-text);
|
||||
|
||||
& .apip a {
|
||||
color: var(--color-link);
|
||||
}
|
||||
|
||||
& .apalias {
|
||||
font-size: 1.5em;
|
||||
@@ -278,15 +401,15 @@ label {
|
||||
padding: 5px 10px;
|
||||
margin-bottom: 0px;
|
||||
margin-top: -1px;
|
||||
background-color: #ccc;
|
||||
background-color: var(--color-button-bg);
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
color: var(--color-button-text);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
|
||||
&:hover {
|
||||
background-color: #aaa;
|
||||
background-color: var(--color-button-hover-bg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,18 +419,19 @@ label {
|
||||
#uploadButton,
|
||||
.wifibutton {
|
||||
padding: 4px 5px;
|
||||
background-color: #ccc;
|
||||
background-color: var(--color-button-bg);
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
color: var(--color-button-text);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
width: 120px;
|
||||
margin: 2px 5px 2px 20px;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
transition: none;
|
||||
|
||||
&:hover {
|
||||
background-color: #aaa;
|
||||
background-color: var(--color-button-hover-bg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,10 +451,13 @@ input[type="submit"],
|
||||
button {
|
||||
appearance: none;
|
||||
border-radius: 0;
|
||||
color: var(--color-input-text);
|
||||
}
|
||||
|
||||
input {
|
||||
border: solid 1px #cccccc;
|
||||
input, textarea, select {
|
||||
border: solid 1px var(--color-input-border);
|
||||
background-color: var(--color-input-bg);
|
||||
color: var(--color-input-text);
|
||||
padding: 4px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
@@ -340,18 +467,21 @@ button {
|
||||
border: 0px;
|
||||
padding: 4px 10px;
|
||||
cursor: pointer;
|
||||
background-color: #ccc;
|
||||
background-color: var(--color-button-bg);
|
||||
color: var(--color-button-text);
|
||||
}
|
||||
|
||||
input[type=button]:hover,
|
||||
button:hover {
|
||||
background-color: #aaaaaa;
|
||||
background-color: var(--color-button-hover-bg);
|
||||
}
|
||||
|
||||
input[type=file] {
|
||||
padding: 0px;
|
||||
margin-left: 20px;
|
||||
width: 200px;
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
input[type=checkbox] {
|
||||
@@ -361,7 +491,6 @@ input[type=checkbox] {
|
||||
select {
|
||||
padding: 3px 4px;
|
||||
border-radius: 0px;
|
||||
border: solid 1px #cccccc;
|
||||
max-width: 180px;
|
||||
}
|
||||
|
||||
@@ -375,7 +504,7 @@ select {
|
||||
padding: 15px;
|
||||
background-color: #f0e6d3;
|
||||
z-index: 999;
|
||||
box-shadow: 7px 10px 52px -19px rgba(0, 0, 0, 0.63);
|
||||
box-shadow: 7px 10px 52px -19px var(--color-card-hover-shadow);
|
||||
overflow: auto;
|
||||
max-height: calc(100vh - 75px);
|
||||
}
|
||||
@@ -384,11 +513,12 @@ select {
|
||||
margin: auto;
|
||||
min-width: 380px;
|
||||
padding: 15px;
|
||||
background-color: #f0e6d3;
|
||||
background-color: var(--color-dialog-bg);
|
||||
z-index: 999;
|
||||
box-shadow: 7px 10px 52px -19px rgba(0, 0, 0, 0.63);
|
||||
box-shadow: 7px 10px 52px -19px var(--color-card-hover-shadow);
|
||||
overflow: auto;
|
||||
max-height: calc(100vh - 75px);
|
||||
color: var(--color-text);
|
||||
|
||||
& label {
|
||||
width: 150px;
|
||||
@@ -414,7 +544,7 @@ select {
|
||||
|
||||
#configbox input,
|
||||
#apconfigbox input {
|
||||
border: solid 1px #cccccc;
|
||||
border: solid 1px var(--color-input-border);
|
||||
}
|
||||
|
||||
#configbox input[type=number] {
|
||||
@@ -475,7 +605,7 @@ select {
|
||||
|
||||
.closebtn,
|
||||
.closebtn2 {
|
||||
border: 1px solid black;
|
||||
border: 1px solid var(--color-text);
|
||||
float: right;
|
||||
width: 19px;
|
||||
height: 20px;
|
||||
@@ -483,6 +613,7 @@ select {
|
||||
text-align: center;
|
||||
margin: 5px;
|
||||
cursor: pointer;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
#logtab {
|
||||
@@ -523,13 +654,14 @@ select {
|
||||
min-height: 170px;
|
||||
margin: 3px;
|
||||
padding: 4px 5px 5px 8px;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #cccccc;
|
||||
transition: box-shadow 0.3s ease;
|
||||
background-color: var(--color-card-bg);
|
||||
border: 1px solid var(--color-card-border);
|
||||
transition: box-shadow 0.3s ease, background-color 0.3s ease;
|
||||
color: var(--color-text);
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
box-shadow: 7px 10px 52px -19px rgba(0, 0, 0, 0.63);
|
||||
box-shadow: 7px 10px 52px -19px var(--color-card-hover-shadow);
|
||||
filter: brightness(1.02);
|
||||
}
|
||||
}
|
||||
@@ -549,10 +681,10 @@ select {
|
||||
}
|
||||
|
||||
.taggroup {
|
||||
border: 1px solid #c0c0c0;
|
||||
border: 1px solid var(--color-tag-group-border);
|
||||
width: 100%;
|
||||
background-color: #6d6e6e;
|
||||
color: white;
|
||||
background-color: var(--color-tag-group-bg);
|
||||
color: var(--color-tag-group-text);
|
||||
padding: 5px;
|
||||
margin: 0px 3px;
|
||||
}
|
||||
@@ -564,7 +696,7 @@ select {
|
||||
.currimg img,
|
||||
.currimg canvas {
|
||||
max-width: 50px;
|
||||
border: 1px solid #c0c0c0;
|
||||
border: 1px solid var(--color-tag-group-border);
|
||||
}
|
||||
|
||||
.mac {
|
||||
@@ -621,6 +753,15 @@ select {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.lastseen {
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.lastseen.error {
|
||||
color: var(--color-text-error);
|
||||
}
|
||||
|
||||
|
||||
.corner {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
@@ -651,12 +792,23 @@ select {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.waitingicon {
|
||||
display: none;
|
||||
font-size: 1.2em;
|
||||
background-color: lightgreen;
|
||||
color: black;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
vertical-align: top;
|
||||
text-align: center;
|
||||
}
|
||||
ul.messages {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
ul.messages li {
|
||||
position: relative;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
ul.messages li.new {
|
||||
@@ -667,40 +819,41 @@ ul.messages li.new {
|
||||
}
|
||||
|
||||
.error {
|
||||
color: red;
|
||||
color: var(--color-text-error);
|
||||
}
|
||||
|
||||
.mono {
|
||||
font-family: monospace;
|
||||
word-break: break-all;
|
||||
background-color: #666;
|
||||
color: #ccc;
|
||||
background-color: var(--color-console-mono-bg);
|
||||
color: var(--color-console-mono-text);
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.quote {
|
||||
color: white;
|
||||
color: var(--color-console-quote-text);
|
||||
}
|
||||
|
||||
#georesults {
|
||||
position: absolute;
|
||||
background: white;
|
||||
background: var(--color-nav-bg);
|
||||
cursor: pointer;
|
||||
width: 240px;
|
||||
max-height: 115px;
|
||||
overflow-y: scroll;
|
||||
padding: 0px 2px 0px 2px;
|
||||
border: 1px solid var(--color-card-border);
|
||||
& div {
|
||||
display:flex;
|
||||
}
|
||||
& div:hover {
|
||||
background-color: #e0e0e0;
|
||||
background-color: var(--color-tab-hover-bg);
|
||||
}
|
||||
}
|
||||
|
||||
#paintbutton {
|
||||
padding: 1px 3px;
|
||||
border: 1px solid black;
|
||||
border: 1px solid var(--color-text);
|
||||
font-size: 1.3em;
|
||||
vertical-align: top;
|
||||
margin-left: 12px;
|
||||
@@ -709,7 +862,7 @@ ul.messages li.new {
|
||||
}
|
||||
|
||||
#paintbutton:hover {
|
||||
background-color: #aaaaaa;
|
||||
background-color: var(--color-button-hover-bg);
|
||||
}
|
||||
|
||||
.drophighlight {
|
||||
@@ -720,8 +873,8 @@ ul.messages li.new {
|
||||
#context-menu {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background: white;
|
||||
border: 1px solid gray;
|
||||
background: var(--color-context-menu-bg);
|
||||
border: 1px solid var(--color-context-menu-border);
|
||||
list-style: none;
|
||||
z-index: 999;
|
||||
padding: 2px 5px;
|
||||
@@ -730,10 +883,11 @@ ul.messages li.new {
|
||||
#context-menu li {
|
||||
cursor: pointer;
|
||||
padding: 1px 5px;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
#context-menu li:hover {
|
||||
background-color: #e0e0e0;
|
||||
background-color: var(--color-context-menu-hover-bg);
|
||||
}
|
||||
|
||||
/* painter */
|
||||
@@ -743,7 +897,7 @@ ul.messages li.new {
|
||||
}
|
||||
|
||||
#canvasdiv canvas {
|
||||
border: 1px solid black;
|
||||
border: 1px solid var(--color-text);
|
||||
}
|
||||
|
||||
#buttonbar {
|
||||
@@ -755,8 +909,8 @@ ul.messages li.new {
|
||||
#buttonbar button,
|
||||
#layersdiv button {
|
||||
padding: 1px 2px;
|
||||
border: 1px solid #cccccc;
|
||||
background-color: #dddddd;
|
||||
border: 1px solid var(--color-input-border);
|
||||
background-color: var(--color-button-bg);
|
||||
width: 40px;
|
||||
}
|
||||
|
||||
@@ -766,13 +920,13 @@ ul.messages li.new {
|
||||
}
|
||||
|
||||
#buttonbar .active {
|
||||
background-color: #ffffff;
|
||||
background-color: var(--color-input-bg);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#buttonbar button:hover,
|
||||
#layersdiv button:hover {
|
||||
background-color: #cccccc;
|
||||
background-color: var(--color-button-hover-bg);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@@ -796,14 +950,14 @@ ul.messages li.new {
|
||||
}
|
||||
|
||||
#savebar button {
|
||||
border: solid 1px #666666;
|
||||
border: solid 1px var(--color-text-light);
|
||||
}
|
||||
|
||||
/* updatescreens */
|
||||
|
||||
#easyupdate {
|
||||
padding: 10px;
|
||||
background-color: white;
|
||||
background-color: var(--color-module-bg);
|
||||
width: 400px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
@@ -825,38 +979,38 @@ h4 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#releasetable {
|
||||
.releasetable {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
|
||||
#releasetable table {
|
||||
.releasetable table {
|
||||
border-spacing: 1px;
|
||||
}
|
||||
|
||||
#releasetable th {
|
||||
.releasetable th {
|
||||
text-align: left;
|
||||
background-color: #ffffff;
|
||||
background-color: var(--color-module-bg);
|
||||
padding: 1px 5px;
|
||||
}
|
||||
|
||||
#releasetable td {
|
||||
background-color: #ffffff;
|
||||
.releasetable td {
|
||||
background-color: var(--color-module-bg);
|
||||
padding: 1px 5px;
|
||||
min-width: 70px;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
#releasetable td:nth-child(2) {
|
||||
.releasetable td:nth-child(2) {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#releasetable button {
|
||||
.releasetable button {
|
||||
padding: 3px 10px;
|
||||
background-color: #e0e0e0;
|
||||
background-color: var(--color-button-bg);
|
||||
}
|
||||
|
||||
#releasetable button:hover {
|
||||
background-color: #a0a0a0;
|
||||
.releasetable button:hover {
|
||||
background-color: var(--color-button-hover-bg);
|
||||
}
|
||||
|
||||
.updateCol1, .flashCol1 {
|
||||
@@ -865,9 +1019,9 @@ h4 {
|
||||
|
||||
.console {
|
||||
width: 450px;
|
||||
background-color: black;
|
||||
font-family: 'lucida console', 'ui-monospace';
|
||||
color: white;
|
||||
background-color: var(--color-console-bg);
|
||||
font-family: 'lucida console', 'ui-monospace', 'monospace';
|
||||
color: var(--color-console-text);
|
||||
padding: 5px 10px;
|
||||
padding-bottom: 25px;
|
||||
height: calc(100vh - 200px);
|
||||
@@ -906,15 +1060,15 @@ h4 {
|
||||
|
||||
@keyframes new {
|
||||
0% {
|
||||
background-color: rgba(255, 255, 204, 1);
|
||||
background-color: var(--color-log-new-bg-start);
|
||||
}
|
||||
|
||||
50% {
|
||||
background-color: rgba(255, 255, 204, .5);
|
||||
background-color: var(--color-log-new-bg-mid);
|
||||
}
|
||||
|
||||
100% {
|
||||
background-color: rgba(255, 255, 204, 0);
|
||||
background-color: var(--color-log-new-bg-end);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -936,14 +1090,13 @@ h4 {
|
||||
0% {}
|
||||
|
||||
50% {
|
||||
background-color: #d4d4f5;
|
||||
background-color: var(--color-tag-pending-anim-bg);
|
||||
}
|
||||
|
||||
100% {}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 480px) {
|
||||
/* styles for mobile devices in portrait mode */
|
||||
|
||||
body {
|
||||
font-size: 13px;
|
||||
@@ -998,4 +1151,22 @@ h4 {
|
||||
padding: 1px 1px;
|
||||
}
|
||||
|
||||
.theme-toggle-btn {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
color: var(--color-header-text);
|
||||
cursor: pointer;
|
||||
align-self: center;
|
||||
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
|
||||
margin-left: auto;
|
||||
border-left: 1px solid var(--color-tab-border);
|
||||
padding: 6px 1rem;
|
||||
border-radius: 4px;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
.theme-toggle-btn:hover {
|
||||
background-color: var(--color-tab-hover-bg);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@ const WAKEUP_REASON_GPIO = 2;
|
||||
const WAKEUP_REASON_NFC = 3;
|
||||
const WAKEUP_REASON_BUTTON1 = 4;
|
||||
const WAKEUP_REASON_BUTTON2 = 5;
|
||||
const WAKEUP_REASON_BUTTON3 = 6;
|
||||
const WAKEUP_REASON_FAILED_OTA_FW = 0xE0;
|
||||
const WAKEUP_REASON_FIRSTBOOT = 0xFC;
|
||||
const WAKEUP_REASON_NETWORK_SCAN = 0xFD;
|
||||
@@ -21,7 +22,7 @@ const apstate = [
|
||||
{ state: "online", color: "green", icon: "check_circle" },
|
||||
{ state: "flashing", color: "orange", icon: "flash_on" },
|
||||
{ state: "wait for reset", color: "blue", icon: "hourglass" },
|
||||
{ state: "AP requires power cycle", color: "purple", icon: "refresh" },
|
||||
{ state: "AP requires reboot", color: "purple", icon: "refresh" },
|
||||
{ state: "failed", color: "red", icon: "error" },
|
||||
{ state: "coming online...", color: "orange", icon: "hourglass" },
|
||||
{ state: "AP without radio", color: "green", icon: "wifi_off" }
|
||||
@@ -54,10 +55,9 @@ window.addEventListener("loadConfig", function () {
|
||||
$(".logo").innerHTML = data.alias;
|
||||
this.document.title = data.alias;
|
||||
}
|
||||
if (data.C6 == 1) {
|
||||
if (data.C6 == 1 || (data.H2 && data.H2 == 1)) {
|
||||
var optionToRemove = $("#apcfgchid").querySelector('option[value="27"]');
|
||||
if (optionToRemove) $("#apcfgchid").removeChild(optionToRemove);
|
||||
$('#updateC6Option').style.display = 'block';
|
||||
}
|
||||
if (data.hasFlasher == 1) {
|
||||
$('[data-target="flashtab"]').style.display = 'block';
|
||||
@@ -83,6 +83,34 @@ window.addEventListener("loadConfig", function () {
|
||||
});
|
||||
|
||||
window.addEventListener("load", function () {
|
||||
const themeToggle = $('#theme-toggle');
|
||||
if (themeToggle) {
|
||||
const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)');
|
||||
|
||||
const setTheme = (theme) => {
|
||||
if (theme === 'dark') {
|
||||
document.body.classList.add('dark-mode');
|
||||
themeToggle.innerHTML = 'dark_mode';
|
||||
localStorage.setItem('theme', 'dark');
|
||||
} else {
|
||||
document.body.classList.remove('dark-mode');
|
||||
themeToggle.innerHTML = 'light_mode';
|
||||
localStorage.setItem('theme', 'light');
|
||||
}
|
||||
};
|
||||
|
||||
themeToggle.addEventListener('click', () => {
|
||||
const isDarkMode = document.body.classList.contains('dark-mode');
|
||||
setTheme(isDarkMode ? 'light' : 'dark');
|
||||
});
|
||||
|
||||
const savedTheme = localStorage.getItem('theme');
|
||||
if (savedTheme) {
|
||||
setTheme(savedTheme);
|
||||
} else {
|
||||
setTheme(prefersDarkScheme.matches ? 'dark' : 'light');
|
||||
}
|
||||
}
|
||||
window.dispatchEvent(loadConfig);
|
||||
initTabs();
|
||||
fetch('content_cards.json')
|
||||
@@ -125,6 +153,18 @@ function initTabs() {
|
||||
tabLink.addEventListener("click", function (event) {
|
||||
event.preventDefault();
|
||||
const targetId = this.getAttribute("data-target");
|
||||
const url = new URL(window.location);
|
||||
if (targetId === 'tagtab') {
|
||||
if (url.searchParams.get('tab') !== 'tagtab') {
|
||||
url.searchParams.set('tab', 'tagtab');
|
||||
history.replaceState(null, '', url);
|
||||
}
|
||||
} else {
|
||||
if (url.searchParams.has('tab')) {
|
||||
url.searchParams.delete('tab');
|
||||
history.replaceState(null, '', url);
|
||||
}
|
||||
}
|
||||
const loadTabEvent = new CustomEvent('loadTab', { detail: targetId });
|
||||
document.dispatchEvent(loadTabEvent);
|
||||
tabContents.forEach(tabContent => {
|
||||
@@ -133,11 +173,20 @@ function initTabs() {
|
||||
tabLinks.forEach(link => {
|
||||
link.classList.remove("active");
|
||||
});
|
||||
if (targetId == "logtab") document.getElementById(targetId).scrollTop = 0;
|
||||
document.getElementById(targetId).style.display = "block";
|
||||
this.classList.add("active");
|
||||
});
|
||||
});
|
||||
tabLinks[0].click();
|
||||
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const tabToOpen = urlParams.get('tab');
|
||||
const targetTabLink = document.querySelector(`.tablinks[data-target="${tabToOpen}"]`);
|
||||
if (targetTabLink) {
|
||||
targetTabLink.click();
|
||||
} else {
|
||||
tabLinks[0].click();
|
||||
}
|
||||
};
|
||||
|
||||
function loadTags(pos) {
|
||||
@@ -266,6 +315,17 @@ function convertSize(bytes) {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
function clearTagStateClasses(tagElement) {
|
||||
tagElement.classList.remove(
|
||||
'state-deepsleep',
|
||||
'state-boot',
|
||||
'state-wakeup',
|
||||
'state-scan',
|
||||
'state-reset',
|
||||
'state-failed-ota'
|
||||
);
|
||||
}
|
||||
|
||||
function processTags(tagArray) {
|
||||
for (const element of tagArray) {
|
||||
const tagmac = element.mac;
|
||||
@@ -299,7 +359,7 @@ function processTags(tagArray) {
|
||||
if (alias.match(/^4467/)) {
|
||||
let macdigit = Number.parseInt(alias.substr(4, 2), 16) & 0x1f;
|
||||
let model = String.fromCharCode(macdigit + 65);
|
||||
if (model == 'J' || model == 'M') {
|
||||
if (model >= 'A' && model <= 'Z') {
|
||||
macdigit = Number.parseInt(alias.substr(6, 2), 16) & 0x1f;
|
||||
model += String.fromCharCode(macdigit + 65);
|
||||
alias = model + alias.substr(8, 8) + 'x'
|
||||
@@ -371,15 +431,20 @@ function processTags(tagArray) {
|
||||
} else {
|
||||
$('#tag' + tagmac + ' .nextupdate').innerHTML = "";
|
||||
}
|
||||
if (element.nextupdate < (Date.now() / 1000) - servertimediff) {
|
||||
$('#tag' + tagmac + ' .waitingicon').style.display = 'inline-block';
|
||||
} else {
|
||||
$('#tag' + tagmac + ' .waitingicon').style.display = 'none';
|
||||
}
|
||||
|
||||
if (element.nextcheckin > 1672531200) {
|
||||
div.dataset.nextcheckin = element.nextcheckin;
|
||||
} else {
|
||||
div.dataset.nextcheckin = element.lastseen + 1800;
|
||||
div.dataset.nextcheckin = element.lastseen + 60;
|
||||
}
|
||||
|
||||
div.style.opacity = '1';
|
||||
$('#tag' + tagmac + ' .lastseen').style.color = "black";
|
||||
$('#tag' + tagmac + ' .lastseen').style.color = "";
|
||||
div.classList.remove("tagpending");
|
||||
div.dataset.lastseen = element.lastseen;
|
||||
div.dataset.wakeupreason = element.wakeupReason;
|
||||
@@ -387,45 +452,56 @@ function processTags(tagArray) {
|
||||
div.dataset.channel = element.ch;
|
||||
div.dataset.isexternal = element.isexternal;
|
||||
$('#tag' + tagmac + ' .warningicon').style.display = 'none';
|
||||
$('#tag' + tagmac).style.background = "#ffffff";
|
||||
if (element.contentMode == 12 || element.nextcheckin == 3216153600) $('#tag' + tagmac).style.background = "#e4e4e0";
|
||||
|
||||
div.style.background = '';
|
||||
div.classList.remove('state-timeout');
|
||||
clearTagStateClasses(div);
|
||||
|
||||
let stateClassSet = false;
|
||||
switch (parseInt(element.wakeupReason)) {
|
||||
case WAKEUP_REASON_TIMED:
|
||||
break;
|
||||
case WAKEUP_REASON_BOOT:
|
||||
case WAKEUP_REASON_FIRSTBOOT:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "<font color=yellow>First boot</font>"
|
||||
$('#tag' + tagmac).style.background = "#b0d0b0";
|
||||
div.classList.add("state-boot");
|
||||
stateClassSet = true;
|
||||
break;
|
||||
case WAKEUP_REASON_GPIO:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "GPIO wakeup"
|
||||
$('#tag' + tagmac).style.background = "#c8f1bb";
|
||||
break;
|
||||
case WAKEUP_REASON_BUTTON1:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "Button 1 pressed"
|
||||
$('#tag' + tagmac).style.background = "#c8f1bb";
|
||||
break;
|
||||
case WAKEUP_REASON_BUTTON2:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "Button 2 pressed"
|
||||
$('#tag' + tagmac).style.background = "#c8f1bb";
|
||||
break;
|
||||
case WAKEUP_REASON_BUTTON3:
|
||||
case WAKEUP_REASON_NFC:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "NFC wakeup"
|
||||
$('#tag' + tagmac).style.background = "#c8f1bb";
|
||||
let reasonText = {
|
||||
[WAKEUP_REASON_GPIO]: "GPIO wakeup",
|
||||
[WAKEUP_REASON_BUTTON1]: "Button 1 pressed",
|
||||
[WAKEUP_REASON_BUTTON2]: "Button 2 pressed",
|
||||
[WAKEUP_REASON_BUTTON3]: "Button 3 pressed",
|
||||
[WAKEUP_REASON_NFC]: "NFC wakeup"
|
||||
}[parseInt(element.wakeupReason)];
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = reasonText;
|
||||
div.classList.add("state-wakeup");
|
||||
stateClassSet = true;
|
||||
break;
|
||||
case WAKEUP_REASON_NETWORK_SCAN:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "<font color=yellow>Network scan</font>"
|
||||
$('#tag' + tagmac).style.background = "#c0c0d0";
|
||||
div.classList.add("state-scan");
|
||||
stateClassSet = true;
|
||||
break;
|
||||
case WAKEUP_REASON_WDT_RESET:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "Watchdog reset!"
|
||||
$('#tag' + tagmac).style.background = "#d0a0a0";
|
||||
div.classList.add("state-reset");
|
||||
stateClassSet = true;
|
||||
break;
|
||||
case WAKEUP_REASON_FAILED_OTA_FW:
|
||||
$('#tag' + tagmac + ' .nextcheckin').innerHTML = "Firmware update rejected!"
|
||||
$('#tag' + tagmac).style.background = "#f0a0a0";
|
||||
div.classList.add("state-failed-ota");
|
||||
stateClassSet = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!stateClassSet && (element.contentMode == 12 || element.nextcheckin == 3216153600)) {
|
||||
div.classList.add("state-deepsleep");
|
||||
}
|
||||
$('#tag' + tagmac + ' .pendingicon').style.display = (element.pending ? 'inline-block' : 'none');
|
||||
$('#tag' + tagmac + ' .pendingicon').innerHTML = element.pending;
|
||||
div.classList.add("tagflash");
|
||||
@@ -460,18 +536,24 @@ function updatecards() {
|
||||
if (tagDB[tagmac].batteryMv < 2400 && tagDB[tagmac].batteryMv != 0 && tagDB[tagmac].batteryMv != 1337) lowbattcount++;
|
||||
if (item.dataset.lastseen && item.dataset.lastseen > (Date.now() / 1000) - servertimediff - 30 * 24 * 3600 * 60) {
|
||||
let idletime = (Date.now() / 1000) - servertimediff - item.dataset.lastseen;
|
||||
$('#tag' + tagmac + ' .lastseen').innerHTML = "<span>last seen</span>" + displayTime(Math.floor(idletime)) + " ago";
|
||||
if ((Date.now() / 1000) - servertimediff - 600 > item.dataset.nextcheckin) {
|
||||
$('#tag' + tagmac + ' .warningicon').style.display = 'inline-block';
|
||||
$('#tag' + tagmac).classList.remove("tagpending")
|
||||
$('#tag' + tagmac).style.background = '#e0e0a0';
|
||||
$('#tag' + tagmac + ' .lastseen').innerHTML = "<span>last seen</span>" + displayTime(Math.floor(idletime)) + " ago";
|
||||
if ((Date.now() / 1000) - servertimediff - apConfig.maxsleep * 60 - 300 > item.dataset.nextcheckin) {
|
||||
item.querySelector('.warningicon').style.display = 'inline-block';
|
||||
item.classList.remove("tagpending");
|
||||
item.classList.add('state-timeout');
|
||||
timeoutcount++;
|
||||
} else {
|
||||
item.classList.remove('state-timeout');
|
||||
if (tagDB[tagmac].pending) pendingcount++;
|
||||
}
|
||||
|
||||
const lastseenEl = item.querySelector('.lastseen');
|
||||
if (idletime > 24 * 3600) {
|
||||
$('#tag' + tagmac).style.opacity = '.5';
|
||||
$('#tag' + tagmac + ' .lastseen').style.color = "red";
|
||||
item.style.opacity = '.5';
|
||||
lastseenEl.classList.add('error');
|
||||
} else {
|
||||
item.style.opacity = '1';
|
||||
lastseenEl.classList.remove('error');
|
||||
}
|
||||
} else {
|
||||
if ($('#tag' + tagmac + ' .lastseen')) {
|
||||
@@ -489,6 +571,12 @@ function updatecards() {
|
||||
} else {
|
||||
// $('#tag' + tagmac + ' .nextcheckin').innerHTML = "";
|
||||
}
|
||||
|
||||
if (item.dataset.nextupdate < (Date.now() / 1000) - servertimediff) {
|
||||
$('#tag' + tagmac + ' .waitingicon').style.display = 'inline-block';
|
||||
} else {
|
||||
$('#tag' + tagmac + ' .waitingicon').style.display = 'none';
|
||||
}
|
||||
})
|
||||
|
||||
$('#dashboardTagCount').innerHTML = tagcount;
|
||||
@@ -793,6 +881,7 @@ document.addEventListener("loadTab", function (event) {
|
||||
$("#apcnight1").value = data.sleeptime1;
|
||||
$("#apcnight2").value = data.sleeptime2;
|
||||
$("#apcdiscovery").value = data.discovery;
|
||||
$("#apcshowtimestamp").value = data.showtimestamp;
|
||||
}
|
||||
})
|
||||
$('#apcfgmsg').innerHTML = '';
|
||||
@@ -830,7 +919,8 @@ $('#apcfgsave').onclick = function () {
|
||||
formData.append('timezone', $('#apctimezone').value);
|
||||
formData.append('sleeptime1', $('#apcnight1').value);
|
||||
formData.append('sleeptime2', $('#apcnight2').value);
|
||||
formData.append('discovery', $('#apcdiscovery').value)
|
||||
formData.append('discovery', $('#apcdiscovery').value);
|
||||
formData.append('showtimestamp', $('#apcshowtimestamp').value);
|
||||
fetch("save_apcfg", {
|
||||
method: "POST",
|
||||
body: formData
|
||||
@@ -994,7 +1084,7 @@ function contentselected() {
|
||||
fetch('edit?list=%2F&recursive=1')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
let files = data.filter(item => item.type === "file" && item.name.endsWith(".jpg"));
|
||||
let files = data.filter(item => item.type === "file" && (item.name.toLowerCase().endsWith(".jpg") || item.name.toLowerCase().endsWith(".jpeg")));
|
||||
if (element.type == 'binfile') files = data.filter(item => item.type === "file" && item.name.endsWith(".bin"));
|
||||
if (element.type == 'jsonfile') files = data.filter(item => item.type === "file" && item.name.endsWith(".json"));
|
||||
const optionElement = document.createElement("option");
|
||||
@@ -1253,28 +1343,24 @@ function drawCanvas(buffer, canvas, hwtype, tagmac, doRotate) {
|
||||
imageData.data[i * 4 + 3] = 255;
|
||||
}
|
||||
|
||||
} else if (tagTypes[hwtype].bpp == 3) {
|
||||
} else if ([3, 4].includes(tagTypes[hwtype].bpp)) {
|
||||
const bpp = tagTypes[hwtype].bpp;
|
||||
const colorTable = tagTypes[hwtype].colortable;
|
||||
|
||||
let pixelIndex = 0;
|
||||
for (let i = 0; i < data.length; i += 3) {
|
||||
for (let j = 0; j < 8; j++) {
|
||||
let bitPos = j * 3;
|
||||
let bytePos = Math.floor(bitPos / 8);
|
||||
let bitOffset = bitPos % 8;
|
||||
let pixelValue = (data[i + bytePos] >> (5 - bitOffset)) & 0x07;
|
||||
if (bitOffset > 5) {
|
||||
pixelValue = ((data[i + bytePos] & (0xFF >> bitOffset)) << (bitOffset - 5)) |
|
||||
(data[i + bytePos + 1] >> (13 - bitOffset));
|
||||
}
|
||||
imageData.data[pixelIndex * 4] = colorTable[pixelValue][0];
|
||||
imageData.data[pixelIndex * 4 + 1] = colorTable[pixelValue][1];
|
||||
imageData.data[pixelIndex * 4 + 2] = colorTable[pixelValue][2];
|
||||
imageData.data[pixelIndex * 4 + 3] = 255;
|
||||
pixelIndex++;
|
||||
}
|
||||
}
|
||||
let bitOffset = 0;
|
||||
|
||||
while (bitOffset < data.length * 8) {
|
||||
let byteIndex = bitOffset >> 3;
|
||||
let startBit = bitOffset & 7;
|
||||
let pixelValue = (data[byteIndex] << 8 | data[byteIndex + 1] || 0) >> (16 - bpp - startBit) & ((1 << bpp) - 1);
|
||||
let color = colorTable[pixelValue];
|
||||
imageData.data[pixelIndex * 4] = color[0];
|
||||
imageData.data[pixelIndex * 4 + 1] = color[1];
|
||||
imageData.data[pixelIndex * 4 + 2] = color[2];
|
||||
imageData.data[pixelIndex * 4 + 3] = 255;
|
||||
pixelIndex++;
|
||||
bitOffset += bpp;
|
||||
}
|
||||
} else {
|
||||
|
||||
const offsetRed = (data.length >= (canvas.width * canvas.height / 8) * 2) ? canvas.width * canvas.height / 8 : 0;
|
||||
@@ -1527,7 +1613,7 @@ async function getTagtype(hwtype) {
|
||||
height: parseInt(jsonData.height),
|
||||
bpp: parseInt(jsonData.bpp),
|
||||
rotatebuffer: jsonData.rotatebuffer,
|
||||
colortable: Object.values(jsonData.colortable),
|
||||
colortable: Object.values(jsonData.perceptual ?? jsonData.colortable),
|
||||
contentids: Object.values(jsonData.contentids ?? []),
|
||||
options: Object.values(jsonData.options ?? []),
|
||||
zlib: parseInt(jsonData.zlib_compression || "0", 16),
|
||||
@@ -1571,6 +1657,7 @@ function dropUpload() {
|
||||
|
||||
dropZone.addEventListener('drop', (event) => {
|
||||
event.preventDefault();
|
||||
const shiftKey = event.shiftKey;
|
||||
const file = event.dataTransfer.files[0];
|
||||
const tagCard = event.target.closest('.tagcard');
|
||||
const mac = tagCard.dataset.mac;
|
||||
@@ -1604,6 +1691,7 @@ function dropUpload() {
|
||||
canvas.toBlob(async (blob) => {
|
||||
const formData = new FormData();
|
||||
formData.append('mac', mac);
|
||||
if (shiftKey) formData.append('dither', '2');
|
||||
formData.append('file', blob, 'image.jpg');
|
||||
|
||||
try {
|
||||
@@ -1790,12 +1878,25 @@ function populateAPInfo(apip) {
|
||||
})
|
||||
.then(data => {
|
||||
if (data.env) {
|
||||
let gModuleType = "";
|
||||
if (data.hasC6 == 1) {
|
||||
gModuleType = "esp32-C6";
|
||||
}
|
||||
if (data.hasH2 == 1) {
|
||||
gModuleType = "esp32-H2";
|
||||
}
|
||||
if (data.hasTslr == 1) {
|
||||
gModuleType = "TSLR";
|
||||
}
|
||||
let version = '';
|
||||
version += `env: ${data.env}<br>`;
|
||||
version += `build date: ${formatEpoch(data.buildtime)}<br>`;
|
||||
version += `esp32 version: ${data.buildversion}<br>`;
|
||||
version += `psram size: ${data.psramsize}<br>`;
|
||||
version += `flash size: ${data.flashsize}<br>`;
|
||||
if (gModuleType) {
|
||||
version += `${gModuleType} version: 0x${parseInt(data.ap_version).toString(16).toUpperCase()}<br>`;
|
||||
}
|
||||
$('#ap' + apid + ' .apswversion').innerHTML = version;
|
||||
}
|
||||
})
|
||||
@@ -1906,7 +2007,7 @@ function openPreview(mac, w, h) {
|
||||
previewWindow.document.body.style.backgroundColor = "#dddddd";
|
||||
previewWindow.document.body.style.margin = "15px";
|
||||
previewWindow.document.body.style.overflow = "hidden";
|
||||
previewWindow.document.body.innerHTML = `<canvas id="preview" style="border:1px solid #888888;"></canvas>`;
|
||||
previewWindow.document.body.innerHTML = `<canvas id="preview" style="border:1px solid #888888;image-rendering: pixelated;"></canvas>`;
|
||||
|
||||
showPreview(previewWindow, element);
|
||||
|
||||
|
||||
@@ -7,8 +7,27 @@ let running = false;
|
||||
let errors = 0;
|
||||
let env = '', currentVer = '', currentBuildtime = 0;
|
||||
let buttonState = false;
|
||||
let gIsC6 = false;
|
||||
let gIsH2 = false;
|
||||
let gModuleType = '';
|
||||
let gShortName = '';
|
||||
let gCurrentRfVer = 0;
|
||||
|
||||
export async function initUpdate() {
|
||||
if (apConfig.C6 == 1) {
|
||||
gIsC6 = true;
|
||||
gModuleType = "ESP32-C6";
|
||||
gShortName = "C6";
|
||||
}
|
||||
else if (apConfig?.H2 && apConfig.H2 == 1) {
|
||||
gIsH2 = true;
|
||||
gModuleType = "ESP32-H2";
|
||||
gShortName = "H2";
|
||||
}
|
||||
else {
|
||||
gModuleType = "Unknown"
|
||||
}
|
||||
$('#radio_release_title').innerHTML = gModuleType + " Firmware";
|
||||
|
||||
const response = await fetch("version.txt");
|
||||
let filesystemversion = await response.text();
|
||||
@@ -30,7 +49,7 @@ export async function initUpdate() {
|
||||
$('#selectRepo').style.display = 'inline-block';
|
||||
$('#repoWarning').style.display = 'none';
|
||||
|
||||
const sysinfoPromise = fetch("sysinfo")
|
||||
const sdata = await fetch("sysinfo")
|
||||
.then(response => {
|
||||
if (response.status != 200) {
|
||||
print("Error fetching sysinfo: " + response.status, "red");
|
||||
@@ -48,95 +67,173 @@ export async function initUpdate() {
|
||||
print('Error fetching sysinfo: ' + error, "red");
|
||||
});
|
||||
|
||||
const repoPromise = fetch(repoUrl)
|
||||
.then(response => response.json())
|
||||
if (sdata.env) {
|
||||
print(`current env: ${sdata.env}`);
|
||||
print(`build date: ${formatEpoch(sdata.buildtime)}`);
|
||||
print(`esp32 version: ${sdata.buildversion}`);
|
||||
print(`filesystem version: ${filesystemversion}`);
|
||||
print(`psram size: ${sdata.psramsize}`);
|
||||
print(`flash size: ${sdata.flashsize}`);
|
||||
if (gModuleType !== '') {
|
||||
let hex_ver = sdata.ap_version && !isNaN(sdata.ap_version)
|
||||
? ('0000' + sdata.ap_version.toString(16)).slice(-4)
|
||||
: 'unknown';
|
||||
print(`${gModuleType} version: ${hex_ver}`);
|
||||
}
|
||||
print("--------------------------", "gray");
|
||||
env = apConfig.env || sdata.env;
|
||||
if (sdata.env != env) {
|
||||
print(`Warning: you selected a build environment ${env} which is\ndifferent than the currently used ${sdata.env}.\nOnly update the firmware with a mismatched build environment if\nyou know what you're doing.`, "yellow");
|
||||
}
|
||||
currentVer = sdata.buildversion;
|
||||
currentBuildtime = sdata.buildtime;
|
||||
gCurrentRfVer = sdata.ap_version;
|
||||
if (sdata.rollback) $("#rollbackOption").style.display = 'block';
|
||||
$('#environment').value = env;
|
||||
}
|
||||
|
||||
|
||||
Promise.all([sysinfoPromise, repoPromise])
|
||||
.then(([sdata, rdata]) => {
|
||||
|
||||
if (sdata.env) {
|
||||
print(`current env: ${sdata.env}`);
|
||||
print(`build date: ${formatEpoch(sdata.buildtime)}`);
|
||||
print(`esp32 version: ${sdata.buildversion}`);
|
||||
print(`filesystem version: ${filesystemversion}`);
|
||||
print(`psram size: ${sdata.psramsize}`);
|
||||
print(`flash size: ${sdata.flashsize}`);
|
||||
print("--------------------------", "gray");
|
||||
env = apConfig.env || sdata.env;
|
||||
if (sdata.env != env) {
|
||||
print(`Warning: you selected a build environment ${env} which is\ndifferent than the currently used ${sdata.env}.\nOnly update the firmware with a mismatched build environment if\nyou know what you're doing.`, "yellow");
|
||||
}
|
||||
currentVer = sdata.buildversion;
|
||||
currentBuildtime = sdata.buildtime;
|
||||
if (sdata.rollback) $("#rollbackOption").style.display = 'block';
|
||||
$('#environment').value = env;
|
||||
const rdata = await fetch(repoUrl).then(response => response.json())
|
||||
const JsonName = 'firmware_' + gShortName + '.json';
|
||||
const releaseDetails = rdata.map(release => {
|
||||
const assets = release.assets;
|
||||
const filesJsonAsset = assets.find(asset => asset.name === 'filesystem.json');
|
||||
const binariesJsonAsset = assets.find(asset => asset.name === 'binaries.json');
|
||||
const containsEnv = assets.find(asset => asset.name === env + '.bin');
|
||||
const firmwareAsset = assets.find(asset => asset.name === JsonName);
|
||||
if (filesJsonAsset && binariesJsonAsset && containsEnv) {
|
||||
return {
|
||||
html_url: release.html_url,
|
||||
tag_name: release.tag_name,
|
||||
name: release.name,
|
||||
date: formatDateTime(release.published_at),
|
||||
author: release.author.login,
|
||||
file_url: filesJsonAsset.browser_download_url,
|
||||
bin_url: binariesJsonAsset.browser_download_url,
|
||||
firmware_url: firmwareAsset?.browser_download_url,
|
||||
}
|
||||
};
|
||||
})
|
||||
|
||||
const releaseDetails = rdata.map(release => {
|
||||
const assets = release.assets;
|
||||
const filesJsonAsset = assets.find(asset => asset.name === 'filesystem.json');
|
||||
const binariesJsonAsset = assets.find(asset => asset.name === 'binaries.json');
|
||||
const containsEnv = assets.find(asset => asset.name === env + '.bin');
|
||||
if (filesJsonAsset && binariesJsonAsset && containsEnv) {
|
||||
return {
|
||||
html_url: release.html_url,
|
||||
tag_name: release.tag_name,
|
||||
name: release.name,
|
||||
date: formatDateTime(release.published_at),
|
||||
author: release.author.login,
|
||||
file_url: filesJsonAsset.browser_download_url,
|
||||
bin_url: binariesJsonAsset.browser_download_url
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
const easyupdate = $('#easyupdate');
|
||||
if (releaseDetails.length === 0) {
|
||||
easyupdate.innerHTML = ("No releases found.");
|
||||
if (releaseDetails.length === 0) {
|
||||
easyupdate.innerHTML = ("No releases found.");
|
||||
} else {
|
||||
const release = releaseDetails[0];
|
||||
if (release?.tag_name) {
|
||||
if (release.tag_name == currentVer) {
|
||||
easyupdate.innerHTML = `Version ${currentVer}. You are up to date`;
|
||||
} else if (release.date < formatEpoch(currentBuildtime - 30 * 60)) {
|
||||
easyupdate.innerHTML = `Your version is newer than the latest release date.<br>Are you the developer? :-)`;
|
||||
} else {
|
||||
const release = releaseDetails[0];
|
||||
if (release?.tag_name) {
|
||||
if (normalizeVersion(release.tag_name) === normalizeVersion(currentVer)) {
|
||||
easyupdate.innerHTML = `Version ${currentVer}. You are up to date`;
|
||||
} else if (release.date < formatEpoch(currentBuildtime - 30 * 60)) {
|
||||
easyupdate.innerHTML = `Your version is newer than the latest release date.<br>Are you the developer? :-)`;
|
||||
} else {
|
||||
easyupdate.innerHTML = `An update from version ${currentVer} to version ${release.tag_name} is available.<button onclick="otamodule.updateAll('${release.bin_url}','${release.file_url}','${release.tag_name}')">Update now!</button>`;
|
||||
}
|
||||
}
|
||||
easyupdate.innerHTML = `An update from version ${currentVer} to version ${release.tag_name} is available.<button onclick="otamodule.updateAll('${release.bin_url}','${release.file_url}','${release.tag_name}')">Update now!</button>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const table = document.createElement('table');
|
||||
const tableHeader = document.createElement('tr');
|
||||
tableHeader.innerHTML = '<th>Release</th><th>Date</th><th>Name</th><th colspan="2">Update:</th><th>Remark</th>';
|
||||
table.appendChild(tableHeader);
|
||||
const table = document.createElement('table');
|
||||
const tableHeader = document.createElement('tr');
|
||||
tableHeader.innerHTML = '<th>Release</th><th>Date</th><th>Name</th><th colspan="2"><center>Update</center></th><th>Remark</th>';
|
||||
table.appendChild(tableHeader);
|
||||
|
||||
let rowCounter = 0;
|
||||
releaseDetails.forEach(release => {
|
||||
if (rowCounter < 4 && release?.html_url) {
|
||||
const tableRow = document.createElement('tr');
|
||||
let tablerow = `<td><a href="${release.html_url}" target="_new">${release.tag_name}</a></td><td>${release.date}</td><td>${release.name}</td><td><button type="button" onclick="otamodule.updateWebpage('${release.file_url}','${release.tag_name}', true)">Filesystem</button></td><td><button type="button" onclick="otamodule.updateESP('${release.bin_url}', true)">ESP32</button></td>`;
|
||||
if (release.tag_name == currentVer) {
|
||||
tablerow += "<td>current version</td>";
|
||||
} else if (release.date < formatEpoch(currentBuildtime)) {
|
||||
tablerow += "<td>older</td>";
|
||||
} else {
|
||||
tablerow += "<td>newer</td>";
|
||||
let rowCounter = 0;
|
||||
let radioFwCounter = 0;
|
||||
releaseDetails.forEach(release => {
|
||||
if (rowCounter < 4 && release?.html_url) {
|
||||
const tableRow = document.createElement('tr');
|
||||
let tablerow = `<td><a href="${release.html_url}" target="_new">${release.tag_name}</a></td><td>${release.date}</td><td>${release.name}</td><td><button type="button" onclick="otamodule.updateESP('${release.bin_url}', true)">ESP32</button></td><td><button type="button" onclick="otamodule.updateWebpage('${release.file_url}','${release.tag_name}', true)">Filesystem</button></td>`;
|
||||
if (release.tag_name == currentVer) {
|
||||
tablerow += "<td>current version</td>";
|
||||
} else if (release.date < formatEpoch(currentBuildtime)) {
|
||||
tablerow += "<td>older</td>";
|
||||
} else {
|
||||
tablerow += "<td>newer</td>";
|
||||
}
|
||||
tableRow.innerHTML = tablerow;
|
||||
table.appendChild(tableRow);
|
||||
rowCounter++;
|
||||
}
|
||||
if (release?.firmware_url) {
|
||||
radioFwCounter++;
|
||||
}
|
||||
});
|
||||
$('#releasetable').innerHTML = "";
|
||||
$('#releasetable').appendChild(table);
|
||||
|
||||
if (radioFwCounter > 0) {
|
||||
const table1 = document.createElement('table');
|
||||
const tableHeader1 = document.createElement('tr');
|
||||
|
||||
tableHeader1.innerHTML = '<th>Release</th><th>Date</th><th>Name</th><th><center>Update</center></th><th>Version</th><th>Remark</th>';
|
||||
table1.appendChild(tableHeader1);
|
||||
|
||||
rowCounter = 0;
|
||||
for (const release of releaseDetails) {
|
||||
if (rowCounter < 4 && release?.firmware_url) {
|
||||
const tableRow = document.createElement('tr');
|
||||
var tablerow;
|
||||
var firmwareVer = "unknown";
|
||||
var release_url = release.firmware_url;
|
||||
|
||||
tablerow = `<td><a href="${release.html_url}" target="_new">${release.tag_name}</a></td><td>${release.date}</td><td>${release.name}</td>`;
|
||||
tablerow += `<td><button type="button" onclick="otamodule.updateC6H2('${release_url}')">${gModuleType}</button></td>`;
|
||||
const firmwareUrl = 'http://proxy.openepaperlink.org/proxy.php?url=' + release.firmware_url;
|
||||
firmwareVer = await fetch(firmwareUrl, { method: 'GET' })
|
||||
.then(function (response) { return response.json(); })
|
||||
.then(function (response) {
|
||||
return response[2]['version'];
|
||||
})
|
||||
.catch(error => {
|
||||
print('Error fetching releases:' + error, "red");
|
||||
});
|
||||
tablerow += '<td>' + firmwareVer + '</td><td>';
|
||||
if (firmwareVer != 'unknown') {
|
||||
let Ver = Number('0x' + firmwareVer);
|
||||
if (Ver > gCurrentRfVer) {
|
||||
tablerow += 'newer';
|
||||
}
|
||||
else if (Ver < gCurrentRfVer) {
|
||||
tablerow += 'older';
|
||||
}
|
||||
else if (!Number.isNaN(Ver)) {
|
||||
tablerow += 'current version';
|
||||
}
|
||||
tableRow.innerHTML = tablerow;
|
||||
table.appendChild(tableRow);
|
||||
rowCounter++;
|
||||
}
|
||||
});
|
||||
tablerow += '</td>';
|
||||
tableRow.innerHTML = tablerow;
|
||||
table1.appendChild(tableRow);
|
||||
rowCounter++;
|
||||
}
|
||||
};
|
||||
|
||||
$('#releasetable').innerHTML = "";
|
||||
$('#releasetable').appendChild(table);
|
||||
disableButtons(buttonState);
|
||||
})
|
||||
.catch(error => {
|
||||
print('Error fetching releases:' + error, "red");
|
||||
});
|
||||
$('#radio_releasetable').innerHTML = "";
|
||||
$('#radio_releasetable').appendChild(table1);
|
||||
}
|
||||
|
||||
const table2 = document.createElement('table');
|
||||
{
|
||||
const tableHeader2 = document.createElement('tr');
|
||||
tableHeader2.innerHTML = '<th>Firmware</th><th><center>Update</center></th>';
|
||||
table2.appendChild(tableHeader2);
|
||||
const tableRow = document.createElement('tr');
|
||||
tablerow = '<td title="manual upload, make sure all four files are present">Binaries from <a href="/edit" target="littlefs">file system</a></td>';
|
||||
tablerow += `<td><button type="button" onclick="otamodule.updateC6H2('')">${gModuleType}</button></td>`;
|
||||
tableRow.innerHTML = tablerow;
|
||||
table2.appendChild(tableRow);
|
||||
}
|
||||
{
|
||||
const tableRow = document.createElement('tr');
|
||||
const Url = "https://raw.githubusercontent.com/" + repo +
|
||||
"/master/binaries/ESP32-" + gShortName +
|
||||
"/firmware_" + gShortName + ".json";
|
||||
|
||||
tablerow = `<td><a href="https://github.com/${repo}/tree/master/binaries/ESP32-${gShortName}/" target="_new">Latest version from repo</a></td>`;
|
||||
tablerow += `<td><button type="button" onclick="otamodule.updateC6H2('${Url}')">${gModuleType}</button></td>`;
|
||||
tableRow.innerHTML = tablerow;
|
||||
table2.appendChild(tableRow);
|
||||
}
|
||||
$('#radio_releasetable1').innerHTML = "";
|
||||
$('#radio_releasetable1').appendChild(table2);
|
||||
|
||||
disableButtons(buttonState);
|
||||
}
|
||||
|
||||
export function updateAll(binUrl, fileUrl, tagname) {
|
||||
@@ -355,19 +452,18 @@ $('#rollbackBtn').onclick = function () {
|
||||
disableButtons(false);
|
||||
}
|
||||
|
||||
$('#updateC6Btn').onclick = function () {
|
||||
export async function updateC6H2(Url) {
|
||||
if (running) return;
|
||||
disableButtons(true);
|
||||
running = true;
|
||||
errors = 0;
|
||||
const ReleaseUrl = Url.substring(0, Url.lastIndexOf('/'));
|
||||
const consoleDiv = document.getElementById('updateconsole');
|
||||
consoleDiv.scrollTop = consoleDiv.scrollHeight;
|
||||
|
||||
print("Flashing ESP32-C6...");
|
||||
|
||||
const isChecked = $('#c6download').checked;
|
||||
const formData = new FormData();
|
||||
formData.append('download', isChecked ? '1' : '0');
|
||||
|
||||
print("Flashing " + gModuleType + " ...");
|
||||
formData.append('url', ReleaseUrl);
|
||||
|
||||
fetch("update_c6", {
|
||||
method: "POST",
|
||||
@@ -402,7 +498,7 @@ $('#selectRepo').onclick = function (event) {
|
||||
return fetch(updateUrl);
|
||||
} else {
|
||||
throw new Error("Json file binaries.json and/or filesystem.json not found in the release assets");
|
||||
}
|
||||
}
|
||||
};
|
||||
})
|
||||
.then(updateResponse => {
|
||||
@@ -415,7 +511,7 @@ $('#selectRepo').onclick = function (event) {
|
||||
if (!responseBody.trim().startsWith("[")) {
|
||||
throw new Error("Failed to fetch the release info file");
|
||||
}
|
||||
const updateData = JSON.parse(responseBody).filter(item => !item.name.endsWith('_full.bin'));
|
||||
const updateData = JSON.parse(responseBody).filter(item => !item.name.endsWith('_full.bin') && !item.name.includes('_H2.') && !item.name.includes('_C6.'));
|
||||
|
||||
const inputParent = $('#environment').parentNode;
|
||||
const selectElement = document.createElement('select');
|
||||
@@ -436,7 +532,7 @@ $('#selectRepo').onclick = function (event) {
|
||||
})
|
||||
.catch(error => {
|
||||
print('Error fetching releases:' + error, "red");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
$('#cancelSelectRepo').onclick = function (event) {
|
||||
@@ -615,7 +711,7 @@ async function fetchAndCheckTagtypes(cleanup) {
|
||||
check = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (check) {
|
||||
let githubUrl = "https://raw.githubusercontent.com/" + repo + "/master/resources/tagtypes/" + filename;
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@ function startPainter(mac, width, height, tagtype) {
|
||||
canvas.addEventListener('touchend', handleTouchEnd);
|
||||
canvas.addEventListener('touchmove', handleTouchMove, { passive: true });
|
||||
|
||||
var sizes = [10,11,12,13,14,16,18,20,24,28,32,36,40,48,56,64,72,84];
|
||||
var sizes = [10,11,12,13,14,16,18,20,24,28,32,36,40,48,56,64,72,84,96,108,120,144,168,192,256,320,384,480,512];
|
||||
|
||||
const fontSelect = document.createElement('select');
|
||||
fontSelect.id = 'font-select';
|
||||
|
||||
@@ -4,6 +4,13 @@ This is an alternative firmware and protocol for the multiple Electronic Shelf L
|
||||
|
||||
The software in this project consists of two parts: Accesspoint-firmware and Tag firmware.
|
||||
Additionally, there are various hardware designs for accesspoints and flasher-interfaces to program the tags, preferably using programming jigs
|
||||
|
||||
>[!Note]
|
||||
>Please refer to the [Wiki](https://github.com/jjwbruijn/OpenEPaperLink/wiki) for the latest information.
|
||||
>
|
||||
>Much of this README is now obsolete, but it has been retained for historical reference.
|
||||
>
|
||||
>For example the use of tags as RF coprocessors is no longer supported.
|
||||
|
||||
## Aims
|
||||
- Low power (currently around 9µA with a minimum of 40 second latency)
|
||||
|
||||
@@ -13,7 +13,7 @@ platform = espressif32
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
https://github.com/MajenkoLibraries/SoftSPI
|
||||
bblanchon/ArduinoJson
|
||||
bblanchon/ArduinoJson@7.1.0
|
||||
|
||||
platform_packages =
|
||||
board_build.filesystem = littlefs
|
||||
@@ -61,4 +61,4 @@ build_src_filter =
|
||||
board_build.psram_type=qspi_opi
|
||||
board_upload.maximum_size = 4194304
|
||||
board_upload.maximum_ram_size = 327680
|
||||
board_upload.flash_size = 4MB
|
||||
board_upload.flash_size = 4MB
|
||||
|
||||
@@ -106,9 +106,12 @@ python3 .\88MZ100-OEPL-Flasher.py COM31 write_flash '0130c8144117.bin'
|
||||
|
||||
## TI CC1110-based
|
||||
|
||||
Use with the -c option for CC1110. Neigher Autoflash is currently not implemented on the Tag_Flasher/S2 version.
|
||||
> [!IMPORTANT]
|
||||
> Tag flasher version 50 or later is required for CC1110 support.
|
||||
>
|
||||
Use with the -c option for CC1110.
|
||||
|
||||
The CC1110 does not have an infopage nor is the Tag's EEPROM accessable.
|
||||
The CC1110 does not have an infopage nor is the Tag's EEPROM accessable. Autoflash is currently not implemented for the CC1110.
|
||||
|
||||
```shell
|
||||
python3 OEPL-Flasher.py -e -c -p COM31 read blaat.bin --flash
|
||||
@@ -117,6 +120,9 @@ python3 OEPL-Flasher.py -e -c -p COM31 read blaat.bin --flash
|
||||
See this [page](https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/Chroma-Series-SubGhz-Tags#flashing-cc1110-based-chroma-tags)
|
||||
on the Wiki for additional information.
|
||||
|
||||
## EFR32-based
|
||||
|
||||
This flasher does **NOT** support tags based on the EFR32. See the [wiki](https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/Flashing-SiLabs-based-M3-Newton-Displays) for information on how to flash those.
|
||||
## Credits
|
||||
|
||||
Much code was reused from ATC1441's various flashers
|
||||
|
||||
Binary file not shown.
BIN
binaries/ESP32-C6/OpenEPaperLink_esp32_C6_Uart0.bin
Normal file
BIN
binaries/ESP32-C6/OpenEPaperLink_esp32_C6_Uart0.bin
Normal file
Binary file not shown.
@@ -1,12 +1,15 @@
|
||||
[{
|
||||
"filename": "bootloader.bin",
|
||||
"address": "0x0"
|
||||
"address": "0x0",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "partition-table.bin",
|
||||
"address": "0x8000"
|
||||
"address": "0x8000",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "OpenEPaperLink_esp32_C6.bin",
|
||||
"address": "0x10000"
|
||||
"address": "0x10000",
|
||||
"version": "001f"
|
||||
}]
|
||||
|
||||
15
binaries/ESP32-C6/firmware_C6.json
Normal file
15
binaries/ESP32-C6/firmware_C6.json
Normal file
@@ -0,0 +1,15 @@
|
||||
[{
|
||||
"filename": "bootloader_C6.bin",
|
||||
"address": "0x0",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "partition-table_C6.bin",
|
||||
"address": "0x8000",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "OpenEPaperLink_esp32_C6.bin",
|
||||
"address": "0x10000",
|
||||
"version": "001f"
|
||||
}]
|
||||
Binary file not shown.
@@ -1,12 +1,15 @@
|
||||
[{
|
||||
"filename": "bootloader.bin",
|
||||
"address": "0x0"
|
||||
"address": "0x0",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "partition-table.bin",
|
||||
"address": "0x8000"
|
||||
"address": "0x8000",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "OpenEPaperLink_esp32_H2.bin",
|
||||
"address": "0x10000"
|
||||
"address": "0x10000",
|
||||
"version": "001f"
|
||||
}]
|
||||
|
||||
15
binaries/ESP32-H2/firmware_H2.json
Normal file
15
binaries/ESP32-H2/firmware_H2.json
Normal file
@@ -0,0 +1,15 @@
|
||||
[{
|
||||
"filename": "bootloader_H2.bin",
|
||||
"address": "0x0",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "partition-table_H2.bin",
|
||||
"address": "0x8000",
|
||||
"version": "0001"
|
||||
},
|
||||
{
|
||||
"filename": "OpenEPaperLink_esp32_H2.bin",
|
||||
"address": "0x10000",
|
||||
"version": "001f"
|
||||
}]
|
||||
BIN
binaries/TLSR/OEPL_TLSR_AP.bin
Executable file
BIN
binaries/TLSR/OEPL_TLSR_AP.bin
Executable file
Binary file not shown.
BIN
binaries/Tag/ATC_Cheapo_BLE_OEPL_Watch.bin
Normal file
BIN
binaries/Tag/ATC_Cheapo_BLE_OEPL_Watch.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M2_26_SSD_0028.bin
Normal file
BIN
binaries/Tag/SOL_M2_26_SSD_0028.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/chroma29_8151_full_0013.bin
Normal file
BIN
binaries/Tag/chroma29_8151_full_0013.bin
Normal file
Binary file not shown.
1002
binaries/Tag/chroma29_8151_full_0013.hex
Normal file
1002
binaries/Tag/chroma29_8151_full_0013.hex
Normal file
File diff suppressed because it is too large
Load Diff
BIN
binaries/Tag/chroma29_8151_ota_0013.bin
Normal file
BIN
binaries/Tag/chroma29_8151_ota_0013.bin
Normal file
Binary file not shown.
Binary file not shown.
@@ -1,990 +0,0 @@
|
||||
:040000000200833245
|
||||
:01000B0032C2
|
||||
:0100130032BA
|
||||
:01001B0032B2
|
||||
:0100230032AA
|
||||
:03002B000249CABD
|
||||
:01003300329A
|
||||
:01003B003292
|
||||
:03004300024F8CDD
|
||||
:03004B000248E781
|
||||
:01005300327A
|
||||
:01005B003272
|
||||
:01006300326A
|
||||
:01006B003262
|
||||
:01007300325A
|
||||
:03007B00025AAF77
|
||||
:0300FA0002007E83
|
||||
:03007E0002050672
|
||||
:2000FD00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBA6
|
||||
:20011D00004380040022AF8290F090E4F090F091F08F061FEE60767E0090F95AE0FDBD024E
|
||||
:20013D000BEE90624393FDBDC800405990F95AE0FDBD010BEE90624393FDBDC8005046EE81
|
||||
:20015D002443FCE43462FD8C828D83E493F582C007C006C005C004121C10E582D004D00538
|
||||
:20017D00D006D007601F90F090E0FB90F0BFE0FAC3EB9A501090F090EAF08C828D83E4930B
|
||||
:20019D00FC90F091F00EBE0C005086808C90F091E0FFE06013BFC800400890F95A7402F030
|
||||
:2001BD00800690F95A7401F090F091E0F5822290F0EDE0FEA3E0FFC3742C9E74019F40099F
|
||||
:2001DD0090F0E3E0700330015E300A0920020690F0C6E0700930031E90F0C7E0601890FC37
|
||||
:2001FD0063E0FFBFFF02800B7824E4F28F821227338003123C81121DDCAD82AE83AFF0907A
|
||||
:20021D00F092EDF0EEA3F0EFA3F0ED4E602D90F0EDE4F0A3F010010090F0E3E06002D2013A
|
||||
:20023D0090F0E3E4F08014121EC7AD82AE83AFF090F092EDF0EEA3F0EFA3F012187090F0D4
|
||||
:20025D0092E0FDA3E0FEA3E0FFED4E700990F0E1E4F0A3F08059740F2DFAE43EFB8F048AD6
|
||||
:20027D00828B838CF0126223FAA3126223FB90F0E1EAF0EBA3F0740D2DFAE43EFB8F048AF4
|
||||
:20029D00828B838CF012622360168D828E838FF0123108E582701890F0E1E4F0A3F0800FF8
|
||||
:2002BD007454C0E07462C0E01259A9158115811218BBAE82AF8390F0EDE0FCA3E0FD90F073
|
||||
:2002DD00EDEE2CF0EF3DA3F0BE580CBF020990F0C5E06003C2002290FA5BE0600E90FA5BDB
|
||||
:2002FD00E4F0900064E4F5F00217BB90F0E1E0FEA3E0FF4E603BEF30E71F8E048F0553052F
|
||||
:20031D007F7877ECF2ED08F2E408F208F29003E8E4F5F0125ED50217BB7877EEF2EF08F2A0
|
||||
:20033D00E408F208F290EA60E4F5F0125ED50217BB1218BBAE82AF837877EEF2EF08F2E429
|
||||
:20035D0008F208F29003E8E4F5F0125ED50217BB90F0CEE0FF600D8F82121C10E58290F956
|
||||
:20037D0059F0800C758202120123E58290F959F090F959E0700920030690F0C7E0701430E4
|
||||
:20039D000A0920020690F0C6E0700890F0E4E0FFBF233690FC63E0FFBFFF02801A758202EB
|
||||
:2003BD00123E21E582702290FC63E0FF7824E4F28F82122733801290F0E4E0FFBF23004002
|
||||
:2003DD0005123DC28003123D7F90F959E0604890F0E4E4F090F0CEE0700F758204121776B0
|
||||
:2003FD001214C77582041217AF90F0E374FDF09000281217531218BBAE82AF837877EEF212
|
||||
:20041D00EF08F2E408F208F29003E8E4F5F0125ED51217BBD20022758201121836AC82AD6A
|
||||
:20043D0083AEF0FF7877ECF2ED08F2EE08F2EF08F29003E8E4F5F0125ED50217BBE582FF37
|
||||
:20045D0024FA50030204EEEF2F2F90046B730248E302047D0204940204C40204EE0204D07D
|
||||
:20047D00745FC0E07462C0E01259A915811581C20090F959E4F02290F959E0FE746CC0E05C
|
||||
:20049D007462C0E01259A915811581758204C0061217761213811214C77582041217AFD0F3
|
||||
:2004BD000690F959EEF0221239A0900000E4F5F00217BB747CC0E07462C0E01259A915816F
|
||||
:2004DD00158175820412177612271F7582040217AF7E00C007C006748CC0E07462C0E01281
|
||||
:2004FD0059A9E58124FCF5812275820112177675820F124C2590FAB2E0FEA3E0FF7423C0AC
|
||||
:20051D00E08E828F8312482D15817404C0E0124376AC82AD83158190F0E5ECF0EDA3F09077
|
||||
:20053D00624FE493C0E0740193C0E0906251E493C0E0740193C0E0740293C0E0749EC0E0D1
|
||||
:20055D007462C0E01259A9E58124F9F5811252A212195412190C90F0E374FCF0AEBE5306B7
|
||||
:20057D00187F00BE1009BF000690F0E374FEF0301B0C123E1B900000E4F5F01217BB7436BD
|
||||
:20059D00C0E074FCC0E0E4C0E074CDC0E07462C0E01259A9E58124FBF5811236D590019066
|
||||
:2005BD00E4F5F01217BB7582041217761213F31236BC90F0C2E0601174D5C0E07462C0E0C9
|
||||
:2005DD001259A915811581801B74E6C0E07462C0E01259A915811581123A4F902710E4F538
|
||||
:2005FD00F01217BB90F959E0FFE0601F8F82121C10E582702574F3C0E07462C0E01259A90E
|
||||
:20061D001581158190F959E4F0800F7411C0E07463C0E01259A91581158190F959E070033B
|
||||
:20063D0012036D90F959E06007123C81D2008005123D7FC2007582041217761214C7300085
|
||||
:20065D00067E287F0080047E587F028E828F8312175330000A7C887D137E007F0080087C0A
|
||||
:1E067D00C07DD47E017F008C828D838EF0EF1217BB3000051201CC80F812036D80F360
|
||||
:20624300C864C965CA66CB67CC68CD6907002363804E6F207570646174650A00434D445F6B
|
||||
:20626300444F5F5343414E0A0052657365742073657474696E67730A0045726173696E6793
|
||||
:2062830020696D616765730A00436D6420307825782069676E6F7265640A000A2573204FBF
|
||||
:2062A30045504C2076253034782C20636F6D70696C6564204A756C203139203230323420ED
|
||||
:2062C30031353A33363A32380A004D41432025730A00446F696E67206661737420626F6F52
|
||||
:2062E300740A004E6F726D616C20626F6F740A004E6F20415020666F756E64206F6E20739C
|
||||
:2063030061766564206368616E6E656C0A004E6F207361766564206368616E6E656C0A00E4
|
||||
:096323004368726F6D61323900AC
|
||||
:0175F1000198
|
||||
:20069B00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB02
|
||||
:2006BB00004380040022AC82AD83AEF0FF00C2A0007582031242E38E821242E38D821242FE
|
||||
:2006DB00E38C820242E3C007C006C005C004C003C002C001C000AC82AD83AEF0FFE5812446
|
||||
:2006FB00F5F8860208860300C2A0007582031242E38E821242E38D821242E38C821242E374
|
||||
:20071B008A068B07E58124F3F886040886058C028D031CBCFF011DEA4B6015758200124202
|
||||
:20073B00E3AB828E828F83EBF0A3AE82AF8380DE00D2A000D000D001D002D003D004D005CD
|
||||
:20075B00D006D00722AF8200C2A0008F821242E300D2A0002200C2A0007582051242E37536
|
||||
:20077B0082001242E3E58220E0F500D2A00022AC82AD83AEF0FF7803E2FA08E2FBC007C0F7
|
||||
:20079B0006C005C004C003C002120770758206120760D002D003D004D005D006D00700C26E
|
||||
:2007BB00A0007582021242E38E821242E38D821242E38C821242E38A068B077805E2FC08F7
|
||||
:2007DB00E2FD8C028D031CBCFF011DEA4B60128E828F83E0FBA3AE82AF838B821242E3809F
|
||||
:2007FB00E100D2A000221207707582B9120760C20C227582AB12076075F034D5F0FDD20C73
|
||||
:20081B0022C007C006C005C004C003C002C001C000C082C083C0F0C0E005810581E5812414
|
||||
:20083B00EFF88605088604E58124EDF8E608467003020915C005C004E58124F9F8860208CF
|
||||
:20085B007B00E58124FDF8E4C39AF674019B08F6E58124FDF8E58124EBF9C3E79609E70819
|
||||
:20087B0096D004D005500EE58124EDF8A98119E6F708E609F77803EDF2EC08F2A881187949
|
||||
:20089B0005E6F308E609F3E58124FBF886820886830886F008E6C007C006C005C004C0039A
|
||||
:2008BB00C002C001C000C02512078AD025D000D001D002D003D004D005D006D007A8811880
|
||||
:2008DB008602088603E4FEFFE58124FBF8EA26F6EB0836F6EE0836F6EF0836F6A88118E6F5
|
||||
:2008FB002DFD08E63CFCE58124EDF8A98119E6C397F608E60997F6020842E58124FAF581DB
|
||||
:20091B00D000D001D002D003D004D005D006D00722C007C006C005C004C003C002C001C0E2
|
||||
:20093B0000C082C083C0F0C0E0E58124FDF88602088603EA7005EB540F6006758200020A19
|
||||
:20095B002FE58124F1F8E608467003020A2C758206C007C006C005C004C003C002C001C0E2
|
||||
:20097B0000C025120760D025D000D001D002D003D004D005D006D00700C2A000E58124F190
|
||||
:20099B00F886020886037582201242E3E58124FDF8080886821242E3E58124FDF808868280
|
||||
:2009BB001242E3E58124FDF886821242E300D2A000C007C006C005C004C003C002C001C099
|
||||
:2009DB0000C025120770D025D000D001D002D003D004D005D006D0077401C0E09010001236
|
||||
:2009FB004376AC82AD83AEF0FF1581E58124FDF8EC26F6ED0836F6EE0836F6EF0836F61A8B
|
||||
:200A1B00BAFF011BE58124F1F8A60208A60302095C758201E58124FCF581D000D001D0024C
|
||||
:0B0A3B00D003D004D005D006D0072265
|
||||
:200A4600E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB53
|
||||
:200A6600004380040022C007C006C005C004AF82AE83ADF0FC90F0BBEFF0EEA3F0EDA3F05B
|
||||
:200A8600ECA3F0C202C203D208758204C007C006C005C004C003C002C001C000C025121749
|
||||
:200AA60076D025D000D001D002D003D004D005D006D00790F0BBE0FCA3E0FDA3E0FEA3E08E
|
||||
:200AC600FF7416C0E0E4C0E074F3C0E074F0C0E08C828D838EF0EF1206E1E58124FCF581D8
|
||||
:200AE60090F0BBE0FCA3E0FDA3E0FEA3E0FF90F0BB74162CF0E43DA3F0E43EA3F0E43FA346
|
||||
:200B0600F090F103E0FFBF2004C207806A90F103E0FFBF2104D207805E90F103E0FF7E0007
|
||||
:200B2600C007C0067414C0E07469C0E01259A9E58124FCF58190FA6E7416F0E4A3F090F004
|
||||
:200B4600F375F000C007C006C005C004C003C002C001C000C025121AC3D025758204C02572
|
||||
:200B66001217AFD025D000D001D002D003D004D005D006D0078051C220C007C006C005C041
|
||||
:200B860004C003C002C001C000C025125C09D025C025120BD7D025D220C025125C09D025E3
|
||||
:200BA600C025120BD7D025758204C0251217AFD025C025125C4DD025D000D001D002D003D9
|
||||
:200BC600D004D005D006D007D004D005D006D007227F807E0090F0ABE4F0A3F090F0A5F01D
|
||||
:200BE600A3F05390FD007D00200803020C6A30201D20071A74A0C0E07404C0E0E4C0E090CE
|
||||
:200C0600F0F312451F158115811581020CBAC00590F0BBE0FAA3E0FBA3E0FCA3E0FD74A080
|
||||
:200C2600C0E07404C0E074F3C0E074F0C0E08A828B838CF0ED1206E1E58124FCF58190F0F3
|
||||
:200C4600BBE0FAA3E0FBA3E0FCA3E0FD90F0BB74A02AF074043BA3F0E43CA3F0E43DA3F066
|
||||
:200C6600D005805074A0C0E07404C0E0E4C0E090F0F312451F1581158115817B4A7C00C0CD
|
||||
:200C860007C006C005C004C0037807E2F58208E2F583120081D003D004D005D006D00790AF
|
||||
:200CA600F0A5E02401F0A3E03400F01BBBFF011CEB4C70CB7B007C00EF60503020238E0200
|
||||
:200CC600EA2AFEEB24F3F582EC34F0F583E0FAEF5A7003430601EF30E02B8E82125C3F80B4
|
||||
:200CE600248E02EA2A25E0FEEB24F3F582EC34F0F583E0FAEF5A6003430603EF5411600597
|
||||
:200D06008E82125C3FEFC313FF80AD7F800BBB00010CC3EB94A0EC9404409D90F0ABE0FB04
|
||||
:200D2600A3E0FC744A2BFBE43CFC90F0ABEBF0ECA3F00DBD04005003020BEEE58620E0FB27
|
||||
:200D4600004390020022AE82AF83C202C203C208D207C2207807EEF2EF08F2125C09120B4A
|
||||
:200D6600D7D220125C09120BD7025C4DC007C006C005C004C003C002C001C000AD82AE8312
|
||||
:200D8600AFF0A204202001B3505090F09FE0F508A3E0F50974012DFAE43EFB8F048A828B14
|
||||
:200DA600838CF0126223FA780CF2E408F2850882850983C007C006C005C004C003C002C0CE
|
||||
:200DC60001C000121003E582D000D001D002D003D004D005D006D0076003020FA98D828E6A
|
||||
:200DE600838FF07809126223F290F0A1E0F508A3E0F5097809E2F50A750B00780EE50AF219
|
||||
:200E0600E50B08F2850882850983C007C006C005C004C003C002C001C00012107AD000D06A
|
||||
:200E260001D002D003D00490F0ADE0F508A3E0F50990F0B1E0FBA3E0FCEBC39508F582EC6E
|
||||
:200E46009509F5837875E50AF2E50B08F2C002C001C000125EB5AB82AC83D000D001D00287
|
||||
:200E6600D005D006D007ECC423CBC423541F6BCB541FCB6BCBFC90F0B7EBF0ECA3F0740245
|
||||
:200E86002BFBE43CFCEB2DFDEC3EFE90F0A7E0FBA3E0FCEB5407700A7809E2540770030259
|
||||
:200EA6000F5D5303078BF005F07B80E4FC3392D28008A2D2EC13FCEB13FBD5F0F5780AEB6A
|
||||
:200EC600F2780B7480F28D828E838FF0126223FA74012DF50CE43EF50D8F0E7809E2F50ABB
|
||||
:200EE600AC0A150AEC7003020FA9780BE25A6025C00290F0B5E0FAA3E0FCEA24F3FAEC344F
|
||||
:200F0600F0FC8A828C83E0FB780AE242038A828C83EBF0D002780BE2C313F2780BE270195D
|
||||
:200F2600850C82850D83850EF0126223FAA385820C85830D780B7480F2780AE2C313F27897
|
||||
:200F46000AE2709C780A7480F290F0B5E02401F0A3E03400F080897809E2604790F0B5E032
|
||||
:200F6600FBA3E0FCEB24F3FBEC34F0FC8B828C83E0F50C8D828E838FF0126223FAA3AD82E9
|
||||
:200F8600AE83E50C42028B828C83EAF090F0B5E02401F0A3E03400F07809E2FC780924F822
|
||||
:200FA600F280B4D000D001D002D003D004D005D006D0072290F0A7E0FEA3E0C423CEC42323
|
||||
:200FC600541F6ECE541FCE6ECE30E40244E0FF90F0ABE0FCA3E0FD90F0B1E0FAA3E0FBEAAC
|
||||
:200FE600C39CFCEB9DC454F0CCC4CC6CCC54F0CC6CFD90F0B5EC2EF0ED3FA3F022AE82AFF4
|
||||
:201006008390F095EEF0EFA3F090F0AFEEF0EFA3F07427C39EFE74019FFF90F0A9EEF0EF40
|
||||
:20102600A3F090F0A5E0FCA3E0FD90F0B1ECF0EDA3F0C3EE9CEF64808DF063F08095F040D4
|
||||
:201046002F780CE22CFC08E23DFDC3EE9CEF9D501F780CD3E29EF4B3FEB308E29FF4FF0EA8
|
||||
:20106600BE00010F90F0ADEEF0EFA3F07582002275820122AE82AF8390F0A7EEF0EFA3F0F3
|
||||
:20108600780E90F097E22EF008E23FA3F0120FBA75820022C007C006C005C004C003C00262
|
||||
:2010A600C001C000AC82AD83AEF0FF058105810581BF2000502C8F82C007C006C005C0049A
|
||||
:2010C600C003C002C001C000C02512422ED025D000D001D002D003D004D005D006D007020A
|
||||
:2010E60013447E00EF24E0FFEE34FFFEEF2FFFEE33FEEF242CF582EE3463F583E493FEA3FD
|
||||
:20110600E493FF90F0B7EEF0EFA3F0EFC4540FFE90F0B3F0300507EE2EFE90F0B3F090F08C
|
||||
:2011260099E0FEA3E0FF90F0B9EEF0EFA3F090F0B3E0FDFB3395E0FC0BBB00010CEB2EFB81
|
||||
:20114600EC3FFC90F099EBF0ECA3F0A204202001B3504190F0B9E0FEA3E0FF780CEDF2EDDB
|
||||
:201166003395E008F28E828F83C007C006C005C004C003C002C001C000C025121003E58218
|
||||
:20118600D025D000D001D002D003D004D005D006D007600302134490F09BE0FEA3E0FF90F1
|
||||
:2011A600F0B4E0FD780EF2ED3395E008F28E828F83C007C006C005C004C003C002C001C063
|
||||
:2011C60000C02512107AD025D000D001D002D003D004D005D006D00790F0B7E0FEA3E0FF60
|
||||
:2011E60053070F90F0B7EEF0EFA3F0A8811818760008768090F0A7E0FCA3E05304078CF0BC
|
||||
:2012060005F07C80E4FD3392D28008A2D2ED13FDEC13FCD5F0F5A881A60490F0B3E0FD903E
|
||||
:20122600F0ADE0FAA3E0FB90F0A5E0FCA3E0FFECC39AFAEF9BFBED3395E0FFEDC39AFAEFA1
|
||||
:201246009BFB1ABAFF011B90F0B9EAF0EBA3F030050FEBC313CA13CAFB90F0B9EAF0EBA32A
|
||||
:20126600F090F0B9E0FEA3E0FF90F0B7E0FCA3E0FD90F0B7EE2CF0EF3DA3F090F0B7E0FE37
|
||||
:20128600A3E0FFEE2EFEEF33FFEE24ECF582EF3463F583E493FEA3E493FF90F0B9E4F0A3DA
|
||||
:2012A600F090F0B9E0FCA3E0FD90F0B4E0FB3395E0FAC3EC9BED9A4003021344A88118182C
|
||||
:2012C600E65EFC08E65FFD4C602190F0B5E0FCA3E0FDEC24F3FCED34F0FD8C828D83E0FB1A
|
||||
:2012E600A881E642038C828D83EBF030051A90F0B9E0FCA3E0FDEC30E01AA88118E618C39F
|
||||
:2013060013C613C608F6800CA88118E618C313C613C608F6A881E6C313F6A881E6701090DF
|
||||
:20132600F0B5E02401F0A3E03400F0A881768090F0B9E02401F0A3E03400F00212A7158121
|
||||
:1513460015811581D000D001D002D003D004D005D006D00722A8
|
||||
:20632C000070071008500D9016601CA026A03010316037603D7044904D204F60552057808C
|
||||
:20634C005F7066706D6073507880805085708C7093709A70A120A320A570AC80B470BB7022
|
||||
:20636C00C2A0CCA0D670DD80E570EC70F370FA8002710971105115811D7124812C713381AA
|
||||
:20638C003B7142814A7151715891617168A172A17CA186A1908198519D81A551AA81B2A15E
|
||||
:2063AC00BC21BE71C571CC71D371DA71E181E971F071F741FB51007207420B9214721B72B7
|
||||
:2063CC0022722972306236623C724362499252A25C8264A26E8276627C127D6283A28D72F9
|
||||
:2063EC000000000000000000000000000000D87F0078000000000000007880009804E00549
|
||||
:20640C00801E9864E005801E80648004183808640842FCFF8841F040083810442044C044F5
|
||||
:20642C0000397002880C881088207040E0001001083A08468845C84C38381800680080014E
|
||||
:20644C000078E00718180C300420024002400240024004200C301818E00700100018000F8B
|
||||
:20646C000072000F001800104000400040004000F807400040004000400019001E008000B1
|
||||
:20648C00800080008000800080001800180002000C003000C0000003000C00300040C00FF4
|
||||
:2064AC0030300840084008403030C00F082008200820F87F080008000800186028404840FA
|
||||
:2064CC0088400843083C0840084208420842F03DC0004003400440184020F87F4000400010
|
||||
:2064EC00087C084408441042E041E00F10320844084408441042E00100401840E0400043BE
|
||||
:20650C00004C00500060F038084508420842084590456038001E08218840884088403021C0
|
||||
:20652C00C01F1806180619061E06C000C0002001200110021002080420012001200120017B
|
||||
:20654C00200120012001200108041002100220012001C000C00000700040D840004100426E
|
||||
:20656C0000640038C00F30181820C84728486850D851E03F2000200008007000C001400EDE
|
||||
:20658C004018400C4003C00030000800F81F08110811081108118812700CC003300C100868
|
||||
:2065AC0008100810081008100818F81F08100810081008101008E007F81F881088108810FA
|
||||
:2065CC00881088100810F81F801080108010801080100010C003300C100808100810881091
|
||||
:2065EC008810F818F81F80008000800080008000F81F081008100810F81F08100810081092
|
||||
:20660C000800081008100810F01FF81F0001800140022004200810100800F81F0800080099
|
||||
:20662C000800080008000800F81F001C8007E00060008003001CF81FF81F000800068001D8
|
||||
:20664C0060001000F81FE007100808100810081008101008E007F81F8010801080108010F2
|
||||
:20666C000011000EE00710080810081008100C101208E207F81F80108010C0102011100E33
|
||||
:20668C000800180E0812081108118810901070180010001000100010F81F0010001000102D
|
||||
:2066AC000010E01F18000800080008001000E01F0010000C8003600018001800E00000036E
|
||||
:2066CC00000C00100018C0073800F0000007800370003800C00700180810100820044002E4
|
||||
:2066EC008001800140022004100808100010000800060001F80000010002000400080010C0
|
||||
:20670C0018102810481088100811081208140818FE7F024002400240024000400030000CAD
|
||||
:20672C000003C00030000C0002000240024002400240FE7F2000C0000007001C0070000E46
|
||||
:20674C00C001200004000400040004000400040004000400040004000080004030004804E8
|
||||
:20676C00880488049004F8030800F87F10020804080408041006E001E001100208040804AF
|
||||
:20678C00080408040804E00118020804080408041002F87FE001900288048804880488047E
|
||||
:2067AC00880300040004F83F00240044004400440044E00119020904090409041202FC0795
|
||||
:2067CC00F87F00010002000400040004F803000400040064F8670100010401040164FE678C
|
||||
:2067EC00F87F8000C0002001200210020804004000400040F87FF807000200040004F8033A
|
||||
:20680C00000200040004F803F80700030002000400040004F803E001100208040804080445
|
||||
:20682C001002E001FF0710020804080408041006E001E00118020804080408041002FF07EF
|
||||
:20684C00F8070001000200040004000718038804880448044804300400040004F01F0804F9
|
||||
:20686C00080408040804F0070800080008001000F807000480036000180008003000C000D3
|
||||
:20688C00000300040006E001180070008003800170001800E0010006080410022001C00004
|
||||
:2068AC00C00020011002080401040103C10062001C0018006000800000030004080418045E
|
||||
:2068CC00280448048804080508060804800080007C3F024002400240FE7F024002400240BD
|
||||
:2068EC007C3F80008000C000000100010001800080004000400040008001F80108030804BD
|
||||
:20690C00080808040803F80164617461547970652030782578206E6F7420737570706F7270
|
||||
:05692C007465640A001F
|
||||
:20135B00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB35
|
||||
:20137B0000438004002290F0C17401F090F0C2E4F090F0C3F090F0C4F090F0C5F090F0C6CB
|
||||
:20139B0004F090F0C7F090F0C9E4F090F0C8F090F0CC7428F0E4A3F090F0CEF090F0CA7467
|
||||
:2013BB0028F0740AA3F090F959E4F090F95AF022AD82AE83126223FCBC011C7BC17CF08B3F
|
||||
:2013DB00828C83740EC0E0C005C0061245B71581158115810214C7227480C0E0E4C0E07459
|
||||
:2013FB00A2C0E074FDC0E0906000E4F5F01206E1E58124FCF581740EC0E07414C0E074FE15
|
||||
:20141B00C0E090F0C11245B715811581158190FDA2E0FCA3E0FDA3E0FEA3E0FFBCA513BD41
|
||||
:20143B005A10BEBA0DBFAB0A90FDA6E0FFBF0102803590FDA2E0FCA3E0FDA3E0FEA3E0FF17
|
||||
:20145B0090FDA6E0FB7A00C004C005C006C007C003C0027431C0E07469C0E01259A9E58112
|
||||
:20147B0024F8F58102138190FDA7E090F959F090FDA8E090F95AF0745FC0E07469C0E01259
|
||||
:20149B0059A91581158112161990FDA2E4F004C0E0E4C0E074A2C0E074FDC0E0906000E4FC
|
||||
:2014BB00F5F012081CE58124FCF581227480C0E0E4C0E074A2C0E074FDC0E0906000E4F530
|
||||
:2014DB00F01206E1E58124FCF58190FDA2E0FCA3E0FDA3E0FEA3E0FFBCA53EBD5A3BBEBA15
|
||||
:2014FB0038BFAB35788574C1F274F008F2E408F27888740EF2E408F290FE1475F0001260CF
|
||||
:20151B00A4E5828583F045F0700F90FDA7E0FF90F959E0FEEFB506012290FE21E0FF90F04B
|
||||
:20153B00CEE0FEEFB50602803EEE603BBE6400502390FE21E0FF7D00C007C0057471C0E040
|
||||
:20155B007469C0E01259A9E58124FCF58190F0CEE4F08013BEC800400890F95A7402F08097
|
||||
:20157B000690F95A7401F07480C0E0E4C0E0C0E090FDA212451F158115811581740EC0E0C1
|
||||
:20159B0074C1C0E074F0C0E090FE141245B715811581158190FDA274A5F0F4A3F074BAA355
|
||||
:2015BB00F0C4A3F090FDA67401F090F959E090FDA7F090F95AE090FDA8F07401C0E0E4C0AA
|
||||
:2015DB00E0906000E4F5F012092C158115817480C0E0E4C0E074A2C0E074FDC0E090600015
|
||||
:2015FB00E4F5F012081CE58124FCF581748AC0E07469C0E01259A91581158102161990F0C9
|
||||
:20161B00C5E0FF7E00C007C006749BC0E07469C0E01259A9E58124FCF58190F0CEE0FF7E19
|
||||
:20163B0000C007C00674B4C0E07469C0E01259A9E58124FCF58190F0CAE0FEA3E0FFC0063D
|
||||
:20165B00C00774C7C0E07469C0E01259A9E58124FCF58190F0C2E0FF7E00C007C00674DBC5
|
||||
:20167B00C0E07469C0E01259A9E58124FCF58190F959E0FF7E00C007C00674F0C0E0746975
|
||||
:0C169B00C0E01259A9E58124FCF5812271
|
||||
:206931004C6F616465642064656661756C74732073657474696E6773566572203078257862
|
||||
:20695100204D61676963203078256C780A004C6F616465642073657474696E67733A0A002C
|
||||
:2069710049676E6F7265642066697865644368616E6E656C2025640A00536176656420731C
|
||||
:20699100657474696E67733A0A0020205363616E2041667465722054696D656F7574202581
|
||||
:2069B100640A00202066697865644368616E6E656C2025640A0020206261744C6F77566F2E
|
||||
:2069D1006C746167652025640A002020656E61626C6546617374426F6F742025640A00204A
|
||||
:0D69F100204C6173742063682025640A0047
|
||||
:2016A700E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBE6
|
||||
:2016C70000438004002275F10175805875FDDD75F33875904075FE6E75F4E875A00175FF76
|
||||
:2016E7000122C00775E40075FC0075F70075FE0290F953E0FF54F06002800DD291758F00F9
|
||||
:2017070075F60075FD008012758F8175F62F75FD8175FE2F53807E5390D075F30075F400CA
|
||||
:0617270075F500D0072259
|
||||
:20172D00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB5F
|
||||
:20174D00004380040022AE82AF837D00BD08005017ED75F002A424CFF58274F035F0F58325
|
||||
:20176D00EEF0EFA3F00D80E422E582FF30E0251255BAC007124950D2AF1216CD1242DF1280
|
||||
:20178D004DF6D00775820A124E3590F959E0FEF582124D81EF30E20912430C200C030208D1
|
||||
:2017AD000D22E58230E206300C0302080122AF82AE83ADF0FC90F0EFEFF0EEA3F0EDA3F0B8
|
||||
:2017CD00ECA3F090F0EFE0FCA3E0FDA3E0FEA3E0FFC004C005C006C00774FEC0E07469C0EA
|
||||
:2017ED00E01259A9E58124FAF581300C16758204C007C006C005C0041217AFD004D005D03A
|
||||
:20180D0006D007C007C006C005C004125BF6D004D005D006D0071216E98C828D838EF0EF73
|
||||
:20182D001249D8758201021776E582FF601090F0E4E0FFBFFF00500690F0E4EF04F090F0ED
|
||||
:20184D00E4E0FFBF18005007900E10E4F5F022BF24005007901C20E4F5F02290518075F03A
|
||||
:20186D0001E42290F0E0E07875F2E408F2900230125EB57862740EF2E408F2125CDEAE82C8
|
||||
:20188D00AF8374282EFEE43FFF90F0DFE054077D0025E0FCED33FDEC24CFF582ED34F0F58E
|
||||
:2018AD0083EEF0EFA3F090F0DFE02401F0227E007F007D00BD0800501DED75F002A424CF2B
|
||||
:2018CD00F58274F035F0F583E0FBA3E0FCEB2EFEEC3FFF0D80DEEFC423CEC423541F6ECE43
|
||||
:2018ED00541FCE6ECEFF90F0CCE0FCA3E0FDC3EE9CEF9D50058C828D83228E828F83229075
|
||||
:20190D00FAB4E0FF3395E0FEC007C0067413C0E0746AC0E01259A9E58124FCF58190F0BF06
|
||||
:20192D00E0FF7E0090F0C0E0FD3395E0FCC007C006C005C004741EC0E0746AC0E01259A9A2
|
||||
:20194D00E58124FAF5812275820E124C25124C5175820F124C2590FAB2E0FEA3E0FF74236B
|
||||
:20196D00C0E08E828F8312482D15817404C0E0124376AC82AD83158190F0EBECF0EDA3F0DD
|
||||
:20198D00C20A90F0CAE0FEA3E0FFC3EC9EED9F5004D20A803A90F0E7E0FCA3E0FD4C60137F
|
||||
:2019AD00C3EC9EED9F500C90F0EBECF0EDA3F0D20A801C90F0E9E0FCA3E0FD4C6011C3EC75
|
||||
:2019CD009EED9F500A90F0EBECF0EDA3F0D20A90F0E9E0C0E0A3E0C0E090F0E7E0C0E0A33D
|
||||
:2019ED00E0C0E090F0EBE0C0E0A3E0C0E090F0E5E0C0E0A3E0C0E0742FC0E0746AC0E01271
|
||||
:091A0D0059A9E58124F6F58122B6
|
||||
:2069FE00536C656570696E6720666F7220256C64206D730A0054656D7020256420430A0010
|
||||
:206A1E00525353492025642C204C51492025640A00426174745620426F6F742025642C20FF
|
||||
:1A6A3E006E6F772025642C2054782025642C207570646174652025640A00FE
|
||||
:0500DC00781074FFF232
|
||||
:201A1600E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB73
|
||||
:201A3600004380040022121A92E582600790F96CE0F58222121A5CE582600790F970E0F589
|
||||
:201A560082227582002290F95BE05407FFBF012890F95CE003035403FFBF031C90F95CE0E9
|
||||
:201A760023235403FFBF031090F95BE023235401FFBF0104758201227582002290F95BE0C9
|
||||
:201A96005407FFBF012390F95CE003035403FFBF021790F95CE023235403FFBF030B90F943
|
||||
:201AB6005BE020E6047582012275820022AFF0AE83E58290FA70F0EEA3F0EFA3F090FA707A
|
||||
:201AD600E0FDA3E0FEA3E0FF90FA6EE0FBA3E0FC79007A00C3E99BEA9C5052E94A6016E9CA
|
||||
:201AF600540F6002800F7458C0E0746AC0E01259A915811581C003C004E92DF8EA3EFB8F0B
|
||||
:201B16000488828B838CF0126223F87C00C000C004745AC0E0746AC0E01259A9E58124FC02
|
||||
:201B3600F58109B900010AD004D00380A77458C0E0746AC0E01259A91581158122AFF0AEE5
|
||||
:201B560083E5827812F2EE08F2EF08F27815E4F27B017811C3E2F5F0EB95F050227812E2F8
|
||||
:201B7600FA08E2FC08E2FFEB2AFAE43CFC8A828C838FF0126223FA7815E22AF20B80D378CF
|
||||
:201B960012E2FD08E2FE08E2FF8D828E838FF0126223FD7815E2B50503D38001C3E433F5EB
|
||||
:201BB6008222AFF0AE83E5827817F2EE08F2EF08F2781AE4F27B017816C3E2F5F0EB95F076
|
||||
:201BD60050227817E2FA08E2FC08E2FFEB2AFAE43CFC8A828C838FF0126223FA781AE22A4F
|
||||
:201BF600F20B80D37817E2FD08E2FE08E2FF8D828E838FF0781AE2025E9AE5812404F5812F
|
||||
:201C1600AF82C218C00712501FD0078F82124D81C0071250D4D21812501FD0077E01EE24C3
|
||||
:201C3600FC5003021D3A90F9DB7414F0C007C00612371C90F9ED74EDF090F9DB124F1BD0A1
|
||||
:201C560006D007124908AA82AB83ACF0FD90FA7374A62AF0740E3BA3F0E43CA3F0E43DA343
|
||||
:201C7600F0C006124908AA82AB83ACF0FD90FA73E58124FCF8E0F6A3E008F6A3E008F6A34C
|
||||
:201C9600E008F6E58124FCF8C3EA96EB0896EC0896ED0896D0064003021D36C007C00612E4
|
||||
:201CB6005031AD82D006D007C374818DF063F08095F050AD90F971E0FDB507A5C007C00662
|
||||
:201CD600121A3CAD82D006D007BDEE95C007C006121A5CE582D006D00760867408C0E074CB
|
||||
:201CF60068C0E074F9C0E090F9461245B715811581158190F95EE0FCA3E0FD90F94EECF024
|
||||
:201D1600EDA3F08F047D00C004C0057460C0E0746AC0E01259A9E58124FCF5818F828020E1
|
||||
:201D36000E021C348F057E00C005C006746AC0E0746AC0E01259A9E58124FCF5817582008D
|
||||
:201D5600E58124FCF5812290F9DB742AF012371C90F9ED74E5F090F9F47482F090F0E3E093
|
||||
:201D760090F9F5F090F0C0E090F9F0F090F0BFE090F9EFF090FAB4E090F9F1F090F0EBE0FC
|
||||
:201D9600FEA3E0FF90F9F2EEF0EFA3F090F9F6E4F090624F93FE740193FF90F9F7EEF0EF59
|
||||
:201DB600A3F090F959E090F9F9F090F0C9E090F9FAF078167415F290F9EE75F000121BB8E0
|
||||
:201DD60090F9DB024F1BD21812501F12195412190C7F00781BE4F2781BE2B40E0040030298
|
||||
:201DF6001EBAC007121D5DD007124908AA82AB83ACF0FD74882AF52674133BF527E43CF541
|
||||
:201E160028E43DF529C007124908AC82AD83AEF0FFC3EC9526ED9527EE9528EF9529D007DE
|
||||
:201E36004003021EADC007125031AE82D007C374818EF063F08095F050CBC007121A3CAE95
|
||||
:201E560082D007BEE6BF78117411F290F97175F000C007121B53E582D00760A97408C0E0A7
|
||||
:201E76007468C0E074F9C0E090F9461245B715811581158190F95E75F000126223FDA3128F
|
||||
:201E96006223FE90F94EEDF0EEA3F090F0E0EFF090F97175F00022781BE22401F2781BE2B3
|
||||
:201EB600FF021DED90F0E0740EF090000075F00022D21812501F7F00781CE4F2781CE2B49A
|
||||
:201ED6000E004003021FAE90F9DB7414F090F9ED74E3F0C00712371C90F9DB124F1BD00750
|
||||
:201EF600124908AA82AB83ACF0FD74882AF52A74133BF52BE43CF52CE43DF52DC0071249A9
|
||||
:201F160008AC82AD83AEF0FFC3EC952AED952BEE952CEF952DD0075072C007125031AE820A
|
||||
:201F3600D007C374818EF063F08095F050CEC007121A3CAE82D007BEE6C278117411F290DC
|
||||
:201F5600F97175F000C007121B53E582D00760AC7408C0E07468C0E074F9C0E090F9461285
|
||||
:201F760045B715811581158190F95E75F000126223FDA3126223FE90F94EEDF0EEA3F090B0
|
||||
:201F9600F0E0EFF090F97175F00022781CE22401F2781CE2FF021ED290F0E0740EF09000A5
|
||||
:201FB6000075F00022AFF0AE83E582781DF2EE08F2EF08F2781DE22402FA08E23400FB083D
|
||||
:201FD600E2FC8A828B838CF0126223F52E852E2F75300090FA5CE0F531AE317F00E52FC315
|
||||
:201FF6009EFEE5309FFF7875EEF2EF08F2900063C004C003C002125EB5AE82AF83D002D061
|
||||
:2020160003D0048E2F8F3090FA77E52FF0E530A3F0781DE22401FD08E23400FE08E2FF8D7F
|
||||
:20203600828E838FF0126223FD90F91FE0FFEDB50702800122E52E24D5500122C3E52E9525
|
||||
:20205600315001227463252FFEE43530FFC374239E74089F500122781DE2FD08E2FE08E289
|
||||
:20207600FF78117466F28D828E838FF0C004C003C002121B53E582D002D003D00470030239
|
||||
:20209600212F781DE22403FD08E23400FE08E28D2F8E3090FA77E0FEA3E0FFEE24F3FEEF6C
|
||||
:2020B60034F0FF8E828F837463C0E0E4C0E0C02FC03012457DE58124FCF5818A828B838C75
|
||||
:2020D600F0126223FA7F00788A7408F2E408F28A828F83C007C00212615EAD82AE83D002F2
|
||||
:2020F600D007ED2421FDEE34F9FE5302078AF005F07401800225E0D5F0FBF4FA8D828E8316
|
||||
:20211600E052028D828E83EAF07477C0E0746AC0E01259A915811581227479C0E0746AC0E5
|
||||
:20213600E01259A91581158122AF82AE83ADF0FC7820EFF2EE08F2ED08F2EC08F290FA5C38
|
||||
:20215600E0FB7A0090F91FE0FF7E00C003C002C007C006748AC0E0746AC0E01259A9E58167
|
||||
:2021760024FAF581D21812501F12490885823285833385F034F53578207977E22414F30803
|
||||
:20219600E2340009F308E2340009F308E2340009F3900019E4F5F0125ED5AA82AB83AEF034
|
||||
:2021B600FFEA2532F532EB3533F533EE3534F534EF3535F535124908AA82AB83AEF0FFC307
|
||||
:2021D600EA9532EB9533EE9534EF9535503C125031AF82C374818FF063F08095F050D612FE
|
||||
:2021F6001A3CAF82BFE8CE90F97175F000121FBB7F00EF2421FDE434F9FE8D828E83E07053
|
||||
:20221600060FBF060040EBBF06AB7458C0E0746AC0E01259A915811581C21812501F02505C
|
||||
:20223600D490F972E4F0A3F090F97175F00022742AC0E0E4C0E0C0E090F9DB12451F1581FF
|
||||
:202256001581158190F9DB742AF090F940E0600890F9F174E4F0800690F9F174E7F07408B0
|
||||
:20227600C0E07450C0E074F9C0E090F9E91245B71581158115817408C0E07446C0E074F912
|
||||
:20229600C0E090F9E11245B715811581158190F9DCE054F84401F090F9DCE054C74440F0B4
|
||||
:2022B60090F9DDE0440C54CF44C0F090F958E0FF04F090F9DEEFF090F94EE0FEA3E0FF909A
|
||||
:2022D600F9DFEEF0EFA3F07DF27EF98D828E837411C0E07416C0E074F9C0E01245B71581AA
|
||||
:2022F600158115817DF27EF97F0078167411F28D828E838FF0121BB890F9DB024F1BE58178
|
||||
:202316002404F581D21812501F1250D47F00BF1E0040030223F7C007122245D00712490833
|
||||
:20233600AB82AC83ADF0FE90FA7974642BF0749F3CA3F0740B3DA3F0E43EA3F0C00712508B
|
||||
:2023560031AE82D007C374818EF063F08095F05051C007121A3CAE82D007BEE8028028BEBC
|
||||
:20237600E9028005BEEC33802978117403F290F97175F000C007121B53E582D00760239068
|
||||
:20239600F97175F0008063122237AC82AD83AEF0805890000075F000805090000075F0007C
|
||||
:2023B6008048C007124908C8E58124FCC8A68208A68308A6F008F690FA79E0FAA3E0FDA30A
|
||||
:2023D600E0FEA3E0FFE58124FCF8C3E69A08E69D08E69E08E69FD00750030223520F02234D
|
||||
:2023F60024122237AD82AE83AFF0E58124FCF58122741BC0E0E4C0E0C0E090F9DB12451FEE
|
||||
:2024160015811581158190F9DB7419F090F9F174EAF07408C0E07450C0E074F9C0E090F925
|
||||
:20243600E91245B71581158115817408C0E07446C0E074F9C0E090F9E11245B715811581A6
|
||||
:20245600158190F9DCE054F84401F090F9DCE054C74440F090F9DDE0440C54CF44C0F090F9
|
||||
:20247600F94EE0FEA3E0FF90F9DFEEF0EFA3F090F958E0FF04F090F9DEEFF090F9DB024F28
|
||||
:202496001BD21812501F7F00BF1000506CC007122407D00712490885823A85833B85F03C23
|
||||
:2024B600F53D12490885823685833785F038F539E536C3953AFAE537953BFCE538953CFDA0
|
||||
:2024D600E539953DFEC3EA94A6EC940EED9400EE94005022C007125031AE82D007C37481F5
|
||||
:2024F6008EF063F08095F050B9C007121A3CAE82D007BEEBAD220F808F22AF82E4FDCD54C6
|
||||
:2025160003A2E0CD13CD13A2E0CD13CD13CDFCEF0303543F4DFDEF030354C0FE7F00740188
|
||||
:202536002DFDE43C8F828E838DF022AD82AE83AFF07C007B00BB040040030225D0C0048B3C
|
||||
:2025560082C007C006C005C003122510A882A983AAF0FCD003D005D006D0077416C0E0E438
|
||||
:20257600C0E074F3C0E074F0C0E0888289838AF0EC1206E1E58124FCF5817464C0E074FC41
|
||||
:20259600C0E090F0FB12488A15811581920ED004300E218D008E018F027408C0E0C000C0DE
|
||||
:2025B6000190F0F312454B158115811581920E50038C82220B8B0402254B7582FF22AF82B5
|
||||
:2025D6005307F87E007D00BD0400400302265CC0068D82C007C005122510AA82AB83ACF072
|
||||
:2025F600FED005D0077416C0E0E4C0E074F3C0E074F0C0E08A828B838CF0EE1206E1E5817F
|
||||
:2026160024FCF5817464C0E074FCC0E090F0FB12488A158115819228D006302823C006909A
|
||||
:20263600F108E0FC5304F87B008F027E00ECB50206EBB506028004D0068005D0068E82229E
|
||||
:202656000D8D060225DD7582FF22122510AC82AD83AEF0FF7416C0E0E4C0E074F3C0E0743D
|
||||
:20267600F0C0E08C828D838EF0EF1206E1E58124FCF58190F108E0F58222AF828F060EEE70
|
||||
:2026960024FB50027E00EEB507038E82228E82C007C006122510AA82AB83ACF0FDD006D0D9
|
||||
:2026B600077416C0E0E4C0E074F3C0E074F0C0E08A828B838CF0ED1206E1E58124FCF581CC
|
||||
:2026D6007464C0E074FCC0E090F0FB12488A15811581922850A890F108E0FD5305F87C00ED
|
||||
:2026F600BD789BBC00988E8222122510AC82AD83AEF0FF7404C0E0E4C0E08C828D838EF0F4
|
||||
:20271600EF12092C15811581227F00BF0400500C8F82C0071226FFD0070F80EF22AF828F3B
|
||||
:20273600057E00C005C0067499C0E0746AC0E01259A9E58124FCF5818F82122510020A6C6A
|
||||
:202756007825E4F208F208F208F27B00BB040040030227F58B82C00312251085823E858303
|
||||
:202776003F85F040F541D0037416C0E0E4C0E074F3C0E074F0C0E0853E82853F838540F04C
|
||||
:20279600E5411206E1E58124FCF5817464C0E074FCC0E090F0FB12488A15811581920F5004
|
||||
:2027B6003AC00390F104E0FAA3E0FBA3E0FEA3E0FF7825C3E29A08E29B08E29E08E29FD0E4
|
||||
:2027D60003501890F1047825E0F2A3E008F2A3E008F2A3E008F290F945EBF00B0227627856
|
||||
:2027F60025E2F58208E2F58308E2F5F008E222AF82AE83D21090F91FE0FD7C007B007A00CE
|
||||
:202816008C44EBC454F0C544C4C5446544C54454F0C5446544F545EDC4540F4544F544ED64
|
||||
:20283600C454F0F543754200300D17782FE542F27470254308F2E4354408F2E4354508F282
|
||||
:2028560080497810E2F582C007C00612251085824685834785F048F549D006D007741625F1
|
||||
:2028760046F546E43547F547E43548F548E43549F549782FE5462542F2E547354308F2E539
|
||||
:2028960048354408F2E549354508F290FA807405F090FA5CE4F090F94004F07829EFF20851
|
||||
:2028B600EEF27406C0E0E4C0E0C0E090F92112451F15811581158190FA80E0FB14F0EB70BE
|
||||
:2028D60003022C481010030229977829E2FA08E2FB8A828B8378627463F2E408F2125CDE3B
|
||||
:2028F600AA8290FA7DEAF07829E2FB08E2FF8B828F8378837463F2E408F2C002126021E553
|
||||
:20291600828583F0D00245F0600690FA7DEA04F090FA7DE024EA500690FA7D7415F090FA80
|
||||
:202936005CE0FB7A0090FA7DE0FFC3EA9F50528B067F00788A7408F2E408F28E828F83C0BC
|
||||
:2029560007C006C003C00212615EAC82AD83D002D003D006D007EC2421FCED34F9FD5306F1
|
||||
:20297600078EF005F07401800225E0D5F0FBFE8C828D83E0FF42068C828D83EEF00B0A8037
|
||||
:20299600A4122314AA82AB83AFF0EA4B7003F582220ABA00010B8A828B838FF0126223FEFC
|
||||
:2029B600A3126223FF4E60428E048F05C3EC9423ED9400501A7877EEF2EF08F2E408F208C3
|
||||
:2029D600F2900019E4F5F0125ED5124969801BEC24F6FCED34FFFD7F007E008C828D838F10
|
||||
:2029F600F0EE1217BBD21812501F900122E4F5F012213F78337401F290FA5CE0FF7E0090C1
|
||||
:202A1600FA7DE0FDC3EE9D505E8F047D00788A7408F2E408F28C828D83C007C006C005C0C2
|
||||
:202A36000412615EAA82AB83D004D005D006D007EA2421F582EB34F9F5835304078CF005E6
|
||||
:202A5600F07C017D008006EC2CFCED33FDD5F0F7E0FB7A005204EA5205EC4D60067833E4E9
|
||||
:202A7600F280040F0E80987833E27003022C0D90FA7DE07875F2E408F2900063125EB5AEF0
|
||||
:202A960082AF83782DEEF2EF08F290FA8174F3F074F0A3F0E4A3F090FA5CE0704B90F0F33A
|
||||
:202AB600E0FCA3E0FD7829ECF208EDF290F0F5E0FCA3E0FD782BECF208EDF290FA7EE4F029
|
||||
:202AD600A3F0782DE2FC08E2FDEC24FCFCED34FFFD782DECF2ED08F290FA81740424F3F0CA
|
||||
:202AF600E434F0A3F0E4A3F07829E2FC08E2FD782DC3E2F5F0EC95F008E2F5F0ED95F05017
|
||||
:202B16000A7829792DE2F308E209F37829E2FC08E2FD782DD3E29CF4B3FCB308E29DF4FD69
|
||||
:202B36007829ECF208EDF275820412177690FA81E0F546A3E0F547A3E0F548AA46AF47787C
|
||||
:202B56002DE2C0E008E2C0E0C002C007782FE2F58208E2F58308E2F5F008E212081CE581E6
|
||||
:202B760024FCF5817582041217AF782DE2FA08E2FD7E007F00782FE22AF208E23DF208E2C9
|
||||
:202B96003EF208E23FF2AD46AE47AF48782DE2F54608E2F547AA46AC47154674FFB546025F
|
||||
:202BB6001547EA4C60368D828E838FF0126223FCA3AD82AE838C4275430090FA7EE0FAA397
|
||||
:202BD600E0FC8A4A8C4BAB42AC43EB254AFBEC354BFC90FA7EEBF0ECA3F080B990FA7DE03D
|
||||
:202BF600FF90FA5CE02FF07829E2FE08E2FF4E60067833E4F2D21090F940E4F07833E270C0
|
||||
:202C1600030228CD782BE2FE08E2FF90FA7EE0FCA3E0FDEEB50406EFB50502801174B3C004
|
||||
:202C3600E0746AC0E01259A91581158180047582012275820022AFF0AE83E58290FA88F0F0
|
||||
:202C5600EEA3F0EFA3F090FA88E0FDA3E0FEA3E00DBD00010E8D828E837408C0E07430C0EF
|
||||
:202C7600E074F9C0E012454B1581158115819211501490F938E0FCA3E0FDA3E0FEA3E0FFC6
|
||||
:202C9600EC4D4E4F707490F91FE4F090FA88E0FDA3E0FEA3E0FF74012DFAE43EFBC002C0BB
|
||||
:202CB6000390F91712444D15811581740D2DFAE43EFB8F048A828B838CF0126223FA90F984
|
||||
:202CD60020F07411C0E0C005C00690F92F1245B71581158115817408C0E0E4C0E0907000F6
|
||||
:202CF600E4F5F012092C1581158190F938E0FEA3E0FF90FA86EEF0EFA3F090F938E0FCA3B1
|
||||
:202D1600E0FDA3E0FEA3E0FFEC4D4E4F7003022DA5C3E49C74109DE49EE49F500B90FA84CE
|
||||
:202D3600E4F07410A3F0800890FA84ECF0EDA3F0D20D90FA84E0FEA3E0FF8E828F831228F7
|
||||
:202D560005E582604690F91FE0FF0F90F91FEFF090F938E0FCA3E0FDA3E0FEA3E0FF90FA84
|
||||
:202D760084E0FAA3E0FB8A008B01E4FAFBECC398FCED99FDEE9AFEEF9BFF90F938ECF0ED13
|
||||
:202D9600A3F0EEA3F0EFA3F0022D107582002275820122AFF0AE83E58290FA8DF0EEA3F056
|
||||
:202DB600EFA3F090FA8DE0FDA3E0FEA3E0FF74012DFAE43EFB8F048A828B837408C0E0748E
|
||||
:202DD60030C0E074F9C0E012454B1581158115819212504090F93DE0FC740E2DFDE43EFEFA
|
||||
:202DF6008D828E838FF0126223FDECB5052690F938E0FCA3E0FDA3E0FEA3E0FFEC4D4E4FC8
|
||||
:202E1600601274CBC0E0746AC0E01259A915811581022FB375820412177690F9457834E0B5
|
||||
:202E3600F290FA8DE0FCA3E0FDA3E0FE740E2CFAE43DFB8E078A828B838FF0126223FA54BF
|
||||
:202E5600FC60317834E2FB7F00C003C00774DEC0E0746AC0E01259A9E58124FCF58190FA33
|
||||
:202E76006E7411F0E4A3F08C828D838EF0121AC37834E4F290F945E02401F0FFBF04004010
|
||||
:202E96000590F945E4F090F945E0FF7834E2B507197582041217AF7402C0E0746BC0E012EB
|
||||
:202EB60059A915811581758201228F82122510AC82AD83AEF0FF7416C0E0E4C0E074F3C08C
|
||||
:202ED600E074F0C0E08C828D838EF0EF1206E1E58124FCF5817464C0E074FCC0E090F0FB75
|
||||
:202EF60012488A158115819212500890F108E054F8708190F945E0FF7810F28F821225108B
|
||||
:202F1600AC82AD83AEF0FF7404C0E0E4C0E08C828D838EF0EF12092C1581158175820412F9
|
||||
:202F360017AF7810E2FE7F00C006C007740CC0E0746BC0E01259A9E58124FCF58190F91FEA
|
||||
:202F5600E4F090FA8DE0FDA3E0FEA3E0FF74012DFAE43EFBC002C00390F91712444D158179
|
||||
:202F76001581740D2DFAE43EFB8F048A828B838CF0126223FA90F920F07411C0E0C005C0E3
|
||||
:202F96000690F92F1245B715811581158190F938E0FEA3E0FF90FA8BEEF0EFA3F090F93836
|
||||
:202FB600E0FCA3E0FDA3E0FEA3E0FFEC4D4E4F700302304AC3E49C74109DE49EE49F500B13
|
||||
:202FD60090FA84E4F07410A3F0800890FA84ECF0EDA3F090FA84E0FEA3E0FF8E828F83124E
|
||||
:202FF6002805E582604A90F91FE0FF0F90F91FEFF090F938E0F54CA3E0F54DA3E0F54EA350
|
||||
:20301600E0F54F90FA84E0FAA3E0FBE4FEFFE54CC39AFAE54D9BFBE54E9EFEE54F9FFF90AE
|
||||
:20303600F938EAF0EBA3F0EEA3F0EFA3F0022FB3758200227582041217767430C0E074F9A6
|
||||
:20305600C0E090F0F312444D1581158190F0FB7421F07447A3F0744DA3F07447A3F090F9FF
|
||||
:2030760041E02401F0A3E03400F0A3E03400F0A3E03400F090F941E0FCA3E0FDA3E0FEA3C5
|
||||
:20309600E0FF90F104ECF0EDA3F0EEA3F0EFA3F090FA8BE0FEA3E0FF7D007C0090F0FFEE7C
|
||||
:2030B600F0EFA3F0EDA3F0ECA3F090F93CE090F103F090F93DE090F108F07810E2F582125E
|
||||
:2030D6002510AC82AD83AEF0FF7416C0E0E4C0E074F3C0E074F0C0E08C828D838EF0EF1254
|
||||
:2030F600081CE58124FCF5817582041217AF75820122AFF0AE83E58290FA91F0EEA3F0EFFB
|
||||
:20311600A3F0C20D90FA91E0F553A3E0F554A3E0F555740D2553FAE43554FBAC558A828B68
|
||||
:20313600838CF0126223FCBC02028024BC0303023490BC10028019BC20028014BC210280C3
|
||||
:203156000FBCA803023383BCAF0302347002350590FA91E0FFA3E0FEA3E0FD7550907551C5
|
||||
:20317600FA755200740E2FF553E43EF5548D558553828554838555F0126223FB8550828544
|
||||
:2031960051838552F0125E9A90FA90E020E203023267758204C007C006C005121776D00519
|
||||
:2031B600D006D00790FA90E0C423541FFB603CBB0F02806C8553828554838555F012622392
|
||||
:2031D600F582C007C006C0051225D4AB82D005D006D007BBFF0280488B82C007C006C00573
|
||||
:2031F6001226FFD005D006D007803574012FF553E43EF5548D558553828554838555F0C0D2
|
||||
:2032160007C006C005122541AB82D005D006D007BBFF02800B12249778357401F202337D05
|
||||
:20323600758204C007C006C0051217AFD005D006D0078F828E838DF0122DA9E582600B1266
|
||||
:20325600249778357401F202337D7835E4F202337D74012FF553E43EF5548D5585535085BC
|
||||
:2032760054518555528550828551837408C0E07427C0E074F9C0E012454B158115811581EF
|
||||
:203296009213500B12249778357401F202337D758204C007C006C005121776855382855466
|
||||
:2032B600838555F0122541AC82758204C0041217AFD004D005D006D007BCFF028051C007C3
|
||||
:2032D600C006C005C004122497D004D005D006D0078F538E548D55AA53AB547411C0E0C0DF
|
||||
:2032F60002C00390F92F1245B715811581158190F938E4F0A3F0A3F0A3F090FC63ECF090C2
|
||||
:20331600FA90E054037824F28C82122733803D741AC0E0746BC0E01259A9158115818F8213
|
||||
:203336008E838DF0122DA9E582601B1224977810E2FB90FC63F090FA90E054037824F28BA4
|
||||
:203356008212273380067835E4F2801B90F930E0FAA3E0FBC002C00390F92712444D158146
|
||||
:20337600158178357401F27835E2F5822290F938E0FAA3E0FBA3E0FEA3E0FFEA4B4E4F7007
|
||||
:203396002F74012553FDE43554FEAF558D828E837408C0E07430C0E074F9C0E012454B154B
|
||||
:2033B6008115811581921350071224977582012290F91FE4F090FA91E0F550A3E0F551A33F
|
||||
:2033D600E0F55274012550FAE43551FBC002C00390F91712444D15811581740D2550FDE49C
|
||||
:2033F6003551FEAF528D828E838FF012622390F920F0AD50AE517411C0E0C005C00690F92E
|
||||
:203416002F1245B715811581158174092550FDE43551FEAF528D828E838FF0126223FDA369
|
||||
:20343600126223FE8D828E83122805E582602790F938E4F0A3F0A3F0A3F0758204121776AC
|
||||
:2034560090F0F775F0001213CB7582041217AF1224977582012275820022122497740E2543
|
||||
:2034760053FDE43554FEAF558D828E838FF0126223F58212045A75820122758204121776A6
|
||||
:203496008553828554838555F0122C4CE582605B122497758204121776123520300D1112BC
|
||||
:2034B6003A8A907019E4F5F01206C112557980567422C0E0746BC0E01259A9158115817557
|
||||
:2034D60082041217AF90FA5B7401F090F0E374E0F0123B037408C0E0E4C0E0C0E090F92747
|
||||
:2034F60012451F158115811581801B758200227F00C004C007743FC0E0746BC0E01259A9DA
|
||||
:20351600E58124FCF58175820022783AE4F208F208F208F2C20D7419C0E0E4C0E074A2C0B4
|
||||
:20353600E074FDC0E0907000E4F5F01206E1E58124FCF58178367419F2747008F2E408F2DD
|
||||
:2035560008F290FDAAE0FFBF0102800790F08F7401F022906251E493FD740193FE740293A0
|
||||
:203576007409C0E0C005C00690FDAB12454B1581158115819214500790F08F7402F02290CD
|
||||
:20359600FDA8E0FEA3E0FFC3E49E74809F500790F08F7403F02290FDA8E0FEA3E0FF4E70F6
|
||||
:2035B6000302366890FDA8E0FEA3E0FFC374239E74089F50047E237F08C006C00774F3C07A
|
||||
:2035D600E074F0C0E07836E2F58208E2F58308E2F5F008E21206E1E58124FCF58190FA94BC
|
||||
:2035F60074F3F074F0A3F0E4A3F090FA97EEF0EFA3F0783AE2F58208E2F58308E2F5F0082B
|
||||
:20361600E2C007C006123741783AC0E0E582F2E58308F2E5F008F2D0E008F2D006D0078EDA
|
||||
:20363600028F037C007D007836E22AF208E23BF208E23CF208E23DF290FDA8E0FCA3E0FD62
|
||||
:20365600ECC39EFEED9FFF90FDA8EEF0EFA3F00235AC90FDA2E0FCA3E0FDA3E0FEA3E0FF78
|
||||
:20367600783AE2B5041108E2B5050C08E2B5060708E2B50702800790F08F7404F02290FD25
|
||||
:20369600A6E0FEA3E0FF90F08DEEF0EFA3F0C006C007745FC0E0746BC0E01259A9E5812484
|
||||
:2036B600FCF581D20D22122756AC82AD83AEF0FF90F941ECF0EDA3F0EEA3F0EFA3F0227438
|
||||
:2036D60008C0E07450C0E074F9C0E090FA661245B715811581158190FA5DE054F84421F093
|
||||
:2036F60090FA5EE054F344C8F090FA607437F07413A3F090FA6274FFF0A3F090FA6474378F
|
||||
:20371600F07413A3F0227411C0E0745DC0E074FAC0E090F9DC1245B715811581158190F905
|
||||
:2037360058E0FF04F090F9DEEFF022AC82AD83AEF0FF783EECF4F2EDF408F2EEF408F2EFB7
|
||||
:20375600F408F290FA94E0F55EA3E0F55FA3E0F56090FA97E0F55AA3E0F55B855A5C855B27
|
||||
:203776005D155A74FFB55A02155BE55C455D700302383F855E82855F838560F0126223FE6E
|
||||
:20379600A385825E85835F8E047D007E007B00783EE26CF208E26DF208E26EF208E26BF2CC
|
||||
:2037B6007846E4F208F27846C3E2940808E26480948050A7783EE25401FA08E25400FB0865
|
||||
:2037D600E25400FC08E25400FE7842C3E49AF2E49B08F2E49C08F2E49E08F27841E2C31398
|
||||
:2037F600F56418E213F56318E213F56218E213F5617842E25420FC08E25483FD08E254B86E
|
||||
:20381600FE08E254EDFA783EEC6561F2ED656208F2EE656308F2EA656408F27846E2240145
|
||||
:20383600F208E23400F20237BC783EE2F4FB08E2F4FC08E2F4FD08E2F48B828C838DF022A6
|
||||
:206A58000A002530327820004150206F6E2025640A004E6F204150206F6E2025640A002E68
|
||||
:206A780000636865636B435243206661696C65640A00524551202564207061727420256488
|
||||
:206A98000044726177696E6720696D61676520696E20736C6F742025640A00626C6B2066A4
|
||||
:206AB80061696C65642076616C69646174696F6E210A0072657374617274696E6720696D10
|
||||
:206AD8006720646C0A004368616E67696E67207374617274696E67536C6F742066726F6D1C
|
||||
:206AF80020256420746F20300A004E6F20736C6F74730A006E657720646C20746F20256476
|
||||
:206B18000A00646C20696D670A004F544120696D6167652076616C69646174696F6E206644
|
||||
:206B380061696C65640A00646174615479706520307825782069676E6F7265640A004368D6
|
||||
:206B5800726F6D613239004F54412076616C6964617465642C207570646174696E67207415
|
||||
:0F6B78006F2076657273696F6E202530780A0082
|
||||
:0575F200FF21474D4799
|
||||
:20385600E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB15
|
||||
:2038760000438004002290F09B7438F0E4A3F030050990F09B7430F0E4A3F02290F959E0D3
|
||||
:20389600704590F0C7E0603FC20490F09F7410F0C4A3F090F0A17406F0E4A3F09071597516
|
||||
:2038B600F080120D72D20490F09F7418F07401A3F090F0A1740DF0E4A3F090717B75F0800E
|
||||
:2038D600120D72D2038002C203300A2690F0C6E06020C20490F09F7410F0C4A3F090F0A14E
|
||||
:2038F6007470F0E4A3F090718575F080120D72D20222C20222123E4474ACC0E07471C0E0B6
|
||||
:203916001240F31581158174BFC0E07471C0E01240F31581158190F09BE0FEA3E0FF740860
|
||||
:203936002EFEE43FFF90F09BEEF0EFA3F074D2C0E07471C0E01240F31581158174F5C0E0C3
|
||||
:203956007471C0E01240F3158115817417C0E07472C0E01240F31581158190F09BE0FEA39D
|
||||
:20397600E0FF74082EFEE43FFF90F09BEEF0EFA3F090F09DE4F0A3F074A7C0E07471C0E049
|
||||
:203996001240F3158115810239C0758205123E21E5826001227435C0E07472C0E01259A96B
|
||||
:2039B6001581158190390B020D4C7436C0E074FCC0E0E4C0E07441C0E07472C0E01240F398
|
||||
:2039D600E58124FBF5812290624FE493C0E0740193C0E0744DC0E07472C0E01240F3E58122
|
||||
:2039F60024FCF58122123E44123E60745CC0E07472C0E01240F3158115811239DD90F0E5C1
|
||||
:203A1600E0C0E0A3E0C0E0746DC0E07472C0E01240F3E58124FCF58190FAB4E0FF3395E0E0
|
||||
:203A3600FEC007C006747BC0E07472C0E01240F3E58124FCF5810239C0758201123E21E546
|
||||
:203A5600826001221219549039FB020D4C123E44123E60C20512387C90F08DE0C0E0A3E0CC
|
||||
:203A7600C0E0748EC0E07472C0E01240F3E58124FCF58122903A63020D4C123E44123E6039
|
||||
:203A9600D20574A4C0E07472C0E01240F315811581D20490F08FE0FFBF02028018BF0402A6
|
||||
:203AB6008023BF053074B5C0E07472C0E01240F3158115812274C4C0E07472C0E01240F3D4
|
||||
:203AD600158115812274D5C0E07472C0E01240F315811581227E00C007C00674E0C0E0740D
|
||||
:203AF60072C0E01240F3E58124FCF58122903A90020D4C123E44123E6074EFC0E07472C099
|
||||
:203B1600E01240F3158115817407C0E07473C0E01240F31581158190F09BE0FEA3E0FF9020
|
||||
:203B3600F0A1EEF0EFA3F090F94CE0FF7E0090F94DE0FD7C00C007C006C005C0047420C0B3
|
||||
:203B5600E07473C0E01240F3E58124FAF58190F94AE0FF7E0090F94BE0FD7C00C007C006BF
|
||||
:203B7600C005C0047432C0E07473C0E01240F3E58124FAF58190F948E0FF7E0090F949E0BA
|
||||
:203B9600FD7C00C007C006C005C0047432C0E07473C0E01240F3E58124FAF58190F946E0C5
|
||||
:203BB600FF7E0090F947E0FD7C00C007C006C005C0047432C0E07473C0E01240F3E5812497
|
||||
:203BD600FAF58190F099E0FEA3E0FF8E02EFFB3395E0FCFD7428C39AF50F74019BF510E4D5
|
||||
:203BF6009CF511E49DF512906EADE493FDE4FC3395E0FBFAE50FC39DFDE5109CFCE5119B7A
|
||||
:203C1600FBE5129AFA78647402F2E408F208F208F28D828C838BF0EAC007C006125D29AAA0
|
||||
:203C360082AB83D006D00790F09FEA2EF0EB3FA3F090F0BFE0FF7E0090F0C0E0FD3395E0CC
|
||||
:203C5600FC90F959E0FB7A00C007C006C005C004C003C002743BC0E07473C0E01240F3E580
|
||||
:203C76008124F8F581123EE10239DD758203123E21E582600122121954903B09020D4C12BD
|
||||
:203C96003E44123E607455C0E07473C0E01240F3158115817468C0E07473C0E01240F3151E
|
||||
:203CB60081158190F099E0FEA3E0FF90FA99EEF0EFA3F090F09BE0FEA3E0FF90F0A1EEF061
|
||||
:203CD600EFA3F0747DC0E07473C0E01240F31581158190FA99E0FEA3E0FF8E02EFFB3395FE
|
||||
:203CF600E0FCFD74F0C39AFAE49BFBE49CFCE49DFD78647402F2E408F208F208F28A828BF9
|
||||
:203D1600838CF0EDC007C006125D29AA82AB83D006D007EA2EFEEB3FFF90F09FEEF0EFA3A7
|
||||
:203D3600F0EE5407601574075EFC7D00EEC39CFEEF9DFF90F09FEEF0EFA3F0906EAD75F008
|
||||
:203D560080120D7290F0A1E0FEA3E0FF74082EFEE43FFF90F0A1EEF0EFA3F0D20490703763
|
||||
:203D760075F080120D72023892758204123E21E582600122903C95020D4C123E44123E6095
|
||||
:203D960090F09BE0FEA3E0FF74102EFEE43FFF90F09BEEF0EFA3F07491C0E07473C0E01207
|
||||
:203DB60040F315811581123EE1023892758205123E21E582600122903D90020D4C123E44EE
|
||||
:203DD600123E6074A1C0E07473C0E01240F31581158174B5C0E07473C0E01240F315811530
|
||||
:203DF6008190F09F747CF0E4A3F090F09BE0FEA3E0FF90F0A1EEF0EFA3F0D2049070377538
|
||||
:203E1600F080020D72903DD3020D4CE582C40354F8F5821225D4AF82BFFF02800D7824E4A6
|
||||
:203E3600F28F821227337582012275820022C206C204C20590F099E4F0A3F090F09DF0A345
|
||||
:203E5600F090F09BF0A3F0C20922D20490F0A1E4F0A3F0906D2A93FF7E007428C39FFF74CB
|
||||
:203E7600019EFE90F09FEFF0EEA3F0906D2975F080120D72C204906B88E493FF7E0090F0B7
|
||||
:203E96009FE0FCA3E0FDECC39FFFED9EFE90F09FEFF0EEA3F0906B8775F080120D72906DC7
|
||||
:203EB600ECE493FF7E0090F09FE0FCA3E0FDECC39FFFED9EFE90F09FEFF0EEA3F0D20490D6
|
||||
:203ED6006DEB75F080120D72C2042290F0E9E0FEA3E0FF4E601190F0E7E0FCA3E0FDC3EE1A
|
||||
:203EF6009CEF9D5002800890F0E7E0FEA3E0FFC006C00774CFC0E07473C0E01240F3E58141
|
||||
:053F160024FCF58122EE
|
||||
:206B8700801AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000064
|
||||
:206BA7000000000000000000000000000000000000000000000000000000000000000000CE
|
||||
:206BC7000000000000000000000000000000000000001C000000001F9F80000000003870AC
|
||||
:206BE70001C07F000000001F9FC000000000387001C07F000000001F9FE0000000003870A2
|
||||
:206C070001C0F7800000001C1CE000000000380001C0E3800000001C1CE000000000380071
|
||||
:206C270001C0E39DC1C7701F9CE773B871D03873B9C7E39FE3E7F81F9FEFF3FCF9F0387367
|
||||
:206C4700FDCEE39FE777F81F9FCFF3FDDDF03873FDDCE39CE7F7381C1F8E739DFDC03873E6
|
||||
:206C67009DF8E39CE7F7381C1C0E739DFDC038739DF8F79CE707381C1C0E739DC1C0387355
|
||||
:206C87009DDC7F1FE7F7381F9C0FF3FDFDC03F739DDC7F1FE3E7381F9C0FF3FCF9C03F735A
|
||||
:206CA7009DCE1E1DC1C7381F9C0773B871C03F739DC7001C00000000000003800000000094
|
||||
:206CC7000000001C0000000000000380000000000000001C0000000000000380000000006F
|
||||
:206CE7000000001C00000000000003800000000000000000000000000000000000000000EE
|
||||
:206D0700000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7A
|
||||
:206D2700FFFF800C000882A2AB55BFFFFFFF7DB4622800000010101176FF7BFFFF7FB7A921
|
||||
:206D470055505100002922966FF7BFFFFFFFEAE622AA08000002542ABF3F7FFFFFFFFD593F
|
||||
:206D6700B4102000002423B5B5DFFFFFFFFFF6AE48551000008890546AEFFFFFFFFFFBF59A
|
||||
:206D8700A382000000012DA3B3FFFFFFFFFFF6BE4E5209000490020D55DFFFFFFFFFFDDD3E
|
||||
:206DA70068A9001000490CFBAB6FFFFFFFFFFEEB955A002000129122BFDFFFFFFFFFFFF5FA
|
||||
:206DC700658140400028127DEFFFFFFFFFFFFFEFAB28000000420A9775FFFFFFFFFFFFF79B
|
||||
:206DE7004AC20400800C0008029CDFFFFFFFFFFFFF6A6A8D002000044D72AAFFFFFFFFFF88
|
||||
:206E0700FFD5D57480000240128EDFFDFFFFFFFFFFAEAA0A11200020525FF57FFFFFFFFF41
|
||||
:206E2700FF7294AA240000010AAB6F77FFFFFFFFFDAF545488000004804D95EBFFFFFFFFB7
|
||||
:206E47005B58B5514000000808A6B3F77FFFFFFFFFAD4AA0100000029641DCAEFFFFFFFF51
|
||||
:206E6700FDBFEA4802000000093EAB75EFFFFFFFFFD4B121080000000AC35DFF7FFFFFFF76
|
||||
:206E8700EFEF444A64800000A152A6EFEFFFFFFFD6CAF5101800000002154BD5DFFFFFF75F
|
||||
:206EA700EBD4D885000038380000000000000000000000000000000000000000000000003F
|
||||
:206EC7000000000000000000000000000000000007C00000000001FFF0000000000FFFF0F6
|
||||
:206EE700000000007FFFF000000001FFFFF000000007FFFFC00000001FFF80000000007F4C
|
||||
:206F0700F80000000000FFE00000000001FF000000000007FE00000000000FF80000000087
|
||||
:206F2700001FE000000000003FC00003E000007F80007FF00000FE0003FFF00001FC000FFF
|
||||
:206F4700FFF00001F8003FFFF00003F800FFFF800007F001FFE000000FE003FF0000000FC4
|
||||
:206F6700C00FF80000001F801FF00000001F803FC00000003F003F800000003F007F00003B
|
||||
:206F870000007E00FE0007E0007E01FC001FF000FC01F8007FF000FC03F001FFF000F803BF
|
||||
:206FA700F003FFF001F807E007FF0001F807E00FF00001F00FC01FE00001F00FC03F8000E5
|
||||
:206FC70003F00F803F000003F01F807E000003E01F807E000003E01F00FC01E003E01F00F8
|
||||
:206FE700FC07F803E01F00F80FFC03E03F00F80FFC03E03F01F81FFE03E03F01F81FFE03F2
|
||||
:20700700E03F01F81FFE03C03E01F01FFE01C01E00F00FFC00000000000FFC000000000040
|
||||
:2070270007F8000000000001E000000000000000303000001FF800000000FFFF00000003F1
|
||||
:20704700FFFFE000000FFFFFF000003FFFFFFC00007FF00FFE0000FF8001FF0001FE00001B
|
||||
:207067007F8003F800001FC007F000003FE00FE000007FF00FC00000FFF01F800001FFF867
|
||||
:207087001F000003FFF83F000007FEFC3E00000FFC7C7E00001FF87E7C00003FF03E7C0053
|
||||
:2070A700007FE03EFC0000FFC03FF80001FF801FF80003FF001FF80007FE001FF8000FFC63
|
||||
:2070C700001FF8001FF8001FF8003FF0001FF8007FE0001FF800FFC0001FFC01FF80003F0F
|
||||
:2070E7007C03FF00003E7C07FE00003E7E0FFC00007E3E1FF800007C3F3FF00000FC3F7F0E
|
||||
:20710700E00000FC1FFFC00001F80FFF800003F00FFF000007F007FE00000FE003FC00003C
|
||||
:207127001FC001FE00007F8000FF8001FF00007FF00FFE00003FFFFFFC00000FFFFFF0003A
|
||||
:207147000003FFFFE0000000FFFF000000001FF800001010000000000000000000007C0096
|
||||
:207167008200000038004407007903811C0103810079000708080063773E1C3E7763101069
|
||||
:20718700000003C00FF0081008100810081008100810081008100BD00BD008100FF0000099
|
||||
:2071A7000A000A0A0009084F70656E4550617065724C696E6B0A08006F70656E65706170D2
|
||||
:2071C70065726C696E6B2E64650A0049276D0920666173742061736C656570202E202E2018
|
||||
:2071E7002E20746F2077616B65206D653A000A52656D6F7665206261747465726965732CDC
|
||||
:207207002073686F727420626174746572790A00636F6E74616374732C207265696E7365C1
|
||||
:207227007274206261747465726965732E004465657020736C6565700A00546167204D41C5
|
||||
:20724700433A202573004368726F6D613239207625303458005374617274696E67202E20FC
|
||||
:207267002E202E0A0A000A564261743A202564206D560A0054656D70657261747572653A68
|
||||
:20728700202564430A0A000C466C617368696E67207625303478202E202E202E000C4F547F
|
||||
:2072A70041204641494C4544203A280A0A000C4E6F74204F544120696D616765000C5772F2
|
||||
:2072C7006F6E67204F544120696D616765000C435243206572726F72000C4572726F7220D8
|
||||
:2072E700436F64652025640057616974696E6720666F722064617461202E202E202E0A007B
|
||||
:207307000A466F756E642074686520666F6C6C6F77696E672041503A000A4150204D414397
|
||||
:207327003A202530325825303258002530325825303258000A43683A202564205253534977
|
||||
:207347003A202564204C51493A2025640A00084E6F20415020666F756E64203A280A080A00
|
||||
:20736700005765276C6C2074727920616761696E20696E2061000A6C6974746C652077689D
|
||||
:20738700696C65202E202E202E00087A7A5A5A5A202E202E202E0A080A000C454550524F2B
|
||||
:2073A7004D204641494C4544203A280A0A000C536C656570696E6720666F726576657220A2
|
||||
:1573C7002E202E202E0A0A00564261743A202564206D560A0096
|
||||
:203F1B00C007C006C005C004C00390FAA2E0600302400F90FAA3E0FF24FB500302400CEF32
|
||||
:203F3B002F2F903F4173023F50023F6E023FEF02400602400C90FAA0744BF0E4A3F090FAA5
|
||||
:203F5B00A2740BF090FAA37401F090FAA47468F002400F90FA9D124837E582FF6045EF2482
|
||||
:203F7B00E0FFBF600040027F1F90FAA5E0FE0E90FAA5EEF0C0078E82124361AD82AE83151E
|
||||
:203F9B008190FAA4E0FC7B002DFDEB3EFE8D828E837467C0E0124832AE82158190FAA4EEA6
|
||||
:203FBB00F0800B90FAA37402F090FAA4E0FFEF75F002A424DCF582747335F0F583E493FE61
|
||||
:203FDB00A3E493FF90FAA0EEF0EFA3F090FAA2740BF0802090FAA37403F090FAA074E3F0E3
|
||||
:203FFB00741AA3F090FAA203F0800990FAA37404F0C3802D90FAA0E0FEA3E0FFEE540124E7
|
||||
:20401B00FFE433FDEFC313CE13CEFF90FAA0EEF0EFA3F090FAA2E0FF1F90FAA2EFF0ED242F
|
||||
:0C403B00FFD003D004D005D006D007222F
|
||||
:2073DC009B01B3013303C90089019101990019013101930013012301CD01D90199039D0194
|
||||
:2073FC00B90139037302D30193033B017301B7039701A7012703370167016702DB001B03C6
|
||||
:20741C006303C500D10011038D00B10031028B00A3002302ED008D03B103DD001D037103DA
|
||||
:20743C0077038B03A303BB003B02BB03D70017034703B7003702C702F70213028F026500D4
|
||||
:20745C00850169000903A10121034D000D01590019026101610243025300EF024301F102FB
|
||||
:20747C00E501E901C9033D01790179022F014F014F02DB037B036F03F500C503D103BD0034
|
||||
:0E749C003D02AF002F02DD03BD03D703AF0397
|
||||
:20404700C007C006C005C004C001C000AC82AD83AEF0FFBF20005031BF0A030240E68F8262
|
||||
:20406700C007C006C005C004C003C002C001C000C02512422ED025D000D001D002D003D0AB
|
||||
:2040870004D005D006D00780567E00EF24E0FFEE34FFFEEF2FFFEE33FEEF242CF582EE341A
|
||||
:2040A70063F583E493A3E493C4540FFE90F0B3EEF0300507EE2EFE90F0B3F090F0B3E0FFCC
|
||||
:2040C7003395E0FE0FBF00010E90F099E0FCA3E0FDEF2CFFEE3DFE90F099EFF0EEA3F0D055
|
||||
:2040E70000D001D004D005D006D00722C007C006C005C004C003C001C000E58124F6FFC0D7
|
||||
:2041070007C006C005C004C003C002C001C000C0251241E1D025D000D001D002D003D00414
|
||||
:20412700D005D006D007E58124F6F886050886068D828E83E493FCBC0C7290F099E4F0A302
|
||||
:20414700F0C007C005C006C0E0C0E0904047125658E58124FBF58190F099E0FDA3E0FE335A
|
||||
:2041670095E0FCFB7428C39DFD74019EFEE49CFCE49BFB78647402F2E408F208F208F28D29
|
||||
:20418700828E838CF0EBC007C002C001C000C025125D29AB82AC83ADF0FED025D000D0010A
|
||||
:2041A700D002D00790F099EBF0ECA3F0C007E58124F5F8E6C0E008E6C0E0E4C0E0C0E090D6
|
||||
:2041C700109A125658E58124FBF581D000D001D003D004D005D006D00722300625300506F1
|
||||
:2041E7007E147F0080047E0A7F0090F0B4EEF03005067E207F0080047E107F0090F0B3EE00
|
||||
:20420700F0223005067E207F0080047E107F0090F0B4EEF03005067E147F0080047E0A7FB3
|
||||
:204227000090F0B3EEF022AF82BF08028018BF0902804EBF0A028013BF0B028055BF0C014F
|
||||
:2042470022BF0D568038B2050241E11241E190F0B4E0FE3395E0FD90F09BE0FBA3E0FCEE32
|
||||
:204267002BFEED3CFD90F09BEEF0EDA3F090F09DE0FDA3E0FE90F099EDF0EEA3F022B204A5
|
||||
:204287002290F099E0FDA3E0FE90F09DEDF0EEA3F02290F09DE4F0A3F0227E00C007C00630
|
||||
:1242A70074AAC0E07474C0E01259A9E58124FCF581228D
|
||||
:1574AA00496E76616C69642063686172203078253032780A0077
|
||||
:2042B900E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBA8
|
||||
:2042D90000438004002275FB02228582F9E5F830E1FB53F8FDE5F820E0FB85F9822253F3D7
|
||||
:2042F900C775FA2275FC0C75F8C043F4C043F102D20B2253F1FD53F43F75FA0075FC31752A
|
||||
:08431900F84043F338C20B2207
|
||||
:20432100858283D0F0D0E0D082C082C0E0C0F022C00074FB2581F8E58286820886830886A1
|
||||
:20434100F0D0002275F008C58213C58233D5F0F7C58222E583A2E713F583E58213F5822285
|
||||
:20436100D083D0E0D0F0C0F0C0E0C083E582A4F58285F08322C000E58124FDF8E6F8858226
|
||||
:20438100F0A4F582E8A8F08583F0A428F583E5F03400F5F0E4D00022C000C001C0E0C0F0C0
|
||||
:2043A10074FA2581F88600E58288F0A4F582A9F0E58388F0A429F583E5F03400F9D0E08878
|
||||
:2043C100F0A429C5F03400F9D0E0C0F088F0A429D0F0D001D00022C000C001C002E5812448
|
||||
:2043E100FBF8E6F918E6F88582F0A4C0E0AAF0E58388F0A42AF8E5F03400FAE98582F0A4F2
|
||||
:2044010028C0E0E5F03AFA74003400F8E98583F0A42AFAE5F0388AF0D083D082D002D001B2
|
||||
:20442100D00022D0E0D0F0C000C001C002C0F0C0E074F82581F9E7F809E7F922D002D001EE
|
||||
:20444100D00022C9C583C9C8C582C82212442475F008124444E0A3124444F0A3D5F0F302AB
|
||||
:20446100443D12442475F008124444E493A3124444F0A3D5F0F202443D124424C375F0080E
|
||||
:20448100124444E0A3F502124444E03AF0A3D5F0EF02443D12442475F008124444E0A3F590
|
||||
:2044A10002124444E05AF0A3D5F0EF02443D124424C375F008124444E0A3F502124444E023
|
||||
:2044C1009AF0A3D5F0EF02443D124424C375F008124444E0A3F502124444E0A39AD5F0F04D
|
||||
:2044E10002443D12442475F008124444E0A3F502124444E0A36A7007D5F0EED302443DC373
|
||||
:2045010002443DC8C0E075F008E038F0A3D5F0F9D00022D3E4024504C374FF024504C000A4
|
||||
:20452100C00174FA2581F8E6F5F0088601496015088600E8F0A374FF25F0F5F074FF39F57E
|
||||
:204541000145F070EED001D00022C000C001C00274F92581F9E7D3601CF5F0098700098779
|
||||
:2045610001C3E0F502A3124444E0A31244446A7004D5F0EED3D002D001D00022C000C001CB
|
||||
:20458100C00274F82581F9E7F5F00987024A601F098700098701124444E0A3124444F0A3BB
|
||||
:2045A10074FF25F0F5F074FF3AF50245F070E7D002D001D00022C000C001C00274F9258172
|
||||
:2045C100F9E76015F5F0098700098701124444E0A3124444F0A3D5F0F3D002D001D00022E8
|
||||
:2045E100C083C082E06003A380FAC3E582D0F095F0F582E583D0F095F0F58322C003C00223
|
||||
:20460100C001C000C0E0C0F0C083C082A98174F62581F886F0188600750201750300758216
|
||||
:2046210011A2F74014C3E833F8E5F033F5F0C3EA33FAEB33FB058280E8E4C003C002C0E0CD
|
||||
:20464100C0E0AA81C0F0C000C0E0C0E0A881C0E0C0E0C0E0C0E0AB81C000C001C3758304C9
|
||||
:2046610086F018E71995F0D583F6D001D000402BC000C001C375830486F018E795F0F71982
|
||||
:20468100D583F585020085030175830486F018E745F0F719D583F5D001D00074FC28F8C3C5
|
||||
:2046A10075830408E613F6D583F9C00074FC2AF8C375830408E613F6D583F9D000D582989D
|
||||
:2046C10020D508D082D083D0F0D00074F42581F58130D508D082D083D0F0D000E8D000D059
|
||||
:2046E10001D002D00322C2D50245FDD2D50245FDC003C002C001C000C0E0C0F0C083C08250
|
||||
:20470100A98174F62581F886F07401758219A2F7400A23C5F023C5F0058280F2C0E0E4C09B
|
||||
:20472100E0C0E0C0E0AA81C0F0C0E0C0E0C0E0A881C0E0C0E0C0E0C0E0AB81C000C001C384
|
||||
:2047410075830486F018E71995F0D583F6D001D000402BC000C001C375830486F018E795A5
|
||||
:20476100F0F719D583F585020085030175830486F018E745F0F719D583F5D001D00074FCC7
|
||||
:2047810028F8C375830408E613F6D583F9C00074FC2AF8C375830408E613F6D583F9D000C8
|
||||
:2047A100D58298D082D083D0F0D00074F42581F581E8D000D001D002D00322C006C005C0B5
|
||||
:2047C10004C003C002C001C00074F72581F886F074017C09A2F7400923C5F023C5F00C8037
|
||||
:2047E100F3FBE4FAA9F0F88582F0FDFEC3E58298E583994011C3E58298F582E58399F583A3
|
||||
:20480100EA4DFDEB4EFEC3E913F9E813F8C3EB13FBEA13FADCD620D5048D828E83D000D063
|
||||
:2048210001D002D003D004D005D00622C2D50247BCD2D50247BCE0C0E02401F0A3E0C0E030
|
||||
:204841003400F0A3E0D083D0826014B4600AC000A882E2D000F582224009E493F58222E00B
|
||||
:20486100F58222C000A882E6D000F5822212442475F004D3124444E0FA3400F0EAA3124434
|
||||
:2048810044F0A3D5F0EE02443D12442475F004C3124444E0FAA3124444E0A36A7004D5F08D
|
||||
:2048A100EFD302443D124424C3E0A398E0A399E0A39400E0A3940002443D124424C3E0A3CD
|
||||
:2048C10038E0A339E0A33400E0A3340002443D75F004E07004A3D5F0F9F58222A3A3A3E072
|
||||
:0248E100332280
|
||||
:0448E30075C90B2266
|
||||
:2048E700C0E0C007C006C0D075D000AEDAAFDB74012EF5DAE43FF5DBD0D0D006D007D0E03B
|
||||
:2049070032C007C006C005C004C000AEDAAFDB784AEEF208EFF27848E5E2F27849E5E3F2F7
|
||||
:20492700EEB5DAE7EFB5DBE37848E2FC08E2FD08E2FE08E28C828D838EF0D000D004D0053E
|
||||
:20494700D006D0072285E28222E4F5DAF5DBF5E4F5E5F5E6F5E7F5E275E40543D84043B8FE
|
||||
:204967000222AF82AE83ADF0FC784CEFF2EE08F2ED08F2EC08F21249087850C0E0E582F293
|
||||
:20498700E58308F2E5F008F2D0E008F2124908AA82AB83AEF0FF7850D3E29AF4B3FAB30868
|
||||
:2049A700E29BF4B3FBB308E29EF4B3FEB308E29FF4FF784CC3E29A08E29B08E29E08E29F29
|
||||
:0349C70050CA22B1
|
||||
:2049CA0053C07F53A1FE53BEFC3243870122AF82AE83ADF0FC7854EFF2EE08F2ED08F2ECBA
|
||||
:2049EA0008F290FAA6E4F090FAA7F090FAA874DFF090FAA974BEF090FAAAE054E0F090FA02
|
||||
:204A0A00AAE0541FF090FAAB7407F090FAACE054E0F090FAACE0549F4420F090FAACE054FE
|
||||
:204A2A007FF090FAADE054FC4402F090FAADE054FBF090FAADE054F7F090FAADE054CFF08E
|
||||
:204A4A0090FAADE0543F4440F07854E2F5F008E242F008E242F008E245F0701B7B017513B5
|
||||
:204A6A006F7514FC85141590FAA6E515F07A6F90FAA7EAF0024B0C7854C3E2943F08E29461
|
||||
:204A8A000008E2940008E29400500C7854743FF2E408F208F208F27854E225E0F51608E2C9
|
||||
:204AAA0033F51708E233F51808E233F519E5162516F516E51733F517E51833F518E519336E
|
||||
:204ACA00F519747DC0E0E4C0E08516828517838518F0E5191246E77854C0E0E582F2E58376
|
||||
:204AEA0008F2E5F008F2D0E008F2158115817B007D687EFC8E0590FAA6EDF07E6890FAA77C
|
||||
:204B0A00EEF053C07F53A1FE43A11075A8A0EB70147854E2F5F008E242F008E242F008E254
|
||||
:204B2A0045F070012253BEFBE5BE30E5FBE5C654384441F5C6E5C630E6FB43BE0453C67F14
|
||||
:204B4A007854C3E2F5F074F095F008E2F5F074FF95F008E2F5F0E495F008E2F5F0E495F0D5
|
||||
:204B6A00501B7DF07EFF7854E22410F208E23400F208E234FFF208E234FFF280117854E295
|
||||
:204B8A00FD08E2FE7854E4F208F208F208F2EB60067A007C0080047A107C008AA175C00065
|
||||
:204BAA0043D6817AA67CFA8AD48CD575D60175A204E5A570FC75A2028EA48DA3AEA5EEB52E
|
||||
:204BCA00A50280FA43C702EB60077B0075BE07800375BE06000000E5BE5403600875D7012C
|
||||
:204BEA00004387010053C7FDE5BE30E5FB75BE00E5BE30E5FB75C679E5BE30E6FB7E007DCD
|
||||
:1B4C0A0000000DBD80FB0EBE80F575C639E5C620E6FB75C63875BE04024B18DA
|
||||
:0E75F700060606060606040707070707070430
|
||||
:204C2500AF8275BB0074304FF5B575B473E5B420E6FBE5B430E7FBAEBA7F00ADBB7C009035
|
||||
:204C4500FAB2EC4EF0ED4FA3F08FB522C21590FAB2E0FEA3E08E82C4C582C4540F6582C5E2
|
||||
:204C650082540FC5826582C582F58374E2C0E07404C0E01243D8AC82AD83AEF0FF1581157C
|
||||
:204C85008190FAB0E0FAA3E0FB74FFC0E07407C0E08A828B831243D8A882A983AAF0FB1587
|
||||
:204CA500811581ECC398FCED99FDEE9AFEEF9BFF747DC0E08C828D838EF0EF124399AC82CB
|
||||
:204CC500AD83AEF0FF1581EFC40354F8CEC403CE6ECE54F8CE6EFFEDC40354074EFEEDC438
|
||||
:204CE5000354F8CCC403CC6CCC54F8CC6CFDEF30E70FD215C3E49CFCE49DFDE49EFEE49F8C
|
||||
:204D0500FF90FAAEE0C0E0A3E0C0E08C828D838EF0EF1246E7AC82AD83AEF0FF15811581C3
|
||||
:204D250074FF2CFC74033DFDE43EFEE43FFF74FFC0E07407C0E08C828D838EF0EF1246E7E8
|
||||
:164D4500AC821581158190FAB4ECF030150790FAB4C3E49CF02205
|
||||
:204D5B00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBFB
|
||||
:204D7B00004380040022C007C006AF82BF64004027BF6A00502290DF097421F090DF0A7462
|
||||
:204D9B003BF090DF0B7413F08F06EE249CFE90DF0675F003A4F0802F90DF097422F090DF0E
|
||||
:204DBB000A74BBF090DF0B7413F0BFC8004013BFE100500EEF2438FF90DF0675F00CA4F022
|
||||
:204DDB00800590DF06E4F0D006D00722C00775E10490DF3BE0B401FCD00722124DE77F0001
|
||||
:204DFB008F057EDFEFC39074BF938D828E83F00FBF200040EB90DF237488F090DF247431C0
|
||||
:204E1B00F090DF257409F090DF2E748EF075911075ED00759D0075EF0322C007AF82C3EF3A
|
||||
:204E3B006480946250047FE2800EC3748A8FF063F08095F050027F0A741E2FC3139074DF4D
|
||||
:204E5B009390DF2EF0D00722C007C006AE82AF838ED48FD575D6010000000000000000001D
|
||||
:204E7B00D006D0072275D68100000000000000000022C007C006C005AE82AF83124E808F37
|
||||
:204E9B000590FC78EDF090FC79EEF07E767FFC8E828F83124E63D005D006D00722C007C0AF
|
||||
:204EBB0006C005AE82AF83124E808F0590FC7EEDF090FC7FEEF07E7E7FFC8E828F83124E6D
|
||||
:204EDB0063D005D006D00722301604E5EF700122124DE753C0FE43B801E5ED75F080A4242D
|
||||
:204EFB00B6F58274FA35F0F583124E8D75E1022253B8FE124E80124DE775D10053C0FE2250
|
||||
:204F1B00AE82AF837CFF7DFF124F0B8E828F83124EB875E90075E103E5E920E42375820FC5
|
||||
:204F3B00C005C004124C25D004D00590FAB2E0FEA3E0FFC3EE9CEF9D50DE8E048F0580D880
|
||||
:204F5B00124E80C005C004124EE3D004D0057423C0E08C828D8312482D15817404C0E01245
|
||||
:204F7B004376AC82AD83158190F0E7ECF0EDA3F022C025C0E0C0F0C082C083C007C006C07D
|
||||
:204F9B0005C004C003C002C001C000C0D075D000E5D130E040E5ED75F080A424B6FE74FAAB
|
||||
:204FBB0035F0FF53D1FE8E828F83E0FD248240200D0DED2EF582E43FF583E0FF30E711E558
|
||||
:204FDB00ED04FF8FEDBF030375ED00E5EF14F5EF124EE3800F74F4C0E07474C0E01259A9E1
|
||||
:204FFB001581158153C0FED0D0D000D001D002D003D004D005D006D007D083D082D0F0D0E8
|
||||
:20501B00E0D02532201806124F0BC21622201605D216024EE322E59D75F080A424B6FE74FB
|
||||
:20503B00FA35F0FF8E828F83E0FD7403B5EF047582FF228D037C0074022BF9E43CFAE92E2A
|
||||
:20505B00F582EA3FF583E0FA747F5AD39494F4FABA7F0040047AFF8003EA2AFA90F0BFEA5D
|
||||
:20507B00F00BBB00010CEB2EF582EC3FF583E0A2E71324B390F0C0F00EBE00010FC005C03B
|
||||
:20509B0006C00790F95B1245B7158115811581E59D04FF8F9DBF0303759D00D21910AF0240
|
||||
:2050BB00C219E5EFFF04F5EFA21992AFEF7007C005124EE3D0058D8222D21A10AF02C21A46
|
||||
:1050DB00AFEF75EF03A21A92AFEF7003024EE3220C
|
||||
:2074BF00D3917D044522000F0022BB131D3B1373A7650700181E1CC700B0B610EA2A001FAF
|
||||
:2074DF00030506080B0E191C242527293855408D8A84CAC4C0646D612069727120756E65D4
|
||||
:0974FF00787065637465640A008D
|
||||
:10760500DFD900008080131A0000DFD9207E1342E5
|
||||
:1700E10090FC477456F090FC487412F090FC4903F090FC4A7485F0AA
|
||||
:2050EB00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB68
|
||||
:20510B00004380040022C007C006C005C004C003C002C001C000E582785BF27E00C21C787F
|
||||
:20512B005CE4F2C006785CE2C0E0901000124376AA82AB831581785DEAF2EB08F2785F74DA
|
||||
:20514B0004F2E408F2785DE2FA08E2FBE4FCFE7404C0E0E4C0E0744BC0E074FCC0E08A82E5
|
||||
:20516B008B838CF0EE1206E1E58124FCF5817404C0E07447C0E074FCC0E090FC4B12454BBB
|
||||
:20518B00158115811581921DD006201D03025275785FE2FB08E2FCC394104003025275C0E7
|
||||
:2051AB0006785D795FE3C5F0E225F0FB09E3C5F008E235F0FAE4FCFE7402C0E0E4C0E07411
|
||||
:2051CB004BC0E074FCC0E08B828A838CF0EE1206E1E58124FCF58190FC4BE0F51A74FFB562
|
||||
:2051EB001A05D006025275D006785BE2B51A5D90FC4CE0FCBC020040531C1C8C06785AC3CB
|
||||
:20520B00E29C5004785AE2FCC0067B007858E2F51B08E2F51C785DE2FD08E2FF74022DFDC6
|
||||
:20522B00E43FFF785FE22DFD08E23FFA7E007F00C004C003C01BC01C8D828A838EF0EF1265
|
||||
:20524B0006E1E58124FCF581D21CD00690FC4CE0FF7D00785FE2FB08E2FCEF2BFBED3CFC94
|
||||
:20526B00785FEBF2EC08F202519B785CE22401F2785CE2B40A00500302512E301C048E07A1
|
||||
:20528B0080027FFF8F82D000D001D002D003D004D005D006D00722C007C001C000758204F1
|
||||
:2052AB00C007C006C005C004C003C002C001C000121776D000D001D002D003D004D005D069
|
||||
:2052CB0006D00778587461F274FC08F2785A7401F2758223125111E58230E70690FC617439
|
||||
:2052EB0008F0785874AEF274FA08F2785A7402F2758212125111E58230E70A90FAAE74A6CE
|
||||
:20530B00F07409A3F0785874B0F274FA08F2785A7402F2758209125111E582FF30E70A906F
|
||||
:20532B00FAB074F3F07402A3F0C007C006C005C004C003C002C001C00012536C758204125E
|
||||
:20534B0017AF758200125BB8D000D001D002D003D004D005D006D007D2AFD000D001D007CB
|
||||
:20536B00227440C0E07401C0E0E4C0E090FDA212451F158115811581785874A2F274FD085B
|
||||
:20538B00F2785A7407F275822A125111E582FF30E71D785874A2F274FD08F2785A7406F221
|
||||
:2053AB00758201125111E582FF30E703D21B2290F9577444F090F9567467F090FDA4E0FFA5
|
||||
:2053CB0090F953F090FDA5E0FE90F952F090FDA6E090F951F090FDA7E090F950F090FDA430
|
||||
:2053EB00E4F07D007C00C006C005C007C00474A2C0E074FDC0E0E4C0E07408C0E07475C0AF
|
||||
:20540B00E01259A9E58124F7F58190F950E0FF7E0090F951E0FD7C00C007C006C005C00417
|
||||
:20542B007416C0E07475C0E01259A9E58124FAF58190FDA2E024BF90F955F090FDA3E024AC
|
||||
:20544B00BF90F954F090F956E0FF7E0090F957E0FD7C00C007C006C005C0047420C0E07482
|
||||
:20546B0075C0E07436C0E074FCC0E0125A22E58124F8F58190F954E0FF7E0090F955E0FD37
|
||||
:20548B007C00C007C006C005C0047420C0E07475C0E0743AC0E074FCC0E0125A22E581243C
|
||||
:2054AB00F8F58190F952E0FF7E0090F953E0FD7C00C007C006C005C0047420C0E07475C013
|
||||
:2054CB00E0743EC0E074FCC0E0125A22E58124F8F58190F950E0FF7E0090F951E0FD7C0090
|
||||
:2054EB00C007C006C005C0047420C0E07475C0E07442C0E074FCC0E0125A22E58124F8F563
|
||||
:20550B0081229055187479C39582F5F02275F020C2ADC2AC43AE0100E5AE20E7FB05AD0572
|
||||
:20552B00ADD5F0F09000008583AD8582ACA375AB2275F00275F900E5F830E1FB53F8FDE536
|
||||
:20554B00F820E0FBC0F9D5F0EB43AE02E5AE20E6FBD0E0D0AFF5AFE5AE20E6FB53AEFDE513
|
||||
:20556B00AE20E7FBE583B440BE75C90B80FEC007C006C005C004C00312550DAC82AD83AE36
|
||||
:20558B00F0FF8E03C003C004C00590FDA21245B715811581158175D6FF75A80075C70390FF
|
||||
:2055AB00FDA2E473D003D004D005D006D00722C007C00675A80075B800759A0075C7007508
|
||||
:2055CB00BE00E5BE30E5FB75C679E5BE30E6FB7F007E00000EBE80FB0FBF80F575C639E507
|
||||
:2055EB00C620E6FB75C63875BE04D006D0072243B404E5B4540C600280F8E5BC65BDF58258
|
||||
:20560B00221255FAC0821255FAC0821255FAC0821255FAD083D0F0D0E022C0008582BC7833
|
||||
:07562B0061E2F5BCD0002292
|
||||
:20750800534E20257325303278253032780025303278253032780A00253032582530325846
|
||||
:017528000062
|
||||
:20563200E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB1B
|
||||
:20565200004380040022C007C083C082858107C004C003C002C001C00074F42581F886831D
|
||||
:2056720018868218860018E0A36013B4250B7C007A00E0A36008B4251612593A80E9D000BA
|
||||
:20569200D001D002D003D004D082D083D00722B4630518E61880E2FB4420B46D3AEB542063
|
||||
:2056B20003F9C083C0821258D67C0874FF2C93C083C082FAC47B02540F29905969931259C5
|
||||
:2056D2003AEADBF3D082D083DC06D082D0838097743A12593A80D4EBB42A09BA009B740140
|
||||
:2056F2004CFC808EB43007BA0004740680F2FB24D0501224F6400E240AFB740A8AF0A42B04
|
||||
:20571200FA740480DBBB6C0DEC54086004741080CF740880CBBB733CEC5408C083C0827089
|
||||
:20573200051258DD80031258D6EC54047009E0A3609812593A80F7BA0002808EE0A3600A3D
|
||||
:2057520012593ADAF7808302582A742012593ADAF90256DCEB4420B478EDC083C0821258A3
|
||||
:20577200F3C083C082E5F023F90324FF2582F582E5833400F583E054F0701119E0700D1922
|
||||
:205792001582E582B4FF021583D5F0EAB9000109EC5420600B09EC54026005742D12593A79
|
||||
:2057B200EC54046018EAC39940136011FAEC5402C4032420F582E58212593ADAF9EC542014
|
||||
:2057D200600B19EC54027005742D12593AEB542003FAD082D083E904C313FC142582F58244
|
||||
:2057F200E5833400F583E954016005E079018005E07902FBC4540F2AC083C08290596993F0
|
||||
:20581200D082D08312593AEBD9EB1582E582B4FF021583DCDB0256DCBB640674204CFC80C6
|
||||
:2058320008BB75028003025679C083C0821258F3C0F07408C395F0244FF9E434FCFBE0A374
|
||||
:2058520012592FF0A312592FD5F0F312592FF5F0EC54206028E5F054807006EC54DFFC8096
|
||||
:205872001CD0F0C0F07408C395F0244FF582E434FCF583C3E0F9E499F0A3D5F0F775F00A79
|
||||
:20589200E4F0A3D5F0FBD0E0C403FB90FC5775F00AE0F9540F24FBE950022403F954F024DD
|
||||
:2058B200B0E950022430F0A3D5F0E690FC4FC375F012E033F0A3D5F0F9DBD090FC5775F0ED
|
||||
:2058D2000A02577386831886821822E61860F5648060F164C0600585938380EA7583FF80F0
|
||||
:2058F200E5EC5401701F88F07583FFEC5418600A5410600418181818181818888218E5F049
|
||||
:20591200C398F5F022EC5418600E5410600575F00880B175F00480AC75F00280A7C583CBB0
|
||||
:20593200C583C582C9C58222C083C082C001C0008F00868218868318181818860118860051
|
||||
:2059520012595ED000D001D082D08322C082C0838500828501832230313233343536373879
|
||||
:205972003941424344454630313233343536373839616263646566C007C006C005C004FFD0
|
||||
:20599200BF0A0675820D1242E38F821242E3D004D005D006D00722C007C001C000A20B92A4
|
||||
:2059B2001EE58124FAFF200B031242F7C007E58124F9F8E6C0E008E6C0E0E4C0E0C0E090B1
|
||||
:2059D2005989125658E58124FBF581201E0312430CD000D001D00722C007C006C005C004C6
|
||||
:2059F200C003C001AC82FF8C018F0487060987071974012EFBE43FFDA70309A7058E828FCB
|
||||
:205A120083ECF0D001D003D004D005D006D00722C007C006C005C001C000E58124F6FFE5C2
|
||||
:205A32008124F8FE7D00C007E58124F5F8E6C0E008E6C0E0C006C0059059EA125658E58166
|
||||
:195A520024FBF58124F8F88682088683E4F0D000D001D005D006D0072260
|
||||
:0200F800C21F25
|
||||
:205A6B00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBDE
|
||||
:205A8B00004380040022C007AF82E58620E0FB53807F008F82125C3F00E58620E0FB43807B
|
||||
:205AAB0080D0072253BEFC32AE82AF838E828F83E493FD74012EFBE43FFCEDFA60525390F2
|
||||
:205ACB00FD008B828C83E493FD0BBB00010CE58620E0FB53807F008D82125C3F00E586205C
|
||||
:205AEB00E0FB438080EA14FDED6015E58620E0FB8B828C83E493F5C1A3AB82AC831D80E8ED
|
||||
:205B0B008B068C07E58620E0FB0043900200809C22301F0122D21F758201125BB843900288
|
||||
:205B2B005380BF43F42875C20075C5317586009000FDE4F5F01249694390049000FDE4F575
|
||||
:205B4B00F01249692090FD907529125AB35390FD00E58620E0FB53807F00758204125C3F4C
|
||||
:205B6B0000E58620E0FB4380803090FDE58620E0FB0043900200907535125AB35390FD0040
|
||||
:205B8B00E58620E0FB53807F00758282125C3F00E58620E0FB43808090FC61E0FFF582121E
|
||||
:205BAB005C3FE58620E0FB004390020022E582601690F953E054F0600122438FC143FDC1EE
|
||||
:205BCB0043F62E43FE2E2253F4D790F953E0FF54F0600B53807E5390D100D2860022538FD9
|
||||
:205BEB003A53FD3A53F6D153FED122201F01229075C1125AB3758200125BB8C21F22125BA5
|
||||
:205C0B001C5390FD003020067E137F0080047E107F00E58620E0FB53807F008E82125C3F11
|
||||
:205C2B0000E58620E0FB438080E58620E0FB004390020022C007AF82E58620E0FB8FC1D0D5
|
||||
:205C4B0007227EFF7FFF74CEC0E07475C0E01259A9158115819075CBC007C006125AB3D01E
|
||||
:205C6B0006D00720902F900032E4F5F0C007C0061249D81255BA75820F124C25D006D007BB
|
||||
:205C8B0090FAB2E0FCA3E0FDC3EC9EED9F50D48C068D0780CE7423C0E08E828F8312482D10
|
||||
:205CAB0015817404C0E0124376AC82AD83158190F0E9ECF0EDA3F0758201121776125BF6AD
|
||||
:135CCB0012195474E0C0E07475C0E01259A9158115812268
|
||||
:20752900050107000900040607070F0002008F046180012802302902501702820802602292
|
||||
:20754900102001010103040906060A040419030409102101010103840986460A844419031A
|
||||
:207569004409102201010143040986460A84441983040910250A0A0102140D141401000053
|
||||
:207589000000000010264A4A0182540D54540100000000000010270A0A0102140D141401F3
|
||||
:2075A900000000000000102401810183840986460A844419030409000282000501020000A8
|
||||
:2075C90000000112005570646174696E6720646973706C61790A0055706461746520636FDE
|
||||
:0875E9006D706C6574650A0009
|
||||
:205CDE00AE82AF837C007D007B10EF235401FAEE2EFEEF33FFEC2CFCED33FDEA600343045F
|
||||
:205CFE00017862C3E2F5F0EC95F008E2F5F0ED95F040117862D3E29CF4B3FCB308E29DF422
|
||||
:0B5D1E00FD430601DBC48E828F832250
|
||||
:205D2900AC82AD83AEF0FF33E433FB6013C3E49CF556E49DF557E49EF558E49FF559800824
|
||||
:205D49008C568D578E588F59AC56AD57AE58AF597867E233E433FA60207864E2D3F4340054
|
||||
:205D6900F55608E2F43400F55708E2F43400F55808E2F43400F55980117864E2F55608E22E
|
||||
:205D8900F55708E2F55808E2F559786CE556F2E55708F2E55808F2E55908F28C828D838EDD
|
||||
:205DA900F0EFC003C002125DFD7868C0E0E582F2E58308F2E5F008F2D0E008F2D002D003B1
|
||||
:205DC900EA6B60207868E2D3F43400FA08E2F43400FB08E2F43400FE08E2F434008A828B68
|
||||
:145DE900838EF0227868E2F58208E2F58308E2F5F008E2220D
|
||||
:205DFD00AF82AE83ADF0FC7870EFF2EE08F2ED08F2EC08F27A007B007E007F007D20787393
|
||||
:205E1D00E2235401FC7870E225E0F208E233F208E233F208E233F2EA2AFAEB33FBEE33FEDB
|
||||
:205E3D00EF33FFEC6003430201786CC3E2F5F0EA95F008E2F5F0EB95F008E2F5F0EE95F031
|
||||
:205E5D0008E2F5F0EF95F04022786CD3E29AF4B3FAB308E29BF4B3FBB308E29EF4B3FEB33F
|
||||
:1D5E7D0008E29FF4FF7870E24401F2DD917870E2F58208E2F58308E2F5F008E2229F
|
||||
:0600B200E478FFF6D8FD22
|
||||
:200090007924E94400601B7A019075F178627593FCE493F2A308B800020593D9F4DAF27548
|
||||
:0200B00093FFBC
|
||||
:1B5E9A0020F71130F6138883A88220F509F6A8837583002280FEF280F5F02207
|
||||
:205EB500AA83AB828BF090F075E0A4F8A9F08AF0E0A429F98BF0A3E0A429F583888222223D
|
||||
:205ED500AF82AE83ADF0FC787BEFF2EE08F2ED08F2EC08F2787BE2FF7879E28FF0A4FFADB3
|
||||
:205EF500F07881EFF208EDF2787BE2FF7877E28FF0A4FFADF0787FEFF208EDF27882E2FFDE
|
||||
:205F1500787EE2FE7877E28EF0A42FFF7882F2787DE2FE7878E28EF0A42F7882F27881E2CA
|
||||
:205F3500FE08E2FF787DE2FD7877E28DF0A4ABF02EFEEB3FFF7881EEF208EFF2787CE2FD1A
|
||||
:205F55007878E28DF0A4ABF02EFEEB3FFF7881EEF208EFF2787CE2FF7879E28FF0A4787EC6
|
||||
:205F7500F2787CE2FF7877E28FF0A4FFADF0787CEFF208EDF2787BE2FF787AE28FF0A478B6
|
||||
:205F95007AF2787BE2FF7878E28FF0A4FFADF07878EFF208EDF27877E4F2787BF2787FE2E0
|
||||
:205FB500F55A08E2F55B08E2F55C08E2F55D787BE2FA08E2FB08E2FE08E2FFEA255AF55A8F
|
||||
:205FD500EB355BF55BEE355CF55CEF355DF55D787FE55AF208E55BF208E55CF208E55DF265
|
||||
:205FF500787FE208E208E208E27877E2FC08E2FD08E2FE08E2FFEC255AFCED355BFDEE356C
|
||||
:0C6015005CFEEF355D8C828D838EF022E6
|
||||
:20602100AE82AF837D007C007884E2235401FB70357883E225E0F208E233F27883C3E2F596
|
||||
:20604100F0EE95F008E2F5F0EF95F050147883E2F5F008E2C313C5F01318F2C5F008F280B2
|
||||
:20606100050C8C0580C27883C3E2F5F0EE95F008E2F5F0EF95F0400E7883D3E29EF4B3FEBF
|
||||
:20608100B308E29FF4FF7883E2F5F008E2C313C5F01318F2C5F008F28D041DEC70C88E82EB
|
||||
:0360A1008F8322C8
|
||||
:2060A400AD82AE83AFF07888E2F5F008E245F07004900000227888E2FB08E2FC1BBBFF0138
|
||||
:2060C4001CEB4C6069C003C0048D5A8E5B8F5C855A82855B83855CF0126223FA7885E2F564
|
||||
:2060E4005D08E2F55E08E2F55F855D82855E83855FF0126223FCEAB504028006D004D003C1
|
||||
:20610400802C7401255AFAE4355BFBAC5C8A058B068C077401255DFAE4355EFBAC5F78854C
|
||||
:20612400EAF2EB08F2EC08F2D004D003808E8D828E838FF0126223FD7F007885E2FB08E289
|
||||
:1A614400FC08E2FE8B828C838EF0126223FB7E00EDC39BF582EF9EF58322CA
|
||||
:20615E00AE82E583FF33E433FD6009C3E49EFBE49FFC80048E038F04788BE233E433FF60E5
|
||||
:20617E0010788AE2D3F43400FA08E2F43400FE8007788AE2FA08E2FE7862EAF2EE08F28B92
|
||||
:20619E00828C83C007C005125CDEAC82AE83D005D007EF6D600AC3E49CF582E49EF58322D1
|
||||
:0561BE008C828E83229B
|
||||
:2000B800788CE84400600A79007593F0E4F309D8FC78D6E8440B600C790C90F08CE4F0A370
|
||||
:0400D800D8FCD9FA7D
|
||||
:0F008100E47375816412623FE582600302007EC2
|
||||
:2061C300758911758800758B00758D0020B0FD20B0FA20B0F720B0F420B0F130B0FDD28E8E
|
||||
:2061E30020B0FD30B0FD20B0FD30B0FDC28EE58D25E0FFE58B2354014FF58DE58D25E0FF53
|
||||
:20620300E58B232354014FF58DE58DF4F58DE58D04F58D858D8B7589217587807598522206
|
||||
:1C62230020F71430F6148883A88220F507E6A88375830022E280F7E49322E0228A
|
||||
:04623F007582002242
|
||||
:00000001FF
|
||||
Binary file not shown.
@@ -1,996 +0,0 @@
|
||||
:040000000200833245
|
||||
:01000B0032C2
|
||||
:0100130032BA
|
||||
:01001B0032B2
|
||||
:0100230032AA
|
||||
:03002B00024A4343
|
||||
:01003300329A
|
||||
:01003B003292
|
||||
:0300430002500563
|
||||
:03004B0002496007
|
||||
:01005300327A
|
||||
:01005B003272
|
||||
:01006300326A
|
||||
:01006B003262
|
||||
:01007300325A
|
||||
:03007B00025B4CD9
|
||||
:0300FA0002007E83
|
||||
:03007E0002050672
|
||||
:2000FD00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBA6
|
||||
:20011D00004380040022AF8290F090E4F090F091F08F061FEE60767E0090F95AE0FDBD024E
|
||||
:20013D000BEE9062AF93FDBDC800405990F95AE0FDBD010BEE9062AF93FDBDC8005046EEA9
|
||||
:20015D0024AFFCE43462FD8C828D83E493F582C007C006C005C004121C5EE582D004D0057E
|
||||
:20017D00D006D007601F90F090E0FB90F0BFE0FAC3EB9A501090F090EAF08C828D83E4930B
|
||||
:20019D00FC90F091F00EBE0C005086808C90F091E0FFE06013BFC800400890F95A7402F030
|
||||
:2001BD00800690F95A7401F090F091E0F5822290F0EDE0FEA3E0FFC3742C9E74019F40099F
|
||||
:2001DD0090F0E3E0700330015E300A0920020690F0C6E0700930031E90F0C7E0601890FC37
|
||||
:2001FD0063E0FFBFFF02800B7824E4F28F821227818003123CFA121E2AAD82AE83AFF09064
|
||||
:20021D00F092EDF0EEA3F0EFA3F0ED4E602D90F0EDE4F0A3F010010090F0E3E06002D2013A
|
||||
:20023D0090F0E3E4F08014121F15AD82AE83AFF090F092EDF0EEA3F0EFA3F01218BE90F037
|
||||
:20025D0092E0FDA3E0FEA3E0FFED4E700990F0E1E4F0A3F08059740F2DFAE43EFB8F048AD6
|
||||
:20027D00828B838CF012628FFAA312628FFB90F0E1EAF0EBA3F0740D2DFAE43EFB8F048A1C
|
||||
:20029D00828B838CF012628F60168D828E838FF0123156E582701890F0E1E4F0A3F0800F3E
|
||||
:2002BD0074C0C0E07462C0E0125A4615811581121909AE82AF8390F0EDE0FCA3E0FD90F01A
|
||||
:2002DD00EDEE2CF0EF3DA3F0BE580CBF020990F0C5E06003C2002290FA5BE0600E90FA5BDB
|
||||
:2002FD00E4F0900064E4F5F002180990F0E1E0FEA3E0FF4E603BEF30E71F8E048F055305E0
|
||||
:20031D007F7877ECF2ED08F2E408F208F29003E8E4F5F0125F410218097877EEF2EF08F2E4
|
||||
:20033D00E408F208F290EA60E4F5F0125F41021809121909AE82AF837877EEF2EF08F2E41E
|
||||
:20035D0008F208F29003E8E4F5F0125F4102180990F0CEE0FF600D8F82121C5EE58290F94C
|
||||
:20037D0059F0800C758202120123E58290F959F090F959E0700920030690F0C7E0701430E4
|
||||
:20039D000A0920020690F0C6E0700890F0E4E0FFBF233690FC63E0FFBFFF02801A758202EB
|
||||
:2003BD00123E9AE582702290FC63E0FF7824E4F28F82122781801290F0E4E0FFBF2300403B
|
||||
:2003DD0005123E3B8003123DF890F959E0604890F0E4E4F090F0CEE0700F7582041217C46F
|
||||
:2003FD001214C77582041217FD90F0E374FDF09000281217A1121909AE82AF837877EEF227
|
||||
:20041D00EF08F2E408F208F29003E8E4F5F0125F41121809D20022758201121884AC82AD60
|
||||
:20043D0083AEF0FF7877ECF2ED08F2EE08F2EF08F29003E8E4F5F0125F41021809E582FF7B
|
||||
:20045D0024FA50030204EEEF2F2F90046B7302495C02047D0204940204C40204EE0204D003
|
||||
:20047D0074CBC0E07462C0E0125A4615811581C20090F959E4F02290F959E0FE74D8C0E0E6
|
||||
:20049D007462C0E0125A4615811581758204C0061217C41213811214C77582041217FDD0B9
|
||||
:2004BD000690F959EEF022123A19900000E4F5F002180974E8C0E07462C0E0125A4615819C
|
||||
:2004DD0015817582041217C412276D7582040217FD7E00C007C00674F8C0E07462C0E0122B
|
||||
:2004FD005A46E58124FCF581227582011217C475820F124C9E90FAB2E0FEA3E0FF7423C047
|
||||
:20051D00E08E828F831248A615817404C0E01243EFAC82AD83158190F0E5ECF0EDA3F09085
|
||||
:20053D0062BBE493C0E0740193C0E09062BDE493C0E0740193C0E0740293C0E0740AC0E08D
|
||||
:20055D007463C0E0125A46E58124F9F58112531B1219A212195A90F0E374FCF0AEBE530602
|
||||
:20057D00187F00BE1009BF000690F0E374FEF0301B0C123E94900000E4F5F01218097436F5
|
||||
:20059D00C0E074FCC0E0E4C0E07439C0E07463C0E0125A46E58124FBF58112374E900190E1
|
||||
:2005BD00E4F5F01218097582041217C41213F312373590F0C2E060117441C0E07463C0E045
|
||||
:2005DD00125A4615811581801B7452C0E07463C0E0125A4615811581123AC8902710E4F516
|
||||
:2005FD00F012180990F959E0FFE0601F8F82121C5EE5827025745FC0E07463C0E0125A4666
|
||||
:20061D001581158190F959E4F0800F747DC0E07463C0E0125A461581158190F959E0700331
|
||||
:20063D0012036D90F959E06007123CFAD2008005123DF8C2007582041217C41214C7300045
|
||||
:20065D00067E287F0080047E587F028E828F831217A130000A7C887D137E007F0080087CBC
|
||||
:1E067D00C07DD47E017F008C828D838EF0EF1218093000051201CC80F812036D80F311
|
||||
:2062AF00C864C965CA66CB67CC68CD6910008F63804E6F207570646174650A00434D445F8A
|
||||
:2062CF00444F5F5343414E0A0052657365742073657474696E67730A0045726173696E6727
|
||||
:2062EF0020696D616765730A00436D6420307825782069676E6F7265640A000A2573204F53
|
||||
:20630F0045504C2076253034782C20636F6D70696C656420417567202037203230323420A1
|
||||
:20632F0030393A32353A33320A004D41432025730A00446F696E67206661737420626F6FE9
|
||||
:20634F00740A004E6F726D616C20626F6F740A004E6F20415020666F756E64206F6E20732F
|
||||
:20636F0061766564206368616E6E656C0A004E6F207361766564206368616E6E656C0A0078
|
||||
:09638F004368726F6D6132390040
|
||||
:017671000117
|
||||
:20069B00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB02
|
||||
:2006BB00004380040022AC82AD83AEF0FF00C2A00075820312435C8E8212435C8D82124309
|
||||
:2006DB005C8C8202435CC007C006C005C004C003C002C001C000AC82AD83AEF0FFE5812453
|
||||
:2006FB00F5F8860208860300C2A00075820312435C8E8212435C8D8212435C8C8212435C8C
|
||||
:20071B008A068B07E58124F3F886040886058C028D031CBCFF011DEA4B6015758200124301
|
||||
:20073B005CAB828E828F83EBF0A3AE82AF8380DE00D2A000D000D001D002D003D004D00554
|
||||
:20075B00D006D00722AF8200C2A0008F8212435C00D2A0002200C2A00075820512435C7542
|
||||
:20077B00820012435CE58220E0F500D2A00022AC82AD83AEF0FF7803E2FA08E2FBC007C07D
|
||||
:20079B0006C005C004C003C002120770758206120760D002D003D004D005D006D00700C26E
|
||||
:2007BB00A00075820212435C8E8212435C8D8212435C8C8212435C8A068B077805E2FC080F
|
||||
:2007DB00E2FD8C028D031CBCFF011DEA4B60128E828F83E0FBA3AE82AF838B8212435C8025
|
||||
:2007FB00E100D2A000221207707582B9120760C20C227582AB12076075F034D5F0FDD20C73
|
||||
:20081B0022C007C006C005C004C003C002C001C000C082C083C0F0C0E005810581E5812414
|
||||
:20083B00EFF88605088604E58124EDF8E608467003020915C005C004E58124F9F8860208CF
|
||||
:20085B007B00E58124FDF8E4C39AF674019B08F6E58124FDF8E58124EBF9C3E79609E70819
|
||||
:20087B0096D004D005500EE58124EDF8A98119E6F708E609F77803EDF2EC08F2A881187949
|
||||
:20089B0005E6F308E609F3E58124FBF886820886830886F008E6C007C006C005C004C0039A
|
||||
:2008BB00C002C001C000C02512078AD025D000D001D002D003D004D005D006D007A8811880
|
||||
:2008DB008602088603E4FEFFE58124FBF8EA26F6EB0836F6EE0836F6EF0836F6A88118E6F5
|
||||
:2008FB002DFD08E63CFCE58124EDF8A98119E6C397F608E60997F6020842E58124FAF581DB
|
||||
:20091B00D000D001D002D003D004D005D006D00722C007C006C005C004C003C002C001C0E2
|
||||
:20093B0000C082C083C0F0C0E0E58124FDF88602088603EA7005EB540F6006758200020A19
|
||||
:20095B002FE58124F1F8E608467003020A2C758206C007C006C005C004C003C002C001C0E2
|
||||
:20097B0000C025120760D025D000D001D002D003D004D005D006D00700C2A000E58124F190
|
||||
:20099B00F8860208860375822012435CE58124FDF80808868212435CE58124FDF80886828C
|
||||
:2009BB0012435CE58124FDF8868212435C00D2A000C007C006C005C004C003C002C001C0A5
|
||||
:2009DB0000C025120770D025D000D001D002D003D004D005D006D0077401C0E09010001236
|
||||
:2009FB0043EFAC82AD83AEF0FF1581E58124FDF8EC26F6ED0836F6EE0836F6EF0836F61A12
|
||||
:200A1B00BAFF011BE58124F1F8A60208A60302095C758201E58124FCF581D000D001D0024C
|
||||
:0B0A3B00D003D004D005D006D0072265
|
||||
:200A4600E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB53
|
||||
:200A6600004380040022C007C006C005C004AF82AE83ADF0FC90F0BBEFF0EEA3F0EDA3F05B
|
||||
:200A8600ECA3F0C202C203D208758204C007C006C005C004C003C002C001C000C025121749
|
||||
:200AA600C4D025D000D001D002D003D004D005D006D00790F0BBE0FCA3E0FDA3E0FEA3E040
|
||||
:200AC600FF7416C0E0E4C0E074F3C0E074F0C0E08C828D838EF0EF1206E1E58124FCF581D8
|
||||
:200AE60090F0BBE0FCA3E0FDA3E0FEA3E0FF90F0BB74162CF0E43DA3F0E43EA3F0E43FA346
|
||||
:200B0600F090F103E0FFBF2004C207806A90F103E0FFBF2104D207805E90F103E0FF7E0007
|
||||
:200B2600C007C0067480C0E07469C0E0125A46E58124FCF58190FA6E7416F0E4A3F090F0FA
|
||||
:200B4600F375F000C007C006C005C004C003C002C001C000C025121B11D025758204C02523
|
||||
:200B66001217FDD025D000D001D002D003D004D005D006D0078051C221C007C006C005C0F2
|
||||
:200B860004C003C002C001C000C025125C75D025C025120BD7D025D221C025125C75D0250A
|
||||
:200BA600C025120BD7D025758204C0251217FDD025C025125CB9D025D000D001D002D0031F
|
||||
:200BC600D004D005D006D007D004D005D006D007227F807E0090F0ABE4F0A3F090F0A5F01D
|
||||
:200BE600A3F05390FD007D00200803020C6A30211D20071A74A0C0E07404C0E0E4C0E090CD
|
||||
:200C0600F0F3124598158115811581020CBAC00590F0BBE0FAA3E0FBA3E0FCA3E0FD74A007
|
||||
:200C2600C0E07404C0E074F3C0E074F0C0E08A828B838CF0ED1206E1E58124FCF58190F0F3
|
||||
:200C4600BBE0FAA3E0FBA3E0FCA3E0FD90F0BB74A02AF074043BA3F0E43CA3F0E43DA3F066
|
||||
:200C6600D005805074A0C0E07404C0E0E4C0E090F0F31245981581158115817B4A7C00C054
|
||||
:200C860007C006C005C004C0037807E2F58208E2F583120081D003D004D005D006D00790AF
|
||||
:200CA600F0A5E02401F0A3E03400F01BBBFF011CEB4C70CB7B007C00EF60503021238E02FF
|
||||
:200CC600EA2AFEEB24F3F582EC34F0F583E0FAEF5A7003430601EF30E02B8E82125CAB8048
|
||||
:200CE600248E02EA2A25E0FEEB24F3F582EC34F0F583E0FAEF5A6003430603EF5411600597
|
||||
:200D06008E82125CABEFC313FF80AD7F800BBB00010CC3EB94A0EC9404409D90F0ABE0FB98
|
||||
:200D2600A3E0FC744A2BFBE43CFC90F0ABEBF0ECA3F00DBD04005003020BEEE58620E0FB27
|
||||
:200D4600004390020022AE82AF83C202C203C208D207C2217807EEF2EF08F2125C75120BDD
|
||||
:200D6600D7D221125C75120BD7025CB9C007C006C005C004C003C002C001C000AD82AE8339
|
||||
:200D8600AFF0A204202101B3505090F09FE0F508A3E0F50974012DFAE43EFB8F048A828B13
|
||||
:200DA600838CF012628FFA780CF2E408F2850882850983C007C006C005C004C003C002C062
|
||||
:200DC60001C000121003E582D000D001D002D003D004D005D006D0076003020FA98D828E6A
|
||||
:200DE600838FF0780912628FF290F0A1E0F508A3E0F5097809E2F50A750B00780EE50AF2AD
|
||||
:200E0600E50B08F2850882850983C007C006C005C004C003C002C001C00012107AD000D06A
|
||||
:200E260001D002D003D00490F0ADE0F508A3E0F50990F0B1E0FBA3E0FCEBC39508F582EC6E
|
||||
:200E46009509F5837875E50AF2E50B08F2C002C001C000125F21AB82AC83D000D001D0021A
|
||||
:200E6600D005D006D007ECC423CBC423541F6BCB541FCB6BCBFC90F0B7EBF0ECA3F0740245
|
||||
:200E86002BFBE43CFCEB2DFDEC3EFE90F0A7E0FBA3E0FCEB5407700A7809E2540770030259
|
||||
:200EA6000F5D5303078BF005F07B80E4FC3392D28008A2D2EC13FCEB13FBD5F0F5780AEB6A
|
||||
:200EC600F2780B7480F28D828E838FF012628FFA74012DF50CE43EF50D8F0E7809E2F50A4F
|
||||
:200EE600AC0A150AEC7003020FA9780BE25A6025C00290F0B5E0FAA3E0FCEA24F3FAEC344F
|
||||
:200F0600F0FC8A828C83E0FB780AE242038A828C83EBF0D002780BE2C313F2780BE270195D
|
||||
:200F2600850C82850D83850EF012628FFAA385820C85830D780B7480F2780AE2C313F2782B
|
||||
:200F46000AE2709C780A7480F290F0B5E02401F0A3E03400F080897809E2604790F0B5E032
|
||||
:200F6600FBA3E0FCEB24F3FBEC34F0FC8B828C83E0F50C8D828E838FF012628FFAA3AD827D
|
||||
:200F8600AE83E50C42028B828C83EAF090F0B5E02401F0A3E03400F07809E2FC780924F822
|
||||
:200FA600F280B4D000D001D002D003D004D005D006D0072290F0A7E0FEA3E0C423CEC42323
|
||||
:200FC600541F6ECE541FCE6ECE30E40244E0FF90F0ABE0FCA3E0FD90F0B1E0FAA3E0FBEAAC
|
||||
:200FE600C39CFCEB9DC454F0CCC4CC6CCC54F0CC6CFD90F0B5EC2EF0ED3FA3F022AE82AFF4
|
||||
:201006008390F095EEF0EFA3F090F0AFEEF0EFA3F07427C39EFE74019FFF90F0A9EEF0EF40
|
||||
:20102600A3F090F0A5E0FCA3E0FD90F0B1ECF0EDA3F0C3EE9CEF64808DF063F08095F040D4
|
||||
:201046002F780CE22CFC08E23DFDC3EE9CEF9D501F780CD3E29EF4B3FEB308E29FF4FF0EA8
|
||||
:20106600BE00010F90F0ADEEF0EFA3F07582002275820122AE82AF8390F0A7EEF0EFA3F0F3
|
||||
:20108600780E90F097E22EF008E23FA3F0120FBA75820022C007C006C005C004C003C00262
|
||||
:2010A600C001C000AC82AD83AEF0FF058105810581BF2000502C8F82C007C006C005C0049A
|
||||
:2010C600C003C002C001C000C0251242A7D025D000D001D002D003D004D005D006D0070291
|
||||
:2010E60013447E00EF24E0FFEE34FFFEEF2FFFEE33FEEF2498F582EE3463F583E493FEA391
|
||||
:20110600E493FF90F0B7EEF0EFA3F0EFC4540FFE90F0B3F0300507EE2EFE90F0B3F090F08C
|
||||
:2011260099E0FEA3E0FF90F0B9EEF0EFA3F090F0B3E0FDFB3395E0FC0BBB00010CEB2EFB81
|
||||
:20114600EC3FFC90F099EBF0ECA3F0A204202101B3504190F0B9E0FEA3E0FF780CEDF2EDDA
|
||||
:201166003395E008F28E828F83C007C006C005C004C003C002C001C000C025121003E58218
|
||||
:20118600D025D000D001D002D003D004D005D006D007600302134490F09BE0FEA3E0FF90F1
|
||||
:2011A600F0B4E0FD780EF2ED3395E008F28E828F83C007C006C005C004C003C002C001C063
|
||||
:2011C60000C02512107AD025D000D001D002D003D004D005D006D00790F0B7E0FEA3E0FF60
|
||||
:2011E60053070F90F0B7EEF0EFA3F0A8811818760008768090F0A7E0FCA3E05304078CF0BC
|
||||
:2012060005F07C80E4FD3392D28008A2D2ED13FDEC13FCD5F0F5A881A60490F0B3E0FD903E
|
||||
:20122600F0ADE0FAA3E0FB90F0A5E0FCA3E0FFECC39AFAEF9BFBED3395E0FFEDC39AFAEFA1
|
||||
:201246009BFB1ABAFF011B90F0B9EAF0EBA3F030050FEBC313CA13CAFB90F0B9EAF0EBA32A
|
||||
:20126600F090F0B9E0FEA3E0FF90F0B7E0FCA3E0FD90F0B7EE2CF0EF3DA3F090F0B7E0FE37
|
||||
:20128600A3E0FFEE2EFEEF33FFEE2458F582EF3464F583E493FEA3E493FF90F0B9E4F0A36D
|
||||
:2012A600F090F0B9E0FCA3E0FD90F0B4E0FB3395E0FAC3EC9BED9A4003021344A88118182C
|
||||
:2012C600E65EFC08E65FFD4C602190F0B5E0FCA3E0FDEC24F3FCED34F0FD8C828D83E0FB1A
|
||||
:2012E600A881E642038C828D83EBF030051A90F0B9E0FCA3E0FDEC30E01AA88118E618C39F
|
||||
:2013060013C613C608F6800CA88118E618C313C613C608F6A881E6C313F6A881E6701090DF
|
||||
:20132600F0B5E02401F0A3E03400F0A881768090F0B9E02401F0A3E03400F00212A7158121
|
||||
:1513460015811581D000D001D002D003D004D005D006D00722A8
|
||||
:206398000070071008500D9016601CA026A03010316037603D7044904D204F605520578020
|
||||
:2063B8005F7066706D6073507880805085708C7093709A70A120A320A570AC80B470BB70B6
|
||||
:2063D800C2A0CCA0D670DD80E570EC70F370FA8002710971105115811D7124812C7133813E
|
||||
:2063F8003B7142814A7151715891617168A172A17CA186A1908198519D81A551AA81B2A1F2
|
||||
:20641800BC21BE71C571CC71D371DA71E181E971F071F741FB51007207420B9214721B724A
|
||||
:2064380022722972306236623C724362499252A25C8264A26E8276627C127D6283A28D728C
|
||||
:206458000000000000000000000000000000D87F0078000000000000007880009804E005DC
|
||||
:20647800801E9864E005801E80648004183808640842FCFF8841F040083810442044C04489
|
||||
:2064980000397002880C881088207040E0001001083A08468845C84C3838180068008001E2
|
||||
:2064B8000078E00718180C300420024002400240024004200C301818E00700100018000F1F
|
||||
:2064D8000072000F001800104000400040004000F807400040004000400019001E00800045
|
||||
:2064F800800080008000800080001800180002000C003000C0000003000C00300040C00F88
|
||||
:2065180030300840084008403030C00F082008200820F87F0800080008001860284048408D
|
||||
:2065380088400843083C0840084208420842F03DC0004003400440184020F87F40004000A3
|
||||
:20655800087C084408441042E041E00F10320844084408441042E00100401840E040004351
|
||||
:20657800004C00500060F038084508420842084590456038001E0821884088408840302154
|
||||
:20659800C01F1806180619061E06C000C0002001200110021002080420012001200120010F
|
||||
:2065B800200120012001200108041002100220012001C000C00000700040D8400041004202
|
||||
:2065D80000640038C00F30181820C84728486850D851E03F2000200008007000C001400E72
|
||||
:2065F8004018400C4003C00030000800F81F08110811081108118812700CC003300C1008FC
|
||||
:2066180008100810081008100818F81F08100810081008101008E007F81F8810881088108D
|
||||
:20663800881088100810F81F801080108010801080100010C003300C100808100810881024
|
||||
:206658008810F818F81F80008000800080008000F81F081008100810F81F08100810081025
|
||||
:206678000800081008100810F01FF81F0001800140022004200810100800F81F080008002D
|
||||
:206698000800080008000800F81F001C8007E00060008003001CF81FF81F0008000680016C
|
||||
:2066B80060001000F81FE007100808100810081008101008E007F81F801080108010801086
|
||||
:2066D8000011000EE00710080810081008100C101208E207F81F80108010C0102011100EC7
|
||||
:2066F8000800180E0812081108118810901070180010001000100010F81F001000100010C1
|
||||
:206718000010E01F18000800080008001000E01F0010000C8003600018001800E000000301
|
||||
:20673800000C00100018C0073800F0000007800370003800C0070018081010082004400277
|
||||
:206758008001800140022004100808100010000800060001F8000001000200040008001053
|
||||
:2067780018102810481088100811081208140818FE7F024002400240024000400030000C41
|
||||
:206798000003C00030000C0002000240024002400240FE7F2000C0000007001C0070000EDA
|
||||
:2067B800C0012000040004000400040004000400040004000400040000800040300048047C
|
||||
:2067D800880488049004F8030800F87F10020804080408041006E001E00110020804080443
|
||||
:2067F800080408040804E00118020804080408041002F87FE0019002880488048804880412
|
||||
:20681800880300040004F83F00240044004400440044E00119020904090409041202FC0728
|
||||
:20683800F87F00010002000400040004F803000400040064F8670100010401040164FE671F
|
||||
:20685800F87F8000C0002001200210020804004000400040F87FF807000200040004F803CD
|
||||
:20687800000200040004F803F80700030002000400040004F803E0011002080408040804D9
|
||||
:206898001002E001FF0710020804080408041006E001E00118020804080408041002FF0783
|
||||
:2068B800F8070001000200040004000718038804880448044804300400040004F01F08048D
|
||||
:2068D800080408040804F0070800080008001000F807000480036000180008003000C00067
|
||||
:2068F800000300040006E001180070008003800170001800E0010006080410022001C00098
|
||||
:20691800C00020011002080401040103C10062001C001800600080000003000408041804F1
|
||||
:20693800280448048804080508060804800080007C3F024002400240FE7F02400240024050
|
||||
:206958007C3F80008000C000000100010001800080004000400040008001F8010803080450
|
||||
:20697800080808040803F80164617461547970652030782578206E6F7420737570706F7204
|
||||
:056998007465640A00B3
|
||||
:20135B00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB35
|
||||
:20137B0000438004002290F0C17401F090F0C2E4F090F0C3F090F0C4F090F0C5F090F0C6CB
|
||||
:20139B0004F090F0C7F090F0C9E4F090F0C8F090F0CC7428F0E4A3F090F0CEF090F0CA7467
|
||||
:2013BB0028F0740AA3F090F959E4F090F95AF022AD82AE8312628FFCBC011C7BC17CF08BD3
|
||||
:2013DB00828C83740EC0E0C005C0061246301581158115810214C7227480C0E0E4C0E074DF
|
||||
:2013FB00A2C0E074FDC0E0906000E4F5F01206E1E58124FCF581740EC0E07414C0E074FE15
|
||||
:20141B00C0E090F0C112463015811581158190FDA2E0FCA3E0FDA3E0FEA3E0FFBCA513BDC7
|
||||
:20143B005A10BEBA0DBFAB0A90FDA6E0FFBF0102803590FDA2E0FCA3E0FDA3E0FEA3E0FF17
|
||||
:20145B0090FDA6E0FB7A00C004C005C006C007C003C002749DC0E07469C0E0125A46E58108
|
||||
:20147B0024F8F58102138190FDA7E090F959F090FDA8E090F95AF074CBC0E07469C0E012ED
|
||||
:20149B005A461581158112161990FDA2E4F004C0E0E4C0E074A2C0E074FDC0E0906000E45E
|
||||
:2014BB00F5F012081CE58124FCF581227480C0E0E4C0E074A2C0E074FDC0E0906000E4F530
|
||||
:2014DB00F01206E1E58124FCF58190FDA2E0FCA3E0FDA3E0FEA3E0FFBCA53EBD5A3BBEBA15
|
||||
:2014FB0038BFAB35788574C1F274F008F2E408F27888740EF2E408F290FE1475F0001261CE
|
||||
:20151B0010E5828583F045F0700F90FDA7E0FF90F959E0FEEFB506012290FE21E0FF90F0DF
|
||||
:20153B00CEE0FEEFB50602803EEE603BBE6400502390FE21E0FF7D00C007C00574DDC0E0D4
|
||||
:20155B007469C0E0125A46E58124FCF58190F0CEE4F08013BEC800400890F95A7402F080F9
|
||||
:20157B000690F95A7401F07480C0E0E4C0E0C0E090FDA2124598158115811581740EC0E048
|
||||
:20159B0074C1C0E074F0C0E090FE1412463015811581158190FDA274A5F0F4A3F074BAA3DB
|
||||
:2015BB00F0C4A3F090FDA67401F090F959E090FDA7F090F95AE090FDA8F07401C0E0E4C0AA
|
||||
:2015DB00E0906000E4F5F012092C158115817480C0E0E4C0E074A2C0E074FDC0E090600015
|
||||
:2015FB00E4F5F012081CE58124FCF58174F6C0E07469C0E0125A461581158102161990F0BF
|
||||
:20161B00C5E0FF7E00C007C0067407C0E0746AC0E0125A46E58124FCF58190F0CEE0FF7E0E
|
||||
:20163B0000C007C0067420C0E0746AC0E0125A46E58124FCF58190F0CAE0FEA3E0FFC00632
|
||||
:20165B00C0077433C0E0746AC0E0125A46E58124FCF58190F0C2E0FF7E00C007C00674474E
|
||||
:20167B00C0E0746AC0E0125A46E58124FCF58190F959E0FF7E00C007C006745CC0E0746A69
|
||||
:0C169B00C0E0125A46E58124FCF58122D3
|
||||
:20699D004C6F616465642064656661756C74732073657474696E67735665722030782578F6
|
||||
:2069BD00204D61676963203078256C780A004C6F616465642073657474696E67733A0A00C0
|
||||
:2069DD0049676E6F7265642066697865644368616E6E656C2025640A0053617665642073B0
|
||||
:2069FD00657474696E67733A0A0020205363616E2041667465722054696D656F7574202515
|
||||
:206A1D00640A00202066697865644368616E6E656C2025640A0020206261744C6F77566FC1
|
||||
:206A3D006C746167652025640A002020656E61626C6546617374426F6F742025640A0020DD
|
||||
:0D6A5D00204C6173742063682025640A00DA
|
||||
:2016A700E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBE6
|
||||
:2016C70000438004002275F10175805875FDDD75F33875904075FE6E75F4E875A00175FF76
|
||||
:2016E70001227401C0E0E4C0E0900000E4F5F012092C158115817414C0E0E4C0E0746AC011
|
||||
:20170700E0746AC0E090F0F31245F6E58124FCF5817414C0E0E4C0E074F3C0E074F0C0E0F1
|
||||
:20172700900000E4F5F012081CE58124FCF58122C00775E40075FC0075F70075FE0290F9FA
|
||||
:2017470053E0FF54F06002800DD291758F0075F60075FD008012758F8175F62F75FD8175C0
|
||||
:14176700FE2F53807E5390D075F30075F40075F500D0072209
|
||||
:146A6A005612098501084A41000000000904EC0212045A0A19
|
||||
:027FFE00706AA7
|
||||
:20177B00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB11
|
||||
:20179B00004380040022AE82AF837D00BD08005017ED75F002A424CFF58274F035F0F583D7
|
||||
:2017BB00EEF0EFA3F00D80E422E582FF30E025125657C0071249C9D2AF1216CD12435812A1
|
||||
:2017DB004E6FD00775820A124EAE90F959E0FEF582124DFAEF30E209124385200C0302089E
|
||||
:2017FB000D22E58230E206300C0302080122AF82AE83ADF0FC90F0EFEFF0EEA3F0EDA3F06A
|
||||
:20181B00ECA3F090F0EFE0FCA3E0FDA3E0FEA3E0FFC004C005C006C007747EC0E0746AC01A
|
||||
:20183B00E0125A46E58124FAF581300C16758204C007C006C005C0041217FDD004D005D0FF
|
||||
:20185B0006D007C007C006C005C004125C62D004D005D006D0071217378C828D838EF0EF69
|
||||
:20187B00124A517582010217C4E582FF601090F0E4E0FFBFFF00500690F0E4EF04F090F0D7
|
||||
:20189B00E4E0FFBF18005007900E10E4F5F022BF24005007901C20E4F5F02290518075F0EC
|
||||
:2018BB0001E42290F0E0E07875F2E408F2900230125F217862740EF2E408F2125D4AAE82A0
|
||||
:2018DB00AF8374282EFEE43FFF90F0DFE054077D0025E0FCED33FDEC24CFF582ED34F0F540
|
||||
:2018FB0083EEF0EFA3F090F0DFE02401F0227E007F007D00BD0800501DED75F002A424CFDD
|
||||
:20191B00F58274F035F0F583E0FBA3E0FCEB2EFEEC3FFF0D80DEEFC423CEC423541F6ECEF4
|
||||
:20193B00541FCE6ECEFF90F0CCE0FCA3E0FDC3EE9CEF9D50058C828D83228E828F83229026
|
||||
:20195B00FAB4E0FF3395E0FEC007C0067493C0E0746AC0E0125A46E58124FCF58190F0BF9A
|
||||
:20197B00E0FF7E0090F0C0E0FD3395E0FCC007C006C005C004749EC0E0746AC0E0125A4636
|
||||
:20199B00E58124FAF5812275820E124C9E124CCA75820F124C9E90FAB2E0FEA3E0FF7423B2
|
||||
:2019BB00C0E08E828F831248A615817404C0E01243EFAC82AD83158190F0EBECF0EDA3F09D
|
||||
:2019DB00C20A90F0CAE0FEA3E0FFC3EC9EED9F5004D20A803A90F0E7E0FCA3E0FD4C601331
|
||||
:2019FB00C3EC9EED9F500C90F0EBECF0EDA3F0D20A801C90F0E9E0FCA3E0FD4C6011C3EC27
|
||||
:201A1B009EED9F500A90F0EBECF0EDA3F0D20A90F0E9E0C0E0A3E0C0E090F0E7E0C0E0A3EE
|
||||
:201A3B00E0C0E090F0EBE0C0E0A3E0C0E090F0E5E0C0E0A3E0C0E074AFC0E0746AC0E012A2
|
||||
:091A5B005A46E58124F6F58122CA
|
||||
:206A7E00536C656570696E6720666F7220256C64206D730A0054656D7020256420430A008F
|
||||
:206A9E00525353492025642C204C51492025640A00426174745620426F6F742025642C207F
|
||||
:1A6ABE006E6F772025642C2054782025642C207570646174652025640A007E
|
||||
:0500DC00781074FFF232
|
||||
:201A6400E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB25
|
||||
:201A8400004380040022121AE0E582600790F96CE0F58222121AAAE582600790F970E0F59F
|
||||
:201AA40082227582002290F95BE05407FFBF012890F95CE003035403FFBF031C90F95CE09B
|
||||
:201AC40023235403FFBF031090F95BE023235401FFBF0104758201227582002290F95BE07B
|
||||
:201AE4005407FFBF012390F95CE003035403FFBF021790F95CE023235403FFBF030B90F9F5
|
||||
:201B04005BE020E6047582012275820022AFF0AE83E58290FA70F0EEA3F0EFA3F090FA702B
|
||||
:201B2400E0FDA3E0FEA3E0FF90FA6EE0FBA3E0FC79007A00C3E99BEA9C5052E94A6016E97B
|
||||
:201B4400540F6002800F74D8C0E0746AC0E0125A4615811581C003C004E92DF8EA3EFB8F9E
|
||||
:201B64000488828B838CF012628FF87C00C000C00474DAC0E0746AC0E0125A46E58124FC2A
|
||||
:201B8400F58109B900010AD004D00380A774D8C0E0746AC0E0125A461581158122AFF0AE79
|
||||
:201BA40083E5827812F2EE08F2EF08F27815E4F27B017811C3E2F5F0EB95F050227812E2AA
|
||||
:201BC400FA08E2FC08E2FFEB2AFAE43CFC8A828C838FF012628FFA7815E22AF20B80D37815
|
||||
:201BE40012E2FD08E2FE08E2FF8D828E838FF012628FFD7815E2B50503D38001C3E433F531
|
||||
:201C04008222AFF0AE83E5827817F2EE08F2EF08F2781AE4F27B017816C3E2F5F0EB95F027
|
||||
:201C240050227817E2FA08E2FC08E2FFEB2AFAE43CFC8A828C838FF012628FFA781AE22A94
|
||||
:201C4400F20B80D37817E2FD08E2FE08E2FF8D828E838FF0781AE2025F06E5812404F58173
|
||||
:201C6400AF82C218C007125098D0078F82124DFAC00712514DD218125098D0077E01EE2490
|
||||
:201C8400FC5003021D8890F9DB7414F0C007C00612379590F9ED74EDF090F9DB124F94D013
|
||||
:201CA40006D007124981AA82AB83ACF0FD90FA7374A62AF0740E3BA3F0E43CA3F0E43DA37C
|
||||
:201CC400F0C006124981AA82AB83ACF0FD90FA73E58124FCF8E0F6A3E008F6A3E008F6A385
|
||||
:201CE400E008F6E58124FCF8C3EA96EB0896EC0896ED0896D0064003021D84C007C0061248
|
||||
:201D040050AAAD82D006D007C374818DF063F08095F050AD90F971E0FDB507A5C007C0069A
|
||||
:201D2400121A8AAD82D006D007BDEE95C007C006121AAAE582D006D00760867408C0E074E0
|
||||
:201D440068C0E074F9C0E090F94612463015811581158190F95EE0FCA3E0FD90F94EECF05B
|
||||
:201D6400EDA3F08F047D00C004C00574E0C0E0746AC0E0125A46E58124FCF5818F82802075
|
||||
:201D84000E021C828F057E00C005C00674EAC0E0746AC0E0125A46E58124FCF581758200D3
|
||||
:201DA400E58124FCF5812290F9DB742AF012379590F9ED74E5F090F9F47482F090F0E3E0CC
|
||||
:201DC40090F9F5F090F0C0E090F9F0F090F0BFE090F9EFF090FAB4E090F9F1F090F0EBE0AE
|
||||
:201DE400FEA3E0FF90F9F2EEF0EFA3F090F9F6E4F09062BB93FE740193FF90F9F7EEF0EF9F
|
||||
:201E0400A3F090F959E090F9F9F090F0C9E090F9FAF078167415F290F9EE75F000121C0642
|
||||
:201E240090F9DB024F94D2181250981219A212195A7F00781BE4F2781BE2B40E00400302BB
|
||||
:201E44001F08C007121DABD007124981AA82AB83ACF0FD74882AF52674133BF527E43CF5DC
|
||||
:201E640028E43DF529C007124981AC82AD83AEF0FFC3EC9526ED9527EE9528EF9529D00717
|
||||
:201E84004003021EFBC0071250AAAE82D007C374818EF063F08095F050CBC007121A8AAE32
|
||||
:201EA40082D007BEE6BF78117411F290F97175F000C007121BA1E582D00760A97408C0E00B
|
||||
:201EC4007468C0E074F9C0E090F94612463015811581158190F95E75F00012628FFDA3125B
|
||||
:201EE400628FFE90F94EEDF0EEA3F090F0E0EFF090F97175F00022781BE22401F2781BE2F9
|
||||
:201F0400FF021E3B90F0E0740EF090000075F00022D2181250987F00781CE4F2781CE2B483
|
||||
:201F24000E004003021FFC90F9DB7414F090F9ED74E3F0C00712379590F9DB124F94D007C1
|
||||
:201F4400124981AA82AB83ACF0FD74882AF52A74133BF52BE43CF52CE43DF52DC0071249E1
|
||||
:201F640081AC82AD83AEF0FFC3EC952AED952BEE952CEF952DD0075072C0071250AAAE82CA
|
||||
:201F8400D007C374818EF063F08095F050CEC007121A8AAE82D007BEE6C278117411F29040
|
||||
:201FA400F97175F000C007121BA1E582D00760AC7408C0E07468C0E074F9C0E090F94612E9
|
||||
:201FC400463015811581158190F95E75F00012628FFDA312628FFE90F94EEDF0EEA3F09010
|
||||
:201FE400F0E0EFF090F97175F00022781CE22401F2781CE2FF021F2090F0E0740EF0900008
|
||||
:202004000075F00022AFF0AE83E582781DF2EE08F2EF08F2781DE22402FA08E23400FB08EE
|
||||
:20202400E2FC8A828B838CF012628FF52E852E2F75300090FA5CE0F531AE317F00E52FC35A
|
||||
:202044009EFEE5309FFF7875EEF2EF08F2900063C004C003C002125F21AE82AF83D002D0A5
|
||||
:2020640003D0048E2F8F3090FA77E52FF0E530A3F0781DE22401FD08E23400FE08E2FF8D31
|
||||
:20208400828E838FF012628FFD90F91FE0FFEDB50702800122E52E24D5500122C3E52E956B
|
||||
:2020A400315001227463252FFEE43530FFC374239E74089F500122781DE2FD08E2FE08E23B
|
||||
:2020C400FF78117466F28D828E838FF0C004C003C002121BA1E582D002D003D0047003029D
|
||||
:2020E400217D781DE22403FD08E23400FE08E28D2F8E3090FA77E0FEA3E0FFEE24F3FEEFD0
|
||||
:2021040034F0FF8E828F837463C0E0E4C0E0C02FC0301245F6E58124FCF5818A828B838CAD
|
||||
:20212400F012628FFA7F00788A7408F2E408F28A828F83C007C0021261CAAD82AE83D002CB
|
||||
:20214400D007ED2421FDEE34F9FE5302078AF005F07401800225E0D5F0FBF4FA8D828E83C7
|
||||
:20216400E052028D828E83EAF074F7C0E0746AC0E0125A46158115812274F9C0E0746AC0F9
|
||||
:20218400E0125A461581158122AF82AE83ADF0FC7820EFF2EE08F2ED08F2EC08F290FA5C4C
|
||||
:2021A400E0FB7A0090F91FE0FF7E00C003C002C007C006740AC0E0746BC0E0125A46E581FA
|
||||
:2021C40024FAF581D21812509812498185823285833385F034F53578207977E22414F308C3
|
||||
:2021E400E2340009F308E2340009F308E2340009F3900019E4F5F0125F41AA82AB83AEF079
|
||||
:20220400FFEA2532F532EB3533F533EE3534F534EF3535F535124981AA82AB83AEF0FFC33F
|
||||
:20222400EA9532EB9533EE9534EF9535503C1250AAAF82C374818FF063F08095F050D61236
|
||||
:202244001A8AAF82BFE8CE90F97175F0001220097F00EF2421FDE434F9FE8D828E83E07067
|
||||
:20226400060FBF060040EBBF06AB74D8C0E0746AC0E0125A4615811581C218125098025176
|
||||
:202284004D90F972E4F0A3F090F97175F00022742AC0E0E4C0E0C0E090F9DB1245981581BF
|
||||
:2022A4001581158190F9DB742AF090F940E0600890F9F174E4F0800690F9F174E7F0740862
|
||||
:2022C400C0E07450C0E074F9C0E090F9E91246301581158115817408C0E07446C0E074F94A
|
||||
:2022E400C0E090F9E112463015811581158190F9DCE054F84401F090F9DCE054C74440F0EC
|
||||
:2023040090F9DDE0440C54CF44C0F090F958E0FF04F090F9DEEFF090F94EE0FEA3E0FF904B
|
||||
:20232400F9DFEEF0EFA3F07DF27EF98D828E837411C0E07416C0E074F9C0E01246301581E1
|
||||
:20234400158115817DF27EF97F0078167411F28D828E838FF0121C0690F9DB024F94E58161
|
||||
:202364002404F581D21812509812514D7F00BF1E004003022445C007122293D007124981DC
|
||||
:20238400AB82AC83ADF0FE90FA7974642BF0749F3CA3F0740B3DA3F0E43EA3F0C00712503D
|
||||
:2023A400AAAE82D007C374818EF063F08095F05051C007121A8AAE82D007BEE8028028BEA7
|
||||
:2023C400E9028005BEEC33802978117403F290F97175F000C007121BA1E582D007602390CC
|
||||
:2023E400F97175F0008063122285AC82AD83AEF0805890000075F000805090000075F000E0
|
||||
:202404008048C007124981C8E58124FCC8A68208A68308A6F008F690FA79E0FAA3E0FDA342
|
||||
:20242400E0FEA3E0FFE58124FCF8C3E69A08E69D08E69E08E69FD00750030223A00F0223B0
|
||||
:2024440072122285AD82AE83AFF0E58124FCF58122741BC0E0E4C0E0C0E090F9DB1245988A
|
||||
:2024640015811581158190F9DB7419F090F9F174EAF07408C0E07450C0E074F9C0E090F9D7
|
||||
:20248400E91246301581158115817408C0E07446C0E074F9C0E090F9E11246301581158164
|
||||
:2024A400158190F9DCE054F84401F090F9DCE054C74440F090F9DDE0440C54CF44C0F090AB
|
||||
:2024C400F94EE0FEA3E0FF90F9DFEEF0EFA3F090F958E0FF04F090F9DEEFF090F9DB024FDA
|
||||
:2024E40094D2181250987F00BF1000506CC007122455D00712498185823A85833B85F03C1C
|
||||
:20250400F53D12498185823685833785F038F539E536C3953AFAE537953BFCE538953CFDD8
|
||||
:20252400E539953DFEC3EA94A6EC940EED9400EE94005022C0071250AAAE82D007C374812D
|
||||
:202544008EF063F08095F050B9C007121A8AAE82D007BEEBAD220F808F22AF82E4FDCD5429
|
||||
:2025640003A2E0CD13CD13A2E0CD13CD13CDFCEF0303543F4DFDEF030354C0FE7F0074013A
|
||||
:202584002DFDE43C8F828E838DF022AD82AE83AFF07C007B00BB0400400302261EC0048B9F
|
||||
:2025A40082C007C006C005C00312255EA882A983AAF0FCD003D005D006D0077416C0E0E49C
|
||||
:2025C400C0E074F3C0E074F0C0E0888289838AF0EC1206E1E58124FCF5817464C0E074FCF3
|
||||
:2025E400C0E090F0FB12490315811581920ED004300E218D008E018F027408C0E0C000C016
|
||||
:202604000190F0F31245C4158115811581920E50038C82220B8B040225997582FF22AF829F
|
||||
:202624005307F87E007D00BD040040030226AAC0068D82C007C00512255EAA82AB83ACF087
|
||||
:20264400FED005D0077416C0E0E4C0E074F3C0E074F0C0E08A828B838CF0EE1206E1E58130
|
||||
:2026640024FCF5817464C0E074FCC0E090F0FB124903158115819228D006302823C00690D2
|
||||
:20268400F108E0FC5304F87B008F027E00ECB50206EBB506028004D0068005D0068E822250
|
||||
:2026A4000D8D0602262B7582FF2212255EAC82AD83AEF0FF7416C0E0E4C0E074F3C0E07452
|
||||
:2026C400F0C0E08C828D838EF0EF1206E1E58124FCF58190F108E0F58222AF828F060EEE22
|
||||
:2026E40024FB50027E00EEB507038E82228E82C007C00612255EAA82AB83ACF0FDD006D03D
|
||||
:20270400077416C0E0E4C0E074F3C0E074F0C0E08A828B838CF0ED1206E1E58124FCF5817D
|
||||
:202724007464C0E074FCC0E090F0FB12490315811581922850A890F108E0FD5305F87C0024
|
||||
:20274400BD789BBC00988E822212255EAC82AD83AEF0FF7404C0E0E4C0E08C828D838EF057
|
||||
:20276400EF12092C15811581227F00BF0400500C8F82C00712274DD0070F80EF22AF828F9E
|
||||
:20278400057E00C005C0067419C0E0746BC0E0125A46E58124FCF5818F8212255E020A6CAF
|
||||
:2027A4007825E4F208F208F208F27B00BB040040030228438B82C00312255E85823E858318
|
||||
:2027C4003F85F040F541D0037416C0E0E4C0E074F3C0E074F0C0E0853E82853F838540F0FE
|
||||
:2027E400E5411206E1E58124FCF5817464C0E074FCC0E090F0FB12490315811581920F503C
|
||||
:202804003AC00390F104E0FAA3E0FBA3E0FEA3E0FF7825C3E29A08E29B08E29E08E29FD095
|
||||
:2028240003501890F1047825E0F2A3E008F2A3E008F2A3E008F290F945EBF00B0227B078B9
|
||||
:2028440025E2F58208E2F58308E2F5F008E222AF82AE83D21090F91FE0FD7C007B007A007F
|
||||
:202864008C44EBC454F0C544C4C5446544C54454F0C5446544F545EDC4540F4544F544ED16
|
||||
:20288400C454F0F543754200300D17782FE542F27470254308F2E4354408F2E4354508F234
|
||||
:2028A40080497810E2F582C007C00612255E85824685834785F048F549D006D00774162555
|
||||
:2028C40046F546E43547F547E43548F548E43549F549782FE5462542F2E547354308F2E5EB
|
||||
:2028E40048354408F2E549354508F290FA807405F090FA5CE4F090F94004F07829EFF20803
|
||||
:20290400EEF27406C0E0E4C0E0C0E090F92112459815811581158190FA80E0FB14F0EB70F6
|
||||
:2029240003022C961010030229E57829E2FA08E2FB8A828B8378627463F2E408F2125D4AE3
|
||||
:20294400AA8290FA7DEAF07829E2FB08E2FF8B828F8378837463F2E408F2C00212608DE598
|
||||
:20296400828583F0D00245F0600690FA7DEA04F090FA7DE024EA500690FA7D7415F090FA32
|
||||
:202984005CE0FB7A0090FA7DE0FFC3EA9F50528B067F00788A7408F2E408F28E828F83C06E
|
||||
:2029A40007C006C003C0021261CAAC82AD83D002D003D006D007EC2421FCED34F9FD530637
|
||||
:2029C400078EF005F07401800225E0D5F0FBFE8C828D83E0FF42068C828D83EEF00B0A80E9
|
||||
:2029E400A4122362AA82AB83AFF0EA4B7003F582220ABA00010B8A828B838FF012628FFEF4
|
||||
:202A0400A312628FFF4E60428E048F05C3EC9423ED9400501A7877EEF2EF08F2E408F20808
|
||||
:202A2400F2900019E4F5F0125F411249E2801BEC24F6FCED34FFFD7F007E008C828D838FDB
|
||||
:202A4400F0EE121809D218125098900122E4F5F012218D78337401F290FA5CE0FF7E00905C
|
||||
:202A6400FA7DE0FDC3EE9D505E8F047D00788A7408F2E408F28C828D83C007C006C005C074
|
||||
:202A8400041261CAAA82AB83D004D005D006D007EA2421F582EB34F9F5835304078CF0052C
|
||||
:202AA400F07C017D008006EC2CFCED33FDD5F0F7E0FB7A005204EA5205EC4D60067833E49B
|
||||
:202AC400F280040F0E80987833E27003022C5B90FA7DE07875F2E408F2900063125F21AEE7
|
||||
:202AE40082AF83782DEEF2EF08F290FA8174F3F074F0A3F0E4A3F090FA5CE0704B90F0F3EC
|
||||
:202B0400E0FCA3E0FD7829ECF208EDF290F0F5E0FCA3E0FD782BECF208EDF290FA7EE4F0DA
|
||||
:202B2400A3F0782DE2FC08E2FDEC24FCFCED34FFFD782DECF2ED08F290FA81740424F3F07B
|
||||
:202B4400E434F0A3F0E4A3F07829E2FC08E2FD782DC3E2F5F0EC95F008E2F5F0ED95F050C8
|
||||
:202B64000A7829792DE2F308E209F37829E2FC08E2FD782DD3E29CF4B3FCB308E29DF4FD1B
|
||||
:202B84007829ECF208EDF27582041217C490FA81E0F546A3E0F547A3E0F548AA46AF4778E0
|
||||
:202BA4002DE2C0E008E2C0E0C002C007782FE2F58208E2F58308E2F5F008E212081CE58198
|
||||
:202BC40024FCF5817582041217FD782DE2FA08E2FD7E007F00782FE22AF208E23DF208E22D
|
||||
:202BE4003EF208E23FF2AD46AE47AF48782DE2F54608E2F547AA46AC47154674FFB5460211
|
||||
:202C04001547EA4C60368D828E838FF012628FFCA3AD82AE838C4275430090FA7EE0FAA3DC
|
||||
:202C2400E0FC8A4A8C4BAB42AC43EB254AFBEC354BFC90FA7EEBF0ECA3F080B990FA7DE0EE
|
||||
:202C4400FF90FA5CE02FF07829E2FE08E2FF4E60067833E4F2D21090F940E4F07833E27071
|
||||
:202C64000302291B782BE2FE08E2FF90FA7EE0FCA3E0FDEEB50406EFB5050280117433C0E7
|
||||
:202C8400E0746BC0E0125A461581158180047582012275820022AFF0AE83E58290FA88F003
|
||||
:202CA400EEA3F0EFA3F090FA88E0FDA3E0FEA3E00DBD00010E8D828E837408C0E07430C0A1
|
||||
:202CC400E074F9C0E01245C41581158115819211501490F938E0FCA3E0FDA3E0FEA3E0FFFF
|
||||
:202CE400EC4D4E4F707490F91FE4F090FA88E0FDA3E0FEA3E0FF74012DFAE43EFBC002C06D
|
||||
:202D04000390F9171244C615811581740D2DFAE43EFB8F048A828B838CF012628FFA90F950
|
||||
:202D240020F07411C0E0C005C00690F92F1246301581158115817408C0E0E4C0E09070002D
|
||||
:202D4400E4F5F012092C1581158190F938E0FEA3E0FF90FA86EEF0EFA3F090F938E0FCA362
|
||||
:202D6400E0FDA3E0FEA3E0FFEC4D4E4F7003022DF3C3E49C74109DE49EE49F500B90FA8432
|
||||
:202D8400E4F07410A3F0800890FA84ECF0EDA3F0D20D90FA84E0FEA3E0FF8E828F831228A9
|
||||
:202DA40053E582604690F91FE0FF0F90F91FEFF090F938E0FCA3E0FDA3E0FEA3E0FF90FAE8
|
||||
:202DC40084E0FAA3E0FB8A008B01E4FAFBECC398FCED99FDEE9AFEEF9BFF90F938ECF0EDC5
|
||||
:202DE400A3F0EEA3F0EFA3F0022D5E7582002275820122AFF0AE83E58290FA8DF0EEA3F0BA
|
||||
:202E0400EFA3F090FA8DE0FDA3E0FEA3E0FF74012DFAE43EFB8F048A828B837408C0E0743F
|
||||
:202E240030C0E074F9C0E01245C41581158115819212504090F93DE0FC740E2DFDE43EFE32
|
||||
:202E44008D828E838FF012628FFDECB5052690F938E0FCA3E0FDA3E0FEA3E0FFEC4D4E4F0D
|
||||
:202E64006012744BC0E0746BC0E0125A46158115810230017582041217C490F9457834E0AB
|
||||
:202E8400F290FA8DE0FCA3E0FDA3E0FE740E2CFAE43DFB8E078A828B838FF012628FFA5405
|
||||
:202EA400FC60317834E2FB7F00C003C007745EC0E0746BC0E0125A46E58124FCF58190FAC6
|
||||
:202EC4006E7411F0E4A3F08C828D838EF0121B117834E4F290F945E02401F0FFBF04004073
|
||||
:202EE4000590F945E4F090F945E0FF7834E2B507197582041217FD7482C0E0746BC0E012CF
|
||||
:202F04005A4615811581758201228F8212255EAC82AD83AEF0FF7416C0E0E4C0E074F3C051
|
||||
:202F2400E074F0C0E08C828D838EF0EF1206E1E58124FCF5817464C0E074FCC0E090F0FB26
|
||||
:202F4400124903158115819212500890F108E054F8708190F945E0FF7810F28F8212255E74
|
||||
:202F6400AC82AD83AEF0FF7404C0E0E4C0E08C828D838EF0EF12092C1581158175820412AB
|
||||
:202F840017FD7810E2FE7F00C006C007748CC0E0746BC0E0125A46E58124FCF58190F91F30
|
||||
:202FA400E4F090FA8DE0FDA3E0FEA3E0FF74012DFAE43EFBC002C00390F9171244C61581B2
|
||||
:202FC4001581740D2DFAE43EFB8F048A828B838CF012628FFA90F920F07411C0E0C005C029
|
||||
:202FE4000690F92F12463015811581158190F938E0FEA3E0FF90FA8BEEF0EFA3F090F9386E
|
||||
:20300400E0FCA3E0FDA3E0FEA3E0FFEC4D4E4F7003023098C3E49C74109DE49EE49F500B76
|
||||
:2030240090FA84E4F07410A3F0800890FA84ECF0EDA3F090FA84E0FEA3E0FF8E828F8312FF
|
||||
:203044002853E582604A90F91FE0FF0F90F91FEFF090F938E0F54CA3E0F54DA3E0F54EA3B3
|
||||
:20306400E0F54F90FA84E0FAA3E0FBE4FEFFE54CC39AFAE54D9BFBE54E9EFEE54F9FFF9060
|
||||
:20308400F938EAF0EBA3F0EEA3F0EFA3F0023001758200227582041217C47430C0E074F9BB
|
||||
:2030A400C0E090F0F31244C61581158190F0FB7421F07447A3F0744DA3F07447A3F090F938
|
||||
:2030C40041E02401F0A3E03400F0A3E03400F0A3E03400F090F941E0FCA3E0FDA3E0FEA377
|
||||
:2030E400E0FF90F104ECF0EDA3F0EEA3F0EFA3F090FA8BE0FEA3E0FF7D007C0090F0FFEE2E
|
||||
:20310400F0EFA3F0EDA3F0ECA3F090F93CE090F103F090F93DE090F108F07810E2F582120F
|
||||
:20312400255EAC82AD83AEF0FF7416C0E0E4C0E074F3C0E074F0C0E08C828D838EF0EF12B7
|
||||
:20314400081CE58124FCF5817582041217FD75820122AFF0AE83E58290FA91F0EEA3F0EF5E
|
||||
:20316400A3F0C20D90FA91E0F553A3E0F554A3E0F555740D2553FAE43554FBAC558A828B1A
|
||||
:20318400838CF012628FFCBC02028024BC03030234DEBC10028019BC20028014BC210280BB
|
||||
:2031A4000FBCA8030233D1BCAF030234BE02355390FA91E0FFA3E0FEA3E0FD75509075518D
|
||||
:2031C400FA755200740E2FF553E43EF5548D558553828554838555F012628FFB855082858A
|
||||
:2031E40051838552F0125F0690FA90E020E2030232B5758204C007C006C0051217C4D005C2
|
||||
:20320400D006D00790FA90E0C423541FFB603CBB0F02806C8553828554838555F012628FD7
|
||||
:20322400F582C007C006C005122622AB82D005D006D007BBFF0280488B82C007C006C005D5
|
||||
:2032440012274DD005D006D007803574012FF553E43EF5548D558553828554838555F0C034
|
||||
:2032640007C006C00512258FAB82D005D006D007BBFF02800B1224E578357401F20233CBCD
|
||||
:20328400758204C007C006C0051217FDD005D006D0078F828E838DF0122DF7E582600B127C
|
||||
:2032A40024E578357401F20233CB7835E4F20233CB74012FF553E43EF5548D558553508584
|
||||
:2032C40054518555528550828551837408C0E07427C0E074F9C0E01245C415811581158128
|
||||
:2032E4009213500B1224E578357401F20233CB758204C007C006C0051217C485538285542E
|
||||
:20330400838555F012258FAC82758204C0041217FDD004D005D006D007BCFF028051C007D8
|
||||
:20332400C006C005C0041224E5D004D005D006D0078F538E548D55AA53AB547411C0E0C042
|
||||
:2033440002C00390F92F12463015811581158190F938E4F0A3F0A3F0A3F090FC63ECF090F9
|
||||
:20336400FA90E054037824F28C82122781803D749AC0E0746BC0E0125A46158115818F8259
|
||||
:203384008E838DF0122DF7E582601B1224E57810E2FB90FC63F090FA90E054037824F28BBA
|
||||
:2033A4008212278180067835E4F2801B90F930E0FAA3E0FBC002C00390F9271244C6158131
|
||||
:2033C400158178357401F27835E2F5822290F938E0FAA3E0FBA3E0FEA3E0FFEA4B4E4F70B9
|
||||
:2033E4002F74012553FDE43554FEAF558D828E837408C0E07430C0E074F9C0E01245C41584
|
||||
:203404008115811581921350071224E57582012290F91FE4F090FA91E0F550A3E0F551A3A2
|
||||
:20342400E0F55274012550FAE43551FBC002C00390F9171244C615811581740D2550FDE4D4
|
||||
:203444003551FEAF528D828E838FF012628F90F920F0AD50AE517411C0E0C005C00690F973
|
||||
:203464002F12463015811581158174092550FDE43551FEAF528D828E838FF012628FFDA335
|
||||
:2034840012628FFE8D828E83122853E582602790F938E4F0A3F0A3F0A3F07582041217C456
|
||||
:2034A40090F0F775F0001213CB7582041217FD1224E575820122758200221224E5740E250B
|
||||
:2034C40053FDE43554FEAF558D828E838FF012628FF58212045A758201227582041217C49E
|
||||
:2034E4008553828554838555F0122C9AE582605B1224E57582041217C412356E300D111236
|
||||
:203504003B03907019E4F5F01206C1125616805674A2C0E0746BC0E0125A461581158175D2
|
||||
:2035240082041217FD90FA5B7401F090F0E374E0F0123B7C7408C0E0E4C0E0C0E090F92731
|
||||
:20354400124598158115811581801B758200227F00C004C00774BFC0E0746BC0E0125A46F4
|
||||
:20356400E58124FCF58175820022783AE4F208F208F208F2C20D7419C0E0E4C0E074A2C066
|
||||
:20358400E074FDC0E0907000E4F5F01206E1E58124FCF58178367419F2747008F2E408F28F
|
||||
:2035A40008F29062BD93FD740193FE7402937406C0E0C005C00690FDAB1245C4158115819B
|
||||
:2035C40015819214500790F08F7405F0229062BDE493FD740193FE7402937409C0E0C005A6
|
||||
:2035E400C00690FDAB1245C41581158115819214500790F08F7402F02290FDAAE0FFBF0182
|
||||
:2036040002800790F08F7401F02290FDA8E0FEA3E0FFC3E49E74809F500790F08F7403F04D
|
||||
:203624002290FDA8E0FEA3E0FF4E70030236E190FDA8E0FEA3E0FFC374239E74089F5004F9
|
||||
:203644007E237F08C006C00774F3C0E074F0C0E07836E2F58208E2F58308E2F5F008E21272
|
||||
:2036640006E1E58124FCF58190FA9474F3F074F0A3F0E4A3F090FA97EEF0EFA3F0783AE26B
|
||||
:20368400F58208E2F58308E2F5F008E2C007C0061237BA783AC0E0E582F2E58308F2E5F022
|
||||
:2036A40008F2D0E008F2D006D0078E028F037C007D007836E22AF208E23BF208E23CF208B7
|
||||
:2036C400E23DF290FDA8E0FCA3E0FDECC39EFEED9FFF90FDA8EEF0EFA3F002362590FDA24D
|
||||
:2036E400E0FCA3E0FDA3E0FEA3E0FF783AE2B5041108E2B5050C08E2B5060708E2B5070205
|
||||
:20370400800790F08F7404F02290FDA6E0FEA3E0FF90F08DEEF0EFA3F0C006C00774DFC0E5
|
||||
:20372400E0746BC0E0125A46E58124FCF581D20D221227A4AC82AD83AEF0FF90F941ECF0F9
|
||||
:20374400EDA3F0EEA3F0EFA3F0227408C0E07450C0E074F9C0E090FA66124630158115818F
|
||||
:20376400158190FA5DE054F84421F090FA5EE054F344C8F090FA607437F07413A3F090FA13
|
||||
:203784006274FFF0A3F090FA647437F07413A3F0227411C0E0745DC0E074FAC0E090F9DCFF
|
||||
:2037A40012463015811581158190F958E0FF04F090F9DEEFF022AC82AD83AEF0FF783EEC02
|
||||
:2037C400F4F2EDF408F2EEF408F2EFF408F290FA94E0F55EA3E0F55FA3E0F56090FA97E06A
|
||||
:2037E400F55AA3E0F55B855A5C855B5D155A74FFB55A02155BE55C455D70030238B8855E9D
|
||||
:2038040082855F838560F012628FFEA385825E85835F8E047D007E007B00783EE26CF20870
|
||||
:20382400E26DF208E26EF208E26BF27846E4F208F27846C3E2940808E26480948050A778D4
|
||||
:203844003EE25401FA08E25400FB08E25400FC08E25400FE7842C3E49AF2E49B08F2E49C60
|
||||
:2038640008F2E49E08F27841E2C313F56418E213F56318E213F56218E213F5617842E254E8
|
||||
:2038840020FC08E25483FD08E254B8FE08E254EDFA783EEC6561F2ED656208F2EE6563086B
|
||||
:2038A400F2EA656408F27846E22401F208E23400F2023835783EE2F4FB08E2F4FC08E2F4F0
|
||||
:0B38C400FD08E2F48B828C838DF02263
|
||||
:206AD8000A002530327820004150206F6E2025640A004E6F204150206F6E2025640A002EE8
|
||||
:206AF80000636865636B435243206661696C65640A00524551202564207061727420256408
|
||||
:206B18000044726177696E6720696D61676520696E20736C6F742025640A00626C6B206623
|
||||
:206B380061696C65642076616C69646174696F6E210A0072657374617274696E6720696D8F
|
||||
:206B58006720646C0A004368616E67696E67207374617274696E67536C6F742066726F6D9B
|
||||
:206B780020256420746F20300A004E6F20736C6F74730A006E657720646C20746F202564F5
|
||||
:206B98000A00646C20696D670A004F544120696D6167652076616C69646174696F6E2066C4
|
||||
:206BB80061696C65640A00646174615479706520307825782069676E6F7265640A00436856
|
||||
:206BD800726F6D613239004F54412076616C6964617465642C207570646174696E67207495
|
||||
:0F6BF8006F2076657273696F6E202530780A0002
|
||||
:05767200FF21474D4718
|
||||
:2038CF00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB9C
|
||||
:2038EF0000438004002290F09B7438F0E4A3F030050990F09B7430F0E4A3F02290F959E05A
|
||||
:20390F00704590F0C7E0603FC20490F09F7410F0C4A3F090F0A17406F0E4A3F09071D9751C
|
||||
:20392F00F080120D72D20490F09F7418F07401A3F090F0A1740DF0E4A3F09071FB75F08014
|
||||
:20394F00120D72D2038002C203300A2690F0C6E06020C20490F09F7410F0C4A3F090F0A1D4
|
||||
:20396F007470F0E4A3F090720575F080120D72D20222C20222123EBD742CC0E07472C0E0C1
|
||||
:20398F0012416C15811581743FC0E07472C0E012416C1581158190F09BE0FEA3E0FF740872
|
||||
:2039AF002EFEE43FFF90F09BEEF0EFA3F07452C0E07472C0E012416C158115817475C0E0CF
|
||||
:2039CF007472C0E012416C158115817497C0E07472C0E012416C1581158190F09BE0FEA3AF
|
||||
:2039EF00E0FF74082EFEE43FFF90F09BEEF0EFA3F090F09DE4F0A3F07427C0E07472C0E04F
|
||||
:203A0F0012416C15811581023A39758205123E9AE58260012274B5C0E07472C0E0125A4666
|
||||
:203A2F0015811581903984020D4C7436C0E074FCC0E0E4C0E074C1C0E07472C0E012416CAB
|
||||
:203A4F00E58124FBF581229062BBE493C0E0740193C0E074CDC0E07472C0E012416CE58142
|
||||
:203A6F0024FCF58122123EBD123ED974DCC0E07472C0E012416C15811581123A5690F0E5E1
|
||||
:203A8F00E0C0E0A3E0C0E074EDC0E07472C0E012416CE58124FCF58190FAB4E0FF3395E06D
|
||||
:203AAF00FEC007C00674FBC0E07472C0E012416CE58124FCF581023A39758201123E9AE5E0
|
||||
:203ACF00826001221219A2903A74020D4C123EBD123ED9C2051238F590F08DE0C0E0A3E020
|
||||
:203AEF00C0E0740EC0E07473C0E012416CE58124FCF58122903ADC020D4C123EBD123ED95A
|
||||
:203B0F00D2057424C0E07473C0E012416C15811581D20490F08FE0FFBF02028018BF040231
|
||||
:203B2F008023BF05307435C0E07473C0E012416C15811581227444C0E07473C0E012416C64
|
||||
:203B4F0015811581227455C0E07473C0E012416C15811581227E00C007C0067460C0E07418
|
||||
:203B6F0073C0E012416CE58124FCF58122903B09020D4C123EBD123ED9746FC0E07473C0B7
|
||||
:203B8F00E012416C158115817487C0E07473C0E012416C1581158190F09BE0FEA3E0FF9033
|
||||
:203BAF00F0A1EEF0EFA3F090F94CE0FF7E0090F94DE0FD7C00C007C006C005C00474A0C0BA
|
||||
:203BCF00E07473C0E012416CE58124FAF58190F94AE0FF7E0090F94BE0FD7C00C007C006CC
|
||||
:203BEF00C005C00474B2C0E07473C0E012416CE58124FAF58190F948E0FF7E0090F949E047
|
||||
:203C0F00FD7C00C007C006C005C00474B2C0E07473C0E012416CE58124FAF58190F946E051
|
||||
:203C2F00FF7E0090F947E0FD7C00C007C006C005C00474B2C0E07473C0E012416CE5812423
|
||||
:203C4F00FAF58190F099E0FEA3E0FF8E02EFFB3395E0FCFD7428C39AF50F74019BF510E45B
|
||||
:203C6F009CF511E49DF512906F2DE493FDE4FC3395E0FBFAE50FC39DFDE5109CFCE5119B7F
|
||||
:203C8F00FBE5129AFA78647402F2E408F208F208F28D828C838BF0EAC007C006125D95AABB
|
||||
:203CAF0082AB83D006D00790F09FEA2EF0EB3FA3F090F0BFE0FF7E0090F0C0E0FD3395E053
|
||||
:203CCF00FC90F959E0FB7A00C007C006C005C004C003C00274BBC0E07473C0E012416CE50D
|
||||
:203CEF008124F8F581123F5A023A56758203123E9AE5826001221219A2903B82020D4C1210
|
||||
:203D0F003EBD123ED974D5C0E07473C0E012416C1581158174E8C0E07473C0E012416C15BE
|
||||
:203D2F0081158190F099E0FEA3E0FF90FA99EEF0EFA3F090F09BE0FEA3E0FF90F0A1EEF0E7
|
||||
:203D4F00EFA3F074FDC0E07473C0E012416C1581158190FA99E0FEA3E0FF8E02EFFB33958A
|
||||
:203D6F00E0FCFD74F0C39AFAE49BFBE49CFCE49DFD78647402F2E408F208F208F28A828B7F
|
||||
:203D8F00838CF0EDC007C006125D95AA82AB83D006D007EA2EFEEB3FFF90F09FEEF0EFA3C2
|
||||
:203DAF00F0EE5407601574075EFC7D00EEC39CFEEF9DFF90F09FEEF0EFA3F0906F2D75F00E
|
||||
:203DCF0080120D7290F0A1E0FEA3E0FF74082EFEE43FFF90F0A1EEF0EFA3F0D2049070B76A
|
||||
:203DEF0075F080120D7202390B758204123E9AE582600122903D0E020D4C123EBD123ED9BD
|
||||
:203E0F0090F09BE0FEA3E0FF74102EFEE43FFF90F09BEEF0EFA3F07411C0E07474C0E0120C
|
||||
:203E2F00416C15811581123F5A02390B758205123E9AE582600122903E09020D4C123EBD9A
|
||||
:203E4F00123ED97421C0E07474C0E012416C158115817435C0E07474C0E012416C15811547
|
||||
:203E6F008190F09F747CF0E4A3F090F09BE0FEA3E0FF90F0A1EEF0EFA3F0D2049070B7753E
|
||||
:203E8F00F080020D72903E4C020D4CE582C40354F8F582122622AF82BFFF02800D7824E464
|
||||
:203EAF00F28F821227817582012275820022C206C204C20590F099E4F0A3F090F09DF0A37E
|
||||
:203ECF00F090F09BF0A3F0C20922D20490F0A1E4F0A3F0906DAA93FF7E007428C39FFF74D2
|
||||
:203EEF00019EFE90F09FEFF0EEA3F0906DA975F080120D72C204906C08E493FF7E0090F03D
|
||||
:203F0F009FE0FCA3E0FDECC39FFFED9EFE90F09FEFF0EEA3F0906C0775F080120D72906ECB
|
||||
:203F2F006CE493FF7E0090F09FE0FCA3E0FDECC39FFFED9EFE90F09FEFF0EEA3F0D20490DC
|
||||
:203F4F006E6B75F080120D72C2042290F0E9E0FEA3E0FF4E601190F0E7E0FCA3E0FDC3EE1F
|
||||
:203F6F009CEF9D5002800890F0E7E0FEA3E0FFC006C007744FC0E07474C0E012416CE581CC
|
||||
:053F8F0024FCF5812275
|
||||
:206C0700801AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000E3
|
||||
:206C270000000000000000000000000000000000000000000000000000000000000000004D
|
||||
:206C47000000000000000000000000000000000000001C000000001F9F800000000038702B
|
||||
:206C670001C07F000000001F9FC000000000387001C07F000000001F9FE000000000387021
|
||||
:206C870001C0F7800000001C1CE000000000380001C0E3800000001C1CE0000000003800F1
|
||||
:206CA70001C0E39DC1C7701F9CE773B871D03873B9C7E39FE3E7F81F9FEFF3FCF9F03873E7
|
||||
:206CC700FDCEE39FE777F81F9FCFF3FDDDF03873FDDCE39CE7F7381C1F8E739DFDC0387366
|
||||
:206CE7009DF8E39CE7F7381C1C0E739DFDC038739DF8F79CE707381C1C0E739DC1C03873D5
|
||||
:206D07009DDC7F1FE7F7381F9C0FF3FDFDC03F739DDC7F1FE3E7381F9C0FF3FCF9C03F73D9
|
||||
:206D27009DCE1E1DC1C7381F9C0773B871C03F739DC7001C00000000000003800000000013
|
||||
:206D47000000001C0000000000000380000000000000001C000000000000038000000000EE
|
||||
:206D67000000001C000000000000038000000000000000000000000000000000000000006D
|
||||
:206D8700000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFA
|
||||
:206DA700FFFF800C000882A2AB55BFFFFFFF7DB4622800000010101176FF7BFFFF7FB7A9A1
|
||||
:206DC70055505100002922966FF7BFFFFFFFEAE622AA08000002542ABF3F7FFFFFFFFD59BF
|
||||
:206DE700B4102000002423B5B5DFFFFFFFFFF6AE48551000008890546AEFFFFFFFFFFBF51A
|
||||
:206E0700A382000000012DA3B3FFFFFFFFFFF6BE4E5209000490020D55DFFFFFFFFFFDDDBD
|
||||
:206E270068A9001000490CFBAB6FFFFFFFFFFEEB955A002000129122BFDFFFFFFFFFFFF579
|
||||
:206E4700658140400028127DEFFFFFFFFFFFFFEFAB28000000420A9775FFFFFFFFFFFFF71A
|
||||
:206E67004AC20400800C0008029CDFFFFFFFFFFFFF6A6A8D002000044D72AAFFFFFFFFFF07
|
||||
:206E8700FFD5D57480000240128EDFFDFFFFFFFFFFAEAA0A11200020525FF57FFFFFFFFFC1
|
||||
:206EA700FF7294AA240000010AAB6F77FFFFFFFFFDAF545488000004804D95EBFFFFFFFF37
|
||||
:206EC7005B58B5514000000808A6B3F77FFFFFFFFFAD4AA0100000029641DCAEFFFFFFFFD1
|
||||
:206EE700FDBFEA4802000000093EAB75EFFFFFFFFFD4B121080000000AC35DFF7FFFFFFFF6
|
||||
:206F0700EFEF444A64800000A152A6EFEFFFFFFFD6CAF5101800000002154BD5DFFFFFF7DE
|
||||
:206F2700EBD4D88500003838000000000000000000000000000000000000000000000000BE
|
||||
:206F47000000000000000000000000000000000007C00000000001FFF0000000000FFFF075
|
||||
:206F6700000000007FFFF000000001FFFFF000000007FFFFC00000001FFF80000000007FCB
|
||||
:206F8700F80000000000FFE00000000001FF000000000007FE00000000000FF80000000007
|
||||
:206FA700001FE000000000003FC00003E000007F80007FF00000FE0003FFF00001FC000F7F
|
||||
:206FC700FFF00001F8003FFFF00003F800FFFF800007F001FFE000000FE003FF0000000F44
|
||||
:206FE700C00FF80000001F801FF00000001F803FC00000003F003F800000003F007F0000BB
|
||||
:2070070000007E00FE0007E0007E01FC001FF000FC01F8007FF000FC03F001FFF000F8033E
|
||||
:20702700F003FFF001F807E007FF0001F807E00FF00001F00FC01FE00001F00FC03F800064
|
||||
:2070470003F00F803F000003F01F807E000003E01F807E000003E01F00FC01E003E01F0077
|
||||
:20706700FC07F803E01F00F80FFC03E03F00F80FFC03E03F01F81FFE03E03F01F81FFE0371
|
||||
:20708700E03F01F81FFE03C03E01F01FFE01C01E00F00FFC00000000000FFC0000000000C0
|
||||
:2070A70007F8000000000001E000000000000000303000001FF800000000FFFF0000000371
|
||||
:2070C700FFFFE000000FFFFFF000003FFFFFFC00007FF00FFE0000FF8001FF0001FE00009B
|
||||
:2070E7007F8003F800001FC007F000003FE00FE000007FF00FC00000FFF01F800001FFF8E7
|
||||
:207107001F000003FFF83F000007FEFC3E00000FFC7C7E00001FF87E7C00003FF03E7C00D2
|
||||
:20712700007FE03EFC0000FFC03FF80001FF801FF80003FF001FF80007FE001FF8000FFCE2
|
||||
:20714700001FF8001FF8001FF8003FF0001FF8007FE0001FF800FFC0001FFC01FF80003F8E
|
||||
:207167007C03FF00003E7C07FE00003E7E0FFC00007E3E1FF800007C3F3FF00000FC3F7F8D
|
||||
:20718700E00000FC1FFFC00001F80FFF800003F00FFF000007F007FE00000FE003FC0000BC
|
||||
:2071A7001FC001FE00007F8000FF8001FF00007FF00FFE00003FFFFFFC00000FFFFFF000BA
|
||||
:2071C7000003FFFFE0000000FFFF000000001FF800001010000000000000000000007C0016
|
||||
:2071E7008200000038004407007903811C0103810079000708080063773E1C3E77631010E9
|
||||
:20720700000003C00FF0081008100810081008100810081008100BD00BD008100FF0000018
|
||||
:207227000A000A0A0009084F70656E4550617065724C696E6B0A08006F70656E6570617051
|
||||
:2072470065726C696E6B2E64650A0049276D0920666173742061736C656570202E202E2097
|
||||
:207267002E20746F2077616B65206D653A000A52656D6F7665206261747465726965732C5B
|
||||
:207287002073686F727420626174746572790A00636F6E74616374732C207265696E736541
|
||||
:2072A7007274206261747465726965732E004465657020736C6565700A00546167204D4145
|
||||
:2072C700433A202573004368726F6D613239207625303458005374617274696E67202E207C
|
||||
:2072E7002E202E0A0A000A564261743A202564206D560A0054656D70657261747572653AE8
|
||||
:20730700202564430A0A000C466C617368696E67207625303478202E202E202E000C4F54FE
|
||||
:2073270041204641494C4544203A280A0A000C4E6F74204F544120696D616765000C577271
|
||||
:207347006F6E67204F544120696D616765000C435243206572726F72000C4572726F722057
|
||||
:20736700436F64652025640057616974696E6720666F722064617461202E202E202E0A00FA
|
||||
:207387000A466F756E642074686520666F6C6C6F77696E672041503A000A4150204D414317
|
||||
:2073A7003A202530325825303258002530325825303258000A43683A2025642052535349F7
|
||||
:2073C7003A202564204C51493A2025640A00084E6F20415020666F756E64203A280A080A80
|
||||
:2073E700005765276C6C2074727920616761696E20696E2061000A6C6974746C652077681D
|
||||
:20740700696C65202E202E202E00087A7A5A5A5A202E202E202E0A080A000C454550524FAA
|
||||
:207427004D204641494C4544203A280A0A000C536C656570696E6720666F72657665722021
|
||||
:157447002E202E202E0A0A00564261743A202564206D560A0015
|
||||
:203F9400C007C006C005C004C00390FAA2E0600302408890FAA3E0FF24FB5003024085EFC7
|
||||
:203FB4002F2F903FBA73023FC9023FE702406802407F02408590FAA0744BF0E4A3F090FA55
|
||||
:203FD400A2740BF090FAA37401F090FAA47468F002408890FA9D1248B0E582FF6045EF2417
|
||||
:203FF400E0FFBF600040027F1F90FAA5E0FE0E90FAA5EEF0C0078E821243DAAD82AE83152C
|
||||
:204014008190FAA4E0FC7B002DFDEB3EFE8D828E837467C0E01248ABAE82158190FAA4EEB3
|
||||
:20403400F0800B90FAA37402F090FAA4E0FFEF75F002A4245CF582747435F0F583E493FE66
|
||||
:20405400A3E493FF90FAA0EEF0EFA3F090FAA2740BF0802090FAA37403F090FAA074E3F069
|
||||
:20407400741AA3F090FAA203F0800990FAA37404F0C3802D90FAA0E0FEA3E0FFEE5401246D
|
||||
:20409400FFE433FDEFC313CE13CEFF90FAA0EEF0EFA3F090FAA2E0FF1F90FAA2EFF0ED24B6
|
||||
:0C40B400FFD003D004D005D006D00722B6
|
||||
:20745C009B01B3013303C90089019101990019013101930013012301CD01D90199039D0113
|
||||
:20747C00B90139037302D30193033B017301B7039701A7012703370167016702DB001B0345
|
||||
:20749C006303C500D10011038D00B10031028B00A3002302ED008D03B103DD001D0371035A
|
||||
:2074BC0077038B03A303BB003B02BB03D70017034703B7003702C702F70213028F02650054
|
||||
:2074DC00850169000903A10121034D000D01590019026101610243025300EF024301F1027B
|
||||
:2074FC00E501E901C9033D01790179022F014F014F02DB037B036F03F500C503D103BD00B4
|
||||
:0E751C003D02AF002F02DD03BD03D703AF0316
|
||||
:2040C000C007C006C005C004C001C000AC82AD83AEF0FFBF20005031BF0A0302415F8F826F
|
||||
:2040E000C007C006C005C004C003C002C001C000C0251242A7D025D000D001D002D003D0B9
|
||||
:2041000004D005D006D00780567E00EF24E0FFEE34FFFEEF2FFFEE33FEEF2498F582EE3434
|
||||
:2041200063F583E493A3E493C4540FFE90F0B3EEF0300507EE2EFE90F0B3F090F0B3E0FF52
|
||||
:204140003395E0FE0FBF00010E90F099E0FCA3E0FDEF2CFFEE3DFE90F099EFF0EEA3F0D0DB
|
||||
:2041600000D001D004D005D006D00722C007C006C005C004C003C001C000E58124F6FFC05D
|
||||
:2041800007C006C005C004C003C002C001C000C02512425AD025D000D001D002D003D00421
|
||||
:2041A000D005D006D007E58124F6F886050886068D828E83E493FCBC0C7290F099E4F0A389
|
||||
:2041C000F0C007C005C006C0E0C0E09040C01256F5E58124FBF58190F099E0FDA3E0FE33CB
|
||||
:2041E00095E0FCFB7428C39DFD74019EFEE49CFCE49BFB78647402F2E408F208F208F28DB0
|
||||
:20420000828E838CF0EBC007C002C001C000C025125D95AB82AC83ADF0FED025D000D00124
|
||||
:20422000D002D00790F099EBF0ECA3F0C007E58124F5F8E6C0E008E6C0E0E4C0E0C0E0905C
|
||||
:20424000109A1256F5E58124FBF581D000D001D003D004D005D006D00722300625300506DA
|
||||
:204260007E147F0080047E0A7F0090F0B4EEF03005067E207F0080047E107F0090F0B3EE86
|
||||
:20428000F0223005067E207F0080047E107F0090F0B4EEF03005067E147F0080047E0A7F3A
|
||||
:2042A0000090F0B3EEF022AF82BF08028018BF0902804EBF0A028013BF0B028055BF0C01D6
|
||||
:2042C00022BF0D568038B20502425A12425A90F0B4E0FE3395E0FD90F09BE0FBA3E0FCEEC5
|
||||
:2042E0002BFEED3CFD90F09BEEF0EDA3F090F09DE0FDA3E0FE90F099EDF0EEA3F022B2042C
|
||||
:204300002290F099E0FDA3E0FE90F09DEDF0EEA3F02290F09DE4F0A3F0227E00C007C006B6
|
||||
:12432000742AC0E07475C0E0125A46E58124FCF58122F4
|
||||
:15752A00496E76616C69642063686172203078253032780A00F6
|
||||
:20433200E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB2E
|
||||
:2043520000438004002275FB02228582F9E5F830E1FB53F8FDE5F820E0FB85F9822253F35D
|
||||
:20437200C775FA2275FC0C75F8C043F4C043F102D20B2253F1FD53F43F75FA0075FC3175B0
|
||||
:08439200F84043F338C20B228E
|
||||
:20439A00858283D0F0D0E0D082C082C0E0C0F022C00074FB2581F8E5828682088683088628
|
||||
:2043BA00F0D0002275F008C58213C58233D5F0F7C58222E583A2E713F583E58213F582220C
|
||||
:2043DA00D083D0E0D0F0C0F0C0E0C083E582A4F58285F08322C000E58124FDF8E6F88582AD
|
||||
:2043FA00F0A4F582E8A8F08583F0A428F583E5F03400F5F0E4D00022C000C001C0E0C0F047
|
||||
:20441A0074FA2581F88600E58288F0A4F582A9F0E58388F0A429F583E5F03400F9D0E088FE
|
||||
:20443A00F0A429C5F03400F9D0E0C0F088F0A429D0F0D001D00022C000C001C002E58124CE
|
||||
:20445A00FBF8E6F918E6F88582F0A4C0E0AAF0E58388F0A42AF8E5F03400FAE98582F0A478
|
||||
:20447A0028C0E0E5F03AFA74003400F8E98583F0A42AFAE5F0388AF0D083D082D002D00139
|
||||
:20449A00D00022D0E0D0F0C000C001C002C0F0C0E074F82581F9E7F809E7F922D002D00175
|
||||
:2044BA00D00022C9C583C9C8C582C82212449D75F0081244BDE0A31244BDF0A3D5F0F302C7
|
||||
:2044DA0044B612449D75F0081244BDE493A31244BDF0A3D5F0F20244B612449DC375F008BF
|
||||
:2044FA001244BDE0A3F5021244BDE03AF0A3D5F0EF0244B612449D75F0081244BDE0A3F5BA
|
||||
:20451A00021244BDE05AF0A3D5F0EF0244B612449DC375F0081244BDE0A3F5021244BDE04C
|
||||
:20453A009AF0A3D5F0EF0244B612449DC375F0081244BDE0A3F5021244BDE0A39AD5F0F0EF
|
||||
:20455A000244B612449D75F0081244BDE0A3F5021244BDE0A36A7007D5F0EED30244B6C39C
|
||||
:20457A000244B6C8C0E075F008E038F0A3D5F0F9D00022D3E402457DC374FF02457DC000C0
|
||||
:20459A00C00174FA2581F8E6F5F0088601496015088600E8F0A374FF25F0F5F074FF39F505
|
||||
:2045BA000145F070EED001D00022C000C001C00274F92581F9E7D3601CF5F0098700098700
|
||||
:2045DA0001C3E0F502A31244BDE0A31244BD6A7004D5F0EED3D002D001D00022C000C00160
|
||||
:2045FA00C00274F82581F9E7F5F00987024A601F0987000987011244BDE0A31244BDF0A350
|
||||
:20461A0074FF25F0F5F074FF3AF50245F070E7D002D001D00022C000C001C00274F92581F8
|
||||
:20463A00F9E76015F5F00987000987011244BDE0A31244BDF0A3D5F0F3D002D001D000227C
|
||||
:20465A00C083C082E06003A380FAC3E582D0F095F0F582E583D0F095F0F58322C003C002A9
|
||||
:20467A00C001C000C0E0C0F0C083C082A98174F62581F886F018860075020175030075829D
|
||||
:20469A0011A2F74014C3E833F8E5F033F5F0C3EA33FAEB33FB058280E8E4C003C002C0E054
|
||||
:2046BA00C0E0AA81C0F0C000C0E0C0E0A881C0E0C0E0C0E0C0E0AB81C000C001C375830450
|
||||
:2046DA0086F018E71995F0D583F6D001D000402BC000C001C375830486F018E795F0F71909
|
||||
:2046FA00D583F585020085030175830486F018E745F0F719D583F5D001D00074FC28F8C34C
|
||||
:20471A0075830408E613F6D583F9C00074FC2AF8C375830408E613F6D583F9D000D5829823
|
||||
:20473A0020D508D082D083D0F0D00074F42581F58130D508D082D083D0F0D000E8D000D0DF
|
||||
:20475A0001D002D00322C2D5024676D2D5024676C003C002C001C000C0E0C0F0C083C082E2
|
||||
:20477A00A98174F62581F886F07401758219A2F7400A23C5F023C5F0058280F2C0E0E4C022
|
||||
:20479A00E0C0E0C0E0AA81C0F0C0E0C0E0C0E0A881C0E0C0E0C0E0C0E0AB81C000C001C30B
|
||||
:2047BA0075830486F018E71995F0D583F6D001D000402BC000C001C375830486F018E7952C
|
||||
:2047DA00F0F719D583F585020085030175830486F018E745F0F719D583F5D001D00074FC4E
|
||||
:2047FA0028F8C375830408E613F6D583F9C00074FC2AF8C375830408E613F6D583F9D0004F
|
||||
:20481A00D58298D082D083D0F0D00074F42581F581E8D000D001D002D00322C006C005C03B
|
||||
:20483A0004C003C002C001C00074F72581F886F074017C09A2F7400923C5F023C5F00C80BD
|
||||
:20485A00F3FBE4FAA9F0F88582F0FDFEC3E58298E583994011C3E58298F582E58399F58329
|
||||
:20487A00EA4DFDEB4EFEC3E913F9E813F8C3EB13FBEA13FADCD620D5048D828E83D000D0EA
|
||||
:20489A0001D002D003D004D005D00622C2D5024835D2D5024835E0C0E02401F0A3E0C0E0C3
|
||||
:2048BA003400F0A3E0D083D0826014B4600AC000A882E2D000F582224009E493F58222E092
|
||||
:2048DA00F58222C000A882E6D000F5822212449D75F004D31244BDE0FA3400F0EAA31244C9
|
||||
:2048FA00BDF0A3D5F0EE0244B612449D75F004C31244BDE0FAA31244BDE0A36A7004D5F0B7
|
||||
:20491A00EFD30244B612449DC3E0A398E0A399E0A39400E0A394000244B612449DC3E0A36F
|
||||
:20493A0038E0A339E0A33400E0A334000244B675F004E07004A3D5F0F9F58222A3A3A3E07F
|
||||
:02495A00332206
|
||||
:04495C0075C90B22EC
|
||||
:20496000C0E0C007C006C0D075D000AEDAAFDB74012EF5DAE43FF5DBD0D0D006D007D0E0C1
|
||||
:2049800032C007C006C005C004C000AEDAAFDB784AEEF208EFF27848E5E2F27849E5E3F27E
|
||||
:2049A000EEB5DAE7EFB5DBE37848E2FC08E2FD08E2FE08E28C828D838EF0D000D004D005C5
|
||||
:2049C000D006D0072285E28222E4F5DAF5DBF5E4F5E5F5E6F5E7F5E275E40543D84043B885
|
||||
:2049E0000222AF82AE83ADF0FC784CEFF2EE08F2ED08F2EC08F21249817850C0E0E582F2A1
|
||||
:204A0000E58308F2E5F008F2D0E008F2124981AA82AB83AEF0FF7850D3E29AF4B3FAB30875
|
||||
:204A2000E29BF4B3FBB308E29EF4B3FEB308E29FF4FF784CC3E29A08E29B08E29E08E29FAF
|
||||
:034A400050CA2237
|
||||
:204A430053C07F53A1FE53BEFC3243870122AF82AE83ADF0FC7854EFF2EE08F2ED08F2EC40
|
||||
:204A630008F290FAA6E4F090FAA7F090FAA874DFF090FAA974BEF090FAAAE054E0F090FA88
|
||||
:204A8300AAE0541FF090FAAB7407F090FAACE054E0F090FAACE0549F4420F090FAACE05485
|
||||
:204AA3007FF090FAADE054FC4402F090FAADE054FBF090FAADE054F7F090FAADE054CFF015
|
||||
:204AC30090FAADE0543F4440F07854E2F5F008E242F008E242F008E245F0701B7B0175133C
|
||||
:204AE3006F7514FC85141590FAA6E515F07A6F90FAA7EAF0024B857854C3E2943F08E2946F
|
||||
:204B03000008E2940008E29400500C7854743FF2E408F208F208F27854E225E0F51608E24F
|
||||
:204B230033F51708E233F51808E233F519E5162516F516E51733F517E51833F518E51933F4
|
||||
:204B4300F519747DC0E0E4C0E08516828517838518F0E5191247607854C0E0E582F2E58382
|
||||
:204B630008F2E5F008F2D0E008F2158115817B007D687EFC8E0590FAA6EDF07E6890FAA702
|
||||
:204B8300EEF053C07F53A1FE43A11075A8A0EB70147854E2F5F008E242F008E242F008E2DB
|
||||
:204BA30045F070012253BEFBE5BE30E5FBE5C654384441F5C6E5C630E6FB43BE0453C67F9B
|
||||
:204BC3007854C3E2F5F074F095F008E2F5F074FF95F008E2F5F0E495F008E2F5F0E495F05C
|
||||
:204BE300501B7DF07EFF7854E22410F208E23400F208E234FFF208E234FFF280117854E21C
|
||||
:204C0300FD08E2FE7854E4F208F208F208F2EB60067A007C0080047A107C008AA175C000EB
|
||||
:204C230043D6817AA67CFA8AD48CD575D60175A204E5A570FC75A2028EA48DA3AEA5EEB5B4
|
||||
:204C4300A50280FA43C702EB60077B0075BE07800375BE06000000E5BE5403600875D701B2
|
||||
:204C6300004387010053C7FDE5BE30E5FB75BE00E5BE30E5FB75C679E5BE30E6FB7E007D53
|
||||
:1B4C830000000DBD80FB0EBE80F575C639E5C620E6FB75C63875BE04024B91E8
|
||||
:0E7677000606060606060407070707070704AF
|
||||
:204C9E00AF8275BB0074304FF5B575B473E5B420E6FBE5B430E7FBAEBA7F00ADBB7C0090BC
|
||||
:204CBE00FAB2EC4EF0ED4FA3F08FB522C21590FAB2E0FEA3E08E82C4C582C4540F6582C569
|
||||
:204CDE0082540FC5826582C582F58374E2C0E07404C0E0124451AC82AD83AEF0FF15811589
|
||||
:204CFE008190FAB0E0FAA3E0FB74FFC0E07407C0E08A828B83124451A882A983AAF0FB1594
|
||||
:204D1E00811581ECC398FCED99FDEE9AFEEF9BFF747DC0E08C828D838EF0EF124412AC82D7
|
||||
:204D3E00AD83AEF0FF1581EFC40354F8CEC403CE6ECE54F8CE6EFFEDC40354074EFEEDC4BE
|
||||
:204D5E000354F8CCC403CC6CCC54F8CC6CFDEF30E70FD215C3E49CFCE49DFDE49EFEE49F12
|
||||
:204D7E00FF90FAAEE0C0E0A3E0C0E08C828D838EF0EF124760AC82AD83AEF0FF15811581D0
|
||||
:204D9E0074FF2CFC74033DFDE43EFEE43FFF74FFC0E07407C0E08C828D838EF0EF124760F5
|
||||
:164DBE00AC821581158190FAB4ECF030150790FAB4C3E49CF0228C
|
||||
:204DD400E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB82
|
||||
:204DF400004380040022C007C006AF82BF64004027BF6A00502290DF097421F090DF0A74E9
|
||||
:204E14003BF090DF0B7413F08F06EE249CFE90DF0675F003A4F0802F90DF097422F090DF94
|
||||
:204E34000A74BBF090DF0B7413F0BFC8004013BFE100500EEF2438FF90DF0675F00CA4F0A8
|
||||
:204E5400800590DF06E4F0D006D00722C00775E10490DF3BE0B401FCD00722124E607F000D
|
||||
:204E74008F057EDFEFC390753F938D828E83F00FBF200040EB90DF237488F090DF247431C5
|
||||
:204E9400F090DF257409F090DF2E748EF075911075ED00759D0075EF0322C007AF82C3EFC1
|
||||
:204EB4006480946250047FE2800EC3748A8FF063F08095F050027F0A741E2FC31390755F53
|
||||
:204ED4009390DF2EF0D00722C007C006AE82AF838ED48FD575D601000000000000000000A4
|
||||
:204EF400D006D0072275D68100000000000000000022C007C006C005AE82AF83124EF98F45
|
||||
:204F14000590FC78EDF090FC79EEF07E767FFC8E828F83124EDCD005D006D00722C007C0BC
|
||||
:204F340006C005AE82AF83124EF98F0590FC7EEDF090FC7FEEF07E7E7FFC8E828F83124E7A
|
||||
:204F5400DCD005D006D00722301604E5EF700122124E6053C0FE43B801E5ED75F080A424C0
|
||||
:204F7400B6F58274FA35F0F583124F0675E1022253B8FE124EF9124E6075D10053C0FE2269
|
||||
:204F9400AE82AF837CFF7DFF124F848E828F83124F3175E90075E103E5E920E42375820F59
|
||||
:204FB400C005C004124C9ED004D00590FAB2E0FEA3E0FFC3EE9CEF9D50DE8E048F0580D88E
|
||||
:204FD400124EF9C005C004124F5CD004D0057423C0E08C828D831248A615817404C0E01260
|
||||
:204FF40043EFAC82AD83158190F0E7ECF0EDA3F022C025C0E0C0F0C082C083C007C006C08B
|
||||
:2050140005C004C003C002C001C000C0D075D000E5D130E040E5ED75F080A424B6FE74FA31
|
||||
:2050340035F0FF53D1FE8E828F83E0FD248240200D0DED2EF582E43FF583E0FF30E711E5DE
|
||||
:20505400ED04FF8FEDBF030375ED00E5EF14F5EF124F5C800F7474C0E07475C0E0125A46CE
|
||||
:205074001581158153C0FED0D0D000D001D002D003D004D005D006D007D083D082D0F0D06E
|
||||
:20509400E0D02532201806124F84C21622201605D216024F5C22E59D75F080A424B6FE748F
|
||||
:2050B400FA35F0FF8E828F83E0FD7403B5EF047582FF228D037C0074022BF9E43CFAE92EB1
|
||||
:2050D400F582EA3FF583E0FA747F5AD39494F4FABA7F0040047AFF8003EA2AFA90F0BFEAE4
|
||||
:2050F400F00BBB00010CEB2EF582EC3FF583E0A2E71324B390F0C0F00EBE00010FC005C0C2
|
||||
:2051140006C00790F95B124630158115811581E59D04FF8F9DBF0303759D00D21910AF024C
|
||||
:20513400C219E5EFFF04F5EFA21992AFEF7007C005124F5CD0058D8222D21A10AF02C21A52
|
||||
:10515400AFEF75EF03A21A92AFEF7003024F5C2218
|
||||
:20753F00D3917D044522000F0022BB131D3B1373A7650700181E1CC700B0B610EA2A001F2E
|
||||
:20755F00030506080B0E191C242527293855408D8A84CAC4C0646D612069727120756E6553
|
||||
:09757F00787065637465640A000C
|
||||
:10768500DFD900008080131A0000DFD9207E134265
|
||||
:1700E10090FC477456F090FC487412F090FC4903F090FC4A7485F0AA
|
||||
:20516400E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBEE
|
||||
:20518400004380040022C007C006C005C004C003C002C001C000E582785BF27E00C21C7806
|
||||
:2051A4005CE4F2C006785CE2C0E09010001243EFAA82AB831581785DEAF2EB08F2785F74E8
|
||||
:2051C40004F2E408F2785DE2FA08E2FBE4FCFE7404C0E0E4C0E0744BC0E074FCC0E08A826C
|
||||
:2051E4008B838CF0EE1206E1E58124FCF5817404C0E07447C0E074FCC0E090FC4B1245C4C9
|
||||
:20520400158115811581921DD006201D030252EE785FE2FB08E2FCC3941040030252EEC07B
|
||||
:2052240006785D795FE3C5F0E225F0FB09E3C5F008E235F0FAE4FCFE7402C0E0E4C0E07497
|
||||
:205244004BC0E074FCC0E08B828A838CF0EE1206E1E58124FCF58190FC4BE0F51A74FFB5E8
|
||||
:205264001A05D0060252EED006785BE2B51A5D90FC4CE0FCBC020040531C1C8C06785AC3D8
|
||||
:20528400E29C5004785AE2FCC0067B007858E2F51B08E2F51C785DE2FD08E2FF74022DFD4D
|
||||
:2052A400E43FFF785FE22DFD08E23FFA7E007F00C004C003C01BC01C8D828A838EF0EF12EC
|
||||
:2052C40006E1E58124FCF581D21CD00690FC4CE0FF7D00785FE2FB08E2FCEF2BFBED3CFC1B
|
||||
:2052E400785FEBF2EC08F2025214785CE22401F2785CE2B40A0050030251A7301C048E0735
|
||||
:2053040080027FFF8F82D000D001D002D003D004D005D006D00722758204C007C006C0056D
|
||||
:20532400C004C003C002C001C0001217C412539CD000D001D002D003D004D005D006D00715
|
||||
:20534400301B26C007C006C005C004C003C002C001C0001216E912539CD000D001D002D067
|
||||
:2053640003D004D005D006D007758204C007C006C005C004C003C002C001C0001217FD751E
|
||||
:205384008200125C24D000D001D002D003D004D005D006D007D2AF22D21B785874A2F2747D
|
||||
:2053A400FD08F2785A7407F275822A12518AE582FF30E71B785874A2F274FD08F2785A7484
|
||||
:2053C40006F275820112518AE582FF30E701227404C0E0E4C0E0C0E090FDB212459815814C
|
||||
:2053E400158115817404C0E074B2C0E074FDC0E090FDA41245C4158115811581921E501D63
|
||||
:205404007404C0E074B2C0E074FDC0E0906A721245C4158115811581921E40012290F9575D
|
||||
:205424007444F090F9567467F090FDA4E0FF90F953F090FDA5E0FE90F952F090FDA6E090BC
|
||||
:20544400F951F090FDA7E090F950F090FDA4E4F07D007C00C006C005C007C00474A2C0E067
|
||||
:2054640074FDC0E0E4C0E07488C0E07475C0E0125A46E58124F7F58190F950E0FF7E0090FF
|
||||
:20548400F951E0FD7C00C007C006C005C0047496C0E07475C0E0125A46E58124FAF58190E0
|
||||
:2054A400FDA2E024BF90F955F090FDA3E024BF90F954F090F956E0FF7E0090F957E0FD7C83
|
||||
:2054C40000C007C006C005C00474A0C0E07475C0E07436C0E074FCC0E0125ABFE58124F86E
|
||||
:2054E400F58190F954E0FF7E0090F955E0FD7C00C007C006C005C00474A0C0E07475C0E06E
|
||||
:20550400743AC0E074FCC0E0125ABFE58124F8F58190F952E0FF7E0090F953E0FD7C00C0D9
|
||||
:2055240007C006C005C00474A0C0E07475C0E0743EC0E074FCC0E0125ABFE58124F8F5814F
|
||||
:2055440090F950E0FF7E0090F951E0FD7C00C007C006C005C00474A0C0E07475C0E07442D5
|
||||
:20556400C0E074FCC0E0125ABFE58124F8F581785874AEF274FA08F2785A7402F2758212C5
|
||||
:2055840012518AE58230E70122785874B0F274FA08F2785A7402F275820912518AE582306D
|
||||
:2055A400E70122C21B229055B57416C39582F5F02275F020C2ADC2AC43AE0100E5AE20E7EB
|
||||
:2055C400FB05AD05ADD5F0F09000008583AD8582ACA375AB2275F00275F900E5F830E1FB18
|
||||
:2055E40053F8FDE5F820E0FBC0F9D5F0EB43AE02E5AE20E6FBD0E0D0AFF5AFE5AE20E6FB30
|
||||
:2056040053AEFDE5AE20E7FBE583B440BE75C90B80FEC007C006C005C004C0031255AAAC7C
|
||||
:2056240082AD83AEF0FF8E03C003C004C00590FDA212463015811581158175D6FF75A8005A
|
||||
:2056440075C70390FDA2E473D003D004D005D006D00722C007C00675A80075B800759A0050
|
||||
:2056640075C70075BE00E5BE30E5FB75C679E5BE30E6FB7F007E00000EBE80FB0FBF80F515
|
||||
:2056840075C639E5C620E6FB75C63875BE04D006D0072243B404E5B4540C600280F8E5BCFE
|
||||
:2056A40065BDF58222125697C082125697C082125697C082125697D083D0F0D0E022C000C4
|
||||
:0B56C4008582BC7861E2F5BCD00022BA
|
||||
:20758800534E20257325303278253032780025303278253032780A002530325825303258C6
|
||||
:0175A80000E2
|
||||
:2056CF00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB7E
|
||||
:2056EF00004380040022C007C083C082858107C004C003C002C001C00074F42581F8868380
|
||||
:20570F0018868218860018E0A36013B4250B7C007A00E0A36008B425161259D780E9D0007F
|
||||
:20572F00D001D002D003D004D082D083D00722B4630518E61880E2FB4420B46D3AEB5420C5
|
||||
:20574F0003F9C083C0821259737C0874FF2C93C083C082FAC47B02540F29905A06931259EB
|
||||
:20576F00D7EADBF3D082D083DC06D082D0838097743A1259D780D4EBB42A09BA009B740168
|
||||
:20578F004CFC808EB43007BA0004740680F2FB24D0501224F6400E240AFB740A8AF0A42B66
|
||||
:2057AF00FA740480DBBB6C0DEC54086004741080CF740880CBBB733CEC5408C083C08270EC
|
||||
:2057CF000512597A8003125973EC54047009E0A360981259D780F7BA0002808EE0A3600AC7
|
||||
:2057EF001259D7DAF780830258C774201259D7DAF9025779EB4420B478EDC083C082125990
|
||||
:20580F0090C083C082E5F023F90324FF2582F582E5833400F583E054F0701119E0700D19E7
|
||||
:20582F001582E582B4FF021583D5F0EAB9000109EC5420600B09EC54026005742D1259D73E
|
||||
:20584F00EC54046018EAC39940136011FAEC5402C4032420F582E5821259D7DAF9EC5420D9
|
||||
:20586F00600B19EC54027005742D1259D7EB542003FAD082D083E904C313FC142582F58209
|
||||
:20588F00E5833400F583E954016005E079018005E07902FBC4540F2AC083C082905A0693B4
|
||||
:2058AF00D082D0831259D7EBD9EB1582E582B4FF021583DCDB025779BB640674204CFC80EE
|
||||
:2058CF0008BB75028003025716C083C082125990C0F07408C395F0244FF9E434FCFBE0A39B
|
||||
:2058EF001259CCF0A31259CCD5F0F31259CCF5F0EC54206028E5F054807006EC54DFFC8022
|
||||
:20590F001CD0F0C0F07408C395F0244FF582E434FCF583C3E0F9E499F0A3D5F0F775F00ADB
|
||||
:20592F00E4F0A3D5F0FBD0E0C403FB90FC5775F00AE0F9540F24FBE950022403F954F0243F
|
||||
:20594F00B0E950022430F0A3D5F0E690FC4FC375F012E033F0A3D5F0F9DBD090FC5775F04F
|
||||
:20596F000A02581086831886821822E61860F5648060F164C0600585938380EA7583FF80B4
|
||||
:20598F00E5EC5401701F88F07583FFEC5418600A5410600418181818181818888218E5F0AB
|
||||
:2059AF00C398F5F022EC5418600E5410600575F00880B175F00480AC75F00280A7C583CB13
|
||||
:2059CF00C583C582C9C58222C083C082C001C0008F008682188683181818188601188600B4
|
||||
:2059EF001259FBD000D001D082D08322C082C083850082850183223031323334353637383F
|
||||
:205A0F003941424344454630313233343536373839616263646566C007C006C005C004FF32
|
||||
:205A2F00BF0A0675820D12435C8F8212435CD004D005D006D00722C007C001C000A20B9212
|
||||
:205A4F001FE58124FAFF200B03124370C007E58124F9F8E6C0E008E6C0E0E4C0E0C0E09098
|
||||
:205A6F005A261256F5E58124FBF581201F03124385D000D001D00722C007C006C005C00473
|
||||
:205A8F00C003C001AC82FF8C018F0487060987071974012EFBE43FFDA70309A7058E828F2D
|
||||
:205AAF0083ECF0D001D003D004D005D006D00722C007C006C005C001C000E58124F6FFE525
|
||||
:205ACF008124F8FE7D00C007E58124F5F8E6C0E008E6C0E0C006C005905A871256F5E5818E
|
||||
:195AEF0024FBF58124F8F88682088683E4F0D000D001D005D006D00722C3
|
||||
:0200F800C22024
|
||||
:205B0800E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB40
|
||||
:205B2800004380040022C007AF82E58620E0FB53807F008F82125CAB00E58620E0FB438071
|
||||
:205B480080D0072253BEFC32AE82AF838E828F83E493FD74012EFBE43FFCEDFA6052539054
|
||||
:205B6800FD008B828C83E493FD0BBB00010CE58620E0FB53807F008D82125CAB00E5862052
|
||||
:205B8800E0FB438080EA14FDED6015E58620E0FB8B828C83E493F5C1A3AB82AC831D80E84F
|
||||
:205BA8008B068C07E58620E0FB0043900200809C2230200122D220758201125C244390027C
|
||||
:205BC8005380BF43F42875C20075C5317586009000FDE4F5F01249E24390049000FDE4F55F
|
||||
:205BE800F01249E22090FD9075A9125B505390FD00E58620E0FB53807F00758204125CABAC
|
||||
:205C080000E58620E0FB4380803090FDE58620E0FB00439002009075B5025B50E582601697
|
||||
:205C280090F953E054F0600122438FC143FDC143F62E43FE2E2253F4D790F953E0FF54F030
|
||||
:205C4800600B53807E5390D100D2860022538F3A53FD3A53F6D153FED122202001229076E5
|
||||
:205C680041125B50758200125C24C22022125BB95390FD003021067E137F0080047E107F93
|
||||
:205C880000E58620E0FB53807F008E82125CAB00E58620E0FB438080E58620E0FB00439039
|
||||
:205CA800020022C007AF82E58620E0FB8FC1D007227EFF7FFF744EC0E07476C0E0125A4678
|
||||
:205CC8001581158190764BC007C006125B50D006D00720902F900032E4F5F0C007C006123F
|
||||
:205CE8004A5112565775820F124C9ED006D00790FAB2E0FCA3E0FDC3EC9EED9F50D48C066C
|
||||
:205D08008D0780CE7423C0E08E828F831248A615817404C0E01243EFAC82AD83158190F0DA
|
||||
:205D2800E9ECF0EDA3F07582011217C4125C621219A27460C0E07476C0E0125A4615811539
|
||||
:025D48008122B6
|
||||
:2075A900050107000900040607070F0002008F046180012802302902501702820802602212
|
||||
:2075C900102001010103040906060A040419030409102101010103840986460A844419039A
|
||||
:2075E9004409102201010143040986460A84441983040910250A0A0102140D1414010000D3
|
||||
:207609000000000010264A4A0182540D54540100000000000010270A0A0102140D14140172
|
||||
:20762900000000000000102401810183840986460A84441903040900028200050102000027
|
||||
:2076490000000112005570646174696E6720646973706C61790A0055706461746520636F5D
|
||||
:087669006D706C6574650A0088
|
||||
:205D4A00AE82AF837C007D007B10EF235401FAEE2EFEEF33FFEC2CFCED33FDEA60034304F2
|
||||
:205D6A00017862C3E2F5F0EC95F008E2F5F0ED95F040117862D3E29CF4B3FCB308E29DF4B5
|
||||
:0B5D8A00FD430601DBC48E828F8322E4
|
||||
:205D9500AC82AD83AEF0FF33E433FB6013C3E49CF556E49DF557E49EF558E49FF5598008B8
|
||||
:205DB5008C568D578E588F59AC56AD57AE58AF597867E233E433FA60207864E2D3F43400E8
|
||||
:205DD500F55608E2F43400F55708E2F43400F55808E2F43400F55980117864E2F55608E2C2
|
||||
:205DF500F55708E2F55808E2F559786CE556F2E55708F2E55808F2E55908F28C828D838E71
|
||||
:205E1500F0EFC003C002125E697868C0E0E582F2E58308F2E5F008F2D0E008F2D002D003D7
|
||||
:205E3500EA6B60207868E2D3F43400FA08E2F43400FB08E2F43400FE08E2F434008A828BFB
|
||||
:145E5500838EF0227868E2F58208E2F58308E2F5F008E222A0
|
||||
:205E6900AF82AE83ADF0FC7870EFF2EE08F2ED08F2EC08F27A007B007E007F007D20787326
|
||||
:205E8900E2235401FC7870E225E0F208E233F208E233F208E233F2EA2AFAEB33FBEE33FE6F
|
||||
:205EA900EF33FFEC6003430201786CC3E2F5F0EA95F008E2F5F0EB95F008E2F5F0EE95F0C5
|
||||
:205EC90008E2F5F0EF95F04022786CD3E29AF4B3FAB308E29BF4B3FBB308E29EF4B3FEB3D3
|
||||
:1D5EE90008E29FF4FF7870E24401F2DD917870E2F58208E2F58308E2F5F008E22233
|
||||
:0600B200E478FFF6D8FD22
|
||||
:200090007924E94400601B7A0190767178627593FCE493F2A308B800020593D9F4DAF275C7
|
||||
:0200B00093FFBC
|
||||
:1B5F060020F71130F6138883A88220F509F6A8837583002280FEF280F5F0229A
|
||||
:205F2100AA83AB828BF090F075E0A4F8A9F08AF0E0A429F98BF0A3E0A429F58388822222D0
|
||||
:205F4100AF82AE83ADF0FC787BEFF2EE08F2ED08F2EC08F2787BE2FF7879E28FF0A4FFAD46
|
||||
:205F6100F07881EFF208EDF2787BE2FF7877E28FF0A4FFADF0787FEFF208EDF27882E2FF71
|
||||
:205F8100787EE2FE7877E28EF0A42FFF7882F2787DE2FE7878E28EF0A42F7882F27881E25E
|
||||
:205FA100FE08E2FF787DE2FD7877E28DF0A4ABF02EFEEB3FFF7881EEF208EFF2787CE2FDAE
|
||||
:205FC1007878E28DF0A4ABF02EFEEB3FFF7881EEF208EFF2787CE2FF7879E28FF0A4787E5A
|
||||
:205FE100F2787CE2FF7877E28FF0A4FFADF0787CEFF208EDF2787BE2FF787AE28FF0A4784A
|
||||
:206001007AF2787BE2FF7878E28FF0A4FFADF07878EFF208EDF27877E4F2787BF2787FE273
|
||||
:20602100F55A08E2F55B08E2F55C08E2F55D787BE2FA08E2FB08E2FE08E2FFEA255AF55A22
|
||||
:20604100EB355BF55BEE355CF55CEF355DF55D787FE55AF208E55BF208E55CF208E55DF2F8
|
||||
:20606100787FE208E208E208E27877E2FC08E2FD08E2FE08E2FFEC255AFCED355BFDEE35FF
|
||||
:0C6081005CFEEF355D8C828D838EF0227A
|
||||
:20608D00AE82AF837D007C007884E2235401FB70357883E225E0F208E233F27883C3E2F52A
|
||||
:2060AD00F0EE95F008E2F5F0EF95F050147883E2F5F008E2C313C5F01318F2C5F008F28046
|
||||
:2060CD00050C8C0580C27883C3E2F5F0EE95F008E2F5F0EF95F0400E7883D3E29EF4B3FE53
|
||||
:2060ED00B308E29FF4FF7883E2F5F008E2C313C5F01318F2C5F008F28D041DEC70C88E827F
|
||||
:03610D008F83225B
|
||||
:20611000AD82AE83AFF07888E2F5F008E245F07004900000227888E2FB08E2FC1BBBFF01CB
|
||||
:206130001CEB4C6069C003C0048D5A8E5B8F5C855A82855B83855CF012628FFA7885E2F58B
|
||||
:206150005D08E2F55E08E2F55F855D82855E83855FF012628FFCEAB504028006D004D003E8
|
||||
:20617000802C7401255AFAE4355BFBAC5C8A058B068C077401255DFAE4355EFBAC5F7885E0
|
||||
:20619000EAF2EB08F2EC08F2D004D003808E8D828E838FF012628FFD7F007885E2FB08E2B1
|
||||
:1A61B000FC08E2FE8B828C838EF012628FFB7E00EDC39BF582EF9EF58322F2
|
||||
:2061CA00AE82E583FF33E433FD6009C3E49EFBE49FFC80048E038F04788BE233E433FF6079
|
||||
:2061EA0010788AE2D3F43400FA08E2F43400FE8007788AE2FA08E2FE7862EAF2EE08F28B26
|
||||
:20620A00828C83C007C005125D4AAC82AE83D005D007EF6D600AC3E49CF582E49EF58322F7
|
||||
:05622A008C828E83222E
|
||||
:2000B800788CE84400600A79007593F0E4F309D8FC78D6E8440B600C790C90F08CE4F0A370
|
||||
:0400D800D8FCD9FA7D
|
||||
:0F008100E4737581641262ABE582600302007E56
|
||||
:20622F00758911758800758B00758D0020B0FD20B0FA20B0F720B0F420B0F130B0FDD28E21
|
||||
:20624F0020B0FD30B0FD20B0FD30B0FDC28EE58D25E0FFE58B2354014FF58DE58D25E0FFE6
|
||||
:20626F00E58B232354014FF58DE58DF4F58DE58D04F58D858D8B758921758780759852229A
|
||||
:1C628F0020F71430F6148883A88220F507E6A88375830022E280F7E49322E0221E
|
||||
:0462AB0075820022D6
|
||||
:00000001FF
|
||||
BIN
binaries/Tag/chroma29_full_0015.bin
Normal file
BIN
binaries/Tag/chroma29_full_0015.bin
Normal file
Binary file not shown.
997
binaries/Tag/chroma29_full_0015.hex
Normal file
997
binaries/Tag/chroma29_full_0015.hex
Normal file
@@ -0,0 +1,997 @@
|
||||
:040000000200833245
|
||||
:01000B0032C2
|
||||
:0100130032BA
|
||||
:01001B0032B2
|
||||
:0100230032AA
|
||||
:03002B00024AA9DD
|
||||
:01003300329A
|
||||
:01003B003292
|
||||
:0300430002506BFD
|
||||
:03004B000249C6A1
|
||||
:01005300327A
|
||||
:01005B003272
|
||||
:01006300326A
|
||||
:01006B003262
|
||||
:01007300325A
|
||||
:03007B00025BB273
|
||||
:0300FA0002007E83
|
||||
:03007E0002050672
|
||||
:2000FD00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBA6
|
||||
:20011D00004380040022AF8290F090E4F090F091F08F061FEE60767E0090F95AE0FDBD024E
|
||||
:20013D000BEE90631593FDBDC800405990F95AE0FDBD010BEE90631593FDBDC8005046EEDB
|
||||
:20015D002415FCE43463FD8C828D83E493F582C007C006C005C004121C58E582D004D0051D
|
||||
:20017D00D006D007601F90F090E0FB90F0BFE0FAC3EB9A501090F090EAF08C828D83E4930B
|
||||
:20019D00FC90F091F00EBE0C005086808C90F091E0FFE06013BFC800400890F95A7402F030
|
||||
:2001BD00800690F95A7401F090F091E0F5822290F0EDE0FEA3E0FFC3742C9E74019F40099F
|
||||
:2001DD0090F0E3E0700330015E300A0920020690F0C6E0700930031E90F0C7E0601890FC37
|
||||
:2001FD0061E0FFBFFF02800B7824E4F28F8212277B8003123D60121E24AD82AE83AFF0900B
|
||||
:20021D00F092EDF0EEA3F0EFA3F0ED4E602D90F0EDE4F0A3F010010090F0E3E06002D2013A
|
||||
:20023D0090F0E3E4F08014121F0FAD82AE83AFF090F092EDF0EEA3F0EFA3F012189890F063
|
||||
:20025D0092E0FDA3E0FEA3E0FFED4E700990F0E1E4F0A3F08059740F2DFAE43EFB8F048AD6
|
||||
:20027D00828B838CF01262F5FAA31262F5FB90F0E1EAF0EBA3F0740D2DFAE43EFB8F048A50
|
||||
:20029D00828B838CF01262F560168D828E838FF01231B6E582701890F0E1E4F0A3F0800F78
|
||||
:2002BD007423C0E07463C0E0125AAC158115811218E3AE82AF8390F0EDE0FCA3E0FD90F077
|
||||
:2002DD00EDEE2CF0EF3DA3F0BE580CBF020990F0C5E06003C2002290FA5BE0600E90FA5BDB
|
||||
:2002FD00E4F0900064E4F5F00217E390F0E1E0FEA3E0FF4E603BEF30E71F8E048F05530507
|
||||
:20031D007F7877ECF2ED08F2E408F208F29003E8E4F5F0125FA70217E37877EEF2EF08F2A5
|
||||
:20033D00E408F208F290EA60E4F5F0125FA70217E31218E3AE82AF837877EEF2EF08F2E406
|
||||
:20035D0008F208F29003E8E4F5F0125FA70217E390F0CEE0FF600D8F82121C58E58290F913
|
||||
:20037D0059F0800C758202120123E58290F959F090F959E0700920030690F0C7E0701430E4
|
||||
:20039D000A0920020690F0C6E0700890F0E4E0FFBF233690FC61E0FFBFFF02801A758202ED
|
||||
:2003BD00123F00E582702290FC61E0FF7824E4F28F8212277B801290F0E4E0FFBF230040DC
|
||||
:2003DD0005123EA18003123E5E90F959E0604890F0E4E4F090F0CEE0700F75820412179EC8
|
||||
:2003FD001214B67582041217D790F0E374FDF090002812177B1218E3AE82AF837877EEF2AB
|
||||
:20041D00EF08F2E408F208F29003E8E4F5F0125FA71217E3D2002275820112185EAC82AD47
|
||||
:20043D0083AEF0FF7877ECF2ED08F2EE08F2EF08F29003E8E4F5F0125FA70217E3E582FF3C
|
||||
:20045D0024FA50030204EEEF2F2F90046B730249C202047D0204940204C40204EE0204D09D
|
||||
:20047D00742EC0E07463C0E0125AAC15811581C20090F959E4F02290F959E0FE743BC0E0B9
|
||||
:20049D007463C0E0125AAC15811581758204C00612179E1213701214B67582041217D7D0C0
|
||||
:2004BD000690F959EEF022123A7F900000E4F5F00217E3744BC0E07463C0E0125AAC158193
|
||||
:2004DD00158175820412179E1227677582040217D77E00C007C006745BC0E07463C0E01219
|
||||
:2004FD005AACE58124FCF5812275820112179E75820F124D0490FAB0E0FEA3E0FF7423C0A2
|
||||
:20051D00E08E828F8312490C15817404C0E0124455AC82AD83158190F0E5ECF0EDA3F090B7
|
||||
:20053D006321E493C0E0740193C0E0746DC0E07463C0E0125AACE58124FCF5811253811257
|
||||
:20055D00197C12193490F0E374FCF0AEBE5306187F00BE1009BF000690F0E374FEF0301CBE
|
||||
:20057D000C123EFA900000E4F5F01217E37434C0E074FCC0E0E4C0E074A2C0E07463C0E09A
|
||||
:20059D00125AACE58124FBF5811237B4900190E4F5F01217E375820412179E1213E2123726
|
||||
:2005BD009B90F0C2E0601174AAC0E07463C0E0125AAC15811581801B74BBC0E07463C0E096
|
||||
:2005DD00125AAC15811581123B2E902710E4F5F01217E390F959E0FFE0601F8F82121C58EC
|
||||
:2005FD00E582702574C8C0E07463C0E0125AAC1581158190F959E4F0800F74E6C0E0746335
|
||||
:20061D00C0E0125AAC1581158190F959E0700312036D90F959E06007123D60D200800512E1
|
||||
:20063D003E5EC20075820412179E1214B63000067E287F0080047E587F028E828F83121720
|
||||
:20065D007B30000A7C887D137E007F0080087CC07DD47E017F008C828D838EF0EF1217E38D
|
||||
:0D067D003000051201CC80F812036D80F3EF
|
||||
:20631500C864C965CA66CB67CC68CD6915004E6F207570646174650A00434D445F444F5F9E
|
||||
:206335005343414E0A0052657365742073657474696E67730A0045726173696E6720696DBC
|
||||
:20635500616765730A00436D6420307825782069676E6F7265640A000A6368726F6D61323D
|
||||
:2063750039204F45504C2076253034782C20636F6D70696C6564204A756C203137203230FA
|
||||
:2063950032352031323A34373A30380A004D41432025730A00446F696E672066617374203B
|
||||
:2063B500626F6F740A004E6F726D616C20626F6F740A004E6F20415020666F756E64206F8A
|
||||
:2063D5006E207361766564206368616E6E656C0A004E6F207361766564206368616E6E6587
|
||||
:0363F5006C0A002F
|
||||
:0176A50001E3
|
||||
:20068A00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB13
|
||||
:2006AA00004380040022AC82AD83AEF0FF00C2A0007582031243C28E821243C28D8212434E
|
||||
:2006CA00C28C820243C2C007C006C005C004C003C002C001C000AC82AD83AEF0FFE5812498
|
||||
:2006EA00F5F8860208860300C2A0007582031243C28E821243C28D821243C28C821243C205
|
||||
:20070A008A068B07E58124F3F886040886058C028D031CBCFF011DEA4B6015758200124312
|
||||
:20072A00C2AB828E828F83EBF0A3AE82AF8380DE00D2A000D000D001D002D003D004D005FF
|
||||
:20074A00D006D00722AF8200C2A0008F821243C200D2A0002200C2A0007582051243C27587
|
||||
:20076A0082001243C2E58220E0F500D2A00022AC82AD83AEF0FF7803E2FA08E2FBC007C028
|
||||
:20078A0006C005C004C003C00212075F75820612074FD002D003D004D005D006D00700C2A1
|
||||
:2007AA00A0007582021243C28E821243C28D821243C28C821243C28A068B077805E2FC0888
|
||||
:2007CA00E2FD8C028D031CBCFF011DEA4B60128E828F83E0FBA3AE82AF838B821243C280D0
|
||||
:2007EA00E100D2A0002212075F7582B912074FC20C227582AB12074F75F034D5F0FDD20CB7
|
||||
:20080A0022C007C006C005C004C003C002C001C000C082C083C0F0C0E005810581E5812425
|
||||
:20082A00EFF88605088604E58124EDF8E608467003020904C005C004E58124F9F8860208F1
|
||||
:20084A007B00E58124FDF8E4C39AF674019B08F6E58124FDF8E58124EBF9C3E79609E7082A
|
||||
:20086A0096D004D005500EE58124EDF8A98119E6F708E609F77803EDF2EC08F2A88118795A
|
||||
:20088A0005E6F308E609F3E58124FBF886820886830886F008E6C007C006C005C004C003AB
|
||||
:2008AA00C002C001C000C025120779D025D000D001D002D003D004D005D006D007A88118A2
|
||||
:2008CA008602088603E4FEFFE58124FBF8EA26F6EB0836F6EE0836F6EF0836F6A88118E606
|
||||
:2008EA002DFD08E63CFCE58124EDF8A98119E6C397F608E60997F6020831E58124FAF581FD
|
||||
:20090A00D000D001D002D003D004D005D006D00722C007C006C005C004C003C002C001C0F3
|
||||
:20092A0000C082C083C0F0C0E0E58124FDF88602088603EA7005EB540F6006758200020A2A
|
||||
:20094A001EE58124F1F8E608467003020A1B758206C007C006C005C004C003C002C001C015
|
||||
:20096A0000C02512074FD025D000D001D002D003D004D005D006D00700C2A000E58124F1B2
|
||||
:20098A00F886020886037582201243C2E58124FDF8080886821243C2E58124FDF8088682D1
|
||||
:2009AA001243C2E58124FDF886821243C200D2A000C007C006C005C004C003C002C001C0EA
|
||||
:2009CA0000C02512075FD025D000D001D002D003D004D005D006D0077401C0E09010001258
|
||||
:2009EA004455AC82AD83AEF0FF1581E58124FDF8EC26F6ED0836F6EE0836F6EF0836F61ABC
|
||||
:200A0A00BAFF011BE58124F1F8A60208A60302094B758201E58124FCF581D000D001D0026E
|
||||
:0B0A2A00D003D004D005D006D0072276
|
||||
:200A3500E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB64
|
||||
:200A5500004380040022C007C006C005C004AF82AE83ADF0FC90F0BBEFF0EEA3F0EDA3F06C
|
||||
:200A7500ECA3F0C202C203D208758204C007C006C005C004C003C002C001C000C02512175A
|
||||
:200A95009ED025D000D001D002D003D004D005D006D00790F0BBE0FCA3E0FDA3E0FEA3E077
|
||||
:200AB500FF7416C0E0E4C0E074F3C0E074F0C0E08C828D838EF0EF1206D0E58124FCF581FA
|
||||
:200AD50090F0BBE0FCA3E0FDA3E0FEA3E0FF90F0BB74162CF0E43DA3F0E43EA3F0E43FA357
|
||||
:200AF500F090F103E0FFBF2004C207806A90F103E0FFBF2104D207805E90F103E0FF7E0019
|
||||
:200B1500C007C00674E0C0E07469C0E0125AACE58124FCF58190FA6E7416F0E4A3F090F045
|
||||
:200B3500F375F000C007C006C005C004C003C002C001C000C025121B0BD025758204C0253A
|
||||
:200B55001217D7D025D000D001D002D003D004D005D006D0078051C222C007C006C005C028
|
||||
:200B750004C003C002C001C000C025125CDBD025C025120BC6D025D222C025125CDBD0255F
|
||||
:200B9500C025120BC6D025758204C0251217D7D025C025125D1FD025D000D001D002D00300
|
||||
:200BB500D004D005D006D007D004D005D006D007227F807E0090F0ABE4F0A3F090F0A5F02E
|
||||
:200BD500A3F05390FD007D00200803020C5930221D20071A74A0C0E07404C0E0E4C0E090EE
|
||||
:200BF500F0F31245FE158115811581020CA9C00590F0BBE0FAA3E0FBA3E0FCA3E0FD74A0C4
|
||||
:200C1500C0E07404C0E074F3C0E074F0C0E08A828B838CF0ED1206D0E58124FCF58190F015
|
||||
:200C3500BBE0FAA3E0FBA3E0FCA3E0FD90F0BB74A02AF074043BA3F0E43CA3F0E43DA3F077
|
||||
:200C5500D005805074A0C0E07404C0E0E4C0E090F0F31245FE1581158115817B4A7C00C0FF
|
||||
:200C750007C006C005C004C0037807E2F58208E2F583120081D003D004D005D006D00790C0
|
||||
:200C9500F0A5E02401F0A3E03400F01BBBFF011CEB4C70CB7B007C00EF60503022238E020F
|
||||
:200CB500EA2AFEEB24F3F582EC34F0F583E0FAEF5A7003430601EF30E02B8E82125D1180F2
|
||||
:200CD500248E02EA2A25E0FEEB24F3F582EC34F0F583E0FAEF5A6003430603EF54116005A8
|
||||
:200CF5008E82125D11EFC313FF80AD7F800BBB00010CC3EB94A0EC9404409D90F0ABE0FB43
|
||||
:200D1500A3E0FC744A2BFBE43CFC90F0ABEBF0ECA3F00DBD04005003020BDDE58620E0FB49
|
||||
:200D3500004390020022AE82AF83C202C203C208D207C2227807EEF2EF08F2125CDB120B87
|
||||
:200D5500C6D222125CDB120BC6025D1FC007C006C005C004C003C002C001C000AD82AE839E
|
||||
:200D7500AFF0A204202201B3505090F09FE0F508A3E0F50974012DFAE43EFB8F048A828B23
|
||||
:200D9500838CF01262F5FA780CF2E408F2850882850983C007C006C005C004C003C002C00D
|
||||
:200DB50001C000120FF2E582D000D001D002D003D004D005D006D0076003020F988D828E9E
|
||||
:200DD500838FF078091262F5F290F0A1E0F508A3E0F5097809E2F50A750B00780EE50AF258
|
||||
:200DF500E50B08F2850882850983C007C006C005C004C003C002C001C000121069D000D08D
|
||||
:200E150001D002D003D00490F0ADE0F508A3E0F50990F0B1E0FBA3E0FCEBC39508F582EC7F
|
||||
:200E35009509F5837875E50AF2E50B08F2C002C001C000125F87AB82AC83D000D001D002C5
|
||||
:200E5500D005D006D007ECC423CBC423541F6BCB541FCB6BCBFC90F0B7EBF0ECA3F0740256
|
||||
:200E75002BFBE43CFCEB2DFDEC3EFE90F0A7E0FBA3E0FCEB5407700A7809E254077003026A
|
||||
:200E95000F4C5303078BF005F07B80E4FC3392D28008A2D2EC13FCEB13FBD5F0F5780AEB8C
|
||||
:200EB500F2780B7480F28D828E838FF01262F5FA74012DF50CE43EF50D8F0E7809E2F50AFA
|
||||
:200ED500AC0A150AEC7003020F98780BE25A6025C00290F0B5E0FAA3E0FCEA24F3FAEC3471
|
||||
:200EF500F0FC8A828C83E0FB780AE242038A828C83EBF0D002780BE2C313F2780BE270196F
|
||||
:200F1500850C82850D83850EF01262F5FAA385820C85830D780B7480F2780AE2C313F278D6
|
||||
:200F35000AE2709C780A7480F290F0B5E02401F0A3E03400F080897809E2604790F0B5E043
|
||||
:200F5500FBA3E0FCEB24F3FBEC34F0FC8B828C83E0F50C8D828E838FF01262F5FAA3AD8228
|
||||
:200F7500AE83E50C42028B828C83EAF090F0B5E02401F0A3E03400F07809E2FC780924F833
|
||||
:200F9500F280B4D000D001D002D003D004D005D006D0072290F0A7E0FEA3E0C423CEC42334
|
||||
:200FB500541F6ECE541FCE6ECE30E40244E0FF90F0ABE0FCA3E0FD90F0B1E0FAA3E0FBEABD
|
||||
:200FD500C39CFCEB9DC454F0CCC4CC6CCC54F0CC6CFD90F0B5EC2EF0ED3FA3F022AE82AF05
|
||||
:200FF5008390F095EEF0EFA3F090F0AFEEF0EFA3F07427C39EFE74019FFF90F0A9EEF0EF52
|
||||
:20101500A3F090F0A5E0FCA3E0FD90F0B1ECF0EDA3F0C3EE9CEF64808DF063F08095F040E5
|
||||
:201035002F780CE22CFC08E23DFDC3EE9CEF9D501F780CD3E29EF4B3FEB308E29FF4FF0EB9
|
||||
:20105500BE00010F90F0ADEEF0EFA3F07582002275820122AE82AF8390F0A7EEF0EFA3F004
|
||||
:20107500780E90F097E22EF008E23FA3F0120FA975820022C007C006C005C004C003C00284
|
||||
:20109500C001C000AC82AD83AEF0FF058105810581BF2000502C8F82C007C006C005C004AB
|
||||
:2010B500C003C002C001C000C02512430DD025D000D001D002D003D004D005D006D007023B
|
||||
:2010D50013337E00EF24E0FFEE34FFFEEF2FFFEE33FEEF24F8F582EE3463F583E493FEA353
|
||||
:2010F500E493FF90F0B7EEF0EFA3F0EFC4540FFE90F0B3F0300507EE2EFE90F0B3F090F09E
|
||||
:2011150099E0FEA3E0FF90F0B9EEF0EFA3F090F0B3E0FDFB3395E0FC0BBB00010CEB2EFB92
|
||||
:20113500EC3FFC90F099EBF0ECA3F0A204202201B3504190F0B9E0FEA3E0FF780CEDF2EDEA
|
||||
:201155003395E008F28E828F83C007C006C005C004C003C002C001C000C025120FF2E5823B
|
||||
:20117500D025D000D001D002D003D004D005D006D007600302133390F09BE0FEA3E0FF9013
|
||||
:20119500F0B4E0FD780EF2ED3395E008F28E828F83C007C006C005C004C003C002C001C074
|
||||
:2011B50000C025121069D025D000D001D002D003D004D005D006D00790F0B7E0FEA3E0FF82
|
||||
:2011D50053070F90F0B7EEF0EFA3F0A8811818760008768090F0A7E0FCA3E05304078CF0CD
|
||||
:2011F50005F07C80E4FD3392D28008A2D2ED13FDEC13FCD5F0F5A881A60490F0B3E0FD9050
|
||||
:20121500F0ADE0FAA3E0FB90F0A5E0FCA3E0FFECC39AFAEF9BFBED3395E0FFEDC39AFAEFB2
|
||||
:201235009BFB1ABAFF011B90F0B9EAF0EBA3F030050FEBC313CA13CAFB90F0B9EAF0EBA33B
|
||||
:20125500F090F0B9E0FEA3E0FF90F0B7E0FCA3E0FD90F0B7EE2CF0EF3DA3F090F0B7E0FE48
|
||||
:20127500A3E0FFEE2EFEEF33FFEE24B8F582EF3464F583E493FEA3E493FF90F0B9E4F0A31E
|
||||
:20129500F090F0B9E0FCA3E0FD90F0B4E0FB3395E0FAC3EC9BED9A4003021333A88118184E
|
||||
:2012B500E65EFC08E65FFD4C602190F0B5E0FCA3E0FDEC24F3FCED34F0FD8C828D83E0FB2B
|
||||
:2012D500A881E642038C828D83EBF030051A90F0B9E0FCA3E0FDEC30E01AA88118E618C3B0
|
||||
:2012F50013C613C608F6800CA88118E618C313C613C608F6A881E6C313F6A881E6701090F1
|
||||
:20131500F0B5E02401F0A3E03400F0A881768090F0B9E02401F0A3E03400F0021296158143
|
||||
:1513350015811581D000D001D002D003D004D005D006D00722B9
|
||||
:2063F8000070071008500D9016601CA026A03010316037603D7044904D204F6055205780C0
|
||||
:206418005F7066706D6073507880805085708C7093709A70A120A320A570AC80B470BB7055
|
||||
:20643800C2A0CCA0D670DD80E570EC70F370FA8002710971105115811D7124812C713381DD
|
||||
:206458003B7142814A7151715891617168A172A17CA186A1908198519D81A551AA81B2A191
|
||||
:20647800BC21BE71C571CC71D371DA71E181E971F071F741FB51007207420B9214721B72EA
|
||||
:2064980022722972306236623C724362499252A25C8264A26E8276627C127D6283A28D722C
|
||||
:2064B8000000000000000000000000000000D87F0078000000000000007880009804E0057C
|
||||
:2064D800801E9864E005801E80648004183808640842FCFF8841F040083810442044C04429
|
||||
:2064F80000397002880C881088207040E0001001083A08468845C84C383818006800800182
|
||||
:206518000078E00718180C300420024002400240024004200C301818E00700100018000FBE
|
||||
:206538000072000F001800104000400040004000F807400040004000400019001E008000E4
|
||||
:20655800800080008000800080001800180002000C003000C0000003000C00300040C00F27
|
||||
:2065780030300840084008403030C00F082008200820F87F0800080008001860284048402D
|
||||
:2065980088400843083C0840084208420842F03DC0004003400440184020F87F4000400043
|
||||
:2065B800087C084408441042E041E00F10320844084408441042E00100401840E0400043F1
|
||||
:2065D800004C00500060F038084508420842084590456038001E08218840884088403021F4
|
||||
:2065F800C01F1806180619061E06C000C000200120011002100208042001200120012001AF
|
||||
:20661800200120012001200108041002100220012001C000C00000700040D84000410042A1
|
||||
:2066380000640038C00F30181820C84728486850D851E03F2000200008007000C001400E11
|
||||
:206658004018400C4003C00030000800F81F08110811081108118812700CC003300C10089B
|
||||
:2066780008100810081008100818F81F08100810081008101008E007F81F8810881088102D
|
||||
:20669800881088100810F81F801080108010801080100010C003300C1008081008108810C4
|
||||
:2066B8008810F818F81F80008000800080008000F81F081008100810F81F081008100810C5
|
||||
:2066D8000800081008100810F01FF81F0001800140022004200810100800F81F08000800CD
|
||||
:2066F8000800080008000800F81F001C8007E00060008003001CF81FF81F0008000680010C
|
||||
:2067180060001000F81FE007100808100810081008101008E007F81F801080108010801025
|
||||
:206738000011000EE00710080810081008100C101208E207F81F80108010C0102011100E66
|
||||
:206758000800180E0812081108118810901070180010001000100010F81F00100010001060
|
||||
:206778000010E01F18000800080008001000E01F0010000C8003600018001800E0000003A1
|
||||
:20679800000C00100018C0073800F0000007800370003800C0070018081010082004400217
|
||||
:2067B8008001800140022004100808100010000800060001F80000010002000400080010F3
|
||||
:2067D80018102810481088100811081208140818FE7F024002400240024000400030000CE1
|
||||
:2067F8000003C00030000C0002000240024002400240FE7F2000C0000007001C0070000E7A
|
||||
:20681800C0012000040004000400040004000400040004000400040000800040300048041B
|
||||
:20683800880488049004F8030800F87F10020804080408041006E001E001100208040804E2
|
||||
:20685800080408040804E00118020804080408041002F87FE00190028804880488048804B1
|
||||
:20687800880300040004F83F00240044004400440044E00119020904090409041202FC07C8
|
||||
:20689800F87F00010002000400040004F803000400040064F8670100010401040164FE67BF
|
||||
:2068B800F87F8000C0002001200210020804004000400040F87FF807000200040004F8036D
|
||||
:2068D800000200040004F803F80700030002000400040004F803E001100208040804080479
|
||||
:2068F8001002E001FF0710020804080408041006E001E00118020804080408041002FF0723
|
||||
:20691800F8070001000200040004000718038804880448044804300400040004F01F08042C
|
||||
:20693800080408040804F0070800080008001000F807000480036000180008003000C00006
|
||||
:20695800000300040006E001180070008003800170001800E0010006080410022001C00037
|
||||
:20697800C00020011002080401040103C10062001C00180060008000000300040804180491
|
||||
:20699800280448048804080508060804800080007C3F024002400240FE7F024002400240F0
|
||||
:2069B8007C3F80008000C000000100010001800080004000400040008001F80108030804F0
|
||||
:2069D800080808040803F80164617461547970652030782578206E6F7420737570706F72A4
|
||||
:0569F8007465640A0053
|
||||
:20134A00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB46
|
||||
:20136A0000438004002290F0C17401F090F0C2E4F090F0C3F090F0C4F090F0C5F090F0C6DC
|
||||
:20138A0004F090F0C7F090F0C9E4F090F0C8F090F0CC7428F0E4A3F090F0CEF090F0CA7478
|
||||
:2013AA0028F0740AA3F090F959E4F090F95AF022AD82AE831262F5FCBC011C7BC17CF08B7E
|
||||
:2013CA00828C83740EC0E0C005C0061246961581158115810214B6227480C0E0E4C0E0749B
|
||||
:2013EA00A2C0E074FDC0E0906000E4F5F01206D0E58124FCF581740EC0E07414C0E074FE37
|
||||
:20140A00C0E090F0C112469615811581158190FDA2E0FCA3E0FDA3E0FEA3E0FFBCA513BD72
|
||||
:20142A005A10BEBA0DBFAB0A90FDA6E0FFBF0102803590FDA2E0FCA3E0FDA3E0FEA3E0FF28
|
||||
:20144A0090FDA6E0FB7A00C004C005C006C007C003C00274FDC0E07469C0E0125AACE58153
|
||||
:20146A0024F8F58102137090FDA7E090F959F090FDA8E090F95AF07423C0E0746AC0E012B6
|
||||
:20148A005AAC1581158112160890FDA2E4F004C0E0E4C0E074A2C0E074FDC0E0906000E41A
|
||||
:2014AA00F5F012080BE58124FCF581227480C0E0E4C0E074A2C0E074FDC0E0906000E4F552
|
||||
:2014CA00F01206D0E58124FCF58190FDA2E0FCA3E0FDA3E0FEA3E0FFBCA53EBD5A3BBEBA37
|
||||
:2014EA0038BFAB35788574C1F274F008F2E408F27888740EF2E408F290FE1475F0001261DF
|
||||
:20150A0076E5828583F045F0700F90FDA7E0FF90F959E0FEEFB506012290FE21E0FF90F08A
|
||||
:20152A00CEE0FEEFB50602803EEE603BBE6400502390FE21E0FF7D00C007C0057435C0E08D
|
||||
:20154A00746AC0E0125AACE58124FCF58190F0CEE4F08013BEC800400890F95A7402F080A3
|
||||
:20156A000690F95A7401F07480C0E0E4C0E0C0E090FDA21245FE158115811581740EC0E0F3
|
||||
:20158A0074C1C0E074F0C0E090FE1412469615811581158190FDA274A5F0F4A3F074BAA386
|
||||
:2015AA00F0C4A3F090FDA67401F090F959E090FDA7F090F95AE090FDA8F07401C0E0E4C0BB
|
||||
:2015CA00E0906000E4F5F012091B158115817480C0E0E4C0E074A2C0E074FDC0E090600037
|
||||
:2015EA00E4F5F012080BE58124FCF581744EC0E0746AC0E0125AAC1581158102160890F033
|
||||
:20160A00C5E0FF7E00C007C006745FC0E0746AC0E0125AACE58124FCF58190F0CEE0FF7E61
|
||||
:20162A0000C007C0067478C0E0746AC0E0125AACE58124FCF58190F0CAE0FEA3E0FFC00685
|
||||
:20164A00C007748BC0E0746AC0E0125AACE58124FCF58190F0C2E0FF7E00C007C006749F49
|
||||
:20166A00C0E0746AC0E0125AACE58124FCF58190F959E0FF7E00C007C00674B4C0E0746ABC
|
||||
:0C168A00C0E0125AACE58124FCF581227E
|
||||
:2069FD004C6F616465642064656661756C7473205665722030782578204D616769632030B6
|
||||
:206A1D0078256C780A004C6F616465642073657474696E67733A0A0049676E6F72656420C8
|
||||
:206A3D0066697865644368616E6E656C2025640A0053617665642073657474696E67733AFF
|
||||
:206A5D000A0020205363616E2041667465722054696D656F75742025640A002020666978F7
|
||||
:206A7D0065644368616E6E656C2025640A0020206261744C6F77566F6C74616765202564A0
|
||||
:206A9D000A002020656E61626C6546617374426F6F742025640A0020204C61737420636894
|
||||
:056ABD002025640A0021
|
||||
:20169600E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBF7
|
||||
:2016B60000438004002275F10175805875FDDD75F33875904075FE6E75F4E875A00175FF87
|
||||
:2016D60001227401C0E0E4C0E0900000E4F5F012091B158115817414C0E0E4C0E074C2C0DB
|
||||
:2016F600E0746AC0E0900000E4F5F012080BE58124FCF58122C00775E40075FC0075F700DD
|
||||
:2017160075FE0290F953E0701890F952E0FF54F06002800DD291758F0075F60075FD008049
|
||||
:1F17360012758F8175F62F75FD8175FE2F53807E5390D075F30075F40075F500D0072296
|
||||
:146AC2005612098501084A41000000000904EC0212045A0AC1
|
||||
:20175500E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB37
|
||||
:20177500004380040022AE82AF837D00BD08005017ED75F002A424CFF58274F035F0F583FD
|
||||
:20179500EEF0EFA3F00D80E422E582FF30E0251256BDC007124A2FD2AF1216BC1243BE12A5
|
||||
:2017B5004ED5D00775820A124F1490F959E0FEF582124E60EF30E2091243EB200C0302072B
|
||||
:2017D500FC22E58230E206300C030207F022AF82AE83ADF0FC90F0EFEFF0EEA3F0EDA3F0B3
|
||||
:2017F500ECA3F090F0EFE0FCA3E0FDA3E0FEA3E0FFC004C005C006C00774D6C0E0746AC0E9
|
||||
:20181500E0125AACE58124FAF581300C16758204C007C006C005C0041217D7D004D005D0E5
|
||||
:2018350006D007C007C006C005C004125CC8D004D005D006D00712170B8C828D838EF0EF55
|
||||
:20185500124AB775820102179EE582FF601090F0E4E0FFBFFF00500690F0E4EF04F090F0BD
|
||||
:20187500E4E0FFBF18005007900E10E4F5F022BF24005007901C20E4F5F02290518075F012
|
||||
:2018950001E42290F0E0E07875F2E408F2900230125F877862740EF2E408F2125DB0AE82FA
|
||||
:2018B500AF8374282EFEE43FFF90F0DFE054077D0025E0FCED33FDEC24CFF582ED34F0F566
|
||||
:2018D50083EEF0EFA3F090F0DFE02401F0227E007F007D00BD0800501DED75F002A424CF03
|
||||
:2018F500F58274F035F0F583E0FBA3E0FCEB2EFEEC3FFF0D80DEEFC423CEC423541F6ECE1B
|
||||
:20191500541FCE6ECEFF90F0CCE0FCA3E0FDC3EE9CEF9D50058C828D83228E828F8322904C
|
||||
:20193500FAB2E0FF3395E0FEC007C00674EBC0E0746AC0E0125AACE58124FCF58190F0BF04
|
||||
:20195500E0FF7E0090F0C0E0FD3395E0FCC007C006C005C00474F6C0E0746AC0E0125AAC9E
|
||||
:20197500E58124FAF5812275820E124D04124D3075820F124D0490FAB0E0FEA3E0FF7423A5
|
||||
:20199500C0E08E828F8312490C15817404C0E0124455AC82AD83158190F0EBECF0EDA3F0F5
|
||||
:2019B500C20A90F0CAE0FEA3E0FFC3EC9EED9F5004D20A803A90F0E7E0FCA3E0FD4C601357
|
||||
:2019D500C3EC9EED9F500C90F0EBECF0EDA3F0D20A801C90F0E9E0FCA3E0FD4C6011C3EC4D
|
||||
:2019F5009EED9F500A90F0EBECF0EDA3F0D20A90F0E9E0C0E0A3E0C0E090F0E7E0C0E0A315
|
||||
:201A1500E0C0E090F0EBE0C0E0A3E0C0E090F0E5E0C0E0A3E0C0E07407C0E0746BC0E0126F
|
||||
:091A35005AACE58124F6F581228A
|
||||
:206AD600536C656570696E6720666F7220256C64206D730A0054656D7020256420430A0037
|
||||
:206AF600525353492025642C204C51492025640A00426174745620426F6F742025642C2027
|
||||
:1A6B16006E6F772025642C2054782025642C207570646174652025640A0025
|
||||
:0500DC00781074FFF232
|
||||
:201A3E00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB4B
|
||||
:201A5E00004380040022121ADAE582600790F96CE0F58222121AA4E58260277408C0E074EF
|
||||
:201A7E0050C0E074F9C0E090F96012462A158115811581920E500790F970E0F582227582BE
|
||||
:201A9E0000227582002290F95BE05407FFBF012890F95CE003035403FFBF031C90F95CE023
|
||||
:201ABE0023235403FFBF031090F95BE023235401FFBF0104758201227582002290F95BE081
|
||||
:201ADE005407FFBF012390F95CE003035403FFBF021790F95CE023235403FFBF030B90F9FB
|
||||
:201AFE005BE020E6047582012275820022AFF0AE83E58290FA70F0EEA3F0EFA3F090FA7032
|
||||
:201B1E00E0FDA3E0FEA3E0FF90FA6EE0FBA3E0FC79007A00C3E99BEA9C5052E94A6016E981
|
||||
:201B3E00540F6002800F7430C0E0746BC0E0125AAC15811581C003C004E92DF8EA3EFB8FE5
|
||||
:201B5E000488828B838CF01262F5F87C00C000C0047432C0E0746BC0E0125AACE58124FC0B
|
||||
:201B7E00F58109B900010AD004D00380A77430C0E0746BC0E0125AAC1581158122AFF0AEC0
|
||||
:201B9E0083E5827812F2EE08F2EF08F27815E4F27B017811C3E2F5F0EB95F050227812E2B0
|
||||
:201BBE00FA08E2FC08E2FFEB2AFAE43CFC8A828C838FF01262F5FA7815E22AF20B80D378B5
|
||||
:201BDE0012E2FD08E2FE08E2FF8D828E838FF01262F5FD7815E2B50503D38001C3E433F5D1
|
||||
:201BFE008222AFF0AE83E5827817F2EE08F2EF08F2781AE4F27B017816C3E2F5F0EB95F02E
|
||||
:201C1E0050227817E2FA08E2FC08E2FFEB2AFAE43CFC8A828C838FF01262F5FA781AE22A34
|
||||
:201C3E00F20B80D37817E2FD08E2FE08E2FF8D828E838FF0781AE2025F6CE5812404F58113
|
||||
:201C5E00AF82C219C0071250FED0078F82124E60C0071251B3D2191250FED0077E01EE24FB
|
||||
:201C7E00FC5003021D8290F9DB7414F0C007C0061237FB90F9ED74EDF090F9DB124FFAD053
|
||||
:201C9E0006D0071249E7AA82AB83ACF0FD90FA7374A62AF0740E3BA3F0E43CA3F0E43DA31C
|
||||
:201CBE00F0C0061249E7AA82AB83ACF0FD90FA73E58124FCF8E0F6A3E008F6A3E008F6A325
|
||||
:201CDE00E008F6E58124FCF8C3EA96EB0896EC0896ED0896D0064003021D7EC007C0061254
|
||||
:201CFE005110AD82D006D007C374818DF063F08095F050AD90F971E0FDB507A5C007C0063A
|
||||
:201D1E00121A64AD82D006D007BDEE95C007C006121AA4E582D006D00760867408C0E07412
|
||||
:201D3E0068C0E074F9C0E090F94612469615811581158190F95EE0FCA3E0FD90F94EECF0FB
|
||||
:201D5E00EDA3F08F047D00C004C0057438C0E0746BC0E0125AACE58124FCF5818F828020BC
|
||||
:201D7E000E021C7C8F057E00C005C0067442C0E0746BC0E0125AACE58124FCF58175820020
|
||||
:201D9E00E58124FCF5812290F9DB742AF01237FB90F9ED74E5F090F9F47482F090F0E3E06C
|
||||
:201DBE0090F9F5F090F0C0E090F9F0F090F0BFE090F9EFF090FAB2E090F9F1F090F0EBE0B6
|
||||
:201DDE00FEA3E0FF90F9F2EEF0EFA3F090F9F6E4F090632193FE740193FF90F9F7EEF0EF3E
|
||||
:201DFE00A3F090F959E090F9F9F090F0C9E090F9FAF078167415F290F9EE75F000121C004F
|
||||
:201E1E0090F9DB024FFAD2191250FE12197C1219347F00781BE4F2781BE2B40E0040030240
|
||||
:201E3E001F02C007121DA5D0071249E7AA82AB83ACF0FD74882AF52674133BF527E43CF588
|
||||
:201E5E0028E43DF529C0071249E7AC82AD83AEF0FFC3EC9526ED9527EE9528EF9529D007B7
|
||||
:201E7E004003021EF5C007125110AE82D007C374818EF063F08095F050CBC007121A64AEFD
|
||||
:201E9E0082D007BEE6BF78117411F290F97175F000C007121B9BE582D00760A97408C0E017
|
||||
:201EBE007468C0E074F9C0E090F94612469615811581158190F95E75F0001262F5FDA31295
|
||||
:201EDE0062F5FE90F94EEDF0EEA3F090F0E0EFF090F97175F00022781BE22401F2781BE299
|
||||
:201EFE00FF021E3590F0E0740EF090000075F00022D2191250FE7F00781CE4F2781CE2B429
|
||||
:201F1E000E004003021FF690F9DB7414F090F9ED74E3F0C0071237FB90F9DB124FFAD00701
|
||||
:201F3E001249E7AA82AB83ACF0FD74882AF52A74133BF52BE43CF52CE43DF52DC007124981
|
||||
:201F5E00E7AC82AD83AEF0FFC3EC952AED952BEE952CEF952DD0075072C007125110AE8203
|
||||
:201F7E00D007C374818EF063F08095F050CEC007121A64AE82D007BEE6C278117411F2906C
|
||||
:201F9E00F97175F000C007121B9BE582D00760AC7408C0E07468C0E074F9C0E090F94612F5
|
||||
:201FBE00469615811581158190F95E75F0001262F5FDA31262F5FE90F94EEDF0EEA3F090E4
|
||||
:201FDE00F0E0EFF090F97175F00022781CE22401F2781CE2FF021F1A90F0E0740EF0900014
|
||||
:201FFE000075F00022AFF0AE83E582781DF2EE08F2EF08F2781DE22402FA08E23400FB08F5
|
||||
:20201E00E2FC8A828B838CF01262F5F52E852E2F75300090FA5CE0F531AE317F00E52FC3FA
|
||||
:20203E009EFEE5309FFF7875EEF2EF08F2900063C004C003C002125F87AE82AF83D002D045
|
||||
:20205E0003D0048E2F8F3090FA77E52FF0E530A3F0781DE22401FD08E23400FE08E2FF8D37
|
||||
:20207E00828E838FF01262F5FD90F91FE0FFEDB50702800122E52E24D5500122C3E52E950B
|
||||
:20209E00315001227463252FFEE43530FFC374239E74089F500122781DE2FD08E2FE08E241
|
||||
:2020BE00FF78117466F28D828E838FF0C004C003C002121B9BE582D002D003D004700302A9
|
||||
:2020DE002177781DE22403FD08E23400FE08E28D2F8E3090FA77E0FEA3E0FFEE24F3FEEFDC
|
||||
:2020FE0034F0FF8E828F837463C0E0E4C0E0C02FC03012465CE58124FCF5818A828B838C4D
|
||||
:20211E00F01262F5FA7F00788A7408F2E408F28A828F83C007C002126230AD82AE83D00204
|
||||
:20213E00D007ED2421FDEE34F9FE5302078AF005F07401800225E0D5F0FBF4FA8D828E83CD
|
||||
:20215E00E052028D828E83EAF0744FC0E0746BC0E0125AAC15811581227451C0E0746BC0E7
|
||||
:20217E00E0125AAC1581158122AF82AE83ADF0FC7820EFF2EE08F2ED08F2EC08F290FA5CEC
|
||||
:20219E00E0FB7A0090F91FE0FF7E00C003C002C007C0067462C0E0746BC0E0125AACE58142
|
||||
:2021BE0024FAF581D2191250FE1249E785823285833385F034F53578207977E22414F308FC
|
||||
:2021DE00E2340009F308E2340009F308E2340009F3900019E4F5F0125FA7AA82AB83AEF019
|
||||
:2021FE00FFEA2532F532EB3533F533EE3534F534EF3535F5351249E7AA82AB83AEF0FFC3E0
|
||||
:20221E00EA9532EB9533EE9534EF9535503C125110AF82C374818FF063F08095F050D612D5
|
||||
:20223E001A64AF82BFE8CE90F97175F0001220037F00EF2421FDE434F9FE8D828E83E07099
|
||||
:20225E00060FBF060040EBBF06AB7430C0E0746BC0E0125AAC15811581C2191250FE025156
|
||||
:20227E00B390F972E4F0A3F090F97175F00022742AC0E0E4C0E0C0E090F9DB1245FE1581F9
|
||||
:20229E001581158190F9DB742AF090F940E0600890F9F174E4F0800690F9F174E7F0740868
|
||||
:2022BE00C0E07450C0E074F9C0E090F9E91246961581158115817408C0E07446C0E074F9EA
|
||||
:2022DE00C0E090F9E112469615811581158190F9DCE054F84401F090F9DCE054C74440F08C
|
||||
:2022FE0090F9DDE0440C54CF44C0F090F958E0FF04F090F9DEEFF090F94EE0FEA3E0FF9052
|
||||
:20231E00F9DFEEF0EFA3F07DF27EF98D828E837411C0E07416C0E074F9C0E0124696158181
|
||||
:20233E00158115817DF27EF97F0078167411F28D828E838FF0121C0090F9DB024FFAE58107
|
||||
:20235E002404F581D2191250FE1251B37F00BF1E00400302243FC00712228DD0071249E7BB
|
||||
:20237E00AB82AC83ADF0FE90FA7974642BF0749F3CA3F0740B3DA3F0E43EA3F0C007125142
|
||||
:20239E0010AE82D007C374818EF063F08095F05051C007121A64AE82D007BEE8028028BE6D
|
||||
:2023BE00E9028005BEEC33802978117403F290F97175F000C007121B9BE582D007602390D8
|
||||
:2023DE00F97175F000806312227FAC82AD83AEF0805890000075F000805090000075F000EC
|
||||
:2023FE008048C0071249E7C8E58124FCC8A68208A68308A6F008F690FA79E0FAA3E0FDA3E3
|
||||
:20241E00E0FEA3E0FFE58124FCF8C3E69A08E69D08E69E08E69FD007500302239A0F0223BC
|
||||
:20243E006C12227FAD82AE83AFF0E58124FCF58122741BC0E0E4C0E0C0E090F9DB1245FE36
|
||||
:20245E0015811581158190F9DB7419F090F9F174EAF07408C0E07450C0E074F9C0E090F9DD
|
||||
:20247E00E91246961581158115817408C0E07446C0E074F9C0E090F9E1124696158115819E
|
||||
:20249E00158190F9DCE054F84401F090F9DCE054C74440F090F9DDE0440C54CF44C0F090B1
|
||||
:2024BE00F94EE0FEA3E0FF90F9DFEEF0EFA3F090F958E0FF04F090F9DEEFF090F9DB024FE0
|
||||
:2024DE00FAD2191250FE7F00BF1000506CC00712244FD0071249E785823A85833B85F03CF5
|
||||
:2024FE00F53D1249E785823685833785F038F539E536C3953AFAE537953BFCE538953CFD79
|
||||
:20251E00E539953DFEC3EA94A6EC940EED9400EE94005022C007125110AE82D007C37481CC
|
||||
:20253E008EF063F08095F050B9C007121A64AE82D007BEEBAD220F808F22AF82E4FDCD5455
|
||||
:20255E0003A2E0CD13CD13A2E0CD13CD13CDFCEF0303543F4DFDEF030354C0FE7F00740140
|
||||
:20257E002DFDE43C8F828E838DF022AD82AE83AFF07C007B00BB04004003022618C0048BAB
|
||||
:20259E0082C007C006C005C003122558A882A983AAF0FCD003D005D006D0077416C0E0E4A8
|
||||
:2025BE00C0E074F3C0E074F0C0E0888289838AF0EC1206D0E58124FCF5817462C0E074FC0C
|
||||
:2025DE00C0E090F0FB12496915811581920FD004300F218D008E018F027408C0E0C000C0B4
|
||||
:2025FE000190F0F312462A158115811581920F50038C82220B8B040225937582FF22AF8244
|
||||
:20261E005307F87E007D00BD040040030226A4C0068D82C007C005122558AA82AB83ACF099
|
||||
:20263E00FED005D0077416C0E0E4C0E074F3C0E074F0C0E08A828B838CF0EE1206D0E58147
|
||||
:20265E0024FCF5817462C0E074FCC0E090F0FB124969158115819228D006302823C0069074
|
||||
:20267E00F108E0FC5304F87B008F027E00ECB50206EBB506028004D0068005D0068E822256
|
||||
:20269E000D8D060226257582FF22122558AC82AD83AEF0FF7416C0E0E4C0E074F3C0E07464
|
||||
:2026BE00F0C0E08C828D838EF0EF1206D0E58124FCF58190F108E0F58222AF828F060EEE39
|
||||
:2026DE0024FB50027E00EEB507038E82228E82C007C006122558AA82AB83ACF0FDD006D049
|
||||
:2026FE00077416C0E0E4C0E074F3C0E074F0C0E08A828B838CF0ED1206D0E58124FCF58195
|
||||
:20271E007462C0E074FCC0E090F0FB12496915811581922850A890F108E0FD5305F87C00C6
|
||||
:20273E00BD789BBC00988E8222122558AC82AD83AEF0FF7404C0E0E4C0E08C828D838EF063
|
||||
:20275E00EF12091B15811581227F00BF0400500C8F82C007122747D0070F80EF22AF828FBB
|
||||
:20277E00057E00C005C0067471C0E0746BC0E0125AACE58124FCF5818F82122558020A5B0E
|
||||
:20279E007825E4F208F208F208F27B00BB0400400302283D8B82C00312255885823E85832A
|
||||
:2027BE003F85F040F541D0037416C0E0E4C0E074F3C0E074F0C0E0853E82853F838540F004
|
||||
:2027DE00E5411206D0E58124FCF5817462C0E074FCC0E090F0FB12496915811581921050EE
|
||||
:2027FE003AC00390F104E0FAA3E0FBA3E0FEA3E0FF7825C3E29A08E29B08E29E08E29FD09C
|
||||
:20281E0003501890F1047825E0F2A3E008F2A3E008F2A3E008F290F945EBF00B0227AA78C5
|
||||
:20283E0025E2F58208E2F58308E2F5F008E222AF82AE83D21190F91FE0FD7C007B007A0084
|
||||
:20285E008C44EBC454F0C544C4C5446544C54454F0C5446544F545EDC4540F4544F544ED1C
|
||||
:20287E00C454F0F543754200300D17782FE542F27470254308F2E4354408F2E4354508F23A
|
||||
:20289E0080497810E2F582C007C00612255885824685834785F048F549D006D00774162561
|
||||
:2028BE0046F546E43547F547E43548F548E43549F549782FE5462542F2E547354308F2E5F1
|
||||
:2028DE0048354408F2E549354508F290FA807405F090FA5CE4F090F94004F07829EFF20809
|
||||
:2028FE00EEF27406C0E0E4C0E0C0E090F9211245FE15811581158190FA80E0FB14F0EB7097
|
||||
:20291E0003022C901011030229DF7829E2FA08E2FB8A828B8378627463F2E408F2125DB08E
|
||||
:20293E00AA8290FA7DEAF07829E2FB08E2FF8B828F8378837463F2E408F2C0021260F3E538
|
||||
:20295E00828583F0D00245F0600690FA7DEA04F090FA7DE024EA500690FA7D7415F090FA38
|
||||
:20297E005CE0FB7A0090FA7DE0FFC3EA9F50528B067F00788A7408F2E408F28E828F83C074
|
||||
:20299E0007C006C003C002126230AC82AD83D002D003D006D007EC2421FCED34F9FD5306D6
|
||||
:2029BE00078EF005F07401800225E0D5F0FBFE8C828D83E0FF42068C828D83EEF00B0A80EF
|
||||
:2029DE00A412235CAA82AB83AFF0EA4B7003F582220ABA00010B8A828B838FF01262F5FE9A
|
||||
:2029FE00A31262F5FF4E60428E048F05C3EC9423ED9400501A7877EEF2EF08F2E408F208A9
|
||||
:202A1E00F2900019E4F5F0125FA7124A48801BEC24F6FCED34FFFD7F007E008C828D838F14
|
||||
:202A3E00F0EE1217E3D2191250FE900122E4F5F012218778337401F290FA5CE0FF7E009028
|
||||
:202A5E00FA7DE0FDC3EE9D505E8F047D00788A7408F2E408F28C828D83C007C006C005C07A
|
||||
:202A7E0004126230AA82AB83D004D005D006D007EA2421F582EB34F9F5835304078CF005CB
|
||||
:202A9E00F07C017D008006EC2CFCED33FDD5F0F7E0FB7A005204EA5205EC4D60067833E4A1
|
||||
:202ABE00F280040F0E80987833E27003022C5590FA7DE07875F2E408F2900063125F87AE8D
|
||||
:202ADE0082AF83782DEEF2EF08F290FA8174F3F074F0A3F0E4A3F090FA5CE0704B90F0F3F2
|
||||
:202AFE00E0FCA3E0FD7829ECF208EDF290F0F5E0FCA3E0FD782BECF208EDF290FA7EE4F0E1
|
||||
:202B1E00A3F0782DE2FC08E2FDEC24FCFCED34FFFD782DECF2ED08F290FA81740424F3F081
|
||||
:202B3E00E434F0A3F0E4A3F07829E2FC08E2FD782DC3E2F5F0EC95F008E2F5F0ED95F050CE
|
||||
:202B5E000A7829792DE2F308E209F37829E2FC08E2FD782DD3E29CF4B3FCB308E29DF4FD21
|
||||
:202B7E007829ECF208EDF275820412179E90FA81E0F546A3E0F547A3E0F548AA46AF47780C
|
||||
:202B9E002DE2C0E008E2C0E0C002C007782FE2F58208E2F58308E2F5F008E212080BE581AF
|
||||
:202BBE0024FCF5817582041217D7782DE2FA08E2FD7E007F00782FE22AF208E23DF208E259
|
||||
:202BDE003EF208E23FF2AD46AE47AF48782DE2F54608E2F547AA46AC47154674FFB5460217
|
||||
:202BFE001547EA4C60368D828E838FF01262F5FCA3AD82AE838C4275430090FA7EE0FAA37D
|
||||
:202C1E00E0FC8A4A8C4BAB42AC43EB254AFBEC354BFC90FA7EEBF0ECA3F080B990FA7DE0F4
|
||||
:202C3E00FF90FA5CE02FF07829E2FE08E2FF4E60067833E4F2D21190F940E4F07833E27076
|
||||
:202C5E0003022915782BE2FE08E2FF90FA7EE0FCA3E0FDEEB50406EFB505028011748BC09B
|
||||
:202C7E00E0746BC0E0125AAC1581158180047582012275820022AFF0AE83E58290FA86F0A5
|
||||
:202C9E00EEA3F0EFA3F090FA86E0FDA3E0FEA3E00DBD00010E8D828E837408C0E07430C0A9
|
||||
:202CBE00E074F9C0E012462A1581158115819212501790F938E0FCA3E0FDA3E0FEA3E0FF9A
|
||||
:202CDE00EC4D4E4F6003022D9490FA86E0FDA3E0FEA3E0FF74092DFCE43EFA8F038C828AFE
|
||||
:202CFE00838BF01262F5F9A31262F5FAA31262F5FBA31262F5FCC3E49974809AE49BE49C74
|
||||
:202D1E00501C1224DF90F08F7405F090FA5B7401F090F0E374E0F0123BE27582002290F9DA
|
||||
:202D3E001FE4F0042DFAE43EFBC002C00390F91712452C15811581740D2DFAE43EFB8F040E
|
||||
:202D5E008A828B838CF01262F5FA90F920F07411C0E0C005C00690F92F1246961581158141
|
||||
:202D7E0015817409C0E0E4C0E0907000E4F5F012091B1581158190F938E0FCA3E0FDA3E033
|
||||
:202D9E00FEA3E0FFEC4D4E4F7003022E29C3E49C74109DE49EE49F500B90FA84E4F07410C9
|
||||
:202DBE00A3F0800890FA84ECF0EDA3F0D20D90FA84E0FEA3E0FF8E828F8312284DE58260B3
|
||||
:202DDE004690F91FE0FF0F90F91FEFF090F938E0FCA3E0FDA3E0FEA3E0FF90FA84E0FAA3C7
|
||||
:202DFE00E0FB8A008B01E4FAFBECC398FCED99FDEE9AFEEF9BFF90F938ECF0EDA3F0EEA368
|
||||
:202E1E00F0EFA3F0022D94758200221224DF75820122AFF0AE83E58290FA8BF0EEA3F0EF6B
|
||||
:202E3E00A3F090FA8BE0FDA3E0FEA3E0FF74012DFAE43EFB8F048A828B837408C0E07430C6
|
||||
:202E5E00C0E074F9C0E012462A1581158115819213504090F93DE0FC740E2DFDE43EFE8D33
|
||||
:202E7E00828E838FF01262F5FDECB5052690F938E0FCA3E0FDA3E0FEA3E0FFEC4D4E4F609A
|
||||
:202E9E001274A3C0E0746BC0E0125AAC1581158102306175820412179E90F9457834E0F2E7
|
||||
:202EBE0090FA8BE0FCA3E0FDA3E0FE740E2CFAE43DFB8E078A828B838FF01262F5FA54FC5D
|
||||
:202EDE00601690FA6E7411F0E4A3F08C828D838EF0121B0B7834E4F290F945E02401F0FF62
|
||||
:202EFE00BF0400400590F945E4F090F945E0FF7834E2B507197582041217D774B6C0E074C1
|
||||
:202F1E006BC0E0125AAC15811581758201228F82122558AC82AD83AEF0FF7416C0E0E4C0C1
|
||||
:202F3E00E074F3C0E074F0C0E08C828D838EF0EF1206D0E58124FCF5817462C0E074FCC073
|
||||
:202F5E00E090F0FB124969158115819213500890F108E054F8708190F945E0F54C7810F2FC
|
||||
:202F7E0090FA8BE0F54DA3E0F54EA3E0F54F7409254DFAE4354EFBAF4F8A828B838FF0127B
|
||||
:202F9E0062F5FAA31262F5FBA31262F5FEA31262F5FFC3E49A74409BE49EE49F5007122484
|
||||
:202FBE00DF75820022854C82122558AC82AD83AEF0FF7404C0E0E4C0E08C828D838EF0EFF7
|
||||
:202FDE0012091B158115817582041217D77810E2FE7F00C006C00774C0C0E0746BC0E0129D
|
||||
:202FFE005AACE58124FCF58190F91FE4F004254DFDE4354EFEC005C00690F91712452C159A
|
||||
:20301E00811581740D254DFDE4354EFEAF4F8D828E838FF01262F590F920F0AD4DAE4E741D
|
||||
:20303E0011C0E0C005C00690F92F12469615811581158190F938E0FEA3E0FF90FA89EEF0BC
|
||||
:20305E00EFA3F090F938E0FCA3E0FDA3E0FEA3E0FFEC4D4E4F70030230F8C3E49C74109DD9
|
||||
:20307E00E49EE49F500B90FA84E4F07410A3F0800890FA84ECF0EDA3F090FA84E0FEA3E078
|
||||
:20309E00FF8E828F8312284DE582604A90F91FE0FF0F90F91FEFF090F938E0F550A3E0F5DE
|
||||
:2030BE0051A3E0F552A3E0F55390FA84E0FAA3E0FBE4FEFFE550C39AFAE5519BFBE5529E98
|
||||
:2030DE00FEE5539FFF90F938EAF0EBA3F0EEA3F0EFA3F00230617582002275820412179E74
|
||||
:2030FE007430C0E074F9C0E090F0F312452C1581158190F0FB7421F07447A3F0744DA3F09D
|
||||
:20311E007447A3F090F941E02401F0A3E03400F0A3E03400F0A3E03400F090F941E0FCA346
|
||||
:20313E00E0FDA3E0FEA3E0FF90F104ECF0EDA3F0EEA3F0EFA3F090FA89E0FEA3E0FF7D00BD
|
||||
:20315E007C0090F0FFEEF0EFA3F0EDA3F0ECA3F090F93CE090F103F090F93DE090F108F0BF
|
||||
:20317E007810E2F582122558AC82AD83AEF0FF7416C0E0E4C0E074F3C0E074F0C0E08C82FF
|
||||
:20319E008D838EF0EF12080BE58124FCF5817582041217D775820122AFF0AE83E58290FA9D
|
||||
:2031BE008FF0EEA3F0EFA3F0C20D90FA8FE0F557A3E0F558A3E0F559740D2557FAE4355852
|
||||
:2031DE00FBAC598A828B838CF01262F5FCBC02028024BC030302353EBC10028019BC2002F6
|
||||
:2031FE008014BC2102800FBCA803023431BCAF0302351E0235B090FA8FE0FFA3E0FEA3E03B
|
||||
:20321E00FD75548E7555FA755600740E2FF557E43EF5588D598557828558838559F012625B
|
||||
:20323E00F5FB8554828555838556F0125F6C90FA8EE020E203023315758204C007C006C091
|
||||
:20325E000512179ED005D006D00790FA8EE0C423541FFB603CBB0F02806C855782855883A3
|
||||
:20327E008559F01262F5F582C007C006C00512261CAB82D005D006D007BBFF0280488B829C
|
||||
:20329E00C007C006C005122747D005D006D007803574012FF557E43EF5588D5985578285DF
|
||||
:2032BE0058838559F0C007C006C005122589AB82D005D006D007BBFF02800B1224DF78357D
|
||||
:2032DE007401F202342B758204C007C006C0051217D7D005D006D0078F828E838DF0122E5A
|
||||
:2032FE0030E582600B1224DF78357401F202342B7835E4F202342B74012FF557E43EF558E1
|
||||
:20331E008D598557548558558559568554828555837408C0E07427C0E074F9C0E012462A75
|
||||
:20333E001581158115819214500B1224DF78357401F202342B758204C007C006C0051217AC
|
||||
:20335E009E8557828558838559F0122589AC82758204C0041217D7D004D005D006D007BC66
|
||||
:20337E00FF028051C007C006C005C0041224DFD004D005D006D0078F578E588D59AA57AB7E
|
||||
:20339E00587411C0E0C002C00390F92F12469615811581158190F938E4F0A3F0A3F0A3F057
|
||||
:2033BE0090FC61ECF090FA8EE054037824F28C8212277B803D74CEC0E0746BC0E0125AAC51
|
||||
:2033DE00158115818F828E838DF0122E30E582601B1224DF7810E2FB90FC61F090FA8EE063
|
||||
:2033FE0054037824F28B8212277B80067835E4F2801B90F930E0FAA3E0FBC002C00390F946
|
||||
:20341E002712452C1581158178357401F27835E2F5822290F938E0FAA3E0FBA3E0FEA3E05F
|
||||
:20343E00FFEA4B4E4F702F74012557FDE43558FEAF598D828E837408C0E07430C0E074F9AC
|
||||
:20345E00C0E012462A158115811581921450071224DF7582012290F91FE4F090FA8FE0F5D4
|
||||
:20347E0054A3E0F555A3E0F55674012554FAE43555FBC002C00390F91712452C158115811A
|
||||
:20349E00740D2554FDE43555FEAF568D828E838FF01262F590F920F0AD54AE557411C0E0DC
|
||||
:2034BE00C005C00690F92F12469615811581158174092554FDE43555FEAF568D828E838FE8
|
||||
:2034DE00F01262F5FDA31262F5FE8D828E8312284DE582602790F938E4F0A3F0A3F0A3F08B
|
||||
:2034FE0075820412179E90F0F775F0001213BA7582041217D71224DF7582012275820022EE
|
||||
:20351E001224DF740E2557FDE43558FEAF598D828E838FF01262F5F58212045A75820122FD
|
||||
:20353E0075820412179E8557828558838559F0122C94E582605875820412179E1235CB302A
|
||||
:20355E000D11123B69907019E4F5F01206B012567C805674D6C0E0746BC0E0125AAC1581FE
|
||||
:20357E0015817582041217D790FA5B7401F090F0E374E0F0123BE27408C0E0E4C0E0C0E03C
|
||||
:20359E0090F9271245FE158115811581801B758200227F00C004C00774F3C0E0746BC0E002
|
||||
:2035BE00125AACE58124FCF58175820022783AE4F208F208F208F2C20D7419C0E0E4C0E0CA
|
||||
:2035DE0074A2C0E074FDC0E0907000E4F5F01206D0E58124FCF58178367419F2747008F24E
|
||||
:2035FE00E408F208F27406C0E0740AC0E0746CC0E090FDAB12462A158115811581921540BA
|
||||
:20361E000790F08F7405F02290FDAB1246C0AE82AF83906C0A1246C0AC82AD83EEB5041EF8
|
||||
:20363E00EFB5051AC006740AC0E0746CC0E090FDAB12462A1581158115819215400790F05B
|
||||
:20365E008F7402F02290FDAAE0FFBF0102800790F08F7401F02290FDA8E0FEA3E0FFC3E404
|
||||
:20367E009E74809F500790F08F7403F02290FDA8E0FEA3E0FF4E700302374790FDA8E0FE23
|
||||
:20369E00A3E0FFC374239E74089F50047E237F08C006C00774F3C0E074F0C0E07836E2F5DE
|
||||
:2036BE008208E2F58308E2F5F008E21206D0E58124FCF58190FA9274F3F074F0A3F0E4A37A
|
||||
:2036DE00F090FA95EEF0EFA3F0783AE2F58208E2F58308E2F5F008E2C007C00612382078C8
|
||||
:2036FE003AC0E0E582F2E58308F2E5F008F2D0E008F2D006D0078E028F037C007D00783628
|
||||
:20371E00E22AF208E23BF208E23CF208E23DF290FDA8E0FCA3E0FDECC39EFEED9FFF90FD51
|
||||
:20373E00A8EEF0EFA3F002368B90FDA2E0FCA3E0FDA3E0FEA3E0FF783AE2B5041108E2B515
|
||||
:20375E00050C08E2B5060708E2B50702800790F08F7404F02290FDA6E0FEA3E0FF90F08D26
|
||||
:20377E00EEF0EFA3F0C006C0077413C0E0746CC0E0125AACE58124FCF581D20D2212279EAB
|
||||
:20379E00AC82AD83AEF0FF90F941ECF0EDA3F0EEA3F0EFA3F0227408C0E07450C0E074F9D8
|
||||
:2037BE00C0E090FA6612469615811581158190FA5DE054F84421F090FA5EE054F344C8F038
|
||||
:2037DE0090FA607437F07413A3F090FA6274FFF0A3F090FA647437F07413A3F0227411C040
|
||||
:2037FE00E0745DC0E074FAC0E090F9DC12469615811581158190F958E0FF04F090F9DEEF2D
|
||||
:20381E00F022AC82AD83AEF0FF783EECF4F2EDF408F2EEF408F2EFF408F290FA92E0F5620E
|
||||
:20383E00A3E0F563A3E0F56490FA95E0F55EA3E0F55F855E60855F61155E74FFB55E0215F2
|
||||
:20385E005FE5604561700302391E8562828563838564F01262F5FEA38582628583638E0417
|
||||
:20387E007D007E007B00783EE26CF208E26DF208E26EF208E26BF27846E4F208F27846C3D5
|
||||
:20389E00E2940808E26480948050A7783EE25401FA08E25400FB08E25400FC08E25400FE1D
|
||||
:2038BE007842C3E49AF2E49B08F2E49C08F2E49E08F27841E2C313F56818E213F56718E25D
|
||||
:2038DE0013F56618E213F5657842E25420FC08E25483FD08E254B8FE08E254EDFA783EEC70
|
||||
:2038FE006565F2ED656608F2EE656708F2EA656808F27846E22401F208E23400F202389B3B
|
||||
:17391E00783EE2F4FB08E2F4FC08E2F4FD08E2F48B828C838DF022BD
|
||||
:206B30000A002530327820004150206F6E2025640A004E6F204150206F6E2025640A002E8F
|
||||
:206B500000636865636B435243206661696C65640A005245512025642070617274202564AF
|
||||
:206B70000044726177696E6720696D61676520696E20736C6F742025640A00626C6B2066CB
|
||||
:206B900061696C65642076616C69646174696F6E210A0072657374617274696E6720696D37
|
||||
:206BB0006720646C0A004E6F20736C6F74730A006E657720646C20746F2025640A00646C88
|
||||
:206BD00020696D670A004F544120696D6167652076616C69646174696F6E206661696C65CB
|
||||
:206BF000640A00646174615479706520307825782069676E6F7265640A006368726F6D61EA
|
||||
:206C10003239004F54412076616C6964617465642C207570646174696E6720746F207665A1
|
||||
:0B6C30007273696F6E202530780A0037
|
||||
:0576A600FF21474D47E4
|
||||
:20393500E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB35
|
||||
:2039550000438004002290F09B7438F0E4A3F030050990F09B7430F0E4A3F02290F959E0F3
|
||||
:20397500704590F0C7E0603FC20490F09F7410F0C4A3F090F0A17406F0E4A3F090720D7581
|
||||
:20399500F080120D61D20490F09F7418F07401A3F090F0A1740DF0E4A3F090722F75F0808A
|
||||
:2039B500120D61D2038002C203300A2690F0C6E06020C20490F09F7410F0C4A3F090F0A17F
|
||||
:2039D5007470F0E4A3F090723975F080120D61D20222C20222123F237460C0E07472C0E09D
|
||||
:2039F5001241D2158115817473C0E07472C0E01241D21581158190F09BE0FEA3E0FF74080C
|
||||
:203A15002EFEE43FFF90F09BEEF0EFA3F07486C0E07472C0E01241D21581158174A9C0E09A
|
||||
:203A35007472C0E01241D21581158174CBC0E07472C0E01241D21581158190F09BE0FEA348
|
||||
:203A5500E0FF74082EFEE43FFF90F09BEEF0EFA3F090F09DE4F0A3F0745BC0E07472C0E0B4
|
||||
:203A75001241D215811581023A9F758205123F00E58260012274E9C0E07472C0E0125AAC33
|
||||
:203A9500158115819039EA020D3B7434C0E074FCC0E0E4C0E074F5C0E07472C0E01241D258
|
||||
:203AB500E58124FBF58122906321E493C0E0740193C0E07401C0E07473C0E01241D2E581DA
|
||||
:203AD50024FCF58122123F23123F3F7410C0E07473C0E01241D215811581123ABC90F0E5AC
|
||||
:203AF500E0C0E0A3E0C0E07421C0E07473C0E01241D2E58124FCF58190FAB2E0FF3395E06E
|
||||
:203B1500FEC007C006742FC0E07473C0E01241D2E58124FCF581023A9F758201123F00E511
|
||||
:203B35008260012212197C903ADA020D3B123F23123F3FC20512395B90F08DE0C0E0A3E055
|
||||
:203B5500C0E07442C0E07473C0E01241D2E58124FCF58122903B42020D3B123F23123F3F35
|
||||
:203B7500D2057458C0E07473C0E01241D215811581D20490F08FE0FFBF02028018BF040231
|
||||
:203B95008023BF05307469C0E07473C0E01241D215811581227478C0E07473C0E01241D2CA
|
||||
:203BB50015811581227489C0E07473C0E01241D215811581227E00C007C0067494C0E074E4
|
||||
:203BD50073C0E01241D2E58124FCF58122903B6F020D3B123F23123F3F74A3C0E07473C094
|
||||
:203BF500E01241D21581158174BBC0E07473C0E01241D21581158190F09BE0FEA3E0FF90CD
|
||||
:203C1500F0A1EEF0EFA3F090F94CE0FF7E0090F94DE0FD7C00C007C006C005C00474D4C01F
|
||||
:203C3500E07473C0E01241D2E58124FAF58190F94AE0FF7E0090F94BE0FD7C00C007C006FF
|
||||
:203C5500C005C00474E6C0E07473C0E01241D2E58124FAF58190F948E0FF7E0090F949E046
|
||||
:203C7500FD7C00C007C006C005C00474E6C0E07473C0E01241D2E58124FAF58190F946E051
|
||||
:203C9500FF7E0090F947E0FD7C00C007C006C005C00474E6C0E07473C0E01241D2E5812423
|
||||
:203CB500FAF58190F099E0FEA3E0FF8E02EFFB3395E0FCFD7428C39AF50F74019BF510E4F5
|
||||
:203CD5009CF511E49DF512906F61E493FDE4FC3395E0FBFAE50FC39DFDE5109CFCE5119BE5
|
||||
:203CF500FBE5129AFA78647402F2E408F208F208F28D828C838BF0EAC007C006125DFBAAEF
|
||||
:203D150082AB83D006D00790F09FEA2EF0EB3FA3F090F0BFE0FF7E0090F0C0E0FD3395E0EC
|
||||
:203D3500FC90F959E0FB7A00C007C006C005C004C003C00274EFC0E07473C0E01241D2E50C
|
||||
:203D55008124F8F581123FC0023ABC758203123F00E58260012212197C903BE8020D3B1247
|
||||
:203D75003F23123F3F7409C0E07474C0E01241D215811581741CC0E07474C0E01241D21554
|
||||
:203D950081158190F099E0FEA3E0FF90FA97EEF0EFA3F090F09BE0FEA3E0FF90F0A1EEF083
|
||||
:203DB500EFA3F07431C0E07474C0E01241D21581158190FA97E0FEA3E0FF8E02EFFB33958B
|
||||
:203DD500E0FCFD74F0C39AFAE49BFBE49CFCE49DFD78647402F2E408F208F208F28A828B19
|
||||
:203DF500838CF0EDC007C006125DFBAA82AB83D006D007EA2EFEEB3FFF90F09FEEF0EFA3F6
|
||||
:203E1500F0EE5407601574075EFC7D00EEC39CFEEF9DFF90F09FEEF0EFA3F0906F6175F073
|
||||
:203E350080120D6190F0A1E0FEA3E0FF74082EFEE43FFF90F0A1EEF0EFA3F0D2049070EBE0
|
||||
:203E550075F080120D61023971758204123F00E582600122903D74020D3B123F23123F3F77
|
||||
:203E750090F09BE0FEA3E0FF74102EFEE43FFF90F09BEEF0EFA3F07445C0E07474C0E01272
|
||||
:203E950041D215811581123FC0023971758205123F00E582600122903E6F020D3B123F23DF
|
||||
:203EB500123F3F7455C0E07474C0E01241D2158115817469C0E07474C0E01241D215811546
|
||||
:203ED5008190F09F747CF0E4A3F090F09BE0FEA3E0FF90F0A1EEF0EFA3F0D2049070EB75A4
|
||||
:203EF500F080020D61903EB2020D3BE582C40354F8F58212261CAF82BFFF02800D7824E4C0
|
||||
:203F1500F28F8212277B7582012275820022C206C204C20590F099E4F0A3F090F09DF0A31D
|
||||
:203F3500F090F09BF0A3F0C20922D20490F0A1E4F0A3F0906DDE93FF7E007428C39FFF7437
|
||||
:203F5500019EFE90F09FEFF0EEA3F0906DDD75F080120D61C204906C3CE493FF7E0090F07F
|
||||
:203F75009FE0FCA3E0FDECC39FFFED9EFE90F09FEFF0EEA3F0906C3B75F080120D61906E42
|
||||
:203F9500A0E493FF7E0090F09FE0FCA3E0FDECC39FFFED9EFE90F09FEFF0EEA3F0D2049042
|
||||
:203FB5006E9F75F080120D61C2042290F0E9E0FEA3E0FF4E601190F0E7E0FCA3E0FDC3EE96
|
||||
:203FD5009CEF9D5002800890F0E7E0FEA3E0FFC006C0077483C0E07474C0E01241D2E581CC
|
||||
:053FF50024FCF581220F
|
||||
:206C3B00801AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000AF
|
||||
:206C5B00000000000000000000000000000000000000000000000000000000000000000019
|
||||
:206C7B000000000000000000000000000000000000001C000000001F9F80000000003870F7
|
||||
:206C9B0001C07F000000001F9FC000000000387001C07F000000001F9FE0000000003870ED
|
||||
:206CBB0001C0F7800000001C1CE000000000380001C0E3800000001C1CE0000000003800BD
|
||||
:206CDB0001C0E39DC1C7701F9CE773B871D03873B9C7E39FE3E7F81F9FEFF3FCF9F03873B3
|
||||
:206CFB00FDCEE39FE777F81F9FCFF3FDDDF03873FDDCE39CE7F7381C1F8E739DFDC0387332
|
||||
:206D1B009DF8E39CE7F7381C1C0E739DFDC038739DF8F79CE707381C1C0E739DC1C03873A0
|
||||
:206D3B009DDC7F1FE7F7381F9C0FF3FDFDC03F739DDC7F1FE3E7381F9C0FF3FCF9C03F73A5
|
||||
:206D5B009DCE1E1DC1C7381F9C0773B871C03F739DC7001C000000000000038000000000DF
|
||||
:206D7B000000001C0000000000000380000000000000001C000000000000038000000000BA
|
||||
:206D9B000000001C0000000000000380000000000000000000000000000000000000000039
|
||||
:206DBB00000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
|
||||
:206DDB00FFFF800C000882A2AB55BFFFFFFF7DB4622800000010101176FF7BFFFF7FB7A96D
|
||||
:206DFB0055505100002922966FF7BFFFFFFFEAE622AA08000002542ABF3F7FFFFFFFFD598B
|
||||
:206E1B00B4102000002423B5B5DFFFFFFFFFF6AE48551000008890546AEFFFFFFFFFFBF5E5
|
||||
:206E3B00A382000000012DA3B3FFFFFFFFFFF6BE4E5209000490020D55DFFFFFFFFFFDDD89
|
||||
:206E5B0068A9001000490CFBAB6FFFFFFFFFFEEB955A002000129122BFDFFFFFFFFFFFF545
|
||||
:206E7B00658140400028127DEFFFFFFFFFFFFFEFAB28000000420A9775FFFFFFFFFFFFF7E6
|
||||
:206E9B004AC20400800C0008029CDFFFFFFFFFFFFF6A6A8D002000044D72AAFFFFFFFFFFD3
|
||||
:206EBB00FFD5D57480000240128EDFFDFFFFFFFFFFAEAA0A11200020525FF57FFFFFFFFF8D
|
||||
:206EDB00FF7294AA240000010AAB6F77FFFFFFFFFDAF545488000004804D95EBFFFFFFFF03
|
||||
:206EFB005B58B5514000000808A6B3F77FFFFFFFFFAD4AA0100000029641DCAEFFFFFFFF9D
|
||||
:206F1B00FDBFEA4802000000093EAB75EFFFFFFFFFD4B121080000000AC35DFF7FFFFFFFC1
|
||||
:206F3B00EFEF444A64800000A152A6EFEFFFFFFFD6CAF5101800000002154BD5DFFFFFF7AA
|
||||
:206F5B00EBD4D885000038380000000000000000000000000000000000000000000000008A
|
||||
:206F7B000000000000000000000000000000000007C00000000001FFF0000000000FFFF041
|
||||
:206F9B00000000007FFFF000000001FFFFF000000007FFFFC00000001FFF80000000007F97
|
||||
:206FBB00F80000000000FFE00000000001FF000000000007FE00000000000FF800000000D3
|
||||
:206FDB00001FE000000000003FC00003E000007F80007FF00000FE0003FFF00001FC000F4B
|
||||
:206FFB00FFF00001F8003FFFF00003F800FFFF800007F001FFE000000FE003FF0000000F10
|
||||
:20701B00C00FF80000001F801FF00000001F803FC00000003F003F800000003F007F000086
|
||||
:20703B0000007E00FE0007E0007E01FC001FF000FC01F8007FF000FC03F001FFF000F8030A
|
||||
:20705B00F003FFF001F807E007FF0001F807E00FF00001F00FC01FE00001F00FC03F800030
|
||||
:20707B0003F00F803F000003F01F807E000003E01F807E000003E01F00FC01E003E01F0043
|
||||
:20709B00FC07F803E01F00F80FFC03E03F00F80FFC03E03F01F81FFE03E03F01F81FFE033D
|
||||
:2070BB00E03F01F81FFE03C03E01F01FFE01C01E00F00FFC00000000000FFC00000000008C
|
||||
:2070DB0007F8000000000001E000000000000000303000001FF800000000FFFF000000033D
|
||||
:2070FB00FFFFE000000FFFFFF000003FFFFFFC00007FF00FFE0000FF8001FF0001FE000067
|
||||
:20711B007F8003F800001FC007F000003FE00FE000007FF00FC00000FFF01F800001FFF8B2
|
||||
:20713B001F000003FFF83F000007FEFC3E00000FFC7C7E00001FF87E7C00003FF03E7C009E
|
||||
:20715B00007FE03EFC0000FFC03FF80001FF801FF80003FF001FF80007FE001FF8000FFCAE
|
||||
:20717B00001FF8001FF8001FF8003FF0001FF8007FE0001FF800FFC0001FFC01FF80003F5A
|
||||
:20719B007C03FF00003E7C07FE00003E7E0FFC00007E3E1FF800007C3F3FF00000FC3F7F59
|
||||
:2071BB00E00000FC1FFFC00001F80FFF800003F00FFF000007F007FE00000FE003FC000088
|
||||
:2071DB001FC001FE00007F8000FF8001FF00007FF00FFE00003FFFFFFC00000FFFFFF00086
|
||||
:2071FB000003FFFFE0000000FFFF000000001FF800001010000000000000000000007C00E2
|
||||
:20721B008200000038004407007903811C0103810079000708080063773E1C3E77631010B4
|
||||
:20723B00000003C00FF0081008100810081008100810081008100BD00BD008100FF00000E4
|
||||
:20725B000A000A0A0009084F70656E4550617065724C696E6B0A08006F70656E657061701D
|
||||
:20727B0065726C696E6B2E64650A0049276D0920666173742061736C656570202E202E2063
|
||||
:20729B002E20746F2077616B65206D653A000A52656D6F7665206261747465726965732C27
|
||||
:2072BB002073686F727420626174746572790A00636F6E74616374732C207265696E73650D
|
||||
:2072DB007274206261747465726965732E004465657020736C6565700A00546167204D4111
|
||||
:2072FB00433A202573006368726F6D613239207625303458005374617274696E67202E2028
|
||||
:20731B002E202E0A0A000A564261743A202564206D560A0054656D70657261747572653AB3
|
||||
:20733B00202564430A0A000C466C617368696E67207625303478202E202E202E000C4F54CA
|
||||
:20735B0041204641494C4544203A280A0A000C4E6F74204F544120696D616765000C57723D
|
||||
:20737B006F6E67204F544120696D616765000C435243206572726F72000C4572726F722023
|
||||
:20739B00436F64652025640057616974696E6720666F722064617461202E202E202E0A00C6
|
||||
:2073BB000A466F756E642074686520666F6C6C6F77696E672041503A000A4150204D4143E3
|
||||
:2073DB003A202530325825303258002530325825303258000A43683A2025642052535349C3
|
||||
:2073FB003A202564204C51493A2025640A00084E6F20415020666F756E64203A280A080A4C
|
||||
:20741B00005765276C6C2074727920616761696E20696E2061000A6C6974746C65207768E8
|
||||
:20743B00696C65202E202E202E00087A7A5A5A5A202E202E202E0A080A000C454550524F76
|
||||
:20745B004D204641494C4544203A280A0A000C536C656570696E6720666F726576657220ED
|
||||
:15747B002E202E202E0A0A00564261743A202564206D560A00E1
|
||||
:203FFA00C007C006C005C004C00390FAA0E060030240EE90FAA1E0FF24FB50030240EBEF99
|
||||
:20401A002F2F9040207302402F02404D0240CE0240E50240EB90FA9E744BF0E4A3F090FA89
|
||||
:20403A00A0740BF090FAA17401F090FAA27468F00240EE90FA9B124916E582FF6045EF24EB
|
||||
:20405A00E0FFBF600040027F1F90FAA3E0FE0E90FAA3EEF0C0078E82124440AD82AE831562
|
||||
:20407A008190FAA2E0FC7B002DFDEB3EFE8D828E837467C0E0124911AE82158190FAA2EEEA
|
||||
:20409A00F0800B90FAA17402F090FAA2E0FFEF75F002A42490F582747435F0F583E493FED0
|
||||
:2040BA00A3E493FF90FA9EEEF0EFA3F090FAA0740BF0802090FAA17403F090FA9E74E3F00B
|
||||
:2040DA00741AA3F090FAA003F0800990FAA17404F0C3802D90FA9EE0FEA3E0FFEE5401240D
|
||||
:2040FA00FFE433FDEFC313CE13CEFF90FA9EEEF0EFA3F090FAA0E0FF1F90FAA0EFF0ED2456
|
||||
:0C411A00FFD003D004D005D006D007224F
|
||||
:207490009B01B3013303C90089019101990019013101930013012301CD01D90199039D01DF
|
||||
:2074B000B90139037302D30193033B017301B7039701A7012703370167016702DB001B0311
|
||||
:2074D0006303C500D10011038D00B10031028B00A3002302ED008D03B103DD001D03710326
|
||||
:2074F00077038B03A303BB003B02BB03D70017034703B7003702C702F70213028F02650020
|
||||
:20751000850169000903A10121034D000D01590019026101610243025300EF024301F10246
|
||||
:20753000E501E901C9033D01790179022F014F014F02DB037B036F03F500C503D103BD007F
|
||||
:0E7550003D02AF002F02DD03BD03D703AF03E2
|
||||
:20412600C007C006C005C004C001C000AC82AD83AEF0FFBF20005031BF0A030241C58F82A2
|
||||
:20414600C007C006C005C004C003C002C001C000C02512430DD025D000D001D002D003D0EB
|
||||
:2041660004D005D006D00780567E00EF24E0FFEE34FFFEEF2FFFEE33FEEF24F8F582EE346E
|
||||
:2041860063F583E493A3E493C4540FFE90F0B3EEF0300507EE2EFE90F0B3F090F0B3E0FFEC
|
||||
:2041A6003395E0FE0FBF00010E90F099E0FCA3E0FDEF2CFFEE3DFE90F099EFF0EEA3F0D075
|
||||
:2041C60000D001D004D005D006D00722C007C006C005C004C003C001C000E58124F6FFC0F7
|
||||
:2041E60007C006C005C004C003C002C001C000C0251242C0D025D000D001D002D003D00455
|
||||
:20420600D005D006D007E58124F6F886050886068D828E83E493FCBC0C7290F099E4F0A322
|
||||
:20422600F0C007C005C006C0E0C0E090412612575BE58124FBF58190F099E0FDA3E0FE3396
|
||||
:2042460095E0FCFB7428C39DFD74019EFEE49CFCE49BFB78647402F2E408F208F208F28D49
|
||||
:20426600828E838CF0EBC007C002C001C000C025125DFBAB82AC83ADF0FED025D000D00158
|
||||
:20428600D002D00790F099EBF0ECA3F0C007E58124F5F8E6C0E008E6C0E0E4C0E0C0E090F6
|
||||
:2042A600108912575BE58124FBF581D000D001D003D004D005D006D007223006253005061E
|
||||
:2042C6007E147F0080047E0A7F0090F0B4EEF03005067E207F0080047E107F0090F0B3EE20
|
||||
:2042E600F0223005067E207F0080047E107F0090F0B4EEF03005067E147F0080047E0A7FD4
|
||||
:204306000090F0B3EEF022AF82BF08028018BF0902804EBF0A028013BF0B028055BF0C016F
|
||||
:2043260022BF0D568038B2050242C01242C090F0B4E0FE3395E0FD90F09BE0FBA3E0FCEE92
|
||||
:204346002BFEED3CFD90F09BEEF0EDA3F090F09DE0FDA3E0FE90F099EDF0EEA3F022B204C5
|
||||
:204366002290F099E0FDA3E0FE90F09DEDF0EEA3F02290F09DE4F0A3F0227E00C007C00650
|
||||
:12438600745EC0E07475C0E0125AACE58124FCF58122F4
|
||||
:15755E00496E76616C69642063686172203078253032780A00C2
|
||||
:20439800E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBC8
|
||||
:2043B80000438004002275FB02228582F9E5F830E1FB53F8FDE5F820E0FB85F9822253F3F7
|
||||
:2043D800C775FA2275FC0C75F8C043F4C043F102D20B2253F1FD53F43F75FA0075FC31754A
|
||||
:0843F800F84043F338C20B2228
|
||||
:20440000858283D0F0D0E0D082C082C0E0C0F022C00074FB2581F8E58286820886830886C1
|
||||
:20442000F0D0002275F008C58213C58233D5F0F7C58222E583A2E713F583E58213F58222A5
|
||||
:20444000D083D0E0D0F0C0F0C0E0C083E582A4F58285F08322C000E58124FDF8E6F8858246
|
||||
:20446000F0A4F582E8A8F08583F0A428F583E5F03400F5F0E4D00022C000C001C0E0C0F0E0
|
||||
:2044800074FA2581F88600E58288F0A4F582A9F0E58388F0A429F583E5F03400F9D0E08898
|
||||
:2044A000F0A429C5F03400F9D0E0C0F088F0A429D0F0D001D00022C000C001C002E5812468
|
||||
:2044C000FBF8E6F918E6F88582F0A4C0E0AAF0E58388F0A42AF8E5F03400FAE98582F0A412
|
||||
:2044E00028C0E0E5F03AFA74003400F8E98583F0A42AFAE5F0388AF0D083D082D002D001D3
|
||||
:20450000D00022D0E0D0F0C000C001C002C0F0C0E074F82581F9E7F809E7F922D002D0010E
|
||||
:20452000D00022C9C583C9C8C582C82212450375F008124523E0A3124523F0A3D5F0F3022B
|
||||
:20454000451C12450375F008124523E493A3124523F0A3D5F0F202451C124503C375F008EE
|
||||
:20456000124523E0A3F502124523E03AF0A3D5F0EF02451C12450375F008124523E0A3F550
|
||||
:2045800002124523E05AF0A3D5F0EF02451C124503C375F008124523E0A3F502124523E0E3
|
||||
:2045A0009AF0A3D5F0EF02451C124503C375F008124523E0A3F502124523E0A39AD5F0F0ED
|
||||
:2045C00002451C12450375F008124523E0A3F502124523E0A36A7007D5F0EED302451CC333
|
||||
:2045E00002451CC8C0E075F008E038F0A3D5F0F9D00022D3E40245E3C374FF0245E3C00027
|
||||
:20460000C00174FA2581F8E6F5F0088601496015088600E8F0A374FF25F0F5F074FF39F59E
|
||||
:204620000145F070EED001D00022C000C001C00274F92581F9E7D3601CF5F0098700098799
|
||||
:2046400001C3E0F502A3124523E0A31245236A7004D5F0EED3D002D001D00022C000C0012B
|
||||
:20466000C00274F82581F9E7F5F00987024A601F098700098701124523E0A3124523F0A31B
|
||||
:2046800074FF25F0F5F074FF3AF50245F070E7D002D001D00022C000C001C00274F9258192
|
||||
:2046A000F9E76015F5F0098700098701124523E0A3124523F0A3D5F0F3D002D001D0002248
|
||||
:2046C000C083C082E06003A380FAC3E582D0F095F0F582E583D0F095F0F58322C003C00243
|
||||
:2046E000C001C000C0E0C0F0C083C082A98174F62581F886F0188600750201750300758237
|
||||
:2047000011A2F74014C3E833F8E5F033F5F0C3EA33FAEB33FB058280E8E4C003C002C0E0ED
|
||||
:20472000C0E0AA81C0F0C000C0E0C0E0A881C0E0C0E0C0E0C0E0AB81C000C001C3758304E9
|
||||
:2047400086F018E71995F0D583F6D001D000402BC000C001C375830486F018E795F0F719A2
|
||||
:20476000D583F585020085030175830486F018E745F0F719D583F5D001D00074FC28F8C3E5
|
||||
:2047800075830408E613F6D583F9C00074FC2AF8C375830408E613F6D583F9D000D58298BD
|
||||
:2047A00020D508D082D083D0F0D00074F42581F58130D508D082D083D0F0D000E8D000D079
|
||||
:2047C00001D002D00322C2D50246DCD2D50246DCC003C002C001C000C0E0C0F0C083C082B0
|
||||
:2047E000A98174F62581F886F07401758219A2F7400A23C5F023C5F0058280F2C0E0E4C0BC
|
||||
:20480000E0C0E0C0E0AA81C0F0C0E0C0E0C0E0A881C0E0C0E0C0E0C0E0AB81C000C001C3A4
|
||||
:2048200075830486F018E71995F0D583F6D001D000402BC000C001C375830486F018E795C5
|
||||
:20484000F0F719D583F585020085030175830486F018E745F0F719D583F5D001D00074FCE7
|
||||
:2048600028F8C375830408E613F6D583F9C00074FC2AF8C375830408E613F6D583F9D000E8
|
||||
:20488000D58298D082D083D0F0D00074F42581F581E8D000D001D002D00322C006C005C0D5
|
||||
:2048A00004C003C002C001C00074F72581F886F074017C09A2F7400923C5F023C5F00C8057
|
||||
:2048C000F3FBE4FAA9F0F88582F0FDFEC3E58298E583994011C3E58298F582E58399F583C3
|
||||
:2048E000EA4DFDEB4EFEC3E913F9E813F8C3EB13FBEA13FADCD620D5048D828E83D000D084
|
||||
:2049000001D002D003D004D005D00622C2D502489BD2D502489BE0C0E02401F0A3E0C0E090
|
||||
:204920003400F0A3E0D083D0826014B4600AC000A882E2D000F582224009E493F58222E02B
|
||||
:20494000F58222C000A882E6D000F5822212450375F004D3124523E0FA3400F0EAA3124593
|
||||
:2049600023F0A3D5F0EE02451C12450375F004C3124523E0FAA3124523E0A36A7004D5F04E
|
||||
:20498000EFD302451C124503C3E0A398E0A399E0A39400E0A3940002451C124503C3E0A36D
|
||||
:2049A00038E0A339E0A33400E0A3340002451C75F004E07004A3D5F0F9F58222A3A3A3E0B2
|
||||
:0249C0003322A0
|
||||
:0449C20075C90B2286
|
||||
:2049C600C0E0C007C006C0D075D000AEDAAFDB74012EF5DAE43FF5DBD0D0D006D007D0E05B
|
||||
:2049E60032C007C006C005C004C000AEDAAFDB784AEEF208EFF27848E5E2F27849E5E3F218
|
||||
:204A0600EEB5DAE7EFB5DBE37848E2FC08E2FD08E2FE08E28C828D838EF0D000D004D0055E
|
||||
:204A2600D006D0072285E28222E4F5DAF5DBF5E4F5E5F5E6F5E7F5E275E40543D84043B81E
|
||||
:204A46000222AF82AE83ADF0FC784CEFF2EE08F2ED08F2EC08F21249E77850C0E0E582F2D4
|
||||
:204A6600E58308F2E5F008F2D0E008F21249E7AA82AB83AEF0FF7850D3E29AF4B3FAB308A9
|
||||
:204A8600E29BF4B3FBB308E29EF4B3FEB308E29FF4FF784CC3E29A08E29B08E29E08E29F49
|
||||
:034AA60050CA22D1
|
||||
:204AA90053C07F53A1FE53BEFC3243870122AF82AE83ADF0FC7854EFF2EE08F2ED08F2ECDA
|
||||
:204AC90008F290FAA4E4F090FAA5F090FAA674DFF090FAA774BEF090FAA8E054E0F090FA2C
|
||||
:204AE900A8E0541FF090FAA97407F090FAAAE054E0F090FAAAE0549F4420F090FAAAE05429
|
||||
:204B09007FF090FAABE054FC4402F090FAABE054FBF090FAABE054F7F090FAABE054CFF0B6
|
||||
:204B290090FAABE0543F4440F07854E2F5F008E242F008E242F008E245F0701B7B017513D7
|
||||
:204B49006D7514FC85141590FAA4E515F07A6D90FAA5EAF0024BEB7854C3E2943F08E294AA
|
||||
:204B69000008E2940008E29400500C7854743FF2E408F208F208F27854E225E0F51608E2E9
|
||||
:204B890033F51708E233F51808E233F519E5162516F516E51733F517E51833F518E519338E
|
||||
:204BA900F519747DC0E0E4C0E08516828517838518F0E5191247C67854C0E0E582F2E583B6
|
||||
:204BC90008F2E5F008F2D0E008F2158115817B007D667EFC8E0590FAA4EDF07E6690FAA5A4
|
||||
:204BE900EEF053C07F53A1FE43A11075A8A0EB70147854E2F5F008E242F008E242F008E275
|
||||
:204C090045F070012253BEFBE5BE30E5FBE5C654384441F5C6E5C630E6FB43BE0453C67F34
|
||||
:204C29007854C3E2F5F074F095F008E2F5F074FF95F008E2F5F0E495F008E2F5F0E495F0F5
|
||||
:204C4900501B7DF07EFF7854E22410F208E23400F208E234FFF208E234FFF280117854E2B5
|
||||
:204C6900FD08E2FE7854E4F208F208F208F2EB60067A007C0080047A107C008AA175C00085
|
||||
:204C890043D6817AA47CFA8AD48CD575D60175A204E5A570FC75A2028EA48DA3AEA5EEB550
|
||||
:204CA900A50280FA43C702EB60077B0075BE07800375BE06000000E5BE5403600875D7014C
|
||||
:204CC900004387010053C7FDE5BE30E5FB75BE00E5BE30E5FB75C679E5BE30E6FB7E007DED
|
||||
:1B4CE90000000DBD80FB0EBE80F575C639E5C620E6FB75C63875BE04024BF71C
|
||||
:0E76AB0006060606060604070707070707047B
|
||||
:204D0400AF8275BB0074304FF5B575B473E5B420E6FBE5B430E7FBAEBA7F00ADBB7C009055
|
||||
:204D2400FAB0EC4EF0ED4FA3F08FB522C21690FAB0E0FEA3E08E82C4C582C4540F6582C505
|
||||
:204D440082540FC5826582C582F58374E2C0E07404C0E01244B7AC82AD83AEF0FF158115BC
|
||||
:204D64008190FAAEE0FAA3E0FB74FFC0E07407C0E08A828B831244B7A882A983AAF0FB15C9
|
||||
:204D8400811581ECC398FCED99FDEE9AFEEF9BFF747DC0E08C828D838EF0EF124478AC820B
|
||||
:204DA400AD83AEF0FF1581EFC40354F8CEC403CE6ECE54F8CE6EFFEDC40354074EFEEDC458
|
||||
:204DC4000354F8CCC403CC6CCC54F8CC6CFDEF30E70FD216C3E49CFCE49DFDE49EFEE49FAB
|
||||
:204DE400FF90FAACE0C0E0A3E0C0E08C828D838EF0EF1247C6AC82AD83AEF0FF1581158106
|
||||
:204E040074FF2CFC74033DFDE43EFEE43FFF74FFC0E07407C0E08C828D838EF0EF1247C628
|
||||
:164E2400AC821581158190FAB2ECF030160790FAB2C3E49CF02228
|
||||
:204E3A00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB1B
|
||||
:204E5A00004380040022C007C006AF82BF64004027BF6A00502290DF097421F090DF0A7482
|
||||
:204E7A003BF090DF0B7413F08F06EE249CFE90DF0675F003A4F0802F90DF097422F090DF2E
|
||||
:204E9A000A74BBF090DF0B7413F0BFC8004013BFE100500EEF2438FF90DF0675F00CA4F042
|
||||
:204EBA00800590DF06E4F0D006D00722C00775E10490DF3BE0B401FCD00722124EC67F0041
|
||||
:204EDA008F057EDFEFC3907573938D828E83F00FBF200040EB90DF237488F090DF2474312B
|
||||
:204EFA00F090DF257409F090DF2E748EF075911075ED00759D0075EF0322C007AF82C3EF5B
|
||||
:204F1A006480946250047FE2800EC3748A8FF063F08095F050027F0A741E2FC313907593B8
|
||||
:204F3A009390DF2EF0D00722C007C006AE82AF838ED48FD575D6010000000000000000003D
|
||||
:204F5A00D006D0072275D68100000000000000000022C007C006C005AE82AF83124F5F8F77
|
||||
:204F7A000590FC76EDF090FC77EEF07E747FFC8E828F83124F42D005D006D00722C007C0F5
|
||||
:204F9A0006C005AE82AF83124F5F8F0590FC7CEDF090FC7DEEF07E7C7FFC8E828F83124FB2
|
||||
:204FBA0042D005D006D00722301704E5EF700122124EC653C0FE43B801E5ED75F080A4248D
|
||||
:204FDA00B4F58274FA35F0F583124F6C75E1022253B8FE124F5F124EC675D10053C0FE22D2
|
||||
:204FFA00AE82AF837CFF7DFF124FEA8E828F83124F9775E90075E103E5E920E42375820F27
|
||||
:20501A00C005C004124D04D004D00590FAB0E0FEA3E0FFC3EE9CEF9D50DE8E048F0580D8C2
|
||||
:20503A00124F5FC005C004124FC2D004D0057423C0E08C828D8312490C15817404C0E012C5
|
||||
:20505A004455AC82AD83158190F0E7ECF0EDA3F022C025C0E0C0F0C082C083C007C006C0BD
|
||||
:20507A0005C004C003C002C001C000C0D075D000E5D130E040E5ED75F080A424B4FE74FACD
|
||||
:20509A0035F0FF53D1FE8E828F83E0FD248240200D0DED2EF582E43FF583E0FF30E711E578
|
||||
:2050BA00ED04FF8FEDBF030375ED00E5EF14F5EF124FC2800F74A8C0E07475C0E0125AAC68
|
||||
:2050DA001581158153C0FED0D0D000D001D002D003D004D005D006D007D083D082D0F0D008
|
||||
:2050FA00E0D02532201906124FEAC21722201705D217024FC222E59D75F080A424B4FE745B
|
||||
:20511A00FA35F0FF8E828F83E0FD7403B5EF047582FF228D037C0074022BF9E43CFAE92E4A
|
||||
:20513A00F582EA3FF583E0FA747F5AD39494F4FABA7F0040047AFF8003EA2AFA90F0BFEA7D
|
||||
:20515A00F00BBB00010CEB2EF582EC3FF583E0A2E71324B390F0C0F00EBE00010FC005C05B
|
||||
:20517A0006C00790F95B124696158115811581E59D04FF8F9DBF0303759D00D21A10AF027F
|
||||
:20519A00C21AE5EFFF04F5EFA21A92AFEF7007C005124FC2D0058D8222D21B10AF02C21B82
|
||||
:1051BA00AFEF75EF03A21B92AFEF7003024FC2224B
|
||||
:20757300D3917D044522000F0022BB131D3B1373A7650700181E1CC700B0B610EA2A001FFA
|
||||
:20759300030506080B0E191C242527293855408D8A84CAC4C0646D612069727120756E651F
|
||||
:0975B300787065637465640A00D8
|
||||
:1076B900DFD900008080131A0000DFD9207E134231
|
||||
:1700E10090FC457456F090FC467412F090FC4703F090FC487485F0B2
|
||||
:2051CA00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB88
|
||||
:2051EA00004380040022C007C006C005C004C003C002C001C000E582785BF27E00C21D789F
|
||||
:20520A005CE4F2C006785CE2C0E0901000124455AA82AB831581785DEAF2EB08F2785F741A
|
||||
:20522A0004F2E408F2785DE2FA08E2FBE4FCFE7404C0E0E4C0E07449C0E074FCC0E08A8207
|
||||
:20524A008B838CF0EE1206D0E58124FCF5817404C0E07445C0E074FCC0E090FC4912462A10
|
||||
:20526A00158115811581921ED006201E03025354785FE2FB08E2FCC394104003025354C045
|
||||
:20528A0006785D795FE3C5F0E225F0FB09E3C5F008E235F0FAE4FCFE7402C0E0E4C0E07431
|
||||
:2052AA0049C0E074FCC0E08B828A838CF0EE1206D0E58124FCF58190FC49E0F51A74FFB597
|
||||
:2052CA001A05D006025354D006785BE2B51A5D90FC4AE0FCBC020040531C1C8C06785AC30D
|
||||
:2052EA00E29C5004785AE2FCC0067B007858E2F51B08E2F51C785DE2FD08E2FF74022DFDE7
|
||||
:20530A00E43FFF785FE22DFD08E23FFA7E007F00C004C003C01BC01C8D828A838EF0EF1285
|
||||
:20532A0006D0E58124FCF581D21DD00690FC4AE0FF7D00785FE2FB08E2FCEF2BFBED3CFCC6
|
||||
:20534A00785FEBF2EC08F202527A785CE22401F2785CE2B40A00500302520D301D048E0700
|
||||
:20536A0080027FFF8F82D000D001D002D003D004D005D006D00722758204C007C006C00507
|
||||
:20538A00C004C003C002C001C00012179E125402D000D001D002D003D004D005D006D0076E
|
||||
:2053AA00301C26C007C006C005C004C003C002C001C0001216D8125402D000D001D002D0AA
|
||||
:2053CA0003D004D005D006D007758204C007C006C005C004C003C002C001C0001217D775DE
|
||||
:2053EA008200125C8AD000D001D002D003D004D005D006D007D2AF22D21C785874A2F274B0
|
||||
:20540A00FD08F2785A7407F275822A1251F0E582FF30E71B785874A2F274FD08F2785A74B7
|
||||
:20542A0006F27582011251F0E582FF30E701227404C0E0E4C0E0C0E090FDB21245FE158119
|
||||
:20544A00158115817404C0E074B2C0E074FDC0E0906ACA12462A158115811581921F401D11
|
||||
:20546A007404C0E074A4C0E074FDC0E0906ACA12462A158115811581921F40012290F95745
|
||||
:20548A007444F090F9567467F090FDA4E0FF90F953F090FDA5E0FE90F952F090FDA6E09056
|
||||
:2054AA00F951F090FDA7E090F950F090FDA4E4F07D007C00C006C005C007C00474A2C0E001
|
||||
:2054CA0074FDC0E0E4C0E074BCC0E07475C0E0125AACE58124F7F58190F950E0FF7E0090FF
|
||||
:2054EA00F951E0FD7C00C007C006C005C00474CAC0E07475C0E0125AACE58124FAF58190E0
|
||||
:20550A00FDA2E024BF90F955F090FDA3E024BF90F954F090F956E0FF7E0090F957E0FD7C1C
|
||||
:20552A0000C007C006C005C00474D4C0E07475C0E07434C0E074FCC0E0125B25E58124F86E
|
||||
:20554A00F58190F954E0FF7E0090F955E0FD7C00C007C006C005C00474D4C0E07475C0E0D3
|
||||
:20556A007438C0E074FCC0E0125B25E58124F8F58190F952E0FF7E0090F953E0FD7C00C00E
|
||||
:20558A0007C006C005C00474D4C0E07475C0E0743CC0E074FCC0E0125B25E58124F8F58150
|
||||
:2055AA0090F950E0FF7E0090F951E0FD7C00C007C006C005C00474D4C0E07475C0E074403D
|
||||
:2055CA00C0E074FCC0E0125B25E58124F8F581785874ACF274FA08F2785A7402F2758212FA
|
||||
:2055EA001251F0E58230E70122785874AEF274FA08F2785A7402F27582091251F0E582303D
|
||||
:20560A00E70122C21C2290561B747CC39582F5F02275F020C2ADC2AC43AE0100E5AE20E7B6
|
||||
:20562A00FB05AD05ADD5F0F09000008583AD8582ACA375AB2275F00275F900E5F830E1FBB1
|
||||
:20564A0053F8FDE5F820E0FBC0F9D5F0EB43AE02E5AE20E6FBD0E0D0AFF5AFE5AE20E6FBC9
|
||||
:20566A0053AEFDE5AE20E7FBE583B440BE75C90B80FEC007C006C005C004C003125610ACAF
|
||||
:20568A0082AD83AEF0FF8E03C003C004C00590FDA212469615811581158175D6FF75A8008E
|
||||
:2056AA0075C70390FDA2E473D003D004D005D006D00722C007C00675A80075B800759A00EA
|
||||
:2056CA0075C70075BE00E5BE30E5FB75C679E5BE30E6FB7F007E00000EBE80FB0FBF80F5AF
|
||||
:2056EA0075C639E5C620E6FB75C63875BE04D006D0072243B404E5B4540C600280F8E5BC98
|
||||
:20570A0065BDF582221256FDC0821256FDC0821256FDC0821256FDD083D0F0D0E022C000C5
|
||||
:0B572A008582BC7861E2F5BCD0002253
|
||||
:2075BC00534E20257325303278253032780025303278253032780A00253032582530325892
|
||||
:0175DC0000AE
|
||||
:20573500E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FB17
|
||||
:20575500004380040022C007C083C082858107C004C003C002C001C00074F42581F8868319
|
||||
:2057750018868218860018E0A36013B4250B7C007A00E0A36008B42516125A3D80E9D000B2
|
||||
:20579500D001D002D003D004D082D083D00722B4630518E61880E2FB4420B46D3AEB54205F
|
||||
:2057B50003F9C083C0821259D97C0874FF2C93C083C082FAC47B02540F29905A6C93125AB8
|
||||
:2057D5003DEADBF3D082D083DC06D082D0838097743A125A3D80D4EBB42A09BA009B740135
|
||||
:2057F5004CFC808EB43007BA0004740680F2FB24D0501224F6400E240AFB740A8AF0A42B00
|
||||
:20581500FA740480DBBB6C0DEC54086004741080CF740880CBBB733CEC5408C083C0827085
|
||||
:20583500051259E080031259D9EC54047009E0A36098125A3D80F7BA0002808EE0A3600A2D
|
||||
:20585500125A3DDAF7808302592D7420125A3DDAF90257DFEB4420B478EDC083C08212598E
|
||||
:20587500F6C083C082E5F023F90324FF2582F582E5833400F583E054F0701119E0700D191B
|
||||
:205895001582E582B4FF021583D5F0EAB9000109EC5420600B09EC54026005742D125A3D71
|
||||
:2058B500EC54046018EAC39940136011FAEC5402C4032420F582E582125A3DDAF9EC54200C
|
||||
:2058D500600B19EC54027005742D125A3DEB542003FAD082D083E904C313FC142582F5823C
|
||||
:2058F500E5833400F583E954016005E079018005E07902FBC4540F2AC083C082905A6C93E8
|
||||
:20591500D082D083125A3DEBD9EB1582E582B4FF021583DCDB0257DFBB640674204CFC80BA
|
||||
:2059350008BB7502800302577CC083C0821259F6C0F07408C395F0244DF9E434FCFBE0A36A
|
||||
:20595500125A32F0A3125A32D5F0F3125A32F5F0EC54206028E5F054807006EC54DFFC8086
|
||||
:205975001CD0F0C0F07408C395F0244DF582E434FCF583C3E0F9E499F0A3D5F0F775F00A77
|
||||
:20599500E4F0A3D5F0FBD0E0C403FB90FC5575F00AE0F9540F24FBE950022403F954F024DB
|
||||
:2059B500B0E950022430F0A3D5F0E690FC4DC375F012E033F0A3D5F0F9DBD090FC5575F0ED
|
||||
:2059D5000A02587686831886821822E61860F5648060F164C0600585938380EA7583FF80E8
|
||||
:2059F500E5EC5401701F88F07583FFEC5418600A5410600418181818181818888218E5F045
|
||||
:205A1500C398F5F022EC5418600E5410600575F00880B175F00480AC75F00280A7C583CBAC
|
||||
:205A3500C583C582C9C58222C083C082C001C0008F0086821886831818181886011886004D
|
||||
:205A5500125A61D000D001D082D08322C082C0838500828501832230313233343536373871
|
||||
:205A75003941424344454630313233343536373839616263646566C007C006C005C004FFCC
|
||||
:205A9500BF0A0675820D1243C28F821243C2D004D005D006D00722C007C001C000A20B92E0
|
||||
:205AB50020E58124FAFF200B031243D6C007E58124F9F8E6C0E008E6C0E0E4C0E0C0E090CB
|
||||
:205AD5005A8C12575BE58124FBF5812020031243EBD000D001D00722C007C006C005C004D9
|
||||
:205AF500C003C001AC82FF8C018F0487060987071974012EFBE43FFDA70309A7058E828FC7
|
||||
:205B150083ECF0D001D003D004D005D006D00722C007C006C005C001C000E58124F6FFE5BE
|
||||
:205B35008124F8FE7D00C007E58124F5F8E6C0E008E6C0E0C006C005905AED12575BE5815A
|
||||
:195B550024FBF58124F8F88682088683E4F0D000D001D005D006D007225C
|
||||
:0200F800C22123
|
||||
:205B6E00E58620E0FB225390FD00225380FB0022E58620E0FB004390020022E58620E0FBDA
|
||||
:205B8E00004380040022C007AF82E58620E0FB53807F008F82125D1100E58620E0FB4380A4
|
||||
:205BAE0080D0072253BEFC32AE82AF838E828F83E493FD74012EFBE43FFCEDFA60525390EE
|
||||
:205BCE00FD008B828C83E493FD0BBB00010CE58620E0FB53807F008D82125D1100E5862085
|
||||
:205BEE00E0FB438080EA14FDED6015E58620E0FB8B828C83E493F5C1A3AB82AC831D80E8E9
|
||||
:205C0E008B068C07E58620E0FB0043900200809C2230210122D221758201125C8A439002AD
|
||||
:205C2E005380BF43F42875C20075C5317586009000FDE4F5F0124A484390049000FDE4F591
|
||||
:205C4E00F0124A482090FD9075DD125BB65390FD00E58620E0FB53807F00758204125D11DD
|
||||
:205C6E0000E58620E0FB4380803090FDE58620E0FB00439002009075E9025BB6E582601697
|
||||
:205C8E0090F953E054F0600122438FC143FDC143F62E43FE2E2253F4D790F953E0FF54F0CA
|
||||
:205CAE00600B53807E5390D100D2860022538F3A53FD3A53F6D153FED1222021012290767E
|
||||
:205CCE0075125BB6758200125C8AC22122125C1F5390FD003022067E137F0080047E107FC4
|
||||
:205CEE0000E58620E0FB53807F008E82125D1100E58620E0FB438080E58620E0FB0043906C
|
||||
:205D0E00020022C007AF82E58620E0FB8FC1D007227EFF7FFF7482C0E07476C0E0125AAC77
|
||||
:205D2E001581158190767FC007C006125BB6D006D00720902F900032E4F5F0C007C006123E
|
||||
:205D4E004AB71256BD75820F124D04D006D00790FAB0E0FCA3E0FDC3EC9EED9F50D48C06D4
|
||||
:205D6E008D0780CE7423C0E08E828F8312490C15817404C0E0124455AC82AD83158190F0A6
|
||||
:205D8E00E9ECF0EDA3F075820112179E125CC812197C7494C0E07476C0E0125AAC1581151F
|
||||
:025DAE00812250
|
||||
:2075DD00050107000900040607070F0002008F0461800128023029025017028208026022DE
|
||||
:2075FD00102001010103040906060A040419030409102101010103840986460A8444190366
|
||||
:20761D004409102201010143040986460A84441983040910250A0A0102140D14140100009E
|
||||
:20763D000000000010264A4A0182540D54540100000000000010270A0A0102140D1414013E
|
||||
:20765D00000000000000102401810183840986460A844419030409000282000501020000F3
|
||||
:20767D0000000112005570646174696E6720646973706C61790A0055706461746520636F29
|
||||
:08769D006D706C6574650A0054
|
||||
:205DB000AE82AF837C007D007B10EF235401FAEE2EFEEF33FFEC2CFCED33FDEA600343048C
|
||||
:205DD000017862C3E2F5F0EC95F008E2F5F0ED95F040117862D3E29CF4B3FCB308E29DF44F
|
||||
:0B5DF000FD430601DBC48E828F83227E
|
||||
:205DFB00AC82AD83AEF0FF33E433FB6013C3E49CF55AE49DF55BE49EF55CE49FF55D800842
|
||||
:205E1B008C5A8D5B8E5C8F5DAC5AAD5BAE5CAF5D7867E233E433FA60207864E2D3F4340061
|
||||
:205E3B00F55A08E2F43400F55B08E2F43400F55C08E2F43400F55D80117864E2F55A08E247
|
||||
:205E5B00F55B08E2F55C08E2F55D786CE55AF2E55B08F2E55C08F2E55D08F28C828D838EEE
|
||||
:205E7B00F0EFC003C002125ECF7868C0E0E582F2E58308F2E5F008F2D0E008F2D002D0030B
|
||||
:205E9B00EA6B60207868E2D3F43400FA08E2F43400FB08E2F43400FE08E2F434008A828B95
|
||||
:145EBB00838EF0227868E2F58208E2F58308E2F5F008E2223A
|
||||
:205ECF00AF82AE83ADF0FC7870EFF2EE08F2ED08F2EC08F27A007B007E007F007D207873C0
|
||||
:205EEF00E2235401FC7870E225E0F208E233F208E233F208E233F2EA2AFAEB33FBEE33FE09
|
||||
:205F0F00EF33FFEC6003430201786CC3E2F5F0EA95F008E2F5F0EB95F008E2F5F0EE95F05E
|
||||
:205F2F0008E2F5F0EF95F04022786CD3E29AF4B3FAB308E29BF4B3FBB308E29EF4B3FEB36C
|
||||
:1D5F4F0008E29FF4FF7870E24401F2DD917870E2F58208E2F58308E2F5F008E222CC
|
||||
:0600B200E478FFF6D8FD22
|
||||
:200090007924E94400601B7A019076A578607593FCE493F2A308B800020593D9F4DAF27595
|
||||
:0200B00093FFBC
|
||||
:1B5F6C0020F71130F6138883A88220F509F6A8837583002280FEF280F5F02234
|
||||
:205F8700AA83AB828BF090F075E0A4F8A9F08AF0E0A429F98BF0A3E0A429F583888222226A
|
||||
:205FA700AF82AE83ADF0FC787BEFF2EE08F2ED08F2EC08F2787BE2FF7879E28FF0A4FFADE0
|
||||
:205FC700F07881EFF208EDF2787BE2FF7877E28FF0A4FFADF0787FEFF208EDF27882E2FF0B
|
||||
:205FE700787EE2FE7877E28EF0A42FFF7882F2787DE2FE7878E28EF0A42F7882F27881E2F8
|
||||
:20600700FE08E2FF787DE2FD7877E28DF0A4ABF02EFEEB3FFF7881EEF208EFF2787CE2FD47
|
||||
:206027007878E28DF0A4ABF02EFEEB3FFF7881EEF208EFF2787CE2FF7879E28FF0A4787EF3
|
||||
:20604700F2787CE2FF7877E28FF0A4FFADF0787CEFF208EDF2787BE2FF787AE28FF0A478E3
|
||||
:206067007AF2787BE2FF7878E28FF0A4FFADF07878EFF208EDF27877E4F2787BF2787FE20D
|
||||
:20608700F55E08E2F55F08E2F56008E2F561787BE2FA08E2FB08E2FE08E2FFEA255EF55EA4
|
||||
:2060A700EB355FF55FEE3560F560EF3561F561787FE55EF208E55FF208E560F208E561F26A
|
||||
:2060C700787FE208E208E208E27877E2FC08E2FD08E2FE08E2FFEC255EFCED355FFDEE3591
|
||||
:0C60E70060FEEF35618C828D838EF0220C
|
||||
:2060F300AE82AF837D007C007884E2235401FB70357883E225E0F208E233F27883C3E2F5C4
|
||||
:20611300F0EE95F008E2F5F0EF95F050147883E2F5F008E2C313C5F01318F2C5F008F280DF
|
||||
:20613300050C8C0580C27883C3E2F5F0EE95F008E2F5F0EF95F0400E7883D3E29EF4B3FEEC
|
||||
:20615300B308E29FF4FF7883E2F5F008E2C313C5F01318F2C5F008F28D041DEC70C88E8218
|
||||
:036173008F8322F5
|
||||
:20617600AD82AE83AFF07888E2F5F008E245F07004900000227888E2FB08E2FC1BBBFF0165
|
||||
:206196001CEB4C6069C003C0048D5E8E5F8F60855E82855F838560F01262F5FA7885E2F5A7
|
||||
:2061B6006108E2F56208E2F5638561828562838563F01262F5FCEAB504028006D004D00304
|
||||
:2061D600802C7401255EFAE4355FFBAC608A058B068C0774012561FAE43562FBAC63788562
|
||||
:2061F600EAF2EB08F2EC08F2D004D003808E8D828E838FF01262F5FD7F007885E2FB08E2E5
|
||||
:1A621600FC08E2FE8B828C838EF01262F5FB7E00EDC39BF582EF9EF5832225
|
||||
:20623000AE82E583FF33E433FD6009C3E49EFBE49FFC80048E038F04788BE233E433FF6012
|
||||
:2062500010788AE2D3F43400FA08E2F43400FE8007788AE2FA08E2FE7862EAF2EE08F28BBF
|
||||
:20627000828C83C007C005125DB0AC82AE83D005D007EF6D600AC3E49CF582E49EF583222B
|
||||
:056290008C828E8322C8
|
||||
:2000B800788CE84400600A79007593F0E4F309D8FC78D4E8440B600C790C90F08CE4F0A372
|
||||
:0400D800D8FCD9FA7D
|
||||
:0F008100E473758168126311E582600302007EEB
|
||||
:20629500758911758800758B00758D0020B0FD20B0FA20B0F720B0F420B0F130B0FDD28EBB
|
||||
:2062B50020B0FD30B0FD20B0FD30B0FDC28EE58D25E0FFE58B2354014FF58DE58D25E0FF80
|
||||
:2062D500E58B232354014FF58DE58DF4F58DE58D04F58D858D8B7589217587807598522234
|
||||
:1C62F50020F71430F6148883A88220F507E6A88375830022E280F7E49322E022B8
|
||||
:04631100758200226F
|
||||
:00000001FF
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user