From 4d5306c0176627ae10cc01ec695a9aa364c8d45b Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Tue, 20 Oct 2026 15:10:40 +0200 Subject: [PATCH 1/8] feat!: firmware v2 for NetIgnite server v2 (protocol v2, NVS settings, enrollment) NetIgnite v2, milestone 2. - Toolchain: pioarduino 55.03.312-1 (Arduino-ESP32 3.3.12, ESP-IDF 5.5.5), pinned. - Partition table with two 1.875 MB OTA slots; NVS stays at 0x9000 for provisioning images. - Settings in NVS instead of a compiled-in config.h; DHCP by default, optional static IPv4. - Serial console (setup, wifi, server, enroll, ip, name, log, status, reboot, factory-reset) and Improv Wi-Fi Serial for the web installer, on the same UART. - Enrollment: the agent generates its own secret and exchanges a single-use token for a credential; the secret is never printed. - Agent protocol v2 over /ws/agent: HELLO with capabilities and diagnostics, PING, WAKE, STATUS; reconnect with backoff and a server-silence timeout. - Status checks in their own task: ICMP and TCP probes for IPv4, IPv6 (link-local with the Wi-Fi interface zone) and host names; a refused TCP connection counts as online. - Wake-on-LAN to the subnet broadcast and 255.255.255.255 without an extra library. - lib/netignite_core: parsers and encoders, unit-tested on the host (pio test -e native). - test/emulator: QEMU test of Improv (with improv-wifi-serial-sdk) and the console. - CI: tests, builds, size gate, emulator test; tagged releases with flash images, release.json and an optional ECDSA signature. - Removed the unused Electron installer placeholder. BREAKING CHANGE: v1 servers aren't supported, and config.h is gone. Boards need one USB flash of v2 (new partition table) and are then set up from the serial console. --- .github/workflows/firmware.yml | 128 + .gitignore | 17 +- README.md | 103 + data/cert/run_gen_script.py | 8 +- include/README | 37 - installer/.editorconfig | 9 - installer/.eslintignore | 4 - installer/.gitignore | 5 - installer/.npmrc | 3 - installer/.vscode/extensions.json | 3 - installer/.vscode/launch.json | 39 - installer/.vscode/settings.json | 11 - installer/README.md | 76 - installer/build/electron-vite-vue-ts.png | Bin 625554 -> 0 bytes installer/build/entitlements.mac.plist | 12 - installer/build/icon.icns | Bin 85649 -> 0 bytes installer/build/icon.ico | Bin 123545 -> 0 bytes installer/build/icon.png | Bin 35949 -> 0 bytes installer/bun.lock | 1117 --- installer/electron-builder.yml | 45 - installer/electron.vite.config.ts | 20 - installer/package-lock.json | 6525 ----------------- installer/package.json | 45 - installer/resources/icon.png | Bin 35949 -> 0 bytes installer/src/main/index.ts | 74 - installer/src/preload/index.d.ts | 8 - installer/src/preload/index.ts | 22 - installer/src/renderer/index.html | 17 - installer/src/renderer/src/App.vue | 26 - installer/src/renderer/src/assets/base.css | 67 - installer/src/renderer/src/assets/main.css | 171 - installer/src/renderer/src/env.d.ts | 8 - installer/src/renderer/src/main.ts | 6 - installer/tsconfig.json | 4 - installer/tsconfig.node.json | 8 - installer/tsconfig.web.json | 18 - lib/README | 46 - lib/netignite_core/library.json | 10 + .../src/netignite/CommandLine.cpp | 41 + .../src/netignite/CommandLine.h | 16 + lib/netignite_core/src/netignite/Hex.cpp | 16 + lib/netignite_core/src/netignite/Hex.h | 12 + lib/netignite_core/src/netignite/Improv.cpp | 63 + lib/netignite_core/src/netignite/Improv.h | 74 + lib/netignite_core/src/netignite/Mac.cpp | 103 + lib/netignite_core/src/netignite/Mac.h | 28 + .../src/netignite/MagicPacket.cpp | 18 + .../src/netignite/MagicPacket.h | 18 + lib/netignite_core/src/netignite/Protocol.cpp | 173 + lib/netignite_core/src/netignite/Protocol.h | 68 + .../src/netignite/SerialDemux.cpp | 99 + .../src/netignite/SerialDemux.h | 39 + .../src/netignite/ServerUrl.cpp | 110 + lib/netignite_core/src/netignite/ServerUrl.h | 33 + partitions.csv | 10 + platformio.ini | 63 +- scripts/check_size.py | 36 + scripts/collect_release.py | 91 + scripts/generate_signing_key.sh | 15 + scripts/version.py | 42 + src/Config.h | 63 + src/agent/AgentClient.cpp | 195 + src/agent/AgentClient.h | 49 + src/agent/Enrollment.cpp | 102 + src/agent/Enrollment.h | 31 + src/agent/StatusWorker.cpp | 51 + src/agent/StatusWorker.h | 37 + src/agent/agent.h | 122 - src/agent/cmd_registry.h | 49 - src/agent/commands/get_status.h | 53 - src/agent/commands/heartbeat.h | 16 - src/agent/commands/wakeup.h | 34 - src/agent/message.h | 66 - src/config/config.sample.h | 23 - src/core/CaBundle.cpp | 17 + src/core/CaBundle.h | 15 + src/core/DeviceInfo.cpp | 73 + src/core/DeviceInfo.h | 22 + src/core/Log.cpp | 92 + src/core/Log.h | 44 + src/core/Settings.cpp | 153 + src/core/Settings.h | 52 + src/main.cpp | 203 +- src/net/Probes.cpp | 255 + src/net/Probes.h | 26 + src/net/TimeSync.cpp | 17 + src/net/TimeSync.h | 14 + src/net/WakeSender.cpp | 66 + src/net/WakeSender.h | 15 + src/net/WifiLink.cpp | 174 + src/net/WifiLink.h | 55 + src/serial/SerialConsole.cpp | 376 + src/serial/SerialConsole.h | 55 + src/utils/icmp.h | 128 - src/utils/inputValidation.h | 53 - src/utils/logger.h | 76 - src/utils/regexp.h | 25 - src/utils/utils.h | 94 - src/utils/wlan.h | 107 - src/utils/wol.h | 30 - test/emulator/.gitignore | 1 + test/emulator/README.md | 20 + test/emulator/bun.lock | 33 + test/emulator/improv-test.ts | 193 + test/emulator/package.json | 11 + test/test_core/test_core.cpp | 410 ++ 106 files changed, 4274 insertions(+), 9382 deletions(-) create mode 100644 .github/workflows/firmware.yml create mode 100644 README.md delete mode 100644 include/README delete mode 100644 installer/.editorconfig delete mode 100644 installer/.eslintignore delete mode 100644 installer/.gitignore delete mode 100644 installer/.npmrc delete mode 100644 installer/.vscode/extensions.json delete mode 100644 installer/.vscode/launch.json delete mode 100644 installer/.vscode/settings.json delete mode 100644 installer/README.md delete mode 100644 installer/build/electron-vite-vue-ts.png delete mode 100644 installer/build/entitlements.mac.plist delete mode 100644 installer/build/icon.icns delete mode 100644 installer/build/icon.ico delete mode 100644 installer/build/icon.png delete mode 100644 installer/bun.lock delete mode 100644 installer/electron-builder.yml delete mode 100644 installer/electron.vite.config.ts delete mode 100644 installer/package-lock.json delete mode 100644 installer/package.json delete mode 100644 installer/resources/icon.png delete mode 100644 installer/src/main/index.ts delete mode 100644 installer/src/preload/index.d.ts delete mode 100644 installer/src/preload/index.ts delete mode 100644 installer/src/renderer/index.html delete mode 100644 installer/src/renderer/src/App.vue delete mode 100644 installer/src/renderer/src/assets/base.css delete mode 100644 installer/src/renderer/src/assets/main.css delete mode 100644 installer/src/renderer/src/env.d.ts delete mode 100644 installer/src/renderer/src/main.ts delete mode 100644 installer/tsconfig.json delete mode 100644 installer/tsconfig.node.json delete mode 100644 installer/tsconfig.web.json delete mode 100644 lib/README create mode 100644 lib/netignite_core/library.json create mode 100644 lib/netignite_core/src/netignite/CommandLine.cpp create mode 100644 lib/netignite_core/src/netignite/CommandLine.h create mode 100644 lib/netignite_core/src/netignite/Hex.cpp create mode 100644 lib/netignite_core/src/netignite/Hex.h create mode 100644 lib/netignite_core/src/netignite/Improv.cpp create mode 100644 lib/netignite_core/src/netignite/Improv.h create mode 100644 lib/netignite_core/src/netignite/Mac.cpp create mode 100644 lib/netignite_core/src/netignite/Mac.h create mode 100644 lib/netignite_core/src/netignite/MagicPacket.cpp create mode 100644 lib/netignite_core/src/netignite/MagicPacket.h create mode 100644 lib/netignite_core/src/netignite/Protocol.cpp create mode 100644 lib/netignite_core/src/netignite/Protocol.h create mode 100644 lib/netignite_core/src/netignite/SerialDemux.cpp create mode 100644 lib/netignite_core/src/netignite/SerialDemux.h create mode 100644 lib/netignite_core/src/netignite/ServerUrl.cpp create mode 100644 lib/netignite_core/src/netignite/ServerUrl.h create mode 100644 partitions.csv create mode 100644 scripts/check_size.py create mode 100644 scripts/collect_release.py create mode 100644 scripts/generate_signing_key.sh create mode 100644 scripts/version.py create mode 100644 src/Config.h create mode 100644 src/agent/AgentClient.cpp create mode 100644 src/agent/AgentClient.h create mode 100644 src/agent/Enrollment.cpp create mode 100644 src/agent/Enrollment.h create mode 100644 src/agent/StatusWorker.cpp create mode 100644 src/agent/StatusWorker.h delete mode 100644 src/agent/agent.h delete mode 100644 src/agent/cmd_registry.h delete mode 100644 src/agent/commands/get_status.h delete mode 100644 src/agent/commands/heartbeat.h delete mode 100644 src/agent/commands/wakeup.h delete mode 100644 src/agent/message.h delete mode 100644 src/config/config.sample.h create mode 100644 src/core/CaBundle.cpp create mode 100644 src/core/CaBundle.h create mode 100644 src/core/DeviceInfo.cpp create mode 100644 src/core/DeviceInfo.h create mode 100644 src/core/Log.cpp create mode 100644 src/core/Log.h create mode 100644 src/core/Settings.cpp create mode 100644 src/core/Settings.h create mode 100644 src/net/Probes.cpp create mode 100644 src/net/Probes.h create mode 100644 src/net/TimeSync.cpp create mode 100644 src/net/TimeSync.h create mode 100644 src/net/WakeSender.cpp create mode 100644 src/net/WakeSender.h create mode 100644 src/net/WifiLink.cpp create mode 100644 src/net/WifiLink.h create mode 100644 src/serial/SerialConsole.cpp create mode 100644 src/serial/SerialConsole.h delete mode 100644 src/utils/icmp.h delete mode 100644 src/utils/inputValidation.h delete mode 100644 src/utils/logger.h delete mode 100644 src/utils/regexp.h delete mode 100644 src/utils/utils.h delete mode 100644 src/utils/wlan.h delete mode 100644 src/utils/wol.h create mode 100644 test/emulator/.gitignore create mode 100644 test/emulator/README.md create mode 100644 test/emulator/bun.lock create mode 100644 test/emulator/improv-test.ts create mode 100644 test/emulator/package.json create mode 100644 test/test_core/test_core.cpp diff --git a/.github/workflows/firmware.yml b/.github/workflows/firmware.yml new file mode 100644 index 0000000..6187ff7 --- /dev/null +++ b/.github/workflows/firmware.yml @@ -0,0 +1,128 @@ +# Unit tests and firmware builds on every push and pull request. A tag `v` (e.g. v2.0.0) +# additionally publishes a GitHub release with the flash images and release.json, which the +# NetIgnite server reads for its web installer and OTA updates. +# +# Optional repository secret FIRMWARE_SIGNING_KEY: a PEM ECDSA P-256 private key +# (scripts/generate_signing_key.sh). With it, releases include firmware.sig. + +name: Firmware + +on: + push: + branches: ["**"] + tags: ["v*"] + pull_request: + workflow_dispatch: + +env: + PLATFORMIO_VERSION: "6.2.0" + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - run: pip install "platformio==${PLATFORMIO_VERSION}" + - run: pio test -e native + + build: + needs: test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # git describe for the version + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - uses: actions/cache@v4 + with: + path: ~/.platformio + key: platformio-${{ runner.os }}-${{ hashFiles('platformio.ini') }} + - run: pip install "platformio==${PLATFORMIO_VERSION}" + + - name: Version + run: | + if [[ "$GITHUB_REF" == refs/tags/v* ]]; then + echo "NETIGNITE_FW_VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_ENV" + fi + + - run: pio run -e esp32dev -e esp32dev-qemu + - run: python scripts/check_size.py + + - name: Sign + if: startsWith(github.ref, 'refs/tags/v') + env: + FIRMWARE_SIGNING_KEY: ${{ secrets.FIRMWARE_SIGNING_KEY }} + run: | + if [ -n "$FIRMWARE_SIGNING_KEY" ]; then + printf '%s' "$FIRMWARE_SIGNING_KEY" > signing-key.pem + openssl dgst -sha256 -sign signing-key.pem -out firmware.sig .pio/build/esp32dev/firmware.bin + rm signing-key.pem + echo "SIGNATURE_ARG=--signature firmware.sig" >> "$GITHUB_ENV" + else + echo "::warning::FIRMWARE_SIGNING_KEY isn't set; the release is unsigned." + fi + + - name: Collect + run: | + python scripts/collect_release.py "${NETIGNITE_FW_VERSION:-dev}" release ${SIGNATURE_ARG:-} + cp .pio/build/esp32dev/firmware.factory.bin release/firmware-factory.bin + + - uses: actions/upload-artifact@v4 + with: + name: firmware + path: release/ + retention-days: 14 + + - uses: actions/upload-artifact@v4 + with: + name: firmware-qemu + path: .pio/build/esp32dev-qemu/firmware.factory.bin + retention-days: 3 + + # Boots the firmware in Espressif's QEMU and tests Improv and the console (test/emulator). + emulator: + needs: build + runs-on: ubuntu-latest + env: + QEMU_URL: https://github.com/espressif/qemu/releases/download/esp-develop-9.2.2-20260417/qemu-xtensa-softmmu-esp_develop_9.2.2_20260417-x86_64-linux-gnu.tar.xz + QEMU_SHA256: 0eecb2a34a5586c0e59110f77b9343b7b336e82fdb0e1a30e1dc1bab8a547e35 + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: firmware-qemu + path: qemu-firmware + - uses: oven-sh/setup-bun@v2 + - name: QEMU + run: | + sudo apt-get update && sudo apt-get install -y libsdl2-2.0-0 libslirp0 + curl -sSL -o qemu.tar.xz "$QEMU_URL" + echo "$QEMU_SHA256 qemu.tar.xz" | sha256sum -c - + tar -xf qemu.tar.xz + - working-directory: test/emulator + run: | + bun install --frozen-lockfile + bun improv-test.ts "$GITHUB_WORKSPACE/qemu/bin/qemu-system-xtensa" "$GITHUB_WORKSPACE/qemu-firmware/firmware.factory.bin" "$RUNNER_TEMP" + + # Tags only, after the unit, build and emulator checks passed. + release: + if: startsWith(github.ref, 'refs/tags/v') + needs: [build, emulator] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@v4 + with: + name: firmware + path: release + - uses: softprops/action-gh-release@v2 + with: + files: release/* + prerelease: ${{ contains(github.ref_name, '-') }} + generate_release_notes: true diff --git a/.gitignore b/.gitignore index d9ec109..286ab37 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,18 @@ .vscode/launch.json .vscode/ipch -src/config/* -!src/config/*sample* +# Generated at build time by data/cert/run_gen_script.py +*x509_crt_bundle.bin +# Release output (scripts/collect_release.py) +release/ + +# Never commit signing keys or other secrets +*signing-key*.pem *secret* -!*secrets.hpp.template -*x509_crt_bundle.bin \ No newline at end of file + +# Local leftovers of the v1 Electron installer (removed in v2; replaced by the web installer) +/installer/ + +# v1 configuration (compiled-in Wi-Fi password and agent secret). v2 keeps settings in NVS. +src/config/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..7dbdb0d --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# NetIgnite ESP32 Agent + +Firmware that turns an ESP32 into a [NetIgnite](https://netignite.dev) agent: it joins your Wi-Fi, +keeps a connection to your NetIgnite server, sends Wake-on-LAN packets and checks whether devices +in its network are online. + +> **v2 (in development).** Works with NetIgnite server v2. Configuration no longer lives in +> `config.h`: the agent is set up over the serial port (and, soon, from the browser). + +## Hardware + +- A classic ESP32 board (PlatformIO `esp32dev`, 4 MB flash). +- 2.4 GHz Wi-Fi (WPA/WPA2/WPA3-Personal). +- In the same network (subnet) as the devices it wakes: Wake-on-LAN broadcasts don't cross routers. + +## Set up an agent + +1. In the NetIgnite dashboard: **Agents → Add agent → ESP32**. +2. Flash the firmware (see [Build and flash](#build-and-flash)) and open the serial console + (115200 baud, e.g. `pio device monitor`). +3. Connect to Wi-Fi: + ```text + wifi "My Network" "my password" + ``` +4. On the agent's page in the dashboard, click **Create setup command** and paste it: + ```text + setup https://app.netignite.dev netignite_enroll_… + ``` + +The agent enrolls once with that single-use token. It generates its own secret with the hardware +random number generator; the server only stores a hash of it, and it is never shown or printed. + +The web installer will do steps 2–4 from the browser: it writes the server URL and a token into +the agent's NVS partition while flashing, and sends the Wi-Fi settings with +[Improv Wi-Fi](https://www.improv-wifi.com/serial/), which the firmware already supports. + +## Console commands + +| Command | | +| --- | --- | +| `status` | Firmware, network, server and connection state | +| `setup ` | Connect to a NetIgnite server | +| `wifi [password]` | Connect to a network; kept only if the connection works (quote names with spaces) | +| `server ` | Change the server address | +| `enroll ` | Set the agent up again with a new token | +| `ip dhcp` / `ip static [dns1] [dns2]` | IPv4 configuration (DHCP is the default) | +| `name ` | Host name | +| `log ` | Log level | +| `reboot` | Restart | +| `factory-reset confirm` | Erase Wi-Fi, server and credentials | + +## What the agent does + +It connects to `/ws/agent` with a WebSocket (`wss://` for `https://` servers) and speaks +NetIgnite protocol v2 (JSON frames; see `lib/netignite_core/src/netignite/Protocol.h`): + +- `WAKE`: sends the magic packet 3 times to the subnet broadcast address and `255.255.255.255`. +- `STATUS`: pings the device (IPv4, IPv6, or the IPv6 link-local address derived from its MAC + address) and/or tries a TCP port. A refused TCP connection also counts as online. Host names + resolve to IPv4 and IPv6 addresses. +- `PING`: keep-alive. Without any message from the server for 100 s, the agent reconnects. + +HTTPS servers need a certificate from a public CA. For a private CA, put its certificate (`.pem` +or `.der`) into `data/cert/custom/` before building. + +## Build and flash + +Requires [PlatformIO](https://platformio.org) Core **6.2 or newer** (`pio upgrade`). The build +uses [pioarduino](https://github.com/pioarduino/platform-espressif32) (Arduino-ESP32 3.3, +ESP-IDF 5.5), pinned in `platformio.ini`. + +```bash +pio run -e esp32dev # build +pio run -e esp32dev -t upload # flash over USB +pio device monitor # serial console +``` + +The partition table (`partitions.csv`) has two 1.875 MB app slots for over-the-air updates. If the +board ran v1 firmware, flash v2 once over USB. + +## Tests + +```bash +pio test -e native # parsers and encoders, on your computer (needs gcc) +python scripts/check_size.py # the firmware must stay below 85 % of an OTA slot +``` + +`test/emulator/` boots the firmware in Espressif's QEMU and tests Improv and the console with the +same client ESP Web Tools uses. QEMU has no Wi-Fi, so networking needs a real board. + +## Releases + +Pushing a tag `v` runs `.github/workflows/firmware.yml`: unit tests, build, size check and +emulator test, then a GitHub release with `bootloader.bin`, `partitions.bin`, `boot_app0.bin`, +`firmware.bin`, a merged `firmware-factory.bin` (flash at `0x0`) and `release.json`, which +describes the parts for the NetIgnite server's web installer. + +Releases are signed when the repository secret `FIRMWARE_SIGNING_KEY` is set; create the key pair +with `sh scripts/generate_signing_key.sh` and commit only the public key. + +## License + +[AGPL-3.0](LICENSE) diff --git a/data/cert/run_gen_script.py b/data/cert/run_gen_script.py index 175c9c4..0047b8b 100644 --- a/data/cert/run_gen_script.py +++ b/data/cert/run_gen_script.py @@ -10,11 +10,14 @@ import os import shutil import subprocess +import sys import tempfile Import("env") # noqa: F821 - provided by PlatformIO (SCons) -PYTHON = env.subst("$PYTHONEXE") # noqa: F821 +# The interpreter running this script: the cryptography check below and the generator must use the +# same one (pioarduino runs the build in its own environment, separate from $PYTHONEXE). +PYTHON = sys.executable CERT_DIR = os.path.join(env.subst("$PROJECT_DIR"), "data", "cert") # noqa: F821 CUSTOM_DIR = os.path.join(CERT_DIR, "custom") BUNDLE_PATH = os.path.join(CERT_DIR, "x509_crt_bundle.bin") @@ -49,7 +52,8 @@ def generate_bundle(): subprocess.check_call( [PYTHON, os.path.join(CERT_DIR, "gen_crt_bundle.py"), "--quiet", "--input", *certificate_inputs()], cwd=work_dir, - env=dict(os.environ, PYTHONWARNINGS="ignore"), + # The same import path as this process (pioarduino adds its own packages to it). + env=dict(os.environ, PYTHONWARNINGS="ignore", PYTHONPATH=os.pathsep.join(p for p in sys.path if p)), ) with open(os.path.join(work_dir, "x509_crt_bundle"), "rb") as f: bundle = f.read() diff --git a/include/README b/include/README deleted file mode 100644 index 49819c0..0000000 --- a/include/README +++ /dev/null @@ -1,37 +0,0 @@ - -This directory is intended for project header files. - -A header file is a file containing C declarations and macro definitions -to be shared between several project source files. You request the use of a -header file in your project source file (C, C++, etc) located in `src` folder -by including it, with the C preprocessing directive `#include'. - -```src/main.c - -#include "header.h" - -int main (void) -{ - ... -} -``` - -Including a header file produces the same results as copying the header file -into each source file that needs it. Such copying would be time-consuming -and error-prone. With a header file, the related declarations appear -in only one place. If they need to be changed, they can be changed in one -place, and programs that include the header file will automatically use the -new version when next recompiled. The header file eliminates the labor of -finding and changing all the copies as well as the risk that a failure to -find one copy will result in inconsistencies within a program. - -In C, the convention is to give header files names that end with `.h'. - -Read more about using header files in official GCC documentation: - -* Include Syntax -* Include Operation -* Once-Only Headers -* Computed Includes - -https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/installer/.editorconfig b/installer/.editorconfig deleted file mode 100644 index 3dce414..0000000 --- a/installer/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true \ No newline at end of file diff --git a/installer/.eslintignore b/installer/.eslintignore deleted file mode 100644 index a6f34fe..0000000 --- a/installer/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -dist -out -.gitignore diff --git a/installer/.gitignore b/installer/.gitignore deleted file mode 100644 index 42bd71b..0000000 --- a/installer/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -dist -out -.DS_Store -*.log* diff --git a/installer/.npmrc b/installer/.npmrc deleted file mode 100644 index 2ced952..0000000 --- a/installer/.npmrc +++ /dev/null @@ -1,3 +0,0 @@ -electron_mirror=https://npmmirror.com/mirrors/electron/ -electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/ -shamefully-hoist=true diff --git a/installer/.vscode/extensions.json b/installer/.vscode/extensions.json deleted file mode 100644 index 940260d..0000000 --- a/installer/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["dbaeumer.vscode-eslint"] -} diff --git a/installer/.vscode/launch.json b/installer/.vscode/launch.json deleted file mode 100644 index e3ae63f..0000000 --- a/installer/.vscode/launch.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Debug Main Process", - "type": "node", - "request": "launch", - "cwd": "${workspaceRoot}", - "runtimeExecutable": "${workspaceRoot}/in/node_modules/.bin/electron-vite", - "windows": { - "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd" - }, - "runtimeArgs": ["--sourcemap"], - "env": { - "REMOTE_DEBUGGING_PORT": "9222" - } - }, - { - "name": "Debug Renderer Process", - "port": 9222, - "request": "attach", - "type": "chrome", - "webRoot": "${workspaceFolder}/src/renderer", - "timeout": 60000, - "presentation": { - "hidden": true - } - } - ], - "compounds": [ - { - "name": "Debug All", - "configurations": ["Debug Main Process", "Debug Renderer Process"], - "presentation": { - "order": 1 - } - } - ] -} diff --git a/installer/.vscode/settings.json b/installer/.vscode/settings.json deleted file mode 100644 index 8ebbfcf..0000000 --- a/installer/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - } -} diff --git a/installer/README.md b/installer/README.md deleted file mode 100644 index 7a556a5..0000000 --- a/installer/README.md +++ /dev/null @@ -1,76 +0,0 @@ -

electron-app

- -

An Electron application with Vue3 and TypeScript

- -

-electron-version -electron-vite-version -electron-builder-version -vite-version -vue-version -typescript-version -

- -

- -

- -## Features - -- 💡 Optimize asset handling -- 🚀 Fast HMR for renderer processes -- 🔥 Hot reloading for main process and preload scripts -- 🔌 Easy to debug -- 🔒 Compile to v8 bytecode to protect source code - -## Getting Started - -Read [documentation](https://electron-vite.org/) for more details. - -- [Configuring](https://electron-vite.org/config/) -- [Development](https://electron-vite.org/guide/dev.html) -- [Asset Handling](https://electron-vite.org/guide/assets.html) -- [HMR](https://electron-vite.org/guide/hmr.html) & [Hot Reloading](https://electron-vite.org/guide/hot-reloading.html) -- [Debugging](https://electron-vite.org/guide/debugging.html) -- [Source code protection](https://electron-vite.org/guide/source-code-protection.html) -- [Distribution](https://electron-vite.org/guide/distribution.html) -- [Troubleshooting](https://electron-vite.org/guide/troubleshooting.html) - -You can also use the [create-electron](https://github.com/alex8088/quick-start/tree/master/packages/create-electron) tool to scaffold your project for other frameworks (e.g. `React`, `Svelte` or `Solid`). - -## Recommended IDE Setup - -- [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) - -## Project Setup - -### Install - -```bash -$ npm install -``` - -### Development - -```bash -$ npm run dev -``` - -### Build - -```bash -# For windows -$ npm run build:win - -# For macOS -$ npm run build:mac - -# For Linux -$ npm run build:linux -``` - -## Examples - -- [electron-vite-bytecode-example](https://github.com/alex8088/electron-vite-bytecode-example), source code protection -- [electron-vite-decorator-example](https://github.com/alex8088/electron-vite-decorator-example), typescipt decorator -- [electron-vite-worker-example](https://github.com/alex8088/electron-vite-worker-example), worker and fork diff --git a/installer/build/electron-vite-vue-ts.png b/installer/build/electron-vite-vue-ts.png deleted file mode 100644 index a4de4297bb3bb496448be5fa69f680d56f8e05ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 625554 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

) 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

hH3>)X3(4 z*1h;$U-(Rcxrf*tl2=Zz5>O@|D?|zWv(}c#PlVI+?4ckp29xr6`s?< zJ8R#(6#^3Rmvd`$W-M&sgc6al_=$v~VfpGchQ}g1fb)L>IA4=pwX@l5A+HRLC*wc4 zCS0Q_{Db<;lPN1})n&bVZaUY*VP6>f*n|9Bq`}{E(&tl12wkNjnXirKK|CR>EKb=s z2JY7H8QS*P6ovVqjkiXD1<9?3P0?UQ__44B)s2FMXsIxC*BvM&?nT&`GFC$blV)!d zP@Ljea6FfibiSQWU0PFB{$X*ex^O=b$`zjzHgJ$TXS`Dw8K(zh`wmo!w|yK@x1o$q z0RX!2Dj$c%UU5(eAx|D*>iq#v#bSZw`5yMyU%*4fn`u23j1{l)i2XL#>pgAFm(i8b z#$biSLAd&8s6XPmp`c&OPk!E~!yawt$TsD7Sfc%EB}ST{?l;ldMw(B75g}$j?~*&i zU)#C2H};=(%T|>d{}Qw{FBh{@mOFU}&2|T5pIPB}f=8c@MI?g!! zK30RP4$)=ZHa=+y+MT>lAAc3hI&`Uuz!IKaWnZns`0Sac`i;rG_`%61Y1lV>m%{rz zpyg``Rbx4FZ#VJr{YU>B)%^X*>@=H%Jhk!s%&ZKjsQt++Ini9t5>ooojL~tt0P^e2 zt+!jrl=9_Vb@(?3JxLO&juCX8qtaxqB|dOioHO0TwTh8{f86u|`&N=VcBrk5%z^eU zF-ut3*t{OLM;*dAq3}gsI2Am)IGnfP+;=J_$(`pVoSh)wb-$K(nrwe6@yPVW=Ew<@ z`jv5QJ!#xFY#dIB!JH9CLZAD)-_8PDzls zezFCZM@ks0LByLzPE9RGBQ{ECa}dT5 zsB`5uW~;>W2Ao!bBK3~e>{cKuwQF~g9k2x+*{_m@J!)0V?hm5l@hjsI<6e+0c_dsX zXp^z&75zHwfAWlfN4WkYU%uiR0w}QYJO@E(cJ*#o-0BhAoKaP;h(17i&pB6T|0Qg6 zXmeyyqHZ*DX@TGSK1Mi1i6CK$>K(+Y#Xc5l=Jv zg(PYopf~;d=3sx@#~zE&wq;a`SekueIVv#pkN~}`3r302ULIL8MNo*;g{P8Z1J2@G zbIlbe7l$LL4O`uN$-QF_6=G;5(u-|M9&Wgx&g@ILH)Q8y4obG;HBu;gusbj7u`hYr z$8jF~(|^ak17BAu`q#r*+cS4Ha0%jcp zTz#&0D!Vu7JjM!~fVs$2k0xnCF%5kE*Ah2{InP=o3S86=tUgZGB_&FGUF;|g<29mQ z8K5+mLiqp8k{89oLmTC8tW|Y5M7Q4H1bXM*G!+9 z5kFfiV8S)NI1TDm-g%Gv0HF-b$ek6JkNyn04l9m+qC}CIbCq1}%+PaxEW3QR-1#to zw4Lhw;``{kRExm?rE=$^^~c^piD_(xVas-T#Oh?N=b!NLXgBrH1Wso|;#*^T)Pp$H zgPK~frfuf85nQI@nenbJ!SIeNm(NyMEMxC?M(eE#F2C|ymFbpp4IRT~1hN~`^ZxXk zo|4zM3I^1_kims{#0z@bq25i{FgZRtD%bxYlTlBT?zFvx5bw^y*^PO&eWB&p-T)hh zXR^-?$obk`0?pe-skOFCZDle>`!KF4cJ^(RPkF|BtB{^8WCdsmY27g7q5 z4;AA6#vw}LTuZ=-{nj#^u4W8b zx0vJ|ntMKyi~fWdD^MoO>G?4hJE(I`h}*=?_;tLopRcIo!b95Zh#d9sSs3y@G}>@qG^TR){OJq3`VYJTBM3DT-*2rM3{ODI$`M_@G) zoi7wV(5p6TTr~Po?p&XtB@ox)l}^dx{}?evT~2twn6Pf6N{&-0Plcn+EHHxHOrrvs z#ql7r*C*P}0@>7yjdZ5z+X3v3qA^%|H1RbV_WEp0qH$*1Sd~usW4Nq82SR8L40u9a zY?Dz)-n|!EDlHPAjzYgCH@L2S3A*lZYB6{)RNwNMrB9Ak$>3znXrLUpcCB}GCY-UE9ryR(00`)4BXb1hffB(V3*8-8K z0TDwku<#>m9cQKBHnZQ!YwOVEL2^UV)*+fTGYiCc*HN<38h1*L*rhAH9-X`v1dkqF zW@*aRmMJvN#vN$e?5!gWEp)U;;t-=DZ(l?IkzIYC|A>FbiZh-U^=gRWUlVc?_pqG0 z<8Aj->-$^BxXaoPEZW6LpPNmsP7Z8$*{%w%P;TJ}(^p{ouUXJHTNQE65_aAS4C}L)texAe1)gpbJ^=C@a9CMwewcjBxPcKS~F4a9gKJi7>BO;8KZ zHbO(e@vZd}c5Sl7Z=nrB@+zwyRV1nwe?x%y$`_h{HyDp><=v3tm}1X!J9+PNoW=WF zEIJiY#Wh2^-ykz2opkm*{6U$5XX-EZSa(L+DJvh@AougVqofY^6UUkY8m;~ovQzaB> zuz(VYlw7IA1WT~kP5tRohi^JACjW@lF|IvXwv3piSuFkFRF63KF5ml31N&uru*zkP z5L*@HrT)Y|IK@~=9AFdM?X?`UZg7a+(?2w%y)S6W?7^O1DL3fxnh{P+`%XC1ZgOEt zYh>Lv%(a1xMhba#R$gKXOMNIIecs_l2r(*WqxCNg+?Y_`&r$KCVDI3fdc0`w=YtEg z&X2vjsE46C3OGqqWYFTCq08|yXq(%+i=DWdw2=kL1SB*jNUqw)jGm*sFK(eje4@AD z8cK@6y`O^Wwu@6p?CeRjiFg;0*?5@PRrgW%l=K{9#F#`qpH;S;9mg0?-_iB3@%YB? zViyj-^oyp6OLG>|^u+8=@?+6Y;C{^D;_Su~MfJ`f14500!519ApUfex4u1;rK5t-w zcmCyR-C5xcj14iAB@!XRx3;Ab=s~2HB!_EPTPap)e8d1Q@8ptH&v)*uMZ5CY#U?kC zihpr)SKi5T&pPNfdK%p$@9mh|=_2OOtZAi41(JVn23hpUL zRLt1ym03p4K!o^G1Z6}v=&)Z@pY7NQ6r4annwEQ*vl|gc zrQdluf9yBl7hRu0dHC11?HSPi42ZSu2`8WRH%i&o>}RkkxLH0z343@lg3Cg&*;Wl} zcPLV=8+AiHG8=#<8QW4Gw)p44O!qR|*nOmt?#F<~O4E(M(|0z9Ii28#@d`Fw%r%04uf1ji4YI1Ab>UyBLC_;_t6*=XR4uKz2p-GZ6I+X|`MRSE5ryYNPG z6f$?p&6t>Hq@~kg=8MW1X6oh~*V9^W=A+ktW2%fZ)gTTQi9z+r%zKa;R#E%VFMrDw z(XQXc{|C<0Wb@@8r=VI6YefS0lgP8jsg}S+EAJ-A6?j|o;%SOyfrZtL{XW&S80P_< zL_OciSQJxdNVO#c)tXCpq``kmvQ7#iO@qzOn7qq z@h_(r!abMK+sRGxpQP)wa{(jNg@=b>TF=CF=p@;rKN$jqek@NDHgi$Z0;Ia+>M)=i zx!-1_8wtk+k#Uf9?`>G;$}g_7ok8T{fyv-~74$8T=x5SZtLhF7(8 z?@kwZ#g41(XhQ|ln>_<980>3ecW-pZs}X-AtyZtX|`OZE+>qExNLFC zqd48OXrY$LLu;rLhREJ`7Y9{SY!w^72|;)#CJFJhvs&vGCiGc{$Cpyx2x|*w;=YCD z?%%%u_`>mjfBkHkQp_H`#13Sp{*`=Xo;qLL4mDnM+3G+w3{}X5itud^eq9r2cfIzT z7^Jws%s}i`*M?Yx^`_$vwU0=NR_k&eeS99P_oH&}YX%N<0|=oP?|~JX{z2@B9sR?- zHT;Sgj0WFc;8c>c$Pygic(uG3-58aZ-||vhjvKPwS*k5!hy7{yv;X(JVb!59K6v~! zi3Yu%arMN_@>b9y!;9#i9J012~SkQ&s| zqZl5L z;SdKSTL?V()Ph75$@BVUqr3l}PN+QMwkEt7+SQ}dGYeF3IVJrT23y}R z(Hl@qXL2n_3jzp?`iu7LtIkPrSR$1b4Prg^7V%2|cqQ8tvA$RE^Wht)?_8%i6AZye}8vJO*du#LNeP9amTB^uH8A|KglAeuCmp#Eb^kuLEWE_lhc

WD04_%%!g2?Ih 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%0D8e|Zx~K=z+5VfV&8(aB!K*< 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 Jj^oE3Y{FF?*EWe4@XGl?3HLn`7Vx zFJ{tv9AVQ#Ol5&kYcTKN&n=7^CHYm~b-&H%o3f>r-0hDpXh~~r8*UE&Kacki%v_Wj z-H^27$bgA@a60ROx1Kg~y2#@VgqceyKkn#NL;^W$0ejL(wOqr7Hw66T4$a-RdHT`| zhb}f~ZB}wonpqPrA-Cxxb`Vk0ZKIzXd&K!|1pr7LzC)E_*DW;IP(d+EB~C`_?By&s zPbA>G@x^yfs+DxtH}H7Fql$gJ+(C!B?@Ei<(6J=#vWeagqx%d*LLd3K`6_tA6UVmZ zMeR010dIyi^%n`D($~3fOUpbma<0(S1zEv6-fJ={Po8ejEc&o>RGa_BpkVz9z7wmo zEH%~9ahcV4`ZT$#dJb*9OVK3`xg(?rjIT<&ffTC%uvHC{4-4%8X!W5+sy?@f zCFfItt=&z z_GX)ezYr37s~n9UqwkpvgI)RT=IL3*pJND7oSRXA6l)$I1&j8*+0$$#T4YTZj-C1F z-qBDdJ!Zo4E7tQw>{m9Z$r67ID9Moi&p_^1^Sp$`5pmk7V7)ikCq_6QJ6pY~iX8jG zinNsv+8U*nj2yy7#TmjLlIGtN3mZc~Rhg{LU&Ur|me;i;1TCNB6+Qa82nw1q>!ZuO z|LXoN2!938;>QDTjuDxrphpH{)Hpk zvc>0vT1h-=xUfpQU+ykIr2)&dHroQxdpnS@_O$e;S{fI`zaNH~Nomo5Ej4)OCXAA2N9bH3><7Cy7$yRS<2SCqT4 zHUIHt%Xe=`p-z>F_DE=m^OMr*S^kk2`_Ip8ZG1Cz#c3Q6y4mx}HajVFA^o2*a|yiMmt zw*>Z+2PO;=@DUw}U$eD}K5dH-0x`L(+fn%B==oB@Ry4X=OmLjodO6YjQ2(eh=WQ`T zFbg9}uYe~>ks`}}Rt9G#L3a9XHk#EPQnUe0Xl!Zm?OmXKy?d8`vZS{-*mmWOag9|hcI;u_I z8NHbKYfIus2fOBh%BqR%#PNj3k>+E4hY?w_u7sgl=-DB&eZ!!K_q3f!lUcyJiKoG? z?AnC$m98v1oUc7j8&#J`wxQEy-+aw}S^7&z^lJ!;@;L#=ZuLl`XVz2lx@_!Nr%ERd z<3gghV}NmMjWhc`Z5d?V+V8!bZPq7G8rHmb1beK6lfye-}-En)olX zNP@Un=tf?jy)OC7@9O#F-9*BkIN9C}9+nxdf`t^(^V%}`A)G5`>2)AKjb^Nu07u`R zMK2`b_Br!MXpv)zo4)a|)4szq*MwN0{1HsygBu9vG4GY2!uSW?>}gWLIB>HSrdfq& z78kRjAAnphT&-NSQ1($Eozi-_)W9wRZ!(Q^I<`64-lO(@$8`JT#4Qg0s=@_nCD@@+5j9W4yu)=P&K0k7m{TYPHM9_?=c}QVc4O%vF>EX_+(%J`2 z+gN3h*45M4bGChh+AC~%;hC*-;;Er_wUmiSMa9hiJLEb*I| zV4|^6x^F(t39&Kh^qZ5QuG6vcJM!AKJ(e47?|`lr|MU70kb#}i(T1_iy-0)|Rqk2= zWIaD|@W^Onrukcj;-Z(UW0r?XgJEx*rmY4Z=rlG)J^f9V+cG6qTpXKC?VT#!B;(`n zo>iOx%QIxhJ-mjE*WrrUg}r_6l-OR1bdgV0tLVh>4t?@c<~e+4?jk8p&M0K#;I}V) z$OYGW1KUTePKe@6Wfl`_U77tMVt%L#MrEo*)k(Ke%v}H#VucLSocC-%xwHZ7s);)b z?LYaTY}{81JFuQlua&_Bp!^-uarb)C7=G-L#cKR(H?CZt0V8=|U41NVxC<#pWEyHd z5`0O2ZYOt;gI6G*Bz#QsZFn|*PaEOeSv{%*%O}^Onk;}7<)PE>#-DrS#n74v)vIOz zQwhRLUVrdt{Jr$Svlcf$7^NkvHC10M+cT->-7javp%z|$Fir_=G(%}LHsa&iuXS z!6?0KAYS;^+~f^Ja&7I4`S;-_+Q3Z>_;FL+t)?O+;fz6<$_kNHaVd)~$Wi+3^Sb-5 zr4}(2H?kbNE{TM85gF+-`5~=1twXG>SZf>Gh>Tsc@gVAQgWlJZvVoS&;6WBD&v-sO zJ&P6wMc3tunWDd)QGY^Rj;HP#P`w4789)#kK()&o?U3y1H<<#PsM?j&(_StEs{ij5qJ$3b! zQVWL*l5d})rAC6+TsL>{bPG_)b36p8Q!VO7xHhUKuDb_)r5AWx+Fy$75bd8g8Fw-t z7EoE7;}N?B+SN{q2ody-!igh-8f{@L)NiQsQd$7ZTMO}abSWII^RBTnz!}TD!<0&bdw1QzCb4y`39aQ^Cks`4j9@Lg^TUes( z4}>x!_?!mNEI?nx%Ft|l6I{>&y0ffEc>qk#LSIVku!=_G82Q8-R0fKp4P{>@zdNG8 zE-kC(i5rB~!|v%#(8dQ3E9K9O>~W?YyiEIL?VVj1i#F|2ihFjt6N)M8e92>Bfdm(N z^+)*x!ux|z)7csJKslP^z8<)opuk-<6@lt?qzUVwX4Isa=n9^l3kxF7#!JtXp#*eM z6@)xszICV@PZ+2%3rLPteFuo%QrzW1=OCf>?zEQ;txb*RjJFP_Qu+D4u$VFA%A095 z8Gg$ZOfACJJp%vZYF>-TM7KpMI~?`Y7bNcU>|c%yU2jPb0GbBLK=UBw!-LdI%YC$8 znADYO=)M^rbD&wG*YHlM^gDhvLgqV}$gBJC!}q&#gz&E*l#eak6T?mWIN^QE@8+kt zI`qLHZ>p`9U=E#}8wUHf=O47JD$wf>&43Y8M(jr;Vo#_fsMHKgbGK5tBb2GtN!gIH zE8r13zb(!#ogL3D20ILIyk|34XJs3}+lCBc^k4xVP5_OL0^?qynQdZNC;@A;n?9ce zn;dECpnUPpn7sBGV6E+Hc$sbGp=GyFSu&~Rq*1ioxL(?F`g)SPy4AK#ro9`a>0gQz zvUAz$%0|cOsl%yXD;!c$(=9L!*E_%hr%5SV!3A6zh4wa-dd1^g36gg6L#y5Qwl{g{ zsfPSjqj+S$DOo27C|4jte|I*ymT`t{UuLkzPx%H70o~|#=MoN_y+j0gODzgyGT>yQ z8=BhHPdM`X>%TS)5+ucdch<}hAKETs1mwc?g|8Tnquq|=!gAS1K&^VMX|M><6#%qG z;vFd|aN_L60T_xEGG0y=^iU-quuU{Op#)r7Z(FstAX$rqJ!C~A#3IbevkgPSR@dfpRybkm4?IrAD88=h_uNXPo@=RN8o&e0bzHS99bT5jv3Mie~ zW_f{#k5e#QRWx1AJl64u7N>q!bCcQ{t#1Xf*@4Vu6^$L~vEMLy@(R0DipIVJQ;J_w z9O}NgsJ{UK1e?Hh1(2eKE0}WG|BIbH#$sC|P%1`~s`cihr@2!-@4^-LgFQg<2eNdq zBuP{wce`k1^07hV!N499vU%Nrnz*myjU!_Sn(L=-u$6W2u4h_*wLy)p3kS{}%zkT5 zESRv$5B>~5NF5pbteugaUh^K5`i(Db+L9cNDe7jrOMP{9v7* z!BTk6X;}n{bk;AgtvJ9>Hvy|!;MmR?L-NW}c?ZNYG!9VW43uUSvtP(RobxKbN|B& zJq348?ArfmWHV;lnajJ~PLl)Dg9w8Y_N~&PR@8(3@lJW4{sv$LGu)T$^V8-8ff5*1ax0(5=T-ACmeChr+@`uzogibfXh8+kzX)HeX;f0ng_=M&}v^XX-} zP6kwlmXN*7fMspuEfsG8N;x=+Y$uHKJzKFGxs z0S>c5)3vusu;QMe*z*Mmn0kyQ zQUVAJ=@(F70tUO0r7OzF*xi8_%!+L4#$?HcDsVmj6x}Za1AzT;5`e_oqk(Gk2O}D_ zU&$yaN1eira9dGcgt(6b0c}N;Ioi&XfOGueb3i4!Y$O-@`-6GWI~;FnE}emJgN04M z%jQ)p_`DD^VS3Eg%d8(1E|vCGtW4;Ms6w3?sWAz-97}@hSh);gou-^^^T(_J&d5IY zuaOMShR>r&Mwl~a6e`s7^mX!t&-L5hWI?AHPt})!bV%M62^m2MMmYP(m8|2LJ2*)x>Zhg}_H+;eCTs)izjyC`Gh@ z!?6!Uc;r{-MYEmfRJafQA1==(?NSi|#Wc}7BP6dy_G+U&Ku%W{3A}zYMGM$noUZ$Y zBESzZDJqSk!tt43)EHbC^3q>`D_uXg(w{1OF_aez`v#x=JE^4Hmnd*i;%!YJPK6>}z4Ck}zE@9+GZRiJ!W&H{Y zU{SquO{g(f*LbQ)1@L1dc2GfEYbmtQWX8%XDi~Rpd**i4HFv$bhQ~ppi)&AKMvM)| zWZws1L+fhKY1G2pFIY%d1yN}AuYOtYzH)9!3dG5ynzZAP-MHWtJ3=utCQ{I%L)Cpm zygo3omCBp9AOT4pm@gSB!Q^st1z>h|m|uq17H!0tyF{8PU?v18GqYHNR&lZ@0I zGd97{jef&V$^K<2n8n6$w#uXdh;ff5nEw^N7s{LD@Qk8W2f6F*4SYv#a>&9SQE&D9 zmrc)k&xm#+UcN}rb=~$+78yzvOu$gnIc1e|p)k&8kTAE<)0z8K)Zt5;eRXU>@I{+H z@^l8XOw;O7&j^00Uco3E)l_0!Heb$W$l`sdwv0w6;J=&VWHh~Lqw!H8kg3UoM;E6$ z23)a98hvv*+*a8wDygfHbqLf$mQ}3bibI3n02d8yl779p4B9oVi{l1368#Atl}OL3 zGh_3U{QCNK*-b^xjaAn+JI7>ZL%UKv42_y`*^ZoTqd>v>yp}SqY3%g{oyE}OrIfjump_mAlUnCgKaAy0g;b^ST*vZBwr*ct56gKaj z&@HukbiMTm#AoQ3=zB~)ifwf$_d%vQD)-0LCCdXsUG(A0{NC>c#{7A+0U8ud4jwol zd%VqAg7Tf8ie^O)fCOzIY%@zNcD?vClg&0-?TrS)!utAn+FPXN$C9jq2w@CxK$jQN zu{30yOp&!zn#+LjfW=a0{~C8zw{>=?tzO=u1B&lI>xqVyRhyU1B%K~TL&xi~Fxf#d zdjwAlDT3OGJDy*LijcM!N>%c%Y}>>dH{( zFh>L*%f%_1S5mFtI5nzL2IbnPtO)PwBP|`T?|QgCcx`U$XDP{hq&L!hr`?hrJQEG! zQGBbp9`>2y%H`PbVAC9T6F$%G&^uF&DNhVvBl9V?@WZ8~E`spBuwY)3+0W|~ zwGz0ap`OAn$0gPsiO{W-Z?TBeg9Hvo*j$Kzb=Q#_OIQY(><6jF=G@B^QA&j`@w}YvBveAmZDQORGPxX=AsP(h9>dIFTxOUt zep^|tE24kvQs%s0L~U;H`>vk%h@>`ulJ zH+ian+`6bH{9S#JM#!zm=NlhTs~j#>!nR_03OKH-;t(#teduWLUbi<4s1Jj=z*TzE z0kz)sGc7>tA6~3xCr4${YV&Kn+OcHYu!~V3-Ap|ucm82A0e4g-`sbUL*JB#?oZfu= zr{1-w!0slsC4yI*QspInRf(E#e_~-tbj2ZX*a=XP_?e{8&tT#qhsKz?!YGGyj(Vm} z$Z`GHRp{M!D;4MS-55Q6N)R77Wh%Lsjll%q=Ho)cax#@ySSENSnx8wSwQuKdR~ibw zMe9g~09VEwXC8qM$TRMf^5f8HdUEx2Bj_0ej!nD{=W%?7&ayGx-xXP=J20d%mJK(c ztK8@!`B}GTPQ6ybKOUX$(GZ^;c`k;aOhQ-QiV!~577DTnBImlj-|Np*Me*(#WO@w* z7WH4Wi&x7b+&TaXg z`5LnVmmPH**(5viDnCmRid)Xu92ou9MJCN8GY!V^p^SK3KN+W*XdpiI@;tqf$j!_(K!e99Am7#IIPku0T3T&hMAL6{ zxi%*6;;|hzAI~Rx*Vduq-Gtul&q#gi3`&#C~QfUtIP$+ z5mX4#;^^Y?RAMoTJIdPR9y^+l>D!VzR6L5s)wp^g4dya&fTy;*1q(!10{d@>d>s>GJ!uiO^iAmy;;D-)w8HUeaS`b!1u{_hrgP4Qu}TD~ zdrQybj8wqtNmzp(Oa*uLw4Ddh(Y0G3i%T;vIAi{R#8m0$5nai1Sh@ZHhp8%%2eTr^ zwn)A2t{VP>OV*`qC`Ort?j309uybp z>y?UKob#Z5p>ih>~{ zx&%AwqX}8Yh2T@;BH<(YpuS;U_!OC%%~SHNAJKy^O72sbF~S`-%u4h7F&L_f@Bs*u z25IU7{)g7uRC{OY#J$>*_cj$?g<zNNjrAFjLm6tb2;0x3>xT$c$)>lEveqr= zpSr3^zkmaAh<;7(2Lbz#+0T0~&0zUOS6~_UsT+V+0$w~cs)6{t_*DesH&X<5>0)dw z6TS}WR-nXj)&T}=&u^?dz$g_rRYrARMfuXOt-(1@ukuN(C{;Oi4uzun*WaPq3KBOw zyEe}+zK{F-`7=*bz6A}@cQb|=2XQqk0)|}YH2u$gQR_oY)CaCL`ZYI8{R6vfMWcp? ze?hl5AmSKg^3ergBS`7@jUZ(BbV-xVTx#hpFPA=yg@mGjep6^D{&FubCy7fTmaFMb zYc$1(XFDnpVfdPIxQ6qwjlM^dpV7jv!A(}qv_=z@tKZ7A{E7@5Z2{rs&y!n3UY>fiJ%a)j~*w)V=+C7r;ArqRSgs>Z|}* zZUw#JseN8y#x4Gxy)Bdsw+|n%>r34+*TaTdXR<~>zXE^%@EdbQ+#iaOEl`ju$+v*o zG`~08Q+(HmS5dzTv2_*UvxM@cYcJ5e2C9mOKH56KihIE}IwS+$M8px^u&(2e$fD9p z&_r|vIsvX16S0W6?Cj_kZL^{pJh7Hn#k-2UDldCtHYWMd^~fxpxq}0C9}p_JbTuFE zm*Eq$7a?bHrK`#_v8C|RaR2@(r2$>s%n36HgX!(h86p5P+$i_gts$|JEvDAVhR%Ma z9`;vdAX)zEon0dI1`%1#dz}*MaT{VWUgs@I0Fo-Gw zK4{9+c%Dkr^Q%awM6#dg5R+xwr`R0k@oN}LY$Xf#9H{AZ0>PdHC35h>#_bQ9!bbsM z97ynE@w)kSjdHXh%8SYm71afG;fre4q<_S51t606pK{#f*|3dD7DiDB*0lC$&nVaQ zhP~aQ`R45ARaEcd%$-Amwg!T~R@ZAc^3*o&uCu6bM=BK<$%yn43g@J|9ED9@l1Dk+ z4?8%YD)mrisjTk`pn-45s)kQ2Rs|FjKbb?ESES*CqxOAQt?h>1yS^y=UE%rQ(R5%t z$f6^-)jk;^;tIv`Ki3JP@I`jEbo8Pl2v*F~2E-}#ef{(Mk+KV)o6PJcp^^a}OqCJd zfb!61exP}43Y|#sa&X;=LmIN6YqPk*U4h-Gd1tW|Xt`Io7h*GLwRdleHciB<)o0#* zrj8}c2nriX*S1JSvVlU%LQAroYa3@(ak@BP%osG9`vUQA@7p?Rr~r1?Nnb?!jF36wZ#bra@ zh77d?d5CcIESl6NdNFU|=yC^D-%x;lfR}Y# z+Z-G`I74mU-t=VIcE0DEgZ=uVGo>`o;m0=$pnpX`c(?@?!Ke+)ys-njiAP@T{oUlc zXyu03m@%ce$`w_C^fKCng=F@z7RNbin^E8Rf1qzpJ38{eFdBwi7b+6Q_K#~w`^GQE z1LdxO)`eeM1FNouc^0hWt?$NMMs256 zzeW|vb=Q~aH|EUJ^AKn!NY)g1)B;{=yEJ!-lTFJ7Rvjbn$d#TEiY(ljf;GVSxrK0! z?d2S|spwDnmX^g+sk&4NB9_~pjNaEjOC8X||)Wtk@|%G`FPGh^9M;_FIAMw;4Ksz7+iwy6z@ zVacZ0H7`_EPYPL5apDLPPl$0%^J$fo*O=$9)?8*y$mZb@)W>nXP%4KK)7{Kr-i z!Po<}nhX*SvgSP$UWly(7oLaPKn@U>p0c-=gS5r4rshL+E^-INCPZlzk|pmM++HG^ zQkue%f9&k0bH#lytB#VF1fVrxjz-O4GxETRRV~^cpO*xyke+1C0Hzaau8iB0ml9xM zA(?-6uB0&_o4EW6{76`$okpGjKamS9ED6Y(3cAwWR+`DByO`~De~6yM^x_JY#_*39 z?t<_qI{ca!?4R$aG5fthoC<{J6wu>9k3KKV8MWr;8c;8G`?aiv8j!%gQoi8G5Tys+ zUzg{DM|5#w=>9zI6ZaNs1H+ZVhrVe1h*S9^0Q*Isb!;J0tNXoim=PoRTnOd!4l-k> z*GAm;pZ?>9`=a|6s)ZC*wz$81w>@w-MyNs%y+`HOs$=7}x%RQ=*7|iA9aBbD4t-h-B6Z&>^g<%z1)+3r{3*E3iN>vo;R&-xYW}h)}370HZmXgQfu_Z z+E88DdZE432MO6?RVs~A9-Yp3RKU>K%U7xeiXWBocj0e*(ZM`)y{@l*SGibC$SxB^ zFM)@zX+~d`bt;^PwU(LhqVSGhtV@Q(_*A>B38w%I=S|Mf|Go z?dJP2a&2X5g}b{V4D`L`>`T8@^TJk!uWEey`&bQ>0s4oG z9ZoJmJ=S#{btcV@WpHfeaX|yo&{)J09c?C3C!dpf%MZo8b-0|I&CTDdUR*{kR|zK= zhb`TxK>EYy3B2YWlv`pLbzLL`{3~IS9{hIWyy&EVW=JiNJmHp8q2xxK6-UaNLXh0I z=KJXp`Z=V|5A2)iu>bs_fAO@)hGz*4Cah|5#l0H03KnEnhPB>Td7Y*1XQ5*+kNx-$ z3ik4KD$RqgHM(djq>PC?z8>Rnty1Yg<`vw{ry4%^M^TAZvEEfCt^zM}{V&n|L#IDV zR+(#6?px82o;U&{73zYs?1&~M4iY%6&sYJTjrfQj#O%wSBKRj3fZY+XlVG#bjW zf#@?Xq(>zkA8NPaOjf{GrT(Z!I-7!LG>EpY6SN%r+|n+0(>ae17?#086?NI%VD+RA z;>mhdC)bWDx-7aPt2m5>S#o|!saKhaIn=7F7Fej9^vE}DpK5=lSs?48oYBlNS z_Xm_5Ky;H49XlK$8#ro@7JNyC@6!!kTA!bF8O6yYWoqo&de8rTvH4=R=U>6C&IJh= z9I`N;Kdseha6)4YqC9F$54-z#?GS!St<&jztYKMtUZN&CwY~jOIgsRM|5&;ILHR?fkk6mS)t7ZA-QALpQ9>+=YlV5cMQ+T zMM6CU5h78YQJCB$f#|2_D;tLMiy*St-x(eHk|(NSjQ+tWe}5>BZpbwq zs;R5-lEXZ)A4GM5KO%*fs$tEOKA8{^2kNGKvEHhv?)WXAGmDE@F&07<5cLa{6srj}6KQe>D z{E6%mn-Y`vA~X&c+ zafV=E_oywp66bx4-vE7Y^dzVsH=MjI>o1_a@Ny=eZ@7_AGZXWy+7B19+*R`$i5}5+ zpa45Foz#M>e=170?AD+h)sR%!AE51pGz^RVh*MmHvde@9tLY2CB*) z(t*Igj-(0cUaY*}xri=^yLCN5TLia}TYCht8+z{nR^pJMv!@oX><}$b7EEUFzLeqkr?0Uq(VF>&M-hmsKo222@5#3*X+n6< zASB$?-C4=uOnsjZgx>dBi`o{#Y&Ppik*U~!8W*ikaSQRy3@pmBhpI1TOkz3v(=sxs zkYYjxRdmI0uY=GSgB{P6-0@(2V&UM_#^)9t`Tst@zdh~r*wQISLXvDvzgK-xdLg{s zTutrXsQ%K}Hw=Sz;>WNjl<=L^bms&K1O68O)Zrn*Lm+@Ccu1=HrLvZ9q6$&JE$-PP zHLRrPV&*YjHOWhlu(Vq!q_dG_>*r<#qV;svkr5tVX{sUPAki5@!M~|NU*+)T8+BY% zI9W&P3m>AsIxqjOqO}_=B(VxTByhS!-HK}Dwp_5^#Y#5D>}6E}Lw%dzXcgPVB6j~T zZgXNT$DCL1l&T>3;hz#Z_ufQ#5Fg#tP8rnDP-3>kShdJ;sQq4Ge(tez-J|++`IY5W zE9AV~OvbY8=>)&q7u4FtW4YONUvTiAG)hZAplscZKy_5ujB z5W$Xn+VrZrAzh1N+=tG(yK@&k{5k4MUCG?lD^Vn(e>2Vw%~H|VHW8nI5o7;@ybcKg2;JUsB* z?kJ?YR_Dm5+!gOUigMSJbl7RgUR9`pUAqE44w)ly`sd0NOF>fors#Lx{F zZ!v&jHtZ&JdZ{{xTA=#ZK25Y;X%Sv)OXXMi0H_s#wD21q%Fk_nw4Ch_0l>E%;j>?U za+dG5P`$_>^l7A?9N4F{gX%raemWJGjrLc|2xmMQMriH-M>+ufQESguFbmCIy)CSB zUcfe&uUHTxO!#F`6?A0gB0#qIXugQ^c}nVc^%N=(FctpH!;8D1=*<(!N}pBo{!Bne zlrh%!ZA^iX3Nn$SXqgG^|JBaWH7y<@|5^(Xd=x?RlqH#HWBXtQp1<;8?PBAqxI0GLRhvX~>%C8xACm))EzeBP!S-~9!=o<9T7Vq{y z!q08lvzPZ+=(HL}i0}&|QB^ueWHjjg`SxPsM}m`Y#YxZOu%oF=_EOKwg9 z|6)}3diX$0niI<9U7Y7f$#75K^5pfkLi13Ycz>!JVdl>kv*DW_X}J=63V+|m@6*&b zbyv{wZqM*ZjhIuhGtSskm*X{k*d5rz%|CHv<+>#S z$$5pW^qnbucj8!GejDRAbL-_AB=<$57B(pTho&~}_UmQ*O9mKQIzN_zSfG_3Me{Ow zJWNZCq`7=mE$AuvCv@h2YD^AYnfKf9p|`Rco3SZb$FMVy@gw7MfZ|7AT*Wd@IODV& zV)7DQ*W7jM@|g3!2~my))hz%{6V5UyQSvRPu)7Omyo5PG5351rPbXJM-@ya$I_bXC zi}~gx1AU)0(YYHfPV=PYG)^=MKd`u-m4httL%wuGqHsot8Ux)m?X2 zvb8755Bt~+<}*tVoJS4!$)Ua^|J=5794Gkq>Y+GIrGn@zP3{kH6OT z4ZmD%PJphF>xOS-4pZ)yzOk2!Qc+=EVpXDHYSSTbQW+iH#Uq8_6$ZKoWlQ~yrbubr zX9!!#3>ZCa)?0of7TZmq;aO?W2nm%S7F8yT(d=x4t$e(NHoW*HWN*i#x#S1)jv-r8L33~*o)Gqe4S_uYH_@BhZ+?+9$=IezVjludK>J6 zddCbe+f}O=Sk`WN!uYrBEN`hMsI*0HX79~h*uj=R%%GnVveft#C`5PvP)`vA$DA~z zSq=Rlccf~dkU$$r$SJSJc*1=XFb-+WNDu!xQTSli^ZWpj;xJ z&-5@wm!Zz6+vCQ292-)1oWCoA+0nK>_uP98v^^-~=PPyCu~ejL#ovpQtnsY-rUBmcN_=9lqn0V2kJvZ%ZrTuhLkqPg52-=HZ1@(`Kzl^@(i@PFV&2~3bS zx|{-ZFEFjXtQAIHb(2b#P1dJ;asD5ku&M^I?U{!m>7l!#-R?E0T)L^@5`(ze+#=K; znemR_Ku0IRpsUXw)+lwYw6#qHY1Ik+e(? zAYMSUw7h^u5FK(yR9gpZGHi*&U;Kw5zPQ4uu2<+ND8kV~n^4J&-|4w|Nt)H-wUP40 zI}A|g)q@d$d8%B(UXQHTtDopiUWQI*7zl-_Q~_C2-oJfE{c`xmNHCk38tT$*-v6&D z(vpvFBW$zTATVHgHGdDJU=hatynV9^Cw{y``Ug`L32m9`R7Pu{jd7;mh05-fglLOr zSr3jsKs=?nx|%}O`yNwI7Ms+K89k4y*o9cV+5*I;ha!YF@**=E9o%=DD(V8cmxC=8 zSiinXM0xhwjjnL_(8Qtf$|H??h`)S?n4+Q*#%__xN@FXx-!I9RW?y1?kLp zJ_WmM5Ao#*ZWlod7XP9fttvSvJ_YdptxD$=Q*7xSMBum=NOvIiwKqaLh9neZ=0Z0T z3f|*S8(qqokC7fpg#lE?)u@Q140azwD2EwNEjb^HfdklWpeL>Hvq{*T$uX@L)u)uJ z^Orqy$8uZ}UOqM|T%LFL>g$ zerCo!r2a~e5mA~zs*zK+%?mw(5Io|Fm$ox|I-q4Q4-Zv7RC%*fw`*-E=-ydbzaa;B zFtNqe_5%R79)&I9NSEk2g;D5;<3p*o9GNJBRA{oEzZk(N@j%T;6%nF!!&rX%;-ex1 zXlabfuJMuq=u>suo1wAyk6ZLgQLW>x+#k0mWW6lcLhMqHMYufgoZWFf+_54zBpukF zajM%QiWked+k777M>A5@6m#Vk6~=)wWHt`c02L{U&}$C2o4Zhn2<;s%51C<`pk_8o z0+VXu^+M}dVP0Mq=2yM(K&ABL3>oeaNLT9v-}jW-tqT|Gn*AvzeK(w?8Xt!_+~fHH zZR9%V@&u>Huq6Abgx_6_e4P9P9JBS`nj?(R+vt(G`*<-?NarkZq)oN$SX%+EZdO`$ z;i5aR+8I)XrB$p$=u zQCWC3(-qu$=K^DV!Ma%f*{Q3`L1D3sb0hkrkULYd6DkfOjv(Vz)oR5BXUOB_RmQ2h z!0>z0F*=_AmL&ncmL&Ro)(e-y>M`t53q;p0Ualy?&v^gLmVHy|2HIekGY&-BCmry* zTL0umkyz%HPcpFm2lpz1Gpw9De#H_#n?wBh_ zKf-uNMCbBQwM_t-2n4izp7^HMh!F}n;7B|8LrwnXFWsq({Cl4_yM~p{YC)Bzo)0T) z;41?v&!2?{01hJXIp5w)ug~qYux~!|CSo z{;m^4+>%^~7OUZf6KeU-zP-A5lB|**cUBu4)SbWAE{=bk9AC_ ztdg~%H7y7k>gr1~KelUPCnk4wk&0-1y9*;|5bM&}Ap?(0atwrsQeI|(rw5vJsHM!% zDHk`>#BvlM7Tjnh${>OBxSSxo0e*v0w3;*D$5)&_Ams$94a}@zrOw6kHSJl*$SRJ< zK!X-~$jhto-J=F@T7K_OeUiVRS;N=Z2CTjp&AwuNs}H4;YUYowUj!tbhFx<1L>YIV zeU~h~O$vLr>#f4Z!Qq3@g9lFwq{i9d^r+XZ+N0i>PdEOa`CbuqW3Dnrv(1u%{{NY3 zvMXtencW<8bA#8|Z2D2(@azlDvB84ABgpR!Pq^ckEs_yf=8p?m7yIY;|DRg? zwBucV=6tY4*r|_IY}G(QW@tHbdaXBVK~XqrOTqLX1l#aP@Z`cP__eTLeBG2f^vz3U zjU8spCV$^YKttL?@5=s9iH!h9bzAt8;n*@o+T2>)mf?=6|61DZ%t^ zx9%atS$KfRE%}uc(Lhf-&T%ESovij!eeD5mVPn0RuhbgpMuTE&VZ3mL4ABW!SeH^a z#)`C#2RHw*v(a-@OMpWu?&?vRXW?cH7V2iIAaXZ={#_f7!Q3YW2p;O9P~YVqQ+3OR zN}1vR`O5$N{;In#I&vfkIsD*gDIW0%go3Krlt>P=!~?k4_60vGnp zq0=C1k9WR9S4vgll@>G82XZu_WrmocDJNBrnQb#vKlPj-1i6$DnP|lkT_Eu~VzG-B zhDnletp_1OE^!zE4Q^Uzk7e#iKoM^Z5X5MH7sLRi_u%o!PQ&AqMrE^ZiN_6rt611r z^`sk+aCVu`98)rM=~0_?GrBfAD-sRzxz2jyoM%3?L%z{W&6##%E~qfc;b@82&=bZ$ z!D};5=Mum6jbjU3LikFiTV`;%O#!P;&0_%aO2a_c!P{wpb$msBLw0o}xXWfV;oS#- zI_qC>{`byiw8C+R;-MP)3++`%%Hrwvs2E(SBIiQyPf(1XPXcJfRL*2I-hI9&^x%$~ z;WvS85&|muxW3G5Ezu_I@k4RX##EB31q1r$NO5;K#>2qCdr-(1fu04AuqCkx8lk{} zthp{2Q29II)=Ss~eRPglk+oW2&g(n#cvVy_DZT7)41U^mu=cGM3@=A~GQ6#44u4#f zbrfi&V|AMcLGWq=n(0fs4K5=YNyUcC4ZY=Svms{iVOB&S%T_MukSap=RtU` z@iP%!ffzx_-yo!-Z|aF3N=ip&RlP42oz(&KbJOkq;xWRfwRhpTo$3d&d~%W?9|$lp zmT|%v;b7~zUx*%lW9DRt&zfzGB?4%qsk0NZXx?h>zZMpG{;ttU{7tmOBc)SNOCjhu z=w@-7rhrDKHJ`~#*uCwI(=OAqEe&o*Ij_KoC8<9UtUu}!SrblqMLwB(^|d$>-YD7= zx^v_xk9ipEbG|~YG;*}=H4?nBGJ1V7rDmRuAs8_5E;-_QwToTBBi#D3vJypfKdWvz zesyGBQC;fs@>idL32ljFaBQ)2k^8zAP&Ru>gL;l#evv>v94!yRO$ zn#WR3pWCCRhLJ9&H^<2ZSZvL*Wg8?L{8mWNObVka#b7zvMRk`l%!a4#4Z3}NH<>%A z@X6K2aZzai%CDDg5L+FiUH+--*C`1EiYSQicR%&QW(XTji^V=~%Tqm-ZsYC{C5-|5 zJXxM{4&2OP&HzWNI8x|NCkHq8N=ug##UTU@$*NhXX3geh%?lfDj@2#r`K5D<+^_csPFhRbr+xa@G_BCv@2kl51AR9<}Ls>X;{DsW@H=R+X2TYt-h9n&J9s>Rf&2NSr^kLDFS-ffMtTb?k zkl#u#+JTQBf}zXkzY)&RLEHeLhDN!h7)^GP3{v}#R{-z4Txv7-=2)N-a3KVwqOtnz z{$L1xV{8hVTF_N*3(ybTKSctk@9p_-?)s;l?4`HE)Pj2F_1Pe^wRVGrY}BpV3E_YK zZso>z{g^w;2+^8#LPIo8zkgs1ViRc$VO|Hs%+5wJsW%T>iuCGrG`~x|a}*FZzLo$K zWEzOG`WikfQL>&c-%Q$vTgH;ju>txLMj{S-N{ZavIj@yGRoOS;h?U0Pjgp>|RnvFJ zn9e3({9pR9iwRBDcm<+_6_I%;OTTx>`^G>_RbiZ$L*t=QsR=RS|0DSrw3NOj9~+9* zr-Us)r#2o17Wb!d0&#%W*0-^u4^9G8fjeF^MyW1myFon~|6UpLM|@Q%K~Vk4vgIS) zc}M#!SYX)FnEMwAS^mF^$M4>!dWZkIARFC(7(~>u-;sGh^~%Us|Fq^Wz>boXygq^5 zyJjxIYE=Sfnl8?@B#Fj28ufR9Mf0D+PxLeZ`w7KXibO;Ii+QCv@|dtdBJxP`-v3x zWb)i;6+#HJ0_TvO;9Mb7}$&f>h0d2Gh`*@UD4i9%J zPYFi=T}L6)t*+yHpmO$)kI&=i4-C@op6F$aAm@hxMQu~uRH)s3px>x7(EIB@G56oS zjD~%J!}mH1$(p4@><*>8q7G$6clP0PwAZEB6bZ$<3#!__xorPx6bVq*%a zMQlD^nyYpOim8nXUo;vf9MA=p-s{#^;;Fwz?`H%02wch1^K~aSXJj2p3YV(w{a*u} zTS2G6S}bTXQ=huyMNf-nOcI!ulsP?{^>fh|4BQi)0BEeKo5H*AiR@wtR&~N3^hn=L z92k=wiXiB?h7CLpI1DKgPY)(h)LP;|`Usb=`Dh)R7)|xU3>|*is29HPr`1bU+JXqL zMr{!l0fa)dw7OfF3>P0QMGd)`F`?4g|C_y#R@8j6oyF*mY?q4S0FeiY zqk4FK6Q2}TPAw`HwN=3NbXNkNhNN_I2UF7q0?^DnRebH2qM^(+1GUvQH}d>fZY7)} zYqXi6$rJ`8Vc(nk@>2l!(l4@WAHe^CccB(SH?25;_cR!1T>lX${*V6ysYbMzel`Lcu_vH zxBMUCFUcFO)u!jVN;@Cs2!}3&hUspL4A&X&VeUk(e#5YTa*Mxfl(D7LjxE!O>bfEC zdHB5>?{IX8-crN2(skO&AK&H69TC$a?5J-*XMZuKR?R*F^03d@wE;NNluF`^9b{ar zZgY6ilpq>&TiaX~!LC^C)QsURmEzmc6M4m&`MvY$ns0EOO8u3JY*m0uaD`!>&}IJTVaZ_abiW zqv2R|2B+F!S-&QY{r21EhmtidXmB;H>yhveycGX-vD+i332=|9C~&yA{o@<3FPgP) zv^Ew~?>_CoztS*V%&ypYUxk0N*L&7(zF@!q+`wK)0KzfQ6T*=&wxi)&GbW7QMaYLg zts8UmRP&!;I2pN7n!MyWV>2ePm7-Cjp)At`PC209!Y7(PgFc>ef+}F;tHIh|zFUS7oZe7&l?PlvgV4lA}>`=Trlv#1l<~l4Tc!DxX-kawj_0Es`H2UQs+qYV4MnwFHBh9ig4&fFf&os}*vpR&wv9C=zUqD5r7G3C}oS?B5i(xVh)+X>RHd-1Z( zDx%TM0P#^hjD%S?eQ@9{b8M>Qe5*^MpdieBTO^j>>BNY`3ubD=%S#Xz=CFV4Eze`D zq{N5;hmS9zlY?q{oF;;asmGLYYpULSc7|S`tHBMz$UxlS)yeXM6ty||l}CND?2+}s zkcCk09*;gC^`pzx-u_g#{wJN?N@)0#L!tKWhdH)!C~A|&X@&oAp0VGIzLV#Ti$4jn zHus%REybTNV&FqmbTQ&fIm|c0Bc;kS-_Gp*m{LdcHm6bcR1HYst=l*JJ`VxM$mD>_ zKGw7y8CLgLSKLQO4W!&?H#hx0S6~;5tv%}J@P`|toZe){OeqLz?Lu%V9+_BYA;e^N zoJOi9Y}dANeM^+b9t__%69eaha|JL@=FLQaPsapD(9oSSPiW02kgl$H9stXpyP&wF z&Zt+o96>fxZA5>)+(S(Do})+tqeUX6uy3x+-9`x zoa4@M+ig;YBH?P!xn-s0N!&uWqX_2b7red`#eIy2$HD0wY&l~2d44->gl3UzPYPiM zqSpe512%woUNZg_1n4Ww-rEe~^pr=h?^Xw$#@XUTpw_4h(gvjZck2f!|0m~p7S(_V ztbJV*-aG${)q}eR0BhQxy0&IN(CBx6SJ)zV8G4I7GNRT=Dc7R@c?JjM&~7I_`3ttV zlO*LquU77(nIBaLWd28Cx>rMe-*>D@U64haH+qYxuNanmaLLn}Y4Iw&inQYqc>@O7 zT+FY;TV&!FRHL5_B{KOiANgI(;+RKAr&v>ifFO7uT+7!6f;rYYof0gh#fX(8@cIsc zeL#f--t=Iql}ACFkz4cpPF4Tm;zXtB>SRXIkTrB7)0UHNlZzzQ zTDG2e9>sD^S|?(&R==H36GQY4@e0j({ZO3LDFdHZNxFS^i%D^}fSDad$;KjK&Wp36 z#H()$Bf56!+I|4!M%(rzDLAS`8=8SH-7ipSz&j%*?JQEAM$4nQ?FJ(%dg}D>cee=T z_8j|Q8qgHLB9HVAL=!^nO{n5AQc+$g)-8JHw@INIcN$I#kXOCU%p%(g*vuU`VE%i$ z(`Tb0&?XR)i}uR+h7at`^!oc1{Wrn_uV&Xd$J`nhLI&9*Y~s@gI#|bd^A)-G=#MGA zU}wbsNZ#b{lcy3VHOIu2$Hvc(OJUTf&ZUWM#6Hl~gH;;4C$xUN@)84d@7~1^L_v{P z(6+$b`qxow+HQ48dB}zu_uJ*6pb$~>uzN_IikY*3Y5-qJyq@bLOzj!fxUD4OLuPs- z65m{BBu7$}`@BmVuo(R$P3xO*}T-gF=IxfV_?l_XHH7C6s)7xO7K`ELR3IS#*<2S`4}K5Vh=c*f{L&wJmjC3T z|5M8+8jh{%d(9W6<8ntEmh(V?=JFg~v*+QApO~|q2k#~s4JYr`2A1v%E&KwvaVNk( zS)Pejk9{0?$gD_QRxe72*!+y-m)UXmxhNO^3to}wMkLU}r>@WyrGIrZ77n8j4J)F# z`8kiGNz2c24)p;f_c z6s>w-{XX_ecA;gv`tv?_PWlHRmL$HIt}H&0sCJxzPn#iybi{@uoF;3hCjz@$bndCj z`H+m|T^^8S=FMe&`c4P*1vQ1#M`hOZ&rECWSH}$;Q)P_KK049c`3>N!`7-VQ^=%b} z@OzDNQ@s4bgqj5OK=q5KDxUU_*sbCuw*Q^)w=9{e_g8b5u%&$(RKtTq4<3Bn0r$hU z>zu@FOl>VOuPUvTU37jZ|=Vhf#zE{b{4iIHD8tb3$w0RZjgR>2t zD40oOBsabA`*m8(+?y3i=1~&LRk1)mud!cvm6bL01wI|7G^$VF%%`T*;r*-QkA^C~ z5~*8yxJ}{Tr)mWGEM@u9U9|%%mSJqYwYG1)WFka|a<}rfndS5YvWiJoms%$HsX{ULLucfpzjpyh!eK*<+gx@g zyJ4Z$A$TE_Tu9hF_e1*n?}rbP5y0>aJ)mppigCX|@I>4EV%toy{c+!=|HSC6M`tV( z5&a5Pp!KKH{J6CIBYW|-j)8HRG=_SU=A|StK-Ppase>SGc08%+RIV@Vd~sUjrEB^J zbehZ_^}gHOH7kp#OhEOF!O}kSj>Z}uCYT6C%D=`TkC%6@CS*p)aVSk%*n!YFzGtn` z11F*^pDjo?~TF*){77Uq?kJr zynu3$V@&|_AEzo2@SpI^e=VfFP*s{Y0R#58nEH-k4{@!bBf;lEeE$y zd~i|#q;CeZ!mI$P3vn#kWiq$pxSzK{0w$#O-3w;LSZ)9-Hq5xq>0uybF1WhQ>=_v3 z6>$~gmVmuqk4_x?*H8`Ef}#h^o7!aUKS~T*Y~2y@Q(w*2_xrSIexkvZNh{&X3;bqc zd~#qhJ|R`{)2Z0T-g=c2%SWEU%0! zTtF)L8axkQUcoY^CjVdQmU3}X;koHqLtC09OzV11#KIv6oCGBI8SC>uI>LXFyYaRN zyL8q)WCgizVT$sFF+UcMw&$z)^T3b4-yprkLD#hVmP7+#DEk5RsrM~mP+Njdc6*%o zQ1ge$nBoWgsY2Q<(kNMU(rp(n4poJ~9!Nm=b7|6E`*@Z%`E_Ofi|V4ToF@nemqqC) z@2h#L6YKAKocs0r*-eKL`AXZsU$8N5%tgF{+=29%6VdSrATd!_cNrHugqZO$Um*PU z5?wnLcKLV;mFk8y{0X8FuX+37(NcmT?%fa{NY?N8VJv-UcQ9V*Fd=KhH5_83nE>5W!p)|C@T)_@{*MpqBEMJ7 zv?-a$9*#uc28T1o=ljIX<$smWIui%&U^{jWOiq}8h9@9$FA5^YVPFtW`0=MM1tF4Gu3@{h3E`TITfVgbF4-D>qOqt>%LDT)1bcKk-y_*SQ8<5x-qgK(-h&qC z>SFZKwc!b#63an#s0;Q3NG#&xe-YRXc|UokyS?X=>7SM-+BH9ET(WA)yYy5HZFW>0 z5X{U>sATG`b(R{Xg=8TRRuzC+M#tPa-!Q?aVD%YkZ`Htn_8Cu)sR59@EMjB6C+umy zWIua0#;cy2Mh6s+N_eW0m+6^F?4=q-tz2MbF-XB#;tls4|c{AIGCL@$f_a?845Lkx7k~P(m!au^LDatK8ZdemCGp>9Rf>>*R~EgCiE!oUFx(`SAiVVP zvPkugQ8p)u@qcKFjx}5^2K55vQ-6P6=lAGwX1VIN@>J-x&L^%7e>sXDsReUP4Y&(> zDtCPAJp7rwR5^&r@q8z%f7)opoY?eBS(aVh8xt==8~v+Oz=l5mZx%eIkn9DOYqm>d~T zqaNI>KB^HHXsuS3n{YCgA}#Y~-jD!m4^GWFSdxMGR)Gaw+i`j|k0Xbmc=;=t1NFnr z{fn^w?X5Qz#&ewwQV*gL#h9+h_)lR8*V5Ym^IQDq(#1w9p5QXVenzOzYqNH7{4mCC zVsoyrus8mP9a!_hg*sULt>kf>5_iHUKh(HF@@RK;J-2kVGYnLX!}x|MFk_R!XWWLl z+{(_EDLe85uP;mB{-$$5Nt^Ojzn54&zV|-IXJI#Qm3VRzPFWWDl9*=ZV@Q?S$7)h4 z=}4RR$i9)>vhYRP)rxXQ5N;#IaZPOzKAndU!+pb4_z)R#NrLa*)w%jz(z^}crfcZ0 z%%3}scfG7;YuuarW3kk-iUaA-O-Ym#WMrm?M_u@E_FpoPgnH1cE8a>ZVc2u&*MK6x!F{g@;#QxiJ_ABh~!Gs%Z;vRW54ZF9-`?nTfbO<4$Sr+vW z8G@cn`SF>bNu*{N|EzJm`+NrW-c@g?4;pxw%_yJBK*&^m#=iIsi$j7|irz7UgPllD z8G320sqHYL>G?PT_?{{D=qZ=Wo3HB+qNSbUp4M6tq(@rxCOAxv-m`pnMI`BX%bK}X z{tESaZE6pUUT07F76ns?9CP942sLA4tW!K&06!|{UDb)u>x*=2>w=7m6;HQeywA1QYNs47(b|D5C5gaLT-hlhV~ z5J%=SA)JGb|IrGt>3{xbNr`{uLXiaFT`!jD7-u%_wrXcd;=D)-&b~;C+e}b%YnBlx zxF@^dOt5ghVe?-XEN1zgu@w2JVEdhv1R8tR|8T)tF_eS5W1<>hrE^QcziQ<#^vP9! zskBJCOnhdhO;5KyNuEX1c)ry3z<*py*QGdLt60-J{fEI`;R<nLoGH1j8yg!j zLde~VZKSq}Ymk?U3Vh5>tsuwPn>tJGxSJI|Q;*opqk6b+t-W;_n{#tjx}XFTYx89- zwzId}`F5gB=o0vy{M-Km7t#bxOQQZ=H@qe3H-GBcdW>(zsO3dN}3k*R+e;8ti8}<4Ue%fb8U2>`AzLOR7 zzU^2qby$S5VEZ4cpq=Eo?J^_5M<%6;!nMZY95W%y9kPk752l%i{N9iXyJN-(3DOfj z6@l=xt9Qc#$_A`?Di-+9#1~^DGn;z-g?49lby~31+V!!d!IyLCe%*`V;-tIx1K5g0Ag)|pm*s}f49_Ih~j+{y6t1ks{ z@h{Xk!3=Is)%oQEng6>GTLk>wiLfxhL8(`CAAsD_r7?x%6P_2RQ;goVv21V$EyU=+6(Sf z6Tkh2t^U2l?3lc?e`nz{a-DWA23Irba9a`-U-lGgo*bogI)3os*q-uQa}ILCo5cK% zbbJGd5vLw`B^*8Ossj~Foa%~Xh;@POp&7`6G3ky$b^*eoL*qIM!K5_M?s~`FC~>dV zGF!PTXV|$T=oeDv&8{3s3HB>+6OLO6!C%rGS=+GR9>I1D__LKaZ>o$;yQ=>kod#J$ z_vRYBaTyDH3t4i_&FZYUtuZfT^x*XqssEZV*l+-kDJ~~!DtCU> z>%y}T-fsJ@eP3|e$8{z^MM6ItueH&uEO56V9R8cMX5sHeZ2x|12K#xZ$|-d zf1y_A+Q1jX3DxejPmH@Y&Q;(k<}e1M1ZWbKwEP9h|+E zW>z#iqymnC$)lNDdkq4+UGu*lH&j|AyHXsH;0!tZqC8J_M`y2T52iYv3Az6oa{=L= z2PTs@2s^bZ(On!cNnsB4@x)1EGI5e@?bX&3@0J3t8%YIe1qpN+ z|KI?Z1QlG+{O7aTS{4jbbkla(cZ1enNaFBc+F(fK`L9ydPRK4SAu)}e0Ar!P=L-sR z!z1z60%oSByYlDX!CrqeBX?XSZe$TT9;9S=Mq+pkkdr?y+6$>6^EaL0-k!?Wm*2m_ z*geqNG@+kdd|FF4{8lxB@CMcUl1|vGoHx(*gA}k0O(u&0GUswXBgY392G;tT zVCRvLeb$RX;!*hBz<(bfC$_(UXP+ZEu_JROkdYXURCr>BQ*o73b2z?(a*0c7UW2$V z4zqCU!Z7r+KeRaA5}d+@I%;S94N5=z+dLRMUSchHSxb*Ch`;>3B)eMuy)d$=+IHJ{ z=FX~Qb~P%G+i`d5n}WA&Wx%Jx6d(Ob0|r~&NXmMqZ&}2rAx>E@?GEmqC$29$Mtr;E z?28S1mUX)83i5pQoFB@Zka_LQ0_2W|Mh3E_S!Rg_pLdp7G$4EeXAowN9Ed$<*j2BS zAodqd?wM}biC+aFDD@*y{(5`gAY@2+2f2Rxc({x-M+IOdMcc+#8bz8 zKwujbX7(0?-lhHxBK;+Iv98}VDwQqm-6R7=yDb2H8UxRMZ#MO@20{yj95bK)-jV61q_uu`#)J+N0<4-4=oi zdtdNgJjP|8hVC;hp=(btYmI&+^ZuJG3y@34gGN6}L%x%xWn4_(d-&=1{U*oe?5hF9 zkx28qzpCTQV>n_}#Pi=jRT&3fHoALZfm^;~QvwXfIfOSfFI{9_n(sGiq#-VS73POW zvoFqr=V*&Gd+iu|W@O2G&p++@5f)_tUiP<9XQn^@@ZWsn-?G z<$u6sx*~IPVE}Y}vuj3daa)x>nD;FwK{6oM_e;3et*T}4T}6V_im>~6VNowHszcbq z$YS&!CtBgB-sds9jU`kiyz_dZ;QX$ZMhNFRY-zr=`FHa|vo=>~P}9&*`t+YY+XEj& z<|qHyt$8V@=+6(y;-d-=wHoZ6NTs}bJ)oId=WP6-d}doJ2^eyCp*2-_SVPHEr(xT< z`G5y@oAAVw2r%4nB@wW7A4UbvDx7*t=e4pNpf%f&maOxef2!o9D+(IBf39EhW5e{K zb8VANfUc9jM(E?CaH_o;&kuCjwsVo0KpA`=qKOnBx8e<8XLn;w76j-82(0}9O7gih zjuEv*=^;93X((m;^WVnzlmCjP>9IM&(!RbRg<_6i`Ze2~FtfQ{Bj?)o7!d`BUocADyNMFf;i(Ri)>SWIco@uXw;1- z=p~2f`H8$l#l}skswK0D>&EExYh{-HAoA0Y)o7qbIK;xX)S0B&W{7eHy`xpuy@L8< zV7$4p#-~kBrwE7CdFyXc&mtq+;wYVyl%mD2!q}*dca;vlbq5I}I#_-vJefrA?X6E` zK;DsDj-0HXZEu8Rm>McX!Je!t#4!!j42*8XF3V`K`>!#=VlV~=4FKH#lHA^*UO*7f?BVM$8(Rg zd9LRWcn|FdZ32nHitW6-Oq8sDhX=B+Fgmei?><(kj!IuXlY~cMCsbepP>0r#C{7**q9=p18j8&o*_H6X_ ziYBYU5|RF))bolfrBnpFx&Y@XcYq@SwJ#$kR353x8{`m8PP`142fQt@p*{QP;ApS*0J;8tFb_j_@NXevdkV6DCyce{y#!^uPw>Bi3mV! zsL(HzK}QMFUdtv_75DsTv(c)g#&T*$)XmbJUmCo#1qz*_V92gQ*3xbcTzq0uIIJbl z^x0B4E1S22TkwbOb#3}PFNZ~>)cm9XwKKqE>w}Ao`+$?}X%58C=o_b+zbD{o%O(Q| zki-Aze!UpDc06^xH<%Wr;+N>6YTftj%O_F9*>*iJpfYuaB7tHC(5kMyTlnvlsYs?k z2P%=h#*NPMb**R=aI_h$?qX+6**NCsa02&S%^K+o=Uc+%k zyqp;jQ-EZ`r768|f+3BW*3*2Jg!sHvea7shjB2ElU@1jvjDSjYZv0O~JXiLYe9hm8 zS04-n;NhgR;3g!rxs0kI-LIB?AdC(&QV=6TwDQtkyH8u6B=TilOJ|7F5!oW>Ygx(8?5cH5w zPmJ_#R2eJBRo4Tj6>X4r|Ei)aPX|6J@g*c;NLsj63+b^4%aw#pQuWRX?6w z?&}_TbRzMVbaD9e7;w^^8zlWrRiui>_A1C3X$ig0-^9bt-S%ZfpzCGNgWbo6y7j@> zcMw+j-A3Sx%aPix)JMU-GV15So6C$JsVzfTFDo`UB@^lhPry#zVKWW?9LRbrg^h$_ zLYxKZ)ieY&BD!t#Cz@b5Q|3d=9sW0rJ2)vs6N8Rjvfv?dc_2F0wph(1((^A*%uJI-L}ER&^NNN z@~Jq-iMhg3r;3k!ao+#gY#Q+FU4?Y}DQL|suncQ^M893z~=mR&2IU9ah^UClgD61H{ zVsGCBq%^geHBvgI|9fZLRBaT~l@O7{Z{?7opzXmo_`+Rq7A@v>5FvE)>vk6xZBV|bhdlcHOFq;TeQiFzZ<5Z$LC~MPV>%9lNN(z*LW03@#`T&2vQB$4Px3@P0ESCb` z!hc+jG)JajAI@Bk*u&zTseOoQWbmbcW7ZUat?KT}*>6lWff}FcZ>~;sbenz3pX_mR zWflpUu}ToGIE5@evK7}K451uz9Ow`KIjWGY_<`?3LtKka_RXJY$BYfYF4f=0phgT| zzvx*`%$?y%cATAko;vH+-XzS>JpA~cB4}`Mp8lkE2sWPg<9``l@V z2x>IkfURIeLE)Lb2^3Rw_yVqos8#r%*1dG-`%A5@(t*oy{GI06v-}1ihJS-DL!vjd zb;CNHGA~itZjMiwXArIfsEH@k8S?>rvjfPj4`C9p;^EI+UZzRVCadbI_1w*iA3e)~ zTDFMr&7p>-F&`X}n-`2X!Gn3i*w4H)AF>y*%jS0!+9WqT*|>Utt>u0X-kZVux6btQ zGmf3*EcHFKCXzeUoR`Y!wx#BDUXJNhQ3#Q>NX0|uQW*oTig(aok;-?Q0Qf*w3df)7c z43_4-;lI7lkUd)wAmDMppCRKnOKnVCTq^~g^V&&Cw;s8#@_c=so59|%4WDp8AL`aQ zjQbL`J#q>$7qNsJGFAZtN{7}dgAK#1{jIxwQvV*XjV;kvL!2{LUwjT8;eARwI$GKi zo$TN`+!KbsRGaj-;t-8R-WF2)P;`p=K7@^E<$irmm+e<5xa_krAjezwSYYtPtfFto zpK#{npxt>vUGK+h*}z)f23t0W8-s!1OJlju8mk7BzF7-NbIL<$eoi6sCKGR%#0CL6 z6nxN8VY2rR7dcd3g!muO0^~ycOpS-NP%2A24X#^~(#?V8#vU5b~se_Is#!Tv56 zV0NhBD$NsGw$F!$r;*||x@6HU{kfnT2lD+GaYZMZZMM1sD&qxulwzj}Z%tJt9fl1o z-mPFmpb$}U=q;lcNr?@~LUmLmx)96a+Gwq4U=Uk0`I*;E(^IaGSuoBj6w>d9mQ{PC zTy=E&7ajESKsrf4GAdMs*qH`3Mx?1cM$DuUHj~Wh_hT?p?S>|bsgi0Vz^s+F z6)`oj#ufQXD!C-}mSPThRQ}tihdJO7StGOHx70FK@9T@?jwt1As-)ZtFsDpUW!wd_ zBEpd#yE4>?%z>kGxHkEB)jw@9g>5@XG2znz;^sQCWUs$pgU`4|5=;zIzc}84`|7** zFpJvV2OoXDbp3&AOY>b8Sidm26l;%CWEd-wYthz`@Ys{2^;K8uysMnA%AW|u#*{jpidf8vMf|Ka%D93Pn! z>v6ECbL*RSU}4YL;%UE4lOMV+lwO0Q%uB!kQ_P)B+g58-yLk~BBJRn0)$QHvaK2m; z`mxqlNS}!BZrS4`CBGLcb)xRnTm_~VVEq{Y))rG`7U9BCDwbdTZsDogK4r_A?ruS? zIy#~dKQ%4mv1N4u55!B8Yyh5}ou#};(!Ue(2m|g0eaWnaY}#iY^Ze@GyVK8SocqWO z=7`UySHoi_34a{eaFB-xz6#e%CX5_d2=@V?%3JM5n(fDmba9zt>-$PG{f`P6Fb!udu&s8hrtHKibg8w6y^G$a!wi6 zq?u7 zkDCcALy_u0^C*=SNVxnw!nzgwtnfj2L2=94Ok5gQv1ZjAXFUiMIRxc4ZIru0DFF** zMDdoi9LSDZjB1jtLaI8H;&Y|b>PHz5w%;Dc0@+#^EK>gVtNt?h*8of~);xbHSd=YNIW|3BAk&(BWg-?GHSInLswK(fLpw3ZnTc&yX8RcJy z-@)3uGkvpWTcq~>jT0=D9>TyR;ZkVcnguU33$S71?|4W(=`;E7NEIxa__ykijP=!j z&w_tPblGRc2cz+OMs;q=20PEib5;|UdL$a3g_wt;pqqm_gf=>uaM1Db+0xC{Bx1q; zLiBm~c|LXT#oEoyce1nmQI`;T9)Xx+c$@e#oyjuh*=<^bdA;ka{Uzk;b^CSvgr3k? zL=en)wnoN77+*H9&0$XWHnVZ}@)X@mM5^1zRamAneS%Z|qi=*oLadK3$nNCdr<~R8 z_#xpIc}|POTes4|1PvCBmF$&zJOpIIq2lOL~FQx#j7H6_|u3gks*tCn#Tm)3TGyf{9=(7z}qepBAFB+yS?m>=Q%;7 zK`OJFT`F{$m?Y0KbQ_Tv!8(gnH-kpAUg2|`PT^iM`~a)i(yu}y4%%im&%?f;P~f1k zaOWd17iRM5s=z`_@NKVV5*i@6CWt6ZnyNpCvd)OM%YdGJg^g2{mS0m?JEUKc80*p5 zosFB&WL6=&(E_tkopPI;qFnOYS%sEMfJXwD|IG%$AqS7T?^ZP)s2Xj_6K+I5qIDbd=kgApA z-@(&O%#Mw}Qpx{T4t4Z~?S9dv`Jd}~P_x5LJLAV}0f_E^FC39HBAaIu!e^COccJqJHvu<%a( z8qw7xaz3=Y&hz?m@rO9~v>omm6jPhDGJ($2 z7;IS_6QM<%2Vn3vUImE-lVpC#URW2|A5u9KFz_)8m(BX}*VTMMk>xFCBxy9Pn&UbG zTr)-=cRMJoBoBq6oLkP-(U`5`cF(7VqKQJO=NJ^wtLeDQfG$T9LwZU4b!eNHcj{#~ zuIjy2f+GY8IG;1VrC<)#bW7|AmFH9~m7pZJfOB8P8GI>tdSu`rdW7U#EM|B5xJ zj@o(dtWxJw%gk$hl>brLhSL!4!>PR(dE;tK8gJ|ER4@1U*eb3lY&OJrz<4Ohu8qa5 zC%3$Ryv*9Ii{-6r?UGbx(ulhP{7!lHCDC zLwwXsGxqWTQMhbjDn7i`Lr;9%cDAU^bXSO3``eqJ!bVp6(RAFeCkqABumS3A(A=p; zca==rVn~Z$l41FAJWzSs+(dg%#`XEwy`5jqIimI>ZY>jPT(-}itR8$TT<@T%I%#VKY z*BHmlT#(7bdGBdwuLbXKC6A+5U$po!bKzz-v*xp6d?~XA7miH1^q^81(*c0oh^YCP zl6fpWxG)}iaa=OWEuSwb?lkkIeyGulRN+=_8V;${l$d|6bCD3suQjtNB`b?)a#@~r zze1B<2O8@juA4p|o`Xol-n_`}>|_r7t$h94K9Kj)u!)X4xHr3?_1%6~WWw0l-pxI~ zE$r1@e#2C0?>E{X_>I2Q*lO#G9H@N9b$0=$KXZwi+i($ms>QD-O-j7BlKCX67@3&5 zV39>zGu3Ne>-`U=cP?h{si5Ol=Jyr?L(+t>O1RW?7TD=LZ6rc+9CYW7s`t(- z@HZ!)J&D>_M7Y)mzR%vgi@opDdE~ECZ4qAcUiutlq)8^)E7CtwQ*9~*!#+RyKEU(k zTb1_=7;#nMe#khGg%_&`( zG(5*{e`ZP|j&&|D%@cK$c#UlJS)1}d@BlMd!^W|P9*XM|z zRnB*VWmYvbHFaSrM@L0JHz^S-M>1e3#!-pk60Kam+l5(#$9m`X;{3TN^Mk{ywRcS0 z6Xgv}3g@}Gx!cXG2++~oQ8ujJ28m0I-tO-wd9!#$b!wKdbj78emP1Z2G={j@*XzS& z)NPF_+?-)rp&NK8rBsAd(COy#C;rzEX;@lvLZNHKTd2DMuVh~0$3s5-(H{LDq~{0q zW1S!T27-44=aUn#+VJF6N+0FCRUXLE=iB#8vJyPr4BTjM>Wmi!48(^*qk+JV7SC_s!LyLN>0ogMbA)%q499;OY?X){C#oyte(Xlf_uT{O!-J zlxbP!gGdbUBQ{3W?|l8>gYoqm7^HGA)6gn3o1?ntb(m4;K^a{CyioXq0G)QhkKX4b zC(l?FO5;^7S6>f*HG?7uWP2nwMnPI)Z%%w;^aW&PL8nNAB{5G{@GHPa_$L$%(@C54 z9G;xLjBnOTVErx@yBx^rQ~578ERu#}ca}bU^F0YAXKbS&2n{E7KV&=uK3#2&5238W7e;wu&zsQ;(&wE ziaCNqF4$%ggIA(qs8E{HIL&ivx$(&OI8xsc9HWq(l>(4sr6)L9)X@lhwl6bEbrC6| z*O4`Oq*kU^byNKpRX4I{D+LBnoDG7DgrmA8KHfzk^L0)rFf8V+er)F>GAcM029P+1 zxUqPR5dac^Up<=C`_mom*L1!}{PeOfo}~kz$TBG}oDDrDBzzP=X2Yep)aZ`CJ^M}6 z3>M_9Bk}I+;)LGeM{3C<&p*>G8>DT$QJ{S@`4CoWK^ZRxmA%<-EA(U;)It=u(k0yF z?+Rk#~0x2cMX%_xBe9rC@RfFkyvTe&`iq$%?=W_R3RyDU$4U zVm@3s)&o=WYzSO$YT+Y~lt*wP2DS4AU+SM_#$q{6xb*U{yF#W~NeWQ1bGW{8^*2ZwC!*WB zxboSbPiv4v7MhEXy*F+7_@rTJQO(}}Cy;p&>d7&pLr#dg2yoX*y^woyx=KBQQ*K~a z>8@y4QnwiOT`=iWeIWtQ%(|8x7hAySlRL3rdB45!Mg)Z7WunV)iO%|FOHU&*pR}|9 z6IrueTZZnCY@|uzMc)C32^fo{kEYBgGk!aqFgW?MhrXm~aQ-z_xiopjlv7a9jvNP# z@BVH(*XSV^BEJiL{n~nO_We{*!jbKFNU*ULZ}#WUKbC#@RbW15;me$I0Bm`~V)t}z zWQkSJ@jJ9EQ)8RZ%R|8+)OZmPA|vaJc8u&*(<|6&<>^1FTY7Od752@`W}dn*$Zkk4 z=#}1(*=b{}>*Ym0N8m{5Zxmol-~SVe_2BvT@5eaR1&sI?#wiNF-(FB6hgwF-i}&ch zv)`(1czmT=`82VvpXODt4{~i0Vr3B*F5YrYmZ{(|11B|txU~uMy*huu=VL9(_p&}_ z@WJku56hZ2T2tOLnd;_5?MgEBq%EZ!Qy8d%2k0Sr--*fQwzK3_{HD%q*Hx_eH0 z+|f=>;zwF()@*o1s|N%nUokGzvn&M%rUrBv5LB9mWbxGZ><}m}#0Z&5s`S~PuDZw% z0Cj2Z>(+{?noVbA zE3SUe6f={p%YtLFb?B*YtOeH_xT89?e&t4e_0@g(JD|eer)>%_0-3?`b2;CHChP2? zxZWW7=l__Iy|-igc#{TbY|eGJmME;E|kbKeG z@WoNeGADI-$&-Q#=O^w4l?61{COIWzdi9sSb*;OgDLQj)ugjWW5c{De~Pf zS?&2m;sJ8k$eL~Ns~%iN@R7__TXV^qh0ohEgX{Q{B^2NGe(IL9 z0Uj9Awr{>Vu5!JU|18&W>8qJ!^>E6w9lISW0VDlxMb^7S(2&3qQ{=9)5F7*Nd&1JR z@Yt5`ws(IG{RiTNlh1xa(ZLt)Oyw`@-_wqoDQXnHXnB0Q^~cCb;upMaqK{y#+ctqD{jD-G7yj)Yvg2+ z%qTN?OmH_@(Lpn1vH60a+vsVXN0@FL9+liUP7HC#e=D@jhSFq#viIjwbDoW*J$&nK zcC}Me94o7ZWV^ePe;YUOxs$eo21GU(a&GQ(12KtgRIxAv^QP2Jd_|;`inwI9sDFLy z3}YiRWB;2FR=}9=((ox>ij9+>!(xps_oN)sIb<=ZpeQRKj@2&&wEHEz-eo~aRllmA@zF@*OsJ?!bPtrNkxx(<1RFS;cYhfg!m7`1IBO=fo4i?+mQe1if!n4K6ml& zYxB%c7N(kjpo?SM3-%*6v3wa0-j487i6v&uo699IqplG@4+ZO0@)BIAEDnD;OT_jb z;yLQW&ctKi* zV!P0I-UjT`?e7Bvjto~sWVbDUdEZI z^Ubo&^=SqT0aE1P*B5!OCm$qN!UNL4kS*T`vKEa<`jaw;Eym*!V*Vo zph6*Q8xzr5ekfxP7$N((JZ()ypv%lQ(l@Vv=f|sUZjh9UO!L#4-SgezV|U08BL?u{ zQMm%ZDdc!W+U5Ib`NqaxWbmI7HL{$WDbg{SP}d-$Hauit+j@b0Pq7#SAn0|G>*M7p zbw$j36>}<*oCKbcTCwIEc;_0!F8rvmcinkxV5HBdlv=_Oj58_8uV978;K}92(aH?4l$1lK(AbGMRPZ8xm^9K zj_DrDJs?75^7bB@Y-7)t);~DMkPW&<)8ols?rKk;ZfFr9IleBa5;Dnei*g^uLM(Iq z;W~_4-A-qntv5kCsRK!2P<(s50U3=qEKC$h*TzrOMG+ek!{%Lmu^_3%y~87 ze;nR*zj%2#hzG{lVw(C;YhE&e_SeYj&RbcRZ}s6V5xr^Nz-l~Z^8TQeF*WJ>DPNcJ za{D%J$wzTt#db7$zOJbf5|g;_P|EIa4wl|he3q{tc{Vvq=!x8QU)%P|8VBaM&R|&W znt@&e#384GxZ{m?aS3erEOoF&yd-?taBz%=oIBlKjxw{dzT|sW|J|1ffbq}Dr2$~f z@ukCTW*P0r@ zot8grPYiR}5cqV}$4zqZsSk!I@#nk1?!K-WT8XfR*)2O=q}!{upqqglprAOkL}_`$<07uBag zaT*4^UplntxzpV(q9D!(Q zd+!4)SNqRkRb@=q+O_cd(KFLIs$B}xcnTXaMM#MrVX&h3q6g2*Syt`&^zolmW7dXS zvEZ`;apzYb3;Mv+wOq}$F?#dZh)ySfT@VVJO-`jC?eF?+p^pWsyu zS?qRob_-e>8ZW?l7C(WIRHK^*wojyjD8rW&L)?d|vSs}REa%ctdRkh1h%ZM}qp9Zm z`eF^;E20|ZwSnhCQ~Byf@2$(ISfrETuON0dZv@NKs@ztdoQ|1TGku-G0Qniv_hIfI z%j;970Rd&Q;cy~R<>U13-PzB#0-K&aDcvdd%a-v@GYZ1dbcZ4n*KpMlNG^i`>oEVm zB+%#dv67;*?6YM|=+Oz!b)-To6p&Mi-Foi)M^-^(nVS~xu*ixiX!P1Vz%Xt$oY)Z{ zw-k#1qK}SBHfGtQD-nK$hpPUzt-m1@gj=51@TPVZXPuvuL67)luDt-`DGqM=-hf*s zhH7*eo4YtN%D6)&t$QiXNk10#@z=j>zx&M3C0GA9-Ug2}L4s?P+7pm+gjGJuMTG@+ z?mRo6>EdP{XYnD2m=$S>NmsV{()~;EpjG0L85j~Rq&4)V?~R0!h$4vDJTayYRB2bZ zV?Dh?>e#lW}rl%J6BE}no$X2C=-Zb!hu^{n{{3x&n)gLAZX8XruRGC}{KPr5uFz^FP+<0m*rEseWRjlObam9)8}Pk* zl$UxG_FgD!o|{j~P_4ULw_JRoSkY9|bT}iYGIiu7KEW6F*2|srN@V+=_i0Cv$#&pa z;AY1P9RRDl*jxU3Q+&JOoeGt|M_--mrOPYH9;}tx)(_j_aPl1A{?(HZ6PA#fK!%*` zo+Z^Rf{^Qh&`cKUGUJhlo>>U7Mk?%Dq|W$9cF$tVls8@wc>0j%nz#Id`zm2*Z4uq; zT^WV(T>K)r1v&u6^59Veb5TG?yG6EhY5kgKK1S--c>b^P(KCvG%Bxw5zxb&Kj3@&T zL?7=(58BMUg&(pBnvGeHd?Yl~Nk4Rp3o{;BNlN3##;e~bRL@p47tZX*W=7@RA)Fk<+Y=Fq1h` zDS>g9U5TCSBe7z(XSW0r-P2ui)G|K&oxw@xAJEmFsD?I&_~qHzT=-A_;3{w%#f%v590w`BmeImei7E^d(kJbml0zz8a~Z zBA_5RbQHUs;c!kHZVQ6w4F;KzeW_j30w94lRE)=8187o4R!m~nJTGyoFoDa{c=;gK zqRRuzsR zoh2VzkN6ZL=OweWPbU065F(G3;16-yx#!iDzI*+M%Jn5I2Am2sJO)M z7Si@>d78K7F)w|4CBU{awtcEV7l-Hx~ccYX|BDL+emDWUw7d)-0!H7V9lVt zC2ncue0iG?b&ywGcrDT;VBW%j$dKS0l=JQN{7)}{cK_&&(#k)R#kz}NG9&Pd_x7&| zCNCi^nztUV+}}4??fE>Ozf=#E8qw}}dvw${`7`h?ZLbDc>VHK@z zgNx2rMs$HTyza%p%+W0z6dGj53lMHK3;7OE1NvjKu$Mt^?u$v@mmn#rzh_{rPH zck(;WTY4@B?XS6vtFt{kBr;7qmttG=itgNLSz+gUt^)aCivRKgFOQX}(EJPfCuHK& zu)?cP10KPCxi7z-kCCU2I)Vb*3LhTs5QYC1Yd9*;MK?~l&r`AeUEtqz@Vuv|kA%O@ zo`?<#WM5YWAep|o3_#x>qR8pzE3~R5HW4C)*r);E*r@k!9P7RJGRs-&WQ*^2 zUzT$qV-93F8LpLNH9nON3<$~yc=Az6!Taib%GZL4Y!kb^Aa#UVlcO3S{_$2+^AWnB z$4h9Xfi;3KJnC0 zK?^k*p{U~g+s}WyCwU#p?%WTbs7){?n|w@~&V~)6@Tbv2t*HVM(e!OIs@WCc_2~2U z9p|Yd1G3Kd72SAkXl35&XaOf2>FEs{yTy3aCtws8z~aMpumuvqNp}VXI*9P-4~?}5 z`0(8@hJ|ZxYpCN`k&74eT-tYaA`LC_ zxSwUL2d#k~F7*8ZF))B&uYw{k<~$c6oOAxLc2+rzAF$yXRfai{R!qRoDBM8t4k9y; zh<_M<-gxuGKZ@UNy z|6jJlWbrb=+=_dE?js~y6dbnLF*pbNTH3e`K<+>(ED~*70q%=w@j%RJE9Uz;*5D0) zNEVRg4)K>vpUe%61jYmpb;0nZsRDFxi^Vwc^r$gxz*@E{7H(?`)w{Qmw<Tz*W_(x9}EZL%-KbaxBQQ*x#jlRp@K=-(?HDC9oLnDwd`Z&rqax` z&rka7al2-X!=okIiPQVs6%nU|N^+MX9NhJ}rRe%jP@inD~A zC;9p)h-_Qzhzmq>^Q@w1y|z!l*{&Xcl)rKhb-O3EB&swmVaDt5H*X)A%X21o?K#~C z**afrLGO#YMeSQU%kV;(44Htx+Dg(6JdUa4GqmA1CX8_C@8)RxE<&T=hYWk zX1u{Cwt8?gn)N_*>Wp~oVE%g~`~gfxrCyaZJ0V|v81(LEvF`f^Pw#Q%nRA`#5GLBI zzFfhB6}6GD$tafpWl2vc6Te$_VYW9|Aniv3DMiTK$bgBh$wlhUW$Hma>q`oVI9sG` zt9u)O1V^PR+76}_;uL3>^R@Q^W+uPs7pYI#6F85B0Ks}4Vf*k~+rP?Hl9JG*4$u0R zwkGW4I!Bwo-b#Phudj@_g?d@v$V1zA5h( zpS^o;v31y6z2{T<*cLlN6>zKd4?$Q8eCOV~j0^l;_I$ef&~|}-9JK#+C%8n93qNZk zx?mqJgw>VU{JNPYX$mBK-tkqiVSZxf1?{D-gyXLflqXq)W{R5r`+EjYy}chCN3?vp z)u!HdVfWb>zKSDLL)$Pv0^d0V05Q8wMC|>b;E(VMINs6su5&*xuR2U1HRXpn$H7O% z@nA%T%3AN!Gr`o*#gBo0pDv3IP`?OxhJ8nsWKV(uH>=;;{we3-U7Z zTR1+@wU5$`hK2ctGV^L2`k?KzlETJQKWqQ%>5@uTMmIAcN~aJ%2lVKz{TSS5&STb~ z-k*jnN8t^X#S7RjS4@fS=wl;Wm7}$WvRsZ*xZY|~P-?&m^G1S@+CzhF-4eBO-ZI5o z(~_LQjH5ko^-y&6HKZWzW}QzWhCr(a3o#J~MgAvu=>R8awElK80tfML zHxQVsov5NILzY~!QWZEA1T!R5fT$LEHZDl#iRuzTA`5s}_3>M}wDmsnfzZUt521WU z6^hwV5uuz9E~uU0mClDRn!HLvDlcj6&54oW#}WGDRCGK%Q_|-}!G0-1tdH;_MS^*| zw5IYtHWO(~mOhcM&s;?W4aeeCY3F(ty#-(V%)Qr06qG3P$CSBvcpw(F3n}$CxX?)X z@u4rPcZwI@kxd1)*ML}fj{L||?N^O0--Hy-V{d|a zxIn+1cIS(N8o-~UQD;{z#B0h0oi$Bsad1YF>ZtVAokY3d^|AW}9fO&axFi`h=J_sHoEKUHTNe$LITZS#|jiK%Ld(H#5u z-`X^R_4~C1$V-a%N^w#?9URzZ?%I$oVqE3 zi7<*~T2^cige{RYAf8o}`&j81{N!Ua zY9~_7@<`1R^!0&-t2#*Igon?>|F;_ZkF&{WiGB6_!d$ahusQ{_QkmJUy32@{jsUpy zk^Q*|14-xcNpvQ+AY(XO2fum~MtrX*p$_r&31ZQ7>f0 zc(m9N-4V{3Z8-yo%zE1VB|R#1R8+-+ZzcFl-iiXpXOIy=UeH7k5B**o?+p1mmuCH& z>@k8B;YLVm|9Q_T^L(X zv81NTs0;3wN9j7k^Cl0MuYbCjoTZn%)8wcKC)eGX_H1cZFq;p!KAIbUUEEIMmoO(ppj%#s!{lC*b{89@>-&aRf)N_?j~W zu16`{W&FqP|67w6KvkPLlGeYpl;yA<`;_92u+SR za{IR36QL<~BooXP%dlU*M@K1+@;wFpDM`;39TUFWx|n?ZaEI--syK*6Ws54>EadkL)((B)1Fi=)X8JTFTZ=sy~lJ!(rh zf{Fw-o3^|a>1B#H4hEo%$7LGau1(xh!;h@)0bFjed=1(uLX_%2CkntBq!@ ziZ}=ldvut+G$yzhFA_ z0DC3P>waM+-ka;OY<;?}mC{)|k<7}${M)M@%jlj@GV52A_%r{v1o-M|@uV^*p9qo! zoKr?K=jR{vpD++_x_-*nlTdgHBn!ITf7=Kyq&m~ISgOhLQI<<{*<2UDF)dKht4Xtc z`rtk}tQF`CEE?^!2Y&Dj2Py_V!9V8ZSbBEj`bw%wtNpRv`cx7p6RYayAX@rOeQA*cT((LNd-R5Mx^KZkSK<2 zw)@p`4Zqs%vO%E3BkLT8wPji^xj9#YKI&hoZv1?vcbAbtmC~2%Z3emG>XiVGVgl<) zy!^j_nCtTEonboWrmaH#6vv6nfb!&_QXV*R63PO2JPu-S@L3NQ#WmT<<1p~@Um_B* zJ*s+VGxa4W!i>{roYK%FwUBSaVN2?NAeKD8tn3X9S+u_X@Q7L)5nbxj{ZuglC=*h>5zvrQUd!zsI>QsGJm{ewe zFJae9i=Nv46-U=h!$9LeKDcJjT@}~qoyRICEuE-LGC`NrCG*N%KBO}-oQsMVv(?iX z|3Lo^c>wm^d(aiRfJ9z`X&zs71YgTq+#?gqj-JXCWaPI`$_bZEFDbw7R=J6HQ`c|Qcrs)!g@kI~K+&24`l{cn!BO`YM4H41ZM zK#=&ScYb6k(|>1;)^3^%RsZ80rsZIAdFO(JjUn+{HuV<@c$KRgEIX5>@wMXXv2gdX273@jas)c{ehd z{}oK>N}B;Fcc+x`OBU%3%P?o=DtwkL*jlx$ah>}#ICo#C-ws! zNDFW!cVlhgr`|UBallaiaz}_HsnkQ!1PK1|5zbX1?)GBsQjiDpZSjx|swi=om2gs2JtavVg7?q} zyRvBpDFbCo0+FS@LE$%Noy$hoB;ygQ&70FB0mI>M)n1rNO&^J6oH7d*^%cOqVVJ8w z{Z7-A+0Aq@V;rA3Wi84(>>Y^x!T}1sIqr|6ov^R|cAXB@K4~UVNf*(X$dSMH7B}iY zuduW5WL|YGxhAEgEg6@0ILx|jC57FuJyB4?5Nn@qsqr^3-S4B(t20Nmg%6ED=#l&x z#A6n6t^gpyB z&3{ku3mx#}c$5V2E$nM4HFwnudXWzis`;RIr>a2Kx^vJH^3N5L**qdB7IdhOzefs} zfqGlBQ@+(k?%}yfGkd z?Y64{R%}Q5H~IR-sRFW!baGV+H5e~>pPP|SY<301Lv_qC z#FIhw2eUng2!Jd6+P#9;`X=WiBbqhCV#Q9y5lr_dhgw#{mhxGvYw)$xFXG&q2&R>^ zH{KedkvJ7pOt4>O7Ww9UCE8b{wdg;Na12qxJyV;gYx6OQFR#C;uF*%E`R3@Ag9{q`FaGo z*rRc}t?HhqX_*&l!saWgm2DgCZ=#Uv&Cb^sbO8tDSE+PJMe*Q9+SE~hBq~B;b-xZx|0R{%75FhBduioPkLOR zS4__UIyxFdgg@t|0|MLVsq*fMt%c}C(_Wswp=b||IX0HU?Hs{puTutJIKCWqDe+%z zMN{N>th1{4ax{HMT$^OngmOo%cH5H+!Fk zZ4WFU5L6^EC`PI*&*R}SVX`#RzjPFfO&||n*tRK zU@y>z{+lkD-I5EOVapAXO1}MZoI~e}3aqOV_AQkRfA(WRv`)lQ`{PGWn30a_bTC(Rr92I52Voh)E$UoLI|CfikL% zZlh;|o82^+oy`#-rX$iDwsLE?)U(Q^=V{2s%~zKQcX&7o8Nx8_F%WP*RI-)kWKB5Q zSp%NI>wiYrJoUT-2)rBy1}fZEjE>jD_SsPXCr%(zu9bG3#4+5u|K)KwWjcC;^m&Z_ zv2oqWzl1vvcz5H$8qsAUU?0@x9xZnhY(1Zc7vmG~SLwHM$#r@tGA86$MY~cH^13g9 zGPwFiLTRkGEV3K;Od#~TP^ckhM6il0BIu z$N(TO`WBi}okKr@l911X&!f)bPMHF`RmUj&wIKz)k05dcxuIJhkD{3#rMv&GxiDQ( z=udAzKvU62Nr4~3*Z;3y&iSvh$$Nc>t}$&1oEF@R{x;Ff<~U&s9`22Eye6A*7|&5F zP}4bnS?b(MOey$}FPUgvzt1oNw9gH@O8Xre=GG=I)DN?;unc^1?}?u;1_eL<{fkz{waSGUDOU*75DCe)V6iJ2wbr`;zu6Tl2%IujwFdyXvWlj!*A&6dP z3Ww8rx5dzE25Ps=0U4A~yTOeuGIzMNvfX0MQ3m@8%Yr8yFC$sUYL8 zc^5>)dB;U}wTpGKAY{|$5dmkqZFxowt^(O^KPxSoGl7Ll6kKfo6|_$5<0?o{9FyNy z4I9pIFKr3If@(AO!Pi#9%+Q=94E;a`V6BUFTk$-~VRjXhnjo zF8?ii^!VdubXCN-$&B#%%(m{|O>cZXnz=I0 zp<`AYt+yNx9jVo$3krz&sh=s>j(gwI?KilG5pb^CiTR!qNIO11q7FnQljY4~1!b|^ zk?9OpmnrA<^MBrC1G~QkO_1`xp4wc;U?ic(B*;xRY;?uWNUqPov$(Uo1jkuyj5ktp zk5LN60yteoZ&>7LfxZ)QTIE7no z>zAtpl}dQL*KSr-4P8SF)h(a7$H^2E@PIQ3<@9OIXZPP9L{ueB3?`rau6cA4f;;Ko zL}t1Oz8cEgj0GSAILO%{&u<%zR9>+lc5)$k)U77@yQ=H|JbpZDd<7qQ>wE5)Qa2qm z&B$_-EDut@uhru36qybcd)~z!q~9anm_aPB3%x2b3VWWUa|wkfado}trk1R2-r#++ z-n&5YQr-JOJOz>m=$OxsgWe&lPujK zv&ct>(CY9skrnqhJ-`V`uXZPH&yNZzGTu)K=3?SbV*dreiQ<>x|Mi~If4zbMaXri| zwALS;HkD{J>O7-VZzP2hgKtUwKrW3*JwNHC51-bOEQ~IE0+32fp(<*PmDlND)0E%L zL~~qNk6;5);Njhy-b3AS-1KWVpQqu6u!JgCFk0==&w?I*y$BU6tg^B9I>dm?)=UW# zqq;^#-(dfCLyh7m9h2O>YMw|{(5|SHbGO2a{bv;Fr0bFSd{i9|9{MtkxZ{*vy^OvL#L#Gz>|svt10)uOayiA2ClbQ$Ox4%2 z4&#WsC2BXZrL?u@xC4f4gD3N$|64iXX|~7|!3BVcPiEf)m^_l8p8+AgvHt?X)K}N8 z!w9k;LvcR!KPDYxC_lt8jh;61xw?}g;h0@9LA{7{!}`2WBq-w``kKUW>3DAwK!NZagNZDqw>AztNtcK&8VbX+B~`ag1e zSmB==iXqp^k(;i89(9r)94@z>{oxj$uQ=Ai<;Az(%}wqFhQCrgd2VIV+$ z`lE~kAIrH~M~KhPX;T+vL&R74YXedpk2QOiGMLTtfE#)JG*(0p#rwVlkh;(A-@3b; z@)(}6dC4?f#t#3r1K-MGGs$W*wIZzxmLK4z5U*vf-S2?g_?K^rC^9TFFeu1rP{Gf` z8z(CoAtzIRSZQH+&I^jLrA@LydkO`IiOP^&Gs|Ab_A!{GKty_ziSNt4TKp)Y9e~l` z4Aeh)KFU#xw_mF8kJzd7<0?4gOF*Ma{boXsg$3Vf*&Y~0jq~&34=KqM!<9U>O@VDQU z&C6wRkiE8}YmSvm`JEJJI0VKuyrB%yy;%CHj}?zHClJK9n9riOaS_0$QnMPDIs7|GYez{FFiRlM_44b1+ zGQn`C3q)*=ByrJ`Fiep~gC5+LQ%|DdIt_fy9Z4#O{Qmw?ysknXo%ypQx%LzV>5Qsy z(g*m_;7$svkcm{52M^I|92=n14U_#nIoQsI4l&e=)pT{*YuNzdHlUpWC}7@r8Y`-% zF60*pVqM1ZMcRA~k%`R+UbNb$*-E29lOlC;6^7~3N4nOrS7!_tHlK)*QGg?dWKD+} zMIP(0c4j-3w>SyPXU|IW>m(xXaq{-@dO?Q@O$h!Xe~g$$=cY*5S^mg^wo9_@bZT+rIQIkr!Cl!Z6*1BKwmy=o!?SX7V=>ZvMv-$ z7`zG-cpy+Y|`gPn0j zy|KM|#H*5~nV9-kLT;tCq3+${`6jojb1Pxr1BF8-lU&gQsgClhU;HO0#jP3{5E8x%*p_Jg)>6(z5 zZTY)K@X}H@V|D4Susxu@)0ZKxr03ih$TB_w@tsf6pN#W7ryNd8R zO-35}+pSG|6b8hx`BqW>#uXUMgCX^X-x(VQr=0cv;)+j{>|t2#P#=TGtt_C)e7%B_j#F%lT1pOKyEQpa|j zo6&TWw?X&$E+*4Xlt96CHp-WkixJ=C+UXF1W;sd_9-;K6^uhy!Kl-;cUsYGS^1{wo z>e}l<8j9v6+=;172clTW!og2gf?h%tDcDB%6sz=KlD(`iG~ zR1-v|&Fjf6EBNAQbmA3XB>RVR7wfhPZd<)e;^`Wp#OMtus-$qpALoIj1+5*iK z{t7Np(_U772oC^9%vG{(9kBkS7B9U6zGbSX4MbgEaOUY1^qEK9rUwm+AI(+&F>D}; zWS%-t@e_ldlI}|{+XGp{O^*3=xRj?$O_anJ1@7JZl3wn9bjrZW+Qt3P!ep`R4syg* zY#DX@j)*w;A5)Echdx-FD0<1NIsMDhR)8p8tDM@Mc6oFyFZ;`=^qE1?rxUx@g}G!l zI;_trF;y*GPK;X#e0iclk5BrapBnSM8J~x0Hycu{p$kjHbNLhO5N{&>%sj8pq9O9o5w6t=@ zSx!CCw=CQZEOD+o_;SgA{)zn?)#sS}-DLdma#^<@T6EJA=3{mA4ZkDZgE+llc?7`h zJv>blxcSu&uq$&MA|Q}4qp-}J57Z-;tb8i+3E7QPj`5bp+)Y*#<*kN_1K9|rC-_j` zcy_S=pwy42eUv^&awT$WlQ(nxO+O=o@09x!L?Q`gPKG7=X6-D#!@{3S^b1eh>T2Xf zhnmh6fr0+?iCoGaD>a42(ao0YnU=FF0>RUYek)vCg~Tb5p=HDR${HXH4`jgK^li81r(Vau^`w zcdmhe=h^E>t=wBHNj!()I#;K*IB8-tCu}7e);|2wuwCS?S!rr%b}FM-Cl-k{5xCmQ zp=s@!`yH23__3+RFwZ|Amj6}!{kSy!S!c<$QW1$=t4WSLL!yz*OTpC1jDxsFtJp6fZDybp?)xHaC zY;%I?zpD)z4#i+ekH%R67zC6Vwn8 zZ&$}C{7S0z_i0TjoPM1S-Fr@U$_(D%x)&r+48Wiw=FhgZitnqIjq4zrboQhtVTUwTe|g3Ai=;zNk{{=xZARI(fAX?j~Ykyme=s<@roS*N29 zz^U=f7ykisfqpJJ*G2jdx>{{?ctCR{P-8NcfIRSU!CPcdyyNm)4_F7jG+7|*UXI>A z*|c7)f(H4V?DczafM?rR7!?QJ0;j=cvFXnZ-)LVH5NAz}6xA^*HU4ieJ9VU?!FrOy z1ygv+4;sJokK?iY#KjHFNNce{^)vC20P!D1i(y~ z=7g*a1zuduL;S&4!mDgkcg@OKRmJz+*P7Yh1YECR8{gpcKR{sk5%4CGxM#C?NLq5& z{Y)h4x$TD<>41e#?o-jHCQb7eQU(^1Zv{K09Taj+FGR9e;UWfU@~O(df0tNi{0cTK z{yl4J7x zo{dnI9Y^c8RN^j+TK-=(2zWxez=gV&3MI;g)}D0AcRkYE=`m0X8FzK063=6Gss-+pHT7q@{oIoj z>JT(b%AArVWe-vM+e@dBh|)CQ;%HxKScAH9yVHBW&C>z%t^)>oMf`tuf0$EhlgZ7B zodEM0x^_hmXozr^T~GUT(s^CjW^!H-tr6mY5PIpf1|6RMsS8*6X#TH`wAR)aQy0=H zZx=uRm%t7$qd-29g9&Z(2U|%9L--pHL-8*GB9b?ui)-lP{$2a69YRf<|JwctuXk@L zx&4{t$(*5of4n7XfT!IE^sd%v@=<+#tVo;pP6C$mBL4L{Tch2eNeUR`PFQ+xL{pUs zq%zO9t_-YQm7LQjpRIULCYSz%k3COvT+^ZX$!I0Q{?J_X@pvOv>evaUNxAltW{jYG zy-FDRSF}WZY2a;ZnmwY#E_OJrRb$iGf6CKB`fN4^w^KY;I^jRfz!|JLbQmcB}F+1MiCx6F6~euyCuz0 zd~4G0EIaVg)fsX-B^dw7WPiur`)DQVEjsfm+bXLiI1mts9DIavl!2?j53ZFZ?ajui z6pxOsWq5>0Ml;U^JoxN!5&NlR6PtE-ozG~aRMMZwgPG~DTE(FpHpsY+1JxmDLq|B@ z=dJE6e*CrM59e3JVT}$Lq|SVSfmGglPYZ82!mx`0bwQu6?(9=2v%3BTD6SgkDtQDeS$9{uI0sMwFcl$- zO=mDo2(*ebXeybQj$*eZnMmhX0Uy%@0uYIQxoZ7a@^z4$71lO>OP=yq<^1O$G$;XE z<5r9lD<1!2&^}^91yCdm^7&Ogx}JpvM2qwf5E`8wNl`m8_Zq7H^T#yH{8s~lq$X4p zVB#cp6yH_YnVr{)o~=bvl7P~+c9=()3PpH)j%^soIFE^wT?{vA7Evu&L4q*Ly}MLp&7pik&5N(0n0F zy=Sj=!zQl_Fq(Ubpvh~Rmz{&UIP2~ext zgsLlG6!kSMwFS|~1=ot4WD3DVoASHq=`qg#uP=y6p1+|mcu_fkgnRTC$fXzXu0G@G^P9` zy{(8t+EU}uox=38OFr?%gvG?C$u(^R z>)_TEG;eqsa`n$n^TZ2rXL^RcMbU~3`QHk=`Hb?@rtF>7)bKkOt~o?+f9^*4tL3Bm zU@!NWZpSsI>^TxrSo3_+9AMFt;Q5ziqKE5kP(=4^}FCz?Eu0!O!d1v!Zm zmGI+cutCw&qe6FlW3}@iS5v9FyG2jEy5e=?s%}fOZb#i}C8v?)RPAOSXdKY~ zCzqsY@*Tg~exo*SCB;*O#`_DDrHpldy{l^0wHGo1nVepN5pFO%+sy*6)RXjFm$v-wvS8fAOk| z(kL(DwCdDQkyHr+f+;4d{8iNbvS6qrsL#&Tz<5>0!flvG&mD1_UWF>*{noQ_NS2pa zs~=(|D@*0ha(Cm%h_vIFwAY2h(F)Gb!NEXjED&C|J*r&tykHS~P-8+8ZbALB9vy8w zUZM-L+DPaq1NQbM$hKzu|=5;8Sdl{%^l*9u}w2gPNmVczf>qY zV8Dr$p<0Arh0yZqmr5kwqT@~ebVqtvhe$Jjo87>^Zfm}dpF~%?SRM$# z6zY?ibOxJyzAE~ikG?(Fd(uwh&w4DX%P6)+q*O>rm}U2#_ps3)t8lDQH}KbPeUBC@ z8)*Ke=;Jf}uf`|Cz??RPP0Gwn*PPkixzK#Tm?F{cJf z?D;5zQKHS2Qi(2&ouGjB0WFu|pQwHFcs#AySRE$d<}<9QuU*8g!iY3cI{=WkqB>4% zK-BJhNe_oQQ3&45JDRVh9><1GeKpD*SDRbCOE(cU#E=I^P066vqvLwL6=OnLu2HP? zos>KRJG@r;xsJxHPIFb0DXHf^FmDV><;`q7h>2yu4dk?M8ABQT@L5h(u%FHMCBoOI zn&_esZ`Fb}BB=rkXMPfKdqui?WO=#O>%XBvO1hui+E)nN?#63Lb1ucBwA2CrFC-`d z0kIO*IG4}b(R3ik6xI8ktIP`5-22oW4x{hR^ZM;dy%0hC5XkBS5y?<{a%6I{qwa9p z=;uuiNs;iGa_X>$dakZwfd}GetM=Ms3OOLnBq+ow+lQ?vl0MDr*Q(L92LbAr zj;;t*4}jC*Ty^?EP@`z?_x@LzfmP%1U}#oDXiP%CuPiTEiG~fuJ-&OZO_D{-L9`r7 z;0*)${doWWq+-3WQ26^SRL3jz#vf87FT+2m#7maWJWHPQ;T8DPR+1KBSO7DaJnY?~ zq_^I_$4;grWo=Hc2}}WnE>?i;+GdzLUk;bpkW;}rj7}d-Gwa;_rn#3p2+kYP2cSF| z9FKEG+jP7^oiSQm%8EPLO$ z%eB4u^HxBEt&Df!*DN53%UY%JxD^46ITE~NT`7zi{jvDXabk6$kvdLz?bSxZf}^t- zDar+6>b8401dmN`3VVAO5GX`BGjf%50?dO-^^@lzSW&jO0P?O^!H!NSP62>+ zy_#jv)6@R@Pt=>;_U>tXs~M{&8a(UBwP7o445yLfW|cvr7T1958?_g%yCHd`ASuN}b@SJZ=84^O-YO3<+Jp_w{rpNRwbs96 zj`qBO5h|vx7d2nVSijP|2$o)C`HJjLd%zNSU)k~w375k{90dLTrFU04LsY2L`yav~ zT|~RhRybX2KHnw@NbZC#B&Z-7_g?-PY;a)LiOvlwz! zgjz8H6pqO5Uq96+|+sKokPQ_QCE02@)|DlI`dMKN=7EsqxdSL@i-^GTRR?()rRp zhKIZAF>8X{DFCb#1~0uRGZRS3>G)LiG9dP_Y124s43DEMfx^QjtV)fA1K{4*rvti) zZUIDY`Pt?2?Cgvh8O%jE>B)JH<2{E<4>C2cb@U0)nH->7!R92g8bZ2t+>Dk$hsD0oE~B z>A>6oXH!VwI~yvvd!}1@;&CX(=QmDDM&X||GKxs2U1_zwu{=J>DQ2t2W~q^0fKT<`KX;XBmQ^pA&* zJc|**4Cb;TiQR~&O9pD{)K|E^6uy@4Gm(WgrO7*9IZr(h6y!f<_wZMijXhW>ZlbG5 zF^2O0l%J|4sO5qKhAW{fsoQQFM9~kdzI}@omFrO?epD%tY7Rirecm+^eV7`T6uiHX zqe<=1N{ZSndMAPomfB3b7&b7TTKUFf(=X=mTljCjz2yuzLmDiG)C)aP6&cNJ?wZaa zK{Bt5Rlk)Jr8sEY*jU)hF{%iWFG>ggS2=#Yrg#cdh~9(@QXX!20yN3K$Ad^anaNX_ z=yhki3mJkZDYb8~?>j=|xx=D=VPPbp8_~ms%8Lw@ z>P$yB|I%ht^jS_oM)F0YQ}0MTFrEa`-5pg^ra&^MljlKl9mh8Nr8=*2eVv0`SXQPk zb}a%40jy|M$Gm(1Mz^-<3(9@@&`7gy=!Vl`gZSvzFZ`ph)8loJ|4i$(vVZZr@f^zl z3PSET*Ra+a0BZe_`nSa6`}THa=lxt|5h0!s%*RWff4ml2hFk#LXGtryT1U9`yRO>p z%SqzpvVZpO8vEbW9!>{;C)$NsQ{`YQUo-Wo?~@~+7zitLBuuX6De(}|UC!qLX5=0n z87f*?eJrCRxw+5dn4%W&ieZ*Cu6S9z zI}NTn`A4qQ$b0<#qdltiEU7grstb6NF0Zk$-hv$gy`!bY9KX$5ezh=WT~AVSA_nro z`@OmJtMl3~{cG39|I4%YUu-28=|>R=P|Dmpt$`-w!)3f=WKH12H2Uma$SH@*wj4DX z%j|)J{Po>`Ah|q0ukzWZGOqf}r~O>%vANT6wj+iBTw?=%7RB}K*23AP*xpal0wbTF z*=pX2BCP7VV zwNCZAaW#B4V2g_Oo%)i%SNah47O>%-(ult$Q*WD^HPA;*K9MUdn5TSn>jryXN7V_Z zw|eUu0zCoc`j>(0$9fvVPapo8K2Z-_G?VUFcaypD*|}i#TcDb$2;1W^Y@HVl_5sqz z3w<*>RaFCS1R1w!1W0E^W;`BxW67%Qd6IB89Si==mN@Kww{ve8qVAHMQ-5B`>?K?u zA2tArW~A$M6%tw9A;B!75Yr708{$9o)gLVCCeO?YI1dg3XQblLK_T;Pstq}#i+y@( zIZ9ysKCi=sNB;CtW&Qb$>84+vq-+C#_I+t^&=B?G4i|HgLN=nAJ%%X7kTY#gZZdu} znxByFc7rhjst{yF_scS?k&}O{xON0>M^}mZ@^5xlh^QdYXl-w*7|CL72i=vMA(9i3ezffAG_swyXXH1rrb)1wU|GjilIg5r9o;!4&Q3?99srZR- zOO6R8=nm;y%VTZiCOu&S7^C&K5aOCwiH@dupzxiqp@$0_Il)9&iwWD|k(h)gF#1%- z$Y7qC@KsZD?M_6}V%7mWcwuca0s#a75D2?7hmHSFfU}=X`OU)q{Bpd=FNyvI%#a)S zgBjRM5_`X$sw2HzRvqv~}J!$?LTF`Wpg;kj$FT2s#XL|6HHj67cZ@_Fm4kkuc@448I(X>gzZKs;?@yhRWu%|}B&)+?MH=q`HdVWm$EZR** zjaHo^A^Wue7v?E^*NAKT7>8r29~Nm{eHwJ(>bR)A{HDdcG1J|6RTn||&zE+(YCn_B z#c85a39%IN9^RXZuj%gIzU*w>Q-!bk%psb5Y}sc~#yF zt=zG#DyF=V%VXB!tl++x%(~kiQN__fbpQU?sKNF!=QR3pqiDGb$oogM7Je3Gx?BMf0YcNBxbxuURWUj`;a;lQGWrP@wwjgI235y5_VK6rEZWwM){^Gy`I#Z^lITT5U|Ck+$nH9>! zZ7@sD*Uzr#>VbPyahV-c}e37_Azs&tM{=m!y;uTjMb6)cyjCJz@K zA=jx`$E;X~jMup#E4Iv5{=TXO2HMiITp=j9{W%;nt>bn!+MhCg4+|&Aj^+fv(^qZ3 z%Za;g?dNKpw@A7*b`_i@gtk5_TD9bSB{<=m4v$BFz3R>V|IQk0gWM- zty%u9^=)%yP zi*AkCv0FkW6*WXaatMzqUQHS8UiHQIHL4J>2&hoz-|6Z3>(ww_Rr%QXK)U-g?UyU= z?Ln6j!kX9nURBkHGZX0@C}~1gkfG`y5CP3bz+ppFL(~NNa{S89S3Nc95UYMTg3d*I zBT&Jw&39$Gp_e>Z;<)k*Svb7!Qg#u8a67f1Z7BJc9V$23a(TKc|60H!yt3LPEHrgA zDF5I1B+p7C{ImT2A9aq(j-Lv(d~kx1xr}3=UWoF;eTO47irjv-o2aZfewg)c6&x2l z^Ve=`K&$q$MB|ERx@INF2EO6-`GRfP3w339=&JWXlkXp1`@6>u?l3R%-Ktmvd!2Y? zQTZt}1;O0$^@GSU@$z8F19{>g<1yHNC?r}2dmOo+V$h-g=GD_mlzhR!03Rs@P1P#? zLT1rAGQ99t{*|6uNT0)4+2J=My*y*>4_t4*oX=IAy3`_LvfKv68XHAl1=PBSP%L}^ zwGX{%@$q;)v4)u0UU}CB553i}t_J~o7(g98mNE9F(2lB@uoCNuAh<(FpD|uL2A5C3 zEu_g^BJ^iP&)C>&2#sZk$1BA{2Fv;L7c(H8NBT3UT}O7#bFr{J4IM{`%(CD!)hxfu ztIrX%+Y}zH3Aa}F7+8z&)8Y^bJA&GqH*Btxe~aBtp`rRlGm}A~bA25_@MmTF*?(={ zlx3f{$Om>as#XV~cI~f2ajtuZVT9IZ;S_fEV7nRXgq6VBQUCRThr(0$pzhATIt>XJ=6d?8A$UN|32( z<4onrG;`6S4+CN5!AKtu#rzI4*G53r43KuM+8Tf7dL|>R{@<{%#0i*jziRWX>{XpS zwbbr8Q^i*EX}`__1SE(z{~<+6c~Qe&u__y_#g$MeL8x({zzL)=@a^%ZH3gQn%hVD zB;O-{>ID3Me7$!(+i%+j+(~~`RJ9aERa>oDwQ8oSMysf;R%+B9ReL0A&;8ub`@VnqBgyCEdw$RBxQ_EYj_bTi4V&<#HY`sD zKk}-C92lfaCr3%~*iXJhOs?SPe>gNd373q2UV?@j00W9^jJg_y4Zaqp@92s?07*XO z{At<2^iu5EOWPble%YN+Q>BxAmh#*AMW?eyn4Wh^-)!(Sxv!b`@cKo3>bW1W3`g;rd@e$n2e}TM&)Vj8;57620s0jS_K<@% zM5KLgf`v!j0GK2QP#wOoQQjBpu`}Z!TCWSuyn#|!vse86mQ}`rkm3mL;|szA2d3Q0 zd(Hs@A;#z>)zwKhX39eB;WxR*eZb!jOZboQE}kE$k~$Viw8<`(8U$#A>6Py#4XCwN zCFDo7Dz+)uzhNO3YozoSbq}+%!47{g>*C5;Rj9@NQgQwH@hLtq3P~OyT<+jf^s79g zObpPF02)<$Ju{e|G9q$yRH7$lvw>iso7lr5zqmjjQMl8)ia;I zK`2^(Pmjr^?J@F#46LiQA8(MWG3b zy4?WKO`~N`7O%Lf{Ly^8gW)KSb<-^kOuk1uMF7q*>Aaymf_wT%z-2L%=&5g6eLbpz zj)09q>||qjA292KvHaBWeAJJL(im@fqSr{RcAid!ql7%x`_0pArCmH=$WOub>n>jL zy5i3B(U!aC^FwCLQS4aS(*%09AZY|IO3Y@1DtP9>(zqJ0h|4ktf}o}so0~*^Ri9eH z^P?FA{e>Gczj=X6C7tb3By` zt;f3Yu6Oe7j>^x!+a+4e_zcGLeuT{nd6Trh@TAEOTvGl9p-BpieU}a6rHTkRye09EW zSPr9rwO#Zp5r(DTYBOBGJIl?K`tJpuXO+Ppu|~mPdzK2u26l5ucpQ7Xqkjwhjec27 zH{v{p_}6l`ZM+Kjr6~t?-vJL(8@@j*U=i?UX+ERX1=pAr-OeZU@JJ{>Ss8oY&hm&w zqVD**Yix{`LWe=qVz^MO?Oi~X7QsybPV8e1wogq^Yjm^v+!Gg7Y6mL6#VMa6C{#jZ z*Ic_o__}&Wtg!x^yu|$Tm*(H+owLoaci8oHM@7LnR^0OJF546-Y`5|O0;reu$cdUN zcfWgBmugybYreG$N3x7P6lWnjKSr2eRqsv&zQH{|_7UegcJ{z&O7I|`&2|Ptk2_ts zNi#d9&EtoO4bpvzQMLC@%&Qqczkc!DnN!z?;+cas+Z7h$PE$9NQ9R5!OZfUVkIJ=@ zL*Mu(s7z(*`)%HFG5-j^cwP3*Gq}Z>9N4km*RR{WgvlvFta4u%EB3pVwZe+9|B&H? z%3-5iQC(%H4}GBEd8FM@$RPm&*XlT%+3@MMF4ZGytutGYn?y%Ffmb|y!rx_tUev86 zPZZWEszh)y2W3wkmrXG!ry#du5K}hcywA%%25$xqHSZQ{M~9ht`*aH&Vx04@0Miqu z;C@r&y>3BR-q&avP6A?U;UQl_C!QaeT#syFQtOGP)(PKx0{SKScO90O)4Fd3v=KhZ zQ}7GY?)R&IP1DdQu(RCs7UniM_g$=q13RsqU9XfrbnlzAvCSZPgb=dKxR;ESR<0Au zY1*4=^PhMy5k&eNcH_Laj=kb^ENa#5&XwyooeYlxlJfgUKR%-@ks|l9Put!$_(sMkv#5 zW{1x2*7f2cxrqFx4Lj#HzJfk(>Th6MVNmeWd+%bf^LB^k6<~j(ZIPi~#Yu};6p@^} zRoB=qx>!`k1v$>qLG}@@ijUT=$~%?D0QOvEotVVU`^Hiz{4hEE2Wdzv=j$XCiq3-F3sJ|R1^eGlV;9NqDas|irnoALWJ0NM~RFi}tQRFQ3n ztNbJdA8@{nFw<||hGO&5V(>Tvo&VU^a-Xb7kn;2MK#SN=_<+^0DRX z?hoMu`r3p;u?^ABoz|v2Bv5Bl7emvs$ch0IbtHLnyVEUW7ZZehC;G~T2C5PRk&lgx z;yrbse2$wTa9Ryhv4#XHQeb4>DDB=4%~2GF{IB$X#n21IcjLOP&eE z)n)$RUxZZ@_o6&x_N{zOmah(Y9ea5On2n2pN18?tB+$6a2_S;9`vFvz;BN+fSIN_o+ z9@W?_QLXiQh!WMs(6F$durA>*4U!OaBFrkUw|lNT(~~P3HNqr0v?TucZSckz8SJe( z8l^m}n%+g888|dUWX=#}a6r9@g3bip;OWfZY}|}U`P*&5KR6L89{aFa6%w5+Kfv0o zHRO|1whoCu4>DakZml1B?I$ZJgFje$r!3fHif&uzI(L_$`oNYoLX#Cv*|st9o)=E8 zI135D=^f1_!u4H0iGeTr#S!~p!^khM*7SK7yL77*(>iY5ey_KR_=2CSO8N!B&3tqJ z*6zL|T&-*O{i@g}`5=wZmOCjNQP#5auLLh%PSBSxyFzf|IL+0f<{U!2Zwg*XSvbwc zV=Hd$+bzD^WkQyj$Be?HZ!5{f!}ZH#G-1f`PD|P7{vM_|nAqWOld6uU>gwe|@}S%2 z(e(T+%6j_=?epjVaNjH(!x1Yaz_>$f6K&#`6B9;`AjFijzhdMi+3+aU5_!{qrrlQ5 znRsI{R#PdXA{oHbuu%;-%y6QW(`OC7^8eyiHI`JpR-#CbXi~FieDLtXWCTK8 zKv*>HWOOcr_K(^K_QyqZpR$JEDeuMZf%Vh;0SGx=)=CvnP(>w20Uag@;Qh_LCW6(F zn|O6)6D|qx*?rQ0&?5vvBiq+d?zrb`hS1E01Rw+y^y;2@!Q7)*5kzBNgl{l63F9W! znq~rU+dGx2$rmV!dDJk?iw99iJ=Od9lD$27Zyujs?-m4XAf-Yci{y>FG4mb8VzI5eTm>kSh?n+arv4=gUALY~GQSkZh-n5(K*DtBb4WXIe5O-0;efI86^-Wah z<(POnSL8QmVxnYnY9r*`xVtrQP&Du+rC0#yJG%v%zec)Dmg)Euq`q%L7DN>x8 z`{?N-!n-b~OQwNVHCr9a?t5yGnpaXsI~E&{){rZA)&N1;7}Du*bJX!Mnv2%2Vyb7- zusQ&P0sS5&DB|z>wK!Oyb%6(=G|JaN zM;<9sA64v_?^@;1(`50N$v(AS$#CQwqFNO~-G&oU^r7PJnE}{kf(&dhMaH!nNnqXH zKiuBihSh9>fWs4G3?LnpitKtf+*}7X4x+K~EiKP2O%roDc+lmZ?ohtNu*5#M6>Uhx zD?|Q@`l%Pz7W`{vtq$YCtSVajUQ> z!dDwu5Hh5EcL#OQ0ghB#XGo({f7zAhLpRl)Soxf4F3$!6 z&4%YeV`A?vN(NmPg% zHwi#fB{Lkozh1YNz2hJk|OD%n~mTI+PK%pHUlhX#O6! z@}+I3lLtsbArKtMtG6oPmSy=dTpd;i9d%a@Bl2gfD+b|<%dbpoB@x93zyD&$CbDZglDbc3L#4Zb;O)wTRs8O@aMVgw*bR67SCl7vI zUu%YN&$sJ4&X!?ctVJo&8?DckPl?T_0zr$tne>txzE13e7>sAhU>1^n-EvArWbk*J zavc+DyaESO{U1ZYzgteC)z6AqU2fTdpv%+4F6kI-KC@4TCS@k4h`$864CSwRu+myi zvpV`uCv`gMK{L&!L4#KK0XF|t`sfAZ1}+)c$2}&fabe$mu8X|ZY+PYc%Dz)r1fCPh z@x05^+zIF^)ovGWSbuH;KaX~Stp1t+9d?*w^Slf(ZWTJ_jjzL(DyrMU{` zTzOy78#UN3M=GY$T9-L3x0F3E&%(7L(b^J6Nlj~31W^u?FT>C2rQ^7J;`A&7NVAEt z?6Yr`D!?9YfHbv zXVY{r;q+c7kCc>@3gCA|&+WD}Z;=sSBWPw8=5Pm}od{-G{xFq%Ka+n<7GHO7Uk+JU z-GO@i;qiw3_!xt7X=QGp_*K*XfZm!KT1lQ*?AW4{q|;gG6wT688(3TPZk%v1>*mNq z4ILF;%{ALzVyfskVkP6}>C#TB?p;)(3?jF5ow!^d!T}f)>c-2oL@Wu8x(c&i|OX)SOvD~i^ zRA&{O06?-m=qeHBVm@7d|*q`mi=f_4ZJWn=O3{;F7v9Fj zYpZk*&E-=gVb_B1?1qM4P1L5pC~I;=m%t@N>X(HsioFO>WBs#sV^rjL;g|N6wXW}0 z{xe5%mIKoYg=L%cetaPUXl&-Q7J{+E0f)TdyJ{M=T09d8QTHJ^W%%v8jYX~b!k~T0xS2(wavn1Z-7$=O4Wi9WMmI3g| zb(5W9;nHX}RHw@Rv}f{+m+I2`_;wM{3Wt(gm(UN7o-RWP-aOt#(4=`_UH2{h&>se- zJ_{3S7sQcL$OGLOdPOQCW|&-(!`hTH8BhyLk5@U{gWP4|2J&)}yN)Lly62 z$b1^dN!$w)mfld%@eaJb(#mMl{~q(C@v4?-J7Y=f2p z%6F|!)iyO*WBk*7n|Jx;r}Dwvp|xbmiBiqge6|M**PAf*^=_L6@CjY;a1hHiTTqzC z{79opMVp8mgvtmM4rT;#)CKEda7?D=5QvG7I4fW$aEE+3KMMtX8275>Ha!1wzI^kQ zgKvs@YjNIx9c~_i6=_tdJ9RGe4pVjBSfW+qWMrL^uRRoOkBpc7#<=hJW#EN8)x4lU6+@R@A6|+#;zsxpW8_o|q~g+A>yAPO#p|6ZCx!n=m#?SPHai zURu#pc0f&!QDb?2*Bmt;qTl;BDRS17&Ppe}9{TbtJ1A0v z#c_G>&PQq6ln~63RSvhE5G4;`7-_ieD&;kw&(*ATes7U_I2#)^2TY% z^)2Pv=|bjiNuZTk`<*X|oS`qBi|2fN&wNtE=LZ!lL1zJP9Z^xHD^!8Gv=f4i1FACE zi~%3&ifX<_1tpni^S%^%GZ}8*-vjSVMuc=Djz#x=g|P+^g>RQvdMw3}3i#hF^#Zy1 zGgyeO8NH#;cJDUZA4Cj!-AP(aYA%d_yKzhGaR<8|lW}YGUDS;&H3mt>Gxp|Jz2}`; zrE>+WUv3&D^Kr?xU#i9LMt!ps@740X$Ybr@q17rR6nK4x7sd30TKGiX9@FPuswTl3 zczvAlF2LLEy4z>=6zXt1yYkw*{Dc-MJY;6daR^aYym1!;C{*{J^*Z;b+%q_%P@xJ4 zBpMwOlaV&kuhMeHrv=8-X(EVcd&{rjYnb1(`mZlc8=#qw_9yKo+%N&DZet_u5rCbB zFwUTyonMgx3WchA6`#eb!Y>pwj@fqHu+%p-UA7R1yE>+OeT}(V=A}OBG-Ucd@2jn^ z4E{;C$;fn%iVyyGBpFi}K-X0px%>*T@xwmas1Y-Ixz#}B!aJHHtSL@rF2j3dy6U;2 z_~<}N*y1{0Ps`c!#b^V|>|Pm7#rl+D%jos1uRE?_U8}v~r)t8MJv!<3mWp}a$#y(m z##e)0W;KV0zR-@@hO#Iq1Vchl!F%nE!nTg*GGQv7v((6AdRHp)Y_&ld?f7sC?Fb+F zD$}4DLZuH!b(ORE$>BHS3-B1%=!JpSD`f37N^FE)fBy;i5ZFPg> z{g*Toxa)(_%q2xH57FsYo0PLKfL(%+b(E{|FHh0~%o2~|q0C7zg z7lc7uGZ=k8n8KJpH4c|=qj)GO6d5+Z$auU{&rfUR1Yz(iS6tU?hRrZ@3CR@R5;dvd z`*NKpnE|`;W17Atxpz_VXq;E?p}oQ~=U~wIv47vT39^vd@#0EULDp}n%`2vswu$E@W!8S(!N~b5zM|{#NzQAjZ`EQ55k- z#cV%cQCsjBh28|a+dQmq`a%aWefF~0yCu2ae)0?_DEM$3TYxcuf?EN%&G*4-?kyg0 zH%XBCX@u*nGPW$S0$${F<1A*0mAoZCZr3Ju^J!;@_XNan?4GzsnA|E4PepUr60u{i zla~`6c~%S?BJH%kC+mS+;HB^#v*=Gf(_KE!H2C#Vb2;49!ta?+MJA*-^LTXN7(76$ zU5Y5)#O_4sO>LFg%{=G4CS3x2ARUWNd-;x)@RnR(QP#@QA4u=`tlqY;p8Hz7u|GYi zf@h|@0~#on3-RqS92L`?nzt@()cz&7zB8=~yrhj7?Rx<|&b%a15uiwYfL;h>UChG5D{o!>BhaC`TUdD+?THC8yx^gf{r z`;)r1DG_oK@hnds$^~UxBU+}ItE=sJKB<7o}=p7$0e}_|HF*4NB8>bI;i-@|$gVSVXJ1sA? z`2DQ1H|`QlSz&SO+K7PZHJmCc_4?d9<{)yBhnrE&ykJqJQGoH_EnV|y4lOrc(Y(tS zIT)U>NW3WESFp$ToNhfWd>lt)y4KMlah4x|vpExhOW^gUYA=`j8*@PGi0t8YtJfJC ziFQI3j#57}fqByWvWZI%Y*@V*kF-38u+wx^QI2+B6RJ{OjVg`e|KlV1a1kHPpzNQ2 ze7p}ScP$|&idjz+|6NaG!PQNhF z=8r4FctA5#5j^t55fct*)XSH~7bG|Mfk`>q<{=(3)wv`nzaPSIzv0+*C__~9z^dU|@J^ zGRslfbyYcfy4X3|`%S8qV8CTni-^4K2_!gdARSHpYrn)m(_+HZ1-aeXw$2Kv%{H30 z2V>kJWdsN<@;1?^WjPLTI9{)GK3hIj(#~(sDSFAxz$%!B)V}(0|N8uoK4ywQFu^vb znIs9!g%s~I_$=_w9UEg&C%%(^Ebab+&%WF_-UYraNR^$TJ?9C0?%@jR7?A1yD`mX3 zAdITSGhlrAEur%M}uux25XPOduw(^l=z!rnw?if30;`_Mg3q&b>Xq+B> z`gzpGj|$!DLARjyp;V zB;?VC@0urcR^N3cmUwyc$|$^)yiXr-Rn=XSr-}?&&5=ETg17N`?#SQomIovPe!sC> zJ2FWCe!1tgk1~gE^WUlc9*^lp_K8{_Ia{47JyQc;( z%RFK@2-KZ53Y_Skwe%LUvg(X5hExo^iL(fD?32r$scw}p3Ru{NV3_u4=s;b@n%LR^ z_e0QrRWY_IziY6#Xhln`cO!(oAsxIKowBzN#M&?|i~aZ#67KJA>ciNSy80v8S7p;; znzrH3YD|*I&r*db`42gMktt4KI6{dd^CQ+?bCa-72w4)=LjFULooFQbeQ_9iWw|kV zfYrQ3^?*$%e3V_UaRpWzG|hi{oHDWa`?PEYBJ*CeB)14Yl7a}lX-Pp(3^Ij#kLI|g*VyW;g|h!TE6*HzE?ZDpz>A%3q+rrk;@zBXvB=a zKBnF%4dIrOa_eKgGR^@vus8`#4~TqXGx8+%ndyyh*K?V=!sXxdduzST5@fi3C+Xpx zstE}liuQGWe~Cr?XY()nEX#}(@3Ux;$3(mI_I@$xf$&@r5f>mbiy2~z@#zoR9jv+a z>f-H2F|Yv(Z$@R{`vzQ1HDZS~JwyGn3)tqwWq*|8y>=L#f!%?&thx=2ism~%vpddB zwiZihD*x_?;`1Z+0DG$6{%|w?k#hf4s@0pG$7#|lb?br4u6EGOD}Njbd&Qm^ub_;q z!qzW8aB)7I4qD>{I}#9XDymE9S9b9(6JuHGk8Kf)7x32!v=IYb|<&8>D z2h78o#UbNWr-H$8yl3O~GQGRf?Vv-ykU-H73!*uVGvMg{JJ&z{yR<5ieOiNjc&yV9 zJF{U{H-Qcb7qLzVkXye# zoVX7JSjC}CCvCB)+lxfGal;z>GM$DUhP0!}rpBAqJ3Vy_ATK-K7)ZW9tqao4OY*$# zlw`KgahUlsZSzg7U5iyo-7aUBF|ReJ+2Zy~%jVZfO%#-f`*_r`=(@>t>y(@1mCy8f z?>*H4%RhgOUxb9$eor7=R&x0;b6=rB72D=nJL&NIV7IZd!#>|D;cKaXem5{j1V)w{jh=i=T9O~yQhSck~`^6zVMZz<`bu$(#)mQMF( zHjyzOEwdRju(-G4kp@^1r{6qBZ%TV82V*{F0DgBd7HcA`JIG`9dvYZ|=6(dCB^`Ih z7n3(S4v+1lW?hco4K2OquG*lRsZa86FZb;aaJNz&i+^o-xD7SLFuFT^ujnFx+A~A8 z%E~cQ`GNjhiuiqH7yf<0W@Na-+6`Tg<65jLPzQRDVc+m#H5+W?xV&6Uy7 zC>cEKogb#mo-L_I|(LPZOT0d_YZtyX+?>k&C#s{W7mX1?~wF3Zh#hf=FLf z#FF{5WiQsI`w_?YTK8G^kr5q|QIdVQdivdjIjUHOkTz+0!=#?&6usj+Y|X|$QYTnE z$jbeu(QCx@8S7%dz)B!yEKRhzyeo-aay2n2^K+|aQ0IEajHd1H(|42J+(o{*k<7n$ zaATpxq-+s5m}$A##rHFO_U<>cUngN=jjOL^_Z=BKpZJxF4ZxUp3ztUB@R(=k#~r%b zRhiTtD_!Y)bp6VJWl+Fdt(~@fmG;om1PSks)7O1)L_u~Ni6NOwtUMh*O%!@QC&<6& zvwfV$sYQ;z%YZy{(3hm|t)WF8R*e+o$0b|8ArEKquQ5~7%ST$nUj& z4SD(O!Tyw6(f@?hAvU@RVBW0srA_q*aSVPiRR(i>M4%mPBY)UT^F5rU9XG9i6l57p z9S=zn(R7OfwJ{@i9c!@$PB-04TeGT&EJ4Mv1{W5U0Ei+5FX(o#6?4<$e!0v69k%8; zA2u2cZC{xEvsu+> zZN5M3*4(RtvP_}Oz2iIA(cVNwp=lctlTvTfL#I(4&45kVDc-_OVl|w2x?|gRs?dv1eP$zTY>b>h2nUx&{}DKozT3*kKU#?0fPqODk@x1`FFiubA<0&rK7h#| zI)&@s8I&b4JAChH_0w67paor8I`h=9e_+os&jF(r_tLExC+>+Inq1Fq8h*Lf=iDy8 z@}Mj_7{XJ&u-SaJ64*X=69Mo4jwq|sQ*kr&pnWK|tjvn@Urs=jHuK1Mcmb!(XxR1z zi?J-z7CH;SeB1!o3i>HcQam4YP7szEi2?XiA37;?e{Z_Gr&3^4)A7N;Y?ccR>o_(% zU5ip7l$~asM$M83Gx|24so5RVeQ>)`9VJ!tCO5~U;s^%i9y$JdgA6`v8LbCsZx!bT zWCL-AQ0zS9s%qgbGaIYCXV?k04w((|Smg9J%Bt`1M1NY|tbB!-_GI1& z33;rupE({(+8l>aXUBsR+^N%c$B&CrJJF40Y?#tFWnw|QlEH`D80yb&o%`_fxz%?z z(f)7UYsWlf1Nz6STf4=61nZ^lO55)+l0~GKI8hm|=rfOIml}!b18|k94$ET6@7qj9 znjXrnork(1X&#b;G(f240>%44dXTdp)MpJ^4Gdn1SpKoM(F;5M)Z3f!D7;A(#p6=P zd**l2zoA^AQmNv;!3;GaMNw&mDhc3y&u#$h*Y+U@Hh`E#fC}fPy%XKhz^AANmvhFLj@Hn(I0cW0-VQ zksqHu(xt^NAsOp3E>rEBcI2t&hF)@p?7up+m{!G}O3h}Ww=_yV(zSZpUx*D~00++X zn~jcVVvWh2{k-Ibc4g-9r;J(t{LY`;$`9-=SEfLr;zA+LiutEB4*8{z+uyX4*>SYGWf6qH0&)*E37vu z^n*P;CKg2~h?x4SlCm%H+PY0!*ei^G^L8g`-8X1wV6wVo$NGazLd0z`|3jjiXX;03 zLbB)!7b*nzVlv^j@*3xs5ybJCchP+8_JACJ8txW=aE0z5AE+LLuL)rT);s8TnZn0L zEz_%4Cr_ne{l^EArL3M;^uzBe(Is<;!-CY_PbP^PnRS=4W!i1Rtw!13Z6*gyoZ`~r zsb8cVJ@%$vJI+#cGj{pL$2)7SIr${Z$V&@uQDU8x!}YLZN>hsR>7(5VZ$eeM>ju5e z>*U^KV;bEuMdCBEB-bmi%~=3gr{1`()wSMRYYLUSO%)-3df_=af(AFr&#anO9>tFB zT_5+vJFQi;o?DZ8UAw!Nqls;`ZZoi`a?6%mTAn|_WCeq+4Q_o0f)ysXTe ziPSdCdp0nOnevvjlBud(tk}pZ{?PyoXx-&Y2q`*@y*Z2Ris3Olm`160BbsETQ`(M()lLfo8^gMY&a~ZzF$oc053kvAhNe?*OoLIaImL&+^~XU&w@nDN ziB-;lYU3);sluB4gWyy7a*9dyyS%o_3}hPNSncTDhwSkR+DpBP-qmCYBDJbIWYe|U zHWM=FiaQ(PUR;vb;Ms)id9WrG@MU*(ZH+L2?KGOdF1ur5)3Z``6U z^`KI-bhvc3y62;cY{-Ijbx&uLds}vs+gM?cMRnsKGDoaNlP}G)V%cZ#gU!YZ%>xFy z4t)K2yqR@aD<=D$ssCOW@<(4=V;V7p}uYt zEfSY{cZ$@=2s=W)=?VF3c=*QwOOSzmx!p~cdLs?+SRVHxqP92xU^V9cqsWXZeo(Ac zp&`u_yr>qI@%nZ3?;M$&@Ga;>xTPAO4Z^#IVhZFN8KV!!}D9n{TSrbTlleg_u$_}M=C-Pei7^g*@zwZ+n z&Sx+^Eh^W=V7vI-DsrGrqX#eqlN?ZnHY=hsy$cch#dPnu!`Cs2V0AUHcuQmJe@FCT z*33Dd#LfWIf}EMR8gKvpP~or8R^_9TQI#|Yp=g)2Wb|T(p~7A7Z%^3pDzDjjsM!@3 z)3ePbetAv4n7f;Wqv6hs2Kp7oE9 z;U%xepDy2c@`DaoE_lmEjX5AFXI0{cDeyDfBh~^N7Fg`;ElIrQqsg8mdD&GP;c)v! z0lwxD`LwYQF^iuhdpY^|Q&SgBS&i!=bgVlSl~y$to~Dim^Zs=4AK?2nV-KXdjWh7B(qvrTV*Vc0JGDd6d%>$Owt3?3^O zVakdSz=CACAyQpv=&xhxy=Kjx(y+^Ce>Cg$c1$9}akt3C93>!F+!bbF2FqTEb}X%V z9L0C|K`e0FQ!FKMOcUBHDk`vk<6JboK0^9FsdJpzc^0^tg{Z2~ZK#Pd;(7Ha?AJ>- z1?awI$h4{K04q1iMRfGyH`Av;Hfv?0?e4&8%_-on^HSR#$gXtCLe9bD_Xu4#mX#}p z0ST`>JYN#jtVRka*&4j+jrAeb$SzCQ-yZ%rJ@>g+sE@2wT7%!IL_;eI35#-{oIlPRaUAky4Bk)O zd|}rNmQgb8-7(3cj_(~S6%01oAsYXmv#B&wAF$Nw^fCtgv5Xx!HDyKyes@L82Kz#--tgLIQEFLy+2jUQ+t1M`_Az z7GS6HP@y1Ii~Wx~r-c&!Fhy+hWa#Wo&-Q2%?-<-yb`3Cs__o{~8bgVlEHI4_-FL{W zuoG8wtjH7+RDQ;N)PBi^u0`dLq6;-aMntVmw`@ly3Esx}R*^8ezveybV_uSFnYtbe z%lt!pdvb4;A3ZkhhS$jP@B`z7cc#28yb-E4mou8Ry3f9J-geQ*-@Ds#%ILmr?skaz zi3BreF!^a1oG2)m7jn~If9`B2pCZ}0Bp^DD6!{@~x0kbth1kuK$;qPFlOa~9FKNW@ z&GPZVa|l3I1jGO`aRa*^DqyEnOfM}J!EId+$6#Lef7_7$BdrzaY;xo(LD<*lOdi`m zoS=gmFBu_x%8p-6$aiy>U4X0Wq&4+s7akI`ugLm_BC53hgH%!HU2c-G8fR?A+Y`(b zy3yZeXTa#_Of6Oh*p{&~=xDdeLXpyKLa+-*T>kq#{(zrbB8|aki}@@Krnd8KCI6)#pvAISEZ}@l`2CT4}uOj91=$e3as9(|sMM z%6c*Ggx$&cc#%vEAJKIEC}SngE9-M*b6UWQJ=?es`rxBaTJR-p*H71i7yA=|jf<1t zt$nuQG)O-+$gjd&b-b%l6x+%Nalm70dD&87k1`@xceX$0dfZjV}G2stREb%R7$NnkzfN zLvo9;ezS3NTw_LqO;48Xa~s{RYWs@!2Bk)~zyD?Tp^M%@Kz%q7N7OE<#T)R`g<4^~ z<*n6ka4Xt^EeJ& zaZv}NA1GooCecr;i2QRw8cDHa$< zy^Q_7TRgU|!H_5K{u=~JU=K~5qv>Zj>yJe^uKa^a@rAlG=x(uVrQg0EtWaGq!D^uR z&E0)yVr;PdEbSn>I4Iafv3$vr-udx3C)nch_$|XxNAep+(00a7eGa(Z(+fh8+XTj3 zd5r%DrhA_G#Bg+3^PS_+sOC4uCrEup?_J{+Kw&59G+hp~h*$#H|n^TvsO0qDk|2 zS(<-lO9NDl*`6r8GrCrGLW3zU0C(};-YZNz^LYrHg`r&h1k7yTSzr5D&UPW(R;W z_;cvbaFZ}w9K1AHXMqWJPzell;3ld57qZe7t=)fZZ4;1=uRs5egRo#}698r{lrkSk zO7tq!7@cA`DkP7(^>{zdi8vH`Jnk+D-7}W&D-HzKa z1L>#vgHj6+KGE$LZPcQTV6pO&-G9M!T-HXTKg0j>d%lud78<9vXv$o!1FF&}KFN=Z zXL&L9ZPA$VwdVP+PAv0x^Ui-3w^9lz4A;r=!;!79i`H5F@ho*duTT(h(AD~qt{Ke%(@ zU~-DD_W$JM!z}qTv4CU4aRk5KfUuq^5Y!}Q)vJC`lwALmx5z({P5Ez_7>hcw{Jxs^ zo{FMPWj_koYRGQk%mgu)re-!3XAkm=)Y+DeAS$BFTWR=W1Ua6Ok@lC$QIo3QhXNuNHhTVE+5r1v(>A~M`ja@fyNM9q73SS zn#&DmQtgVa&3|B*#gANFd>LCze3@TYaaP{XnEj;UJF|!N7v~Mkrkpfx$CWXjAjNT{ zrO8lonK~H&AK5Za+>RwO-C1`IN(g5&xIis93mA)h*4+JS%}pSg=<+x`V?2IbHKaP% z6pU*PQzJ*@UNt`*gyUqu$JwEVu`su&LwV1^9#3~*vb!gNsGCh^aE32qZ~mV||2JSu zN43-*+qu1zleLgeYo_W1yLMm(ro!+4`wM^g$IA`%KQwpB^xh2Y7I-M?J^t>;qWd5708iMY@dmlrzW9s3QSIV)Kyaaz>oN&pQP6>>Sa&1TEdjwlX z&(0Nncp?E2TKkVEqs{$=Q-)!+>eDqusl@39Zd4B9oWY&{{H__}#cnw~U`{(_H9S*Q5B3T6ZnfrqK5Nf8=l7<1 zmodMrm4eJerCY}?B*QdF1ah6`&!;$Mdn{#^_i3wy0>9OV^{@KgY}q zb5ytgOlDJ7adum}Hu*5MFHB!0MfI5RO~++8q=6YhR!737UpKFPm1mWaeh&V}!MXqU)M-i8c)L98-PtK; zQ{(6Yv>e4fKK`GO{n?tw-aZ`3g3r%!9=2*enBq;W}l?ew8F)8^n^V0 zda*?V^u)2^V6rEZO_A6m6aznWN?n5#W_RC_FMDuP5J|~yR~xi!?#-ok-}07Sz~z{w z7O9{Gh2*MQq{^)|wDx*o#UVXd@f&8E7dr~Bp3i@HviG}^`OA7U`x_m@w!^Ipdd~*t z1UfnxhOUG44c>O=rrw;e6a=^1W-e)Ml&R()^wVp7ImsclLM|RO8>x+hFO zWEH`5GT`Onml=P|T3$+pgU{ypo(y_vFVpbW634}VH0b`DMgB80=;hGqAX1GOCARmx z*>vf&^$Y31fh+7Oe;4Eb{*4LKsU9gjaQ}=nek>%=F5b_7AIeyyQ<+P?~}+- z_V|1mL7_*ZL)W~I~)*X7UruO(ULKYD+Ul(3xQf%R?Lq+m1 z`r&c>jNi;oCp|I>m={J1sD}NGkw!Xm@n82JU%jFCAKdys*9-mWU8U&7qMHrKHON6I z)%u0PK+=!-vTy&j8LyrHqe@9OXHFcMEipD}a-&IHE6_s!9xXe|H$gFRqyrm0tiIo5 zw{BT!f+a|IT_7l>`%7D27g`iHFU(LUf8Bnvh$d1;%(v^!-xUUUwM*H;$J^3Fx{XeI zv*429QTKl`THrL!>4AyHI_6GeC!bz>@%F8W8wW$#oq))&p*3||$pY&rb@){N@fOjp zU6UNqadPFX{<97>39IwBB}+eahw^%BEa3$L&eg4Eg$`1B1o&}r8S_#Tlr7D{^sCOt z(j0#HY!z_y)T`tf&rIcDzuWj|emdSbW?hs2ubBMDD*MhCx}gg#}KfU+qM z=eYizG=F|Kg!_Xzu)Uww`%pTu0e-9L?gD(YzV%pwy^b`WlHYC#dVXL42uc*8KBtYK zAF*__1HV~&aWg7ccN@Xh%0@(yunP4fr};V70zUewr6;@HUy7{9-Xnbm zIoQZmx7P($f23aiwt8aoPRnKOvt{=VE{mRgo38FswiU;5M_zJR@{;C&CpF%N)tLoh z*8W^2B;GDRC_}8#tT&#Lr8n_5mbz%9BGZ@Rnh}|se$c8mIR_vAE@PWBbyc7vE_OFA z;la_-dJ%jLMie)fn~WlkthDLG-TF^8$9+lg@jF}CD74;j?(l$NWtpmv=75eFH zl~>`&H-*TQr3sG1?#s}4s1p63#&wxI27jE~iarnqs5q-^i;K6LSRE9w*!Lo?t>Sva zu5Ml2o0n3R0o=(F)bctZaQ3}?`^T7;P{(+>Y8qd0rz2F4XFgR#e2?fWyVJoZf3sow zhqEYAguz$s;B}U^=1EjgVyRmupR{~tWI;tORCW-g0w3U~AsFWFxnmdKpOxyGLQ-+*JTaXpaX$f#y1 zP=mznd|xekRXH!lev!l_ut*ZiHAN*!Rr zNRuIP)%l`r5d*-_h2zG=|3lh)$5Z{V|KlZv>|~E)kAx($k4@IeCUUZ}j?82pN%r0$ zj+q_DCZp`VH_3L$cC3@}dwJjY=YH4y{e0g4{QmMd52Dxgy7u+Fo|jR5=xyZ4nayku zQR-q;taucfh8*O>IZ@iXccQ{)?0g1DP`8qI>PcY3es29fH)4@X@S?Pouhq{(rs;xR_%3bn{Tp&tJ0>KUD5} zX@ei77DjT3Y32;L=p7J41)Gt+yU}1*x=AL#c?%Z$EHCp=Ro8xss7g%jyq=i24aLl*&z`HTPnI(L zhP`@&Z*VClL%ogB)^B^}K3A?~%Z<1_p8=2pyT2otI z2`42a)gA}0R1Z)%-(tyjo6Hx9j&h23-IQTpE^&R37ft1gQ< zj-S}VI`{Cv@>Bch3+C1!W1NQ`5s!Y1sl)@jo?xMnaQeow+}h7@jw8D6NW$z7yZaos z8oMKjG}Slns_f-mHw7joaZt&SV4r8)^`^~Bp?1n4p#%(Ku-&D%!)GE-$iaA5i3%x1 zl{~Fok^P0H#A_>c0;yHT>OxIY&6Rr&zcBwN$Q?YeDk{z z$}AVAUY+`Dx_ek;wDh-&{O_f`wfOw;#M#orBi{d-g{oOIx4pFlsx)w3ei51L$O~Sv z{Cs9p|MUN13Hm00QuOe(prCVR|;P1HK*lZ-p^BFv! zjYASO)FI>k)+K%DU&+Yfq57d&J_v2S&Q`EfP#bzXZiD2Z9zs*pBL;1BMIiG16wL~> zH%xGt0uw*dF!ni@&qCJksvPbw+)Wb>$vGQkZYcNn>gEG)Mq8^B?UlXOV3*}>jyUW} zFj_W`_*l~op)1y_4=u>5$lG9Et`Cy+way61^|$f88_AQkO)$Z+O>2Kygn^3+VsEw-_JfLHJ&DK~e? z9sP6AmR1GtZ^<3r^!4()pn~o^0w>y~p;^afbz6W-NhbJ1_N{58psB)% z9^9cUZI~A_ur(_Xa^6`|yB~`m1Fqi(a?aMcrg2uoGsaEEl|&HBx#4~Rk&~%jvZ3HY zEQXsMQ}GvfK+*qi?tq@>ht{fYf(O*(DIOoPI-s^@ytE3d%l@Su2@+kpJru_wKjigLlf$-{MV~Zk%aP2~_eG)8dEf{4En;Xp_cx1!-+dte+(o9F%@L z$I@r_%zKv(O%pwIq(bac*7MBIUBZczelJ%qSQQ=<4V6%L=}hX;t)GsdArBN0%Ad`p zW?EwWRC#NCrEoIe=x0I%X$<65!mnV0nBr9tYjW_DIpg6_Y5v`NM$U`2 z-*!9W^_(c)hsp9i>;58~rAhm~8*<;6DhP;CO3r8TAO?`rPlqa{Pnftw(wPc{6%O8T zcMVa9bLNCca3nAq(H+ae#6ew`LGvA`2>7iltI7LEt6_Oif2<&sIS~L)DEbD>8>ekm zJ{7kVhUfgQR;920Lio1nRkadhqR>Pcak)*L&(;b4X-_fKBL&4IxVNCgE$(QZGOh$S zHC4H!WH2OJQM~m;oleQgR4HMcRZ^gT=7nN-ncl@C#C{a`xgTUkL3voHWPiMM@u}lI zqlc?^i`t%SXTBr8hJSZ6m~HSn8A!pryCsN6ln9r)cG-`B9^PGY(uoYz1i1xi)S4Hb zq2dv4bj*7N!6NV?NY%bYt9mWq+^mX2o_uTs3Y^yy-+csZ$6=eI?`u367Pn9T(a*jn z^DVvwv-Y+TZZkjHU*xLFPW!Im_oo-C6UFMHM{70c0!x95@99}<&sfa>D{u5#k%b>xBK3UkHei}}Tc7;w7vymkOoyC%J=4c= z&DleaNyCe^M56K~i=R9^lS64cTf?U++*x0EKEc=6YaNl%d0^IUd%cr!6)VjR>%A~a z*y#tA6W@b31!jH>GLZYep~g*0s30y)`jckc&s3ek#UFR0wjcYpe>B_cNgeEf* zBgCU@G~f$?M6_PRXD71DaszeqhXfetn^A$Q#6(f>AJW!CY~L-MR~FyTd&vf}eD0+w zHl@{XAbWpvwlkzkY0{TGbSX4KiB6;WDF^-n*z<*uCREjN=l4N9KPLZIMb;Py?w$d zSyrIrueV~fnB8XO+dBTuRQbAzN!0RgOgtt-HXu!$L_B?wmntvibUq&9 z+8b;rn%GcSM%5dS5bo8%;h&EOiA{;7kRI98bA!y1!Kq8{C0gmxEZ(8NQp7T^+^yw@ z_J2*0|I~nge;TL7wz08+1ztBa2uEZT9D^W=vG4}>EwhZj%f8Yh=D)!5df({LQON^n zA(7G8Y)UTbbH&xkhau*CV(1O~f}QS<>_XVY{FIUQ$@pNUhYC}7z-%rXCC%Jmp$)_$ zw>yoZID9?h;vRpVT3owyyU{6iC6P^bymes z+@zXO!~RPxbj^_>tWtxdH%RWPFvd;)Ok_W2i;Db0xzEY&SZeWEzkr?^C;QAMVTr?Y z!#`IN9o8xr&_uHjAWD?f=}ZOq!gFUkk?UI>s{mPFlo-m{aOUyJ_>uC`(0>`lp8^`U z#>Tkr*pgu)`qkxlZ1t`A?!)a;jqUIA{+_Q?(qF|QD`*ET+yO_TLFrI$UGNi*(<+IY zl-uF`=ml<1*lP}vDw|HRlxTCb#K>yBM+Viu!M%Z$3!z~*4BKLSL_Ami8`|4bLSxP` zGkmtPIdTQ-Ri67FST9eEzf`C22Nhz-Uax$a39p#j=5h}mJJiGa!@I^4v*}EZ!10 zTT=YJT=`o8t{(U&8&=9Ot(jlF#?G5plVRk}TYcpA#fieLnZH-T`n3P**H$)ecVv3? zJ?dQ_Dkyn^(2#htJeeBnx3fG9PhrA`nUAY!TD2Y0J$Awt#C09Hphg9|Ehl-pAvw?xh`TNc2eB-upBY0S= zg|=PyQfAn&TXzY~5HKc;dyKM&LH^pp@}>WWE~Gw!bkcR+?dQ}WkC@3}@1kDOXWx+* z|J7xCPUs7e%Gj>w@cV9;NkJWE*;a7+1L>_-2Grs#u6=h-8+ zaMVj*5ekma|J%<>UeL5A|E(u4c%;$+2*j9G?m7;HFDC8&k}?=25E3O|nZ3hl?CcS{ zFHcNNnj(_5*cCxa{TE(}9dye5d7rD%BP%S*G}iD`D;3kUKjMGAm5iu0nwVd^aCy>6 z3RU|5fTe2w4VJ>ja)RlbuV-RME#kd^MdutPlO@W!k5F~*Y{;bUPG%pHsECZXtvjy( z&s>#UC`3taj=Brs`?P3^({;=ER438&*ooej3f1x9Nc>7W-eCWu^LU6|_vWX`%;5~P z7+2*mq)_4uYDJ3ucgG=>9(o0`0sXX4+q=r_?~J|8eXJZwN*##F3?uPSB6N0hLGuPn zgYPt}SM?&9c(dtZq66Jdl-FPy@U~`(7(Q`POcQ`@60GFlJKD&)7ufESy1S7tngS?x zEt?*n?rG(%WuSk*detcvvSY?_y-ONuN~L2(gUGxNdGogX!SzMhYAogk79W<-Q)|_; zA^dCT5I$o*X6I9GFg#=n)?UbdYQ_zP<#aF@BR{A_5~N|QS7lqHj32Hj;%F2C#H$^U zixVrgS!wX+X`bz?@XPlP;a4gh*O$~gU?zycPhje-PF~1j9nI{m`d?o6{#9eTqanl^ zKA5g&mL!=)^J8}dC`EqMG)Go6ZH)8=YFunsKkQK4Lu!zvPSOo?f7(}xBz9zktswCB z!Eu4nvZofZs)s6L;PL4=sKkt>4>|-=|A^v18`A4^@ys%x=R$|ncUt8dR{jgqGGW{Y z*KQ{fT@R4p)4h$2{9wkNdUlu0T{-78=_jTC**bo>`YCmAPTf#+s0d5rE{W(~r~G7w z-`&XC@vq;vyAjjPJwT~p6a7)+bS1ZLbbe<|2~g*cx>}C-@!h2bdpA1Atv!`Rq`(K_bV&c(sBBdHX zNW~8CMSpXC(P8A;|55^?;PK%R21)uGT4+UzDF1J;&{}e;m6K%HsPuidP50$c#XF5w&mY%eKnEqB62wdqJIolmgY}bOD?=D+v z8v$W}*Am}xp)2-t(piWfgC;O_*7EKZi9?WT(iiACyObsJlnKS&wk|hYOqU_i;B@98 zpw1RYUB|lf;=Yu)Q`<;Tguj3dGGs0DorJg$-8w$ANMrqj?h@#o^${;?wHUL=kG1=u ziFCAMp+pSBLB^AuO`D|};no-0pY>0)Ute_yh~NKL(D+kZ`j`g$-auy?FHbgE^-~dL z$rY%a)m~Z3-}*y572Pw;tw}>`KQ$qZDI#iVN2og0j-~{{$?gG@i$?N7XPdoPZ@kKBygrr=2BjE=MeU6wY6z=(*|5^Tm9`!(nm;?XwX{X zTm$L3hl<28s|cdijly9c?HkZ@9gpP6PYnhLibWEwb6qbB#o3~<4->YZYq|%-`yj-W zU>gnCUjQ5UJ*O2$qDFvN(0$Mh;FsYBFAry_OaNpuZLftwbKFAwN*p-*A|X0*F%gX9 ziud0Rz2h<#!6p#uWZH}pVD<~l?nrba5yE;tpN+hJ6MQ}2Ycku>D|w2Eh5aauWG|Xb zQ8FwhKVi6beEyTaTL_y^aX8S(H>TMO>)l&WI^ZUHXv%2}UF)b=xuU{qluSM#dj5~1 zQNe``*@qEsj&lfjdY{5PZCB0`jATH+3x=_jh7^#@h&bV2KpAPUM!31cGMa{Zh=17j zePF4^fTqXtZs!QqqgpK}Y38UPhL_jLks&t6@K<4)mh?rH9eM+ZEFL2^N zQ`6##$ic@LXGZmGM`?C77}le7)Rc{1Uwf0y7_!QkW?CS%KHS!l>v7^@f@OrvHq&Nk zsEK*fPp7;B{4$7?%1)*#Z&Y-ycw;Yl%T#aL*`wnT;a$4rAzy?kBN-ofDuYAHirZdzB!lyyPoEWNHyI?pzZ5-s@WZd{4hpa#Zv1eL_#tFVTuEhy09&~ErXGUEKhP$!Au3kCl5LMAMA zGA7;|D#0&ZJRD1JT*Hv6RSgy#t8j!7!g1NWu|5c6X-b(8ud6XA%kl48-aoM}LM?|H zSLyaSag``zN=L+p9Z3*&>+w+c(gjVpDObR%RMS5G4a}g~z}U#=m-dbW8}8;gC25hu zCq5BxS>|ztvHsUDeX?);L57FZkLIEl1I9uRp!R85h9ZCbtTw%`=(`I}{Ik!`@weWE z%FW+p`pR^3fqa3PbYqcO>)l65*lvr$JG+8hD6-Y_9`7Fa4pH9aj5sO)|&!6dm%>rosFXQ_QG=_!Ij!bdgp(Xp>0g_XL zi6vx|LuWzJrj%lazYsAM>=D-nS;xkgxdh!|BuvQad~ zp_gLYKlS+&W>&#CSI7uAE@VqS6y!=a6Vu{)m_~tygtaqSn!MtOp{C4n8+wNP>sjgq zbGQv#@6wy#N1Ic+JbaCn-tI<5KmS20PpPqfzM-WW|5>5yg2{6={(w9=@5ZXB{6n>* z3Q3i4G1e3?-{%g|yWvI-K^2uT&snRLULNL#rVV|AbmK_I;M4BK=!WkhVpS5z)^ z@xB!>5vco_%o99)t9g$&HV2{dS~+;pstm2sf%ssfr3mb|Ny)lpWnbe0iLMJO#GjC= zEHN9;G0^UFOWJLcZXUi&2Mv8dM$_{nb-dQq$nC6p6i$)x^r8~DgDo4hLXGbl*mIhm+9KOLi;L)7xPL6~bGzHAZ#8r+GclQ?7Ub3m5*PL~`>P8|$m$ z>>H*pVqE5zugke$J&El|qZ&4AVSB-eTp8A)X^p|Huh2#qtC~76S*LjsEo2}Ip=QkB zrKfO!PJ2%)wW=W(BDp_7x4x8_3ZPw%hWMP)BylkcdV>>GA_Gn2+=5;Q4vzo3F#au} zXF=DFldCo>gTJE+f*+T&^L@Buqqos$f$vwB@~6s_ljgCYB838zTzRVSw@I04)1vua zF7k3QwdVvrkQkH%xZbI%Zs<{thiaELEdNJKlI?gwJ2Q& z*QH?nZWXFlqu#f&d0V1E_%d7e+K__O z#Lq~>14S=Rvd>Xgw)He*7aQd^(NR$6W(JdwJQO#r9j`gxeG!s#ou7Y$OCRf+MC_<} zK1*^sx-~m8Mwq#2Pccv;Q|NUYbHM&WD1%t|M8Q;O4qZO+`8pkn1uPN|F&DAx(?Z6P zfj4knPjbyh>5xN{oTP0}K?h76jvmv3&A1qFA`41v^sXjm{3swM^bdvjSFkFUOE>Ev z%1}vE&(PvHuO07xTbSW#x3ypDVr{42_!0c%IiP4S)D&M7_uKj}JjZFLbqUqGPguhH zvF?-X;=!BWl=DSAW7J1!@W`FAwuVkKH#x_II3tIcGba3RYQcoF*w~`%Umkc%B%+exI=G~9dIt5}Bo(QQaH@K080|3N~sin4!*X)i6 z4+10rK|S$={CO;sg$(38r;*pSW$)sUP<^tY)mn#zI~?mXQ??r;j@ZvazLqk`%Kjkw zp7m>X+TCP&@z{{2`}|LbmK=QLrCgj1tSF6GSOsLbwn^u--x+5!dAO+@hL-23+G#67 zRIx#5qy1dsD|C!bIea6exc;OQaYynlEuJVW9>=pX9&tzGJ|>tcA`$L_yH{f#8t(Ko z2B9grA)qrF-vfb$%K6zuJ1@%7-D*##e(+8`Ha!~@t$toXs@!S+R_i|C?eZltU9r>o zpU<#BU{;XIk^fxtB^E+bE@#6-V+g>82_81Fs+9Ssit}AFyMAZ z+xY`SX{g+wrQwX2i2ZKOpF#VtPlFyn>u0A-q2%KLOQ$kMK2+ap;VL7r6~&tErLh3Y z+3@NDSmYR6dCNx&MA3Tb$r=4`mTRSj?Sw61INS2L*+hAstadQeaP*%0<_S$Myih@t zo<3$LFt$|}8|>ODKUi2?hn~znm7ncVKc9?^6%WGb+>^Y(b?t`a!^g(jLDIz41@2wy z-jm!u&j3WTmUvr7Q=3ebO^`7ip(cM4t0-Z@x6si~#L>id(X-d0$B_#%k6vDXlF~S; z=-RCae!cSa)#f7x;Mh#0e!c#v`#0o}+an^FdCAEMBMr;zGZY6$BCLqUU&y2H#>}Ip zRe3ttBccR*m=*Rp;UPE5Rwgi6#^%TL+@RzCqE6|zanak)_35AaKiy()wL~})ceec% z1HY{6jPS#TY?lU++plO1zn8Bx{At5dGmKF)i||GZUzPWa@A1h&$yIG;-Tl2G{VpZH z*eSi`-<$c(v-oV*bovry@X{V?bSqY&%q_=YhUZvF127!M+DZaZp$j&(i8%R+i1EYE zfY^oWAWeLTafB;^Vpg-%=;TC(&lcU+A4!s%hO5ta%6-o|63>y3?Aba*C9`8(Vi4>|3%w63EHn8j|A{c0Hr`4D~OVji~NM$P;=f zOiRPaWfa+R3(U*f2OX@K_ra>x9rn#rS0xk=k5vDfeI6!jXL>EfC0W?cH#i&lm9Gofx@1p-QZ58v<6+vDnz?qUNS#zsEAE(5Bvrj=l(e|?4PK|u~|>$_!BJRo0$ zI7!eTU~+XU;7^OVifUf`B>I-AubT%mTAB+>8t(vyYIfVGw7C@)u)Vq5)CUty7ioaF zUs_J(2_wP0E)`^RO@s}Fv@KN1kI+;6nGxJ$i6TJ@+<)Zb5(>^)mYL@vt;}x$XAT@^ zK;-uZwE`2fTOo9x7N2%2ywO+M3~AgC7k8T@$AJDlc__)&g33-x@0DQ_}Z$FxM=Ffnf5lP z_~S|WLkaJ08F$W+52NvVFBbV|H%X`Oj3EPs6A}9(x^U8+R_RDS*AS+L{VVrhr5kRi zj4hG4pT)vXX*o#D|L&rlSn}j+m@Oj)3H^k2T^e;)H1wnF%{IIMPMoSF)_y2_=R zwEuGaC~IK(0n}LP=dA)A%k`uzyMk9>iOBh$EMtvcB(dveu=O+(gsX8 zLOFmj`s4-B%mfh8*Z5O3$FPOA0BnAk+OU>b(ch}$r*_yIxR|B;+b&-yrfx#;r8(zx z?6fRmjxw@&(lostVjMo7w0M?@BKWj76eC{*rswiDC@EJWqw^rhN5*@(ts3`NEbnh{ zMC=1A_sg>RLaqfpz{7uh^uLn znSY(sw5hCN4<`1`9~>9n8w!=72e)a#SE3=e3z964Pyk0O>HOqEiHh0R1Qqzb^$C4W zHdH*+12`O1!9#y_I4Bn?^u0*Zs~1K8IWRqPw4U@&do1e5g?-sVJ$Ui;ZRz27mhAEN z_b^q2Y3m%0yjDSRF(JbH$bj|i69h4b+LHvB@>C`P`apq8&+S@n)nqj6Kd&nmBH0&I z?Q1ZPN0xS*Slq#9+?bvl(Dz20zmz_CmBpc#{|5oBU4_P~!+K8Qdt&g}1KW~|_~hL} z=((a$I0StD$jD{r)ZkaB=9EdGV+I5vSjvs3+r^u2wbj3X76>W7@m$nXhH8MaqY$giKcQcChs*Vdl~2; z+Ov5dA~ccI#CDjyiCL?jfEXcn(oN(F0fw+Wf|_z59lEgAPfPckUoEX;aX=4s_=i89 ztC<>ko9D9}9oP)MJe4s3aiDsdHFZ`>O>kb7>j*aD7@m^|qX%1HYazvD zzCYl<>=xQ6doIIXDnNHb00ZND%7)$GqaL?7!65jv`0)euW|y_sP4~<5R~! z94Hn3Q}IU}sV+8DkMiIgehCo^&G-X+Q`a*T*V0U4Kg-G}e#yECx!iwO-7*|c=UlhZ ziign&th99cPvY*Y6M6-?eAH9l%1eqOz}_ZxqUDVirF{Hq@Y~~0l-^}o+8_^Bp1r_A zIS%l8Cxoa?24YxMKnBvt7p_1)Ih=>%il}o|xCKro&I~xfV?5k0}Os<__LF zizJFJp1x^^f5G8yE6;b!FXOXsp_-T42T_le_%ytXrQy(oaW#52dp}KJ>jB>{>P7~! z2CdIZZUk}dYlBLq+&wNnwyJfictj1!K}<#JYBuzMP4c2*1Zg8q1DpYiIBVFX5q0e) zTC(g*wu@!<|05g}KE{f_gHGN8?t_x00sQWQ<->Rwf)Js?Gjy(H;H&S#-uaAc9}f_F zD7MN5qXQDuk0zf^3{rh!P$zL6;NVa%pMajxE%M>%dK*=V~gEx=| zzv_6wcBKP(e0oEBvPW+MobtNiuQAI#`mJ`ukwLAwpOKnZr1JbRh!2y^mzo_3DyKtC z!(=$oKwBcmOjCkpV(LW))xTNgeME6=b=j3Qll0teO&zTrXlh(4s7u*78uA~4u2FDK zlBuNMV3&+T#Rc9m#MF?uEXNRwVs^FQZHkc+F_@={oL9v1kfwdINR`aGb~#$`Du>~z zrfIHGK}vzuX8^6W?P~YnWiQd=-sHp6k1K8SfAn_p*s)e{G5K1#FS$hDY|~+mwhSv| zAgO@U0=PLBtOd>1vAs#@?1mi{i`8D(QA*p|*i84e&;V}}`fHlhWUKO*(686#fxc@9 zK1ukEvvC8|R-T4ylPfW+e=hIBWsBK?eC6lGS%z#lzucotg(yf^69m|5sAmWY!8@BX3`BJsil z>TzV&D_Q?t;H>cbm7bm-e)UJwg*}pIE$(PP&mz$H`XKk{WNL|ptIBrHO?wNG>AFR1 zZ$p;Ny}xUk`2!h718MO0_ODesUXDxkZg@VZZxWhL-@qYW)i#@cq1h1Vek-&)@Xj}) zXk+;B5W5czv~i!Q>BL}@npP4WtH(c-v-BxE4}2&KF+4rkTOW~!_i2d?T6={61X6b} zHFs5(bbUgVv8r?*krJl4CFk8zO&U+ahNDQP-@a8R1F~E-DovV&n=fa0;}AkZxI*2*>KEwf zSoo^EM4B|%1AR2nmnJcj{F@(~$1S?RUB<&Sovj4yw$qj*s)pIQ9M9Na*2p~GI$Hwy zfFw`SFM2&VP+Bh2pSH2RXXZCFn)GqCl?M?H&G}4hqbbRK@9`i39U!0V&Q0`)50%H^ z#`A0~v-M%NEBB^To;_<8+0f!Tv-LD{fLjt{rCzfT0G<(AzF(84`Z2wPphWQ7G#&=6 zV=RG-acMop95)`f43`<8H0$TEeEs+l?9J{*ZL9aL0fgT`c5Fi;E z9Qa5AFf5;=9j#||`*t4t>e~MMV-xVRW)Lm_1|D6Ap-6l!&It>ng9yi#vtkUN0nLGf8vq%Qp0dTnH z+ZZN=!5=7W@79(}=f9nf>su*jJdaP)`C4lZ8~M4E-^J5}_mXN-tJ1CTqzAgSs!-b_ zmOL{=9@a+ux7M4yM1G8<@D&|_9=xFca_hZ6K4rjEx#iSG*=Zl~Q_I@%XSO#Plz@yt z%j;x5D^jvdr^`#tu2I`oy}NUkig@1-^wGM|`Db+vc&Gk{dEqBp+eAeIq?w>Y^{c}| zw?sZDDI+yonB(sJH2vUYPaVaCWsH zASzyiveDgTNX5HH0gow)R_TNtUi1oB_6P2*<@Q&0VQsn>W6A|Z2lFAgHLf^|7m}{PF*8#Oy~JCkK=9nA3F!DeW8di zXS`ObG@g*^WdT-1=&@iE$Oamy~X{tFFj4jflMNL(e?o&(|zaWu~BjI$2=ng zbHEV`k4d+s@bc}HS9ScmB7w_3b2KxHX#)`W&fc$B=grdwz2FDzlI3m#yGcDimBQQ) zXf8JkSaGW6dpyhaN{px0bk2A3yYYaLXzE26KZDc3molaW!JX;Ki(~VPV~4qtN^Eb; zK}DvkJgTVzqA$D_`}B*8!3V8hPd*^C-9y#fz`Gv%wf$??!N2?wYGT`tY}I2l6dWkp z_IA&|6UY~b3Rgj~pij<+YB%ul<1m-t*kzSim)WB9a661e2z)PYbiE^?&P{K+j$f8O zqgb@cn)ka^bcANr;bS~iYZ=f{NX8l3+UP_X(XNq7wax~Qr)rJQb{rhig)4{qO3DE< z3jljbO~`!;@%!A$VbA?ykPO04{Q;A$s8)m<{yX_9HyJv&- z@MB-EUWuNp53S!4s!XjnQ8gqhlm-!qO=`Z^?TTPF{-FgvnYjW3hV@`s*z~DecQ^y> z_PdB(a&*AEeJ`yLZ22`w}OqXkN@DA>hLEwR=t6@aecu;83;t`(z>xwCxqFm`d^G~49e|WSlArOMHrA$(3*mqK39OF1bF`bftgoe~Br%T-0b}p&;=(8nFhkS-zVU30t8zt+o8qdmvD0^w!;(m1~$F~CWWgAm)f_i z%;nY-T1c!0#09=p$@uhpq1U9NJz?5Q=K>D%>APbk3?#u$5@8vtz@1P$`=)cDe9}HiHkHQtosoe?AF~T9^I^(VKC|8slMkiiG^je z*qYm77AZjksuTXT=`&yizBpNO=whR^*lNF5%!Yz`ZpABr9=HR!xm|VCL`Xo?9W=>s zFR2WXHPKaUoZRi^j$LYNp)ZOF1RzRI2c_pnViYTN3jww*VmrO}hXu#1LelNK*5s07 zaSU9itu0x+9#;mw4gtq8dFHCR3y2?%l9{abQs*0nZW!8CzMge_0dN)a?X6uWi@SgkYPjPS{ z^;ht@I#?K1G1PwarR2hd29DEofwA2?Ha0U`lE#}8$Wn|9&UQ~I`rNz&HSWmQ`qBSJ zXEcCw&aRp-u()cvyXx)4)+ek0FNK5TU8&v@_#w!^h@qecm3dI^`pkO0CTZC$%tF{m|{^pC*-t&U{%jE<1cCKzt}_lfM{ zAaXU^UOG)(`d)*B;LR(YwQc|bnSnU5PJ`EaoD|wzrT}e z%($YMOI43IERw00atDAq>d>|6!4FmVz_=I_g~7;Uax^LAa^UZI>GbuhdM7H4BhAf8 z=-~8VE%0CfIOa5M^bQ_K?@Hjga~^-^4kx~mo=Mvx^y1-MzkOQDPKbH)#V^oZp&woc zF^%=_gdfid&vm8^3rA@}FEOOPoLSE8{ zv8marGVH!{XUy#~jJo{!Nw?k+H*?*AS$dzX)6ZfbZuib~z(M9|Kp$#0Ed)w3nob(m z&VI(7{qT0vjNDfCq3w9l?iv_M566r^&DjfM(wmlJ4tgYeqX<8#S{#2rE(?^Jt32Kd zLwR;{{U|?vYI5_n7PbT;90A8X@hj{l7M>^hRaD?pB7q*fv8Rf8*kbi`ECE|08#wE_ zJ+f^1Q0`ooSi%bXdn{o@Ig$uhiedkq`732NspSO2R}sXy%XWq5)G}TSgQ915IA3A6f{4Nhe6|Z_*7%WUawD~91AH{O zv}Ch=OBL4famx3Hbkj*&lLb2=DY}^YF){xcN)g<}aA)50TkYCK-M3Vd#)H(@<|roF zGXCf8E948`-_#-ujqkCcQVtGAD`h7J3(by8U4~+IC+Uv^e;LCc-8by=9y2xY+-h6^ z%3quP!&dzIsp5>;H}^PDp^k?Mf6p5$Kv(@AGdl%=tzp-2FXX!{@{%q}OK*3D5=rmt zD!(igpEL5nklkdeQ5Hg<;-IwjP%65&CO=(9ZktKeNusm_l*9@565KUm(-qbVRfODS8PRvpr~HEh1sbmY^XIWX zFP5N}9z#kPL;jv@njMgCI>-ZMVxZbt#HBSCr1%KEUhe8e{K;(LuyOvKb10kv&>e$5 zQLmGr53x8P{jQ#>QFq_>-n-v$LPlXzaLoD-K9vM%(>LqGf}YU&v;Ade=A%&cK}xkz zns^el`wuT5W7%pp_Vi}cD)0FU6cTZjDO%QlMNDjW;O2{q@a|VXm4L67>|bI^Jw*84 z%sP6W0Qces3R7U^Y`*}zGcfH~6B46v`Kfy*xomk6!hK;i(?bb*9DR9ew`GaTdR5H7 zB<^zHP6sg4eLFYclDCK%G|@?|1B8f3=heFi;hH5mhnFPceg@Efjug9_ z_g!DaX_?crfhd^$O#Blf-hYYbcC{NLV3ZN)}m2t>S>i z=b++`aFj#@5=^Bp3#7np(%ti-m<@Bzx3)Nw0Umn^mTF;iTJbsrp*$eVnsj?{wZPJ0GlUa`3 zHH^^KMfJ~Pw;nx>Z6~C%N>9eVk)ZCE)h7>Pw8}(hwLIQx5xQy6_^IERag(&ctsA1c zNxETV4K(~9?iPx)J{Yc{pK2y!_n|g{gpLPCHo3@2St5W4t|b5A^JEY(ZsZ`A+kf+$-2m>x z3^L{f8(uTx@XeN73M(%=NM+(F`LdlHrn*YE^UV)OaWR%Blnt=IU(A`72=7MInUtOE zZQ+PtJ52-AUgzAnh7DymOIg1wFg&kZ%|20!2cNG`$+M1&tesg-378yUH!SX#uH*BG zgY@=z^dI~PLP<__A4?q1&Q!gblmDc^C~0c=031`P)73;g*?f`_c#*Nq-XmTcaHAEi z1(6`F)>$Pmuky0|b(rcpEy&`90ZNhFZ%n4N=t>=Pk;Y=!X7+R`Dt4PNu-N z;?(#LRzovU0y=YG(D^s;q8cKinZj z)7kHq_?!zcNMGZs98#d2s_OTQC;8IHloyvZ zsHPcR(!8V(*G^_eX-%xc)px%VVROoryg&W{SUsIySLTw!-HsqwowWoP9%*mO!}yQ< zL`bhz(jQNg^(8M(vZ`XgI#-FcinADsO{+7=E=4eLX>`6Kh+4o*wIb^fOo9vV$<*&n zlP*_I7*{UIyoy9nF5dt#ynPYs{N&;ogmFU1Z+`tIe!A&jM9*(3H!IKRy&F(Ge@d^L zzuaXSfuAH~XEXJ{{T%}f`~u`Q-+01^1zz)_*t_-|lm0P6@rmDd<%Fc8t>^m5RO3Rx zPuS1P$gJCoUWLU~5yW>!_eLDoe1BYCys7GWPeI%DWg%wkpez1%31L&qC$*H92>ynp zXac(0VIYqlE!vcIAEP>6P4VH{uFEnH^FLNL{&2|@=*6RTz~Baq6v|y|mD#YpEx?c) zGCS%GG84%W3rhyh%{+QPNQ|F#?tFQ-402n3!`!j5`^y#RnC+Q_stHX!YP25-)K7C? zO>zLn2b`++Q-K?sEwq16g$E-@0DM@Fog>tC8=Md(6T2X;;w0mUk~G{8#T6D zbmFq7kv%OIqvd!F8{YeC9f@SKl@aU#kmcBg_h~0ZNVa8xG-hQA2itFDECXEmDPrWy zmIEV%=L83KK5(zDKIU7!mG zWO2~Pte3j4%KNIOLcIEGy|-(h7(gpm<8Hz-hm97C>7zMU@5I`DB6#fWWH?7Vzl z#Be@>;O&_%kSdcVQkuM%L|)n#@3c%qj3sVEjJ*t`p-r%v2Rmu`O#1`i%UR|a4oC=6 z;@9B>)bOa1bz_~?h*(qRw+Q@D3=+QtV@ zN_FlhA_4AWUEcH3bu!-nz;9NLL+%#&$?#lHd9eJT4RPV(j#t}FL;)yflDwro)N4Ypwss-BZ#>4oqb0e+nQQe8kVNFq zH{4rrj`XUm^w(J#mK8k^BYXEe=7$CAr9rFZ_Q{@4MB(m=Z0*!bmL=E4;k~5S3;qCV zYRbYE*8|Q_Qop|+gYbVnZou);W8+PE{EvD{_(95Lq6BXHuhXJ(_{(g&g$yEi!sq(^ z+bnC~d(@8+-@O7<+^%gWS*Gchcg1`c9oE5&m1U@5?4nOma1BgMSpuCMiUqjKG zT_x!y<26$^edG6@e{l^DzAc8AYWeyV+Zev$n$)Ta{PI`m)>hi1)|s?rZ1v zLj%B6P^LrWw}5Sb6|g&|>OW1jf#STb-@QISsofZsxwN=SPG`2juInpS`BLG7Rxa^& z4Amra>yxHU(=5K)ZYJQQXX~C0LML>eo1!YnD}My%QU&gqmoMRtjqf zMR}>7ty5k@b2n~ykXi$f**z^-VS8OWs}F1?v>1cT{j6Ux78xPBH1Qo|ng`HTI77oWJ48q`pX}*J7W)z5et4`OyscRduSmWD|1(*SoZoi}h~t zP9>!-rxkfj+_w z+;wq?$O?Ls;92KSd|qL`Uc{xr%jSd@@M+gTIe9h70SP)@Db0vm9M_@NfBxqiq||MM z+ai~IVJ~o0SZK!h3%qbyoXhq2`x^=gxo8D*|HrK5L3Ew39ITaw$+vs#3V%8eoU0wZ zl@*)=(;?Hxn&-U%ZEjy;prL_?cmw&GEO9%D*yZ52!--1~u^V2y^GuF8$o5jVy*r-z zSWW@pHf4*o)Hjtlu1DRXx@^)2HXbeawbZ1l>Er2#68|4@Zy6Q!+V%}^5eZRJq`O2) zq-zEQL_k160i^^4lHfE4KT-?&o^GyzhEHxE3s( zwdCYDkMoFMbmW>6A%HdkYQdz}bo8TOna(-IdE&Fp#!*2fJ?t3s6Vi24t^{~}sc>Dj zGmXix)JKHmoMGGjd_%o2^ePL1xjPb?;U0=ozAp~zxUCm$3h{^6?O!=+_nzLRxjL;n zB7lErer(|A93_6SMpEh4?PK~iKcxvUdS02_`7Wh;aWUliJ?bY4em!)ZIQDBubw&M+ z1#qy_`*jGr2;Z&!a8&QEd<^T1nVrc<_4u!raA2tlhc7d#!}S~{NVhG^;d50`i6@A* ze*d8*pbBb&E$8QtJ%(F9v78V8{#a#L!)_k_w0T4@nxn9qbC3R~V4W1|ybIjtSa-Ak z4hg4<)M+&5mRcHxW`zqRg{JS5E;>VOoj1I?S_3Mez96b1Dts~cf%zj~I)6_?51o~t zRCI9A|EtA^&*5sb16Tu77X1ZTloXRr2~XLK@S<>(8a@tq;?5|}q|IK>=&&&Tibg_3 zvP~d&D0d`4^(t7Fims#UIkV`M_O`~$bqz46U8*?F^UXLqOFUM)mxs#WXW!;eJyDxV z7f&Q9-6j9S-Et^z{PC3dapif{3!L%yw+Ll!v$DoW|KUS+KZ%>w>%&k;9EKF<>~yXQ zAoC82bBD~jrbU81Qn%C~3I?C&5m6z6EREwt$TxC4E#V-U!%t@T;;jX!94?0$wUsu_ z^sG0Ki_hAO=QBKETzg%Y6bOIc-pr;c-NZ0snpY59Im#Vhl*r?2IaRo@5_YKHHmy(%aYM%Iy0W9t z`<{LCN1L8wEdyH`y5FfabFeQG^>X4xw2a;kun)|rdP5ouei*O2sFkjUi}^L2T`3rM zPBxe?b5QUaq*do?TXeI($W>rgDOCD)5KHv+Oo*JZ3BAWR^s?B(VSfOAjOk&>L3+&0 zw6ts0P;n&@b*CVY`r}+<*2nhs%8Aqbcl%w7lZ~D@t?xzwGgb>7!OOPJL6pbwz|`$I z;bYx3>aEOlRqw0HxhvYLbRM#^JUxjgp)_KGJGFo%XImeSO873y{eq$fSl&LJb2ndJi*1&gS*v z^RvI+(h8Io%{*GV_D~jQWS9U*PZ4pSwp(ZiiGdLeQ`svQgQ_1;2A9?-LssXauQ4DG zVkK;rs|9Icm}f z@~FL8v!co+fUCoIeSj&pRe$ho%hc>5v#yl$T`6;6r-q)P5hUI#bCK^Nfb9s=L!e6n zXt%3LLOQQuX&qfH#h1N+Sr(T=mm#LGZ3g>i;KuxbW(_(%M6bL%Zf%%aAP(UBxEZCt zL-X83IziaRpnAWtuFSEqbP0m(yIVQOtp>jMct|9qJZv)T{Ciz>L(1`}?U3N}P4Kl# z_jP&zHk;@Mw`$l5g#pBq@adpD8M!1pvDwlxQy@_;KVd+Q)!9um+~9E)!sNtrZByjh zXH+%l96Hhp$pMiZToBGG{liK`OhSk-jz{k1N&72mB;g8sII6qI#!wAV%Ivsd;*yi! zR@P%iz#bj@kWnPfX8nQpYAZ0Rv&w?0F5N1USLa1NZCf(&LM_XCYdjOzLGKwzmSa_cj!vTE~&>puGd3+IoyB5m^6LW+= zsG=AIr_;MtS|y3t`6rP|h!AI96fDmfDEBVB0&Ym-yh!W1tu-r}!UXk5YYPcr6#{?_ z90Q+{MndWK@k$8K6XF{2TX7=mk6mmFcw5Oe)aih>L+V{@PmJDU#);$f>6<>XlE!Z1 zjRs&lX%Y5Bg1N}j@e-I$5U6E7pf&isdl`^!R#4%{Tp|*kl6df;V?4*Ii*J*C?D&_F z9=p`g!;$+*Y6EQ);^_?XxJXnR6$u;2P)50pqh$u;$5|ePc8cFSxnL|pc;#DjAxU?s zQ6D_ecgG@Qx6ZrjXXz}a$5Nw*g`X|j#8z64Gu_8GMP&$S8Tv&TEzIg0pu^15gt8TX z|7_R2M{wt6w()Ynq<1z1|eAF#1 zI~S7mh5z|50cANvTmw{5lzs(NqXB@fwS?VrJ%S0&X>UQ0?7*+uLxTABthChQ`exK- zuj>fv2d19OC0(@m0Cex;XI51&u> zT4rUd#V1M^TP_yQ-itMjUFk^aSjEQ-9i3rwJ(bT2mlz~@e`uA?CSzkV7r0zM!fGcL zlPKPfrlF@K#(8rjJ)Q-CY>ErcR4RtNZ&7fXGYpw7*kXL<_dt%@>d4kkn%fMCY|GI& zBwFY%3Uq#S+tadY$XTo4P?(lU1A_SKm_z01S1M)5&au5*knQQ{I^Eu*v*tK+_LkjE zFj!1&T|-ynm~Rd6C#-^ZhjZ%laa;r_Kfd66uY>Dad2UkSs_173=oqVSF7aK&&0e6~ z9k1q^&`|h!w78VsuFZbg5Tr8Ws#^FSt-4}_k9-98cToq^>b+XCqc*NNOKvG>SLP8k zD`VL|r0D)_Q3Q?~ouedq{mAga>)kAyms`@G*0E}~G86o)+*e`w98Dpf# zUXFj-QoKx{G!Z!J662U%Cd*L^ev`R4%tF;$AC|+IC7+XUdqs0ZKjPKskk221M~X$& zhzwA99JokjZoH!`*sz1F!S=POIp9gLU8;1v%tW=$_g1j8T$vhvd{Oc_iZH+8**z@o zqjxMm6TbX5wj(N9WR4gzS{TD}I)aF@3NaG7gPtxnZXO6(U9lQ%UZ-$q3`bE`0ofPP z#x)kYXLJ@FEdEDY0>PbqArVO{`XR#+1Qr`CQ2^t8QgfIC>`=(hUE<8|dK>Js`06*d zo0p@HWO7P?`7dL$$9?fr{w~KLJUS14wwDQl1tVNbRKT#JKv1QMUByn-WP&~YtM9Ib z>`Q!#QZI`#h`S?%M=-zmg`QvY!* z0vN+CQ7=N=6wLe$(~Xa-I;;jaF$rc5n#0mX@^n0pVxR$g3w3=g$+#dZU9aiBSfj^@ zQv)>%(SRuei#5nix)kUp{eX#~#7?r9Q{nEUjs8D#u+Qq7yH%K__OfvZz8jp47ioL6 zd%oS^XJ?@Z5*2eg4w%b_Enw(DipgRWOqL{WUS&>k#!D3sfWmd`Wd=Bk>ZyhI>lu3X zaiZ8@1U&^PtKI5jf@;_qc^8IMx#C{+Y9$t(X>3^U1~Fpd+@%%~9nyA?Oy!SmthJhU z4jF)F&ITXY?A8yD@1FpbMhmSeD%YQSvy+-dc^D6u=P%S;N&^D`!XGoYMA=|P;9%n} zWrtK+egrUc&16lz19t$|&dDF|s11UxIy4;HGgQ!~fI7~Y@^RZTP#v%3p-RgNyR&|3 z;II5rgur71fIoUR>jAoGM8Mh1BS86T#H&7WHD{V84m zBZ3dB{RGk{o!$z=|8NH>F)o*udkJSJT1jIIcYl;Irg>yB(DJhEM!aAkOz@e!ZlJTm z?74Nu1t~TS?}LasLMkLso&OX0@h`N;5hhyi%2pazO0VZ55Y)$;71E)lEBP$8&9|@v zM$&eMUUEflL})&0Y@O&s?hxSL>~=G|N$TFoeZMPoSv75-*vBVmy;tmOk?RSJG)f9O z0$FU#hg_VUrjazKkk^l8{fh8Ap7daG?vdIu)7%l>`euG(R&=G76 zSlyRlKVE!9VV4mMRN@yyA3NI|$L~u_1A{7_OYL*{k>cyirt3VIRPN8g^r-6^LoX zE*khfii-ow+HnNe9v^f4Z_J+E`(C~&P<^{qJX-NIZp-IEFEV8are4U?v1q4RzSn0O zR7Gd@R`>E_F*|LCcu*z?l7XxN^A_ZzAchuy^3Pz8@*pYYZ9tV`GV~{kzgYUnt`kct zB2v#V(qcPL#1#MhQ3P_hLNm6$<5qvvE#6PufO`v8cBB2#_!wk+s~xl2ASXiA1+k*Q zCSk!mF(#MbjPV|w8SLs63MyDt)Z)#j-0dN#fp(@2%F^lp_AR0l>uhz17H|HhnvWMF zeaQ{D0b)`F;=e&chjj@x<1i(@B>}^?w%VP-gcj_Yst+xw{Dt{m3X{aRsEv?^T)}z5 zeFfcpMTlJAlqpRB6-+!-p){n^xSb33b6WgPp_D7Ywr-Z&PlC9gv^huVoy_Zw-jVC1 zxsx3NJD;pl#sO@#WOiX{@{Vug!+mu7cV=bYrcLWOYlL z@x17CjW(m86tsZ{_*_!_juDd(Bi0itjm7lmjSEZNuWDP~*G;c~E z(ZGuH{w>hfS;6cWuP+={!&ci8tiF1FqgVL?ctZCM-2bIWGNZ9LeK5ARFItPYH(_-qisuC4fn9iprfcDY2?q-#9qxivfUPaSEW2 zS%W(bj$-UW8;0Q*#?znD!b%Ij0uWu>wQT45Pz+$Rls^2zYi_}dLDnmoI%}rEA!EOZWNwU&nHXkKEN#^a=I4OtL+GcYn1}Z^OpP0%^-cln> zwFJftrwkZA2*|`t$prQ_|M8v&M|7g(KU6?m^#hsc?>so2_h5+FYkh=u6?z98Mw;Y4 z(l?p=j(h#BJe}hYIZ^zTvV56~IBY8Jb+)etpYRbJO;1t?Bu=&AHrrbBR5-tfJA_bk z0u#+$2RG(0J?sC&eJjIrW^$`mtKc{foN&M#FZ~u7fgYQWBA;xy5ze zl1}7IPV2*qF1l-)xk5S7xf?yuf_ z149TCpJO=I`5b^g`XEof0mT$Jz zit*gI0Qg3-zU*y@Zvg20dpDj5$Mt!aIoBeWqm<=U)AgBW*(&Q%`x~u-6t;^SQkdhC zM}#mw`V43vI+#o1<=FCf3FzM@Bw{xy;2?qh z-8su8S-RrEzmxsLY@6yI;<+J+l9haXO)K-SgyEvQ`OVADpu1L|%3O z**wKE^xB<)FL$jhn-UWZ%!(;)2yuPa<7z7Yo~TtXfW`rAILeM&-{VP>rH1foa|z zZ;YeaU~>lZ;-SZY6a16Do`KDFNsf52!x7vgr17FuxcgNBL%yQHy)vM`DS0t%oeb$ktMt{V87qtfW zz=1nML7qPd5|H5PyB@vJqYO#{mUO5rvP2CBm z1M-IEx&2mM{gWpupbO`3AdlLb!tyeY3%48xz@2yKHh#Xd-?zTLQX})Z%ciL8!83s@ zop9~8eHXEWb6|B>v4Fc6RD_q_2OIG#a3Uouy*{^L zc;x6I8{bTonXlvAitHBW&-`QfIN z=t0ePF2}gGA5gCA*$12Wob4}x`-<-F{r`} z&6vDhMh}?`0jS|%QIg66sMy)+G-%_S)r{blbZO&vzN}5%u6z#ljs6Szmq|#+lF}e` zVCQTHX6yBU@D>8Z3{E#3T#N+lx4;%GIm~+GXGf(hy5qEF0Y&rb2<(IjOcH-eQ1h`D zhdhtx)>&<%xrCQljf9h5?Cu`s?U}p?Lvst4z?@pjKaZ`H(AsUdzo>oG7626Yw9eMz zAeq{mp@04Lm7A%0d4ik(4iZ(lOI>y}EPWkVN6)FJYX&vp9A|%Vb!M!nF-*b*jX%4! z#!okYxuu7z%AN!VcB$Ao=i$w5AM5c4;(%;qdL_PVBsT>w+tGM-hJTvW zw>N%BxoCejpnqh>Gvgx#?O+mn9!~waDd4nh=~ivQ!xbljMXMZPDd^AT|A5xazxcI* zr^4T6)B0L9*eYXyjP-`pW%Kh-86!PIG9d>U|2{bubdH3BjA$=^6Y@~a-M&ryS+2ZZrc>3y| ze{L9pJ-DdUmR@a8I*z{b{<8?`=b`6cvs2lHO!&4Aq>@ z#8Kz4iQ~KsH7#}9MVl^**Aug(2uv?+3ck#5^m5m|96WMQ{aqD-7KV2Zz?)a%Y}(o| zd||jVBft;`Ot;(##1A5ifnGCHpOO9W>T`zM(pK)_s z7aXQ$UD})a$MrsXLwxQFmXjWI85vqA`<1O%c%XsTgAp`7N)0yGb={H`+q@Xu_#syZ z#23nqQ7IOp3>1jRc?X25VG`-DUb?T?0f<&SYO7Z{lGavr7KfKf{DgY96*``>*XrGh?ZrI(WFjzidBeB1WjFo1apPwSB*F_UFQ~B)MFIrYhg|) zv3IiO1kwc~Ud_D9d)dc7pwOYJPknZ`IKphxPsM!72Z2K|;1yt6SiKT)`p2_F4>dNJ zUu67mXp}|58-XjqsymJ?vaLe4hZ%u_YoaU`HVNtjNQQ=G=9=QvSORxuGQky=0?O5_ z({p_`?%3L+)r1WbbDRuBFAvQ{M*uONgvG_<_|6brQD6b>{y@Ja+jnOrH z6GT_S&%Ls~Tf)$^GS*4kqHBePBnrE+bR*H~h+lj&;$L|qvo@1D=JSU{eq(CUe?ZU< zTnG_ggaCR#F+ll^kK}dvP;=l$5#^sL);#4+r$ zB%=!+`9jXr^;%N*Xt=-W`qDFd2d}}qv4IEyaF~We%62Oa8GE{iWDQ$Qj(|?YB5x6D z)}P-3TCv-3tHJg>Qm&7m=1N0s7TVwOFat|>4@@HEs1L(_p4mZOnl_!Ugq%JZU)ueK zYe_M#_>YLbpmChHS>hBel}`Jt=$%XrZ~Q}di}z`75)Z>}QPb6IHI;H>QI24p7PT8^ zmt6i>$`(*>o2^~HJ(V18G7((IaTU#zu%zX@7>R&r+cV#Gp>!h*zOq$im(nYMvUOr` z%hA}_lMA@Nft8n9?^tClL|=BlK-M3iw*kC*uOmp|G6^8}9@PGZac27y<7}?X2ME5A z>G#L89md73P%cx*YPMyyIx$YGbv>lI&=f$9Mo8Ge;-R+R9-rnEkOwDhu;F{I>Hohg zKjw|<4A&&~ivPNOW3~r~al{NUi1Rz1n7v#x0W5PGjvhmDeO_vSF1q#X+9N_7fkDEo zTvN9Tk{;%9r@`yj@8bw;FJL5tEv1fCMhqFx24ZG4Kh`+z6d=ZEm%bO3g&r@xL(eo_ ze=$EfiDpsU6+g}jV|IUB=qkRIuJ$w@m}d@G05izhn%ql&DIYA-qy%@7&_()B}LCbGDbS#i)=zrMMgn9Y?pid+v4v zAS07~h8f9z@FkqDlI7Ufe8=r1!w5iUgc@cgIR-JmfneiSzJ>zbl=DH$WgoFN6k7^9 z2sI?6ciI?8Ffk#Xg3b;2@B^gQqNi$(bmwh!+=H`WZ(Yy0CElm zc|zil$3|{UusZ2y-;}T_T8>;oK;%3b~`Uz)d!BP2h-(a z;J5ORmTo1ckp0m8OU6Ue?FM84p4|`_G#SxTY& zo|JfE$S6xkiw_(yD`0fTM0*AOD+dT;yp{UnsVzWH@8q&EGc#L#tQFX}vcD3RWgxIG zx|2`UV_%7_SEH&&Lv_Y6g~u+P53n-Hi3H|efM`PtU*_^=DLj4Z*&PH7O4qc5oK`FI zCsj1KL1*)J%RtlqX+9@t(Z5@u=8*DWxC6Lr@X-AlQj4H`^0=>SYvP74lyII^R_K<0 z($COm%$ce^Q&E~%CNB*MV4#sv-@ec$(?GY2YHBWe**Oo9D?A3KgXQupY2I7=JXHI)O|ddx$a@JTiwH3 z-=Npg^7KEj#w7>9|LWqkUjjZhr!c6ht|A#@{jl9lDLt~YxjK6UVZSS7; zg#a9{im6;TdYGD9k-Mqda-~wA5#X=9o|e~NmH}3|;6&FV@R+dg5qP+s+*@$7C!ia; zX0AVIF*`lRUHq*R1eoUE{{*bhzyV@51>zvYIt2Obu11ix^xX#J+pMI!7KbV0#}Mnd zL;{wp(cCD4j5jY)EGxld!U)3<<<%$&QQKGBt?I{K(kx8|niYW&th85wozgU(?xPU< zask~iT+b6ggrd7hL_gxm;KLB_a^Wu`cb{~Oe)&dza^p~$EN@ymPNek8)nHUko;qsj zJgtrPbwaHHk@UrZY(!G0*#x{pHGDka${rsP1x@T_D^0B2$kFT#qI19$Lyhs8hEIPo zj}0`)j<^6UDyfBqZZ!MEq^w^227kMeG%9z){MRsBmw%{_yRLkK<5L3TR4}pYDxM#( zDWIknoVRW>e@V@BGov=zE%)Aqjht+TfltO`4yS|0GgE5;L6PqAuPHoX)ksqm-^UY= zUH7#-Yz&`Tf_pm-a1znU1*HTnF>rmuTEm3l0Z8F5l%X}|>>q!wyzwN)xYca~#r@?T zn8^2ZR6TN*!?9E_|HZm4okaT3ItoSzKZv>SfO=Gt6)wRjHrp#t~U zs`8t*UvJTL`B<$$*)$~?gc4hHT?5~yrj)_I)4O3Crp0_Oh4QEH%O762gtIs-qPLzU z$&WrCk4Tnh$3KZB)X=ht3jk0Zv!xt}ubqrd22U(8>9~=js$ZldIk-i)0pv($!gc|L zALMUVmq>00G~B9-;)clcp9idnIW6*q&p|GfoTw@RAO>g%4plAwAnuH4;x?-)Us-#v z7Ha z2j-xF5;=#X@@R$0Q{nuTIWw&IEiHTk;5o~bz}WnSb&(?s?W@sTg1u7m5QU3uK)6$b z8|=YFd_PzA#!Hi&+{d^XM^wo>8X_ZlGWPrtL(?t5`8J9s0|{eOG0mzy!gB{Oo}4pe zu6WmY?nuJ8+#Ok2m1KTw2TX~Y;@8S~#ugJ>WDjA*EMU>~xA)X!X-Y}}yvbQx;@>Ob z8=co#7K|iO2Yf(srLWY^ue7-char4XxJ_||)pY@m`g(Rrmu|AzNULC!2r z;7l&3$80U;wCJKGu2G+z7Ud5F_Ag;6y@()B|8c`*0lAa{LfB}k-E{F~%6s+RUV@gErIB5fmJD=A2_!+F-be`ZYWeMQaMS~Z^3DaDU_b|$bBkdw0p#5B6v!GK`?!4D=tQ4awh=exHn_{hFW%P>EE(|C4G zR;?|Xbl%MIFGK<$7djwCU)6zjPY}^&^dxNa3noySTj4b_F_tx{J)XGRq9Nn_X4><- zn@)@yKFly~lm=3`=zf?4&;MbOR|H-Y(EYb8VJ7GxYwg!Fn3|U1TTWz;PZ;tebf`!> zIK=9GmQG1zeg#HL{|AcDW-Lslmn5o%?g>FX$(k7CVkfW3=wUYopVhD!u2p(k3sg0; zsaZbo-ZVJFf;hwm@FYanyL2x`Ld?lnfkD2lVMKO%VSOwyQb2I~2LXC*-;#_2R%GW* z`{FnD(4PTIg+Yh_U(WEDzZbB{Kn2i2$c+bF!7slZ*k>0MEDoFl(}l%BUb^I#vuQ(u zuH6wnKMi#}Oh6p%0Wc(@K%UVN76ItXJ2);^y2xKX?@HW(aa8MQ29Qy{^Tpy<|4R!1 zi09yV62!^3bCVYm4|VM@XDPiJbtdtB>heiy^Yep*Ce_JbU$?djt==!M9Nhg)W2Twt z{3rd*zTD!axeWod`%Zk|s{k=Sy$9@ED-snxbuv6|&I*T72%BR+L7P!$1jA?0Y`at} z(*RF${1tydr=PMr`(e$&@-yhyUg(B2popB)u#o{7kQeFaLiUE+nk)eF zfVT)=R8~Vx+m_kw|0#ZW5Q4*kt{pxUxO=3dor_e}x-d+eo(2r7x*ZOartR3lf`JCA z@nGJAw-6-Zdb@JT13)vOJdQ5us85dfP^C*jhc^fC7=0WZ5-#dE{j19_{Q~dDLzK#| zNd-~DiJ%;>tiuu9Z{<*%Y$d>CRGB1;>q*J$Cfm_?40&-RApnDfY;CPZ532y$Ss)gX zM>T6{kfTFZNm!epMVefCT6mHHJ1zP%BuvBQliL30DJ zemj&upBl8~ZRzXq25B}esiFH7MjY`0WMqvMrdYq;{iU%1#7*LjsyKyU>>bCT|C87u zL6WdyNA!J*?VRj^DZ%xY@Ji&Pju-`%9Cz!qoPwhS(b-`((A$zRVlj8;N0K%IS^RVk z%qJPiLs{e_)hyTSuNB?b+kD5!n7~B$pC)CqvOXyp$*7*D4`%!DnS<>r|D_7F^c8I{ zKdZw!>9_MfEH~du83#DS;CdDc0JF7=*$l6SBpJLY5|3TWiY<6+m_RHwl!1Z;_5kId zbZAP`h{iA#@&9@>L^nr+@!Qb^NN(aMwMFjvw7wTuV3Jqa=x}@}VKQ3x7b^S<)9~V- zs@Y{O%2j4jItS&}K`S~Ff^S(r(<#iZuuovK;cf)G;-mzja+Zo!vQ(Q)nklCATJ z^hyJ2@VS0PB`8g^cSv(w0-+qam3rIJyc7G|!7&o<1BBn#CrWV+&q>=fFLV~kUy-d&tZ}^7bBQfAG zrsk41z4*>AT=A$kqeUgJ6oxsP5WT6W&sw6Wv3WqC%e?lTNA;iVWdiO0^PCh{_fKlck4TE18_i47(M?EXuUpspo_77RT zN}l;^JjmH<3R$(Zp6( zGBQffVx5hQ(Q~^OXv^3#Q37l;D*+z@9yOsJEnD^E*+i1mxm$+eLdW%Zw^X{Kky#FW zc`swDpB5SH@cUz>$&Y42Rq0RZsIcJ(kA&ToprAvhON6)1d)^=yNm6awBQ^gnFFQXAHAYd)5#@zG(Ogy^SUBq*+_RqgOxL_R4vfF=>y;JLm|1s;uDBll)cn``< zo+R`Iet+3tdQw1O`QO;osFd+5!il|<)vq*t=KU4Z2k%S;;y3a(z+!-EYnbVC5LlZ< z^g><^Vv~qS&EnDmJZH1tP|r@MyTSo2iS`FskHHF^%ujXgUNyOsicOd;Zl}qtsR6+! z7tpP~>s@*0I;OtjCz(&ntEuJ*)<)KsGz~`zL%zc{Te6Bfnc>k@QaPyh6+fwNui=2~ zu%;umu7LU4{P*c&=dtm`bM~RVD%ycA^0UfzqeU0Qbe^+YngX<8Di=m_SGtb(PxxT> z@BD2O@Xus2OMdGGl3Pc#V1#4qok)}Y=Yp7H3zY8h0g#0Odjp`k1G4lUUG3bifMp`X z*w_BMcBY%8lz%VGcJFz847vO)SmEc`BHc>E_?ZUsy0rhXyN)WDUPYzRM z0D8ytXqR6KQ@s1|NB|UYH*keVjR%N6%h4_cUIoCkRGWB0fOYnq7d+D&Pb{{sy6{HU z?(NGJ`zkXZUc<^J{Yg&G$K)yhqn`LZ|5{^Ca$=gozs`#4Tn0FZp5ZOP@e?fD8_KOs zHA|!2>i>3o%Xu)PNr6Y+I8lng^INhs7WnSji=I2zkB$~{OCpMt5J8_Fda~0g$mkWN z#{;rqpMYG!qjwRhhvGb4k=r8Ud6^`_R|gT@sL7Y_va@ zhmCzZzA#d=k#C+1X8qYhqCzt9g?+4+^$UI~*RLQp$v|m3vUL7dynY1-bC?{A?Q3&} zo)t4PkbOk>AfvF-Acd{cR#mQCG?`5ELV$HW(t@n4B^+`Rg*~Dft9L#Ua3Ay;f+DgV z9jedXxrf|A0mRL=-v|bOKN#S<4`DJX(nAsGC4^!-Gyvo0unW_#06)5K&Ff-A~fa^%>q=dU||qPFU@4OO7q<%elux;6le z(59jF4i$21wKbkRu(RO&Pl-#(3YnM@%%Fmhp0!*0s)2~{jK0f}fN;nW{rCwZAT{Nc zR(+oFYZZv4Kd!IKoLJx6zR{=+@6UhDgaPEB52(AkdC)slO*&L_L$-Ch$(CmhRoMI= zsPvzFhn{~VnY9~wzjZV=BSr+b+zP`?@Ym&$cT$}#)2bXoiP%ObeeOX)cuOlldS^t9%ZeW z?mLY4>_|i6DB((54#g#v;Ihr;fNGxYldFaea_4V!mdGa}eI*z^Nv@M04Uy%B$3jG+ zFVMf%il28IhT-6VO#kq%z|~!&{rIioGlX_5NCQ02h3*5z5<&wK)jrj^woe&?RncViktp%QyRN(-(k}!N%#xse?`s$Lw z&FyJ(%{jx*l)y0F3)ud%1u__GZ-|msJ1jeoyY^kViKIc{!>`UL9b7stv`$LarKoHT~ zibOV-b5SSxP~i6~Xl7V^A|UYKl0-2ST|pJ168-?1_?QobHM)Apem=n955aMCfRAsW zrVHL~XZJ15($$%ig9STk^WC`6DiUXaaBBGj*mDVAY!gGvaB?h=F+YGWo|(>%XN&ZKki4!6TdQ5TW)!n*TR!^5I#wyCR)ub=gI z&?R$pVjkTyxrfgieHvc{{;xUWpMl}u+($L#Z)H_4Za!5|zO{N0gYa}g%vhsab{~=o z;QaN`ECR10myQM*F>z*5ZRSMI<2K5J(7TS4{RiROh0Cl19TDNL5-P;m1y{f2_!P~- z_7~@UE+#9WC+p9@6Pb<8T`jO(n|@|B&GLA=Kp*tyd|YSs8&ttF1Q;x zTc9)a?W{x__h`>fu<7s#PojPcokVraQ(Po;@~UX6TH`kNYYbY;2jN6i(z>w}EfFui zrLFqZrDM4>KT9mh4@%`WAh1BB($*jqJbpG+1j_cyb^!!!Pmyt26}^@9*SpK}LqXhG z@3%GQDjF*KI%b#nK2(8A3f-=CL%vDl-ic7m?lAtg@Tq7h^VSesv&gqEv7#FYcgbIj zgg%^8%ydnE{HkiKC5x)KIAt4}%?Ph`dkWRG3z|?7udUGB>GB`EVmKx;g-scIy5qQ= zyleowY{aa7clN$2s9*WNgaZqvam?1iE)s-{pW-Hy2UBF8Bq8RFFNczL+6Gs#6-VA- z{q^AdvZpUr8NN<;bSuNcY-oQfp4KiTN(UiyIDZbpbbye8MFKBuf8_U+fOw-}vur!@ap$1v+u%np{vB@Hvv$wB@|u z!1W7%{D*h7zNst2t=lQZBAB7h-0Ilg@AHEuOp*mkoZjsX&4M2x_Q@!r=V$}aQ3+rZ%y&2(o=0qmG`ZSbz4%0P`9`0s0 z{qw~r;Ti>V*u51^Dvj-Km#1y|&k!VOgaOmgci^(iC^>*8E;IO0hpzTyxIo|2lzojJ z?(@EVB}>Rh6bE!-BqosWLy(&6(4W?H$+|IYa45}IiD_EQD>%}cNKmk=MicS!T$ z*2MEL-J-8}PjV(M6Y>hqx}Gc9&1-yrNcPQnrQgm%!dRxMqS!{)?obS7NG(bhF1(w; z{iN0M{#jO-@HRb}8A`g*2hz^?UtSRJW-lCbWuf5o>zjvEA{r5MD36RpV0)7q{yT44 zuMkbM!IpBu8Z`_}JlhBl4uS$@p4MkLipUwGY^yWEsg0m4RV74IJD&~rY+$zE+S{T| zuVC<^DJHBI|G~v?1&ZQ={suaeh%J-MCWiy2$!A>w)!@lVyUu;ke36-ZXUS%qAEO+p z&@&pr-dP`gX}Av^J>jim@BRWk+Wy*h8*5_%GYQ*JX*T~6oUom zWpM#bK0=4x_Q*}YQhz>3NeNisfN!3uOayqcMwFG4Q?SEc{QF1w&${Xy3$xN>uI+5w z;VeEYq3!)bO~SZ^u;nlGW0g_Q+qO2?|Gpb+_q|SoFSRPF!~}lbcloK)82zr07@g8z2pbAvx#`kr0yYm#X zMsC>jlwaJ_&sC(?E(0A&G^r9$^AA){1gwt(t@)?weUMSV~46Rwk@Zf z%DJNbt39fxtN0lI{zP++R0=S|Fw=0ymJny8W_C~Wsi=R9O2ceKJx*jTNlGYK|A{ZK zuGJ$DUVDzHt1LvnJG-*3UMnWE+qKfJc@842lgO6lMhBG*I3T~kA5++_}m zG-mIHMAw4bY&~t&iGNTBREwD23dJ@)J|!eKC}wKcH|g{bhq1-G;_!NN3pWU+M6yMm zGG$KXtdj?X{b=W78t+o3vHMn06Te=|U~%oBC?x)Y{7FyvohfIT-Hy*HbF>tAlA62boYorE5bl z1pA^A`@*;rf2un);(LT742L(rj!p~$ZvY4)LoAt7#sl=&%4M6|hME4)?g`Y=(V3YJ zlO%nk)#`f3;T>BGS+A{w-n+qjv;p@_b?*fODQ9Jxa+G)S! zz6DibnVqPTRSfU?0UUy{gVVGKmvNXwUeE1VqnXZ*|3j5$tlC2 zLk^yp4F}$x2x(zSFpk5FCfkn^+^2_se4#rmKAwnoK{vNY20U3M`LI2$ml7C&$Ryx1 zxPLT*=dwqdP%|CIyPcd6D#nS84W-SG#V;|c|t*&6BD zo&S1G#JMoWYAa3)3N!*VOf>ulMqQ$5Yc9{P4)nx?pp`FIeydFmo)O;U&cY4Pe48pP zZDx!toLl%2-PqLCFEDkuOG(y%a>?q-3#U)Ka_&$|ad8aPZph@{xL}E2L2;1SIU7NK z^kBPK1D?cVvvE@UT$|^t(o6b?8v4#6BiDrZ|()D?3wrj79d@tyD>9L*9Dfqrd zlBG7MX!hljxCdq`U7$8WCh(O+vgkRHv1DZE=F4zZGMm}_q6h(rS{gdRb`R=wwXv)E z+{KXDvq^^)A`_3(ZIFeB)okD@P%L+oAS8)!|GN19?yUY*NvT9M&wjKxADpc6H!JIF zd%i%LxEF)a6K@nkH6@)v8(%U0R=6J|{^KpF6f!-hL0HFHCmj{!uRl@r@P74`gr%}8 zZ#AIL7c>5zP#1+~gq&PC@7Wcyrwk;xT3ZO^YYux>YsTRatBXx{TfdU0=2QR+%6tCR zVVf~If)c)}*}*Eu{`e2t(TV_*(}Q+;>W2vdPyIte35W=dO(_j^%!m}ZY`-7IjG2`g z6Z%vO`p+ctez?YVG|N4sK4il3PNqc2%?I!aA`=Y3wmCshcAPAf++pLt2wK-E2@(5? zjUIL5|LrNk!B7cl?zHzf-`l7P$Q#?OEfIPbiGc1cQb63URaCTCZT_7-B?+AiarnKj zTm>4{ZgUeiMlta2$H1fKqx+E_(KNcmRAnLuQTGhiSQKe?&YX|dcn7vlX2{Hhl~4Vj zm}Nbbrb4ev=L9rt&i0{Krqs8y6AZbg_J*9{h=*dvgMFdoK=(F~aUJDr(8XXrI8baO z_$a0Sbh-GPV!J=sL7Wq0f0VODNmIhj`^EnNJLC38u=(sl8lTI!t=_m+IGg{~q=}OF zvwA?i&=(8LQ8rdx%v!tD z3gk~D2|?4ZozIS!3C_TpsRpXQUlVhpPfJpsd7@IoeIu<(y&6yZ0FzJ!0H)VFKpdgW z$-4oR%PVX^2oIFWeSZ!$Gt;a(%fe4&D;a0#6rMyX(D-Sa!>LjQ1#RI0;b8)hGZ?6s zKiCY7kQQ3H>OU<8R}ih75IHfY9=^`73JhcSSVi2DG520u4$AU(G$6-ld&$|hG@A02 z(b;2ivm+hr_Lj$2x4;0msr_Ww5D2bP?@_R1(RfM=71?lm?tX7lBK~}@jYlMc03h`Y zli~c{R{ZuT{5i`hevCn8LiRlRYUQJ0{e|$1=K?w)0z_pger`Qc+JpDk&1&Y8`T$M2 zwjphLYnX*K&m2JF(_CPpb2YBR~GTqn+Uh@;IaI0*v|=Cq_x z05%|5OvH1Yw{YdL=eksc&Pf}5>Apl@hSaws$OkI&qL*or()kU%KgXaDju32}nr2l- zY{E}wc29hzQ_DVMHjxFj**67rEUmhMYF+x*rlIfewc{Bm?JQ4CwWMQ};79}-4)jxk zy~95^(GkKDp|l&*ZNfWcr|xTpCQ4z8O;e2c;L^9NC$8RC@h%smbU9*+g`AhjQXYM!0C1ge(3j1j`+fm4#;Rd*`NXHWMRm?<;(C zNh`s`yB9`L;tv{>R@v6hKWt-!U9)3)F#Oj{%E1V{v>`yn@lgJ{xA=7xtlEoB{`#sd zA^;3V?F7fgJjDF#&aBG*Kh(WvRFmr(EownQ1wv8ji3o@;l_JthKm^1>L{vbK2oYEs zdXtt!Lj_ZJ3VdLK2!SRNFuOg8JtG~D z>MTJnq5c#6Os*Xt}LnYHT@>P!ym z_?k^9N@iGTZppe@`g2YsUy3-zzKUkoU_KXQkYfZwe7e`)TQqi~uY<{wV$j3VxZnTN zg=!@gQh)PAFmh;Qz-Ed%xwFUT`L`5}%D7Ysuky)M%U+Y8t8rlN<@XyTec20mW`P9H zkH-L6&L20%5PbKfdM{NaANR(Y*O^_oFFDP-I4@{;ffZjmmu}NtIsBZ=3ppEgFWQPF zK=0x-h7;y23}Zx~YWD+q5fS;^D(r-&R?9c7eit#pM=-(gL?i@_r5vy96ib!V9rFRp1 zNhJ`U!Az6m3j4K0l0}(Adg02wYr_X-1ygj^88<~OCJ$%l2k|=uVaP^O4n1{F6Yl#B zHX;G5j(@JnI@Ev-l(-WcQ>L9t8kzrxJidCx)S9GX-8ZD8+y*z6H_Q?4S4ICMf znV)ahMNTpTS044^RDA`47@URjl^_uF!G+2vYrI~f9W0lPUXTP5rQ7R0!92g5`9Ybg zv7CdGq|D+zJ_zm+7dey3xE`71f@%${hlgp`7T0 z;}|f&i_82YtC26Ar`rv#EL)xQ@O*zomi?+S4(;ygP4A;$hs@GF$y&em7RDm=gFdl? zzO5SYZOTu=dJe81{20{-xb;2;o$$(93(Q_6StV(BMPqH_>9VQz7zY95%On_|*9;Dn zFYift4-V3|>V_n-oAM8>qH@P6r{&{26eyp<%p{eEl^^wD+^h%WAK-pN$xOEU3{~i< zg-oEA2NK2azHACD*ni%E(Jc(;jtyK9K(x-}N3U>NTl@_CR`nC99<9b_99Bp($m z)f#4&OvuJoG4E6@+ef4GYp0~g_dNJ@lmGqh&~V}^w!U*~=IdNnE#dL2u{X5r*)4&> zbSjghq|-H|X7?)>Kn8^XIYim-?%e*2KcOPve~zT81+mRjWIcnnSb?;)%4JmoI);zs zIPxMH3h!2V93g{NQ;21mXMRqsn&@RKR(wEIjXeJLjGnLwf7RX_*U9ay7c#mcs1m$t zZT}T?$L~*Vy)`_lL>st0NEVJR^a$Cvk=Ux=0l z+vj8olbt;lr^#I$A$og_nSv*!#SP-LrXpc8S?pw-r!tL;PUHo41k0#p;{<@hg#HPI zc{K8zpQQAh12Bgr6)s*VFX0;sc#ThNtj^LWYo&^25B>_y^?0U*8PFUz_1isfx565@ zg#s+8j@QmG?Qb53Wr56unx6*y!%~~EaqT!MY5tm+cQlaEy9jfJbp!hg{!-nwWoN~; zECiHgL6mf&lCmUh-n52YmyTH!JEs`#8J6w3*yTn*}|3Dn?eB-bvj$g4pD$ORT zhYiz5zx0a7itA@D>g)kDQ)e@Y16THrY$zzQ*+B_YE@xmlR8)Nt})$rc=At=-8L!(P65 z!S%k@u`{Jhb#aU~HvJVa=#}~k#})FU+BN78IM8C}iK$qlYS*;6IH5AY|UfA}kR@Rmy4xqt#i#n39dGzHYcL~^Da z!H$|c)7e>{9vF;=^c&j7xnq31#%B&M?Mh-5D5~V6aLXAAr1G!S3VAg79BRRuSy2jM zI%9^$F)?&|IF|{sMSRg<|V8IQ`o0jePU%3zIHX zf3^v9tqvYMSK~VP>m~3DtMxC=L&uOy?TrMnVagI4Pf_4Y^6h>HHLWUR`mcPe=z|hx zk4SO-yn=TaY{Y#WH0G-e1#=$JBQ5()2EYkobGTUg>lnS_Gr>Yl3-O~$G9>A)rncHd zPDN$OXbT+u%zxExB_MGlOd- z1K;$Ue+n%Qm<+h6-q_>IZva-iuZpc1t+BGG+irMP#`Z?)WhyRO^!6?V^u~eCx98J~ zLATS(3XQq(srRPa=524V%H)GY%gmKY15^{p{YB|z=L@{2qIB~UaJbYJO_9<*0D1&- zqh9=D*+SkLa^cJxuxBP24!WjQYI7(?&-f63UwWx8a|$3z`OD5k{*FbK)p#qff#awzDTJ41Qb7YmH@@k2GYE`B zR%D83iN!jPY90~yUZmt^(14*l7_Wsyb>tu*>&d$WMI7da5XJOMA}dyq?z5*thJ-*v zTeD{Rl^X7P96qgGS~#K;+%eb2ZNNMT$Qr!qCU)F-9hTDea&{D=sq)zmxyI=eG}OiI zG!9A3X7cdxx$*H`_gXk)HXu)mfz>VotqRK{@@ zrcddbLf=Y+!qM{V&^lZgh893ipv&<6+%Jm}00_~AX!zd)KMoG-zWLeoqtWdl1TWGd zVc$?RQL*X>{foGegn^0G+qmwa$JpNyYR}fL&(-I??8b|(T6htdT9d;|(p6{qmftY6 zI;^_!o!bC zslt}r+Y!abJ*FGw?~K-d+^`z%n@_Jh zwWKe%MwsF8c;T%_H0p+PbhYZs25Scys=os&HrZ;|>Lrubo%GK7fRc;%vKhZh;F%0Pvdm#b=dJGA&_JhX@%;Vt{1PtDIpfObwZL< zWjmuCmm3?y+4IsAkBf!RAGO;p+Bw=b*?vY6CU=3y5;45 zj={0$3O7E5)K|IML7-D#p@5{-_{UE)3vXj_v9*0iZB#2epxXB}C3DIT>7*yi`k`WH zY3`B*B<=E7fS5>2ZPLe+&;4vAI|AVI*1|0q1&45|oaU0mIy)eK%zN4$w0e0c)A4-P z9vZqae9;SoYELWlO__&WbMYG|xt|&L?K~iHmEkGivr{=+x={NJL2^g6puV7$fd(F?P0~DqvY|zXWojH6cGJj_mQj@LQ@G1JR+W)QE!+vShxX^MOQ>3!+nA+7Y5+6})}W+lrW8Tjgh zl$~()WyVMZ#w9{1s0ldWV6$UJ!SyGbUJzDIEg!UdDFqgiQV=qGwrbDkZ@fbr>Ev(X zOAUUaECSU!jth%ntbwM2hf=Z0~(URHGCxXViR*ryK)p5e;lz;A=ndl=$eY&+Dn z`JntGajYl+?2U$kgA>$TUJ>~uVxX=yG?wA(j7tgzG5xS``uf0*S*4s`7UH|OsZEQ# zB+k5DEqAt>7`-sR{eOj$!y?`uLr#mX>bIObMpXIu6j&K4J3;e0PMYzU<$PS| zbH$AMM9C>(nFur2Ff_6Y4%KWo2v^0NoZiR-sSr7}7cD9;b2Whc}dnapJ&EW?RdD;&YO|JEHA)5>Qkq26AxD`Cbxl@;4xby2x|kTbRk zS^q%?D8OZ>v~8-5Fz{u1VeV_!>w%9q)7|F2#W4u-08N+_jGMx2NXBw@z+eBhCLX1N z8vXm2l00rg&5y-;&C!MJ^9Y_`If#iU>9e+wyk!Jmit@(zf}?GMadVs)zwk@Es1f)Z zr*SQThST{&H&4c^aD1&L2kXYivN$KrZ4YTbxF1>})^0GDrP!TiFBQzQl#KwhY3j<@ z{gDu@e7TFE(fRgjw=Ots3OmN;x}xb@_GGF#h*FOF+74x0rMtgVW92z9B$-!6KkYb_ zsM6iy>W z4xGgL&DUHcMUUOcDB?$xu8l8yV}Le-qdb*yf%@4awL#NXaD} zHMgDX;0;NAsj{Wy`R|I4iWA2H-rAnA=VgkmLKK^A__7MXlV8nr{3y$oRI@17Cv1$y zkcb3J!Xzqanq5Y_HVpXHw1oeF5~&}*+Ri&62cQBQ0x8n*mCY4U&7-?6 z#2EJMC3HOBlz|)wQyn}n>F4A!9**|P!U_z%*pWfqDY?M)6-{Dj5hRE5%;Wr>?yq%Z zA@~c_nD5J%dH0oOIv-!ul|bH4s1%rQ%&xa*a40p#d{eIR9H;*(s1y#{BFnz|m{C5< z`2vv5SBm(kU(|9ed&%xAO>nObcWo+`J4lb=`;q@KU{n92D3Is>PN+4_KMe9W<_>;& zT1~}IFHmU+5r#Z%68^XVppK-1a%;GsrJg&V+mvX)pX@~bR(GE7f#_`?s2-&~ODEEqPq*b3RVb8-hPZ!R}@u zFd+xQUz7A2!&N^!D-M@fx{Nxg7q%NIvb2U|n!OpQi+Ji+AV8I*Gz~kB^xwI@EV4bg zBf{A>`|*F{kUTC4J~w+qTt4#^E{=cImuV9$z!-|I3`|5{Dv~XkXJY7m;S9!dgJ0{*L~tFWUy! z!!_)L&n?Hk*~mROQN?45@lw3$_oKDh&$TH)t+KEwF((4u-t_xZPuv~(K=n}?=?xJ= z-9z8z7tMDF*`DZ;bY9m5OSRVau%_h6YaLNjrRe3xI=L0N>+6`WQ~ihojmvV>%G!RF zoqg}ku9Ftc(-G=gxHaM-lPsD4FEt|a`!)-of|UiA5357G`otv;kmM| z%w{rja^xvT8uHP7borMCCl%jXkb}NH7Q;*oTxf8_k6@?d1LtevOL9h z4PtuOPx9kv53huC=(aB|5dKK~i{@;rI^v+AJU;PVtKgK-_TPCh7q#@4iEn7ST5%@F znMM^O{tn~rC<;l2#KLZc4yHyZ$0U-j!GjWNMJcr%c&nkj)yOR(XE7=OF~9pCndsdD zR&VKPRhRpWFpe{W9$9ulZ#_#@=`<`9Q zez!}TLQKI_^N-?sSKOZY`#3}>XS4&g&wP80d#di2lWVp%#L^0=Z@*5&YkuY0e2OJN z={O+zcnJBA5l|nO?D;YiruiFl+o=pl>FTm`A(ovLEs%>Vme~~z^lS`W&QC~WfDSka z%YtA!svm@j0-{b1Vw`6?343d%3iK2KJ=Pg|L64zMPZ^qd8nbMV8Jt0~-4+SVl}6=0 zl|e+_YzgTO1YI8h+y?>oD)s;Iz_i^1-kOnvKX^$K}?n*TrxW%LFQ_LOrQ4_Z+OJAnp8R@E_seHNeB=R*mi;Uc6&3Nbe~ z)RfObFi@Z_F+mm0B~>%4cc4WRs@s^4^`tn@tbVR*P86@eUqco|CaR)orJ>Ck+IH8Rmj^SeEWcoQ?MzSbIXP+IB&#!XWqRnb;lZ0LhD zMcISD+!KF?y8TZMRP)tD9~=#!v0ty*t?h|xDxFZ5a*C_ZTbE_iAw6KdF82D9oXS!m%W?*LY47*VySEf-atJ(<@^m#BCGtjo4V*u9W zkB@v+r9lH1M&<$U^n+j!8`xHg?tsXrpEy9IRi&g79W(w~-)a@ZO|4Dz?SI#n#P^Y! zO$6Cqg^jw#QrfD5UU@2wbtb&3Gw{ieI5$^TEJ9Bu_^|SBHHR6)awJPdhVl`{r)js| zAuy>NC07e>WH_stz!QwS4cPNJvTnCu4?jCCrB?fvL$)jO&Hg7yjONYY@2nn^BYe)@E3?4Ixtx`$i2)&{US(tR0+#i#Nj0DYjUAKAc# zPA|zcjAC^hV>bbGEs&D2C*s$;^p`j0yZA=q0gwJycXDB^{KV#MY%R;)DU0f4#W5sj zMmJSix@*IGQ%~6Zl*PyF33+YVgE99V5E>8|I5lF(x(045-W@ckO&hsT|1XhAiP>PD z^muK5QI%%xpvt@UPspWC`9XAqd8RZB(C{bfa&y|*g4ll-nY?`V)z=l9c+2l{$PK3g z7vsFGHK73qf{y2EKA&$Fx-rOjv4=+ut^$MZ)I)S~FImOaU9>H;oYw7)#HN(i1}IE- z03t?q{<*@)U1(M}z+;NhDjRpBnPIa5b8VQioxsq~F)rOlr~keLzuYX<6Q^%zCGgwm zm_o~}7T5B2n8J(1Q4j52rfNrHj@{#275rtqsz3N3pof=uuqC$`3%gk@cW~SzV=glG zs}Nn6e^#h$e(uS_;}!qOR8`+V-QY9yxVc-5nQKr#(zV863z4*@Llz>H&Oq z2Q@)__M4~+577297Gyv{2GGIBkiV{hzv`bK6`nzV`@!lWGTf?L8~}1J`;xN(=E>+Q zeFka@mtU;yhxj+2TRFAvkP?loXKS(j;)eha%01I4bkN|G{v{B^;aDk~FoZa~GU5Ji zDPf|fQON|#UNOAeFH@MCFVoc$QSfYOj>(y&>SeboQv7xQo7~rVONezv7rHFh56sbXMBLG<;)zYTG1telL^DwN-~<31U3ua)aVh z96{E5P>{%!y~!AYMS%X!R^0l zPqsSFszJg(+W z3#N)^4L-W-zfhFTTecw|F@T}FcqfrsOB!Y*j^SH3*WAkDojS*D0iDIviQ}(WO7EX#v~QZ5oYgCrhm8?UC+lJaus2Mo&0qoQ;Nu~@KCrHF!^|w_Vc zi@I_7!_p+_Wpx|?;VWlDQ%T2}ez0LiFmjL{G_iU;H;)(*4T@j7>61I)q$7)5Z@gEX z-9#KzH>QaiSJmVp2vYtfLt&@Xk7TXc312^f@9dh! zs-hPF&I$3{x=lnn)v7X7FSl4x;2&{Ywsao9DIE3{{@jhvrY$-!v6o6?r7+@F`ADVS zE5#fpeMy$h)~z&C`w4TB9l5%W&gN1z>C{L1V;vs2N8KI~00}DI@yB;3!IyVTmo*KV4TreBt3!No%YFjrhMXN9Tw}G@|11`$c z#O7|XlGTN^x_=9-aFbcM&WM?>wWpx~YBHA_BRQ)xs)zbzpS=B3m7>y{vlX=KPPk7B zZrARrPu%28yqKr4e3+yQ=~Qro;|cBllQ|ZXnL{e^6;Tj#kJ(6By>rZmW>N?icmj68 zVF1$_;n)F@c$uOV?sxn5sh~@cP$nWAfvfGVVithdEV0`G8u|4D@A+fi>?byrc)DhH z=3(3H-Wc(3*|QsXlYOdXv0_Q6=MkUk^z&L9BwbcM7gR0f3*#7)KKDEAYP%p+?5w(r z?KENJf(AZ+^n|dp;?fCS&#TBw&SkYz(6v@5XD}4xCM@!cdh>tq21QBdDaSH&Osh2Y zOrdCb6wNr9GD9MWH};&rsngpn!C}_mu`q~tuHG+O#)zv+n4vxy3{3B>OZSQ7R^vYE zo>1wB$n~9*LJgTP9bGrHDjsqED7)NgnK6YK!c-MV+J%OZ>sJVwflr>3z&Xp zC~oVKXpfM9ODUr3Jm^2gDFf+m2K7E0-ErlcZZDMA8vGA&3aO$4zCI^tXhw(Wor0|= z@1fDtHmm{a_MiEFmGCX7Nv~Ib zJ?Y;?^`}DnzQkGHe1^LZzsZ-I8Lhf5Cn@*u;uNL-CQez;o_TGiqc=Uy`=>a?t77mJ zFM5%7Ct?40ZOUM+^(LZGQfo`XD<24ZHq#pQ3++hJ@Qm6|;^E@!%Ndgdmg8)MYyejw?-+wt zRB4vorXxd+W7rtAxKo*}hV6<_Q&^+_Vt(pN6F0pz|CPmb7+DsqdHILdYcc9OYI(5z zU#22a^9X~cV5OFw8=n(9R=LA2osClGuUdaoeiV7eg-gml$IOjx1b!LaX*GGLM!xDH z&=c0+Ce(lHoyv@(V%Kjc)CD`eqI$YwoX8;{Pk8$jJHp1ghw){{Z{{~L4gNPuRQ#8D z&N~;_qfiK|x5_qe-JvNtd>wDv0`n*D*O+|UtPbizs_h;h4GLOv{fI+O&+?a*;lgMp zAgl=p!V5y)h?InGTfH;8qO5yv-y(D2*!8BifM<@eoHY4~I*B-6kyex&9D|UM}UVIwGnz`%( z^8)mUEVn_PvelG{^J4Zsgp~x=EV(3mUU>@ublLewNV}h?EQROq&tLn{8K-&=VqZJD z<2_UjdFH)D!*oJ|AZy4l8xg}^LaKxAakv4otq!aOw=!b#V{2^gt!hu1i}zWhl;ymV z65VWfH$J4%m(B4E4KW^_-`;Zu*eL@Xb`X)B5_rR5<5qoKewoFG$aU>I4;3i&eYZJw zsq09e{eFi{t90MWPsj($vjYJonO=J?EJpp<6ji=X;z_Wg?j0HVrBF-S#_Ryrd0<7; z@UQ>C#Z6>De-ik%R)m$N|D4$R1^H3si>U)uexjFMt9-7Ucuw4AG82(*CPJNiGYkl( zri9XQ8b(m$g4K{oQGCGkju;=!I?nPVm}<49L~)0*(8~?xTO_yc4cT`;bc<4$_>z1>t6w8KeMVXFNWoJ3s zWkv3>*HL34U8$qW7V(`Gof+rT8G*}pa4QPm{42f#Ci2z>^1q$WA%iWK&`8$Tyb_c& z>=Oj^Docnf^~g4zZ$TTqH2bk$5%2e$1V3$wPmA=P&f*yP)xE1h0kOHw6MYiHEaQq% zbVKWA_xth1CDQpRHyPycVx2Z|LudVl|A)Gnrk@3`N8;wp%mzAT$c#_J*kl8z`#)FK z{Ey90*uRHLRcVr1KsE1TQo52MWrVX*zN`jtTDUsthi^}Xqni# zewW53L1HyG4|p$B&8rO8!T-L*(eCaAoxx89P}K;N9z$klpAJhXGFo+Yys@LA`nAH^ zl7>TOnIyfGI+!oxHRJA9p10VjCIQH^u7@*0qbc&O9UU30bcQwmXB*)!P$`zS?I36=Fy%0z0r} zF~~RWvHV1p>|{xnzdOBV4hqr}9b0^G)lA}F*J{6u^qgvLas2OC>}hP|{WwRoRVa?@ z|3v$gnETbA8Z5DU;@`F3sb?uKof(Oh1djAB{r>qO+Q6&`Mq)OY)48joDYEYrCnac} zdO$lf>GEn&0(56xRJG3uDYeO^Wj#}nIY8V~MK*yN*>r8S>5C~%tWOHP*iRl3UaBik zdGd4CG4;E+4fd9{B)*j5EMs|OD@c8J9Z%KgMyd6vLjL!7goW@-d5*Zt+_?B7N( zs?YMcTrWOpTe|R7DQRAC6Q);NpT2R2**f>BPfyBkc8ze~dHx9;^=4h0`K^PrI4Gb& z$0))j7n}=JWOZMyQ+zlmh7C)WZTy(gqb60AP&s?}-8Y-lqc?Tc4=}?vQ2s$HH{;a@ ze`$!cg>8B}#dR^8fH`HMhPf!AzVW$-;ab5%q2i06-TtGe_#G;f4VNtSL1hKV$ zS++=1)`6T(qFy5}OTzHN>ZMf#*$JcBJrcZ5$*{})RLaTUx3sPKQLKYBFN3 zOY=h9fX0Y6M$C*?rdM}j$zB%aNUdfMP8t2>)GViEuwLL>E zBT5l{8;tyMnA9>AaQUiefh74x)Qwi2z20t=0fVZr>*@29-xkLaei+h;X>wFCh&d&W zpRaY${%~@G`2VV6NJn*>rCp%o-QtG;YzBy*clj9(wdITcX6KCp)Vg_S$P%= zK~7yFa$d&_qDxjt);KFJsAjfiyaRZi;iuR!gKHl5&GOBvo%+u?k~zXAh#r_ExbsOQ z*}x@4oPonN#vQ`Vyc0&&TWy&0r*0&nO3A61F*D{;!|WJOGNCHI(5#K@J(A<(n3cwIM>P|g6%HP1Qw>JIVOLA~DbB7Z6c~iIH zjqn5Pb0Y7;q_nxLu~)!V1lk!fEs^R=(>&VTgBb5GxJMWKq<7LdeiD0=XBW}`*W z|8k$nMkgF93D#v8U}tr8134+$y42sa*-l)|U-}x{^==(ZmD?s`3Ljoyk!9lF9thwd68)WX5)DZ;>ZJr;cq1C?cG^}{}AUL&kEB^4~ z#;BByX_XoiRAq)Kxw=% zKXY&*;J_fm6j(YG^_VutiOY<&xpejifjB$l5@~%Ug<;e}#=pXok-k&0NwI8IrU0Y2 zrM!rlc4iHX`s8ie^00K{3fFUg)}Fodk9ryQ#@PmXLDJ+32NjXB ze4we_Nfm>5l4SlL8Q%2M1^XkuB6EY~hu8ZIh0g(}`5aGUeKp987ROk<<2G^1Dd3HO zMh-@i+-{_?9UJnBc_c73t?v&i4YLYN+q#`>=2nNuO(Z~Obitg9vg|tC>e=pJDvz&! z+Tx(t`L#50kH)+w>f4?WyP5$52J^66?J8-(* z_SGY2v=6re()5*UT>d%B@(`5A?aDa4jb_x$NYrA~0go=A*cI#`_b5{yJ|EMb5R);5 zCd2{souUEg2sy`m)S5jUHe$!7kEU1gZ$7jML|N`1Iy#T8KizY@dol;^v=Gfd`hF>T zKMI{{3|A>lKAf*>Ck2HF9H@~aHhI?e4YdloHda(|R=IHjD3@Aa8fRL}Z7;{tCM%tx zwbCO}fT}0tDlg)+7Da<=-&%;w2e*%RL^r2%^6JeedG2C;W(E>;b(DFqpGIFq4ICUY z$E=1=*ku&9e5XQujb6#u@OQ`oYXa04-ZMp*vS@T4n#$BMmun} zw+}Y1UAGa2XsND*dX((sVwV-U_bI6UWFo)cKchVQ&F(I4J7T_52`>cvJuuF)6QHMz zd-s46ch5FGSG@MNj0yUPH@7?=UOZ$(enNeUz?=ej0C7Waz^JM=$*<7 zv9Dv6B2-cnG)gWq>>%2IGu?TxX}ZH%ApqkeqgD;7p8RWwj3OB zY-?Xop9-3wPHJmX&%tvgp0ox2fxcP*YlcnM4)+$PLNAc{n(OB}hk}Sp2PfzhX4@}r z8zMM;7XO+JL4qex^IEa#>RG1}V}Ija$d$__)_`PNt~U8no$Wfwf*Tl-Iovkx?aDW` z%xMo^#)^P zPwM@_;LBHj?VhZ6H~hjQ9i9317BgPM8_y#gS8T-FFLC9P*UF!_-#Ab~_5#g&(AQ|f zY@o#zQIxw>)ug)p@0Z=E2nLVAa6<-nfnJO*paM>npKt~Sg^g*2!w~^IL3XGr%OYs& znEIiqTWh6`B?U|m*$HSsBemz3-3JIeff{Y7iZe-w%il7>p<+NY@gGst4EV zWx&0y8V*qf`#rlxG$Tw_KHrU2E!BJ-gUUwo1*!sJ}(SFA0Wuz!Hth7=CBM>t=kXwVa#9!)LwCOBE?!2VHeS15WBs9YP&W7ZC5B5-MV2LujTc$(IcT_>21O6 z$Ha|cVO(W0w`KiXpU;;4hJwi0+|T=%TIg4KCb zy5xTB`R zom^9yPiF!qb$kY(o4<-oli^&23bx|!?1Glow>^pjOg!h#3#?4X;lfhN;5u<#*yD+q zG5$!aLGo|gD1{5VWSvC>Y3% zN#xP&5E~tm2}@j7^c^rMDn!*Q;}bw&(&3J90%-o-3^~eb4^(y7e;#3&S*P?&G)Sop z-zkZ56nEubsw;{u&UzYaBjnp5n&d>}Q3KUPL0aG7RX_5s@_A4W)@nGRRwmkp+GiA3 zhNT+_QTU)S=ne>EFniYMlNr8uyHt&tqQkWHq(e>&{8*l#_C`C)5svIHl2;xFrmeV_ zxKKQQ^Iczzs(#zI$^p16W#vDwNIfpUI}knyYK}9%Pv_KYfW+sT<3NMPw%)KbXK&Qc z9x5|ct583cxjU2RYMz5p-i_B0FAp5J9+>+g)W_%#pVLN0(^ebn`ueYS@$gL4zhSz> z9^Y6@DC;XLP%JYoEb{K3ZA{j59Azz6#8>obtIT$#3yhzoH-LAzC?=mT7qm9{$|S_j z%(6TWRnT5G7M6|elqI1eXw}&{n^`)IQRQQ!!;@XUk6*#B5}QkZiD+ms=h-X32o@x& zf3!c_|656mg;(2|&1f7T`Argm?90-HqxiuidYt3??|pbM{;BoAzBtpDZ8yZq z&$zA$thVg0=M%UkC82N{vH#JBiF2r%8Nmz-Oa75sv!NF;QuE=TB8^f+BqgFvhN_L1 zAL2kSl`qxd&|Y5kwSSoZo=(-tyRe9~Bh?rW9VV>Zlo_Wl?qh`A|1$~ZUm;2rdqYA( z!|pHC5CbQsQC+~_w)FC3+g8eEUu!LK=3|Z72336lSCvV(?CXuE@u@)Ehj{c0D3u`cKSHF^T?Rx!%sK4ZfCdpjP z`=r~QS|j&S`s2?yF}`LW5%-6=;T|pm!NZF0gtdJDi_VtZ^@YdBQSS?GbE>xtoj&>R zVPfJCKSowg{%`x)!!^dJ_lk|Vwxrlsz7vU8V*ef{_EAkZPB))R$!{`ULBHizQow>| ztGrFEflk+or)fLIsx@OdaK1&@(l1dY&}TDIH(jJt;rzHIdZZR?ZhAf7h#Ujy(yj_w ztMBVmxZ2V;1L)oUEm5Xrk6>Qe%XF8e;Kwv8-|qoxX}SWLSy}vhtc={b&S!*UntgXq zr+z@nv`o+&-tpmZ?-F=U$ATRyGvT&I_?%bj?|a=WFJaRZ3%j3Ry8;K0uW#~&+@vJZ zbBl_TjhWYa8mHZ6dH%{XI&N@4dORZuYSXjGEg@oi@RZc-lU(HEuLpZAw2RL%-jD5! zTRF34k8-Rl{)Pp)M&pXVIDUH;v9t38Jy3D*_ZD6O`@ADc44LthyC!WXPG6=DJ0hK; z|9dXjW`>sCP|@vV#aDreCd=bKM{>_P{GR>Z0PC@ny&rH60&<*4M9g2Gwz&zX1Vk_D zY4D1lD5o}c%TEK}Efrb)&@qxY`81{A#8>E;)-qw)g~lDy91Qn^JPCf46uE^fNOn}> z5u>w{A*Kv0DBbzKE-6@cV(MyZ+;$=ShRBs%-ZocNcIh>@j6WlO`Zt$TKS=tKi|59h z5i4hr@`Lbd+rj+;>O{IP?-h~qozAPl?J-?+1`@<%J&b8|}uJc`FjrK!3)6Qf>wC#W1kqOtFI2R%dMuod%0ijO}Pt$REAO{E^EBVBB z!5q4}BKJQ|5QF?qm6iW{c2D4uZ8EjzdF14DxF^4dKkKukFJ2+&9sA=s4ZTZEs1rJ- zwk_t)(rqrSMO5e85PD5qF5J|eq~rXx`*=IrDEk%pDj6wre273z7cv{DHyw7Q7Qrv9aq<-V<)? z@lTGIJb_3lmjDrUF9jJ)*6u*VkH03@gxH1Y-?H9N@*zF9Q$yn40eO=?`?sAFxpJTI z6sdKx0yx%(ds4F{4z`HV8{Bx}KqX>4q^AtyF9o;tfUD6#k1}&r_U)MTfb>|T%aRUB zcZ^){vXa6{&vB){oqjf!bY&0ml#Mz4myB*#+-C4rno+8o2qv?p?c@K&)>pIyBV;JI`jGWIp-Cx z+2{V<_xFnLb#a7y>Q3v_{`BXvkI2;lraesKy*kJ!#79W!fP4rg38mdP83=xOO!PqV zHOrov9_F^ae!Ob;c#AXqh#MrhqL3%zk>5L^^BQUz#B?0bSKFn`D82j&vh)+1S8XsN zS0xrIP6fT0L!c|Au0w788>!_`Rr4qe;GZ`%A%@S-muCXCYeQCJHSgwsT|eFEhILRb zAQwwit$rt|LU=YO4Y)Wq63u*8UtLx5FWq$Iev^1 zN5`PSf%9}rbIyiGz~}xCH+S`HJg9{n-KeRXZS}_Eo)q{f=N!QP`L_MJM{NI83ZEPP zX7DI;BKs3RW!C%0_{UcLLhKvQT{y8H`)LBE%hXtaqh+$*aydf!hs5QWHt49J=wd~F zMbiYU9kA7wfLMEIbV0F0v5K#mzToo~CVy|KpJHUy!g->vh8r#Wd1XJ_m&&O!BUSQw z!k&~&G5)7IC|fo&K_fofOeDWok%j9~_It~MI$bN$4>zKJ9(Jo5VaGKYfx$>(r*UC& zR5rd_5uxH|s0-`($^R6lRmK2t!W~Y|yzTuQC*n=HQ?^R#Gru$^`#+tanUk#M1xbq0 z(`@Lnk-v{@V3h1f-MHiRfl`D9_PCOu4S!AEu+|)&rQA3;v+*SA>qMZ4OR1XLh;c8w z6#Ax}x_#oBkj@&m)qJd*tb16K=anro_1$0b(IIjt;WexN?ht@~1$6QAfBm3@x4LQ1 zM*FObOxT7FKl%pGto5cy(3#C`U`8|qaMntBGU%6YmH_%;8jz7#*n{wp3^-VK@M<__ zwQNs{+y^{X(tv!chHpE|zexC^Y~8SyiSJ4D$e%PAR|@OmbhH5p^P}?9r=AsP98H9q zlHOJ@A<+MZNqypu?%|cDmha4_<16|mq4J$fWtEdwfK;A5SmwFYMIuZ>W@W-={I*1- zrZ;z)dgrf;wvd$MpS#aEFH;2$4|CI_beD%Q31%KE0@aQrpigtJ{`a>`W_>jkAWJXd z_d(!WmF6VnTSmg$q#MAws_p4k5`iYFq{oI6B67aU3E2_r&?-kg&o1z#Td{)q=|kxo zfl+>Dr#EW+?)J;F;Ik%p*CQf>OE@>S^+u<6)!=Yw0`&Lf?qtnhkl7-$P(Nn}{_5k6 zTwMXu0tY0=2IG^P6msOHD826^$S@J;$|O*PAAyeBBH>8CPTfUB? zC3^WFtUbHgeqm(T_IGL;I;Y3~hC!ye=Ho!}6wIq1+RQ58&1LzaSXG&gjaE%84N&^@ z<(2}|cO8Bd59qQ-Q;I)q>pr#9MG6eOsv4I5KF>M-_Md(F_g@5CgQgw?M;?DmwynbYjDa?d9s}E#CL29tz zPr%jflsJ;B*DLk9RzTy2{%oo3W<5}h=6H|gzJcF z1fA}{*r3|6x4Aw&(8y$EQYw)ky(1ShvdH;e(~7@O;G1nSA-L!*+kL6SXRpapo)$UY z+Mt-amEmt=uTc&u0@Xe>)s^&=X(=7?i$#-}J&EUSn>NxbjvY0J0#x7`%*# zSE|{+GW$%#>?h{pYqLzOqgw=s;IVa?`4#C?-@9%sFLJ|s?Ge#4g^ zK@l>So&%XMdwlh9JFiwa-VXYctb~in38N~eq5}S_SmQWL-^e=wXteaBQ*nm-l6YBmu>T3ZvaaU^(0yl9I~|T2;*B~Q8cd^D3?jQk zyV}p_^&h_W`@lzat1|KJ(^Qr+cfqgnvMKl2@N>c4%MAr3kT=DaPb_{uwMhja?)hCL zK&ciIH9aaB^ev1|CuppOI>=ecogzQck0k;nQE!Cro?bl7#+KUWN5=29l?Oq7IJpKO zsL{Wd{%b~wlHHfh{8c0N<-TN|ky=tw+kWGAT|e`7OGrek00et}usttThmvtdR#AFw z8K&o}n4EH1StO|NQ`mJg>)o4kkg<-M`L=`pqIW_PbK0h-P+ge~ZaZ~OrNbDIFY z^mj*pDW+=7{~n-GXD>CM>w9HY52(!jkUJ>8_yjVO@-9_6=9&G7SKfU-ULM-ds{Hk= z4dPC=S(mdfQ1|gkYx-%_IcnWaof%h?$BQiy#ZFIlD-m)^?2)x@>(Gk9Mz+VL`_Vas zPp@jM$nWe2%=4>%UBPt%uk~wibw;gIRhvs$4fVZx5=;Il8_s=#Z3@D>`Xd!TWQ>$u zeo6)V&+-k{%r>5kPuN!LRD4TAh5J}qKldk2Qw3%DC>!Ya`oE*Ymv;a2=6g$iYdIVm zoZjie=@#u}G-sGL;0wfR;&b9%<}mvSncQ2-}G&{XJ+@6q%hGYxKiA2LNe+Y|`& z>ysYLN@;6Of?L|}Y}8P!(iuj>3q1b&UGj?~$?pZqfJha{o}{)x+{jN(_b>NUX$!?Ux!3 zoEMwWqplv@S~PO5dt90=b`&bT;#wh1I+XI|zA)R)>6J-q#bDFDoWYdwl(21)px+}e zXe^wv_pZThr8Fk9n{H9|O*ZF6t%i0F7^5|YDp9P~r#s$d;ub9i(=@S_w-{dHaQ$|^ zL^b=gM{Ul_O0i~RWSamG=}xy9iXWqzTRKq?V%cIhTIpcFu%aY^VHKbHUDO~t=Ctr< zZb{AFDUYaNEz91al1kwULbqxgEPT0CTKV}!z<&`+rQC$bD%*&qMGI?JZ!RWbu9>qz z=$SC^>ep)TJ$@<~N`A^>!N#Fc#j!!U3NIx;n`pkD^)*_QM>*j^(Kzk*rp8=~;n~JL zC21QK0rckSkxWc<@NkanjvWRdwoK_@7-$mSF80ex)nvKUp|3=+O9LK)WvtM&8lDHg zKC+d3M4n2|vt%EqMkv?$!sv30LCPr%{I(b0czu+u4y3y=JZS*=Kn4CQL1oDz%K(|L zDY5!9awz)Mk5Q7J7aR9JnFW1_+8EDyo?zxmqjZ>Pb~(}u2!g2MIi?dDG^OVC;(wTm zDA^KO^My>-?|uiR&VrNjL08p?bJb6}{hz>9#~Xs|twbKap2#`kVx22obtk(rY^!1J zl42vA(Em)K%rVky^@zh_Jltki;@2KpoQNXX?7bq=W15?iIuz>*?mab=z95?RNuOpv z?F?{zjX`sQsK{}+Lac$}$_^H>ufrEq(RD&mVWP>)1&Nrfjk(A(Mo> zwC&GejFP@eyAV!jDoA2FY}(0pJ9Bk^d@J^6b&C1S@b;zeG%K)ZXKVW$2_R(r$_*NcW@8h)dlysX}F0FQ_p* zA`({`{|hDpsoWgALdC4c0kMlON&FMc#Obpv4TUFc6pY+auh@7(b!9C?$4(QjjtB*$-LRPVv6z7%T2 z*0{1;^D)*?IDpkUT4PxkT(zpCY^)Ng?yW|{5t(~&pWXj~t!Otf&NnS{@W%0f0kZ{S z^lif107eEJpld*QZ|j)v;l_T=adS!@O$FP371>o;1bNc4! zAaXJK>(?)?FBKKvP>(W%@Y#HyZYM%t!&}mdzR~f&naSr%2;7^c8}Co139Q_cs@6!ejy`gXg1rgc;U~P(K1N2j4AZugjl!&Ru9+N;{I@ z4uL!Bm5}x(KYpxJZC@|xKTzgKfbflr+?^|(w3DGFzZB_wK9$bL9zgUa;9pq)M+odL zwMbnSVZokK)B{@mH38GgXOB(bGhPC-<*z#WdC#Z!XH$mRm-pw^8esR_Wdo+G+UFvU zof0Lil0Mv%n@7@O?zegZKwN%D)IcpEWB-1>#gc#kHW!!r{-njHzFt9Rg5?l@U9r{5 zh!#edfi5Q&vI zyY6ey>fe^Y&ChxvdIX^xCczY>celith zZ1Y}H0$#t%(Flv=FHn?rLS?E>W0dh1OoEvYYDpj}LB=&dA*41eGD;?Fs%^ApQ$f?2 z5T7>-@>zvD6h0px9^b&Zfg<)Z!GX8)mESIrs(otx93dk+^n6nZ z>M{j&x?Aq2o{o@3vilq+z*3Ox_Z6mcFOIZL!NbEHFbNKyODzN8!Q?3mg&BF@s!;>5 zYjnv`@1#yGe}A+ob~v60_Ou>;@c(pX`%vC$Rg5CLRKez&PbRNXp!;mEFPkWuaI1~S zVT~6@j*FE-0{zqWHY06^izKjX9n9~&{Q>=-BY>O780zc0h>LMx%k^AJMjiN7z`pMs zgG}{VXKR$CGwe)G0wM0Cw?KMK1UV{={dKXaC13_xh_D#c^nb=!lA}4R=qo+1{rY)^=|KeMz442424C5mKkScI!eZ4dAAqjg_gg-J z{2xYHEd0Jn3Dbn^e8OTk3+XS{?Pcp{vRLoOW`2i=#Yqu6Jz3F5qO)FQ($=w&mx1_JPXOpB_uWvS+1-7} zq~tB5barsb2ca*D#bVSt_I9a5}Cgp!7s%D z8@18D_^oGm&Fhj&Ga!H6lYH8v8`E83+uuK(e{j|6d^S5bZti%|9+9lrf>{S#^2@NW z`zA*E!w+IeVSLl{hW!LG6c;Y{<@}cc`*%yOT~dujxy~?M&WjOdGeT-~4AP_!s#qNEc^KJjm&dNx_ zfw=E>G(VtlL@C4n6tp-)(lnpoojl^%c3!TkjwBl0Bo6&K$>S61&2_f)a-^bJI=GSY zEWi+*ciK@OSPg9U=C3=%=|usZ=Y_wa`3fSI(aJKKV$8qTYj)|2grxR%+hk( zBI!Q3*yEDCFL(zKt^-~}H%tytX5x=yWK6h-O}ku1@jTkF*Pg2OFx6+o2k)S@l|t2x zq_`zeuc_jjbd(^G>Q*s`B_7yP1Y`E|d*5byV5ec%i7;kTmW+2SQGTJ{%T%KI=;VPS z7`BaUg?S!I;-Wio9hn0+z8b$tj*_~;^^WkC4>-ko@h4%-(j9Z~aQ3MKb+W4WD1DF1 zELJSfDn1Ho(DSw9lR4*Y>@Y6~?%)W{>2XJMGhc=-*%lQ>lF4^xyK;+oR(FBAin}4V z8^16758x4yH*ZV1qli4v94Qv)=h*l?lJB@U)V$`}33uws&5D)~*tb2JgOSvhoJ`$NdhMC)7oV4mjD1~`n#Gs#stLqrCF;}HHf0PW~Z;T zotFAOI`2@F9b4RVI-#gP0XbjrcWMA8Z{A+Txo<~uA$S^eWJlt+r}kmV(=h)%n#JFj z2zvOmbAfTPUPi!T;>XC9zR~DA`%@>o4kB+d-s9RA5sG!HNJ|_E>|93!t_({uhb+FB z{Oo;9`}{=2$c3Ry+3D^!cXx+lizB=E`3!ICvEo8*dA9UJS6rUbi>IJ*x{2$9PQ>&+ za+a|$7_l8ya115cYdZV>#QGrfk=du!UcF%UXldR;gYQgtNGd)wdgzYhN`F~;)RPzf zc{zJqcdJdmE+3wQF8D4Ma_Wyf+<2Fr&QDeOCHP30)1+61Q?BDRr5S-c+%q;=2NkPl z0T@Ryl#EMdkW^&IzWBNcjj7jRq7KtG>;eOA@r)LGOCWt$COOyC&jh(n0{fd>s9Y4< zIEVZAyM+*?$6}y**6+pD$Ns*rZY{%|>FISMZ>~pV zd_Q}lTA#hNv9S@`4=P}++IHxP@-p+N5mBS<3}+imf+X;wcpzR`_*()Sf)kVS@Q}ps zHeio_jFkR{SK=eD%XDA#2=!_!4FTU4*?XYk4`NmC;TK&oeV z3B)1}s+`hg_o6RSKYc*5I#4T}JkxvTFaQXuOr(fte&z7a-tRVuGNwz;zp*~q3&eFOQWlvXqcsu@PzOqtQD^rcsyF#z5PcK`J(!)&y*{UUr7n*WRcd=O|F{QH+{JecO^l`^u5bB-$L%Fzr9M!L)o zu2X;VT9fj*V??W9TE;y5Jt(m=?dnvvfei-W7i2O8*6T#)QYbxd zo4aEM_K|{kz$$fG#&(Go5+E71>+5kMxq}N2|LZW206tDc4L_Ol+3v2DPE-}RmYZq( zC?Uxzi|-y3W(y5fxc(AZ)^nif^)}FiIL5QVANp=id_KY*@@@~UDu7^~D9j_3+;325 z3Qv~N+b>raZt=J#3Ro^Ei%Qqq7Mj}}6{7mOTeyF%4FA-egP&g`9E&9cIzRvJ!_LFw zXd74_qCAY{XFhlmqPgYFUY8BMV`M;zf1DqFY9!acZ$A&gRXhn+f}F3vJLWs%u}&6n zbjWWFsuh}cPs8JDau$eJ>kEs*OMVrW&49z+`Oe*y?CG?)bZ-8tK~d?MR^NE2mx0Y7 zc0+Qi{q=(`81to4%~c0bl=vGJS~Zy;0CqI9ge8_VohlkQ?Pohxe;xUVf!WrFJP26w zCS%@1%`vxFxclLJ2Q(OVUOu(yRX#j+z_WrLJ8e^5Xaa%_wVx$w6o*D3h*?bg&CJ>sO_ zRm(#P^^_D8Q}UPJYcCXXBa~T?$ClZdRH_1LxRuW**BeT6 zz$o!8BQjGvcwf^}{{3_Fh3AjDG zNCb%Ng9$a7K&R4W)^Aw4NXjq8)K#o%n|pbMLIdy&b^k#h!i=~#*~Kq6I3hRW{v0mJ z$ug8fHL0Eb8Rkn|!+v9Zu(n3N86`jt@LE9mj?V`n+dlGKn7d&U39(TP%zJ7$b|-mo zxHE&vb|5v&wgwAL7WR@|RoZ!ODJ~`xOq3;q2|Oc&k4!2&7rUD6+Am0zgXF@Niwxz= zFp#TA>7ApjI;e?Qopru{hcdE%DHr7Xyq{U$13&+D2Ch*%2oZ{~Z0^!>@-E`VzlDn3 z{n|!Ur`}VW>4l0D|1uN{1^R+qp)bqO%!sMy%b1xRhY^i4l=rN;_@3Ke7fw zn4D0C!tXN@-lb4nqUa=2`=Ye4+~b;ghoMTkwt<6pl% zAm4E_pH^;i>ZO`BjacMfY-j;D)zjBInI*A#MP3P^xI`e+a=gH0T^GCLR>M1_vdj2w zD;?6vXc0R32iBP;)L$|Y^LKEe(CdFPxqtu3)Mt5O+mbYEo59DrA-?~OCN>UFLUnrW zi8;ZU5x9J}ahkzUO=Wv`zqtYO$$WXov7Tz#^T`cj zXFQSn8KG_-rshPqA(~n!JniP1D0JG@cy`Hlv671zP}jmgr098R+!wO7eSk6rz}??yGT~^ zZ$Mn_gW9Lp8fur4d7F6?q~<`&xigqTXS6=FK-w9v@1C8>-aFy`W5Z(;8fsyel+N_ z)A9Db_(SFKnjCtT+4F84%al#olnGwA>2nmOqy#?f|S3}3V z-WGA^v2OrMuS9qA3oERe-sVp zUf9^MA^yO*l+S?=_8Ke!dOw?aKka|0tI_R#PYKzBsXbnEIbi%PGVD2%ny#S6xx)RB z=lz~x=XBDhWQWAcrp3Ip@B~RfsaEArXI}f4X!mWb@6$>w?HO3mf9B452XYgDzq#d^ zymwDTTa|Ow)a$J-@d6{Ye#OYbW6yyP$uj|iWZw%5pNTL|e>U+DMLOT2e)J`>ABOM6 ztvR~_(?D3|%xbjsucU~Z2`FD$@ivPlXX-aZCIY0r+^(M7yXu4HbZn)q01n=s234hBHc; zZ%qyRi&z2{Zn?o>()lZm%ezM#<{;$hRa1S5z7W*`#o^0E@<&p}Pwg~bI2WjRV?Vw- zi!RZvFwq~1UrF6|?srQ}Obj_(R)hll4;n4HVw!8O3?)A=N%_8128{WwwC)2snT~fG zU{EJKvRiGKrRLqeY}yG+!KO{o-XzAbv5y%FnpqM`f19-<^i#xpK-e#z&lyRMU_6qk z&5Gp>3N$YD zi0~zXA`?%0^`#2L^iXe$6YhTlhZWUz#I3a|iS(4zB!r^dnwy@0MEIzJs`NseZ?L8@ zq^R632-N1GyR3A#;FPW8xZyu$qYz+L9~!-&O%JPSz<_y6ToH zr1L#uMGxy4TXG?EvxZ8_ta80lg)T8e9U5$)o$jKtOnu0fvAwZn;pU%wC4zclXn=w;2j*-3kUzG*ir`luBO=pWzwIuSzXUq>RhXPzh! zU|;fX;p+VPcsLDj>mpsw9%j>oFbZ8(X*V^+hWnT(37zo+w zp4SbpslT<}A^Ipc4Ly5sb+$`Yzcy$_A59cvqB2BRT%6o*1fQ4K8_7Hs?1WKQv+LLM zCR1cKwO@9au`)+3vVN&XdYoLyxKxZMVOu$lR*bRnn)O_Trs+7;{bDYqEB&y$Dn%1^Uz^t&d;15!JFFidE%rWDSV9JDNUUrXY5z4BIdNg` zpO!8fq1^Ay`22M+*Po*6B~C`M@X3*If0e-AVn_<<%IKhVIvUK(iE%Q)L3Ds4|})$uQV?pJ~U zo!{(KR86nxoDTC3qS+3xcRQHn8I2CVZBVp-=WC)dLk(-faN~N$tGVfG(AIWnS(iT6 z#?IsrM!b>uNemMQl*C`klB@d0SbOFKboOzgK=#rb;SMdS_GW#tduyG!FXZFk6l75b zH{x&ocyQ}BB(pa>>AqAMQ?zgfPfy&*VM;7rNWwwh@}4aykus&gcCY=w!^z zVhitL@=@Wr+&c>(16>TyGGd(7hM9j-27Q^MA|0?@^IuB{7+xalLhf zWdWKbyNDPU7Z>;LSNh^*o+hN`$&0MrQeR^0}< z|2ykFA|cadYi4^-ZD?{#2l|(r-P*BJw2CJ#Z8{ALxUa)3W6e8{I2|7h!H1kq$i(CE zv!K*fn^0LSq$w}Jt!KH((>cY~ZkC-}Zhov4gcN=;1auo~{v(G(DKFd%%8HWaonSm~ z#_r)g3KhgYQP-Gh&=mvZ-Dr9s6t2ZBMYReDxbUqxgnH&YlFpyQpFQTkQZ#c+C_^7M z&Nl5B=~%AR7v)qNrEiG2F)!hrp39`T5jKsVgD==k~ozVJpno2!d0 z8drA<-G=n3V(r6)fBEcW>sgq6evYAEO3_OCYtUXv<)7>hNQL%hk%Bnb} z33RfIiI)(`D-zD)0+H>+w1``M%2evY>%$@^;}3+1{1TM>H{Lu}nZuh0x<1lBqdUB( zO`u~Y;k{)KI{9FE%eZVzDNoABH9I~-ByMXnOI_+_5k&h%qpTuq;xN02UN7==1v;a- z{A!&on*ZV+LHgEFJX6`T+-Hcq z#6IwcwvLv{btj^Pd!{g~!Oqm!)_|nTIRuh~fn6U3EKY5^L_nCTgRbJ9*!Fd$9Dg^v z;J?5W!yHt;z4%dO`-kJ>u=vhS2Fq7T zPl(qZHn~OKh@s*AYJRE1_?DlM3wY{NrrirE-erzlx%nAA?wbo~$K zz(tRZ#oU!k>GaH!{5L>a-M)eKY34+{Fg=-u)kMA5s@XcKI37nMd@#|Aa7pG+R&r_U z>(a>#-<8E;#9~xKhF*Ah1bCgIzUcR2-y=;a>^_G1``nwLs{%8W zv(m;-=Mm`7KyESii}Lm89NtcQCX--2(9vPn8er-(9(BiHI8!rnWCXG}FkM2P@UpHq z6nvi-O2$MrlK$fAtOMQASC>}IK9_9bJR+0HA9+Jm0JYatLV1KrI)%TP3-utzYK@lN zmto&oR>ZuXpWItmi1{72URKuxGf zlML-{Z(aUmSCO9-Y&fp^P5LM}6J|Sr2abU(M>F}cBq4wo7>6}Lz+rsh=VbEYIGHIV zFS!rOI>0Zb<+;1c&S85Jd`qw2>b3rZEx)pg`=;0gGrKCuoY;2~0!OIHlKrf~+ziM$-Q1c4TX_F~3nnN0`2ayeWGsP>AbJHx#0!>CWA8v}d=2{@1^JC(wc&Z@$a6nYHY}YXI~1cC9dPoM7Pbd@O^| zdazZLq$F%R`4lDOclldjb+kBEd({zdK;%1TQp`trG1uvZA+>DHWL1hvKg}&n{WeyWcJu#>RN|$ZltF zNyKFWLC$J5hqyfN(~g09JN~|~TGm~;As57~-r`7v=3r;+-dqgtHqWG~KLlwxfhZ{%t={{xI=60!VNaHNiah77lVYMH9z+of|^OF9i1En(k4L1J=qQFK6l zszt|pw;nK4no{ypedp(Y%F(sidK(0Oh|KZ9(Wo}$9xZ$#XFSUB!BTvSV3aA>l>r~b zQz&7}ay1Yg3f*LYBWux^@)YDdN}%-Nq567KM_DmfxF&(o^CqNruFhkXB}ZpHrzWn~ z$I{!<&wl0HjwfdpxS63rY^JVud8BRTp!ontsnSUA^ZIM@+9S!$duC0Q-LYGn3edL? zBFDq>E*@Kr2teO!<+w*GXX6qg9&E+)GkyDjOq{L?DajLaeQQZ2p}Rg>x)d)Us|>PoD5e)q%01MfhA9_Gbs7ajwy zN~hS1+*VO?-21|cr|5)He)2zjEjSmXQH~Ey0Nt0z2n1Xr(iZ0b;mq)n-3u6M?j#y8 z)wHR1s=k|SqNR!Uz+bHf0}{)~(rtd1h*qCd)OE0%00tt_)-d2mh&Ou~3igIn(#Zvk z3EF)&tYD0*=gwIHEo5dXxC;j`PxRs`^x=Vc85wX61WoI&tS%gdNn4Y=+s8HhTVlDER8ar4OU zugiad+A`m1Cpc-c*_&(Z#8??sJ3OeVA#MF+cP+5d#hXhuj%tJtwUj|~SokIR9>hZ# z28sINI7ovoV%_lcy)ItFuMrQGwz3(y2jFq7)4^B1Pk-o1vGcy=F;YJ9+Z>*I3o1$t z0+L=T8O2Z*3YWC|UkCKgVvbOG$Eez4ieurz80gPx=7ECF45wWohdJkgsr3g1TiY&4 z@~G*4z0u`f>@q>Qq8vu>?8!Q z6iD0hSca1Zc;j4V(o&q0@m6MhQO>=26-MSbD*UQj8W%jTaSMH1MRJG#sj&>trsi%Q z`^f7Y?07V6DJ$OOjXucgGh@hg;z0iE5xgOpHK8Y>46FeQmUL36s4eFbKXV}f5Nlzh}<7PTJrzP zQujwbYrOfdb;i1O9X!cfadNQnnw{X`UBcv->W|Lyo%kSI49VcqAoOQP0n$ID!Lgm= zsrF!vSi>o<61hgyc0`k$5nEykjj=d)Eqcx*?PHAzESi|$xeN~vS@h*h2Ufq*j{!^> z4s$-ZW)jA;6UHg)<~AI>k2w&Rvu616hT2J5*F(({iqB+>R0C4GDZdGb;^gBT-CkBs zfL%4`W<7m9#WsUmp9L$1Eww<|`0G}12P@ixiZD37d;L7a^Yf^Ncsb+&Jib}eN$Hc$ zoMVB9rmEg99?uIeehomxd@Egj26zCj8mFx-77V)D;vKwWG)24A)k9Oj_WDh&i0^`I z6eIganfOv^2~^YnsP!qJdd?%j3lj@k-7Oy(!NhdoO&dRoC*b!%I84Q|_w3WHP2LTC zelse)B7>YwxGD&}#xzH_28BdqhjSo0JDJXR52C8~W41{GCQB;P z86J)A_LZ79FTFdm*Cvp3e~Foqz;(H-b$)C(?D&GgW?%JV!OieIp^eS@-8J4Lrkfb! zdfb!|`%TSsqFY`E(6dSzg~QE!Lh0qkg&FEr4N0fLCs|T|Fe9GtAc>$Ah~-I=;zAd> z_z9zTJByg=&-Ha_q9jfW6+J0JZ=38W;Xj{xWP-ogEb&d}59PJe);@?jw{-@HBGRr} z?)#dd;ryg?qS0DUcX_oeVImHb#afS2}!&W)jr3W(OwDM)wFXVcVfpB+^b; zp5&vf4c-%7^gb4$D_;taL5JAfB8@?&rX3CCfYKjJ zge|=-N57u@IsQoIM-B4E{T2b0yD>-K<4vt}!hmJZ_?Kv=tP~*axslRAjSz+nrDwKa zYb7->jhT=33&yGP*ATD`6kljkT4+^X^8aBy5|T~;3QAu#X@&S7ZWI*kisb7lGP?fY zLy~Y3*h2=e`XVY{O4HGQt*6t6v0bptnR&0`>88KsSW%9hgCr+{^?cPFyxQ)ywYfg_ zW%cIyE_Kta%^kd(rY(ikQ%9T> zO@IEuX7rbBfw81xgs=MJ*(e|reItI)PwFR^E1!&httwjHwS=Oip$vZ#5>8QR4e4G$5@NdHAFC@y75@j zgZRQ!6@o1Q1y2WDPzzh3M(^OVBY0Y-dQPQ}tMUGY!ylTB3oE6|%q8x5@iF?0z4#(_J$TNUa~uKznM+vRd1W3XY*;(^Ew{6LF8|APw&88g4+`am&uZnyVuykfYyt@B6j?xrNF{A5x4ifoAjNV zPMUrb7|g!-Q!l>J4Y0>B3 zHxHw?_xo={zjO?S`kwX+SSB`}^n(}0o4$1ZThf2)NcfqCtdwsT`uUHO0gq#ig%KTa zxJw>s>G&D-mmT0pZon^Q!~2lSG2mIXfzU2qWVPs<%)zLrG&$5_-q2W(!FZf$eYcR7 z?7#v=5Uxz06w3|W8Pg+eS3jnPGKwInh!|1BdNAFrg$RvIN=7D`9wjCwCtPi4wyS|~ z_|#T%Bz`$eOFRLFByQSjE!LG^noyBox&26)NP}7SIcLl>?;UOP(nWbFkOOWUGmoKG zWjh$r^7j!8YYyQGuo4dq9DB`-%BTpRh6h$j>gEAt09;D$&aA| zmDV=L>7Lh*rO>@()xQO}x$kr`yT8LM5X~EHOk|ST_vatABqsgYQov6XQC-z}&I{I& z1tql{JJtK^1lCVR7(4sG_<{}!R2D6!|{pId7J^F ze^f_s%yq)30D0Pc)Xs5;CiD~eh1Qk%bB8`h?`|7WgEV%xKK%26qFi_?sUTy5Qce31 zaji~?Mpj%(@dj(hG5dd)It|c-I)dE~>rU$QV+_$Bf*{QeUr#g10@mQLKMNYK7Mj!d zANc%!H18^5`OrGCv%q4p4h0IN>3nZPrq%=&q$Sjd*g+;QedVVdv z&#BO^LFcA&ALeKY%Q@%da-P_4IR@`Vqv+tE1=-6@K+iO?_(+QBHVMc?B2UvhX6E@NiUvcIxmguh1VN^I3J9)v6} z87vH@PtGXOcz%ho0PJ%~y2j=7SXpp3dTH!XdZ~S=#4mj7S~0illD>Ci-6*BI=56fw znq)7{RB}YEgh$DvheMBm5|M#;y{C6j=k-CeUhQiwP7wCZ0Udp;?Tarfyapf!xmo(i|vow#0A&{I(sN7Wg#l9g- zPW)j_lN`$h-MI&YuR%dRQ*AGgbIVGzfZP?1aYcCfv$`hQ3j_GiG7FxtA^YccInK^v zGW`_qIDu2xp09<#$u4=}b?3tfsR_JB7ugR!--X{bn_3sLm^7K6_!tw?cX?JJ@EJCZ zLJLgY?T+m3JVnli{)!exN~ANk9k20)3hvb$=enLaS_vLpUaZT|JVNQMQ!Ek}sNt>Q za*`EShh78TcGT!EVTl(DgkMG8ue{T#edi&}`x}Veg^8xv8Bw7x&yzz2_f8HEhNBzi zJD#xZrTyM+JDuG;Bm`oI&Rde3Fkhdz23fpGu;|$%1T}5vy8d;p0GLbL#vl5x^pf;` z?UrCGUVkFMz(8QYR^EEcm}+sv@!W$T=2ps9XuAomj5WaZ9#ytWlem!O?e3`*v~^HZ zzJtGkj$nP6eRXYdz287K_53n>eMkw!W*_q|N``K1aQ`9=&z{E4OWlW5ge9V;!HqVU zDSa76&^$6$p@sk9Ac}VPZ079M!p$G@_PjwEHLxb3n>iXgzd6YC z>ZQA0FQY0f_ULq<=ZfZr;Na;=nkYUoPW|;&`t9$UlI-gheEaO;F1S?sEHNDhZ^6;7 zh}!X!&fpIw&;6|b2`HrR1UA30Q5*n}B&ZhXckX8;R*^-UIu7_@2du^~Hh#!iD9XA#Nkl2z}O;0InR0#R08*#e1>35y3FuyZ=z5|UpG!cseugTjB zua~nkcr})X@YBxEvZ2^dT6CAGfCoHSn$~>?gAT3Xc*gsi?y+&@@c3Ee zUkoySZ|TJ?y^Lc){!@jeKK*Mh^CqS;ENU52+>Z?#p7mAm9l1~VTX{=p6B&y6jD^00 zADXwN)gBY@zK~S#>Ype!V$64+k!xnz0E$8?W33}vk5*3#a3p;qs1@SB^hPUYy;MW! zvy>u9*%e8v#I|=V;@U0B8YdccCko$CCJF4)AC*f64B%zM&)x8%OFU5SkR%)3akIgF zF+4(o(MVT&CL@t9^HYHUsGxUO%2K2T@d-{E5Z}&R~uzhcPu}2wmJ_X%} zU3X>9CUx{W2KSS9Sjz@*YT(@qi6ej1R9PK@orTaq88AFRdv4U~?hfm^<1UE#-Zv+G zN9&l_i?#>ITr*=~kbq%`8Q%M7erPwDr{Qc zre_Lbf|P%c0&<*=Rg~=eNKW-AGfh7OiHAmL2y)eSDZq}nL2#<~Y;AfFKVgmbob-vJ zubmS$2cu#`+=%y~y@_Ok&uDjamFC$jZaA@qxBg^Ex$!;n)emZxv9AxEo?mW!O;~!R zdB?SiM&Fx@@}z*TzR? z&^1-`L~g#M*vxKdeixA?>#CP}byD;6HZFQ)M7O z_=q-PZcbr2om<_+A6CxGIhQxww!H|;6Y=d3uMYj$EC#v4BQpn|p?bXahAOJ0MO=M- z9Ti48zx}k0U~Yj4pC-hxVf0Z&>rai=+a_ATe@S)fk9uB2>@YC>E$4ImZC{87C!W8O zWQ2G-*`yd&JxnV4dX=)&9Ghllr362ahBtgR+1bvH%AB8nHoChM{j5e2pH!ta!`_fb zC~fwg*vCutB%&f)%}GZ|Q;iUaHa^M)Fk12;@Q`RLyr==w1*4L=$9P8qoJizbl?bDH z{TLU<8kG$BKzvwZ9TE8+uiI+LYzgU(2`9mtXv1!gv#qyTrsPY@n7Psz!4AgpD^B|Ht87BL8uGXc^vBt+%i1cGitw>6Oi8 z`3-ORJ5j;%gwszF&rVa_3S&o_*6H{lHj{x+SfI9?O_ z_T_VOlLX#cGmt*m1#vEVUoio%tG+g{0EiD(>*b9nj}?XyDmlU#qV8Nk|K&5~8Vob;;=5W+TZMeXF?@Y^_YnxZ6m462pFj zvpV0qQx7#Nfw@0&Elz*)6qvkKvgK0OuJKOssCP_9M&`xyMUKYadot4HKkZ>Uq!)rG$ilU491j*Ap3OBD;q}>OF z-yiPc*9IS9em7!+2BdR-Z7BCdU4&c?msrQUj+zbxMEoW4t2%O>c`(+k|56Jgc*bP7 zFuaLw=zFG6PG(TcyN%jFo@mXd9vadGOB(|St2fVr{gnRq1gnN3=>OXUt6Hv$k}Kdh z5oZQ!FRWE~0OmeD^#{x8A*Hx-4~3K@rRS^^M=6`9Q)9o_EY9CX7ssSIN{L+Q4NY3l zyR#M}>~U4~Lwk=3=B`%=s!iS&*5=ghL5|oM4UYbls+<|740m7jd)h!$rlptSa3NPd zG&b)JZ3}GG`0)J706v!wJPcuPu2|S3>~@SN&Ev9AvjyYHvaBOFzeiRe*YE&;30;Lm zHcD%A(3T&!^6YK|TRaQq@c3v%(fkv9)u7hbDVS#HCyFYp$x`JSp+cL%129a0_iHe>hJ37Km$sTg;a~>C^~t zO7yDdb-8MPIOzA$Q)g%(_arutVt3(uM^d?5#mz$)r#P&w z9kQna6aDuZr#O|IHfGgIHqGU_c@0&%M10+AVok-QubSZBs{^#5qrh2NkC)JyAOB&d z{1u5kIKs}z3dP25^xXbahK6u4Qj0=aol2V0b4SEa0=zbT~W8KI(JKOnj8c+ie| zqD=NB{xJB!BOF#2YfXgxN(0Z>3I8dY6$n7Ba!9NgP8L+OB&C8rf z;;Nlu`w^diKY0-H`332Vb#K&{rBAdw-^K&L87Lx|cXXiG1J{^Ac{2QnZ zwDf(~7Rpg_?Eo@NbvzAvaux5n`zr8V;G@N1=}f=i34*N$3W@9ju6sqh4Xrx;K#8v0 z)77`27l@Q0PMP3Mni$^?8@^f#!jmU^ve}V;&2s#+xz5;TDw`7$2jN*tbXht2G9*yWjWml27a1-0U@4?0k0; z=8jKrLtVl5>Z_ctqNE>!#5BJ-*0N8K}8H55fCs=Hr5&A2uB-PD9Nn)n_t529UAKwF2f( zHqRRm6XYs$8z-I@h1;?3J@Mi4{EJhg1)BCR)^7gx73gNj^<~hLTSuQHLHVIO$b75G zoU369Ht5o#B!pST|W!`pWAq+;C|!*RY)C-6#R1HhQ6f_<43N%{K=h5@hzPR${sTp<4LkSJLYmdz)tukm`a$t zV~NWSQQSVc3ZQk`HT4Kf!3FfDK0jjx<4#e5yPd+1teUJ}EUTW@=N@9?Q^v*CeWcjG zH3>(>o^+Da^DAwQR78j5&^tu1r|!!3to8B!4eL73n?S$YUs87GRxf~;>-a!-Fju4x zjCbfaI&~C6n|~eAW|#Wss)!#r$bS6Dd_dq%cl%x;5F*}BfXqJmX`5Bq+^b#0n;l@K zjGa-O9N`Bo{kGmY8C2WzX_hOfsRp!qv(pZ6!<-npMe|XEj!i=M5{oKx^k52xpr^%; z3)b&h+g6>axcGK!^u|KPyb9;OW2MN@1pKE)S!C_Z=_<#J#=i~MOA{Pn7tfwC?b@wg z4?1)+b4#EMm#EI7+1fPA@>v2`XC`RUy}|*~R(%KbbsZpfe5yOQE4uyYxS+6l9>PhljCQ8<8q? zo_T%bkQEzPEkX6YL_MUI?L0I{FjN)bqVd?5t)0qpTdHtd3?;cO*v3rU?K0`tX&ojn zQTa@#Mv%@WapZ9)OJ~uenL6PUKCdtGjptmMd^PXn^Y=^OKN+lw@O|N!UX%oOELa%f zhbUD%aTp(Nkh4ElCScxj8ZZ4?GwVaTkEZA%ekd#Jt&hf-){dGE*RpRIBLnE)5K#&E^tS$hXqLVI$`TA&6$Zouq2o zMG*B-(W2Ye{@FVOYVeW&O%AD4FI!)$+O{IIS-R`1~~61R?* zSUaHE=7u+tj9LT7YYGXfIh&UtVgMj34*QX7>uqJ~LMCEM49ct=D0`xO7E9`kpwD|E zf7tc%|Mt%o-<7T7aBLs|tRuUg@}vFHrVVodmFVwxi=R%A!;x|qfQm>$R7KAV{_E*0 z#Y36JkuOY|)Ju8YitCQ^y%ju}hK+UM_p6;S$LQ5NILaCdVociI6t0Q<%yW%LVYt6{ z{mlZ%&KRVAvGvS;mIWd|@~^a$QxRp5?(>NKO{(1HVY@kYZ>#XxV(p8ewZbF>lGCN? zE~VkDvt5_lB)uca!}@7gIe-}vST+|Q3m=oA1NRyU*c)Wys|ZrhwLYqg7H#cZvKIcY zG_gZDdDl$BJ!o^CX1O_3&6#9Hu!P4NZH4$*N$5#5{{Y0#7y4(#JTV2snuYy-u>L*Tkaj| z!ICHo4n@~?b^#RSQsYcUtDrV2S0uJW%pBkaQiEH?3@jg}hl96biu^8>8A%Q44m~Ii z(N1A{>JmIgcE=T*tqytqV|9RG?-~COA~ys3W#sSu)hz6A6c$+s#7iYj(NvLVz5u-% z*KN)rNzhUVz-By>$ysAAbpCBx#j?=gCCzU24!4R^Br65oyq&V5)e1M_C;V@6J>erx zd%hPqwR;l3CY}hFR4Fvqjg%``W^W$aPSIU2SeAW7&-vA_sqp*X04y?W=0Biy_NsKf zca{~(-wUiJ^R+oE%%Zjq(zYv3Z*_jN80$~7G`}x$jw&Hvil$4PDOv4Nmt(VJff zgJUAh5t|)}v_uCe=jv~>4+}!+Nja|X2PmfyigeL!hwrbcwgangUlg6z)d&zzyO6)% zDBDAKpMaYAXKwu$T!Bz2Er(aU@8XD~y^*~D@=d1^9la!ytugyKp@tCRpEe3;CVj-` zRuAS!-o>ipfO18NHUt;ccxZtB0SC@sXHqxeZQ8J{^kUhibus`!IR4MHas5EE80uS4 z-|X!1cB>Pw^``)1&i!E3BILn3duGZV%VzA9C7kY7yi&&leH#IPU(f(i5;U41g>h?bYhke$T*2Yi(cR6P(KM5fC$)(P%tdTv!+AYMxrENA-~FtoiSWSARc zTCglcM9HC?>1$ipm4KdIAO2!}zsYy~(xZtFo0K2X6n&o+WcBwnOGJeccY#_d|O8xX7Lw{-?ByxM(gd<7kpJ?B}(YfPh9v0 zIRu8ye_(q)A0vQlF&>St_h>#-S*9MOZa#bdu*ZC>9?m5EWqpv>e8%mq9Aru<-0TLd z5BKrEJGL|;(u|>%e4~qQg2|zR@k98PR&UblDTr&@bb+puWFX@|*6T&WY_9$=7`42O)EeW!SIoa_G z3D>kgYAsW4Wra&-X^_h^5cKTlri7?b4i6yPQnEj7sAp!xN^Tl`(5GJpp3_bGrH1|- zm%FWy`lgbT0cG0#*OmYzTGql1aJmZ!(uHjad(%bza6_Rrr`P23d+{_IncsJ`BlYx! zGtXynw+70;1S2(G^umv+-nrs`$G!xSw4I;|T}WFrxIObg$Gq&Sr@KWEDfCLKJ~=Ew zaW(_{_TAD3uaNVQa^!ZCko?-$=N;jK$%eH!nU|BMz5HDN7R&hlxIDt_&u><;?GN$} z`doYkSdTb_0NC93e6PS{!kV;m5FCv;Dp+9%a_~Il8fqz&KH@6)cRsH1D^0bQ4 zzhbL)jKfqKmOhpmU!f{IE}@T#P(G&$|KDU*sf*S+U6QlAr9oX*KLv+&l%SXA*>5yv z0YVh*H(C((?~?Pcqkg&S4@TR{J|HfM3;!wAmQpzi|KxyFQ%|JY1A=TSM?=ofJ8U%r zd*$l>n~&w&) z9vgBQd+<42y34mJ6+SgWH?wTV?M7{D+%v1_XiJ#42I_#n-;s%f{$JNt?Zy@F&~?S4ZG z*Yle$Z8cb{*hs@ycl)Hm(6q*s#G6M^z!N61vM&)LPF3bY}Mm_Ww zk=!;w&wti0D?GbW{-LPG=^`lZHFYQuTn1FJj4mEAM}Tv9uK(k)sQo&Fts1#**6RE= z=AX^vc=y5gX@36gRm;Ap=zeD@B+SkEa(VHFA~1b2cyI2&4>A zsjQZ4)k=)yS510dgpRfD1Cg;`vAP%Zp#f^U2{`1i|oj73Z zIjKD7rz?jcd!m3Iy_j{D%3&U<>g9{Tp<4vMfJXh;&P&Yzgtn@rqNJYg4}s}{5jkMt zMuN##H<8oAU;(w@V<4SHDPVZOf4#m^!{*=Wp|#ffQMC z&zkTw6^Sfe4?xHN;Td{37>B;}MMBN#n{0>^FQ-H|H($&d(=YN#e~Pu4X>&Zy{BBU@_fQ za_NF45<*;4s0+6fMFpN$njsFK2zij51z-eCRZ!Jf-P|^kC7SNJcoHL5Y}; zhXNP#W_IfeUAuRSIX%0g^D<3d4DmX@po=%#Z#gG|O9}09Kks>YhDM-nzDQ%s1+Y`> zK>p^@v*2c4g(Q@V-DatHH7N%*gPG4^KNuu_uJHaYr$6obK;$&s5;^~s_Xc49G8bce zQj{s3E30}TdN@mjclx(;w~ol)E`MfN8JzX}z!`J*ym~^@yy4{4Hzac}s2*`Nb5`3e zd$Zqd9-!Bd|DxAeXL#px)@#UD#vx`6SJA_*=dPK#mjh(ii~r~%r#Y^MsA^B4Z}vyJ zylpUWw^#W}OR`fxS9{ePS`|hr-@9gZR008mQ>K{YiHR*JF zqpWcE-hTb#!qBJI&Pb(L=w#FD&!%9Pbd`9M;IWz3)4O=@?UnH7;uq%pj73*i@*g4-XF3wI9Qv_>R+eR z%S%7Ex#8OEa^i+N&ihgvQ$Wmvl1vhz5!m6LHrSkZUyhJpH2w$PvaRI0R-iz-yvtqvhng7+^z&NgN6O9|%Q~FUV%Phk zm96aH)%`X@OEI*A2OtOJwXAQ`mwESXOEeIDKn|S<>ZXxXK}$`GD8^|%w1`%gQ*2f_ z1mH7gN7B-p?lii0=!3tS$>m&yp-HW9H=9F@QvlfepD^mrAp4X1P2Qd0gA%H1olgp_ z1C|TO0Viy|(8+kmY8rJDsi37x>zzO8XDOq#-~(JMnl7)En-m@AD%Mtn z)+>fcI8;4oYe~o<*X3v3(+g1Yyko^8suoyw>)r9Iw~DVy zv%hFko^KO1j(b#AI99mcS%`f-Fy;}hDQmf;CKIDAlUHEge>{9f;#phq;}f?Z+oT=5 zk6quwK09|)#y?2l!2z?Q<39#SRpTr-9CnVm>k39?E`#-q?qNrBxKE}cO$iTWnFGa~ zO0S;MB15{cl<1lnn4;4g$Z<@{r)JExu?Z&OA+{bLPa5xDux7~iSXwe7MUM%X?o*R_ zAg>#-@8BJx>!IIi&_X^ATgAPJKKQr@J>0l8wOCdGV;!ph0tV*E9xcntTKFd-`HeoQii7{ZmMi zmms5Acs12xojwzq<*~f|shh0Dr?X636#3{8ZkO z8)(bXNd;4H^|?H?e!>V^G<&;n&1z1u*rMd3-xxkLY1fz3TJAXBBNFK3Qo{eVKQiLf z`WZB?e0K2!V%e@oQ@l>3{#hJx&T>08!xaC;`YOER3KfFI^iR41LwDfc=kuK!jij>>V!2uYt1{zfB5m| zt-wsHRClipp$t0)-}JsDMfu0R#^W#BhgV@JBZWQF*2lC*7RFVK7s~@Wjj<2)Z}khB z6Td5d?%qciIyYrnE$)%RDf@iiPW{HF_ElsG34^um zcHy@;d|4dA4Kp)vKB1CuDPaLim=?{aBXk^rlSC^DFM+lMnTlS5`_~ONUWb(P#$Bpm z)(<4Ww^h=unp9>E^$ELfZJq8`k|)Ri^~yAA0R0ojG+6g{n=d%6Hl&zOMg5?*oeK5YyKQ_LqmzHi3Bnv|--3i&(ugv}9Z%Of zwq$z}S)+Y=HabwI3>1Li>1ek^Z)O)t()x^dzrOXa1J+3WaC(PooUF8mD7y0COSa#+ zwX9I9VndH-`ftmV^Pdzz^jqaH=krEJ*tuEMx0xuiLgb~L?IDR)3@I-sX7fpmxONqL zG9^+lHOz$!8)=P)3f$lf|NAlg^)z_Z_T9kj&}v1VEWK95x&E;{B#xjnbsn=lzCoWy z?)jwprotvhoS!;(pr|yIt4fBm#DUI$;dFec1uqihwRQiPmD&3-3eSH z{JWi!ALrv}N@%#z?3e8T2Hcn9^rLWDe@JZ0$$PBlDK|7NFSs$E5aH5Yp^h1WrHUMR*m_$2 znDU&PVL;a_8JC7iiN$nY)pD^H^3)~!>Z;mcZj|R*#mcwpBISBY-fHQ?l;R1WdB1%m z8Y#JGuIf^&6#pgyFT_{EiM3ko6C>;x$d_o*`WBTQ8h}}(V!V{ODUp`j^B!{Q{(pwG zKcbrzhrg_Is^nW{YW)^(-4_0j(BgdH0O!vsNmpiPy|~9udh+@D?)oEGQUR=0VXeV$ z2UeE$rQqdf(uO>nZ{JVN&oR{@79(#8#SINeR!R|VbbmVu|0C!6JUoR3hg#W{Xe50Ix^f_tHL45SaTt;BQ9xytnd7Y`$Tsk)>CzPhR^*7d zqt@Y8o(D440g;jW)Zr>0a;)<8(lRX(WRBDqg3lh0srErsTfnJ!z0-kdit@`kNA`$# zZLkATCVs+o;ZDA}Z&@5OF6dIIpd1W?<(HfyBZ?kSQkLk4ou8saP(fmi0gR4z{ z&64mnEv~QkS_or_K6Ls>w^y=?e!N6N)uPR;SRbflaPtNJby%B{*z_B=T60O(cSTc zZYOhm7N?%u&t&;a{2)cA?`wou{IpS8ccFQ+&}NBhi$h@5oju$~r_18x9q4o4bS;T-?G`1viS_$Z$@yn@ z_TOWqjF?`RzpS)P-4%7iiLB3vC!otdNKv;#C+Rj{RvT-a7zF_0vx8N7#Al=OKNjm( zjc|_Lztgm2-Ll3NxxVed`t)mil^i^y9t+6J9i0cPUbg-ZEFiWCW@jV2T9~E`E_pXBud>ONh*^ zpVD>~XRMqS@W!MVvE2EEybH9_LNzBFjX-I;Pm=v?MSH6hu}qUxyRck@$jsIuYlod* zq1oy>o7CX_kasLA(3VxkN&lx~-hE50Acz^Nn#287W0hqSU0gF=gcKnGcEVNczKqY% zhf0ol5p9d*=B7~Vd%mps5!SAL$M8B)t(V`mZL8yil>3DYm!u!!$G`TNwLQ&~VT>Lb zNkk7_746kpZhhlQI`vQo+Ayc`ob;g?3|nq(aSGID&|j-B087ydCw&P_cPOQbJk24q~UTXm!|>eqrclBs8)0O9OIw7KUE>ID;)3Z97-liut`a zJFQ{G)v~@B<=^{P(D|#Z051OCxw~nYs=vOvQ2pd6{g0IPTn_Zy!hBTeA+y+R!BJ;2 z{)oTT;)UN8_hdjzdnDWRiH5WOjT#S{+Bnl2fcl}(N0k897!~=^`e|$D%xI&=Xe*(- zi?RGceT2M&Yr))&e2(;HWu{+?)-ZjtVuP#>^@Abukn7HapSEyK@M%X=w3$W&G8RO~ zeSr^7Sp`?Nzf(f~QI}48sH(Ej&M$;&RLh&ovdq|Oc+(<8f~q-t?uw%En(syEnq4I> zY{6B6KQL9p4EBdgdt*B?!>)7fE-i&6Q)g-`=zHtT2kVQCG%V(>G0S9RqUKq2(;(OM za}8D?7q9l*H_dLgPx6YiE*AUSpB5!5xUaq~`f|rv?v&J(fj}g0nh^^R7GMYyW-tpn zvVxZ;6ToY)bmc8bMA=1r0(mrVHEN^mH+OAXe?mfk=jf>2V%teLT>g%LY;Fnvcjf2k z+poTJ_bYJg_|meF!y^c#=!I`>flsUw&9@DC_m&I3w*s3`p#9p3&I&$On$3cGxc+iV z&%3wTk_{9sbK*i-Rzw=(_l7CZ_Ivw3!r)((2Jm6V?Z3rKwEod7;kyX2%C~<{UtCTS zB$xnIM`7^3m(ySBYkhauCnkNLO>G89PQ6ksahrN|ry9)b-vEgWeX#4yHmvy|YI|qY z_!V8PA>)V2J}bcv^&MNp-?}V?ct|p3%+*VRlw5Nl?3F=o493YB{Ck;&=1C zT{v@1cnU<0EJ)aT6V1Y0c6}4RdpRlX=cwYR+vq!Eld@}0K6ZmJ<;gAPS>rzn)vE_e zpa+J#){z|UnU!+f{!C*5K39vf6Cw=Ah|XPv$)i2-Dzae0hQfu}%2bsDsplD*U3-#d z>Z>hZCU6_kS&FKJ)akL*p|i5dBsbK;1gj56x& z6YS2sHZik;Rk^~uM@&~(9C-R2ow?bVSFjp|kC5k$ZYgQlm<%QD%;Bxtss+mqV#XTQ}N}1DcRjtU5nRxaIU4p}t zpz79JaFo*p*zOUuJ79v`(3gqGBvSOTlz{|YVO`&jvOL|iUhn_ z2aau&_r)ugcn&{DF4d3XNzmwRk^AVu;Q+kwdWHy`u8SQEj)zB-S|9a`P7ow?gl6+f zCffVh+VNGmF$SA&^arI6?tT-#$HnN*ftfcqAQ zvek?vKRxBoY`xDra*cEHsFCp4)O8Ps^`~q1zy7=*y|#{RP;T>vJebH$sEXPeX2~@@ zl?d{NV9FTx@D1ctuU+(3G6MLonkKxi^JxECV?Z@vd1Btc?#&d8T?(ln~4guzqbh`c7H5A-pUi zRnIC(+SIdvpXELq%6fR@p<^5UOVW$|hwnJh-xZR*%Zb8eG3|%1GVr(Wr8P;R-h&Xa zeD5hn3A8ZjJmAEk#p)Vy;0KHxw;U6ee0)vxVK%pl{BjGLSny=&B3zugd{f`jitXcF zD%c(1iv3&A+%V+2hFbVOiLdZDU}tIfgr6>JM+EYy5~_v?sbo(QK(Y*>fu5wt=g-r~ z4xoK|dmbv@<-2q3v-RSd9WeCvvvmVY;{9Rx`;kvO(x}ucWE52qm86oOaN1vTKY}$; zGslUm!)ou%-zaMoBuSZ1>ZsJH7%k7?1e7D`hZCJw zW@|NPrmplK@sE7hh~RPNU4A+0UA>Jgt8=RM^Bp~R_^)2FMEbz6PNwn!hG9{-!b&ce z-4{&5*Wr!pje_lxNvW20T@a;=bDVb#C@rgEh3vLKmmpv?d~$IV^DNtHDW8R*;F(`c zs9-cj=;b8eHh84jn#n1AQQb=Cn;Z@Qn{~MUaRnVjnpEm`-s)08DpZLu0Da< zURQolKFV;meHPyOOx>Se^CGr=z)obx-D3aETO)DRS4TtG>aOdWLvPDlJR(=Dh&+F^ z>d^C!q7XsJ0XLSxMr_A?k;^g6#0=oX(s%-MJX>Y1PM&2u0@^;L_Ge)FRl@wUp!tul zdICPHeIJ<;UIwi&fq!YW!D*GAGfg`WV{R$tuNyQJzk( z%lTWkK+tukwlt7I;|x!GPk_P7ufJkL22`5C;W|mMJAMlPQ!HyXq>9h`X9~6Y$szbN zk;U~9oja|k8#$eT(S9lNyW<-AC55GjZ}6efM^#=h0tY@SurVS#cUnCrN{;RZwYA93 z-1ugBOZVE&$D40G8B4PQ8E|o*GEKp}UAgpC{e_wox<+qif5*bhw5sajY{ zkkzV$9hz2P`uHIkHkO`~YLUB=0WcVBon2rXOR)dHwfgllKam50(c3wprSOkeVo@s7 z6Hyzo+KtL7D)qaSX_IOB2Y_NSdfP6)#NOwX@=+~cjS%I2re5@R5YT!>h?GV9EicluXCzGlq^&6VSn z#uRDU!vlhzz`K1f5kHoXHr!W=OW_}zt3b_O65ONA9P@3e+hLgCANhvMu7-bKZ}GZp zBY1s1OR9-(S|!q1?8HF>8#7ux3_e3^Jkw&>$`Tlevp^F;->_dGbXZ|6c{dq>Re-*=pz#FRfIRlsPk>M4o}aD%#NgQ@nM8I<79hAL-ZMQM^qS#(vKtDW#lgfhgT+YVplDSSHPj~ zS^B!YyeI#yq5E$ZO zBZ$lpUPB_BCFpR?;!dCyAuUf>gF%rm%3oJdd_mjkQpnJ-Ro*p+a~$4HP?@E*klaSZ zmuT#%djZF0a{f%Wrl9?fNgmxbaNel8(OAhv_T|QYdFr!iTyJi*0 zIE-W6gQ{V>2jZvalwnrmwAFSJY1odc7cl8ebG8FibgK(eQiRn+s(NE7ghb0m1Sbn7iQu3Kn=*ngUeIR^8do%(AG~T$lMZeS4 zI9Vx%%n6T8F!+aS#Nc&J$FID&$emZSPuTfwhv*tn_p;}lotpCe zXgK(iwr@wD`F&PD539_2TmzhdyMBC{gEVR^-g9&H%(?}lS%|RZ-@*g#JI)hp*XRb` zS(IP99>84G?F}gW_tN8Eh2KB*-$nQX<-rNDGpUQeT?kH;g3mLGX;C)_Qi7e#R zjl2#2DE`vw6qB0&$=qCi%cDw5V6iha7fuMxHRTao{%*_GxR#oVD4D>2Yb)R~ohmAK zi{MQc{IIh#*R_?=oAm2Fs5{4YZenvnc7!}xdZTQX{b+1a#$ND#K zW^0_)W0HB)+G>62jyUAjkeu^%Ov;<06w+)1mZiADFHKr=3Kq$6M2$3w`i<2}V_)wJcMj7MT#aMi~-kWKr%Yf;`-3 z1JNCu5V5kX)bM9@gdq^wqAv@$x`vsx9D~b0>k&vD@f2-;A2H}nY>M#btK84+k@)Ja zlC~uwF8CDn_{Y(7ZWRYY<(BM<7?`ym0V{Wupy{lT6s8?Tv}1Y#^V6{SKxKm--c(BA zDlVmt{NO{x&)Y2pq2Y7*?2JjCUDh4YHn3Z`{^#9NcM(uE#?vh>yQ;AH1yRLZ(cH%C zn@EO!GKbGx|3FAewQaqY53Ac0y2vRqma0>tdvz|ur!qV!2UBKK`gEAOIEx$@E?6J(URzJS z@5#vr+Nw&s_bo!gDx~B3*07yYw3$Q^*0D_~*&YMY73!-0-NP-bh!nm)QNC__MU-J@ zI~Gsw5m92Rm;A}#nEqXaqLDy*78?9EXK@j-7AKHdqgXx`5tGUP5^DvJ`EyeIjFHG5 zrusNs-+XnWom1Ple{=-fs{?Z&#OU9{qzhIjd22$D+q0PNRt&w_YIOzk$okRo_Q04M zE!o=noez#fGjZ~7p&de>_De4=f7EI@cRsGF3zg1`A!TKI5pvcz>2p#V^XqaV=|1u@{YgqD+4-w%P zqkOOEk9~c;K^qyxPEyDYL9*1NhSnM&EdBPDQ@f3BZnHk&+TmP6G|&!C<7qltb?6TT zYTEqG=OLp-c4^j^JX=&nn$V(VaEVZQcTqt1OL&sV0;f_5<6^_=GZMP~&UDr#h&k$h z)2Gc6vEiS)Jr;$0Tj`4aB>)oHZv< zKg8gc)@hLtoUj|z0}|`%X>sFs{=zS8PUj!lB;N5`i`TtEb2{|E$03IEJh8k>86$=4 zlRH6<-Eq@2>^2+fp;0#mEBNcb>(ti(1ssd0j$`Lu+XPQ-Ya3E2aW^aNoJfh0o=nKF z*h?lh`8~V#|6Iet;paseCv_v=LWI#8!w{-LvEr+m)`n2D^tmeCdgZrTnaV0`HInNN zA=wx+(fYvpgn6AsPo$eZ>wdKCZvMywBQQg9YYI&g=_ zArYAxtwKAW>r@{`|Eqs;_TOj2{3hH3yFyC2rawV&-{Qw1F==J@9qUU)iQ_b{#$f~w zt3aYB`K9q!%gmvf~0%YF3vk8(vC23L? z!qKg%Gra1z>`qpsVK43UwHm#N9K1lZN=(J4$;<2+Jq~PYU4pg655{w~IIe`-UVfPAJXdFeGE9imzg zcxgl?ZB?8`bZvGvl$RM^$`!HtKu3eN8|`1Br~CfaPXATJ_-7Kj#&baE2PdE?_0|Sw z?!Fj)v&$je#31QUwgVv$KDfpt6V-WpsG+(($X97m?CzW%!9HO6od z>C}Em(q#O04$t|8^>K|6yls!}wNM{uI&(rn8!tuqz@y1UdJ3RVyO~NJ*Of(hZak37bzcGHx3} zvT`_|UiEy8FjjFNe61h8c0J4Pgw=0B6W<-k;`$2>B=@XGPtBi1Y$!xT^m>dnzgpyc z=q232=eMtW`rw6B3+a^L7ONM=5&8_x>>lTPYVKu zuP_?_6YX7B@Yo_*%jc<4U}jFJJLa08<%nml=J(KYUJwSD!TU__RR(3l)mu$=IlSfz zG@l7gYIcf{O46XP4qRtry%4D+vM2#7C29y1%USMGrdGe5F~I7t$4W*EM5D0qpU>{H;M?t zIMTy&cF9o4%=l3w$KZr~Kv1IaYts2yXGhOWy?M{NXNy6M)YoiO@=!L4FPRRREXc=o z{J1o*u*kWX51Ska434>7>!TK#o1l+EKQheb);4#ttwWp5(d-N8P{fq^47j6i2eeDkwIGDnI);H1qg8hbjRxnSG z=uV$}sB24}KJ=6~!v?~f6-Pb3qk}3aNn_#l_T}VYio^ViB^Ym?^q6IWb~dpzN)YQ) ziXy{qYO_Q|(MpqM4cdk|zZA6ipG&>M(0%O59kyg3w_1Rvbmw2cGZBjFmnib*HE?~h&P^~Y4VvHl!lTbu23Ti;*qV z^)@@l0hdFYtQ*Ma$agT)mAN9Ia!Fa6UX;FP$}NqFXWS2fmB?*gT>RYQxmcIVR*3h$ z(J|^=s72q}0XOV^t7mPEuxPU#%nwq|r>CVrogX#9Y`ImKef*b0v zAN}5w%8DSUw{@P>Phi%iRv1E*F+Yp>2?4YEzhA1MfqX=n1Ny|)gsHFqeV^I}*$b!z zW?7yk)GcwZhid389X!jsvQtQQ5(#J*jjPf*`0}bpVj+1+6gZ{HmE2Fs1O`Ka$2~eR zJLg{TjnSK7jMyq}T(B#NFA!ZOyLTIUNq}X0bu5-M5fYAM##OCgKLP4){&(01{Soxd z|7K+JuZE0295R4R^I2Pn%Z52^L7PA36X~E*H*s^+6b~!c7=r*-mTk@I&>*`NSIyor zf?zNvD=39Q^Ri?87(ELV7zobG_pLPQb33b7=+wPt>7WMpZa>^7R(e}0L$QQOTRs|) zyStCiAo9^~2C#H_iOYkY19qLVUxQR4li{LIq789wzviPir<1v!S9|`XOb?!Pd0I~; z<;fB>De9B8I9x#446@_Ia&ZvN{a~b)W&Fx)jWm=;ybU zCF#>&nJ4a+4=Xmbq-8~5pf)=7uI@2*SkZ6+TSYe&mGtiB$Jd6oW6m12QN9bUE%T4L zp<0sUFKJ`5D(S}X^kkBu@2kcXuqny#5OkLNqI3(awo@WB?owiBg+4M7vPYBXdD!(_rU7tl zumDQ{8hZnA@!y7)|Do~yr#$iOCCB+mb_0a|llge|kH)j@$o9mpSxZfWtTr!{#z1Ih zj#sfDVvIR?eXBb?$E!puz2fwIv0ozzSKesh{U}a0Do*pERbe^D?Iz}qFn)PMI*4`) zw3AVsrV$ziSA3nz>i{kf#fT0CwUumU2?lT5E1v}qEdQx$4gOYEE!0&q*r~GE`dc(| zbtHtN8Y!29Gc3|{9X4DGQK&@~ej2KifFy7tlFn)jz^n%CsSUY9c(=yi5I@V_0xEY(qhu=~d|247>2QLXTOEp<4q zt{;#A_^qYr!5joJmWo}=ai(p6(eY@C!P<}4^Z3M80jsOfMRZn8Dto=OWg`g5t1VF+@f7W<~doW@0gk5qU?STjq9H)cvVOH7SwKWgG;qM6bZqe zxC6yxzv#*`zV>U|ar)Qg2P*`yB+^h%Xs?%PAWY2iI&9F$^^}IWqcQ9|6zC_7E4B*CHu%-0Ooyv}?obo(d;+Wv7m3!NWyL}K=|QBGK6lfkX!HXRV1 zB-@zO;J(vrJ>&3g-o!IV{;Qtfr5@%`&NKpVNb4Xf)RwdWk(&W z>qz25adc(i%5f?8N=G-_@wkZ@?mc3J=&?ev#M>9zJf&jrhnh0Ai1S9(WBSR8YjiHE zpBA8ar81Tk0!k2ct^Ht3pOJj=gzI*J!|0uC_^3hmwb7_Zj1S-^;Gzjl&gv`fVLKK3 z#D$kw4Y-diTkh?Hk<5XAF(m$#|Ni;$Iap-+hol;cE@2}`{fW)>=JeAa0zdN8c$CGl zXP6gQE6C>?MR%V=dSRSdedi}N2b8Kuapdk~UV+F;_%K4sa6*1pcpA*x4iuRnb%JI} z+L#l@iJ!sVYzb_~^}%^zdQV(}FfmkB?e6PWwN`UI=S* z;hePzg<@K6P4uCG#nzwVeudr<^)5c3P|mGVPxGE=z{M!c|B`8E%tTrWFKM^gaeK}O zYPAkhj~He9KG;wNsCCPi1HFv9BmI>P^wNH=I#RzV}0f90JPknc;>|Cm}P2c6Q<3Tk?veaYRR$e$W~;i zw*j@U_|9r+QJo{CVQAnwVg$x>18@`^`d@Sq5N?02t>(@V_0@T4^0M&4yvBf%{yn}t z8Pbrjja4i?D0^y9A~XUn94zH=fw9J5pWVM%6_O2SLdM3|*XoVtc+3%cfOc{jxISGW z|3n!?*lL0?qZ>th8q7(xnpr{}<(nP6JrG;2f z0zpDYX;F%ZG-;s+1*AiycTid&^pHRrCd9L&_^Ibihd7o_7?aIi+O{gT3zV`lKC4>Z@WtQdOW26H`%i~lx=+|SmDxV|J-2*% zStg=*6D|jQqxr)JK6cgWA?IRqs-^_Aovs*BA9G*z3#H^vjBn)#PIr0z?i2XXNW}Xy zk~J7*r};QX$f&+NylVpJK3p$e8JLD_gQm9%`kfRslc$&F&2A)YFw8_nJ=(p@*TENk zcALeTKD2m@a-_0VtTgj_^%v~?llUf84ey;j{N!*FhbZsKBNCd7M}%X7$O6mQOd6(f z`GRPw3fm(O?otiXrwqF^lx6xdjK-56dTighr}r>)8>{SAIQ(EU2k7yEB^!tDv;X0P z`cGQ(f4TAebdi2mb3HaO!x#)|p2>MIIVI3fG4z|@@^bBv-Z4Os(4T}%yjMdfC$Qi* zE!nHzC(&L)%9v+QJ10L+yj%jiYdPD%q!DqJZNv=cT#R<}%EXd{X=MDrX937^I43^( z!EG?|DyCZJ(lk`)m$wa~Kc_=&KQ08-z;_Ssoa{-q`Ae0aL_Z5HB5l&k>13h zm8^9{HoZYo-#M`g(XAz94~2C?X5Z_q`oUPoqiIIYb4OFY_4_SMT_)a7bXsJA zQcO}DqZmONXs(HnPT?gSz*Erj3Qet$!3B)4ugTMlbn5b#`a&$(qg!x~(S~GL4CB0Z zOCbltJ2`|`b@Sr&@lBbtD~!V=r@RPWIdn)qE;W~k<062;c~)vwmd zhHEF3z2DT`0T136z>hTqRg4%GYrK35hP#psa?0F~K?8!{JyPrpYp`ATO>Vas>W-Ij zj^qzt6Q6Urp!&0gQTMSGllmD&oeIm^GkD!p{vCk|)Xvpb8iRwnq56E^t#wn4 zEDYFx|4;nn|D@K^M5VuI|2S<1XGiDidP!HtlMNLnwF?DIn)G`%-=OFor;#NnNh#8) z+K(Pu%aH+g{EA41hXD$5hO;j(+B9JNFuU)7AHZ94L0Chv8h-ZWlq3w_CIy5CPGwp+KiW6>S4FW;6@ zdz2(&e+h@X6$jg^FoPkl)>OWxQhSV#+H0226w8kUYD%h6fGN3^fUNAQ^5hk?TqGTGTZFkMc7V(@7w&A#qiY8o$Dij`HJXJf84&0PDpVFwsKL z$IMOZHG}72O9E;GS#`iE8gtn%ZGScOfZ=QkRN66{ssF=-{!hNkFk{}U9t0W0>sN1) z)-sLA4#je~3zdONgB^d&y&Vw&`#F1IAib|DIt5wSaUgo{oT2Z&_bK^@HX*my$9Kh7 z63?61ETT(bYSUmTyUNv2gD!zwP4lb`ra{fCWg!>iS>wZ8c^-D_4pn{|RK2!wWsci& z2_Ox_hU3q22g7shIsc*3C+dAgUy;I3=ipN0Hgxv>RAFwv&l=foI-6cbEBCD(Efxr~ zvKirD9U~w9nrA(43KdAkrlyT-eaEDV@Ggzq2ZO98@fTPlr&cwgn?stN7{KqoIIBI! zr~w|Oxf4sz?x?7v2tjzx26EPooU#=eKAXzaZFJ&0*>}yvX=$u-|>lOw)-ZG*jRVcuef{lKp&;`&t(xl5W(Wm;e z&fn30@1s4VzZQwIRPQJ$e=O>zB6ZvSI2SWr0XwUG7MO4RJfZ&}>H#=AOpoz`qn2eb z?cU+*{@vOaXCcdp3k{tbtx}3$!Bwqif`~hd#ZdV8$~-66PML-0l5-wTEx7-|x={34 z*~40`EV6EkZVzabAZau8l1KfqM(Uhc3&A3gB|$fTTY@$Xf`u?va!h9o%rruh#WM0w zMMf>>3w(gh!P5dCw+V<}h72V>!I2*)Vsz+ZC?rmb!8`u|T@r}5TjTZY+#IRk)0*H4 zElUh%xlZ}p-*;ra(lQkr`}5BuSx^}&DYyP5kBH7Hf#cYZp)%#k!a2d4xQFbO^ty3i zaxo}3|M~O!v71I@3Eauy(V;N+>X~GexQ8Ho$&VUkDKk z#w3l7T2XOjP1gOZfcL*flOaXY%bxrLp2Vy-=n8$}>FyG7$_5p3o6M4Gxvr0RL&?1M zAZh|Gb)RpWf$9*$MSsy7Nt}H7)4K2WF8S*)8Nv;NKci30G-m6_|vRpx7QoqN?RNq8gffejNsYw<)yO{BM$^zz% zOVwN{k^`Mg#ADOOn;N!zcb9ns$ZhBT0_1Gt$L=k;W~s8vaxz;}8q^ZD<=gGe*F|7$ z>E*a(k)8Ng@$)y1Hpf1{;Oa;+WIZ~@`TGO<)s%^sQQwtx1X3TCm*tyL7FKGOcx0#y z#)CO1JfRY}T^SmYRw_QMNp<-)@voiPv-tt6V&`1M&!3UC98ASEKK)3cN1Fp$jmTWr zZVxWwqx&SY!ewV&>XoUE&SfAR{XT+MKihyW7)UpsmZmN9aVD>C@!c>~nOxGUwic6` z7B)bh%tjF2?FRJie_Y>qcwD3Kz;XS^R_;=@2NFK1pX%BCup`9joRh+eiF0G>Z-3!q zKc8@(1X5Jyvu63nfEn4_y@X!tgn*xob;Q!)@H2wv_LxFdf`+3>`b#!Xi?~N>JbJNC zkP-6J@7#Ke#7t{+hc9RQ^mg`uHDs*pAx0?ukEV*M&(=?yiU^&7yY5|;-}l>H_Dt=< zbuZ@PkCO+UB$MG!4PbSJckaC$Oe!~OF6$bUGhesolmG@wW5a5Dw`1AUjM|H!zDs8d z@uYd2yeN){N2nYQf%ITeMEtHByKcy)X=Rs_wUr9SNq9IrDUg#q>Uzxty8X}vvli075rX`k@VS>&t><>Jrv z;@rH4r5yrrwa_~Y^@iOrTtn%upTYg8NBNPtqh_bHYc+8g=)HLI9y&hATxS1!BX|Dn zM7_;=wygmHE-$7JF`wb)=!SA1~Gc=M&BlaG7 z$fb`rb6HYzd0mW}hd}X&eKS^(#`?P#;S}j-5B3P`1laYc`vKyO=Yy$zSfs6tPW;|g zU~R^EM#a7BKhZHT9Q=H?vHhjGih0jaGcQ4(KHT|W=XlR;Z;MOyh9UaNn)+9=?JMyp zGaIP%Lc7|ofn#Q&V1$7AOif1rMgCLrATsYaGw%#{xFF7a)w4}sjtV~z~vpx6n4F%p4OQM_xNNC+0RyQy8kD$RLO=-%Gs=H1F2o( z$@lUHBF>5J8kJ+ED{J}5`_RL=7o3)JY8Dt0Y zZDqR|47wUKZSFG`#^;OG?ZawjpoJ z5}F>-X!COWV{g}gM1klXwgfZU$O18tPBVmDDJxdoPl{5R9=nb8b*ZLOVlN&qk$e|+ zuDRrSuYN_{vzt5|6GrFilTI>v1wQ70;@!HBwU|CTev1-6102U5%ib3mE=8mPON75d zJ@s^xQB{Ap_L9#RZyN>;1JW#^xhkls90QDW$14l+H|uOIy?x*k|9T+0^;zPXGwjo- z@^*S;V}Aaz!C`Z1_DcK^?xT<-$WdGpAGezi^KaCiGs@LD9I4biJ>H(ZGR~`E2Gdt^ z6pz}N0?eg{2d+Jm>@b)H-`?d8R<{>Ek9_$FJYeU1{sou3>;xp@lrCgfZzLTAl3Yco zF(mrp0|8anz-g@3p?mN6qmB2lGcv3SVVE<}~FxA$N4u^wiqtt%b+M?bLUOdpjZQmd&;O zCG{r8Z922MZe!#XS_c16@Q${WJ>UPv5cWs?$Xu;zw+JH8`hmSq;Y0?-Ve%C*#*5Y8 z4{kPP5yBp~NmHepF@eqJM3sW6YZa;llhC!hfn1rieB%Mj#)eC{Tp;_=IVwk5^i!I4H!*$feRO{RgZvA14cRN*Ba4H?qw?Szc(wG|1ab$}#^7rO##Z;Dn37$PbTdh2u(qIo|%<4PHM;ph#^cFpgZ`qKRS)EKzeHhb!n~#oX zp2SAfcpsIAhffnWDr^jrchl-q1j7~ykBtlSAIRpq=v?enUI^mMS{Xn@7a&({{RhVu3qf?Ws|&L{+<{coh9x5d5#+>Wvo#uBY~1!AYyb)9^-{;0bqce~J=bsc8o zU%9?CF8dB7sv4NHU4xukxDt5y>bZBm=fJ%SE4+#KQjHASBa7Z}^2(?8M@^4qcc#p(M7sdq*qt+bTnh^CL}QL8|LJTtP=-7$i-bTz?6$*lp8!umv8^57OWP= zS2FVIJ)5474YwZu*N^+mbIacj@kH~14;0xpQmcGWwHoN1NrLp^z6}l!xtGhB2WDzr z8R7|cNjm(zACOJiKjO!P3~Hno(GgCo*74dJ3ig>?p?vR%t3EsXb8ucNC4SFPpPzq| zEI|@7hwG5VtxoZSwo&?LZqtTS{75TGx3{|KBQJkU=%WA zP>e-g4kd;MW|>hi`{xi~7)_12iqG%%5)g7zSdg`zMqjXZ7TLQOzpznVC5xYK*+@pe z#7#8V-q~vmCCS7_^Tuy>9A9V<@-MQohg?lE9u;)AvOm049xrw*MRjRYF!=R#8_Obf zRB-*X`|jn*hz|1QM*4AJ03T#M={?+Sk-b#WVi;z^xxe{&!_=q51i`VAEnr_>-U4Y{HePwfos3;Cv|O4ULtUbJ)S9;=X}54g1jM|;K~;W9 zxil71maNhUH?I_|Gop3eg5Mm!(@$iX)HylEU@B)8csyzp< z5#|%@s^aZxp?2=W-6>srua)Kq7USY~2ig29md=d_PUsb>WM2Oc8E0o4qHlLM+wRSo zcd@tp+QM+JuGfilqrQsG+lr$nCm>+%p7^$6>#lsz%#XqXgyUwS77uT@IK@a2G z?u)N3Rww1^!%Yxd@Ph6Uu6ovN{z(_ium4oCZoU?;@cmA-# zeBs|V+pyqauvS#Nm+#au?7*{8wjWCH(?MeN$(ke1 z5^r&qY&L988tMD#jUX2AhPe%?HdBOJaKjH@eolJ%dY#ZA!Gx*%aSKkKpXgco{`k;Y zZF*%@!{s(s&#-0{ZtQnwD?O5*BC>T`3`I}8uU@o?Zkkxk9dTc1+9as=dg}dP*Sy~I zv3vGaN2*+LI_TEpAXsYL((aUBtS~3HH5^C#ptX*PXFfoQt8*rtn#~7TJdru z)ss&P={xa|ZNA1a%RUyxvb3iSkjM?Zt@zybuwBTzfZKjeaf3VRUl)IS2Ttu%_KqtG z>Ic>OgVMSBUDE4(n+KAMd`8AHM1B*jN`h#aOo;f0TpmYmD**l)3caG3mL)D_cBzpv z@%ra(YiQh(!KsyMUMjKOm_w3eu*H*I(xEDoD8xDNI!I`p;bjmZwWBk3eSnw|0up$k ztUpFiGcly_?lOSafKT36P{b(i1MAfn%)z4~s7E<88(oM+%__$=3o2!^+iUxhvs#0P zMPT`*YKQGvTXuoL1^S=8zFeW^iE0_pyhZ~`@s@J3-H7GI#6_()7xxYW7H{d{Sw1Ew_L|-PJBreKEOpqGCzE+H(BZ3ZJ0iCVBU1~El5xhnI(aF2BgXXYG zuh`Y$i3JolSRT^{@L9Km86utLZ^6<^cMubamRSblW=9b8>2SfB$bc146lQD)nr*W0 z0ShImWGxTQ>!qQ+mR{;DLe(xXkAr$=$n#JBgljTZRjUi{^aZJ&+y86w5y9?>f++V% z8^@d-zZ!7-L0R&lcW+t8EjVs@C%h}t?&Q2f_^2kYbq>nRF&hISc>s2a@i{;BAXzN< zaaa#xh~W354T{|sD!0|xi7BQHnPvSLM2b5t8Ok{&CX5-T)3-YN7V8emxESmq&cCIG zyFcS7pKN;dR!9dKk`5#Ba=v5Hr3jv`m@m5Iu`?pq*zZw6r|^nv$)2e_8_Cg(dNquJ`G2{=g?Sm+^7|`ucgX(N~Ph?DokCzn9kq)_mGz(@IA7 z--=0|WR{dFe_XT$I61N4UNghs6(gFR6eV>zObZ#en1^keQg(WyQSOkB+2%JZmP2WQ zl}~tZ&!257O92NqO!;_LBsbD$3OAFem)$pa7-@eQw-{q{kcF~W3K@ArE^dO_oYhIO zdFqG-gIVVD+py&oA+g~7T*_i9DEElYA}uLji%Ae$sv`i=~X=zeojlpGOG&Y3%pJpSNBl$eC@eU97b%mWU=W@M6$CWh1R zu5}P1g1X8?p@3?hlv7=Kkf(Uy)KU`#QS$UV^ObL*tk5*;&6x5`Ek0VWl6d5eA|zY% z;(0o7v`@d$D{TCO(Uk(F%0nWCRJ#h{1EKO+rBI5g?WuqrCo)$2` zLY2T?E1;ucm!coR{*;&Atg4UmM1^`jjn0J`qAjXi8pAcP_Mioc?3m&>!!BG|sua~z z{f+I7-1<);keKfxQ(S5x9iKdq;OyDJG3gskjEAd_4)jta2LWGw$KJrCtiFI4xEV4T z1NFXJrX17p04zPkGMFMXpKK0~+x>25)SI(Nz4rC#75xVPz55Y9U=LJK1j~pQSO2IE zF4iBHYE<-_q3xd4h7f1J5lTxbo=nJ6fXA;cvUBaNt?ZAUcf@bZU$e%9hDW7TKP*-p z5urUqIL*55OYyCNHP3-Lx7$mpQ+3_58)>@@f%&S-NH_xM^4yQ#A9#WZ8bmR|5JSvY zMxj@1R*DiELe!!lB)gT;Hz(79Ffz~jFpu_9$O`y-S@AB8yyYE?Ykovc)aKRiMOA+WpXEsNCPD|b344heizJK zHX8hxiM0aLX*@JWyq!%y+&Z=C5M0zKEevv(%IbkEM1|m&TU}kM7Z<9IaR>Ojs@U6k z$Pm=TsDMQ;GWxyu3;eUcA-xCaJ_xSKc*F=fZ%b^EPT{x0ER2^f2Txi{S9yf8b5Z^> zX@2PfCSa+%%tfjFtgH}C!(jb+iM&D{vYoz;R=3*BG2)=~O#EAvEFT33)GBWzd8I<^ zoW-+6$0NSp@tzuI%%C|q`Cfg3`3kIegy_qZnW)vP8xuwbTHoqD>fbs1^(Lu(o^ z?+DK?@unrC&7UD(s<7ck4uN?~j(9G;mAq?K`YkQ&{FV_^IXD+)y{qSY_EF%*lcvDFcOlnKIj&zz=&r}6R;?V2xj4H#ZOI4-YB+uif|v~}vC_lL zdq=*n{@&=q6)92{S2q-Cb2CX>2YvwXByptf6J=xXCVdk8^|su*%kv?N3x#g(p}U|t zNXUev9Lt;0)^ur?D)-BBk!lu7mfz7EnzvBhT+VwF&LYrbR1X}%yHsfTpXIL?S~?}1 z24#j_z8nRa+W_0)7UQO#z1{J*m2o;5*EO*O=|@A?$=iIh6czE{khQYKmV~|MgPlPt zCpG&q2!vtV`BH2k#ICs{2s5w;1kCwm^VWie=P3+oPd934kLD6pMl)rIcTOI98Dwy7 zR&p`R$adR=~dtVEU9mOPSw z?$t+Hr8VtlvFAwSWoK73bJAr{zoz-sYo5&RU&=X_ZdEL?tqd!#f5&Ahwv-`0`f{#G z8l?Z8P-E9fbMQ~N#(bWDgS57yR{U57v!;{&gwIpnwFuzOL7I=z2PJG;v>k%jK<4Il zZ9iQY`R&ZjuSa#yrTqSV)N8yon_$85F;$Juk*ze@vqKyZw3~lmW(A-?i!t~1i?BRq zI`#eC4MT-!BxAc2;vD)XK`8r9}Yq#8`+DE|oK%z4G zKC*CW?|qnJe~Z)(kD=nuw(eDb>g5^HfT*w2)33uDB5wJWy?h2>)SpI$r6h;Eg{<3{ z+BR;Jm!FB*WMeA3R1ft8a#@0TI;0PO*#7dROX-k^UOoZCLEdLc%*JnZSMidQL8p2v za2`C^PqbWuTZV0?&MNa4c>vXo&}-vXre^L;2ZAyw#)mgV_r{Xz2zgx_jT&w`dvg=0 zuh()}S^?fI&uXfR4;hkOe!D-pIumH}0$R4wx@puqTqoi<(^{^@HS695IcaH)#M@3>!h_%DxLKqO`N8mW^>wQl>9jqx(uQtvT@4ok}w4%&iD8-U= zM;NSiYGh!1qiA!7%W6~h53qC$xdZHsXCzAT5zE3R$*B1j)YE|7kgd$w)7bGwMi#T^ zy7g>oX!4$2@H^qU`I8+qzx2&b75n;&G%uywWS+JwPl;uL<9oJA2MJ1hFx<{lf@BAK z;v|2&7)Hp-w~1-n_^CXOjHFBT`XKU}gp!JW&!$W#%J{uv8%3pN(fnf$mjwpVAMCyQ zP{lH{nPTHS9NGI9@3R16cpI(%StnH!esdwTW~j2aZpBOvx3VINKzjfstb~@Y=XeLQ zKmJ4gpeml0D`Znv&8kt{{qK=sZE7mhMl+u!r3J3@Uf9_%iUK9_a?Qa;JJ~-B@(G*7mz(!JP-vI7c() z8g%{*$c5e=fB?FSzcc$4efBJ}gIkfE3b<_$@sqeuurKKM@a&b@&kYqTAk2CtUnVX= zNCV>!ySO6PJa`$kB(+O1*pS|g58*D@U!zlS-LTh^?d`xH4ae2Q71Im{+_?(#^N$({ zN@aOE3rfufan145F<*$7N8ICW;v#$ndYeBRLa1mc@dx~@%u2R<{r+N6&_YHeE%JA$ zQ}`r`COem+be!Lgu!rXL;WgQgrz*gjYGCIrZofM=_A-Ez=fL*|dIEZLwr+nDzqjAWX05UriEhAb@hPeNQQdlO z_u;y&l6zAri`y7TL>O=Xy?+qQ?Z!8#+>s($1Ise-dp7;o0Y+}wrD0CUlS=2bk;3%?w*h+j z$x+asD+|%TZeH3wT;v-@+O!M~@0NOY!!@0}U9TnXNr?)R31%E9NCGmj#(`b~QEwpC z-Xj+hp4$d~u(XwzJwwOdd8R*IP}Q^>e>K!}M?cGR%wQ0%G+@*eYM>_dgRh9Y-~f1qxHZBZ zc#}{J8-v!xu)S+%1RuXHQZ2b=D;R|-l9MElT@G~m@%omn6f<(-hp01RTtzgTml0L8 z$E#DWzo9hwGxCzb4JqSPt|b>p|Ex*xV9n9TaL%**v1TtWspD*;ShH2z4KD3`XRpsh z_KXV7!d>qq(Huqx^Nn?iSfSTl2X}9ZWo9y7HJsON#5>u%X#5gX2r0bw)iQj@EVn*n zHeHCXMoEU1BU`-rKx(dPzxcaH7y*HeBjX9Cw=qF{t$S)Rv~JC|2lOl@86W&=Tf}j7 z!BL;4oOko1c~3eKYxa^O$-E14E3l zlrZLX42bhGgIVdy>NO$sAy;|R+B94OZmcUvv4p(VYQYjUo>0(g5+f%DkR9(DR>&9t7EnrW}{gtU%c;kg7rW;cKQT)Ba$VK^rwi+K)k zO~>2;F&LezLZRD0SgPtvYmyCuS|51$iq5{D%ki+<0dT=?jKLWoz|4`k@Y7yrmND*V^^M(RLJeW>BB1%(8AvF6jt=;M|z-wK*UJ3?$Uxt_FY56l?A zFX>!UliV=KkRnlqL@sn?VI~cVquNZ#tKD z#L}Dc$6?ZEYQrQUdY8`qA;O3K1h3#1%TU~Xla2`I_2Z&h^=!NK&S>X$>FZa}QL*ZM z-qAsg4U&?LHD6;NdHd-Le|5LL+$C#=vjxRk(2ms0{(;m$BF<3=g5ncGx*zZY1{v53 zg5Ua&94Ia{Ct&*i(7PaD#{I3An}eD;u>{*cpxM)H`3{bGCe8%$J!tv?a8xf~2-f;< zDfn5TRnsj5{ytV!%081In$Z0;G%9YdacAEL)OcJ3+~9#{kFI^cwRg#fhju^=dOZb} zyZmv{9=RJ%)tH$oI`*fAyvUxv!=LsEp9rt+E8r*KhU7$+Oi}1amN7MR>mBhoNg6hZ z)@P+vq3}XTTq%q=F~i9k}u*gr{lcp(BFQ24GK0Q$@)?AzR`iJcMZ1AuggN(m# zE(Mxo9GzRJ>L%vBJ#Y3DqA=gkt>!p?HH+Zd*CM!r^!9_))oMlB zlAg0?%^&K{?h*Y@oR2ury?Zet+%Q`48>D0RRT$DLf@1V*K?{naoj8PioVfH`EX}~5 zX}Y+RxMvss4*P-mfVXA7UJbSm2ImPAGS7?}p@m#yzBeW^PbdW&IpEbt#nGEo6QYIWvtPobT}E;fyb0uc|%KeaP~1atEpHGM8h z*U1fm4?UdX1B-zc#6m6jM7EqsdWcFsWB$T$9-KrYO5=tUVCwWKO(Q4RyS~4o&PcW% zukV;Z3zT2Q5Y7%{;mdSJU5g$kCQz(ybi)H=>g2&yKxPWvM;7$@TZijU`3mgs-G!Lh zq4YRSOGu>#d{{3q;BFh#1|r;itpB?C2=ri)`b*2w1zXTfo3p&}RNRSG5&A_%Dcn2@ zkuvdxkIksiz+9g1q|HG?Snz^X=HE2HiN<`@tr5pB>fFB$pd4j}t_%G9=0F@2FwIBh zhlIrj?OhcWk^3xm$ORo5fv@W}xI4aKJD#$Qns~Kl-x0XbpBa4<=0VQsb&1Kg6;knu z@+GP+Zsqo<1IfrRgu+5ZucAj1rcvkHALLy@W`pIzHg~>>aO;F!lJP1Ha0ospE>AvX}IFv{YI{1jl(P z&_ePism>KIikdfqw=2%Arr&wW^m4oRIEK7Jal^pokdm1|q`dEUAG- zWESkHxHQ|Ne6d^3Z1gmnWJsC^Q$2FM#P5)EcCJTeDPM;IxkuYAP*GUQ6^-)e1=2Pp z$CZwlWtJau^(`p<>WDU95iPx&uP2mWarHFJwI zE{MyMU3itqr&xOOd2ABQTDk_nDxD6BFG#=dZ~*8nI=8`lbkgZ$%-!oU6|!zqDchV@ z4-12KQy-CCR$Xltq*wW@CU_AYN_?wp5_rC!`k`D#!D`+qCJ~L1L>Xt1Y|{vQaKsO6 zlmhXCbTz+K6JE~hugJK<5s3Uw1n4rsJ~lie$SChYC`#s z)YVX8-U}|3usCu6xC2`$kuPW-UJI|dPCH=E)E}E_l9NBS$Do%T-FE4nn-n%>w&aS7}vEDu_flljO_2Ntm^n7Q;LZ{fhsCe7AZb>NwvU+It!6T5$wwiPmcazTJGLEj z!uLN>@97FSm5oY}yvtTiLX`8?noG9G7yrKWh;S0h_ZguzX}mKcm2G|>@*sZYap~F* z2Zf(*1R;6+a(v87PkPcyC*kJ~5Kwoif#=GB>PH%Cqjum!zK*Adz>f4bh&9w7Wwt*6 z7sXEW8be%vu>FASiAR4!cX=)S^N@=9Oj8T4!4kttjE+HSX0N!TnNsR}E2xkK;THn& zQK&nc#~H@?t7ZP4c^K`dk`S;^{3*NJJ6un5A?4eSc5QK}kb}4#X{joP7$`Y>08Zp$W8Qz zq}Ya2-@wqF!WCm+PmW9WRI+qug#dhFsQon~X&wlBE-%b7t+}%vaf0e4?DTu;+5b$~ zrwjc4{}o}c`_c8RM@KufaT$R85AZiDpqg;Yk;hiWsa%XEKs7~8p z2mGSSg)|69eQzgivI#Sdz`mWcD-I<)@19+(k)N2BNe}z&P`F@V#jL4GAe`C!%t16x zvA{(y+x~f^+o8GQy2ATK7c4aJF?7N^_Yqt7(w!ND>mISm@8aY6;@MYDDYN4>cxkMD zQN6f5Mx2=>C!b@-pScXFBj^XP>jDwU!vGeStD1fCag{(3xxzfl#M_J=5Kr-JKd>EJ ztlwS&a(54#UvhpxA-WI&w46R6JDUzo__pYWw0cn8Xd;#+xmNt~ghpcriF8LTYBL7* z;Hg`SuiRSZc%eQ!st0BWsak7g*aLyLw)Jwgn%Ivnj5;-*QJW=-fn8$BJtBGVvjzxk z(-5}pa9gt^-Jomqay7wh1JM*#)@63V+b`tg_RS|?ip~hQG$Lt(`SWo#hH%!;Op<6f z-&*lCWrO@=ACebz{kLO24W}ySEZ6c68lDUJ@XrSH6Fy|^p_dvwec0XQRWGt?f;dv7 zGjc`cHPzp$*|_LKnPV%ig<>=JwA3xU?ye7wZyQj0{;z6m$ z4!xPgY!!zAcp3ANm~4dRq9vxMa!bcaGQcxPtcHGU}jH+7|5^1W1SxGdJc zZLlD*H7W~)&mk%tEThUiSflKAgCB%H7>6C5d4)NTKEL+h|MKf+#ML{QCJzU!ADc!- z=nVl`br2aRcnA{OEV}( z-c^l%YSAA0*Z~oWU#9LPGwXS3i>A6^crEaT($W`!U0gA;!;LvztyzAx$Kc6mtw%O< zfV49hy%Q%u#M?id96q*pZW8U^bl+Pyyz#-48a4ZeeZ(>c5WoFOS~j|)z7#R~EcB-X z_(|)g-HpADuCk5Gqj>ijKjx+Eo`^4sXECqM@(kT+f?W%O zIXMy36gsJqaiye$W$m>s3+XEb7v4WmbvsMczHhH(j{WWN$O0E|1~ZFQ4#M%$~sv zV}+tnSE>dCf(bBGh$gJ#$pSwXgzs-nypI=slT@iP6jW%y7tyM|5l>`r=?-47mXT^! z(??i*2sPoLZ-{Q=at<15J|H!D-6WZG4Spi9@TCznNtK>yO*9M7bu}CNQk4Ms{I14G znDf20*la>wP0V5aB43MtUs%Mb)!ubu`mxok;@eU!=3CYazPmkI&?*m!-;O-JRZ{4k zc=dB9?ZB%cRoiwpzTqvOuKl~!D{6$>bqBf~3bQ&5S6@Ut1xviLnNTF#POg!kgZcnIM$m^n10n)4Y`4H$vy+Kc@o!(55YlhHs#@VmGN_-`NrDyYy zl6fr8yoRrepK5)XuU~&Y_|V?Ln7m%YysVSW@V$JkrUwIU>1VLCdyV{1#F|u8p=Smz zoZ8xTrS_*GpKy*P-^_JbN6c~hkC53k*bN)3_p8R_FX3xmhbwRt zB~aTS78TO^Fwx)NVkq+cJhzn>3%?j>cyZ_2f@@(&#iHo=;+Njw)(l>@{qbAPSCJmy z8!4HAJ3S;?%)Ee_$%wjxcUE=0!Gw^n$xKsK2a{;;iA>jSU%GI(sx6FfvqYM+0q5RQ zCE~*#OB4Tn^NaP$NE!urCN!*r*`!+NhB#o*EP5UU5>JGH*LHzH5L2Bbggbtz!2 zbz{1}adYcWoi!7ir4CGvHQ7|`nO{ZrwJ1sQjN_3^Anj=6ETo`i{(Sq2uxf!jQ(*@$SA#Op%`QD zp-ZTy56T7Jv(#aE&JDW8t`TIzSDwO&fnbl#So=p|Z?5t8$^adqtcKc2#MKUc>Yzyd zUfJ}uzAV@sXe(4$@wvUa-4#odA#^p0VSTT3gSl&wD@~^V9<1b} z*{V^Vxh3RlrWIjrF*T@o7$1hbJ0u_K_lVqR*}bVy(Wo02)YTC7tme2wQzDZk5G=jw z7eN`SwwM(hcQp-Getw|lJ2|}jgkE(1G_f^$mVoBHPA<;zU()u4a>i9l&J-(EPtyzD zMAu$e760V-Gc0l|+{(G3hg{BKK6AOTG|nu%tAXVkpk_AO)vdAd&cgwlOxl#77}OxSoiCkGkF84-D99P!Ec$HH!i{~X7kKRG!=)XoJ%fLH_Mp|^_DURbrJ*w$%; zOn3lj=dNo7vBlDHqS^j3rL?_=aw_i(8j_gXsqn~x{t;`k= z&sjuHw25n=xD4)EjWa_UIlhYfpw7D|G+Nd$jWYTIDGULv!tq5T%o=xmQw)jcg}D6d zB%4B(!b{%G?b9|9b^?z~083yz(_l;}^Ql;rYoE!;-h~6&-L%#1^B^E^uW;&N)&9mH z`cwzZri~}6NqXKb1W_E)q>r~bffc%|Lh5cFsC!5ZPma_KThTrG{h-zu%o|oyvV(`~ zcGMsBEk;^f{twdLGpNZm3KzAYV%gNK5v531Q6d&Pi3ms&P^w6YQbeQ)7+RVI1*C)` zqEe!OA~n)$5|s{0M8MD^N$8M}5J-W*&A#W{J9B5woa4;>l^^-}e($^1de&3Eg-f&Y z{!#etL284SkDFtLT00P=LiQSGz}sui@|9mZk25jN9GoSFx33mKUd;gv+tv(WOX0$2 zeEZ|dhLaqjw3U733-xL%@K+qbNlMVR`-R+oM)y8Y`sc)Q?d)Oos}CtFeu4awCYF~p z;$csclg{3IlsFTcKzw_$!dja}BhkSq=e|=`&?sL?<~WMtC)VGt9fY(eBiiY|Rn^g| zaLcQ2Xc61#d-L{JU1098AG&l`L0m-r@jrST|CX&C@4#CQM9aZGZkvuKzO-qf`xJHL z?wK)mwF?@!%pNH21uJAtDGT~l@gODAcYkz62aBz>e0qyhm*{y@xiINB zDSzBcI~I?Bx42644+%k?Sm-r(&Ry_E|1k;fmfU}oRqoPuByHOX<=~kVuP{*k0r$&l zn|Rs<39rs0dwge_{wBDs(lLLgzk7<2(gHe^XsHWgD$}<7nD<{_&BD)8@Cz2~<`;Th zy@?{{oXFNOKxcRLc)z0v&)GW5%@PHu2WrTL(mEQAs`gyb{hd`YdMWa#o_oPcG`44z zC>piDokzIx&BZ`u^8-=NJ#IdHE|)qk4Vq647*H1)M%}Hf*lzl`?xC8e4AiQ!0u>tO zw)_^@>z%4@evU8tR~Ulj2W-g+zjc;jmbbbgIK^6NIjF@r_CtHCi?=b(sPAT8{<#eu z+4?9Zf{6DuEQm`of8W%pZkandW+(q}URZDy-!i8z)+P&MQ55@=BMZSGX|SMU#bo&I zroHTzO3JS^Zsk-4-SE}c+_#ZDG)ZB5DH1X&jFSN-6Ag($$%L#2?CU#4Ex*BqehSYs zu4c8Wh{DtZ_B{ax)y?-da0|)PhWH50f0-QVav(Dkt{Q^y^4CaqQs>(jp+66pQ|t`F zKaUzQBi+`9HImb;**$H<2Aa@M;c1mHAecCNoc*k=>%=+HL%W`S`QQDNOJ07m!5kr{ zR=c8aYssjtEmJM_zx`rPNd$5fgyivb&go@6=J z(l6&R1J~`zDZdTk>BX|^&XX!(R|XXrHe;4Yp9Sa zH;B+>{V1_e4B|SEX10@H#aNu&T5_$D7>l--BE8LuF?5q>A$VhdBJU)^S|4QC zK9c$`rnqF!_0>$PeaCfT^_w4LF0LEZtoe6Vlq9Y?#&BbfRwaB^PQYG6QBJlNypTaS zk<1P&%om`+Yu`^Xc`uHda34H=u5qOGt9XAFzcCLjl%R2?{pt^6wqe#eitXT#Z*$Y2C{NF92(*_*)55#h| zIg7`>`zZ}h9F&YY5req@wRZiyXmn%4T{&mQES~|mYinTL;DWLKvwp{;QaJB$(i0sn5TqX<=_2a4AR1dk z-hT^oRP@HSC9mcQIdSI-Jdr4Yhh*+<`&UDHPsEGb3Ink6N1W(=U$K4$4a`@1~*DH?EM+-dUo3#bF_=cEUS64g%a3p$Nd+{OwG{G zIioQ;VZYFm+Ot5CtGtmn_Oc{+=m^MC*BQEQS_}?3qKafQkB{N5ZBCFTF_o9qr)~~K zZhNWK53_P(0y$9~ZE8$wXb#D9Hck)?*XBs|$)AQ>2=kb&y6;|j({Pht8~*v=i4m#G zn3zEJ2KK(DhDUaS=GL&3 zpyM6`+u@VZ+}xso=U7xq0%L|X(NiPq_0L8_=YlVe|i_E zuU3+lcpIoBrD*s22-WQTt=!}sp8#qAO&MlN+Aurk+AjaZKqN~mUYB->koc(7X>}>9uU$4j}1YXHMy1U04$Aa+#`wHdeZAKL(_Zd_Xu#O z<%&rvE0?&6Q~AR?0oVtR_md1XRL)y8J3u_noSu?dZsdH8+-?upUP(j=yND7o@;lDE zotS-4vE~1f@+`O>awYq0sz*}v&31GI*V)^<2m;{`q>$T4lT_G_KoVyEK`uA*_cy*A?~~p zKM|Wm9Ir{RcQjV|HnS!#L7w06CXB}JB58_^`)u? z7cj~R>`17LkBOKwh?SpcPHaJimxr0la_Ts^OdUeJua7<<@%x!?`?Zpvm1!xEvoJSzd26w5hPrzu@bcIW_F=vDi3x?+E#S8zTi*x9S>T$ zHS)WJYgQ+WT?}z!t`bu6_oXh)SZ#h%_~to(E^h2aNIL4e=&9-1JX7v3E@gl`VUy&EK^n0*K6p~kX; z<=v<>0vG$zhc*BCssMpc{k}yyP!r7h$$!nl%j=h^Kv2eQ{(5&QL$I*Xwkrz$!LC~YVH^CgKOn;cYd6-gBX`UG zEaLJ<@}dx2Gf$>Fo-Orq>I9eZqThE< zJwIe}Svc6I4`pdNrzkB+IN_lL=RrWi>%%z3UrFkCANeal(41s(SENr?CRfE2_sczE zs(yJ<^---F)@9|n55eEpu&O^wZ=x$|v&(oG!dg zGrH)9wwArPZ6JFYRMI#aC>`f9$}iBNPk!t6wot<)tY~Om-gmQUaAfBRyGwO2O&N0l zV#n#BT}hxF)#9l;U*L+8b*-cnD822v$b8~W{#;3n$e8Z>skKUPyLCe@XZwH@ICNN7 z3WMc#$+Fe)p<)R3lAOYCt^Wu%%K!Vh;{TpGgo*Q2BVds_)Pl3*M)xsGwBePqk@d+J z&;V+-DZeS6>N(}vvZAzGawguk@DgmSc6Mxma^^~N$N05DQslC@sS!)Fw4YZ^nYb;qSh4)JHlVk*rDFaU{6@Il z1T;N>acVXUK*m)Ou+^N!7-(*zgL1@^2RNm-nVe`X6+GRoY3ny4reR+OCg-=&O}iJ? zoIeOE?%w#k>P}7s3Od?I#GNdfm1>OY_|n;{U4b*qqCM2y_hd``!!{NQzhy4(DZf+n z!OD7&N2ZC9JIywAvDM{y+@M-uBn}xQHF+U4-&>hpK|I>1Yq*(2rdD=OUmqIE;w}xX zsVjVltJIBt&Fb!WZwt(;gq2O$LC+?j{;5;(9x2tJT6d#noQImNcTFH@{-)_ons1Dv z3$Dd3NuSr2wnlY)2&vcc1mBqPp%uP$nK{xtM*(}+whyoI=PXzajfq_0`e -oC{Rq7A_ET4(Z^hrd8bz0PoZ9Xf#gC!q1VkZF#a9XuSJCv6-Dw`z zRrBrjKVC<*UiehmXXo`TTrb2sm5AOK%$gci@gt9i2AiD=o4EPr#4*WfxCFRj(fpy} z$?mM_-BauSN)TWzj}OtjOt3R&jxKpL2V{( zj^d`YBW97Fsns4w-Tf2qVFPBY8s{M&oL0^m0EA)X!3(369=OB8`G!z`r-UfGu_v>M zUOF8U<4Vc<@rqA>V?hUSzI#Kc38BRgJ-U_moiVb$(gVwjvYc)#gpAMoy(ryUjd?|r zQNb?KgpEWEALU_=H)a^$yUukEGV}qTu=6cW=^LT17jxPNRie69R9;HuG~@IWY#Tf6 z2%$_nKr=26*$BH#MHQ4Tq)(th`);UJR3;ohj;QR9^qdvOXTwEWhnPoEQZz;Uf0h;z zYS{0z5s8csy@g&>l||*9rrmyl6dn99%eTy)pw%1_wC{L&MBq!A>O*3vIqHQq#I+S~ zDq&p+Sf-m>=`$~=F_WeKC zqUff60ZQq`e%^i{Ss`FO31#|ipn$p$=WBP1f^uJDR=FK9GE~#?xG#*Xi=%hvQzF#I zI=lMLY}BS6?@{_l(3A+G5-d1ZiddA@29tC0G9RBw9rmH)YcfO?o-WyXU2ac_$>wp8k)0TGlp2}#dGcz zpw{5G8~;^|B~bBh!2BKR7sdOq6Q@nW;(Tnk@pEtb3Ql_Se+PIOw)jAS+e=*m_;Y2$C|_Ca%x}z(sVZIa3DAU51>5@yb@&9%9V-c3Y4A(y9qTlxiDcEP+an z(Q^yUZVUG(J00KXs+E${n$Ams-;{x%RNghW+&19xcane}vFnt6GmNamu}&8jg)yF& z%w=MK-ne)`XT)TeW~>$}UQ?jxo%S6EWgBQ{r+UR*CfA?NGU?(=(7if}&LepvzLJmD zayQh5`$cRd;m(q8mpF0(@cv~L4fKz4%aQBS%Px}#OM8fLP^mo(LtIue%00YfXNnw< z{YvC{xct0Y(X8q2fbfO#9**E*@;n$7#u(EFeF*!nYZJd_Cl1f)--->MknG7ig+NE- zMHhc0KAb&nKUuPZ*q1olHL|)>ar?%dIT@32WsIX5%N}JL3hXtX=bgYG-Uw@~@$R%~ z3?d7a%S#gMse3yW@b)A14y#FuWi~A#^~meR)zF3WA4>wxpq6<3n9zh9B|}*e@S~j( zXrg#uMmb2ka=;eily%fPD={ZT-&@Kq*VYXcc1`}nt@H?fy91Hi=Aw3$vT8G2gr0b6 z`X{a@FSShxMxpFT(>&qJTH?j$B`be9IikM_h?j$;J*v-|@9n0w8n5flYCSOzvqObR zLF5yNpinA`)YvNp^ga&?zu5O4hxR3K=4b7S#f`xla|dJp=DyDwzeBar*Vr~y+G#1D z)Op%Q6fxuHkLpLq4%}7wH($<@P=^Cv0T-UXk~4X9odA}&Cotg;9bTI?#oe?3nr@EO z4FG>dO1}0JG2Eq9x)3y_x$SuaZAh^C&2vUL*JkfFMy`&D%&)oKsU{Pkn&F3iA{JJ@R3l1kZgoY!QRm;EvhDAj_lcfm(@e`KsZz!l|Ss%FNK z)R7v`vZ&$TTf#byJ?d6sOATmmNa!!55vV{IQD z0gx7$wOUNbKEK^ICoXr^CrD=4XI<>aWcZwiq0~xI_2kY{znovM+h%)>!>&*+Y_W?% z_GO6InI4K5wF(lL=KfR{7ir=prfDTeHgidRn@L3^x{F_ly;27~F&D}5lp|vgvr%BT zaiHN0@qY&>|Ihy}C_WNhC2q%DLI_?XhG%3glRlY0Ql^mj9Hll=9o6jL0W9MkK!%78 zVx)CnEj!$1Rv0%-{LT5;u3h>NSpLaxKm!eHFFQ*Fyzy)~yqyN$EuS#^Y)8Jr;*uZFomThxNWdmu|U|8pDRtRx0YTz4;IcOGDGTjU8{69QFb? z#+cm)`!ivE^|XnD4{aVd68Ni9iqq5E=S@8oXN(NSF^!naB7>><>Zf*|^czyd%9e|? z{oLz%!kTvqtU#JN&VB^Y?_2${dOP0^wJ@u0WnlP;&(j6aXQ4+GER(nwLHTGTrvThU zlZHijoecl{1ODI>ML3Uf~l6H3mwO+IRpOcko5!%-rhr!c|m=>?X?gU9v2RJ zhi)@7W3OF9?9TBMZ@>$_xo36N!sgw4S zRW)5#&gL+}dyjXYvRl2b6v)u9@M^@n9i?k9=81b055Z=A>Nbp1jT8h$ zBf(Pg!d<}boe(G{^nrNJL0J!u=l05-XT*b4C=O7C{YBqfk>Wn)vY)3`7be~a^1#ll zRryT2lImf@2(z~@x4kkWC$zWTudc}Ut`^RKr6(u|Wfy8& zf^nAZXufTHksKkRKxN*}AYx*}214nKYe~=&L%?Ld2we1$^Mky21sWh?@fQdKA{H;Pfc>YD(ww{Tdm9N~yw#Vo+Zf@${OG1J zOF@!|ZCNqT*Egptx0Y2`b9b9Zpl(8!f6-$|XOb6xMx#nc4L}QmCzgbz)S;FBWzwjC zI608y4*WD|t=#x(<8<)1v$30ug(YPgWX90YU=m1M-Ss%&O_ZKGxrs23gdJeJD+`_w z4K#pS@3xFLj8ar?F&9uxUN55S=A>-Q>ecu!5rA4ow&Zf!jfLG?gZMqIPZB+bb)IKP0VOIijinjo4&P`xF~Y1*Y4vZcA@)8QZroVP`Tf*%Dr- z3_C&-v=K93BhZ-W1fp7Wi`$yQ5##MhVNag=S3P;LD0k=a;u!_|3oiql%EzxtP z?7NqYz8xQt*@X&%p>Fy!n%6KPZvNQAWV1onuYpOK(~8V?azf13l|e?K{_!>+QDNFj z)3q|isVXlQ+rsXz(yk%4vtC=9>M4L-qDqy7vs=9KZadwP11QP$O95*wqG=5TAT8q8 zmY%5fP2e}YC_{}70l&0iDL~D?Z5uB7Y{OM|HK8Z>oLIxFtwksJXpj!>En4LA&LeUx zLP$`*UcuzE{2qOiQAyz8GxpKAB_;)6ah`t4nqx(7HG4z~KGJyKaQC=@;tXelcWQM6 z(W~k$Ot>akMmpwPZ~pqurPA?8H_z zL?sxFxycMz@+9G_Mc1!0A*$V0YPWYQO83S}Ew%)CRnBVcsJ6z$?0Da+y-Lwzw>!&k z`X8T-FU)nHkKD*Hj6r&5MfVS=f;QTU#7E?>vDJ}Y)#|5)q+MkCG2??56a*9kBu?0? z8HgBJT>U?C{Emuv?h%m~RQ#Rl+;wqT=S7**eYYFf@AqTC@01UvEwka=Ivx8opY|%x zy2OWPs*XKQ{=`Y~ru=5eX%m7Q|s@Z*&LZ+|th+F?w)t-(%A$|6}9O7&g_&0Ej%`HI4 zw38Pvao65*6K;c3m-nUPu-cy6+%}`n@xmHTHf?cHv8Ckk1ydm7Fy-cOLQYv8VMbq9 zid9?x3^sXq=~x7WjdLocErMV&lw0A%rcTgjPREGf`8=34;;3#lcykg%Sl`~Hkhg2z z5-M7ca888NuDW#QHXXWRwXbcW?_VL}EfR|!oSiECL8RL$j8OeoO{Bch3VANu^2*Wu zYkN}7jXN)=g_>#8j-F4@6-&%gen%ZH{2d({=%maEW5s-u{l(@r4M-XPsxE1yW~9|?9Bv)OVD-M*VV ze|Rk(OjV|6=5MVCqALN>TWhl}OJ0O7{tF&5jf$(n*IhRMt^98ykyTD#6lug`D|8}x zx7LDl-;Dwt|J?K9An~IKwl|86J+P}HGjfq1D##V( z)h`4t>Pb3Qs5YNo@}(!Z+|guhzpJXdGAWR8<#&J0t3F;>xc_eD zW~KBvXBOB_W=_P?N7st2)}Hp%F*^ zbhsk%^_lcAbybtWv30ka)G4O8A@c1f24k={VZx>mmXVC}0I_iHWi2s_i@+m_eH>M- zBDKZxSVoqF?&szm`N*_&r&~<8OBKuF{BLWK#9@tXJP>91hY)e{)5(=N{iOg6?yqD+ z@UDsvW^Ez9SWWPBdaiPeFI<`h^fu$1D(J0spH(>HHF=ut9tXh&9G?7pU_uh?D|g4x+2^4%7ws8A4Y)iOx1oGJ(rJry@EX7r=Fin+x;M2{B>YhTd3MG z)J|sutz=HjkF8f`JDljCA!&}G0%9p4Mg_VaznWwXUv3j;=4JStY39a*LSM36I_gR~ z4F~7t66`vQT6N~O^M#~*%;CS}W@#h{`Pa!?6}JS8QZIa!zPxK(?3K&PFXkn?ig#(fJtTS3d?^N>6>tZMmZP}DyWgr2B*-3=;03@B?U`}m!l~wnGf@$j~-*} z^nrqGS@1y38!!8 z_=W06Z6iVg(QYO?rkJh{v*)b-Ea0a7$-B4doB!q=ZRB*WyZ8C-k_wP-Y!K_>b6n^` zM>~X~Zric+?iH^;Z)@Ccho2ujg?8eVGSz;;PP0c8K{3Z1O(4`4TtK38xqRE^p6Gm?9k5Tl`R5w^bvi4u@5sNOlhew7dX;ULgc|sov@P@acRL_l{3phW1tR+V89gdC6aCmYXQRjVw?e|^+f}8s@{^OY2I`|WlM2p% z6#5>!OXRLx{er(H6=BWmF0BZhT`K?9qkj13(gY}Vh3`zzs9{>$k3uQ{wtUzk?)0SQ zfeNl1FDVMzv*z`ciR`hJDB2u%!JNoijB+KX+i6!!d!8bXkp{4^?FS(}Yra#tv#$Wh zTVh|1|2_zMHi1Md2ye*gZ1Nz}Rj$FhEex!gU47_3`+=sc&#Ibb?l0u?DqT9Q*LT-0 zGJ^s&y9P%}7*xYELa9}yMMtUn7Rb|xnfb;cFj;xYg5sAW^@yS-t~HX|X)8QAD%F7y zGgE~oFZzb*SpI2FZn}@#usHvwuny^a`TEtY?gg~XLgju@X7ROab;T}F-n&H&j>uhj zqHv8i@Y{~7Hd?GMPNn#v-^5sH3n1*0mnw`@UJv&OWb7z)K2u1;17JS;QIE5$+Yyid ziZiinyhCzY!T33^D9Ft}R#z_H(-Jc@xs>K;F_n4`zZ0!nUyD1;b)Ellq;@+v&7&(U zJ(DG49jWrQ*EX>6;*ISenJm_d&3zH_SS_WIJLuK%_S5W`_(qnBj}hgEmH%_+Z_mrf z5ZQ){ApHg$A^vBcG~uhH8ms7a_BfYKafPbsKL%XtwW3(!&+8G~IDya8@^1ZeCZqh)MLfg>m=$4>E?zvW2PA9%dge;gO+ z8?nU;ZLy3obrLf2(K9xK%A&$qIVF~^K!!lZ>fE3&$ocgw-O^>r;&{DSFVQHsXN*ED z{K`v3!TxN|4_h{@Tte9w^FJ?Y>%L&WOS~lQexa8dP%wUcxCl)Dqhdyf;o`hCwpc_NAk8 zE&VXGOV4V8e_GZ(KlREHREm5s%~xbb)dZ|Dfvmk9=IOXTn%+)@^IN)eZqA{3wgxur z#B+;#GA@aC!96$@A@zia%&4!m+c^VSk@Uo}tC8X-sNn=7KhSLD`lcZ!ezrfxzsPg) z@uE$YP;psWwNWGH@?h`snm}q@?aA$Vu=`r6$AW4gpH^2M=h|@1S1jl5rXzG{&9}^5 z=nSaHv_^b)%Eb)R^?EYx@P;pkM)ajHDW;gH{#D6|JcosVm9NipWxX+6SWBBE1})^p zjE{ZQP6e8$TT}Y|t#vaJ@s6EZJH$>d@ea&=xp>twOV_H7FB@xHmh^tW&z;faaQy$GT#+QGME(*`p#>OyA#V@Xa`)@6g%P~Qq>H*o_B--c{2Zcj6|#!wq)oBswc zHU8uF?2A%BW&WCm9?P&ah_pbv^JwFFMb2< zJ{u`XF?+FE*&EtRSL&CnwHPkLn>W$(QRVl6Zn3v7p$k>3mdB9_&G>ML_sbcP$F)`U zSG#{$ZDn^b@b==&&LV&)d^YE1b|3j$;oaCWNAXFSZTAo1(+}ivj*sw=wF|iLi0)Tn zX%xft%Y$DzYpqXVseFOk(*)t zVK$*+Sh&i*%E58t#~vAcXx*(wgE_finoS__Gb>p#1u9DxY#Bgq9k+Qq>BmuKE3qmo zTZ`X%uykNKIv}HMyt6+*eX9|L&}$1= zIx@^EX&CRIy~HlEll4NXFrO;OWw%|_q^>0tlUoLbylFyi$WOqrzu~};twc6gl7rW< z`v=u-0JPjhs?*iRCbLzpj2(E0==udr3>15lJcy|0m(Q%5z%u${YBzPs0_WdKagsx# z=F^&RtkarV8FP9Tsq*%4LzZ)QuU}fMS&A~RTS-)$=0?G$2+hAvolq$r7EwI?YBM#- z=xOy=or}1#N1r%Sk9ieY0Np9P)u-4pa&LARPI3Gp!dl|94XUEn>>jDMvZA3CI(6%w z6i9;>VkZvc5C^5LJ?Q23zxV zRm)A!r^LO!=ii(l>s_0Xm5^5MFEx(@*(&5BL*wTDpbQs`7#H~q14*YKS)`@hE3 zT&)<(H;j!UDE*As%Io^Rl_1Z|a$4(N^_g(PEB_-&g#+y?&YM;#PX|kd`~Moe|3?Q< z8JzJLdpfjm-UhgToTh_d9D(ix0QbCZUUzfSURKmUQtC1c%&+rwKL^45({Pb=>GoDj zm}mpu14ftRT(JV)XZIaI07f1w0dv`F)0tW0s@T4o@oBmVsk{pES?H|$du0rl34nS! z&j|8u$s6?Y6K?=Qrw?%)x=!e0;JRA#Brg`e-Vh#}@$$;U;0Hl_Log!J>qqg$|3) zBY7ExjPo<&+FyRI0x(k65cb1p={x)UF%4RyZMs2Hm)XpnvD^cqv+Irb))P;7-{)%C z!db1(2KaP?+@~tYt}v<>5CY}RyRa<%40H7@bLMzc1~GUFI^}5Z%!EGDT|`j!4tU~k zfG=SX7I$Y$F}Lg^=P8f07{^pw2!fGI=c|8km6XI)R73*Jg3S;XpVjgcU!DPWz&&LL zc=vf~n=iV~fJF&q@?s+jKH2b61`fdMBP&fNJ}_zWsK2FCx=>!2S-ScA0J%qbY_)Uy zgMChII-z4s<_kRD<)63L1ztf^frOX6rwzPrTY~GE^y!@W^8%(pP@2M-a7|~g)!7k= zd%L!ho6c9HuT?yHk-r12WjNJ?}1PuLoAA=LCuJ zN;DJtOe`R_mJQdhGBa=fr(Bomoc#YN*QNhZt>qU2hce8aTsCPE&BJ+}1Rui2FO;9< zih=m}ULP;VP2Y62D|51=^DbE}5h_9gh=X5Nr}#kWM>gR8 zc{=|vD@@FlfOmm_K&7&&YoeX2M~4tM%AR{x1{`Mc`{2Aa0-P{;8bO{A(*)#>+wbo! zt6~7;V%Dlws~mJ7auEuT{87R0`fPIF!>a{Os*gkVw_0C#dcJA`nkyy4a37Y*Cz|{! z1-KjtC+$?4T&u}KTS}-?ykB{0i%K#;uE2a*&FZDVehtAg{(-C1+U+Ry{XyZZw-lrp2*1C?O}24DueDj@g+lb>(hBg-5Gz6C zE0N~aFMvbCg1t$HEEUfECqx&x1nw(-YrR7#ce=g%o9YfP@1(7q&uxjG21qIJmRIRn zU=Wkn(@-LBXSy_>9s)1Q4YfjMcApKks`cSyal3Dj&7p9D@Lc~fCO`T?{tGHGSX1Qf z6Ly9!Ysd6BcuF}1mQCkR;YGW1KQB79pLyG6?)dzq$vvfN(k%eevr$z)=D)GJ^T85BC>dAnk}@5;Vk}^Y6SF@WEe&SptFpkF z<%__$+ylR%Zb$DL!~}I}K49-^n>}}MCxqmi!79qSv95)^KXGs$U5lpeHQAyp9J4sz zkf_cX-rQPj;D>H zN;j93%5P~i=P#JA&q@*4%~%WXs*(T43n081P#0+qyom2Ok#JW^Dn+x~-+;YSQF_SE zZ)vhKVxOM3HNwz%$Z$zUBXR2Q}-3(G1$lihf-BqphTta6Go4qBebI!jNs z*-Sb+bfdnr$POM8niP#qQ4lVe4?g>wb{Kq1Wb<6gO%C=H|6@h1WOmm>n*O&)^^w&d zK@p#8OeLQx(H-D~kPL;L`BVL)C!!FyRhB|X zIFaR-@ltT*(Ks!!@Y)%gAgFCvBA%fz*o z!64EfF(27xUDX5spz+1`ielQYh>iL|793T&V zD7WQp3s{nq*aoEVha*3C>k+hrb7{}aB{@EwYHzKZdh0qEzq^i+au>_?^GMi;@bL0; zKYB$fWL|H`emOm$`MuVoeua$v5g>;;sJ{;Tf~dxrubKvP=wjp+lIJ>mT%E-Uyxydi zYt4y4^-!3R9~ydd#6<+;!Pi3QqFKKXuxrw0so$KGb$b=vV3wY37^{~H61N1o(_=jX zYe(3-8`c*3FBuwXGm}TCodCJ+n^1)OE1{}MOwyG5#FXG6SG|HWi6l>H(7gOHE9voJBc+iiV@=VQtSmd0|# z@fCchd1C6`@S@>OE0QzmBy&_ zC!>iEnnn{aNN=tZd|74F{-#d@BBQ$CdPR7&Y@pQ-wdL&+Y#v|HwcB?q6*K>1bCMXwEWg!{5gfF!vA%Sei!k zqO`S}f0=%NmOdgj7bJxmee-mPoGbqZa?f{BLw2ZQB{mgaCJUQ+5cwTYuv`R%2#xt4ypeP+>qY1O@NOms+s zW2JT5l6%lHp@nhtec-F^O`i1S9SO_&-HB%ygGMuNmjJ32yHc~Rr;ZX}d-g|BBwQoZpiq@+Eg!<;hE ziHU)$AmyL(lN8~9+(#Aw|5KF>3im5QuK>U@>Y#1TD_uhU(_>w6Z7OHGxsH3ktkO)b zGS&^g?7XOtk3bE%2MOTI!d;&}RSFZVAdM(StG_mCPO>)GdZ{8vu=B&ql!D`QD;**! z!)A~n4ZRL?p}JQB*%b%f=a33e~tK`~6+%n=G99%Klrc9Jf)I>F{)pS!eG)c5m(#(BLvIv>Zq zcx};MMiciyC3(1xcMu!NxZK12iVR}?DRA0)Z4a_t8pk9Ht_jAT?eGc!bA+jWw>~Fc zz|rHHdM2bRb^?oA=FBoCI>Ud5W13PB>xwU1U^S31y=7TuPV~gTy}0^_{!g%p)vmsO zFo%C{Qy_v~(iRoCMYRi90xoiw{_NhVpeYHk;$IY+0}2|IcXt&JbV95UY8Bsos8~mH7*sn&5NjGzCY`}; zwD?8n91DMuXM~HO6v-Q9(@O1f3kMYfgdexrej@)@;1BATC|i8Z;07u` zAuTLLZ2>XcTrV$v+X7e^BO2Vs<>@R)X4u$ke*hehr8SlvW|^6N&N6e(#$@m}8d4v0 zJik~|4!39pq^-eKgL}AW^viy7eXN7$EzwYgC2mb-V`C35>RZa@Ufn1>zoozFzaE?Vr}@Y!Q{g_ zZrzLj3$1dtiwbo(G1q-g8ZuG2F}+wI+?xwux_|%brK3q+?jO5930&x6ZjnC67P|a$ zyAgtmq-mStDqU^Ph*gnGB7LU29bi6wA2idG;jYXo%H~H#h|bsGPlfbNc63vd8a{#RxrgA~O1k7_*0RbDk_?BQRicsIT<$=g&a905U&Os>SQ6U* zFWTTP-3@A1HYqujl_hCA%>ihz)NRRbFlQ+>Ej7(~Kp?YHGsPjLa-cyoH6=A?fd3!?a7IBzL}Z4`{{8>=+~+*cx#xIa-8a6$R}0o!-}M>e(^WgAr9bQ*v#$|iUhD@p zN7vTdOd*h4O&`ddPX0EV0X?V>tqQ%J=+p{%{F#5_Cc4+BDXf}eCAz6WpbQLf%7D^4 zinyWxHYcRMt>b_qEGm-XXi&-hd-L7@vK6O7C4%l#qGi@FBlrKsRqS-XOX}=~`*#f18Tu{~uGae8F;lCbKKXGHg^&wo*BF!Yty=c1?9$pK04oZN<+- z@ZOS!TYYxX4YgDI@9$FRPMOF!n+}_09m8zpPMS#8huZt5!0+KpO4}g^LQFY~M= z@lv1KeD`Z@2vAX%4>nd1?d}oh@;t-^n-)TfxQxS-?$Nt#VjRA+&4ZPs!G8y*z|oES z+#lIq?}0yDp7>~wxvU)*_=zv`uRw}MHfF*BUF{2QmK;#vO6Ba;CH0$GHtvDTC0w0% z7P%v}FYUL%614ueX5aKeElI22wu^Ld3=a=OV4c^Xam$A_+U;&=dMpq5P+7gxz|+OV zYxaQjS$<>X5a%-G77%Qrke&ap-M;c53hFNXrqul$Gf+D?^gmU|0R)vm}*m93hsminp17~9e64t~u#0!u8k zz-nG}M??lXPrV*#TxgoF30)97-o`GxHcM-A(FX!66l9}9A;g(<)L{Hd0Y%pQqpRY9 zjhVd=lZy%Z5ui7Na=fI3Pq9+ia4`W3$u=8K4~*_Ee~fn6Bl;wcyz^f^T+F2Jl`1NL za3bO{r>MZ0Ij#t(icSUqByFm>Etk=Au^}d=iggG5>%)y>b)CBVrrQ)b(_6v3Ojh`C z$Nt-gTbY0R-KO_*YhGb}szxkQhYfzToqE%U(f9^cw7}10(8dqh#q9!WPGlN-wDq(r zG$YQ*xmN&9KfK8asNo(1HZ$W z+*;7D8f08uj`rcwg1c!u4B?Se}*f#eXD!WTSbys(zSPy zW%aYWId5L8+rq5Tf`|Mr*hewt^ z!DYX`CDBHwhNvTw$(|mlrOV@p*4e}xVxNgoEI5qjJ&*kEVGhpPBDAFPYA6Xf%;*=-U;czd;*{cxP2&$VI5N?pF`u+hrw7Q+fQa}C3cPgY8C#w}) z*5;(XH@MUXD{2V7)Q181;LojjXnI!OIA1F4eiG^SC99Xu4EDU7B2fsNl~HTE?V1BU zP=K=_Lj>KWfmb_bFc<4!D^^=^$}mY_s4M1#9r3aYhRlT7tER&$!5LksJ%eH--l#ojip9|(wQ)| zTjP6j>nne0?nN*nkapAU?P(*-xEZWcOcHiYy4}0{PQw#1rY%0RCM5&Qs58!aYi@S^ zpY5y(uNddzGOe!kBx8+}{f=U-U&ua9T*X=dj2^Q46k)J~!6@-?Y1;oOSnI!iP?wY+ zKD(8b-BW4P|K<;M-l408Ss8^*GpI7zG4vpV_*aK{!^ zuYJ+g5BTe>)x(7XC{vjf=dJx^_nR;8^FI<7&c_QHDt_22g=R4b-@(IUUA#)7H_8JH zElPB&P}fH)$Cb?_K;BIEFSjXGFXRGPhfwD$P zbqYSyqyC==i@V<0L*tB_rB4fhHsRxms#7UQK(2E#4$@d!5!=?{G&C2Q1O-MizfZbT z-u}-<)93e<*1tCixp-X;c4@Sg_*AX!jt2K$H{f(>-)?zSwfYP;Jnet18tuuTIv&22MakSB~wSAJ7L65B!=se_yp!_RZxC?9kIyeJ^#^pV9o+ zo*5NV?`GmLWmkRtmEc+el(g`bNB?DI*DrOJTj?q zbKuz@OI+K1g!{|HHt7}Iu18;E55EfimGrhKo`IFtf)nDC_FsJ4v0`S{!--Un8L`Lv`tIJCsHD6zu zD357V>lgIhtDd6_j_aOK_&q-$S0pnE9QF`}X>SQ0k3y5t8~3;&2U;8~5ejbeXnwN_ zJ-ki7z#_j^Hu>D@?;8F2<&@$Aj)H=F+QP{F2n954O#ZBz4bn+IztYmWR@dY7_sK!7 zI%u!W{mWGmlgG9Ybk_z0dofv^i3xKdByT13WPxl_pJ25Oix_W{S9I0#MJ5L)PS_x} z&LfVB@laGp3_@9?Soi&_Tlc8*uTbg1rG#YBLDs}Z6|Fbg8AanFK5VhCNJ=iEDCX$JwZ9)aOdJU zcWS@64rez?)LWO(xzSB`gXP_#TI3stnXHZLMkK8r&s&l_BmsWNw%!14Wjh^F*$Y)9 zzlv)f$k>XO%SY|2;mvj_Ej(Sb?N{V9a+YY_r>8}?3XDoihab9(-XC05;8(V+zUflB z-W*QD`@^-meChYP&Fa5v*Vt^MzJt@V+5XQXy)#VVbq0mo~< zH~&=AwGMB{6@O?FGt1ckTBUYu| zN(>evGC0!{SzDc8teAq`+KLI_<_Ba zxHq*RMh|54&1Yb?tJ@r^r(aRUE6^3>Lx=$_@(p;Hh8a^g~z^P$#5pG%~d^a*~uqX$wj-$Q#i1#hkqmnQnmot z%NQ1fQ4-@+IfS7^M~;ZxdUAw+2KD`P6ONDTkJzU>7x%ktz?7)Q3BaV>Emq-w8Jd0L zJN0N6f1oR8e(y5C$w4xOI) zpkxJVUE0g$RJVdX;tpwzC%uSHCY$OW9JA!4UW)Txi7vs2{%4n?YQ$GCuc)33P_cU4 zqN=9Wa*&EXpFPbz?H- zr-bjy8L3>YX#FOOcV}xo|NQvX%&^C)s!rf7WA~Se&JSU1hI4E_?5uT##f(^aiPJ+f z4%azH1Q-0Y*^F>xtZg&bJd9aj&5+4G=c*(tPa{C){SNBck;(%1usuTZo0%=j@h;A9J?bL5h%DQDb*HJCM-izJEISPpIv&Gc6a$-0EXM8-FKea;cj?)` zt=F2l1BZKyVR<7)ycShKTSgeHl1-ECUF2mvD`6D&q*S;6W3cR1Y4@X4d$@$9x-&d5 z%A~*ue1(y_1%GToUUmJa>KWMS)$I}Vqto(wq6W|M5__X`XuK)S?8#@}rj8%$U5JcV zW`-H5$yyJ@+dO_aU0>Q`GoUjZ?CMB1D&wGiK(~^eU0hJTJ4JU9Je)-Q$9>)TI>*+e zVBy1-Ymes|m}4Ps9X`M<&QqIFcg!r^oOVoB(Za)OJ8);hrMU_EuFQRu)L!5_JyS=IHDIDnDhNfSZGIhcnCc$L|?m>IO0vI?g^&s!q7^|bAN1jMLvr&L6`E-P(I#s}5=DD>@u#<3YZ+0e@Io zm!a=8%L-mGZ#TG0mE4v31740efgH`%ITas^xjLd8*Azr8_90MNwIRFTz2OYW5Pn#u+{yIecLzv zxEb13^zJ5;rlm`K_swmOmHo~=?Tn7x8X0a4GM&BZdogg<%ZV~kD{AP=0_G|M#_kA{ zTNvOCs3VUPX6!8++AzqFfkNO4gQH=HOdVkjMeY2eeMH&!|7R26hWO$$YhLXAzWsGn zcEOge-WE2i=E;jowL}P6dGPV^AAiR9+`+jMF7D9PG%7D;@0g=%NRkct`5&kUr|-XN z?q*5^7C@Y+whHg-#6|C)r(PHDFc7|DJ07~Fz?*ZUtCz0BT9Dz66#Gbc7X z9dNq9-|+#LzyEgETPZm51-318{?85$@1&tbogFB#9MV23FWD(h(W{7Hq}~a`vO(O(9Lh4fW#EfK&+Zgb^odk-w`m#VGEue5-dR)$<^sS>dujph#wq zDS|W{*Z@aVo}e%PN-U<3gS{Mi$gf|#l_7RRg-JdKE}4|{MWyrRHS9oH=<-U8{%3up zmwz#7V~-V~*8u`b1{QHb*MzrSj}ZQoDe%?|r8)n{&&ScF@K041cV*Nc7TQ)+zSjFU zDNA<-1y+)N^_H#b`2tm3Rko=8fhi7)6Ve)Mgz+cYv30zUUP3ElA4MoyZQLzKdy6 zoKzoduuj}{%vRVd?d68hopp%H!XtoCEr{7!R?KLD`ESeVztfjk=U+zPULA$O?<(#d zV3{yROM91v*4WN4Z{FL|yGu7XhfWg`?Te!3YIl@kjU$k*CCvCkUZG;)Q;Q*Bo~TQd5D z7ss1Wjccm;U3z!H_qTZ*tk60>SO_uZ&7WQ>Mz>rCao$oHNi&)d?+Mu9$2}Rwvzp}d zr*HL>t@D+Sq<53;ymQq8&w^rZ6$N!H&#>LT z>b6X{J$jn`|?jP@!*B$?vEtr{EACi^EZXGKOFlT`v-Tn&b~`xOqj zG|aUN4(?9an~DWpFTrf_5cCOX_L0-0MfU~W zc`MOOA3z!Dy4?z)|Mx`jx)JZ0kR%nh!9<+ykR5o9f$)CkL7RPkZ#bGaYBYMI4SV@@ zN7ua%<(CxHGlVnV&_2DAYMVTTc0RxWnZ(aiB+IqhEGNHxMl`8aR3p81VB5x7fVC7q zbxp-4{a2#7%1gt~`d@M1I6eM74l72imox%lK$E4@7j-wh3}I%lfxZuS2wN`}N_v&G=aI``U zKrGoUZA_z6;)~~PE;#<(vv6I$#h?s*J5iC?;HJj-zJYy5;Yu@+?#^|~_5_Kn-t|;e zye$M0GJ^$Ik>iG(sZ35L+k4QzWQx|^f4&B0yBsU9+w(S9bAIy9MTaMiAsmb#Im_7c{Vn9DVoelZB_Upc?kOpmgC6nHFn&ap}sWXMWA|B`UEP^f!ZwQtJt5L=Tl#x6_0AI9x5$b}3u*in8#E!_^jOX$6}E;Mv=;)@r@rl@ZB^#H!4N{W^y}57eL9jsS@KkIm5@(10 zQRg&lMUpHv<%StY`XQ2|D+vim@Hlc+#RkteRfvPBfj9g_hxmo1(y$hZ$D+kU`tZ zd?@P#(qDFEw)OaC{1?kI`lH!7UiZS;!0W)F3Lsa9Z~TfrBH{e-8m*Tkh{$37Iu>=Zp9c5zz5m-b7v)cC1=KAq^xS=#jPv zf5Yk8wT~JG%#x!*v66dn*3z$o;t7whL+o474!x-?!p^VK5$VZW;v_Nu`UtH25C7jf zgFNY!aDGX6t2@|WKHNBTphcH3VKRSAvz&BAH6Q0*{gW@t5Ol@mXID5>il2(gN_NUH zM*XFby`7%KIe(vFzrP`wK;!Wr&T&#clJ^Ui>Suqcz~hGfwJ!hq4dm&-Q6miEMTPmA zt=l>Ne^?x!8W?1HYj*jmo8rIUoXB#LGpkb!;9K(tSdM{GAq!WKU1*k7ZN)dNb#JPV zEdur?G+n=%k1OZR6D3_lkr*YV!je|^e*e!`V0jt+_i1OV3wl2OqnRB;N$xRI?!&-1F$-1j)jLaqy!+8YMF=@1vn`@?C-{CN!u`{lhuI)b zNau>eD12R&eg+L$MsPZX#M~@{q6vT=y>%BEX8^MflN@jhD6z={xy20T@#w6S15+~q zh@mIST*CPpZc13nvjg$1Ru*&?2w<4Ke8EMvR&))L+x!ssVsNSpo^eQUWmb0!&QtU5 z4RJ-(TGR1;iyl8*w7{DVUuynbaE(lE!(AU;;$IlQdg9L3n%Vra$^@L>etvkfX1%QY z8rqB4?A5|y^d|mgFa3swUIa~LlZy?A@L%GsB4RH473}uvUhmkmO1g`4247N6onC9T zU1`m>-N~ZX^O*(oI@xq_D#a2al3p;i`Gnf_1xC$Ecea-6mcb@EMa-A-f=^}vUKgwd z^T|v!=En!Ncau3fMstIc2|$KHDeuFzUY!zI1W$t2&3?k-kj8$zVRG(DllPzaV2wOm z8aCLtZmzeM#G0T)Ne1cqfb)%5+=yKZv81iZhYkA0b|GRHlvA>vLhND~bW9-qj9kW? zRS_w&$`X}P)^^V=DJlSAI9*Ag>q7z?17M}xFk!13q@!ljJyV3O6_jBTj;L#Z9Hg*E%|Sgx_4`zJDPpG@})T6-a~ z1cw8IZqYR)L}*p@Zb+aRLnz7zaFKavG!io34shJ3p7bhfE1&BRQ(30wWHE^uo=hB3 z#rZkSlXKPbn4%0)I7c<0QQ?K$05adDG%*g69E~*@)i^?;svlXM%mI<+&XniBZj1ZTF|%VY|XkcFu|-_cJPp25lnpTs#Yb5;vcDKCV*7Advd0W za?$jPgSirAVUefU$I0d{LmbQV)#PT^$h_2-xk}Pi6?5KD6CB-tZyVnBew{w^eC!+K z<&6vt(x>)6ROT$_;U@0S2DopB$!s~&iu;B(v*y!Ys^2lExFW`s4WvAkL!q}*v+l-0pS<=L(e59P- z-p)gXVwVHFp!A1pL-)I>A|a4L4l5p6S*+P@vC1r^A>!gNp^0 z<^atj?_GJNDA3?+vb(8$V9j^bQG#qddEf8DB{}9ZUbEemeQ!}GwmZ!stc)lCP)Qu6WIl3_38$HVPC-%Jl=Po{=*Yt%kp>&Y(ukAgc&G+7M6Pyw2cqfcx@; z;+N8=XKxTYIlqS5HHI+;!$2sA_@dOtA};*{#BPN*GMW+|H*9b}s><`ygNonSpYo69 zL3Pp9@0bn)asUgxnJ}}720Y8Fl-iIV_5G4RIAdI`x{j~Bk6m_tBqmr3wf!vQeY2Yn zdkWn81@N$WmcN+8>-1MF@5X>9e5$Cf>o4Un`QBO0cKJmS;7>TgmOlc^1C46|UFH<` z@uhqZi-}89RM^Fc)=3S_WK<602NdTN>VHH#G+rrdN`_8{^)t|6s2_hZ?-Y@CJfJBKEgL*P-{Q9#Nqdca6KVloD}obe@C z`Swqvo1=kS7=fI%uTz$)J4X;+QR!VC)2vPU1X{Y-dwC*G+M{C3+ z9X&-TMz)Fs@DQ+!*84g5`&zOcSb!8~2_g?}?37x6HR%DU|Be1=#y=wg9+|9x6et?_ z?o(z}`}28LRH4nL_VY%N>1451YLpGXX$*8PlT*j{U?)i5iL*FR>A7ckQt_oIK1AA& zl75BACIQ-tNir$YN?%JeIjcqB*H9eNklb}0uga|M3eR+B$rH~6Hw>|33p z^`X}H5Nuxwj5l#%zHlg(isHA*bEtp~?=`nFpS`_M?W-A}4mJ)|ft#*q+U;*H?C?wo zI*l3T1&Y=jzqc;l2ypz#C zsn0~DL@u}9lzmo3SlxX(SF4GLdn(aoWxN~&r%RH?K19IB@oK2!_qMGR1j*4wkRpFa za2&+gxn*ATEdl)9$^>TCk>|lk7OUDUW$|M3(;!wZ>`q`gv1*Yvr+T@$tzQwqf5TZ6$!f1U?&2>)@054-O*FvidsOj+kSYyN<6s9%k*`6K!;e)VkiM#D-L$sswznD-?DW zj9Rnk1i@?mYLJM!%2uwZ;$M8%bgLMUjL%X+N#qM=5EJbC42YXlnB>ybOM`g|LmRUU zW{75h5aOy*zjrCojFr@8lpkd23KrS#A#aVKn!qc)M7l@8d-?5B?f6PtQNnMqN)S&i zul;I=W>vxb-9JhyHCAj}JJLJ)3M%CF$%?;V$jQ+-=AIZfY-urB%)P2Cd7XfoK1cg$ zMQ5vzDe;EsEGyu?Up+y(oz@%+Amhk;9d4mKra9z$d`OuU#_u(h$eavv*ipk zd6%Ya)<7;W>k@Hm)Rxt|Xr=0O#&G2BoI-f7+_yX*HibF&9o-wAa}{BnF@x0kAfbFf zAWe%|gwxu;qjC-{UsfPC^#~#h@J$v4MZVr1SnK&9I)N$cFH*7*avfgdQbq zVQWDoPOfbaq#3mz9h~O@aSgfx`R!Igk{Hmfc(tw)UW-zTe?OV^57M$qpl=xrrO4ZL z2cd6vAK;8tWhHDPolwlb{3O|jJo`2; z5#Yng<_`0xv>D3c$d*(gnw$L-1K-x+H_ez}$iU}gztlnhIz>k_dKYi*A>4cv_qZrx z2E#up_1GCLNO*)an^|P_x3k;MPSvq`4Q`w>qMsq6T0kd)uH5%X77P|?2j7Y-ip+T) zZ4LSKlC$wj(s4TlfXZj!e zqeNPc#Y3Q!R&gOhkQ7Tf43$ss z`!@$ENkpQDT~aRoFyG@7Os+N=ZK1en0ov_O7e9;uD8CO06K&ml|tXp)SYaUK=KYv!j&?qRyppZv}LM<*yX*PCS zazQN3{8O*I7BbRym1lV~_(GkfidgjOI0O{h8qv+BpBaUL8>O+H6ND`<q5rRFW( zCildkLB-ag!l(rR#R8m>Uhxsm_`b z)CzNH-kiiE*0KF!tpfIyxv#_y=9W9x^rno6I}g7@c7^AMP$}vtI_yWabtUG>o(<@@ zAhSSC=6Ec}vaaP1TY$=E8{lKQO%wk@dKe7m0VJTaHJz|U+7UnQj11?)*Up6U=HE^V z^UBIDNHMXt+*nSlBlPGPW@66ME@qq;v~xw&TaK@Ar8~2R|33^jVUO2*9n*J(9vRoa ztp4YrM`m4Tba5Ab@IMl4K?VKN#pWZ-800>_&|}<>UrkaVHGTUi@IW&cMb?!pZ~3WJ z?1z%>dGva#Zh59BnkPRMc+ax4NKsHsg1P(1jOu#5hqPn1ITTOrWJwl3Vad>cl#dCt zl=`$Pks=_0tW>2MBGiY1v`{jnRh$KZUp`WNu6a_`RpGV3N5JT3*hR}d6MNlAoKiu% za$N8^&Z$e4mS#<9R12?hx2c`Q3!MH2fu&QOj08vRtFWrR)+B2^M&$&2^;C_RWCAO| zl5r+%WNAQ=fX+Wg^&BbEt|@iWY8bmmhmoqSv#9BhuWmZ-F|f!}-eo*zy{{=h)nTd2 z5uK#6{CO~7{dv#R{m>ttep={LrYBp6lSOmPXWr!gqkP7~$Fn$IsUtEf>|i89ofGM2 z-cKW11o~fN2PlxB)z3eIeR}t{@syRee;v*!GdLWAgo4)n&LVG|MNGcc2fLPrsAXZ; zA(#W==qg!?L2|`{eM=ng6ff%&6`L2P2ZHy=n!9H66|V!9-YC8fqQ#aD0x|_#ekVtZ z>`@z6_68~-F3gC{?}^=R?Krx{gl0(bT(~86L?FHLB!nhqMGFS`du$g#PO13X>H`~# z8yM5oWf@7Az4=`8veyQ9@%E;RiGB1l`x=PVyS_Rs2S4`W|6Ul-n(Q+G3|ALTE8vuE z>%WdN9jn(4mP?nGN1$}z&QZ#DKO7VoR69rVsiVU1_esDUQ2Jn$M@87loY)o?`Zt~R z^BB){sq{;Zr)P*5uyao8^t}cG=fGSKCNC51Fq3z#htId$%d;l@n@ z|5L@AKJ3JMhFcXEkFkoOG5&KAEq#dvbCHN~x85iSUVC<|&=eL!YHMTu8|aW6%@PC6i&pYqaR5p#um zmb!IuE`#510V7MOp1ivZ4Jv5GypLbG%)_B~mC5`a-&!tGA)5sQt!^+_!0HK$&FjpR z9K3WIwS{B!2KpQD`%Z44#hc-F9RC`~OI$Kp>$)+X;IDHsBd^ohY zoPk-SpcwYK?P+{UBKCdBV2=m^8M^n6|ndL)4trt zgNfAk^BqW?29KkPXUR&mP|`w6`IW--94W64qyVWd=n+!;g_je?9^E4Gdy!{f>`)Z` z#SoWbkB%EubW$ZN&QSUbgPAj{33LCq@tLo@f1krkFmp_wNq-y&DR_**cSH;-2%qkV zKFb0y(l&O%M`};NxS`GLtfhc`EoG3?^%)f%uajZ{U37q6^Og(2OtTdza2*m*F)5CP zEN?tq7u8}8XD7e@zap1LMQ#f5X2B(R*2plvfdzmLv*n)oRzGB)r100^8<$APw4 znKb7`%0LAURfBw)5G~I?3KO;t_OgO~|5fl0Ur`-oEuO^S385^v%`oFQeq&>yuy3H! zG7l)doQ3IAxo+@p*<};6~C|>A=l6%DtZS0NlTpnI+aicm4u4;A$R|)xf%5xYf+Oq*y=_Kqm zR1o^KmrIy{Fh;s-SA2Be0!!%$SpD4`QYm(u|CZo)M^iQEeeF zQwORQ{m>1A%V*+J0K-dn;MkH%_IVWZdm3(c1!?=#zT@VkenN+|Bkk@l2dL=kB`SwPz? zDSXkoz4+Y#(+~DeudU&^DCJmMIYdeDwg?qf@M^V^`-IPKI`^ATb&9gQ%#(c~5ZCWK zrKJD`_QT3PO0*h7Iy{bUK%lI~WfMEYtek`QN9O8P(G~#PW-pAR8trHci!LK@U@TDV zqZs5Ds&Gy}#bFp}ghfFT1pHDa@lF9PRKE%S7r1}9`wYN_HO|RislQ<5{qQ81;+CCM zoU-F8=?dB%$zd*HoY1!{;_}NbkKlsYS_Z9;~!9h%%sX7+=JH>he^BtW2B@=NEald1yt%qmxp21edQSJJrm1LPtn4xN*v&mKX!MYP(bdSn?$JOBvH6yTb=pAei5?!6J=k*|>oIEd z>yLGfLq-?ep9J0hN>78baUtZjV>8_ITbrN%GKP zAa{NIf-LsgRrGi%`?qwm+On*YPY+0*Fi-$$!z>jMfNb*{5d8zaiku)r)FQ?p0}KJ}bOt^dF=gn;RUs!T4ho)>kMqiXV_ z5L&pJTzk*3j})SINJH!UUq{D#2eAh>L~kicv)_C4bY61)vC}g~vlo}Do32I7SnALk z8hMpjlKd1)Jm5nS>g110lg@Es?NQ|=X4Nms`?Q!Sv4!?m`X<+7peI{4eSyDAmnFdv3fH zmU--UEFg;3j)mNk;oA*L65ncRJ#wxBtVA$+v43!``4GY|5rhW}r#+_(%-kL3Bf)xA z;2_Pg~dtCmy$gEh88WklszKnOax<>oe|3Ve%r)fV?N?(fa(qLla3;cU1;0c>FLcnAA4CwohKF(i-Ot*d|v z={CRR!&MX8@ZBM=Ij_YodsoJDM5C4?@ZOYUWzBPw&w!+DRN&=^eC}Y^;hb_;dpz<3 z!Q77f#I7%?*wLV5x*!2U`KB9}pIhT9xtW0zh-JLeir*el$g0~bSI!*Y+kZTM%R{67 zN6ZLRWaT*J&l@4anYCa0+kde9I6DHi^75u!>=?ec=o4_x0OeQ(yt0}Ci<1uO4S#z` zl<{^#hh}*-29oXzY_LRxx_b<&(9J7+DZ5uWh|)K%GZ_2T{?0OgyEH6`=kJ02U{m%% z9;a#kz~s$R4Ld@uFr~Cod|MKf@I3hwU4HxiT^|LPv5t1tKpjOOlK6R1l1oACI^M0# zta}7LSTa(p=nrwrj%&f2_?1-ur4{uA_Vig=G<{<8H&3eq6L2Q^Dxbuh<25P)GN3E? zW>Gu$$uRscO}DrbQO>>;1f50Xdxw$g+M{ri?(696$jO}yf^f2>*VG0-39{d_%y{`+*@L|&6DFfo zT58~7_`>kk-WL(1>LI*Wj4Hw%NYhR>~9y>@0)!)E{ACSE2-Mr8ZU z?Vjx&oQ1PGWj=6F!BzR&(C{!#A66x8abz^8t^fs2dJSKay^Vb;uYUAdSYQQt2G*s) zy)g;V#JF|V`pwcBABB^c;4cd;7hG*R??3Qji@XEL_NEub&V@G@dU)>hjhJgK1ok=# zl+&4dBy%iCt$Mh%^GoVNWyrg(xR%A%;_GmFYbVEMEoI&T4zU;vo8?POLzEy4o793V zx3o=cV4L*(o>1a#%}p1L%b8DfD4U!avETVVBAL@pUM2hFEN{z2VQZ2B$*wWFB_@U! zRe@@0vX~2Pb<~3+=0w9O9?XzhjmR=tpua02K}J?|VofN9ah=t^v9W(DIfUxHMCSLS zYS@o$TQU3Px$b~{Fd;LSPOFAfUq;YqJ()^>3kG>cOudPP;tIZ(bgfv<$i_W_v z=!(hRskr99Z60DXYVe9tyJ<)sSdM~ig2L0PpB>02_XNHNm)-L%@&1hX$&C1AbUV6orC=vJGgJ^6669cxKNKEADMKN?51#QD zqee$c`4(%99FS$ZTU@7VxMnG!n>f@;Y#$2Zmqp}PKv2do4-sFnZi<=Y%gI&FBv?}= zhbq0HA(it8*(aj4ZYS}RZ68n;MDdj8qm=LeFjwitD5U6dK?CkVh?ywVKd+`ag;GtR z^9P+f4C3;ztZ(;0S%Px3M=YpEbqR4Z7$Qd;CkH&()r`lj;7kPwViQSdq$GvmddUis z!u5jn(WX7xI}CO=XpJ>rOiViPSTh)NHO?KEKYFMPaXQ4ATo5W8-gg$H_6KB zkAAGG)}8>cFm7s*^C#y**s$EyaGghzp-!F0i=g;N^KrSqBMIYk!a)T$+3r}CjkzS( z5cU46(`^(L;w?yCkxi$*`j+f2b}bmWn86v*K{Zfl^COnn{AXbWBy3>e0I8U_8*&m= zvh20%F>N%T!u}e*BJz#WF)h=)OT`G&#k<->WmAuIV%5MsE=cKY=yK38UVOQb8KBuj zc1A_0b32hV_)-*%H)YALHidF2#8XmYWq;JP<;-fG9QzkvoV{UCyalK8JE|OF{SGXAdK>iAUI)eTNj&O8AZM zih-ovD2J>Y7@PgA%>XB(_-R5{_E}U?%LYVTDhy<37ktn!X2B`&|KjewgPLBues2p3 zZUw{!(t@C}w}prZN=YIruoWeCdLp1?OO+0(Dk>l)B3qCe6a|qIibzdR=~6;X=qN2f z0->ZpAmRMj_kBNe&U4OrZ}vOyJoBD2lNtF3hhKizwXU_k>$^TzslONR5;9#fASc}b zY0K&(EX5Icf>j~8a_8xF?(yI+s9!cdsgL{v^4lvZ=RG?%jp>eFqO-=giNo1XL^+;= za3rNl7P?jDAyDRanv*$3C(k0AAVmi?Q8<7kZK= zt7o!T5d=X8k4V}}u2iN5Iv6N{C=1t#sx25*jNnB8l0<$_5M)c*;>vF51#Ls>6rK(c zqo#kM-YomQDvM#F)J;H^M~OE?X5wp-V8^P++T zU{pJ`>Gu~(@tF1_(K-Ir4X(fA)Td>?A?C);gds*-d**bPskLl)PMbaa6piH4|0zU> zHxNfTY!=1(WPbj<-7Vv~Jzp9wiaOaN>tU)2 z^VmuY?~**N&Z2le-!cQbGIQaZ$qvF&^YQf3EE@mV{aMtZp+kQE^0#_vzf4YS`fRP5@JVEdJtzU)P*m@E60!8{WP{<@MPg|F%+e-|jAjp!r+jr|I98f5$*P zt3`&JxOO8tAzy%i2eYrjJWja)9nm}PdGB#}(>UY1bvEQT>KXB3bD$;apx&F^Oy5!r zIOt#^#flg3GaUJzfsDX>IQ}2L(zvDi;uwkrQ`lE73A(SvAXr# z*xDGEoKtzB+qf63RTp3Hb9m#ojIBFA?v)bEQSS3k8|xnx^=2eYh5F^*E-bWuCypMQ ze|{P~fL-y|?HM(z2lIM0%MDx%hZtF>%U_eTdGg_@B+Uu=o$DK6Q=9crf2d%b*xg~R z&Vomd@kZG^srv+n2Q#qiBE3dd^NCkmAJy#yRKFo4m0;btn_E)9c*|~t+MOI003PTw z9K7Z+=ZJZk1UrY%47po{nHj~}eMoib$`bSL!U&NjB;b#B%(^9Zn&ZjCM}JscENU{A zH}{Ns@3DGRA2$|C;jCJ%Ai`H03O3JSWdXLr`#1-7 z6?y0M^@&DL9_6@)0Qhp#&xO%v;H6lbwrNKja|pYoCU2T4x{{-nX(1|L3HA@u^2mF( z+vz{~FOPN)Uj!pWU3=gO4gx@C7Cyh{6ALdc6l?;v&HrcqOF+Qr*LZj#?476N_lpdY z;p4H9*zq$LmwjGJ4&5iT8o8zn@j@hI1w;%rbG1R^0fv~wvF5z2`ixVr(jG%siD$xD zqWr<5^(LG@J@KqWOGDwIBf zC@qH{+=;k;mu!4G)trsi!);JF!@uxfYpPs3#H2SK-2QRwplwUXr1)*p|rN$PU zOBi{4`p%wv>;Da|-ZY6VG1qM=X70CSp9E>geI?&5sz7II7K;HJus;HRJMdGT>m>D_e?Q zx)8b20~phrdXxF$`R{QZ$wtPjl%>$+r{C78mG9UD0uHQ01>AS`Ek9y*ndrU8{T@wh z@JnodQmik?nDNX3ADl755rRi|)6vKxLc@*O@V0V-NOiUPNk%0HD13&pU01QkC2-Xz zQ?!Q@qbv_j4k9Y8U740kV=v}MP9=}sL|#5v)_Ys*LWfl<`-OJT%T|q<;n=rD;n#Gi zr^F@YU9c8DlvF94nl4HTs7xS^1<;nQmT0@4B93f0Af4?DK6qk74gHrBbBJsesiLHs z@uTDfc6q-bU?%eIs`%VO*HG?lpM}XWw>Wc6>?BZzLa#%ZGe7PNgq(ct@U(Z+%K^md ze8SPktHj$8z%)nOnnlI&?t1KUYpbdF?1nk->pzP{m&>EypOR?NJnroNUFrv}l0+^| zq;e`?oR>VPYm4C~!*Mpqe+G9`90hBlEwG012POo>5{ByO%=aoB1z33}K(YJ2kVB}g zHhdnV88WTB9O0+sktxZ%U+17Mg#TgXVdNqjxwKTR3pe@*1txoX+82OZhsdU)u1ljk z7d{?}B~&gLs6utOA@5h}bEycaMPPKZn#Wxp){)JPL7s{Gi{oK8o0 zs*qDNiv-})i50@aOlu4Ny)x>T;hI;BQndfeN*lKsTP=b)X?Oy0#;Yezc&FCo6sgdp z^8ldaz?p^~ALY49!Xif*Zi_ zAB8HU61-hbU&@m>z=P8-Ajy8j9g$sjb^Vg((!Dw7o*i-yUoYCtseyD?xsOc`Z6{Yt z=Sc1+e>GP>Umpl{@%D#`-6|XlLqgnq{Oy7#ETAe zxs_i{X$htAHr&F?SDP+=d^e8uG?U=@a-}Pin0!~B{H)NVy)ZnQvHe!0zc??mQgP+B zPH$t+bR)KVtZ6rQ-5Iy>kG*nd8bC0OCl(?%ulBr9y?5ZGs2eP? z>fmc!E6Xk}A372EN7i`X@O;}GNHtoZ)(bnq(GZ-;E!t!`JUn1{Ez0sUCV6?e;m&uRovKmYG+7Y9ct!4rJIsFY6;OvWN-+DwcIRxz|h+PCy=kL0__unE(kd_N#lh z%kp%@BmPx}^J4D+F>o0vR~Gl^0b5E8KWo%x(E^t!k(BUuQ36Tj{&nw?iOFH zQ=>j&@2bKhQ04QEJpj{~6_}IejLqsF?t~nGh?28x2}}x1#xlkFqy6eI;M2L$!+H~C zC#vZRLE4G3Y*jIMs)#z)n^oSKcANK6qHL%(=)S}3qKCJu3YF(TJC`!QRwmMfDf%GOCX}Y zn6|EBZ!O3P0&Dj{wbgrCqFg^M^iUioFGMWNpqQv3SG7`soi@fDWiDgkLu*D^YRIM4 z&MyBD@g|_OpCnHV?Wmb49mqGV&xAuiqs*I0fE`J(zBLxz<@N=; zJT_TQq9Tud$$CXYkP!WDJ;@Co!2bhIT>y7D$lm4K$Fb}p->c3EH3R|!UvpAyg-hQ1 zILm%<$QI1%EAMF1T4gF8R1b(?kTK@ z`x`ux67^cx8Z)5Ew6*gI*k?=RKG;=N%xJB$24*4s5K~=RGd*vAxQ1?L%U@&MF>Gtv zS3kV*3%raSR5ms(zfXhMy|l?HSt$8u;Jad||8?ml=V(T@+gO2od8aFYvsnmZsV*x| zEn5kN46}$^grbjaDvK=8RxEoshfLN5MjXzrx0DAYyC)mGB`JFve6C-)5{M~)N^d)L zQmR6F)7r4zQ9dD;msRv2y1Gw#W0V;;_P;lzRc@)7@fW+)VCbmQD6u1VV0!F>`%nEb zj;Olcd~vFB;eE4H-SSiwyz^$&+rj`QMV{ani~b#(9c*bik9XT}FL%v}1svn))}MJ#xdQ4;d`@$zLyhC{1H&n!XmqG z7tA(`lUjFe*kHsqdG3XOy9IIg-txMP1&ojSSBRmse04!w+aR(%(Oy zQ(uVQke_9J*)QwR?c=5Xc>T4Fv}4jPf|8{1V?LOYFp05P3^Q)cdIP&3<*z4d%p}?A z0-g+}%Y0kctm)ziFbD!$sR85jJJ)ly5zz1aOT*c)o=`}+&22r=$oVeEAs^N)g4oR*!u9^xWo>6p@TYW4&$w#V(2;HwE+P6?zM^Bv zGwqU%n>!JpxUu5)>5G14$3XVfgyhNpD%Y3VtjvK2yY9%s)M3M!D(|11QD@=}N%W;9 zE%iK{q-dFimlB?_@r+!>5~|(f+1LQapV$MeFuueIWZ@s>!NCA|SDovwpzrhCn>^ z!>Hz?25=z^FzIwbE3q`J*Ufv%4COQKSvzi(e%^q|AR_RhY2Js*-V0c$7kF1B^2qYp zt>*l%yp8I%YJNd;E_dafwnW%xcOmb8cqK7NWwL5+R;go1%c?)y*h`5Q2|k@jEH10E zPuPv2dVl9cVPh9kj^YJ#W-SW`CYalVTh^b;a||~9ez1Lk&(vp48WILWg{Ka7)T2Nf z$$+JtM3{#YD4oCzD9@(E?1J8D)lOATr~+-UPwoFUca?$!G(alp-StnngEww=K$JhE z%btv~w&37el3*SZd`lMpQi?qWm$=b*6^5TD4k4KW#ylYInmACfC6^vI-ldUdD#Cq? zeicDwEte9DTCT+wyi@J^lT^Kz7#e(|1fhUz8Lj;D@=%uHhJ4l2oMk`>B~$^**+ zuP6CHCfOJQr1M_Zvw`*yGM*=&IB~Hvx3XVo*%!oM%-NKej_OLd<77 zwc|s^i>Z=NUpH09clT_1GV`+KAgtW{RtR$_@OFEXn+6XPH`Y%M)6mvF4 zsgZ#ecI4FSfMW8S9@A_-p&fafKPWNb`DUyVaktH@2*p$T+`+}!#5019VW^x zp)N>ti}2&r_X_c{vGi-jXAVFzx+LndDKR~$lV1lJzOtKt zsj%Eae8zTJHKrx^aCDW&E1IThvk=Ui%CIa4wsY~w`I>`njw}tT4={LSvjSL)<_qO` z*^V`xRsUOSk(>Ru7I?u}z+wN<(?32QNEu27O{|PgW=zE zX@kKQ-Mn2lXzvlU$rXpMhy682dOk+yepc`YIzUXonRsCRitXCB0g~PHd-mvoL%3ab z8J@%=!Ydf=k4Zux`bNveY>IuYeq)~nH?V(%UYF7L8z1*=!Pyg2S?3D-G$_Y~4kLn; zogc$Lb&u@BTtXy;k0GawKL+$*U>4WiBq~dCs|NJ}R!fmUEGMX$yJZH){VwKDHEIrj zFJ!_w$4Gf2x63WPmZ}*91`GNBGb7R3!3y8=C|Rvs+S>*s7ief7*=$`Q^@( za^huKMiJ%7&|@QSII#;}z{EWjkQ$1+w#P|rwfh4*fsd*?=J6D=Xd%cwa9Z7NNAwNq z8FOW&H}Wwwghjqv&2gSEUpRiS`RL(m8Y#Dv-z8vV#5ZNbXZ<|rE^{o6!$_d^V%@SY zEuUGr+s1zX_>Nw-!zLvu`|RyqEHT@$CTs5(peWq@B!?K!pba0TD^KY+7QSq0{!XnE z4CiOr+6f#{S(S^zLbJ~y+Xy1o@sv*;ELZqqV&ouhk+<4w19Use0k7Z5btl(qvq8pc zn`ZKt)w>68^#Jtb97AC!hEen&>`9bi4cPROSp~;S?Jigqz8}=U%*3Gl_-Nxwf$aga zWd8gVh}Kvs_(SXS;&t9}{e8<+#!x??xVL=%hr>s94qH>|3FQa&j(=cyL*RP?rLSeY zv45^WZ+&O}o};!fEq{?SU-KPzc~iQW=WAiP`95O0WvS<45qrM*$ChIO0Pe~VAjQ=O zm9m>FJ4Yg)-5grpL!*E6ELUu{*`YKC3^-T=8ve8Oqf7oNffz>qqjw`OYPJb9!KUvm z4n-dH7w=PQkz2Fmc>bSk$@ypcxN$8{T<{w}=I$l96iW@h^i3ZD^>A?P@|(ousJKs! z;Z@mDl-JyQWxs&F2Gh;#?2eFL2ez~Qy}Tc!b@gD5FUVExBiT&j_(OJM;Fxchqcj8FFoBVPLYPz;p2S z8jY65tV$n|#vmqo^m&#kU)bI3xi$}^KLO~7J)NHbMUQm+vA7Okp8O4E4>%D6>*UsK z=jFLeg+*fAaiil}+Ji+4C++VEv<(0!Ox49i@OYN_>L38{JR<=qS*LyDAFnn*=@BrL!eGV1kSvDlPc6B|5)-2%7AL(8zXiq1 z$eGVZ0&?kdBCBY(^1Y(5=bDo%TnK!%g~tg06HZ=Dfm;@?%-qa2QjhAaG%^(59vW}G z(U0Rezbs^0#t=yNXhXcc{8O289R;eU99_k9bAyGx&0kY;8t3I>5SP_%b|B#SljabY zyp1Vr9?vhAfJfdfMSJ3~ks*J}C4J3u<8?wx+!+9zIC|a=n z$=@h~jDIXVT-&LfoMkb&NWIk_Bna)VJ=DI2f1`RKu{Avl`7yXSV%FWG;6$-k5*BC{ zrDwr=vqp|N7l&)O#U^-t9P4S`vwuisKF)S}V34xVb5S37^9`oYr?EDqxf=^{m%z^) zCZq?gMOv3pWKVy2$3k?QKQ3Ojl<1IMX@gLBEBR9+d5l5QGUL#%gSr#QRDS?*#u8|!#h@$TyZFXxcBD7`Xewv-ILkb4IKvNMFHH}(~xSFm-cnw z!L3{^^CoY}D3L0JmLz+l9-oP71lf^ALlSt|2PyGMW2MOavEG`lqqun0 z{-T5_tb2~<>KIboHMGjA6rbx~cfaB<7)(W#lpEk_b+hjXXdRKoA+e7^HIUxpD^8=! z*JVLkFTrp1#RbZSa%Kf_an07N6nyDl_%bMP0} z(0RH@USWgzV!{%Ypba0~i_P?ner8Dy*UQ5($~P!^$prE?UHA`xnS2#|vFjH*@!;=R zm&45m;s#3<*)EJ23$(%DcDq&Qk7oHug!b^_!sPjc_u`**nx-v-NN8Kk5M=@=L5J3O z38((v&Q*Q{5NC#vmOKeu#ajq;SLH;+|B4YNQ~2*0VS!NpGJuq6!23yLNy}@mjGY#o zw4cj__7%SSN_vHj>%3Q%+Iu{%RI<9}cYpNfWh1B_9w(*pVg90M8UqV5T%4bBlEjLh z``i|Y?N+>1bdy-*C?B5>#^lNp$2fH8VyHj}jNmO>zYHASCWP4ndFaT230b4{cN5km zOAC!W04@e+m_Ur->Ljnk+erttPAZAp{=G-y@=9hu8<=KW}W7>iXr$^5WpB z<;2vaSNQ20SNy6CEVFugj$L1^_YSH7?(>4;%M;w@HAVp&WQ@H^Q8I_sl?Y(q>B4Z6 z)-{KE=-&!f_GUlMwGs#e3rPCB1Vrm3elMd0?2mfv`mWBppy4>e4gNAb^8aK4)<3nW z0L8TvDA=#zFBa83x$!f-fmhb+Y^e0f9gE*$h9=!uMOSC+%ebv=PMP8r#_*TLOPyEC z%cj>zUl9E{ja~e*t*0Kmq?t^_Dxj+QGVKPcn;vZX^P%*Ux(&aY$`HU-q5?wz%G7m~ z-ecDy%(^vroeaJ(=hkdH-7?nGRdm`G2h8G85Te9r4iJ_xfO%c{u~@6#g$O0XsHXRHXH-<7psa#lPkoTq~ZlUjMk z`fdV4@nAXBxx4C!nKx*<_vpH{h3LyK{6zDf*0F0b)j#{=JRlUjRgt||XEJrQO-Ew!hm%Wl}LxwE^bWK{Hi(+Bj% zW3lc;PIm6CAqs$oST@kKZ-NqSc>S#Dp`$beAwN0MJw8{DI>mFmZK?d*GsNonM}Ax! zO+_4-!)XDc@VajA{13z%ZR47D?#Z|{WXl?2d^=?NWyI7g!tM6|BOwXbT502WvD6p( z7a$2!K^-2s#`+f^Db1gWMiIkv2myDwvQ(P+S zA`xE~8BUAFUV$?VgC2`9YdO@@zZI5z9)5Y6x|-=Jz*pyT86fz=V?)_ZdK#uqyNFqy5@>m5@ zceCWbSOCji*#C?tvX9!Z`Knva2A~uCUrs0bSCmqIWCk4`jP!~*V`ez0jrY%#Tn!~x z>)SXEtJKuoDgbamEkMQoA21;0f53o-ud%*b47*J(O?0JMrion+d57wE?rJ0#znA%G zURj)VO$GWE;rG3xvb4s?`iOY6`na)l@cuwTbaxM1P-SMynFB6#PPh_D88kqAz3Iw9 zdVHq95);NwF;3be@5~K?NUy{K_i zxH|aN)@yaCE%p(Sogtu|2fv_=Em+fzU3;0sd@Wmueob4A)$;b2_PO%uV#>vNz})Ho z(!N5mW#2`bmMH>!Q}-{*j?1iV^B-VTF?hitP6yt4-f7(y4&b#eCaJCE6U(gcm3G@b zC&Kt^^8X>xl`Ms2T+>OFq;z}SuDVO|aQ2FL=fl>lA{G`C*^UR@>_Nab8zv>}@{KBzo?Dub+dB%lve)!S9eMav z%}hVr0KxjOf9Oc@8NU&&rT>W`^EIP@abBfV7@j3tSt7J7HsY^fmvN0nmVmC3Gj+=> zmpY9h=+kyxL7Z2-bUfJ4p^9-nLg&7God+r{X2rWp!?Dcw2fOHz23U=y=}az+GE+`W z7@od>^Y{Cnk8+J&_6e|h!$5Z(sVvvuT}}-REH6|Bmb;3c?nglpFy#OLstf`YC^8FB zpp2ZhlN6%eQFXwoVV9U1$n8eOlagDgjI-XHQb&GoORRFzcuFEI*Hqm!a)8FnewN~^ zjbR(8UMEO;jfz_wr3~9D_dg%-DR&BZaf5_)1Dx(KK*B%u;>~g1$DW5v{6+wAf~&N8 zXbDVHKq)0X1%@#LEzE4hStc^QO0}L{uEi)-G=~iH%w{-#6S2_aL0xyu!Q>K=>~_BR z=vXg_vPeEA!kljnM*W>794L_MmJ$l+?sD9cy84Cps&*3=rX#0DG$GPNSAZ617*4jZ zLj^VZNx|~N$vA9L z15)(lICN1s=JT(Mio=_hO*(bEElw3~DG1y!8>59u@d#ReT2rs#Pu*}kL%i{j>SPWv z`Q~}5^{DPq+fsIo7OyvpI*lDJtAmCJp|MmkPtK_end9OsDHeuo1eFJ}Sgy@~W7g!K zI@IRB8r7`aRi7N7xD7ve#$@fPRdQ(fLBJ`Ttj64}0l%#7U%X&>bg&Q#fW`mCP1$D) z)1Keu_n+I;S>zV{={0c5PHmpN`S*JneOdP`|1&p5^NV16!?fd4V`Fh0U>9Oj6eu5N zx(1#%-WGW$^SY<8ZtwI}JG!zfi61#8IT<)cVkQJh;nv5wla42z0i1)$00C^z-)KGr ze<>%fov~lbCTa93L*RDOl9t8WD5G~k`95-?W@c`3W%1I%z`KF^(<>OG4N6DDt#h*n#Bm{5T&8JA9s{4vw}BrY(im@lguQRT4#KW8umX7PqpPz42w9=79AENok-gj z_KOB>ht!7?YN2YI3PMjj4pxU6M7_Ks`PJC?L0HYzf4y){P2%5w zen_dcLWA)b`?#$Xhz&Z1e>8qtw;lD#;R>v4@R&GzuBPs_O;mpOoTjY*NcOdlZR3N= zv{uOI<{59QPWw* zv!Ultz8!sqSCdKS2H%hjop>@jHm4ba#wt8^sEzySdH;pE9D-D|xML%c&cDhr(Lorpy9HU9fV?f!O&~5BcM|jBx-s}LN6yRYH&}s<)hp$AFneQ z*Oe^VFJ-VYz51~jPg*V`F@&RD%@G8cEC!IpcCh!;Pv_oD+ZjwQx>k@5Rw;kvL9LEy#6FCGGnXCdbhuVH>ZnFl8$Si|cUL*AKWp;g5eVbV z@0O!Wp=rjOflC;w6kI1zc>W+UkjrjpV+rgQ9n7LK^GgSf2^UqpVDt5H|NfbQ@5QP^ zVqA&K>^xM=_@Of~32wK2M+|Mvx-fC?En_ADC(q{_Tf^(xvMSy`6E)gcxV(-DtU-9u zf>n^dDP{!U&O81;Sh$Hd*N2pg>{^M3L35!@hbuZa3O>ZKXuf`bFG0tQuayh>TQ-5FI zvc40!`wxZ6~b`E<>6hL8Q!MGu-u67wty=i1%a6{4Ii zw_;CxZcTmguxsbShDX8MoX)6-;Seqesu`TDw6d64Ug8>Aiu_xFl^;azolF@YcA zAKUH>I-?LW{zb|F{53-5T1GPD+vNqN2jkz&V9xH{nH?fKTjXN(fsRrxsjvmN7phm? zQv^POp5iKI%W*ru)g=@qvF)AWwisYBI;zR~b}>pIE&x)BKuh8jxm(nCZ91^?-+x?_ zzuXK?G3)Q}d>4}03cs6LTs%=eI+v!INr`p3p`voqJwr2$ERA2O4^Iu?*g&8ZY9vPV zX#{>{O074!8E*8L#EUN~_XmDR8T=?{hbxKc99Nbt4Lh!hcRtYI5(NiNdOjwCT1B0)>_HQ_Z0^2#9Ei2iKb&`Pyh zO0=$5cVN183!^u&7;T%&CV&CF@#)~R%B8@t9;n+QcuqQ`%kvlrW?ePN@}h- zI9gSma&`F)&J%Q_(%W`6eujS~tVk|O_FTjq-(c>1NFH6XoEO<9pNKC?GP+IjQBRQv zJyqu4Z%BJxSl0^UVHX{IIM&TilMNRC=pd9)i|XHVi^}db@3GBny)&MtY}$Qx))7%} z(}B@Shm}f1ko4%AjG0d3nRQ>%!Avy}W?11lhW4Dgygd9ylZ+qS4lw|tGmfj*ckl6l zkX{S&a(1_O-cpWon#SebSnXD<2o^s+HDSDK+d2ZY)T5#+sk#%zT~~stA)*UgDHopT zQf>&t_1?Qz1i;X76TA%geb_D~P8kZGk|L|r&dS%6b&Ny|LBV`PmCu_(4eL-~Z!biLWFkOgAWO?O~uW(e0VZ@sw}g(gFaCaSW{8|7sBzTPow4cbPJ zz{@cZh#_y=o1t|KAzO~0+hE+$-#=57X4X`5*(hkEyW81VSp%g{c`8a$z;4qcZPhPS7Jf=12%{d)!8efIrL({h5iE)&m8V`Mb`aMhr? z$mGfX^35s`vjh(RdXXP;WKR1uzIqDoGl16=?_iAtzm6%I8&#tVyLY+{qqG*hwmzZo z+N_5Ze0B}dzV{|&ht(8^2eswb%7TU!eka2+;(s0uvpgbF%WataioyFnp7d||nWB95 z8ndQn`)<%Qy_#+@#*o#5&W+%BhY0_vxsVNCpLq_YnRVvZ((J~o z23Z&cD-Vc?k^7ZjVpP%&Xt4Mb zuv=gLt=+mHEnHwF^toV*w&HBiVSM`m;K2r-y`vxsm>)yJAt_=jdVFB>l7^m<@~X)|;^(t!I5z8{WsxfTOKw>aSD zxx#EzEdE1$%uThRGk0JgmMT8TkA7J^x$NNuzPRJF78|0eP5m`HOoznFak?C0Gqan( z?c@YWM1kgHXb-_vXHe{vr`E=vI37I@Ka{0GWqgMEb&-BCD|5N zRMcM4ov?4WN-zE$^eW|Dv%6Bud&MotCwL8UQ}u)=Id1lkScqmbU$3H(Zr!;e)|e0Vwt z2??2d$VBxt|pi0ihFX$!r670RTk?cA#K+gP5li9jBS}ILrX8XB=>qwQ=B%&nNHmog+dYX~< zsD(EPY41;ut4}Z{%c+QJp?Q;a+0u}9)bQl3w>lOoylF4T^E3pKF>037T%}6Nt&=sb zQ_Fzd8hNcB(;Uc29kB8Vpa|%-5ehoRiObJr+8ClF|7YYq$jn8@2MTo6e#jE#ge#YR zi}tit8`~x<>rA`6ocak`8tAaoMXh_MpxTzCtKI3}>HVl>!8&gL5Z;s(6IWZ&E}$It z=a}P%djy4ORT>H>`an1rd3|cEt>Pq{bU?k-0Tqh+hwy)lc1Xl?s zcJfAzJ7dnaW4mryj>xa?v3FWkN%R^5N09E)4zw@?i>Nq9_;XN0 zCs>@;EU<~vLq~VJo$9MR^=$uF*=wFj2K-LWQl#!PAs;nY40}F6J>fdf_34u@awZ;S zG(ct(TZrUf;b4d2gb`_}OD^NiLQ@BiXU)I-?bUPnx!KW$x2ms8$&?KSPbfbcGWKlI-8pz=h6`xSa9CyKe{GZj_vjB55u7T;ZT zO>*uSJr1OY4V~nLnSBUL#^m#LCcyQmR{6;F1!y3@nAVvnX50#rqyX2fE=P0adpay{ z)}@FKK`uFCt#mqmpazz+YKP5_K`sxCwIIB%sJc3w_mttz$5>4`d1IKrPkt|(}O;7F5l`_CY*Q4LT}98d=WSIc+~$v{CzdM z9oJ|!1HQ_7zTKI@d0UUnh4SJtkYNMtaCX&>K-OekN<{}o)Oc$AjwfzDPoO+{#~ruA z%^CZ3u`jS#)rUMJkoZZQl@WGK0q5vDN3~rvcXH`cM2=N_X-!gVTW$xXd?+FP&WBxaN%zd zSpz;D#aHd#Ni(4$Dw)bEaSJu)!J5v!mM10}P!=-jS0Dz2-EYoM$!k7?oKwbJQ0uPW zDB-isp?3&&N+kP8doMK8$zuLT`lHG(>Zaoe%M z!8RLeumx$XA0rF$`I&VkS+_@{Th7^+dX{d6l1XF>PhwEc)j)Q$px}g?o{CH}CYb6@ zfWI3~nBkY!SsNsL!3K*f%0~H$3>q@_nLfm3If1)>`r=!La|fl5=k$5b0(pJNCd$=! zbaFU_`r916uC8M7k1BXuOUfC3H-^@ArsW*b*PvEN&m(;Vm2xx3?z%&qtAom@dfqSk zDq6bZj_1%6&cf3~ zUULQ*(^8Wn96gyE8zX;?;G4qep8;e5a3QMDBGYtoDVwuDKl!SY5Adj$gYhy})Mx9c z41l+K7|?FS&&!z7x)a(46ZejA_uhBwKz-`*0MS!4y}HqyT_CgLb^UCfF+(tVHJb>A z(k;ngJs1K^tvH9hxLKeV-!3$UX-#l9eGk? zJpD7Tyje{45<6~K8a=D(RR7buYozgP-p}*L9wStQd&73#e)*1hr+H(k9WpCTX2Vkr z3GU*9hDq~n_1I0d^7euNIO3TfMurs^# zyhgSyq=*NJDA~Kq=^C3M!_;CZbp|6!*-pB*ZJVWeeT~Cw$R9KsFhp+nrS$b#7yVjppxUhZkKoJ9 zgR12l@)C!N!0MQh9C%Wxt9~vdW^Pe2ob111ofuB>_s!OaHDjMB_jXx>l)hP0Zjj+g zbJc;GfJWu4>V@2+zMfM4zypb$KoSYd$wdcAD{}Q>Cv|!ko!w=-bVaqcE?lvTd!2&w z$n^aJ&Dxd4?hBfy&zI}xkdqbW)fN?DN5(6yLgF28xcd8*o#Om}LMo(hGLSv4iKNv~ z`x;8EDg;UVL-@l7+AeKT3za;q8F&8S#$SD99{r?+cNxD3hfsSXbToxp9lV}p$)`fm z(^_Yovv-h(Tc;!K@-bJ5L{}j327*z(K&GN^KsXRr1f;VM_VJqNr(1k_e!z0Efz=`t z;Qgx0tuMvUwYU>)*6-tlj^QfDPa5`;a>lv|?~oU1(T|8YvlaHOw@%Gph!lL0GA5;o zd*VKKB<)9t70KGLkeN?(k>-X%Z0WsLiNqrPY`E4_g(p5Qwjo*NS(lVk-m-9b|gux)~ z2$C+7wKQwonm_K=G+qNzIj;@IOmPiw3>kIH`Q+C=3xx8=eQIa)jmQ``q1Sl)(}PF% z%AQk|`92u_=6rUr%FfU)SmW_e#fYYgMK3RBuq)J&>l7)QR;e}>Huf~1O8EU#Vx2)# zD0-#gYs#aN+eBF}>ecZFwOUH7n9YV&IwzGnc<)tt)uSrh)^#4Sa_3SZ!+?;!^h}W} z9b{H6y5x*`l`YWaI;8M_>+0^fdl=?Oe5EUv((%X3ZE$eUrPk7&x@`$ILxSw-_+F<& z`zTBCkVNXJe~u^FECNbD+BF)1yP~?1!5YztdExf{oQ#aeLQi}Z`T*GCIGe4qxUJf3 z(;cTAS%1~(mKr(7^o5u>c~af?5md5GRL~hsCmY(J{6pRRPTsZo?(W1mWjb)Wr^LyF zU<*IP?*NI2;Ce(AsW)W{g=ejUMtH9sKz}P5w<>aNS!LL*5Zndy3$Bt1dpfI~@ad5! z;Z@3ED&@3o-$hmLUe80fVe`G^)oVH^YKYZQbttOvb)Qi9>OMQ;ZSmHi(DzV0{c9A7 z*X*i{p6(XnBJb&W9$SN~=zqQ{*3- zu~;c6!sZO*^n=jd?|8G5K`w^EHyWDaCaI;i7$9u;rQAbvRKEMYq}kPCPV=R7{O(ul z6ly+eVaqp62ov1Oj_X8BO1l^2tSBf+U=A2|ED)A@sK zhC7{9+$Ws(h0~H!H|g&TaehHdQoU+hX~gnC4S)|n@VW2wISQO>z+*?}*43t9AJY*Z zuYvD!aaWFEd^)|k8PH}?N{DW-fy{8zqn08sArEf!_xr6Km`_27#(eqS#5V4!Y52THAUaa7JicedQx%h3`|AE4wv>)|{0^rqHpVVH zrzQca$$3_+>KCD5MhhnTSsk_aq*=mf)2c|1g>q$Wo%A4+d+~toO3|hJj3~1b$4;srpUuUI<+q9-lO{Mp_EbixWf1UK}^}GiM zz1$DTw(vbeGaN-j(WQhRdR38LwSyvSjj7id+;nw3C>f8-N!IC5dcT^L8=J;8>Q;~{ z^b0G>g?4kl>QN4Zheh>mJ(0Dq@cH$Z=B2)vmkH*Z5UQXjjc*sO3uo1x&P#l|Y=LWX z)xtKI9Mkc4M0@aeV0Q|HCzNyynh3_877U0fez7%GQ<5h~`xy}>thFLqd8;?|4kYeY za`m2-{8_DdY64s#oXT?DzrIDh)2b1W9r3OM3qUYdpFDkX;y{5QnXOmqe$tiWi8eJO zv?~ascVOA(KyE}NiJSP^k&{dMk{EPSlC;BZxYjd+sXp05Afc-3ah8*%WuupSL}@<; zDr&o7>)+HLx4&&jxTt6@+Pkgc_W3hOAwPd8UrlYI|19Xr^ruWcdZH6!iW;sTE3H30O_b#|(^Lr(gw+#w%#3uP!sy+|g)DH_L=^(W8p#3~ z5afQ8*pN~H-EsY~sTbAiNoKXD7Mq!Sw&M>KQcQ&rdfAg1y@@p>UFxF3jYjQ#hT_q$ z9!a{FbbI>~t12kapoySib5$(YiJTLgwlh4+M`P5~EP`j1=0qIOK}TJW97Y)Otdu-) z&aPIZekpP9tZnqw!1wL4)nEU_KbYDem;9o_NIZI#D0}`y)8fgM*0ePb2sAuoHM zc!5BbJu@;Y_orRJ0h;AXj;lBqNTj+WvT(>+#W;6K$%8GZm)twc_tbWMwcy|Im~n2&05Q(@3SWH#|wZ2~QA*4fxrS znPXOU72~OTn~g&%MMxf<UVX1@pwW>7ToqH~)l_XovfEKDU!62wm77y_P?9R8 zJL^PiQZ@XhXw1?7Bh`oCqTnPgYN8D;%Mnu``e-2ShOz6lb@dpA6W|7o88g+tRnsP| z)wIBID>6ZcbLHgFucRoKxxMy&@c>oRXqO{L0a`(}hpuCarmW2so zlwy+%mLdzeIhB|eyIt5es-Ze(1T4_>zP5ZpMM_wpdy$=5r@&%SBgw~EyP;{@k*jyc z=g-IM_C+XOAY+r`P`K!{d7&bu$qg`HHS1zmxeAVPh@*aV@icDf^{EPvaV@2%FE;_I;yHYIPoaY z>~-6=5Z$=D#6Qev@0+U1PFD{kGJtf^Um$F@7POe)d>(i_QP}z!x;<%YDbQ{?91?WK zlfm%c!=|Q=zkNn6_)^N4)}A0H6ff`R%BLI47OXQwyZg z9uyx&3uAkydrk&`7!wU)JA+dkjP$Ve_eC}q?CfTDd&dY=I_Np^u?&*+1JKr+LQC^v zs#L-LzEVpH!eJ+A=P4bfw49r19{Iv204 zZJJJqtM|xSKbCZjlL`-}o?T~?K4L;C_yDz_-&1*WxG|a&9o#y92ZUzl}JRAXong!mpOG2?*V9ii>m*d z!VllA=gj%cI0tWl_6(DLEj9ndwT(9!@i4?pZK6p$t4Jmi?;b*0 zDrF|zv2k%M??D4V0{$E>+$PD-Rf7f2Lkg-(&MJX}Bu@0It<{f77pe*~y!UL;ZqrR` zP}WiQXxrc#5KV338>Zjl_B3DIK80$t5p3(@Pw0;OIO*Dja$LI*Shx*;{0kNN+};oH z&bSfZ+LI-2i~%vw;xB3~^b`da64fGSz-}>!PWXd$kmLWea=xT;{rh#Y%9>w+EE)g# zS$cfQYs4SeuGjCAMf3KY%|to>*ExG{<|WZ=OV6U0T{J{EZd=&J9%MC*1l%;bA#`W~ z66f0_DvcxPETz+A#Pmqc<>a4qd<4v)fp{;@(&vDpiygZ`VU<&Ed7qijEw_L2vfeiP z4M)iAG9DXfWxE9@{=^ku#6v!fm|0%U%o-#{^5d(YCKwt&OD>vt8lz=|vo0S@&)OE%0-0fnEutY&JT+0>qH>g7JS zm*n{UK8R;|tmBKr9`7pW18ks^%{UjCfAJuv5$}aYZ3-_l&(&?b2-fjFC2hL`?YLD^ z1+`-9_&AO&ySiqjnw5$pO^mH*;!!(Yg=qonpebq>_m5ZLMl(yuO)AcD|8R%pP^!W& zGj)fMUSoN~nSEBrd0uw>D?w;M-?pD3XLJHEzSs7fCUrSNHfUUuoR=)D1` zjEBKlJ#7nLj+owcJo4c>*5tMEr;&yYeGPy_9hX3Sv!vKMlG(V}!I!&jU2|pL($x(i zvFTf|ciB_S%?}OE7WBI@nrn?Wmx?p&h!IaMVdX%TkR4+d9V_U1m|E}GiNByCap3*0 ztQDvUFqgvJk_ohDP7cOhq=Mx?PrV#GT~_7vHaT}E#CdEQ$(u(-KN{#V5bIC57O*zP zFINu_IR{Ph>V!@$K1S^Dt#g-4a|JD48_SVWcedNRGjSgExaDbweb>tDsXzlK*8?wT z>sB)hfArH%HKkc4GrXqYj_x+NFJs^Qu7rBpJtAvov*tas(8+RAMAG!>R`eJyR|3I( zJ*bRR%o?BSN zV7jLE+~mA84pqj)3zB_aV;wG0ZBI#G2OxKQN7q@Fipu$7l2O$}!o76Oiq2Zr!hVlO zkVs$s{RN9rHnXJ~oZ&upLtAc*vRus5;{UHIzHgnHfML<3ws~hYlxUwh$lvU0I%W1E zkI|=OE_+(>++K3hhWN*g=C^qyh-2VXKbxH?jW3VtWA+Gux4muref~9FQ@=7Tj^2Bn zfcaw4$iP!|pUKE@c$dDU2H(@M@MLVy7WhWhhJlz`L$aoC@<`20^(L!WTx9PZXkMgmV}=>D@mWK9a~1KVuM*@G zP^r56n5LEY4K}9qHTuoDx~AF#dh$%F23$fe%GXeiH{C@!}be=Hf+7#)5iUI<*KG6pm4Oh zrWK>A6H2pyMN1!o8nnGC(?~Q*Fq&ubGd(u}5(+>LJ{jEdH1?nSJ``BCga;3b>{6TJL_HXAx&Rjq{SS>i^VW*{#r1;W#Ur4=jhWrb#``(vC`#6Ma@;>P&4YIa zj-RtpDlHt&Qh-z!wP*t$y{r336P=`Wir(<*)oRUWw&ylUcnz^?CPXM#*{n3&n1)#= zTl-Bo_|aHyxcjjtLJ))D8MW#Rs{`1kSl_R}zAUwLp}xu27)vj(Gh zX>ne=4Jj1o%_*F*u(bOQ246@$yu48|_aq(BIp};@7}qBKm;pf_jhLN=cjsMhjx#e= z!O)20YkNtJ-3|Op^Rrv%wZd4mCcsKW}=~}0?QCh~wgO$=V)_rQ)Bq;oHisEG#mt&V6?XZ}=NLk42*9XK)H z3wu|7;&TP?WK@-YKv_{yN)YeGjFH_9x#L3?VmD;&EceO zn5&4l>os9J$c_4D31yW~sL(0lJY(_0?qap&g7L3`e^6smh=L5Fl6hnJLjs*+X-}Cz zaXVWRGK5<;M)NXKWBkwJIvBrCJ&-gdc;PltKf5q-Iy0Aef;l{A;2&t|L)pr`PI(AU|M_-_gd3SDi0j#tUJj^`0KfGeAU;oc zQ*S*reRKfWB;ThLEmS5RqY3wRsTaUVq*PtF4zEJ@s2-X+l3k^FKef8>3Oe8g2WDot zRZjsPu0?)I7I5w3pCj%+O$;w-POo6SnQ&p4PUUlM$eN@`quJK2iN@9?Yj2vI8()0n zu4qf~B;=UI`4NDI2#hAyY6a;i9PZm%fOD*OKHV|iKyepeJL`8!s2q7$E64bOpev(c zcP*)HBtxqd;7x6sUEsCR%&VRFGeC|GME!?w(la>|?o;5#Q z3@%SbNFGUOVeWYbPMRX=F55Z**Tfh)Ac5~5;Owb!(6G19 zT}85?=NVohjqpvDyN*B3!9NY|s7 z*Se55=?i1JZ4ILhAJ-`w-`CSC9gYo&3k-Z~Si-eOaSNRsrRvnqAV89<5x?+pvI+3z zlRg4nVm3zn05QNoQ=1It6DmlhuQI2i(R`Y{lb$y~(*H*wy>6}EcRG0~!oQ8-$UkfT zuSl@3!tICiFivJOh*xK@$gfWA-{AXg!Ay0L`M|VY*=x-cPH9p0Dw3q1qJ?dIy-T(E z7XEu9Y0B08gN8@*!KP6q5qbhhmfwCr1TiHO&-gYD^;Tl4`d7?4;2XE&bwB%Tw6rOR zMrkPnB+t>#0z2{!^-q61;_DV#Zck?iMD(tHcKz-x5ZK5P{p;!sr;p+nZ25dkYe_KG zOLoAiqeUB!0fo7iv)K4OxDkoCMidC#Y)J-Hv!_n1FDa=cu?~pNTw$sj(hfoXJ%PCX zV0~c$H4Puou~=mF5A8R5&~0v)=*vsSS^RnMk8z;xv9vEbTP)`h04w7Jn2_$ zy#~@7Mq#Oed7G_*H%?V^9~ep^m<3*K5zucVoSmm)UMHM>#GlKELWOavOKteQaY5r z<@i3zQ;?dXha&31batbU=Bmg=pgD0lq)w1vir7b~@H+s4`*6RczyiWc=_x5@to#hz z1G`!)wvXMR0>lh(Rqi%UqxBTE&0s$92l}VF;h`jhWvB?n%~vEqZmo| z>){NXaN70bfnDGKZL9=;p~8q@8#B^;0DVk{Q8@R!<~8G{g9_$jQBj)D#&WLkV84bB z1{L^1gW4JF$PO@!wNWNDkYI}Zu=aAeO~H{&v4Jx z(W&S&)o9hOpVTJa0h>3XW{C=%$SREJN)gP|B>O0&T#&rzZZ5{{0RzGF3?TXa7^?Vs zSmO;foposuMMM3AKRELB!WxvhO#FE{T8jR0&DW2cUB=Z#Kfkm9MC=T(_u&5rNt=On zaoYIF^7B38$ZMvbV?4tlMTT)vCHmv0xX@nFka(}#$!~|z*g1>;5G|E&qc!?mIe=Ag-u#_| z=^pwnuDttn#Vk0J@Vi1TX2+O?w>lci+sZA1fjGRg?5qYo0tiol(Mb=Z_Yxcq9& z_H%=6Khoqzd_;-D8uh2fpRUU`VrQ6YW#Rnbc>38#(uTKrBH!t^TT?|P3`^_HusMw5Xr(3fO{t4b# zHY}-yrejbRGWjK@`uE&wzrt-{{PNrujGc-kwk~h@oBHqvZCP8g-)Z^rwORiIso+w| zU)tEaTGnLcTP5bsa38kGY!R%8gQN*h&XsOX9Fex=o`Q$f(yHhN$H43-*TR}fyVc}9 z0&d2M)&<(l$6qxtV1r1k13n@DYHuqHo&`Xf%#LQR6nvA~(5YJz~3s6gofYPQuZQC7kqoj)Pms)ku z*FpHJ{DcrrJ1z22T(;0H;R~)#XjEEjK@jwdB+^%hb^T1L1cE(1eNIP1RCt>l&{BYB zfU&dahxh}ff@SU2z>$k7)op$t@3-tBwuWiy>C0w~b`KL{qP$c?R8V~e9pdMH$0*ue zj(e9jq3YgWj}HF2$?!OPv}dt5l5c14D9upkErp zct2mKjd^qnHLI|voIXH;qCPYJ>BqrXrD)!3Fh{57&HdxiXa$Z2D1ux7iuyZNxLjIO zWQ&cuGN~@&Yw7Vdf-alp<-QjW@5?-ow*EA z3s@JS+nAw{6TsxN$u6C2=g%*p(K1}IAj7{i#_+q7FL2o2zVu}xBk*5Zg#GT@2d8mu zbV!xz?M;VDzQ6VJFKnGSU6WD!C>~csj`j4shqcs>PMZzP`ugI?QL_=+&acmu7_^DA zVudyFGa>@YCWR{%ciJZ`Co& z4WYSPa!RLw>4ukS5jmx!EQrMNGu3ChC`1pnjb@l`S*H-mZe67lE!CpXKmR)s57daD z0CMKR)II+)D>`oYfHDl8#;yrl0TQAwyT3E0JWO#jz>Oc>!T;I+R*(Hl!g1rxUO~oX z7N3E^GhOIUq)WJAcOj(6Zle|I&7h$9L6$B4ESx=Rmwg1p7Gd79yk2u0^k$VUTk1WN zbEV_ch=$-?pzy;9xJQ$YQZxJA+r|y4ZQjo_G|oMX8=!khM&BANVD!C-Pa~P{Bd|PA z`=@9V)S2pZM2}O>Qt}n2Bi{j$9$`~sJe>3Qsh`0&XG)_b!1E@^EBgYE~a!Zdirc{ zqwS*ANIZL#2KkwF@gf6zKMQSVNz;x!Ee5NMr$<^%kx{5kMu{B`(+!D9D(cFnmI4z( z^};UA(zd>Y>FR#d*_sdZxc;XX9Tka|mqgo^M(tv9b$jh?;!Le(bbKJ*EeZPr5Fw6% zg)Q~qyBYzV&&Ufi1%%=&f8WV2McNludq^QQ=O20tz|<1-c8(y5kDLjg{@W4kG5AIT z?dbt1)T7-Ymlu-Lh@8uQAtB{y8c1vpFmGv?{2bi!kwUt>k0KRMQv<<0+ivt4re#0` zmO7sbbKN&a^j3lYfbt=((qF2vu=#!oQ zkQVD-f2KU!cLt2EivyS2|CrG9-SvHtdg7UF2rg~pWqW`xGMTRxpK7*`jK~a#WEMh~6d^ zEtceitf(Jzz0k}*%ziQvU)0$ZFmpD8z3XsjcxFDT=b&TydEjQ?`n%n{d{qHUdhiyx(7R}VP;9Cv6x9ejx64u znyX91Q15{w$De9vvGw@rKq~uh!cT^B;2X*Sfj}Aj`!@gkB(AE>?P0;w8V0bNv6SP>;FQ5#roWE}VE7Ynk9YyG3Nv$34o5;@jJ+_$rY`;y}L%+RwDEm0jg6 z*gt?x~V$AX>7PF8Cj3L8{V;ZcLosoerj_E#V3}|mnh!Kb%=JQ#cQ5( zatv%6FI_riVW` zBmRD9X%5fO>tw?F6F{wuTWY>WeUxGA^oV4j66}kbI;Gu^$;f=6nV?#aJA`)8pd`Tp zr0TLhw^TEU2VQ&psGq9ux`+~2szm%-@9&?3(B4HM!9w(&|Y7y?!B!~viG``<>XOH zrtaiu-6iz3vrvAXKF(%)xA4SlPIxj zmPPQ^gq(`%B8Mby8{dw5rgJnvPYTE_S|*y2VSUV|6jgn&9UN6ye-iEM^Zv=T-hCIq zgD1zH`~DPcJ3i{Eo2g(hRi|hg`Fl3V$DJIUJ~0*$1BUT-Obypwz&Q~@m>#e>@!3?X_(;FSWzBUMnjdX`0K!#{)?Pj0 z01FbkkqJd1ki`tV7@&U(^ht+6-P!J&bK)iz%qvRun@g%%RN_g^akp>!+LlphKKybJ z(0wa0#{iflX52v2cx!;ib(9T`_0b-?I5^EsnmEwxmA~5#e=+3~h$#A4MHhMWQYhiN zm)Jc8w%Aahp}O;jk36|X$3oAn(2eqc@sahrOZ=$wUM$tz54u0vCN8SC-`Wqs;ide| z)B4>TD!>CGp^0Em)mr>?Fypa{&Zu~MG z9M+e=3+LSdvRmn09F1!y`k84)&V0=~wK6TC?MUyY&!m~11sLI&jE1mnUJCVzQThR= zIMq+(=@K+g3mAWkUf%lPGVecog~VbKUIh$3%Uja)7M9` z-E^>x85I#3TV`{UD@65Dc3_rFgda5sgEgx~HMU)-8ms~0d4GwB75uwH_F6{HuP_uO77o8dB zcIs{#Ez#Q;shE@Q**>KiIyWKMS9SCrFa}Bmd2upzZ+N%Od00m`y0r|YCC}`{8zuXInb==cBoFO>bdeveA0J+HIJSlI zuNQC}@>Jv*Nfctu696%Rw*OmU+&YtKbN?=BhwNl5@u(yb0Kk>3qEiks=3ZT6lbV@6 z!P59I_{kcXqg0DVQ8FE)kqA{Tzuh^ z42CwEJn+Cenl?CZCY+Plx~KNUh@?}BJ#*O&5X)OHIugq@cS8q?5{hDWg3W)2(`e4P ze zY}B#fS)cvK3V1NoXJ8hw1-pb1`nIg?Rj5AXtQ0Ioh2(}8(cy_^I#k^Xrr3K%eO8r z2M3}RiQE=9$Bb?L-tzeGPVf5Re|P%|kE~C86WKiXZT>bN4Mz-KU>2B7^>jPD=gg4K zX-u0xo}D{;jj6=qyC>vxT51=kPh7Ldi4`LGgy|*{@8v9rdY7=%NskwSBi}PYO7g)9+27@IuWSRzSD7;mM7Leic=8AWKt8OZB>(u z%Q;&`j~YGMpGLwrGZQ~$9$Iu|ST)~xGXdq=JIQkGzlzm43me4;l7LYP*QZ(mhY5!TxdN3Rs1I2y#d()81Z?{zhSC<8X_`g%W|30br z@wuHR0w4^WAv4e)NkR$s``~zMmi>di!-h{s4BCUD6AHEX+Fe~CvkF<5wt-Fq^zK}6 zao+!LgX2}$H=zts=7jlV36wiN>nE_urAj1cR_(5_0&pPb9#N$(=Pp)qWoOl8A*mau6_|J4m~C-Vz6D~B;!wA_Z|qp zv-SA@JD9Li^2TR(hh)+o2kZ86F=(T8(iD+Vw4W{CZvg`cC;UYQINT1e>M;U#@_grqxVlvSZoB%b)6h$=(l_jz|De#Nc6DxU5SmpdHwQNCT#$# z6V2=`&Bstf3Qc;eV2NbenOWgI*VKIcAnA=6(!JVo{x;(V2Bp_4%B3Auv2hA*)bHt#<)ZPNj2k7D5P*3ij%G4{YptvU=Z^p!O7;xso9~#3cM}W z7EmUx{{B6EhAEl{4!Pi}M1w+1c8K93kbTC6ETx59ydY4+ED)M~Ppe5rSu)n>YB+*X ztWC$SNWV1ffiJ}p`DgBa3{%#P=zTqEs}}vScad>}pM0sj0k*P88!ZsDn#E=5&YxN(&&FdUlcP!6ZjP{^4-E;1sw+HWxOVY7 zm=0LJz)*#YKapnzk8I|K@>OwBvj%ZGA>x?@sb*cEG4khzg-a`wgK->jhhfSuxq?DX zRRH)PTRks#U&E#oz@UX&%U?u}a(ehSsGRGhW-)ZV0n<}R6A|qukhC)b^s!;v z#7|ZFs7=^Pc*Ds_S8=NfX0RFd%lFFHD9IfM%O>7eb94j{sSyHtMa)YlACTwpN^xk^ zSIs|#B9<%|QR^VnyFPiHBS8XTAcx6VjbCcJA|SHh={L$!9c!3k(F}wWB^osnh-S>_ z9&Wn#?I%7+W&+Y4$8eAbwK-AL+GH#l9@_Ne36nS4gO|_V#P8bWdRs%66OKo!h=?3w z>{&{@ZGW?$mi_`f$2XiHtK-7%w6*TuCJ#?eZU_9t{AMsVm`c+>qV8^<4{77gVdBOSP=xg4Z|T~ zub1Gi*V3#DNJ{uWSBiEFR>55f_1z=CH;Op+He)(*NLs*WEK+)hX(m`%lMa_xj}lfS zA#uaCGIe%+^++g1&sr{`GD2z*94#pC;Y!u`C&Qc@`Ju) z82z|ST;lt>o?0VvPHswf!F+VYr;Y4JHkm~g-cuo3cGgy<2)Mh9qfxUt-u9nw=gNNp z46dT2v>BWgAROofMj`uxv_G!}&-QK0tp$d)ChaX!A9z+Yw%)W2v;NR_aFfx!H-1II zR;oHyv%R)1%R5S|py332_c*8Qh^MPVAhN#j;%TD%igtJjMNR*|@H#N;(`X1vSYfD) zy^8=qOkkJQ&i_cJgEk-1g<|DTeNwbWcxm*ZNyzJD7|#G^GIXQo)8sG{yfQV~D;X^e zBTH=Az{5JI+o2*^9%2=amf~cS+&{)yL_=7Z z%~!cdhZgcw&gyrUWQCBT#4^STb5sE=PF0XA9KpO1&icW8KCH+@@}^8Sf$Vj2F^fSO zhof9fvd{l<{m{YH!ie)EEOa?ee%9=RqigRy7z-?pfoYA%=0!#&`L^U$loweCr!tRY=%d{eka)dR)8 zG8k7Sl@6-?WsK~)EU90)F|zPA4wW+@%4A4raANx;4}qqq#&X0dhO=9$0DN-P0>gYH zsTG6>%OaY9(T~niB$>rfrGTnL4C?p?@fboCD`a8&?Y0&!g$srmvX`TSpp~aym(22C z-y~n6}^_8SO)ebIl;}{Q7yHxdy2)<7tlR2#9ww` z$%D}hstvYlX!%bP3&H`9ERVp3(w81|gH^E>jO7tO731ix@ZCcsckv2bOCC4_A_af`pa&+a>cxX9Qx8TZ$20cez@d}FqoqU+OLg{xU?-XRS zNH@v5#IIg(Yrt60}@cc?QhF*u0((t6GuWGlU_G~qq`E%QDEYJCP2+ofaM|LvMSDBxx3BBRt}XQ zl0yhbbzh{o!g+{#U+j|#0hjCE_>L3hu0dA{9XOQLz4*)rn6Kj8R^hsjvjxbGu24(3 zO<$PzYxLTfT-4;a=Rj}XqJ_HEOH8PDpFv}(z2co@-NXCSH@%k0?0QxoP{?E%pKzadSj!GiGvV5_?>sFdQ+3uaS51;6Hp-XT-(`!GFq zd*wFt@hgid#N1HDOYm>x*$G0?I$3*FRFNNyt;JMJR%5M`8Gz);4LyLOev_I`mPRnG z-v%#sn-p8EmM<^8f=4rV8gr(WrL1CYFf*#V1))8^Y$no9DMr*ANLR^Dt;}gQBk(8J zOlnf}5JL;8#w!E`lh2eD?pda_L-0F90%NhaR*k`HR|A{tnTep!-U@Y!h@`G-T4rFUJ(ByrShwu&?28%+$6Eq_ zaNAT}mV1NCbwXXUp~z;kbu5B(84qP?_?3x4lv4k-Tz|7LJ=IgUn&y{O1i#p;Sr3FKU^nUqnj9f^)Pg)1qTkI zB1do>kzP~cZp$N2Y_5!V;V|P1cSDdT%?>&aC4Q1?^9uxM&grGxrrP!;Xovmo1+)|o zYptC$249`eiJDA%NZlg%Jsn>FzdlB0DD0{WkX2Kc>PO#8noP$hB^Ld(=ql-XXAe`7 zWB$k@sNoVPl65VZQ)|1@n=j8AO>jcZZgVo_`3ORP&zeE5(7$MGPJxYzx%mp39%8bv z-;=X)>;;r#Gr>UBEoXE5ZS>bIg;CfjJQ=DjsGUZ@=Wh zu%Od>#^=v68pxxwO3D5qb==pZ`B+JEBDCUa&HP>@CUh>rNlY8fA}?j_UI75Cw<;1t zDAz46A1bhBbs!s(8!eJgS9{i??YhD;5+9bSG%BjY16r-K;}ft@<9rXArL zwJJ*&Q(mYdLplaGG_| zNDM~eNQbwPS)WLOrQ$LLw_BQaN1?_oM>pNrxH|fbDuc~FJ97f`4UQZ^t@>2yg1+&S z{7%@`vg(B|uRAhl)q&w`EBJPHo~aU6Ii8;04>3KGZ8Co)ZbZ_!WAZ=>{?@pHpL2QZQUiOr-cT1M_}FD}366G}6c!A(62h5=Vi|pE2kZ$w$B&IZMN8dvCS+L}15W8E@0+k#3UTGe$MNv*2Dm zCp%5_$pH)HUEq~|58NDtnY6EAF;~fU%_?iAh4jKhjJxd(ig z7h%ht*X!?bvM-YuvU$kD!!0`I!P}tDI4#VVf)Lr-goGabnnSvot9qtxo}Ax<;oV~z z`*p@kURAA7N5L!H)D1&75kGSl#(lKpECRglW7;BbEa;7yq3eV*P4dG{3>#3@gXZvqor_nwv+jNv*HgcB2D5gc`=%%tI_IFzU>i(Je4R zEc&Ki^i0DjXR=9~k1A|y^$-pa<%4&wYx9*v)c!n>U}03cxWat-3+D#ljGz$t8m+$o zYlX{snis-XKujkHLpli`V5=`2Y$LBMll=<02&|}7vUU`X?{#Z$(!oq_VTv5XcsFHa zNda!7l(!0;UiNq$gi{B6YZ4A!Fo}S_Q zvQ)L=$t|igBI0?7c=MyKXAFjY!(RPU?mwg#jc@HI=ky^DrevwLdw)LlI8OcfKSI0w zQwdd2=wy?<4(5KOPz{tUANZ;&@RO~KE2zh;0uMp67ps@GPq@1`0KOb9u&i<}{9{-l zXZ-rrH78A{R5~q4+)C`PG2mui!;q1GCqmnmV1C;Vy0{!02j$oMFnMUsGE-tRU&Qpu z@psfGU}bK>i(KaSFewJYBn>VaNXL;+E z=LHP*wK^z@Gs&@$6Xe|vD|Hz4uZXl9p>$Es?7K1f>nhmNeYzT*#xh1slQ(fY5c2tj zIII|36NRE%WBqn;-cgW?T%Ddz#w6mHAvVy4<&9f~ZSKLF`)>yd_7GRT|32JXdl+oa z-%0N*Sy&MQ-HxyBAnU*8FgTw?!}#bXT(Z;7ulc{iczH-{TMuAJujuZ95c!b?2ezj6 zAHpV7=?6Po#3AYMkPaXIVLma{@UV1%aLGnGu>&l4uufJlOBGDnL%a`hq${V%Z;)3Y z51F`Tsy{2i2_}*HB`ZbIYe(F`fMbTLHEG-*;Z4$$800Aaau$OpJc@=d_89BUyMxX6 z1h|B^;A4!L021-@@>w0sHL1%3vX~4m21@x9PA|4=1KxUQ8S0lp{zWjvqKQO<50sz_ z0dXwa*^&on$n){>R3~i@QB8U>)Mj|x87ue{O3Z|-Hj9W~Y&d_0&ka@Q<@#1EFa{iw zli}YGS>0b1fwcpRF*`sy$8cR;9T zhngglrKD&yU}E1$@Scj6WYw&(5#(7lTaLC)bu}zHfF9;PNUnfJbK+OtKh;E2&E~2Y zXs7pZ7W&Z5ZyU(g9@z%n712HgXDdJ@wK18+@^Ajtug(Xjv2-dz4p{#@I}n_KKmvn#cws@X-I z+l$x2%)A9Q`Y*0ZegDhIP52I0HZEIb=jxXDXTPsLac8?_Oe6E_2kR6CqX*#&gj>IF zIeKT!ZpGEM5BF-Rrs(d{8|@}zh|3*cFxIBE8p2@Bce$*=`QqZ@8H}GWD}ysv;)!wL z@>&V6S$J&e>!8V~ZRIbQytdGeM3TZotQq_ugJ^uklZ#Y{=t!-mFKKDACGwr;1pdOM z^7aWOFzU^_Y>d2Lvr_VcmsXJdD}=Cgd8^z2XY+8d}R(SVyd%a-HLoA ztXdp*ev`w#ikl-H5BKTm|7oeP<3_jf9 zmlJV685^6V=hmC1LB4dkBItH&MNnFbi1Ox)U0JPPE@q^1mR#am?0~rm13nq>yc$(o zv`rc`dUEkeAd=ajI#_iX%VNy8_;J#H9zN8gaeS2;Sd^U_TY1tbO4zTtSrJ|I=gz5W zzXfttq25Z#)Q%1LRY^CQd%v)9k)?L@^1-c>4t;-J9MACcC^2wq?hjR#b!P??r=i>T zGxn!Y;ik7Wl&x&n)o!OgAc{*q9q7NCx6Z}Z)$s#dFgIusI@??jdG6lbE!W+_SeuS{ z3&P~G%vCJ>sY4~GjB^0zkV^ESNx?nb{kMuZy z_1M?Ne!sI&4VN=wUTY96 zp4DId`H_QB^$r;ehI`ld{s#S06}8})tAEtcN3ZET+|Avzs8MWm@8_*|;>(9KE|1<@ zUM1R`v)7r7wf^h>`GeNUPl}AQF zk>a3=sTUhwY0X+}CL1;*j-Qq>x&dVI)H#=mL>`q;qlbaZde%Ym~4Y#JsilYD7Se_#|JMRBHGHHuLiay$BEc9La0*YsTdJhAWQ~?CyKo zyWP0YVQ*hma>jb>c>`YJ+y4lLdPC^;X}$N$R^VGa-CdRX^=I(;o_DxbuT!Ga{XQIi1rGvl3uY$q<6qel9`Cv!&sQV2+VP@3a`6Lp$!M_Qn5AS zDi+=N(p^QD5@$(4@c`d5w;#7FImEeC5%eJ#H%{N5}7J%In%` z?@6SG(wPFR>0B)bSH7Y0ZqczM|0^4t1%-W+&vn!oF8b7&$`h$#EAykVeKQsp7Huo_ zu+oKJw-||Hg3O&545_uNLIO3W_3ggE4JexHKG`w{i+5yYhx_-`uBv~z_#u(7p;2Ye zT1)GvK?#=mi;#vu&$VrtBh~Blgo>L#s+|!j-$)<)jkx?*VfUhNf|vUYHZ!Hsb6aWt z{D7q9atLEKMAm@ksc+hKDP!a1M*XL7aD0u>Ya~3 zhpi`E8I&FJVbp4g7J|ESJxJhYUz(b&WX)qk-Fz91(&N<|_10hmPjqWq{YL0lUJnE?P#a*zD z&(b`c)m@1k$l;0Hrj<{R90XLiP2kY+?FPX&n|pVlDVY!Bb`Bp&pEap9<3I+F=ml*MxtJ{MJ0l8qOt+gVjmg%a!0yJrVZ z##?%>K)Qbu=B)FoV2QbBOFsWagYk}X-{h?uY<%)->iP~F9~UT_G_-Ryhsp0UeC6tw zwF@7D?LN`t>xQVTW{9oX6T!*vnXCFvytptuh5W+|d-B}2pj46X)6m$utfS>AdGEHC zXGB0o%d3xfG9m}zf23*|lf*oJryZ{1_DfSmG!dTw?HmXoz<-&J&dn5rypdSy4_@pkmhOFb?-@({#&k9}=JDX_qfGBL zds06gij&71I6kOp?YXENjd7X}5qXXSVcbD9EFwh8eAbLEv64SquUi;qzDUG&b@*QU zMZ21FDp~#{u|C*OBWMfyhgIG_d`0o%ddYB`chV*Nz}ocB?HV2r<3h(YyPV!9f{(w9 z2hkGt+uL6P*DiGNeBL!VR=(~q7a#pOCi4D0*ucAvvTFE!V>o~P88=>U{mN!MX8TC) zHlCe_$zw_AqkQoFnB>2@Gv1Bc$>Rwo$K&)~9Kbvlk;=~O!(Q*+Td$d;f1Xu`wNkmc zag()L{FZPX258ew^{a6|qq}pXS05%y_YgE6mJRHI&W#V2SrVXcA(ht>i)Km~D5-VH$YyWX>J|0s%t`s)oma@vb=_fU&`h_Hn+|}(4vq25^u4XN; zXG?i^r8*4r)oIZ#;`kUn(7ngW0_{<%wiF>>g0(Ww`)%L5PQ~iCcHk7dHYo&Nuyyn+ zIPTg{e)h0kS@O_;8f1Sc>d|yA5_G(vm?t@L&| zp{t0#&gU`hDONMj>a3=cEk^#Zi%lwgyGINgyzsfa30=MD6?!4ssjn(CHLl8#p|7m( zd}vSrq_wAFlz;_8JbLe2t7O@XAS<|LU#ek5&AYy&@L%b2;Y_tW-#nw9^Q=S`>Gt}R z#o#ZYpaqtBzt^iL>8+QC>y^~5ia-V1Jhd??8qbJv;pJ3R+T$dIDo6CGxIG{xGqz#R^^1UxMdLB0OAG-ZuZn zc^g za997}lgjs3bOAji@@+`rYx;f3+oPQt*$JMrpt5-@#$T+fc|Lm!cVlKwbaY(WqwyG3 zsT(?;ptqU%o>RD&2taX9eNR^yHZw*I}kMLO`bL$uqo3fC*QB8PpB8h zOl>_gUd^>F;h<$JUo2+Dk1Xa)lknWRCh)7Uu6yL;YB1i-mUxa=9H=HlThx*t#cSEk z7~W1#2B9%oC+_xnwqBc$QH8!9V>LJl`}(0Fw9nA(^eB!)hc)7NU`NET_g!m|{&Bg# z{>3@!?{|R%_CoC#>E>{z?-lEo0_M?|CUS-$ByM2=Z4EJt9`54AQt zd38C9TprY5^xcjLKdmWJl;HyFj0e}+su}(YdStAzaQ}LW#P-Gi;p@Gln%ttkK}Dpf zln97QiHL%96$PY41O%i>7wOUjf=COH0Fk2f-bAD*y-5!sO)1i(*CYZGS_mcdgc6uX z@4er=^UXK&2P^Bz0#??^IeYJ4+55=CQTel{-x7q=_6>AbUjos=f%ha?Bo1G_q}${x z*i3K;0#lo4x7z1YbU1ZIJB*qR^dps`}X9tUv-vv6S zZzys7;15zf6~xYvE=m(%IS{cB@QvLTYLE}x3Y%8HBX8TJ6H2srNnp)nwIE1(wtv=m zVzNc&*^`}Osls&~nRuVZutBJ~_NEv@7c5>I6?`DMXkKge;B2PpEG z>GTz{EFftk?Nilh5&U>#fkQHjw&B`lgjjSRlXLM^mK>sE8h8xqGW4{o12?30{%;&-^K2{}X?pwj1ibDu^! zO?i&@u+Vv1@}V7z`-YQEUVVtDopw|Cy1a-rNUF`Bu_mRf+t(id>Pk60KM#C*hpwK? zOzaaGxyTnB_T0Zh@mF8jDAtHeZQr*_K7+^4DZ4MHH{TuIqJ|gm3M|ayETOWYD%Wt(vzf@xp!<+{nnX z_ndCr?oayCv{#FgUYT+Ju<_KFk@tjBRQh<`I3sJR#G?O5x%z7Q5nz#6+5vRII4Ev) z#RYk2!p1*u!%MPvYRG&w1c#)5pr+9CfBX=`KFf3ehIh;I!D7-66|Va?S`3dPCx^1d zx)QogYdLxXmjRtQmVTiVs{VUB3M$C|QEcEGJg3U07Q|=3 zEm;SB5?Cqc+Nn$RT@_cQsd$K4cRe2Z519HalxN~aAGto$pvJg%IzOQlRakerfj-u4aOQ@`z-Z38+sIZEpYU<2L29 zWRVsArf!Mr?KCo3_Vx83>vQb(>gTdwMy!r%+3xcy>x)_7FPC9-%Oa#I zc?Zsir0*n)SOuHQk3yEq+nDZFnVsiQK$*)CXt+KH0=gIpLMgEd4>h zN2q~!$&VFP$D8=wYY|D?yixCWZlGRl#?o%3uMv%BWe#?>4U+T-v=^j=GaY&a^A&=$ zgc>LnS2vlnF+tOIpq+N>xAXKtTFaxx6|0wDV+#2f4URwFA4n!D&nj#d#3^o#kHk`y zNRyZ>fXt5~b~12IM_aDVAVJu5O6V#ujMYD3{p(@#i}&w(h0umyLuy{-nk<`=G$qj2 z)+~iQLFQGpYd=@}&pl(1-^AZbDP<1yhAbqCt0ypr%X=dq5)?Gb4}z!InlGOy_isBB z){#fz71vYTYxCch$1m5N4p|DxF{^i5YFALnQ(on{DRcv!cV+WL=K0$N`uCp{Rq`h+ zkk-$?>FWK=ct}M)U9o*;Nft@|t^(8%AqPcTOL7XxLuaIB3uUTw4a4oWF}+_98IAJ} z{*` z?z(Ia_dGW)#vSc{SUQ}S_UhROa%;cLA-G%xwSAIuOZLIDy9diT$;i6aV+n zH7HNM&c zOHSXTOrKg*HarPS84IWr@qn0CY%B2!}JJPv}Ks(1x7DSTw$<+I?qmNDI ziP9WL~8avlG#8 z9qeSdqs$V>8uoz;)-g568B6TgFu>^)9~w=a%-=hXc&1>%m0iF9K#?-(KPAkUcWn`{ z<%l!XvcA`;*u%e>JQ3@UON0}C-vN1q>c(O5<=e+Oyt}aZ4yzY2F5paA%JwlUn9B#3 z&?B~o9~J9OK8oj$28(Ylgus=WyM!_hR8rM9)j+$76oXW0bnhjzzR%I4zXtC=Re3t3 z({uH*w32H9EuGSvJEs#A_;JZUP|@kLu@%O8-<#Vo4B*mkl&{}5FC%y>zz{6G)nCbgW9yZM#F z=VMwBTcL>F(x;*lMM+uU2X3#;T@4)~-1aA)+@}jsWa65%V;iDE?QW^@Gj!$kd55Ak z0-Jw5D7&h6XE#T}{*l|b?}MRpeuQdWJy=H838{r!D}}O}QY4t$gdm~DP$-}tpLJTc z=vLsrs}XqFfrb8AuK9AKDac3+6TSyRnIT2o-o()sUk>|rZayx%Uqq%t@z|TW(=j?q z!c?;2(T`sKz3G!Q=VA&I@A3mI-0{50r^=3F+3o)HNqB-mivP;K-Cjr-SJl9sw73U) zU7Gzz)3zyVThZ)oYjmfMTaE||xSmeCz5LW>I2C=?<^e*i*i2h~-%=||;lEh`9tLBH z@W6~PX$^gWa5@9SENiooBoTOWG4= zq=v?~EuA$(N3G{YEU{!1Gos}PNaA1aO!Jet`bmpc$IcSUH{LrFWMjM z7qE?u#l!ZRC%D#)xBDbxC^3vb+ZssIw8LyhrkUHEy=^)djxV!=M9eC1h$+trjpt*G zsXugXq?p2$9oS^kaSgq%8rEXH)@HrIu&zxOF@O}B*eP|XS&hCs$VY4`M!ZtR9i^o!EqHdn#~^OXl%vRFR{jea9uJO@SN#y1c|?wSi^KncvZ z!FJLDjPC&_^5RL;y~h*I{5hKz8mf?*?NNS>L2I?=+8_vhj!-kvbIe{xj+*jQeBk4F zg|)rJw0G0JrH@tGr@yHa7kX4RSuB?J|38{2%VpGI2^ZRQ*m5`O2#1hyC1f!Es z_=QY;zXXxyq?FPa6%O>RjKU{=J3dF27LhTUW`R|Y&w@QTTT`P2a;vV!(!44%)i!2_ zQ7M^FJykK67_F+2IR;@^DJ&`MNa==ACJb-RPQrPaviuVEhkp4P-gKUc3+&)<7qswb zF>$gRjH27E{uG(6v{ufKItVo1>~{BQA-^CtD$iYj{}0+Fj9RX0)p+68g~GR4_V?R- zmTI6b=jy5HM}&~RHG4U`2@DtQ$Bpd-(o?*91ng_jG?`T&jTu7qpF0l|D)iKVl=WOS za(BW+Xw8vnBF=Gb+|<3Mdcqvi1M8r5%*ZNx-1yPwM|q=P9zT0!8{aY7As;+XYgM9Q z#g>mk^S1+qdqQpWO$#A~Tr>8U*r9PUvjTLv<(HfKl8Y1xvSB$b&+TTdz}xxFH!sz` z$7IvOdq@lu%S9$W2?&lwQJ%?$*2tGzow zV33xdrs3O_1d*ny_XC@U29(TI`X6Pw9Q#~6F|q&XYK2Zo7Qxb@zo@D{2sCH0G`@K} zId@V@#)hlBbDC_I^oNhhfO4U<>6JqA5kSRTU$)_wCbGV-=>|mL1$qc&^`xYQD{gPC zW}+)0`u(H_K=7p%vA~>e;!_Li^8GHo_QlA+m|7;*(=|$7Jlc68B$^phN#ze~o|`st zaC?Uc`;hFs(>zffeed@zx&xYT5qSWj*hqT#4YXqo{RXhIFN?+glk*{g?DAq1iIz;Tv=9^pZ-h6+jz%%)YeQ+K$ zHgX9`CqZTQ+k55>Et&Mm?V5>9CV~O3=7hsT?T%sc6jplOID;ncXq7`qucLPF?_#FR&N zHD%AlF3ql_(veTWq8C*HnY7#9q4c#Rbh;jGwy7`iqOLTu9R(HQf?Tu*PY6aW1K9hQ zuzK8b7?cqz132DT)k9Vxm$=N`wT$V zwT&=@LC01l8oqlQ&LJX5fb}YrSgh)oR+rv;uejYd=sG7~#YO)vr7KzDou=rdcy!vm~n5n_-fgqFK2b@ae^0dfB(M1&4*$W~PxVq+n*w7lN^Lsl zW2Y6JNoPV2ar>*Q^KFQfsb|qLub$Bp?Q9I6JM4Q*S{>RMtp>WaX6g0D|M2e+Tw<9a zA3_pa54(->(_vcjmqO`f%OY#kZld(w9%okTon?5CaGZfy7u&xkp5UC@c;erX!l#KU ztfmUyVvzjxf`p>D8*E;1N%TFL6AzuT?&+TLqKG$buOl3=&XNO}GpncW-VfzN-GdOi zf`>cP&w#rXqDY#l5fZOIG?x-oH+jC( zfSWUPOY{qlp&Ij093VL%Z<1!c{D#)<(Ip5?642a zkb#zsWT4fIO6^4U2Fu)zO67hxP09Th!AKOBY_L5?PSpTOw^Z@JVg`u5&B1{OOPmhv4*ZK2?is(WUyOHw6rnYi zW%?^k`8t8k&6_4Z+_@Xd~tHRRmeohjn0_uM|@Fpp1uG(JO11a<2lb{D%Q?tid= zRwzTM&>(c5b&Oo9kx%k=cm2*%`o!H&S>*bqFpf|Xm)9hw-!@}9`u*(XFrz2yNA27& zBSEj^J0}esXpn$YNrmIF@De`S$lR}w4=tN;3|%r4tDnc^u6+-=aK&Kn2nKUO+ociF zjFP=MXPsZ1X+0U3i-DvL{IrW8MM;`VCOE2q#dAhmzVwv)L0IXUkRY}esIx|yfL>O{1J(+(1BE0X9GYz%AfCm zUg4x%t$wk}s`LwY-Jkhy+3uA1ln zO!J&s(JvR3I2YI)ahj0?WY@tt&}(YSWsVEfa!m6|8730$pE4rfjkMEb#3k*#j>7*I zR1>fkgW#mc`im-`#>Bo511BccLc7_0I<9N`8ny{#;3C9#{mXSYw=S0DGdUImC$8*r z&v|}dy?j_AsAsZ=37#ZkGHh*B`@8(g=kHF}$hp?1O4+H?wV6pRXS&RR z;mH|Ye)~P<4eQfMML0_cYaA11gdI~@h9AAu1Qjs}&#ik>*rqkNLHP#34huEoEZcGc zc91D50N%k)Gy17B!^y4z5IfKOD|SXR#3g#LV=!a+3w`RNdxMO>BmNmyM>LrOwQ@_wQwphz>V=DixW)sL-yZfs2F zeO}&Lens7clCe2l1DX>)7=5l7oB#b?goWMz7-^J$=*;mW+NOgoMLlG4eEehT(Q1`g zj{87U^;A*Z=NK3NkxYL&p1Dh zbd!f+J!#WURT_Q)WU#u%8svkmg)UyEpDI+Z`!_#@FbFRdVV42m{aXRsX=qSpRa_MJ zWIm}@EQKf-*qm(5aJ9*PS1ItgL_7q0(jU171Eb+9#9R@m)A~B#!O3_)C8oB%UN85J_YA9}P~p&#Z`&N~}-^7q>1|o_TZ_Atn#_O;m11pO1Su zpYGBwm8sKrq;>P;V=928f15TEr;)h;6|H5kHoV=>6_=ORY|$W6Iq}Rosd_-Z!4~01 zbNhQtn7=vd*Nc(rvGFw9u|ia3#$1SW{1s?NeI|Z^{|u);dDEHDvrpC1{4Sk8{+>e6 z+7_h(w1AN;3R1E;yJm_Kr&3{mz1oX)nUHu;l|d9(IFK8VbTQcR22IrOmTR=cj zIyqZ1oLcS&CU?mv4cdwDd9GdsiE!k>dtrv6u?PL|D^zQNPZ^n17b#4Wyhi(K&I{1A z!eYRWfCopPDw4R9&|D#YPKA@FZ_-#)rf4JInACJ`J--s}cGV@5_)pPCO_c?EVIdz*Bv7=WD9-caA1gM z1l8Eux2r{ZNz!vN+MK7?X_ZVEGk`O-N`agaG0^QDvWLsi`ljn%T zbF2ZiT(O&x$r?wh={g>|aP$z1incxc?kJ=zP1OS_5V$zbRU={qDWyB88GkOfR=*@# zul`Y{TOwkiJrgYJHt&;L)mE|gidrs*W}e1vU+g)`_2fGfROp0=mPuvqY?tc3 zKk+MeK+`BSaiGvT^0)HwK}y5OZp+s@OTCnU_PM4T`yRjYxz<0ol7L|H;C`me(F}iv z*3#sS8aLcbXNMWb(Yj2vZLu%x>1K`;ymb0qtnA_>&+=T1lSNahc)8DjtBrPPtHeR} zV}^bcKd*Z{pQa}a{BQ*v<}%G?w_RsF4v!61p5Wju`2|e!yVx9eZV4H_9sOnc%swvA zPKhIAH<4u+y2lkeBS^#yoll}Wcno3jN!PBfT41l>y=GoL)%rN{qnl|sl1aE;2`Te+ zzPvYNkc?X{i5*@9*yG7F# zm{jN|1e%lX%H9z8oY*L(18r*B8f`Or6c};Ah$D9tf!GT5$dLzxa{d#%&C+&J{=n<( zjh10!i3pM+7yF~4x@rSc^izHgLb%V-^{ZfcSy+AL5air&DEM@iLQ%>01jmiZYZor1 z)7<1Rw;?c}eguHgt}) z`I@OsOaMxH$?8mSbN|C#39f~0<4E3+dF>j0ZX~Avs@Tczue^|=kR#biLnq#JGr2re zPHWaU+s^T6vw=L_u#32Brhr&#wnXgoa1IsTiLOl@pKWfLxZWjowF zsW-QTS#}Mum>jng(s&eA@|Yk;1yRdey<+LnQlA%2+un??)C_v1i>JTwCL|na3y^Vs z>Oa`ih68G~dV(uMbLrMpK$go+##lNX{Po*Y3#-ddsEhff5L60~5e@OY5tYnDBTvN_ zM~5>^XnRc7(WMt|%n8Acad2RRuOs@J?Z*(r;Py!;mkdSprB&2*&z)uV>IN^TKpF|I zwfStb%jL?`;ujH?{HjpRH#Q5$53!W2Um&rMpZfQHs6N1Hb@o5Ch_183ouaH@%Um>7 z27hbg4mZ*)W)f?Qjm+%zqCvkKSls}+?Me1KEp4YF4U9}yL?3oo9bC+a7^G$aFdUw0L1xk&=2XEbNs()8i><{f;* zzZvfIAu-O-cz5M7YxF=TEQwd0@`U1cvedBJXoh*6?Fk(_$vHAB8_)iVR}s%e|Mje3 zU21JH9#v6WuiyVZ+!+~2;=+7g`I72?G{@!6rSj&N`vApu?J7m&smJs43S~2TjbB1I z;ifn*y9a1Qnb}C~xaoZ(hN~XWJEk5oO8w?{NHS<1|Iq=c{qfTk-6mXWzyamz`0#u; zVQsRSp5?_^%4n+$?hmFKQ2I;pQ2)fejRhVI3ruc}qBus@kTByBEpJQ9>^uFK(VCO`H4lwX1h&n4q?tDybGQND$d>7ux7 ze$-Y@WD09sDbBk1S-Xqs>+uVlV!~YcK~#zQu9t;(O?wia%&P?DM$4{k7T)zy@~=33 zFIY01R&{ewtxR4pm#cYH?1*ixf~WaN?+5pHa~B!{X!i;SdX~jxKV@1U{jL(q3N}H1 z8c}+aDm()*{GSw0W-~>XIQ>hjq1J;(>8a(2DQB1_#r@oql17BAEi{=X+q2eC*y{>+ zUGuyi;5u76!}kI2rrj^n2cLl=(sVcJ-B9+syeoDezxV4Rg;;)A_};NyVmG|Uc-2Gy z1;@dJH*vCP$5B^Ifykfkpz`6x$0_HFlhP~IA9YNl-;hY@ZZ}5l(wsle@RFP62cq{{m z9wJgRirW|8{IxAwl^&5H#E~6eIYbmtZuw&nT+RyG>mguY9XcHVU{~bBPJtUB*{oks z7yvQmr^8>!PtQjTbS{~_^X3Vs_RG!;Bk!CnEufw+$$YP(%+?8Q0{-A&0Y*4CM>e=_#FH2%6;r88#^H|O`Laj*8DAQb!`q}IxlDtx+ zS?M@m`>^3#UI8FVP@QI>k9Bh9PmwwCcj-TbG$yxcNsA)QEA-G-u=cL`Zdr`8*zU!h zzGh+#5nVl`@!{T3Gx&SqKa>by-g@*cT>&x+vMVBy!M$z^{VV1IhLD4^t58Q z2>ZMwj2urVn^~kK#wTCL49>r-=v_c8GRh3qhOmMW9ZATtAPpng8XZJb9LzM)&t%n) zYxnw6VNg~K+YZg6e=;l=&tSf`1@G)VWD)O*gAtJ)j{4EuhuU6I%|Kddgis4$<0~J1 zU>hh25AlEleD~Vy!w4_KRjv2mNZA5z)p6y$!c{ir%dQR1rJV%VlZ`a-RwMC1_cPea zk5y008n+GvqDDOvfYGu+$t_7*>vv>oq$2eck*p;l5i zwLEHp@1ciEU`B{CuNFsqw*wz{`Q6AnT<$*y!*ARtW`9RL_v^1;?6TQ(L3*iAN2j#PX+;&br^G@viAvRn?i8Q0a z?cd6$PLW+Hq8P)_xg#2Tse)F@+$xjTH0&n~+EBPs3W)a<<1!T(FL_ z^bR~&$5bM~88_GxB+X{p9Ur5%kXzmMn5Z@(f}dHcFuA6z^u5`gWT5uzX>d-le}n~^ z5DbPTR}fFSKiM)`#hb2xBmm(It9t_kSr zUMVhb0Z;8vE6nA$WNa{T&cwONSoC;1^F)h@V&CIs=WpMPF~1W)8wXv`u-|5CiS`~Cp+2Py6)W*^T}k?7(W2I$1p1gGQD zigrr1gVlGd+qkE7V3S>1&E*LhjjJMQ^%@@4Artx>y^B&?Lg1aZ=M_Sl$QH|NGx_pm z_hkNs5(TNh_F=C?B;Q0l;>pAU)gFnCt)Lw(N`_k+QR#pP9SAlqQ*Q z3SaZ}q@wc}o7W^ZdieB}V%jr+?!x*Q8EkWLMLiX}@+k|Lf8%wLiTWnA?B}a9O@|wv zcW&~%`{;FSiy~AkLANJ?R>#>jJ-*S^S|ay;$+Knj_}=zFvuf3|^mz!AJjR(G013u@ zH}EYk#1#OUDa9@%s@;iQrW5K8cl*5&xu_@%?`1(zmjIqplQuLC^DR)>q-PKljShr)o}1hMBMVX?d&8D?q!(MQ3& zFGf>Gs%QRp&>qU*+sJ|--_PBe%{$*gR@XaI?akuNYt`5nY~HdZ_X!OcbOLTTW3>xu zX_2QIcE=$}`W=xF`*dl((u&e%>a8$?mh=b6CV)3sdLU${B4DrUE>V+XJfk-sGhk)t zKw1ZU3@NiRn%XHD8|Yugff?PcysIy-Qf4+VtV9I<>b^#fT;+Vc9xN{FC$%mgwMgSe z;C{o^nNO0F8(4jV8+e}IUX&rmo46}jCJ6bKi-kN;pXSytR)*axg^WyB(2uQR#*&7C zV8SQ^wPtagAnKFI+yjhe=43yg9Ua<~^*gKA+k)?|uWbJm_d3pO%Rnq`==B$PYspFM z9$(6GE^TS*<*Ldv>)r_2kXvx(0J3v`d`oZbOOxi_szcS9sjmbce45{k9;N{oAaTTW4R>o#7*Xzjz9NC5J|xd+1ayJ2{68+Sf#Q9CQ>^ z7CsTXB+nXyYX7E1sevwcd}c&8Gwk|b7zJg%56`z~O1!VNud9KHQz_4G`k|iwBb32* zcc`+S3sqz-+ur_;KUn>$!b$HnJVRLQ9}7Np(X~^vgS9g|2Et!e3`&{k@t*edaH#Rw zT{)~^65F+s_sM`$sBkV|+^eM_t_FR}#Yqs68+!x5=I=|N9~q5RsrtM@RizK~rNW)L zFQ;X@W=8fF6MVisH+3kLlDAEo%!4r!e76VE7C*T654RD&+`zLTv!llQgl2cXnZmih zC_s&#TTO8p4UUj%CZ5YtY_$0>DAfmd%{+7Zd{4C#t{67^dnGWaW8)8=#h{b7TPnt~ z{>+;(s_mUPeEKC-i7mY-C352ojZsoVde7OK`|QCn^o`gLuu1!ba)F*6)=GTr@E^+9bAFkj^5vUw8pRF(myd8|Kp z?aPBRlgL-DGZbJV+Q(x@6;Px^Wty6$98f^NL9ABj;e@^C#nV1|RIiy+6=LE%*aI{C zCFU~5@J$IP2C!LUzZ#cCv%p~R{1p?18ModwT?0)H9=z*?xL()u>Z0ftC8>osuoiFp ztjfrk(a8@!smeJUTdRk_{2-5H_7;_j=cs=hs}OS;hxLMGb6DnF;VY~Qnko@P43x2ep@ix*F+$L(^K z>9^;~B>tfhfUkK&_+rNb9emb&!2UBPzTc%qZg0jVrn;OG9e+D+;Y-7M6|qDz|GXGy z(%65k!ZyRAwke_MuwQ)I-lB$gL5oA385$?Y6N(ZAV#Y-xY*=X zJuhWSKA|XXdy-Z`Z1njs{TxJW?eQRr@5x`gIW^Tk$iw64H?z-$m|OkviRUvw$DqJ8 zR*pKg8lHg|-8$fEdRTP=gAXR|g*G=r36{u~APWa)UM4H^gL6#VKWS|O5T5=H$X7_- zna!eE;INTRy?IOwQwYYhTHI-0=%E1<&hPbPm#O0)iYxhFzQ@IKEfJ*aK@}_;loMIN zEf*9I-pXJ$GWKT+Vby8ssdOrICPt9A6k0%-*E&mjrx_JQTku_TivIYr36neLci{>P z5tl33E?qvXYi5AwjV1Kku-gw>a8Wn${Oc*DrF%H2C>uN)a%!nW%%-^AuBxi@#9pX= z8bL&&aC1{1{O>7}s{{i@^bpwbQWq11;fU9}#DcPkK9>%}%k}!DClR7wpH3GcS0^X7 z&V5)^IdJs0NpqZLfi65~D&_P&TqA9bf33-AJFR{N5Wr4D`l={r6*^G|E zk4Yuxg>PGA+{V}LWqz2fI$)^`B?-*LnFCC?_K zHJ({bWT!;^Iss-y@cYy8zBcXRqx)$)<8D_yc36hKv}G!{>#jN%?s1OFB6(m@fVW6w zB62_}y203Yvtz4Yo3qwHman8r4u_27l9~k3TqIFQGqt>|(*lS{WqZFpB^gz>^;A>K zZi2f%@3R(rO#8PkCziGYy z=q_&#j(b+~CVm#UCO}r$s7cC1*CksP?t8sjVIX&J)GA23qZV42(da8A>O7jkD$mM6 zFAZg*MI^Chvc`!4mwiR2z&+@W>ue&TUc_F^)OXgmFDemY&;0sTDZQw;!YLRm{WyR5 zcA!?!wOsBvtzBSib-BDr5QEyN6iE}p=GGF8d;_#)a`5VVA~hn&v+|yyx(mCXKl4Y& zC~yPwv!SdbmARE$qvy|iOv3MSr~BTDae)q2%}n7G{%A4$d6=~V zA{Ql`GK+bw^p__86aF0)ugRx5wF#A+33zCUxpuo7h01(s@+;(T)d+xmm8^$@RULA^ zyqtN|@^R;z>Xb|4I~lcfca!^aq@{D7G4Y3$()q7$L}VEm`z%*%ZYuxk)!Ln8NstO9 zB=tbnK&z~o`nx^F8VG8+UqwG|%8Xf+k%0m^oFBQRefae(e;;#`6d}j=uBrz?IGw#v zlk2lYV#mi*!2{N9Zwm&f;_rGkN3F8Pz_-FbO->d<<}2F3&E6GV+kt>dy8t}dWq#}s zR1h=opdxpt-o_d&oH*pfISC9>X9pB&$YgOU+s?#~b8y9f1uUQ;*1DJoCy7o6%DiM9 z`!}9=@-W|cXjZPA{Wl{5>||CibLhaLXpjUaE%3wwdVkL$5VV7{_<)x(Jqx^ZZR4h5 zR(S`dQ$n^*NlK~i>E@?qVQxK`-T0!0*JfU|$aJVf_8v~ULNO#Zg<&_mOrkPZ3zjV6 zT&xWN?Xq*w%eRlGaMBjgm8HZ7ME=)%ej{8q_0M7vYofMn3?h=FVQmU9ALf6 z6{q50zIU5JwIbY>h7aLOZ@H?kV*Vy;L}I&r?z0wZ=L|B@q4TDWv7a(=Z5Q{cvuyRA z=nno5@u4DCY4-jpu-H*@fbxNhe^OvH)8!;P%7T2{@Js<|z`XPD;y;FVTDr+(0_DK< ziRyoPgAp&VCPuuR$H2z;JH#LW^Jh&k8|PMl=l2qHk$~fXS9|e}_kVwJpPEzQBpzJ> z?3U{(uRhPuYR$4MKZ)=r!Ct4}ZJD$MkmK3|q^_BJQ@UD!RJ zPS!ngA9{DbNti#LWQy>{T7 z&?75;w+s}14B5N5`Kahns!}Ci-8BiP=$FJG9W0J#7Y{uCa1Afcy~z)p4xob?gr6AD zq8&=FQ(U?I@2M$Z54d)kpe%~{yA}TYnpx08UkNXUFSGZ7rw^fTpX*%hvO)iPOd$Hpi!EZ&i1UM;v|Tjp350o_pkb zbV-v7>H4dH9DOTB+w<3<3csbV9Oda1@SE%DG+M@%FS6ksIsIqCAOvP~ypiv6;avPv zZQq(Cr0$DYx56kwSZCU)PmCrOk7HC-xMlX^Ap}3)T_e|937P0G%0XF@tdIU|eP;X( zDpy87{(y5;{~ecq_Q(Hx%DYbGdVHi$E%WHl8pWspWWN~JQocg{NI-y{$|bBogZmid zR{_+&`-2>;qa*(#5oB*skfFlVE?j1$bq?7gc z_XJ>(0cxkWitp@u&x2-?Wl=eyWllq*n??bIm(Lwr-%uiSIO%LX%}*6?Q?YQExs?R; zWWLEQd0%aB`!&;+=b>7Y_ExybDwF3V@BGakYbMt(uyAeTP36WF<@ZRn z4OHk%TljjQ`$WE8D##zii!X~{+j;lzNRM=dYp8nSg(p`3w2A${SAZ(uo4)cjRBdL_ zYnAdpt2RqleQ~D&ecQZpMX%wv!|cV5h9YQDJXtz1u|uzjQR`xV(%wc!NqNdHKv|H}%4WGQzw%g$)@F-q-a#_zZ8nm4Ta6bXGO^q2+`AAhWtp|I!X(zAJr1rC7ds$Zo;XTT@EMq4i8Ot8u}7!tq<#5t5w9f-Er5?wjCRe$`%xnd&m<4Pv*c{lwi`e~!_4lW4wN`%%;gJ7 zew%B4(?1PjWd>Ood~dpozAMPg3jX_9oqE{GhHb z*ZwsOo~LSplhphU-O?EUuG9Z%e*kOrew>X`%U2tpDo zHsPzx9;Rg0{32M+j+#y5k1Tjil1te{oq5b@>))l|rSdz}Oo5|er2p{s|8bLy zFa~rd@aNLcp%otdSFcpj)rqWkK1*|jeOGMdx-QSua_frA74Goj3|5^d+#Hy!wo5pU zFS@3;e3BMA_0il-m|=F;v{Byco884_^P9XTGb*?_78A0?)}-4ISl1(Thpdp(8RF5b z-D5vz$gzsgUIo&P9w+Yb&a(;$omkBCq}m_sDbo4T>ME&>POpd4ibiSPoISTkzKDOL z#-ZyG4#*9jrgYLx#yPyXfUO(?Uj@y)lYLb5tkS@jzy?N|UR+?yyt{Te6FQd6D$}7m zt?&Fp5V$C5=!-I7lrfoT-u#g^`S#!9%Hv|dwBJFVJnX+W{(b-d`Jy31&8PJ-mJiML z?{K6+AL?J{4pK_k><8Px2WYL=g|B0BOgCb#&xoY0{JvhuG9-Mg>#Pb|WnLcBlJ03I z9gi70hl=@MLTqM_MzHh6fM;AbKZh@4Qym;QC)p_0#S!GI`7g5cPUbD7F=_>RnGu_| zdhX$EkCo5pEN$io6tw}ipwn53x6XSX(K8=C?YznNmi>JaVe)Cr(-^S;^`>dn(OJFE z{)5SlJzD|XGvR97Lj-Sg%MPPVRz=iEDg$h^I9e+7;4>M>+R&GCb0ge5e7lhmjs00I zg8f;N_x{N%1)zXu$`-tqR^0#Q+5f`}3n+AKTa#M+PZjpf=-g>98p<;cDIt7^P<(hy zutm;=vRhoXWOb=0y3nqKM;i&Gqaw@;brUI#Qn!3z9d1atG8cURVOb^amOKh@U_{mF z5kS6KA>drGQ9VQ9g^GMeIUmunPbuJzPv)j&ufM;8*BG^E8nmh$4~^XoWZhL!`wQ)y5JZXw=YJ3QQ(_U#_FxP+Goj42Dact zHZUY{jLA3F$amGo2`xMs;cXACa1<4d-0^%ubfFg9w#0V`)O((l+rho$N`$q*MW47zpz%{rZ+Nq{~{}oKg;rE|c%lLUoXVTl~ZbPJjiy z{*zNyz^B$sn(l`{=uI@x&gj=m?s`|b+GU-ON-UhCx<=^fP~rb>_)wq&EV1>rl#rvR z(L=XOCm`MQFg!*}Ua7J-S>KvZnKe^d$$#|mrh!-!MqyCw6*c94MWFl~JMwP|Ew~b3 z-gJ=DOu08vw759*|B+Ju9-1shYQ9KtCZF~q2=QNeUi!EGc-~L}^ZSM2Zsm+NY~+*8 zmQvd(Vp;ybID7YarvLYUywj`0tB@2T6xEVgDu*1lipWb@&I(%yIVERiwpS^qIV2T1 zt)iSQgvd6<2r*&~C1cJTWfmGcj!$4kVOIFAu8`UZ~uY8TWbE*DM;zAtWW(|YDZkc-h?*Dul6$;Z|u zuS@uS&(_Ix_r?4Q2e!Wq|787GiJT4{vU-Vl7@q>JuJWC|ci&KtZ4bb9eJlQhV*doU z;$tH?dPz!Or|ZCTlOKFZ)b?vEoj*MZevz7ey+hVWEX?FS)P7i=8LQ%mlN})#adbL)_Hs3i(LU=+7 zY)+E>4v?ySR@JDPIntYJpo%0kK2|3$g$|C^-oRI`lC3U%K1%$YS)9N0V+I|P-tDpZ ztuz*x`g-qAGFQ&{DU3Fon7^u|FQ%6`^&bQ6UoXz@1d`eZsY{60y|K!F?$y(!tu{k+ zxUs&$!H72(bgx)>n7ljrTetP$dto+kcg2hnVBn`D%32zhU=f?SUVi9C}(nO?QiQA5<&r~Q7Oa97HZtMnZ#hQd3h8z72KmXHa)c<;$ zHJ+4>`{=gz=LT-Ljr>EfTeadg$LrI0V=TEae0@x|Cm>$t(D`5~X_w?=y*K8lMpNa% zw#O%aOan90qmQQ46j%9XaTf2XKd+f6iWVIr>e~3joaV@RM`Ns@7K?Nn^{l9p(!ozy ztSu^OJpm9VRsJZ|S*MM@x^f4sXH=Yw6a~vIyxx#~d)v;ADQ%+R{srZ0(LX;6>|G1z zG9ehq6we{F4lCh8yweAASRZ2ue!OJ^;$ekt&gV7|5=`biWSblyVxARQqpVOxv_47f301!~ zl|I!J_#K6iIKE}StV41UXXJ4MkTe(}@j-vG=d0F++%Gq7}T+QeI) z%|d?p8&mzev-p=I={DGO_!5A;KL7o$Ze8H+<2S9U!w0ifR2%X*S2{d|lEhtIsoUjQ z$%FAF#-_R3_1i0}e5VY|BI3k*Qj#|58?(%8Va38YQ`;R;x^Y$HSjLAAr3mh26w2&I zbhiY`#oVx>ZXx<|0m?E(g8NMT9gbh9z@qy5dP|@F5m|nh&@+h@VDBm_cvUPZ=Me~7 z9De^TR^mG);m~o`RMlsbK{ z$pYE&`1m=n5(5_ujJ0?&RDN%K2QTqF|IZ}OYwPm2UNCz$&(W`UIObn0*#C?$#0Oh1 zX6tHR%G?Ux{Wluj@neXdbLRjyl$drP_U~B$QT>cGd3BVsvhv;$D`Y@&ejm1}+IQ+m z)X_kBh0qaPaQ;YggJP+hgehY@tpGEkq`g&daXHBbU18dKC>7D(%yK(SE@Nz8T7)jw-F#=3_dIztHrcAbvHL)Rk>Q#B8!mz`U_;v*CuH) zmFiDU&#`rf>>;?0#?~~qS_BlfTCgVV=etXC^`P+TLyr(09*9K{^!1@~D0svFriRvb5&rpz%- zQK~-h$RbMhvDW63>fAJN^}yf}mHg&=aiA9$)XA{en6%!u}zz^!0xkb*`f)AK)`d9M>E4Hj}a1idg3Wf%cHzFq@S ztYW*5@aB^lY%dGRI5G}9Q!-+61$@6}&A?B!Bi6mjkab{{ptR`J+;d)^d#0e_b6Xee z*aEA}OcjE>Thsfc+IZ)3<6i};fgcJvTHlxQzeDA}9Ob`z&t!ls4>*^3!~SpFIk10p zD^FAU>?Xs8L)j`DWEgEX7|pOsIYs^8g(UA-L+#;4a!7Gb(ZBVYm8X@tK8u~cu4SMH zpitG75ee;w6)IpBl6yagS9YQ%;aLOj`k9>7vpdMv`%tOV=ki<2Z>Cn&E4D*XPyC_UECmEtM*sDV$4yuXBSb5`KTLXmU^2)ox;=KJT19{{p_| zhk{u3G5zQZaeW}8m*7{a6XDTb{q1 zXY@)^;>n(sSUr3JoY)+BRNQYO?F}5S-8^-N_E6n@ll*71xEGwkv;w%`z&+DL;_R)E ziZSIBMbT@v+Y-9;D3)*CC~fID*Ot~Uqbk(W?&#O})h4n-RlTq1w;WbZ!J~Dn8=seL zeu=EM&Z!0DnOlqCI|zk|=5A>@!Hf8shw)?VzGp^#DS;8FqmYkDBl{A}7)uPPqLdE# z_)5Gzil#GJ0fY~->o0_7JOA)_jeTdH+JAp&-@DrH7v;SvN%lX1tv@|SFa`*!nSGVs z=o2a2zc;Ra*AE)d9?N>*oPCzknZCW;5~Y@XNTSN@1<)nsmk-3R+5PX%$K)A3d~b{V zqhTWfY^XXvp(H=VZD7nw4Ikm-gCBR&1(#dz-9M_~$HIPy(HpvK|8ZQVhqG`Nnt2rH z*RcK{{Thml0_7;b>)3wzd>CQdl(c4LkD$Zs0yIR|0)zpj|SdMn$c|QV-+wE|p zgu|#pxd19PYrlBf{n66B=cfDi61M&j#Gg6?bqLv-qe-3ouaaa8R#kfWhX z#boa&Cfhiv=(sQD)AdxbC=;-JhlhOotyFIyyh!DETuU{Ledq(*!QG!y2I&7G21opg zn*LH4(=SA!f?r#r7H5t~8AaJZFFrc&PL)b&031t^>k$Z1a?Uo^+34J;2{|k-*$mYh zzwy<~rU#o-3?ccgG3Jf;T|0g`ouoiKxPeko+>4Eu&}eQ|ZP}^Fc*~%I=)Dr;R(QZ9 z0#bT()qdPYzS=&)Fr+e1;f^@YDS>h{YHnuBrl``VIy?VlxH9avzM6~ze_14^`(ggZ z3jgjr|MIAf_UmuA)g%e7`+13MWp5>F{_&ohF=y1ylCU8@rOvpaUshEgd01mi&vm@EWESJ+<;&`gNUSYS~iFNDMX*+hfT%MRcb&dc( zxOtqZ<-i~i{9*9<3to8uKYVWa&W8fNC0uwQSN>pcD3 z7CSeggagte#R9$?_VP<$Qpdh(+`C2W=U;hDpn3Q2!mL-^8GjW<z;bve|>23+^I9OEHedF zv}{94tl=FfIUNjCt!ri~tRp+742oPi+A{*#5928r$g%wsl28jJCBv21=WSYI%moF> z!j9TyhE5UBM8VIq#>Y%$2DA77=t6XWye;Pvtw5)Q!A|WH)7#_xU#tl5uTR%+TC`h9 zJ3Lq%p@{uE++6hep>1$01N#QxtH$dru~i2r?^xgUd?==8tP_F&eR6gx_Pw40Rz&9& z0Am&(ne9ojVX;h6+(&?mVUd*I{aAyCB_ggQ{59EPKFVOyD-r5@18X>62s&S|l5jx7 zPTS+byjg`Q?f%X;dzGO(5|S+sQ|{e(b$%2OZxrOL>s`10?7I8E?(TR@KSE^K+M#?? zpM&Wo_-3OUO)rQ?bLU=n8n}Pv5Yt+L6YJQXmj?dKQjP>h_`3}4LkKVIF;CkNyjeg! z+r9BGRPlA|dccTaI7m@#jxB<>d&cA|w){V0^FLm^yk~u+vSC}-W1Mb}qT82t?%zk} z+aDy*AtqJ#?WoLojY#FII=8}27^)q1PA}RQo)2Ebeo%7%?2>Zd6l7TR`KorURDoHJ zF)<#5$=|A)UF7;(Y#Dvj+C8}b)eCVY^s!>o*vphdj;zK$0JY5LTRR3%(zEIzspGt> zFt2-n=3~pO0igM~+}dMafNbBYI&pHeLq@w&#WtsLDYRV;(s=Z-dzI36^OZica29aw z&2vt>bu5C*()^$Tfw*&(UntO*9=?#_f)POSM7M?#oXrP+AA7JmDUP+)GOLS6*I<<(^{qFS>^e0C~kvmVe)RFt<;ty9R>V2 z(IX}9{zvNbl8QAYIp0$jEA3Is%Az0DrzCowJzQX8z)ee;dpZJToFU9pEhZ}TR1G&8 z6?A=y7}+#ax3l`$G1ts@YX;g*alAya2n_~GUd@9*w}inpcgyRuV+}$%O)_9G>loQYA;bhEy33YwC0K;KR|ru8BAv0yOxyT zp>X5(;N5@AK>Sm{?OQ{ORlsMuD?T}~)+Or=Js*(27wWX@5mlN{JAjQ|$kjjZJ*Z?~Lty)qwn579p83PMa2*`q#i_s#(gdA5LJ=&y0i|J{K8Jw`RA?*nGL zq*OdZd&}%oe!d$m`3?B8%6xbNdDkFYMcJ@u+P)~SY&n0ipr$zu)=@Kdf@+bk>mIKQ z1M>N&QZQ^TR(o;Wnr!cD75tm}m+~B5fgbJ@r00hMGulxvBwM}l1G8+9kzV=H?3 zdC%FqUC3*NrrlmUC+hfT9?BfA)T*jH7wHQW+Mdg#8bJ1wCLP_$1%}Fqd|<@@gYC}U zZ=1WKJP?Jdezzs<*H@+!q!)dkM6S6UjxCC8t(Qk-1C3{Z%HtR3{QnMA|Hp1Lrpv6a zB@4D||7Q2R=}_QVMXVzr1+<6=c%=NTr^zwUrKBP51~>1b!o0i6;#Zp&9J&wdUKz?Y zZ)JitUFQ@$s63bos!8!DJK3R7;poTOi)JIMwo&htA^ zxji(=NmfyEq-bVSB3|Z9K4;zT*;BXL0Yw8MD-&leHv{}AR^V#L_tT5?68uDrKCC!S)LcNSJhEbW0c&z*ds+FV``S0&xh8&i)O#4r zo;rEh)v+Mk;#X%lyVedrQmq&dyBH4Rp$r6ZdJOS0EACKWhrTH!)&+7m z*)vG;MtORg=)~9j&xgwn@lht)r05Y~N*h_QNkDGC{(oEP-y6~}wxeO-sp#Z@Hio4~ z3{Vi{ue}&S;zE+nXauK9Z>&U;={jj%w5E`j~-Xf4&mXS>RU!U#YD+Z3h!poBj@Ms~$ zd5uqIau^{q@_KP2dBVdzh=ab!tj^iHU*Dlyu3NW0^KX;32!e#}0?t!Z=O&M(Aa$2` zwU|q#dJIOb+>pXp>=S~(-CiZ@YOpEq#mK?6I*mG)7@6dVNL1m%158a}`o&0(aIAlT zdUj6d@SQJCD;>)hj@(f>-_UTu^v*sNM_sD8DA173s*rNK+fzbGUjPR7(mue&5xXD= zG;wh#j#Y{yu;ab(WRGacG+#lJ1>U0+rrcK>Z0!m z)61iH3d_hObONNOw-0uzpVo&v#8cpDiwKayxXNo3`*EpOM2MH!K&a_>)A@*mscuf4Gq_^bET z*3h#Ej18`GqyUl^0ST=)f_@5Lxhl|zjB4Yf#GmV2p;_VV(2&qAF5@ag)adz9C==Tw zb4XZ(=1@oTYHuQe{vz&$fI!Y*6QvdX?TPb6!U(V3wF~aYB!1M1TuWVR|MVVF*O+>v zLc4b}^;?|p(pIlA$&k96knt$E_UW7>$ovEen(S#RWL#ra#e$u?X8^MJZvR;C=f$^beg&o_d%+uAeVI|!q>P#7J62+h6lVC7`X3KQ}gGSth=!l8X(#}U?CGZiv#b97yg6>6?BrAlmce@mEtK z>XOE=_izR!7P>9{S5X|+ep*2Pv6XwKzrgK}6`p^6L~Cf#-IFOYj(ch%pWmUmD`Lv{ zW`+0uuNm`JG#MPt!P;3&6m~vvs+dgEyLu9(r<7{#Tg|!Z6X8p~2ewbni1Y%JbJ-S( zlSN|%Gon%IQyQ$>?fTFA>05vJ=~?5W~NA&JpL~r=Z#v;2Wsf^K{HjY4gp2-g$R#e;=jLux5E&Rrm6rPI9mwS_4SqFNmR)=$ zyCD(<2~@)LBjdu`pc^r5uUGHYYMQW*^}n~cGt{}%OU~wyou*oKk<|%WdV1@*$;F)@(40lL0ESEb70-RN7)P-q>LQtzUtle@<>mzL$2BuS)rtgsg@O>{iEfA?Z7%)v zlCwG+S^6^~VRf(EvUb_POyNKwp3&WVsxqu^=@b+r2d6#w4k2cmD8C$;olR@CC@vGV zTMX(kXt}4yYEv9Pu}zs;V1zF+qpU=?nhC{Tnqec!eR$hgSWe`&XhCU+((1FNs_xj$ zP|(wRHSyXvUDPcSqw#4wy?g^kdOV%H*+OoJanE9ab~ny9Ao)` z8te)<^MQ;-$Q(&}4P`50$5+7ZY+O@Vmf8OEK`E-S@hf1u z->N6&K5BhtD^~Te_i-;6+Jq{XD;~@tMAS{80+-}V$OV|a#Be=%9K?$l_Lk9J$l*}8#^UZ$VDEiK^qM>=hgYkOpA9^!+Wd8cAHA>Y-MKRp#v9(s zW;M`kHrayjkUdWB%Hu5bmK>OJGUrg^uLn?%)oR81U$=(&#)gL^_`|qgruPJ5JK&1? z@|u+;wuYkDhT_mL1t@`b7E^Kjr(F|m%O6l9XuuAD8hmjiq1hiEOLUDg*ES7u({>YM zniFPuPrUooCc#20rM0&O@Fd1P1Z*i$40j2|JWDzpKe3g!8A_H+Us&uoFv&zzPD14eDD8NVBasK1D#BHl zzsj13H3icea#iICd~1tLW#hWRFC5_8B)6aSD8e{kvkR_iLM z_#MU-A%mMFY1@*w<~dbxHP|LLT0Y)YX^a@WNk-|?=si7u` zT1!Lj{JX8B?dSK&Kf}iM)H`m}#}F6adwNDr>+z*lF#)7#q3b`u&bKz_vS7nZb%u%@ zTbr%Id<18d;R_MPq?w&6kK^(>idtTb{6vLb%k9E)CR zeetw~6E8~Rtx*!g{q4mRA_dNa&4+d8{euvM`XdAl`4o_DDIng83oN261jf(7W`k?- ztH@*%Au>N5$u!MXApy5mwKL)mcrUy=wM%ns2{eWa_sm5>tS&~jh4s5_7d7YO3&IH{2V{Dq-IHE)&Gim-9JV0Hh>e8}ek`v{f`c?9=+( z)MLuzc%(UUB@K;ccId6d@rMIZ;ZVh+FhCFVd&_9+wJ>+uJ;laDF=FNZ$LtE8wqA5(?$ z13Ar}Fp7V$4TzMQb1J6I#2+z5_41#TCCA&R#hn(sQt%x^FgjOeefUp+=d1Vg&$rWa z^hUSnQ}q`-!c^=VuWX8kHL2kxa>2cMabpzEgS-dceS;P{(m_Qjb<0&I0lvZPZ%dVX zBJT~mUIj-+nuG0jcv;xvGm+(GraQJFZgQu23EL22oP*gYiGF+j$p!n1q!(8%%iG~I z)sNHaB6z^`1o+@;ZQEBkm5#OkYe zN60JvtIQ(ARMv;F@5)kM1Gg|>?XH%ba#ty4 z*jmO7;2nnV(lVRMVun{NFNS^n&7+2o zSYTsj`fQw={|b~e#T8G3AO2M)1M33Vx$ z!)G+dzv+c{xf99pG9?y1TWL;0{Q(wNYX&U+^AC6J_uH#-%c8|<02eZTOX(QD49Oq)F%! z=YqqmN#y82U+9L9U(#8nL6?+%N!Ch_q<4(#yOqznq3SEN-i4ib|FIRg+_U7fNnJ~? z1nzaRwafs3pv(aTRruuR%{J@yIA{hl``L>W4aZsIE6|=|H{Di{sh$_L1BR-+LYXdd zLl5{vi3;8`NyP=Nd(lE(G5HmaH>5^gEfc9}AWjb@0-7O7V(RXV*b%*N?Bj{lSFtHJ z8zOR^dpn@Ad=;Pg?TnFC77p8JY87MK%01X6k^NS%^33_7;g*h&k{(`js8xrUsPtJV zXL*5q*qiGm;LnX+1?i^(Gt}$Szen0&WRA5K0PEK*sTs zd9m!@)`|jakdIv#tE3FueC1eFS1D`ol9kfx?n&=`!Dfbx84goK@p|mXcZ=_a#dp>A-KzhK{w{fcPX3$v1 z5-!W#ytvl`3ti&&f#!liTYB!|?n*ErQ2wpOtS_-h#(U2WiiaXmFW(?wGFO&d)asA! ze=vQyKvqRk{$;k%be*VK00VLWfSWr154fq>KLDeBc@%mKKv2vchE_k~)XS=YK56DP z74joTiHFW9R(UzyC1F!oooRcOuNOG5w{qkOi4KPb%S+6c18TM zCHcBKQUI=%-i0o9(B^1;ojio{mX$(lz1L?|#r8NQ^>=x|zb;Th5Z|(1#|B*rUXu~E zZ{X)W-0JJ*Z7S!8_0UN%2)!F;nDr?&;0bM7M@9{ADEs#J;sDp-fobbJelN`aE!&Bq z0@?B2G(pSzY1sNFv1h|Rq*6wPFO+hZtL`Bhv>u6O%|(2+)Uv2mApQ?iJ0P3Ia6eDV zl#iDTSo&KjrS=&Nc=ov&td;rl=g8AK1=s^g$TZp;@zZ9qt86ZH|04S=nGwB9c4}^U zk=sPkz~S(s+l>vnyeF7T{u@ZTx>F!xgy2fRElyH$WQ9mq3YNQPbu{8ORBds?Gm4nk zJF53tZ4;fv104l0&oK-4RD=i4GwIdle@M3O13+~;zKj^DpoM2k zGOx%fARizT<>uHLV0J}(IrIwp(hR-Ne1?5-7MXsxEG9BzGE1t0+^1p~wJ>?t9^5y~ zo5*Idu}fM|*5ut6EAe1hX+^c+c2b7gTokA5p5W1@1=9o63QKuSs1AD9nQ7DF&Ii78 z+V17z&WRNfpve zi#fy{irZ&e!FUo&<)1M8-0t^vYFWGjm;s1>F`;6nAYb|Pf>-MFk;yArAIiCNn`}$i zkJ9j&sW*-lY=6o<9n%!rUk(S+%(hyKr{=9htltg7S-khxNQv8)*12Bg%L|AwnR`-) z6h6FodW4vaa|SXXm!F0hLfF2t6=<6&1y3_e(8A-d z$b07;b{yO+}hA`>cJ;{)y^+(Wb5wY_l10xsk{$QjtEI8iQ(4S z1uTyCcK8r-_G|jO*y?X`UhVcQxqnXO93s*X4$XNU&`#zQ=U(DfA~sstq4VCcPMSj%;MOtz~A z`!H4W_H?)DBO}nHP3)z49>LqeKA^0E-@$$p>pB>hi9gf`w?CEP_gu{6oV<_G*s0pR zfh{G}7IF{y1psdCtlz$@e#4M;Ol!E1m$ueZkNrLouSS`<0VQK4aVZ4;ilv6qaDPxy zt$`c+YFI^J$zBs}(WgdXeB|8EuX1(U##W$`@~PS#z!A{YY{JEQqN`Zw(wc6RIXV;# zmTb_y&;JBT0bhGcnS*nu>9v0DSa>G9n!{6v4mt!CS_n^9&_ z4&!y&OI0I=c3iN*(FMymJwJ^TpYQUteJy6hS+mn7pD3MJ!-1nIug-snrzk?c#(xW| zjom8*sJcnD6r9GuFK7D#z2W$?q5{0L5QsWv;Zdf7i?PDzsYx?={cpAUOZqa(r;qf%L*&Y_50ykcxmiQ^ zAy)kWHbIQV_Xa^trR7NPct4<@zb06VG1l%rjZbFdkm!~EcHA(NKH9N;sT46{p7JZH zJbSyDeedBeo*yHz&Hq@glIqY$m5(1r0*X>(Q5T9WPPus=F*ddg8~Ie7X_Gex5g7UBA)vhrgZYfxh{8Fu{7e z1Y~i+1u;J>rAl-u>mk3TswN|F#v2>ZN4u_Kl7YIb*fra6Gx&a03?G?~n)1wcFcl2< zg3GUZ4`Q^J`t5cggeF8OngQ(vG4semy=zlWwlsB$>Yv&&=l3#6#`9wHLHenhl9a6( zK%k0)vSw04KZBS2oXZN{%(dhju;WiVe~YK_EDQqZW-Du&zM)9dNG*wJEB}ydT!m!- zrxyUB^!3j#@K2T$!}>fsP(JS4@C9XPgN!mEn3xJK@rG!Gm$eSngKT9%Fxs%kJj(Y* zFVz+s=YMktF1Jx-^7Uf|R^5Kb+v;reinm;r&WM}M(yxSV7|k7vK#lfAZRnfjUL}jc z^fjvS?UZv}=WDweH9d1v^d!%quZQE`ST~0bzIkI|!VR=|UOpRU7DClsqSR@zBr}ZR z9R9-C2p-{7{lnsq7puj_y;v(?P8NC|1Q87?%FZV10_E9Oim(mJrHGV%d;|Goru82Y zOMjX!J-&J5$Y#h&MGAo}1!YOm_!QBSXqf_+Uz=odcp)>+ddqv5dEPgfU^y*GZlXdu zQYwhh3NVg}FZhcL>*BNc^ebX+p^$o16eW`h61o$|q>79=hRZRl8 z6PWvP)JD64hP4W|yNr3UA3U+*jce(wlagVoJcJOk3YC(D?Gqk+8&O}OH%A|WL@D4z zQW!dktAw64NAQMgNq+JFWFw3>Lxijp659>B;znZG3)?X((|Cb^9&)2ppP}Y0>uoWB z(1H#4AJp1Id4tSxh=q zm7JC4N!^Ap&eVn)07q$JYPnX?Da@@;l20>W;Df|y9s4?$u zk^F!hKu-eUPhdm>=gye++XE?7pVA@rd2Go$2T^5iex0mU>DAdew$7M6R3A~jY`~QtWn<mNQxv-SfZ`~!Q7?=9f`$h{oil)s#uCu(y zf`^gBj^L#tibrta{QayX+PlK{Ewb%YN z{rKE{?=>`z)!6U)1#;BuWKQ4K<28fQs0W9MA=w9WBKl>AK&p&~S%!Ruwv2t!LegS_ zA*zA-AmD4fEd$Ta7Lp1J!WBJXRyeDR zpJ0Oi^irjWDeR6P|h%A4aX^Un9EbjVuBPk^RPC}NOs8sa-dIs#ps zZMduS&@pW-^4@p{F;;%&lAFTaCv{~G;2^XTi;B*TR zT}0nZ(|QYLd+01uFQ%YEwag~EOUPmL5B9MS!{}8d^95g2a?9jEkepL?wS%as3JvS7F1VZkTWaCaA^mTQL+7zXP$dH~XgJd&$R4+I6V+O5mY!3&;pRpB!{I< z7J^Hsr;x=|fIQ2bW8hBrAM8KNiLa;!E}|!TKe5+GMQlTGUbUyBEnsz|jU>{Ap8}F|$ta!-xHP{^c+ zq+3B+3S%(=PZS3}*K;mh3SK#x``yXWVV;ud{ZYPiGCiojN^#{Cjr+sLnWDc<3ptpD z7hnOSfXG%i$NiHH(Oig!q3C5wYZXd@7GOsaYxX2ol0Sdm#~&zbb)JnCx+H}XT6|5S zOd-z)E;R2H@{%WWmUs{7jHU#&mKz%15}#GE-synYmpdqE#9Lhz%h(T0-BqiU^d!Vr z-|5fAVJVamB2Y3nJ(j*;>-f#bY&#}L*;5Q@j6-5$f*7gyzcyU5tql)?TwlRN8uz=` zn+1&*nN~jSZlEJ0Py`uXIW#b$e~SXQ>{wL!!oZycW;YLVJ5-?v0ExMTR?ec5gJreGmU4t0QCL4P`Ssx-PJcS(g9Pp_Y}yCW za+1WIO?NAkTZZy`p@Ng5uVEwHVG&0MJ+3pt>k7*N{cO4K+Kz^8J5Y0ON|DSU+}g0? zcjDS35gRP{L|Y>{MJ~R@YxS8W`4LP7ZO8{&Vnb4=k;(bQ!hOnJ?|KZZzm#|d<>NvnT4fKIT+cCn==0DqXD)r#10NG1vkAp+4h^L0iu@%2XCynx zGCii0)A&jnU6FrvtX64hL2JC1EF*6r>%CY};`Y%VZcrhk@_h@GT?7-%L6<1}VbRI} zMxcY4U;7R-*>E=3$UY$$2^&8K>0 zfnu1=3FMCMQb}AK{3s{R+`K72 zp2}-p)FSn@hCKXUFoU5e@uM*u7$S)$8Up~vH%FSV=Jh`SowSY}DE_z-hFOJ+nlAH4 zjWb1Sq}5en7lOF5s5bEI3cUC0N*4s=jImUz%s@V9S(`c`U-T|~#d9cAW+21)W|Rdo zWM+ZsC1=LWtF@@FpPGgbb|F1c8IygmJrom*(gnvb%`xrAwEC>cf`$U%_c+ zS&Ci}ixu+~55EOSC`w_ggTGyJwDYArr*QUhF4NhL)=)obHy!vDwLmUXX*obb$N)w) zS4ET!nT+u_99zPI3UX-KxWXPqDxf=Fyt2iTNwg5Q^kU4BkDynVOD1wpt0$C+nO>7s zcSsbgGW9(ecYsTN2tF*@Yb1dfiMYdQmubQzWIAu1V_>1Irt2jpn%u!JM(jn~stBfL z46VMesK(NQ>*=diJWHoGidfL)Sm6iU+K>3_N#aof5Zvis-~ZFp__ZA=)y+- zs3`!KGi%YzEX>$isq1Nj)m?a=qx z4Ir=ig%U)$CgF1nFB?e3v+S)=ODj9Y`741%I$rQ76D`Kq7>Z&HuWXF?GGl={3YtGj zi)QZ;?cnd}_4k@?p_X`TPrN_pHwU3KNPUSZ>3NwH?+`#KR+(yM8ow&Ae>-@bYK}LN z1rhZ!S!5g29bdd^r{{v%FeoBpc}>*zJ3a)#P}f1RnmN$}ETCaTN#M`-vHw8IHxoIM zst+3m{`7W?M&7=ixnvLHig-GrDT?UrK&FTl!YP<%Z_#IzFbrQZp;M$jM_7f&Gjtx# z1mv3FS872p)%0C`V0aOYj0h~oYb$Mo8nDRs+{)+)E(M@vMu*r*K7aB_twjhGY;rSV z3>UE+gubK{beeE_VRoWxZZw?s2akGg(k&9aKt^IvF#0S zl}+r4*V0RCQp1YPIh?6{o(mS_?OnLkv7J^wx)e*h`UN9~USSkb(EcS5lEap)Hw=y{ zkAk90;W$N5eynH)N2=k2qXbL@#z!1 zuO&``rZMAs%lotj*$VRPUw!nL2Py}GcEgr;kt<|;zU{Q8umB17r4`;I>WTOE1qL;| z^y&JE2d~r#{cE&5%~IyW0T?@{60WPk~>o*8~*8LJJcaTZfi~Bx8+8twa}RM&9+4H8tLk z@{*%zAdhjs)1Yf){1RTpbtkhTyvKD$%kXQ6;L_D-mhw71E~#o$Fh!)CaNqreg306 z$k#hko*gs^a4^iO^txJRLINq5?l_Sj0wX<(w)b2<`zn*P6TlW>Tj`;LK{>y+hW!j z9eFh665{n|*G}f4+AV0SB+oIdEzSm3=Gw7m^{OjN>7IiVcDDI^Vo#6B3|UqMXqz!h zx&YCf%)){0fhfP`9v z&axyyvu8Bf1Z2`GfmuugwumNL!%UHunxOnT(Z~Qv*s0W$zxsA|b#1oi=K~d~YKIf4 zl2=v|y9##`rXhrEgs57?`7RQG`5=3x@1zF1MdrY>Ha?qKh$xJ`Fvyguq^evu_rwo; zKx>y`>ps@XF7Yybjfs$#FYEN!+CV#!(bt7Z9sh@>ADhDMP!6saxW~)%QEt_V;@aG0 zUTISL?3BO%{8@e-T&pXak>G!cKh}X!U%&9T93f?Q&4uS3hfL&snNUB&-5fBiN zA&C+Oks(!v5T=*}2#`P$LXwl|oZpG<`>yr-^ZQR0ECMT>efIu5&$FMs&jYV<_a6$g zCy+$D(|ObG!{kK57lmM1z%s9gUe6cR0eeHeg`I@Cb6&hoeBZf{y-M@7+6VU6IDxac zjrQA|yb1*SVxfHLpHJZr0s{${!9#yqniPN(xq^KRaMF#f>k#P6Vneg_vCKphbbT0i zNnRo~EHwnM=l>t51No~jssDoX^3~$@v3V}f#$^JvL4~{MBEcor%&?TO4!N!s5W{>_ zaA2N`ZvO74!?EhV@c>SW z$QsCxHSL2gb_%_erGe~M4f6{Doq4`3Ue_b+qtAas0Q&UP3eJw&ikZr1Cqk6mncmPz zUvm9YCK!$J`3Jmp(WRJIL#}(f?7KI9aVu|h@l!cJ zH}+|TZWYw}GBlhoV7;hN*TI_K{lM1DO_OB)#C=tyGtxWX#_&U|5ue0_oK!F#yuoP9 zNiIKQ0%qH(vUV&|xB*Q`h2XT(3OVB$MkT_r#khn~8>%7#WdI{93R>DLV51YM=Kmp+ zo7R0PK)4*sRKT<3Pz`$iV3cv75fO@$sk8dGd`!q89foC?i=_&YF2YCT+f+6Ia;xCr z-+LK}nl#FfjGI&al|1$-$MjI#QTZp8Dy?rd(55BSKLE2V)4j_m*&%k9IXHMbDh7I9W|zl6q|9vSbnT z;+@46tlQ@1=l#D$-?%Uy6~M>zW=AJ2@$X!m9o_oAL=up` zo4Qhwdn%N!T)0{>O%YjR+zJ)^=Da;Eo8w#Qpk}+K#kzO}s_5EIOTk$uzhy<&Q~~M< zeTRO7Rs@c}JX$=&9fC74W1AS?VA6|Txw+WRBF)jH9L~{-nme(lvfyy1-m>x!c3IY? zp~QwSsmPqxq_Ci~v^GuGTo_6XY3+OSfCFOF>3ZL-G3iwa5u;r4a(N|(kuPM!_*c(gfp zO{UV3dHz&W$nzi_eFr7dIlj^2qsGd(IpQ_EI4F>4s0=s^Yn%h*V) z3F7^M9jJ9>xr>Ofg`n_?0BW^T%e5%1Ad`E+uP?gT=q4)neF?wKe*Yt{ygG+^oEYnQLewTI4?>`>5zQYt8KYU1~ zKxSaVHU*V!HqM`n0?T{@*5!cF!p=2>vICTFYW>KmldW`@&1;6=RX{#i8;0k=BKFBV z{Z=Cx`EN#$IhyA0eW@O^xS$l{d{-%ADt&Y>m}+F)KkosS?uoV44Z#x)tyvTHqOkkb zb?M=Kt2rp>k1^5E9&l2a7ZGhaf3i29G&kL14etgecH_)tP`;Njk^%n}I*9=8A-(%M zb|R!HSY0iV)7j-qw0|<;RB4(hj4SW~3{Hu#N!pY#XNr)cNbsPcJqt2*rpgBmyfL;0 zs?lfJrQ1DHzFmQO!LT8I zDAr)jgPyl1O@3_6y*S;PQIXUgAD8pb^m`r+ISVYPehw~ZNFDyXDw`0ug4E+?ZZ z(e&3uC#0;IuU{1T^fQH{bqdDc)}s1;uD5Ef&9Pe1@P8|_aEwA{!O~B}Hy-Wrp84I# zz{JN3E(LXTMJcIG`79auqHvwx#-;3BO!^y(-0yu*Hy&^!FT|m#uUj*hvMn4&46E#d zl88D~I%aQ-du!<`xBe)&yLGiVKQDy(QHRqW&8Z~jI?YkpijI2Mb!a zgJg^?fGO>fkGQQYVB~_e0ZRPvQqI5&DjA8~L9LtukNy8&G}{LSxTYZiE=8)zQGX}E ziNF(bLiAj_L;yVHH<4;?U5WGyEcjEM+x%57CM4iQ$n7#?`68WAVo~iKAw}*i>LFeH zjs6aF9mQrJ7(V_A$C@u~^&KR9L+}G9=+fUy`=M^G&$~_G;Lp;B)duK`Vj|KD-d5t1 zk(e_J(`f@A*12`}JIGKACf|e7uiOr*27;M0out$MXV>XP>^k)y;x23#oMsiBLaqJn zqRYm|F3DAc`d`=gZwjmG_^FVyFJ&!sni^a>gp3fEp^d6jN7+NIZ^AkS#$a*%nT8QX z@9^bR??TWxx%a!CRiSAr64@h~+pN75#w}Uvp&TZFMp4Tk0CscO!F3Ij!s;3z4V)d` zdhABS3RfaXj^6CoH66Cj_HmkS@cB>j^i`~r;YiW5t8b5myp20T7o&Pi5dY_tS+-8W zpg`>~C$U;87l!_pZD}xO@g?$U`t;cC1UBC!5r%F=A$1WNmb5U7rD0q~hF3csM}ihY z!nuMBZPwg!tpG<3*Fcq8+FZU*V6ZhaR)!QzLiyG5j4`)hdvmr0^7e4=&uuBE`2bpD zVn{-a%p?|4h0ecO{8oTrEe2XXGdWTaLooU`WVwA+b{ihIHlx19x1@V3UmD zJ&|@HhmiWI#j~_0B-WVpY$wD6_3lJKp*o4SQoOY;HL7$i(p^NeK*akLj78nDpv|^m z(gkm|+sSd`so?qC^H+|B6gOx=_0&nU(fM8|QolwbrD2ZgexP5^g*K^W;-{MS$$8t& zWYv!A;*wl)YaK+Mt!a>zT!23Q1Cist9B>%={pxpD51CvO5YBB^+a$`4DP*5qxE8L; zofJ-#`gtHT4BM`)Es)>H;QF>G*W1o!EXR6Kgf`;Ma3(Je{28$hIU^EQ>0XTp!^?Jq zz&r*Uyf_zE%}~zb$S#A;zarC6f;!jAGI#`dEt>A`<+!(#7`hI?@T!(P5riTsjnRAK zaTxi=tcYsujzNC2B&)y~J^{ves1#*^bk840vOd+-3UNv|h;7ibLypKp0wt1%(lb0k zuljN+1xkYXCM|~nAZa-g)kt$4V*@hC@aDhL(@1nB7JGZ7r_K49=yQ_^$V{9XMVJ7m zHIAxyjeEJb+K^LmWDiMj5x=E7dwe{~TwOyfThzM+Cha8)t<`V2DmhO1%E0ZVj5jep zwFwP=A4h)f0Y?El@Qnpkqce=LVfVa>cvGk0cNHLSgf|w+apZlxqYPY}+G0e?9o#W~ zy_$AW@3k!Phm5S4Zy48nJXRu85ylNN=VD$SdMXh07TCzuuKkn4FGnJmvX6u3uL_L2 zMx*`ywN$mx&Z%GPVtdW0?saEEF0qVqw(r{+^uUn-#-W4O`5qh1L*(^nYSa!-Fzl$@ zj=c_w=RU~Or608mZg?PpI%Aqf1Xn9AB#HvPS8z>rlby!bk*PU~VRmqhUvOM^|7sh$ z$1^`LZmZUga1cbEPET12O|UvL@$7c%gwQ=`$mfYprRd++vV{Y9!eW3Yzyg-Z>2tuD zM%deDPclqNgJzL;jL7pFCGs&`!`e9koF>>cXOd=SGl4l%Z)9uoVmnPEfQCp z4_a%A5a8%)ZLAsSpd`uV0Rn^807JUzY{N9`eXUl`1ON;R&{7kqlX#O6F%GZFOR0M; zzya#kOr`0HLY@B*aZy`V>*M#uO-xuP&nP8nU}?y9Y)@inueSAmX}>?cP{TbFTGn$Q zu@kwwc9!)w1$*vHZuyWuJl5i4i9}EvbqsmlPHcCc?pC8B87^2Acvk$bZl`E##jYm+~ixr{;$C z>ATicO9XVF-1ei(j{;M&R-iISK9}c_a|!Gz`iIvNE}hK`O39HS$cI3J7xtwfSuHoP zqkboivw&GcUNZWl*EbXao0ZH0)L2=yu|dwB?^sdj@P(;g3I@RQ+fq9<`BMpLW;vZPtx7aJ31gC8;ICRj^J zDQy9Hz`TVNGPct^2cl$8k4c>+&UiQ6Ri?N21Y^bJ(FQ;2bDJa*yE!y;&RRXc#%@>N zxeqaqPsZ$OtOtoir+L@ybKj^2&Q*&%PfTRSDQq~)B)dlA2U|xZfxd<0)lWP|H`N&j zP-k2^+5bUB{i*B7x8yZdJ_xfx#BHfHAzIx>D>y(2u69oZrzh5PV!D!Pv2&j?{F`=m zSrLL=5Pu??Wje0qkGSQvCr{Fm0(#vI4BuGxQ}As&#HtucRX1aJgJaY2&A;a*i+VXt zeZD>h?Jdkf&ev${57cVe@SyN}tOEVLh zGZE#2|D&2%-LTp;EV>226b&P&Bq2X}G5kUV(3D zp%CK9!VSWV;X!BL?C=m^A_Eng8u%{a&`vb#LD+k7V|#}0;B;#*SIyqadVR4ou%L|j zG{!XE66vKH1`@&kZM>(om)|8`!?i0)Z70_xl_m~MTn_VAPOL?saD97TZrSl#5}7sL zSItxmwh`Qg>n|aTZLB&bjcq^gJd^dJb77smCN;Hx73`e}&Rijl-3U_ou&jW|t7s?2 ztydZ6UGj>R!M4h>j-P(DMdSLd0Hi}EQQ*Q22A#`ASK&c}SH@iS%0jafTu1?OFw z&%(;J7Yw+F;S!g^w4H4;g*#c4pa<;9E}U5-LyLoV>XW*X)^&ag)iy6t=T5OS-Q zj$&Inoh2n%I5jebVYuO#&Q7dbtkR^2GKP;|xZhd}_d3-!$)a~~FJ}{881OEP8aNsu zXhmX~w%C2=X4%4C53NM-fUbqsGy2OfM0E+)QB&G}bUKIXM!l#|p#S9Eb=sSidEfP% z-_3i9tHX<1PD{gg;4yjKAK+)ZebekZ;n(mkty0NlYD&IA#=#MJ|2Nb)(Ji{M~ zR!jKOWhH!ZwB8}O(VS+(rbw;82cXko5@aUugt3)&^lZx^j-)vGBzKuUs|kKDK*%I6 zK34r0I2?S?JufXNxv2$b=l~>amjn|(GJN^W zO)Ff%AR?Jt;>HGB=qa-wzJgm=PcZ23XC|uXwxgn;Uo9eO-&o`<$c}oswV-hYtCq_4 zCJtUpy)tjbn&<5Fyd;z$7-^|vA!0FY-kG%N=O3&~Sq~ncY#aE7igq&^=lhnHoD4f1 zh&(XZ46Z?5i;&ihyU7fwSomIkX2|A z0fqqH7X<7r-i8f2zs6wc(tsjO>NB^4%9-@xcc@sQ_&;Tuf4L!jIhG{{L-2k>h|Zm3Z;Tgoi~7=X5U6i9-n^HavGM`F82^QO&WfWe;$ z6!G}xS}KE7LILuQQ8W0YO&VZ2j%P8tg#-(<40Gv3lmH}p0yfs$BF%}4flL|1sp=7; zDb+-?PK9qd&iw>ICEAaXYJws~LlCKV2?qFsYM#FJmZA*3k)_88Qt&v_`IWT_b>{Pa z=L+|okz*V@+LUYp95S|JojFZr*+5RBIUc4jT7mS}~|1La*-# z5ta>*k(vBlJ6KqqfkEBdAd~1M2d+om_>!19S>&u*IKT{BA9hM!cm%&9lVLF7QV1gM zT4e7YcX{^qEL=x=Tu)5ftsk$a+MM!IfyjcN+pBjPg^ckdUdHo6|#glNR z{2#mI<5z7_dutzWm~ZZM&|tZRYzw6Qg$dUwS6iZ~hQpVyAfM6+y5S}1_f$@cI+qKK zEI;cS&&`N@D4WRiQtI9>_bnH{>XgXIfsz(Xg+DoNexGXQR4!3e7YfNVgfWV(>Y@!N zP@Jfoump?Z3*w>Bg?XKx(0<9!(r8l_0} zs}e{i^2EBs*^2J|%1}swKrsond55PTIqv*hbbpxrUUlgvI%0|HZ1kwWU3bQ~k=5f* zrB0+ zfny!M^%uvJ-`NWh2hn}r>fcd+yxQp!GZ3CFJpMBKrt6?X&+;=~(jsN}tzWA3o7XxB zaZy#7Dj@LYj_0MvqF9T9fkJeJJ8Omxmbs8?z@Q9omu5F~nLWA2s^;V#(zpftB;xP; zLm-aK-D8Ou06odI1DH1dZbj=WOifqm(HBiUToW|mFtL8N;YTUIE%NqK@Q}S5hSlr_gGA0D<>0$?SaCHm)RFEuhU|w#Pze(VMO``2!|fcyX(7J0 zg$ekOv7eC))bltw6XE#?^*4o?gPVl^R$}O50Wt$m_hL}Xm1oNZ4~i@1A!#r$C=qyF zer=E=&lAvM65r{d)G_>&#L#|1elNxJFqFqI9l^a2{d(Hb$*6j;=F5`AZ=$-6jjivD zEK7-j%Vu|tx?3^WlL;>G&y8&u>_^7pAE&Mp1x3}&*Mz1b5}jiFrY2>mf7`tfCgPo~ z9Y{-x9&ZUeP?-31UyB+#;p4ud(!Ac{(DM`C#p{S3WiYZZ;(!E*S!%4Y2wBt@KN36t zN|KRh>KpE(Y+U_aJ}qIF{k?1&lkI*gH_#^ny_ux`j#)U+OcfR6YSyzng)eVK_m|&G z3!itZ!X03D(G2eZQK!A|6;K)7rumZG95+G{EVLUh==DDS}P zll;~@$!%{gzTDDESqH5bP-U0P(;r}};PBQAO1ZMH;%58M!Z;o7rLy44QXYNSzQBH4 zn>RDjb<+75!gtVyb5@4;@lJ}nS>E=_7g5BuWcpXzVqP9sRr9x{zl*Tu?W;#j)cvRJ zTX9|V$<`AVOW8HgX3L>nY7IB(y$;$JOQ*7c4huqrZk*t~ zjWPCMdg3b3Cb5$EwCm+;^d0m)ZZKmTN&VhUVugP%mUz(+IecPOr6jG3+m=?-l8(m} zz+r{b?`fD@gzW%}h!M84Q@>-=#rakxTEop@^`pJgib)@8l!b&v-_S31WE|>th8~PP ze$Y)wT_(G0F|y^mszb+(KHDZkuEgvpXd(}+*=Cfa^IP}cC_EoL(@h;|U1iVmp@ZQZ%T7A~E8B8+m-z_{!D-c=*wA3<>ADr))sczV z<6$qaa;>3yjBax8KkzRu-&c)_s}oyvMZ)*F^`te4r{yef8?Ba57bH$LnZ*AWuRuzk zy+F^Lzo04=7|GEwHy6&I|q{D+a&5!}AR>{fBoA&xNjELqZtoMM^{Zu=a`*)hI zFfV10Ra090fPV<}(cb&#tE!JSdd{*_D$9f~)*Lff2_TN7w0r|{^V(y*p5+98Y_L01 zp(_!wZNrH%*X_=|{1~%CG+0m<=X#i&*zjiMYLB`%+DVb>!^AUwXvqHlY(K7^4 zcDSr$aB}8j>3Zn2zT8xOH`1g%d|{_XaA?bo`0M^?rwzKFM`~)9NRiE~_;WyiJsSdZ zt>C`WO)FR@FZ5isu}VubcOm|6+h!R4E%F$mY$~Xf&-vj0=I2aU4jP&k)+;?c z)!02E4Wv$B@J%I-kpciHVc>*`iyz=BV3A5zZD^7(npDmVYR=0MFH(DTuYQ z|1~2LnDBoq@bi$?rP$m6RbMu9FC-Lh4(=`Z9?+ftiRuwu;*^*0(EaVW_olEjUMkgk zWI%-EFMmOx9`FAJXA?qQZ5=+1{W*MkGa$|+tmt{ajX`@S=6!PDHpjx@T;q%+gCZ&o zq=2HZ8XPf$49!n$*72tl6V@Duib{3$D$S0GJ6zv+4q6i0rQ_eoA;P=`3iZCwW}mvO z-lzfe!*JH8z*6IYn-OWT%Z1QOE~D|YI|AziYmB;25`c@BFO?YfaCx~n&z+MPfhtvt zlF1;ke#)e3qFxx^Xq1`cLT3rF`ftHyWK)l%GZp?lx0fy9vfz3IgM5~wn?~)l+F0x5 zW^#z8bGaF%;%P(27+VXC8hTlPaSnupM_@AGeHhM!?b`$rfpfK- zAyKLNO1B`>jO|kwO?Qw@0LWU6XPI_XYSbAoZTOhJrARlah35MYquDMDP@<;PU#N_8 zs8Ht#9<lVp#fjCqkb(@CALBFyUwQ8)AHSaX@U#Tk zPMxlNu?L4|rCQ^`=pSP~QoHcRg_*1}`pJ+ZWtEgdkc?(+__4@}O?lc;jwL4@-p({3 zThH8QYHJ6+&q11$%zZAU=qElIgd6^a_b+D4qT5tP)hbqR`QotTn=?_rQAlU?5-;@DiVIYTqJtttrmgL{BGh%h(Fjh&1^ z*@C&~@>T7Bz16IICZPTjJg>_CkW`S4b5q6Dba>8y(ij6Jh+oX^+!0P3WU?f+^CKT- zO&mamM?!npz8{F+fpA+Q80;X-3hX?o;_O80nz>G{WY&*N%|#lQerGt1>%B8>3Ho4C zoMLd8^9Odndfj_3tpMvsCV4A|*_Ec!yrLeesIE?tRn|s<&87^^=COw>I(#EB6{cz{ z>}@zqv&wWrNqahCc>n5_Yve)N%7XLDOM38g__5SW@1&0tKF&oY_+PUMSYf+YDRX*0 zum+lr^ip=qm7DWagsd$v&xELcc#H|1=BN6|JqukpkL+U zpRZw^)EW>=3@oe*RVxJ8zRkvqCj-)^gx{x9x0WC8fxiwWZDAUTZzd-hlKqp>Y+Rr-T=D0<|O;NiSXMG`8k% z$%SbF{Ar+(-qG14s39_GVeG>oCDH76xp=5hn~SK>CJBW7Oc6d~N|TR7*Yp}T)R`#( z3F-TdF}d1j2FZ*$|4a>XL8N`JdclhVQ`Q^lHe5ZV8~Z5W0aN^VL_8~9F?T)8+P4oq znd3}n8UhfoPr+v4qUt6G9<4YB$8*!%Bx+v}SqPY@8$5|Yc_>@mdkUSQ7Hi*@+mk}q zS^|X3KMEOf=LaO6n7YIdjnH6U+)CC=L8;@w!((bE^;%w&d%dt%l@*)4pa3)L#Vt6M zuoHgw$5rz9)r#LDXI+yoY=%?+^P+f=_~V_CuU2cfud=VOI()Duc%9$MZLY@f8;|SV z!T8qO&XaHF6%tccWE_ms%*7nI5bQgw{-Bq`X^r@M^k10kUv9j${#;2&lFN?t+nc}o zWdH4jH#eht+U&4Y@P|^jwN1~wluBu7Xs`pe;98eGx#|N6T;QWoE0}G++Z{5tJ;9uC zKQ!)m#{F*g36h>0dM8BupM>V8mh1+W4pM(;_0?HdXbORn@j9SmQ_`>9tvR&3?rAm) z?9VNl2o$krV39z=X@d)gyNSfa!^Xf#xQFc=PvqvS>*rdIk|cs29Px2tQqS)O0oVv( zu?TzckaUj_&rq}sLp}SiCea0`QpcMl6aX>M2|9(_#64;3X1l@nFii-BAH!*&P5)5! zxJb?DCs5n-9=8paz3>WD>fFY-g+TPUyoNju+~4~PGcjQl$o(LIqKY;(fcx=M`BPR6 zzhIYo+b!j$2D^2=IcZpMWzLMH6~-&&>1v!!ZUuln<*iFW9+|6DM>aO>8hLL7V#x~* ztTes8PcqoIs(@M7c01Hlh=&g87&y=_X>itr793xY0QaYDLt-Ne#lH`)tM*O$=nUP_ zJxtrJ-!x%)=byh{3Oqc$2Sd*Y{z6GORuBx%?5EUNG{r>{2&UiUa0Jsj?MUn$N}3fR z65LNYG^eonvQhSJm0dzB3@ovvx~mrDMp}Q^BYT>G4`-B>?Ocqk>8SU zVJcM5bjht;C!14QK}mz%@T7qI$r>G@HEyRWfqu9ZPJ&{LT&D2;b=(hdGL$(YHE_$> zAwUmp6xJGtRe*}ojdO)BR{R?m4-XopH%7;Ro~Gv{X|+K<$tVCWK=nGUIbMjP=5Oeu zf`nNA70--QhIU`ACEvq_0_e8FWJ^Xii~BMPzWyFo-e@!i!Yzz=;{~YqQW4!XXxzl* zqutuwls19j_)H|nZF3Cd=%c8)D=e|bHYRjT07;}+UtY5KNgx15KgW})>I=V0Q0wQd z7)(74!ThtbkIGNg4^P=Ii`T0w1A}QZ+3(I=J{W;_@^0n_GSU`mq>>%PxJN(w}>Xoz!r5oS*(Ir;p=Dy8*Q& z9TBv-#=N?D8~I7Zv8sLa?o8l^*dN_Y`n$R#>#={#Ods_l$6xy%Y`gTXNBOM10K%_N z3p>MYyq|&uasT6kfsK{V?bCb|YUCNjm$QB4IDWAq#(PF6$z3g9k1fiqD2h1^R%6>e zP540FGKTFP`3&wdo~?Wu2`J?%{J}K1HBt=p>?WR(2((dC4e))p*+pe;yPnpjsiJs- za&`~ftbLBE+UHUPD02(1PDNDFVs457RFd#z!I(euLko9tJ;=B8BEO%}^A9H1a$2Ic2O3K+xb_yMgl(K0JDanH zD9Y&AtFaSGefh|9j~J%tQ|J?}X)_j9?8;B)a(CDCwnpSOt!6CyxK~(;C(lMZ@>eo2 zC5z#Sbj!<&Lw3Y3_EY~B6m;>QU$DPL2M~6*S+9)mcv(!aIV!RaHf}4)d6)h$^i6-q z+3JS}OOhfUBu%HTgk+_3yZp>d9K2?kE)#F}7VQ={mG;X-ptyQTfDt8hvjb20D|vxT z>aH0(*N$;^17yT6f$wVZyxvA+|iPxIg2C`>0VELY!bK$5G$cU1 zuXlyVjE(g#|BeUo*S{T~5;-b7$;bEAhw_T>RpnCETIy5e*&b`0AXSDL8 zeHL{s&P$eF@k6>t?Ti&+w0CgBfn7rj|Dw&f2?PsQ_mwnM?fkPyJ$}0%{)zy+=DQz{ zUDvw;%3CdF-#+-tVRd1s-`igvfr}iO9<0!nscDPSDf0<;`OVsgbx^VXSP9NL#nTFB z=W|?GN*eqY)ziYu5Ww57#Qh$<4s8U5x5G&KRdyld7AhEs4YI<){AZ!Cy>XB1`wQbM zM`f;bg+OJtJ6Pg?c|zvL%UADApYM%5sQZRd$ZB&D-|*%28gS2JiF<9=Tk{o42Q0LP z4H}nGA;5(i2fc$^wNKa(GV8^CJ!d2VFkhYAlRFBt5XgtfBdAq_X6au$kF@AC##NWh z&2H0sq?Dl~EJR*5V-YNDic!(bMQ_j;rQ)*f;f1n2eqsv0u_%Vd0?4j#gygPK=T&}fJmt^Xl`uYe9AR@X(2g5RD!ohGQg6Sy0{Ems`zU+9cJ4luO59<@YP1Eo28eh*DP$~uE2^eTMK+g zQ}(yGj*`o;vmYo|fS0lEYL|OpblQU3deK#Ds`w8Z;dUt)1KOL~ijo0I`wzu07vVjO5qbMaosQsj+Z4zzs2gg^2 z+*!`rVntYg?{?Rn3O^^~7~s9-5e?gnY0H*7D*3_2;iwcnZziS$pLWAqn=0sMg6R;Q}BU3Pb&SmNr{pMi?H%xf5;# zsM|OkY&r_cdNvCEi{L4LC^f`)0!1u35tJZ-f&eKkbSHa&R&H}u9s%B+x2J0ES}~R% z0n+wUT2BHEy8D*%@)Tcn0eG%h=BSFC+quAbUU;9lUG~rs+jxyyt6E|?!Pzc$>@6*f z=y3A*CqM-ncfz_oxR5`VocDYM3!Yv=0j{Y;e`;S6z>?@j+$rriOL&KA5Y|ug2m5!WVfxGfU-#PD& zKI|4Qn}4{+(>5Zf90bQDDT5`w_c^31jINeKb$HVK#t$teSq{(wEc0nk%D$C!iX2vz z@3TvhyCpC7;^d%eIS!!B3>W6t&IEpU`o0xPew|AtPF-hM@^L?+MAc#5?0>*(U~53k zR>krV8kRIwF$yQcK4K59tf!#or#@lKMz+@|f!o zAh}=G4p|UgU){a7F+_0F6Yf`5k&eX1gGT&4r=p?kN;RRNEK_jYQZroF82!>0pYO*y zXe>6kKJf)*#lB$lLAc{4a0O@L4)hg4k;N%?4ubH#Xu@FXsV^BAzJG1xI4*xu;BT57 zy~P7sEonf<){ckc$V6#=!tDdTh69;m_VxG;=^0k^--@c=Z>t}?4p|e*|p(a^>2GY2N#8(-Z zp#Xx{$a{T_Zq;7#@)G6N4@WI&H=2Aq<> zK|X$lkCOl6DMjyF?WaSgwxpK=Fr}OANKMIRC)IKy<$*%35(9~~Y^6X~CzbPLh;To` ztuPDsE=x2BYS7id+w)dJo-@q zER3WT#-%8lqersEQw^)I`Q-ca)4b&KBNSE}E@(%ym|a`au)0!^()^}a>W_CQ0(tj0 zJ|gV-ALN^pe*I4vezv~Hq{9i zr&TAgUVFkp7NBpe==Yp>c#NjZF}*#t{v~vK9wM4`yn}}V=;MN-)tE< zln)_FSfFu%R_^vlwG5}DDLPKu!|bmaMXfl=QMp(TWwAv5|GNvo4MOtBR1|ee%OJ8x zOxma(wmDPGQL&V~pCm{^U+N_5Ga~jkjUpIg$k=IDsgu+@xWXgG-i;TJrRYtEoLoB6 z&dG1kc=A~N=eHChXg%1X04R!kNf@-zXt@Tv23@-c8v7pCvUD3;Z(JIr8`CW@tcMDD zMF8a$U5aWegw-yKDJeaI1=`GV?a7||SMYm_vNeMJ^ZLPVp7Fz8Ay>5#w>_z(9P2&L zFJqL=@B>Bm$p6{qW3u!riasw@1uK;fRQaj4Z6TU82P|d&+V;b@54nXZKdx}3xKF8LHZaaeTh$^`mRTrxe)lfo38q}on&t?#_Q;tD`o8*}!c*IabtRz1(PUGu=4YVdG za0DKto`$lzoyo@d7pd^iEbMV-_}v+>16@)!*8zBr0!mTFLmVaXvE^x8Q=4aE#~=7m z#%h-pq!KwH5V;7ZYIP!*eHn&{-r>4iuwLRD7lW;VZK9O!&)u4lwJVms`LHk`{7YnN zyO#BgKo*@VEq-Q65MWB)0E=#Z>l5#eJ($>|`E5}O>&|bFHcPKMT$WtE`1XC?Z~N)r z&#U_#_HeH}0Efah_SfY#9|KRNRhqe}b&R{B-=-w#K9UbMS5Y{d{gxw&ntuPdW0q|9 zTbm4Pz;M+v!VMoDnA^?(X(D{v{VZInm^IXinUBs@owc7o+vaGL8W?iXD(qNGY%~*A zYh9p9tfZy4N|}(wup8 z2kAxX+9wHGLucjp7a))Lu5KKgjgN&W<+qqXAyMqi#(kdm`0UX!_gL!9CUID18m3GH zPNGb6!8(~X($ujo*Ym+VtGLV9?%{62wm6B1;7nKsUUEHlBR?R0r*azbSkq@l2VMJWZOCu8DNfyl+HR{BiJtd9 z`aQ3!Z;SZ=Nl=qk4Q(YGLqo-uxEG;c`^*Q1%unCWe~d|W&t5}Yaaen0_&!IDT68np zEm6Q>4?O_M9dNYUiqkA=8~m*O3@Ci#J3jvqlmHVgu{kXPkD?A%fV~5WNCIWe_J!e4 zpC;N#;P{O%|2P0$$Hja@Gy13BU9J%w3K938u^)Lq-6;YZQ@QId80DnSLT8*8TvAp9 zc)?vuPBCZojaNkl#t1D;vO7hUK}7DRu6yCTcsVYA#2~)4z&VK2vq@=20SFw(xq9(W zI=cYqa&94mYs}6$jd8l}h8dTSsT{!yg!K^p$SY3&@ zfMa(=mv6)j2V|I}TFZ!hQu`Vp$3Cbnp&O_8MJm5eKpCgu7VepbFbN>P^L^FO({;B4 zw3~xcUtaLELeZkXVI|e}<%X3iHI}P3*n2!iVNecOFXwb$Rd;O~IDIB4v+55VnVh7& z*?>NglD!_#qjFZKLsA3oxErggGB@@Gn2j%5ey6+5-^-@sW`(8vK&FuJ)AF=?FaP-^ z23qEa+4GCy?pE8~t;LQzI?e^6FAwgo*mdx9V%4>SS-7D6kMTZaM0i|ch}m_>W?Je? zY(h(n!{bphVab;Pgb2$$UbefQChZCgQsSpo@JXr`JD3vWHlHJz}N)g`YcL_ad} zG6r{_>dVr-;N>yLfZ6w@-^Vm?71g9`O+pFW;^r`Wu^bd`UDbF>oKaB-!TZUBS@0|( z&dH6#>SUZa3HH#wizqeDn}ENrKQcUHC*5tv(3MCsp+=DE;bgk$5z7aFV(Dz`bIq(MP=cCpL3QJZAIW5m>GVus zU?>-tLWCPdz4rPc) zt;it|!02bip)YoQZ55h$zvHP`!jnZb#udDrv4YRCvJZr?<0gZ|?;S#1qfq@pCVO(c zPVkx^j>hIIa^LO|zV+u;=5pF2xxV=I(O>rVbhv%@y+N zj4@|&($pI&;^A-Z8hD$gf|EaGRD#-MrI!G16WqXQ?+rA!!6SJOY}oPe(g+@04u=4e zP-IYP4yS3=v>|wUgui~%+MlC6o!^%#JCh0BKvrDs;Gnur`WdIsE;l>hq=;4HGuA%! zvzZ3f>ynexkupg7jg3o#<0bk!0Ny4rOhFO~yAD$OGyvC^f8?eo-6uL7BF7`0q$1q= zgeua@v6LAw>`DfM87*D|G+o?)PEGpslMubf(#1iY&=i=s%g(cgzq>-@mgM>|%<*fs za=HK-p4`b7E;NxJ3e|Hufv|EWak~clRZQ@Hu))U zebc&dT*l0E+oavnKgM4}`aZS&rG?uTPd`l^s9lXGAjE5LN&=cidu>Hvpo3=g;#U%7%4LA#zn(6+?Zhl)*WBHj>Nr zGd}a#C<2>hB#`|*BEneHboR4z-f+2V`tiW!)!n9ev(3pBbyN3{Wp)ANTfn?I zMn)&58;B3@#hyF?J%c~!F4LYg)jY|*t_ucaQ^|0^fW&_ORj;<>GNpP?Y|ic?ldLkL zNyy_mcvvp`@q(zGV;Q)QZWqqA>P|}=@5RrpqEcPk+ScMo`yT_MsK`M04i_ND>#xUY z?(huS8}P;@HfQz2DKiD2v4plzN>HkWl^zC%#rc?ri*;Mt?ACQqdsg~agcKF(H+$p1 zU{C^Tq2Gf3y9hJ$$N7wXth6t97rLB5haZ1v9|GUio<%kgC`~}S@2Ll;c5o0aLn#@Q z+GjLN4nW?`mhvYF#%IfIPABIq(l{H}qif5-XjeP6qHj9w49*BA#CJa>{zNhtJGZ~89ue~j^O1w(W#=uD$b{dpRa)rAu`O4Y4okTxk z#`jJ0Tx>AvMV+p%>2MNsJ5c+$BIlD0>SLf6AMCvVW#9~Fin5K7ZUxyHF|L!^wn&hF z_@i%!-$C`zv;sp;YxVabC(hHyti3wUSjevfFUNLp+76&eLud6UWdHh5KZl1BroMB% zr+0u}@Zi&bd|^EQwY{%<>D)8Chk-ejvM4m@b@Y?HSec0n}&DzbyJu99ciHz-Gd(eHs z1pe1}+jG6y3LmbbH^`Wcw26p^kZ~qx&LEt_X;qIXb@5t(fiLR%yGp&dl51uz2z)jm zwQZE-xu@*T-|{pGK8yc6{@##$?14=;?L8A1MvnHvt7K1EDchqGt zHGCasaYGMozQ?I={o1iE09h6PV@fWb)?=*QGcbt8+O6M0ea-hg?iLF2pN8ZYLJ7Ic zX|fhe=g@}iJvNoT*3aryt4`tG= z6Kub)-(Mm`U*Y7Q^E}Ucoq1W)8Q7|8wzTY*hjrgeHLscz_*m!9ZEw#B_k9H8)gF`e zndEu9mZ`B6HRha>VeDm66e-KGc%ICof$q3xp5uHQiZ!lt*>S&Jb(M|>$1!5g$(FtO z5oO}ZFXYLU67bGn6eMrIQ>{|JSD1pGE9zZBEP?Jt|O1cJ>G}W ziW-E@aDo5NHtAt%Wqr%%;xDU=BwirmG$@>#CwV5U!^UFmT7oVYDLu@5dpI)P+)=yf zQp`ZY5dKU7WTGq|rWaj^N;}NwTW=Ls)(%iop()r5mI4G}3}i*h(+w*RYoloC}NCQrU$viKlJI1bfE+0oI`iqOT$yp#))C#EH;zbmPNUL(u9MXA}RjA4KIFPk*=+_o(f3oq+WY-)|T^o1@b)^k+Lv`;;C zB10t?@Iu4(sY~xnE28p!N1D|Qd`@?tpE}=WqyB2dXnn%rt{ymf>kX*;k$_cRNvrVq zc$n#g%xFsd#A;a=C}4LrL0z=54S_8ZI1=qTyZ?T%ob*_!N)|wBX|q+*aeMcz?AZS8 zuu&Mg&Glu5n_3_lb)>|ME~2#W58sX|Byw4EX$7nRJdTN5Vv=wqK>KW$P-jd1?Sy(O z45m(i+5nVVx3{?!bY>xVok+Q|sqTbGk;;c<0bA>qzz;;98M)6n5je(y;T9RG zS80*P7j}rNZmdbmt@A7Mjl3F;T^0Y{ugs3x5xSx+LQxqV+q%rBvDAB)tdqR1;Pt&W z)Pk2dS@@KOjgHdT1sVO)-xz(S-T1*|kPYQf5}|cM7MG|pX;^>5*;SYUOIj)gy_C4r z$?2#il0;<~J9k#lXuDBoi>B!`YwOHO_5Lml6?fr8bmMB=b?Gk?ohBU#Z{7YK^SjGg zH0w)6-}C*7MTf*Gw`zK4yR})8T)e1S_jN(;@3)5JP`q<5VHNMYt5b|u56YdA+l^PE z=^K)k;P%f^Y%&rYaN|Vrpf7v5I@7rdbh-M(t`hyg+jV2k3Dho+wc?Cr0;1c7s+Kr% zBds&*e3w@*B&(}7-_$oU%ALe|9%#D=3ON#Qr+>&6vlhQ^4bN7{oXx@$-AczfMFgTb z1jKrT4lPlFJpnjqA6WTxOPfab!I=yI&NC%MNhBb0G~9|{&}NMjqV*K84>+M8P*ZyN zO;U1R?Nu|rc6ce8We~(*H!xl>g`t3DoJC%H^2?pt`vT|voFRuLIS_w@ei1$!c1Cy|}hjc`u4BZ)@~R+A2~4i99+sf5}= z-?m)tc9d#CY(+~g_;qZe^`M-bz5f;@dre;l-W;;ji_Z2yURf~JlI!Q=cFju3h|LT| zl^VvT{~vlW&^=$Ki+#_9hok~FlcpH#CGp`ayih#fz%>1ht>I{twc;X}Z)s*UEB}w5 z9yRGY#C5Eu4k&0ci^wCdlZc=zOeJQjSy&E=2Q5c3M&i`3#P#h_jisZMM-8hrc!TNA z#%v8uiVG~Xco*`)3u0sbXOYLEWpBl5M-ldo&~JDy;#nwXljDqUoUrf0-e4U53^bwoY0v8DWyxv!==3L7 z)$iVlD8(Ic&ZL3+8Pnj3FeA?bvHknrJnk+%oz1a?q^Gc@+{llcP?UW(bW`6&Y_ix@ zhbKtn$nnM3Hn>XlVrU$HIZ``_135rCq(lIXldhJcT_2p?iB%eKYXF(JLcOvv80aMb zYj{D6J1KQin1gOAO|u_{pCdQ+=a}1FPqGOs$`58P@5YM>VV2IiwQ*|wz`J&^{03=$zr^41(Z@82d9Jh}@ZoINyQ%f-vDs1tten7a7jhA=yhqs0j0a184!5wyCWH;AI;M~fUni5Hp8^yVQx-=OG~DQu5LT{oMY zJ}41Qx?p_37{*L(GRBxL4#R?AxK)PqDupIf8;H`nILvMhEFv1? zl&hUY4ZNYGgZT5Qk0CL9|4wMF zOq4%zd_;>aKm3YqAKyK@E=XTXn!#+K-;?<2pMMiZ#sgnl1&bmuhC-v^}Dv9nCn5ID` zgLOb3(pmc4h;+yiWndS~fcHPuC{wMPD)$mu{CzN!eZadlYEcyNLUOwu&bsSn*W{~l z>@X8#tuC!zW9SRzJiwD_lw*lztSe1%E|x{@0R`SCP-AhUqL}XBobYWAI0N`Dv2p%EmNndG%^#F9iRZ(h2zzd5onV$1S=gQYMstYQY$(=6Y!*y+R-IPcmb^Y{m(O>XoL=)i|HW?6<<6Jf3y%xu*l-p-bqlwC3eoMDn{z1w>J z6FMny{Dm0Ig}^4*`;zwolDzRDu#M>_tGyNtc{OX|_8Nk9q#hLez3tTH-<3t%9c;ri z{N3I`?rntXe#x=RT6JOQPJom1XWSSG4U-njk0fimp-n>%T%VAG@{!JlGc0Z2dB8r% zc1eHfB<~E0OmOhK!p5DYYx^G2f`tnT9pR}{mt4;;ZA$0lF1?I%ay{=dpCU1q(dJN!1~2|EM7}~|o!GnHj82(EZJv21<*>Le-3JzddCzPo(kbhBb;;Fc6~>d$ z$ZPI2cjEhax20}#_;9;oL->KuWaap*SSwcSHZTg|h++CQn*|7wa#3$BSYc>)fxTTN4rLnQ8G1B1?lnM(JcR1=S5R8jc2JWKz^jj$E)EYG`B2F(b=!e6EQX7k#pbPudb#YJM6smI-TuO2e)(bsg+ZyC2XxKH^FM< zx?P=sjFQyN7ONYk!baK8srpU_(t)}DT@4M{Kp5spY@5jGhV?wqi%+XgiD(&SbpO02 z$q&DKO7>h~s@|#Z{^XRI782X91(;oZnN#u*7%b9M_qjRIfR-!P1H;JR6&ql7HZ#M( z$q*iOkOu6p!`IBC9ZP2K1?_Qe1r*l6Jv3A!441T+aou5t;#*JRC|+WSGV>!JBu#bi zYazwa@gqpLa{qx@77neb=0a&NqS)JlvNWMAAQ}Ur>`%Bqf(GMK>i_{K0{`gK3U?N# zNUjpT{O){vZM;yt*VQ`6V+f`UDu_I4-E);)XV75L9o{du)Pvw8HbL!y_ga7dI zl3!)|1j%XW3taFx7Dy+owvTOHRUOYL!ucw7oE?h(wv<)1FgK;HvFQr-F7`{~whYo- z%R$fj1Aq3rW&eGLQS@>jW7Ck|{?*<)j=C%{wHg;s(06NV<4>k=^^*qHu$Om|{eUoI zqiH6WSoZO}tot@XRMi|mV0A4vHownm&8~6=j5h=ni7GZZ?h6X|iI?ZZ?RpodyrDM$ zO1ZCRkH@5eS_J5*5?>3vDy<{+fqm@Lq23aeG}?jzcd;iTH9%i!M%lfZZ)gJ(^Rn}! zuryXp21a88U`p|JSS(8y*CxjN-)xs~+%T>{s&@Ow+|GvJF}+utO3gaGq5u$Wb=af% zl-vJ?|1uj%TofP*Lg~67CC7aXk0BB{|Jq+G!N&Q$$JyZYLN_L(j8gu9joCVQ?0_g^ zxa6lUf9CM!OEFXe_?koKPZ?6n)`6c+4D%VG?y$avuSpgK?{;Q39(vET(h=-8+ zeU*Jd)jqZQ&4PsKB?CBwF$3hJT0Z3h$ZXV?yH7(a-s_p9X$9|&ut)ndkRw*@P0{~26xT*67#*QX zO{0eA>sg+mV~{*|?7>~bFFph(N5l4YQrC{KeZ>bys)>*H$U$AXXGUKUvaUl|ZrqzW z_C1dq8XVUE8K3uxpgbpr7wec8tWrcDQKV3`hr9?Imw79KXmtj1d*A`oW_v)^ba3y= z>Z46I%!2&fGjWG==~$E63;zNmKS*)^YTGYYn+sii(|?KCH0MjIHuqu2+AUOd@t=jG zpR7hluLiG}(f~Mbo=RJqI+Z%FUi~SK_pu>9$15mzwo6)tWG5cSqju;^S3M#>7QSTK z_?%~qm4>3->i*_*(ZK;l%E%)U&o`{IvXlwcbjV&6ZpF&GXX1HRDL!`}i}j_i*GLH) zm5talBk4ZeFMdaq!`=j+VJ;N_5M&unz=sKaJx0dbiAX}Gk@UBk>obdMrgOnw2*&Gy zo`7-%3c3A_d;N)-$^j6Z*nP)hj)M~KF&!&F2pFOymc{bXgA21>K^)~<2vl2 zS~1mHJH{BIYC!vHS54WZ9aR{T6s87y^c40Ti4??GPdch@&W2EmoV1T@F!r%0igvx) zwk~l>QyGF8XxBtfZ&e6JXF*zY09(No)#%ChgP%g{iBaM_!ZGI7t#faLZN9|F53Pc2 zeI{h%3-lGS(+^W>Qo4HN{Av9q3yK}rx*X~6vp|NmJpdZEdhFYADn~F+M0mzn&gSNH zI%~G>hP?Wt`+qB1h2Lct$-6ZEOJ_ySA2Iw^;5xFqH}72^&6b@g?#h)afNL zXG+8?*R$4t`Ryv6(DL@tds@>e@=*PY>duv}?;D^;GWKr=Ty_Upcxnd^9Fb>cbmvtq z%+!={9X71n2c4%nz8KB97yQl_zR&I|+fF{-C@5ZEJ4f{WY?`;lwh>s)=&9P*5C5|1EDS?AL6^kdFig%!{>Z0bBhC+6v&WOwaFLlv*t zz!v~Ck!IOXyAG&&hM%@z#D(%2?`ttiW9YbpW`HBo4{4fTTz%g|m8I zq{CVqe%W64eRxlXMo`itHFOPbINRgx(MC8{lUlQGRjc%dzF(pec$*sL z_+a&UP;>qJ8zZRT)OluXv~fgm{5^u^rFgf;dk#o{YJlH7#%l>`ARK2af?8>q`&P(ks z#FOq*?zTUF?F98Wik{v!<3;x}YSUfMx`jANeB(nCzOV?|=&5c<3%F5i%?o})R_EI< zH)i8bLbw9VU+T#&EM=!vib`P;K*t@q*GC^YdA&8@#7vI!<Ssz?1Ljun+yR;J;39#+TpeSI`GrF+{j)MhzSOIk^;%FA>dawt9Q^4UQuRyNO--6 zrL(wcMmfxh5~P6xpeWd-X39l^T_iBi>Auac>*)`dg+Lvc&Rgiktee~c7+tfjwH;I# zKnhA2rZ4)Z{f?hUPqot}q=49KM4+PH5K6IOc~G_fY1sk;SXfVWX-$E!sdh z9Tm%l{)xN2R{CHXJSL8lRMf!foyh?W$wYMLqE7vHy!TtNTsxu1CY1jUg5TWU;4ajY zPr`wtHa3Mup4D*vX+pT=6iR;SKlSu2?R@s1M<-}k7k)e_`S@<2d_jYj5ht0#Ss`=0 z9vj(rTDT%T_+W1G1y?t6&(+}Pn%p?|5Y}{~z8i=>8vdkZgQip&GKbysdyaA<%u&M+lTN9NI6%l_dF`rUJ zCgn;ZLJrQvy(aqnhjAO$zxuLo5C`=35sIT3Zti zq;v*TkwHDE3(Y-fp84Pvgs7iWj(4%)l>}_TK$J9IuUPw!PTUK97<;Em=6kpi*V%=^ zjc|FTvTFEMVSV13-kB82qa99y_UF>hl;eT+M3weUrpcY!lsw(R%MB3rf69X2pLNx$ z{1<3z^>JB?g+TQv9Sm}Am#^qr<5(z9E|Mp2_LYg(rJ~Osd|~xt*Fo=zJG|0=nH`Z6 z*l$@w38vHBt%nwvf-fr_eg*>u&=eJnCfBah8cw3t6fksU46F-`eGRf3&hmMN$HKyQ z(eG$Gy@-|-x34B*4@BCApLjnUDXb1YyFNRXvtfrRI1SD%-ymS`LQTb-AWY}y3~9#CsVGdQs~dCgIRV0Rl%k!H zMARScUAILh;erq0H|gfHN`$Q86Tvu8mzr^>;xQ9dakK}xh4KM&5t9UbUE`H}5Yus^ zp2nGdL*pg*%6ZxXn- z4>C@WI+Lk^TEUUx2bjR3tyd0&N)0Oyj0DSjjx29gAK1hc7ardX@K!IZmD+5Bk1q7m z9%)z)NuLbRMbGe-HEwvs#juJMkBwlH+>;puUt+#B@e>)#u9O679d~0B)jtGcc309` z`{cSX^?`kiSpSPJvg0#+=WNDDU&OkXDmG4i zOJyabPRHnk+KFO)nlzk8a zf`9UmrChC)m<$_3gZq|<790gUHb+eSLA6`aOg}P7Y#gME%`y<(++jQ%A%nf}>*u{7 z^j60v9n7dw*1Qr@OpQ9!06Zlc9VKoIEfMm4;Gy~EjuwP4ri*oM0C8Ov0IYX0lo~WA zbvsQf6`SEfGfW=tmrs^AbPXrvSZ>Lkr5^bM2HsGh^C2Zp-Yl<`?hc=0H2B`($ zj0N2@3eA@Roa6%yDQ;80&j(zug{ zeaLL!F-JB)Iv_5j8BTiFOP}bJCY_bZ{(DQ;n=(k1AnkyD?eeB^p1JbwkY2#&OjH?M zh60(XFAxjf3+;s}_*uPTiy;k`d_ze9s5G4-jc0gYvD?*27O4#FIw<l~ zcPSl-93>y^abt(MEls@PBN-(Qb}S&W^#+~`zObk|o<@Fr$O$j2BK35Gc~Hn(mN4-{@LA#7&P;M$v?Wunpks;gIPf4i zi)tsFx#x@2MoWdfl8TdbI9A!2%p?=gDGR5z1mcC3F=$@yNNmW=A^2DyrR}&=_jJI} zYzOoj>4drU2Tl$?k$(K3Y%vuv1)aG3->gN#=1S9#4bSJp`MjfeOx?M<=DLe!7ikAT zB*3{YZYOz>-3cy^W$f)D{)Zpp>{YzZ#2c^$#CL1n8@v^WD8`RYrxX%TEm!tBXC%bV0cG1)3k1T}hVr2NdK#CRIj zCJ17W1aD%8MR)43=}9UPb}j;@~5y|qOB z28An=7vmQ!O9uPa1a=+`Hdw(GM z#N3F+`r&<->kn9LCS~jUeg=A(QL(Fw*{_!O+0`*l_Iq)4sL$&yb@_%$pE>*A-2nLV z3kEoykKR6w}kF258T@_OW6v+{f|@@SQ;v;(b3$4vf8f#b+HF>Vs_b5>-{~ zo0oCaIm+|2`v!p@-^H*SPifc3z2R>P*m+0Qmt&1zDRt6KgZ8cJzPQbc-(Rlz0bcHg zw{G{d>HMicICjK&Ymd~Jf`8kK{F0b)YwY#c>lrR3Kh9C*ErXoUse+Jz9 zK(*A_uL|K?6VD$RvzgP}NXTe>mZg{2`CNZ@t|anJD!F zWqIo$LtQ1o5Zg^*boS6-T-1}JSLV$P4pgk-vS&d)#V9>a=<;H)^C8`?kq@^L*SwX6;1a4=&Po5-<`mC7+RgX zW|DAy!&}O(P?xi|))p}qcDrfBhH?+bOHSk|Jlhh0)uL~ND(Mt2P&>N;{yf;5;95IH zzlaiCXppu1c^eg8uo69e7)L{D2Nx(zPILx$Goju5?XztN5SN}J%izc>%Ffam;^U;p zO4h+wGqK(Ii8$BX_@!V1(o5{xUSCZSRpHyw3Yr zMIeA7{D|KTgn3bc*=%X}H9mkw$Ls0X$%9IW1v<@e4b6~~>#tD?4Y=wVxMSeAl~%n` zvxa)(!%I&wJED7aDLhm;Ew%^sw<(De5;M6T#zyJ33VIzT#4CWXr=&BJS$h4SQHZ78 z{J7gUtD$amV;ZRwFwj*G;cwt-g{*s}ABU$>U*vXGpLPAzkS&Q;=qfV|>$(NmGm4!l zep~@SKypu#2U3ol+_hR7m`y`^YzdDkbb-^{b{hxicoIF%c&xTZ9^E%6^&=cm<1@IOz^~ z_t@oo62goygavv_E1hI5Ef3R(z|pRZhrkxoOiYF@JVe+WC_&~S`W~sJV+=H$8;pt> zaIIQWH;(uKLS_gUGNW`1(||dFW3NW$14~N$HM~$IB(MK)jJsC}nIX_|0!)YkCGx-B z;y95EZe*yj9*lcn%TkiyF)YKhMFxxHc=GfDAZ#Udf>34ge)_)nE29cLf!B*}M`W_R znOF>wARs}ePUljIFkU#k+W+TC5X%TK=IGAcQ?CWGxo-~e%=U@k&WvU68|cllmQM_| z`u@>?!)ODc(i-rM?(DGNyi!}GJX*n1vU?8kLrs`=K^W@xdN=B6Vl$0H{+J?Xjk8LP;2CU|79p0OAi= z6rRaC_rDm1-_7X0S+4?~WmZ?Oj0Xce4XiJVC?q#a7mA@vPMI$3dyyXf`KCm=O)XmVw4UjP z1-=ec;z#(AR}lcf>F0_cw~F{x>7&RLS6jhWaL9$hHMD z{Wz^vOlPxQB93_T%^m|b4N0HW`#8CIUFS|9?z)6O%)oY|gQq3yo=cmXqcw=#w+v!7 zG!JF}CZL39Nv}fL(&)1ioF~u4Y5-z61i)moxYSGMX^QvJG-5my2!x_*HB9sQ&8UJt zn;Q`yc<`%(fZ2*!WG5dP#P7ix9;?`$@KBtJ`8V}q_Y?*GL=16ErhupqpIa8w2m8U< z0MgVv9ILB^Br%=S)VHdMZFsGKlt%0y*?_0jWM~vV>@lsCuD@AtsyLf-Z^m{O7cPBE zHzDrl1$W()jQ;4~`V5mHn`)JFY3yvMrnas{zGWBKZ1*4;5SMUog9nC$H6rCmRy@>Z z@KnF=%1yk&Qw`V?izsOomPdm`s4u!q;F17~G%_`qFBP$EhA7!va0!nw*JTh7pnG(w zGV8{RVmmq@sw>-XHjDhLsy2z918|<4MD=Xo;kf!ullcT0G}{`@U!40Z24v04PT;Fb zImFhnk^nBz_dy6S6j2a%UL)H@Ns#GsbiE7;0;gizUko3s1o`x-S{qP@5bttq2C5nZSL_XC#IEFHNas1C; zQ}fJ61y^aRmk~90{!a}Jo>ez3y<1jyC}yMU(v*|>T$2l5I81c^!_pfQwOjG&1H18G zMeNg?XscQqgpeuU>+(^oHf>G#`d`je`@%q1@! zSGz2eo;qPa5_t7swPecJG$flh4APWm;CTX<)QnjBAyuOQbz@VyVUG*7EoI19f1K59 zUd2^A(-OO!?$IE7ps(!`2p8j>wvTN#6RzoiO)br2?tQCZ+i!) zJ{y_M_Snuw4mL9K;OkcZO*afaoX+wWi$eel3&J{h;3^Y%0djH8mC)*i zTS5T+3c#%1jhf2hWq>3H8W0O*S7sel@S&2in^-1$3$>^&9w9v({HhR-A)uQUYSV(v zq#)gSi-AI-VLE+%+}^HJvbjIdf?~V(OrmP<^OuBRlU>lkfw#V^=PiD^{<(ef~aYU1g+;s%#sueuy!C|JG0t1ZIGo`EnYN>o3M!` zClALX!?iCV_xFAKu;z6Y4ITz0k*5L*-176a3yNALsy-_CtE`c5#xr!pB5qg$fdLm2 zG7zAU0gVAr&ZaK~QcX6D7YJKrvNj^Q&HO+g!JnEBhOsy^#kWLpJ^Z$*(!AQMoE@*y zKZXEHhSEZQ@-ZSGf4l*5c&)rm8EQ_pIRvMARss_5c<;S`TalQ^(PzaQfEOSfSw=0B z=Ng<0^kLYoH`fmxYL=)tzra_Bi-5I?yxNS3MHvH2gcVaEVkqSS%CA{T9HliXs^Ef0 zaWcr(qp)Lv&jsKLK8@I=F%1?mVL5D#LqMl0^3lVu)ny4$vLK0#d9n*ov(qXwy&4api}df})0EuZ!n07k`BB{ZzW z#Z$!|i*c;oPN?ccO|zA77o44Gw)eH}0Vgy-_+(wEaHV|lqNu)UPmfag@Lhn&4vT96 zg8q4$VKCQ^W)6cz9>gj?wEoKX81{fpKt*`Z655B~Yf93Vfic0rWJlV!F-RsSD zj()Fpj*aGI2e~-BSkv>zwz9-yp7ra?)o;m0%bXUCyW&QQfQA-RCZax)wp34sDWULjDM2W(@a^`y0+(DS3 z?I?3Eky!u+bGvaWRLT3l*4ShsbTXuS+89+4itFn2R5 z64$C7n&%#-pM99%)JaoWpYal1e`;_d+4sw(EgM|!-69`~ z-D=qSQ9aWzx@oD)vy{|YAg-tCt8&-4ut2Lz0~y(kq|RK=LrEux%V;333Nc!eAhrXi z$DT-t(Z{uHo`e4$D$kwmnARWo-Uoyu@p42Nu^CTnrlxf(o;z_pi0jeL@&?vyBrISH zF%!)s63meYx>gXmGk$rW?(0YiA~DNQTYr_f(HEOTT*leU!LQm$q;_J^8uVp8Fx-om zD3mXffc8Ue96d}is$WAHBMBa(=!N3_BY*f{qn z(ciJw$)>wBP*BKSB^e<_k~&F)&n#LZH0qh$r<0SjV6C^mP3yw4*bx5~l!rPGuzzJOZRuU)-kkC#oS?R@g##p?V9C5G7> z6|=uF3bwy`JnPegkBl~+-#6(gefI)4va0K1m-jUaF1&V1$dj&6KN2(tJ~u1Me)bv& zmK?v#dvhDOimH@z=pGGArJmPN;U=ne{S+ITsUPCg(O_S;(LeB6ST$!3f;#J;aKDy4 zcY0MQB4lTX1-Q5YM1yhhP!yJdqV`M^`q>#;qS!zFWEvD$ z&B*=pKW)~=4yjVfhq)|D3lPcU24Fz&BqH(psGq^DY8-s`5h#bSJN(S^1_ipAVcen_ z3r-t4f+Ki_HWYeuw15>iG_%i&8nku}@QE;CBMoZPcS=^Vs%#tgpqKgj2*;IUy)t{i z#(UWo`fmcNMRZxdQzJKUk_)M{I0>@#BKg;WQ1!MjR=>G5V_=B!=Hf#Va9RCe?}sOAAu_4p z^1izuL9d^OR`QSEx3D2Dfp`I4i}tk8HlVYZ2r~Fy`_oJ-TFPrG_^3A`5aQyyE zcD4bMsB5?%7mFSY%!n5Z)jQhY0Jv0V>%V`avNG!mz@EAT-m0p2C)ATmK1haH%1&1Cs7>)wgK|8SFxK}Uei z)tY?#JHh_@SUtXRtPzxYvD;2479aJCB*a3gSyvKC7=R{i@n?Vyc|m|PRp%1^r&-NV z==LwRz=wyFJd>#l$D`9hDAy`YxBc&I(-O5CV{sV?Ju=b?D%6PpIjb&?9%@4z)M9!6M{5e4UWDTne5TlI=Dby_oOk;qhOhQg2HET$e z(uHvqCVfXPmf*OOWo=wQbX5Z0++A;)%#gVevQn4GW_<#a<<{2dOe!bwd@MFO7~}** zydP*z@sWMgDAPbD9@?zCM6fqi=p99_Ke59GR~CSHu}YKkxv$`f^|PTOWhW>+Hl2dD=TdkgQbNVab-^pR4sf=<)lNTn zJA#Qyvk0Jb1{fjSL^xASpPbb;rVKqXnH$-X_LL5H6Cmo6p?ua7f-1uwoY2+-5oJ`J zp!c7>rvNtCa(zv&Wve+}6-5r(%hd~rMM>rep6uR#hQ&IdZxyB; zFi)`NR0H6f8#y~xRtrGejn(tq0gN)k+-?5rkkF))_i8?sz{Im*nHyw0ui=%1Wzk2J zbd_}Da6Ovqr>@U15z_GLy&CZ#c+gB+>JHGtT9;KLIaUG`>i^>{~>wz6@&Ejds#xigT%^KdDvwh zDZgZt(geL0G7c4=vz<3@;x}nvRCfJrXb)w&kQUs8cPlYIytU zo`Z0$TGHg{%9K6M{r&MGZK+63b}enD#j)>+fQKh!v1NEu@(l-D_nR$1k{j(qXU7`v zRNT+%&}TaBv96=y$+UIt9@#jEOX(do%w|XCrX^Oa)Rt!bypiU0lheFvPu0#j1nCuA zP8?bMI%_YgnRgVGtPHZ_+X!pM!P6+BNZFT__Cir-942(Th717(siwy(^UPyTxUfZ| zD^6~4yM(>AUw8H2VG`TqbFHGSHF}2(?Xt_Pg=#L=LSs4}h6Q|%su{ocW>xrv7xl0K z_tbn8QixxV)n)8Pp1Tn{;2@&PJtmR_f>yUW($m;0)Lul{guWsXp+A;uBN9EJ4D}oK z?M8C+PJ3jt8BpwL27*%~<nP6!1WmFS2&<9O)~LQXy7*4;CRSXs;mYNpAX^6c-ocU5&f{E3ECL=aorWw@HTENI^W0I(9 z$z6-xn+;S8pHiCA8h^-13QZEU{KMC`a^UG+Hs#*)&|p8c_RMVxCT?vcs0|U_JiAXp z$13(c$t1_K;*El7maW~JD*TqE8&iJ_c3(JpggozX6{qxf=6n8sy^I*#cE)I zI3UmE6Nz+bvP%R?`#?;i>;WP{u@OEeD&Hof;x;yf5Z~mjmAa>QtNRp1VMf4u$|~Lf zMEM`$6GlwKwHVMxDH91-^^Dffs_{?|4*h`u!<{BnLWFZdfIL=aCcdiyzbd*X9 zq=}(=c9NL520MDr?~0oB6VUZHPpxe>Owj(SZ}r=sW4tUWm~!Cz8{esc+sn^nj~+|! zWYP@NWFD{WfkbwoN)UYU(D6s&I3dKU2Ay4V+-3i$CZT>m*=lKfMeM${eFv21p`K*J zWClU+v|;1{LA^&nz1J*3udIUT(mMH-XGi-fh&pKNs)uujj4%wkjZhtU%%X^Vi?wx^ z#?C}n1Ms~hFBj;CD?zQeH+RTj3R(Qen*DhOB?pmWl@~m~;Abjc;8@+{%L1}+aOa;9 ztKEAjY0#kg{6d8Uyij9)p#=HA7k)-PHJHxj$i0;#PHE!A_3_+ZkbieWOWMhL9O2NQgB`v}_Bk~`Ga?yNx~DM4R_%J)hbb1POpjO3_t>#tuH zVsD7SpH1{Dwnlzcf@)-|%NA+EO}u=d>sYeDiZ0HHby;QFykb>swgu?Rm{e77kQjn-hH;vDB02R(22xtbkt_XahhDrP5ROv&6_L9YltfwvJ#8Ac;n(T3q!*g8Elwr&BUEuxpfN$Cfk_==GckHL*edM&`SDf(t#3 z<~V7&b;t_C!@;0hs|&Il)NkVOQ)KO6Hi2HlI+xdvx-798<4GxS5Br&gix-rUV>Z40eSB{ zA3pI}RS_<8SryQ00OE=x3Ym4exqg-i1x@wokfQK;FF+c`wLu)Qxo&h7gtn5*Gjpl; z!H```YNwt+$G!{U98`)~LRZX<7Gqo}eS)0{ldD zW7N168@*pL=>CG#S(%Zt_e3&{(@MVdIx9Hmvi8RwmcEa2xir9%@Th^9h_aUH zWxA{2G2W|@5Psg_rf3+3n0x=A|KD>8SWnJYimN1HtjY{Sj60e@M31S<+oi*V4HP1H z5^7Vy>wte?^sr2j>>n2HMcy*DDA!A)+&+S7;=K8!a@qAa+S7Z?_YRGH+S{Z0RAT_# z>{@a^IK-{F(G76U0&uawk%dhBk4a0xcE9m;!!y5YT+Rco%abYfr(<`xPdQqh0&V`= znLF1~c9&|IyNa8WyJDsjH?k@NDS!6oKlWn(Gq7c>N?}deYBao#)1ky{ed5U>q+CLC zcPeKhLLj$6)KF@Cmfhz`&8+7MAO316nQ;QolN@-q9RIJI8*l4cC*1*uqE~f?m^+N` zNv|({bV2-|(tkX3iVsJuN)LZ!{lffRlgadA>Ens-3m6rScJCi$P7q$_PhSxSrUxrVP6IrYNyv#uM0czi8#|1`6LB{paUe=B)|>Ds zoRlzh3k;y2LvNKD(t!LbdTOtP1yp&Ed8Xrj3mN!h#a&k z|GFU3PJAA?j4X|dBKC-Zj^o`$dt{B>-*MkA3w^zlQrfJ$ftHfJR{_#|>=6M*Yo!Zx z$|Z_3ifJwpiCDeStEL$91y=_uwI;<%+$gXu5#NkG1m|0(ypmWAPwWktdftPw%~6;Z zjJ2va&C1zYaCP(f-4-sK<`#D^N@zR>SP5m#3mOo60$8b;5$naL34;wU(I;PNbl><7Y3Y=kp8f!dsi!7+gY=4&?;=I z>rDF{Y%oYk5OaH0IQ)~DI{DQzj*}7lv>)Hb8g^lU$l839k{Hrd#EXff`cQ(tu|! zR1k-qmYxc|tQ{$S>E~GApUX%~KXYgJjH&s@sul59`pEv53_grW4JlFG zNBjC}N;3i8k0?(;H{nWtWt5zcI4;gA?-x$M(sLH4a*RHYI%*{!p$_DB1Y>3dP z4-2>f`hoax;@6R!&EHOav+hx%syFcY2_j?m=BoR4bzY`&!suhpqz%EYk$(2K~fXvEy!>Sdlmt(3$ByG6TE^|7>U>u74%gfZyuhNpa>$bNm*#PQ(W$6Z)Iuws#Y^pKY)N z&UZ9QBddk8>S_shqD0vYj++=iE$2=ynkk0aT0K5}`1V*dkLe9rdAxx#7BF0-+|eQGUBRS%+! zli}0IkTXTf)XPUf0MwJDetueX#8!8|L@2F-ztpY>`hghS2R?8rCg2Mje2Yn12!YNM z@=%n2#ETdncz%7*=;llT_GR#S(iB1Aue@`zK`TH6yxD(eZO_aiB30c2GH2qN8hR0= z2sR(z&IjI&lQ?D$m~dUk`hV?xc~n!$x2`j`6Ro0vAnA4j6*?k~GA1f2t%zXLiU<-F zB`RVXA|R6FXe$nYpo}7rh$v{w&=8pf6DJ5`jtCMNBSQ#tNFoWDPTdpy-CpdowuXM^*rZv00lV(B zJIhcC-A}}p+gvJ98_5a6F9mPpw6qZiO@lh8L;YKUWiMf5Gz(70tM@i{JBx`>ohMP4 zq%v(dwM+ku6W@92bhd+LbffeKfZt=QU<42M9!OZ_y*j*28X4^rxc=|1{<_#tH(s{~ z?=Vff80@-b`O+ay^M>X*hgpA#2)s8=ZCB=kzh@Ufwau4JdZZyr2A4Qd`_AdE;xI)d zbQYhi)CZJs7%<+FIw{C@H9<{9oh8^2-62@`!|HGLa{j-BL?g5fbZ8SW-_co$s8C94 z!jBCdhvPkI;MMS161u=`;4OlLac4(Z{T>>|=i^0%KPJdxdQXp|#V_+S6&8Xd5vD2_ zW!Lbk36w694)BjcvYCJUqFOrwjjv~<0x6q@&KwoF0VBY-Zheg=D)Pp-KbBef^Q2Ep zmVKt(;Ira=?6y~dPnc_VLIn&O=N?0z*lDSGB!qD07=3)%8jLi6(fj z0NsEWns^%hYVy!+68Rs4k1wXs9c2M-fYH;ur{_I-{6|UB=p#?@(4&HP_&f`w8Wd}{ zgZWsZKCqR5C}(#;-1*bV>dgv{7P_O}Xo0FMdQ_nz%L~Zc+f?v(ND3Oy2{wfg~Gg<>q8<4}~ZDZdTo};cI`~|RIlRGZ1b6)Z_S_3eZxRT8`?(F^h<`c81 z-%F2OBb#;J&ppw-LpHh+f=I}Z>MR*)9 z=Wk{RPvRrGM55<(Qsc1&nsXqZp%R*K2;0D2=<*we`{jeUqqskls&yGcPs;(FgB|)2 zN8^IepLUjdip>Ky3@A79HJk7OITZQUZ2~48)7u5x)hF6>C~Q(KW5gz!7lB@-u56e3 z2&sTa2M;OL{3{5Y2#Taw4@Kjv_yR0niCh!So7k-U@d8TZ~|8*_O$eRv2}H0%H+30%Y+7u$Qd~B zc>%d@2VG^zUdJd-7e!2J%DOdmIiVKT5(R_()$osA=YD1ivu(sS9hfL`g_E}_GDjyQ zr~#{RxFuqU72Wr$)TzLkfw6_^q|!=9P=v*$;LsWvLy(LC>VZD+6%wjIoB;aJCSfE6 zBtl70GL!<5**TZMm%>aHnnW7Mbm7qr{NMo}jhcs%JwA^bRLd2!%73-)Yn94%t2cJx z0asQS5s7%KEd8N{oRGESSGl5((_UhK-DV)Bz- zsD{>FpQP7!61;Cr@o--wb)0sp|2!u>DSbTAlcu+29wuq`T)N8gx1>GE(hKdx>shdk z>W`9*gtZxx`?dA9D^wPWT)(>u+`tO~Ap+?`H`1vqQDMPDwS2;jrfz0))NV3)5J*Eu zzaNs|f`({G_?0qIRD#p6fL3}_U)Z; zE1t57?euz5#m}4KknU6-b;@+@xzJ}puK7nKii7Wo%2WE+>KN9Q;`x0FMR*(wD=SQH z7iNZnCUr%$I~dQQXf8Q0F%Fn*bJyRG#Nepahv%zoZkO+!Yj+dM3(FJ!?$KFaS^chT z++%89IOSB|78>7xzmIs;#O_$bie39QTWS^y(9$(xj2Vv29Db9QFtnd3OOsRG6cLK zQT8B#2jg<%I-xHv;VpnEUn?OZZ*7aD-MfGVy79u9204~!(${=pNI#713m<1LvwVNX zAkrzweT(8t>peryx5i{$YLw8Mk<=8#&2}d%UajZba$jv=SnKiQf}d@~MN8vqgt<)0 zm!Q_y5-I_X7fEaQtY9uInqmsTxX=yByx}|~<(I_9<^b$@aXmN#T<{Xe8#{iNJ;=31 zhDZ{2bdJMIrW$UwI$E<{)!|dbR!N{s=xh#luzBMIC4l3yb-Jh>sPg$JR>K4FXa{}8 zXOA673tG~l?W?8)R8jPyN3a=q<9E?yz_2Az5_bk0yb-itIfNWW&cr@tJixuTy&yb> zR6&A+O_%^8VGPRdbb))-uVt`RmsDNat6N0DijrW|oXKoKrkhypWkqwvk>zTn?iI%4 zs=PV+W=!wL?6c~U=NTS7f9w`^zPDWopVpOr)BM~KlG2~0&dvJh54>3O-mMzw>?@C1 zn?Oz^F|6}F5X)~aH;I-v-}^PLSERd?uV*}ph@*7JZKZDn-KZa|_%mywfo6gqQou_2 zXLSO2OdBGgdZ2LDk+ADc)iU=-Zl2WeK{=kMl<`G|wa zP!b-8FPZUAk)D?z;Z|MbyUcschT@lABXMb~9_(+xCGlkCFs<65KD;`_XS8?=Nvv^I zjHXF!ue+>>e7$OEps&1!cvpbhvxsa8UnPpy?eJnL6$$tuY(_|bJYpq3powO`^vpm= zCPVz9VngUrf+i3@88cO3eUVXr6x~vBGN6rLGLEU^6{ORw>QZ=#J4AD;J zD!wF6qI+tmf){mHzz{G7?g;n-K63Ng!LMuYq`VC8lA=}FM?DV}7?=T?1Gw2G>LpPw zXH(P-Pp4k6GO;yGHc!yNwDA$}GJ?ZtJkb_lkDh zcfYja25vzhT9oaVgyPhEjk*>+W(zQZnjahaVM&zb4Ov7l0fCqi zn~{}T=@`=%-Ot<%i4Phz*k7UUQ_8XZ27@sLl7c*Y0l~iHl=H+?0t@;iTmhn>;ay@~ zmo8jPsJLKCp3BEez|odX%5?U6Wa1D0dXV5aNt`g{DPq*Han!@3RjM4HI(F*&ZXc&W ziv2@&^>HhquuX|_byHhsB9{%ojE~P>oL$s>r0_)cGRxSvOWg-57c?GAifa!_O2Acx zv?On2gsj>YkOJbUPex*7MBz>qO zO4#-!+Bf8o+KX0#V%qxdM93WDJ+0lv(#6LFgftym5jx-NE1#>$nt`jwD}^c`5lKkB zxuJg`<)<2~q;3aWxDH_w+B}H+bvp+xg1WKTg@KfOI1@Z|^P#nh7@R}w@!c;WO3(Ft zb=sT$T^+c2nel(WT$Q!|#hQpsBWAI%W>cy4NTPK>M@?^)SIc-79I&dciMo-f7$>HG z<(j}JW61tHWr-rCb3Zv>@|=AP2dAj>P}b;}#tjs)QN-d*Wq?NXyc%tN&BG{CPb)D) zpcBQe;`fSpRN#Re`nO%fpgCQjj8&u{_58*`X|LC_TC#b`YUo!a)xJ>!C&Exa3i7Pa z-c-)LM%5#?Mk~v`sEK5#sGyZ&nY3@m1UXl>=Fu{GfL_yIMUAHje(813wt7TlS6AEl zlE%n)w+_L*wq_22a8B#|XV_Z&O>7-84_(2}D4x?TuVWCKWsbCB%IWW;b-myv7$uQ; zx>XQbTgaK_7neC*B4MCmE1mG2VA9R`M zgDnd+Y7!z}%V%dgRj(fTkGt{~qX&h3h~$`mi)Qof5sAW3o(nmvoeE6u!*mo*gd*e7 zX3l2$@0w(dl!eWB|G+ru9LBbClj*Fhf1_oj44Ve3*oi?tRZeezU9=(=H+Rp=EkfU< zcq?Nmp(kDNQC`IkJ*m4#QM1L8?TL%9k;YT12goK}*d&OCcuT^&iFgpvzt&y>e`ZfX z7?q25LJ|;Bs=^t;18`gd_Y%+v<*D9`cF25)MYrHNf!ZJ*=-xM@w#KW z6@2P|g6;@YcB4{x_Sx5aE)n_F<-qN5vPcTfNzQ0I7$65i906PcaA;!~gHPZaUIWS% zBpE|P1Z|L<|8zD5^EGVN)ZVhGt{?bmJ}TsvbtwxHn-8;~Hog{9zS|)p=V31_xl`TH zEBbVoe;+a)+OL4$&H%qE>Z_DZYPT*H2P`!$5HKor2MP@r1oD^rH7BS0bqB|(73y5i zWa1x;`7@pe<7etMKqvnSZgSpdy=(vJEsy%#st|}7UEKw>VOsVPTfDp|v%H2j69kD{T>=o04<223Ubn6Oa?2QgAe?&I^IFnn zKl`a9QKZ7{_D#fRzzT(93e$l@d>~>_V?5{^`NZF}&i+_*_E-}awS@|P%7lm7%K%9# z-4YW!i2e3+X)h!WQ+4*j{+Z)P^{2;4aJd4QFR5Ol*^q^T2kPgJh@d)l=%@n(p6F(_ z#tk|(IJTHpZ&dKBc7_J~{So?SG66-|bM|d~2}YzqRi#;ut_&;H)o{i76+#W0gTx66 zkjy$O27?I)bsEI-3(IaIUM%WBr+puA5SjoykL)j4JZndR!@(VA4&R6C@|)_~uEy+c zXAM>)AKQat2+INrYKfRyYiUbv&IC@A@>^XAeO`9DizHR*!+i`5DM+e+lQdvYiAx90immVr+#N_Sj9w|y0y@o-nSz=V^HQ;d==h=s|vb>XjxTgOwe3sq#y zOnjN@Na^shnX8S+6P4NhG4`VNTHvrf$wUyES1dd?haSF<6_EHA1;y6Ri09OOEWA3R zM73zqs&!iv12iUzbYL%#(i7Mrb4?Npl%=R}uR1L#CrU3!sIFhwK$eP(CKJHr4Edi!b84x6wHC{glsk zTds`p5E3J>3|9GH!0{A{xFLeiSq~rbbLx=dJ~@uU*AX7+-Z$e-l5qJ0pFdZlp#}{!!N8GD51wGoDhoso={DL%r@4FkJ02vya!WGS1EXl9N5vO-U|@ zXFnmNz)Ue#!gXK|D-tjO9jtmV_}nuCXda@F{ohd63$JrmTOhP54f|ii>9?0(phB!s zd9^$SI~ruLja=husa5-+ai3$ zr1Y~q5el9jy{K9!wGuM7I4|2G*vxxa9zkbJ>TwSu$g&@P5fkjL`96W#2#9dYjjXRm z5;i)mL|mf=``r3zyAsCTfy~hzz22+wlhw29*_x&LuLqGP&HD;ZdBK=V;a$`T(KZsh z^n>X)O#mPNLZ=H~fwJkHw#{yA=nCU;_GNH$VO2$Iu_`6tS=;+psn7!kn+JRn;I<^w zrC;CYQI^b1_+|0_)>Y{@GcQ%Uwi{=$PS0OuKs;ZTTMXMW^A5CrVXf!O?RXI;`VGL= z*MZ@O9{J2hFVS2OyFksP=1Qn!TEi5KG16p;vPLcPpS{p;etHz%9=>{a?%r>W+Xrl} zJiWL=t6ThD5^7dAg!Ruj$cjd@L_Z>=+ zaYhlv_HMj5hzLl0TY87_?~L1wCtuhhpoI}U?x^6smK>K$_9~^uvnY>};PpTG-PM`x zlnN7W+q+RON|y)?RN*I2q&uCY7fNXZX5*;QFG{@b!+j{BZfG6c9XsF>6fYu0}2t(VG+89*-_C8>0e_PCfyvIf@U+Y@aWz>8)&ty3(Su7b}) z$W3j2=J!u~4j_w14zG>j1*?mNL!8oCd?aOiVyUFM0wypNi zl0+ZT@ft+L72_CXPJpB_B%cZzaNoj|P<17~3{v8&YYdM%tCEol;H%&SB@vhZh%n)? zN@)4VKYy(`cY=G!udKyjS>OWdqMKXqM&ZbMi@8b?MD4>qH7-yG01y5b2G z-HwbuyZF^su&YAFlVuiVj-%*SFS2}vzWWDaD9XWiX)07Ah+(1a)z`UW0(k84Nx-DP&A>oMZSh0Rvq+ zIUM~ebWskp!zSv$v@cwWax&C0orcYI_=`eD@FrB4-THOtB&ugupq+k6vzz^Rh7J^%_VC@RXazbA zdIaIEbX774%h-xvgK0~`u6YzpxnK5S(X1lp9_!y0i+ub}tm?7p_4LSUnm90e{85k< zY%FlQhv(~yhSZ%hhC;0#39UPg>tN-0nSyYo{&%}}fMMU!j2`+KwnletpIY*hs-Q3T z8p@(E!12y(ZeyrYE^^3K=cu*buQhkHhIuR&g(YopP7p9uDr<))w(F5XbwpK6Dj6=x z^*@eyA$MXQ5X~32L#v6d|Do}|>X=tAQ@>v;)~8-c20i9cB3*t}n_fGM=Y_XI95(^M zVwo`DhiB^uo2}2K%%AX@AS4g&IP3S1foUZ2>o2S41zfg8E3#QmZYmV}$P1Sk^7r6G z2`R9UJmK?CA9Q4N)Sb%m8;(qfc!qVv_oX{E`l?9cX^wFei;~0A9voDq-!A`v(F7ve z(Xs#^F^N#m&U&aGgi)%tT@C?52v5UAbqOA4bm7A&>j=Xtc9PY*$0~VUN<*3w3G29J z`$TRrJkIZ8f4;@;L8wUAV7$f+e+TJ+Mii->o2aKjOO8-u1CGn>1*%Gxd>FgojsEH+ z{H?2uTk~A`mWvJx-`V>wCb!r{W+{esh&-F|a%St!!o6NxQ(&D?I`zI0epkG;SeK}f zq!!U1TDH2ULs+1-5D^(aoq_6e`k@lSXZFA}AC3|R1rk^yLJ45@k^Hl?77dvX?kp7= zufj>Wjve`9sP&#bYj}3x*o*(k6aTb9{Y0H0oJ?(kqRQjN;@1jO;+uQYhDHbJ?`l_M zV6MGaEu(P%oHc(&UY(cKm+jvWbe?1L4(GRyCM@?>9d$do7%WKZy~54BOz&%nwIneL z`$1Zx#YM66^-uUq>r@ekBGvG_iC({R!vQ44($??neIWMBl5OPri&1R%O(^thZE*?q z(H`8+jo`9RK)v?rfPWdfG$$hEPVzJ+d zOOS6jdb?N~EC&)%)YakNc6Ap*y7QeaWA&htgU?JSY{@5M)@<*yu&%@JAL&lo}D{VTT^qK!AJQv@KYqi{a zQe;eQpmJ^Zx&~<+{2D8f5!;rMHkZ^0M^fWxaV;U&6x%L&xaiFGfK-o;Sg_{Twpx$S zqW$0#oB8_D+Tr?^pF@bP!%K_Dq~XI4`bNX@$gzh!;@Jjo?##+@*%RARB5;t`HCy=@ zfl-i)9lWjF8uD9LYVnobfhr2!Zoo!$d?ekkC9$6f24`H^RSPVZ2-)pRiv!0l6gAU3 zMeXPegj)44?WU&MJsEE}=J>dTigQ~{PS@mza4pa8mq`C}ANK#reRWw9-Z--Nr&)wu zJF;5u<(!nx8}vSF4?iH&dpbv%u`Hp72bX9oG9-7ki$#vLgwq>H?Myfd9g23|%gup{ zR|j<$mdA!KAagr%=*nc|^}x><#lif9r_$KQko28*AY~5inQluPMz7@J0h5?!9xMB} zYckh<8!u=cN^-{tb~=VP)2Tv%eRyyfv+m@zE5qJO`NLb3mj&lM|ND8h zND+S0iTa3(Jo+cZPjVuiC9@toUvx?P5>{qye1CJ@;o3CWs6Ccnd$=|C`^)WD_Z4Vg z!h`>b&2#9_qPkW*G|vdTkl(jxKdS7{F~hS%WIB;~MhQB7--`c_|F+F9+}*AFC6OPF z3RUEPS1VP62Tcd8FJ~{k{RXphht5vdw{1551mdYYk5A8S#+BuKaz<7tCXn~)7e(3+ zl&?P%My5!=Y>8hu#zdZZau4M|?nhC{?PlL+BB!Aa7E1ZMA{qsV zHJ88-)o}03g=PKFcHOc4+gcPDv)sq|HAA`h_O{$}9m2#>(uk4I=>|VfIc=EU z{}}t2dKTNB)R$j79hV1U+iPPSUltk#1THWNcJxCZ-Nf~==jE+X9T@Ntz3SHoIZGa4 zP=Ys*7${KARHagO9nQTnI^O%#v)ps7J)t;xlM@27thk%|Tb z(TfkDh^~Fo@%wi*Xc*uL{YBS>n%^Xr&&wO_V36ct_j@Hva#rXi8NQf z%Z}qE^o5@c2)tsMq4e!4dXI^4K-o{q55AT#+HVXR_pSW%agFN{*_q!Ut}T32Sz2B< zH@hgo$QtWq$2}&u_2*l4_8k*?VL;>IU;d2GIPg5Y_ES*nE7(%|ES?>#ocjK-)B77; zl4F^z)YvxpB6(SBcq<1YCoN1rZR&B}x9C!O@i@7GMJ(eKbD20K?S;?Rb@r*hOXHvR z<%Tf)WRCA0^F!#9V!n@HmT6mU;=>g4)xHR1u-=8^HG<=eM%;|>8F3itW22%REK1n;|Gy}F^pLKk z`KX0q?42Qe;_>_KB>}C>Jikkh)Exnqi72)vfUeL?*YpuJc6W(x5@(eKq7S8PXn0`X;SqLLA6i*}s(fLpc}hIIa3IJhw>#df`tu49Wfx z!%N0`;oie2)v*#P#eZ~559nK5OgrQCQK>RS!srD1Sz1`ww?lY2G=}Mxrhle{2#jy1 zGxx?~IbRYeXVvywszC9@Cy=+>>CEnrFj5kC>`5rWyAD*AJXebXOsdz6)!~#`jg2KE z2KC6cwPo%btO7|}T~P<+xo*kl)vD$J|BevU3YvlnjYa5A)FLdIT1F_+5;6WUg?Y3u z3`=6kanEUHCbaVHFJ>q@y!~QD-H%2eR+Dc_O8lVe^tRCB)4@oa*gw2Wi~mcf-p-l7 zfO*gC-XB}IK)30@me}!n8|%LOr;aMCnPSRt`S>7fG>nd`vieQ}y(hX)EY#CfecRq# zU_BnlEJVSp#~0o8p~C#* zCuZeLkA}CpO5goks7nFpxz$ySKGSz6Eo1ieR~e>&fj(7um1uIY}f?= diff --git a/installer/build/entitlements.mac.plist b/installer/build/entitlements.mac.plist deleted file mode 100644 index 38c887b..0000000 --- a/installer/build/entitlements.mac.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.cs.allow-jit - - com.apple.security.cs.allow-unsigned-executable-memory - - com.apple.security.cs.allow-dyld-environment-variables - - - diff --git a/installer/build/icon.icns b/installer/build/icon.icns deleted file mode 100644 index 28644aa9d97942c50008d03bc0f93505f7824737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85649 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

-KY5Dg)0#~?~rEbJH_9`n*G*i+1Ec#;TIAa-b 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 diff --git a/installer/build/icon.ico b/installer/build/icon.ico deleted file mode 100644 index 72c391ebcc280e8c34ec175fabb4337e34804b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123545 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 bqOm^PqC+~3h1FmPI^vm>($fM-eXsuqO4ic& diff --git a/installer/build/icon.png b/installer/build/icon.png deleted file mode 100644 index cf9e8b2c87b5c18ac0b26913af6fd3ed00ec3bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35949 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

(|V7O%OOlsc*vU+P^72X!U7K_eX*CG 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 E`T9pxN5i1O>p>VAy6%lIREYyb! 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 Kl11VsAO0U5dJ04U diff --git a/installer/bun.lock b/installer/bun.lock deleted file mode 100644 index c6da334..0000000 --- a/installer/bun.lock +++ /dev/null @@ -1,1117 +0,0 @@ -{ - "lockfileVersion": 1, - "workspaces": { - "": { - "name": "electron-app", - "dependencies": { - "@electron-toolkit/preload": "^3.0.0", - "@electron-toolkit/utils": "^3.0.0", - }, - "devDependencies": { - "@electron-toolkit/eslint-config": "^1.0.2", - "@electron-toolkit/eslint-config-ts": "^1.0.1", - "@electron-toolkit/tsconfig": "^1.0.1", - "@rushstack/eslint-patch": "^1.7.1", - "@types/node": "^18.19.9", - "@vitejs/plugin-vue": "^5.0.3", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^12.0.0", - "electron": "^28.2.0", - "electron-builder": "^24.9.1", - "electron-vite": "^2.0.0", - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.20.1", - "prettier": "^3.2.4", - "typescript": "^5.3.3", - "vite": "^5.0.12", - "vue": "^3.4.15", - "vue-tsc": "^1.8.27", - }, - }, - }, - "packages": { - "7zip-bin": ["7zip-bin@5.2.0", "", {}, "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A=="], - - "@aashutoshrathi/word-wrap": ["@aashutoshrathi/word-wrap@1.2.6", "", {}, "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA=="], - - "@ampproject/remapping": ["@ampproject/remapping@2.2.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg=="], - - "@babel/code-frame": ["@babel/code-frame@7.23.5", "", { "dependencies": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" } }, "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA=="], - - "@babel/compat-data": ["@babel/compat-data@7.23.5", "", {}, "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw=="], - - "@babel/core": ["@babel/core@7.23.9", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.23.9", "@babel/parser": "^7.23.9", "@babel/template": "^7.23.9", "@babel/traverse": "^7.23.9", "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw=="], - - "@babel/generator": ["@babel/generator@7.23.6", "", { "dependencies": { "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw=="], - - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.23.6", "", { "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ=="], - - "@babel/helper-environment-visitor": ["@babel/helper-environment-visitor@7.22.20", "", {}, "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA=="], - - "@babel/helper-function-name": ["@babel/helper-function-name@7.23.0", "", { "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" } }, "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw=="], - - "@babel/helper-hoist-variables": ["@babel/helper-hoist-variables@7.22.5", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw=="], - - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.22.15", "", { "dependencies": { "@babel/types": "^7.22.15" } }, "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w=="], - - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.23.3", "", { "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ=="], - - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.22.5", "", {}, "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg=="], - - "@babel/helper-simple-access": ["@babel/helper-simple-access@7.22.5", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w=="], - - "@babel/helper-split-export-declaration": ["@babel/helper-split-export-declaration@7.22.6", "", { "dependencies": { "@babel/types": "^7.22.5" } }, "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.23.4", "", {}, "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.22.20", "", {}, "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="], - - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.23.5", "", {}, "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw=="], - - "@babel/helpers": ["@babel/helpers@7.23.9", "", { "dependencies": { "@babel/template": "^7.23.9", "@babel/traverse": "^7.23.9", "@babel/types": "^7.23.9" } }, "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ=="], - - "@babel/highlight": ["@babel/highlight@7.23.4", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A=="], - - "@babel/parser": ["@babel/parser@7.23.9", "", { "bin": { "parser": "bin/babel-parser.js" } }, "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA=="], - - "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.23.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ=="], - - "@babel/template": ["@babel/template@7.23.9", "", { "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.23.9", "@babel/types": "^7.23.9" } }, "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA=="], - - "@babel/traverse": ["@babel/traverse@7.23.9", "", { "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/parser": "^7.23.9", "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg=="], - - "@babel/types": ["@babel/types@7.23.9", "", { "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q=="], - - "@develar/schema-utils": ["@develar/schema-utils@2.6.5", "", { "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" } }, "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig=="], - - "@electron-toolkit/eslint-config": ["@electron-toolkit/eslint-config@1.0.2", "", { "peerDependencies": { "eslint": ">= 8.0.0" } }, "sha512-GJVuMsxBHfVARfmUoSTCHT0e/QfWlVbXcGk3tgoku0ad6tLjydbv2LpvKi02+Sy2WiEz9L9SkGSw090ukT/F0A=="], - - "@electron-toolkit/eslint-config-ts": ["@electron-toolkit/eslint-config-ts@1.0.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/parser": "^6.14.0" }, "peerDependencies": { "eslint": ">=8.0.0", "typescript": "*" } }, "sha512-6RkoGE/W/WVlDozy/u6/lo5THNP5CCAPxdKpdQuYaopUfObs3o+JyxdlSb45imh+nL8nv875970EoyplntXaug=="], - - "@electron-toolkit/preload": ["@electron-toolkit/preload@3.0.0", "", { "peerDependencies": { "electron": ">=13.0.0" } }, "sha512-DTyvNGits43J1RiQGFN00/OxjjcTcozLWMjgQBANt97FFptEYiLVasq7kMC24nMwwoOpdDYY9CE6C+4wQJ55/w=="], - - "@electron-toolkit/tsconfig": ["@electron-toolkit/tsconfig@1.0.1", "", { "peerDependencies": { "@types/node": "*" } }, "sha512-M0Mol3odspvtCuheyujLNAW7bXq7KFNYVMRtpjFa4ZfES4MuklXBC7Nli/omvc+PRKlrklgAGx3l4VakjNo8jg=="], - - "@electron-toolkit/utils": ["@electron-toolkit/utils@3.0.0", "", { "peerDependencies": { "electron": ">=13.0.0" } }, "sha512-GaXHDhiT7KCvMJjXdp/QqpYinq69T/Pdl49Z1XLf8mKGf63dnsODMWyrmIjEQ0z/vG7dO8qF3fvmI6Eb2lUNZA=="], - - "@electron/asar": ["@electron/asar@3.2.8", "", { "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" }, "bin": { "asar": "bin/asar.js" } }, "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg=="], - - "@electron/get": ["@electron/get@2.0.3", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ=="], - - "@electron/notarize": ["@electron/notarize@2.1.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", "promise-retry": "^2.0.1" } }, "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA=="], - - "@electron/osx-sign": ["@electron/osx-sign@1.0.5", "", { "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", "fs-extra": "^10.0.0", "isbinaryfile": "^4.0.8", "minimist": "^1.2.6", "plist": "^3.0.5" }, "bin": { "electron-osx-flat": "bin/electron-osx-flat.js", "electron-osx-sign": "bin/electron-osx-sign.js" } }, "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww=="], - - "@electron/universal": ["@electron/universal@1.4.1", "", { "dependencies": { "@electron/asar": "^3.2.1", "@malept/cross-spawn-promise": "^1.1.0", "debug": "^4.3.1", "dir-compare": "^3.0.0", "fs-extra": "^9.0.1", "minimatch": "^3.0.4", "plist": "^3.0.4" } }, "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], - - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.10.0", "", {}, "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA=="], - - "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - - "@eslint/js": ["@eslint/js@8.56.0", "", {}, "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A=="], - - "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.11.14", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.2", "", {}, "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw=="], - - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.3", "", { "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.1", "", {}, "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA=="], - - "@jridgewell/set-array": ["@jridgewell/set-array@1.1.2", "", {}, "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.22", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw=="], - - "@malept/cross-spawn-promise": ["@malept/cross-spawn-promise@1.1.1", "", { "dependencies": { "cross-spawn": "^7.0.1" } }, "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ=="], - - "@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - - "@pkgr/core": ["@pkgr/core@0.1.1", "", {}, "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA=="], - - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.9.6", "", { "os": "android", "cpu": "arm" }, "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.9.6", "", { "os": "android", "cpu": "arm64" }, "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.9.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.9.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.9.6", "", { "os": "linux", "cpu": "arm" }, "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.9.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.9.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.9.6", "", { "os": "linux", "cpu": "none" }, "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.9.6", "", { "os": "linux", "cpu": "x64" }, "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.9.6", "", { "os": "linux", "cpu": "x64" }, "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.9.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.9.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.9.6", "", { "os": "win32", "cpu": "x64" }, "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ=="], - - "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.7.2", "", {}, "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA=="], - - "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], - - "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], - - "@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="], - - "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], - - "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], - - "@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], - - "@types/fs-extra": ["@types/fs-extra@9.0.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="], - - "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], - - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - - "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], - - "@types/ms": ["@types/ms@0.7.34", "", {}, "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="], - - "@types/node": ["@types/node@18.19.10", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-IZD8kAM02AW1HRDTPOlz3npFava678pr8Ie9Vp8uRhBROXAv8MXT2pCnGZZAKYdromsNQLHQcfWQ6EOatVLtqA=="], - - "@types/plist": ["@types/plist@3.0.5", "", { "dependencies": { "@types/node": "*", "xmlbuilder": ">=11.0.1" } }, "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA=="], - - "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], - - "@types/semver": ["@types/semver@7.5.6", "", {}, "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A=="], - - "@types/verror": ["@types/verror@1.10.9", "", {}, "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ=="], - - "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.19.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.19.1", "@typescript-eslint/type-utils": "6.19.1", "@typescript-eslint/utils": "6.19.1", "@typescript-eslint/visitor-keys": "6.19.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@6.19.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.19.1", "@typescript-eslint/types": "6.19.1", "@typescript-eslint/typescript-estree": "6.19.1", "@typescript-eslint/visitor-keys": "6.19.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.19.1", "", { "dependencies": { "@typescript-eslint/types": "6.19.1", "@typescript-eslint/visitor-keys": "6.19.1" } }, "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.19.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.19.1", "@typescript-eslint/utils": "6.19.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@6.19.1", "", {}, "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.19.1", "", { "dependencies": { "@typescript-eslint/types": "6.19.1", "@typescript-eslint/visitor-keys": "6.19.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@6.19.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.19.1", "@typescript-eslint/types": "6.19.1", "@typescript-eslint/typescript-estree": "6.19.1", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.19.1", "", { "dependencies": { "@typescript-eslint/types": "6.19.1", "eslint-visitor-keys": "^3.4.1" } }, "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ=="], - - "@ungap/structured-clone": ["@ungap/structured-clone@1.2.0", "", {}, "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="], - - "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.0.3", "", { "peerDependencies": { "vite": "^5.0.0", "vue": "^3.2.25" } }, "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA=="], - - "@volar/language-core": ["@volar/language-core@1.11.1", "", { "dependencies": { "@volar/source-map": "1.11.1" } }, "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw=="], - - "@volar/source-map": ["@volar/source-map@1.11.1", "", { "dependencies": { "muggle-string": "^0.3.1" } }, "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg=="], - - "@volar/typescript": ["@volar/typescript@1.11.1", "", { "dependencies": { "@volar/language-core": "1.11.1", "path-browserify": "^1.0.1" } }, "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ=="], - - "@vue/compiler-core": ["@vue/compiler-core@3.4.15", "", { "dependencies": { "@babel/parser": "^7.23.6", "@vue/shared": "3.4.15", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw=="], - - "@vue/compiler-dom": ["@vue/compiler-dom@3.4.15", "", { "dependencies": { "@vue/compiler-core": "3.4.15", "@vue/shared": "3.4.15" } }, "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ=="], - - "@vue/compiler-sfc": ["@vue/compiler-sfc@3.4.15", "", { "dependencies": { "@babel/parser": "^7.23.6", "@vue/compiler-core": "3.4.15", "@vue/compiler-dom": "3.4.15", "@vue/compiler-ssr": "3.4.15", "@vue/shared": "3.4.15", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", "postcss": "^8.4.33", "source-map-js": "^1.0.2" } }, "sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA=="], - - "@vue/compiler-ssr": ["@vue/compiler-ssr@3.4.15", "", { "dependencies": { "@vue/compiler-dom": "3.4.15", "@vue/shared": "3.4.15" } }, "sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw=="], - - "@vue/eslint-config-prettier": ["@vue/eslint-config-prettier@9.0.0", "", { "dependencies": { "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0" }, "peerDependencies": { "eslint": ">= 8.0.0", "prettier": ">= 3.0.0" } }, "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg=="], - - "@vue/eslint-config-typescript": ["@vue/eslint-config-typescript@12.0.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "^6.7.0", "@typescript-eslint/parser": "^6.7.0", "vue-eslint-parser": "^9.3.1" }, "peerDependencies": { "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", "eslint-plugin-vue": "^9.0.0", "typescript": "*" } }, "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg=="], - - "@vue/language-core": ["@vue/language-core@1.8.27", "", { "dependencies": { "@volar/language-core": "~1.11.1", "@volar/source-map": "~1.11.1", "@vue/compiler-dom": "^3.3.0", "@vue/shared": "^3.3.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", "muggle-string": "^0.3.1", "path-browserify": "^1.0.1", "vue-template-compiler": "^2.7.14" }, "peerDependencies": { "typescript": "*" } }, "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA=="], - - "@vue/reactivity": ["@vue/reactivity@3.4.15", "", { "dependencies": { "@vue/shared": "3.4.15" } }, "sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w=="], - - "@vue/runtime-core": ["@vue/runtime-core@3.4.15", "", { "dependencies": { "@vue/reactivity": "3.4.15", "@vue/shared": "3.4.15" } }, "sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw=="], - - "@vue/runtime-dom": ["@vue/runtime-dom@3.4.15", "", { "dependencies": { "@vue/runtime-core": "3.4.15", "@vue/shared": "3.4.15", "csstype": "^3.1.3" } }, "sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw=="], - - "@vue/server-renderer": ["@vue/server-renderer@3.4.15", "", { "dependencies": { "@vue/compiler-ssr": "3.4.15", "@vue/shared": "3.4.15" }, "peerDependencies": { "vue": "3.4.15" } }, "sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw=="], - - "@vue/shared": ["@vue/shared@3.4.15", "", {}, "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g=="], - - "@xmldom/xmldom": ["@xmldom/xmldom@0.8.10", "", {}, "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="], - - "acorn": ["acorn@8.11.3", "", { "bin": "bin/acorn" }, "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg=="], - - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - - "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], - - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "app-builder-bin": ["app-builder-bin@4.0.0", "", {}, "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA=="], - - "app-builder-lib": ["app-builder-lib@24.9.1", "", { "dependencies": { "7zip-bin": "~5.2.0", "@develar/schema-utils": "~2.6.5", "@electron/notarize": "2.1.0", "@electron/osx-sign": "1.0.5", "@electron/universal": "1.4.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", "builder-util": "24.8.1", "builder-util-runtime": "9.2.3", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.4", "ejs": "^3.1.8", "electron-publish": "24.8.1", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "is-ci": "^3.0.0", "isbinaryfile": "^5.0.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", "minimatch": "^5.1.1", "read-config-file": "6.3.2", "sanitize-filename": "^1.6.3", "semver": "^7.3.8", "tar": "^6.1.12", "temp-file": "^3.4.0" } }, "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g=="], - - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - - "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], - - "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], - - "async": ["async@3.2.5", "", {}, "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="], - - "async-exit-hook": ["async-exit-hook@2.0.1", "", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], - - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - - "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], - - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - - "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], - - "bluebird-lst": ["bluebird-lst@1.0.9", "", { "dependencies": { "bluebird": "^3.5.5" } }, "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw=="], - - "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - - "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], - - "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "braces": ["braces@3.0.2", "", { "dependencies": { "fill-range": "^7.0.1" } }, "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="], - - "browserslist": ["browserslist@4.22.3", "", { "dependencies": { "caniuse-lite": "^1.0.30001580", "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": "cli.js" }, "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A=="], - - "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - - "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - - "buffer-equal": ["buffer-equal@1.0.1", "", {}, "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg=="], - - "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - - "builder-util": ["builder-util@24.8.1", "", { "dependencies": { "7zip-bin": "~5.2.0", "@types/debug": "^4.1.6", "app-builder-bin": "4.0.0", "bluebird-lst": "^1.0.9", "builder-util-runtime": "9.2.3", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "is-ci": "^3.0.0", "js-yaml": "^4.1.0", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0" } }, "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw=="], - - "builder-util-runtime": ["builder-util-runtime@9.2.3", "", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw=="], - - "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], - - "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], - - "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], - - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - - "caniuse-lite": ["caniuse-lite@1.0.30001580", "", {}, "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA=="], - - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], - - "chromium-pickle-js": ["chromium-pickle-js@0.2.0", "", {}, "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw=="], - - "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], - - "cli-truncate": ["cli-truncate@2.1.0", "", { "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg=="], - - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - - "commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], - - "compare-version": ["compare-version@0.1.2", "", {}, "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A=="], - - "computeds": ["computeds@0.0.1", "", {}, "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q=="], - - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - - "config-file-ts": ["config-file-ts@0.2.6", "", { "dependencies": { "glob": "^10.3.10", "typescript": "^5.3.3" } }, "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w=="], - - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - - "core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], - - "crc": ["crc@3.8.0", "", { "dependencies": { "buffer": "^5.1.0" } }, "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ=="], - - "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], - - "cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - - "de-indent": ["de-indent@1.0.2", "", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="], - - "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], - - "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], - - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - - "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], - - "define-data-property": ["define-data-property@1.1.1", "", { "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.0" } }, "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ=="], - - "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - - "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], - - "dir-compare": ["dir-compare@3.3.0", "", { "dependencies": { "buffer-equal": "^1.0.0", "minimatch": "^3.0.4" } }, "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg=="], - - "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], - - "dmg-builder": ["dmg-builder@24.9.1", "", { "dependencies": { "app-builder-lib": "24.9.1", "builder-util": "24.8.1", "builder-util-runtime": "9.2.3", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" }, "optionalDependencies": { "dmg-license": "^1.0.11" } }, "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ=="], - - "dmg-license": ["dmg-license@1.0.11", "", { "dependencies": { "@types/plist": "^3.0.1", "@types/verror": "^1.10.3", "ajv": "^6.10.0", "crc": "^3.8.0", "iconv-corefoundation": "^1.1.7", "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" }, "os": "darwin", "bin": "bin/dmg-license.js" }, "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q=="], - - "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], - - "dotenv": ["dotenv@9.0.2", "", {}, "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg=="], - - "dotenv-expand": ["dotenv-expand@5.1.0", "", {}, "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="], - - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - - "ejs": ["ejs@3.1.9", "", { "dependencies": { "jake": "^10.8.5" }, "bin": "bin/cli.js" }, "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ=="], - - "electron": ["electron@28.2.0", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^18.11.18", "extract-zip": "^2.0.1" }, "bin": "cli.js" }, "sha512-22SylXQQ9IHtwLw4D+Z4Si7OUpeDtpHfJVTjy3yv53iLg5zJKKPOCWT4ZwgYGHQZ0eldyBrYBHF/P9FPd2CcVQ=="], - - "electron-builder": ["electron-builder@24.9.1", "", { "dependencies": { "app-builder-lib": "24.9.1", "builder-util": "24.8.1", "builder-util-runtime": "9.2.3", "chalk": "^4.1.2", "dmg-builder": "24.9.1", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", "read-config-file": "6.3.2", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, "bin": { "electron-builder": "cli.js", "install-app-deps": "install-app-deps.js" } }, "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg=="], - - "electron-publish": ["electron-publish@24.8.1", "", { "dependencies": { "@types/fs-extra": "^9.0.11", "builder-util": "24.8.1", "builder-util-runtime": "9.2.3", "chalk": "^4.1.2", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" } }, "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw=="], - - "electron-to-chromium": ["electron-to-chromium@1.4.648", "", {}, "sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg=="], - - "electron-vite": ["electron-vite@2.0.0", "", { "dependencies": { "@babel/core": "^7.23.5", "@babel/plugin-transform-arrow-functions": "^7.23.3", "cac": "^6.7.14", "esbuild": "^0.19.8", "magic-string": "^0.30.5", "picocolors": "^1.0.0" }, "peerDependencies": { "@swc/core": "^1.0.0", "vite": "^4.0.0 || ^5.0.0" }, "optionalPeers": ["@swc/core"], "bin": "bin/electron-vite.js" }, "sha512-EQiuPVSwJQRPGbZiVrCsCFMDVfNyNtSpDiyUV4fNwPKNadTjBfYMOudnLUpSeBTocKUZYf58SXSzSCAkNg0GTQ=="], - - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], - - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - - "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - - "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], - - "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], - - "esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": "bin/esbuild" }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], - - "escalade": ["escalade@3.1.1", "", {}, "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="], - - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - - "eslint": ["eslint@8.56.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": "bin/eslint.js" }, "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ=="], - - "eslint-config-prettier": ["eslint-config-prettier@9.1.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": "bin/cli.js" }, "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw=="], - - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.1.3", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.8.6" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": "*", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint"] }, "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw=="], - - "eslint-plugin-vue": ["eslint-plugin-vue@9.20.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.13", "semver": "^7.5.4", "vue-eslint-parser": "^9.4.0", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" } }, "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ=="], - - "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - - "esquery": ["esquery@1.5.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg=="], - - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - - "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - - "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": "cli.js" }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], - - "extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], - - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - - "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], - - "fast-glob": ["fast-glob@3.3.2", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="], - - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - - "fastq": ["fastq@1.17.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w=="], - - "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], - - "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], - - "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="], - - "fill-range": ["fill-range@7.0.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="], - - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - - "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], - - "flatted": ["flatted@3.2.9", "", {}, "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ=="], - - "foreground-child": ["foreground-child@3.1.1", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg=="], - - "form-data": ["form-data@4.0.0", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww=="], - - "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], - - "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], - - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - - "get-intrinsic": ["get-intrinsic@1.2.2", "", { "dependencies": { "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA=="], - - "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], - - "glob": ["glob@10.3.10", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": "dist/esm/bin.mjs" }, "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g=="], - - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], - - "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], - - "globalthis": ["globalthis@1.0.3", "", { "dependencies": { "define-properties": "^1.1.3" } }, "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA=="], - - "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], - - "gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="], - - "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], - - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "has-property-descriptors": ["has-property-descriptors@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.2" } }, "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg=="], - - "has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="], - - "has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="], - - "hasown": ["hasown@2.0.0", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA=="], - - "he": ["he@1.2.0", "", { "bin": "bin/he" }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], - - "hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], - - "http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="], - - "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], - - "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], - - "iconv-corefoundation": ["iconv-corefoundation@1.1.7", "", { "dependencies": { "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" }, "os": "darwin" }, "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ=="], - - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], - - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - - "ignore": ["ignore@5.3.0", "", {}, "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg=="], - - "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], - - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - - "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], - - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - - "is-ci": ["is-ci@3.0.1", "", { "dependencies": { "ci-info": "^3.2.0" }, "bin": "bin.js" }, "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - - "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], - - "isbinaryfile": ["isbinaryfile@5.0.0", "", {}, "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg=="], - - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "jackspeak": ["jackspeak@2.3.6", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ=="], - - "jake": ["jake@10.8.7", "", { "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" }, "bin": "bin/cli.js" }, "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w=="], - - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - - "jsesc": ["jsesc@2.5.2", "", { "bin": "bin/jsesc" }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="], - - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - - "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], - - "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - - "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - - "lazy-val": ["lazy-val@1.0.5", "", {}, "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="], - - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - - "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], - - "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "magic-string": ["magic-string@0.30.5", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA=="], - - "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], - - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - - "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], - - "mime": ["mime@2.6.0", "", { "bin": "cli.js" }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], - - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], - - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - - "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], - - "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], - - "mkdirp": ["mkdirp@1.0.4", "", { "bin": "bin/cmd.js" }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - - "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], - - "muggle-string": ["muggle-string@0.3.1", "", {}, "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg=="], - - "nanoid": ["nanoid@3.3.7", "", { "bin": "bin/nanoid.cjs" }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], - - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - - "node-addon-api": ["node-addon-api@1.7.2", "", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="], - - "node-releases": ["node-releases@2.0.14", "", {}, "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="], - - "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], - - "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], - - "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - - "optionator": ["optionator@0.9.3", "", { "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0" } }, "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg=="], - - "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], - - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - - "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], - - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - - "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], - - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - - "path-scurry": ["path-scurry@1.10.1", "", { "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ=="], - - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], - - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - - "picocolors": ["picocolors@1.0.0", "", {}, "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="], - - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], - - "postcss": ["postcss@8.4.33", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg=="], - - "postcss-selector-parser": ["postcss-selector-parser@6.0.15", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw=="], - - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - - "prettier": ["prettier@3.2.4", "", { "bin": "bin/prettier.cjs" }, "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ=="], - - "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], - - "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], - - "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], - - "pump": ["pump@3.0.0", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="], - - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - - "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], - - "read-config-file": ["read-config-file@6.3.2", "", { "dependencies": { "config-file-ts": "^0.2.4", "dotenv": "^9.0.2", "dotenv-expand": "^5.1.0", "js-yaml": "^4.1.0", "json5": "^2.2.0", "lazy-val": "^1.0.4" } }, "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q=="], - - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - - "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], - - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - - "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], - - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], - - "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], - - "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": "bin.js" }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - - "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], - - "rollup": ["rollup@4.9.6", "", { "dependencies": { "@types/estree": "1.0.5" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.9.6", "@rollup/rollup-android-arm64": "4.9.6", "@rollup/rollup-darwin-arm64": "4.9.6", "@rollup/rollup-darwin-x64": "4.9.6", "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", "@rollup/rollup-linux-arm64-gnu": "4.9.6", "@rollup/rollup-linux-arm64-musl": "4.9.6", "@rollup/rollup-linux-riscv64-gnu": "4.9.6", "@rollup/rollup-linux-x64-gnu": "4.9.6", "@rollup/rollup-linux-x64-musl": "4.9.6", "@rollup/rollup-win32-arm64-msvc": "4.9.6", "@rollup/rollup-win32-ia32-msvc": "4.9.6", "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg=="], - - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - - "sanitize-filename": ["sanitize-filename@1.6.3", "", { "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg=="], - - "sax": ["sax@1.3.0", "", {}, "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="], - - "semver": ["semver@7.5.4", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="], - - "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], - - "serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], - - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - - "simple-update-notifier": ["simple-update-notifier@2.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w=="], - - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - - "slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="], - - "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "source-map-js": ["source-map-js@1.0.2", "", {}, "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="], - - "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - - "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], - - "stat-mode": ["stat-mode@1.0.0", "", {}, "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg=="], - - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "sumchecker": ["sumchecker@3.0.1", "", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], - - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "synckit": ["synckit@0.8.8", "", { "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" } }, "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ=="], - - "tar": ["tar@6.2.0", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ=="], - - "temp-file": ["temp-file@3.4.0", "", { "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" } }, "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg=="], - - "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], - - "tmp": ["tmp@0.2.1", "", { "dependencies": { "rimraf": "^3.0.0" } }, "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ=="], - - "tmp-promise": ["tmp-promise@3.0.3", "", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="], - - "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], - - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - - "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="], - - "ts-api-utils": ["ts-api-utils@1.0.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg=="], - - "tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], - - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - - "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - - "typescript": ["typescript@5.3.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw=="], - - "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - - "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "update-browserslist-db": ["update-browserslist-db@1.0.13", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg=="], - - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - - "utf8-byte-length": ["utf8-byte-length@1.0.4", "", {}, "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA=="], - - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - - "verror": ["verror@1.10.1", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg=="], - - "vite": ["vite@5.0.12", "", { "dependencies": { "esbuild": "^0.19.3", "postcss": "^8.4.32", "rollup": "^4.2.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["less", "lightningcss", "sass", "stylus", "sugarss", "terser"], "bin": "bin/vite.js" }, "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w=="], - - "vue": ["vue@3.4.15", "", { "dependencies": { "@vue/compiler-dom": "3.4.15", "@vue/compiler-sfc": "3.4.15", "@vue/runtime-dom": "3.4.15", "@vue/server-renderer": "3.4.15", "@vue/shared": "3.4.15" }, "peerDependencies": { "typescript": "*" } }, "sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ=="], - - "vue-eslint-parser": ["vue-eslint-parser@9.4.2", "", { "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ=="], - - "vue-template-compiler": ["vue-template-compiler@2.7.16", "", { "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ=="], - - "vue-tsc": ["vue-tsc@1.8.27", "", { "dependencies": { "@volar/typescript": "~1.11.1", "@vue/language-core": "1.8.27", "semver": "^7.5.4" }, "peerDependencies": { "typescript": "*" }, "bin": "bin/vue-tsc.js" }, "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg=="], - - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - - "xml-name-validator": ["xml-name-validator@4.0.0", "", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], - - "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - - "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], - - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - - "@babel/code-frame/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "@babel/core/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], - - "@electron/asar/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "@electron/asar/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - - "@electron/get/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@electron/notarize/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "@electron/osx-sign/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "@electron/osx-sign/isbinaryfile": ["isbinaryfile@4.0.10", "", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="], - - "@electron/universal/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "@electron/universal/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "@eslint/eslintrc/globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], - - "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "@humanwhocodes/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - - "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - - "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@vue/language-core/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "app-builder-lib/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "app-builder-lib/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "builder-util/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], - - "dir-compare/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "dmg-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "electron-publish/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "glob/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "jake/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "path-scurry/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], - - "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], - - "temp-file/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "@babel/code-frame/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "@babel/code-frame/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "@babel/code-frame/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - - "@electron/asar/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "@electron/get/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], - - "@electron/get/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - - "@electron/notarize/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "@electron/notarize/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "@electron/osx-sign/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "@electron/osx-sign/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "@electron/universal/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "@electron/universal/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "@electron/universal/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "@eslint/eslintrc/globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - - "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "@humanwhocodes/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="], - - "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - - "@malept/flatpak-bundler/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "@malept/flatpak-bundler/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "@vue/language-core/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "app-builder-lib/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "app-builder-lib/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "app-builder-lib/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "builder-util/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "builder-util/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "dmg-builder/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "dmg-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "electron-publish/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "electron-publish/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "fs-minipass/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "jake/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "temp-file/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "temp-file/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "@babel/code-frame/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "@babel/code-frame/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - - "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - - "@electron/asar/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "@babel/code-frame/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - - "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - } -} diff --git a/installer/electron-builder.yml b/installer/electron-builder.yml deleted file mode 100644 index c2f8b04..0000000 --- a/installer/electron-builder.yml +++ /dev/null @@ -1,45 +0,0 @@ -appId: com.electron.app -productName: electron-app -directories: - buildResources: build -files: - - '!**/.vscode/*' - - '!src/*' - - '!electron.vite.config.{js,ts,mjs,cjs}' - - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' - - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' - - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}' -asarUnpack: - - resources/** -win: - executableName: electron-app -nsis: - artifactName: ${name}-${version}-setup.${ext} - shortcutName: ${productName} - uninstallDisplayName: ${productName} - createDesktopShortcut: always -mac: - entitlementsInherit: build/entitlements.mac.plist - extendInfo: - - NSCameraUsageDescription: Application requests access to the device's camera. - - NSMicrophoneUsageDescription: Application requests access to the device's microphone. - - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. - - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. - notarize: false -dmg: - artifactName: ${name}-${version}.${ext} -linux: - target: - - AppImage - - snap - - deb - maintainer: electronjs.org - category: Utility -appImage: - artifactName: ${name}-${version}.${ext} -npmRebuild: false -publish: - provider: generic - url: https://example.com/auto-updates -electronDownload: - mirror: https://npmmirror.com/mirrors/electron/ diff --git a/installer/electron.vite.config.ts b/installer/electron.vite.config.ts deleted file mode 100644 index 6381439..0000000 --- a/installer/electron.vite.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { resolve } from 'path' -import { defineConfig, externalizeDepsPlugin, bytecodePlugin } from 'electron-vite' -import vue from '@vitejs/plugin-vue' - -export default defineConfig({ - main: { - plugins: [externalizeDepsPlugin(), bytecodePlugin()] - }, - preload: { - plugins: [externalizeDepsPlugin(), bytecodePlugin()] - }, - renderer: { - resolve: { - alias: { - '@renderer': resolve('src/renderer/src') - } - }, - plugins: [vue()] - } -}) diff --git a/installer/package-lock.json b/installer/package-lock.json deleted file mode 100644 index 8e555e7..0000000 --- a/installer/package-lock.json +++ /dev/null @@ -1,6525 +0,0 @@ -{ - "name": "electron-app", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "electron-app", - "version": "1.0.0", - "hasInstallScript": true, - "dependencies": { - "@electron-toolkit/preload": "^3.0.0", - "@electron-toolkit/utils": "^3.0.0" - }, - "devDependencies": { - "@electron-toolkit/eslint-config": "^1.0.2", - "@electron-toolkit/eslint-config-ts": "^1.0.1", - "@electron-toolkit/tsconfig": "^1.0.1", - "@rushstack/eslint-patch": "^1.7.1", - "@types/node": "^18.19.9", - "@vitejs/plugin-vue": "^5.0.3", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^12.0.0", - "electron": "^28.2.0", - "electron-builder": "^24.9.1", - "electron-vite": "^2.0.0", - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.20.1", - "prettier": "^3.2.4", - "typescript": "^5.3.3", - "vite": "^5.0.12", - "vue": "^3.4.15", - "vue-tsc": "^1.8.27" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron-toolkit/eslint-config": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@electron-toolkit/eslint-config/-/eslint-config-1.0.2.tgz", - "integrity": "sha512-GJVuMsxBHfVARfmUoSTCHT0e/QfWlVbXcGk3tgoku0ad6tLjydbv2LpvKi02+Sy2WiEz9L9SkGSw090ukT/F0A==", - "dev": true, - "peerDependencies": { - "eslint": ">= 8.0.0" - } - }, - "node_modules/@electron-toolkit/eslint-config-ts": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@electron-toolkit/eslint-config-ts/-/eslint-config-ts-1.0.1.tgz", - "integrity": "sha512-6RkoGE/W/WVlDozy/u6/lo5THNP5CCAPxdKpdQuYaopUfObs3o+JyxdlSb45imh+nL8nv875970EoyplntXaug==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0" - }, - "peerDependencies": { - "eslint": ">=8.0.0", - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@electron-toolkit/preload": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@electron-toolkit/preload/-/preload-3.0.0.tgz", - "integrity": "sha512-DTyvNGits43J1RiQGFN00/OxjjcTcozLWMjgQBANt97FFptEYiLVasq7kMC24nMwwoOpdDYY9CE6C+4wQJ55/w==", - "peerDependencies": { - "electron": ">=13.0.0" - } - }, - "node_modules/@electron-toolkit/tsconfig": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@electron-toolkit/tsconfig/-/tsconfig-1.0.1.tgz", - "integrity": "sha512-M0Mol3odspvtCuheyujLNAW7bXq7KFNYVMRtpjFa4ZfES4MuklXBC7Nli/omvc+PRKlrklgAGx3l4VakjNo8jg==", - "dev": true, - "peerDependencies": { - "@types/node": "*" - } - }, - "node_modules/@electron-toolkit/utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@electron-toolkit/utils/-/utils-3.0.0.tgz", - "integrity": "sha512-GaXHDhiT7KCvMJjXdp/QqpYinq69T/Pdl49Z1XLf8mKGf63dnsODMWyrmIjEQ0z/vG7dO8qF3fvmI6Eb2lUNZA==", - "peerDependencies": { - "electron": ">=13.0.0" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", - "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", - "dev": true, - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/asar/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/notarize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", - "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", - "dev": true, - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/universal": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", - "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", - "dev": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", - "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.19.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.10.tgz", - "integrity": "sha512-IZD8kAM02AW1HRDTPOlz3npFava678pr8Ie9Vp8uRhBROXAv8MXT2pCnGZZAKYdromsNQLHQcfWQ6EOatVLtqA==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@types/verror": { - "version": "1.10.9", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz", - "integrity": "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==", - "dev": true, - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz", - "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/type-utils": "6.19.1", - "@typescript-eslint/utils": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz", - "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz", - "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz", - "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/utils": "6.19.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz", - "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz", - "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz", - "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz", - "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.19.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", - "integrity": "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@volar/language-core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", - "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", - "dev": true, - "dependencies": { - "@volar/source-map": "1.11.1" - } - }, - "node_modules/@volar/source-map": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", - "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", - "dev": true, - "dependencies": { - "muggle-string": "^0.3.1" - } - }, - "node_modules/@volar/typescript": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", - "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", - "dev": true, - "dependencies": { - "@volar/language-core": "1.11.1", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.15.tgz", - "integrity": "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.15", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz", - "integrity": "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==", - "dev": true, - "dependencies": { - "@vue/compiler-core": "3.4.15", - "@vue/shared": "3.4.15" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.15.tgz", - "integrity": "sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.15", - "@vue/compiler-dom": "3.4.15", - "@vue/compiler-ssr": "3.4.15", - "@vue/shared": "3.4.15", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", - "postcss": "^8.4.33", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.15.tgz", - "integrity": "sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==", - "dev": true, - "dependencies": { - "@vue/compiler-dom": "3.4.15", - "@vue/shared": "3.4.15" - } - }, - "node_modules/@vue/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", - "dev": true, - "dependencies": { - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0" - }, - "peerDependencies": { - "eslint": ">= 8.0.0", - "prettier": ">= 3.0.0" - } - }, - "node_modules/@vue/eslint-config-typescript": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", - "integrity": "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", - "vue-eslint-parser": "^9.3.1" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", - "eslint-plugin-vue": "^9.0.0", - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", - "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", - "dev": true, - "dependencies": { - "@volar/language-core": "~1.11.1", - "@volar/source-map": "~1.11.1", - "@vue/compiler-dom": "^3.3.0", - "@vue/shared": "^3.3.0", - "computeds": "^0.0.1", - "minimatch": "^9.0.3", - "muggle-string": "^0.3.1", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/reactivity": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.15.tgz", - "integrity": "sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==", - "dev": true, - "dependencies": { - "@vue/shared": "3.4.15" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.15.tgz", - "integrity": "sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==", - "dev": true, - "dependencies": { - "@vue/reactivity": "3.4.15", - "@vue/shared": "3.4.15" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.15.tgz", - "integrity": "sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==", - "dev": true, - "dependencies": { - "@vue/runtime-core": "3.4.15", - "@vue/shared": "3.4.15", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.15.tgz", - "integrity": "sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==", - "dev": true, - "dependencies": { - "@vue/compiler-ssr": "3.4.15", - "@vue/shared": "3.4.15" - }, - "peerDependencies": { - "vue": "3.4.15" - } - }, - "node_modules/@vue/shared": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.15.tgz", - "integrity": "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==", - "dev": true - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-builder-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", - "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true - }, - "node_modules/app-builder-lib": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz", - "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==", - "dev": true, - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.1.0", - "@electron/osx-sign": "1.0.5", - "@electron/universal": "1.4.1", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "7zip-bin": "~5.2.0", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.4", - "ejs": "^3.1.8", - "electron-publish": "24.8.1", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "optional": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builder-util": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz", - "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==", - "dev": true, - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz", - "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001580", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz", - "integrity": "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-file-ts": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", - "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", - "dev": true, - "dependencies": { - "glob": "^10.3.10", - "typescript": "^5.3.3" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "optional": true - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "optional": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "optional": true - }, - "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", - "dev": true, - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, - "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dmg-builder": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz", - "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==", - "dev": true, - "dependencies": { - "app-builder-lib": "24.9.1", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "28.2.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-28.2.0.tgz", - "integrity": "sha512-22SylXQQ9IHtwLw4D+Z4Si7OUpeDtpHfJVTjy3yv53iLg5zJKKPOCWT4ZwgYGHQZ0eldyBrYBHF/P9FPd2CcVQ==", - "hasInstallScript": true, - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz", - "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==", - "dev": true, - "dependencies": { - "app-builder-lib": "24.9.1", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "chalk": "^4.1.2", - "dmg-builder": "24.9.1", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-publish": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", - "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==", - "dev": true, - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "chalk": "^4.1.2", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.648", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz", - "integrity": "sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg==", - "dev": true - }, - "node_modules/electron-vite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-2.0.0.tgz", - "integrity": "sha512-EQiuPVSwJQRPGbZiVrCsCFMDVfNyNtSpDiyUV4fNwPKNadTjBfYMOudnLUpSeBTocKUZYf58SXSzSCAkNg0GTQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "cac": "^6.7.14", - "esbuild": "^0.19.8", - "magic-string": "^0.30.5", - "picocolors": "^1.0.0" - }, - "bin": { - "electron-vite": "bin/electron-vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@swc/core": "^1.0.0", - "vite": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - } - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "optional": true - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz", - "integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.13", - "semver": "^7.5.4", - "vue-eslint-parser": "^9.4.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "optional": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "optional": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "optional": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "optional": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "optional": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "dev": true, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/muggle-string": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", - "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", - "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", - "dev": true, - "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "dev": true - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "devOptional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "optional": true - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "optional": true - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.15.tgz", - "integrity": "sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==", - "dev": true, - "dependencies": { - "@vue/compiler-dom": "3.4.15", - "@vue/compiler-sfc": "3.4.15", - "@vue/runtime-dom": "3.4.15", - "@vue/server-renderer": "3.4.15", - "@vue/shared": "3.4.15" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-eslint-parser": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", - "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", - "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", - "dev": true, - "dependencies": { - "@volar/typescript": "~1.11.1", - "@vue/language-core": "1.8.27", - "semver": "^7.5.4" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/installer/package.json b/installer/package.json deleted file mode 100644 index fdba6ea..0000000 --- a/installer/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "electron-app", - "version": "1.0.0", - "description": "An Electron application with Vue and TypeScript", - "main": "./out/main/index.js", - "author": "example.com", - "homepage": "https://electron-vite.org", - "scripts": { - "typecheck:node": "npx tsc --noEmit -p tsconfig.node.json --composite false", - "typecheck:web": "npx vue-tsc --noEmit -p tsconfig.web.json --composite false", - "typecheck": "npm run typecheck:node && npm run typecheck:web", - "start": "npx electron-vite preview", - "dev": "npx electron-vite dev", - "build": "npm run typecheck && electron-vite build", - "postinstall": "npx electron-builder install-app-deps", - "build:unpack": "npm run build && electron-builder --dir", - "build:win": "npm run build && electron-builder --win", - "build:mac": "npm run build && electron-builder --mac", - "build:linux": "npm run build && electron-builder --linux" - }, - "dependencies": { - "@electron-toolkit/preload": "^3.0.0", - "@electron-toolkit/utils": "^3.0.0" - }, - "devDependencies": { - "@electron-toolkit/eslint-config": "^1.0.2", - "@electron-toolkit/eslint-config-ts": "^1.0.1", - "@electron-toolkit/tsconfig": "^1.0.1", - "@rushstack/eslint-patch": "^1.7.1", - "@types/node": "^18.19.9", - "@vitejs/plugin-vue": "^5.0.3", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^12.0.0", - "electron": "^28.2.0", - "electron-builder": "^24.9.1", - "electron-vite": "^2.0.0", - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.20.1", - "prettier": "^3.2.4", - "typescript": "^5.3.3", - "vite": "^5.0.12", - "vue": "^3.4.15", - "vue-tsc": "^1.8.27" - } -} diff --git a/installer/resources/icon.png b/installer/resources/icon.png deleted file mode 100644 index cf9e8b2c87b5c18ac0b26913af6fd3ed00ec3bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35949 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

(|V7O%OOlsc*vU+P^72X!U7K_eX*CG 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 E`T9pxN5i1O>p>VAy6%lIREYyb! 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 Kl11VsAO0U5dJ04U diff --git a/installer/src/main/index.ts b/installer/src/main/index.ts deleted file mode 100644 index 2299c5b..0000000 --- a/installer/src/main/index.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { app, shell, BrowserWindow, ipcMain } from 'electron' -import { join } from 'path' -import { electronApp, optimizer, is } from '@electron-toolkit/utils' -import icon from '../../resources/icon.png?asset' - -function createWindow(): void { - // Create the browser window. - const mainWindow = new BrowserWindow({ - width: 900, - height: 670, - show: false, - autoHideMenuBar: true, - ...(process.platform === 'linux' ? { icon } : {}), - webPreferences: { - preload: join(__dirname, '../preload/index.js'), - sandbox: false - } - }) - - mainWindow.on('ready-to-show', () => { - mainWindow.show() - }) - - mainWindow.webContents.setWindowOpenHandler((details) => { - shell.openExternal(details.url) - return { action: 'deny' } - }) - - // HMR for renderer base on electron-vite cli. - // Load the remote URL for development or the local html file for production. - if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) - } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html')) - } -} - -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.whenReady().then(() => { - // Set app user model id for windows - electronApp.setAppUserModelId('com.electron') - - // Default open or close DevTools by F12 in development - // and ignore CommandOrControl + R in production. - // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils - app.on('browser-window-created', (_, window) => { - optimizer.watchWindowShortcuts(window) - }) - - // IPC test - // ipcMain.on('ping', () => console.log('pong')) - - createWindow() - - app.on('activate', function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow() - }) -}) - -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() - } -}) - -// In this file you can include the rest of your app"s specific main process -// code. You can also put them in separate files and require them here. diff --git a/installer/src/preload/index.d.ts b/installer/src/preload/index.d.ts deleted file mode 100644 index a153669..0000000 --- a/installer/src/preload/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ElectronAPI } from '@electron-toolkit/preload' - -declare global { - interface Window { - electron: ElectronAPI - api: unknown - } -} diff --git a/installer/src/preload/index.ts b/installer/src/preload/index.ts deleted file mode 100644 index 2d18524..0000000 --- a/installer/src/preload/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { contextBridge } from 'electron' -import { electronAPI } from '@electron-toolkit/preload' - -// Custom APIs for renderer -const api = {} - -// Use `contextBridge` APIs to expose Electron APIs to -// renderer only if context isolation is enabled, otherwise -// just add to the DOM global. -if (process.contextIsolated) { - try { - contextBridge.exposeInMainWorld('electron', electronAPI) - contextBridge.exposeInMainWorld('api', api) - } catch (error) { - console.error(error) - } -} else { - // @ts-ignore (define in dts) - window.electron = electronAPI - // @ts-ignore (define in dts) - window.api = api -} diff --git a/installer/src/renderer/index.html b/installer/src/renderer/index.html deleted file mode 100644 index aafc73e..0000000 --- a/installer/src/renderer/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - NetIgnite Agent Installer for ESP32 - - - - - -

- - - diff --git a/installer/src/renderer/src/App.vue b/installer/src/renderer/src/App.vue deleted file mode 100644 index 6fb8fe8..0000000 --- a/installer/src/renderer/src/App.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/installer/src/renderer/src/assets/base.css b/installer/src/renderer/src/assets/base.css deleted file mode 100644 index 5ed6406..0000000 --- a/installer/src/renderer/src/assets/base.css +++ /dev/null @@ -1,67 +0,0 @@ -:root { - --ev-c-white: #ffffff; - --ev-c-white-soft: #f8f8f8; - --ev-c-white-mute: #f2f2f2; - - --ev-c-black: #1b1b1f; - --ev-c-black-soft: #222222; - --ev-c-black-mute: #282828; - - --ev-c-gray-1: #515c67; - --ev-c-gray-2: #414853; - --ev-c-gray-3: #32363f; - - --ev-c-text-1: rgba(255, 255, 245, 0.86); - --ev-c-text-2: rgba(235, 235, 245, 0.6); - --ev-c-text-3: rgba(235, 235, 245, 0.38); - - --ev-button-alt-border: transparent; - --ev-button-alt-text: var(--ev-c-text-1); - --ev-button-alt-bg: var(--ev-c-gray-3); - --ev-button-alt-hover-border: transparent; - --ev-button-alt-hover-text: var(--ev-c-text-1); - --ev-button-alt-hover-bg: var(--ev-c-gray-2); -} - -:root { - --color-background: var(--ev-c-black); - --color-background-soft: var(--ev-c-black-soft); - --color-background-mute: var(--ev-c-black-mute); - - --color-text: var(--ev-c-text-1); -} - -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - font-weight: normal; -} - -ul { - list-style: none; -} - -body { - min-height: 100vh; - color: var(--color-text); - background: var(--color-background); - line-height: 1.6; - font-family: - Inter, - -apple-system, - BlinkMacSystemFont, - 'Segoe UI', - Roboto, - Oxygen, - Ubuntu, - Cantarell, - 'Fira Sans', - 'Droid Sans', - 'Helvetica Neue', - sans-serif; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} diff --git a/installer/src/renderer/src/assets/main.css b/installer/src/renderer/src/assets/main.css deleted file mode 100644 index 495aa99..0000000 --- a/installer/src/renderer/src/assets/main.css +++ /dev/null @@ -1,171 +0,0 @@ -@import './base.css'; - -body { - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - background-image: url('./wavy-lines.svg'); - background-size: cover; - user-select: none; -} - -code { - font-weight: 600; - padding: 3px 5px; - border-radius: 2px; - background-color: var(--color-background-mute); - font-family: - ui-monospace, - SFMono-Regular, - SF Mono, - Menlo, - Consolas, - Liberation Mono, - monospace; - font-size: 85%; -} - -#app { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - margin-bottom: 80px; -} - -.logo { - margin-bottom: 20px; - -webkit-user-drag: none; - height: 128px; - width: 128px; - will-change: filter; - transition: filter 300ms; -} - -.logo:hover { - filter: drop-shadow(0 0 1.2em #6988e6aa); -} - -.creator { - font-size: 14px; - line-height: 16px; - color: var(--ev-c-text-2); - font-weight: 600; - margin-bottom: 10px; -} - -.text { - font-size: 28px; - color: var(--ev-c-text-1); - font-weight: 700; - line-height: 32px; - text-align: center; - margin: 0 10px; - padding: 16px 0; -} - -.tip { - font-size: 16px; - line-height: 24px; - color: var(--ev-c-text-2); - font-weight: 600; -} - -.vue { - background: -webkit-linear-gradient(315deg, #42d392 25%, #647eff); - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - font-weight: 700; -} - -.ts { - background: -webkit-linear-gradient(315deg, #3178c6 45%, #f0dc4e); - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - font-weight: 700; -} - -.actions { - display: flex; - padding-top: 32px; - margin: -6px; - flex-wrap: wrap; - justify-content: flex-start; -} - -.action { - flex-shrink: 0; - padding: 6px; -} - -.action a { - cursor: pointer; - text-decoration: none; - display: inline-block; - border: 1px solid transparent; - text-align: center; - font-weight: 600; - white-space: nowrap; - border-radius: 20px; - padding: 0 20px; - line-height: 38px; - font-size: 14px; - border-color: var(--ev-button-alt-border); - color: var(--ev-button-alt-text); - background-color: var(--ev-button-alt-bg); -} - -.action a:hover { - border-color: var(--ev-button-alt-hover-border); - color: var(--ev-button-alt-hover-text); - background-color: var(--ev-button-alt-hover-bg); -} - -.versions { - position: absolute; - bottom: 30px; - margin: 0 auto; - padding: 15px 0; - font-family: 'Menlo', 'Lucida Console', monospace; - display: inline-flex; - overflow: hidden; - align-items: center; - border-radius: 22px; - background-color: #202127; - backdrop-filter: blur(24px); -} - -.versions li { - display: block; - float: left; - border-right: 1px solid var(--ev-c-gray-1); - padding: 0 20px; - font-size: 14px; - line-height: 14px; - opacity: 0.8; - &:last-child { - border: none; - } -} - -@media (max-width: 720px) { - .text { - font-size: 20px; - } -} - -@media (max-width: 620px) { - .versions { - display: none; - } -} - -@media (max-width: 350px) { - .tip, - .actions { - display: none; - } -} diff --git a/installer/src/renderer/src/env.d.ts b/installer/src/renderer/src/env.d.ts deleted file mode 100644 index aafef95..0000000 --- a/installer/src/renderer/src/env.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/// - -declare module '*.vue' { - import type { DefineComponent } from 'vue' - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types - const component: DefineComponent<{}, {}, any> - export default component -} diff --git a/installer/src/renderer/src/main.ts b/installer/src/renderer/src/main.ts deleted file mode 100644 index 0ac3a5f..0000000 --- a/installer/src/renderer/src/main.ts +++ /dev/null @@ -1,6 +0,0 @@ -import './assets/main.css' - -import { createApp } from 'vue' -import App from './App.vue' - -createApp(App).mount('#app') diff --git a/installer/tsconfig.json b/installer/tsconfig.json deleted file mode 100644 index 31bac6e..0000000 --- a/installer/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "files": [], - "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }] -} diff --git a/installer/tsconfig.node.json b/installer/tsconfig.node.json deleted file mode 100644 index db23a68..0000000 --- a/installer/tsconfig.node.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", - "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*"], - "compilerOptions": { - "composite": true, - "types": ["electron-vite/node"] - } -} diff --git a/installer/tsconfig.web.json b/installer/tsconfig.web.json deleted file mode 100644 index e9d73a9..0000000 --- a/installer/tsconfig.web.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "@electron-toolkit/tsconfig/tsconfig.web.json", - "include": [ - "src/renderer/src/env.d.ts", - "src/renderer/src/**/*", - "src/renderer/src/**/*.vue", - "src/preload/*.d.ts" - ], - "compilerOptions": { - "composite": true, - "baseUrl": ".", - "paths": { - "@renderer/*": [ - "src/renderer/src/*" - ] - } - } -} diff --git a/lib/README b/lib/README deleted file mode 100644 index 9379397..0000000 --- a/lib/README +++ /dev/null @@ -1,46 +0,0 @@ - -This directory is intended for project specific (private) libraries. -PlatformIO will compile them to static libraries and link into the executable file. - -The source code of each library should be placed in a separate directory -("lib/your_library_name/[Code]"). - -For example, see the structure of the following example libraries `Foo` and `Bar`: - -|--lib -| | -| |--Bar -| | |--docs -| | |--examples -| | |--src -| | |- Bar.c -| | |- Bar.h -| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html -| | -| |--Foo -| | |- Foo.c -| | |- Foo.h -| | -| |- README --> THIS FILE -| -|- platformio.ini -|--src - |- main.c - -Example contents of `src/main.c` using Foo and Bar: -``` -#include -#include - -int main (void) -{ - ... -} - -``` - -The PlatformIO Library Dependency Finder will find automatically dependent -libraries by scanning project source files. - -More information about PlatformIO Library Dependency Finder -- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/lib/netignite_core/library.json b/lib/netignite_core/library.json new file mode 100644 index 0000000..71bcb7f --- /dev/null +++ b/lib/netignite_core/library.json @@ -0,0 +1,10 @@ +{ + "name": "netignite_core", + "version": "2.0.0", + "description": "Hardware-independent parts of the NetIgnite agent firmware: parsers and encoders for MAC addresses, server URLs, the agent protocol, Improv Serial and Wake-on-LAN. Unit-tested on the host (pio test -e native).", + "frameworks": "*", + "platforms": "*", + "build": { + "flags": ["-DARDUINOJSON_ENABLE_STD_STRING=1"] + } +} diff --git a/lib/netignite_core/src/netignite/CommandLine.cpp b/lib/netignite_core/src/netignite/CommandLine.cpp new file mode 100644 index 0000000..04ce636 --- /dev/null +++ b/lib/netignite_core/src/netignite/CommandLine.cpp @@ -0,0 +1,41 @@ +#include "netignite/CommandLine.h" + +namespace netignite { + +bool splitCommandLine(std::string_view line, std::vector& out) { + out.clear(); + std::string current; + bool inArgument = false; + bool quoted = false; + + for (size_t i = 0; i < line.size(); i++) { + const char c = line[i]; + + if (c == '\\' && i + 1 < line.size()) { + current += line[++i]; + inArgument = true; + continue; + } + if (c == '"') { + quoted = !quoted; + inArgument = true; + continue; + } + if (!quoted && (c == ' ' || c == '\t')) { + if (inArgument) { + out.push_back(current); + current.clear(); + inArgument = false; + } + continue; + } + current += c; + inArgument = true; + } + + if (quoted) return false; + if (inArgument) out.push_back(current); + return true; +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/CommandLine.h b/lib/netignite_core/src/netignite/CommandLine.h new file mode 100644 index 0000000..d044459 --- /dev/null +++ b/lib/netignite_core/src/netignite/CommandLine.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include +#include + +namespace netignite { + +/** + * Splits a console line into arguments. Arguments are separated by spaces; double quotes group + * words (`wifi "My Network" secret`) and a backslash escapes the next character. Returns false + * for an unterminated quote. + */ +bool splitCommandLine(std::string_view line, std::vector& out); + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/Hex.cpp b/lib/netignite_core/src/netignite/Hex.cpp new file mode 100644 index 0000000..3e6b906 --- /dev/null +++ b/lib/netignite_core/src/netignite/Hex.cpp @@ -0,0 +1,16 @@ +#include "netignite/Hex.h" + +namespace netignite { + +std::string toHex(const uint8_t* data, size_t length) { + static constexpr char DIGITS[] = "0123456789abcdef"; + std::string out; + out.reserve(length * 2); + for (size_t i = 0; i < length; i++) { + out += DIGITS[data[i] >> 4]; + out += DIGITS[data[i] & 0x0f]; + } + return out; +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/Hex.h b/lib/netignite_core/src/netignite/Hex.h new file mode 100644 index 0000000..3f24a74 --- /dev/null +++ b/lib/netignite_core/src/netignite/Hex.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include +#include + +namespace netignite { + +/** Lower-case hex encoding. */ +std::string toHex(const uint8_t* data, size_t length); + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/Improv.cpp b/lib/netignite_core/src/netignite/Improv.cpp new file mode 100644 index 0000000..d1c72f3 --- /dev/null +++ b/lib/netignite_core/src/netignite/Improv.cpp @@ -0,0 +1,63 @@ +#include "netignite/Improv.h" + +namespace netignite::improv { + +std::vector buildPacket(PacketType type, const std::vector& data) { + std::vector packet = {'I', 'M', 'P', 'R', 'O', 'V', VERSION, static_cast(type), + static_cast(data.size())}; + packet.insert(packet.end(), data.begin(), data.end()); + + uint8_t checksum = 0; + for (uint8_t byte : packet) checksum = static_cast(checksum + byte); + packet.push_back(checksum); + packet.push_back('\n'); + return packet; +} + +std::vector buildStatePacket(State state) { + return buildPacket(PacketType::CurrentState, {static_cast(state)}); +} + +std::vector buildErrorPacket(Error error) { + return buildPacket(PacketType::ErrorState, {static_cast(error)}); +} + +std::vector buildRpcResult(Command command, const std::vector& strings) { + std::vector data = {static_cast(command), 0}; + for (const std::string& text : strings) { + const size_t length = text.size() > 255 ? 255 : text.size(); + // The whole result must fit the packet's one-byte length. + if (data.size() + 1 + length > 255) break; + data.push_back(static_cast(length)); + data.insert(data.end(), text.begin(), text.begin() + static_cast(length)); + } + data[1] = static_cast(data.size() - 2); + return buildPacket(PacketType::RpcResult, data); +} + +bool parseRpc(const std::vector& data, RpcCommand& out) { + if (data.size() < 2) return false; + + const uint8_t length = data[1]; + if (static_cast(length) + 2 != data.size()) return false; + + out = RpcCommand{static_cast(data[0]), {}, {}}; + if (out.command != Command::WifiSettings) return true; + + // payload: ssid length | ssid | password length | password + size_t pos = 2; + if (pos >= data.size()) return false; + const size_t ssidLength = data[pos++]; + // The SSID and the password's length byte must fit. + if (pos + ssidLength + 1 > data.size()) return false; + out.ssid.assign(data.begin() + static_cast(pos), data.begin() + static_cast(pos + ssidLength)); + pos += ssidLength; + + const size_t passwordLength = data[pos++]; + if (pos + passwordLength != data.size()) return false; + out.password.assign(data.begin() + static_cast(pos), data.end()); + + return !out.ssid.empty(); +} + +} // namespace netignite::improv diff --git a/lib/netignite_core/src/netignite/Improv.h b/lib/netignite_core/src/netignite/Improv.h new file mode 100644 index 0000000..09521d5 --- /dev/null +++ b/lib/netignite_core/src/netignite/Improv.h @@ -0,0 +1,74 @@ +#pragma once + +#include +#include +#include + +/** + * Improv Wi-Fi Serial (https://www.improv-wifi.com/serial/), as used by ESP Web Tools to send + * Wi-Fi credentials right after flashing. + * + * Packet: "IMPROV" | version (1) | type | length | data[length] | checksum | '\n' + * The checksum is the low byte of the sum of all bytes before it, starting at 'I'. + */ +namespace netignite::improv { + +constexpr uint8_t VERSION = 1; + +enum class PacketType : uint8_t { + CurrentState = 0x01, + ErrorState = 0x02, + Rpc = 0x03, + RpcResult = 0x04, +}; + +enum class State : uint8_t { + Stopped = 0x00, + AwaitingAuthorization = 0x01, + Authorized = 0x02, + Provisioning = 0x03, + Provisioned = 0x04, +}; + +enum class Error : uint8_t { + None = 0x00, + InvalidRpc = 0x01, + UnknownRpc = 0x02, + UnableToConnect = 0x03, + NotAuthorized = 0x04, + BadHostname = 0x05, + Unknown = 0xff, +}; + +enum class Command : uint8_t { + WifiSettings = 0x01, + GetCurrentState = 0x02, + GetDeviceInfo = 0x03, + GetWifiNetworks = 0x04, + Hostname = 0x05, + DeviceName = 0x06, + GetNetworkState = 0x07, +}; + +struct RpcCommand { + Command command; + /** Only for WifiSettings. */ + std::string ssid; + std::string password; +}; + +/** A complete serial packet including header, checksum and trailing newline. */ +std::vector buildPacket(PacketType type, const std::vector& data); + +std::vector buildStatePacket(State state); +std::vector buildErrorPacket(Error error); +/** RPC result: the strings, each prefixed with its length (truncated to 255 bytes). */ +std::vector buildRpcResult(Command command, const std::vector& strings); + +/** + * Parses the data of an RPC packet: command | length | payload[length]. Returns false for a + * malformed packet (lengths that don't add up). + */ +bool parseRpc(const std::vector& data, RpcCommand& out); + +} // namespace netignite::improv diff --git a/lib/netignite_core/src/netignite/Mac.cpp b/lib/netignite_core/src/netignite/Mac.cpp new file mode 100644 index 0000000..eee6e3c --- /dev/null +++ b/lib/netignite_core/src/netignite/Mac.cpp @@ -0,0 +1,103 @@ +#include "netignite/Mac.h" + +#include + +namespace netignite { + +namespace { + +int hexValue(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return -1; +} + +bool parsePair(std::string_view text, size_t index, uint8_t& out) { + const int high = hexValue(text[index]); + const int low = hexValue(text[index + 1]); + if (high < 0 || low < 0) return false; + out = static_cast((high << 4) | low); + return true; +} + +} // namespace + +bool parseMac(std::string_view text, MacAddress& out) { + MacAddress mac{}; + + if (text.size() == 12) { + for (size_t i = 0; i < 6; i++) { + if (!parsePair(text, i * 2, mac[i])) return false; + } + out = mac; + return true; + } + + if (text.size() != 17) return false; + + const char separator = text[2]; + if (separator != ':' && separator != '-') return false; + + for (size_t i = 0; i < 6; i++) { + if (!parsePair(text, i * 3, mac[i])) return false; + if (i < 5 && text[i * 3 + 2] != separator) return false; + } + + out = mac; + return true; +} + +std::string formatMac(const MacAddress& mac) { + char buffer[18]; + std::snprintf(buffer, sizeof(buffer), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], + mac[4], mac[5]); + return buffer; +} + +IPv6Bytes linkLocalFromMac(const MacAddress& mac) { + return IPv6Bytes{ + 0xfe, 0x80, 0, 0, 0, 0, 0, 0, + // Modified EUI-64: flip the universal/local bit, insert FF:FE in the middle. + static_cast(mac[0] ^ 0x02), mac[1], mac[2], 0xff, 0xfe, mac[3], mac[4], mac[5], + }; +} + +std::string formatIPv6(const IPv6Bytes& address) { + uint16_t groups[8]; + for (int i = 0; i < 8; i++) { + groups[i] = static_cast((address[i * 2] << 8) | address[i * 2 + 1]); + } + + // Longest run (length >= 2) of zero groups is written as "::". + int bestStart = -1, bestLength = 0; + for (int i = 0; i < 8;) { + if (groups[i] != 0) { + i++; + continue; + } + int j = i; + while (j < 8 && groups[j] == 0) j++; + if (j - i > bestLength && j - i >= 2) { + bestStart = i; + bestLength = j - i; + } + i = j; + } + + std::string text; + char part[6]; + for (int i = 0; i < 8; i++) { + if (i == bestStart) { + text += "::"; + i += bestLength - 1; + continue; + } + if (!text.empty() && text.back() != ':') text += ':'; + std::snprintf(part, sizeof(part), "%x", groups[i]); + text += part; + } + return text; +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/Mac.h b/lib/netignite_core/src/netignite/Mac.h new file mode 100644 index 0000000..5ab86f3 --- /dev/null +++ b/lib/netignite_core/src/netignite/Mac.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include +#include + +namespace netignite { + +using MacAddress = std::array; +using IPv6Bytes = std::array; + +/** + * Parses a MAC address: six hex byte pairs separated by `:` or `-` (`AA:BB:CC:DD:EE:FF`, + * `aa-bb-cc-dd-ee-ff`), or twelve hex digits without separators (`AABBCCDDEEFF`). + */ +bool parseMac(std::string_view text, MacAddress& out); + +/** `AA:BB:CC:DD:EE:FF` */ +std::string formatMac(const MacAddress& mac); + +/** The IPv6 link-local address with the modified EUI-64 interface id derived from `mac`. */ +IPv6Bytes linkLocalFromMac(const MacAddress& mac); + +/** Compact IPv6 text form (`fe80::1a2b:3cff:fe4d:5e6f`), for logs. */ +std::string formatIPv6(const IPv6Bytes& address); + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/MagicPacket.cpp b/lib/netignite_core/src/netignite/MagicPacket.cpp new file mode 100644 index 0000000..50e031c --- /dev/null +++ b/lib/netignite_core/src/netignite/MagicPacket.cpp @@ -0,0 +1,18 @@ +#include "netignite/MagicPacket.h" + +namespace netignite { + +std::array buildMagicPacket(const MacAddress& mac) { + std::array packet{}; + for (size_t i = 0; i < 6; i++) packet[i] = 0xff; + for (size_t repeat = 0; repeat < 16; repeat++) { + for (size_t i = 0; i < 6; i++) packet[6 + repeat * 6 + i] = mac[i]; + } + return packet; +} + +uint32_t directedBroadcast(uint32_t address, uint32_t netmask) { + return (address & netmask) | ~netmask; +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/MagicPacket.h b/lib/netignite_core/src/netignite/MagicPacket.h new file mode 100644 index 0000000..16c5318 --- /dev/null +++ b/lib/netignite_core/src/netignite/MagicPacket.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +#include "netignite/Mac.h" + +namespace netignite { + +constexpr size_t MAGIC_PACKET_SIZE = 102; + +/** Wake-on-LAN magic packet: 6 × 0xFF followed by the MAC address 16 times. */ +std::array buildMagicPacket(const MacAddress& mac); + +/** The IPv4 subnet broadcast address (host byte order) for an address and netmask. */ +uint32_t directedBroadcast(uint32_t address, uint32_t netmask); + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/Protocol.cpp b/lib/netignite_core/src/netignite/Protocol.cpp new file mode 100644 index 0000000..2f39f9c --- /dev/null +++ b/lib/netignite_core/src/netignite/Protocol.cpp @@ -0,0 +1,173 @@ +#include "netignite/Protocol.h" + +namespace netignite::protocol { + +namespace { + +bool readPort(JsonVariantConst value, uint16_t& out, bool allowZero) { + if (!value.is()) return false; + const long long port = value.as(); + if (port < (allowZero ? 0 : 1) || port > 65535) return false; + out = static_cast(port); + return true; +} + +std::string serialize(const JsonDocument& doc) { + std::string out; + serializeJson(doc, out); + return out; +} + +} // namespace + +bool parseFrame(std::string_view text, JsonDocument& doc, Frame& out, std::string& error) { + out = Frame{}; + + const DeserializationError result = deserializeJson(doc, text.data(), text.size()); + if (result) { + error = std::string("invalid JSON: ") + result.c_str(); + return false; + } + + JsonObjectConst frame = doc.as(); + if (frame.isNull()) { + error = "frame is not an object"; + return false; + } + + const char* type = frame["t"]; + if (!type) { + error = "missing frame type"; + return false; + } + + const std::string_view t(type); + if (t == "req") { + out.type = FrameType::Request; + } else if (t == "res") { + out.type = FrameType::Response; + } else if (t == "evt") { + out.type = FrameType::Event; + } else { + error = "unknown frame type"; + return false; + } + + if (out.type != FrameType::Event) { + JsonVariantConst id = frame["id"]; + if (!id.is() || id.as() < 0 || id.as() > 0xffffffffLL) { + error = "missing or invalid id"; + return false; + } + out.id = static_cast(id.as()); + } + + if (out.type != FrameType::Response) { + const char* cmd = frame["cmd"]; + if (!cmd || !*cmd) { + error = "missing cmd"; + return false; + } + out.cmd = cmd; + } + + out.payload = frame["p"].as(); + return true; +} + +std::string encodeResponse(uint32_t id, JsonObjectConst payload) { + JsonDocument doc; + doc["t"] = "res"; + doc["id"] = id; + doc["ok"] = true; + JsonObject p = doc["p"].to(); + if (!payload.isNull()) p.set(payload); + return serialize(doc); +} + +std::string encodeEmptyResponse(uint32_t id) { + return encodeResponse(id, JsonObjectConst()); +} + +std::string encodeError(uint32_t id, std::string_view error) { + JsonDocument doc; + doc["t"] = "res"; + doc["id"] = id; + doc["ok"] = false; + doc["err"] = std::string(error.substr(0, 1024)); + return serialize(doc); +} + +std::string encodeEvent(std::string_view cmd, JsonObjectConst payload) { + JsonDocument doc; + doc["t"] = "evt"; + doc["cmd"] = std::string(cmd); + JsonObject p = doc["p"].to(); + if (!payload.isNull()) p.set(payload); + return serialize(doc); +} + +bool parseWakeRequest(JsonObjectConst payload, WakeRequest& out, std::string& error) { + const char* mac = payload["mac"]; + if (!mac || !parseMac(mac, out.mac)) { + error = "Invalid MAC address"; + return false; + } + if (!readPort(payload["port"], out.port, false)) { + error = "Invalid port"; + return false; + } + return true; +} + +bool parseStatusRequest(JsonObjectConst payload, StatusRequest& out, std::string& error) { + out = StatusRequest{}; + + JsonObjectConst target = payload["target"]; + const char* type = target["type"]; + if (!type) { + error = "Missing status target"; + return false; + } + + const std::string_view t(type); + if (t == "link_local") { + out.target = StatusRequest::Target::LinkLocal; + const char* mac = target["mac"]; + if (!mac || !parseMac(mac, out.mac)) { + error = "Invalid MAC address"; + return false; + } + } else if (t == "ip" || t == "host") { + out.target = t == "ip" ? StatusRequest::Target::Ip : StatusRequest::Target::Host; + const char* address = target[t == "ip" ? "address" : "host"]; + if (!address || !*address || std::string_view(address).size() > 253) { + error = "Invalid address"; + return false; + } + out.address = address; + // The agent uses its own interface for link-local addresses. + const size_t zone = out.address.find('%'); + if (zone != std::string::npos) out.address.erase(zone); + } else { + error = "Unknown status target"; + return false; + } + + JsonVariantConst icmp = payload["icmp"]; + out.icmp = icmp.is() ? icmp.as() : true; + + JsonVariantConst tcpPort = payload["tcp_port"]; + if (!tcpPort.isNull() && !readPort(tcpPort, out.tcpPort, false)) { + error = "Invalid TCP port"; + return false; + } + + if (!out.icmp && out.tcpPort == 0) { + error = "No probe requested"; + return false; + } + return true; +} + +} // namespace netignite::protocol diff --git a/lib/netignite_core/src/netignite/Protocol.h b/lib/netignite_core/src/netignite/Protocol.h new file mode 100644 index 0000000..f13badf --- /dev/null +++ b/lib/netignite_core/src/netignite/Protocol.h @@ -0,0 +1,68 @@ +#pragma once + +#include + +#include +#include +#include + +#include "netignite/Mac.h" + +/** + * NetIgnite agent protocol v2 (the server side is `server/lib/agents/protocol.ts`). + * + * One WebSocket to `/ws/agent`, authenticated with + * `Authorization: Bearer netignite_agent_:`. JSON text frames: + * + * {"t":"req","id":7,"cmd":"WAKE","p":{...}} server → agent + * {"t":"res","id":7,"ok":true,"p":{...}} agent → server, same id + * {"t":"res","id":7,"ok":false,"err":"..."} + * {"t":"evt","cmd":"HELLO","p":{...}} agent → server, first frame + */ +namespace netignite::protocol { + +constexpr int VERSION = 2; +constexpr const char* AGENT_KIND = "esp32"; + +/** Capabilities this firmware announces in HELLO. */ +constexpr const char* CAPABILITIES[] = {"wake", "status.link_local", "status.ip", "status.host", "status.tcp"}; + +enum class FrameType { Invalid, Request, Response, Event }; + +struct Frame { + FrameType type = FrameType::Invalid; + uint32_t id = 0; + std::string cmd; + /** Points into the JsonDocument passed to parseFrame. */ + JsonObjectConst payload; +}; + +/** Parses a frame from the server. Returns false (and an error text) for invalid frames. */ +bool parseFrame(std::string_view text, JsonDocument& doc, Frame& out, std::string& error); + +std::string encodeResponse(uint32_t id, JsonObjectConst payload); +std::string encodeEmptyResponse(uint32_t id); +std::string encodeError(uint32_t id, std::string_view error); +std::string encodeEvent(std::string_view cmd, JsonObjectConst payload); + +struct WakeRequest { + MacAddress mac{}; + uint16_t port = 9; +}; + +bool parseWakeRequest(JsonObjectConst payload, WakeRequest& out, std::string& error); + +struct StatusRequest { + enum class Target { LinkLocal, Ip, Host }; + Target target = Target::Ip; + MacAddress mac{}; + /** IP address (zone suffix like `%eth0` removed) or host name. */ + std::string address; + bool icmp = true; + /** 0 = no TCP probe. */ + uint16_t tcpPort = 0; +}; + +bool parseStatusRequest(JsonObjectConst payload, StatusRequest& out, std::string& error); + +} // namespace netignite::protocol diff --git a/lib/netignite_core/src/netignite/SerialDemux.cpp b/lib/netignite_core/src/netignite/SerialDemux.cpp new file mode 100644 index 0000000..1d4eb6c --- /dev/null +++ b/lib/netignite_core/src/netignite/SerialDemux.cpp @@ -0,0 +1,99 @@ +#include "netignite/SerialDemux.h" + +namespace netignite { + +namespace { +constexpr char HEADER[] = "IMPROV"; +constexpr size_t HEADER_LENGTH = 6; +// header + version + type + length +constexpr size_t PREFIX_LENGTH = HEADER_LENGTH + 3; +} // namespace + +SerialDemux::Event SerialDemux::finishLine() { + Event event; + std::string line(buffer_.begin(), buffer_.end()); + buffer_.clear(); + mode_ = Mode::LineStart; + + while (!line.empty() && (line.back() == ' ' || line.back() == '\t')) line.pop_back(); + size_t start = 0; + while (start < line.size() && (line[start] == ' ' || line[start] == '\t')) start++; + line.erase(0, start); + + if (line.empty()) return event; + event.type = Event::Type::Line; + event.line = std::move(line); + return event; +} + +SerialDemux::Event SerialDemux::feed(uint8_t byte) { + switch (mode_) { + case Mode::LineStart: + if (byte == '\n' || byte == '\r') { + buffer_.clear(); + return {}; + } + buffer_.push_back(byte); + if (byte != static_cast(HEADER[buffer_.size() - 1])) { + mode_ = Mode::Text; + } else if (buffer_.size() == HEADER_LENGTH) { + mode_ = Mode::Improv; + } + return {}; + + case Mode::Text: + if (byte == '\n' || byte == '\r') return finishLine(); + if (buffer_.size() >= MAX_LINE) { + buffer_.clear(); + mode_ = Mode::Discard; + return {}; + } + // Backspace / delete, for people typing in a terminal. + if (byte == 0x08 || byte == 0x7f) { + if (!buffer_.empty()) buffer_.pop_back(); + return {}; + } + buffer_.push_back(byte); + return {}; + + case Mode::Discard: + if (byte == '\n' || byte == '\r') mode_ = Mode::LineStart; + return {}; + + case Mode::Improv: { + buffer_.push_back(byte); + // "IMPROV" followed by anything but version 1 and a known type is just text. + if (buffer_.size() == HEADER_LENGTH + 1 && byte != 1) { + mode_ = Mode::Text; + return {}; + } + if (buffer_.size() == HEADER_LENGTH + 2 && (byte < 0x01 || byte > 0x04)) { + mode_ = Mode::Text; + return {}; + } + if (buffer_.size() < PREFIX_LENGTH) return {}; + + const size_t dataLength = buffer_[PREFIX_LENGTH - 1]; + const size_t total = PREFIX_LENGTH + dataLength + 1; + if (buffer_.size() < total) return {}; + + Event event; + uint8_t checksum = 0; + for (size_t i = 0; i + 1 < total; i++) checksum = static_cast(checksum + buffer_[i]); + + if (checksum != buffer_[total - 1]) { + event.type = Event::Type::ImprovBadChecksum; + } else { + event.type = Event::Type::ImprovPacket; + event.improvType = buffer_[HEADER_LENGTH + 1]; + event.improvData.assign(buffer_.begin() + PREFIX_LENGTH, buffer_.begin() + static_cast(total - 1)); + } + buffer_.clear(); + mode_ = Mode::LineStart; + return event; + } + } + return {}; +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/SerialDemux.h b/lib/netignite_core/src/netignite/SerialDemux.h new file mode 100644 index 0000000..fd9e289 --- /dev/null +++ b/lib/netignite_core/src/netignite/SerialDemux.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include + +namespace netignite { + +/** + * Splits the serial input into Improv packets and text lines (the local console), which share + * the UART. A packet is recognized when a line starts with "IMPROV"; it is read by its length, + * because its data may contain newline bytes. + */ +class SerialDemux { + public: + struct Event { + enum class Type { None, Line, ImprovPacket, ImprovBadChecksum }; + Type type = Type::None; + /** Line, without the line ending. */ + std::string line; + /** Improv packet type and data (without header and checksum). */ + uint8_t improvType = 0; + std::vector improvData; + }; + + static constexpr size_t MAX_LINE = 512; + + Event feed(uint8_t byte); + + private: + enum class Mode { LineStart, Text, Improv, Discard }; + + Mode mode_ = Mode::LineStart; + std::vector buffer_; + + Event finishLine(); +}; + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/ServerUrl.cpp b/lib/netignite_core/src/netignite/ServerUrl.cpp new file mode 100644 index 0000000..41742af --- /dev/null +++ b/lib/netignite_core/src/netignite/ServerUrl.cpp @@ -0,0 +1,110 @@ +#include "netignite/ServerUrl.h" + +#include + +namespace netignite { + +namespace { + +std::string lower(std::string_view text) { + std::string out(text); + for (char& c : out) c = static_cast(std::tolower(static_cast(c))); + return out; +} + +bool validHostChar(char c) { + return std::isalnum(static_cast(c)) || c == '-' || c == '.' || c == '_'; +} + +} // namespace + +std::optional parseServerUrl(std::string_view text) { + while (!text.empty() && std::isspace(static_cast(text.front()))) text.remove_prefix(1); + while (!text.empty() && std::isspace(static_cast(text.back()))) text.remove_suffix(1); + if (text.empty() || text.size() > 200) return std::nullopt; + + ServerUrl url; + + const size_t schemeEnd = text.find("://"); + if (schemeEnd != std::string_view::npos) { + const std::string scheme = lower(text.substr(0, schemeEnd)); + if (scheme == "https") { + url.secure = true; + } else if (scheme == "http") { + url.secure = false; + } else { + return std::nullopt; + } + text.remove_prefix(schemeEnd + 3); + } + url.port = url.secure ? 443 : 80; + + if (text.find_first_of("?#@ ") != std::string_view::npos) return std::nullopt; + + const size_t pathStart = text.find('/'); + std::string_view authority = text.substr(0, pathStart); + std::string_view path = pathStart == std::string_view::npos ? std::string_view{} : text.substr(pathStart); + + std::string_view portText; + bool hasPort = false; + if (!authority.empty() && authority.front() == '[') { + const size_t close = authority.find(']'); + if (close == std::string_view::npos || close == 1) return std::nullopt; + url.host = lower(authority.substr(1, close - 1)); + for (char c : url.host) { + if (!std::isxdigit(static_cast(c)) && c != ':' && c != '.') return std::nullopt; + } + std::string_view rest = authority.substr(close + 1); + if (!rest.empty()) { + if (rest.front() != ':') return std::nullopt; + hasPort = true; + portText = rest.substr(1); + } + } else { + const size_t colon = authority.find(':'); + url.host = lower(authority.substr(0, colon)); + if (colon != std::string_view::npos) { + hasPort = true; + portText = authority.substr(colon + 1); + } + if (url.host.empty()) return std::nullopt; + for (char c : url.host) { + if (!validHostChar(c)) return std::nullopt; + } + } + if (url.host.empty()) return std::nullopt; + + if (hasPort) { + if (portText.empty() || portText.size() > 5) return std::nullopt; + uint32_t port = 0; + for (char c : portText) { + if (!std::isdigit(static_cast(c))) return std::nullopt; + port = port * 10 + static_cast(c - '0'); + } + if (port == 0 || port > 65535) return std::nullopt; + url.port = static_cast(port); + } + + while (!path.empty() && path.back() == '/') path.remove_suffix(1); + url.basePath = std::string(path); + + return url; +} + +std::string ServerUrl::origin() const { + std::string out = secure ? "https://" : "http://"; + const bool ipv6 = host.find(':') != std::string::npos; + out += ipv6 ? "[" + host + "]" : host; + if (port != (secure ? 443 : 80)) out += ":" + std::to_string(port); + return out; +} + +std::string ServerUrl::url(std::string_view p) const { + return origin() + path(p); +} + +std::string ServerUrl::path(std::string_view p) const { + return basePath + std::string(p); +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/ServerUrl.h b/lib/netignite_core/src/netignite/ServerUrl.h new file mode 100644 index 0000000..17ebe9c --- /dev/null +++ b/lib/netignite_core/src/netignite/ServerUrl.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include +#include + +namespace netignite { + +/** A NetIgnite server address, e.g. `https://app.netignite.dev` or `http://192.168.1.10:18232`. */ +struct ServerUrl { + bool secure = true; + /** Host name or IP address; IPv6 without brackets. */ + std::string host; + uint16_t port = 443; + /** Path prefix if the server runs under a sub-path (`/netignite`), without a trailing slash. */ + std::string basePath; + + /** `https://host[:port]` (port only if not the scheme's default). */ + std::string origin() const; + /** `origin + basePath + path`, e.g. `url("/api/v1/agents/enroll")`. */ + std::string url(std::string_view path) const; + /** `basePath + path`, for clients that take host, port and path separately. */ + std::string path(std::string_view path) const; +}; + +/** + * Parses `http://` and `https://` URLs with an optional port and path. Query strings, fragments + * and credentials are rejected; a missing scheme means `https://`. + */ +std::optional parseServerUrl(std::string_view text); + +} // namespace netignite diff --git a/partitions.csv b/partitions.csv new file mode 100644 index 0000000..27e31f6 --- /dev/null +++ b/partitions.csv @@ -0,0 +1,10 @@ +# NetIgnite agent partition table (Arduino's min_spiffs layout). +# Two 1.875 MB app slots for OTA updates. Don't move nvs: the web installer writes the agent's +# provisioning data (server URL, enrollment token) into an NVS image at 0x9000. +# 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, diff --git a/platformio.ini b/platformio.ini index 948c625..3c50b99 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,28 +1,53 @@ -; PlatformIO Project Configuration File +; NetIgnite ESP32 agent, firmware v2. ; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; https://docs.platformio.org/page/projectconf.html +; Build: pio run -e esp32dev +; Flash: pio run -e esp32dev -t upload (or use the web installer in the NetIgnite dashboard) +; Tests: pio test -e native + +[platformio] +default_envs = esp32dev [env:esp32dev] -platform = espressif32 +; pioarduino = Arduino-ESP32 3.3.12 on ESP-IDF 5.5.5. Pinned: firmware builds must be reproducible. +platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.312-1/platform-espressif32.zip board = esp32dev framework = arduino -lib_deps = - a7md0/WakeOnLan@^1.1.7 - links2004/WebSockets@^2.6.1 - bblanchon/ArduinoJson@^7.4.1 +; Two 1.875 MB OTA slots (min_spiffs layout). NVS stays at 0x9000, which the web installer writes. +board_build.partitions = partitions.csv +lib_deps = + links2004/WebSockets@2.7.3 + bblanchon/ArduinoJson@7.4.3 monitor_speed = 115200 +monitor_filters = esp32_exception_decoder build_unflags = -std=gnu++11 -build_flags = -std=gnu++17 - -; Generates data/cert/x509_crt_bundle.bin (embedded below) before every build. +build_flags = + -std=gnu++17 + -Wall + -DCORE_DEBUG_LEVEL=0 +; Generate the trusted root certificate bundle and the firmware version before building. extra_scripts = - pre:data/cert/run_gen_script.py + pre:data/cert/run_gen_script.py + pre:scripts/version.py +board_build.embed_files = + data/cert/x509_crt_bundle.bin + +[env:esp32dev-qemu] +; For Espressif's QEMU (no Wi-Fi radio): the same firmware with Wi-Fi disabled, to test the serial +; console, Improv and settings without hardware. Not for real boards. +extends = env:esp32dev +build_flags = + ${env:esp32dev.build_flags} + -DNETIGNITE_EMULATOR -board_build.embed_txtfiles = - data/cert/x509_crt_bundle.bin \ No newline at end of file +[env:native] +; Host-side unit tests for the parts that don't need hardware (parsers, encoders). +platform = native +lib_deps = + bblanchon/ArduinoJson@7.4.3 +build_flags = + -std=gnu++17 + -DNETIGNITE_NATIVE_TEST +build_src_filter = -<*> +test_build_src = no +lib_extra_dirs = +lib_compat_mode = off diff --git a/scripts/check_size.py b/scripts/check_size.py new file mode 100644 index 0000000..40bbb17 --- /dev/null +++ b/scripts/check_size.py @@ -0,0 +1,36 @@ +""" +Fails if the firmware takes more than 85 % of an OTA app slot, so OTA updates keep room to grow. + + python scripts/check_size.py [.pio/build/esp32dev/firmware.bin] +""" + +import csv +import os +import sys + +LIMIT = 0.85 +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +def app_slot_size(): + with open(os.path.join(ROOT, "partitions.csv"), newline="") as handle: + rows = (row for row in csv.reader(handle) if row and not row[0].strip().startswith("#")) + for row in rows: + name, kind, subtype, _offset, size = (cell.strip() for cell in row[:5]) + if kind == "app" and subtype == "ota_0": + return int(size, 0) + raise SystemExit("partitions.csv has no ota_0 app partition") + + +def main(): + firmware = sys.argv[1] if len(sys.argv) > 1 else os.path.join(ROOT, ".pio", "build", "esp32dev", "firmware.bin") + size = os.path.getsize(firmware) + slot = app_slot_size() + used = size / slot + print(f"Firmware: {size:,} bytes = {used:.1%} of the {slot:,}-byte OTA slot (limit {LIMIT:.0%})") + if used > LIMIT: + raise SystemExit("The firmware is too large for OTA updates to keep working.") + + +if __name__ == "__main__": + main() diff --git a/scripts/collect_release.py b/scripts/collect_release.py new file mode 100644 index 0000000..efed961 --- /dev/null +++ b/scripts/collect_release.py @@ -0,0 +1,91 @@ +""" +Collects the flash images of a build into a release directory and writes release.json, which the +NetIgnite server reads to offer the firmware in the web installer and for OTA updates. + + python scripts/collect_release.py [--signature firmware.sig] + +The files are the standard Arduino-ESP32 layout: bootloader at 0x1000, partition table at 0x8000, +OTA data (boot_app0) at 0xe000 and the app at 0x10000. The web installer adds an NVS image at +0x9000 with the server URL and a single-use enrollment token. +""" + +import argparse +import glob +import hashlib +import json +import os +import shutil + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +BUILD = os.path.join(ROOT, ".pio", "build", "esp32dev") + +PARTS = [ + ("bootloader.bin", 0x1000), + ("partitions.bin", 0x8000), + ("boot_app0.bin", 0xE000), + ("firmware.bin", 0x10000), +] + + +def find_boot_app0(): + core = os.environ.get("PLATFORMIO_CORE_DIR", os.path.join(os.path.expanduser("~"), ".platformio")) + matches = glob.glob(os.path.join(core, "packages", "framework-arduinoespressif32*", "tools", "partitions", "boot_app0.bin")) + if not matches: + raise SystemExit("boot_app0.bin not found in the PlatformIO packages") + return matches[0] + + +def sha256(path): + digest = hashlib.sha256() + with open(path, "rb") as handle: + for chunk in iter(lambda: handle.read(65536), b""): + digest.update(chunk) + return digest.hexdigest() + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("version") + parser.add_argument("output") + parser.add_argument("--signature", help="ECDSA P-256 signature (DER) of firmware.bin") + args = parser.parse_args() + + os.makedirs(args.output, exist_ok=True) + sources = { + "bootloader.bin": os.path.join(BUILD, "bootloader.bin"), + "partitions.bin": os.path.join(BUILD, "partitions.bin"), + "boot_app0.bin": find_boot_app0(), + "firmware.bin": os.path.join(BUILD, "firmware.bin"), + } + + parts = [] + for name, offset in PARTS: + target = os.path.join(args.output, name) + shutil.copyfile(sources[name], target) + parts.append({"file": name, "offset": offset, "size": os.path.getsize(target), "sha256": sha256(target)}) + + signature = None + if args.signature: + shutil.copyfile(args.signature, os.path.join(args.output, "firmware.sig")) + signature = "firmware.sig" + + release = { + "format": 1, + "name": "NetIgnite Agent", + "version": args.version.lstrip("v"), + "chip_family": "ESP32", + "board": "esp32dev", + "protocol": 2, + "parts": parts, + "nvs": {"offset": 0x9000, "size": 0x5000, "namespace": "netignite", "keys": ["server", "enroll"]}, + "app": {"file": "firmware.bin", "signature": signature}, + } + with open(os.path.join(args.output, "release.json"), "w") as handle: + json.dump(release, handle, indent=2) + handle.write("\n") + + print(json.dumps(release, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/scripts/generate_signing_key.sh b/scripts/generate_signing_key.sh new file mode 100644 index 0000000..44e5000 --- /dev/null +++ b/scripts/generate_signing_key.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env sh +# Creates the ECDSA P-256 key pair for signing firmware releases. +# +# sh scripts/generate_signing_key.sh +# +# - firmware-signing-key.pem (private): store it as the repository secret FIRMWARE_SIGNING_KEY +# (Settings -> Secrets and variables -> Actions), then delete the file. Never commit it. +# - keys/firmware-signing.pub.pem (public): commit it. OTA updates only accept firmware signed with +# the matching private key. +set -eu +mkdir -p keys +openssl ecparam -name prime256v1 -genkey -noout -out firmware-signing-key.pem +openssl ec -in firmware-signing-key.pem -pubout -out keys/firmware-signing.pub.pem +echo "Private key: firmware-signing-key.pem (add as secret FIRMWARE_SIGNING_KEY, then delete)" +echo "Public key: keys/firmware-signing.pub.pem (commit)" diff --git a/scripts/version.py b/scripts/version.py new file mode 100644 index 0000000..fa61f3d --- /dev/null +++ b/scripts/version.py @@ -0,0 +1,42 @@ +""" +PlatformIO pre-build script: defines NETIGNITE_FW_VERSION. + +Release builds set the NETIGNITE_FW_VERSION environment variable (CI passes the tag without the +leading "v"). Local builds use `git describe` (e.g. "2.0.0-3-gabc1234-dirty"), or +"2.0.0-dev+" while the repository has no tags. +""" + +import os +import subprocess + +Import("env") # noqa: F821 - provided by PlatformIO (SCons) + +DEFAULT_BASE = "2.0.0-dev" + + +def git(*args): + try: + return subprocess.check_output( + ["git", *args], cwd=env.subst("$PROJECT_DIR"), stderr=subprocess.DEVNULL # noqa: F821 + ).decode().strip() + except Exception: + return "" + + +def firmware_version(): + version = os.environ.get("NETIGNITE_FW_VERSION", "").strip() + if version: + return version.lstrip("v") + + described = git("describe", "--tags", "--dirty", "--match", "v*") + if described: + return described.lstrip("v") + + commit = git("rev-parse", "--short", "HEAD") + dirty = ".dirty" if git("status", "--porcelain") else "" + return f"{DEFAULT_BASE}+{commit}{dirty}" if commit else DEFAULT_BASE + + +version = firmware_version() +print(f"NetIgnite firmware version: {version}") +env.Append(CPPDEFINES=[("NETIGNITE_FW_VERSION", env.StringifyMacro(version))]) # noqa: F821 diff --git a/src/Config.h b/src/Config.h new file mode 100644 index 0000000..0e40208 --- /dev/null +++ b/src/Config.h @@ -0,0 +1,63 @@ +#pragma once + +#include + +#ifndef NETIGNITE_FW_VERSION +#define NETIGNITE_FW_VERSION "2.0.0-dev" +#endif + +namespace config { + +constexpr const char* FIRMWARE_NAME = "NetIgnite Agent"; +constexpr const char* FIRMWARE_VERSION = NETIGNITE_FW_VERSION; + +/** + * NVS namespace and keys (max. 15 characters each). The web installer writes `server` and + * `enroll` into an NVS partition image, so these names are part of the provisioning format: + * change them only together with the server's image generator. + */ +namespace keys { +constexpr const char* NAMESPACE = "netignite"; +constexpr const char* SERVER_URL = "server"; +constexpr const char* ENROLL_TOKEN = "enroll"; +constexpr const char* AGENT_ID = "agent_id"; +constexpr const char* TOKEN_ID = "token_id"; +constexpr const char* SECRET = "secret"; +constexpr const char* WIFI_SSID = "wifi_ssid"; +constexpr const char* WIFI_PASSWORD = "wifi_pass"; +constexpr const char* DEVICE_NAME = "name"; +constexpr const char* IP_MODE = "ip_mode"; +constexpr const char* STATIC_IP = "ip"; +constexpr const char* GATEWAY = "gateway"; +constexpr const char* NETMASK = "netmask"; +constexpr const char* DNS1 = "dns1"; +constexpr const char* DNS2 = "dns2"; +constexpr const char* LOG_LEVEL = "log_level"; +} // namespace keys + +constexpr uint32_t SERIAL_BAUD = 115200; + +/** Wi-Fi: reconnect when the link has been down this long (the driver also retries on its own). */ +constexpr uint32_t WIFI_RECONNECT_AFTER_MS = 30000; +/** Wi-Fi: how long a new network (Improv, console) may take to connect before reverting. */ +constexpr uint32_t WIFI_TRY_CONNECT_MS = 20000; + +/** Server: reconnect backoff, doubled after each failed attempt. */ +constexpr uint32_t RECONNECT_MIN_MS = 5000; +constexpr uint32_t RECONNECT_MAX_MS = 60000; +/** The server sends a PING every 30 s; without any frame for this long the link is dead. */ +constexpr uint32_t SERVER_SILENCE_TIMEOUT_MS = 100000; + +/** Enrollment: retry interval after network errors. */ +constexpr uint32_t ENROLL_RETRY_MS = 30000; + +/** Status checks must finish before the server's 6 s request timeout. */ +constexpr uint32_t STATUS_BUDGET_MS = 4500; +constexpr uint32_t PING_TIMEOUT_MS = 1000; +constexpr uint32_t TCP_TIMEOUT_MS = 1500; + +/** Wake-on-LAN: rounds of packets per request, and the pause between them. */ +constexpr int WOL_ROUNDS = 3; +constexpr uint32_t WOL_ROUND_DELAY_MS = 100; + +} // namespace config diff --git a/src/agent/AgentClient.cpp b/src/agent/AgentClient.cpp new file mode 100644 index 0000000..929d344 --- /dev/null +++ b/src/agent/AgentClient.cpp @@ -0,0 +1,195 @@ +#include "agent/AgentClient.h" + +#include +#include +#include +#include +#include + +#include "Config.h" +#include "core/CaBundle.h" +#include "core/DeviceInfo.h" +#include "core/Log.h" +#include "net/WakeSender.h" +#include "netignite/Protocol.h" + +namespace protocol = netignite::protocol; + +void AgentClient::begin() { + worker_.begin(); + ws_.onEvent([this](WStype_t type, uint8_t* payload, size_t length) { onEvent(type, payload, length); }); +} + +void AgentClient::start(const netignite::ServerUrl& server, const String& tokenId, const String& secret) { + stop(); + + const std::string path = server.path("/ws/agent"); + authHeader_ = std::string("Authorization: Bearer netignite_agent_") + tokenId.c_str() + ":" + secret.c_str(); + + // An empty subprotocol: the server doesn't negotiate one. + if (server.secure) { + ws_.beginSslWithBundle(server.host.c_str(), server.port, path.c_str(), caBundle::data(), caBundle::size(), ""); + } else { + ws_.begin(server.host.c_str(), server.port, path.c_str(), ""); + } + ws_.setExtraHeaders(authHeader_.c_str()); + + reconnectInterval_ = config::RECONNECT_MIN_MS; + ws_.setReconnectInterval(reconnectInterval_); + + running_ = true; + Log::info("Connecting to %s%s", server.origin().c_str(), path.c_str()); +} + +void AgentClient::stop() { + if (!running_) return; + running_ = false; + ws_.disconnect(); + connected_ = false; + helloSent_ = false; + generation_++; +} + +AgentClient::State AgentClient::state() const { + if (!running_) return State::Stopped; + return connected_ && helloSent_ ? State::Online : State::Connecting; +} + +void AgentClient::loop() { + if (!running_) return; + ws_.loop(); + + StatusWorker::Done done; + while (worker_.poll(done)) { + if (done.generation != generation_ || !connected_) continue; + if (done.error[0] != '\0') { + send(protocol::encodeError(done.requestId, done.error)); + } else { + JsonDocument payload; + payload["online"] = done.online; + send(protocol::encodeResponse(done.requestId, payload.as())); + } + } + + // The server pings every 30 s; silence means the connection is dead even if TCP doesn't know. + if (connected_ && millis() - lastFrameAt_ > config::SERVER_SILENCE_TIMEOUT_MS) { + Log::warn("No message from the server for %lu s, reconnecting", + static_cast(config::SERVER_SILENCE_TIMEOUT_MS / 1000)); + ws_.disconnect(); + } +} + +void AgentClient::onEvent(WStype_t type, uint8_t* payload, size_t length) { + switch (type) { + case WStype_CONNECTED: + connected_ = true; + generation_++; + lastFrameAt_ = millis(); + reconnectInterval_ = config::RECONNECT_MIN_MS; + ws_.setReconnectInterval(reconnectInterval_); + sendHello(); + break; + + case WStype_DISCONNECTED: + if (connected_) { + Log::warn("Disconnected from the server"); + } else { + Log::warn("Couldn't connect to the server, retrying in %lu s", + static_cast(reconnectInterval_ / 1000)); + // Exponential backoff while the server is unreachable or rejects the credential. + reconnectInterval_ = min(reconnectInterval_ * 2, config::RECONNECT_MAX_MS); + ws_.setReconnectInterval(reconnectInterval_); + } + connected_ = false; + helloSent_ = false; + generation_++; + break; + + case WStype_TEXT: + lastFrameAt_ = millis(); + handleText(std::string_view(reinterpret_cast(payload), length)); + break; + + case WStype_PING: + case WStype_PONG: + lastFrameAt_ = millis(); + break; + + case WStype_ERROR: + Log::warn("WebSocket error: %.*s", static_cast(length), payload ? reinterpret_cast(payload) : ""); + break; + + default: + break; + } +} + +void AgentClient::sendHello() { + JsonDocument hello; + hello["protocol"] = protocol::VERSION; + hello["kind"] = protocol::AGENT_KIND; + hello["version"] = config::FIRMWARE_VERSION; + + JsonArray capabilities = hello["capabilities"].to(); + for (const char* capability : protocol::CAPABILITIES) capabilities.add(capability); + + JsonObject info = hello["info"].to(); + deviceInfo::fill(info, settings_, wifi_); + + send(protocol::encodeEvent("HELLO", hello.as())); + helloSent_ = true; + Log::info("Connected to the server as agent %lu", static_cast(settings_.agentId())); +} + +void AgentClient::send(const std::string& frame) { + if (!connected_) return; + ws_.sendTXT(frame.c_str(), frame.size()); +} + +void AgentClient::handleText(std::string_view text) { + JsonDocument doc; + protocol::Frame frame; + std::string error; + + if (!protocol::parseFrame(text, doc, frame, error)) { + Log::warn("Ignored an invalid frame from the server: %s", error.c_str()); + return; + } + if (frame.type != protocol::FrameType::Request) return; + + Log::debug("Request %lu: %s", static_cast(frame.id), frame.cmd.c_str()); + + if (frame.cmd == "PING") { + send(protocol::encodeEmptyResponse(frame.id)); + return; + } + + if (frame.cmd == "WAKE") { + protocol::WakeRequest wake; + if (!protocol::parseWakeRequest(frame.payload, wake, error)) { + send(protocol::encodeError(frame.id, error)); + return; + } + String sendError; + if (wake::send(wake.mac, wake.port, sendError)) { + send(protocol::encodeEmptyResponse(frame.id)); + } else { + send(protocol::encodeError(frame.id, sendError.c_str())); + } + return; + } + + if (frame.cmd == "STATUS") { + protocol::StatusRequest status; + if (!protocol::parseStatusRequest(frame.payload, status, error)) { + send(protocol::encodeError(frame.id, error)); + return; + } + if (!worker_.submit(frame.id, generation_, status)) { + send(protocol::encodeError(frame.id, "Too many status checks at once")); + } + return; + } + + send(protocol::encodeError(frame.id, "Unknown command " + frame.cmd)); +} diff --git a/src/agent/AgentClient.h b/src/agent/AgentClient.h new file mode 100644 index 0000000..caa0670 --- /dev/null +++ b/src/agent/AgentClient.h @@ -0,0 +1,49 @@ +#pragma once + +#include +#include + +#include +#include + +#include "agent/StatusWorker.h" +#include "net/WifiLink.h" +#include "netignite/ServerUrl.h" + +/** + * The connection to the NetIgnite server: one WebSocket to `/ws/agent` speaking protocol v2. + * Sends HELLO on connect and answers PING, WAKE and STATUS requests. + */ +class AgentClient { + public: + enum class State { Stopped, Connecting, Online }; + + AgentClient(Settings& settings, WifiLink& wifi) : settings_(settings), wifi_(wifi) {} + + void begin(); + void start(const netignite::ServerUrl& server, const String& tokenId, const String& secret); + void stop(); + void loop(); + + State state() const; + bool running() const { return running_; } + + private: + Settings& settings_; + WifiLink& wifi_; + WebSocketsClient ws_; + StatusWorker worker_; + + bool running_ = false; + bool connected_ = false; + bool helloSent_ = false; + uint32_t generation_ = 0; + uint32_t reconnectInterval_ = 0; + uint32_t lastFrameAt_ = 0; + std::string authHeader_; + + void onEvent(WStype_t type, uint8_t* payload, size_t length); + void handleText(std::string_view text); + void sendHello(); + void send(const std::string& frame); +}; diff --git a/src/agent/Enrollment.cpp b/src/agent/Enrollment.cpp new file mode 100644 index 0000000..c397b30 --- /dev/null +++ b/src/agent/Enrollment.cpp @@ -0,0 +1,102 @@ +#include "agent/Enrollment.h" + +#include +#include +#include +#include +#include + +#include + +#include "core/CaBundle.h" +#include "core/Log.h" +#include "netignite/Hex.h" +#include "netignite/Protocol.h" + +namespace enrollment { + +namespace { + +String generateSecret() { + uint8_t bytes[32]; + esp_fill_random(bytes, sizeof(bytes)); + return netignite::toHex(bytes, sizeof(bytes)).c_str(); +} + +} // namespace + +Result enroll(const netignite::ServerUrl& server, const String& enrollmentToken) { + Result result; + const String secret = generateSecret(); + const std::string url = server.url("/api/v1/agents/enroll"); + + std::unique_ptr client; + if (server.secure) { + auto* secure = new NetworkClientSecure(); + secure->setCACertBundle(caBundle::data(), caBundle::size()); + client.reset(secure); + } else { + client.reset(new NetworkClient()); + } + + HTTPClient http; + http.setTimeout(15000); + http.setReuse(false); + if (!http.begin(*client, url.c_str())) { + result.message = "Invalid server URL"; + return result; + } + http.addHeader("Content-Type", "application/json"); + + JsonDocument body; + body["enrollment_token"] = enrollmentToken; + body["secret"] = secret; + String payload; + serializeJson(body, payload); + + Log::info("Enrolling with %s", server.origin().c_str()); + const int status = http.POST(payload); + const String response = status > 0 ? http.getString() : String(); + http.end(); + + if (status <= 0) { + result.message = String("Request failed: ") + HTTPClient::errorToString(status); + return result; + } + + JsonDocument answer; + const bool parsed = !deserializeJson(answer, response); + const char* message = parsed ? answer["message"].as() : nullptr; + + if (status == 401 || status == 400) { + result.status = Result::Status::Rejected; + result.message = message ? message : "Enrollment token rejected"; + return result; + } + if (status != 200 || !parsed || !answer["success"].as()) { + result.message = String("Server answered ") + status + (message ? String(": ") + message : String()); + return result; + } + + const char* kind = answer["data"]["kind"]; + const char* tokenId = answer["data"]["token_id"]; + const uint32_t agentId = answer["data"]["agent_id"] | 0u; + if (!tokenId || !*tokenId || agentId == 0) { + result.message = "Unexpected answer from the server"; + return result; + } + if (!kind || String(kind) != netignite::protocol::AGENT_KIND) { + // The token belongs to a Linux agent; the credential is useless here. + result.status = Result::Status::Rejected; + result.message = "This enrollment token is for a different kind of agent"; + return result; + } + + result.status = Result::Status::Ok; + result.agentId = agentId; + result.tokenId = tokenId; + result.secret = secret; + return result; +} + +} // namespace enrollment diff --git a/src/agent/Enrollment.h b/src/agent/Enrollment.h new file mode 100644 index 0000000..f433439 --- /dev/null +++ b/src/agent/Enrollment.h @@ -0,0 +1,31 @@ +#pragma once + +#include + +#include "netignite/ServerUrl.h" + +/** + * Enrollment: the agent generates its own secret (hardware RNG) and exchanges a single-use + * enrollment token for a credential at `POST /api/v1/agents/enroll`. The secret is only sent + * once, over this request; the server keeps a hash of it. + */ +namespace enrollment { + +struct Result { + enum class Status { + Ok, + /** The server rejected the token (unknown, used or expired): a new one is needed. */ + Rejected, + /** Network or server error: try again later. */ + Failed, + }; + Status status = Status::Failed; + String message; + uint32_t agentId = 0; + String tokenId; + String secret; +}; + +Result enroll(const netignite::ServerUrl& server, const String& enrollmentToken); + +} // namespace enrollment diff --git a/src/agent/StatusWorker.cpp b/src/agent/StatusWorker.cpp new file mode 100644 index 0000000..a7b6c30 --- /dev/null +++ b/src/agent/StatusWorker.cpp @@ -0,0 +1,51 @@ +#include "agent/StatusWorker.h" + +#include "net/Probes.h" + +namespace { +constexpr UBaseType_t QUEUE_LENGTH = 8; +constexpr uint32_t TASK_STACK = 6144; +} // namespace + +void StatusWorker::begin() { + jobs_ = xQueueCreate(QUEUE_LENGTH, sizeof(Job*)); + results_ = xQueueCreate(QUEUE_LENGTH, sizeof(Done)); + xTaskCreate(run, "status", TASK_STACK, this, 2, nullptr); +} + +bool StatusWorker::submit(uint32_t requestId, uint32_t generation, const netignite::protocol::StatusRequest& request) { + auto* job = new Job{requestId, generation, request}; + if (xQueueSend(jobs_, &job, 0) != pdTRUE) { + delete job; + return false; + } + return true; +} + +bool StatusWorker::poll(Done& out) { + return xQueueReceive(results_, &out, 0) == pdTRUE; +} + +void StatusWorker::run(void* arg) { + auto* self = static_cast(arg); + for (;;) { + Job* job = nullptr; + if (xQueueReceive(self->jobs_, &job, portMAX_DELAY) != pdTRUE || !job) continue; + + const probes::Result result = probes::check(job->request); + + Done done = {}; + done.requestId = job->requestId; + done.generation = job->generation; + done.online = result.online; + strlcpy(done.error, result.error.c_str(), sizeof(done.error)); + delete job; + + // The main loop drains results continuously; drop one if it ever falls behind. + if (xQueueSend(self->results_, &done, pdMS_TO_TICKS(1000)) != pdTRUE) { + Done stale; + xQueueReceive(self->results_, &stale, 0); + xQueueSend(self->results_, &done, 0); + } + } +} diff --git a/src/agent/StatusWorker.h b/src/agent/StatusWorker.h new file mode 100644 index 0000000..2db79e6 --- /dev/null +++ b/src/agent/StatusWorker.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +#include "netignite/Protocol.h" + +/** + * Runs STATUS checks (blocking ping/TCP/DNS) in their own FreeRTOS task, one at a time. The main + * loop submits jobs and polls for results, so the WebSocket keeps being served meanwhile. + */ +class StatusWorker { + public: + struct Done { + uint32_t requestId; + /** Connection the request came from; results for older connections are dropped. */ + uint32_t generation; + bool online; + char error[96]; + }; + + void begin(); + /** False if too many checks are queued. */ + bool submit(uint32_t requestId, uint32_t generation, const netignite::protocol::StatusRequest& request); + bool poll(Done& out); + + private: + struct Job { + uint32_t requestId; + uint32_t generation; + netignite::protocol::StatusRequest request; + }; + + QueueHandle_t jobs_ = nullptr; + QueueHandle_t results_ = nullptr; + + static void run(void* self); +}; diff --git a/src/agent/agent.h b/src/agent/agent.h deleted file mode 100644 index 76ddbe1..0000000 --- a/src/agent/agent.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef AGENT_H -#define AGENT_H - -#include - -#include "utils/logger.h" -#include "utils/wol.h" -#include "utils/utils.h" -#include "agent/message.h" -#include "agent/cmd_registry.h" - -extern const uint8_t rootca_crt_bundle_start[] asm( - "_binary_data_cert_x509_crt_bundle_bin_start"); - -extern WebSocketsClient webSocket; - -struct AgentConfig { - const char* host; - uint16_t port; - bool useSSL; - const char* authId; - const char* authSecret; -}; - -class Agent { - public: - - static void setup(const AgentConfig& config) { - - host = config.host; - port = config.port; - useSSL = config.useSSL; - authId = config.authId; - authSecret = config.authSecret; - - if (strlen(authId) == 0 || strlen(authSecret) == 0) { - Logger::errorln("Missing credentials!"); - return; - } - - if (useSSL) { - webSocket.beginSslWithBundle(host, port, "/api/agent-control-service", rootca_crt_bundle_start, ""); - } else { - webSocket.begin(host, port, "/api/agent-control-service"); - } - - webSocket.setAuthorization(authId, authSecret); - - webSocket.onEvent(webSocketEvent); - } - - static void loop() { - webSocket.loop(); - } - - private: - - static inline const char* host = nullptr; - static inline uint16_t port = 0; - static inline bool useSSL = false; - static inline const char* authId = nullptr; - static inline const char* authSecret = nullptr; - - static void webSocketEvent(WStype_t type, uint8_t* payload, size_t length) { - - switch(type) { - case WStype_DISCONNECTED: - - webSocket.setReconnectInterval(60000); // 60 seconds - - Logger::infoln("Websocket Disconnected! Retrying in 60 seconds..."); - break; - - case WStype_CONNECTED: - - Logger::infoln("Websocket Connected to " + String(host) + ":" + String(port) + " SSL: " + String(useSSL ? "true" : "false")); - break; - - case WStype_TEXT: { - - AgentMessage* message = nullptr; - - if (AgentMessage::decode((const char*)payload, message)) { - - JsonDocument responsePayload; - - if (!CommandRegistry::executeCommand(message->cmd.c_str(), message->payload, responsePayload)) { - responsePayload["status"] = "ERROR"; - responsePayload["message"] = "Unknown command"; - } - - const AgentMessage responseMessage(message->cmd, message->id, responsePayload); - - String encodedResponse = responseMessage.encode(); - webSocket.sendTXT(encodedResponse); - } - - delete message; - message = nullptr; - - break; - } - - case WStype_ERROR: - - Logger::errorln("Websocket Error: " + String((char*)payload)); - - break; - - case WStype_BIN: - case WStype_FRAGMENT_TEXT_START: - case WStype_FRAGMENT_BIN_START: - case WStype_FRAGMENT: - case WStype_FRAGMENT_FIN: - break; - } - - } - -}; - -#endif // AGENT_H \ No newline at end of file diff --git a/src/agent/cmd_registry.h b/src/agent/cmd_registry.h deleted file mode 100644 index 82a878c..0000000 --- a/src/agent/cmd_registry.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef CMD_REGISTRY_H -#define CMD_REGISTRY_H - -#include -#include - -#include "commands/wakeup.h" -#include "commands/heartbeat.h" -#include "commands/get_status.h" - -using FuncPtr = JsonDocument (*)(JsonDocument& payload); - -struct CommandEntry { - const char *name; - FuncPtr handler; -}; - -class CommandRegistry { - public: - - static const CommandEntry* getCommand(const char* cmd) { - if (!cmd) return nullptr; - for (const auto& entry : registry) { - if (strcmp(entry.name, cmd) == 0) { - return &entry; - } - } - return nullptr; - } - - static bool executeCommand(const char* cmd, JsonDocument& payload, JsonDocument& result) { - const CommandEntry* entry = getCommand(cmd); - if (entry) { - result = entry->handler(payload); - return true; - } - return false; - } - - private: - static const inline CommandEntry registry[] = { - {"WAKEUP", wakeup}, - {"HEARTBEAT", heartbeat}, - {"GET_STATUS", get_status}, - }; -}; - - -#endif // CMD_REGISTRY_H \ No newline at end of file diff --git a/src/agent/commands/get_status.h b/src/agent/commands/get_status.h deleted file mode 100644 index a974630..0000000 --- a/src/agent/commands/get_status.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef GET_STATUS_H -#define GET_STATUS_H - -#include -#include -#include "utils/inputValidation.h" -#include "utils/utils.h" -#include "utils/icmp.h" - -JsonDocument get_status(JsonDocument& input) { - - JsonDocument response; - - response["status"] = "ERROR"; - response["online"] = "unknown"; - - if (!input["address"].is()) { - response["message"] = "Missing or invalid payload"; - return response; - } - - if (InputValidation::ipv4Address(input["address"])) { - - IPAddress ipAddress; - if (!ipAddress.fromString(static_cast(input["address"]))) { - response["message"] = "Invalid IPv4 address format"; - return response; - } - - response["online"] = ICMP::ping(ipAddress, 1) ? "online" : "offline"; - - } else if (InputValidation::macAddress(input["address"])) { - - String linkLocal = Utils::macToLinkLocalIPv6(input["address"]); - IPv6Address linkLocalAddress; - if (linkLocal.length() == 0 || !linkLocalAddress.fromString(linkLocal.c_str())) { - response["message"] = "Invalid MAC address format"; - return response; - } - - response["online"] = ICMP::ping(linkLocalAddress, 1) ? "online" : "offline"; - - } else { - response["message"] = "Invalid address format: must be a valid IPv4 address or a MAC address"; - return response; - } - - response["status"] = "OK"; - response["message"] = "Status retrieved successfully"; - return response; -} - -#endif // GET_STATUS_H \ No newline at end of file diff --git a/src/agent/commands/heartbeat.h b/src/agent/commands/heartbeat.h deleted file mode 100644 index b242ece..0000000 --- a/src/agent/commands/heartbeat.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef HEARTBEAT_H -#define HEARTBEAT_H - -#include -#include - -JsonDocument heartbeat(JsonDocument& input) { - - JsonDocument response; - - // currently no handle needed - - return response; -} - -#endif // HEARTBEAT_H \ No newline at end of file diff --git a/src/agent/commands/wakeup.h b/src/agent/commands/wakeup.h deleted file mode 100644 index c287fdd..0000000 --- a/src/agent/commands/wakeup.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef WAKEUP_H -#define WAKEUP_H - -#include -#include -#include "utils/wol.h" - -JsonDocument wakeup(JsonDocument& input) { - - JsonDocument response; - - if (!input["macAddress"].is() || !input["port"].is()) { - response["status"] = "ERROR"; - response["message"] = "Missing or invalid payload"; - return response; - } - - const char *macAddress = input["macAddress"]; - uint16_t port = input["port"]; - - const bool result = WOL::wakeup(macAddress, port); - if (!result) { - response["status"] = "ERROR"; - response["message"] = "Wakeup failed: Invalid MAC address or port"; - return response; - } - - response["status"] = "OK"; - response["message"] = "Wakeup successful"; - - return response; -} - -#endif // WAKEUP_H \ No newline at end of file diff --git a/src/agent/message.h b/src/agent/message.h deleted file mode 100644 index b916c3e..0000000 --- a/src/agent/message.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef MESSAGE_H -#define MESSAGE_H - -#include -#include -#include -#include - -class AgentMessage { - public: - - const String cmd; - const uint32_t id; - JsonDocument payload; - - AgentMessage(const String& cmd, uint32_t id, const JsonDocument& payloadDoc) - : cmd(cmd), id(id) { - this->payload.set(payloadDoc); - } - - String encode() const { - String encodedString = cmd + ":" + String(id) + ":"; - - String serializedPayload; - serializeJson(payload, serializedPayload); - - encodedString += serializedPayload; - return encodedString; - } - - static bool decode(const String& message, AgentMessage*& result) { - - result = nullptr; - - if (message.length() == 0) return false; - - int firstColon = message.indexOf(':'); - int secondColon = message.indexOf(':', firstColon + 1); - - if (firstColon == -1 || secondColon == -1) { - return false; - } - - String cmdStr = message.substring(0, firstColon); - String idStr = message.substring(firstColon + 1, secondColon); - String jsonStr = message.substring(secondColon + 1); - - char* endPtr = nullptr; - unsigned long parsedId = strtoul(idStr.c_str(), &endPtr, 10); - if (endPtr == idStr.c_str() || parsedId > 0xFFFFFFFFUL) { - return false; - } - - JsonDocument doc; // or appropriate size - DeserializationError error = deserializeJson(doc, jsonStr); - if (error || !doc.is()) { - return false; - } - - result = new AgentMessage(cmdStr, static_cast(parsedId), doc); - return true; - } - -}; - -#endif // MESSAGE_H diff --git a/src/config/config.sample.h b/src/config/config.sample.h deleted file mode 100644 index e821187..0000000 --- a/src/config/config.sample.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef SECRETS_H -#define SECRETS_H - - -#define C_WIFI_SSID "WIFI_SSID" -#define C_WIFI_PASSWORD "WIFI_PASSWORD" - -#define C_WIFI_LOCAL_IP IPAddress(192, 168, 1, 32) -#define C_WIFI_GATEWAY_IP IPAddress(192, 168, 1, 1) -#define C_WIFI_SUBNET_MASK IPAddress(255, 255, 255, 0) - -#define C_WIFI_PRIMARY_DNS IPAddress(1, 1, 1, 1) -#define C_WIFI_SECONDARY_DNS IPAddress(1, 0, 0, 1) - -#define C_CONTROL_SERVER_HOST "example.com" -#define C_CONTROL_SERVER_PORT (uint16_t) 80 -#define C_CONTROL_SERVER_USE_SSL (bool) false - -#define C_CONTROL_SERVER_AUTH_ID "AUTH_ID" -#define C_CONTROL_SERVER_AUTH_SECRET "AUTH_SECRET" - - -#endif \ No newline at end of file diff --git a/src/core/CaBundle.cpp b/src/core/CaBundle.cpp new file mode 100644 index 0000000..1b9cc77 --- /dev/null +++ b/src/core/CaBundle.cpp @@ -0,0 +1,17 @@ +#include "core/CaBundle.h" + +// Symbols created by board_build.embed_files (binary, not NUL-terminated). +extern const uint8_t ca_bundle_start[] asm("_binary_data_cert_x509_crt_bundle_bin_start"); +extern const uint8_t ca_bundle_end[] asm("_binary_data_cert_x509_crt_bundle_bin_end"); + +namespace caBundle { + +const uint8_t* data() { + return ca_bundle_start; +} + +size_t size() { + return static_cast(ca_bundle_end - ca_bundle_start); +} + +} // namespace caBundle diff --git a/src/core/CaBundle.h b/src/core/CaBundle.h new file mode 100644 index 0000000..69d669b --- /dev/null +++ b/src/core/CaBundle.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +/** + * The trusted root certificates (data/cert/x509_crt_bundle.bin, generated at build time from + * Mozilla's list plus data/cert/custom/), embedded into the firmware. + */ +namespace caBundle { + +const uint8_t* data(); +size_t size(); + +} // namespace caBundle diff --git a/src/core/DeviceInfo.cpp b/src/core/DeviceInfo.cpp new file mode 100644 index 0000000..cbd8504 --- /dev/null +++ b/src/core/DeviceInfo.cpp @@ -0,0 +1,73 @@ +#include "core/DeviceInfo.h" + +#include +#include +#include +#include + +#include "Config.h" + +namespace deviceInfo { + +const char* resetReason() { + switch (esp_reset_reason()) { + case ESP_RST_POWERON: + return "power-on"; + case ESP_RST_SW: + return "restart"; + case ESP_RST_PANIC: + return "crash"; + case ESP_RST_INT_WDT: + case ESP_RST_TASK_WDT: + case ESP_RST_WDT: + return "watchdog"; + case ESP_RST_BROWNOUT: + return "brownout"; + case ESP_RST_DEEPSLEEP: + return "deep sleep"; + case ESP_RST_EXT: + return "reset pin"; + default: + return "unknown"; + } +} + +String chip() { + return String(ESP.getChipModel()) + " rev " + (ESP.getChipRevision() / 100) + "." + (ESP.getChipRevision() % 100); +} + +String mac() { + uint8_t bytes[6] = {}; + esp_read_mac(bytes, ESP_MAC_WIFI_STA); + char text[18]; + snprintf(text, sizeof(text), "%02X:%02X:%02X:%02X:%02X:%02X", bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], + bytes[5]); + return text; +} + +const char* runningPartition() { + const esp_partition_t* partition = esp_ota_get_running_partition(); + return partition ? partition->label : "?"; +} + +void fill(JsonObject info, const Settings& settings, const WifiLink& wifi) { + info["name"] = settings.deviceName(); + info["mac"] = mac(); + info["ipv4"] = wifi.ipv4(); + const String linkLocal = wifi.linkLocalIpv6(); + if (linkLocal != "::") info["ipv6_link_local"] = linkLocal; + const String global = wifi.globalIpv6(); + if (global != "::") info["ipv6_global"] = global; + info["wifi"] = wifi.ssid(); + info["rssi_dbm"] = wifi.rssi(); + info["ip_mode"] = settings.staticIp().enabled ? "static" : "dhcp"; + info["chip"] = chip(); + info["partition"] = runningPartition(); + info["reset_reason"] = resetReason(); + info["uptime_s"] = static_cast(millis() / 1000); + info["free_heap"] = ESP.getFreeHeap(); + info["min_free_heap"] = ESP.getMinFreeHeap(); + info["esp_idf"] = esp_get_idf_version(); +} + +} // namespace deviceInfo diff --git a/src/core/DeviceInfo.h b/src/core/DeviceInfo.h new file mode 100644 index 0000000..7b7e1af --- /dev/null +++ b/src/core/DeviceInfo.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +#include "core/Settings.h" +#include "net/WifiLink.h" + +namespace deviceInfo { + +/** Diagnostics for the HELLO message (shown on the agent's page in the dashboard). */ +void fill(JsonObject info, const Settings& settings, const WifiLink& wifi); + +const char* resetReason(); +/** `ESP32-D0WD-V3 rev 3.1` */ +String chip(); +/** `AA:BB:CC:DD:EE:FF` of the Wi-Fi station interface. */ +String mac(); +/** Label of the running app partition (`app0`/`app1`). */ +const char* runningPartition(); + +} // namespace deviceInfo diff --git a/src/core/Log.cpp b/src/core/Log.cpp new file mode 100644 index 0000000..5455311 --- /dev/null +++ b/src/core/Log.cpp @@ -0,0 +1,92 @@ +#include "core/Log.h" + +#include + +LogLevel Log::level_ = LogLevel::Info; +SemaphoreHandle_t Log::mutex_ = nullptr; + +namespace { + +struct Lock { + explicit Lock(SemaphoreHandle_t mutex) : mutex_(mutex) { + if (mutex_) xSemaphoreTake(mutex_, portMAX_DELAY); + } + ~Lock() { + if (mutex_) xSemaphoreGive(mutex_); + } + SemaphoreHandle_t mutex_; +}; + +} // namespace + +void Log::begin(uint32_t baud) { + mutex_ = xSemaphoreCreateMutex(); + Serial.begin(baud); + // Start on a fresh line after the ROM bootloader's output. + Serial.print("\n"); +} + +const char* Log::levelName(LogLevel level) { + switch (level) { + case LogLevel::Error: + return "error"; + case LogLevel::Warn: + return "warn"; + case LogLevel::Info: + return "info"; + case LogLevel::Debug: + return "debug"; + } + return "info"; +} + +bool Log::parseLevel(const String& text, LogLevel& out) { + for (LogLevel level : {LogLevel::Error, LogLevel::Warn, LogLevel::Info, LogLevel::Debug}) { + if (text.equalsIgnoreCase(levelName(level))) { + out = level; + return true; + } + } + return false; +} + +void Log::write(LogLevel level, const char* prefix, const char* format, va_list args) { + if (level > level_) return; + + char message[256]; + vsnprintf(message, sizeof(message), format, args); + + Lock lock(mutex_); + Serial.printf("[%8lu] %s %s\n", static_cast(millis() / 1000), prefix, message); +} + +#define NETIGNITE_LOG_IMPL(name, level, prefix) \ + void Log::name(const char* format, ...) { \ + va_list args; \ + va_start(args, format); \ + write(level, prefix, format, args); \ + va_end(args); \ + } + +NETIGNITE_LOG_IMPL(error, LogLevel::Error, "E") +NETIGNITE_LOG_IMPL(warn, LogLevel::Warn, "W") +NETIGNITE_LOG_IMPL(info, LogLevel::Info, "I") +NETIGNITE_LOG_IMPL(debug, LogLevel::Debug, "D") + +void Log::print(const char* format, ...) { + char message[512]; + va_list args; + va_start(args, format); + vsnprintf(message, sizeof(message), format, args); + va_end(args); + + Lock lock(mutex_); + Serial.print(message); + Serial.print("\n"); +} + +void Log::writeRaw(const uint8_t* data, size_t length) { + Lock lock(mutex_); + Serial.write(data, length); + Serial.flush(); +} diff --git a/src/core/Log.h b/src/core/Log.h new file mode 100644 index 0000000..95878eb --- /dev/null +++ b/src/core/Log.h @@ -0,0 +1,44 @@ +#pragma once + +#include + +#include + +enum class LogLevel : uint8_t { + Error = 0, + Warn = 1, + Info = 2, + Debug = 3, +}; + +/** + * Logging to the serial port. Thread-safe, and every message ends with a newline: the web + * installer only recognizes Improv packets at the start of a line. + */ +class Log { + public: + static void begin(uint32_t baud); + + static void setLevel(LogLevel level) { level_ = level; } + static LogLevel level() { return level_; } + static const char* levelName(LogLevel level); + /** Parses `error`, `warn`, `info` or `debug`. */ + static bool parseLevel(const String& text, LogLevel& out); + + static void error(const char* format, ...) __attribute__((format(printf, 1, 2))); + static void warn(const char* format, ...) __attribute__((format(printf, 1, 2))); + static void info(const char* format, ...) __attribute__((format(printf, 1, 2))); + static void debug(const char* format, ...) __attribute__((format(printf, 1, 2))); + + /** Unprefixed console output (command answers), regardless of the log level. */ + static void print(const char* format, ...) __attribute__((format(printf, 1, 2))); + + /** Writes raw bytes (Improv packets) without interleaving with log lines. */ + static void writeRaw(const uint8_t* data, size_t length); + + private: + static LogLevel level_; + static SemaphoreHandle_t mutex_; + + static void write(LogLevel level, const char* prefix, const char* format, va_list args); +}; diff --git a/src/core/Settings.cpp b/src/core/Settings.cpp new file mode 100644 index 0000000..132cbce --- /dev/null +++ b/src/core/Settings.cpp @@ -0,0 +1,153 @@ +#include "core/Settings.h" + +#include +#include + +#include "Config.h" + +namespace k = config::keys; + +namespace { + +/** Opens the namespace for one operation; closes it again in the destructor. */ +class Store { + public: + explicit Store(bool readOnly) { ok_ = prefs_.begin(k::NAMESPACE, readOnly); } + ~Store() { + if (ok_) prefs_.end(); + } + Preferences& operator*() { return prefs_; } + Preferences* operator->() { return &prefs_; } + bool ok() const { return ok_; } + + private: + Preferences prefs_; + bool ok_ = false; +}; + +String readString(Preferences& prefs, const char* key) { + return prefs.isKey(key) ? prefs.getString(key, "") : String(); +} + +void writeString(Preferences& prefs, const char* key, const String& value) { + if (value.length() == 0) { + if (prefs.isKey(key)) prefs.remove(key); + } else { + prefs.putString(key, value); + } +} + +} // namespace + +String Settings::defaultDeviceName() { + uint8_t mac[6] = {}; + esp_read_mac(mac, ESP_MAC_WIFI_STA); + char name[32]; + snprintf(name, sizeof(name), "NetIgnite-%02X%02X%02X", mac[3], mac[4], mac[5]); + return name; +} + +void Settings::load() { + { + // Creates the namespace on first boot, so the read-only open below succeeds. + Store create(false); + } + Store store(true); + if (!store.ok()) { + Log::error("Settings: can't open NVS namespace '%s'", k::NAMESPACE); + deviceName_ = defaultDeviceName(); + return; + } + + serverUrl_ = readString(*store, k::SERVER_URL); + enrollToken_ = readString(*store, k::ENROLL_TOKEN); + agentId_ = store->getUInt(k::AGENT_ID, 0); + tokenId_ = readString(*store, k::TOKEN_ID); + secret_ = readString(*store, k::SECRET); + wifiSsid_ = readString(*store, k::WIFI_SSID); + wifiPassword_ = readString(*store, k::WIFI_PASSWORD); + deviceName_ = readString(*store, k::DEVICE_NAME); + if (deviceName_.length() == 0) deviceName_ = defaultDeviceName(); + + staticIp_.enabled = store->getUChar(k::IP_MODE, 0) == 1; + staticIp_.ip = readString(*store, k::STATIC_IP); + staticIp_.gateway = readString(*store, k::GATEWAY); + staticIp_.netmask = readString(*store, k::NETMASK); + staticIp_.dns1 = readString(*store, k::DNS1); + staticIp_.dns2 = readString(*store, k::DNS2); + + const uint8_t level = store->getUChar(k::LOG_LEVEL, static_cast(LogLevel::Info)); + logLevel_ = level <= static_cast(LogLevel::Debug) ? static_cast(level) : LogLevel::Info; +} + +void Settings::setServerUrl(const String& url) { + Store store(false); + writeString(*store, k::SERVER_URL, url); + serverUrl_ = url; +} + +void Settings::setEnrollToken(const String& token) { + Store store(false); + writeString(*store, k::ENROLL_TOKEN, token); + enrollToken_ = token; +} + +void Settings::setCredentials(uint32_t agentId, const String& tokenId, const String& secret) { + Store store(false); + store->putUInt(k::AGENT_ID, agentId); + writeString(*store, k::TOKEN_ID, tokenId); + writeString(*store, k::SECRET, secret); + writeString(*store, k::ENROLL_TOKEN, ""); + agentId_ = agentId; + tokenId_ = tokenId; + secret_ = secret; + enrollToken_ = ""; +} + +void Settings::clearCredentials() { + Store store(false); + if (store->isKey(k::AGENT_ID)) store->remove(k::AGENT_ID); + writeString(*store, k::TOKEN_ID, ""); + writeString(*store, k::SECRET, ""); + agentId_ = 0; + tokenId_ = ""; + secret_ = ""; +} + +void Settings::setWifi(const String& ssid, const String& password) { + Store store(false); + writeString(*store, k::WIFI_SSID, ssid); + writeString(*store, k::WIFI_PASSWORD, password); + wifiSsid_ = ssid; + wifiPassword_ = password; +} + +void Settings::setDeviceName(const String& name) { + Store store(false); + writeString(*store, k::DEVICE_NAME, name); + deviceName_ = name.length() > 0 ? name : defaultDeviceName(); +} + +void Settings::setStaticIp(const StaticIp& config) { + Store store(false); + store->putUChar(k::IP_MODE, config.enabled ? 1 : 0); + writeString(*store, k::STATIC_IP, config.enabled ? config.ip : String()); + writeString(*store, k::GATEWAY, config.enabled ? config.gateway : String()); + writeString(*store, k::NETMASK, config.enabled ? config.netmask : String()); + writeString(*store, k::DNS1, config.enabled ? config.dns1 : String()); + writeString(*store, k::DNS2, config.enabled ? config.dns2 : String()); + staticIp_ = config.enabled ? config : StaticIp{}; +} + +void Settings::setLogLevel(LogLevel level) { + Store store(false); + store->putUChar(k::LOG_LEVEL, static_cast(level)); + logLevel_ = level; +} + +void Settings::factoryReset() { + Store store(false); + store->clear(); + *this = Settings(); + deviceName_ = defaultDeviceName(); +} diff --git a/src/core/Settings.h b/src/core/Settings.h new file mode 100644 index 0000000..af69931 --- /dev/null +++ b/src/core/Settings.h @@ -0,0 +1,52 @@ +#pragma once + +#include + +#include "core/Log.h" + +/** Persistent configuration in NVS (namespace `netignite`, see `config::keys`). */ +class Settings { + public: + struct StaticIp { + bool enabled = false; + String ip, gateway, netmask, dns1, dns2; + }; + + /** Loads all values; call once in setup(). */ + void load(); + + const String& serverUrl() const { return serverUrl_; } + const String& enrollToken() const { return enrollToken_; } + uint32_t agentId() const { return agentId_; } + const String& tokenId() const { return tokenId_; } + const String& secret() const { return secret_; } + const String& wifiSsid() const { return wifiSsid_; } + const String& wifiPassword() const { return wifiPassword_; } + const String& deviceName() const { return deviceName_; } + const StaticIp& staticIp() const { return staticIp_; } + LogLevel logLevel() const { return logLevel_; } + + bool hasWifi() const { return wifiSsid_.length() > 0; } + bool hasCredentials() const { return tokenId_.length() > 0 && secret_.length() > 0; } + + void setServerUrl(const String& url); + void setEnrollToken(const String& token); + /** Stores the credential from a successful enrollment and removes the enrollment token. */ + void setCredentials(uint32_t agentId, const String& tokenId, const String& secret); + void clearCredentials(); + void setWifi(const String& ssid, const String& password); + void setDeviceName(const String& name); + void setStaticIp(const StaticIp& config); + void setLogLevel(LogLevel level); + + /** Erases everything (credentials, Wi-Fi, server). */ + void factoryReset(); + + private: + String serverUrl_, enrollToken_, tokenId_, secret_, wifiSsid_, wifiPassword_, deviceName_; + uint32_t agentId_ = 0; + StaticIp staticIp_; + LogLevel logLevel_ = LogLevel::Info; + + static String defaultDeviceName(); +}; diff --git a/src/main.cpp b/src/main.cpp index 56c0653..50f739a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,58 +1,151 @@ +// NetIgnite ESP32 agent, firmware v2. +// +// Flow: Wi-Fi (from Improv or the console) → time sync (for HTTPS) → enrollment with a +// single-use token (from the web installer's NVS image or the console) → WebSocket to the +// server, which then sends WAKE / STATUS / PING requests. + #include -#include -#include -#include - -#include "config/config.h" -#include "utils/logger.h" -#include "utils/wlan.h" -#include "utils/utils.h" -#include "agent/agent.h" -#include "utils/icmp.h" - -WebSocketsClient webSocket; -WiFiUDP UDPClient; -WakeOnLan WakeOnLanClient(UDPClient); - -WLANConfig wlanConfig = { - C_WIFI_SSID, - C_WIFI_PASSWORD, - C_WIFI_LOCAL_IP, - C_WIFI_GATEWAY_IP, - C_WIFI_SUBNET_MASK, - C_WIFI_PRIMARY_DNS, - C_WIFI_SECONDARY_DNS -}; - -AgentConfig agentConfig = { - C_CONTROL_SERVER_HOST, - C_CONTROL_SERVER_PORT, - C_CONTROL_SERVER_USE_SSL, - C_CONTROL_SERVER_AUTH_ID, - C_CONTROL_SERVER_AUTH_SECRET -}; - - -void setup() -{ - Logger::init(115200); - Logger::setLevel(LogLevel::INFO); - - Logger::infoln("Starting..."); - - WLAN::setup(wlanConfig); - - delay(1000); - - // Don't block the boot forever: WiFi reconnects are only handled in loop(). - Utils::setClock(30000); - - Agent::setup(agentConfig); + +#include + +#include "Config.h" +#include "agent/AgentClient.h" +#include "agent/Enrollment.h" +#include "core/DeviceInfo.h" +#include "core/Log.h" +#include "core/Settings.h" +#include "net/TimeSync.h" +#include "net/WifiLink.h" +#include "netignite/ServerUrl.h" +#include "serial/SerialConsole.h" + +namespace { + +Settings settings; +WifiLink wifi(settings); +TimeSync timeSync; +AgentClient agent(settings, wifi); + +/** What the main loop is waiting for; logged once per change. */ +enum class Phase { NoWifi, NoServer, WaitingForNetwork, WaitingForTime, Enrolling, NotEnrolled, Running }; +Phase phase = Phase::NoWifi; +bool phaseLogged = false; + +std::optional server; +uint32_t nextEnrollAttempt = 0; + +void reloadServer() { + server = netignite::parseServerUrl(settings.serverUrl().c_str()); + if (settings.serverUrl().length() > 0 && !server) { + Log::error("The saved server URL \"%s\" is invalid", settings.serverUrl().c_str()); + } +} + +void onConfigChanged() { + agent.stop(); + reloadServer(); + nextEnrollAttempt = 0; + phaseLogged = false; +} + +SerialConsole console(settings, wifi, agent, onConfigChanged); + +void setPhase(Phase next) { + if (next == phase && phaseLogged) return; + phase = next; + phaseLogged = true; + + switch (phase) { + case Phase::NoWifi: + Log::info("Waiting for Wi-Fi settings (web installer or \"wifi\" command)"); + break; + case Phase::NoServer: + Log::info("Not connected to a server yet. Type: setup "); + break; + case Phase::WaitingForNetwork: + Log::info("Waiting for the network"); + break; + case Phase::WaitingForTime: + Log::info("Waiting for the time (needed to check the server's certificate)"); + break; + case Phase::Enrolling: + break; + case Phase::NotEnrolled: + Log::warn("This agent has no credential. Create an enrollment token in the dashboard, then type: enroll "); + break; + case Phase::Running: + break; + } } - -void loop() -{ - WLAN::loop(); - Agent::loop(); -} \ No newline at end of file +void runEnrollment() { + if (millis() < nextEnrollAttempt) return; + + const enrollment::Result result = enrollment::enroll(*server, settings.enrollToken()); + switch (result.status) { + case enrollment::Result::Status::Ok: + settings.setCredentials(result.agentId, result.tokenId, result.secret); + Log::info("Enrolled as agent %lu", static_cast(result.agentId)); + break; + case enrollment::Result::Status::Rejected: + // Retrying can't help: the token is used, expired or for another agent kind. + settings.setEnrollToken(""); + Log::error("Enrollment rejected: %s. Create a new token in the dashboard.", result.message.c_str()); + phaseLogged = false; + break; + case enrollment::Result::Status::Failed: + nextEnrollAttempt = millis() + config::ENROLL_RETRY_MS; + Log::warn("Enrollment failed: %s. Retrying in %lu s.", result.message.c_str(), + static_cast(config::ENROLL_RETRY_MS / 1000)); + break; + } +} + +void runAgent() { + if (!settings.hasWifi()) return setPhase(Phase::NoWifi); + if (!server) return setPhase(Phase::NoServer); + + const bool online = wifi.connected() && wifi.hasIp(); + if (!online) { + // The WebSocket client keeps retrying on its own once it has been started. + if (!agent.running()) setPhase(Phase::WaitingForNetwork); + return; + } + timeSync.start(); + if (server->secure && !timeSync.synced()) return setPhase(Phase::WaitingForTime); + + if (settings.enrollToken().length() > 0) { + agent.stop(); + setPhase(Phase::Enrolling); + runEnrollment(); + return; + } + if (!settings.hasCredentials()) return setPhase(Phase::NotEnrolled); + + setPhase(Phase::Running); + if (!agent.running()) agent.start(*server, settings.tokenId(), settings.secret()); +} + +} // namespace + +void setup() { + Log::begin(config::SERIAL_BAUD); + settings.load(); + Log::setLevel(settings.logLevel()); + + Log::info("%s %s on %s", config::FIRMWARE_NAME, config::FIRMWARE_VERSION, deviceInfo::chip().c_str()); + Log::info("Device %s (%s), partition %s, reset reason: %s", settings.deviceName().c_str(), deviceInfo::mac().c_str(), + deviceInfo::runningPartition(), deviceInfo::resetReason()); + + reloadServer(); + wifi.begin(); + agent.begin(); +} + +void loop() { + console.loop(); + wifi.loop(); + runAgent(); + agent.loop(); + delay(2); +} diff --git a/src/net/Probes.cpp b/src/net/Probes.cpp new file mode 100644 index 0000000..c9f0326 --- /dev/null +++ b/src/net/Probes.cpp @@ -0,0 +1,255 @@ +#include "net/Probes.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "Config.h" +#include "core/Log.h" +#include "netignite/Mac.h" + +using netignite::protocol::StatusRequest; + +namespace probes { + +namespace { + +int staNetifIndex() { + esp_netif_t* netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); + return netif ? esp_netif_get_netif_impl_index(netif) : 0; +} + +bool isLinkLocal(const ip_addr_t& address) { + return IP_IS_V6_VAL(address) && ip6_addr_islinklocal(ip_2_ip6(&address)); +} + +/** Link-local IPv6 addresses only make sense on the Wi-Fi interface. */ +void scopeToWifi(ip_addr_t& address) { + if (isLinkLocal(address)) ip6_addr_set_zone(ip_2_ip6(&address), static_cast(staNetifIndex())); +} + +String formatAddress(const ip_addr_t& address) { + char text[IPADDR_STRLEN_MAX]; + ipaddr_ntoa_r(&address, text, sizeof(text)); + return text; +} + +bool resolve(const StatusRequest& request, std::vector& out, String& error) { + if (request.target == StatusRequest::Target::LinkLocal) { + const netignite::IPv6Bytes bytes = netignite::linkLocalFromMac(request.mac); + ip_addr_t address = {}; + IP_SET_TYPE_VAL(address, IPADDR_TYPE_V6); + std::memcpy(ip_2_ip6(&address)->addr, bytes.data(), bytes.size()); + scopeToWifi(address); + out.push_back(address); + return true; + } + + if (request.target == StatusRequest::Target::Ip) { + ip_addr_t address = {}; + if (!ipaddr_aton(request.address.c_str(), &address)) { + error = "Invalid IP address"; + return false; + } + scopeToWifi(address); + out.push_back(address); + return true; + } + + addrinfo hints = {}; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + addrinfo* results = nullptr; + if (getaddrinfo(request.address.c_str(), nullptr, &hints, &results) != 0 || !results) { + error = "Host name doesn't resolve"; + return false; + } + + for (addrinfo* entry = results; entry && out.size() < 2; entry = entry->ai_next) { + ip_addr_t address = {}; + if (entry->ai_family == AF_INET) { + const auto* sin = reinterpret_cast(entry->ai_addr); + IP_SET_TYPE_VAL(address, IPADDR_TYPE_V4); + inet_addr_to_ip4addr(ip_2_ip4(&address), &sin->sin_addr); + } else if (entry->ai_family == AF_INET6) { + const auto* sin6 = reinterpret_cast(entry->ai_addr); + IP_SET_TYPE_VAL(address, IPADDR_TYPE_V6); + inet6_addr_to_ip6addr(ip_2_ip6(&address), &sin6->sin6_addr); + scopeToWifi(address); + } else { + continue; + } + out.push_back(address); + } + freeaddrinfo(results); + + if (out.empty()) { + error = "Host name doesn't resolve"; + return false; + } + return true; +} + +// --- ICMP --------------------------------------------------------------------------------------- + +/** + * Shared between the caller and the ping session's callbacks. The ping task may finish after the + * caller gave up waiting, so whoever finishes last frees it. + */ +struct PingContext { + SemaphoreHandle_t done = xSemaphoreCreateBinary(); + std::atomic replied{false}; + /** 0 = running, 1 = ended, 2 = abandoned by the caller */ + std::atomic state{0}; + esp_ping_handle_t session = nullptr; + + ~PingContext() { vSemaphoreDelete(done); } +}; + +void onPingSuccess(esp_ping_handle_t, void* arg) { + static_cast(arg)->replied = true; +} + +void onPingEnd(esp_ping_handle_t, void* arg) { + auto* context = static_cast(arg); + if (context->state.exchange(1) == 2) { + // The caller stopped waiting: clean up here. + esp_ping_delete_session(context->session); + delete context; + return; + } + xSemaphoreGive(context->done); +} + +bool ping(const ip_addr_t& address, uint32_t timeoutMs) { + auto* context = new PingContext(); + + esp_ping_config_t config = ESP_PING_DEFAULT_CONFIG(); + config.target_addr = address; + config.count = 1; + config.timeout_ms = timeoutMs; + if (isLinkLocal(address)) config.interface = static_cast(staNetifIndex()); + + esp_ping_callbacks_t callbacks = {}; + callbacks.cb_args = context; + callbacks.on_ping_success = onPingSuccess; + callbacks.on_ping_end = onPingEnd; + + if (esp_ping_new_session(&config, &callbacks, &context->session) != ESP_OK) { + delete context; + return false; + } + if (esp_ping_start(context->session) != ESP_OK) { + esp_ping_delete_session(context->session); + delete context; + return false; + } + + const bool ended = xSemaphoreTake(context->done, pdMS_TO_TICKS(timeoutMs + 1500)) == pdTRUE; + const bool replied = context->replied; + + if (ended || context->state.exchange(2) == 1) { + // Ended normally (or just now): the session is ours to delete. + if (!ended) xSemaphoreTake(context->done, portMAX_DELAY); + esp_ping_delete_session(context->session); + delete context; + } + return replied; +} + +// --- TCP ---------------------------------------------------------------------------------------- + +bool tcpConnect(const ip_addr_t& address, uint16_t port, uint32_t timeoutMs) { + sockaddr_storage storage = {}; + socklen_t length = 0; + int family = AF_INET; + + if (IP_IS_V6_VAL(address)) { + family = AF_INET6; + auto* sin6 = reinterpret_cast(&storage); + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(port); + inet6_addr_from_ip6addr(&sin6->sin6_addr, ip_2_ip6(&address)); + sin6->sin6_scope_id = ip6_addr_zone(ip_2_ip6(&address)); + length = sizeof(sockaddr_in6); + } else { + auto* sin = reinterpret_cast(&storage); + sin->sin_family = AF_INET; + sin->sin_port = htons(port); + inet_addr_from_ip4addr(&sin->sin_addr, ip_2_ip4(&address)); + length = sizeof(sockaddr_in); + } + + const int sock = socket(family, SOCK_STREAM, IPPROTO_TCP); + if (sock < 0) return false; + fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK); + + bool up = false; + if (connect(sock, reinterpret_cast(&storage), length) == 0) { + up = true; + } else if (errno == EINPROGRESS) { + fd_set writable; + FD_ZERO(&writable); + FD_SET(sock, &writable); + timeval timeout = {static_cast(timeoutMs / 1000), static_cast((timeoutMs % 1000) * 1000)}; + if (select(sock + 1, nullptr, &writable, nullptr, &timeout) > 0) { + int error = 0; + socklen_t errorLength = sizeof(error); + getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &errorLength); + // A refused (reset) connection still proves the host is up. + up = error == 0 || error == ECONNREFUSED || error == ECONNRESET; + } + } else { + up = errno == ECONNREFUSED || errno == ECONNRESET; + } + + close(sock); + return up; +} + +} // namespace + +Result check(const StatusRequest& request) { + Result result; + std::vector addresses; + if (!resolve(request, addresses, result.error)) return result; + + const uint32_t start = millis(); + auto remaining = [&]() -> int32_t { + return static_cast(config::STATUS_BUDGET_MS) - static_cast(millis() - start); + }; + + for (const ip_addr_t& address : addresses) { + if (request.icmp) { + // Two echoes: the first one often only triggers ARP/NDP resolution. + for (int attempt = 0; attempt < 2 && remaining() > static_cast(config::PING_TIMEOUT_MS); attempt++) { + if (ping(address, config::PING_TIMEOUT_MS)) { + Log::debug("Status: %s answers ping", formatAddress(address).c_str()); + result.online = true; + return result; + } + } + } + if (request.tcpPort != 0 && remaining() > 200) { + const uint32_t timeout = min(config::TCP_TIMEOUT_MS, static_cast(remaining())); + if (tcpConnect(address, request.tcpPort, timeout)) { + Log::debug("Status: %s answers on TCP port %u", formatAddress(address).c_str(), request.tcpPort); + result.online = true; + return result; + } + } + if (remaining() <= 200) break; + } + + Log::debug("Status: %s doesn't answer", formatAddress(addresses.front()).c_str()); + return result; +} + +} // namespace probes diff --git a/src/net/Probes.h b/src/net/Probes.h new file mode 100644 index 0000000..dd8bfec --- /dev/null +++ b/src/net/Probes.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include "netignite/Protocol.h" + +/** + * Status checks for STATUS requests. Blocking; run them from the status worker task, not the + * main loop. A device counts as online if any requested probe answers: + * + * - ICMP echo (IPv4 or IPv6; link-local addresses are sent on the Wi-Fi interface) + * - TCP connect to a port: an accepted *or refused* connection both mean the host is up + * + * Host names are resolved to IPv4 and IPv6 addresses (A/AAAA). + */ +namespace probes { + +struct Result { + bool online = false; + /** Set when the check couldn't run (bad address, name doesn't resolve, no network). */ + String error; +}; + +Result check(const netignite::protocol::StatusRequest& request); + +} // namespace probes diff --git a/src/net/TimeSync.cpp b/src/net/TimeSync.cpp new file mode 100644 index 0000000..7950173 --- /dev/null +++ b/src/net/TimeSync.cpp @@ -0,0 +1,17 @@ +#include "net/TimeSync.h" + +#include + +#include "core/Log.h" + +void TimeSync::start() { + if (started_) return; + started_ = true; + configTime(0, 0, "pool.ntp.org", "time.cloudflare.com", "time.google.com"); + Log::info("Time sync started"); +} + +bool TimeSync::synced() const { + // Any time after 2024-01-01 means SNTP has answered. + return time(nullptr) > 1704067200; +} diff --git a/src/net/TimeSync.h b/src/net/TimeSync.h new file mode 100644 index 0000000..22302c7 --- /dev/null +++ b/src/net/TimeSync.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +/** SNTP. TLS certificate checks need the real time, so HTTPS waits until it is synced. */ +class TimeSync { + public: + /** Starts SNTP once the network is up. */ + void start(); + bool synced() const; + + private: + bool started_ = false; +}; diff --git a/src/net/WakeSender.cpp b/src/net/WakeSender.cpp new file mode 100644 index 0000000..a1fd368 --- /dev/null +++ b/src/net/WakeSender.cpp @@ -0,0 +1,66 @@ +#include "net/WakeSender.h" + +#include +#include + +#include "Config.h" +#include "core/Log.h" +#include "netignite/MagicPacket.h" + +namespace wake { + +namespace { + +uint32_t toHostOrder(const IPAddress& address) { + return (static_cast(address[0]) << 24) | (static_cast(address[1]) << 16) | + (static_cast(address[2]) << 8) | static_cast(address[3]); +} + +} // namespace + +bool send(const netignite::MacAddress& mac, uint16_t port, String& error) { + const IPAddress local = WiFi.localIP(); + if (WiFi.status() != WL_CONNECTED || local == IPAddress(0, 0, 0, 0)) { + error = "The agent has no network connection"; + return false; + } + + const int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (sock < 0) { + error = "Couldn't open a UDP socket"; + return false; + } + const int enable = 1; + setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &enable, sizeof(enable)); + + const auto packet = netignite::buildMagicPacket(mac); + const uint32_t targets[] = { + netignite::directedBroadcast(toHostOrder(local), toHostOrder(WiFi.subnetMask())), + 0xffffffff, + }; + + int sent = 0; + for (int round = 0; round < config::WOL_ROUNDS; round++) { + if (round > 0) delay(config::WOL_ROUND_DELAY_MS); + for (uint32_t target : targets) { + sockaddr_in destination = {}; + destination.sin_family = AF_INET; + destination.sin_port = htons(port); + destination.sin_addr.s_addr = htonl(target); + if (sendto(sock, packet.data(), packet.size(), 0, reinterpret_cast(&destination), + sizeof(destination)) == static_cast(packet.size())) { + sent++; + } + } + } + close(sock); + + if (sent == 0) { + error = "Sending the magic packet failed"; + return false; + } + Log::info("Wake-on-LAN sent to %s (port %u, %d packets)", netignite::formatMac(mac).c_str(), port, sent); + return true; +} + +} // namespace wake diff --git a/src/net/WakeSender.h b/src/net/WakeSender.h new file mode 100644 index 0000000..79542d9 --- /dev/null +++ b/src/net/WakeSender.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#include "netignite/Mac.h" + +namespace wake { + +/** + * Sends Wake-on-LAN magic packets to the subnet's broadcast address and to 255.255.255.255, + * `config::WOL_ROUNDS` times. Returns false (with `error`) if no packet could be sent. + */ +bool send(const netignite::MacAddress& mac, uint16_t port, String& error); + +} // namespace wake diff --git a/src/net/WifiLink.cpp b/src/net/WifiLink.cpp new file mode 100644 index 0000000..ae90170 --- /dev/null +++ b/src/net/WifiLink.cpp @@ -0,0 +1,174 @@ +#include "net/WifiLink.h" + +#include + +#include "Config.h" +#include "core/Log.h" + +namespace { + +bool parseIp(const String& text, IPAddress& out) { + return text.length() > 0 && out.fromString(text); +} + +} // namespace + +// The emulator build (env:esp32dev-qemu) has no Wi-Fi radio: touching the driver would abort. +#ifdef NETIGNITE_EMULATOR +constexpr bool WIFI_AVAILABLE = false; +#else +constexpr bool WIFI_AVAILABLE = true; +#endif + +void WifiLink::begin() { + if (!WIFI_AVAILABLE) { + Log::warn("Emulator build: Wi-Fi is disabled"); + return; + } + WiFi.persistent(false); // credentials live in our own NVS namespace + WiFi.setHostname(settings_.deviceName().c_str()); + WiFi.mode(WIFI_STA); + WiFi.setSleep(false); // lower latency for status checks and wake commands + WiFi.enableIPv6(true); + WiFi.setAutoReconnect(true); + + if (!settings_.hasWifi()) { + Log::warn("Wi-Fi isn't set up yet. Use the web installer, or type: wifi \"\" \"\""); + return; + } + applyIpConfig(); + connect(settings_.wifiSsid(), settings_.wifiPassword()); +} + +void WifiLink::applyIpConfig() { + const Settings::StaticIp& config = settings_.staticIp(); + if (!config.enabled) { + WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); // DHCP + return; + } + + IPAddress ip, gateway, netmask, dns1, dns2; + if (!parseIp(config.ip, ip) || !parseIp(config.gateway, gateway) || !parseIp(config.netmask, netmask)) { + Log::error("Static IP settings are invalid, using DHCP"); + WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); + return; + } + if (!parseIp(config.dns1, dns1)) dns1 = gateway; + if (!parseIp(config.dns2, dns2)) dns2 = IPAddress(0, 0, 0, 0); + + if (!WiFi.config(ip, gateway, netmask, dns1, dns2)) { + Log::error("Couldn't apply the static IP configuration"); + } +} + +void WifiLink::connect(const String& ssid, const String& password) { + Log::info("Connecting to Wi-Fi \"%s\"", ssid.c_str()); + lastAttempt_ = millis(); + WiFi.begin(ssid.c_str(), password.length() > 0 ? password.c_str() : nullptr); +} + +void WifiLink::loop() { + if (!WIFI_AVAILABLE) return; + const bool isConnected = connected() && hasIp(); + + if (isConnected && !wasConnected_) { + Log::info("Wi-Fi connected: %s, IPv4 %s, RSSI %d dBm", ssid().c_str(), ipv4().c_str(), rssi()); + disconnectedSince_ = 0; + } else if (!isConnected && wasConnected_) { + Log::warn("Wi-Fi connection lost"); + disconnectedSince_ = millis(); + } + wasConnected_ = isConnected; + + if (isConnected || !settings_.hasWifi()) return; + + if (disconnectedSince_ == 0) disconnectedSince_ = millis(); + // The driver reconnects on its own; restart the attempt if it stays down. + if (millis() - disconnectedSince_ > config::WIFI_RECONNECT_AFTER_MS && + millis() - lastAttempt_ > config::WIFI_RECONNECT_AFTER_MS) { + WiFi.disconnect(); + connect(settings_.wifiSsid(), settings_.wifiPassword()); + } +} + +bool WifiLink::tryNetwork(const String& ssid, const String& password) { + if (!WIFI_AVAILABLE) { + Log::warn("Emulator build: can't connect to \"%s\"", ssid.c_str()); + return false; + } + const String previousSsid = settings_.wifiSsid(); + const String previousPassword = settings_.wifiPassword(); + + WiFi.disconnect(); + delay(100); + applyIpConfig(); + connect(ssid, password); + + const uint32_t start = millis(); + while (millis() - start < config::WIFI_TRY_CONNECT_MS) { + if (connected() && hasIp()) { + settings_.setWifi(ssid, password); + Log::info("Wi-Fi \"%s\" saved", ssid.c_str()); + return true; + } + delay(100); + } + + Log::warn("Couldn't connect to \"%s\"", ssid.c_str()); + WiFi.disconnect(); + if (previousSsid.length() > 0) connect(previousSsid, previousPassword); + return false; +} + +void WifiLink::reconnect() { + if (!WIFI_AVAILABLE) return; + WiFi.disconnect(); + delay(100); + applyIpConfig(); + if (settings_.hasWifi()) connect(settings_.wifiSsid(), settings_.wifiPassword()); +} + +bool WifiLink::connected() const { + return WIFI_AVAILABLE && WiFi.status() == WL_CONNECTED; +} + +bool WifiLink::hasIp() const { + return WIFI_AVAILABLE && WiFi.localIP() != IPAddress(0, 0, 0, 0); +} + +std::vector WifiLink::scan() { + std::vector networks; + if (!WIFI_AVAILABLE) return networks; + + const int count = WiFi.scanNetworks(); + for (int i = 0; i < count && networks.size() < 20; i++) { + const String ssid = WiFi.SSID(i); + if (ssid.length() == 0) continue; + bool duplicate = false; + for (const Network& network : networks) duplicate = duplicate || network.ssid == ssid; + // Results are sorted by signal strength, so the first entry of an SSID is its strongest. + if (!duplicate) networks.push_back({ssid, WiFi.RSSI(i), WiFi.encryptionType(i) != WIFI_AUTH_OPEN}); + } + WiFi.scanDelete(); + return networks; +} + +String WifiLink::ipv4() const { + return WiFi.localIP().toString(); +} + +String WifiLink::linkLocalIpv6() const { + return WiFi.linkLocalIPv6().toString(); +} + +String WifiLink::globalIpv6() const { + return WiFi.globalIPv6().toString(); +} + +int WifiLink::rssi() const { + return WIFI_AVAILABLE ? WiFi.RSSI() : 0; +} + +String WifiLink::ssid() const { + return WiFi.SSID(); +} diff --git a/src/net/WifiLink.h b/src/net/WifiLink.h new file mode 100644 index 0000000..d012add --- /dev/null +++ b/src/net/WifiLink.h @@ -0,0 +1,55 @@ +#pragma once + +#include + +#include + +#include "core/Settings.h" + +/** + * Station-mode Wi-Fi: DHCP or a static IPv4 configuration, IPv6 (link-local and SLAAC/DHCPv6), + * automatic reconnects. Credentials come from Settings, never from compiled-in values. + */ +class WifiLink { + public: + explicit WifiLink(Settings& settings) : settings_(settings) {} + + void begin(); + void loop(); + + bool connected() const; + /** True once the current connection has an IPv4 address. */ + bool hasIp() const; + + /** + * Connects to a new network and stores it only if the connection succeeds within + * `config::WIFI_TRY_CONNECT_MS`. Otherwise reconnects to the previous network. + */ + bool tryNetwork(const String& ssid, const String& password); + + /** Applies changed IP settings (static/DHCP) by reconnecting. */ + void reconnect(); + + struct Network { + String ssid; + int rssi; + bool secured; + }; + /** Scans for networks (blocking, a few seconds); at most 20, strongest first, no duplicates. */ + std::vector scan(); + + String ipv4() const; + String linkLocalIpv6() const; + String globalIpv6() const; + int rssi() const; + String ssid() const; + + private: + Settings& settings_; + bool wasConnected_ = false; + uint32_t disconnectedSince_ = 0; + uint32_t lastAttempt_ = 0; + + void applyIpConfig(); + void connect(const String& ssid, const String& password); +}; diff --git a/src/serial/SerialConsole.cpp b/src/serial/SerialConsole.cpp new file mode 100644 index 0000000..349034f --- /dev/null +++ b/src/serial/SerialConsole.cpp @@ -0,0 +1,376 @@ +#include "serial/SerialConsole.h" + +#include + +#include "Config.h" +#include "core/DeviceInfo.h" +#include "core/Log.h" +#include "netignite/CommandLine.h" +#include "netignite/ServerUrl.h" + +namespace improv = netignite::improv; + +namespace { + +bool validHostname(const std::string& name) { + if (name.empty() || name.size() > 63 || name.front() == '-' || name.back() == '-') return false; + for (char c : name) { + if (!isalnum(static_cast(c)) && c != '-') return false; + } + return true; +} + +bool validIp(const std::string& text) { + IPAddress address; + return address.fromString(text.c_str()); +} + +} // namespace + +void SerialConsole::loop() { + while (Serial.available() > 0) { + const int byte = Serial.read(); + if (byte < 0) break; + + const auto event = demux_.feed(static_cast(byte)); + switch (event.type) { + case netignite::SerialDemux::Event::Type::Line: + handleLine(event.line); + break; + case netignite::SerialDemux::Event::Type::ImprovPacket: + handleImprov(event.improvType, event.improvData); + break; + case netignite::SerialDemux::Event::Type::ImprovBadChecksum: + sendImprov(improv::buildErrorPacket(improv::Error::InvalidRpc)); + break; + case netignite::SerialDemux::Event::Type::None: + break; + } + } +} + +// --- Improv ------------------------------------------------------------------------------------- + +void SerialConsole::sendImprov(const std::vector& packet) { + Log::writeRaw(packet.data(), packet.size()); +} + +improv::State SerialConsole::improvState() const { + return wifi_.connected() && wifi_.hasIp() ? improv::State::Provisioned : improv::State::Authorized; +} + +std::string SerialConsole::dashboardUrl() const { + auto server = netignite::parseServerUrl(settings_.serverUrl().c_str()); + if (!server) return ""; + if (settings_.agentId() != 0) return server->url("/dashboard/agents/" + std::to_string(settings_.agentId())); + return server->url("/dashboard/agents"); +} + +void SerialConsole::handleImprov(uint8_t type, const std::vector& data) { + if (type != static_cast(improv::PacketType::Rpc)) return; + + improv::RpcCommand command; + if (!improv::parseRpc(data, command)) { + sendImprov(improv::buildErrorPacket(improv::Error::InvalidRpc)); + return; + } + sendImprov(improv::buildErrorPacket(improv::Error::None)); + + switch (command.command) { + case improv::Command::GetCurrentState: { + const improv::State state = improvState(); + sendImprov(improv::buildStatePacket(state)); + if (state == improv::State::Provisioned) { + const std::string url = dashboardUrl(); + sendImprov(improv::buildRpcResult(command.command, url.empty() ? std::vector{} + : std::vector{url})); + } + break; + } + + case improv::Command::GetDeviceInfo: + sendImprov(improv::buildRpcResult(command.command, {config::FIRMWARE_NAME, config::FIRMWARE_VERSION, "ESP32", + settings_.deviceName().c_str()})); + break; + + case improv::Command::WifiSettings: { + Log::info("Improv: Wi-Fi settings for \"%s\" received", command.ssid.c_str()); + sendImprov(improv::buildStatePacket(improv::State::Provisioning)); + if (wifi_.tryNetwork(command.ssid.c_str(), command.password.c_str())) { + sendImprov(improv::buildStatePacket(improv::State::Provisioned)); + const std::string url = dashboardUrl(); + sendImprov(improv::buildRpcResult(command.command, url.empty() ? std::vector{} + : std::vector{url})); + } else { + sendImprov(improv::buildErrorPacket(improv::Error::UnableToConnect)); + sendImprov(improv::buildStatePacket(improvState())); + } + break; + } + + case improv::Command::GetWifiNetworks: { + for (const WifiLink::Network& network : wifi_.scan()) { + sendImprov(improv::buildRpcResult( + command.command, {network.ssid.c_str(), std::to_string(network.rssi), network.secured ? "YES" : "NO"})); + } + // An empty result ends the list. + sendImprov(improv::buildRpcResult(command.command, {})); + break; + } + + case improv::Command::Hostname: + case improv::Command::DeviceName: { + // The device name doubles as the network host name; setting it applies after a restart. + // Set: command | length | name length | name + if (data.size() > 2) { + if (static_cast(data[2]) + 3 != data.size()) { + sendImprov(improv::buildErrorPacket(improv::Error::InvalidRpc)); + break; + } + const std::string name(data.begin() + 3, data.end()); + if (!validHostname(name)) { + sendImprov(improv::buildErrorPacket(improv::Error::BadHostname)); + break; + } + settings_.setDeviceName(name.c_str()); + } + sendImprov(improv::buildRpcResult(command.command, {settings_.deviceName().c_str()})); + break; + } + + case improv::Command::GetNetworkState: { + const bool online = improvState() == improv::State::Provisioned; + // 0x01 online, 0x02 supports Wi-Fi + std::vector result = {std::to_string((online ? 0x01 : 0x00) | 0x02)}; + const std::string url = dashboardUrl(); + if (online && !url.empty()) result.push_back(url); + sendImprov(improv::buildRpcResult(command.command, result)); + break; + } + + default: + sendImprov(improv::buildErrorPacket(improv::Error::UnknownRpc)); + break; + } +} + +// --- Console ------------------------------------------------------------------------------------ + +void SerialConsole::handleLine(const std::string& line) { + std::vector args; + if (!netignite::splitCommandLine(line, args)) { + Log::print("Unterminated quote. Type \"help\" for the commands."); + return; + } + if (args.empty()) return; + + const std::string& command = args[0]; + if (command == "help" || command == "?") { + printHelp(); + } else if (command == "status") { + printStatus(); + } else if (command == "wifi") { + cmdWifi(args); + } else if (command == "server") { + cmdServer(args); + } else if (command == "enroll") { + cmdEnroll(args); + } else if (command == "setup") { + cmdSetup(args); + } else if (command == "ip") { + cmdIp(args); + } else if (command == "name") { + cmdName(args); + } else if (command == "log") { + cmdLog(args); + } else if (command == "reboot" || command == "restart") { + Log::print("Restarting..."); + delay(200); + ESP.restart(); + } else if (command == "factory-reset") { + cmdFactoryReset(args); + } else { + Log::print("Unknown command \"%s\". Type \"help\" for the commands.", command.c_str()); + } +} + +void SerialConsole::printHelp() { + // One line per print: Log::print has a fixed-size buffer. + static const char* const LINES[] = { + "NetIgnite agent commands:", + " status show the agent's state", + " setup connect this agent to a NetIgnite server", + " wifi [password] connect to a Wi-Fi network (quote names with spaces)", + " server change the server address", + " enroll set the agent up again with a new token", + " ip dhcp get the IP address via DHCP (default)", + " ip static [dns1] [dns2]", + " name network host name (letters, digits, -)", + " log log level", + " reboot restart the agent", + " factory-reset confirm erase all settings and credentials", + }; + for (const char* line : LINES) Log::print("%s", line); +} + +void SerialConsole::printStatus() { + const char* agentState = "not configured"; + if (settings_.enrollToken().length() > 0) { + agentState = "waiting to enroll"; + } else if (settings_.hasCredentials()) { + switch (agent_.state()) { + case AgentClient::State::Online: + agentState = "online"; + break; + case AgentClient::State::Connecting: + agentState = "connecting"; + break; + case AgentClient::State::Stopped: + agentState = "waiting for the network"; + break; + } + } + + Log::print("%s %s", config::FIRMWARE_NAME, config::FIRMWARE_VERSION); + Log::print(" device: %s (%s, %s)", settings_.deviceName().c_str(), deviceInfo::mac().c_str(), + deviceInfo::chip().c_str()); + if (wifi_.connected() && wifi_.hasIp()) { + Log::print(" wifi: %s, %d dBm", wifi_.ssid().c_str(), wifi_.rssi()); + Log::print(" ipv4: %s (%s)", wifi_.ipv4().c_str(), settings_.staticIp().enabled ? "static" : "DHCP"); + Log::print(" ipv6: %s %s", wifi_.linkLocalIpv6().c_str(), wifi_.globalIpv6().c_str()); + } else { + Log::print(" wifi: %s", settings_.hasWifi() ? "not connected" : "not set up"); + } + Log::print(" server: %s", settings_.serverUrl().length() > 0 ? settings_.serverUrl().c_str() : "not set"); + if (settings_.agentId() != 0) Log::print(" agent id: %lu", static_cast(settings_.agentId())); + Log::print(" agent: %s", agentState); + Log::print(" partition: %s, reset reason: %s, free heap: %lu", deviceInfo::runningPartition(), + deviceInfo::resetReason(), static_cast(ESP.getFreeHeap())); +} + +void SerialConsole::cmdWifi(const std::vector& args) { + if (args.size() < 2 || args.size() > 3 || args[1].empty() || args[1].size() > 32) { + Log::print("Usage: wifi [password]"); + return; + } + const std::string password = args.size() == 3 ? args[2] : ""; + if (password.size() > 64) { + Log::print("The password is too long (max. 64 characters)."); + return; + } + Log::print("Connecting to \"%s\"...", args[1].c_str()); + if (wifi_.tryNetwork(args[1].c_str(), password.c_str())) { + Log::print("Connected and saved."); + } else { + Log::print("Couldn't connect; the previous network is kept."); + } +} + +bool SerialConsole::applyServer(const std::string& url) { + auto server = netignite::parseServerUrl(url); + if (!server) { + Log::print("Invalid server URL. Example: https://app.netignite.dev"); + return false; + } + settings_.setServerUrl(server->url("").c_str()); + return true; +} + +bool SerialConsole::applyEnrollToken(const std::string& token) { + if (token.rfind("netignite_enroll_", 0) != 0 || token.size() > 200) { + Log::print("That isn't an enrollment token. Create one on the agent's page in the dashboard."); + return false; + } + settings_.setEnrollToken(token.c_str()); + return true; +} + +void SerialConsole::cmdServer(const std::vector& args) { + if (args.size() != 2) { + Log::print("Usage: server "); + return; + } + if (!applyServer(args[1])) return; + Log::print("Server set to %s.", settings_.serverUrl().c_str()); + onConfigChanged_(); +} + +void SerialConsole::cmdEnroll(const std::vector& args) { + if (args.size() != 2) { + Log::print("Usage: enroll "); + return; + } + if (!applyEnrollToken(args[1])) return; + Log::print("Enrollment token saved; the agent enrolls as soon as it is online."); + onConfigChanged_(); +} + +void SerialConsole::cmdSetup(const std::vector& args) { + if (args.size() != 3) { + Log::print("Usage: setup "); + return; + } + if (!applyServer(args[1]) || !applyEnrollToken(args[2])) return; + Log::print("Saved. The agent enrolls with %s as soon as it is online.", settings_.serverUrl().c_str()); + onConfigChanged_(); +} + +void SerialConsole::cmdIp(const std::vector& args) { + if (args.size() == 2 && args[1] == "dhcp") { + settings_.setStaticIp({}); + Log::print("Using DHCP. Reconnecting..."); + wifi_.reconnect(); + return; + } + if (args.size() >= 5 && args.size() <= 7 && args[1] == "static") { + for (size_t i = 2; i < args.size(); i++) { + if (!validIp(args[i])) { + Log::print("\"%s\" isn't an IPv4 address.", args[i].c_str()); + return; + } + } + Settings::StaticIp ip; + ip.enabled = true; + ip.ip = args[2].c_str(); + ip.gateway = args[3].c_str(); + ip.netmask = args[4].c_str(); + if (args.size() > 5) ip.dns1 = args[5].c_str(); + if (args.size() > 6) ip.dns2 = args[6].c_str(); + settings_.setStaticIp(ip); + Log::print("Static IP %s saved. Reconnecting...", ip.ip.c_str()); + wifi_.reconnect(); + return; + } + Log::print("Usage: ip dhcp | ip static [dns1] [dns2]"); +} + +void SerialConsole::cmdName(const std::vector& args) { + if (args.size() != 2 || !validHostname(args[1])) { + Log::print("Usage: name (letters, digits and -, max. 63)"); + return; + } + settings_.setDeviceName(args[1].c_str()); + Log::print("Name saved; it is used as the host name after a restart."); +} + +void SerialConsole::cmdLog(const std::vector& args) { + LogLevel level; + if (args.size() != 2 || !Log::parseLevel(args[1].c_str(), level)) { + Log::print("Usage: log "); + return; + } + settings_.setLogLevel(level); + Log::setLevel(level); + Log::print("Log level: %s", Log::levelName(level)); +} + +void SerialConsole::cmdFactoryReset(const std::vector& args) { + if (args.size() != 2 || args[1] != "confirm") { + Log::print("This erases Wi-Fi, server and agent credentials. Type \"factory-reset confirm\"."); + return; + } + settings_.factoryReset(); + Log::print("All settings erased. Restarting..."); + delay(200); + ESP.restart(); +} diff --git a/src/serial/SerialConsole.h b/src/serial/SerialConsole.h new file mode 100644 index 0000000..7e2354c --- /dev/null +++ b/src/serial/SerialConsole.h @@ -0,0 +1,55 @@ +#pragma once + +#include + +#include +#include +#include + +#include "agent/AgentClient.h" +#include "core/Settings.h" +#include "net/WifiLink.h" +#include "netignite/Improv.h" +#include "netignite/SerialDemux.h" + +/** + * The serial port: Improv Wi-Fi for the web installer, and a small text console for setting the + * agent up by hand (see `help`). Secrets are never printed. + */ +class SerialConsole { + public: + SerialConsole(Settings& settings, WifiLink& wifi, AgentClient& agent, std::function onConfigChanged) + : settings_(settings), wifi_(wifi), agent_(agent), onConfigChanged_(std::move(onConfigChanged)) {} + + void loop(); + + private: + Settings& settings_; + WifiLink& wifi_; + AgentClient& agent_; + std::function onConfigChanged_; + netignite::SerialDemux demux_; + + // Improv + void handleImprov(uint8_t type, const std::vector& data); + void sendImprov(const std::vector& packet); + netignite::improv::State improvState() const; + /** Where the web installer's "Visit device" button leads: the agent's dashboard page. */ + std::string dashboardUrl() const; + + // Console + void handleLine(const std::string& line); + void printHelp(); + void printStatus(); + void cmdWifi(const std::vector& args); + void cmdServer(const std::vector& args); + void cmdEnroll(const std::vector& args); + void cmdSetup(const std::vector& args); + void cmdIp(const std::vector& args); + void cmdName(const std::vector& args); + void cmdLog(const std::vector& args); + void cmdFactoryReset(const std::vector& args); + + bool applyServer(const std::string& url); + bool applyEnrollToken(const std::string& token); +}; diff --git a/src/utils/icmp.h b/src/utils/icmp.h deleted file mode 100644 index cd55ab5..0000000 --- a/src/utils/icmp.h +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef ICMP_H -#define ICMP_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PING_TIMEOUT_MS 5000 - -// State shared between the caller and the ping task. It lives on the heap and is freed by -// whichever side releases it last, so a ping that outlives PING_TIMEOUT_MS can't write to memory -// that is gone. -struct ping_context_t { - std::atomic success{false}; - std::atomic finished{false}; - std::atomic released{false}; -}; - -class ICMP { - public: - - static bool ping(IPAddress dest, size_t count = 1) { - - ip_addr_t target_addr; - target_addr.type = IPADDR_TYPE_V4; - target_addr.u_addr.ip4.addr = static_cast(dest); - - return do_ping(target_addr, count); - } - - static bool ping(IPv6Address dest, size_t count = 1) { - - ip_addr_t target_addr; - target_addr.type = IPADDR_TYPE_V6; - // target_addr.u_addr.ip6.zone = get_netif_index(); - - memcpy(target_addr.u_addr.ip6.addr, static_cast(dest), sizeof(target_addr.u_addr.ip6.addr)); - - return do_ping(target_addr, count); - } - - private: - static bool do_ping(ip_addr_t target_addr, size_t count) { - - esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG(); - ping_config.target_addr = target_addr; - ping_config.count = count; - // ping_config.interface = get_netif_index(); - - ping_context_t *context = new (std::nothrow) ping_context_t(); - if (!context) return false; - - esp_ping_callbacks_t cbs; - cbs.on_ping_success = on_ping_success; - cbs.on_ping_timeout = on_ping_timeout; - cbs.on_ping_end = on_ping_end; - cbs.cb_args = context; - - esp_ping_handle_t ping = nullptr; - if (esp_ping_new_session(&ping_config, &cbs, &ping) != ESP_OK) { - delete context; - return false; - } - if (esp_ping_start(ping) != ESP_OK) { - esp_ping_delete_session(ping); - delete context; - return false; - } - - unsigned long start_time = millis(); - while (!context->finished && (millis() - start_time < PING_TIMEOUT_MS)) { - delay(10); - } - - bool success = context->success; - release(context); - return success; - } - - static void release(ping_context_t *context) { - // The second of the two releases (caller and on_ping_end) frees the context. - if (context->released.exchange(true)) { - delete context; - } - } - - static void on_ping_success(esp_ping_handle_t hdl, void *args) { - ping_context_t *context = static_cast(args); - - context->success = true; - } - - static void on_ping_timeout(esp_ping_handle_t hdl, void *args) {} - - static void on_ping_end(esp_ping_handle_t hdl, void *args) { - ping_context_t *context = static_cast(args); - context->finished = true; - release(context); - - esp_ping_delete_session(hdl); - } - - static int get_netif_index() - { - struct netif *netif = netif_list; - while (netif) { - if (netif->name[0] == 's' && netif->name[1] == 't') { // "st" usually stands for STA - return netif_get_index(netif); // this gives the scope ID - } - netif = netif->next; - } - // Serial.println("No suitable network interface found for ping."); - return 0; - } - - -}; - -#endif // ICMP_H \ No newline at end of file diff --git a/src/utils/inputValidation.h b/src/utils/inputValidation.h deleted file mode 100644 index 509494c..0000000 --- a/src/utils/inputValidation.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef INPUT_VALIDATION_H -#define INPUT_VALIDATION_H - -#include "utils/regexp.h" - -class InputValidation { - public: - - static bool macAddressDashed(const char *macAddress) { - if (!macAddress) return false; - - const char* pattern = "^([0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2}$"; - return RegExp::match(macAddress, pattern); - } - - static bool macAddressColon(const char *macAddress) { - if (!macAddress) return false; - - const char* pattern = "^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$"; - return RegExp::match(macAddress, pattern); - } - - static bool macAddress(const char *macAddress) { - return InputValidation::macAddressColon(macAddress) || InputValidation::macAddressDashed(macAddress); - } - - - static bool port(uint16_t port) { - return port > 0 && port <= 65535; - } - - static bool ipv4Address(const char *ipAddress) { - if (!ipAddress) return false; - - const char* pattern = "^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}$"; - return RegExp::match(ipAddress, pattern); - } - - static bool ipv6Address(const char *ipAddress) { - if (!ipAddress) return false; - - const char* pattern = "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|(([0-9a-fA-F]{1,4}:){1,7}:)|(([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4})|(([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2})|(([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3})|(([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4})|(([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5})|([0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}))|(:((:[0-9a-fA-F]{1,4}){1,7}|:))|(::ffff:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))$"; - return RegExp::match(ipAddress, pattern); - } - - static bool ipAddress(const char *ipAddress) { - return InputValidation::ipv4Address(ipAddress) || InputValidation::ipv6Address(ipAddress); - } - -}; - - -#endif // INPUT_VALIDATION_H diff --git a/src/utils/logger.h b/src/utils/logger.h deleted file mode 100644 index 9274862..0000000 --- a/src/utils/logger.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef LOGGER_H -#define LOGGER_H - -#include - -enum class LogLevel : uint8_t { - FATAL = 0, - ERROR = 1, - WARN = 2, - INFO = 3, - DEBUG = 4, -}; - -class Logger { - public: - static void init(unsigned long baud = 115200) { - Serial.begin(baud); - while (!Serial) { - delay(10); - } - } - - static void setLevel(LogLevel lvl) { level = lvl; } - static LogLevel getLevel() { return level; } - - static void debug(const String& msg) { log(LogLevel::DEBUG, msg); } - static void info(const String& msg) { log(LogLevel::INFO, msg); } - static void warn(const String& msg) { log(LogLevel::WARN, msg); } - static void error(const String& msg) { log(LogLevel::ERROR, msg); } - static void fatal(const String& msg) { log(LogLevel::FATAL, msg); } - - static void debugln(const String& msg) { logln(LogLevel::DEBUG, msg); } - static void infoln(const String& msg) { logln(LogLevel::INFO, msg); } - static void warnln(const String& msg) { logln(LogLevel::WARN, msg); } - static void errorln(const String& msg) { logln(LogLevel::ERROR, msg); } - static void fatalln(const String& msg) { logln(LogLevel::FATAL, msg); } - - static void print(const String& msg) { Serial.print(msg); } - static void println(const String& msg) { Serial.println(msg); } - - private: - static inline LogLevel level = LogLevel::INFO; - - static const char* levelToStr(LogLevel lvl) { - switch (lvl) { - case LogLevel::DEBUG: - return "DEBUG"; - case LogLevel::INFO: - return "INFO"; - case LogLevel::WARN: - return "WARN"; - case LogLevel::ERROR: - return "ERROR"; - case LogLevel::FATAL: - return "FATAL"; - default: - return "UNKNOWN"; - } - } - - static void log(LogLevel msgLvl, const String& msg) { - if (msgLvl > level) return; - - Serial.printf("[%s] ", levelToStr(msgLvl)); - Serial.print(msg); - } - - static void logln(LogLevel msgLvl, const String& msg) { - if (msgLvl > level) return; - - Serial.printf("[%s] ", levelToStr(msgLvl)); - Serial.println(msg); - } -}; - -#endif // LOGGER_H \ No newline at end of file diff --git a/src/utils/regexp.h b/src/utils/regexp.h deleted file mode 100644 index c9d0003..0000000 --- a/src/utils/regexp.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef REGEXP_H -#define REGEXP_H - -#include - -class RegExp { - public: - - static bool match(const char* str, const char* pattern) { - if (!str || !pattern) return false; - - regex_t regex; - if (regcomp(®ex, pattern, REG_EXTENDED | REG_NOSUB) != 0) { - // regex compilation failed - return false; - } - - int result = regexec(®ex, str, 0, NULL, 0); - regfree(®ex); - return result == 0; - - } -}; - -#endif // REGEXP_H diff --git a/src/utils/utils.h b/src/utils/utils.h deleted file mode 100644 index 09a2ec6..0000000 --- a/src/utils/utils.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H - -#include "utils/logger.h" -#include "utils/inputValidation.h" -#include - -class Utils { - public: - - // Starts NTP and waits up to `timeoutMs` for the first sync. Returns whether the clock is set. - // SNTP keeps retrying in the background, so a timeout (e.g. no network at boot) only delays TLS - // connections until the time is known instead of blocking the boot forever. - static bool setClock(unsigned long timeoutMs) { - configTime(0, 0, "pool.ntp.org", "time.nist.gov"); - - Logger::info(F("Waiting for NTP time sync: ")); - unsigned long start = millis(); - time_t nowSecs = time(nullptr); - while(nowSecs < 8 * 3600 * 2) { - if (millis() - start >= timeoutMs) { - Logger::println(""); - Logger::warnln(F("NTP time sync timed out. Continuing; the time is set once the network is available.")); - return false; - } - delay(500); - Logger::print(F(".")); - yield(); - nowSecs = time(nullptr); - } - - Logger::println(""); - struct tm timeinfo; - gmtime_r(&nowSecs, &timeinfo); - Logger::info(F("Current UTC time: ")); - Logger::print(asctime(&timeinfo)); - return true; - } - - - static String utf8ToHexStr(const char* str) { - String hexStr = ""; - - for (int i = 0; str[i] != '\0'; i++) { - char hex[3]; - snprintf(hex, sizeof(hex), "%02X", str[i]); - hexStr += hex; - } - - return hexStr; - } - - // Returns the EUI-64 IPv6 link-local address for a MAC address, or an empty string if the MAC - // address is invalid. - static String macToLinkLocalIPv6(const char* macStr) { - - if (!macStr) return String(); - - // Convert MAC string with colons or dashes to byte array - uint8_t mac[6]; - if (InputValidation::macAddressColon(macStr)) { - sscanf(macStr, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); - } else if (InputValidation::macAddressDashed(macStr)) { - sscanf(macStr, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); - } else { - return String(); - } - - char buffer[40]; - - uint8_t eui64[8]; - eui64[0] = mac[0] ^ 0x02; - eui64[1] = mac[1]; - eui64[2] = mac[2]; - eui64[3] = 0xFF; - eui64[4] = 0xFE; - eui64[5] = mac[3]; - eui64[6] = mac[4]; - eui64[7] = mac[5]; - - snprintf(buffer, sizeof(buffer), - "fe80:0000:0000:0000:%02x%02x:%02x%02x:%02x%02x:%02x%02x", - eui64[0], eui64[1], // first 16 bits - eui64[2], eui64[3], // second 16 bits - eui64[4], eui64[5], // third 16 bits - eui64[6], eui64[7] // fourth 16 bits - ); - - // Returned by value: the caller previously had to free a strdup'd buffer and never did. - return String(buffer); - } -}; - -#endif // UTILS_H \ No newline at end of file diff --git a/src/utils/wlan.h b/src/utils/wlan.h deleted file mode 100644 index 8e5834c..0000000 --- a/src/utils/wlan.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef WLAN_H -#define WLAN_H - -#include - -#include "utils/logger.h" - -struct WLANConfig { - const char* ssid; - const char* password; - IPAddress local_IP; - IPAddress gateway; - IPAddress subnet_mask; - IPAddress primary_DNS = (uint32_t) 0; - IPAddress secondary_DNS = (uint32_t) 0; -}; - -class WLAN { - public: - static void setup(const WLANConfig& config) { - - ssid = config.ssid; - password = config.password; - - WiFi.disconnect(true); - delay(1000); - - Logger::infoln("Connecting to Wifi..."); - - if (!WiFi.config(config.local_IP, config.gateway, config.subnet_mask, config.primary_DNS, config.secondary_DNS)) { - Logger::errorln("STA Failed to configure Wifi"); - } else { - Logger::infoln("STA Configured"); - } - - WiFi.onEvent(onWiFiConnect, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED); - WiFi.onEvent(onWiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP); - WiFi.onEvent(onWiFiDisconnect, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED); - - Logger::infoln("Connecting to " + String(ssid) + "..."); - WiFi.begin(ssid, password); - - WiFi.setAutoReconnect(false); // Disable auto reconnect to handle it manually - } - - static void loop() { - if (shouldReconnect && (millis() >= lastDisconnectTime + reconnectInterval)) { - Logger::infoln("Trying to Reconnect to WiFi..."); - WiFi.begin(ssid, password); - shouldReconnect = false; // reset flag - } - } - - private: - static inline const char* ssid = nullptr; - static inline const char* password = nullptr; - - static inline unsigned long lastDisconnectTime = 0; - static inline bool shouldReconnect = false; - static inline const unsigned long reconnectInterval = 60000; // 60 seconds - - - static void onWiFiConnect(WiFiEvent_t event, WiFiEventInfo_t info) { - Logger::infoln("Wifi connected to " + String(ssid) + ". Waiting for IP..."); - } - - static void onWiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info) { - - if (WiFi.enableIpV6()) { - Logger::infoln("IPv6 enabled on WiFi"); - } else { - Logger::errorln("Failed to enable IPv6 on WiFi"); - } - - Logger::infoln("Got IP address!"); - Logger::infoln("IP address: " + WiFi.localIP().toString()); - - esp_netif_t* netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); - - esp_ip6_addr_t ip6_addrs[CONFIG_LWIP_IPV6_NUM_ADDRESSES]; - int num_ipv6_addrs = esp_netif_get_all_ip6(netif, ip6_addrs); - - // Optional: print or process the IPv6 addresses - for (int i = 0; i < num_ipv6_addrs; i++) { - - String ip_str = IPv6Address(ip6_addrs[i].addr).toString(); - - Logger::infoln("IPv6 address: " + ip_str); - } - - - } - - static void onWiFiDisconnect(WiFiEvent_t event, WiFiEventInfo_t info) { - - Logger::infoln("Disconnected from WiFi!"); - Logger::info("WiFi lost connection. Reason: "); - Logger::infoln(String(info.wifi_sta_disconnected.reason)); - Logger::infoln("Trying to reconnect in " + String(reconnectInterval / 1000) + " seconds..."); - - lastDisconnectTime = millis(); - shouldReconnect = true; - } - -}; - -#endif // WLAN_H \ No newline at end of file diff --git a/src/utils/wol.h b/src/utils/wol.h deleted file mode 100644 index 495784d..0000000 --- a/src/utils/wol.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WOL_H -#define WOL_H - -#include -#include -#include -#include "utils/inputValidation.h" -#include "utils/utils.h" - -extern WakeOnLan WakeOnLanClient; - -class WOL { - public: - - static bool wakeup(const char *target_mac_address, const uint16_t port) { - - if (!InputValidation::macAddress(target_mac_address) || !InputValidation::port(port)) { - return false; - } - - WakeOnLanClient.setRepeat(3, 100); - WakeOnLanClient.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask()); - WakeOnLanClient.sendMagicPacket(target_mac_address, port); - - return true; - } - -}; - -#endif // WOL_H \ No newline at end of file diff --git a/test/emulator/.gitignore b/test/emulator/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/test/emulator/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/test/emulator/README.md b/test/emulator/README.md new file mode 100644 index 0000000..063ad02 --- /dev/null +++ b/test/emulator/README.md @@ -0,0 +1,20 @@ +# Emulator test + +Boots the firmware in [Espressif's QEMU](https://github.com/espressif/qemu) and checks the serial +side without hardware: Improv Wi-Fi (with `improv-wifi-serial-sdk`, the client ESP Web Tools uses), +the console commands, and that settings survive a restart and a factory reset. + +QEMU has no Wi-Fi radio, so this uses the `esp32dev-qemu` build, which is the normal firmware with +Wi-Fi switched off. Networking (enrollment, the server connection, Wake-on-LAN, status checks) needs +a real board. + +```bash +pio run -e esp32dev-qemu +cd test/emulator +bun install +bun improv-test.ts /path/to/qemu-system-xtensa ../../.pio/build/esp32dev-qemu/firmware.factory.bin /tmp +``` + +Download QEMU from the [releases](https://github.com/espressif/qemu/releases) +(`qemu-xtensa-softmmu-*`). Espressif's QEMU crashes inside ESP-IDF's NVS start-up on every second +boot and recovers on the next one; the test tolerates that. diff --git a/test/emulator/bun.lock b/test/emulator/bun.lock new file mode 100644 index 0000000..2ad58a3 --- /dev/null +++ b/test/emulator/bun.lock @@ -0,0 +1,33 @@ +{ + "lockfileVersion": 2, + "configVersion": 1, + "workspaces": { + "": { + "name": "netignite-agent-emulator-test", + "dependencies": { + "improv-wifi-serial-sdk": "2.8.1", + }, + }, + }, + "packages": { + "@lit-labs/ssr-dom-shim": ["@lit-labs/ssr-dom-shim@1.6.0", "", {}, "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ=="], + + "@lit/context": ["@lit/context@1.1.6", "", { "dependencies": { "@lit/reactive-element": "^1.6.2 || ^2.1.0" } }, "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A=="], + + "@lit/reactive-element": ["@lit/reactive-element@2.1.2", "", { "dependencies": { "@lit-labs/ssr-dom-shim": "^1.5.0" } }, "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A=="], + + "@material/web": ["@material/web@2.5.0", "", { "dependencies": { "@lit/context": "^1.1.6", "lit": "^2.8.0 || ^3.0.0", "tslib": "^2.4.0" } }, "sha512-x2Uovyq8E/Zc1xHXd9s1eBMXF5pMHVAt70pISKd0fL3Ajj4L6zQaQUY/awcfR2RDAMKXC7i4+vr0arv1YaOR/g=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "improv-wifi-serial-sdk": ["improv-wifi-serial-sdk@2.8.1", "", { "dependencies": { "@material/web": "^2.4.1", "tslib": "^2.8.1" } }, "sha512-KU2D7bNbdUDUX0JK2nQGTGTuxJNH+loXyMR6DXBIzAh4/2dwiR2cxK0igvl+dLWjf4wRv43iUn/eQuUClw5V3g=="], + + "lit": ["lit@3.3.3", "", { "dependencies": { "@lit/reactive-element": "^2.1.0", "lit-element": "^4.2.0", "lit-html": "^3.3.0" } }, "sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw=="], + + "lit-element": ["lit-element@4.2.2", "", { "dependencies": { "@lit-labs/ssr-dom-shim": "^1.5.0", "@lit/reactive-element": "^2.1.0", "lit-html": "^3.3.0" } }, "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w=="], + + "lit-html": ["lit-html@3.3.3", "", { "dependencies": { "@types/trusted-types": "^2.0.2" } }, "sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + } +} diff --git a/test/emulator/improv-test.ts b/test/emulator/improv-test.ts new file mode 100644 index 0000000..8387ccf --- /dev/null +++ b/test/emulator/improv-test.ts @@ -0,0 +1,193 @@ +// Boots the emulator firmware (pio run -e esp32dev-qemu) in Espressif's QEMU and drives its serial +// port with the official Improv Wi-Fi Serial client (the package ESP Web Tools uses), then the text +// console. See README.md in this folder. +// +// bun improv-test.ts +import { ImprovSerial } from "improv-wifi-serial-sdk/dist/serial.js"; + +const [qemuPath, factoryPath, workDir] = Bun.argv.slice(2); +const PORT = 5599; + +let failures = 0; +function check(name: string, ok: boolean, detail?: unknown) { + console.log(`${ok ? "PASS" : "FAIL"} ${name}${ok || detail === undefined ? "" : ` -> ${JSON.stringify(detail)}`}`); + if (!ok) failures++; +} +const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// --- 4 MB flash image ---------------------------------------------------------------------------- +const factory = new Uint8Array(await Bun.file(factoryPath).arrayBuffer()); +const flash = new Uint8Array(4 * 1024 * 1024).fill(0xff); +flash.set(factory, 0); +const flashPath = `${workDir}/flash-improv.bin`; +await Bun.write(flashPath, flash); + +const qemu = Bun.spawn( + [ + qemuPath, + "-nographic", + "-machine", + "esp32", + "-drive", + `file=${flashPath},if=mtd,format=raw`, + "-serial", + `tcp:127.0.0.1:${PORT},server,wait=on`, + "-monitor", + "none", + ], + { stdout: "ignore", stderr: "inherit" }, +); + +// --- Serial port shim (Web Serial-like readable/writable over the TCP socket) ---------------------- +let transcript = ""; +let controller: ReadableStreamDefaultController | null = null; + +let socket: Awaited> | null = null; +for (let attempt = 0; attempt < 50 && !socket; attempt++) { + try { + socket = await Bun.connect({ + hostname: "127.0.0.1", + port: PORT, + socket: { + data(_s, data) { + const bytes = new Uint8Array(data); + transcript += new TextDecoder().decode(bytes); + try { + controller?.enqueue(bytes); + } catch { + controller = null; + } + }, + }, + }); + } catch { + await sleep(200); + } +} +if (!socket) throw new Error("QEMU serial port didn't open"); + +const port = { + get readable() { + return new ReadableStream({ + start(c) { + controller = c; + }, + cancel() { + controller = null; + }, + }); + }, + writable: new WritableStream({ + write(chunk) { + socket!.write(chunk); + }, + }), +}; + +async function waitFor(text: string, timeoutMs: number, from = 0) { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + const index = transcript.indexOf(text, from); + if (index >= 0) return index; + await sleep(100); + } + return -1; +} + +async function command(line: string, expect: string, timeoutMs = 8000) { + const from = transcript.length; + socket!.write(`${line}\n`); + return (await waitFor(expect, timeoutMs, from)) >= 0; +} + +const logger = { log() {}, error() {}, debug() {} }; + +try { + // --- Boot ---------------------------------------------------------------------------------- + check("firmware boots to the setup prompt", (await waitFor("Waiting for Wi-Fi settings", 90000)) >= 0); + + // --- Improv with the official client ------------------------------------------------------ + const improv = new ImprovSerial(port as any, logger as any); + const info = await improv.initialize(10000); + check("Improv detected; state is Authorized (ready for Wi-Fi)", improv.state === 2, improv.state); + check( + "device info: firmware, version, chip, name", + info?.firmware === "NetIgnite Agent" && info.chipFamily === "ESP32" && /^NetIgnite-[0-9A-F]{6}$/.test(info.name) && info.version.startsWith("2.0.0"), + info, + ); + + const networks = await improv.scan(); + check("Wi-Fi scan returns the (empty) list", Array.isArray(networks) && networks.length === 0, networks); + + let provisionError: unknown = null; + try { + await improv.provision("TestNet", "secret123", 40000); + } catch (error) { + provisionError = error; + } + check("provisioning fails cleanly with 'unable to connect'", provisionError !== null && improv.error === 3, { + provisionError: String(provisionError), + error: improv.error, + }); + await sleep(500); // the state packet follows the error packet + check("state returns to Authorized after the failure", improv.state === 2, improv.state); + + const state = await (improv as any).getNetworkState?.(); + if (state) check("network state: offline, supports Wi-Fi", state.online === false && state.supportsWifi === true, state); + + await improv.close(); + + // --- Console -------------------------------------------------------------------------------- + check("help lists the commands", await command("help", "factory-reset confirm")); + check("status before setup", await command("status", "server: not set")); + check("unknown command is reported", await command("frobnicate", 'Unknown command "frobnicate"')); + check("invalid server URL is rejected", await command("server ftp://nope", "Invalid server URL")); + check("non-token is rejected", await command("enroll hunter2", "isn't an enrollment token")); + check( + "setup stores server and token", + await command("setup https://app.netignite.dev netignite_enroll_abc:def", "Saved. The agent enrolls with https://app.netignite.dev"), + ); + check("server with IPv6 literal and port", await command("server http://[fd00::1]:18232", "Server set to http://[fd00::1]:18232")); + check("wifi with a quoted SSID", await command('wifi "My Home Net" "pass word"', 'Connecting to "My Home Net"')); + check("invalid static IP is rejected", await command("ip static 10.0.0.300 10.0.0.1 255.255.255.0", "isn't an IPv4 address")); + check("name is saved", await command("name kitchen-esp", "Name saved")); + check("log level", await command("log debug", "Log level: debug")); + + // The token must not be echoed anywhere. + // The transcript only holds what the device sent: the token must never appear in it. + check("enrollment token never printed", !transcript.includes("netignite_enroll_abc:def")); + + // --- Settings survive a restart --------------------------------------------------------------- + const beforeReboot = transcript.length; + socket.write("reboot\n"); + // (Espressif's QEMU crashes in ESP-IDF's NVS start-up on every second boot and recovers on the + // next one, so the reset reason isn't reliable here; wait for the boot banner instead.) + check("reboots", (await waitFor("I Device kitchen-esp", 90000, beforeReboot)) >= 0); + await waitFor("[", 5000, transcript.length); + await sleep(1500); + const statusFrom = transcript.length; + socket.write("status\n"); + await waitFor("partition:", 8000, statusFrom); + const status = transcript.slice(statusFrom); + check("server URL persisted", status.includes("server: http://[fd00::1]:18232"), status); + check("device name persisted", status.includes("device: kitchen-esp"), status); + check("waiting to enroll with the stored token", status.includes("agent: waiting to enroll"), status); + + const improv2 = new ImprovSerial(port as any, logger as any); + const info2 = await improv2.initialize(10000); + check("Improv device name follows the console name", info2?.name === "kitchen-esp", info2); + await improv2.close(); + + check("factory reset erases everything", await command("factory-reset confirm", "All settings erased")); + const afterReset = transcript.length; + await waitFor("I Device NetIgnite-", 90000, afterReset); + await sleep(1500); + check("after the reset the agent is unconfigured", await command("status", "server: not set")); +} finally { + await Bun.write(`${workDir}/improv-transcript.log`, transcript); + socket?.end(); + qemu.kill(); +} + +console.log(failures === 0 ? "\nALL EMULATOR CHECKS PASSED" : `\n${failures} EMULATOR CHECK(S) FAILED`); +process.exit(failures === 0 ? 0 : 1); diff --git a/test/emulator/package.json b/test/emulator/package.json new file mode 100644 index 0000000..b5c1c4b --- /dev/null +++ b/test/emulator/package.json @@ -0,0 +1,11 @@ +{ + "name": "netignite-agent-emulator-test", + "private": true, + "type": "module", + "scripts": { + "test": "bun improv-test.ts" + }, + "dependencies": { + "improv-wifi-serial-sdk": "2.8.1" + } +} diff --git a/test/test_core/test_core.cpp b/test/test_core/test_core.cpp new file mode 100644 index 0000000..78f5f90 --- /dev/null +++ b/test/test_core/test_core.cpp @@ -0,0 +1,410 @@ +// Host-side unit tests for lib/netignite_core: pio test -e native +#include + +#include +#include + +#include "netignite/CommandLine.h" +#include "netignite/Hex.h" +#include "netignite/Improv.h" +#include "netignite/Mac.h" +#include "netignite/MagicPacket.h" +#include "netignite/Protocol.h" +#include "netignite/SerialDemux.h" +#include "netignite/ServerUrl.h" + +using namespace netignite; + +void setUp() {} +void tearDown() {} + +// --- MAC addresses ----------------------------------------------------------------------------- + +void test_parse_mac_formats() { + MacAddress mac{}; + const MacAddress expected = {0xaa, 0xbb, 0xcc, 0x01, 0x02, 0xff}; + + TEST_ASSERT_TRUE(parseMac("AA:BB:CC:01:02:FF", mac)); + TEST_ASSERT_EQUAL_UINT8_ARRAY(expected.data(), mac.data(), 6); + TEST_ASSERT_TRUE(parseMac("aa-bb-cc-01-02-ff", mac)); + TEST_ASSERT_EQUAL_UINT8_ARRAY(expected.data(), mac.data(), 6); + TEST_ASSERT_TRUE(parseMac("aabbcc0102FF", mac)); + TEST_ASSERT_EQUAL_UINT8_ARRAY(expected.data(), mac.data(), 6); +} + +void test_parse_mac_rejects_invalid() { + MacAddress mac{}; + TEST_ASSERT_FALSE(parseMac("", mac)); + TEST_ASSERT_FALSE(parseMac("AA:BB:CC:DD:EE", mac)); + TEST_ASSERT_FALSE(parseMac("AA:BB:CC:DD:EE:GG", mac)); + TEST_ASSERT_FALSE(parseMac("AA:BB-CC:DD:EE:FF", mac)); + TEST_ASSERT_FALSE(parseMac("AABB.CCDD.EEFF", mac)); + TEST_ASSERT_FALSE(parseMac("AA:BB:CC:DD:EE:FF:", mac)); +} + +void test_format_mac() { + TEST_ASSERT_EQUAL_STRING("0A:1B:2C:3D:4E:5F", formatMac({0x0a, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f}).c_str()); +} + +void test_link_local_from_mac() { + // 52:74:f2:b1:a8:7f -> fe80::5074:f2ff:feb1:a87f (RFC 4291 modified EUI-64) + const IPv6Bytes address = linkLocalFromMac({0x52, 0x74, 0xf2, 0xb1, 0xa8, 0x7f}); + TEST_ASSERT_EQUAL_STRING("fe80::5074:f2ff:feb1:a87f", formatIPv6(address).c_str()); +} + +void test_format_ipv6_compression() { + IPv6Bytes loopback{}; + loopback[15] = 1; + TEST_ASSERT_EQUAL_STRING("::1", formatIPv6(loopback).c_str()); + + const IPv6Bytes address = {0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1}; + TEST_ASSERT_EQUAL_STRING("2001:db8::1:0:0:1", formatIPv6(address).c_str()); +} + +// --- Server URLs ------------------------------------------------------------------------------- + +void test_server_url_https_default() { + auto url = parseServerUrl("https://app.netignite.dev"); + TEST_ASSERT_TRUE(url.has_value()); + TEST_ASSERT_TRUE(url->secure); + TEST_ASSERT_EQUAL_STRING("app.netignite.dev", url->host.c_str()); + TEST_ASSERT_EQUAL_UINT16(443, url->port); + TEST_ASSERT_EQUAL_STRING("https://app.netignite.dev/api/v1/agents/enroll", + url->url("/api/v1/agents/enroll").c_str()); + TEST_ASSERT_EQUAL_STRING("/ws/agent", url->path("/ws/agent").c_str()); +} + +void test_server_url_http_port_and_path() { + auto url = parseServerUrl(" HTTP://192.168.1.10:18232/netignite/ "); + TEST_ASSERT_TRUE(url.has_value()); + TEST_ASSERT_FALSE(url->secure); + TEST_ASSERT_EQUAL_STRING("192.168.1.10", url->host.c_str()); + TEST_ASSERT_EQUAL_UINT16(18232, url->port); + TEST_ASSERT_EQUAL_STRING("/netignite/ws/agent", url->path("/ws/agent").c_str()); + TEST_ASSERT_EQUAL_STRING("http://192.168.1.10:18232", url->origin().c_str()); +} + +void test_server_url_without_scheme_and_ipv6() { + auto url = parseServerUrl("netignite.example.com"); + TEST_ASSERT_TRUE(url.has_value()); + TEST_ASSERT_TRUE(url->secure); + + auto v6 = parseServerUrl("http://[fd00::10]:18232"); + TEST_ASSERT_TRUE(v6.has_value()); + TEST_ASSERT_EQUAL_STRING("fd00::10", v6->host.c_str()); + TEST_ASSERT_EQUAL_UINT16(18232, v6->port); + TEST_ASSERT_EQUAL_STRING("http://[fd00::10]:18232", v6->origin().c_str()); +} + +void test_server_url_rejects_invalid() { + TEST_ASSERT_FALSE(parseServerUrl("").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("ftp://example.com").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("https://").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("https://example.com:").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("https://example.com:0").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("https://example.com:70000").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("https://user@example.com").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("https://example.com/?x=1").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("https://exa mple.com").has_value()); + TEST_ASSERT_FALSE(parseServerUrl("http://[::1]:").has_value()); +} + +// --- Wake-on-LAN -------------------------------------------------------------------------------- + +void test_magic_packet() { + const MacAddress mac = {1, 2, 3, 4, 5, 6}; + const auto packet = buildMagicPacket(mac); + for (int i = 0; i < 6; i++) TEST_ASSERT_EQUAL_HEX8(0xff, packet[i]); + for (int repeat = 0; repeat < 16; repeat++) { + TEST_ASSERT_EQUAL_UINT8_ARRAY(mac.data(), packet.data() + 6 + repeat * 6, 6); + } +} + +void test_directed_broadcast() { + // 192.168.1.32/24 -> 192.168.1.255 + TEST_ASSERT_EQUAL_HEX32(0xc0a801ff, directedBroadcast(0xc0a80120, 0xffffff00)); + // 10.1.2.3/16 -> 10.1.255.255 + TEST_ASSERT_EQUAL_HEX32(0x0a01ffff, directedBroadcast(0x0a010203, 0xffff0000)); +} + +// --- Improv ------------------------------------------------------------------------------------- + +uint8_t checksum(const std::vector& bytes, size_t count) { + uint8_t sum = 0; + for (size_t i = 0; i < count; i++) sum = static_cast(sum + bytes[i]); + return sum; +} + +void test_improv_state_packet() { + const auto packet = improv::buildStatePacket(improv::State::Authorized); + const std::vector expected = {'I', 'M', 'P', 'R', 'O', 'V', 1, 0x01, 1, 0x02}; + TEST_ASSERT_EQUAL_size_t(expected.size() + 2, packet.size()); + TEST_ASSERT_EQUAL_UINT8_ARRAY(expected.data(), packet.data(), expected.size()); + TEST_ASSERT_EQUAL_HEX8(checksum(packet, expected.size()), packet[expected.size()]); + TEST_ASSERT_EQUAL_HEX8('\n', packet.back()); +} + +void test_improv_rpc_result() { + const auto packet = + improv::buildRpcResult(improv::Command::GetDeviceInfo, {"NetIgnite", "2.0.0", "ESP32", "Office"}); + // data = cmd, total length, then length-prefixed strings + TEST_ASSERT_EQUAL_HEX8(0x04, packet[7]); + const size_t dataLength = packet[8]; + TEST_ASSERT_EQUAL_size_t(2 + 4 + 9 + 5 + 5 + 6, dataLength); + TEST_ASSERT_EQUAL_HEX8(0x03, packet[9]); + TEST_ASSERT_EQUAL_size_t(dataLength - 2, packet[10]); + TEST_ASSERT_EQUAL_size_t(9, packet[11]); + TEST_ASSERT_EQUAL_MEMORY("NetIgnite", packet.data() + 12, 9); + TEST_ASSERT_EQUAL_HEX8(checksum(packet, 9 + dataLength), packet[9 + dataLength]); +} + +void test_improv_parse_wifi_settings() { + // Example from the spec: SSID "MyWirelessAP", password "mysecurepassword" + std::vector data = {0x01, 0x1e, 0x0c}; + for (char c : std::string("MyWirelessAP")) data.push_back(static_cast(c)); + data.push_back(0x10); + for (char c : std::string("mysecurepassword")) data.push_back(static_cast(c)); + + improv::RpcCommand command; + TEST_ASSERT_TRUE(improv::parseRpc(data, command)); + TEST_ASSERT_EQUAL(static_cast(improv::Command::WifiSettings), static_cast(command.command)); + TEST_ASSERT_EQUAL_STRING("MyWirelessAP", command.ssid.c_str()); + TEST_ASSERT_EQUAL_STRING("mysecurepassword", command.password.c_str()); +} + +void test_improv_parse_rejects_bad_lengths() { + improv::RpcCommand command; + TEST_ASSERT_FALSE(improv::parseRpc({0x01}, command)); + TEST_ASSERT_FALSE(improv::parseRpc({0x01, 0x05, 0x01, 'a'}, command)); + // SSID length runs past the end + TEST_ASSERT_FALSE(improv::parseRpc({0x01, 0x03, 0x09, 'a', 'b'}, command)); + // open network: empty password is fine, empty SSID isn't + TEST_ASSERT_TRUE(improv::parseRpc({0x01, 0x03, 0x01, 'a', 0x00}, command)); + TEST_ASSERT_EQUAL_STRING("", command.password.c_str()); + TEST_ASSERT_FALSE(improv::parseRpc({0x01, 0x02, 0x00, 0x00}, command)); + // other commands carry no payload + TEST_ASSERT_TRUE(improv::parseRpc({0x03, 0x00}, command)); + TEST_ASSERT_EQUAL(static_cast(improv::Command::GetDeviceInfo), static_cast(command.command)); +} + +// --- Serial demultiplexer ---------------------------------------------------------------------- + +std::vector feedAll(SerialDemux& demux, const std::vector& bytes) { + std::vector events; + for (uint8_t byte : bytes) { + auto event = demux.feed(byte); + if (event.type != SerialDemux::Event::Type::None) events.push_back(event); + } + return events; +} + +std::vector bytesOf(const std::string& text) { + return std::vector(text.begin(), text.end()); +} + +void test_demux_text_lines() { + SerialDemux demux; + auto events = feedAll(demux, bytesOf("status\r\n wifi \"My Net\" pw \n\n")); + TEST_ASSERT_EQUAL_size_t(2, events.size()); + TEST_ASSERT_EQUAL_STRING("status", events[0].line.c_str()); + TEST_ASSERT_EQUAL_STRING("wifi \"My Net\" pw", events[1].line.c_str()); +} + +void test_demux_improv_packet_with_newline_in_data() { + // An RPC packet whose payload contains 0x0A must not be split at it. + const std::vector rpc = {0x01, 0x05, 0x01, '\n', 0x02, 'p', 'w'}; + auto packet = improv::buildPacket(improv::PacketType::Rpc, rpc); + + SerialDemux demux; + std::vector input = bytesOf("IMPROVE is not a packet\n"); + input.insert(input.end(), packet.begin(), packet.end()); + auto line = bytesOf("help\n"); + input.insert(input.end(), line.begin(), line.end()); + + auto events = feedAll(demux, input); + TEST_ASSERT_EQUAL_size_t(3, events.size()); + TEST_ASSERT_EQUAL(static_cast(SerialDemux::Event::Type::Line), static_cast(events[0].type)); + TEST_ASSERT_EQUAL(static_cast(SerialDemux::Event::Type::ImprovPacket), static_cast(events[1].type)); + TEST_ASSERT_EQUAL_HEX8(0x03, events[1].improvType); + TEST_ASSERT_EQUAL_size_t(rpc.size(), events[1].improvData.size()); + TEST_ASSERT_EQUAL_UINT8_ARRAY(rpc.data(), events[1].improvData.data(), rpc.size()); + TEST_ASSERT_EQUAL_STRING("help", events[2].line.c_str()); + + improv::RpcCommand command; + TEST_ASSERT_TRUE(improv::parseRpc(events[1].improvData, command)); + TEST_ASSERT_EQUAL_STRING("\n", command.ssid.c_str()); +} + +void test_demux_bad_checksum() { + auto packet = improv::buildPacket(improv::PacketType::Rpc, {0x02, 0x00}); + packet[packet.size() - 2] ^= 0xff; + SerialDemux demux; + auto events = feedAll(demux, packet); + TEST_ASSERT_EQUAL_size_t(1, events.size()); + TEST_ASSERT_EQUAL(static_cast(SerialDemux::Event::Type::ImprovBadChecksum), + static_cast(events[0].type)); +} + +void test_demux_overlong_line_is_dropped() { + SerialDemux demux; + std::string longLine(SerialDemux::MAX_LINE + 10, 'x'); + auto events = feedAll(demux, bytesOf(longLine + "\nreboot\n")); + TEST_ASSERT_EQUAL_size_t(1, events.size()); + TEST_ASSERT_EQUAL_STRING("reboot", events[0].line.c_str()); +} + +// --- Protocol ---------------------------------------------------------------------------------- + +void test_parse_request_frame() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + TEST_ASSERT_TRUE(protocol::parseFrame( + R"({"t":"req","id":4294967295,"cmd":"WAKE","p":{"mac":"AA:BB:CC:DD:EE:FF","port":9}})", doc, frame, + error)); + TEST_ASSERT_EQUAL(static_cast(protocol::FrameType::Request), static_cast(frame.type)); + TEST_ASSERT_EQUAL_UINT32(4294967295u, frame.id); + TEST_ASSERT_EQUAL_STRING("WAKE", frame.cmd.c_str()); + + protocol::WakeRequest wake; + TEST_ASSERT_TRUE(protocol::parseWakeRequest(frame.payload, wake, error)); + TEST_ASSERT_EQUAL_UINT16(9, wake.port); + TEST_ASSERT_EQUAL_HEX8(0xff, wake.mac[5]); +} + +void test_parse_frame_rejects_invalid() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + TEST_ASSERT_FALSE(protocol::parseFrame("not json", doc, frame, error)); + TEST_ASSERT_FALSE(protocol::parseFrame("[1,2]", doc, frame, error)); + TEST_ASSERT_FALSE(protocol::parseFrame(R"({"t":"req","cmd":"PING"})", doc, frame, error)); + TEST_ASSERT_FALSE(protocol::parseFrame(R"({"t":"req","id":-1,"cmd":"PING"})", doc, frame, error)); + TEST_ASSERT_FALSE(protocol::parseFrame(R"({"t":"req","id":1})", doc, frame, error)); + TEST_ASSERT_FALSE(protocol::parseFrame(R"({"t":"xyz","id":1,"cmd":"PING"})", doc, frame, error)); +} + +void test_parse_wake_rejects_invalid() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + protocol::WakeRequest wake; + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"WAKE","p":{"mac":"nope","port":9}})", doc, frame, error); + TEST_ASSERT_FALSE(protocol::parseWakeRequest(frame.payload, wake, error)); + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"WAKE","p":{"mac":"AA:BB:CC:DD:EE:FF","port":0}})", doc, + frame, error); + TEST_ASSERT_FALSE(protocol::parseWakeRequest(frame.payload, wake, error)); + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"WAKE","p":{"mac":"AA:BB:CC:DD:EE:FF","port":"9"}})", doc, + frame, error); + TEST_ASSERT_FALSE(protocol::parseWakeRequest(frame.payload, wake, error)); +} + +void test_parse_status_requests() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + protocol::StatusRequest status; + + protocol::parseFrame( + R"({"t":"req","id":2,"cmd":"STATUS","p":{"target":{"type":"link_local","mac":"52:74:F2:B1:A8:7F"},"icmp":true}})", + doc, frame, error); + TEST_ASSERT_TRUE(protocol::parseStatusRequest(frame.payload, status, error)); + TEST_ASSERT_EQUAL(static_cast(protocol::StatusRequest::Target::LinkLocal), static_cast(status.target)); + TEST_ASSERT_EQUAL_UINT16(0, status.tcpPort); + + protocol::parseFrame( + R"({"t":"req","id":3,"cmd":"STATUS","p":{"target":{"type":"ip","address":"fe80::1%eth0"},"icmp":true,"tcp_port":445}})", + doc, frame, error); + TEST_ASSERT_TRUE(protocol::parseStatusRequest(frame.payload, status, error)); + TEST_ASSERT_EQUAL_STRING("fe80::1", status.address.c_str()); + TEST_ASSERT_EQUAL_UINT16(445, status.tcpPort); + + protocol::parseFrame( + R"({"t":"req","id":4,"cmd":"STATUS","p":{"target":{"type":"host","host":"nas.local"},"icmp":false,"tcp_port":22}})", + doc, frame, error); + TEST_ASSERT_TRUE(protocol::parseStatusRequest(frame.payload, status, error)); + TEST_ASSERT_EQUAL(static_cast(protocol::StatusRequest::Target::Host), static_cast(status.target)); + TEST_ASSERT_FALSE(status.icmp); + + protocol::parseFrame( + R"({"t":"req","id":5,"cmd":"STATUS","p":{"target":{"type":"ip","address":"10.0.0.1"},"icmp":false}})", doc, + frame, error); + TEST_ASSERT_FALSE(protocol::parseStatusRequest(frame.payload, status, error)); + protocol::parseFrame(R"({"t":"req","id":6,"cmd":"STATUS","p":{"target":{"type":"carrier-pigeon"}}})", doc, + frame, error); + TEST_ASSERT_FALSE(protocol::parseStatusRequest(frame.payload, status, error)); +} + +void test_encode_frames() { + JsonDocument payload; + payload["online"] = true; + TEST_ASSERT_EQUAL_STRING(R"({"t":"res","id":7,"ok":true,"p":{"online":true}})", + protocol::encodeResponse(7, payload.as()).c_str()); + TEST_ASSERT_EQUAL_STRING(R"({"t":"res","id":8,"ok":true,"p":{}})", protocol::encodeEmptyResponse(8).c_str()); + TEST_ASSERT_EQUAL_STRING(R"({"t":"res","id":9,"ok":false,"err":"Unknown command"})", + protocol::encodeError(9, "Unknown command").c_str()); + + JsonDocument hello; + hello["protocol"] = protocol::VERSION; + hello["kind"] = protocol::AGENT_KIND; + TEST_ASSERT_EQUAL_STRING(R"({"t":"evt","cmd":"HELLO","p":{"protocol":2,"kind":"esp32"}})", + protocol::encodeEvent("HELLO", hello.as()).c_str()); +} + +// --- Console command lines --------------------------------------------------------------------- + +void test_split_command_line() { + std::vector args; + TEST_ASSERT_TRUE(splitCommandLine(R"(wifi "My Home Network" "pa\"ss word")", args)); + TEST_ASSERT_EQUAL_size_t(3, args.size()); + TEST_ASSERT_EQUAL_STRING("wifi", args[0].c_str()); + TEST_ASSERT_EQUAL_STRING("My Home Network", args[1].c_str()); + TEST_ASSERT_EQUAL_STRING("pa\"ss word", args[2].c_str()); + + TEST_ASSERT_TRUE(splitCommandLine(" ip static 192.168.1.5\t192.168.1.1 255.255.255.0 ", args)); + TEST_ASSERT_EQUAL_size_t(5, args.size()); + TEST_ASSERT_EQUAL_STRING("255.255.255.0", args[4].c_str()); + + // An empty quoted argument (open network) is kept. + TEST_ASSERT_TRUE(splitCommandLine(R"(wifi Guest "")", args)); + TEST_ASSERT_EQUAL_size_t(3, args.size()); + TEST_ASSERT_EQUAL_STRING("", args[2].c_str()); + + TEST_ASSERT_FALSE(splitCommandLine(R"(wifi "unterminated)", args)); +} + +void test_hex() { + const uint8_t bytes[] = {0x00, 0x0f, 0xa5, 0xff}; + TEST_ASSERT_EQUAL_STRING("000fa5ff", toHex(bytes, sizeof(bytes)).c_str()); +} + +int main(int, char**) { + UNITY_BEGIN(); + RUN_TEST(test_parse_mac_formats); + RUN_TEST(test_parse_mac_rejects_invalid); + RUN_TEST(test_format_mac); + RUN_TEST(test_link_local_from_mac); + RUN_TEST(test_format_ipv6_compression); + RUN_TEST(test_server_url_https_default); + RUN_TEST(test_server_url_http_port_and_path); + RUN_TEST(test_server_url_without_scheme_and_ipv6); + RUN_TEST(test_server_url_rejects_invalid); + RUN_TEST(test_magic_packet); + RUN_TEST(test_directed_broadcast); + RUN_TEST(test_improv_state_packet); + RUN_TEST(test_improv_rpc_result); + RUN_TEST(test_improv_parse_wifi_settings); + RUN_TEST(test_improv_parse_rejects_bad_lengths); + RUN_TEST(test_demux_text_lines); + RUN_TEST(test_demux_improv_packet_with_newline_in_data); + RUN_TEST(test_demux_bad_checksum); + RUN_TEST(test_demux_overlong_line_is_dropped); + RUN_TEST(test_parse_request_frame); + RUN_TEST(test_parse_frame_rejects_invalid); + RUN_TEST(test_parse_wake_rejects_invalid); + RUN_TEST(test_parse_status_requests); + RUN_TEST(test_encode_frames); + RUN_TEST(test_split_command_line); + RUN_TEST(test_hex); + return UNITY_END(); +} From dd570f5b0e84cf7241c8eefaff366c8f56087161 Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Tue, 20 Oct 2026 19:19:51 +0200 Subject: [PATCH 2/8] ci: make the emulator test work on GitHub runners Start QEMU with the timer-group watchdogs disabled, as ESP-IDF's own QEMU runner does: on a slow host they reset or crash the emulated chip during boot, which kept the CI runner's board in a reset loop (and caused the "cache error" crash on every second boot locally). Boot waits are longer, and on a failure the test prints the device's serial output and CI keeps it as the emulator-serial-log artifact. --- .github/workflows/firmware.yml | 7 +++++++ test/emulator/README.md | 6 ++++-- test/emulator/improv-test.ts | 24 ++++++++++++++++++------ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/.github/workflows/firmware.yml b/.github/workflows/firmware.yml index 6187ff7..0b11e9f 100644 --- a/.github/workflows/firmware.yml +++ b/.github/workflows/firmware.yml @@ -88,6 +88,7 @@ jobs: emulator: needs: build runs-on: ubuntu-latest + timeout-minutes: 20 env: QEMU_URL: https://github.com/espressif/qemu/releases/download/esp-develop-9.2.2-20260417/qemu-xtensa-softmmu-esp_develop_9.2.2_20260417-x86_64-linux-gnu.tar.xz QEMU_SHA256: 0eecb2a34a5586c0e59110f77b9343b7b336e82fdb0e1a30e1dc1bab8a547e35 @@ -108,6 +109,12 @@ jobs: run: | bun install --frozen-lockfile bun improv-test.ts "$GITHUB_WORKSPACE/qemu/bin/qemu-system-xtensa" "$GITHUB_WORKSPACE/qemu-firmware/firmware.factory.bin" "$RUNNER_TEMP" + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: emulator-serial-log + path: ${{ runner.temp }}/improv-transcript.log + retention-days: 7 # Tags only, after the unit, build and emulator checks passed. release: diff --git a/test/emulator/README.md b/test/emulator/README.md index 063ad02..b6fdde7 100644 --- a/test/emulator/README.md +++ b/test/emulator/README.md @@ -16,5 +16,7 @@ bun improv-test.ts /path/to/qemu-system-xtensa ../../.pio/build/esp32dev-qemu/fi ``` Download QEMU from the [releases](https://github.com/espressif/qemu/releases) -(`qemu-xtensa-softmmu-*`). Espressif's QEMU crashes inside ESP-IDF's NVS start-up on every second -boot and recovers on the next one; the test tolerates that. +(`qemu-xtensa-softmmu-*`). The test starts it with the timer-group watchdogs disabled, like +ESP-IDF's own QEMU runner; with them enabled, slow hosts reset or crash the emulated chip during +boot. If a check fails, the test prints the device's serial output, and CI keeps it as the +`emulator-serial-log` artifact. diff --git a/test/emulator/improv-test.ts b/test/emulator/improv-test.ts index 8387ccf..3092314 100644 --- a/test/emulator/improv-test.ts +++ b/test/emulator/improv-test.ts @@ -7,6 +7,8 @@ import { ImprovSerial } from "improv-wifi-serial-sdk/dist/serial.js"; const [qemuPath, factoryPath, workDir] = Bun.argv.slice(2); const PORT = 5599; +// Boots take a few seconds locally but much longer on shared CI runners. +const BOOT_TIMEOUT_MS = 180_000; let failures = 0; function check(name: string, ok: boolean, detail?: unknown) { @@ -34,6 +36,10 @@ const qemu = Bun.spawn( `tcp:127.0.0.1:${PORT},server,wait=on`, "-monitor", "none", + // Like ESP-IDF's own QEMU runner: an emulated chip on a slow host would otherwise be reset by + // the timer-group watchdogs during boot, over and over. + "-global", + "driver=timer.esp32.timg,property=wdt_disable,value=true", ], { stdout: "ignore", stderr: "inherit" }, ); @@ -104,7 +110,7 @@ const logger = { log() {}, error() {}, debug() {} }; try { // --- Boot ---------------------------------------------------------------------------------- - check("firmware boots to the setup prompt", (await waitFor("Waiting for Wi-Fi settings", 90000)) >= 0); + check("firmware boots to the setup prompt", (await waitFor("Waiting for Wi-Fi settings", BOOT_TIMEOUT_MS)) >= 0); // --- Improv with the official client ------------------------------------------------------ const improv = new ImprovSerial(port as any, logger as any); @@ -153,16 +159,13 @@ try { check("name is saved", await command("name kitchen-esp", "Name saved")); check("log level", await command("log debug", "Log level: debug")); - // The token must not be echoed anywhere. // The transcript only holds what the device sent: the token must never appear in it. check("enrollment token never printed", !transcript.includes("netignite_enroll_abc:def")); // --- Settings survive a restart --------------------------------------------------------------- const beforeReboot = transcript.length; socket.write("reboot\n"); - // (Espressif's QEMU crashes in ESP-IDF's NVS start-up on every second boot and recovers on the - // next one, so the reset reason isn't reliable here; wait for the boot banner instead.) - check("reboots", (await waitFor("I Device kitchen-esp", 90000, beforeReboot)) >= 0); + check("reboots", (await waitFor("I Device kitchen-esp", BOOT_TIMEOUT_MS, beforeReboot)) >= 0); await waitFor("[", 5000, transcript.length); await sleep(1500); const statusFrom = transcript.length; @@ -180,14 +183,23 @@ try { check("factory reset erases everything", await command("factory-reset confirm", "All settings erased")); const afterReset = transcript.length; - await waitFor("I Device NetIgnite-", 90000, afterReset); + await waitFor("I Device NetIgnite-", BOOT_TIMEOUT_MS, afterReset); await sleep(1500); check("after the reset the agent is unconfigured", await command("status", "server: not set")); +} catch (error) { + check("test ran to the end", false, String(error)); } finally { await Bun.write(`${workDir}/improv-transcript.log`, transcript); socket?.end(); qemu.kill(); } +if (failures > 0) { + // The device's serial output, so a CI log shows where it got stuck. + const printable = transcript.replace(/[^\x09\x0a\x20-\x7e]/g, ""); + console.log("\n--- last 80 lines of serial output ---"); + console.log(printable.split("\n").slice(-80).join("\n")); +} + console.log(failures === 0 ? "\nALL EMULATOR CHECKS PASSED" : `\n${failures} EMULATOR CHECK(S) FAILED`); process.exit(failures === 0 ? 0 : 1); From 224294a8ecedbe4a80b68b1c3d3730125bec844c Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Tue, 20 Oct 2026 23:55:23 +0200 Subject: [PATCH 3/8] feat: let the web installer set the agent's name release.json now lists `name` in nvs.keys, so the server's web installer writes the agent's name into the NVS image together with the server URL and enrollment token. --- scripts/collect_release.py | 5 +++-- src/Config.h | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/collect_release.py b/scripts/collect_release.py index efed961..afd8a47 100644 --- a/scripts/collect_release.py +++ b/scripts/collect_release.py @@ -6,7 +6,8 @@ The files are the standard Arduino-ESP32 layout: bootloader at 0x1000, partition table at 0x8000, OTA data (boot_app0) at 0xe000 and the app at 0x10000. The web installer adds an NVS image at -0x9000 with the server URL and a single-use enrollment token. +0x9000 with the server URL, a single-use enrollment token and the agent's name: the keys listed +in release.json's nvs.keys (the server writes no others). """ import argparse @@ -77,7 +78,7 @@ def main(): "board": "esp32dev", "protocol": 2, "parts": parts, - "nvs": {"offset": 0x9000, "size": 0x5000, "namespace": "netignite", "keys": ["server", "enroll"]}, + "nvs": {"offset": 0x9000, "size": 0x5000, "namespace": "netignite", "keys": ["server", "enroll", "name"]}, "app": {"file": "firmware.bin", "signature": signature}, } with open(os.path.join(args.output, "release.json"), "w") as handle: diff --git a/src/Config.h b/src/Config.h index 0e40208..c14f669 100644 --- a/src/Config.h +++ b/src/Config.h @@ -12,9 +12,10 @@ constexpr const char* FIRMWARE_NAME = "NetIgnite Agent"; constexpr const char* FIRMWARE_VERSION = NETIGNITE_FW_VERSION; /** - * NVS namespace and keys (max. 15 characters each). The web installer writes `server` and - * `enroll` into an NVS partition image, so these names are part of the provisioning format: - * change them only together with the server's image generator. + * NVS namespace and keys (max. 15 characters each). The web installer writes `server`, `enroll` + * and `name` into an NVS partition image (the keys scripts/collect_release.py lists in + * release.json), so these names are part of the provisioning format: change them only together + * with the server (server/lib/firmware/provisioning.ts). */ namespace keys { constexpr const char* NAMESPACE = "netignite"; From 0d601e2c73ef078021f8f01bb3b4472efbbeadfd Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Wed, 21 Oct 2026 12:36:37 +0200 Subject: [PATCH 4/8] feat: OTA updates, remote console and SSH logins - OTA_BEGIN: downloads the image from the agent's server with its own credential, checks size, SHA-256 and (with keys/firmware-signing.pub.pem compiled in by scripts/signing_key.py) the ECDSA P-256 signature, and installs it into the other slot. The new firmware is on probation (ESP-IDF app rollback) until it reaches the server; after 5 minutes, or if it crashes, the bootloader starts the previous firmware and the agent reports the failed version in HELLO. OTA_PROGRESS events report the download. - Console: a 16 KB ring of log lines (including ESP-IDF's messages), GET_LOGS, LOG_SUBSCRIBE with LOG events, GET_INFO, CONFIG_SET (server URL and IP settings are tried and only saved once the agent reaches the server; otherwise it restarts with the previous ones), REBOOT, FACTORY_RESET. - SSH_CHECK / SSH_EXEC with LibSSH-ESP32 in a short-lived task: login only for checks, fixed shutdown/reboot commands with a trusted host key; secrets are wiped after use. - Enrollment sends the agent kind; a 409 (token of a Linux agent) is a final rejection. - Emulator tests: ota-test.ts installs images over the serial port (emulator builds only, with a test signing key) and checks signature/SHA rejection, probation and rollback in QEMU; CI runs it. improv-test.ts retries the first command after a restart (flaky on CI runners). - Firmware size with libssh: 79.2% of an OTA slot. --- .github/workflows/firmware.yml | 20 +- README.md | 23 +- lib/netignite_core/src/netignite/Hex.cpp | 51 ++++ lib/netignite_core/src/netignite/Hex.h | 8 + lib/netignite_core/src/netignite/LogRing.cpp | 39 +++ lib/netignite_core/src/netignite/LogRing.h | 48 +++ lib/netignite_core/src/netignite/Protocol.cpp | 274 ++++++++++++++++++ lib/netignite_core/src/netignite/Protocol.h | 80 ++++- .../src/netignite/Validation.cpp | 38 +++ lib/netignite_core/src/netignite/Validation.h | 13 + platformio.ini | 10 +- scripts/signing_key.py | 54 ++++ src/Config.h | 25 ++ src/agent/AgentClient.cpp | 206 ++++++++++++- src/agent/AgentClient.h | 43 ++- src/agent/Enrollment.cpp | 4 +- src/agent/SshWorker.cpp | 200 +++++++++++++ src/agent/SshWorker.h | 51 ++++ src/core/Log.cpp | 65 ++++- src/core/Log.h | 16 + src/core/Settings.cpp | 16 + src/core/Settings.h | 14 + src/main.cpp | 123 +++++++- src/ota/OtaUpdater.cpp | 187 ++++++++++++ src/ota/OtaUpdater.h | 50 ++++ src/ota/OtaWriter.cpp | 125 ++++++++ src/ota/OtaWriter.h | 39 +++ src/ota/Rollback.cpp | 87 ++++++ src/ota/Rollback.h | 32 ++ src/serial/SerialConsole.cpp | 104 +++++-- src/serial/SerialConsole.h | 8 + test/emulator/README.md | 24 +- test/emulator/improv-test.ts | 13 +- test/emulator/keys/README.md | 9 + test/emulator/keys/emulator-other.key.pem | 5 + test/emulator/keys/emulator-test.key.pem | 5 + test/emulator/keys/emulator-test.pub.pem | 4 + test/emulator/ota-test.ts | 250 ++++++++++++++++ test/test_core/test_core.cpp | 273 +++++++++++++++++ 39 files changed, 2579 insertions(+), 57 deletions(-) create mode 100644 lib/netignite_core/src/netignite/LogRing.cpp create mode 100644 lib/netignite_core/src/netignite/LogRing.h create mode 100644 lib/netignite_core/src/netignite/Validation.cpp create mode 100644 lib/netignite_core/src/netignite/Validation.h create mode 100644 scripts/signing_key.py create mode 100644 src/agent/SshWorker.cpp create mode 100644 src/agent/SshWorker.h create mode 100644 src/ota/OtaUpdater.cpp create mode 100644 src/ota/OtaUpdater.h create mode 100644 src/ota/OtaWriter.cpp create mode 100644 src/ota/OtaWriter.h create mode 100644 src/ota/Rollback.cpp create mode 100644 src/ota/Rollback.h create mode 100644 test/emulator/keys/README.md create mode 100644 test/emulator/keys/emulator-other.key.pem create mode 100644 test/emulator/keys/emulator-test.key.pem create mode 100644 test/emulator/keys/emulator-test.pub.pem create mode 100644 test/emulator/ota-test.ts diff --git a/.github/workflows/firmware.yml b/.github/workflows/firmware.yml index 0b11e9f..3db5374 100644 --- a/.github/workflows/firmware.yml +++ b/.github/workflows/firmware.yml @@ -81,14 +81,17 @@ jobs: - uses: actions/upload-artifact@v4 with: name: firmware-qemu - path: .pio/build/esp32dev-qemu/firmware.factory.bin + path: | + .pio/build/esp32dev-qemu/firmware.factory.bin + .pio/build/esp32dev-qemu/firmware.bin retention-days: 3 - # Boots the firmware in Espressif's QEMU and tests Improv and the console (test/emulator). + # Boots the firmware in Espressif's QEMU and tests Improv, the console and OTA updates + # (test/emulator). emulator: needs: build runs-on: ubuntu-latest - timeout-minutes: 20 + timeout-minutes: 45 env: QEMU_URL: https://github.com/espressif/qemu/releases/download/esp-develop-9.2.2-20260417/qemu-xtensa-softmmu-esp_develop_9.2.2_20260417-x86_64-linux-gnu.tar.xz QEMU_SHA256: 0eecb2a34a5586c0e59110f77b9343b7b336e82fdb0e1a30e1dc1bab8a547e35 @@ -105,15 +108,22 @@ jobs: curl -sSL -o qemu.tar.xz "$QEMU_URL" echo "$QEMU_SHA256 qemu.tar.xz" | sha256sum -c - tar -xf qemu.tar.xz - - working-directory: test/emulator + - name: Improv and console + working-directory: test/emulator run: | bun install --frozen-lockfile bun improv-test.ts "$GITHUB_WORKSPACE/qemu/bin/qemu-system-xtensa" "$GITHUB_WORKSPACE/qemu-firmware/firmware.factory.bin" "$RUNNER_TEMP" + - name: OTA updates + working-directory: test/emulator + run: | + bun ota-test.ts "$GITHUB_WORKSPACE/qemu/bin/qemu-system-xtensa" "$GITHUB_WORKSPACE/qemu-firmware/firmware.factory.bin" "$GITHUB_WORKSPACE/qemu-firmware/firmware.bin" "$RUNNER_TEMP" - uses: actions/upload-artifact@v4 if: failure() with: name: emulator-serial-log - path: ${{ runner.temp }}/improv-transcript.log + path: | + ${{ runner.temp }}/improv-transcript.log + ${{ runner.temp }}/ota-transcript.log retention-days: 7 # Tags only, after the unit, build and emulator checks passed. diff --git a/README.md b/README.md index 7dbdb0d..3c314a4 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,21 @@ NetIgnite protocol v2 (JSON frames; see `lib/netignite_core/src/netignite/Protoc address) and/or tries a TCP port. A refused TCP connection also counts as online. Host names resolve to IPv4 and IPv6 addresses. - `PING`: keep-alive. Without any message from the server for 100 s, the agent reconnects. +- `OTA_BEGIN`: downloads a firmware image from its server (with its own credential), checks its + size and SHA-256 and, if the firmware has a public key compiled in, its signature, writes it to + the other app slot and restarts. The new firmware is on probation until it reaches the server; + if it crashes or doesn't get there within 5 minutes, the bootloader starts the previous firmware + again, and the agent reports the failed version in its HELLO. +- `GET_LOGS`, `LOG_SUBSCRIBE`: the last 16 KB of log lines (also ESP-IDF's own messages), and new + lines as `LOG` events, for the dashboard's console. +- `CONFIG_SET`: server address, host name, log level and IP settings. A new server address or IP + setting is tried first and only saved once the agent reaches the server with it; otherwise the + agent restarts with the previous settings after 2 minutes. +- `SSH_CHECK`, `SSH_EXEC`: logs in to a device in its network over SSH (libssh) with the login the + server stores for that device. A check only authenticates and never opens a session; a command + needs the trusted host key and runs only `[sudo -n ]shutdown -h|-r now` or + `shutdown /s|/r /t 0`. The password or key is wiped from memory after each login. +- `GET_INFO`, `REBOOT`, `FACTORY_RESET`. HTTPS servers need a certificate from a public CA. For a private CA, put its certificate (`.pem` or `.der`) into `data/cert/custom/` before building. @@ -86,7 +101,8 @@ python scripts/check_size.py # the firmware must stay below 85 % of an OTA ``` `test/emulator/` boots the firmware in Espressif's QEMU and tests Improv and the console with the -same client ESP Web Tools uses. QEMU has no Wi-Fi, so networking needs a real board. +same client ESP Web Tools uses, and OTA updates (signature checks, probation, rollback) with images +sent over the serial port. QEMU has no Wi-Fi, so networking needs a real board. ## Releases @@ -96,7 +112,10 @@ emulator test, then a GitHub release with `bootloader.bin`, `partitions.bin`, `b describes the parts for the NetIgnite server's web installer. Releases are signed when the repository secret `FIRMWARE_SIGNING_KEY` is set; create the key pair -with `sh scripts/generate_signing_key.sh` and commit only the public key. +with `sh scripts/generate_signing_key.sh` and commit only the public key +(`keys/firmware-signing.pub.pem`). Once that file exists, `scripts/signing_key.py` compiles it into +the firmware, and the agent only installs OTA updates with a valid signature. Set the same public +key as `NETIGNITE_FIRMWARE_PUBLIC_KEY` on the server, so it only offers signed releases. ## License diff --git a/lib/netignite_core/src/netignite/Hex.cpp b/lib/netignite_core/src/netignite/Hex.cpp index 3e6b906..70913b7 100644 --- a/lib/netignite_core/src/netignite/Hex.cpp +++ b/lib/netignite_core/src/netignite/Hex.cpp @@ -2,6 +2,17 @@ namespace netignite { +namespace { + +int nibble(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return -1; +} + +} // namespace + std::string toHex(const uint8_t* data, size_t length) { static constexpr char DIGITS[] = "0123456789abcdef"; std::string out; @@ -13,4 +24,44 @@ std::string toHex(const uint8_t* data, size_t length) { return out; } +std::string toBase64(const uint8_t* data, size_t length, bool pad) { + static constexpr char ALPHABET[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + std::string out; + out.reserve((length + 2) / 3 * 4); + for (size_t i = 0; i < length; i += 3) { + const uint32_t chunk = (static_cast(data[i]) << 16) | + (i + 1 < length ? static_cast(data[i + 1]) << 8 : 0) | + (i + 2 < length ? static_cast(data[i + 2]) : 0); + out += ALPHABET[(chunk >> 18) & 0x3f]; + out += ALPHABET[(chunk >> 12) & 0x3f]; + if (i + 1 < length) { + out += ALPHABET[(chunk >> 6) & 0x3f]; + } else if (pad) { + out += '='; + } + if (i + 2 < length) { + out += ALPHABET[chunk & 0x3f]; + } else if (pad) { + out += '='; + } + } + return out; +} + +bool fromHex(std::string_view text, std::vector& out) { + out.clear(); + if (text.size() % 2 != 0) return false; + out.reserve(text.size() / 2); + for (size_t i = 0; i < text.size(); i += 2) { + const int high = nibble(text[i]); + const int low = nibble(text[i + 1]); + if (high < 0 || low < 0) { + out.clear(); + return false; + } + out.push_back(static_cast((high << 4) | low)); + } + return true; +} + } // namespace netignite diff --git a/lib/netignite_core/src/netignite/Hex.h b/lib/netignite_core/src/netignite/Hex.h index 3f24a74..e183823 100644 --- a/lib/netignite_core/src/netignite/Hex.h +++ b/lib/netignite_core/src/netignite/Hex.h @@ -3,10 +3,18 @@ #include #include #include +#include +#include namespace netignite { /** Lower-case hex encoding. */ std::string toHex(const uint8_t* data, size_t length); +/** Decodes hex (either case). False for odd lengths or other characters. */ +bool fromHex(std::string_view text, std::vector& out); + +/** Standard base64; without `=` padding if `pad` is false (OpenSSH fingerprints). */ +std::string toBase64(const uint8_t* data, size_t length, bool pad = true); + } // namespace netignite diff --git a/lib/netignite_core/src/netignite/LogRing.cpp b/lib/netignite_core/src/netignite/LogRing.cpp new file mode 100644 index 0000000..c99f671 --- /dev/null +++ b/lib/netignite_core/src/netignite/LogRing.cpp @@ -0,0 +1,39 @@ +#include "netignite/LogRing.h" + +namespace netignite { + +void LogRing::push(std::string_view line) { + if (line.size() > MAX_LINE) line = line.substr(0, MAX_LINE); + lines_.emplace_back(line); + bytes_ += line.size(); + + while (bytes_ > capacity_ && !lines_.empty()) { + bytes_ -= lines_.front().size(); + lines_.pop_front(); + firstSeq_++; + } +} + +LogRing::ReadResult LogRing::read(uint32_t from, size_t maxBytes, std::vector& out) const { + ReadResult result; + // Sequence numbers wrap after 2^32 lines; compare by distance. + uint32_t start = from; + if (static_cast(from - firstSeq_) < 0) { + result.dropped = firstSeq_ - from; + start = firstSeq_; + } + if (static_cast(start - nextSeq()) > 0) start = nextSeq(); + + size_t used = 0; + uint32_t seq = start; + for (size_t i = start - firstSeq_; i < lines_.size(); i++, seq++) { + const std::string& line = lines_[i]; + if (used > 0 && used + line.size() > maxBytes) break; + out.push_back(line); + used += line.size(); + } + result.next = seq; + return result; +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/LogRing.h b/lib/netignite_core/src/netignite/LogRing.h new file mode 100644 index 0000000..747fd0c --- /dev/null +++ b/lib/netignite_core/src/netignite/LogRing.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace netignite { + +/** + * The most recent log lines, up to a byte budget, for the dashboard's console. Every line gets a + * sequence number, so a reader can continue where it stopped and learn how many lines it missed. + * Not thread-safe; the caller locks. + */ +class LogRing { + public: + /** Longer lines are cut. */ + static constexpr size_t MAX_LINE = 240; + + explicit LogRing(size_t capacityBytes) : capacity_(capacityBytes) {} + + void push(std::string_view line); + + /** Sequence number the next pushed line gets. */ + uint32_t nextSeq() const { return firstSeq_ + static_cast(lines_.size()); } + + struct ReadResult { + /** Where to continue reading. */ + uint32_t next = 0; + /** Lines between `from` and the oldest stored line that were already dropped. */ + uint32_t dropped = 0; + }; + + /** Appends lines from sequence `from` on to `out`, at most `maxBytes` of text. */ + ReadResult read(uint32_t from, size_t maxBytes, std::vector& out) const; + + size_t bytes() const { return bytes_; } + + private: + size_t capacity_; + size_t bytes_ = 0; + uint32_t firstSeq_ = 0; + std::deque lines_; +}; + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/Protocol.cpp b/lib/netignite_core/src/netignite/Protocol.cpp index 2f39f9c..d26deea 100644 --- a/lib/netignite_core/src/netignite/Protocol.cpp +++ b/lib/netignite_core/src/netignite/Protocol.cpp @@ -1,5 +1,11 @@ #include "netignite/Protocol.h" +#include + +#include "netignite/Hex.h" +#include "netignite/ServerUrl.h" +#include "netignite/Validation.h" + namespace netignite::protocol { namespace { @@ -12,6 +18,30 @@ bool readPort(JsonVariantConst value, uint16_t& out, bool allowZero) { return true; } +/** An absolute server path without `//`, `..`, query or fragment. */ +bool safePath(std::string_view path) { + if (path.empty() || path.size() > 200 || path[0] != '/' || path.find("//") != std::string_view::npos || + path.find("..") != std::string_view::npos) { + return false; + } + for (char c : path) { + const bool ok = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '/' || + c == '.' || c == '_' || c == '-' || c == '~' || c == '+'; + if (!ok) return false; + } + return true; +} + +bool safeVersion(std::string_view version) { + if (version.empty() || version.size() > 64) return false; + for (char c : version) { + const bool ok = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.' || + c == '-' || c == '+'; + if (!ok) return false; + } + return true; +} + std::string serialize(const JsonDocument& doc) { std::string out; serializeJson(doc, out); @@ -170,4 +200,248 @@ bool parseStatusRequest(JsonObjectConst payload, StatusRequest& out, std::string return true; } +bool parseOtaRequest(JsonObjectConst payload, OtaRequest& out, std::string& error) { + out = OtaRequest{}; + + const char* version = payload["version"]; + if (!version || !safeVersion(version)) { + error = "Invalid version"; + return false; + } + out.version = version; + + const char* path = payload["path"]; + if (!path || !safePath(path)) { + error = "Invalid download path"; + return false; + } + out.path = path; + + JsonVariantConst size = payload["size"]; + if (!size.is() || size.as() <= 0 || size.as() > MAX_FIRMWARE_SIZE) { + error = "Invalid size (the image must fit into an OTA slot)"; + return false; + } + out.size = static_cast(size.as()); + + const char* sha256 = payload["sha256"]; + std::vector digest; + if (!sha256 || !fromHex(sha256, digest) || digest.size() != out.sha256.size()) { + error = "Invalid SHA-256"; + return false; + } + std::copy(digest.begin(), digest.end(), out.sha256.begin()); + + JsonVariantConst signature = payload["signature"]; + if (!signature.isNull()) { + const char* text = signature.as(); + // DER-encoded ECDSA P-256 signatures are 70–72 bytes. + if (!text || !fromHex(text, out.signature) || out.signature.size() < 8 || out.signature.size() > 80) { + error = "Invalid signature"; + return false; + } + } + return true; +} + +bool parseConfigRequest(JsonObjectConst payload, ConfigRequest& out, std::string& error) { + out = ConfigRequest{}; + + JsonVariantConst server = payload["server_url"]; + if (!server.isNull()) { + const char* text = server.as(); + const auto parsed = text ? parseServerUrl(text) : std::nullopt; + if (!parsed) { + error = "Invalid server URL"; + return false; + } + out.serverUrl = parsed->url(""); + } + + JsonVariantConst name = payload["name"]; + if (!name.isNull()) { + const char* text = name.as(); + if (!text || !isValidHostname(text)) { + error = "Invalid name (letters, digits and -, max. 63)"; + return false; + } + out.name = text; + } + + JsonVariantConst level = payload["log_level"]; + if (!level.isNull()) { + const char* text = level.as(); + const std::string_view l = text ? text : ""; + if (l != "error" && l != "warn" && l != "info" && l != "debug") { + error = "Invalid log level"; + return false; + } + out.logLevel = std::string(l); + } + + if (!payload["ip"].isNull()) { + JsonObjectConst ip = payload["ip"]; + const char* mode = ip["mode"]; + ConfigRequest::Ip config; + if (mode && std::string_view(mode) == "dhcp") { + out.ip = config; + } else if (mode && std::string_view(mode) == "static") { + config.isStatic = true; + const char* const fields[] = {"address", "gateway", "netmask", "dns1", "dns2"}; + std::string* const targets[] = {&config.address, &config.gateway, &config.netmask, &config.dns1, + &config.dns2}; + for (size_t i = 0; i < 5; i++) { + const char* value = ip[fields[i]]; + if (!value || !*value) { + // address, gateway and netmask are required. + if (i < 3) { + error = std::string("Missing ") + fields[i]; + return false; + } + continue; + } + if (!isValidIpv4(value)) { + error = std::string("Invalid ") + fields[i]; + return false; + } + *targets[i] = value; + } + out.ip = config; + } else { + error = "Invalid IP mode (dhcp or static)"; + return false; + } + } + + if (!out.serverUrl && !out.name && !out.logLevel && !out.ip) { + error = "Nothing to change"; + return false; + } + return true; +} + +namespace { + +bool usernameChar(char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.' || c == '_' || + c == '@' || c == '\\' || c == '-'; +} + +bool base64Char(char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '+' || c == '/'; +} + +} // namespace + +bool parseSshRequest(JsonObjectConst payload, bool exec, SshRequest& out, std::string& error) { + out = SshRequest{}; + + const char* host = payload["host"]; + const std::string_view h = host ? host : ""; + bool hostOk = !h.empty() && h.size() <= 253; + for (char c : h) hostOk = hostOk && static_cast(c) > ' ' && c != '/' && c != '@'; + if (!hostOk) { + error = "Invalid host"; + return false; + } + out.host = std::string(h); + + if (!readPort(payload["port"], out.port, false)) { + error = "Invalid port"; + return false; + } + + const char* username = payload["username"]; + const std::string_view u = username ? username : ""; + bool userOk = !u.empty() && u.size() <= 64; + for (char c : u) userOk = userOk && usernameChar(c); + if (!userOk) { + error = "Invalid username"; + return false; + } + out.username = std::string(u); + + JsonObjectConst auth = payload["auth"]; + const char* type = auth["type"]; + const char* secret = nullptr; + if (type && std::string_view(type) == "password") { + out.auth = SshRequest::Auth::Password; + secret = auth["password"]; + } else if (type && std::string_view(type) == "key") { + out.auth = SshRequest::Auth::Key; + secret = auth["private_key"]; + } else { + error = "Unknown auth type"; + return false; + } + if (!secret || !*secret || std::string_view(secret).size() > 8192) { + error = "Missing password or key"; + return false; + } + out.secret = secret; + + JsonVariantConst hostKey = payload["host_key"]; + if (!hostKey.isNull()) { + const char* text = hostKey.as(); + const std::string_view k = text ? text : ""; + bool keyOk = k.size() == 50 && k.substr(0, 7) == "SHA256:"; + for (size_t i = 7; keyOk && i < k.size(); i++) keyOk = base64Char(k[i]); + if (!keyOk) { + error = "Invalid host key fingerprint"; + return false; + } + out.hostKey = std::string(k); + } + + if (!exec) return true; + + if (out.hostKey.empty()) { + error = "A trusted host key is required"; + return false; + } + const char* action = payload["action"]; + if (action && std::string_view(action) == "shutdown") { + out.action = SshRequest::Action::Shutdown; + } else if (action && std::string_view(action) == "reboot") { + out.action = SshRequest::Action::Reboot; + } else { + error = "Unknown action"; + return false; + } + const char* os = payload["os"]; + if (os && std::string_view(os) == "windows") { + out.windows = true; + } else if (!os || std::string_view(os) != "posix") { + error = "Unknown operating system"; + return false; + } + JsonVariantConst sudo = payload["sudo"]; + if (!sudo.is()) { + error = "sudo must be true or false"; + return false; + } + out.sudo = sudo.as(); + return true; +} + +std::string sshCommand(const SshRequest& request) { + const bool reboot = request.action == SshRequest::Action::Reboot; + if (request.windows) return reboot ? "shutdown /r /t 0" : "shutdown /s /t 0"; + return std::string(request.sudo ? "sudo -n " : "") + (reboot ? "shutdown -r now" : "shutdown -h now"); +} + +std::string sshFingerprint(const uint8_t sha256[32]) { + return "SHA256:" + toBase64(sha256, 32, false); +} + +bool parseLogSubscribe(JsonObjectConst payload, bool& enabled, std::string& error) { + JsonVariantConst value = payload["enabled"]; + if (!value.is()) { + error = "enabled must be true or false"; + return false; + } + enabled = value.as(); + return true; +} + } // namespace netignite::protocol diff --git a/lib/netignite_core/src/netignite/Protocol.h b/lib/netignite_core/src/netignite/Protocol.h index f13badf..45e6deb 100644 --- a/lib/netignite_core/src/netignite/Protocol.h +++ b/lib/netignite_core/src/netignite/Protocol.h @@ -2,9 +2,12 @@ #include +#include #include +#include #include #include +#include #include "netignite/Mac.h" @@ -18,6 +21,9 @@ * {"t":"res","id":7,"ok":true,"p":{...}} agent → server, same id * {"t":"res","id":7,"ok":false,"err":"..."} * {"t":"evt","cmd":"HELLO","p":{...}} agent → server, first frame + * + * Requests: PING, WAKE, STATUS, OTA_BEGIN, LOG_SUBSCRIBE, GET_LOGS, GET_INFO, CONFIG_SET, REBOOT, + * FACTORY_RESET, SSH_CHECK, SSH_EXEC. Events: HELLO, LOG, OTA_PROGRESS. */ namespace netignite::protocol { @@ -25,7 +31,14 @@ constexpr int VERSION = 2; constexpr const char* AGENT_KIND = "esp32"; /** Capabilities this firmware announces in HELLO. */ -constexpr const char* CAPABILITIES[] = {"wake", "status.link_local", "status.ip", "status.host", "status.tcp"}; +constexpr const char* CAPABILITIES[] = { + "wake", "status.link_local", "status.ip", "status.host", "status.tcp", + "ota", "logs", "config", "device.reboot", "device.reset", + "ssh", +}; + +/** Largest firmware image: one OTA slot in partitions.csv. */ +constexpr uint32_t MAX_FIRMWARE_SIZE = 0x1E0000; enum class FrameType { Invalid, Request, Response, Event }; @@ -65,4 +78,69 @@ struct StatusRequest { bool parseStatusRequest(JsonObjectConst payload, StatusRequest& out, std::string& error); +/** + * OTA_BEGIN: download `path` from the agent's own server (with its agent credential) and install + * it if size and SHA-256 match, and the signature if the firmware has a public key compiled in. + */ +struct OtaRequest { + std::string version; + /** Absolute path on the server, e.g. `/api/v1/firmware/2.1.0/files/firmware.bin`. */ + std::string path; + uint32_t size = 0; + std::array sha256{}; + /** DER-encoded ECDSA P-256 signature of the image; empty for unsigned releases. */ + std::vector signature; +}; + +bool parseOtaRequest(JsonObjectConst payload, OtaRequest& out, std::string& error); + +/** CONFIG_SET: only the fields present change. */ +struct ConfigRequest { + struct Ip { + bool isStatic = false; + std::string address, gateway, netmask, dns1, dns2; + }; + /** Normalized (`ServerUrl::url("")`). */ + std::optional serverUrl; + std::optional name; + /** `error`, `warn`, `info` or `debug`. */ + std::optional logLevel; + std::optional ip; +}; + +bool parseConfigRequest(JsonObjectConst payload, ConfigRequest& out, std::string& error); + +/** LOG_SUBSCRIBE `{ "enabled": bool }`. */ +bool parseLogSubscribe(JsonObjectConst payload, bool& enabled, std::string& error); + +/** + * SSH_CHECK (log in, no session) and SSH_EXEC (log in with a trusted host key and run the fixed + * shutdown or reboot command). The secret is a password or an OpenSSH private key. + */ +struct SshRequest { + enum class Auth { Password, Key }; + enum class Action { Shutdown, Reboot }; + + std::string host; + uint16_t port = 22; + std::string username; + Auth auth = Auth::Password; + std::string secret; + /** Trusted host key fingerprint (`SHA256:...`), or empty. Required for SSH_EXEC. */ + std::string hostKey; + + // SSH_EXEC only + Action action = Action::Shutdown; + bool windows = false; + bool sudo = false; +}; + +bool parseSshRequest(JsonObjectConst payload, bool exec, SshRequest& out, std::string& error); + +/** The command SSH_EXEC runs: `[sudo -n ]shutdown -h|-r now`, or `shutdown /s|/r /t 0`. */ +std::string sshCommand(const SshRequest& request); + +/** OpenSSH's fingerprint of a host key from its SHA-256: `SHA256:` + unpadded base64. */ +std::string sshFingerprint(const uint8_t sha256[32]); + } // namespace netignite::protocol diff --git a/lib/netignite_core/src/netignite/Validation.cpp b/lib/netignite_core/src/netignite/Validation.cpp new file mode 100644 index 0000000..ccc387c --- /dev/null +++ b/lib/netignite_core/src/netignite/Validation.cpp @@ -0,0 +1,38 @@ +#include "netignite/Validation.h" + +#include + +namespace netignite { + +bool isValidHostname(std::string_view name) { + if (name.empty() || name.size() > 63 || name.front() == '-' || name.back() == '-') return false; + for (char c : name) { + if (!std::isalnum(static_cast(c)) && c != '-') return false; + } + return true; +} + +bool isValidIpv4(std::string_view text) { + int parts = 0; + size_t start = 0; + while (true) { + const size_t end = text.find('.', start); + const std::string_view part = + end == std::string_view::npos ? text.substr(start) : text.substr(start, end - start); + if (part.empty() || part.size() > 3 || (part.size() > 1 && part[0] == '0')) return false; + + int value = 0; + for (char c : part) { + if (c < '0' || c > '9') return false; + value = value * 10 + (c - '0'); + } + if (value > 255) return false; + + parts++; + if (end == std::string_view::npos) break; + start = end + 1; + } + return parts == 4; +} + +} // namespace netignite diff --git a/lib/netignite_core/src/netignite/Validation.h b/lib/netignite_core/src/netignite/Validation.h new file mode 100644 index 0000000..295103a --- /dev/null +++ b/lib/netignite_core/src/netignite/Validation.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace netignite { + +/** A network host name label: letters, digits and `-`, 1–63 characters, no `-` at either end. */ +bool isValidHostname(std::string_view name); + +/** A dotted-quad IPv4 address (`192.168.1.5`); no leading zeros, no shorthand forms. */ +bool isValidIpv4(std::string_view text); + +} // namespace netignite diff --git a/platformio.ini b/platformio.ini index 3c50b99..0bcc287 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,6 +17,8 @@ board_build.partitions = partitions.csv lib_deps = links2004/WebSockets@2.7.3 bblanchon/ArduinoJson@7.4.3 + ; SSH logins to devices (SSH_CHECK, SSH_EXEC); libssh 0.11 with the mbedTLS backend, LGPL. + ewpa/LibSSH-ESP32@5.10.0 monitor_speed = 115200 monitor_filters = esp32_exception_decoder build_unflags = -std=gnu++11 @@ -24,10 +26,14 @@ build_flags = -std=gnu++17 -Wall -DCORE_DEBUG_LEVEL=0 -; Generate the trusted root certificate bundle and the firmware version before building. +; Generate the trusted root certificate bundle, the firmware version and the OTA signing key +; header before building. extra_scripts = pre:data/cert/run_gen_script.py pre:scripts/version.py + pre:scripts/signing_key.py +; With this file (scripts/generate_signing_key.sh) the firmware only installs signed OTA updates. +custom_signing_key = keys/firmware-signing.pub.pem board_build.embed_files = data/cert/x509_crt_bundle.bin @@ -38,6 +44,8 @@ extends = env:esp32dev build_flags = ${env:esp32dev.build_flags} -DNETIGNITE_EMULATOR +; A test key (its private half is in the repository), so the emulator test can sign updates. +custom_signing_key = test/emulator/keys/emulator-test.pub.pem [env:native] ; Host-side unit tests for the parts that don't need hardware (parsers, encoders). diff --git a/scripts/signing_key.py b/scripts/signing_key.py new file mode 100644 index 0000000..e88630e --- /dev/null +++ b/scripts/signing_key.py @@ -0,0 +1,54 @@ +""" +PlatformIO pre-build script: compiles the OTA signing public key into the firmware. + +Generates `netignite_signing_key.h` in the build directory. If the environment's +`custom_signing_key` (a PEM ECDSA P-256 public key, see scripts/generate_signing_key.sh) exists, +the header defines NETIGNITE_OTA_PUBLIC_KEY and the firmware then only installs OTA updates with a +valid signature. Without the file, updates are checked by SHA-256 only. + +The emulator environment uses a test key whose private half is in the repository +(test/emulator/keys); it is refused for any other environment. +""" + +import os + +Import("env") # noqa: F821 - provided by PlatformIO (SCons) + +project_dir = env.subst("$PROJECT_DIR") # noqa: F821 +key_option = env.GetProjectOption("custom_signing_key", "").strip() # noqa: F821 +key_path = os.path.join(project_dir, key_option) if key_option else "" +build_flags = env.GetProjectOption("build_flags", []) # noqa: F821 +if isinstance(build_flags, str): + build_flags = [build_flags] +is_emulator = any("NETIGNITE_EMULATOR" in flag for flag in build_flags) + +out_dir = os.path.join(env.subst("$BUILD_DIR"), "generated") # noqa: F821 +os.makedirs(out_dir, exist_ok=True) +header = os.path.join(out_dir, "netignite_signing_key.h") + +lines = [ + "#pragma once", + "// Generated by scripts/signing_key.py. Do not edit.", +] + +if key_path and os.path.isfile(key_path): + if "test" in os.path.relpath(key_path, project_dir).replace("\\", "/").split("/") and not is_emulator: + raise SystemExit(f"Refusing to build {env.subst('$PIOENV')} with the test signing key {key_option}") # noqa: F821 + with open(key_path, "r", encoding="ascii") as handle: + pem = handle.read().strip() + "\n" + if "BEGIN PUBLIC KEY" not in pem: + raise SystemExit(f"{key_option} isn't a PEM public key") + escaped = pem.replace("\\", "\\\\").replace('"', '\\"').replace("\n", "\\n") + lines.append(f'#define NETIGNITE_OTA_PUBLIC_KEY "{escaped}"') + print(f"OTA updates must be signed with the key for {key_option}") +else: + if key_option: + print(f"No {key_option}: OTA updates are checked by SHA-256 only (no signature)") + +new_content = "\n".join(lines) + "\n" +old_content = open(header, encoding="ascii").read() if os.path.exists(header) else None +if new_content != old_content: + with open(header, "w", encoding="ascii", newline="\n") as handle: + handle.write(new_content) + +env.Append(CPPPATH=[out_dir]) # noqa: F821 diff --git a/src/Config.h b/src/Config.h index c14f669..043298f 100644 --- a/src/Config.h +++ b/src/Config.h @@ -34,6 +34,9 @@ constexpr const char* NETMASK = "netmask"; constexpr const char* DNS1 = "dns1"; constexpr const char* DNS2 = "dns2"; constexpr const char* LOG_LEVEL = "log_level"; +/** Version and partition of an installed update until it confirms itself (ota/Rollback.h). */ +constexpr const char* OTA_VERSION = "ota_ver"; +constexpr const char* OTA_PARTITION = "ota_part"; } // namespace keys constexpr uint32_t SERIAL_BAUD = 115200; @@ -57,6 +60,28 @@ constexpr uint32_t STATUS_BUDGET_MS = 4500; constexpr uint32_t PING_TIMEOUT_MS = 1000; constexpr uint32_t TCP_TIMEOUT_MS = 1500; +/** + * OTA: a new firmware goes back to the previous one unless it reaches the server within this + * time. Short in emulator builds, which can't reach a server, so the test sees the rollback. + */ +#ifdef NETIGNITE_EMULATOR +constexpr uint32_t OTA_CONFIRM_TIMEOUT_MS = 20000; +#else +constexpr uint32_t OTA_CONFIRM_TIMEOUT_MS = 5 * 60 * 1000; +#endif +/** OTA: the download needs a second TLS session; below this the server connection is closed first. */ +constexpr uint32_t OTA_MIN_FREE_BLOCK = 50000; + +/** + * CONFIG_SET: a new server URL or IP setting is only saved once the agent reaches the server with + * it; otherwise the agent restarts with the previous settings after this time. + */ +constexpr uint32_t CONFIG_TRIAL_MS = 120000; + +/** Console: log lines are sent to the server in batches of at most this size, this often. */ +constexpr size_t LOG_EVENT_MAX_BYTES = 6000; +constexpr uint32_t LOG_EVENT_INTERVAL_MS = 300; + /** Wake-on-LAN: rounds of packets per request, and the pause between them. */ constexpr int WOL_ROUNDS = 3; constexpr uint32_t WOL_ROUND_DELAY_MS = 100; diff --git a/src/agent/AgentClient.cpp b/src/agent/AgentClient.cpp index 929d344..b0fb249 100644 --- a/src/agent/AgentClient.cpp +++ b/src/agent/AgentClient.cpp @@ -2,29 +2,31 @@ #include #include -#include -#include -#include #include "Config.h" #include "core/CaBundle.h" #include "core/DeviceInfo.h" #include "core/Log.h" #include "net/WakeSender.h" -#include "netignite/Protocol.h" +#include "ota/OtaWriter.h" +#include "ota/Rollback.h" namespace protocol = netignite::protocol; -void AgentClient::begin() { +void AgentClient::begin(Hooks hooks) { + hooks_ = std::move(hooks); worker_.begin(); + ssh_.begin(); ws_.onEvent([this](WStype_t type, uint8_t* payload, size_t length) { onEvent(type, payload, length); }); } void AgentClient::start(const netignite::ServerUrl& server, const String& tokenId, const String& secret) { stop(); + server_ = server; const std::string path = server.path("/ws/agent"); - authHeader_ = std::string("Authorization: Bearer netignite_agent_") + tokenId.c_str() + ":" + secret.c_str(); + authorization_ = std::string("Bearer netignite_agent_") + tokenId.c_str() + ":" + secret.c_str(); + authHeader_ = "Authorization: " + authorization_; // An empty subprotocol: the server doesn't negotiate one. if (server.secure) { @@ -47,6 +49,7 @@ void AgentClient::stop() { ws_.disconnect(); connected_ = false; helloSent_ = false; + logSubscribed_ = false; generation_++; } @@ -57,7 +60,14 @@ AgentClient::State AgentClient::state() const { void AgentClient::loop() { if (!running_) return; - ws_.loop(); + + // While an update downloads with the connection paused, don't reconnect. + if (otaPausedConnection_ && ota_.busy()) { + if (connected_) ws_.disconnect(); + } else { + otaPausedConnection_ = false; + ws_.loop(); + } StatusWorker::Done done; while (worker_.poll(done)) { @@ -71,6 +81,28 @@ void AgentClient::loop() { } } + SshWorker::Done ssh; + while (ssh_.poll(ssh)) { + if (ssh.generation != generation_ || !connected_) continue; + if (!ssh.ok) { + send(protocol::encodeError(ssh.requestId, ssh.error)); + } else if (ssh.exec) { + send(protocol::encodeEmptyResponse(ssh.requestId)); + } else { + JsonDocument payload; + payload["online"] = ssh.online; + if (ssh.online) { + if (ssh.hostKey[0] != '\0') payload["host_key"] = ssh.hostKey; + payload["authenticated"] = ssh.authenticated; + if (ssh.checkError[0] != '\0') payload["error"] = ssh.checkError; + } + send(protocol::encodeResponse(ssh.requestId, payload.as())); + } + } + + reportOta(); + if (logSubscribed_ && connected_ && millis() - lastLogSentAt_ >= config::LOG_EVENT_INTERVAL_MS) sendLogs(); + // The server pings every 30 s; silence means the connection is dead even if TCP doesn't know. if (connected_ && millis() - lastFrameAt_ > config::SERVER_SILENCE_TIMEOUT_MS) { Log::warn("No message from the server for %lu s, reconnecting", @@ -83,6 +115,7 @@ void AgentClient::onEvent(WStype_t type, uint8_t* payload, size_t length) { switch (type) { case WStype_CONNECTED: connected_ = true; + confirmed_ = false; generation_++; lastFrameAt_ = millis(); reconnectInterval_ = config::RECONNECT_MIN_MS; @@ -92,7 +125,7 @@ void AgentClient::onEvent(WStype_t type, uint8_t* payload, size_t length) { case WStype_DISCONNECTED: if (connected_) { - Log::warn("Disconnected from the server"); + if (!otaPausedConnection_) Log::warn("Disconnected from the server"); } else { Log::warn("Couldn't connect to the server, retrying in %lu s", static_cast(reconnectInterval_ / 1000)); @@ -102,6 +135,7 @@ void AgentClient::onEvent(WStype_t type, uint8_t* payload, size_t length) { } connected_ = false; helloSent_ = false; + logSubscribed_ = false; generation_++; break; @@ -124,6 +158,13 @@ void AgentClient::onEvent(WStype_t type, uint8_t* payload, size_t length) { } } +void AgentClient::fillInfo(JsonObject info) { + deviceInfo::fill(info, settings_, wifi_); + info["signed_updates"] = OtaWriter::requiresSignature(); + if (rollback::pending()) info["ota_probation"] = true; + if (rollback::failedUpdate().length() > 0) info["ota_failed_version"] = rollback::failedUpdate(); +} + void AgentClient::sendHello() { JsonDocument hello; hello["protocol"] = protocol::VERSION; @@ -133,8 +174,7 @@ void AgentClient::sendHello() { JsonArray capabilities = hello["capabilities"].to(); for (const char* capability : protocol::CAPABILITIES) capabilities.add(capability); - JsonObject info = hello["info"].to(); - deviceInfo::fill(info, settings_, wifi_); + fillInfo(hello["info"].to()); send(protocol::encodeEvent("HELLO", hello.as())); helloSent_ = true; @@ -146,6 +186,44 @@ void AgentClient::send(const std::string& frame) { ws_.sendTXT(frame.c_str(), frame.size()); } +void AgentClient::sendLogs() { + lastLogSentAt_ = millis(); + std::vector lines; + const auto result = Log::read(logCursor_, config::LOG_EVENT_MAX_BYTES, lines); + logCursor_ = result.next; + if (lines.empty() && result.dropped == 0) return; + + JsonDocument payload; + JsonArray array = payload["lines"].to(); + for (const std::string& line : lines) array.add(line); + if (result.dropped > 0) payload["dropped"] = result.dropped; + send(protocol::encodeEvent("LOG", payload.as())); +} + +void AgentClient::reportOta() { + const OtaUpdater::Progress progress = ota_.progress(); + if (progress.state == OtaUpdater::State::Idle) return; + + const bool finished = progress.state != OtaUpdater::State::Downloading; + const bool changed = progress.revision != otaReportedRevision_; + if (changed && connected_ && helloSent_ && (finished || millis() - otaReportedAt_ >= 1000)) { + otaReportedRevision_ = progress.revision; + otaReportedAt_ = millis(); + + JsonDocument payload; + payload["version"] = progress.version; + payload["state"] = OtaUpdater::stateName(progress.state); + payload["percent"] = progress.percent; + if (!progress.error.empty()) payload["error"] = progress.error; + send(protocol::encodeEvent("OTA_PROGRESS", payload.as())); + } + + if (progress.state == OtaUpdater::State::Installed && !otaInstalledHandled_) { + otaInstalledHandled_ = true; + if (hooks_.updateInstalled) hooks_.updateInstalled(progress.version); + } +} + void AgentClient::handleText(std::string_view text) { JsonDocument doc; protocol::Frame frame; @@ -157,14 +235,26 @@ void AgentClient::handleText(std::string_view text) { } if (frame.type != protocol::FrameType::Request) return; + // The server only sends requests after accepting the credential and HELLO. + if (!confirmed_) { + confirmed_ = true; + if (hooks_.serverConfirmed) hooks_.serverConfirmed(); + } + Log::debug("Request %lu: %s", static_cast(frame.id), frame.cmd.c_str()); + handleRequest(frame); +} + +void AgentClient::handleRequest(const protocol::Frame& frame) { + std::string error; + const std::string& cmd = frame.cmd; - if (frame.cmd == "PING") { + if (cmd == "PING") { send(protocol::encodeEmptyResponse(frame.id)); return; } - if (frame.cmd == "WAKE") { + if (cmd == "WAKE") { protocol::WakeRequest wake; if (!protocol::parseWakeRequest(frame.payload, wake, error)) { send(protocol::encodeError(frame.id, error)); @@ -179,7 +269,7 @@ void AgentClient::handleText(std::string_view text) { return; } - if (frame.cmd == "STATUS") { + if (cmd == "STATUS") { protocol::StatusRequest status; if (!protocol::parseStatusRequest(frame.payload, status, error)) { send(protocol::encodeError(frame.id, error)); @@ -191,5 +281,93 @@ void AgentClient::handleText(std::string_view text) { return; } - send(protocol::encodeError(frame.id, "Unknown command " + frame.cmd)); + if (cmd == "SSH_CHECK" || cmd == "SSH_EXEC") { + const bool exec = cmd == "SSH_EXEC"; + protocol::SshRequest request; + if (!protocol::parseSshRequest(frame.payload, exec, request, error)) { + send(protocol::encodeError(frame.id, error)); + return; + } + if (!ssh_.submit(frame.id, generation_, exec, request)) { + send(protocol::encodeError(frame.id, "Another SSH login is running")); + } + return; + } + + if (cmd == "GET_INFO") { + JsonDocument payload; + payload["version"] = config::FIRMWARE_VERSION; + fillInfo(payload["info"].to()); + send(protocol::encodeResponse(frame.id, payload.as())); + return; + } + + if (cmd == "GET_LOGS" || cmd == "LOG_SUBSCRIBE") { + bool enabled = true; + if (cmd == "LOG_SUBSCRIBE" && !protocol::parseLogSubscribe(frame.payload, enabled, error)) { + send(protocol::encodeError(frame.id, error)); + return; + } + + JsonDocument payload; + if (enabled) { + // Everything stored so far; a subscription continues from there with LOG events. + std::vector lines; + const auto result = Log::read(0, Log::RING_BYTES, lines); + JsonArray array = payload["lines"].to(); + for (const std::string& line : lines) array.add(line); + payload["level"] = Log::levelName(Log::level()); + if (cmd == "LOG_SUBSCRIBE") logCursor_ = result.next; + } + if (cmd == "LOG_SUBSCRIBE") logSubscribed_ = enabled; + send(protocol::encodeResponse(frame.id, payload.as())); + return; + } + + if (cmd == "CONFIG_SET") { + protocol::ConfigRequest request; + if (!protocol::parseConfigRequest(frame.payload, request, error) || + !(hooks_.applyConfig && hooks_.applyConfig(request, error))) { + send(protocol::encodeError(frame.id, error.empty() ? "Can't change the configuration" : error)); + return; + } + send(protocol::encodeEmptyResponse(frame.id)); + return; + } + + if (cmd == "REBOOT" || cmd == "FACTORY_RESET") { + send(protocol::encodeEmptyResponse(frame.id)); + Log::info("%s requested by the server", cmd == "REBOOT" ? "Restart" : "Factory reset"); + if (hooks_.restart) hooks_.restart(cmd == "FACTORY_RESET"); + return; + } + + if (cmd == "OTA_BEGIN") { + protocol::OtaRequest request; + if (!protocol::parseOtaRequest(frame.payload, request, error)) { + send(protocol::encodeError(frame.id, error)); + return; + } + if (rollback::pending()) { + send(protocol::encodeError(frame.id, "The current firmware isn't confirmed yet; try again shortly")); + return; + } + + // Two TLS sessions at once (WebSocket + download) need memory; without it, pause the connection. + const bool pause = server_.secure && ESP.getMaxAllocHeap() < config::OTA_MIN_FREE_BLOCK; + if (!ota_.start(server_, authorization_, request, error)) { + send(protocol::encodeError(frame.id, error)); + return; + } + otaInstalledHandled_ = false; + send(protocol::encodeEmptyResponse(frame.id)); + if (pause) { + Log::info("Pausing the server connection during the download (largest free block: %lu bytes)", + static_cast(ESP.getMaxAllocHeap())); + otaPausedConnection_ = true; + } + return; + } + + send(protocol::encodeError(frame.id, "Unknown command " + cmd)); } diff --git a/src/agent/AgentClient.h b/src/agent/AgentClient.h index caa0670..16ad8af 100644 --- a/src/agent/AgentClient.h +++ b/src/agent/AgentClient.h @@ -3,47 +3,86 @@ #include #include +#include #include #include +#include "agent/SshWorker.h" #include "agent/StatusWorker.h" #include "net/WifiLink.h" +#include "netignite/Protocol.h" #include "netignite/ServerUrl.h" +#include "ota/OtaUpdater.h" /** * The connection to the NetIgnite server: one WebSocket to `/ws/agent` speaking protocol v2. - * Sends HELLO on connect and answers PING, WAKE and STATUS requests. + * Sends HELLO on connect and answers the server's requests (wake, status checks, OTA updates, + * logs, configuration, reboot, SSH logins to devices). */ class AgentClient { public: enum class State { Stopped, Connecting, Online }; + /** Device-wide actions, carried out by the main loop. */ + struct Hooks { + /** Validates and schedules a CONFIG_SET. False (with an error) if it can't be applied. */ + std::function applyConfig; + /** Restart soon (REBOOT); with `factoryReset`, erase all settings first. */ + std::function restart; + /** The server answered on this connection: the credential, server URL and network work. */ + std::function serverConfirmed; + /** An OTA update was installed; restart into it. */ + std::function updateInstalled; + }; + AgentClient(Settings& settings, WifiLink& wifi) : settings_(settings), wifi_(wifi) {} - void begin(); + void begin(Hooks hooks); void start(const netignite::ServerUrl& server, const String& tokenId, const String& secret); void stop(); void loop(); State state() const; bool running() const { return running_; } + const OtaUpdater& ota() const { return ota_; } private: Settings& settings_; WifiLink& wifi_; + Hooks hooks_; WebSocketsClient ws_; StatusWorker worker_; + SshWorker ssh_; + OtaUpdater ota_; + netignite::ServerUrl server_; bool running_ = false; bool connected_ = false; bool helloSent_ = false; + bool confirmed_ = false; uint32_t generation_ = 0; uint32_t reconnectInterval_ = 0; uint32_t lastFrameAt_ = 0; std::string authHeader_; + std::string authorization_; + + // Console log stream (LOG_SUBSCRIBE) + bool logSubscribed_ = false; + uint32_t logCursor_ = 0; + uint32_t lastLogSentAt_ = 0; + + // OTA: progress reported to the server; the connection is paused if memory is short. + uint32_t otaReportedRevision_ = 0; + uint32_t otaReportedAt_ = 0; + bool otaPausedConnection_ = false; + bool otaInstalledHandled_ = false; void onEvent(WStype_t type, uint8_t* payload, size_t length); void handleText(std::string_view text); + void handleRequest(const netignite::protocol::Frame& frame); void sendHello(); void send(const std::string& frame); + void sendLogs(); + void reportOta(); + void fillInfo(JsonObject info); }; diff --git a/src/agent/Enrollment.cpp b/src/agent/Enrollment.cpp index c397b30..ad78bab 100644 --- a/src/agent/Enrollment.cpp +++ b/src/agent/Enrollment.cpp @@ -51,6 +51,8 @@ Result enroll(const netignite::ServerUrl& server, const String& enrollmentToken) JsonDocument body; body["enrollment_token"] = enrollmentToken; body["secret"] = secret; + // The server refuses a token of a Linux agent (409) without using it up. + body["kind"] = netignite::protocol::AGENT_KIND; String payload; serializeJson(body, payload); @@ -68,7 +70,7 @@ Result enroll(const netignite::ServerUrl& server, const String& enrollmentToken) const bool parsed = !deserializeJson(answer, response); const char* message = parsed ? answer["message"].as() : nullptr; - if (status == 401 || status == 400) { + if (status == 401 || status == 400 || status == 409) { result.status = Result::Status::Rejected; result.message = message ? message : "Enrollment token rejected"; return result; diff --git a/src/agent/SshWorker.cpp b/src/agent/SshWorker.cpp new file mode 100644 index 0000000..55906e2 --- /dev/null +++ b/src/agent/SshWorker.cpp @@ -0,0 +1,200 @@ +#include "agent/SshWorker.h" + +#include +#include + +#include + +#include "core/Log.h" + +namespace protocol = netignite::protocol; + +namespace { + +constexpr uint32_t TASK_STACK = 40 * 1024; +constexpr long CONNECT_TIMEOUT_S = 5; +/** SSH_EXEC: how long to wait for the command's exit status (shutdown usually drops the link). */ +constexpr uint32_t EXEC_WAIT_MS = 5000; + +/** Overwrites a secret before its memory is freed. */ +void wipe(std::string& secret) { + volatile char* data = secret.data(); + for (size_t i = 0; i < secret.size(); i++) data[i] = 0; + secret.clear(); +} + +/** Closes the session on every path out of a login. */ +struct Session { + ssh_session session = ssh_new(); + ~Session() { + if (!session) return; + if (ssh_is_connected(session)) ssh_disconnect(session); + ssh_free(session); + } +}; + +} // namespace + +void SshWorker::begin() { + results_ = xQueueCreate(2, sizeof(Done)); + libssh_begin(); +} + +bool SshWorker::submit(uint32_t requestId, uint32_t generation, bool exec, const protocol::SshRequest& request) { + bool expected = false; + if (!busy_.compare_exchange_strong(expected, true)) return false; + + auto* job = new Job{this, requestId, generation, exec, request}; + if (xTaskCreate(run, "ssh", TASK_STACK, job, 1, nullptr) != pdPASS) { + wipe(job->request.secret); + delete job; + busy_ = false; + return false; + } + return true; +} + +bool SshWorker::poll(Done& out) { + return results_ && xQueueReceive(results_, &out, 0) == pdTRUE; +} + +void SshWorker::run(void* arg) { + auto* job = static_cast(arg); + + Done done = {}; + done.requestId = job->requestId; + done.generation = job->generation; + done.exec = job->exec; + login(*job, done); + + SshWorker* worker = job->worker; + wipe(job->request.secret); + delete job; + + xQueueSend(worker->results_, &done, portMAX_DELAY); + worker->busy_ = false; + vTaskDelete(nullptr); +} + +void SshWorker::login(const Job& job, Done& done) { + const protocol::SshRequest& request = job.request; + auto fail = [&done](const char* message) { + done.ok = false; + strlcpy(done.error, message, sizeof(done.error)); + }; + + Log::info("SSH %s: %s@%s:%u", job.exec ? "command" : "check", request.username.c_str(), request.host.c_str(), + request.port); + + Session ssh; + if (!ssh.session) return fail("Not enough memory for SSH"); + + int port = request.port; + long timeout = CONNECT_TIMEOUT_S; + bool processConfig = false; + ssh_options_set(ssh.session, SSH_OPTIONS_HOST, request.host.c_str()); + ssh_options_set(ssh.session, SSH_OPTIONS_PORT, &port); + ssh_options_set(ssh.session, SSH_OPTIONS_USER, request.username.c_str()); + ssh_options_set(ssh.session, SSH_OPTIONS_TIMEOUT, &timeout); + ssh_options_set(ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &processConfig); + + if (ssh_connect(ssh.session) != SSH_OK) { + if (!job.exec) { + // The SSH port didn't accept a connection: the device is offline (for this check). + done.ok = true; + done.online = false; + return; + } + return fail((std::string("Can't connect: ") + ssh_get_error(ssh.session)).c_str()); + } + done.online = true; + + // The host key, before any credential is sent. + ssh_key serverKey = nullptr; + unsigned char* hash = nullptr; + size_t hashLength = 0; + if (ssh_get_server_publickey(ssh.session, &serverKey) != SSH_OK || + ssh_get_publickey_hash(serverKey, SSH_PUBLICKEY_HASH_SHA256, &hash, &hashLength) != SSH_OK || hashLength != 32) { + ssh_key_free(serverKey); + ssh_clean_pubkey_hash(&hash); + return fail("Can't read the device's host key"); + } + const std::string hostKey = protocol::sshFingerprint(hash); + ssh_clean_pubkey_hash(&hash); + ssh_key_free(serverKey); + strlcpy(done.hostKey, hostKey.c_str(), sizeof(done.hostKey)); + + if (!request.hostKey.empty() && hostKey != request.hostKey) { + Log::warn("SSH: %s presented another host key (%s)", request.host.c_str(), hostKey.c_str()); + if (job.exec) return fail("host key changed"); + done.ok = true; + strlcpy(done.checkError, "host_key_mismatch", sizeof(done.checkError)); + return; + } + + int auth = SSH_AUTH_ERROR; + if (request.auth == protocol::SshRequest::Auth::Password) { + auth = ssh_userauth_password(ssh.session, nullptr, request.secret.c_str()); + } else { + ssh_key key = nullptr; + if (ssh_pki_import_privkey_base64(request.secret.c_str(), nullptr, nullptr, nullptr, &key) != SSH_OK) { + return fail("The private key can't be read"); + } + auth = ssh_userauth_publickey(ssh.session, nullptr, key); + ssh_key_free(key); + } + if (auth != SSH_AUTH_SUCCESS) { + if (job.exec) return fail("authentication failed"); + done.ok = true; + strlcpy(done.checkError, "auth_failed", sizeof(done.checkError)); + return; + } + done.authenticated = true; + + if (!job.exec) { + // Log in only: never open a session, so forced commands in authorized_keys don't run. + done.ok = true; + return; + } + + ssh_channel channel = ssh_channel_new(ssh.session); + if (!channel || ssh_channel_open_session(channel) != SSH_OK) { + if (channel) ssh_channel_free(channel); + return fail("The device refused a session"); + } + const std::string command = protocol::sshCommand(request); + if (ssh_channel_request_exec(channel, command.c_str()) != SSH_OK) { + ssh_channel_free(channel); + return fail("The device refused the command"); + } + + // Wait for the exit status. Shutdown often drops the connection first: that counts as success. + std::string stderrText; + char buffer[128]; + bool eof = false; + const uint32_t start = millis(); + while (millis() - start < EXEC_WAIT_MS) { + const int err = ssh_channel_read_timeout(channel, buffer, sizeof(buffer), 1, 200); + if (err > 0 && stderrText.size() < 200) stderrText.append(buffer, std::min(err, 200 - stderrText.size())); + const int out = ssh_channel_read_timeout(channel, buffer, sizeof(buffer), 0, 50); + if (err == SSH_ERROR || out == SSH_ERROR || !ssh_is_connected(ssh.session)) break; + if (ssh_channel_is_eof(channel)) { + eof = true; + break; + } + } + + uint32_t exitCode = 0; + const bool exited = eof && ssh_channel_get_exit_state(channel, &exitCode, nullptr, nullptr) == SSH_OK; + ssh_channel_free(channel); + + if (exited && exitCode != 0) { + while (!stderrText.empty() && (stderrText.back() == '\n' || stderrText.back() == '\r')) stderrText.pop_back(); + const std::string message = + "Exit code " + std::to_string(exitCode) + (stderrText.empty() ? std::string() : ": " + stderrText); + Log::warn("SSH: %s failed: %s", command.c_str(), message.c_str()); + return fail(message.c_str()); + } + Log::info("SSH: ran \"%s\" on %s", command.c_str(), request.host.c_str()); + done.ok = true; +} diff --git a/src/agent/SshWorker.h b/src/agent/SshWorker.h new file mode 100644 index 0000000..b2118c0 --- /dev/null +++ b/src/agent/SshWorker.h @@ -0,0 +1,51 @@ +#pragma once + +#include + +#include + +#include "netignite/Protocol.h" + +/** + * Runs SSH_CHECK and SSH_EXEC with libssh, one at a time, each in a task of its own (libssh needs + * a large stack, which is only allocated while a login runs). The main loop submits jobs and polls + * for results. Passwords and keys are wiped from memory after each job. + */ +class SshWorker { + public: + struct Done { + uint32_t requestId; + uint32_t generation; + bool exec; + /** SSH_EXEC succeeded / SSH_CHECK ran. Otherwise `error` says why. */ + bool ok; + char error[200]; + + // SSH_CHECK + bool online; + bool authenticated; + char hostKey[64]; + /** `host_key_mismatch`, `auth_failed` or a short message; empty on success. */ + char checkError[96]; + }; + + void begin(); + /** False if a login is already running or the task can't start. */ + bool submit(uint32_t requestId, uint32_t generation, bool exec, const netignite::protocol::SshRequest& request); + bool poll(Done& out); + + private: + struct Job { + SshWorker* worker; + uint32_t requestId; + uint32_t generation; + bool exec; + netignite::protocol::SshRequest request; + }; + + QueueHandle_t results_ = nullptr; + std::atomic busy_{false}; + + static void run(void* job); + static void login(const Job& job, Done& done); +}; diff --git a/src/core/Log.cpp b/src/core/Log.cpp index 5455311..f43d163 100644 --- a/src/core/Log.cpp +++ b/src/core/Log.cpp @@ -1,5 +1,7 @@ #include "core/Log.h" +#include + #include LogLevel Log::level_ = LogLevel::Info; @@ -7,23 +9,48 @@ SemaphoreHandle_t Log::mutex_ = nullptr; namespace { +netignite::LogRing ring(Log::RING_BYTES); +vprintf_like_t idfOriginalVprintf = nullptr; + +/** Recursive: ESP-IDF may log from inside a serial write. */ struct Lock { explicit Lock(SemaphoreHandle_t mutex) : mutex_(mutex) { - if (mutex_) xSemaphoreTake(mutex_, portMAX_DELAY); + if (mutex_) xSemaphoreTakeRecursive(mutex_, portMAX_DELAY); } ~Lock() { - if (mutex_) xSemaphoreGive(mutex_); + if (mutex_) xSemaphoreGiveRecursive(mutex_); } SemaphoreHandle_t mutex_; }; +/** Removes ANSI color codes and trailing line breaks (ESP-IDF's log format). */ +std::string cleanLine(const char* text) { + std::string line; + for (const char* p = text; *p; p++) { + if (*p == '\x1b') { + while (*p && *p != 'm') p++; + if (!*p) break; + continue; + } + line += *p; + } + while (!line.empty() && (line.back() == '\n' || line.back() == '\r')) line.pop_back(); + return line; +} + } // namespace void Log::begin(uint32_t baud) { - mutex_ = xSemaphoreCreateMutex(); + mutex_ = xSemaphoreCreateRecursiveMutex(); +#ifdef NETIGNITE_EMULATOR + // The emulator test streams firmware images over the serial port. + Serial.setRxBufferSize(8192); +#endif Serial.begin(baud); // Start on a fresh line after the ROM bootloader's output. Serial.print("\n"); + // Keep ESP-IDF's messages (Wi-Fi driver, TLS errors) for the dashboard too. + idfOriginalVprintf = esp_log_set_vprintf(&Log::idfVprintf); } const char* Log::levelName(LogLevel level) { @@ -56,8 +83,28 @@ void Log::write(LogLevel level, const char* prefix, const char* format, va_list char message[256]; vsnprintf(message, sizeof(message), format, args); + char line[288]; + snprintf(line, sizeof(line), "[%8lu] %s %s", static_cast(millis() / 1000), prefix, message); + Lock lock(mutex_); - Serial.printf("[%8lu] %s %s\n", static_cast(millis() / 1000), prefix, message); + ring.push(line); + Serial.print(line); + Serial.print("\n"); +} + +int Log::idfVprintf(const char* format, va_list args) { + char message[256]; + va_list copy; + va_copy(copy, args); + vsnprintf(message, sizeof(message), format, copy); + va_end(copy); + + { + Lock lock(mutex_); + const std::string line = cleanLine(message); + if (!line.empty()) ring.push(line); + } + return idfOriginalVprintf ? idfOriginalVprintf(format, args) : vprintf(format, args); } #define NETIGNITE_LOG_IMPL(name, level, prefix) \ @@ -90,3 +137,13 @@ void Log::writeRaw(const uint8_t* data, size_t length) { Serial.write(data, length); Serial.flush(); } + +uint32_t Log::nextSeq() { + Lock lock(mutex_); + return ring.nextSeq(); +} + +netignite::LogRing::ReadResult Log::read(uint32_t from, size_t maxBytes, std::vector& out) { + Lock lock(mutex_); + return ring.read(from, maxBytes, out); +} diff --git a/src/core/Log.h b/src/core/Log.h index 95878eb..7143652 100644 --- a/src/core/Log.h +++ b/src/core/Log.h @@ -3,6 +3,10 @@ #include #include +#include +#include + +#include "netignite/LogRing.h" enum class LogLevel : uint8_t { Error = 0, @@ -14,9 +18,15 @@ enum class LogLevel : uint8_t { /** * Logging to the serial port. Thread-safe, and every message ends with a newline: the web * installer only recognizes Improv packets at the start of a line. + * + * The most recent lines (also ESP-IDF's own log output) are kept in RAM for the dashboard's + * console (`GET_LOGS`, `LOG` events). */ class Log { public: + /** RAM for the lines kept for the dashboard. */ + static constexpr size_t RING_BYTES = 16 * 1024; + static void begin(uint32_t baud); static void setLevel(LogLevel level) { level_ = level; } @@ -36,9 +46,15 @@ class Log { /** Writes raw bytes (Improv packets) without interleaving with log lines. */ static void writeRaw(const uint8_t* data, size_t length); + /** Sequence number of the next stored line. */ + static uint32_t nextSeq(); + /** Stored lines from sequence `from` on, at most `maxBytes` of text. */ + static netignite::LogRing::ReadResult read(uint32_t from, size_t maxBytes, std::vector& out); + private: static LogLevel level_; static SemaphoreHandle_t mutex_; static void write(LogLevel level, const char* prefix, const char* format, va_list args); + static int idfVprintf(const char* format, va_list args); }; diff --git a/src/core/Settings.cpp b/src/core/Settings.cpp index 132cbce..b2bc72f 100644 --- a/src/core/Settings.cpp +++ b/src/core/Settings.cpp @@ -76,6 +76,9 @@ void Settings::load() { staticIp_.dns1 = readString(*store, k::DNS1); staticIp_.dns2 = readString(*store, k::DNS2); + otaVersion_ = readString(*store, k::OTA_VERSION); + otaPartition_ = readString(*store, k::OTA_PARTITION); + const uint8_t level = store->getUChar(k::LOG_LEVEL, static_cast(LogLevel::Info)); logLevel_ = level <= static_cast(LogLevel::Debug) ? static_cast(level) : LogLevel::Info; } @@ -145,6 +148,19 @@ void Settings::setLogLevel(LogLevel level) { logLevel_ = level; } +void Settings::setOtaMarker(const String& version, const String& partition) { + Store store(false); + writeString(*store, k::OTA_VERSION, version); + writeString(*store, k::OTA_PARTITION, partition); + otaVersion_ = version; + otaPartition_ = partition; +} + +void Settings::clearOtaMarker() { + if (otaVersion_.length() == 0 && otaPartition_.length() == 0) return; + setOtaMarker("", ""); +} + void Settings::factoryReset() { Store store(false); store->clear(); diff --git a/src/core/Settings.h b/src/core/Settings.h index af69931..bb33d17 100644 --- a/src/core/Settings.h +++ b/src/core/Settings.h @@ -39,11 +39,25 @@ class Settings { void setStaticIp(const StaticIp& config); void setLogLevel(LogLevel level); + /** + * Changes the server URL or IP settings for this boot only (CONFIG_SET trial); a restart + * returns to the saved values. Save them with setServerUrl() / setStaticIp(). + */ + void setServerUrlUnsaved(const String& url) { serverUrl_ = url; } + void setStaticIpUnsaved(const StaticIp& config) { staticIp_ = config.enabled ? config : StaticIp{}; } + + /** An installed update that hasn't confirmed itself yet (see ota/Rollback.h). */ + String otaVersion() const { return otaVersion_; } + String otaPartition() const { return otaPartition_; } + void setOtaMarker(const String& version, const String& partition); + void clearOtaMarker(); + /** Erases everything (credentials, Wi-Fi, server). */ void factoryReset(); private: String serverUrl_, enrollToken_, tokenId_, secret_, wifiSsid_, wifiPassword_, deviceName_; + String otaVersion_, otaPartition_; uint32_t agentId_ = 0; StaticIp staticIp_; LogLevel logLevel_ = LogLevel::Info; diff --git a/src/main.cpp b/src/main.cpp index 50f739a..9d10ae8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,7 @@ // // Flow: Wi-Fi (from Improv or the console) → time sync (for HTTPS) → enrollment with a // single-use token (from the web installer's NVS image or the console) → WebSocket to the -// server, which then sends WAKE / STATUS / PING requests. +// server, which then sends WAKE / STATUS / PING requests, OTA updates and console commands. #include @@ -17,6 +17,7 @@ #include "net/TimeSync.h" #include "net/WifiLink.h" #include "netignite/ServerUrl.h" +#include "ota/Rollback.h" #include "serial/SerialConsole.h" namespace { @@ -34,6 +35,27 @@ bool phaseLogged = false; std::optional server; uint32_t nextEnrollAttempt = 0; +/** A restart requested by the server or an installed update, after the answer went out. */ +struct PendingRestart { + bool active = false; + bool factoryReset = false; + uint32_t at = 0; +} pendingRestart; + +/** + * A CONFIG_SET that changed the server URL or the IP settings: applied for this boot only, and + * saved once the agent reaches the server with it. Otherwise the agent restarts with the saved + * settings when `deadline` passes. + */ +struct ConfigTrial { + bool active = false; + bool applyPending = false; + bool serverChanged = false; + bool ipChanged = false; + uint32_t applyAt = 0; + uint32_t deadline = 0; +} trial; + void reloadServer() { server = netignite::parseServerUrl(settings.serverUrl().c_str()); if (settings.serverUrl().length() > 0 && !server) { @@ -48,6 +70,90 @@ void onConfigChanged() { phaseLogged = false; } +void scheduleRestart(bool factoryReset, uint32_t delayMs) { + pendingRestart = {true, factoryReset, millis() + delayMs}; +} + +bool applyConfig(const netignite::protocol::ConfigRequest& request, std::string& error) { + if ((request.serverUrl || request.ip) && trial.active) { + error = "A previous server or network change is still being tried"; + return false; + } + + if (request.name) { + settings.setDeviceName(request.name->c_str()); + Log::info("Name changed to %s (host name after a restart)", request.name->c_str()); + } + if (request.logLevel) { + LogLevel level; + Log::parseLevel(request.logLevel->c_str(), level); + settings.setLogLevel(level); + Log::setLevel(level); + Log::info("Log level: %s", Log::levelName(level)); + } + + const bool serverChanged = request.serverUrl && settings.serverUrl() != request.serverUrl->c_str(); + if (serverChanged) settings.setServerUrlUnsaved(request.serverUrl->c_str()); + + if (request.ip) { + Settings::StaticIp ip; + ip.enabled = request.ip->isStatic; + ip.ip = request.ip->address.c_str(); + ip.gateway = request.ip->gateway.c_str(); + ip.netmask = request.ip->netmask.c_str(); + ip.dns1 = request.ip->dns1.c_str(); + ip.dns2 = request.ip->dns2.c_str(); + settings.setStaticIpUnsaved(ip); + } + + if (serverChanged || request.ip) { + // Applied a moment later, so the answer still goes out over the current connection. + trial = {true, true, serverChanged, request.ip.has_value(), millis() + 500, + millis() + config::CONFIG_TRIAL_MS}; + Log::info("Trying the new %s; it is kept once the agent reaches the server (within %lu s)", + serverChanged && request.ip ? "server and network settings" + : serverChanged ? "server address" + : "network settings", + static_cast(config::CONFIG_TRIAL_MS / 1000)); + } + return true; +} + +/** The agent reached the server: the running firmware and any tried settings work. */ +void onServerConfirmed() { + rollback::confirm(settings); + + if (trial.active && !trial.applyPending) { + if (trial.serverChanged) settings.setServerUrl(settings.serverUrl()); + if (trial.ipChanged) settings.setStaticIp(settings.staticIp()); + trial = {}; + Log::info("New settings work and are saved"); + } +} + +void loopTrialAndRestart() { + if (trial.active && trial.applyPending && static_cast(millis() - trial.applyAt) >= 0) { + trial.applyPending = false; + if (trial.ipChanged) wifi.reconnect(); + onConfigChanged(); + } + if (trial.active && !trial.applyPending && static_cast(millis() - trial.deadline) >= 0) { + Log::warn("The agent didn't reach the server with the new settings; restarting with the previous ones"); + scheduleRestart(false, 200); + trial = {}; + } + + if (pendingRestart.active && static_cast(millis() - pendingRestart.at) >= 0) { + if (pendingRestart.factoryReset) { + settings.factoryReset(); + Log::info("All settings erased"); + } + Log::info("Restarting"); + delay(100); + ESP.restart(); + } +} + SerialConsole console(settings, wifi, agent, onConfigChanged); void setPhase(Phase next) { @@ -136,10 +242,21 @@ void setup() { Log::info("%s %s on %s", config::FIRMWARE_NAME, config::FIRMWARE_VERSION, deviceInfo::chip().c_str()); Log::info("Device %s (%s), partition %s, reset reason: %s", settings.deviceName().c_str(), deviceInfo::mac().c_str(), deviceInfo::runningPartition(), deviceInfo::resetReason()); + rollback::begin(settings); reloadServer(); wifi.begin(); - agent.begin(); + agent.begin({ + .applyConfig = applyConfig, + .restart = [](bool factoryReset) { scheduleRestart(factoryReset, 500); }, + .serverConfirmed = onServerConfirmed, + .updateInstalled = + [](const std::string& version) { + rollback::recordInstalled(settings, version.c_str()); + Log::info("Restarting into firmware %s", version.c_str()); + scheduleRestart(false, 1000); + }, + }); } void loop() { @@ -147,5 +264,7 @@ void loop() { wifi.loop(); runAgent(); agent.loop(); + rollback::loop(); + loopTrialAndRestart(); delay(2); } diff --git a/src/ota/OtaUpdater.cpp b/src/ota/OtaUpdater.cpp new file mode 100644 index 0000000..68656bf --- /dev/null +++ b/src/ota/OtaUpdater.cpp @@ -0,0 +1,187 @@ +#include "ota/OtaUpdater.h" + +#include +#include +#include + +#include + +#include "core/CaBundle.h" +#include "core/Log.h" + +namespace { + +constexpr uint32_t TASK_STACK = 12 * 1024; +constexpr uint32_t READ_TIMEOUT_MS = 30000; +constexpr size_t CHUNK = 4096; + +} // namespace + +const char* OtaUpdater::stateName(State state) { + switch (state) { + case State::Idle: + return "idle"; + case State::Downloading: + return "downloading"; + case State::Installed: + return "installed"; + case State::Failed: + return "failed"; + } + return "idle"; +} + +bool OtaUpdater::start(const netignite::ServerUrl& server, const std::string& authorization, + const netignite::protocol::OtaRequest& request, std::string& error) { + if (busy()) { + error = "An update is already running"; + return false; + } + if (OtaWriter::requiresSignature() && request.signature.empty()) { + error = "This firmware only installs signed updates, and the update has no signature"; + return false; + } + + server_ = server; + authorization_ = authorization; + request_ = request; + { + portENTER_CRITICAL(&lock_); + progress_.version = request.version; + progress_.error.clear(); + portEXIT_CRITICAL(&lock_); + } + setProgress(State::Downloading, 0); + + if (xTaskCreate(&OtaUpdater::taskMain, "ota", TASK_STACK, this, 1, &task_) != pdPASS) { + task_ = nullptr; + setProgress(State::Failed, 0, "Not enough memory to start the update"); + error = "Not enough memory to start the update"; + return false; + } + return true; +} + +bool OtaUpdater::busy() const { + portENTER_CRITICAL(&lock_); + const bool running = progress_.state == State::Downloading; + portEXIT_CRITICAL(&lock_); + return running; +} + +OtaUpdater::Progress OtaUpdater::progress() const { + portENTER_CRITICAL(&lock_); + Progress copy = progress_; + portEXIT_CRITICAL(&lock_); + return copy; +} + +void OtaUpdater::setProgress(State state, uint8_t percent, const char* error) { + portENTER_CRITICAL(&lock_); + if (progress_.state != state || progress_.percent != percent) progress_.revision++; + progress_.state = state; + progress_.percent = percent; + if (error) progress_.error = error; + portEXIT_CRITICAL(&lock_); +} + +void OtaUpdater::taskMain(void* self) { + static_cast(self)->run(); + static_cast(self)->task_ = nullptr; + vTaskDelete(nullptr); +} + +void OtaUpdater::run() { + const std::string url = server_.url(request_.path); + Log::info("Downloading firmware %s (%lu bytes)", request_.version.c_str(), + static_cast(request_.size)); + + std::unique_ptr client; + if (server_.secure) { + auto* secure = new NetworkClientSecure(); + secure->setCACertBundle(caBundle::data(), caBundle::size()); + client.reset(secure); + } else { + client.reset(new NetworkClient()); + } + + auto fail = [this](const String& message) { + writer_.abort(); + Log::error("Update failed: %s", message.c_str()); + setProgress(State::Failed, 0, message.c_str()); + }; + + HTTPClient http; + http.setTimeout(READ_TIMEOUT_MS); + http.setReuse(false); + if (!http.begin(*client, url.c_str())) { + fail("Invalid download URL"); + return; + } + http.addHeader("Authorization", authorization_.c_str()); + + const int status = http.GET(); + if (status != HTTP_CODE_OK) { + fail(status > 0 ? String("The server answered ") + status : String("Download failed: ") + + HTTPClient::errorToString(status)); + http.end(); + return; + } + if (http.getSize() != static_cast(request_.size)) { + fail("The server sent a file of the wrong size"); + http.end(); + return; + } + + String error; + if (!writer_.begin(request_, error)) { + fail(error); + http.end(); + return; + } + + NetworkClient* stream = http.getStreamPtr(); + std::unique_ptr buffer(new uint8_t[CHUNK]); + uint32_t lastData = millis(); + uint8_t percent = 0; + + while (writer_.written() < request_.size) { + const size_t available = stream->available(); + if (available == 0) { + if (!stream->connected() || millis() - lastData > READ_TIMEOUT_MS) { + fail("The download stopped"); + http.end(); + return; + } + delay(5); + continue; + } + + const size_t wanted = std::min({available, CHUNK, request_.size - writer_.written()}); + const int read = stream->read(buffer.get(), wanted); + if (read <= 0) continue; + lastData = millis(); + + if (!writer_.write(buffer.get(), static_cast(read), error)) { + fail(error); + http.end(); + return; + } + // A fast download could keep this task busy for seconds; let the idle task (task watchdog) run. + delay(1); + + const uint8_t now = static_cast(static_cast(writer_.written()) * 100 / request_.size); + if (now != percent) { + percent = now; + setProgress(State::Downloading, percent); + } + } + http.end(); + + if (!writer_.finish(error)) { + fail(error); + return; + } + Log::info("Firmware %s installed", request_.version.c_str()); + setProgress(State::Installed, 100); +} diff --git a/src/ota/OtaUpdater.h b/src/ota/OtaUpdater.h new file mode 100644 index 0000000..a90a1ee --- /dev/null +++ b/src/ota/OtaUpdater.h @@ -0,0 +1,50 @@ +#pragma once + +#include + +#include + +#include "netignite/Protocol.h" +#include "netignite/ServerUrl.h" +#include "ota/OtaWriter.h" + +/** + * Runs an OTA update in its own task: downloads the image from the agent's server (with the agent + * credential) into an OtaWriter. The main loop polls progress() and reports it to the server. + */ +class OtaUpdater { + public: + enum class State : uint8_t { Idle, Downloading, Installed, Failed }; + + struct Progress { + State state = State::Idle; + uint8_t percent = 0; + /** Changes whenever state or percent change. */ + uint32_t revision = 0; + std::string version; + std::string error; + }; + + static const char* stateName(State state); + + /** Starts the download task. False (with an error) if an update is running or can't start. */ + bool start(const netignite::ServerUrl& server, const std::string& authorization, + const netignite::protocol::OtaRequest& request, std::string& error); + + bool busy() const; + Progress progress() const; + + private: + netignite::ServerUrl server_; + std::string authorization_; + netignite::protocol::OtaRequest request_; + OtaWriter writer_; + + mutable portMUX_TYPE lock_ = portMUX_INITIALIZER_UNLOCKED; + Progress progress_; + TaskHandle_t task_ = nullptr; + + static void taskMain(void* self); + void run(); + void setProgress(State state, uint8_t percent, const char* error = nullptr); +}; diff --git a/src/ota/OtaWriter.cpp b/src/ota/OtaWriter.cpp new file mode 100644 index 0000000..f239e16 --- /dev/null +++ b/src/ota/OtaWriter.cpp @@ -0,0 +1,125 @@ +#include "ota/OtaWriter.h" + +#include +#include + +#include + +#include "core/Log.h" +// Generated by scripts/signing_key.py: defines NETIGNITE_OTA_PUBLIC_KEY if a key is configured. +#include "netignite_signing_key.h" + +bool OtaWriter::requiresSignature() { +#ifdef NETIGNITE_OTA_PUBLIC_KEY + return true; +#else + return false; +#endif +} + +bool OtaWriter::begin(const netignite::protocol::OtaRequest& request, String& error) { + abort(); + + if (requiresSignature() && request.signature.empty()) { + error = "This firmware only installs signed updates, and the update has no signature"; + return false; + } + if (!Update.begin(request.size, U_FLASH)) { + error = String("Can't start the update: ") + Update.errorString(); + return false; + } + + request_ = request; + written_ = 0; + mbedtls_sha256_init(&sha_); + mbedtls_sha256_starts(&sha_, 0); + active_ = true; + return true; +} + +bool OtaWriter::write(const uint8_t* data, size_t length, String& error) { + if (!active_) { + error = "No update in progress"; + return false; + } + if (written_ + length > request_.size) { + error = "The download is larger than announced"; + abort(); + return false; + } + + mbedtls_sha256_update(&sha_, data, length); + if (Update.write(const_cast(data), length) != length) { + error = String("Writing to flash failed: ") + Update.errorString(); + abort(); + return false; + } + written_ += length; + return true; +} + +bool OtaWriter::finish(String& error) { + if (!active_) { + error = "No update in progress"; + return false; + } + if (written_ != request_.size) { + error = "The download is incomplete"; + abort(); + return false; + } + + uint8_t hash[32]; + mbedtls_sha256_finish(&sha_, hash); + mbedtls_sha256_free(&sha_); + + if (memcmp(hash, request_.sha256.data(), sizeof(hash)) != 0) { + error = "The download doesn't match its SHA-256"; + abort(); + return false; + } + if (!verifySignature(hash, error)) { + abort(); + return false; + } + if (!Update.end()) { + error = String("Can't activate the update: ") + Update.errorString(); + abort(); + return false; + } + + active_ = false; + return true; +} + +void OtaWriter::abort() { + if (!active_) return; + active_ = false; + mbedtls_sha256_free(&sha_); + Update.abort(); +} + +bool OtaWriter::verifySignature(const uint8_t hash[32], String& error) const { +#ifdef NETIGNITE_OTA_PUBLIC_KEY + static const char KEY[] = NETIGNITE_OTA_PUBLIC_KEY; + + mbedtls_pk_context key; + mbedtls_pk_init(&key); + int result = mbedtls_pk_parse_public_key(&key, reinterpret_cast(KEY), sizeof(KEY)); + if (result == 0) { + result = mbedtls_pk_verify(&key, MBEDTLS_MD_SHA256, hash, 32, request_.signature.data(), + request_.signature.size()); + } + mbedtls_pk_free(&key); + + if (result != 0) { + error = "The update's signature is invalid"; + return false; + } + Log::info("Update signature verified"); +#else + (void)hash; + (void)error; +#endif + return true; +} diff --git a/src/ota/OtaWriter.h b/src/ota/OtaWriter.h new file mode 100644 index 0000000..af0f866 --- /dev/null +++ b/src/ota/OtaWriter.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +#include "netignite/Protocol.h" + +/** + * Writes a firmware image into the inactive OTA slot while hashing it. `finish()` only activates + * the image if its size and SHA-256 match and, when a public key is compiled in + * (`scripts/signing_key.py`), its ECDSA P-256 signature is valid. Used by OTA downloads and, in + * emulator builds, by the serial `ota-*` test commands. + */ +class OtaWriter { + public: + ~OtaWriter() { abort(); } + + /** Whether this firmware only accepts signed images. */ + static bool requiresSignature(); + + bool begin(const netignite::protocol::OtaRequest& request, String& error); + bool write(const uint8_t* data, size_t length, String& error); + /** Verifies the image and makes it the boot image. */ + bool finish(String& error); + void abort(); + + bool active() const { return active_; } + uint32_t written() const { return written_; } + uint32_t size() const { return request_.size; } + const std::string& version() const { return request_.version; } + + private: + netignite::protocol::OtaRequest request_; + mbedtls_sha256_context sha_{}; + bool active_ = false; + uint32_t written_ = 0; + + bool verifySignature(const uint8_t hash[32], String& error) const; +}; diff --git a/src/ota/Rollback.cpp b/src/ota/Rollback.cpp new file mode 100644 index 0000000..b891d73 --- /dev/null +++ b/src/ota/Rollback.cpp @@ -0,0 +1,87 @@ +#include "ota/Rollback.h" + +#include + +#include "Config.h" +#include "core/Log.h" + +/** + * Arduino's core marks a new firmware valid on its first boot unless this returns true; the agent + * confirms it itself once it has reached the server (rollback::confirm). + */ +extern "C" bool verifyRollbackLater() { + return true; +} + +namespace rollback { + +namespace { + +bool pending_ = false; +uint32_t deadline_ = 0; +String failedUpdate_; + +} // namespace + +void begin(Settings& settings) { + const esp_partition_t* running = esp_ota_get_running_partition(); + esp_ota_img_states_t state; + pending_ = running && esp_ota_get_state_partition(running, &state) == ESP_OK && + state == ESP_OTA_IMG_PENDING_VERIFY; + deadline_ = millis() + config::OTA_CONFIRM_TIMEOUT_MS; + + const String target = settings.otaVersion(); + if (target.length() > 0) { + if (running && settings.otaPartition() == running->label) { + Log::info("Updated to firmware %s", config::FIRMWARE_VERSION); + if (!pending_) settings.clearOtaMarker(); + } else { + // The bootloader went back to this partition: the update crashed or never confirmed. + failedUpdate_ = target; + settings.clearOtaMarker(); + Log::warn("The update to %s failed; running %s again", target.c_str(), config::FIRMWARE_VERSION); + } + } + + if (pending_) { + Log::info("New firmware on probation: it stays installed once it reaches the server (within %lu s)", + static_cast(config::OTA_CONFIRM_TIMEOUT_MS / 1000)); + } +} + +bool pending() { + return pending_; +} + +void confirm(Settings& settings) { + if (!pending_) return; + if (esp_ota_mark_app_valid_cancel_rollback() != ESP_OK) { + Log::error("Couldn't confirm the new firmware"); + return; + } + pending_ = false; + settings.clearOtaMarker(); + Log::info("Firmware %s confirmed", config::FIRMWARE_VERSION); +} + +void loop() { + if (!pending_ || static_cast(millis() - deadline_) < 0) return; + + Log::error("The new firmware didn't reach the server in time; going back to the previous firmware"); + delay(200); + esp_ota_mark_app_invalid_rollback_and_reboot(); + // Only returns if there is no previous firmware to go back to. + pending_ = false; + Log::error("No previous firmware to go back to; keeping this one"); +} + +const String& failedUpdate() { + return failedUpdate_; +} + +void recordInstalled(Settings& settings, const String& version) { + const esp_partition_t* next = esp_ota_get_boot_partition(); + settings.setOtaMarker(version, next ? next->label : ""); +} + +} // namespace rollback diff --git a/src/ota/Rollback.h b/src/ota/Rollback.h new file mode 100644 index 0000000..c53f322 --- /dev/null +++ b/src/ota/Rollback.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "core/Settings.h" + +/** + * After an update the new firmware is on probation (ESP-IDF app rollback): it marks itself valid + * once it has reached the server. If it crashes, or doesn't reach the server within + * `config::OTA_CONFIRM_TIMEOUT_MS`, the bootloader starts the previous firmware again. + */ +namespace rollback { + +/** Call early in setup(), after Settings::load(). */ +void begin(Settings& settings); + +/** True while the running firmware is on probation. */ +bool pending(); + +/** Marks the running firmware as good. Call once the agent is connected to the server. */ +void confirm(Settings& settings); + +/** Rolls back when the probation time is over. */ +void loop(); + +/** Version of an update that failed and was rolled back (reported once per boot), or empty. */ +const String& failedUpdate(); + +/** Remembers an installed update, so the next boot can tell whether it started. */ +void recordInstalled(Settings& settings, const String& version); + +} // namespace rollback diff --git a/src/serial/SerialConsole.cpp b/src/serial/SerialConsole.cpp index 349034f..c2d5c01 100644 --- a/src/serial/SerialConsole.cpp +++ b/src/serial/SerialConsole.cpp @@ -6,26 +6,15 @@ #include "core/DeviceInfo.h" #include "core/Log.h" #include "netignite/CommandLine.h" +#include "netignite/Hex.h" #include "netignite/ServerUrl.h" +#include "netignite/Validation.h" +#include "ota/Rollback.h" namespace improv = netignite::improv; -namespace { - -bool validHostname(const std::string& name) { - if (name.empty() || name.size() > 63 || name.front() == '-' || name.back() == '-') return false; - for (char c : name) { - if (!isalnum(static_cast(c)) && c != '-') return false; - } - return true; -} - -bool validIp(const std::string& text) { - IPAddress address; - return address.fromString(text.c_str()); -} - -} // namespace +using netignite::isValidHostname; +using netignite::isValidIpv4; void SerialConsole::loop() { while (Serial.available() > 0) { @@ -128,7 +117,7 @@ void SerialConsole::handleImprov(uint8_t type, const std::vector& data) break; } const std::string name(data.begin() + 3, data.end()); - if (!validHostname(name)) { + if (!isValidHostname(name)) { sendImprov(improv::buildErrorPacket(improv::Error::BadHostname)); break; } @@ -189,6 +178,10 @@ void SerialConsole::handleLine(const std::string& line) { ESP.restart(); } else if (command == "factory-reset") { cmdFactoryReset(args); +#ifdef NETIGNITE_EMULATOR + } else if (command.rfind("ota-", 0) == 0) { + cmdOta(args); +#endif } else { Log::print("Unknown command \"%s\". Type \"help\" for the commands.", command.c_str()); } @@ -246,6 +239,17 @@ void SerialConsole::printStatus() { Log::print(" agent: %s", agentState); Log::print(" partition: %s, reset reason: %s, free heap: %lu", deviceInfo::runningPartition(), deviceInfo::resetReason(), static_cast(ESP.getFreeHeap())); + + const OtaUpdater::Progress update = agent_.ota().progress(); + if (update.state != OtaUpdater::State::Idle) { + Log::print(" update: %s %s%s%s", update.version.c_str(), OtaUpdater::stateName(update.state), + update.error.empty() ? "" : ": ", update.error.c_str()); + } + if (rollback::pending()) Log::print(" firmware: on probation until it reaches the server"); + if (rollback::failedUpdate().length() > 0) { + Log::print(" firmware: the update to %s failed and was rolled back", rollback::failedUpdate().c_str()); + } + Log::print(" updates: %s", OtaWriter::requiresSignature() ? "signed only" : "checked by SHA-256"); } void SerialConsole::cmdWifi(const std::vector& args) { @@ -324,7 +328,7 @@ void SerialConsole::cmdIp(const std::vector& args) { } if (args.size() >= 5 && args.size() <= 7 && args[1] == "static") { for (size_t i = 2; i < args.size(); i++) { - if (!validIp(args[i])) { + if (!isValidIpv4(args[i])) { Log::print("\"%s\" isn't an IPv4 address.", args[i].c_str()); return; } @@ -345,7 +349,7 @@ void SerialConsole::cmdIp(const std::vector& args) { } void SerialConsole::cmdName(const std::vector& args) { - if (args.size() != 2 || !validHostname(args[1])) { + if (args.size() != 2 || !isValidHostname(args[1])) { Log::print("Usage: name (letters, digits and -, max. 63)"); return; } @@ -374,3 +378,65 @@ void SerialConsole::cmdFactoryReset(const std::vector& args) { delay(200); ESP.restart(); } + +#ifdef NETIGNITE_EMULATOR + +void SerialConsole::cmdOta(const std::vector& args) { + String error; + const std::string& command = args[0]; + + if (command == "ota-begin" && (args.size() == 3 || args.size() == 4)) { + netignite::protocol::OtaRequest request; + request.version = "emulator"; + request.size = static_cast(strtoul(args[1].c_str(), nullptr, 10)); + std::vector digest; + if (request.size == 0 || !netignite::fromHex(args[2], digest) || digest.size() != 32 || + (args.size() == 4 && !netignite::fromHex(args[3], request.signature))) { + Log::print("OTA error: invalid arguments"); + return; + } + std::copy(digest.begin(), digest.end(), request.sha256.begin()); + if (!otaWriter_.begin(request, error)) { + Log::print("OTA error: %s", error.c_str()); + return; + } + Log::print("OTA ready for %lu bytes", static_cast(request.size)); + return; + } + + if (command == "ota-data" && args.size() == 2) { + std::vector data; + if (!netignite::fromHex(args[1], data)) { + Log::print("OTA error: invalid data"); + otaWriter_.abort(); + return; + } + if (!otaWriter_.active()) return; + if (!otaWriter_.write(data.data(), data.size(), error)) { + Log::print("OTA error: %s", error.c_str()); + return; + } + // The emulated UART has no flow control: the test waits for this before sending more. + const uint32_t written = otaWriter_.written(); + if (written % 2000 < data.size() || written == otaWriter_.size()) { + Log::print("OTA ok %lu", static_cast(written)); + } + return; + } + + if (command == "ota-end" && args.size() == 1) { + if (!otaWriter_.finish(error)) { + Log::print("OTA error: %s", error.c_str()); + return; + } + rollback::recordInstalled(settings_, "emulator"); + Log::print("OTA installed. Restarting..."); + delay(200); + ESP.restart(); + return; + } + + Log::print("Usage: ota-begin [signature] | ota-data | ota-end"); +} + +#endif diff --git a/src/serial/SerialConsole.h b/src/serial/SerialConsole.h index 7e2354c..3b4624b 100644 --- a/src/serial/SerialConsole.h +++ b/src/serial/SerialConsole.h @@ -11,6 +11,7 @@ #include "net/WifiLink.h" #include "netignite/Improv.h" #include "netignite/SerialDemux.h" +#include "ota/OtaWriter.h" /** * The serial port: Improv Wi-Fi for the web installer, and a small text console for setting the @@ -52,4 +53,11 @@ class SerialConsole { bool applyServer(const std::string& url); bool applyEnrollToken(const std::string& token); + +#ifdef NETIGNITE_EMULATOR + // Emulator builds can't download updates (no network): `ota-begin`, `ota-data` and `ota-end` + // feed an image over the serial port instead, to test installing, signatures and rollback. + OtaWriter otaWriter_; + void cmdOta(const std::vector& args); +#endif }; diff --git a/test/emulator/README.md b/test/emulator/README.md index b6fdde7..effc318 100644 --- a/test/emulator/README.md +++ b/test/emulator/README.md @@ -1,8 +1,15 @@ # Emulator test -Boots the firmware in [Espressif's QEMU](https://github.com/espressif/qemu) and checks the serial -side without hardware: Improv Wi-Fi (with `improv-wifi-serial-sdk`, the client ESP Web Tools uses), -the console commands, and that settings survive a restart and a factory reset. +Boots the firmware in [Espressif's QEMU](https://github.com/espressif/qemu) and checks it without +hardware: + +- `improv-test.ts`: Improv Wi-Fi (with `improv-wifi-serial-sdk`, the client ESP Web Tools uses), + the console commands, and that settings survive a restart and a factory reset. +- `ota-test.ts`: OTA updates. Emulator builds accept an image over the serial port (`ota-begin`, + `ota-data`, `ota-end`) and install it with the same code as a download. The test checks that + unsigned, wrongly signed and corrupted images are rejected, that a signed image boots from the + other slot on probation, and that it rolls back because it can't reach a server. The emulator + firmware has the test key in `keys/` compiled in; see `keys/README.md`. QEMU has no Wi-Fi radio, so this uses the `esp32dev-qemu` build, which is the normal firmware with Wi-Fi switched off. Networking (enrollment, the server connection, Wake-on-LAN, status checks) needs @@ -13,10 +20,17 @@ pio run -e esp32dev-qemu cd test/emulator bun install bun improv-test.ts /path/to/qemu-system-xtensa ../../.pio/build/esp32dev-qemu/firmware.factory.bin /tmp +bun ota-test.ts /path/to/qemu-system-xtensa ../../.pio/build/esp32dev-qemu/firmware.factory.bin ../../.pio/build/esp32dev-qemu/firmware.bin /tmp ``` +The OTA upload over the emulated serial port takes a few minutes. + Download QEMU from the [releases](https://github.com/espressif/qemu/releases) -(`qemu-xtensa-softmmu-*`). The test starts it with the timer-group watchdogs disabled, like +(`qemu-xtensa-softmmu-*`). The tests start it with the timer-group watchdogs disabled, like ESP-IDF's own QEMU runner; with them enabled, slow hosts reset or crash the emulated chip during -boot. If a check fails, the test prints the device's serial output, and CI keeps it as the +boot. After the firmware has used the bignum accelerator (the ECDSA signature check of an update), a +software restart crashes in QEMU: the next boot takes a stale interrupt in the task watchdog's +handler. Real chips use the same accelerator for every TLS handshake and restart fine, so +`ota-test.ts` power-cycles QEMU instead whenever the device restarts (the flash file keeps what was +written). If a check fails, the test prints the device's serial output, and CI keeps it as the `emulator-serial-log` artifact. diff --git a/test/emulator/improv-test.ts b/test/emulator/improv-test.ts index 3092314..1fc1e90 100644 --- a/test/emulator/improv-test.ts +++ b/test/emulator/improv-test.ts @@ -106,6 +106,17 @@ async function command(line: string, expect: string, timeoutMs = 8000) { return (await waitFor(expect, timeoutMs, from)) >= 0; } +/** + * Right after a restart the emulated UART sometimes loses the first input on slow CI runners (it + * made the v2.0.0-beta.1 tag build fail); repeat the harmless command a few times. + */ +async function commandAfterRestart(line: string, expect: string) { + for (let attempt = 0; attempt < 3; attempt++) { + if (await command(line, expect)) return true; + } + return false; +} + const logger = { log() {}, error() {}, debug() {} }; try { @@ -185,7 +196,7 @@ try { const afterReset = transcript.length; await waitFor("I Device NetIgnite-", BOOT_TIMEOUT_MS, afterReset); await sleep(1500); - check("after the reset the agent is unconfigured", await command("status", "server: not set")); + check("after the reset the agent is unconfigured", await commandAfterRestart("status", "server: not set")); } catch (error) { check("test ran to the end", false, String(error)); } finally { diff --git a/test/emulator/keys/README.md b/test/emulator/keys/README.md new file mode 100644 index 0000000..b9706a6 --- /dev/null +++ b/test/emulator/keys/README.md @@ -0,0 +1,9 @@ +# Test keys for the emulator test + +**Not secret, only for `esp32dev-qemu`.** The emulator firmware has `emulator-test.pub.pem` +compiled in (`custom_signing_key` in platformio.ini), so `improv-test.ts` can check that it +installs updates signed with `emulator-test.key.pem` and rejects unsigned ones and ones signed +with `emulator-other.key.pem`. + +`scripts/signing_key.py` refuses to build any other environment with a key from `test/`. Release +firmware uses `keys/firmware-signing.pub.pem` (see `scripts/generate_signing_key.sh`). diff --git a/test/emulator/keys/emulator-other.key.pem b/test/emulator/keys/emulator-other.key.pem new file mode 100644 index 0000000..a90683c --- /dev/null +++ b/test/emulator/keys/emulator-other.key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIOAUFb3myt3vI3gbFrSMSwsxzdTjM6hMQfBVui/Z6i7DoAoGCCqGSM49 +AwEHoUQDQgAEdQd8VFUySn5mSNhAuCamF62KxEWY0bVHd1Ex/QpKZZtHxZQ3+vAX +h6SF2ewrFKWMRP9KcQeT6cTgurYFBhJWrw== +-----END EC PRIVATE KEY----- diff --git a/test/emulator/keys/emulator-test.key.pem b/test/emulator/keys/emulator-test.key.pem new file mode 100644 index 0000000..020587b --- /dev/null +++ b/test/emulator/keys/emulator-test.key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIDCcEFW38hTtnUU1Vnec6HxlXZJiq7VLjI/g6yLmeNGkoAoGCCqGSM49 +AwEHoUQDQgAEwLFH03hAeAWSGiWeT/2rKeIisX1DKeh+rYjKADzuuLgUIGXjlQnB +zmxshkGOEi25o+yHHgG32dSDYa8zwx+lyA== +-----END EC PRIVATE KEY----- diff --git a/test/emulator/keys/emulator-test.pub.pem b/test/emulator/keys/emulator-test.pub.pem new file mode 100644 index 0000000..d35a071 --- /dev/null +++ b/test/emulator/keys/emulator-test.pub.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwLFH03hAeAWSGiWeT/2rKeIisX1D +Keh+rYjKADzuuLgUIGXjlQnBzmxshkGOEi25o+yHHgG32dSDYa8zwx+lyA== +-----END PUBLIC KEY----- diff --git a/test/emulator/ota-test.ts b/test/emulator/ota-test.ts new file mode 100644 index 0000000..6a55293 --- /dev/null +++ b/test/emulator/ota-test.ts @@ -0,0 +1,250 @@ +// Boots the emulator firmware (pio run -e esp32dev-qemu) in Espressif's QEMU and tests OTA +// updates without a network: the emulator build accepts an image over the serial port +// (`ota-begin`, `ota-data`, `ota-end`) and writes it with the same code as a download. Checks that +// unsigned, wrongly signed and corrupted images are rejected, that a signed image boots from the +// other slot on probation, and that it rolls back because it never reaches a server. +// +// bun ota-test.ts +import { createHash, createPrivateKey, sign } from "node:crypto"; + +const [qemuPath, factoryPath, appPath, workDir] = Bun.argv.slice(2); +const PORT = 5598; +const BOOT_TIMEOUT_MS = 180_000; +const KEYS = `${import.meta.dir}/keys`; + +let failures = 0; +function check(name: string, ok: boolean, detail?: unknown) { + console.log(`${ok ? "PASS" : "FAIL"} ${name}${ok || detail === undefined ? "" : ` -> ${JSON.stringify(detail)}`}`); + if (!ok) failures++; +} +const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +const testKey = createPrivateKey(await Bun.file(`${KEYS}/emulator-test.key.pem`).text()); +const otherKey = createPrivateKey(await Bun.file(`${KEYS}/emulator-other.key.pem`).text()); +const sha256 = (data: Uint8Array) => createHash("sha256").update(data).digest("hex"); +const signHex = (data: Uint8Array, key: ReturnType) => sign("sha256", data, key).toString("hex"); + +// --- 4 MB flash image ---------------------------------------------------------------------------- +const flash = new Uint8Array(4 * 1024 * 1024).fill(0xff); +flash.set(new Uint8Array(await Bun.file(factoryPath).arrayBuffer()), 0); +const flashPath = `${workDir}/flash-ota.bin`; +await Bun.write(flashPath, flash); + +// --- QEMU, and the serial port over TCP with backpressure for the large uploads --------------------- +let transcript = ""; +let drained: (() => void) | null = null; +let qemu: ReturnType; +let socket: Awaited> | null = null; + +async function startQemu() { + qemu = Bun.spawn( + [ + qemuPath, + "-nographic", + "-machine", + "esp32", + "-drive", + `file=${flashPath},if=mtd,format=raw`, + "-serial", + `tcp:127.0.0.1:${PORT},server,wait=on`, + "-monitor", + "none", + "-global", + "driver=timer.esp32.timg,property=wdt_disable,value=true", + ], + { stdout: "ignore", stderr: "inherit" }, + ); + + socket = null; + for (let attempt = 0; attempt < 50 && !socket; attempt++) { + try { + socket = await Bun.connect({ + hostname: "127.0.0.1", + port: PORT, + socket: { + data(_s, data) { + transcript += new TextDecoder().decode(data); + }, + drain() { + drained?.(); + }, + }, + }); + } catch { + await sleep(200); + } + } + if (!socket) throw new Error("QEMU serial port didn't open"); +} + +/** + * Restarts the emulated chip from power-on. After the bignum accelerator was used (the ECDSA check), + * a software restart crashes in QEMU (a stale interrupt hits the task watchdog's handler on the next + * boot); real chips restart fine. So the test power-cycles whenever the device restarts; the flash + * file keeps what was written. + */ +async function powerCycle(afterText: string, timeoutMs: number, from: number, settleMs = 500) { + const found = (await waitFor(afterText, timeoutMs, from)) >= 0; + await sleep(settleMs); + socket?.end(); + qemu.kill(); + await qemu.exited; + transcript += "\n--- power cycle ---\n"; + await startQemu(); + return found; +} + +await startQemu(); + +/** + * Writes to the serial port, followed by empty lines (which the console ignores): QEMU's UART only + * hands received bytes to the firmware in blocks of its FIFO threshold, so the end of a long line + * would otherwise wait for more input. A real UART flushes on its idle timeout. + */ +async function writeAll(text: string) { + let data = new TextEncoder().encode(`${text}${"\n".repeat(128)}`); + while (data.length > 0) { + const written = socket!.write(data); + data = data.subarray(Math.max(written, 0)); + if (data.length > 0) await new Promise((resolve) => (drained = resolve)); + } +} + +async function waitFor(text: string, timeoutMs: number, from = 0) { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + const index = transcript.indexOf(text, from); + if (index >= 0) return index; + await sleep(100); + } + return -1; +} + +async function command(line: string, expect: string, timeoutMs = 10_000) { + const from = transcript.length; + await writeAll(`${line}\n`); + return (await waitFor(expect, timeoutMs, from)) >= 0; +} + +async function status() { + const from = transcript.length; + await writeAll("status\n"); + await waitFor("updates:", 10_000, from); + return transcript.slice(from); +} + +/** Uploads an image; resolves with the device's answer to `ota-end`. */ +async function upload(image: Uint8Array, declaredSha: string, signature?: string) { + if (!(await command(`ota-begin ${image.length} ${declaredSha}${signature ? ` ${signature}` : ""}`, "OTA ready", 60_000))) { + return "begin failed"; + } + + // 200 bytes per line. The device acknowledges every 2000 bytes ("OTA ok "): the + // emulated UART has no flow control and drops what doesn't fit into its buffer. + const CHUNK = 200; + const ACK_EVERY = 2000; + for (let offset = 0; offset < image.length; offset += ACK_EVERY) { + const end = Math.min(offset + ACK_EVERY, image.length); + let batch = ""; + for (let i = offset; i < end; i += CHUNK) { + batch += `ota-data ${Buffer.from(image.subarray(i, Math.min(i + CHUNK, end))).toString("hex")}\n`; + } + const from = transcript.length; + await writeAll(batch); + if ((await waitFor(`OTA ok ${end}\n`, 30_000, from)) < 0) { + const error = transcript.slice(from).match(/OTA error: [^\r\n]*/); + return error ? error[0] : `no acknowledgement at ${end} bytes`; + } + } + + const from = transcript.length; + await writeAll("ota-end\n"); + const start = Date.now(); + while (Date.now() - start < 600_000) { + const answer = transcript.slice(from).match(/OTA (installed|error: [^\r\n]*)/); + if (answer) return answer[0]; + await sleep(200); + } + return "no answer"; +} + +try { + check("firmware boots", (await waitFor("Waiting for Wi-Fi settings", BOOT_TIMEOUT_MS)) >= 0); + await sleep(1500); + const before = await status(); + check("runs from app0 and only accepts signed updates", before.includes("partition: app0") && before.includes("updates: signed only"), before); + + // A small fake image (it starts with the ESP image magic byte, which Update checks). + const fake = new Uint8Array(8192).map((_, i) => (i * 7) & 0xff); + fake[0] = 0xe9; + + check( + "unsigned image is refused", + await command(`ota-begin ${fake.length} ${sha256(fake)}`, "OTA error: This firmware only installs signed updates"), + ); + const wrongKey = await upload(fake, sha256(fake), signHex(fake, otherKey)); + check("image signed with another key is rejected", wrongKey === "OTA error: The update's signature is invalid", wrongKey); + + const corrupted = fake.slice(); + corrupted[100] ^= 0xff; + const corruptedResult = await upload(corrupted, sha256(fake), signHex(fake, testKey)); + check( + "corrupted image is rejected by its SHA-256", + corruptedResult === "OTA error: The download doesn't match its SHA-256", + corruptedResult, + ); + const stillOld = await status(); + check("rejected updates leave the firmware untouched", stillOld.includes("partition: app0") && !stillOld.includes("probation"), stillOld); + + // --- A real, signed update --------------------------------------------------------------------- + const app = new Uint8Array(await Bun.file(appPath).arrayBuffer()); + const started = Date.now(); + const result = await upload(app, sha256(app), signHex(app, testKey)); + check(`signed image (${app.length} bytes) is installed`, result === "OTA installed", result); + console.log(` upload took ${Math.round((Date.now() - started) / 1000)} s`); + + // Power-cycle instead of the device's own restart (it has written everything by now; a warm + // restart would crash in QEMU and the bootloader would roll the update back). + await powerCycle("OTA installed", 1000, transcript.lastIndexOf("OTA installed"), 20); + const bootFrom = transcript.length; + check("restarts into the new slot", (await waitFor("partition app1", BOOT_TIMEOUT_MS, bootFrom)) >= 0); + check("new firmware is on probation", (await waitFor("New firmware on probation", 20_000, bootFrom)) >= 0); + await sleep(1500); + const probation = await status(); + check("status shows the probation", probation.includes("partition: app1") && probation.includes("on probation"), probation); + + // The emulator can't reach a server, so the probation (20 s in emulator builds) runs out. + const probationFrom = transcript.length; + const timedOut = await waitFor("didn't reach the server in time", 60_000, probationFrom); + check("rolls back when it doesn't reach the server", timedOut >= 0); + await powerCycle("rst:0xc", 30_000, Math.max(timedOut, probationFrom)); + const rollbackFrom = transcript.length; + check("restarts from the previous slot", (await waitFor("partition app0", BOOT_TIMEOUT_MS, rollbackFrom)) >= 0); + check("reports the failed update", (await waitFor("The update to emulator failed", 20_000, rollbackFrom)) >= 0); + await sleep(1500); + const after = await status(); + check( + "status after the rollback", + after.includes("partition: app0") && after.includes("the update to emulator failed") && !after.includes("probation"), + after, + ); +} catch (error) { + check("test ran to the end", false, String(error)); +} finally { + await Bun.write(`${workDir}/ota-transcript.log`, transcript); + socket?.end(); + qemu.kill(); +} + +if (failures > 0) { + const printable = transcript + .split("\n") + .filter((line) => !line.startsWith("OTA ok")) + .join("\n") + .replace(/[^\x09\x0a\x20-\x7e]/g, ""); + console.log("\n--- last 80 lines of serial output ---"); + console.log(printable.split("\n").slice(-80).join("\n")); +} + +console.log(failures === 0 ? "\nALL OTA CHECKS PASSED" : `\n${failures} OTA CHECK(S) FAILED`); +process.exit(failures === 0 ? 0 : 1); diff --git a/test/test_core/test_core.cpp b/test/test_core/test_core.cpp index 78f5f90..ec14daf 100644 --- a/test/test_core/test_core.cpp +++ b/test/test_core/test_core.cpp @@ -1,17 +1,20 @@ // Host-side unit tests for lib/netignite_core: pio test -e native #include +#include #include #include #include "netignite/CommandLine.h" #include "netignite/Hex.h" #include "netignite/Improv.h" +#include "netignite/LogRing.h" #include "netignite/Mac.h" #include "netignite/MagicPacket.h" #include "netignite/Protocol.h" #include "netignite/SerialDemux.h" #include "netignite/ServerUrl.h" +#include "netignite/Validation.h" using namespace netignite; @@ -376,6 +379,266 @@ void test_split_command_line() { void test_hex() { const uint8_t bytes[] = {0x00, 0x0f, 0xa5, 0xff}; TEST_ASSERT_EQUAL_STRING("000fa5ff", toHex(bytes, sizeof(bytes)).c_str()); + + std::vector decoded; + TEST_ASSERT_TRUE(fromHex("000FA5ff", decoded)); + TEST_ASSERT_EQUAL_size_t(4, decoded.size()); + TEST_ASSERT_EQUAL_UINT8_ARRAY(bytes, decoded.data(), 4); + TEST_ASSERT_TRUE(fromHex("", decoded)); + TEST_ASSERT_EQUAL_size_t(0, decoded.size()); + TEST_ASSERT_FALSE(fromHex("abc", decoded)); + TEST_ASSERT_FALSE(fromHex("zz", decoded)); + TEST_ASSERT_EQUAL_size_t(0, decoded.size()); +} + +// --- Validation -------------------------------------------------------------------------------- + +void test_validation() { + TEST_ASSERT_TRUE(isValidHostname("Garage-ESP32")); + TEST_ASSERT_TRUE(isValidHostname("a")); + TEST_ASSERT_FALSE(isValidHostname("")); + TEST_ASSERT_FALSE(isValidHostname("-a")); + TEST_ASSERT_FALSE(isValidHostname("a-")); + TEST_ASSERT_FALSE(isValidHostname("Garage ESP32")); + TEST_ASSERT_FALSE(isValidHostname(std::string(64, 'a'))); + + TEST_ASSERT_TRUE(isValidIpv4("192.168.1.5")); + TEST_ASSERT_TRUE(isValidIpv4("0.0.0.0")); + TEST_ASSERT_TRUE(isValidIpv4("255.255.255.255")); + TEST_ASSERT_FALSE(isValidIpv4("256.1.1.1")); + TEST_ASSERT_FALSE(isValidIpv4("1.2.3")); + TEST_ASSERT_FALSE(isValidIpv4("1.2.3.4.5")); + TEST_ASSERT_FALSE(isValidIpv4("01.2.3.4")); + TEST_ASSERT_FALSE(isValidIpv4("1..3.4")); + TEST_ASSERT_FALSE(isValidIpv4("1.2.3.4.")); + TEST_ASSERT_FALSE(isValidIpv4("a.b.c.d")); + TEST_ASSERT_FALSE(isValidIpv4("")); +} + +// --- Log ring ---------------------------------------------------------------------------------- + +void test_log_ring_reads_from_a_cursor() { + LogRing ring(1000); + ring.push("one"); + ring.push("two"); + ring.push("three"); + TEST_ASSERT_EQUAL_UINT32(3, ring.nextSeq()); + + std::vector lines; + auto result = ring.read(1, 1000, lines); + TEST_ASSERT_EQUAL_size_t(2, lines.size()); + TEST_ASSERT_EQUAL_STRING("two", lines[0].c_str()); + TEST_ASSERT_EQUAL_UINT32(3, result.next); + TEST_ASSERT_EQUAL_UINT32(0, result.dropped); + + // Nothing new: empty read, cursor stays. + lines.clear(); + result = ring.read(3, 1000, lines); + TEST_ASSERT_EQUAL_size_t(0, lines.size()); + TEST_ASSERT_EQUAL_UINT32(3, result.next); +} + +void test_log_ring_drops_old_lines_and_reports_them() { + LogRing ring(10); + ring.push("aaaa"); // seq 0 + ring.push("bbbb"); // seq 1 + ring.push("cccc"); // seq 2: drops seq 0 + TEST_ASSERT_EQUAL_size_t(8, ring.bytes()); + + std::vector lines; + const auto result = ring.read(0, 1000, lines); + TEST_ASSERT_EQUAL_UINT32(1, result.dropped); + TEST_ASSERT_EQUAL_size_t(2, lines.size()); + TEST_ASSERT_EQUAL_STRING("bbbb", lines[0].c_str()); + TEST_ASSERT_EQUAL_UINT32(3, result.next); +} + +void test_log_ring_limits_bytes_and_line_length() { + LogRing ring(10000); + ring.push(std::string(500, 'x')); + TEST_ASSERT_EQUAL_size_t(LogRing::MAX_LINE, ring.bytes()); + ring.push("abc"); + ring.push("def"); + + std::vector lines; + auto result = ring.read(0, 245, lines); + // The first line is always returned, even if it alone exceeds the budget. + TEST_ASSERT_EQUAL_size_t(2, lines.size()); + TEST_ASSERT_EQUAL_UINT32(2, result.next); + lines.clear(); + result = ring.read(result.next, 245, lines); + TEST_ASSERT_EQUAL_size_t(1, lines.size()); + TEST_ASSERT_EQUAL_STRING("def", lines[0].c_str()); + + // A cursor from the future (after a reboot) reads from the end. + lines.clear(); + result = ring.read(1000, 245, lines); + TEST_ASSERT_EQUAL_size_t(0, lines.size()); + TEST_ASSERT_EQUAL_UINT32(3, result.next); +} + +// --- OTA, config and log requests -------------------------------------------------------------- + +static const char* const SHA = + "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; + +void test_parse_ota_request() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + protocol::OtaRequest ota; + + std::string text = std::string(R"({"t":"req","id":1,"cmd":"OTA_BEGIN","p":{"version":"2.1.0-beta.1",)") + + R"("path":"/api/v1/firmware/2.1.0-beta.1/files/firmware.bin","size":1260048,"sha256":")" + SHA + + R"("}})"; + TEST_ASSERT_TRUE(protocol::parseFrame(text, doc, frame, error)); + TEST_ASSERT_TRUE(protocol::parseOtaRequest(frame.payload, ota, error)); + TEST_ASSERT_EQUAL_STRING("2.1.0-beta.1", ota.version.c_str()); + TEST_ASSERT_EQUAL_STRING("/api/v1/firmware/2.1.0-beta.1/files/firmware.bin", ota.path.c_str()); + TEST_ASSERT_EQUAL_UINT32(1260048, ota.size); + TEST_ASSERT_EQUAL_HEX8(0x01, ota.sha256[0]); + TEST_ASSERT_EQUAL_HEX8(0xef, ota.sha256[31]); + TEST_ASSERT_EQUAL_size_t(0, ota.signature.size()); +} + +void test_parse_ota_request_rejects_invalid() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + protocol::OtaRequest ota; + + const std::string valid = std::string(R"("version":"2.1.0","size":1000,"sha256":")") + SHA + "\""; + auto parse = [&](const std::string& payload) { + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"OTA_BEGIN","p":{)" + payload + "}}", doc, frame, error); + return protocol::parseOtaRequest(frame.payload, ota, error); + }; + + TEST_ASSERT_TRUE(parse(valid + R"(,"path":"/api/v1/firmware/2.1.0/files/firmware.bin")")); + TEST_ASSERT_EQUAL_size_t(0, ota.signature.size()); + TEST_ASSERT_TRUE(parse(valid + R"(,"path":"/f.bin","signature":")" + std::string(142, 'a') + "\"")); + TEST_ASSERT_EQUAL_size_t(71, ota.signature.size()); + + TEST_ASSERT_FALSE(parse(valid + R"(,"path":"https://evil.example/f.bin")")); + TEST_ASSERT_FALSE(parse(valid + R"(,"path":"//evil.example/f.bin")")); + TEST_ASSERT_FALSE(parse(valid + R"(,"path":"/api/../../f.bin")")); + TEST_ASSERT_FALSE(parse(valid + R"(,"path":"/f.bin?x=1")")); + TEST_ASSERT_FALSE(parse(valid + R"(,"path":"/f.bin","signature":"xyz")")); + TEST_ASSERT_FALSE(parse(std::string(R"("version":"2.1.0","size":2000000,"sha256":")") + SHA + R"(","path":"/f")")); + TEST_ASSERT_FALSE(parse(std::string(R"("version":"2.1.0","size":0,"sha256":")") + SHA + R"(","path":"/f")")); + TEST_ASSERT_FALSE(parse(R"("version":"2.1.0","size":10,"sha256":"abcd","path":"/f")")); + TEST_ASSERT_FALSE(parse(std::string(R"("version":"2 1","size":10,"sha256":")") + SHA + R"(","path":"/f")")); +} + +void test_parse_config_request() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + protocol::ConfigRequest config; + auto parse = [&](const std::string& payload) { + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"CONFIG_SET","p":)" + payload + "}", doc, frame, error); + return protocol::parseConfigRequest(frame.payload, config, error); + }; + + TEST_ASSERT_TRUE(parse(R"({"server_url":"https://netignite.example/","name":"Garage-ESP32","log_level":"debug"})")); + TEST_ASSERT_EQUAL_STRING("https://netignite.example", config.serverUrl->c_str()); + TEST_ASSERT_EQUAL_STRING("Garage-ESP32", config.name->c_str()); + TEST_ASSERT_EQUAL_STRING("debug", config.logLevel->c_str()); + TEST_ASSERT_FALSE(config.ip.has_value()); + + TEST_ASSERT_TRUE(parse(R"({"ip":{"mode":"static","address":"192.168.1.50","gateway":"192.168.1.1","netmask":"255.255.255.0","dns1":"1.1.1.1"}})")); + TEST_ASSERT_TRUE(config.ip->isStatic); + TEST_ASSERT_EQUAL_STRING("192.168.1.50", config.ip->address.c_str()); + TEST_ASSERT_EQUAL_STRING("1.1.1.1", config.ip->dns1.c_str()); + TEST_ASSERT_EQUAL_STRING("", config.ip->dns2.c_str()); + + TEST_ASSERT_TRUE(parse(R"({"ip":{"mode":"dhcp"}})")); + TEST_ASSERT_FALSE(config.ip->isStatic); + + TEST_ASSERT_FALSE(parse(R"({})")); + TEST_ASSERT_FALSE(parse(R"({"server_url":"ftp://x"})")); + TEST_ASSERT_FALSE(parse(R"({"name":"Garage ESP32"})")); + TEST_ASSERT_FALSE(parse(R"({"log_level":"verbose"})")); + TEST_ASSERT_FALSE(parse(R"({"ip":{"mode":"static","address":"192.168.1.50","gateway":"192.168.1.1"}})")); + TEST_ASSERT_FALSE(parse(R"({"ip":{"mode":"static","address":"192.168.1.500","gateway":"192.168.1.1","netmask":"255.255.255.0"}})")); + TEST_ASSERT_FALSE(parse(R"({"ip":{"mode":"magic"}})")); +} + +void test_parse_log_subscribe() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + bool enabled = false; + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"LOG_SUBSCRIBE","p":{"enabled":true}})", doc, frame, error); + TEST_ASSERT_TRUE(protocol::parseLogSubscribe(frame.payload, enabled, error)); + TEST_ASSERT_TRUE(enabled); + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"LOG_SUBSCRIBE","p":{"enabled":"yes"}})", doc, frame, error); + TEST_ASSERT_FALSE(protocol::parseLogSubscribe(frame.payload, enabled, error)); +} + +// --- SSH --------------------------------------------------------------------------------------- + +void test_base64() { + const auto b64 = [](const char* text, bool pad) { + return toBase64(reinterpret_cast(text), strlen(text), pad); + }; + TEST_ASSERT_EQUAL_STRING("", b64("", true).c_str()); + TEST_ASSERT_EQUAL_STRING("Zg==", b64("f", true).c_str()); + TEST_ASSERT_EQUAL_STRING("Zm8=", b64("fo", true).c_str()); + TEST_ASSERT_EQUAL_STRING("Zm9v", b64("foo", true).c_str()); + TEST_ASSERT_EQUAL_STRING("Zm9vYmFy", b64("foobar", true).c_str()); + TEST_ASSERT_EQUAL_STRING("Zg", b64("f", false).c_str()); + TEST_ASSERT_EQUAL_STRING("Zm8", b64("fo", false).c_str()); + + const uint8_t zeros[32] = {}; + TEST_ASSERT_EQUAL_STRING(("SHA256:" + std::string(43, 'A')).c_str(), protocol::sshFingerprint(zeros).c_str()); +} + +void test_parse_ssh_requests() { + JsonDocument doc; + protocol::Frame frame; + std::string error; + protocol::SshRequest ssh; + const std::string key = "SHA256:" + std::string(43, 'b'); + auto parse = [&](const std::string& payload, bool exec) { + protocol::parseFrame(R"({"t":"req","id":1,"cmd":"SSH","p":)" + payload + "}", doc, frame, error); + return protocol::parseSshRequest(frame.payload, exec, ssh, error); + }; + + TEST_ASSERT_TRUE(parse(R"({"host":"192.168.1.20","port":22,"username":"admin","auth":{"type":"password","password":"pw"},"host_key":null})", false)); + TEST_ASSERT_EQUAL_STRING("192.168.1.20", ssh.host.c_str()); + TEST_ASSERT_EQUAL(static_cast(protocol::SshRequest::Auth::Password), static_cast(ssh.auth)); + TEST_ASSERT_EQUAL_STRING("pw", ssh.secret.c_str()); + TEST_ASSERT_TRUE(ssh.hostKey.empty()); + + const std::string exec = R"({"host":"nas.local","port":2222,"username":"DOMAIN\\admin","auth":{"type":"key","private_key":"-----BEGIN OPENSSH PRIVATE KEY-----\nabc\n"},"host_key":")" + + key + R"(","action":"reboot","os":"posix","sudo":true})"; + TEST_ASSERT_TRUE(parse(exec, true)); + TEST_ASSERT_EQUAL_UINT16(2222, ssh.port); + TEST_ASSERT_EQUAL_STRING("DOMAIN\\admin", ssh.username.c_str()); + TEST_ASSERT_EQUAL(static_cast(protocol::SshRequest::Auth::Key), static_cast(ssh.auth)); + TEST_ASSERT_EQUAL_STRING(key.c_str(), ssh.hostKey.c_str()); + TEST_ASSERT_EQUAL_STRING("sudo -n shutdown -r now", protocol::sshCommand(ssh).c_str()); + + ssh.sudo = false; + ssh.action = protocol::SshRequest::Action::Shutdown; + TEST_ASSERT_EQUAL_STRING("shutdown -h now", protocol::sshCommand(ssh).c_str()); + ssh.windows = true; + TEST_ASSERT_EQUAL_STRING("shutdown /s /t 0", protocol::sshCommand(ssh).c_str()); + ssh.action = protocol::SshRequest::Action::Reboot; + TEST_ASSERT_EQUAL_STRING("shutdown /r /t 0", protocol::sshCommand(ssh).c_str()); + + // SSH_EXEC needs a trusted host key, a known action and OS. + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":22,"username":"a","auth":{"type":"password","password":"pw"},"host_key":null,"action":"reboot","os":"posix","sudo":false})", true)); + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":22,"username":"a","auth":{"type":"password","password":"pw"},"host_key":")" + key + R"(","action":"rm -rf /","os":"posix","sudo":false})", true)); + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":22,"username":"a","auth":{"type":"password","password":"pw"},"host_key":")" + key + R"(","action":"reboot","os":"amiga","sudo":false})", true)); + + TEST_ASSERT_FALSE(parse(R"({"host":"","port":22,"username":"a","auth":{"type":"password","password":"pw"}})", false)); + TEST_ASSERT_FALSE(parse(R"({"host":"a b","port":22,"username":"a","auth":{"type":"password","password":"pw"}})", false)); + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":0,"username":"a","auth":{"type":"password","password":"pw"}})", false)); + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":22,"username":"a b","auth":{"type":"password","password":"pw"}})", false)); + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":22,"username":"a","auth":{"type":"cert","password":"pw"}})", false)); + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":22,"username":"a","auth":{"type":"password","password":""}})", false)); + TEST_ASSERT_FALSE(parse(R"({"host":"h","port":22,"username":"a","auth":{"type":"password","password":"pw"},"host_key":"MD5:aa"})", false)); } int main(int, char**) { @@ -406,5 +669,15 @@ int main(int, char**) { RUN_TEST(test_encode_frames); RUN_TEST(test_split_command_line); RUN_TEST(test_hex); + RUN_TEST(test_validation); + RUN_TEST(test_log_ring_reads_from_a_cursor); + RUN_TEST(test_log_ring_drops_old_lines_and_reports_them); + RUN_TEST(test_log_ring_limits_bytes_and_line_length); + RUN_TEST(test_parse_ota_request); + RUN_TEST(test_parse_ota_request_rejects_invalid); + RUN_TEST(test_parse_config_request); + RUN_TEST(test_parse_log_subscribe); + RUN_TEST(test_base64); + RUN_TEST(test_parse_ssh_requests); return UNITY_END(); } From 02be401af668d4f79c5eecd792774521034e4a36 Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Wed, 21 Oct 2026 12:39:04 +0200 Subject: [PATCH 5/8] docs: add a changelog --- CHANGELOG.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fe5e5ef --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,45 @@ +# Changelog + +## 2.0.0-beta.2 (unreleased) + +Needs NetIgnite server 2.0.0-beta.2 or newer for updates, the console and SSH. + +### New + +- **Firmware updates over the network** (`OTA_BEGIN`): the agent downloads the image from its + server, checks size and SHA-256 and, if the firmware has a public key compiled in + (`keys/firmware-signing.pub.pem`), the ECDSA P-256 signature. The new firmware is on probation + until it reaches the server; if it crashes or doesn't get there within 5 minutes, the previous + firmware starts again and the agent reports the failed version. +- **Console** for the dashboard: the last 16 KB of log lines (including ESP-IDF's messages), a live + log stream, current diagnostics, log level, server address, host name and IP settings (a new + server address or IP setting is only saved once the agent reaches the server with it), restart + and factory reset. +- **SSH logins** to devices in the agent's network (libssh): status checks that only authenticate, + and shutdown/reboot with a trusted host key and fixed commands. +- The web installer can set the agent's name. + +### Changed + +- Enrollment sends the agent kind; a token of a Linux agent is rejected without being used up. +- Firmware size with libssh: 79% of an OTA slot. + +### Tests + +- The emulator tests install updates over the serial port and check signature and SHA-256 + rejection, probation and rollback in QEMU; CI runs them. + +## 2.0.0-beta.1 (2026-10-20) + +Firmware v2 for NetIgnite server v2. Flash it once over USB (or with the server's web installer): +the partition table changed for over-the-air updates. + +- Settings in NVS instead of a compiled-in `config.h`: Wi-Fi (Improv or the serial console), + server URL, enrollment token, static IP, name, log level. +- Enrollment with a single-use token; the agent generates its own secret. +- Agent protocol v2: Wake-on-LAN, status checks by IPv6 link-local (from the MAC), IPv4, IPv6, + host name and TCP port. +- Serial console commands (`help`, `status`, `setup`, `wifi`, `server`, `enroll`, `ip`, `name`, + `log`, `reboot`, `factory-reset`). +- Two 1.875 MB app slots; pioarduino (Arduino-ESP32 3.3, ESP-IDF 5.5). +- Releases with the flash images and `release.json` for the server's web installer. From 6cd82a07076b2147d29f238755c25e9ec71a3f81 Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Wed, 21 Oct 2026 13:24:27 +0200 Subject: [PATCH 6/8] docs: describe the web installer, OTA updates and SSH in the README --- README.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3c314a4..a7792c2 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # NetIgnite ESP32 Agent Firmware that turns an ESP32 into a [NetIgnite](https://netignite.dev) agent: it joins your Wi-Fi, -keeps a connection to your NetIgnite server, sends Wake-on-LAN packets and checks whether devices -in its network are online. +keeps a connection to your NetIgnite server, sends Wake-on-LAN packets, checks whether devices in +its network are online and can shut them down over SSH. It updates itself over the network. > **v2 (in development).** Works with NetIgnite server v2. Configuration no longer lives in -> `config.h`: the agent is set up over the serial port (and, soon, from the browser). +> `config.h`: the agent is set up from the browser with the server's web installer, or over the +> serial port. ## Hardware @@ -15,6 +16,15 @@ in its network are online. ## Set up an agent +The easiest way is the server's **web installer**: in the NetIgnite dashboard, **Agents → Add +agent → ESP32**, then the agent's **Install** tab. It flashes the firmware from the browser +(Chrome, Edge or Firefox 151+, over HTTPS) together with an NVS image that holds the server URL, +the agent's name and a single-use enrollment token, and then sends your Wi-Fi settings to the +ESP32 with [Improv Wi-Fi](https://www.improv-wifi.com/serial/). The Wi-Fi password never reaches +the server. The installer also changes the Wi-Fi of an installed agent. + +Without the installer, over the serial port: + 1. In the NetIgnite dashboard: **Agents → Add agent → ESP32**. 2. Flash the firmware (see [Build and flash](#build-and-flash)) and open the serial console (115200 baud, e.g. `pio device monitor`). @@ -30,10 +40,6 @@ in its network are online. The agent enrolls once with that single-use token. It generates its own secret with the hardware random number generator; the server only stores a hash of it, and it is never shown or printed. -The web installer will do steps 2–4 from the browser: it writes the server URL and a token into -the agent's NVS partition while flashing, and sends the Wi-Fi settings with -[Improv Wi-Fi](https://www.improv-wifi.com/serial/), which the firmware already supports. - ## Console commands | Command | | From a02f67ba7850b5dba611e3fb2f58b8d0a3678f9a Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Wed, 21 Oct 2026 20:51:50 +0200 Subject: [PATCH 7/8] test: make the emulator console test reliable on CI runners On GitHub's runners the console didn't answer short commands after a restart: QEMU's UART only hands received bytes to the firmware in blocks of its FIFO threshold. Commands are now followed by empty lines (like in the OTA test). Restarts are power cycles of QEMU, because a software restart with serial input still arriving crashes the next boot in the emulator. --- test/emulator/README.md | 13 ++-- test/emulator/improv-test.ts | 134 ++++++++++++++++++++++------------- 2 files changed, 91 insertions(+), 56 deletions(-) diff --git a/test/emulator/README.md b/test/emulator/README.md index effc318..bdf13cb 100644 --- a/test/emulator/README.md +++ b/test/emulator/README.md @@ -28,9 +28,12 @@ The OTA upload over the emulated serial port takes a few minutes. Download QEMU from the [releases](https://github.com/espressif/qemu/releases) (`qemu-xtensa-softmmu-*`). The tests start it with the timer-group watchdogs disabled, like ESP-IDF's own QEMU runner; with them enabled, slow hosts reset or crash the emulated chip during -boot. After the firmware has used the bignum accelerator (the ECDSA signature check of an update), a -software restart crashes in QEMU: the next boot takes a stale interrupt in the task watchdog's -handler. Real chips use the same accelerator for every TLS handshake and restart fine, so -`ota-test.ts` power-cycles QEMU instead whenever the device restarts (the flash file keeps what was -written). If a check fails, the test prints the device's serial output, and CI keeps it as the +boot. Two QEMU quirks the tests work around (real chips have neither): + +- QEMU keeps peripheral state across a software restart. An interrupt left over from before (the + bignum accelerator after an update's ECDSA check, or serial input that is still arriving) crashes + the next boot in the task watchdog's handler. So the tests check that the device announces the + restart, then power-cycle QEMU instead; the flash file keeps what was written. +- The emulated UART hands received bytes to the firmware only in blocks of its FIFO threshold, so a + short line can wait for more input. The tests send empty lines after every command. If a check fails, the test prints the device's serial output, and CI keeps it as the `emulator-serial-log` artifact. diff --git a/test/emulator/improv-test.ts b/test/emulator/improv-test.ts index 1fc1e90..a7bc46f 100644 --- a/test/emulator/improv-test.ts +++ b/test/emulator/improv-test.ts @@ -24,53 +24,73 @@ flash.set(factory, 0); const flashPath = `${workDir}/flash-improv.bin`; await Bun.write(flashPath, flash); -const qemu = Bun.spawn( - [ - qemuPath, - "-nographic", - "-machine", - "esp32", - "-drive", - `file=${flashPath},if=mtd,format=raw`, - "-serial", - `tcp:127.0.0.1:${PORT},server,wait=on`, - "-monitor", - "none", - // Like ESP-IDF's own QEMU runner: an emulated chip on a slow host would otherwise be reset by - // the timer-group watchdogs during boot, over and over. - "-global", - "driver=timer.esp32.timg,property=wdt_disable,value=true", - ], - { stdout: "ignore", stderr: "inherit" }, -); - -// --- Serial port shim (Web Serial-like readable/writable over the TCP socket) ---------------------- +// --- QEMU and a serial port shim (Web Serial-like readable/writable over the TCP socket) ---------- let transcript = ""; let controller: ReadableStreamDefaultController | null = null; - +let qemu: ReturnType; let socket: Awaited> | null = null; -for (let attempt = 0; attempt < 50 && !socket; attempt++) { - try { - socket = await Bun.connect({ - hostname: "127.0.0.1", - port: PORT, - socket: { - data(_s, data) { - const bytes = new Uint8Array(data); - transcript += new TextDecoder().decode(bytes); - try { - controller?.enqueue(bytes); - } catch { - controller = null; - } + +async function startQemu() { + qemu = Bun.spawn( + [ + qemuPath, + "-nographic", + "-machine", + "esp32", + "-drive", + `file=${flashPath},if=mtd,format=raw`, + "-serial", + `tcp:127.0.0.1:${PORT},server,wait=on`, + "-monitor", + "none", + // Like ESP-IDF's own QEMU runner: an emulated chip on a slow host would otherwise be reset by + // the timer-group watchdogs during boot, over and over. + "-global", + "driver=timer.esp32.timg,property=wdt_disable,value=true", + ], + { stdout: "ignore", stderr: "inherit" }, + ); + + socket = null; + for (let attempt = 0; attempt < 50 && !socket; attempt++) { + try { + socket = await Bun.connect({ + hostname: "127.0.0.1", + port: PORT, + socket: { + data(_s, data) { + const bytes = new Uint8Array(data); + transcript += new TextDecoder().decode(bytes); + try { + controller?.enqueue(bytes); + } catch { + controller = null; + } + }, }, - }, - }); - } catch { - await sleep(200); + }); + } catch { + await sleep(200); + } } + if (!socket) throw new Error("QEMU serial port didn't open"); +} + +/** + * Restarts the emulated chip from power-on (the flash file keeps what was written). Used instead + * of the firmware's own restart: QEMU keeps peripheral state across a software restart that a real + * chip resets, and an interrupt left over from before (e.g. from serial input that is still + * arriving) crashes the next boot in the task watchdog's handler. + */ +async function powerCycle() { + socket?.end(); + qemu.kill(); + await qemu.exited; + transcript += "\n--- power cycle ---\n"; + await startQemu(); } -if (!socket) throw new Error("QEMU serial port didn't open"); + +await startQemu(); const port = { get readable() { @@ -100,16 +120,23 @@ async function waitFor(text: string, timeoutMs: number, from = 0) { return -1; } +/** + * Sends a console line, followed by empty lines (which the console ignores): QEMU's UART only hands + * received bytes to the firmware in blocks of its FIFO threshold, so a short line can otherwise + * wait for more input. It did on CI runners after a restart (and made the v2.0.0-beta.1 tag build + * fail). A real UART flushes on its idle timeout. + */ +function sendLine(line: string) { + socket!.write(`${line}\n${"\n".repeat(128)}`); +} + async function command(line: string, expect: string, timeoutMs = 8000) { const from = transcript.length; - socket!.write(`${line}\n`); + sendLine(line); return (await waitFor(expect, timeoutMs, from)) >= 0; } -/** - * Right after a restart the emulated UART sometimes loses the first input on slow CI runners (it - * made the v2.0.0-beta.1 tag build fail); repeat the harmless command a few times. - */ +/** Right after a restart the console may not run yet on slow runners: repeat the harmless command. */ async function commandAfterRestart(line: string, expect: string) { for (let attempt = 0; attempt < 3; attempt++) { if (await command(line, expect)) return true; @@ -174,14 +201,18 @@ try { check("enrollment token never printed", !transcript.includes("netignite_enroll_abc:def")); // --- Settings survive a restart --------------------------------------------------------------- + check("reboot command restarts", await command("reboot", "Restarting...")); + await powerCycle(); const beforeReboot = transcript.length; - socket.write("reboot\n"); - check("reboots", (await waitFor("I Device kitchen-esp", BOOT_TIMEOUT_MS, beforeReboot)) >= 0); + check("boots again with its settings", (await waitFor("I Device kitchen-esp", BOOT_TIMEOUT_MS, beforeReboot)) >= 0); await waitFor("[", 5000, transcript.length); await sleep(1500); - const statusFrom = transcript.length; - socket.write("status\n"); - await waitFor("partition:", 8000, statusFrom); + let statusFrom = transcript.length; + for (let attempt = 0; attempt < 3; attempt++) { + statusFrom = transcript.length; + sendLine("status"); + if ((await waitFor("partition:", 8000, statusFrom)) >= 0) break; + } const status = transcript.slice(statusFrom); check("server URL persisted", status.includes("server: http://[fd00::1]:18232"), status); check("device name persisted", status.includes("device: kitchen-esp"), status); @@ -193,6 +224,7 @@ try { await improv2.close(); check("factory reset erases everything", await command("factory-reset confirm", "All settings erased")); + await powerCycle(); const afterReset = transcript.length; await waitFor("I Device NetIgnite-", BOOT_TIMEOUT_MS, afterReset); await sleep(1500); From ae52dd14b10b53042687792f731e5277a935d143 Mon Sep 17 00:00:00 2001 From: Linus Fischer Date: Wed, 21 Oct 2026 22:15:45 +0200 Subject: [PATCH 8/8] docs: changelog for 2.0.0 --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe5e5ef..188c38c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ # Changelog -## 2.0.0-beta.2 (unreleased) +## 2.0.0 (2026-10-21) + +The first stable release of the ESP32 firmware v2, for NetIgnite server 2.0.0. No changes since +2.0.0-beta.2; everything it can do is listed below. + +### Upgrading from v1 + +Boards with the v1 firmware (built with PlatformIO and `config.h`) can't connect to a v2 server. +Install 2.0.0 once over USB with the dashboard's web installer (the agent's **Install** tab, in +Chrome, Edge or Firefox 151+): the partition table changed for updates over the network. Later +versions install over the network. + +## 2.0.0-beta.2 (2026-10-21) Needs NetIgnite server 2.0.0-beta.2 or newer for updates, the console and SSH.