diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0661c90..622fdce2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -98,6 +98,38 @@ jobs: path: dist/usb-*.bin if-no-files-found: error + pico-build: + name: Pico firmware build (${{ matrix.env }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + env: [galactic_unicorn, galactic_unicorn_2w] + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + - uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Cache PlatformIO + uses: actions/cache@v5 + with: + path: | + ~/.platformio + ~/.cache/pip + key: pio-${{ matrix.env }}-${{ hashFiles('platformio.ini') }} + - name: Install PlatformIO + run: pip install -U platformio esptool + - name: Build firmware + run: pio run -e ${{ matrix.env }} + - uses: actions/upload-artifact@v4 + with: + name: uf2-${{ matrix.env }} + path: .pio/build/${{ matrix.env }}/firmware.uf2 + if-no-files-found: error + docs: name: API docs match the firmware runs-on: ubuntu-latest @@ -153,11 +185,19 @@ jobs: # overlap or a misaligned app offset only shows up once someone flashes # it. Cheap to check here, expensive to discover in the field. run: python tools/check_partitions.py + - name: Check both firmwares register the shared built-in catalog + # main.cpp and main_rp2040.cpp each wire core/BuiltinCatalog.h in by hand; one that + # drifts back to its own list ships a different set of apps and effects. + run: python tools/check_builtin_registration.py + - name: Test the UF2 filesystem reservation check + # check_partitions.py also validates each UF2 environment's LittleFS size; these + # cases prove it rejects a bad or missing reservation instead of passing everything. + run: python test/test_partition_reservations.py release: name: Publish firmware release if: startsWith(github.ref, 'refs/tags/v') - needs: [native-tests, webui-tests, device-build, docs] + needs: [native-tests, webui-tests, device-build, pico-build, docs] runs-on: ubuntu-latest permissions: contents: write @@ -174,7 +214,7 @@ jobs: - name: Install PlatformIO run: pip install -U platformio esptool - name: Build every firmware image - run: pio run -e awtrix -e awtrix_s3_octal -e awtrix_s3_quad + run: pio run -e awtrix -e awtrix_s3_octal -e awtrix_s3_quad -e galactic_unicorn -e galactic_unicorn_2w - name: Stage OTA assets # The file a user uploads to /update. One per SoC, and one more for the # S3's quad-PSRAM boards, whose PSRAM mode is compiled into the framework @@ -185,6 +225,12 @@ jobs: cp .pio/build/awtrix/firmware.bin firmware-awtrix-ng.bin cp .pio/build/awtrix_s3_octal/firmware.bin firmware-awtrix-ng-s3-octal.bin cp .pio/build/awtrix_s3_quad/firmware.bin firmware-awtrix-ng-s3-quad.bin + - name: Stage the Galactic Unicorn images + # A Pico has no OTA: the UF2 dropped on its BOOTSEL drive is both the first install and + # every update, so each Pico gets exactly one file. + run: | + cp .pio/build/galactic_unicorn/firmware.uf2 firmware-galactic-unicorn.uf2 + cp .pio/build/galactic_unicorn_2w/firmware.uf2 firmware-galactic-unicorn-2w.uf2 - name: Stage the USB install images # What a user flashes over USB: bootloader, partition table, app. The # table is the only part that varies with flash size, which is why one @@ -225,6 +271,8 @@ jobs: firmware-awtrix-ng.bin firmware-awtrix-ng-s3-octal.bin firmware-awtrix-ng-s3-quad.bin + firmware-galactic-unicorn.uf2 + firmware-galactic-unicorn-2w.uf2 usb-awtrix-ng.zip licenses-awtrix-ng.zip - name: Flip the release live, now that every asset is attached diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 25ee0df8..d60a0ca7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,12 +40,14 @@ pip install -U platformio Node 22+ is needed for a firmware build (the web UI is minified through `npx` before it is embedded) and for the web UI tests. -## The four build targets +## The build targets ```bash pio run -e awtrix # ESP32 firmware (stock pin defaults) pio run -e awtrix_s3_octal # ESP32-S3 firmware, octal PSRAM pio run -e awtrix_s3_quad # ESP32-S3 firmware, quad PSRAM +pio run -e galactic_unicorn # Galactic Unicorn firmware, Pico W +pio run -e galactic_unicorn_2w # Galactic Unicorn firmware, Pico 2 W python scripts/test_native.py # host unit tests for the portable core pio run -e native_sim # host simulator: full firmware + web UI, no hardware ``` @@ -63,16 +65,29 @@ Every push runs, and your PR needs all of it green: python scripts/test_native.py # host unit tests pio run -e awtrix # both firmware images build pio run -e awtrix_s3_octal +pio run -e galactic_unicorn # both Pico UF2s build +pio run -e galactic_unicorn_2w python tools/check_docs_sync.py # docs match the firmware's real fields python tools/check_berry_api.py # editor's Berry API table is current python tools/gen_agent_skill.py --check python tools/check_prelude_solidified.py python tools/check_font_sync.py python tools/check_partitions.py +python tools/check_builtin_registration.py +python test/test_partition_reservations.py mkdocs build --strict # docs build, no broken links or anchors cd webui/test && npm install && npm test ``` +To run them all without installing a toolchain, use the CI image in +`tools/container/`: + +```bash +podman build -t awtrix-build tools/container +podman run --rm -v "$PWD":/w:Z -v pio-home:/root/.platformio \ + awtrix-build tools/container/ci-local.sh all +``` + ### Generated files you may have to regenerate Several checked-in files are produced by generators that **no normal build diff --git a/LICENSES/MIT-Pimoroni.txt b/LICENSES/MIT-Pimoroni.txt new file mode 100644 index 00000000..3603980e --- /dev/null +++ b/LICENSES/MIT-Pimoroni.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Pimoroni Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 880757cc..d1b388b9 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ or skip the middleman entirely and **run your app on the device itself.** [![CI](https://github.com/Blueforcer/awtrix-ng/actions/workflows/ci.yml/badge.svg)](https://github.com/Blueforcer/awtrix-ng/actions/workflows/ci.yml) [![Docs](https://github.com/Blueforcer/awtrix-ng/actions/workflows/docs.yml/badge.svg)](https://github.com/Blueforcer/awtrix-ng/actions/workflows/docs.yml) -![Platform](https://img.shields.io/badge/platform-ESP32%20%7C%20ESP32--S3-blue) +![Platform](https://img.shields.io/badge/platform-ESP32%20%7C%20ESP32--S3%20%7C%20RP2040%20%7C%20RP2350-blue) [![License](https://img.shields.io/badge/license-PolyForm%20Noncommercial%201.0.0-lightgrey)](LICENSE.md) 📖 **[Documentation](https://blueforcer.github.io/awtrix-ng/)**  ·  @@ -100,8 +100,11 @@ animations in the browser, and you can share anything you make back to the galle ## 🧩 Hardware & source -Any 32(-128)×8 WS2812-style panel: a commercial clock, an AWTRIX 2 conversion or your own build - same -image, pins set in the web UI. ESP32 and ESP32-S3. +Any 32–128 × 8–16 WS2812-style panel: a commercial clock, an AWTRIX 2 conversion or your own build - same +image, pins set in the web UI. ESP32 and ESP32-S3. Also supports the fixed 53×11 +[Pimoroni Galactic Unicorn](docs/advanced/galactic-unicorn.md) with a Pico W +(RP2040) or Pico 2 W (RP2350), both hardware-verified. Pico images use USB UF2 +updates; optional features follow the device's capabilities. ```bash pio run -e awtrix # build + flash diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 53172b00..1a4df6e2 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,5 +1,9 @@ **Added** +- **Pimoroni Galactic Unicorn support.** Dedicated Pico W and Pico 2 W UF2 builds, fixed 53×11 PIO/DMA display, light sensor, buttons, I²S RTTTL melodies, LittleFS persistence, Wi-Fi provisioning, HTTP/MQTT API, Home Assistant, NTP, discovery, Art-Net and watchdog recovery. Both Pico W and Pico 2 W are hardware-verified. +- **Tall panels.** Configurable height 8–16 for generic panels, with eight-row content centred above full-canvas effects, backgrounds, charts and transitions. +- **Capability-driven controls.** Builds without scripting hide its toggle and editor; unsupported MP3/radio controls remain hidden with an availability note. The Pico builds omit MP3/radio, outbound TLS and browser OTA, so the web UI offers no browser install there; use USB BOOTSEL updates and note that timed sleep is emulated, not deep sleep. +- **Berry scripting on the Galactic Unicorn.** Both Pico builds run scripts and report `scripting: true`: a 48 KB script heap on the Pico W, about 7 KB per script at most, and 96 KB on the Pico 2 W, about 28 KB per script. Script HTTP requests, Modbus reads and script icons are not available on the Pico. - **Install firmware updates from the web UI.** Click **Check for updates**, then **Download & install** and confirm. Updates are checked only when you ask. Your browser downloads and verifies the correct image, then uploads it to AWTRIX with progress shown throughout. Settings and files are kept. - **Modbus TCP for Berry scripts.** Read holding registers, input registers, coils and discrete inputs from local devices without blocking the display. Helpers decode signed integers and 32-bit floating-point values, with configurable host, port and unit ID. - **Timers and delayed actions.** `timer.after()` runs a callback once; `timer.every()` repeats it; `timer.cancel()` cancels it. Timers work in the background, including in headless scripts, and are cleaned up when a script is replaced, removed or fails. @@ -9,6 +13,7 @@ **Changed** +- **BrickBreaker, Snake and PingPong are real mini-games on every panel size.** BrickBreaker shows separate 3-pixel bricks (a third row from 11 rows up) knocked out one at a time, with two bounce angles. Snake chases red food and grows. PingPong has a paddle on each side. BrickBreaker and PingPong keep fixed colours; Snake still takes the palette for its body. - **GIFs keep their own size, up to the panel dimensions.** Scripts, pushed apps and notifications support GIFs sized for custom panels. Text layout follows the icon's actual width; a panel-wide GIF becomes a background. - Each script app manages its own icons and releases them when hidden. File access and streamed log and Wi-Fi scan responses use less temporary memory. - The scripting documentation, AI prompt and downloadable agent skill cover Modbus, timers and extended button events, with corrected settings instructions and guidance for different panel sizes and PSRAM budgets. @@ -27,3 +32,5 @@ | Classic ESP32 - Ulanzi TC001, AWTRIX 2 conversions, most DIY | `firmware-awtrix-ng.bin` | `usb-awtrix-ng-.bin` | | ESP32-S3, octal PSRAM (`N8R8`, `N16R8`) or no PSRAM | `firmware-awtrix-ng-s3-octal.bin` | `usb-awtrix-ng-s3-octal-.bin` | | ESP32-S3, quad PSRAM (`N8R2`, `N16R2`, `N4R2`) | `firmware-awtrix-ng-s3-quad.bin` | `usb-awtrix-ng-s3-quad-.bin` | +| Galactic Unicorn, Pico W | USB BOOTSEL only | `firmware-galactic-unicorn.uf2` | +| Galactic Unicorn, Pico 2 W | USB BOOTSEL only | `firmware-galactic-unicorn-2w.uf2` | diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 895298c7..8cbd7956 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -16,6 +16,16 @@ ones ask for. --- +## Galactic Unicorn display (Pico firmware) + +The display initialization, 14-plane stream layout and PIO program are adapted +from [pimoroni/pimoroni-pico](https://github.com/pimoroni/pimoroni-pico/tree/v1.23.0/libraries/galactic_unicorn), +tag **v1.23.0**, commit `3440ab232cdc2b019bb8d16f67b0448502efd9dc`. +Copyright (c) 2021 Pimoroni Ltd; **MIT**, full notice in +[MIT-Pimoroni.txt](LICENSES/MIT-Pimoroni.txt). +The port excludes pico_graphics and audio, adds dynamic PIO allocation and +tear-free double buffering, and uses the NG gamma setting at 14-bit precision. + ## Compiled into the firmware image These are linked into `firmware-awtrix-ng*.bin`, so their notices travel with diff --git a/docs/advanced/building.md b/docs/advanced/building.md index 5500350e..bb6cffd6 100644 --- a/docs/advanced/building.md +++ b/docs/advanced/building.md @@ -1,8 +1,8 @@ # Building from source -AWTRIX NG is a [PlatformIO](https://platformio.org/) project. Five environments in -`platformio.ini` cover the device firmware, the host unit tests and the host -simulator. +AWTRIX NG is a [PlatformIO](https://platformio.org/) project. Its environments in +`platformio.ini` cover the ESP32 and Galactic Unicorn firmware, the host unit tests +and the host simulator. You need PlatformIO, Python 3 and Node.js. The host tests additionally need CMake 3.20+, Ninja and GCC. Node is used only by the pre-build step that embeds the @@ -12,6 +12,7 @@ You need PlatformIO, Python 3 and Node.js. The host tests additionally need CMak pio run -e awtrix # ESP32 firmware (the default environment) pio run -e awtrix_s3_octal # ESP32-S3 firmware, octal PSRAM pio run -e awtrix_s3_quad # ESP32-S3 firmware, quad PSRAM +pio run -e galactic_unicorn # Galactic Unicorn firmware, Pico W (RP2040) python scripts/test_native.py # host unit tests for the portable core pio run -e native_sim # host simulator: firmware + web UI without an ESP32 ``` @@ -21,8 +22,10 @@ builds the ESP32 firmware. ## Build environments -There are **six**. Three build device firmware (`awtrix`, `awtrix_s3_octal`, -`awtrix_s3_quad`), one is a measurement build of the device firmware (`awtrix_probe`), +There are **nine**. Five build device firmware (`awtrix`, `awtrix_s3_octal`, +`awtrix_s3_quad`, `galactic_unicorn`, `galactic_unicorn_2w`), two are +measurement builds of the device firmware (`awtrix_probe`, +`galactic_unicorn_udp_measure`), and two run on the host (`native`, `native_sim`). ### `awtrix` - the ESP32 firmware @@ -41,7 +44,7 @@ is runtime configuration, not a compile-time choice - see | Partitions | generated by `scripts/gen_partitions.py` | | Upload speed | 921600 | | Monitor speed | 115200 (with `esp32_exception_decoder`) | -| Source filter | `+<*> - -` | +| Source filter | `+<*> - - - -` | ```bash pio run -e awtrix # build @@ -111,6 +114,28 @@ built for the other PSRAM type with `wrongChip` rather than installing it. pio run -e awtrix_s3_quad ``` +### `galactic_unicorn` and `galactic_unicorn_2w` - the Galactic Unicorn firmware + +Pimoroni's Galactic Unicorn, a fixed 53×11 panel, on a Pico W (`galactic_unicorn`) or a +Pico 2 W (`galactic_unicorn_2w`). The source filter is an explicit allowlist, so only +the portable core and the services ported to the Pico are linked. +See [Galactic Unicorn](galactic-unicorn.md) for flashing and features. + +| Property | Value | +|---|---| +| Platform | `maxgerhardt/platform-raspberrypi`, pinned to a tested commit | +| Board | `rpipicow` / `rpipico2w` | +| Framework | `arduino`, earlephilhower core | +| Filesystem | 512 KiB LittleFS | +| Output | `.pio/build//firmware.uf2`, flashed over USB BOOTSEL | + +```bash +pio run -e galactic_unicorn +``` + +`galactic_unicorn_udp_measure` is `galactic_unicorn` without the discovery and Art-Net +services. It only exists to measure what they cost; CI does not build it. + ### `awtrix_probe` - the heap measurement build `awtrix` plus `-D AWTRIX_HEAP_PROBE` and link-time wrapping of `malloc`, `free`, @@ -133,7 +158,7 @@ provides the declared native dependencies. |---|---| | Platform | `native` (host compiler) | | Test framework | `unity` | -| Source filter | `+` plus `transport/ScriptMqttBridge.cpp` | +| Source filter | `+` plus `platform/SocProfile.cpp` and `transport/ScriptMqttBridge.cpp` | | Extra `lib_deps` | `berry` (the vendored interpreter) and `base64` | | Optimisation | `-O2` | @@ -161,7 +186,7 @@ stand-in board hardware, a small HTTP server, and the web UI served from disk. S |---|---| | Platform | `native` (host compiler) | | Defines | `AWTRIX_NATIVE`, `AWTRIX_SIM` | -| Source filter | `core/`, `sim/`, plus `media/GifPlayer.cpp`, `media/MicroGif.cpp`, `media/ScriptIcon.cpp`, `persistence/DeviceConfigJson.cpp`, `persistence/SystemConfigApply.cpp`, `persistence/FsRestoreSink.cpp`, `system/Log.cpp`, `transport/ScriptMqttBridge.cpp`, `transport/DeviceStateJson.cpp`, `transport/mqtt/MqttService.cpp`, `transport/mqtt/MqttLink.cpp`, `transport/mqtt/HaAnnouncer.cpp` | +| Source filter | `core/`, `sim/`, plus `platform/SocProfile.cpp`, `media/GifPlayer.cpp`, `media/MicroGif.cpp`, `media/ScriptIcon.cpp`, `persistence/DeviceConfigJson.cpp`, `persistence/SystemConfigApply.cpp`, `persistence/FsRestoreSink.cpp`, `system/Log.cpp`, `transport/ScriptMqttBridge.cpp`, `transport/DeviceStateJson.cpp`, `transport/mqtt/MqttService.cpp`, `transport/mqtt/MqttLink.cpp`, `transport/mqtt/HaAnnouncer.cpp` | | Extra `lib_deps` | `base64`, `PubSubClient` | ```bash @@ -279,10 +304,11 @@ for the firmware builds and the web UI tests: | Core host unit tests | `python scripts/test_native.py` | The portable `core/` layer | | Web UI tests (jsdom) | `npm test` (in `webui/test`) | The web UI JS logic, loaded from the shipped `webui/index.html` via jsdom | | Firmware build | `pio run -e `, then `scripts/factory_image.py --all` | Every device image - the matrix is `awtrix`, `awtrix_s3_octal`, `awtrix_s3_quad` - and a USB install image per flash size | -| API docs match the firmware | `tools/check_docs_sync.py`, `tools/check_berry_api.py`, `tools/check_prelude_solidified.py`, `tools/check_font_sync.py`, `tools/check_partitions.py` | Documented fields and error codes, the editor's Berry table, the solidified prelude, the generated panel font, and every partition table | +| Pico firmware build | `pio run -e ` | `galactic_unicorn` and `galactic_unicorn_2w`; each UF2 is uploaded as the `uf2-` artifact | +| API docs match the firmware | `tools/check_docs_sync.py`, `tools/check_berry_api.py`, `tools/check_prelude_solidified.py`, `tools/check_font_sync.py`, `tools/check_partitions.py`, `tools/check_builtin_registration.py`, `test/test_partition_reservations.py` | Documented fields and error codes, the editor's Berry table, the solidified prelude, the generated panel font, every partition table, and the shared built-in catalog; the partition check also validates each UF2 filesystem reservation | -On a `v*` tag a release job additionally publishes every OTA image and the USB install -images for each supported flash size. +On a `v*` tag a release job additionally publishes every OTA image, the USB install +images for each supported flash size and the Galactic Unicorn UF2s. A second workflow, `.github/workflows/docs.yml`, builds this documentation with `mkdocs build --strict` and fails on broken links and anchors. diff --git a/docs/advanced/diy-build.md b/docs/advanced/diy-build.md index 511be955..ea4ca210 100644 --- a/docs/advanced/diy-build.md +++ b/docs/advanced/diy-build.md @@ -169,7 +169,7 @@ Required blocks are the panel and its supply; everything to the left and below i WS2812B panel 32 x 8 = 256 LEDs -height is always 8 px +height is 8–16 px @@ -483,11 +483,12 @@ AWTRIX holds high from startup so the amplifier plays. ## 6. Describe the panel -The pixel height is fixed at 8. Everything else about your matrix is configuration: +The pixel height defaults to 8 and can be configured from 8 to 16. Describe your matrix with: | Key | Range | Default | Meaning | |---|---|---|---| | `panelWidth` | 1-128 | `32` | Width of one panel. | +| `panelHeight` | 8-16 | `8` | Height of every panel; applies after reboot. | | `panels` | 1-128 | `1` | How many identical panels the cable runs through, left to right. `panelWidth x panels` must land in 32-128. | | `panelStart` | `topLeft` `topRight` `bottomLeft` `bottomRight` | `topLeft` | Corner the first LED sits in. | | `panelWiring` | `rows` `columns` | `rows` | Whether the strip runs along rows or down columns. | diff --git a/docs/advanced/galactic-unicorn-display.md b/docs/advanced/galactic-unicorn-display.md new file mode 100644 index 00000000..b4a4dd5a --- /dev/null +++ b/docs/advanced/galactic-unicorn-display.md @@ -0,0 +1,280 @@ +# Galactic Unicorn display + +The Pico W/Pico 2 W board drives the fixed 53x11 panel using the display half +of Pimoroni pico **v1.23.0** (`3440ab232cdc2b019bb8d16f67b0448502efd9dc`, MIT). +Pimoroni's audio and pico_graphics implementations are not included; RTTTL uses +arduino-pico I²S instead. See `THIRD-PARTY-NOTICES.md` and the +[installation and hardware verification guide](galactic-unicorn.md). + +## Height and wiring + +`panelHeight` defaults to **11**. **8** produces a 53x8 canvas letterboxed on +physical rows **1–8** (zero-based); rows **0, 9, 10** remain dark. Width is +always 53, with one panel and fixed wiring. `PUT /api/v1/system` refuses any +other height and any change to the width, chaining or wiring keys with +`422 validationFailed`; a height stored some other way uses 11 and logs a +warning at board startup. `mirror` and `rotate` flip the picture as on any +panel, and `rotate` also swaps A and C. + +Clock/data/latch/blank are GPIO 13/14/15/16, row selects GPIO 17–20. The +physical stream reverses both axes, matching Pimoroni's original driver. + +## Refresh and color + +One dynamically claimed PIO SM and two chained DMA channels continuously +refresh fourteen binary-weighted bit planes without CPU refresh interrupts. +PIO1 is preferred to leave PIO0 instruction memory for CYW43; allocation checks +both free SMs and program space, and can fall back to PIO0. The startup log +prints the actual display PIO/SM and DMA channels. The Pico variant's early +`init_cyw43_wifi` call is deferred with a linker wrapper until after display +startup. The radio log reports newly claimed PIO/SMs from the SDK allocation +bitmap, without depending on CYW43's private bus structure. After the Wi-Fi join +or AP startup, a bounded DMA-progress probe logs `refresh advancing` (or a +failure). This checks DMA movement, not panel wiring or visual quality; check on +the panel that the boot animation keeps moving while Wi-Fi connects. + +Two aligned 9,240-byte buffers (18,480 bytes total) fit in static RAM. `show()` +packs the inactive buffer, publishes its aligned address, then waits until DMA +has begun reading it before reusing the old buffer. The control channel only +loads a new address at a full-frame boundary. The PIO FIFO preserves ordering +across that boundary. Calls must be serialized on core 0; the board is a single +device-lifetime instance. Each show may wait up to one refresh period; refresh +continues autonomously between calls, including while flash writes run. + +Saturation, gamma, brightness, correction and tint follow NG ColorGrade's +ordering. A 14-bit LUT preserves panel precision instead of first quantizing +to an 8-bit intermediate canvas. Gamma is applied **once**, using the NG gamma +setting (default 1.9), replacing Pimoroni's fixed 2.2 curve. Brightness and color +balance scale linear light **after** gamma, unlike the upstream brightness +pre-scale. There is no second fixed gamma curve. Manual and automatic brightness +use the shared NG periphery service (median filtering, light curve and smoothing). + +## Inputs + +The map and pure debounce/step helpers live in `hal/GalacticUnicornDisplay.h`. +All buttons are active low with internal pull-ups and 35 ms debounce. A held +button acts once, not repeatedly; release and press again for another step. + +| Input | GPIO | Function | +|---|---|---| +| A / B / C | 0 / 1 / 3 | Left / select / right | +| D | 6 | Unmapped | +| Sleep | 27 | Display power toggle | +| Volume up / down | 7 / 8 | `buzzerVolume` +/- 5, clamped 0–100 | +| Brightness up / down | 21 / 26 | `brightness` +/- 10, clamped 0–255; disables auto brightness | +| Light sensor | 28 (ADC2) | Automatic brightness | + +A, B and C also call the [`buttonCallback`](../reference/system.md) webhook on every press and +release, with the same body as an ESP32 (`left`, `middle`, `right`). Connecting and waiting for +the answer are each capped at 300 ms, so an unreachable listener only stalls the display briefly. + +ADC2 supplies native 12-bit counts (0–4095), not lux. Cover/uncover the sensor +with `autoBrightness` enabled to check the shared light curve and configured +min/max brightness and smoothing. Brightness keys select manual mode through +the same settings dispatcher as an API change. Volume keys use the onboard tone +channel setting (`buzzerVolume`), which scales the I2S speaker output from 0 to +100 percent. DFPlayer/MP3/radio volume settings are not changed. + +### Speaker / RTTTL + +The onboard speaker is the `buzzer` capability, not an MP3 output. On successful +I2S initialization the shared capabilities serializer reports +`"audio":{"buzzer":true,"track":false,"mp3":false,"radio":false}`. +Upload `s:d=4,o=6,b=125:c,e,g` as melody `alert`, then send a notification with +`"sound":"alert"`. This reads `/MELODIES/alert.txt`. Inline `soundRtttl` uses the +same parser and overrides `sound` when both are present, just as on ESP32. +Set `buzzerVolume` (0–100) through `/api/v1/settings` or the volume keys. +`soundEnabled` gates new one-shots. + +The arduino-pico I2S library supplied by the pinned PlatformIO platform drives +GPIO 9 (data), 10 (BCLK), 11 (LRCLK); GPIO 22 is LOW when idle or volume is zero. +Samples are signed 16-bit, identical on both channels, at 24 kHz, with linear +amplitude scaling. The square-wave pitch, parsed note/rest lengths and 6 ms +inter-note silence match the buzzer (the amplifier's loudness curve differs). +Three 480-word DMA buffers plus the library silence buffer consume 7680 bytes +on the heap, excluding small buffer descriptors and the parsed melody. +Each loop pass supplies at most 1440 frames with non-blocking writes, before the +frame-rate early return. The last DMA buffer is zero-padded and drained without +waiting in the loop; stop/replacement aborts queued audio. No `flush()` or delay +is used for playback. Network/filesystem stalls longer than the queued audio +can cause silence underruns; they do not make audio block the watchdog loop. + +Audio starts after display and radio initialization. The display claims one SM +(prefer PIO1, then PIO0), 24 instructions and two DMA channels. I2S claims one +free SM, eight instructions and two other DMA channels through the same SDK +allocators, with no fixed channel numbers or MCLK SM. Its startup log reports +new claims as masks (PIO-SM bit = `4 * PIO index + SM`; DMA bit = channel). +A resource failure keeps the amplifier muted and omits the tone capability. +Hearing both notification forms, volume changes, idle mute and concurrent +Wi-Fi/display operation can only be checked on the device. + +A goes to the previous app, C to the next (subject to NG rotate/swapButtons and +blockNavigation). B dismisses a notification; a double press within 300 ms +toggles power unless navigation is blocked. The shared periphery emits the same +`ButtonsChanged` state and left/middle/right callback names as Ulanzi. D is unmapped. +Extra keys dispatch `SetSettings` or `SetDisplay`, emitting normal settings/power +events; settings persist through the existing delayed LittleFS save. Power is +runtime-only, like the API, and fades out/in with NG's power animator; this is not +deep sleep. Button input continues while the panel is off. + +The Pico build includes Wi-Fi, MQTT/HA delivery and an HTTP button callback +adapter. Their source state/events are shared with ESP32, not a private button +protocol. The callback adapter is host-tested; the webhook itself has not +yet been checked on hardware. A/B/C events in Home Assistant and the `alert` +melody are verified on a Pico W. + +ESP32 and Pico register the same `core/BuiltinCatalog.h`: five apps, nineteen +effects and six overlays, including the same palette-enabled subset. Missing +battery/environmental sensors still hide their apps. Boot logs print these +capability lists. With default settings expect Time 00:00/calendar 1, then Date +01.01.24 while the clock is unset. After NTP sync they show local time/date. +Saved settings may differ. + +## Wi-Fi and setup + +The shared `NetworkService` loads stored Wi-Fi credentials and uses the same +boot timeout (15 seconds by default), five-second reconnect checks and weak-signal +roam policy as ESP32. In provisioning mode the Pico retries the saved network every +**60 seconds**, not 30: its one radio can only join on the AP's channel while the AP +is up, so each retry stops the AP and captive DNS for one station-only join (up to +the join timeout) and brings them back if it fails. The setup network disappearing +for those seconds is expected. Retries pause while a phone is attached. +Static IP uses Pico's different argument order and configures both DNS servers. +Pico uses the core's worldwide country default and no-low-power mode, rather +than ESP32's country/scan/sort APIs; strongest-BSSID selection is core-dependent. + +On a fresh boot without credentials, expect the boot logo followed by the +animated rainbow **AP MODE** screen. A phone sees an open SSID +**awtrixng-xxxxxx**, where `xxxxxx` is the last three MAC bytes in lowercase hex +(or the configured hostname). DHCP and wildcard captive DNS use **192.168.4.1**. +Hold **B / SELECT** for one second at boot to force this mode without erasing +credentials. The render priority matches ESP32: power animation, moodlight, +AP screen, Art-Net, normal apps. + +After a successful STA boot, mDNS publishes `.local`, `_http._tcp` +and `_awtrixng._tcp` on the configured web port (default 80), with the same +`id` (lowercase MAC without colons), `name` and `type=awtrixng` TXT records. +LEAmDNS is polled every loop. These records match ESP32. The shared HTTP +server serves the embedded, gzip-compressed web UI and `/api/v1` on port 80 +in AP mode, or `webPort` (default 80) after a station-mode boot. + +### Provision from a phone + +1. Power on without saved credentials, or hold **B / SELECT** for one second + during boot. Join the open `awtrixng-xxxxxx` Wi-Fi network (or your saved + hostname). Accept the phone's **stay connected without Internet** prompt. +2. Open the captive portal, or explicitly browse to **http://192.168.4.1/**. + The setup form offers Wi-Fi scanning or manual SSID entry. Enter your + network name and password and save the changes. +3. Use the form's **Reboot** action to join immediately. Alternatively disconnect + the phone from the AP: every 60 seconds the Pico pauses the AP for a + station-only join, and once it joins the saved network it schedules a reboot + via `setOnJoinedFromAp`. Retries deliberately pause while a phone remains + attached, so do not wait on the open portal. +4. Rejoin your normal Wi-Fi and open **http://awtrixng-xxxxxx.local/** (or + `http://.local:/`). If mDNS is unavailable, + use the address shown in the router's DHCP lease list or USB serial log. +5. Verify the API with `curl -i http://awtrixng-xxxxxx.local/api/v1/device`. + Expect HTTP 200 and JSON containing `uid`, `soc`, `ipAddress`, `freeHeapBytes`, + and `resetReason`. Add the configured port and Basic auth if you enabled them. + +### HTTP port notes + +The shared API enforces the same 8 KiB ordinary-body limit (413), JSON content +type checks (415), and settings validation (422). The Pico WebServer uses +`HTTPServer&` request hooks, including its newer `canRaw` overload; larger +bodies stream into the fixed arena instead of an unbounded String. Uploads +and file/melody listing use LittleFS's File API rather than an ESP VFS mount. +MP3 and radio routes retain the shared 503 `unavailable` policy. Berry scripting is +compiled in (see [Scripting on the Pico W](#scripting-on-the-pico-w)). +`/update` returns 503 `unavailable` with an explicit instruction to flash a +**UF2 over USB using BOOTSEL**; browser OTA is not supported. Use the UF2 built +for the actual Pico W or Pico 2 W, not an ESP32 `.bin` image. + +Device heap facts use `rp2040.getFreeHeap()`. `minFreeHeapBytes` is the minimum +sampled by device-state requests, not an allocator-wide low-water mark. +`largestFreeBlockBytes` estimates the free top-of-heap block; allocator holes +below that block are not enumerated, so it is a conservative estimate. +PSRAM facts remain zero internally and the shared serializer omits those fields +when no PSRAM exists. `scriptHeapPool` is `internal`, with a 48 KB budget on the +Pico W and 96 KB on the Pico 2 W; a build without scripting reports +`unavailable` and 0. +The body-copy guard checks total free heap on Pico, not the largest block; +hardware soak testing is still needed to assess fragmentation and latency. + +## Time, reset and sleep + +The configured POSIX `tz` and `ntpServer` feed the core's asynchronous SNTP +client. It restarts only when either changes, or on a disconnected-to-connected +transition (matching ESP32 reconnect behavior). DNS/NTP retries are asynchronous. +The same `DevicePageClock` as ESP32 converts UTC to local time, including DST; +years before 2020 remain unset. After provisioning, expect AP MODE to go +away and the clock/date to change from placeholders to the configured local +time/date once the NTP server is reachable. No battery-backed clock is assumed. +Effect noise is seeded from Pico SDK `get_rand_32()` hardware entropy at boot. + +Reset reporting uses the framework's best-effort cause: power-on → `poweron`, +watchdog → `watchdog`, reboot → `software`, RUN pin/debug → `external`, +brownout → `brownout` when distinguishable, otherwise `unknown`. ESP32 values +are unchanged. Pico boot logs and `/api/v1/device` report this reason. + +The RP2040 hardware watchdog is armed once the radio is up, with its ~8 s maximum. A Pico that +hangs or hard-faults reboots itself after about 8 seconds, like an ESP32 after a panic, and +`/api/v1/device` then reports `resetReason: "watchdog"`. Boot's Wi-Fi join, sleep and the HTTP +server feed it while they wait. A request is parsed only once its header, and a body of up to +2 KB, has fully arrived, and a header over 2 KB is answered `431`; larger bodies (uploads, restores, script sources, refused ones +included) feed it every 1,436 bytes; and every response is written only as fast as the client +takes it, so a slow phone cannot trip it. Factory reset disarms it before formatting LittleFS +and reboots straight after. A requested reboot or a flash still reads `software`. + +The shared device command dispatcher queues reboot/sleep/reset and performs it +after the response delay and display power animation, just like ESP32. The Pico +has **no ESP32-style deep sleep with GPIO wake**. Sleep instead blanks the panel +through the display-off callback, enables CYW43 aggressive power saving, and +waits with short yields. The CPU, RAM and panel refresh hardware remain powered; +this is not a low-microamp shutdown. Application/network request handling pauses. +The same requested millisecond duration ends sleep; GPIO27 also wakes it. A key +held on entry must be released before a new press wakes it. Wake reboots the +application like ESP32 deep-sleep wake, but reports `software`, not `deepSleep`. +The ordinary Sleep key display toggle remains separate and does not enter this +timed sleep. Check timer wake and a release/new GPIO27 press on physical hardware. + +## UDP services + +Both builds include shared discovery (query `FIND_AWTRIXNG` on UDP 4210, +reply `host[:port]` on 4211) and Art-Net on UDP 6454 when `artnet` is enabled. +The Pico binding uses WiFiUDP, preserving the shared protocol implementation. +Art-Net takes over below power/moodlight/AP screens and returns to apps five +seconds after the last frame. Universes start at zero and hold 170 RGB pixels +each, continuing across the 53x11 canvas. The frame buffer is allocated on first +use. HTTP discovery advertises the shared HTTP server. + +Size comparison, measured when the UDP services were added (Pico W, same +compiler/options, 512 KiB LittleFS; later features add to both builds alike): UDP +enabled uses **100,784 bytes static RAM / 538,876 bytes flash**. The non-release +`galactic_unicorn_udp_measure` build omits both services and uses **100,644 / +536,908 bytes**: enabling them costs **140 bytes static RAM / 1,968 bytes flash**. +An active 53x11 Art-Net frame additionally needs 2,332 heap bytes for its pixels, +plus WiFiUDP/lwIP packet allocations. Both services fit comfortably; neither is +reported as unavailable. The measurement environment is not a release target. + +Hardware acceptance: flash the UF2, check the SSID/AP MODE behavior above, +capture display and CYW43 PIO/SM logs plus `refresh advancing`, then check the +animated boot screen during a stored-credential join. Host tests and firmware +builds cannot establish physical Wi-Fi/display coexistence. + +Host tests cannot establish physical refresh timing, orientation, or absence of +visible tearing; check those on the panel with the CI-built UF2. + +## Scripting on the Pico W + +Berry scripting is on in `galactic_unicorn` and `galactic_unicorn_2w`; build with +`-D AWTRIX_FEATURE_SCRIPTING=0` to leave it out. The VM gets a 48 KB budget on the +Pico W and 96 KB, the ESP32's, on the Pico 2 W (`scriptHeapBudgetBytes`, set with +`-D AWTRIX_RP2040_SCRIPT_HEAP_KB=n`) from the one heap Wi-Fi, HTTP, MQTT and the +display share; on the Pico W the interpreter itself costs about 19 KB of free heap +with no script installed. Every call into a script is capped at +`BerryVM::kInstructionLimit` instructions and returns to `loop()`, which feeds the +8 s watchdog. Drawing, timers, storage, buttons, sound and MQTT work as on the ESP32; +on the Pico `http.*` requests and Modbus reads (the same request path) return `false` +and script icons are not drawn. diff --git a/docs/advanced/galactic-unicorn.md b/docs/advanced/galactic-unicorn.md new file mode 100644 index 00000000..f8bf7cbe --- /dev/null +++ b/docs/advanced/galactic-unicorn.md @@ -0,0 +1,185 @@ +# Galactic Unicorn + +AWTRIX NG runs on Pimoroni's fixed **53×11 RGB Galactic Unicorn**, using the +same HTTP and MQTT `/api/v1` command semantics as the ESP32 builds. Pick the +image for the microcontroller actually fitted to your board: + +| Hardware | PlatformIO environment | USB image | Verification | +| --- | --- | --- | --- | +| Pico W, RP2040, 264 KB SRAM, 2 MB flash | `galactic_unicorn` | `firmware-galactic-unicorn.uf2` | Hardware-verified on a real Galactic Unicorn | +| Pico 2 W, RP2350, 520 KB SRAM, 4 MB flash | `galactic_unicorn_2w` | `firmware-galactic-unicorn-2w.uf2` | Hardware-verified on a real Galactic Unicorn (see [scope](#verification-scope)) | + +Both reserve **512 KiB for LittleFS**, separate from the application. The +PlatformIO build's reported RAM denominator excludes memory reserved by the +framework. Neither board has external PSRAM. There is no battery, and no I²C +sensor is read (the Qw/ST connector is unused), so battery, temperature and +humidity values are omitted; the onboard light sensor is available. Do not select +an ESP32 image or use its runtime GPIO presets. + +## Flash over USB + +1. Obtain the UF2 for your Pico version. A source build uses + `pio run -e galactic_unicorn` or `pio run -e galactic_unicorn_2w`; its output is + `.pio/build//firmware.uf2`. CI's `uf2-` artifact also + contains `firmware.uf2`, so keep track of which artifact you downloaded. +2. Disconnect power. Hold the Pico's **BOOTSEL** button while connecting a USB + **data** cable to your computer, then release it. This is BOOTSEL on the Pico, + not A/B/C/D or the panel's Sleep button. +3. Drag and drop the matching `.uf2` onto the mounted boot drive (`RPI-RP2` for + Pico W, `RP2350` for Pico 2 W). Let the copy finish. The drive disappears and + the board restarts automatically. +4. Subsequent updates use the same procedure. A normal application UF2 keeps + LittleFS settings and files when its flash layout is unchanged; back them up + first. Do not use a full-flash erase image unless you intend to erase them. + +Browser OTA is not implemented: `POST /update` returns `503 unavailable` and +instructs you to use BOOTSEL/UF2. An ESP32 `.bin` is not interchangeable with UF2. +The web UI's **Check for updates** still names a newer release and links its +notes, but offers no **Download & install** or `.bin` upload on this board. + +## First boot and provisioning + +The panel shows the boot animation and, without saved Wi-Fi credentials, an +animated **AP MODE** screen. Join the open **awtrixng-xxxxxx** network (`xxxxxx` +is the last three MAC bytes), or the configured hostname if it was changed. +Keep the phone connected even though this setup network has no Internet. + +Open **http://192.168.4.1/** if the captive portal does not open. Select or type +your 2.4 GHz Wi-Fi SSID, enter its password and save. Use **Reboot** to join +immediately. Alternatively disconnect the phone: retries pause while it is +attached. After that, every 60 seconds the setup network goes away for a few +seconds while the Unicorn tries the saved network, and it reboots once it joins. +Hold **B / SELECT for one second during boot** to force setup mode without +erasing credentials. + +Rejoin your normal network and open **http://awtrixng-xxxxxx.local/** (or the +configured hostname/port). Use the router's DHCP lease list if mDNS is +unavailable. `/api/v1/device` reports the address and connection state. Configure +MQTT and Home Assistant discovery in System as on an Ulanzi; the shared discovery +and command protocol are unchanged. NTP and the configured time zone set the +clock after joining. There is no battery-backed clock. + +## Buttons + +Buttons are active-low, debounced for 35 ms. The extra keys act once per press, +not repeatedly while held. + +| Button | Action | +| --- | --- | +| A | Previous app / left | +| B | Select; dismiss a notification; double press within 300 ms toggles panel power | +| C | Next app / right | +| D | Unmapped | +| Brightness + / − | Step `brightness` by 10, clamped to 0–255; select manual brightness | +| Volume + / − | Step `buzzerVolume` by 5, clamped to 0–100 | +| Sleep | Toggle panel power; this is not timed device sleep | + +Navigation follows the shared rotate/swap and `blockNavigation` rules. A/B/C +emit the same button events and `buttonCallback` HTTP webhook payloads as ESP32 +(`left`, `middle`, `right`, press and release). See the +[pin map and electrical details](galactic-unicorn-display.md#inputs). + +The onboard I²S speaker plays RTTTL: use `sound` for a saved melody or +`soundRtttl` for inline notes. It reports the **buzzer** capability, not MP3 or +DFPlayer. Volume keys and `buzzerVolume` control that same output. + +## Feature availability + +Always read **`GET /api/v1/capabilities`**, rather than inferring features from a +chip name. + +### Scripting + +Both versions run Berry scripts and report `scripting: true`, so the web UI shows +Run scripts and the script pages. They share one heap with Wi-Fi, HTTP, MQTT and +the display, so the budget depends on the chip: + +| | Pico W (RP2040) | Pico 2 W (RP2350) | +| --- | --- | --- | +| Script heap budget (`scriptHeapBudgetBytes`) | 48 KB | 96 KB, as on the ESP32 | +| Interpreter cost with no script installed | about 19 KB of free heap | about 17 KB of free heap | +| Largest script that installs | about 7 KB of source | about 28 KB of source | + +Both columns were measured on a real Galactic Unicorn. On the Pico 2 W a bigger +script fails with `out of memory` while plenty of heap is still free: the 96 KB +budget is the limit there, not the memory Wi-Fi needs. + +On the Pico W a failed install of a large script can leave the heap fragmented, +so later installs are refused with `507` even though enough memory is free in +total. Reboot to recover. Script `http.*` requests, and Modbus reads, which go +through the same request path, return `false`, and script icons are not drawn on +either board; timers, drawing, storage, buttons, sound and MQTT +work as on the ESP32. + +If a script takes the device down on every boot, hold **A and C** together for +three seconds while powering on. The panel shows `NOSCR` and the Unicorn starts +without running scripts, exactly like left and right on other boards (see +[troubleshooting](../troubleshooting/troubleshooting.md#scripts-eat-the-memory-and-awtrix-never-comes-up)). + +### Compiled out + +The Pico builds compile out the following: + +| Feature | Reason / behavior | +| --- | --- | +| MP3 playback and Internet radio | The port supplies a bounded RTTTL tone sink, not the decoder/streaming audio pipeline; their audio flags are false. | +| Outbound TLS | No secure-client integration in the Pico transport; use a trusted local network and supported plain-HTTP endpoints. | +| Browser OTA | No dual-slot updater for the Pico flash layout; update with USB UF2 instead. | + +`scriptingEnabled` turns the VM off at the next boot, as on the ESP32; stored +scripts stay listable and editable. A build made with +`-D AWTRIX_FEATURE_SCRIPTING=0` still **accepts and stores `scriptingEnabled`**, +but the setting is inert there: `scripting` is false, script routes return +`503 unavailable`, and the UI hides Run scripts and the script pages, showing +“not available on this board”. MP3/radio sections and their controls follow +their own capability flags. + +HTTP Basic authentication is not encryption. Do not expose this device directly +to the Internet. Feature-disabled routes retain the shared error vocabulary, +not a second Pico-only API. + +## Sleep emulation + +`POST /api/v1/device/sleep` blanks the panel, enables radio power saving and waits +for `durationMs` or a new press of **Sleep / GPIO27**. A key already held must be +released before it can wake the device. The CPU, RAM and panel-refresh hardware +stay powered and application/network request handling pauses; this is **not +ESP32 deep sleep** or a low-microamp shutdown. Wake restarts the application and +reports `resetReason: "software"`. Ordinary panel-power toggling leaves the +application and networking running. The hardware watchdog still protects a +hung application and reports `watchdog` after recovery. + +## Eleven rows and the tall-panel rule + +`panelHeight` defaults to **11**, with fixed width **53**. Height **8** is a +compatibility mode letterboxed on physical rows 1–8. The API refuses other +heights, and any change to the width or wiring keys, with `422 validationFailed`; +a height stored some other way falls back to 11 at board startup with a warning. +A restored backup keeps the Unicorn's own pins and panel. + +The shared tall-panel rule centres ordinary text, primary 8×8 icons and built-in +apps in an eight-row band starting at `floor((H - 8) / 2)` (row 1 at height 11). +Backgrounds, effects, overlays, transitions and charts use the whole canvas; +progress is on its last row. Draw commands and explicitly positioned icons use +absolute coordinates. GIFs keep their own dimensions. See +[Limits](../reference/limits.md#tall-panels-content-band-and-full-canvas). + +## Verification scope + +Verified on **Pico W** hardware: display/light sensor/fps, HTTP +smoke testing (`tools/pico/smoke.sh`, no failures), 80 concurrent requests, watchdog recovery, +MQTT and real Home Assistant discovery (21 entities), Matrix light control, +notifications, A/B/C events, brightness, volume, Sleep, and hearing the `alert` +melody. The button **webhook** remains host/simulator-tested only. + +Verified on **Pico 2 W** hardware: display at 42 fps, `mirror` and `rotate`, +notifications, light sensor, Wi-Fi join, mDNS and NTP, HTTP smoke testing (every +API check passes; the 80-request burst depends on the Wi-Fi link), watchdog +recovery (`resetReason: "watchdog"`), settings kept across application UF2 +updates, the scripting figures above, and MQTT with real Home Assistant +discovery (21 entities, Matrix light control, notifications), A/B/C events, +brightness, volume, Sleep, hearing inline and stored melodies, the A+C +`NOSCR` rescue, and Wi-Fi setup from a phone through the setup network. + +See [driver details](galactic-unicorn-display.md) and +[LittleFS persistence](pico-persistence.md) for implementation constraints. diff --git a/docs/advanced/hub-script-updates.md b/docs/advanced/hub-script-updates.md index a9c04234..5ae29c49 100644 --- a/docs/advanced/hub-script-updates.md +++ b/docs/advanced/hub-script-updates.md @@ -30,7 +30,9 @@ The normal device authentication applies. The command is serialized with edits: 404 means missing, 409 means changed since inspection, 422 means invalid source or a failed installation with diagnostic text, 503 means scripting unavailable, and 507 means insufficient capacity. Success is 200 `{"ok":true}`. -Capabilities expose `scriptUpdates: true`. Old firmware must be upgraded first. +Capabilities expose `scriptUpdates: true` when scripting is compiled in, Galactic +Unicorn builds included. A build with `scripting: false` answers script routes with +HTTP 503 `unavailable`. Old firmware must be upgraded first. For a separate copy, `expected_source: null` creates only a missing script; an existing name returns 409 and remains unchanged. Failed new installs are removed. The request uses the dynamically bounded source arena; the combined old/new JSON diff --git a/docs/advanced/pico-persistence.md b/docs/advanced/pico-persistence.md new file mode 100644 index 00000000..6100269b --- /dev/null +++ b/docs/advanced/pico-persistence.md @@ -0,0 +1,56 @@ +# Pico persistence + +The Galactic Unicorn builds reserve 512 KiB of LittleFS. Startup mounts it before +loading device config, settings and app order. Like the ESP32 format-on-failed-mount +policy, an unmountable volume is formatted (not just a blank first boot). A corrupt +filesystem can therefore lose all its files; keep backups. Directories `/ICONS`, +`/PALETTES`, `/MELODIES`, `/SCRIPTS` and `/NVS` are created at mount time. + +Device config (including WiFi credentials) and settings use the existing persistence +interfaces. `platform/Preferences.h` selects ESP32 NVS or the Pico adapter. The Pico +adapter implements only the Preferences subset AWTRIX uses: begin/end, strings, +bool, signed/unsigned 32-bit values, float32, uint8/uint16, isKey/remove/clear. +One namespace is an atomic transaction committed at **end()**, not at each put. +Call end explicitly. Unchanged values do not cause a write. A failed commit is +logged without printing keys or values; the existing void save APIs cannot report +it to the caller. All access must remain on core 0, not in interrupts or core 1. + +Snapshots live at `/NVS/.bin`, with a 16 KiB limit. The portable AXKV v1 +format is eight header bytes (`AXKV`, version 1, three zero bytes), followed by +records (one-byte key length, one-byte type, two-byte little-endian payload length, +key bytes, payload bytes), followed by a little-endian CRC32 of all preceding bytes. +Numeric payloads are little endian; float payloads contain IEEE-754 binary32 bits. +Keys and namespaces are 1–15 ASCII letters/digits/underscore/hyphen. Unknown types, +duplicate keys, malformed lengths, invalid names, truncation, unsupported headers +and checksum failures reject the whole namespace: callers retain defaults. Corrupt +snapshots are not silently overwritten. Reset settings/factory reset can remove them. +Credentials are plaintext, just as ordinary unencrypted NVS is; do not publish a dump. + +Writes stage a sibling `.tmp`, flush/close, verify its bytes, then rename over the +previous snapshot. Leftover temporary files are ignored at boot. LittleFS's atomic +rename preserves the old snapshot on interrupted publication. Host tests exercise +round trips through a fresh store instance, read-only/type defaults, namespace +isolation, corruption and failed replacement; physical power-cut testing still +requires a board. + +An adapter-level host test also runs the production DeviceConfig, NvsSettings, +LittleFS adapter and restore sink against an explicitly simulated filesystem. It +checks credentials, numeric types, non-default settings, height, short writes, +rename failures and aborted asset restores. On all platforms, `panelHeight` uses +the fresh on-flash key `pheight`. The legacy per-tile height key `ph` is never read +or migrated and is deleted by `DeviceConfig::save()`. A store with only `ph` keeps +the default runtime height of 8; `pheight` round-trips independently, including 11. +The JSON/API and backup/restore field remains `panelHeight`, not the on-flash key. + +App order uses the shared `/apploop.json` store. Scripts use the shared ScriptStore under +`/SCRIPTS`; RadioStore is a no-op implementation on Pico (radio remains unavailable). The shared +`LittleFsRestoreSink` stages asset entries and renames complete files, so aborting +an entry does not delete an existing asset. `FsRestoreSink`, config JSON and the +portable backup parser compile for Pico. They are reached through the existing +backup and restore routes of the HTTP API; there is no new endpoint or backup +format. + +Settings changes are coalesced over a 1.5 second save interval. Abrupt power loss +inside that window can lose the most recent changes. On a Pico W, settings, Wi-Fi +credentials and scripts survive reboots and reflashing an application UF2; a power +cut in the middle of a write has not been tested on hardware. diff --git a/docs/advanced/simulator.md b/docs/advanced/simulator.md index cef608d9..e26d3203 100644 --- a/docs/advanced/simulator.md +++ b/docs/advanced/simulator.md @@ -69,6 +69,14 @@ update are logged and ignored - restart the binary, or delete files under `simdata/`, instead. The simulator never asks for an HTTP login, whatever `authEnabled` is set to. +## Panel geometry + +The simulator uses the same `panelWidth`, `panelHeight` and `panels` configuration as +the device. For a 53×11 panel, send `PUT /api/v1/system` with +`{"panelWidth":53,"panelHeight":11,"panels":1}`, then restart the binary. The saved +size in `simdata/device.json` is used for the canvas and all frame buffers at startup; +size changes never resize a running canvas. The default remains 32×8. + ## MQTT Set `mqttHost` and switch `mqttEnabled` on - on the web UI's MQTT tab, with diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index 9833457e..94c2317f 100644 --- a/docs/api/openapi.yaml +++ b/docs/api/openapi.yaml @@ -98,6 +98,9 @@ paths: post: tags: [device] summary: Deep-sleep for a duration + description: >- + On the Galactic Unicorn the sleep is emulated: the CPU stays powered, and the timer or the + Sleep key (GPIO27) ends it. requestBody: required: true content: @@ -131,6 +134,11 @@ paths: any failure aborts the flash and frees the slot. On success the device answers `200 {"ok":true}` and then reboots into the new image. Rejected with `403 forbidden` while the device is in AP/provisioning mode. + + A build without browser update answers `503 unavailable` instead, like + every feature it leaves out: the Pico (Galactic Unicorn) builds take a + UF2 over USB in BOOTSEL mode. The desktop simulator has no firmware to + replace and answers `501 notSupported`. requestBody: required: true content: @@ -150,6 +158,20 @@ paths: content: application/json: schema: { $ref: "#/components/schemas/Error" } + "501": + description: > + `notSupported` - the desktop simulator, which has no firmware to + update. + content: + application/json: + schema: { $ref: "#/components/schemas/Error" } + "503": + description: > + `unavailable` - a build without browser update (the Pico builds): + flash a UF2 over USB (BOOTSEL) instead. + content: + application/json: + schema: { $ref: "#/components/schemas/Error" } /api/v1/restore: post: @@ -1341,6 +1363,12 @@ paths: interpolates between palette entries. transitions: { type: array, items: { type: string } } overlays: { type: array, items: { type: string } } + scripting: + type: boolean + description: Berry scripting is compiled in; false only on builds made with AWTRIX_FEATURE_SCRIPTING=0. + scriptUpdates: + type: boolean + description: Script source updates are supported; follows scripting. audio: type: object description: What this panel can play. All four false means it makes no sound. @@ -1365,8 +1393,13 @@ paths: 32-39; an ESP32-S3 has 0-48, no input-only pins at all and ADC1 on 1-10. Ranges are inclusive `[lo, hi]` pairs. properties: - soc: { type: string, enum: [esp32, esp32s3] } + soc: { type: string, enum: [esp32, esp32s3, rp2040] } label: { type: string, description: "Display name of the chip, e.g. ESP32-S3" } + fixed: + type: boolean + description: > + True when the pins are part of the board (the Galactic + Unicorn): a pin map other than `defaults` is refused. max: { type: integer, description: highest GPIO number that exists } missing: type: array @@ -1425,6 +1458,15 @@ paths: The pin map a factory-fresh device of this chip starts with, and the one it falls back to when the stored map fails validation. + panel: + type: object + description: > + Only on a board with a built-in panel (the Galactic + Unicorn: width 53, heights 8 and 11). `panelWidth` must + be `width`, `panels` 1 and `panelHeight` one of `heights`. + properties: + width: { type: integer } + heights: { type: array, items: { type: integer } } /api/v1/system: get: @@ -1474,6 +1516,7 @@ paths: | `lowBatteryThreshold` | 0..100 | | `minBrightness`, `maxBrightness` | 0..255 | | `panelWidth` | 1..128 | + | `panelHeight` | 8..16 | | `panels` | 1..128 | | `tempOffset` | -20..20 | | `humOffset` | -50..50 | @@ -2325,6 +2368,15 @@ components: Width of one panel in pixels. panelWidth x panels must come to between 32 and 128, or the write is rejected with 422 on panelWidth. A change of the total width applies after a reboot. + panelHeight: + type: integer + default: 8 + minimum: 8 + maximum: 16 + description: > + Height of every panel in pixels. Applies after a reboot. The Galactic + Unicorn takes only 11 or 8, and refuses any change to its width, + panel count or wiring keys with 422. panels: type: integer default: 1 @@ -2513,15 +2565,17 @@ components: description: > The chip this firmware image was built for. Decides which GPIOs exist and which of them can do what - the full rules are under - `gpio` in `/api/v1/capabilities`. - enum: [esp32, esp32s3] + `gpio` in `/api/v1/capabilities`. Both Galactic Unicorn builds report + rp2040. + enum: [esp32, esp32s3, rp2040] updateImage: type: string - enum: [firmware-awtrix-ng.bin, firmware-awtrix-ng-s3-octal.bin, firmware-awtrix-ng-s3-quad.bin, ""] + enum: [firmware-awtrix-ng.bin, firmware-awtrix-ng-s3-octal.bin, firmware-awtrix-ng-s3-quad.bin, firmware-galactic-unicorn.uf2, firmware-galactic-unicorn-2w.uf2, ""] description: > The release file this device updates from - the one `POST /update` - accepts. The web UI uses it to offer the right download. Empty in - the simulator. + accepts. The web UI uses it to offer the right download. A Pico + reports its `.uf2`, which is flashed over USB in BOOTSEL mode, not + through `POST /update`. Empty in the simulator. ipAddress: { type: string } hostname: type: string @@ -2549,7 +2603,9 @@ components: always ≤ freeHeapBytes. The script install and TLS-fetch guards refuse on this number, not on total free: a compile or an mbedtls handshake needs its buffers in one piece. The gap to freeHeapBytes is - fragmentation. + fragmentation. On the Pico it is the free block at the top of the + heap (its allocator cannot list the holes further down), so the true + largest block can only be larger. psramTotalBytes: type: integer description: | @@ -2567,17 +2623,18 @@ components: off: installed scripts stay listed and editable, none of them runs. scriptHeapPool: type: string - enum: [internal, psram] + enum: [internal, psram, unavailable] description: > Which pool the Berry VM allocates from. A board with usable PSRAM puts the script heap there, which is why such a device installs far - more scripts than the internal figure alone would suggest. + more scripts than the internal figure alone would suggest. A build + without scripting reports `unavailable`, with a budget of 0. scriptHeapBudgetBytes: type: integer description: > How large the shared Berry heap may grow before further installs are - refused. 98304 on internal RAM; roughly half of free PSRAM where the - script heap lives there. + refused. 98304 on internal RAM (49152 on the Pico W); roughly half of + free PSRAM where the script heap lives there. fps: { type: integer, description: measured render-loop rate } brightness: { type: integer, description: effective brightness after auto-brightness } lightLevel: diff --git a/docs/getting-started/web-ui.md b/docs/getting-started/web-ui.md index d37670a8..78dd9293 100644 --- a/docs/getting-started/web-ui.md +++ b/docs/getting-started/web-ui.md @@ -246,7 +246,8 @@ radio track info live in `/api/v1/settings`, `dfplayer` in `/api/v1/system`. The between the two endpoints for you. There is one volume slider per output - buzzer, DFPlayer, MP3 and radio - and each is shown only when the panel has that output, so a Ulanzi sees one slider rather than four. No radio track info without radio, and no sound switch on a device with no -output at all. The DFPlayer toggle always stays - it is how a board gets one. +output at all. The DFPlayer toggle stays on any board with configurable pins - it is how a board +gets one. The MQTT section carries a live connection badge above its fields: whether the broker answered, the endpoint it connected to, and the reason if it did not. @@ -324,6 +325,13 @@ ESP32 boards, where those wirings are real. Conflicting or impossible assignments are rejected on save, and GPIO changes apply after a reboot. +On a board with fixed wiring (`gpio.fixed` in the capabilities, the Galactic Unicorn) the section +lists the pins the board uses and the ones it reserves, with nothing to edit. The page also drops +what the board cannot have: the DFPlayer toggle, the battery and I²C sensor settings, **LDR on +GND**, and, on the Display page, the sensor colours. **Panel** keeps the height (one of the +heights in `gpio.panel`) and the orientation, and the melody slider is called **Melody volume**, +since the melodies play on the built-in speaker. + Details and recovery: [GPIO & boards](../reference/gpio.md) - [Board presets](../reference/gpio.md#board-presets), [Validation rules](../reference/gpio.md#validation-rules), @@ -333,7 +341,7 @@ Details and recovery: [GPIO & boards](../reference/gpio.md) - | Action | What happens | |---|---| -| **Upload firmware (.bin)** | Uploads to `/update` with a live progress bar; AWTRIX reboots into the new firmware | +| **Upload firmware (.bin)** | Uploads to `/update` with a live progress bar; AWTRIX reboots into the new firmware. A Galactic Unicorn shows how to flash its `.uf2` over USB instead | | **Reboot** | Two-step confirm, then `POST /api/v1/device/reboot`; the page reloads itself | | **Reset settings** | Two-step confirm, then `POST /api/v1/settings/reset` - display settings only, network survives | | **Factory reset** | Erases **everything** (Wi-Fi, files, settings). No two-step button: you must type the hostname | diff --git a/docs/guides/brightness.md b/docs/guides/brightness.md index 79e6c31a..f39d3328 100644 --- a/docs/guides/brightness.md +++ b/docs/guides/brightness.md @@ -147,7 +147,8 @@ Neither is the panel's own `gamma` setting, which is colour correction for the L pin - it is not a build option. It has to be a pin that can still measure a voltage while Wi-Fi is on (GPIO 32–39 on ESP32, GPIO 1–10 on ESP32-S3); anything else is rejected. A change applies after a reboot. See [GPIO & boards › The pin map](../reference/gpio.md#the-pin-map) and -[the ADC1 rule](../reference/gpio.md#5-adc1-requirement). +[the ADC1 rule](../reference/gpio.md#5-adc1-requirement). The Galactic Unicorn's light sensor is +fixed on GPIO 28; see [Fixed-wiring Galactic Unicorn](../reference/gpio.md#fixed-wiring-galactic-unicorn). ## Temperature, humidity & pressure diff --git a/docs/guides/graphics.md b/docs/guides/graphics.md index 5ac5e056..fc60f3f5 100644 --- a/docs/guides/graphics.md +++ b/docs/guides/graphics.md @@ -28,7 +28,8 @@ Every coordinate on this page refers to the same grid: - **x** runs `0` … *panel width* − 1 left to right (`31` on the default 32-wide panel; wider on multi-panel setups, see [Panel and orientation](../reference/system.md#panel-and-orientation)), - **y** runs `0` … `7` top to bottom. `(0,0)` is top-left. + **y** runs `0` … *panel height* − 1 top to bottom (`7` on an eight-row panel). + `(0,0)` is top-left. The examples below use the default 32×8 panel. - Off-canvas pixels are dropped, never wrapped to the other side. You can safely draw a circle that hangs off the edge. - Colors accept `"#RRGGBB"`, `"RRGGBB"`, `"RGB"` shorthand, `[r,g,b]`, `["HSV",h,s,v]`, or a packed @@ -41,6 +42,10 @@ An `icon` takes the leftmost 9 pixels and pushes the charts across - see ## Draw a progress bar +Charts and drawing use the full panel height, not the centred eight-row text +band. Progress stays on the bottom row (`height-1`, row 10 at 53×11). Draw-command +coordinates are absolute from the panel's top-left, without a band offset. + `progress` is a percentage. It paints the **bottom row only**. ```bash diff --git a/docs/guides/power.md b/docs/guides/power.md index 9b1f2992..30ed1975 100644 --- a/docs/guides/power.md +++ b/docs/guides/power.md @@ -181,6 +181,12 @@ every status code: [HTTP API → POST /api/v1/device/sleep](../reference/http.md which the default wiring uses; move it elsewhere and the timer is the only way back. See [GPIO & boards → The pin map](../reference/gpio.md#the-pin-map). +!!! note "Galactic Unicorn" + The Pico W and Pico 2 W have no deep sleep. The same command blanks the panel and pauses + request handling, but the board stays powered, so it saves little. The timer or the **Sleep** + key (GPIO27) wakes it, not the select button. See + [Galactic Unicorn driver → Time, reset and sleep](../advanced/galactic-unicorn-display.md#time-reset-and-sleep). + The matrix is blanked just before the board goes down. On wake the ESP32 **boots fresh** - the same sequence as a power cycle, so it re-reads its configuration, reconnects Wi-Fi, and the matrix comes back on (a blanked panel is a runtime state and does not survive). diff --git a/docs/guides/scripting.md b/docs/guides/scripting.md index de72437d..76a0961c 100644 --- a/docs/guides/scripting.md +++ b/docs/guides/scripting.md @@ -96,6 +96,12 @@ next to your script; fix the line it names and save again. The full story is und broker - point the simulator at one with `mqttHost` (see [the simulator's MQTT note](../advanced/simulator.md#mqtt)). +!!! note "On the Galactic Unicorn" + Scripts run on the Pico W and Pico 2 W, with less memory for them: see + [Limits › Galactic Unicorn](../reference/limits.md#galactic-unicorn-pico-w). The Pico has no + outbound HTTP for scripts yet, so `http.*` calls and Modbus reads return `false`, and script + icons (`icon()`) are not drawn. + --- ## Everything a script can do, on one screen @@ -477,14 +483,20 @@ The short examples in this section show a single method for brevity - read them ### Panel and drawing -The panel is a grid eight pixels high and - on a Ulanzi and most others - thirty-two -wide. **`x` runs from `0` at the left to `width() - 1`, `y` runs 0–7 from the +Script coordinates are absolute on the full canvas, with `(0,0)` at the panel's +top-left. Scripts are not shifted into the centred eight-row body-text band. +Always query `height()` (the runtime panel height, e.g. 11 on a 53×11 panel) +and `width()` rather than assuming 8 rows or 32 columns. Charts scale to all +`height()` rows; `progress()` draws on `height()-1`. + +The panel is a grid, normally eight pixels high and thirty-two wide on a Ulanzi. +**`x` runs from `0` at the left to `width() - 1`, `y` runs `0 .. height()-1` from the top** - so `(0, 0)` is the top-left corner and a *larger* `y` is *lower* on the panel. Anything you draw off the edge is simply clipped, never an error. Ask `width()` rather than writing `32`: someone running two or four panels in a row has 64 or 128 columns, and an app that measures fills them instead of -huddling in the first quarter. The height is always 8. +huddling in the first quarter. The height is configurable from 8 to 16 (default 8). Both answer while a frame is being drawn, which is where layout belongs anyway - in `setup()`, before there is a frame, they say `0`. @@ -499,7 +511,7 @@ build the same number from plain channel values. | Call | Does | Example | |---|---|---| | `width()` | panel width in pixels - 32 as a rule, more on a chained panel | `var w = width()` | -| `height()` | panel height in pixels (always 8) | `var h = height()` | +| `height()` | panel height in pixels (8–16, default 8) | `var h = height()` | | `clear(color?)` | fill the frame; black when omitted | `clear()` | | `pixel(x, y, color)` | one pixel | `pixel(0, 0, 0xFF0000)` | | `line(x0, y0, x1, y1, color)` | a line | `line(0, 0, width() - 1, 7, 0x00FF00)` | diff --git a/docs/guides/sounds.md b/docs/guides/sounds.md index cc00c6a3..041cc260 100644 --- a/docs/guides/sounds.md +++ b/docs/guides/sounds.md @@ -16,6 +16,10 @@ no buzzer says so rather than playing something else. Which outputs your panel h {"audio":{"buzzer":true,"track":false,"mp3":true,"radio":true}} ``` +The Galactic Unicorn has one output: melodies play through its built-in speaker, which it reports +as `buzzer`. It has no MP3, radio or DFPlayer, and its pins are fixed. See the +[Galactic Unicorn guide](../advanced/galactic-unicorn.md). + ## MP3s Only on boards with a speaker. Drag them onto the **MP3s** section of the web UI's Audio tab, the way icons are uploaded, or send one from the command line: @@ -277,7 +281,7 @@ curl -X PATCH http:///api/v1/settings \ While muted, AWTRIX still accepts every sound command and still answers `200 {"ok":true}`. That includes a name that does not exist, which would otherwise answer `404` - so test your names with sound **on**. Use `{"scope":"stream"}` on `/audio/stop` to silence the radio as well. -For genuine silence on the buzzer, set `pinBuzzer` to `-1` in the [pin map](../reference/gpio.md#the-pin-map). With no buzzer pin, nothing is ever played there. +For genuine silence on the buzzer, set `pinBuzzer` to `-1` in the [pin map](../reference/gpio.md#the-pin-map). With no buzzer pin, nothing is ever played there. The Galactic Unicorn's pins are fixed, so there set `buzzerVolume` to `0` instead. ## Sound in notifications and apps diff --git a/docs/guides/updating.md b/docs/guides/updating.md index 3de3e751..326ca464 100644 --- a/docs/guides/updating.md +++ b/docs/guides/updating.md @@ -60,6 +60,10 @@ Your browser downloads and verifies the firmware, then uploads it to AWTRIX. Kee and the device powered until it restarts. Progress is shown during download and upload; the page reloads automatically afterwards. Settings and uploaded files are kept. +A [Galactic Unicorn](../advanced/galactic-unicorn.md#flash-over-usb) cannot install from the +browser. Its row still names a newer release and links the release notes, where its `.uf2` is, +and the Maintenance section explains the USB (BOOTSEL) route instead of offering **Upload firmware**. + The download and verification run entirely on your computer or phone. AWTRIX receives only the normal firmware upload. If a release has just appeared, its browser download may take a few minutes to become ready. Try again shortly, or download the image from the release page and use **Upload firmware**. diff --git a/docs/reference/device.md b/docs/reference/device.md index c7fd7ee8..a52f3031 100644 --- a/docs/reference/device.md +++ b/docs/reference/device.md @@ -37,7 +37,7 @@ curl -i -X POST http:///api/v1/device ## Response shape -Keys are emitted in a fixed order. 21 fields are always present; up to 11 more appear only when the +Keys are emitted in a fixed order. The fields below are always present; up to 11 more appear only when the hardware supports them. ```json @@ -109,15 +109,15 @@ hardware supports them. ## Always-present fields -These 23 keys are in every response, on every board, in every state. +These keys are in every response, on every board, in every state. | Key | Type | Range / format | Units | Meaning | | --- | --- | --- | --- | --- | | `version` | string | - | - | Running firmware version. Same value as `GET /api/v1/version`. | | `uid` | string | 12 lowercase hex chars | - | Device identity: the WiFi MAC address, lowercased, colons stripped. Stable across reboots and reflashes. Also the default MQTT topic prefix and MQTT client id. | | `boardType` | string | constant `"awtrixng"` | - | A fixed constant in the device firmware - it does **not** vary with your GPIO configuration. The simulator reports `"simulator"` instead. | -| `soc` | string | `esp32`, `esp32s3` | - | The chip this image was built for. Branch on this only to tell the two firmware images apart; for pin rules read `gpio` in `GET /api/v1/capabilities`. | -| `updateImage` | string | `firmware-awtrix-ng.bin`, `firmware-awtrix-ng-s3-octal.bin`, `firmware-awtrix-ng-s3-quad.bin` | - | The release file this device updates from - the one `POST /update` accepts. The web UI uses it to offer the right download. Empty in the simulator. | +| `soc` | string | `esp32`, `esp32s3`, `rp2040` | - | The image's GPIO profile. Both Pico W and Pico 2 W currently report `rp2040`; distinguish their images with `updateImage`, and read pin rules from `gpio` in `GET /api/v1/capabilities`. | +| `updateImage` | string | ESP32 `.bin` or Pico `.uf2` filename | - | `firmware-awtrix-ng.bin`, `firmware-awtrix-ng-s3-octal.bin`, `firmware-awtrix-ng-s3-quad.bin`, `firmware-galactic-unicorn.uf2` or `firmware-galactic-unicorn-2w.uf2`. Pico images require USB BOOTSEL; `POST /update` does not accept them. Empty in the simulator. | | `ipAddress` | string | dotted quad | - | The station-mode IP address. In AP (provisioning) mode this is not the address you reached AWTRIX on. | | `hostname` | string | 1 … 32 chars | - | The name AWTRIX answers to on the network and publishes over mDNS. Read the configured value from `GET /api/v1/system`; that one is empty when the name is derived from the MAC (`awtrixng-` plus the last six hex digits of `uid`), which is why the two fields disagree on a device that was never named by hand. | | `wifiRssi` | integer | typically −30 (excellent) to −90 (unusable) | dBm | Current signal strength of the station connection. | @@ -125,9 +125,9 @@ These 23 keys are in every response, on every board, in every state. | `resetReason` | string | `poweron`, `external`, `software`, `panic`, `interruptWatchdog`, `taskWatchdog`, `watchdog`, `deepSleep`, `brownout`, `sdio`, `unknown` | - | Why AWTRIX last came up. Constant for the whole session. | | `freeHeapBytes` | integer | 0 … | bytes | Free internal heap right now. Useful as a leak canary; it fluctuates constantly with rendering and networking. | | `minFreeHeapBytes` | integer | 0 … | bytes | The **low-water mark**: the least free heap seen since boot. Unlike `freeHeapBytes` it only ever falls, so it survives the spike you were not polling during. A value creeping towards zero is a leak; a stable one is not. Resets on reboot. | -| `largestFreeBlockBytes` | integer | 0 … | bytes | The largest single **contiguous** block free right now, in the same internal pool as `freeHeapBytes`. Always ≤ `freeHeapBytes`, and the gap between them is fragmentation. Installing a script or opening an HTTPS stream needs its memory in one piece, so plenty of total free spread over small blocks is still refused. Watch this, not `freeHeapBytes`, to understand a "not enough memory" refusal. | +| `largestFreeBlockBytes` | integer | 0 … | bytes | The largest single **contiguous** block free right now, in the same internal pool as `freeHeapBytes`. Always ≤ `freeHeapBytes`, and the gap between them is fragmentation. Installing a script or opening an HTTPS stream needs its memory in one piece, so plenty of total free spread over small blocks is still refused. Watch this, not `freeHeapBytes`, to understand a "not enough memory" refusal. On the Pico it is the free block at the top of the heap: its allocator cannot list the holes further down, so the true largest block can only be larger. | | `scriptingRunning` | boolean | - | - | Whether scripts are running at all. `false` when [`scriptingEnabled`](system.md#miscellaneous) is off - installed scripts stay listed and editable, but none of them executes. | -| `scriptHeapPool` | string | `internal`, `psram` | - | Which pool the Berry VM allocates from. Where PSRAM is usable the script heap lives there, so installing a script barely moves `freeHeapBytes`. | +| `scriptHeapPool` | string | `internal`, `psram`, `unavailable` | - | Which pool the Berry VM allocates from; `unavailable`, with a budget of 0, in a build without scripting. Where PSRAM is usable the script heap lives there, so installing a script barely moves `freeHeapBytes`. | | `scriptHeapBudgetBytes` | integer | 0 … | bytes | How large the shared Berry heap may grow before further installs are refused. `98304` on internal RAM; on PSRAM about half the free pool, so roughly 4 MB on an 8 MB module. Read it back rather than assuming. | | `fps` | integer | 0 … | frames/second | **Measured** render rate, not a target: the frames actually shown, recounted once per second. Expect it to move around. | | `brightness` | integer | 0 … 255 | - | The **effective** panel brightness currently driving the LEDs, not an echo of `settings.brightness`. With `autoBrightness` off it is `settings.brightness` clamped to 0…255 and the two agree. With `autoBrightness` on it is derived from `lightLevel` along the gamma curve and mapped into the `minBrightness`…`maxBrightness` window, and `settings.brightness` is ignored. Mirrored as `brightness` in `GET /api/v1/display`; read `GET /api/v1/settings` for the configured value. | @@ -138,6 +138,18 @@ These 23 keys are in every response, on every board, in every state. | `wifi` | object | - | - | Whether AWTRIX is on your network, and if not, why. See [Connection status](#connection-status). | | `mqtt` | object | - | - | Whether AWTRIX is talking to your broker, and if not, why. See [Connection status](#connection-status). | +## Pico state notes + +Pico W and Pico 2 W keep `boardType: "awtrixng"`. Neither has PSRAM, and the +Unicorn has no battery telemetry by default. `minFreeHeapBytes` is sampled when +device state is requested, not an allocator-wide minimum. `largestFreeBlockBytes` +estimates the free top-of-heap block; it cannot enumerate holes below it. +`scriptHeapBudgetBytes` is `49152` on the Pico W and `98304` on the Pico 2 W. +Builds without scripting report `scriptingRunning: false`, `scriptHeapPool: +"unavailable"` and `scriptHeapBudgetBytes: 0` regardless of the stored toggle. +Emulated timed-sleep wake reports `software`, not `deepSleep`. See the +[board guide](../advanced/galactic-unicorn.md) for hardware verification scope. + ## PSRAM fields (conditional) **Present only when the board has external PSRAM.** Both fields appear together, or not at all. @@ -275,7 +287,7 @@ tab. AWTRIX also shows an outage on the panel itself - see [Connection dots](#co | `retryInMs` | integer | Milliseconds until the next attempt. `0` while connected, and while an attempt is running. | Same. | | `connects` | integer | Successful connections since boot. A number that keeps climbing is a link that keeps dropping - for `wifi`, usually a router or a range problem. | Same. | | `error` | string / null | Why it is not up **right now**. `null` when it is. | Same. | -| `lastError` | string / null | The last reason this link went down, **kept after it recovers**. `null` until something goes wrong. | Same. | +| `lastError` | string / null | The last reason this link went down, **kept after it recovers**. `null` until something goes wrong. `badCredentials` means the network refused the password on two joins in a row: the Pico's radio reports an AP that breaks off one join mid key exchange the same way, and the next join then connects. | Same. | !!! note "Why `wifi` has a `lastError`" While WiFi is down nothing can reach this API to ask why - the panel's red dot is the only diff --git a/docs/reference/errors.md b/docs/reference/errors.md index a8a8cd28..0b90ee27 100644 --- a/docs/reference/errors.md +++ b/docs/reference/errors.md @@ -95,6 +95,7 @@ apps and notifications fit - are collected in [Limits](limits.md). | 405 | no | AWTRIX never acts on it. | | 415 | no | Wrong `Content-Type` on a `PUT`/`PATCH`, rejected before the body is parsed; or an upload whose content does not match the folder, rejected on its first chunk. | | 422 | **no** | Validation is validate-then-apply: the first offending key aborts the whole request. A `PATCH` is all-or-nothing. | +| 431 | no | Galactic Unicorn only: the request line and headers are longer than 2 KB. No body is sent, and the connection is closed. | | 500 | maybe | The command ran and reported failure. | | 503 | no | `GET /api/v1/apps/script/{name}` on a build without the scripting platform. | | 507 | no | A store or queue was full; the write was rejected and nothing was stored. | @@ -389,6 +390,7 @@ changes nothing and `field` names the offending key: | `lowBatteryThreshold` | 0–100 | | `minBrightness`, `maxBrightness` | 0–255 | | `panelWidth` | 1–128 | +| `panelHeight` | 8–16 | | `panels` | 1–128 | | `tempOffset` | −20–20 | | `humOffset` | −50–50 | @@ -458,6 +460,7 @@ The status is **400**, and there is **no `field`** - the offending pin's name is | `pinBattery: must be an ADC1 pin (GPIO 32-39, usable while WiFi is on)` | ADC2 is unusable while WiFi is on. | | `pinLdr: must be an ADC1 pin (GPIO 32-39, usable while WiFi is on)` | Same. | | `duplicate pin (, )` | Two enabled functions claim the same GPIO. When one of them is `pinMatrix` the message goes on to name the fix - see [No duplicates](gpio.md#6-no-duplicates). | +| `Galactic Unicorn (Pico W / Pico 2 W): pin assignments are fixed` | Any pin change, or enabling the DFPlayer, on the Galactic Unicorn, whose wiring is part of the board. | Each message is built from the running chip's rules, so the numbers above are the ESP32's and an ESP32-S3 answers with its own. The per-chip values are in diff --git a/docs/reference/gpio.md b/docs/reference/gpio.md index ce47f54e..ee085759 100644 --- a/docs/reference/gpio.md +++ b/docs/reference/gpio.md @@ -1,10 +1,10 @@ # GPIO & boards -AWTRIX NG ships **one firmware per chip**, not per board. A commercial 32×8 clock, an AWTRIX 2 +On ESP32, AWTRIX NG ships **one firmware per chip**, not per board. A commercial 32×8 clock, an AWTRIX 2 mainboard conversion and a panel you wired yourself all run the same binary; what differs is the pin map, which is runtime configuration stored on AWTRIX and editable through the API or the web UI. -There are three images: `awtrix` for the ESP32, `awtrix_s3_octal` and `awtrix_s3_quad` for +There are three ESP32 images: `awtrix` for the ESP32, `awtrix_s3_octal` and `awtrix_s3_quad` for the ESP32-S3 - see [Rules come from the chip](#rules-come-from-the-chip). @@ -18,6 +18,34 @@ reference. ## Rules come from the chip +### Fixed-wiring Galactic Unicorn + +The `galactic_unicorn` (Pico W) and `galactic_unicorn_2w` (Pico 2 W) builds use +the same fixed board map, not the configurable ESP32 layout below. Changing pin +assignments or enabling DFPlayer is rejected with `400 invalidPinConfig` and +“pin assignments are fixed”. `pinMatrix: -1` is the fixed multi-pin panel sentinel, +**not** a disabled panel. Do not apply Ulanzi presets. + +| Peripheral | Fixed GPIO | +| --- | --- | +| Panel clock / data / latch / blank | 13 / 14 / 15 / 16 | +| Row select | 17–20 | +| A / B / C / D | 0 / 1 / 3 / 6 | +| Sleep | 27 | +| Volume + / − | 7 / 8 | +| Brightness + / − | 21 / 26 | +| Light sensor | 28 (12-bit ADC) | +| Qw/ST connector (I²C SDA / SCL) | 4 / 5, unused: these builds read no I²C sensor, so `pinI2cSda` and `pinI2cScl` are `-1` | +| Speaker BCLK / LRCLK / data / amplifier enable | 10 / 11 / 9 / 22 | + +The API profile identifies both as `rp2040`; use `updateImage` to distinguish +the UF2 targets. The fixed pin defaults in `gpio` are authoritative. The matrix +driver list is empty because this is a PIO panel, not a selectable LED-strip +data pin. The RTC wake list is empty: timed sleep uses the GPIO27 emulation +described in [Galactic Unicorn](../advanced/galactic-unicorn.md). + +### Configurable ESP32 boards + An ESP32 and an ESP32-S3 do not agree on a single one of the rules below: | | ESP32 | ESP32-S3 | @@ -380,7 +408,7 @@ A panel you wired yourself also needs describing: how wide one panel is, how man cable runs through, which corner it enters, whether the strip runs along rows or columns, and whether every second run comes back the other way. -The panel **height is fixed at 8 pixels**; the width is `panelWidth × panels` and must come to +The panel **height is configurable from 8 to 16 pixels** (`panelHeight`, default 8); the width is `panelWidth × panels` and must come to between 32 and 128 (so 32 × 8 = 256 LEDs by default). The keys, their ranges and the settings for the common builds are documented once, under diff --git a/docs/reference/http.md b/docs/reference/http.md index d79ddfcd..81fb6663 100644 --- a/docs/reference/http.md +++ b/docs/reference/http.md @@ -165,7 +165,7 @@ Device state and statistics. `200`, or `401` when a login is enabled and the req | `version` | string | - | firmware version, e.g. `1.0.12` | | `uid` | string | - | device unique id | | `boardType` | string | - | fixed constant `"awtrixng"` in the device firmware - does not vary with the wiring; the simulator reports a different value, see [Device state](device.md) | -| `soc` | string | - | chip this image was built for: `esp32` or `esp32s3`. Pin rules live under `gpio` in `/api/v1/capabilities` | +| `soc` | string | - | chip this image was built for: `esp32`, `esp32s3`, or `rp2040` for both Galactic Unicorn builds. Pin rules live under `gpio` in `/api/v1/capabilities` | | `ipAddress` | string | - | current station IP | | `hostname` | string | - | name AWTRIX answers to, mDNS included; derived from the MAC when unset in `/api/v1/system` - see [Device state](device.md) | | `wifiRssi` | integer | dBm | | @@ -177,7 +177,7 @@ Device state and statistics. `200`, or `401` when a login is enabled and the req | `psramTotalBytes` | integer | bytes | external PSRAM; absent on boards without it | | `psramFreeBytes` | integer | bytes | free PSRAM; never add it to `freeHeapBytes` - see [Device state](device.md) | | `scriptingRunning` | boolean | - | whether scripts run at all; `false` while `scriptingEnabled` is off | -| `scriptHeapPool` | string | - | pool the Berry VM allocates from: `internal` or `psram` | +| `scriptHeapPool` | string | - | pool the Berry VM allocates from: `internal` or `psram`; `unavailable` in a build without scripting | | `scriptHeapBudgetBytes` | integer | bytes | ceiling on the shared Berry heap before installs are refused | | `fps` | integer | frames/s | measured render-loop rate | | `brightness` | integer | 0–255 | **effective** brightness after auto-brightness, not the setting | @@ -251,7 +251,8 @@ curl -X POST http:///api/v1/device/reboot ### POST /api/v1/device/sleep -Deep-sleep for a duration, then wake and boot normally. +Deep-sleep for a duration, then wake and boot normally. The Galactic Unicorn has no deep sleep and +emulates it; see the end of this section. | Key | Type | Range | Default | Units | Required | |---|---|---|---|---|---| @@ -270,6 +271,12 @@ Pressing the select button ends the sleep early - but only if `pinBtnSelect` sit chip's `rtc` pins, see [`gpio` in capabilities](#gpio-what-the-chip-can-do). On any other pin AWTRIX comes back when `durationMs` runs out and not before. +On the Galactic Unicorn (Pico W and Pico 2 W) the sleep is emulated. The panel blanks and request +handling pauses, but the CPU and RAM stay powered, so it saves little power. The timer or a new +press of the **Sleep** key (GPIO27) ends it. The select button does not, and the `rtc` list in +`gpio` is empty. Wake restarts AWTRIX, and `resetReason` then reads `software`. See +[Galactic Unicorn driver → Time, reset and sleep](../advanced/galactic-unicorn-display.md#time-reset-and-sleep). + ```bash curl -X POST http:///api/v1/device/sleep \ -H "Content-Type: application/json" \ @@ -1479,10 +1486,11 @@ System › Audio. The pin fields under [`/api/v1/system`](#get-apiv1system) are validated against the chip the firmware was built for, and the rules differ sharply between them: an ESP32 has GPIO 0–39 with 34–39 input-only and ADC1 on 32–39, an ESP32-S3 has 0–48 with no input-only pins at all and ADC1 -on 1–10. Read them here instead of hardcoding a table per chip. +on 1–10. Read them here instead of hardcoding a table per chip. The Galactic Unicorn's pins are +fixed; see [Galactic Unicorn build capabilities](#galactic-unicorn-build-capabilities). ```json -"gpio":{"soc":"esp32s3","label":"ESP32-S3","max":48, +"gpio":{"soc":"esp32s3","label":"ESP32-S3","fixed":false,"max":48, "missing":[[22,25]],"inputOnly":[], "reserved":[{"lo":19,"hi":20,"why":"the USB-JTAG interface"}, {"lo":26,"hi":37,"why":"the SPI flash and PSRAM"}, @@ -1495,15 +1503,17 @@ on 1–10. Read them here instead of hardcoding a table per chip. | Key | Meaning | |---|---| | `soc`, `label` | chip id and display name; same value as `soc` in the device state | +| `fixed` | `true` when the pins are part of the board, as on the Galactic Unicorn: a pin map other than `defaults` is refused, and the web UI shows the pins instead of offering them. `false` on the ESP32 chips | | `max` | highest GPIO number that exists | | `missing` | inclusive ranges inside `0…max` the package does not bond out - rejected | | `inputOnly` | cannot drive an output, so they are refused for the matrix, buttons, buzzer, I²C and DFPlayer TX. Empty on the ESP32-S3 | | `reserved` | taken by the flash, PSRAM, USB or the console. Each carries `why`, which is also what the rejection message says | | `adc1` | the only pins accepted for `pinBattery` and `pinLdr` - ADC2 stops working while WiFi is on | | `strapping` | boot-mode pins. Reported as a caution, **never rejected**: the ESP32 defaults already use one of them (the buzzer, GPIO 15) | -| `rtc` | pins the RTC domain keeps powered during deep sleep. Only a `pinBtnSelect` inside this set can end a [`POST /api/v1/device/sleep`](#post-apiv1devicesleep) early; anything else is accepted and simply cannot wake AWTRIX | +| `rtc` | pins the RTC domain keeps powered during deep sleep. Only a `pinBtnSelect` inside this set can end a [`POST /api/v1/device/sleep`](#post-apiv1devicesleep) early; anything else is accepted and simply cannot wake AWTRIX. Empty on the Galactic Unicorn, whose Sleep key (GPIO27) wakes it instead | | `matrix` | the only values `pinMatrix` accepts - fixed by the firmware image, not a preference | | `defaults` | the pin map a factory-fresh device of this chip starts with, and the one it falls back to if the stored map fails validation | +| `panel` | only on a board with a built-in panel: its `width` and the `heights` it can run at, `{"width":53,"heights":[8,11]}` on the Galactic Unicorn. `panelWidth` must be `width`, `panels` must be `1` and `panelHeight` one of `heights` | `effects` and `overlays` come out ASCII-sorted; `transitions` has its own fixed order. Effect, overlay, palette and transition names are all matched **case-insensitively** - `"matrix"`, @@ -1627,6 +1637,7 @@ Behaviour to know: | `brightnessSmoothing` | long | `10000` | ms the panel takes to follow an ambient-light change (0–60000); `0` = instantly | | `lowBatteryThreshold` | integer | `0` | 0–100 %; below it `GET /api/v1/device` reports `lowBattery: true`. `0` = off | | `panelWidth` | integer | `32` | 1–128; `panelWidth × panels` must come to 32–128 | +| `panelHeight` | integer | `8` | 8–16; applies after a reboot | | `panels` | integer | `1` | 1–128; how many panels the strip runs through | | `panelStart` | string | `"topLeft"` | `topLeft` · `topRight` · `bottomLeft` · `bottomRight` | | `panelWiring` | string | `"rows"` | `rows` · `columns` | @@ -1801,6 +1812,13 @@ The multipart **field name is irrelevant** - any file part is accepted. | 415 | `unsupportedMediaType` - the content does not match the target folder: `/ICONS` needs GIF or JPEG magic bytes, `/MELODIES` must parse as RTTTL text, `/PALETTES` must be plain `RRGGBB`-per-line text, `/MP3` needs MP3 magic bytes (an ID3 tag or a frame sync) | | 500 | `internalError` - the write failed (storage full); nothing is left behind | +A refused or failed upload never touches a file of the same name that is already there: the +new content is kept aside until it has all arrived and passed the check, and only then replaces +the old file. Until then both copies are on flash, so replacing a file needs room for the new one +as well; without it the upload fails with `500` and the old file stays. If power is lost +mid-upload, the partial copy can be left beside the target as `.part`; remove it with +[`DELETE /api/v1/files`](#delete-apiv1files). + PNG is served correctly once on AWTRIX, but it is not accepted by the `/ICONS` upload check - only GIF and JPEG pass. @@ -1847,6 +1865,8 @@ network, and what the web UI uses. Auth is re-checked inside the upload handler. | 401 | auth failed | | 403 | `forbidden` - firmware upload is disabled in AP/provisioning mode | | 500 | `internalError`, `firmware update failed (bad image or storage full)` - the OTA slot could not be written | +| 501 | `notSupported` - the desktop simulator, which has no firmware to update | +| 503 | `unavailable` - a build without browser update, like the Pico (Galactic Unicorn) builds; flash a UF2 over USB (BOOTSEL) instead | The image is size-checked against the free firmware slot before any byte is written, and a refused image never replaces the running one: AWTRIX switches slots only after a whole image has arrived @@ -1897,6 +1917,10 @@ of each kind were actually applied (`wifi`, `system`, `settings`, `appLoop`, `ra `icons`, `melodies`, `palettes`, `MP3s`, `scripts`, plus `skipped` for rejected entries), and a `warnings` array with one string per skipped or rejected entry. +On the Galactic Unicorn, `config/system.json` restores everything except the pins and the panel +size and wiring, which belong to the board: a backup from a board wired differently still restores +the rest. + Config changes that only take effect at boot - new Wi-Fi credentials, `config/system.json` - need a reboot to apply; [`POST /api/v1/device/reboot`](#post-apiv1devicereboot) is allowed in AP mode too. @@ -2059,3 +2083,32 @@ Anything not matched above answers **404** `notFound` with message `unknown rout | POST | `/api/v1/restore` | [backup ZIP; available in AP mode](#post-apiv1restore) | | GET | `/`, `/index.html`, `/fullscreen` | [web UI](#get) | | GET | `/ICONS/*`, `/MELODIES/*`, `/PALETTES/*`, `/MP3/*`, `/SCRIPTS/*`, `/apploop.json` | [static assets](#web-ui-and-static-assets) | + +## Galactic Unicorn build capabilities + +`GET /api/v1/capabilities` includes `scripting` (true on the ESP32, simulator and +Pico builds unless built with `AWTRIX_FEATURE_SCRIPTING=0`). `scriptUpdates` follows that flag. +The `audio` flags come from registered sound sinks, not just build support: +Pico reports `buzzer` true once its I²S tone sink starts, and track, mp3 and +radio false. + +Pico's MP3 routes, radio station routes, MP3/radio play commands and browser +`/update` return HTTP 503 with the existing `unavailable` error. MQTT audio commands return `ok:false` with the same +error code (MQTT has no HTTP status). There are no MQTT script-upload commands. +Outbound TLS is absent: radio is disabled entirely, and scripts run but their +`http.*` requests and Modbus reads return `false`. The portable policy also rejects explicit HTTPS stream +play requests when TLS alone is disabled. Local file storage and icon-origin +metadata are not outbound requests and remain independent of TLS support. + +`gpio.soc` is `rp2040` for both Unicorn variants, `gpio.label` identifies the +board and `gpio.fixed` is `true`. All pin assignments are fixed: buttons A/B/C map +to left/select/right (0/1/3), LDR is 28, I2S data/BCLK/LRCLK is 9/10/11, amplifier +enable is 22. Battery, I2C, piezo buzzer and DFPlayer pins are -1: these builds +read no I2C sensor, although the Qw/ST connector is wired to GPIO 4/5. `pinMatrix: -1` and an +empty `gpio.matrix` list denote a fixed PIO panel, not a disabled display; panel +pins 13-20 are reserved, never user-routable. Any change to the default pin set +(including enabling DFPlayer) is refused. Existing ESP32 pin rules are unchanged. + +The panel is part of the board too: `gpio.panel` gives its width and the heights it +can run at. At boot, a pin map or panel size stored by another build is replaced by +the board's own, so it cannot make every later `PUT /api/v1/system` fail. diff --git a/docs/reference/limits.md b/docs/reference/limits.md index d262b4fa..3cfb49bf 100644 --- a/docs/reference/limits.md +++ b/docs/reference/limits.md @@ -2,6 +2,23 @@ Every cap AWTRIX enforces, and what it answers when you reach one. +## Tall panels: content band and full canvas + +The panel height `H` is 8–16 pixels (default 8). On taller panels, body text, +primary 8×8 icons and built-in apps keep their original eight-row layout in a +vertically centred band starting at `floor((H - 8) / 2)`. At 53×11 the band is +rows 1–8; at 32×8 nothing moves. + +Background colours, effects, overlays, transitions and charts use the full +canvas, rows `0 .. H-1`. Progress stays on row `H-1` (row 10 at 53×11). +GIF decoding uses the panel width and height as its size limits; images retain +their own dimensions rather than being stretched. Full-screen images are not +shifted into the text band. + +Draw commands, positioned icons and script drawing use absolute top-left canvas +coordinates with no band offset. Scripts must query `width()` and `height()`; +never assume an eight-row canvas. + ## Requests | Limit | Value | At the edge | @@ -93,9 +110,33 @@ Which formats are accepted, and how each one is drawn, is in | Limit | Value | At the edge | | --- | --- | --- | | Panel width | [`panelWidth × panels`](system.md#panel-and-orientation), default `32 × 1`, must come to 32–128 | outside the range: `422 validationFailed` on `panelWidth` | -| Panel height | 8 pixels | fixed; not configurable | +| Panel height | [`panelHeight`](system.md#panel-and-orientation), 8–16 pixels, default `8`; applies after reboot | outside the range: `422 validationFailed` on `panelHeight` | | GIF dimensions | up to the panel's width and height | resize larger GIFs before uploading; every animation frame must fit | +## Galactic Unicorn (Pico W) + +The [Pico W and Pico 2 W builds](../advanced/galactic-unicorn.md) reserve **512 KiB +LittleFS** on both 2 MB and 4 MB flash. Their fixed canvas is 53×11, or 53×8 +letterboxed compatibility mode; other heights fall back to 11 at boot. +The generic 8–16 validation range does not resize the physical board. + +Both Pico builds run Berry scripts under the limits above, except where this table +says otherwise. They have no MP3, radio, outbound TLS or browser OTA. RTTTL tones +are supported using the ordinary melody limits. See the +[board guide](../advanced/galactic-unicorn.md#scripting) for feature errors, UF2 +updates and sleep emulation. + +| Limit | Value | At the edge | +| --- | --- | --- | +| Shared script memory | 48 KB on the Pico W (RP2040); 96 KB on the Pico 2 W (RP2350) | **new** installs refused until it drops; nothing already installed is removed | +| Largest script | about 7 KB of source on the Pico W, about 28 KB on the Pico 2 W, measured | stored but not run, `out of memory`; far larger sources are refused with `507` | +| Memory in one piece (Pico W) | a failed install of a big script can fragment the heap | later installs refused, `507` - reboot | +| Script HTTP and Modbus requests, and icons | not available on either Pico | `http.*` and `modbus` reads return `false`; script icons are not drawn | +| Hung or faulted firmware | hardware watchdog, ~8 s | reboots itself; `/api/v1/device` then reports `resetReason: "watchdog"` | +| Stalled HTTP client | a request must arrive within 5 s; a response the client stops taking for 5 s is abandoned | the connection is closed and the device carries on | +| Request line and headers | 2 KB | a longer request is answered `431` and the connection is closed | +| Deliberately slow upload | a body over 2 KB sent slower than about 180 bytes per second | can hold the loop past the watchdog, which restarts the Pico; ordinary slow networks are far faster | + ## What is *not* limited - **Requests per second.** Neither the HTTP API nor MQTT rate-limits you. diff --git a/docs/reference/mqtt.md b/docs/reference/mqtt.md index 0c04a248..0d4bd351 100644 --- a/docs/reference/mqtt.md +++ b/docs/reference/mqtt.md @@ -30,6 +30,22 @@ shape - hold on every topic below. These live in the device configuration, not in settings - see [System configuration](system.md). The MQTT client id is the device **uid**. +The Galactic Unicorn uses these same settings, topic names, retain flags and +Home Assistant discovery generator. Restart after changing broker settings, +as on ESP32. Its Pico networking core resolves DNS and `.local` mDNS names; +if a `.local` lookup fails it also tries DNS on the bare label. Unlike ESP32's +background resolver task, each Pico lookup may pause the loop for up to one +second (two seconds including that fallback). TCP connect/write use a 300 ms +timeout, MQTT CONNACK uses two seconds, and bounded work feeds the eight-second +hardware watchdog. Failed connections retain the shared retry backoff. + +Discovery keeps manufacturer `Blueforcer`, model `AWTRIX NG`, and stock entity +names, including `mqtt_prefix` and the left/select/right button binary sensors. +UID, hostname, firmware version and prefix are device-specific; optional sensor +entities reflect fitted hardware (the Unicorn has light, but no battery or +environment sensor). Unsupported audio/script commands still use the shared +capability checks; enabling MQTT does not enable those features. + ### Topic prefix `

` `

` is whatever you put in `mqttPrefix`. Leave it empty and AWTRIX falls back @@ -308,6 +324,8 @@ mosquitto_pub -h broker.local -t 'awtrixNG/cmd/device/reboot' -m '' A valid value answers `{"ok":true}` on `.../result`, then AWTRIX enters deep sleep on the next loop pass; nothing is published after that. +On the Galactic Unicorn the sleep is emulated, and the Sleep key (GPIO27) also ends it; see +[`POST /api/v1/device/sleep`](http.md#post-apiv1devicesleep). ```bash mosquitto_pub -h broker.local -t 'awtrixNG/cmd/device/sleep' \ diff --git a/docs/reference/payload.md b/docs/reference/payload.md index 2007162e..707a0e69 100644 --- a/docs/reference/payload.md +++ b/docs/reference/payload.md @@ -177,7 +177,7 @@ curl -X POST http:///api/v1/notifications \ ### `textInFront` -`textInFront` sets z-order, not position - the baseline is row 6 either way. With `true` the decorations (draw commands, progress bar, charts) are painted first and the text lands **on top**; the default `false` paints the text first and the decorations over it. +`textInFront` sets z-order, not position - the baseline is row 6 within the centred eight-row content band either way. With `true` the decorations (draw commands, progress bar, charts) are painted first and the text lands **on top**; the default `false` paints the text first and the decorations over it. ### Positioning and centering @@ -391,7 +391,10 @@ It works the same for pushed apps and notifications. `barChart` and `lineChart` can be combined; both are drawn. Both are capped at 16 entries, with extras silently dropped, and both share `chartAutoscale`. Non-numeric entries coerce to 0. - **`chartAutoscale: true`** - the chart spans `min .. max` of the data, where `max` is floored at 1 and `min` at 0. An all-positive series therefore spans `0 .. max`; the range only opens downward once a value is actually negative. -- **`chartAutoscale: false`** - the range is fixed at `0 .. 8`: a value of 8 fills the full 8px height, and values outside the range clamp to the canvas. +- **`chartAutoscale: false`** - the data range stays fixed at `0 .. 8`, regardless of panel height: a value of 8 fills all `H` rows, and values outside the range clamp to the canvas. + +Both chart types scale to the full panel height, not the centred text band. At +53×11 their vertical range reaches rows 0–10. **`barChart`** divides the space to the right of the icon column evenly among the values - each bar at least 1px wide, separated by a 1px gap. Bars are anchored to the row where the value **zero** falls: with all-positive data that is the bottom row, so a bar's height is proportional to its value as a fraction of the range max. Once the series contains a negative value the baseline lifts off the bottom, positive bars grow up from it and negative bars hang below it. @@ -407,6 +410,9 @@ curl -X PUT http:///api/v1/apps/pushed/traffic \ ## Progress bar +The bottom row is `y = H-1`: row 7 at 32×8, row 10 at 53×11. Progress does not +move with the centred eight-row text band. + | Key | Type | Range | Default | Meaning | |---|---|---|---|---| | `progress` | int | percent, below 0 = off | `-1` | Fill percentage | @@ -545,6 +551,11 @@ curl -X PUT http:///api/v1/apps/pushed/forecast \ ## Draw commands +Coordinates are absolute on the full canvas: `(0,0)` is the panel's top-left, +and `(width-1,height-1)` is its bottom-right. No text-band offset is applied. +Use the configured panel dimensions instead of assuming eight rows. In scripts, +query `width()` and `height()`. + | Key | Type | Range | Default | Meaning | |---|---|---|---|---| | `draw` | array of arrays | uncapped | `[]` | Drawing commands, each an array with the command name first | diff --git a/docs/reference/system.md b/docs/reference/system.md index 035b1aa2..d336ea65 100644 --- a/docs/reference/system.md +++ b/docs/reference/system.md @@ -81,7 +81,8 @@ curl -X PUT http:///api/v1/system \ Each field's accepted range is the "Range" column of its own table below. Every `pin*` field takes `-1` (disabled) or a GPIO within the chip's range - 0–39 on the ESP32, 0–48 (22–25 do not exist) on -the ESP32-S3; see [GPIO & boards](gpio.md). +the ESP32-S3; see [GPIO & boards](gpio.md). On the Galactic Unicorn every pin is fixed, and a change +is refused; see [Galactic Unicorn build capabilities](http.md#galactic-unicorn-build-capabilities). Integer fields also reject a non-integer (`{"mqttPort":"eighty"}` and `{"tempDecimals":1.5}` both fail with `422`); the float fields accept any number in range. @@ -312,11 +313,12 @@ See [Brightness & sensors](../guides/brightness.md). Your matrix is described as **panels**: how wide one panel is, how many of them the data cable runs through, where that cable enters, and how the strip is laid out inside a panel. The total -width follows from the first two - `panelWidth × panels` - and the height is always 8 pixels. +width follows from `panelWidth × panels`; `panelHeight` sets the height (8–16 pixels, default 8). | Key | Type | Range | Default | Effect | Reboot | |---|---|---|---|---|---| | `panelWidth` | int | 1–128 | `32` | Width of one panel in pixels. | yes, if the total width changes | +| `panelHeight` | int | 8–16 | `8` | Height of every panel in pixels. | yes | | `panels` | int | 1–128 | `1` | How many identical panels the strip runs through, left to right. `panelWidth × panels` must come to 32–128, or the write is `422 validationFailed` on `panelWidth`. | yes, if the total width changes | | `panelStart` | enum | `topLeft` `topRight` `bottomLeft` `bottomRight` | `topLeft` | The corner the first LED sits in. Names are case-insensitive; anything else is `422`. | no | | `panelWiring` | enum | `rows` `columns` | `rows` | Whether the strip runs along the rows or down the columns inside a panel. | no | @@ -336,9 +338,14 @@ Only `rotate` moves the buttons; a `panelStart` of `bottomRight` is a statement not about the image. On a single-panel device the two chain keys cannot change anything. Wiring is re-applied on the next frame, so you can try a setting and look at the panel. The one -exception is the total width, which is fixed at boot: a change to `panelWidth × panels` needs +exception is the canvas size, which is fixed at boot: a change to `panelWidth × panels` or `panelHeight` needs `POST /api/v1/device/reboot`. +The Galactic Unicorn's panel is built in: `panelWidth` is `53`, `panels` is `1`, and `panelHeight` +is `11` or `8` (default `11`). Any other value, or a change to `panelStart`, `panelWiring`, +`panelSerpentine`, `panelColorOrder` or the chain keys, is refused with `422 validationFailed` +naming the field. `mirror` and `rotate` work as on any panel. + ### The wirings people actually have | Build | Configuration | diff --git a/docs/reference/visuals.md b/docs/reference/visuals.md index b2aeab2e..9728395b 100644 --- a/docs/reference/visuals.md +++ b/docs/reference/visuals.md @@ -40,14 +40,14 @@ AWTRIX draws **19 background effects**: | `TheaterChase` | Every third column lit, marching sideways (unlit pixels black) | yes | | `Fade` | Whole canvas pulsing one colour; stock look is a dark-blue breath | yes | | `MovingLine` | One full-height vertical line sweeping left → right | yes | -| `BrickBreaker` | Three rows of bricks, white ball, grey paddle on the bottom row | **no** | -| `PingPong` | A single pixel bouncing horizontally and vertically | **no** | +| `BrickBreaker` | A brick-breaker game: 3-pixel bricks with 1-pixel gaps in 2 rows (3 rows from 11 panel rows up), one hue per row; the white ball knocks out one brick per hit and bounces at 45 degrees or shallow off a 3-pixel grey paddle that never misses. The wall refills when cleared | **no** | +| `PingPong` | A rally: grey paddles on the left and right edges (3 pixels tall, 4 from 11 rows up) follow a green ball, which bounces off the top and bottom and returns at 45 degrees or shallow depending on where it meets the paddle | **no** | | `Radar` | Sweeping radius line from the centre; stock look is green | yes | | `Checkerboard` | 2×2-cell checkerboard, inverting every animation step | yes | | `Fireworks` | An expanding ring burst at a random position and colour every 20 steps | yes | | `PlasmaCloud` | Softer, slower plasma with a narrower hue band | yes | | `Ripple` | A single ring expanding from the centre, repeating | yes | -| `Snake` | A 6-pixel snake advancing one pixel per frame, wrapping row by row | yes | +| `Snake` | A snake game: the snake steers to a red food pixel, grows by one each time it eats and restarts at length 4 when stuck or 24 long. The palette colours the body head to tail (stock look: bright to dim green); the food stays red | yes | | `Pacifica` | Ocean waves; stock look is blue-teal | yes | | `Matrix` | Per-column falling green trails, bright-headed, with random phases and trail lengths | **no** | | `SwirlIn` | A 48-point spiral converging inward | yes | diff --git a/mkdocs.yml b/mkdocs.yml index 72eebe73..e5c690c3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -123,5 +123,8 @@ nav: - Troubleshooting: troubleshooting/troubleshooting.md - FAQ: troubleshooting/faq.md - Advanced: + - Galactic Unicorn: advanced/galactic-unicorn.md + - Galactic Unicorn driver: advanced/galactic-unicorn-display.md + - Pico persistence: advanced/pico-persistence.md - Simulator: advanced/simulator.md - Building from source: advanced/building.md diff --git a/platformio.ini b/platformio.ini index 98c737c3..a9b310d2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -87,7 +87,7 @@ platform = espressif32@6.12.0 board = esp32dev ; ScriptHeapNative.cpp is the host/simulator half of the script heap seam; the ; device half is system/ScriptHeapEsp32.cpp. Exactly one may link. -build_src_filter = +<*> - - +build_src_filter = +<*> - - - - build_flags = ${device.build_flags} @@ -124,7 +124,7 @@ platform = espressif32@6.12.0 board = esp32-s3-devkitc-1-n16r8 ; ScriptHeapNative.cpp is the host/simulator half of the script heap seam; the ; device half is system/ScriptHeapEsp32.cpp. Exactly one may link. -build_src_filter = +<*> - - +build_src_filter = +<*> - - - - build_flags = ${device.build_flags} -D AWTRIX_SOC_ESP32S3 @@ -163,6 +163,93 @@ build_flags = -Wl,--wrap=calloc -Wl,--wrap=realloc +; --------------------------------------------------------------------------- +; Pico W / Pico 2 W. Explicit allowlist: the Berry VM is linked; no ESP +; transport, MP3 decoder, TLS client or browser OTA objects are. +; 512 KiB LittleFS leaves 1536 KiB minus the core's reserved EEPROM/boot space +; on the 2 MiB Pico W. Check the linker size report before enlarging this. +; --------------------------------------------------------------------------- +[env:galactic_unicorn] +platform = https://github.com/maxgerhardt/platform-raspberrypi.git#5d4561a05e3b212660ac6fdd3fbfb328d1988aa1 +board = rpipicow +framework = arduino +board_build.core = earlephilhower +board_build.filesystem_size = 0.5m +monitor_speed = 115200 +extra_scripts = + pre:scripts/gen_version.py + pre:scripts/build_webui.py +build_unflags = -std=gnu++11 -std=gnu++14 -std=gnu++17 +build_flags = + -std=gnu++17 + -Os + -I src + -D AWTRIX_PLATFORM_RP2040 + -Wl,--wrap=init_cyw43_wifi + -Wl,--wrap=cyw43_cb_process_async_event + ; arduino-pico's newlib-nano drops %f unless this is linked (its Arduino IDE + ; platform.txt adds it; its PlatformIO builder does not). Without it every + ; float in the JSON API renders as nothing, e.g. "lightLevel":, + -Wl,-u,_printf_float + -D AWTRIX_SOC_RP2040 + ; Berry scripting is on (platform/BuildFeatures.h); -D AWTRIX_FEATURE_SCRIPTING=0 + ; builds it out. The VM's heap budget is AWTRIX_RP2040_SCRIPT_HEAP_KB: 48 KB on + ; the Pico W and 96 KB (the ESP32's) on the Pico 2 W by default, out of the one + ; heap Wi-Fi, HTTP, MQTT and the display share (platform/rp2040/ScriptHeapRp2040.cpp). + -D AWTRIX_FEATURE_MP3=0 + -D AWTRIX_FEATURE_RADIO=0 + -D AWTRIX_FEATURE_OUTBOUND_TLS=0 + -D AWTRIX_FEATURE_BROWSER_OTA=0 +build_src_filter = + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +; Evaluate conditional includes: the ESP32 Preferences header must not select +; the unrelated iLabs Hearth library on Pico. +lib_ldf_mode = chain+ +lib_deps = + densaugeo/base64@^1.4.0 + knolleary/PubSubClient@^2.8 + +[env:galactic_unicorn_2w] +extends = env:galactic_unicorn +board = rpipico2w + +; Size comparison only, never a release image (UDP services intentionally absent). +[env:galactic_unicorn_udp_measure] +extends = env:galactic_unicorn +build_flags = + ${env:galactic_unicorn.build_flags} + -D AWTRIX_PICO_UDP=0 + ; --------------------------------------------------------------------------- ; Host unit tests for the portable core (no Arduino / no FastLED) ; --------------------------------------------------------------------------- @@ -190,6 +277,7 @@ build_flags = build_src_filter = + + + + lib_deps = berry densaugeo/base64@^1.4.0 @@ -218,6 +306,7 @@ build_flags = build_src_filter = + + + + + + ; One icon binding serves both platforms: GifPlayer and icon::draw each have diff --git a/src/core/BuiltinCatalog.h b/src/core/BuiltinCatalog.h new file mode 100644 index 00000000..91015e1a --- /dev/null +++ b/src/core/BuiltinCatalog.h @@ -0,0 +1,41 @@ +#pragma once +#include "core/apps/AppRegistry.h" +#include "core/apps/builtin/BatteryApp.h" +#include "core/apps/builtin/DateApp.h" +#include "core/apps/builtin/HumidityApp.h" +#include "core/apps/builtin/TempApp.h" +#include "core/apps/builtin/TimeApp.h" +#include "core/effects/EffectRegistry.h" +#include "core/effects/effects/FadeEffect.h" +#include "core/effects/effects/MoreEffects.h" +#include "core/effects/effects/PlasmaEffect.h" +#include "core/effects/effects/TheaterChaseEffect.h" +#include "core/effects/overlays/RainOverlay.h" +#include "core/effects/overlays/SnowOverlay.h" +#include "core/effects/overlays/WeatherOverlays.h" + +namespace awtrix { +// One portable catalog for device platforms. Own it for the registries' lifetime. +// Sensor apps remain registered; CoreEngine gates their presence on sensor availability. +class BuiltinCatalog { + public: + void addTo(AppRegistry& apps, EffectRegistry& effects, EffectRegistry& overlays) { + apps.add(&time_); apps.add(&date_); apps.add(&temp_); apps.add(&humidity_); apps.add(&battery_); + IEffect* effectList[] = {&plasma_, &chase_, &fade_, &line_, &brick_, + &ping_, &radar_, &check_, &fire_, &cloud_, &ripple_, &snake_, &pacifica_, &matrix_, + &swirlIn_, &swirlOut_, &eyes_, &stars_, &waves_}; + for (auto* effect : effectList) effects.add(effect); + IEffect* overlayList[] = {&rain_, &snow_, &drizzle_, &storm_, &thunder_, &frost_}; + for (auto* overlay : overlayList) overlays.add(overlay); + } + private: + TimeApp time_; DateApp date_; TempApp temp_; HumidityApp humidity_; BatteryApp battery_; + PlasmaEffect plasma_; TheaterChaseEffect chase_; FadeEffect fade_; MovingLineEffect line_; + BrickBreakerEffect brick_; PingPongEffect ping_; RadarEffect radar_; CheckerboardEffect check_; + FireworksEffect fire_; PlasmaCloudEffect cloud_; RippleEffect ripple_; SnakeEffect snake_; + PacificaEffect pacifica_; MatrixEffect matrix_; SwirlInEffect swirlIn_; SwirlOutEffect swirlOut_; + LookingEyesEffect eyes_; TwinklingStarsEffect stars_; ColorWavesEffect waves_; + RainOverlay rain_; SnowOverlay snow_; DrizzleOverlay drizzle_; StormOverlay storm_; + ThunderOverlay thunder_; FrostOverlay frost_; +}; +} diff --git a/src/core/ConfigRules.h b/src/core/ConfigRules.h index 8322634f..bc867369 100644 --- a/src/core/ConfigRules.h +++ b/src/core/ConfigRules.h @@ -42,6 +42,7 @@ inline const NumRange* ranges(std::size_t& count) { {"minBrightness", 0, 255, true}, {"maxBrightness", 0, 255, true}, {"panelWidth", 1, kMatrixWidthMax, true}, + {"panelHeight", kMatrixHeightMin, kMatrixHeightMax, true}, {"panels", 1, kMatrixWidthMax, true}, {"tempOffset", -20, 20, false}, {"humOffset", -50, 50, false}, @@ -240,6 +241,26 @@ inline bool validateMatrixGeometry(int panelWidth, int panels, ConfigError& err) return true; } +// A board with its panel built in (the Galactic Unicorn) has one width and a few heights. Any other +// value would be stored and reported back while the panel went on drawing its own size. +inline bool validateFixedPanel(const pins::SocProfile& soc, int panelWidth, int panels, + int panelHeight, ConfigError& err) { + if (!soc.fixedPanelWidth) return true; + if (panelWidth != soc.fixedPanelWidth || panels != 1) { + err = {panels != 1 ? "panels" : "panelWidth", + std::string(soc.label) + ": the panel is one panel, " + + std::to_string(soc.fixedPanelWidth) + " pixels wide"}; + return false; + } + if (panelHeight != soc.fixedPanelHeights[0] && panelHeight != soc.fixedPanelHeights[1]) { + err = {"panelHeight", std::string(soc.label) + ": panelHeight must be " + + std::to_string(soc.fixedPanelHeights[0]) + " or " + + std::to_string(soc.fixedPanelHeights[1])}; + return false; + } + return true; +} + // bclk/lrclk/dout are the bus and go together; mclk and ampEnable are extras some DAC boards // need and are only meaningful once the bus itself is wired. inline bool validateAudioPins(int bclk, int lrclk, int dout, int mclk, int ampEnable, @@ -264,8 +285,12 @@ inline bool validateAudioPins(int bclk, int lrclk, int dout, int mclk, int ampEn // Walks a /api/v1/system body and stops at the first key that breaks a rule. Keys that match none // of the rules are accepted untouched, which is what lets plain strings and flags pass through. // allowEmptyClears is for restoring a backup, where an empty wifiSsid is a real recorded value. +// pinsKept: the caller replaces every pin with the board's own afterwards (a restore onto a board +// with fixed wiring), so another board's pins are only type-checked, not held to this chip's range. inline bool validateSystemRead(api::JsonReader obj, ConfigError& err, - bool allowEmptyClears = false) { + bool allowEmptyClears = false, + const pins::SocProfile& soc = pins::activeProfile(), + bool pinsKept = false) { if (!obj.isObject()) return true; std::string subnetValue; const bool hasSubnet = detail::asString(api::memberValue(obj, "subnet"), subnetValue); @@ -344,8 +369,8 @@ inline bool validateSystemRead(api::JsonReader obj, ConfigError& err, err = {key, "must be an integer GPIO (-1 = disabled)"}; return false; } - const int gpioMax = pins::activeProfile().gpioMax; - if (p < -1 || p > gpioMax) { + const int gpioMax = soc.gpioMax; + if (!pinsKept && (p < -1 || p > gpioMax)) { err = {key, "must be -1 (disabled) or a GPIO in 0.." + std::to_string(gpioMax)}; return false; } diff --git a/src/core/FeatureSet.h b/src/core/FeatureSet.h new file mode 100644 index 00000000..92c1f933 --- /dev/null +++ b/src/core/FeatureSet.h @@ -0,0 +1,64 @@ +#pragma once + +#include +#include "core/Command.h" +#include "core/api/JsonReader.h" +#include "core/sound/AudioRouter.h" + +namespace awtrix { +// Build support, separate from the audio sinks actually installed at runtime. +struct FeatureSet { + bool scripting = true; + bool mp3 = true; + bool radio = true; + bool outboundTls = true; + bool browserOta = true; +}; + +inline DispatchResult featurePolicy(const FeatureSet& features, const std::string& path) { + struct Rule { const char* path; bool prefix; bool FeatureSet::*enabled; }; + static const Rule rules[] = { + {"/api/v1/scripts/", true, &FeatureSet::scripting}, + {"/api/v1/apps/script/", true, &FeatureSet::scripting}, + {"/api/v1/apps/script-update/", true, &FeatureSet::scripting}, + {"/api/v1/audio/mp3", false, &FeatureSet::mp3}, + {"/api/v1/audio/mp3/", true, &FeatureSet::mp3}, + {"/api/v1/audio/stations", false, &FeatureSet::radio}, + {"cmd/audio/stations", false, &FeatureSet::radio}, + {"/update", false, &FeatureSet::browserOta}, + }; + for (const auto& rule : rules) + if (!(features.*rule.enabled) && + (rule.prefix ? path.rfind(rule.path, 0) == 0 : path == rule.path)) + return DispatchResult::Unavailable; + if (!features.scripting && path.rfind("/api/v1/apps/", 0) == 0 && + path.size() >= 7 && path.compare(path.size() - 7, 7, "/config") == 0) + return DispatchResult::Unavailable; + return DispatchResult::Ok; +} + +inline DispatchResult featurePolicy(const FeatureSet& features, const Command& cmd) { + struct Rule { CommandType command; bool FeatureSet::*enabled; }; + static const Rule rules[] = { + {CommandType::ScriptSet, &FeatureSet::scripting}, + {CommandType::ScriptUpdate, &FeatureSet::scripting}, + {CommandType::ScriptConfigSet, &FeatureSet::scripting}, + {CommandType::ScriptRemove, &FeatureSet::scripting}, + {CommandType::PlayStream, &FeatureSet::radio}, + {CommandType::SetRadioStations, &FeatureSet::radio}, + }; + for (const auto& rule : rules) + if (cmd.type == rule.command && !(features.*rule.enabled)) + return DispatchResult::Unavailable; + if (cmd.type == CommandType::PlayAudio && + cmd.arg == static_cast(sound::Source::Mp3) && !features.mp3) + return DispatchResult::Unavailable; + if (cmd.type == CommandType::PlayStream && !features.outboundTls) { + api::JsonReader url; + std::string value; + if (api::readMembers(cmd.payload, {{"url", &url}}) && url.appendString(value) && + value.rfind("https://", 0) == 0) return DispatchResult::Unavailable; + } + return DispatchResult::Ok; +} +} diff --git a/src/core/PinRules.h b/src/core/PinRules.h index b9e93080..8ce430a1 100644 --- a/src/core/PinRules.h +++ b/src/core/PinRules.h @@ -43,6 +43,18 @@ inline bool isRtcWakePin(int pin, const SocProfile& soc) { // Checks a whole pin set at once and returns the first problem as a message meant for the user. // -1 means the peripheral is off, so only pinMatrix is ever required. inline bool validate(const PinSet& p, const SocProfile& soc, std::string& err) { + if (soc.fixedWiring) { + const auto& d = soc.defaults; + const int PinSet::*fields[] = { + &PinSet::matrix, &PinSet::btnLeft, &PinSet::btnSelect, &PinSet::btnRight, + &PinSet::battery, &PinSet::ldr, &PinSet::buzzer, &PinSet::i2cSda, &PinSet::i2cScl, + &PinSet::dfRx, &PinSet::dfTx, &PinSet::i2sBclk, &PinSet::i2sLrclk, + &PinSet::i2sDout, &PinSet::i2sMclk, &PinSet::ampEnable}; + bool unchanged = p.dfplayerEnabled == d.dfplayerEnabled; + for (auto field : fields) unchanged = unchanged && p.*field == d.*field; + if (!unchanged) err = std::string(soc.label) + ": pin assignments are fixed"; + return unchanged; + } struct Entry { const char* name; int pin; diff --git a/src/core/SocProfile.h b/src/core/SocProfile.h index 2a060e00..18f18366 100644 --- a/src/core/SocProfile.h +++ b/src/core/SocProfile.h @@ -10,14 +10,6 @@ #define AWTRIX_MATRIX_PINS_ESP32S3(X) \ X(13) X(14) X(15) X(16) X(17) X(18) X(21) X(38) X(39) X(40) X(41) X(42) X(47) -#if defined(AWTRIX_SOC_ESP32S3) -#define AWTRIX_MATRIX_PIN_LIST(X) AWTRIX_MATRIX_PINS_ESP32S3(X) -#define AWTRIX_MATRIX_FALLBACK_PIN 21 -#else -#define AWTRIX_MATRIX_PIN_LIST(X) AWTRIX_MATRIX_PINS_ESP32(X) -#define AWTRIX_MATRIX_FALLBACK_PIN 32 -#endif - namespace awtrix { namespace pins { @@ -99,6 +91,10 @@ struct SocProfile { RangeList rtc; PinList matrix; PinSet defaults; + bool fixedWiring = false; + // A panel built into the board: its width and the heights it can show. 0 means configurable. + int fixedPanelWidth = 0; + int fixedPanelHeights[2] = {0, 0}; }; namespace detail { @@ -173,13 +169,26 @@ inline const SocProfile& esp32s3Profile() { return p; } -inline const SocProfile& activeProfile() { -#if defined(AWTRIX_SOC_ESP32S3) - return esp32s3Profile(); -#else - return esp32Profile(); -#endif +// Galactic Unicorn wiring, shared by Pico W and Pico 2 W. The panel has no +// single data-pin setting: -1 denotes its fixed multi-pin PIO interface. I2C is -1 +// as well: the Qw/ST connector is on GPIO 4/5, but these builds read no I2C sensor. +// https://github.com/pimoroni/pimoroni-pico/blob/main/libraries/galactic_unicorn/galactic_unicorn.hpp +inline const SocProfile& rp2040Profile() { + static constexpr PinRange adc[] = {{26, 28}}; + static constexpr ReservedRange reserved[] = { + {13, 20, "the fixed panel interface"}, {23, 25, "the Pico wireless interface"}, + {29, 29, "the Pico wireless interface"}}; + static const SocProfile p = { + "rp2040", "Galactic Unicorn (Pico W / Pico 2 W)", 29, + {nullptr, 0}, {nullptr, 0}, {reserved, detail::countOf(reserved)}, + {adc, detail::countOf(adc)}, {nullptr, 0}, {nullptr, 0}, {nullptr, 0}, + PinSet{-1, 0, 1, 3, -1, 28, -1, -1, -1, -1, -1, false, 10, 11, 9, -1, 22}, + true, 53, {8, 11}}; + return p; } +// Implemented by the platform; policy and reference profiles above are portable. +const SocProfile& activeProfile(); + } } diff --git a/src/core/SocProfileJson.h b/src/core/SocProfileJson.h index d46da72c..24df05e7 100644 --- a/src/core/SocProfileJson.h +++ b/src/core/SocProfileJson.h @@ -35,9 +35,17 @@ inline std::string toJson(const SocProfile& soc) { return out + ']'; }; + // A board with a built-in panel names it: one panel, this wide, and the heights it can run at. + std::string panel; + if (soc.fixedPanelWidth) + panel = ",\"panel\":{\"width\":" + std::to_string(soc.fixedPanelWidth) + ",\"heights\":[" + + std::to_string(soc.fixedPanelHeights[0]) + ',' + + std::to_string(soc.fixedPanelHeights[1]) + "]}"; + const PinSet& d = soc.defaults; return std::string("{\"soc\":\"") + soc.id + "\",\"label\":\"" + soc.label + - "\",\"max\":" + std::to_string(soc.gpioMax) + ",\"missing\":" + ranges(soc.missing) + + "\",\"fixed\":" + (soc.fixedWiring ? "true" : "false") + + ",\"max\":" + std::to_string(soc.gpioMax) + ",\"missing\":" + ranges(soc.missing) + ",\"inputOnly\":" + ranges(soc.inputOnly) + ",\"reserved\":" + reserved(soc.reserved) + ",\"adc1\":" + ranges(soc.adc1) + ",\"strapping\":" + ranges(soc.strapping) + ",\"rtc\":" + ranges(soc.rtc) + @@ -51,7 +59,7 @@ inline std::string toJson(const SocProfile& soc) { std::to_string(d.dfTx) + ",\"pinI2sBclk\":" + std::to_string(d.i2sBclk) + ",\"pinI2sLrclk\":" + std::to_string(d.i2sLrclk) + ",\"pinI2sDout\":" + std::to_string(d.i2sDout) + ",\"pinI2sMclk\":" + std::to_string(d.i2sMclk) + - ",\"pinAmpEnable\":" + std::to_string(d.ampEnable) + "}}"; + ",\"pinAmpEnable\":" + std::to_string(d.ampEnable) + "}" + panel + "}"; } } diff --git a/src/core/api/ApiRouter.cpp b/src/core/api/ApiRouter.cpp index 3cfbda80..4b960a61 100644 --- a/src/core/api/ApiRouter.cpp +++ b/src/core/api/ApiRouter.cpp @@ -213,7 +213,7 @@ MethodResolution resolveHttpMethod(const std::string& method, const std::string& // Turns a request into a Command, or into an immediate error response. NoMatch means the path is // served elsewhere - notably every GET, since reads are answered directly, not as commands. -RouteOutcome routeHttp(const std::string& method, const std::string& path, +static RouteOutcome routeHttpUnchecked(const std::string& method, const std::string& path, std::string&& body, Command& cmd, HttpResult& immediate) { const Source src = Source::Http; const bool post = method == "POST"; @@ -462,7 +462,7 @@ RouteOutcome routeHttp(const std::string& method, const std::string& path, // MQTT has no verbs, so an empty payload stands for the DELETE form of a command and shows up as // cmd.clear. -RouteOutcome routeMqtt(const std::string& suffix, const std::string& payload, +static RouteOutcome routeMqttUnchecked(const std::string& suffix, const std::string& payload, Command& cmd, std::string& resultPayload) { const Source src = Source::Mqtt; auto command = [&](CommandType t) { @@ -543,6 +543,37 @@ RouteOutcome routeMqtt(const std::string& suffix, const std::string& payload, return RouteOutcome::NoMatch; } +RouteOutcome routeHttp(const std::string& method, const std::string& path, + std::string&& body, Command& cmd, HttpResult& immediate, + const FeatureSet& features) { + if (featurePolicy(features, path) == DispatchResult::Unavailable) { + immediate = httpResponse(cmd, DispatchResult::Unavailable, {}); + return RouteOutcome::Respond; + } + const auto outcome = routeHttpUnchecked(method, path, std::move(body), cmd, immediate); + if (outcome == RouteOutcome::Routed && + featurePolicy(features, cmd) == DispatchResult::Unavailable) { + immediate = httpResponse(cmd, DispatchResult::Unavailable, {}); + return RouteOutcome::Respond; + } + return outcome; +} + +RouteOutcome routeMqtt(const std::string& suffix, const std::string& payload, + Command& cmd, std::string& resultPayload, const FeatureSet& features) { + if (featurePolicy(features, suffix) == DispatchResult::Unavailable) { + resultPayload = mqttResult(DispatchResult::Unavailable, {}); + return RouteOutcome::Respond; + } + const auto outcome = routeMqttUnchecked(suffix, payload, cmd, resultPayload); + if (outcome == RouteOutcome::Routed && + featurePolicy(features, cmd) == DispatchResult::Unavailable) { + resultPayload = mqttResult(DispatchResult::Unavailable, {}); + return RouteOutcome::Respond; + } + return outcome; +} + // True for the .../result topics the device publishes itself, so a wildcard subscription does not // feed our own replies back in as commands. bool isResultEcho(const std::string& suffix) { diff --git a/src/core/api/ApiRouter.h b/src/core/api/ApiRouter.h index 229fccad..012a23d0 100644 --- a/src/core/api/ApiRouter.h +++ b/src/core/api/ApiRouter.h @@ -3,6 +3,7 @@ #include #include "core/Command.h" +#include "core/FeatureSet.h" namespace awtrix { namespace api { @@ -21,7 +22,8 @@ enum class RouteOutcome : uint8_t { }; RouteOutcome routeHttp(const std::string& method, const std::string& path, - std::string&& body, Command& cmd, HttpResult& immediate); + std::string&& body, Command& cmd, HttpResult& immediate, + const FeatureSet& features = {}); inline constexpr const char* kMethodOverrideHeader = "X-HTTP-Method-Override"; @@ -40,7 +42,8 @@ std::string configAppName(const std::string& path); bool isRawBodyWrite(const std::string& method, const std::string& path); RouteOutcome routeMqtt(const std::string& suffix, const std::string& payload, - Command& cmd, std::string& resultPayload); + Command& cmd, std::string& resultPayload, + const FeatureSet& features = {}); bool isResultEcho(const std::string& suffix); diff --git a/src/core/api/ButtonEventJson.h b/src/core/api/ButtonEventJson.h new file mode 100644 index 00000000..21f23c71 --- /dev/null +++ b/src/core/api/ButtonEventJson.h @@ -0,0 +1,15 @@ +#pragma once +#include + +#include "core/api/JsonWriter.h" + +namespace awtrix::api { +// Body of the buttonCallback webhook, identical on every board: +// {"button":"left","state":true,"uid":"dcda0c29dcb8"} +inline std::string buttonEventJson(const char* button, bool state, const std::string& uid) { + std::string out; + JsonWriter w(out); + w.beginObject().member("button", button).member("state", state).member("uid", uid).endObject(); + return out; +} +} diff --git a/src/core/api/CapabilitiesJson.h b/src/core/api/CapabilitiesJson.h index 519e4cb3..f2c75a74 100644 --- a/src/core/api/CapabilitiesJson.h +++ b/src/core/api/CapabilitiesJson.h @@ -4,6 +4,7 @@ #include #include "core/SocProfileJson.h" +#include "core/FeatureSet.h" #include "core/Transitions.h" #include "core/sound/AudioRouter.h" @@ -13,7 +14,9 @@ namespace api { inline std::string capabilitiesJson(const std::vector& effects, const std::vector& paletteEffects, const std::vector& overlays, - const sound::Caps& audio) { + const sound::Caps& audio, + const FeatureSet& features = {}, + const pins::SocProfile& profile = pins::activeProfile()) { auto list = [](const std::vector& names) { std::string out = "["; bool first = true; @@ -33,7 +36,9 @@ inline std::string capabilitiesJson(const std::vector& effects, ",\"audio\":{\"buzzer\":" + flag(audio.buzzer) + ",\"track\":" + flag(audio.track) + ",\"mp3\":" + flag(audio.mp3) + ",\"radio\":" + flag(audio.radio) + "}" + - ",\"scriptUpdates\":true,\"gpio\":" + pins::toJson(pins::activeProfile()) + "}"; + ",\"scripting\":" + flag(features.scripting) + + ",\"scriptUpdates\":" + flag(features.scripting) + + ",\"gpio\":" + pins::toJson(profile) + "}"; } } diff --git a/src/core/api/StateJson.cpp b/src/core/api/StateJson.cpp index 0008bd82..a42e13fc 100644 --- a/src/core/api/StateJson.cpp +++ b/src/core/api/StateJson.cpp @@ -13,7 +13,7 @@ #include "core/render/Canvas.h" #include "core/render/Color.h" #include "core/script/ScriptHeap.h" -#include "core/script/ScriptHost.h" +#include "core/script/ScriptInfo.h" namespace awtrix { @@ -250,8 +250,7 @@ static void appendIconsJson(std::string& out, const std::string& raw) { void appendAppsJson(std::string& out, CoreEngine& engine, const script::ScriptHost* scripts, const std::vector* stored) { - const std::map info = - scripts ? scripts->list() : std::map{}; + const auto info = script::scriptInfo(scripts); const std::vector here = engine.knownApps(); @@ -321,7 +320,7 @@ void appendAppsJson(std::string& out, CoreEngine& engine, const script::ScriptHo } out += '}'; }; - auto addModule = [&](const std::string& id, const script::ScriptHost::Info& mod) { + auto addModule = [&](const std::string& id, const script::ScriptInfo& mod) { if (!first) out += ','; first = false; out += "{\"name\":"; @@ -362,7 +361,7 @@ void appendAppsJson(std::string& out, CoreEngine& engine, const script::ScriptHo for (const script::StoredScript& s : *stored) { if (engine.isScriptApp(s.name)) continue; if (s.meta.module) { - script::ScriptHost::Info mod; + script::ScriptInfo mod; mod.module = true; mod.importName = s.meta.moduleName.empty() ? s.name : s.meta.moduleName; mod.metaName = s.meta.name; diff --git a/src/core/apps/SpecRenderer.cpp b/src/core/apps/SpecRenderer.cpp index 70144dfb..65b35243 100644 --- a/src/core/apps/SpecRenderer.cpp +++ b/src/core/apps/SpecRenderer.cpp @@ -7,6 +7,7 @@ #include "core/StrCase.h" #include "core/render/Color.h" +#include "core/render/ContentBand.h" #include "core/render/Gfx2d.h" #include "core/render/ScrollText.h" #include "core/render/TextEncoding.h" @@ -91,8 +92,9 @@ void renderDecorations(Canvas& c, const AppSpec& s, const GfxFont& font, uint32_ } -void renderText(Canvas& c, const AppSpec& s, const GfxFont& font, uint32_t color, +void renderText(Canvas& panel, const AppSpec& s, const GfxFont& font, uint32_t color, const SpecRender& r) { + Canvas c = contentBand(panel); const bool hasFragments = !s.fragments.empty(); if (!hasFragments && s.text.empty()) return; diff --git a/src/core/apps/builtin/BatteryApp.h b/src/core/apps/builtin/BatteryApp.h index ed42a9de..7a297f7e 100644 --- a/src/core/apps/builtin/BatteryApp.h +++ b/src/core/apps/builtin/BatteryApp.h @@ -7,13 +7,15 @@ #include "core/apps/builtin/ContentFrame.h" #include "core/render/Color.h" #include "core/render/TextRenderer.h" +#include "core/render/ContentBand.h" namespace awtrix { class BatteryApp : public IApp { public: const std::string& id() const override { return id_; } - void render(Canvas& c, const RenderCtx& ctx) override { + void render(Canvas& panel, const RenderCtx& ctx) override { + Canvas c = render::contentBand(panel); const Settings& s = *ctx.settings; int pct = ctx.runtime->batteryPercent; if (pct < 0) pct = 0; diff --git a/src/core/apps/builtin/DateApp.h b/src/core/apps/builtin/DateApp.h index f5c9b5d8..722eea07 100644 --- a/src/core/apps/builtin/DateApp.h +++ b/src/core/apps/builtin/DateApp.h @@ -5,6 +5,7 @@ #include "core/apps/builtin/ContentFrame.h" #include "core/apps/builtin/WeekdayBar.h" #include "core/render/TextRenderer.h" +#include "core/render/ContentBand.h" namespace awtrix { @@ -12,7 +13,8 @@ class DateApp : public IApp { public: const std::string& id() const override { return id_; } - void render(Canvas& c, const RenderCtx& ctx) override { + void render(Canvas& panel, const RenderCtx& ctx) override { + Canvas c = render::contentBand(panel); const Settings& s = *ctx.settings; const std::string str = buildDateText(s, ctx.weekday, ctx.mday, ctx.month, ctx.year); const uint32_t col = s.dateColor.valueOr(s.textColor); diff --git a/src/core/apps/builtin/HumidityApp.h b/src/core/apps/builtin/HumidityApp.h index a6e6330c..d3195c58 100644 --- a/src/core/apps/builtin/HumidityApp.h +++ b/src/core/apps/builtin/HumidityApp.h @@ -5,13 +5,15 @@ #include "core/apps/builtin/BuiltinIcons.h" #include "core/apps/builtin/ContentFrame.h" #include "core/render/TextRenderer.h" +#include "core/render/ContentBand.h" namespace awtrix { class HumidityApp : public IApp { public: const std::string& id() const override { return id_; } - void render(Canvas& c, const RenderCtx& ctx) override { + void render(Canvas& panel, const RenderCtx& ctx) override { + Canvas c = render::contentBand(panel); const Settings& s = *ctx.settings; const std::string str = formatHumidity(ctx.runtime->humidity); const uint32_t col = s.humidityColor.valueOr(s.textColor); diff --git a/src/core/apps/builtin/TempApp.h b/src/core/apps/builtin/TempApp.h index 326af1f6..0e6c831e 100644 --- a/src/core/apps/builtin/TempApp.h +++ b/src/core/apps/builtin/TempApp.h @@ -5,13 +5,15 @@ #include "core/apps/builtin/BuiltinIcons.h" #include "core/apps/builtin/ContentFrame.h" #include "core/render/TextRenderer.h" +#include "core/render/ContentBand.h" namespace awtrix { class TempApp : public IApp { public: const std::string& id() const override { return id_; } - void render(Canvas& c, const RenderCtx& ctx) override { + void render(Canvas& panel, const RenderCtx& ctx) override { + Canvas c = render::contentBand(panel); const Settings& s = *ctx.settings; const std::string str = formatTemperature(ctx.runtime->temperatureC, s.useCelsius, ctx.runtime->tempDecimals); diff --git a/src/core/apps/builtin/TimeApp.h b/src/core/apps/builtin/TimeApp.h index d49820a8..b473377c 100644 --- a/src/core/apps/builtin/TimeApp.h +++ b/src/core/apps/builtin/TimeApp.h @@ -10,6 +10,7 @@ #include "core/apps/builtin/ContentFrame.h" #include "core/apps/builtin/WeekdayBar.h" #include "core/render/TextRenderer.h" +#include "core/render/ContentBand.h" namespace awtrix { @@ -41,7 +42,8 @@ class TimeApp : public IApp { public: const std::string& id() const override { return id_; } - void render(Canvas& c, const RenderCtx& ctx) override { + void render(Canvas& panel, const RenderCtx& ctx) override { + Canvas c = render::contentBand(panel); const Settings& s = *ctx.settings; // timeMode: 0 plain, 1-4 add the calendar box (2 and 4 move the weekday bar to the top), // 5 big clock, 6 binary. diff --git a/src/core/effects/effects/MoreEffects.h b/src/core/effects/effects/MoreEffects.h index 70f46914..53a639ee 100644 --- a/src/core/effects/effects/MoreEffects.h +++ b/src/core/effects/effects/MoreEffects.h @@ -64,24 +64,276 @@ inline void MovingLineEffect::render(Canvas& c, int64_t f) { for (int y = 0; y < c.height(); ++y) c.setPixel(x, y, col); } +// The three mini-games replay a bounded round from a fixed start instead of keeping state +// across frames: seeks, dropped frames and repeated calls all give the same picture. A round is +// kRound frames, so the worst case is kRound - 1 constant-cost ticks per frame. All state is +// fixed-size; nothing is allocated. +namespace fx { + +constexpr int kGameRound = 512; + +inline int clampInt(int v, int lo, int hi) { return v < lo ? lo : (v > hi ? hi : v); } + +// Splits an effect frame into the round it belongs to and the tick within that round. +inline int roundTick(int64_t f, uint32_t& round) { + const int tick = static_cast((f % kGameRound + kGameRound) % kGameRound); + round = static_cast((f - tick) / kGameRound); + return tick; +} + +// Bricks are 3 LEDs wide with a 1-LED gap, 2 rows (3 from 11 panel rows up). The ball moves at +// 45 degrees or shallow (2 across per 1 down), picked by where it meets the 3-LED paddle. It +// moves one LED at a time and stops on a hit, so a tick removes at most one brick and the ball +// never stands on one. +struct BrickGame { + static constexpr int kMaxColumns = 64; + int w = 0, h = 0, rows = 0, columns = 0, left = 0, remaining = 0; + uint64_t alive[3] = {}; + int x = 0, y = 0, sx = 1, sy = -1, aim = 0; + bool shallow = false; + uint32_t seed = 0, bounces = 0; + + void start(int width, int height, uint32_t round) { + w = width; + h = height; + rows = h >= 11 ? 3 : 2; + columns = std::min(kMaxColumns, (w + 1) / 4); + left = (w - (4 * columns - 1)) / 2; + refill(); + seed = noise::hash2(round, 0x42524B4Bu); + bounces = 0; + x = w / 2; + y = h - 2; + sx = (seed & 1u) ? 1 : -1; + sy = -1; + shallow = false; + aim = 0; + } + void refill() { + const uint64_t full = columns >= 64 ? ~0ull : (1ull << columns) - 1u; + for (int r = 0; r < 3; ++r) alive[r] = r < rows ? full : 0; + remaining = rows * columns; + } + // The brick index (row * kMaxColumns + column) of a live brick at (px, py), or -1. + int brickAt(int px, int py) const { + if (py < 0 || py >= rows || px < left) return -1; + const int col = (px - left) / 4; + if (col >= columns || (px - left) % 4 == 3 || !((alive[py] >> col) & 1u)) return -1; + return py * kMaxColumns + col; + } + int paddleLeft() const { return clampInt(x + aim - 1, 0, w - 3); } + // One LED step; true when it hit (and removed) a brick instead of moving. + bool move(int mx, int my) { + if (mx && (x + mx < 0 || x + mx >= w)) { sx = -sx; mx = -mx; } + if (my && y + my < 0) { sy = -sy; my = -my; } + const int b = brickAt(x + mx, y + my); + if (b >= 0) { + alive[b / kMaxColumns] &= ~(1ull << (b % kMaxColumns)); + --remaining; + if (my) sy = -sy; else sx = -sx; + return true; + } + x += mx; + y += my; + return false; + } + void tick() { + if (sy > 0 && y >= h - 2) { + // The paddle's aim decides the contact point: centre keeps 45 degrees, an edge sends the + // ball out shallow towards that side. The next approach gets a new aim. + const int rel = x - paddleLeft() - 1; + shallow = rel != 0; + if (rel) sx = rel; + sy = -1; + ++bounces; + aim = static_cast(noise::hash2(seed + bounces, 0x50414444u) % 3u) - 1; + } + if (!move(sx, sy) && shallow) move(sx, 0); + if (!remaining && y >= h - 2) refill(); + } +}; + +// Paddles on columns 0 and w-1 always cover the ball's row; the receiving one steers towards an +// aim point, the other drifts back towards the ball's middle. The contact row picks the angle: +// the paddle edge sends it at 45 degrees, the middle shallow (1 down per 2 across). +struct PongGame { + int w = 0, h = 0, paddle = 3; + int x = 0, y = 0, sx = 1, sy = 1, aim = 0, top[2] = {0, 0}; + bool shallow = false; + uint32_t seed = 0, rally = 0, ticks = 0; + + void start(int width, int height, uint32_t round) { + w = width; + h = height; + paddle = h >= 11 ? 4 : 3; + seed = noise::hash2(round, 0x504F4E47u); + rally = ticks = 0; + x = w / 2; + y = h / 2; + sx = (seed & 1u) ? 1 : -1; + sy = (seed & 2u) ? 1 : -1; + shallow = false; + aim = static_cast((seed >> 8) % static_cast(paddle)); + top[0] = top[1] = clampInt(y - (paddle - 1) / 2, 0, h - paddle); + } + void tick() { + ++ticks; + if ((sx < 0 && x <= 1) || (sx > 0 && x >= w - 2)) { + const int rel = y - top[sx < 0 ? 0 : 1]; + sx = -sx; + // A corner ball meets the wall-side edge of a paddle pinned to the wall: that counts as + // the middle, or 45-degree rallies could lock into corner-to-corner forever. + shallow = (rel > 0 && rel < paddle - 1) || y == 0 || y == h - 1; + if (rel == 0) sy = -1; + if (rel == paddle - 1) sy = 1; + ++rally; + aim = static_cast(noise::hash2(seed + rally, 0x41494D21u) % static_cast(paddle)); + } + x += sx; + if (!shallow || (ticks & 1u)) { + if (y + sy < 0 || y + sy >= h) sy = -sy; + y += sy; + } + for (int side = 0; side < 2; ++side) { + const bool receiving = (side == 0) == (sx < 0); + int t = top[side]; + // The receiving paddle outpaces the ball (2 rows a tick against 1) so it reaches its aim + // point; the other one lags at half a row a tick. + if (receiving || (ticks & 1u)) { + const int want = clampInt(y - (receiving ? aim : (paddle - 1) / 2), 0, h - paddle); + const int reach = receiving ? 2 : 1; + t += clampInt(want - t, -reach, reach); + } + // Keep covering the ball's row; it moves at most one row a tick. + top[side] = clampInt(t, std::max(0, y - paddle + 1), std::min(h - paddle, y)); + } + } +}; + +// Greedy snake on a field of up to 64x32 cells centred on the canvas. The head steers towards +// the food, avoiding its body and dead ends; food rows walk a per-round permutation of the rows +// so play covers the whole height. A stuck or full-length snake starts a new game at once. +struct SnakeGame { + static constexpr int kMaxW = 64, kMaxH = 32, kMaxLen = 24, kStartLen = 4; + int w = 0, h = 0, ox = 0, oy = 0, cap = kMaxLen; + int len = 0, dir = 0, foodX = 0, foodY = 0, stride = 1, row0 = 0; + uint8_t segX[kMaxLen] = {}, segY[kMaxLen] = {}; // [0] is the head + uint64_t occupied[kMaxH] = {}; + uint32_t seed = 0, food = 0, games = 0; + bool full = false; + + void start(int width, int height, uint32_t round) { + w = std::min(width, kMaxW); + h = std::min(height, kMaxH); + ox = (width - w) / 2; + oy = (height - h) / 2; + cap = std::min(kMaxLen, w * h / 2); + seed = noise::hash2(round, 0x534E4B45u); + row0 = static_cast((seed >> 8) % static_cast(h)); + stride = h > 1 ? 1 + static_cast(seed % static_cast(h - 1)) : 1; + while (gcd(stride, h) != 1) ++stride; + food = games = 0; + newGame(); + } + static int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } + bool busy(int px, int py) const { return (occupied[py] >> px) & 1u; } + void mark(int px, int py, bool on) { + if (on) occupied[py] |= 1ull << px; else occupied[py] &= ~(1ull << px); + } + bool open(int px, int py) const { return px >= 0 && px < w && py >= 0 && py < h && !busy(px, py); } + void newGame() { + ++games; + full = false; + for (uint64_t& row : occupied) row = 0; + len = std::min(kStartLen, cap); + dir = 0; + for (int i = 0; i < len; ++i) { + segX[i] = static_cast(len - 1 - i); + segY[i] = static_cast(h / 2); + mark(segX[i], segY[i], true); + } + placeFood(); + } + // At most cap occupied cells, so the raster probe ends within cap + 1 cells. + void placeFood() { + ++food; + const int row = (row0 + static_cast(food % static_cast(h)) * stride) % h; + int cell = row * w + static_cast(noise::hash2(seed + food, 0x464F4F44u) % static_cast(w)); + while (busy(cell % w, cell / w)) cell = (cell + 1) % (w * h); + foodX = cell % w; + foodY = cell / w; + } + void tick() { + if (full) { newGame(); return; } + static const int kDx[4] = {1, 0, -1, 0}, kDy[4] = {0, 1, 0, -1}; + const int tailX = segX[len - 1], tailY = segY[len - 1]; + mark(tailX, tailY, false); // The tail moves on unless this step eats. + int best = -1, bestScore = 0; + for (int turn : {0, 1, 3}) { + const int d = (dir + turn) % 4; + const int nx = segX[0] + kDx[d], ny = segY[0] + kDy[d]; + if (!open(nx, ny)) continue; + int exits = 0; + for (int e = 0; e < 4; ++e) + if (open(nx + kDx[e], ny + kDy[e])) ++exits; + const bool eats = nx == foodX && ny == foodY; + const int score = 4 * (std::abs(nx - foodX) + std::abs(ny - foodY)) + (exits || eats ? 0 : 1000) + + (turn ? 1 : 0); + if (best < 0 || score < bestScore) { best = d; bestScore = score; } + } + if (best < 0) { newGame(); return; } + const int nx = segX[0] + kDx[best], ny = segY[0] + kDy[best]; + const bool eats = nx == foodX && ny == foodY; + if (eats) { mark(tailX, tailY, true); ++len; } + for (int i = len - 1; i > 0; --i) { segX[i] = segX[i - 1]; segY[i] = segY[i - 1]; } + segX[0] = static_cast(nx); + segY[0] = static_cast(ny); + mark(nx, ny, true); + dir = best; + if (eats) { + full = len >= cap; + placeFood(); + } + } +}; + +template +inline void replayGame(Game& g, int w, int h, int64_t f) { + uint32_t round = 0; + const int ticks = roundTick(f, round); + g.start(w, h, round); + for (int t = 0; t < ticks; ++t) g.tick(); +} + +constexpr uint32_t kBallColour = 0xFFFFFFu, kPaddleColour = 0x888888u; +constexpr uint32_t kPongBall = 0x00FF88u, kPongPaddle = 0xAAAAAAu, kSnakeFood = 0xFF2000u; +constexpr int kBrickHue[3] = {0, 40, 200}; + +} + inline void BrickBreakerEffect::render(Canvas& c, int64_t f) { c.clear(0); - for (int y = 0; y < 3; ++y) - for (int x = 0; x < c.width(); x += 2) c.setPixel(x, y, color::fromHsv((x * 12) % 360, 100, 55)); - // Triangle wave across the width: count up to the far edge, then mirror back. - int p = static_cast(f) % (2 * (c.width() - 1)); - int bx = p < c.width() ? p : 2 * (c.width() - 1) - p; - c.setPixel(bx, c.height() - 2, 0xFFFFFFu); - c.fillRect(bx - 1, c.height() - 1, 3, 1, 0x888888u); + const int w = c.width(), h = c.height(); + if (w < 3 || h < 4) return; + fx::BrickGame g; + fx::replayGame(g, w, h, f); + for (int row = 0; row < g.rows; ++row) + for (int col = 0; col < g.columns; ++col) + if ((g.alive[row] >> col) & 1u) + c.fillRect(g.left + 4 * col, row, 3, 1, color::fromHsv(fx::kBrickHue[row], 100, 55)); + c.setPixel(g.x, g.y, fx::kBallColour); + c.fillRect(g.paddleLeft(), h - 1, 3, 1, fx::kPaddleColour); } inline void PingPongEffect::render(Canvas& c, int64_t f) { c.clear(0); - int px = static_cast(f) % (2 * (c.width() - 1)); - int x = px < c.width() ? px : 2 * (c.width() - 1) - px; - int py = static_cast(f * 7 / 10) % (2 * (c.height() - 1)); - int y = py < c.height() ? py : 2 * (c.height() - 1) - py; - c.setPixel(x, y, 0x00FF88u); + const int w = c.width(), h = c.height(); + if (w < 4 || h < 3) return; + fx::PongGame g; + fx::replayGame(g, w, h, f); + c.fillRect(0, g.top[0], 1, g.paddle, fx::kPongPaddle); + c.fillRect(w - 1, g.top[1], 1, g.paddle, fx::kPongPaddle); + c.setPixel(g.x, g.y, fx::kPongBall); } inline void RadarEffect::render(Canvas& c, int64_t f) { @@ -162,15 +414,16 @@ inline void RippleEffect::render(Canvas& c, int64_t f) { inline void SnakeEffect::render(Canvas& c, int64_t f) { c.clear(0); - const int len = 6; - for (int i = 0; i < len; ++i) { - int p = static_cast(f) - i; - if (p < 0) continue; - // The snake crawls in reading order, dropping to the next row every width steps. - int x = p % c.width(); - int row = (p / c.width()) % c.height(); - c.setPixel(x, row, paletteColor(static_cast(i * 40), color::fromHsv(120, 100, 80 - i * 10))); - } + const int w = c.width(), h = c.height(); + if (w < 4 || h < 2) return; + fx::SnakeGame g; + fx::replayGame(g, w, h, f); + c.setPixel(g.ox + g.foodX, g.oy + g.foodY, fx::kSnakeFood); + // Head-to-tail gradient: palette index 0..255 when a palette is set, bright to dim green otherwise. + const int last = std::max(1, g.len - 1); + for (int i = 0; i < g.len; ++i) + c.setPixel(g.ox + g.segX[i], g.oy + g.segY[i], + paletteColor(static_cast(i * 255 / last), color::fromHsv(120, 100, 90 - i * 60 / last))); } inline void PacificaEffect::render(Canvas& c, int64_t f) { @@ -227,26 +480,40 @@ inline void MatrixEffect::render(Canvas& c, int64_t f) { } } -inline void SwirlInEffect::render(Canvas& c, int64_t f) { +namespace fx { +template +inline void travellingSwirl(Canvas& c, int64_t f, bool inward, Colour colour) { c.clear(0); - const int cx = c.width() / 2, cy = c.height() / 2; - for (int i = 0; i < 48; ++i) { - float a = i * 0.5f + f * kPhasePerStep; - float r = (48 - i) / 6.0f; - c.setPixel(cx + static_cast(std::cos(a) * r), cy + static_cast(std::sin(a) * r), - paletteColor(static_cast(i * 5), color::fromHsv((i * 9) % 360, 100, 70))); + if (c.width() < 2 || c.height() < 2) return; + const float rx = (c.width() - 1) * 0.5f, ry = (c.height() - 1) * 0.5f; + const int points = 2 * std::max(c.width(), c.height()); + const float phase = static_cast((f % 200 + 200) % 200) / 200.0f; + const float rotation = static_cast((f % 720 + 720) % 720) * (6.2831853f / 720); + // Two spiral packets move radially; modulo radius respawns particles at the opposite edge. + for (int i = 0; i < points; ++i) { + const float u = static_cast(i) / (points - 1); + const float r0 = 0.55f + u * 0.30f + (inward ? -phase : phase); + const float r = r0 - std::floor(r0); + for (int arm = 0; arm < 2; ++arm) { + const float a = u * 6.2831853f + arm * 3.1415927f + (inward ? rotation : -rotation); + const int x = static_cast(std::lround(rx + rx * r * std::cos(a))); + const int y = static_cast(std::lround(ry + ry * r * std::sin(a))); + c.setPixel(x, y, colour(static_cast(u * 255))); + } } } +} + +inline void SwirlInEffect::render(Canvas& c, int64_t f) { + fx::travellingSwirl(c, f, true, [&](uint8_t index) { + return paletteColor(index, color::fromHsv(index * 360 / 256, 100, 70)); + }); +} inline void SwirlOutEffect::render(Canvas& c, int64_t f) { - c.clear(0); - const int cx = c.width() / 2, cy = c.height() / 2; - for (int i = 0; i < 48; ++i) { - float a = i * 0.5f - f * kPhasePerStep; - float r = i / 6.0f; - c.setPixel(cx + static_cast(std::cos(a) * r), cy + static_cast(std::sin(a) * r), - paletteColor(static_cast(i * 5), color::fromHsv((i * 9) % 360, 100, 70))); - } + fx::travellingSwirl(c, f, false, [&](uint8_t index) { + return paletteColor(index, color::fromHsv(index * 360 / 256, 100, 70)); + }); } inline void LookingEyesEffect::render(Canvas& c, int64_t f) { @@ -287,10 +554,14 @@ inline void LookingEyesEffect::render(Canvas& c, int64_t f) { bottom = 7 - lid / 2; } + // The tables describe an eight-row sprite, not the panel geometry. Scale row + // boundaries together so the ball, lids and pupil use the full canvas; at H=8 + // this is the original pixel-for-pixel rendering. + const auto row = [&](int y) { return y * c.height() / 8; }; for (const int x0 : eyeX) { for (int y = top; y <= bottom; ++y) - c.fillRect(x0 + kBallX[y], y, kBallW[y], 1, 0xFFFFFFu); - c.fillRect(x0 + px, py, 2, 2, 0x000000u); + c.fillRect(x0 + kBallX[y], row(y), kBallW[y], row(y + 1) - row(y), 0xFFFFFFu); + c.fillRect(x0 + px, row(py), 2, row(py + 2) - row(py), 0x000000u); } } diff --git a/src/core/net/WifiLink.h b/src/core/net/WifiLink.h index 69562775..876ae828 100644 --- a/src/core/net/WifiLink.h +++ b/src/core/net/WifiLink.h @@ -75,6 +75,32 @@ inline void applyWifiAssoc(LinkStatus& s, WifiAssoc assoc, bool hasSsid, const s } } +// CYW43 reports an AP that breaks off a join mid key exchange - common right after an unclean +// reset, while the AP still holds the old association - with the same BADAUTH as a wrong password, +// and the next join then succeeds. The ESP32 core reports WL_CONNECT_FAILED only for a real +// authentication failure. This gate gives radios like CYW43 the same outcome: an authentication +// failure means bad credentials once two join attempts in a row have ended in one; a single one +// reads as a plain disconnect. +class AuthFailureGate { + public: + // Call as each join attempt is issued, with what the radio reported for the attempt before it. + void noteJoin(WifiAssoc previous) { + if (previous != WifiAssoc::AuthFailed) failedJoins_ = 0; + else if (failedJoins_ < UINT8_MAX) ++failedJoins_; + } + + // Passes one observation of the radio through, holding back an authentication failure until the + // join before this one failed the same way. + WifiAssoc filter(WifiAssoc assoc) { + if (assoc == WifiAssoc::Connected) failedJoins_ = 0; + if (assoc == WifiAssoc::AuthFailed && failedJoins_ == 0) return WifiAssoc::Disconnected; + return assoc; + } + + private: + uint8_t failedJoins_ = 0; +}; + // Records that a reconnect was just issued and when the next one is due. Split out of // applyWifiAssoc so the counter tracks retries rather than how often the caller polls. inline void noteWifiRetry(LinkStatus& s, uint32_t retryInMs) { diff --git a/src/core/render/BootScreen.cpp b/src/core/render/BootScreen.cpp index f6d2ccee..13ec9515 100644 --- a/src/core/render/BootScreen.cpp +++ b/src/core/render/BootScreen.cpp @@ -5,6 +5,7 @@ #include #include "core/render/Color.h" +#include "core/render/ContentBand.h" #include "core/render/ColorRamp.h" #include "core/render/TextRenderer.h" @@ -77,7 +78,7 @@ uint32_t rampAtColumn(int col, int origin) { int ngRestX(const Canvas& c) { return (c.width() - kNgWidth) / 2; } -int ngRestY(const Canvas& c) { return (c.height() - kNgHeight) / 2; } +int ngRestY(const Canvas& c) { return contentBandTop(c.height()); } int logoX(const Canvas& c, const GfxFont& font) { return (c.width() - text::width(font, kLogo)) / 2; @@ -125,7 +126,8 @@ void plotBrightest(Canvas& c, int x, int y, uint32_t rgb) { void renderLogo(Canvas& out, const GfxFont& font) { out.clear(color::kBlack); - text::drawText(out, font, logoX(out, font), kBaselineY, kLogo, 0xFFFFFFu); + Canvas band = contentBand(out); + text::drawText(band, font, logoX(out, font), kBaselineY, kLogo, 0xFFFFFFu); } struct Point { @@ -313,7 +315,8 @@ bool drawBootAddress(Canvas& c, const GfxFont& font, const std::string& address, text::TextPaint paint; paint.ramp = &ramp; paint.rampOriginPx = origin + tail; - text::drawRun(c, font, static_cast(x + tail), kBaselineY, address, paint); + Canvas band = contentBand(c); + text::drawRun(band, font, static_cast(x + tail), kBaselineY, address, paint); drawStars(c, nowMs); return x + tail + text::width(font, address) >= 0; diff --git a/src/core/render/ContentBand.h b/src/core/render/ContentBand.h new file mode 100644 index 00000000..99be5ff6 --- /dev/null +++ b/src/core/render/ContentBand.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +#include "core/render/Canvas.h" + +namespace awtrix { +namespace render { + +inline constexpr int kContentBandHeight = 8; + +// Legacy text/icons occupy eight rows; odd spare rows go below the band. +inline int contentBandTop(int height) { + return height > kContentBandHeight ? (height - kContentBandHeight) / 2 : 0; +} + +// Allocation-free, clipped view into the panel. Coordinates remain those of an +// eight-row display, preserving font baselines and clipping for every font. +// The view must not outlive panel. Full-canvas content must use panel instead. +inline Canvas contentBand(Canvas& panel) { + if (panel.width() <= 0 || panel.height() <= 0) return Canvas(0, 0, nullptr); + return Canvas(panel.width(), std::min(panel.height(), kContentBandHeight), + panel.data() + contentBandTop(panel.height()) * panel.width()); +} + +} +} diff --git a/src/core/render/MatrixLayout.cpp b/src/core/render/MatrixLayout.cpp index 8680413d..c270fde0 100644 --- a/src/core/render/MatrixLayout.cpp +++ b/src/core/render/MatrixLayout.cpp @@ -21,7 +21,8 @@ int runIndex(int cx, int cy, int w, int h, bool vertical, bool serpentine, bool int clampInt(int v, int lo, int hi) { return v < lo ? lo : (v > hi ? hi : v); } bool sameLayout(const MatrixLayout& a, const MatrixLayout& b) { - return a.panelWidth == b.panelWidth && a.panels == b.panels && a.panelStart == b.panelStart && + return a.panelWidth == b.panelWidth && a.panelHeight == b.panelHeight && + a.panels == b.panels && a.panelStart == b.panelStart && a.panelWiring == b.panelWiring && a.panelColorOrder == b.panelColorOrder && a.panelSerpentine == b.panelSerpentine; } @@ -52,6 +53,7 @@ int MatrixLayout::xyToIndex(int x, int y) const { MatrixLayout sanitizeMatrixLayout(MatrixLayout in, bool* changed) { MatrixLayout out = in; out.panelWidth = clampInt(in.panelWidth, 1, kMatrixWidthMax); + out.panelHeight = clampInt(in.panelHeight, kMatrixHeightMin, kMatrixHeightMax); out.panels = clampInt(in.panels, 1, kMatrixWidthMax); if (static_cast(in.panelStart) >= kPanelStartCount) out.panelStart = PanelStart::TopLeft; if (static_cast(in.panelWiring) >= kWiringCount) out.panelWiring = Wiring::Rows; @@ -59,9 +61,10 @@ MatrixLayout sanitizeMatrixLayout(MatrixLayout in, bool* changed) { out.panelColorOrder = PanelColorOrder::Grb; // A width/panel-count pair that lands outside the supported range is unusable, so fall back to - // the stock layout and keep only the orientation flags the user set. + // the stock width and wiring, keeping the sanitized height and display orientation. if (out.width() < kMatrixWidthMin || out.width() > kMatrixWidthMax) { MatrixLayout fallback; + fallback.panelHeight = out.panelHeight; fallback.mirror = out.mirror; fallback.rotate180 = out.rotate180; fallback.panelColorOrder = out.panelColorOrder; diff --git a/src/core/render/MatrixLayout.h b/src/core/render/MatrixLayout.h index ac81d44b..47b71e40 100644 --- a/src/core/render/MatrixLayout.h +++ b/src/core/render/MatrixLayout.h @@ -8,7 +8,8 @@ namespace awtrix { -inline constexpr int kMatrixHeight = 8; +inline constexpr int kMatrixHeightMin = 8; +inline constexpr int kMatrixHeightMax = 16; inline constexpr int kMatrixWidthMin = 32; inline constexpr int kMatrixWidthMax = 128; @@ -38,6 +39,7 @@ inline std::string enumNameChoices(const char* const* names, int count) { struct MatrixLayout { int panelWidth = 32; + int panelHeight = 8; int panels = 1; PanelStart panelStart = PanelStart::TopLeft; Wiring panelWiring = Wiring::Rows; @@ -49,7 +51,7 @@ struct MatrixLayout { bool rotate180 = false; int width() const { return panelWidth * panels; } - int height() const { return kMatrixHeight; } + int height() const { return panelHeight; } int ledCount() const { return width() * height(); } bool bottomStart() const { diff --git a/src/core/render/ProvisioningScreen.cpp b/src/core/render/ProvisioningScreen.cpp index 0a5bd835..859dfac3 100644 --- a/src/core/render/ProvisioningScreen.cpp +++ b/src/core/render/ProvisioningScreen.cpp @@ -1,13 +1,15 @@ #include "core/render/ProvisioningScreen.h" #include "core/render/HsvText.h" +#include "core/render/ContentBand.h" namespace awtrix { namespace render { void drawProvisioningScreen(Canvas& c, const GfxFont& font, int64_t nowMs) { c.clear(0x000000u); - drawHsvText(c, font, 2, 6, "AP MODE", nowMs); + Canvas band = contentBand(c); + drawHsvText(band, font, 2, 6, "AP MODE", nowMs); } } diff --git a/src/core/render/RenderPipeline.cpp b/src/core/render/RenderPipeline.cpp index f6501daf..b24dad75 100644 --- a/src/core/render/RenderPipeline.cpp +++ b/src/core/render/RenderPipeline.cpp @@ -7,6 +7,7 @@ #include "core/CoreEngine.h" #include "core/apps/SpecRenderer.h" +#include "core/render/ContentBand.h" #include "core/render/StatusPixels.h" #include "core/render/TransitionComposer.h" @@ -178,8 +179,12 @@ void RenderPipeline::renderPage(Canvas& dst, const std::string& id, int64_t nowM if (r.effect) r.effect->setSettings(es); if (fullScreen) slot->icon->blit(dst, 0); render::renderSpec(dst, spec, fontFor(&spec), r); - if (r.iconWidth && slot && slot->valid) - slot->icon->blit(dst, spec.iconOffsetX + iconShift(spec, *slot)); + if (r.iconWidth && slot && slot->valid) { + Canvas band = render::contentBand(dst); + const bool tile = r.iconWidth == 8 && slot->icon->height() == 8; + slot->icon->blit(tile ? band : dst, + spec.iconOffsetX + iconShift(spec, *slot)); + } if (slot) { for (std::size_t i = 0; i < slot->placedIconCount; ++i) { const auto& icon = slot->placedIcons[i]; diff --git a/src/core/render/RenderPipeline.h b/src/core/render/RenderPipeline.h index b29c1acf..7de608ef 100644 --- a/src/core/render/RenderPipeline.h +++ b/src/core/render/RenderPipeline.h @@ -29,6 +29,7 @@ class IPageIcon { virtual void advance(int64_t nowMs) = 0; virtual void blit(Canvas& dst, int xOffset, int yOffset = 0) const = 0; virtual int width() const = 0; + virtual int height() const = 0; // Allocated only for the additional absolute-position icons requested by a page. virtual std::unique_ptr create() const { return nullptr; } }; diff --git a/src/core/script/AsyncQueue.h b/src/core/script/AsyncQueue.h index b0e6ca7c..31db47bb 100644 --- a/src/core/script/AsyncQueue.h +++ b/src/core/script/AsyncQueue.h @@ -6,6 +6,17 @@ namespace awtrix::script { +// A toolchain without threads (arm-none-eabi newlib, the RP2040 build) has no std::mutex. There +// every producer runs on the main loop too - MQTT is delivered from its tick - so nothing races. +#if defined(__GLIBCXX__) && !defined(_GLIBCXX_HAS_GTHREADS) +struct AsyncQueueLock { + void lock() {} + void unlock() {} +}; +#else +using AsyncQueueLock = std::mutex; +#endif + // Hands results from the network task to the script host on the main loop. Bounded and // lossy by design: the producer must never block on a script that is slow to drain. template @@ -13,13 +24,13 @@ class AsyncQueue { public: // Overflow drops the OLDEST entry, so a backlog costs the stalest result, not the newest. void push(T v) { - std::lock_guard l(m_); + std::lock_guard l(m_); if (q_.size() >= Cap) q_.pop_front(); q_.push_back(std::move(v)); } bool pop(T& out) { - std::lock_guard l(m_); + std::lock_guard l(m_); if (q_.empty()) return false; out = std::move(q_.front()); q_.pop_front(); @@ -27,7 +38,7 @@ class AsyncQueue { } private: - std::mutex m_; + AsyncQueueLock m_; std::deque q_; }; diff --git a/src/core/script/ScriptHost.h b/src/core/script/ScriptHost.h index 66b7367b..509ad66d 100644 --- a/src/core/script/ScriptHost.h +++ b/src/core/script/ScriptHost.h @@ -13,6 +13,7 @@ #include "core/script/BerryVM.h" #include "core/script/ScriptApp.h" #include "core/script/ScriptMeta.h" +#include "core/script/ScriptInfo.h" #include "core/script/ScriptServices.h" #include "core/script/SharedState.h" #include "core/script/ScriptTimers.h" @@ -65,19 +66,7 @@ class ScriptHost { } ScriptError errorOf(const std::string& name) const; - struct Info { - ScriptError error; - bool skipping = false; - bool headless = false; - bool module = false; - bool config = false; - std::string importName; - std::string metaName; - std::string desc; - std::string author; - std::string version; - std::string icons; - }; + using Info = ScriptInfo; std::map list() const; std::vector sharedSnapshot() const; diff --git a/src/core/script/ScriptInfo.cpp b/src/core/script/ScriptInfo.cpp new file mode 100644 index 00000000..50715863 --- /dev/null +++ b/src/core/script/ScriptInfo.cpp @@ -0,0 +1,7 @@ +#include "core/script/ScriptHost.h" + +namespace awtrix::script { +std::map scriptInfo(const ScriptHost* host) { + return host ? host->list() : std::map{}; +} +} \ No newline at end of file diff --git a/src/core/script/ScriptInfo.h b/src/core/script/ScriptInfo.h new file mode 100644 index 00000000..8b1a718f --- /dev/null +++ b/src/core/script/ScriptInfo.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include +#include "core/script/ScriptError.h" + +namespace awtrix::script { +class ScriptHost; +// Snapshot-only seam: state serialization must not import the Berry VM or its queues. +struct ScriptInfo { + ScriptError error; + bool skipping = false; + bool headless = false; + bool module = false; + bool config = false; + std::string importName; + std::string metaName; + std::string desc; + std::string author; + std::string version; + std::string icons; +}; +std::map scriptInfo(const ScriptHost* host); +} \ No newline at end of file diff --git a/src/core/sound/ToneSamples.h b/src/core/sound/ToneSamples.h new file mode 100644 index 00000000..e2f7aea0 --- /dev/null +++ b/src/core/sound/ToneSamples.h @@ -0,0 +1,51 @@ +#pragma once + +#include "core/sound/Rtttl.h" +#include + +namespace awtrix::sound { + +// Portable, sample-clocked RTTTL player. No wall clock, allocation or floating +// point in next(): buffering cannot change note lengths or insert note gaps. +class ToneSamples { + public: + static constexpr uint32_t SampleRate = 24000; + bool play(const std::string& text) { + auto parsed = rtttl::parse(text); + if (!parsed.ok) return false; // Invalid requests do not interrupt playback. + melody_ = std::move(parsed); + index_ = 0; + loadNote(); + return true; + } + void stop() { index_ = melody_.notes.size(); remaining_ = 0; } + bool playing() const { return remaining_ != 0; } + void setVolume(uint8_t percent) { amplitude_ = 32767 * (percent > 100 ? 100 : percent) / 100; } + int16_t next() { + if (!playing()) return 0; + const int16_t sample = frequency_ && remaining_ > gap_ + ? static_cast(phase_ < SampleRate / 2 ? amplitude_ : -amplitude_) : 0; + phase_ = (phase_ + frequency_) % SampleRate; + if (--remaining_ == 0) { ++index_; loadNote(); } + return sample; + } + static uint32_t stereo(int16_t sample) { + const uint32_t bits = static_cast(sample); + return (bits << 16) | bits; + } + private: + void loadNote() { + if (index_ == melody_.notes.size()) return; + const auto& note = melody_.notes[index_]; + const auto ms = rtttl::noteMs(note.duration, melody_.timeUnit); + remaining_ = ms * (SampleRate / 1000); + gap_ = note.frequency && ms > 12 ? 6 * (SampleRate / 1000) : 0; + frequency_ = note.frequency; + phase_ = 0; + } + rtttl::Parse melody_; + size_t index_ = 0; + uint32_t remaining_ = 0, gap_ = 0, phase_ = 0, frequency_ = 0; + int amplitude_ = 0; +}; +} diff --git a/src/hal/BoardRegistry.cpp b/src/hal/BoardRegistry.cpp index 0c65f89f..3f2a35c2 100644 --- a/src/hal/BoardRegistry.cpp +++ b/src/hal/BoardRegistry.cpp @@ -1,12 +1,20 @@ #include "hal/BoardRegistry.h" +#if defined(AWTRIX_PLATFORM_RP2040) +#include "hal/GalacticUnicornBoard.h" +#else #include "hal/Esp32Board.h" +#endif namespace awtrix { // The first call builds the board from cfg; every later call returns that same instance and // ignores its argument, so pin or layout changes only take effect after a reboot. IBoard& activeBoard(const DeviceConfig& cfg) { +#if defined(AWTRIX_PLATFORM_RP2040) + static GalacticUnicornBoard board(cfg); +#else static Esp32Board board(cfg); +#endif return board; } } diff --git a/src/hal/GalacticUnicornBoard.cpp b/src/hal/GalacticUnicornBoard.cpp new file mode 100644 index 00000000..14bc2103 --- /dev/null +++ b/src/hal/GalacticUnicornBoard.cpp @@ -0,0 +1,161 @@ +#include "hal/GalacticUnicornBoard.h" +#include "platform/rp2040/GalacticUnicornPio.h" +#include +#include +#include +#include +#include + +namespace awtrix { +GalacticUnicornBoard::GalacticUnicornBoard(const DeviceConfig& cfg) + : height_(galactic::sanitizeHeight(cfg.panelHeight)), + invalidHeight_(cfg.panelHeight != height_) {} + +void GalacticUnicornBoard::begin() { + using namespace galactic; + if (ready_) return; + // Keep the amp silent throughout boot, before radio/audio initialization. + pinMode(22, OUTPUT); + digitalWrite(22, LOW); + for (const auto& input : Inputs) { + gpio_init(input.pin); + gpio_set_dir(input.pin, GPIO_IN); + gpio_pull_up(input.pin); + } + adc_init(); + adc_gpio_init(LightSensor); + if (invalidHeight_) Serial.println("warning: Galactic Unicorn panelHeight must be 8 or 11; using 11"); + // Keep blank asserted and select an invisible row throughout initialization/failure. + for (uint pin = ColumnClock; pin <= Row3; ++pin) { + gpio_init(pin); + gpio_put(pin, pin >= ColumnBlank); + gpio_set_dir(pin, GPIO_OUT); + } + // Prefer PIO1, leaving PIO0's instruction RAM for CYW43. Both the program + // capacity and the SDK's shared SM allocation bitmap are checked dynamically. + for (PIO candidate : {pio1, pio0}) { + if (!pio_can_add_program(candidate, &program)) continue; + const int sm = pio_claim_unused_sm(candidate, false); + if (sm >= 0) { pio_ = candidate; sm_ = sm; break; } + } + if (!pio_) { Serial.println("display: no free PIO program/SM; panel remains blank"); return; } + dataDma_ = dma_claim_unused_channel(false); + controlDma_ = dma_claim_unused_channel(false); + if (dataDma_ < 0 || controlDma_ < 0) { + if (dataDma_ >= 0) dma_channel_unclaim(dataDma_); + if (controlDma_ >= 0) dma_channel_unclaim(controlDma_); + pio_sm_unclaim(pio_, sm_); + pio_ = nullptr; + Serial.println("display: two DMA channels unavailable; panel remains blank"); + return; + } + const uint offset = pio_add_program(pio_, &program); + sleep_ms(100); + // Pimoroni's FM6126 initialization: ten chips, last eleven clocks latched. + constexpr uint16_t reg = 0xffce; + for (int chip = 0; chip < 10; ++chip) { + for (int bit = 0; bit < 16; ++bit) { + gpio_put(ColumnData, reg & (1u << (15 - bit))); + sleep_us(10); + gpio_put(ColumnClock, true); + sleep_us(10); + gpio_put(ColumnClock, false); + if (chip == 9 && bit == 4) gpio_put(ColumnLatch, true); + } + } + gpio_put(ColumnLatch, false); + gpio_put(ColumnBlank, false); + sleep_us(10); + gpio_put(ColumnBlank, true); + for (uint pin = ColumnClock; pin <= Row3; ++pin) pio_gpio_init(pio_, pin); + const uint safePins = (1u << ColumnBlank) | (15u << Row0); + pio_sm_set_pins_with_mask(pio_, sm_, safePins, safePins); + pio_sm_set_consecutive_pindirs(pio_, sm_, ColumnClock, 8, true); + auto c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset, offset + 23); + sm_config_set_sideset(&c, 2, true, false); + sm_config_set_out_shift(&c, true, true, 32); + sm_config_set_out_pins(&c, Row0, 4); + sm_config_set_set_pins(&c, ColumnData, 3); + sm_config_set_sideset_pins(&c, ColumnClock); + sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); + // Same timing on Pico W and Pico 2 W (upstream ran at 125 MHz). + sm_config_set_clkdiv(&c, clock_get_hz(clk_sys) / 125000000.0f); + pio_sm_init(pio_, sm_, offset, &c); + clearStream(buffers_[0]); + clearStream(buffers_[1]); + updateGrade(); + nextStream_ = reinterpret_cast(buffers_[0].bytes.data()); + auto ctrl = dma_channel_get_default_config(controlDma_); + channel_config_set_transfer_data_size(&ctrl, DMA_SIZE_32); + channel_config_set_read_increment(&ctrl, false); + channel_config_set_write_increment(&ctrl, false); + channel_config_set_chain_to(&ctrl, dataDma_); + dma_channel_configure(controlDma_, &ctrl, &dma_hw->ch[dataDma_].read_addr, + &nextStream_, 1, false); + auto data = dma_channel_get_default_config(dataDma_); + channel_config_set_transfer_data_size(&data, DMA_SIZE_32); + channel_config_set_read_increment(&data, true); + channel_config_set_write_increment(&data, false); + channel_config_set_dreq(&data, pio_get_dreq(pio_, sm_, true)); + channel_config_set_chain_to(&data, controlDma_); + dma_channel_configure(dataDma_, &data, &pio_->txf[sm_], nullptr, StreamBytes / 4, false); + __dmb(); + pio_sm_set_enabled(pio_, sm_, true); + dma_start_channel_mask(1u << controlDma_); + ready_ = true; + Serial.printf("display: PIO%u SM%d DMA%d+%d; CYW43 not initialized (network pending)\n", + pio_ == pio0 ? 0u : 1u, sm_, dataDma_, controlDma_); +} + +void GalacticUnicornBoard::logRefreshProgress() const { + if (!ready_) { Serial.println("display: refresh unavailable after WiFi init"); return; } + const auto before = dma_hw->ch[dataDma_].read_addr; + const auto start = time_us_64(); + bool advanced = false; + while (time_us_64() - start < 20000) { + if (dma_hw->ch[dataDma_].read_addr != before) { advanced = true; break; } + tight_loop_contents(); + } + Serial.printf("display: PIO%u SM%d DMA%d+%d after WiFi: refresh %s\n", + pio_get_index(pio_), sm_, dataDma_, controlDma_, + advanced ? "advancing" : "NOT advancing"); +} + +int GalacticUnicornBoard::readLdrRaw() { + adc_select_input(galactic::LightAdc); + return adc_read(); // Native 12-bit counts, same 0..4095 curve as ESP32. +} + +std::array GalacticUnicornBoard::readInputs() const { + std::array result{}; + for (size_t i = 0; i < result.size(); ++i) result[i] = !gpio_get(galactic::Inputs[i].pin); + return result; +} + +void GalacticUnicornBoard::pollButtons(ButtonState& out) { + const auto inputs = readInputs(); + out = {inputs[0], inputs[1], inputs[2]}; // Debounced by the shared PeripheryService. +} + +void GalacticUnicornBoard::show(const Canvas& canvas) { + if (!ready_) return; + const int back = 1 - front_; + galactic::packCanvas(buffers_[back], canvas, height_, grade_, orientation_); + const uintptr_t begin = reinterpret_cast(buffers_[back].bytes.data()); + __dmb(); // Finish all pixel writes before the control DMA can publish the buffer. + nextStream_ = begin; + __dmb(); + // The control DMA latches the new base ONLY after the previous full frame. + // Wait for a read inside the new buffer before allowing the next show() to + // reuse the old one. PIO may still contain old tail words, but they are already + // copied into its FIFO. No refresh IRQ or CPU servicing is required. + for (;;) { + const uintptr_t reading = dma_hw->ch[dataDma_].read_addr; + if (reading > begin && reading <= begin + galactic::StreamBytes) break; + tight_loop_contents(); + } + __dmb(); + front_ = back; +} +} diff --git a/src/hal/GalacticUnicornBoard.h b/src/hal/GalacticUnicornBoard.h new file mode 100644 index 00000000..1348f71b --- /dev/null +++ b/src/hal/GalacticUnicornBoard.h @@ -0,0 +1,63 @@ +#pragma once +#include "hal/IBoard.h" +#include "hal/GalacticUnicornDisplay.h" +#include "hal/GalacticUnicornDefaults.h" +#include +#include "platform/rp2040/UnicornToneSink.h" + +namespace awtrix { +DeviceConfig galacticUnicornDefaults(); +// Single device-lifetime instance, called on core 0 only. +class GalacticUnicornBoard final : public IBoard { + public: + GalacticUnicornBoard() = default; + explicit GalacticUnicornBoard(const DeviceConfig& cfg); + GalacticUnicornBoard(const GalacticUnicornBoard&) = delete; + GalacticUnicornBoard& operator=(const GalacticUnicornBoard&) = delete; + const char* name() const override { return "Galactic Unicorn"; } + int matrixWidth() const override { return galactic::Width; } + int matrixHeight() const override { return height_; } + void begin() override; + void show(const Canvas&) override; + void logRefreshProgress() const; + void setBrightness(uint8_t brightness) override { brightness_ = brightness; updateGrade(); } + // Only the drawing transforms apply; width, chaining and wiring are fixed by the hardware. + void setMatrixLayout(const MatrixLayout& layout) override { + orientation_ = {layout.mirror, layout.rotate180}; + } + void applyColorGrade(const render::GradeParams& grade) override { baseGrade_ = grade; updateGrade(); } + bool hasBattery() const override { return false; } + bool hasLightSensor() const override { return true; } + int readBatteryMillivolts() override { return -1; } + int readLdrRaw() override; + void pollButtons(ButtonState& out) override; + std::array readInputs() const; + // Initialize only after CYW43 so audio never steals the radio's PIO space. + void beginAudio() { tone_.begin(); } + sound::IToneSink* toneSink() override { return tone_.ready() ? &tone_ : nullptr; } + sound::ITrackSink* trackSink() override { return nullptr; } + ISensorBus& sensors() override { return sensors_; } + private: + void updateGrade() { auto p = baseGrade_; p.brightness = brightness_; grade_.setParams(p); } + class NoSensors final : public ISensorBus { + public: + void begin() override {} + bool hasSensor() const override { return false; } + SensorReading read() override { return {}; } + const char* sensorName() const override { return "none"; } + } sensors_; + UnicornToneSink tone_; + int height_ = 11; + bool invalidHeight_ = false, ready_ = false; + uint8_t brightness_ = 120; + render::GradeParams baseGrade_; + galactic::Grade14 grade_; + galactic::Orientation orientation_; + galactic::Stream buffers_[2]; + // Aligned atomic pointer publication; only DMA reads this after publication. + alignas(4) volatile uintptr_t nextStream_ = 0; + int front_ = 0; + PIO pio_ = nullptr; + int sm_ = -1, dataDma_ = -1, controlDma_ = -1; +}; +} diff --git a/src/hal/GalacticUnicornDefaults.h b/src/hal/GalacticUnicornDefaults.h new file mode 100644 index 00000000..5d8a0fe3 --- /dev/null +++ b/src/hal/GalacticUnicornDefaults.h @@ -0,0 +1,11 @@ +#pragma once +#include "persistence/DeviceConfig.h" +namespace awtrix { +inline DeviceConfig galacticUnicornDefaults() { + DeviceConfig cfg; + cfg.panelWidth = 53; + cfg.panelHeight = 11; + cfg.panels = 1; + return cfg; +} +} diff --git a/src/hal/GalacticUnicornDisplay.h b/src/hal/GalacticUnicornDisplay.h new file mode 100644 index 00000000..ae805a9a --- /dev/null +++ b/src/hal/GalacticUnicornDisplay.h @@ -0,0 +1,128 @@ +#pragma once + +// Display stream layout adapted from Pimoroni pico v1.23.0 (MIT). +// See THIRD-PARTY-NOTICES.md. No SDK/Arduino dependencies: host-testable. +#include +#include +#include +#include +#include +#include "core/render/Canvas.h" +#include "core/render/Color.h" +#include "core/render/ColorGrade.h" + +namespace awtrix::galactic { +inline constexpr int Width = 53, Height = 11, Planes = 14; +inline constexpr size_t PlaneBytes = 60, RowBytes = Planes * PlaneBytes; +inline constexpr size_t StreamBytes = Height * RowBytes; +inline constexpr uint8_t ColumnClock = 13, ColumnData = 14, ColumnLatch = 15, ColumnBlank = 16; +inline constexpr uint8_t Row0 = 17, Row1 = 18, Row2 = 19, Row3 = 20; +inline constexpr uint8_t LightSensor = 28, LightAdc = 2; +inline constexpr uint8_t ButtonA = 0, ButtonB = 1, ButtonC = 3, ButtonD = 6; +inline constexpr uint8_t Sleep = 27, VolumeUp = 7, VolumeDown = 8; +inline constexpr uint8_t BrightnessUp = 21, BrightnessDown = 26; +enum class InputAction { Left, Select, Right, None, Power, VolumeUp, VolumeDown, BrightnessUp, BrightnessDown }; +struct Input { uint8_t pin; InputAction action; }; +inline constexpr std::array Inputs{{ + {ButtonA, InputAction::Left}, {ButtonB, InputAction::Select}, + {ButtonC, InputAction::Right}, {ButtonD, InputAction::None}, + {Sleep, InputAction::Power}, {VolumeUp, InputAction::VolumeUp}, + {VolumeDown, InputAction::VolumeDown}, {BrightnessUp, InputAction::BrightnessUp}, + {BrightnessDown, InputAction::BrightnessDown}}}; +class DebouncedButton { + public: + // Active-low conversion belongs to the GPIO adapter. True means pressed here. + bool update(bool pressed, int64_t nowMs) { + if (pressed != raw_) { raw_ = pressed; changedMs_ = nowMs; } + const bool previous = stable_; + if (nowMs - changedMs_ >= 35) stable_ = raw_; + return stable_ && !previous; + } + bool pressed() const { return stable_; } + private: + bool raw_ = false, stable_ = false; + int64_t changedMs_ = 0; +}; +inline int stepClamped(int value, int delta, int maximum) { + const int64_t result = static_cast(value) + delta; + return result < 0 ? 0 : result > maximum ? maximum : static_cast(result); +} +inline constexpr int sanitizeHeight(int h) { return h == 8 ? 8 : 11; } +// Physical, top-down panel row, before the wiring's X/Y reversal. +inline constexpr int physicalRow(int y, int height) { + return y < 0 || y >= sanitizeHeight(height) ? -1 : y + (height == 8 ? 1 : 0); +} +struct alignas(4) Stream { std::array bytes{}; }; +inline void clearStream(Stream& s) { + s.bytes.fill(0); + for (int row = 0; row < Height; ++row) { + for (int plane = 0; plane < Planes; ++plane) { + auto* p = s.bytes.data() + row * RowBytes + plane * PlaneBytes; + p[0] = Width - 1; + p[1] = row; + const uint32_t ticks = 1u << plane; + for (int b = 0; b < 4; ++b) p[56 + b] = ticks >> (8 * b); + } + } +} +inline void packPixel(Stream& s, int x, int physicalY, uint16_t r, uint16_t g, uint16_t b) { + if (x < 0 || x >= Width || physicalY < 0 || physicalY >= Height) return; + const size_t offset = (Height - 1 - physicalY) * RowBytes + 2 + (Width - 1 - x); + for (int plane = 0; plane < Planes; ++plane) + s.bytes[offset + plane * PlaneBytes] = (((r >> plane) & 1u) << 2) | + (((g >> plane) & 1u) << 1) | ((b >> plane) & 1u); +} +// NG ColorGrade semantics, with a 14-bit LUT rather than an 8-bit final canvas. +// Saturation first, then gamma ONCE, then linear-light brightness/correction/tint. +// Upstream's fixed gamma 2.2 is replaced with the NG gamma setting (default 1.9). +class Grade14 { + public: + Grade14() { rebuild(); } + void setParams(const render::GradeParams& p) { + if (p == params_) return; + params_ = p; + rebuild(); + } + void pack(Stream& s, int x, int y, uint32_t rgb) const { + const auto c = color::desaturate(rgb, params_.saturation); + packPixel(s, x, y, lut_[0][color::red(c)], lut_[1][color::green(c)], lut_[2][color::blue(c)]); + } + uint16_t channel(int ch, uint8_t value) const { return lut_[ch][value]; } + private: + void rebuild() { + const uint8_t scales[] = { + color::scale8(color::red(params_.correction), color::red(params_.tint)), + color::scale8(color::green(params_.correction), color::green(params_.tint)), + color::scale8(color::blue(params_.correction), color::blue(params_.tint))}; + for (int i = 0; i < 256; ++i) { + const float f = i / 255.0f; + const auto gamma = static_cast(std::lround( + (params_.gamma > 0 ? std::pow(f, params_.gamma) : f) * 16383.0f)); + for (int ch = 0; ch < 3; ++ch) + lut_[ch][i] = gamma * params_.brightness / 255u * scales[ch] / 255u; + } + } + render::GradeParams params_; + uint16_t lut_[3][256]{}; +}; +// The wiring is fixed, but mirror and rotate180 are drawing transforms, applied as MatrixLayout does. +struct Orientation { + bool mirror = false; + bool rotate180 = false; +}; +inline void packCanvas(Stream& stream, const Canvas& canvas, int height, const Grade14& grade, + Orientation orientation = {}) { + clearStream(stream); // Also clears letterbox rows and stale pixels in a smaller canvas. + const int w = std::min(Width, canvas.width()); + const int h = std::min(sanitizeHeight(height), canvas.height()); + for (int y = 0; y < h; ++y) + for (int x = 0; x < w; ++x) { + int px = orientation.mirror ? w - 1 - x : x, py = y; + if (orientation.rotate180) { + px = w - 1 - px; + py = h - 1 - py; + } + grade.pack(stream, px, physicalRow(py, height), canvas.getPixel(x, y)); + } +} +} diff --git a/src/main.cpp b/src/main.cpp index 0caec912..856bbdb2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,9 +7,9 @@ #include #include "AppConfig.h" +#include "platform/BuildFeatures.h" #include "core/CoreEngine.h" #include "core/FrameClock.h" -#include "core/StrCase.h" #include "core/api/CapabilitiesJson.h" #include "core/script/ScriptHeap.h" #include "core/apps/AppRegistry.h" @@ -33,9 +33,7 @@ #include "core/render/Canvas.h" #include "core/render/MatrixLayout.h" #include "core/render/ColorRamp.h" -#include "core/render/Palette.h" #include "core/render/PowerAnimator.h" -#include "core/render/PaletteFile.h" #include "core/render/PaletteStore.h" #include "core/render/ProvisioningScreen.h" #include "core/render/TextRenderer.h" @@ -57,6 +55,7 @@ #include "persistence/Filesystem.h" #include "persistence/LittleFsAssetProbe.h" #include "persistence/NvsSettings.h" +#include "persistence/PaletteFiles.h" #include "persistence/ScriptStore.h" #include "system/BootAnimator.h" #include "system/DeviceServices.h" @@ -66,6 +65,8 @@ #include "system/Log.h" #include "system/MonotonicClock.h" #include "system/PeripheryService.h" +#include "system/PeripheryHttp.h" +#include "core/BuiltinCatalog.h" #include "system/ScriptHttpWorker.h" #include "transport/ScriptMqttBridge.h" #include "transport/http/HttpApiServer.h" @@ -85,38 +86,9 @@ DeviceDisplay* g_display = nullptr; DeviceSystem* g_system = nullptr; CoreEngine* g_engine = nullptr; AppRegistry g_apps; -TimeApp g_timeApp; -DateApp g_dateApp; -TempApp g_tempApp; -HumidityApp g_humApp; -BatteryApp g_batApp; +BuiltinCatalog g_builtins; EffectRegistry g_effects; -PlasmaEffect g_fxPlasma; -TheaterChaseEffect g_fxTheaterChase; -FadeEffect g_fxFade; -MovingLineEffect g_fxMovingLine; -BrickBreakerEffect g_fxBrick; -PingPongEffect g_fxPingPong; -RadarEffect g_fxRadar; -CheckerboardEffect g_fxCheck; -FireworksEffect g_fxFire; -PlasmaCloudEffect g_fxPlasmaCloud; -RippleEffect g_fxRipple; -SnakeEffect g_fxSnake; -PacificaEffect g_fxPacifica; -MatrixEffect g_fxMatrix; -SwirlInEffect g_fxSwirlIn; -SwirlOutEffect g_fxSwirlOut; -LookingEyesEffect g_fxEyes; -TwinklingStarsEffect g_fxStars; -ColorWavesEffect g_fxWaves; EffectRegistry g_overlays; -RainOverlay g_ovRain; -SnowOverlay g_ovSnow; -DrizzleOverlay g_ovDrizzle; -StormOverlay g_ovStorm; -ThunderOverlay g_ovThunder; -FrostOverlay g_ovFrost; NetworkService g_net; HttpApiServer g_http; std::unique_ptr g_hostResolver; @@ -208,31 +180,7 @@ void setup() { // Filesystem first — config, palettes, icons and scripts all come off it. awtrix::fs::begin(); - // LittleFS is case-sensitive, but a palette named in a script or over the API rarely matches - // the file's capitalisation, so fall back to a case-insensitive scan of the directory. - render::setPaletteLoader([](const std::string& name, render::Palette& out) { - if (name.find("..") != std::string::npos || name.find('/') != std::string::npos) return false; - File f = LittleFS.open((String("/PALETTES/") + name.c_str() + ".txt").c_str(), "r"); - if (!f) { - File dir = LittleFS.open("/PALETTES"); - for (File e = dir.openNextFile(); e; e = dir.openNextFile()) { - std::string leaf = e.name() ? e.name() : ""; - const std::size_t slash = leaf.rfind('/'); - if (slash != std::string::npos) leaf.erase(0, slash + 1); - if (leaf.size() <= 4 || !strcase::equalsIgnoreCase(leaf.substr(leaf.size() - 4), ".txt")) - continue; - if (!strcase::equalsIgnoreCase(leaf.substr(0, leaf.size() - 4), name)) continue; - f = LittleFS.open((String("/PALETTES/") + leaf.c_str()).c_str(), "r"); - break; - } - } - if (!f) return false; - std::string text; - text.reserve(static_cast(f.size())); - while (f.available()) text.push_back(static_cast(f.read())); - f.close(); - return render::parsePaletteFile(text, out); - }); + palettefiles::install(); // Config decides which board profile and which pins are active, so it has to be read before // any hardware is touched below. @@ -290,36 +238,7 @@ void setup() { // Built-ins are registered up front; the script host later adds its apps and effects to these // same registries, which is why they outlive setup(). - g_apps.add(&g_timeApp); - g_apps.add(&g_dateApp); - g_apps.add(&g_tempApp); - g_apps.add(&g_humApp); - g_apps.add(&g_batApp); - g_effects.add(&g_fxPlasma); - g_effects.add(&g_fxTheaterChase); - g_effects.add(&g_fxFade); - g_effects.add(&g_fxMovingLine); - g_effects.add(&g_fxBrick); - g_effects.add(&g_fxPingPong); - g_effects.add(&g_fxRadar); - g_effects.add(&g_fxCheck); - g_effects.add(&g_fxFire); - g_effects.add(&g_fxPlasmaCloud); - g_effects.add(&g_fxRipple); - g_effects.add(&g_fxSnake); - g_effects.add(&g_fxPacifica); - g_effects.add(&g_fxMatrix); - g_effects.add(&g_fxSwirlIn); - g_effects.add(&g_fxSwirlOut); - g_effects.add(&g_fxEyes); - g_effects.add(&g_fxStars); - g_effects.add(&g_fxWaves); - g_overlays.add(&g_ovRain); - g_overlays.add(&g_ovSnow); - g_overlays.add(&g_ovDrizzle); - g_overlays.add(&g_ovStorm); - g_overlays.add(&g_ovThunder); - g_overlays.add(&g_ovFrost); + g_builtins.addTo(g_apps, g_effects, g_overlays); g_engine->setOverlayRegistry(&g_overlays); g_engine->setEffectRegistry(&g_effects); @@ -381,10 +300,11 @@ void setup() { g_net.apMode() ? 80 : (cfg.webPort > 0 ? static_cast(cfg.webPort) : 80); g_http.begin(webPort, *g_engine, *g_board, *g_canvas, uid, cfg, g_net.apMode()); // Re-applies everything that can change without a restart. A different panel count would need - // a differently sized canvas and LED buffer, so only same-width layouts are taken live. + // a differently sized canvas and LED buffer, so only same-size layouts are taken live. g_http.setOnConfigChanged([] { const MatrixLayout layout = g_cfg.matrixLayout(); - if (layout.width() == g_board->matrixWidth()) g_board->setMatrixLayout(layout); + if (layout.width() == g_board->matrixWidth() && layout.height() == g_board->matrixHeight()) + g_board->setMatrixLayout(layout); g_engine->state().runtime().tempDecimals = g_cfg.tempDecimals; logbuf::setVerbose(g_cfg.debugMode); g_mqtt.applyHaConfig(g_cfg); @@ -406,11 +326,13 @@ void setup() { // Pushed once the sinks are all attached, so the PCM gains are not left at their defaults. g_engine->state().emit(StateEvent::SettingsChanged); auto caps = std::make_shared(api::capabilitiesJson( - g_effects.names(), g_effects.paletteNames(), g_overlays.names(), g_audio.caps())); + g_effects.names(), g_effects.paletteNames(), g_overlays.names(), g_audio.caps(), + platform::buildFeatures())); g_http.setCapabilitiesJson(caps); g_mqtt.setCapabilitiesJson(std::move(caps)); } g_periphery.begin(*g_engine, *g_board, cfg); + g_periphery.setButtonPost(postButton); g_periphery.setUid(uid); g_hostResolver = net::makeHostResolver(); g_mqtt.begin(*g_engine, *g_board, cfg, uid, uid, diff --git a/src/media/DevicePageIcon.h b/src/media/DevicePageIcon.h index d0063458..025f3dd4 100644 --- a/src/media/DevicePageIcon.h +++ b/src/media/DevicePageIcon.h @@ -60,6 +60,7 @@ class DevicePageIcon : public IPageIcon { dst.setPixel(x + xOffset, y + yOffset, pixels_[static_cast(y) * width_ + x]); } int width() const override { return width_; } + int height() const override { return height_; } std::unique_ptr create() const override { return std::unique_ptr(new (std::nothrow) DevicePageIcon()); } diff --git a/src/media/MatrixRenderer.cpp b/src/media/MatrixRenderer.cpp index e25af4fa..d6e8a3b1 100644 --- a/src/media/MatrixRenderer.cpp +++ b/src/media/MatrixRenderer.cpp @@ -4,6 +4,7 @@ #include #include "core/PinRules.h" +#include "platform/MatrixPins.h" #include "system/Log.h" namespace awtrix { diff --git a/src/persistence/DeviceConfig.cpp b/src/persistence/DeviceConfig.cpp index fab3871f..96b3543b 100644 --- a/src/persistence/DeviceConfig.cpp +++ b/src/persistence/DeviceConfig.cpp @@ -1,6 +1,6 @@ #include "persistence/DeviceConfig.h" -#include +#include "platform/Preferences.h" #include "persistence/DeviceConfigFields.h" diff --git a/src/persistence/DeviceConfig.h b/src/persistence/DeviceConfig.h index 7c2ea747..e01adda8 100644 --- a/src/persistence/DeviceConfig.h +++ b/src/persistence/DeviceConfig.h @@ -44,6 +44,7 @@ struct DeviceConfig { bool ldrOnGround = false; long brightnessSmoothing = 10000; int panelWidth = 32; + int panelHeight = 8; int panels = 1; PanelStart panelStart = PanelStart::TopLeft; Wiring panelWiring = Wiring::Rows; @@ -87,6 +88,7 @@ struct DeviceConfig { MatrixLayout matrixLayout() const { MatrixLayout l; l.panelWidth = panelWidth; + l.panelHeight = panelHeight; l.panels = panels; l.panelStart = panelStart; l.panelWiring = panelWiring; @@ -111,6 +113,16 @@ struct DeviceConfig { p.dfplayerEnabled = dfplayer; return p; } + void setPinSet(const pins::PinSet& p) { + pinMatrix = p.matrix; + pinBtnLeft = p.btnLeft; pinBtnSelect = p.btnSelect; pinBtnRight = p.btnRight; + pinBattery = p.battery; pinLdr = p.ldr; pinBuzzer = p.buzzer; + pinI2cSda = p.i2cSda; pinI2cScl = p.i2cScl; + pinDfRx = p.dfRx; pinDfTx = p.dfTx; + pinI2sBclk = p.i2sBclk; pinI2sLrclk = p.i2sLrclk; pinI2sDout = p.i2sDout; + pinI2sMclk = p.i2sMclk; pinAmpEnable = p.ampEnable; + dfplayer = p.dfplayerEnabled; + } bool validatePins(std::string& err) const { return pins::validate(pinSet(), err); } }; diff --git a/src/persistence/DeviceConfigFields.h b/src/persistence/DeviceConfigFields.h index d5093896..b28d22ba 100644 --- a/src/persistence/DeviceConfigFields.h +++ b/src/persistence/DeviceConfigFields.h @@ -40,6 +40,7 @@ X(ldrOnGround, "ldrgnd", 0) \ X(brightnessSmoothing, "brismooth", 0) \ X(panelWidth, "pw", 0) \ + X(panelHeight, "pheight", 0) \ X(panels, "pnc", 0) \ X(panelStart, "pstart", 0) \ X(panelWiring, "pwire", 0) \ diff --git a/src/persistence/IconOriginsStore.cpp b/src/persistence/IconOriginsStore.cpp index 0cda1cfb..0fe3d23d 100644 --- a/src/persistence/IconOriginsStore.cpp +++ b/src/persistence/IconOriginsStore.cpp @@ -2,7 +2,9 @@ #include +#if !defined(AWTRIX_PLATFORM_RP2040) #include "persistence/VfsFile.h" +#endif namespace awtrix::iconorigins { namespace { @@ -29,7 +31,14 @@ class LittleFsOrigins : public Backend { return false; } bool iconExists(const std::string& name) override { +#if defined(AWTRIX_PLATFORM_RP2040) + // arduino-pico has no VFS to stat through. + if (!validName(name)) return false; + File f = LittleFS.open(("/ICONS/" + name).c_str(), "r"); + return f && !f.isDirectory(); +#else return validName(name) && fs::isFile("/ICONS/" + name); +#endif } }; } diff --git a/src/persistence/KvPreferences.h b/src/persistence/KvPreferences.h new file mode 100644 index 00000000..8d5b94a4 --- /dev/null +++ b/src/persistence/KvPreferences.h @@ -0,0 +1,149 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace awtrix::storage { + +// Portable, bounded namespace snapshot. Backend replacement must be atomic: a failed +// write leaves the previous snapshot intact. No Arduino or filesystem types here. +class KvBackend { + public: + enum class Read { Missing, Ok, Error }; + virtual ~KvBackend() = default; + virtual Read read(const std::string& name, std::string& bytes) = 0; + virtual bool replace(const std::string& name, const std::string& bytes) = 0; +}; + +class KvPreferences { + public: + static constexpr std::size_t kMaxBytes = 16384; + enum Type : uint8_t { Bool = 1, Int, UInt, Float, UChar, UShort, String }; + explicit KvPreferences(KvBackend& backend) : backend_(backend) {} + static bool validName(const std::string& s) { + if (s.empty() || s.size() > 15) return false; + for (unsigned char c : s) + if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || c == '_' || c == '-')) return false; + return true; + } + bool begin(const char* name, bool readOnly = false) { + if (open_ || !name || !validName(name)) return false; + values_.clear(); + std::string bytes; + const auto result = backend_.read(name, bytes); + if (result == KvBackend::Read::Error || + (result == KvBackend::Read::Ok && !decode(bytes)) || + (result == KvBackend::Read::Missing && readOnly)) return false; + name_ = name; + readOnly_ = readOnly; + open_ = true; + dirty_ = false; + return true; + } + // Explicit namespace transaction: all DeviceConfig fields land together at end(). + bool end() { + const bool ok = !dirty_ || backend_.replace(name_, encode()); + open_ = dirty_ = false; + values_.clear(); + return ok; + } + bool isKey(const char* key) const { return open_ && key && values_.count(key); } + bool remove(const char* key) { + if (!open_ || readOnly_ || !key || !values_.erase(key)) return false; + dirty_ = true; + return true; + } + bool clear() { + if (!open_ || readOnly_) return false; + values_.clear(); dirty_ = true; return true; + } + std::string get(const char* key, Type type, const std::string& fallback = {}) const { + if (!open_ || !key) return fallback; + auto i = values_.find(key); + return i != values_.end() && i->second.first == type ? i->second.second : fallback; + } + std::size_t put(const char* key, Type type, const std::string& bytes) { + if (!open_ || readOnly_ || !key || !validName(key) || !validValue(type, bytes)) return 0; + auto old = values_.find(key); + if (old != values_.end() && old->second == Value(type, bytes)) return bytes.size(); + std::size_t size = 8 + 4; + for (const auto& v : values_) if (v.first != key) size += 4 + v.first.size() + v.second.second.size(); + if (size + 4 + std::strlen(key) + bytes.size() > kMaxBytes) return 0; + values_[key] = {type, bytes}; dirty_ = true; return bytes.size(); + } + uint32_t getNumber(const char* key, Type type, uint32_t fallback) const { + const auto bytes = get(key, type); + if (bytes.empty() || bytes.size() > 4 || type == String) return fallback; + uint32_t value = 0; + for (std::size_t i = 0; i < bytes.size(); ++i) + value |= uint32_t(static_cast(bytes[i])) << (8 * i); + return value; + } + std::size_t putNumber(const char* key, Type type, uint32_t value, unsigned width) { + if (width == 0 || width > 4 || type == String) return 0; + std::string bytes; + for (unsigned i = 0; i < width; ++i) bytes += char(value >> (8 * i)); + return put(key, type, bytes); + } + private: + using Value = std::pair; + static bool validValue(Type t, const std::string& b) { + switch (t) { + case Bool: return b.size() == 1 && uint8_t(b[0]) <= 1; + case UChar: return b.size() == 1; + case UShort: return b.size() == 2; + case Int: case UInt: case Float: return b.size() == 4; + case String: return b.size() <= kMaxBytes && b.find('\0') == std::string::npos; + default: return false; + } + } + static uint32_t crc(const std::string& b, std::size_t n) { + uint32_t c = 0xffffffffu; + for (std::size_t i = 0; i < n; ++i) { + c ^= uint8_t(b[i]); + for (int bit = 0; bit < 8; ++bit) c = (c >> 1) ^ (0xedb88320u & (0u - (c & 1))); + } + return ~c; + } + std::string encode() const { + std::string b("AXKV\1\0\0\0", 8); + for (const auto& v : values_) { + b += char(v.first.size()); b += char(v.second.first); + b += char(v.second.second.size()); b += char(v.second.second.size() >> 8); + b += v.first; b += v.second.second; + } + const auto c = crc(b, b.size()); + for (int i = 0; i < 4; ++i) b += char(c >> (8 * i)); + return b; + } + bool decode(const std::string& b) { + if (b.size() < 12 || b.size() > kMaxBytes || b.compare(0, 8, std::string("AXKV\1\0\0\0", 8))) return false; + const auto end = b.size() - 4; + uint32_t check = 0; + for (int i = 0; i < 4; ++i) check |= uint32_t(uint8_t(b[end + i])) << (8 * i); + if (check != crc(b, end)) return false; + std::map parsed; + for (std::size_t at = 8; at < end;) { + if (end - at < 4) return false; + const auto keyLen = uint8_t(b[at++]); + const auto type = static_cast(uint8_t(b[at++])); + const auto len = uint8_t(b[at]) | (unsigned(uint8_t(b[at + 1])) << 8); at += 2; + if (keyLen > end - at || len > end - at - keyLen) return false; + const auto key = b.substr(at, keyLen); at += keyLen; + const auto value = b.substr(at, len); at += len; + if (!validName(key) || !validValue(type, value) || parsed.count(key)) return false; + parsed[key] = {type, value}; + } + values_ = std::move(parsed); + return true; + } + KvBackend& backend_; + std::map values_; + std::string name_; + bool open_ = false, readOnly_ = true, dirty_ = false; +}; +} diff --git a/src/persistence/LittleFsRestoreSink.cpp b/src/persistence/LittleFsRestoreSink.cpp new file mode 100644 index 00000000..a54dde3c --- /dev/null +++ b/src/persistence/LittleFsRestoreSink.cpp @@ -0,0 +1,46 @@ +#include "persistence/LittleFsRestoreSink.h" + +#include "core/AssetPaths.h" + +namespace awtrix::backup { +bool LittleFsRestoreSink::beginFile(const std::string& path, std::string& err) { + abortFile(); + // RestoreApplier checks entries against the shared backup policy; the sink applies the same one + // so a direct caller cannot write outside the asset directories either. + const auto slash = path.find_last_of('/'); + if (!assets::isBackupWritable(path) || slash + 1 == path.size() || + path.find("//") != std::string::npos || path.find('\\') != std::string::npos || + path.find('\0') != std::string::npos) { + err = "invalid asset path"; return false; + } + // A nested entry such as /ICONS/sub/smile.gif needs every parent, and mkdir makes one level. + for (auto at = path.find('/', 1); at <= slash; at = path.find('/', at + 1)) { + const std::string dir = path.substr(0, at); + if (!LittleFS.exists(dir.c_str()) && !LittleFS.mkdir(dir.c_str())) { + err = "could not create directory"; return false; + } + } + path_ = path; temp_ = path + ".restore.tmp"; + file_ = LittleFS.open(temp_.c_str(), "w"); + failed_ = !file_; + if (failed_) err = "could not open for writing"; + return !failed_; +} +bool LittleFsRestoreSink::writeFile(const uint8_t* data, std::size_t n) { + if (!file_ || failed_) return false; + failed_ = file_.write(data, n) != n; + return !failed_; +} +bool LittleFsRestoreSink::endFile() { + if (!file_ || failed_) { abortFile(); return false; } + file_.flush(); file_.close(); + const bool ok = LittleFS.rename(temp_.c_str(), path_.c_str()); + if (!ok) { abortFile(); return false; } + path_.clear(); temp_.clear(); return true; +} +void LittleFsRestoreSink::abortFile() { + if (file_) file_.close(); + if (!temp_.empty()) LittleFS.remove(temp_.c_str()); + path_.clear(); temp_.clear(); failed_ = false; +} +} diff --git a/src/persistence/LittleFsRestoreSink.h b/src/persistence/LittleFsRestoreSink.h new file mode 100644 index 00000000..ff680d74 --- /dev/null +++ b/src/persistence/LittleFsRestoreSink.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include "persistence/FsRestoreSink.h" + +namespace awtrix::backup { +// Transport-independent device restore sink; usable by ESP32 and arduino-pico. +// One file at a time, staged alongside its destination until the complete entry lands. +class LittleFsRestoreSink final : public FsRestoreSink { + public: + using FsRestoreSink::FsRestoreSink; + ~LittleFsRestoreSink() override { abortFile(); } + bool beginFile(const std::string& path, std::string& err) override; + bool writeFile(const uint8_t* data, std::size_t n) override; + bool endFile() override; + void abortFile() override; + private: + File file_; + std::string path_, temp_; + bool failed_ = false; +}; +} diff --git a/src/persistence/NvsSettings.cpp b/src/persistence/NvsSettings.cpp index d8fb0403..78f7357f 100644 --- a/src/persistence/NvsSettings.cpp +++ b/src/persistence/NvsSettings.cpp @@ -1,6 +1,6 @@ #include "persistence/NvsSettings.h" -#include +#include "platform/Preferences.h" #include diff --git a/src/persistence/PaletteFiles.cpp b/src/persistence/PaletteFiles.cpp new file mode 100644 index 00000000..c86b8f9c --- /dev/null +++ b/src/persistence/PaletteFiles.cpp @@ -0,0 +1,45 @@ +#include "persistence/PaletteFiles.h" + +#include + +#include + +#include "core/StrCase.h" +#include "core/render/Palette.h" +#include "core/render/PaletteFile.h" +#include "core/render/PaletteStore.h" + +namespace awtrix { +namespace palettefiles { + +// LittleFS is case-sensitive, but a palette named in a script or over the API rarely matches +// the file's capitalisation, so fall back to a case-insensitive scan of the directory. +void install() { + render::setPaletteLoader([](const std::string& name, render::Palette& out) { + if (name.find("..") != std::string::npos || name.find('/') != std::string::npos) return false; + File f = LittleFS.open((String("/PALETTES/") + name.c_str() + ".txt").c_str(), "r"); + if (!f) { + // arduino-pico's open() has no default mode; "r" is the ESP32 default. + File dir = LittleFS.open("/PALETTES", "r"); + for (File e = dir.openNextFile(); e; e = dir.openNextFile()) { + std::string leaf = e.name() ? e.name() : ""; + const std::size_t slash = leaf.rfind('/'); + if (slash != std::string::npos) leaf.erase(0, slash + 1); + if (leaf.size() <= 4 || !strcase::equalsIgnoreCase(leaf.substr(leaf.size() - 4), ".txt")) + continue; + if (!strcase::equalsIgnoreCase(leaf.substr(0, leaf.size() - 4), name)) continue; + f = LittleFS.open((String("/PALETTES/") + leaf.c_str()).c_str(), "r"); + break; + } + } + if (!f) return false; + std::string text; + text.reserve(static_cast(f.size())); + while (f.available()) text.push_back(static_cast(f.read())); + f.close(); + return render::parsePaletteFile(text, out); + }); +} + +} +} diff --git a/src/persistence/PaletteFiles.h b/src/persistence/PaletteFiles.h new file mode 100644 index 00000000..6189d679 --- /dev/null +++ b/src/persistence/PaletteFiles.h @@ -0,0 +1,10 @@ +#pragma once + +namespace awtrix { +namespace palettefiles { + +// Makes render::paletteByName() resolve custom palettes from /PALETTES/.txt on LittleFS. +void install(); + +} +} diff --git a/src/persistence/ScriptStore.cpp b/src/persistence/ScriptStore.cpp index ce2445cf..83d3f4f1 100644 --- a/src/persistence/ScriptStore.cpp +++ b/src/persistence/ScriptStore.cpp @@ -174,7 +174,7 @@ bool ScriptStore::readStore(const std::string& name, std::string& out) const { std::vector ScriptStore::names() const { std::vector names; - File dir = LittleFS.open(kDir); + File dir = LittleFS.open(kDir, "r"); if (!dir || !dir.isDirectory()) return names; for (File f = dir.openNextFile(); f; f = dir.openNextFile()) { String fn = f.name(); diff --git a/src/persistence/SystemConfigApply.cpp b/src/persistence/SystemConfigApply.cpp index 23722a0e..01dea71c 100644 --- a/src/persistence/SystemConfigApply.cpp +++ b/src/persistence/SystemConfigApply.cpp @@ -4,14 +4,50 @@ namespace awtrix { namespace sysconfig { +namespace { -bool apply(DeviceConfig& cfg, api::JsonReader obj, int& applied, ApplyError& err, Origin origin) { +bool sameWiring(const DeviceConfig& a, const DeviceConfig& b) { + return a.panelStart == b.panelStart && a.panelWiring == b.panelWiring && + a.panelColorOrder == b.panelColorOrder && a.panelSerpentine == b.panelSerpentine && + a.panelChainReverse == b.panelChainReverse && + a.panelChainSerpentine == b.panelChainSerpentine; +} + +// On a board with fixed wiring the pins and the panel are part of the board, so a restore keeps +// them, as it keeps the Wi-Fi: a backup from a board wired differently still restores the rest. +void keepFixedWiring(DeviceConfig& merged, const DeviceConfig& live, const pins::SocProfile& soc) { + const int height = merged.panelHeight; + adoptFixedBoard(merged, soc); + if (!soc.fixedPanelWidth) return; + if (merged.panelHeight != height) merged.panelHeight = live.panelHeight; + merged.panelStart = live.panelStart; + merged.panelWiring = live.panelWiring; + merged.panelColorOrder = live.panelColorOrder; + merged.panelSerpentine = live.panelSerpentine; + merged.panelChainReverse = live.panelChainReverse; + merged.panelChainSerpentine = live.panelChainSerpentine; +} + +} + +void adoptFixedBoard(DeviceConfig& cfg, const pins::SocProfile& soc) { + if (soc.fixedWiring) cfg.setPinSet(soc.defaults); + if (!soc.fixedPanelWidth) return; + cfg.panelWidth = soc.fixedPanelWidth; + cfg.panels = 1; + if (cfg.panelHeight != soc.fixedPanelHeights[0] && cfg.panelHeight != soc.fixedPanelHeights[1]) + cfg.panelHeight = soc.fixedPanelHeights[1]; +} + +bool apply(DeviceConfig& cfg, api::JsonReader obj, int& applied, ApplyError& err, Origin origin, + const pins::SocProfile& soc) { applied = 0; cfgrules::ConfigError cerr; // A restore is allowed to write empty strings to clear a field; an interactive edit is not, // because a blank box in the UI means "leave it alone". const bool allowEmptyClears = origin == Origin::Restore; - if (!cfgrules::validateSystemRead(obj, cerr, allowEmptyClears)) { + const bool pinsKept = origin == Origin::Restore && soc.fixedWiring; + if (!cfgrules::validateSystemRead(obj, cerr, allowEmptyClears, soc, pinsKept)) { err = {422, "validationFailed", cerr.message, cerr.field}; return false; } @@ -25,6 +61,7 @@ bool apply(DeviceConfig& cfg, api::JsonReader obj, int& applied, ApplyError& err if (origin == Origin::Restore) { merged.wifiSsid = ssid; merged.wifiPass = pass; + keepFixedWiring(merged, cfg, soc); } const cfgrules::IpSplit split = cfgrules::systemIpSplit(obj); if (split.present) { @@ -33,6 +70,8 @@ bool apply(DeviceConfig& cfg, api::JsonReader obj, int& applied, ApplyError& err ++applied; } if (!cfgrules::validateMatrixGeometry(merged.panelWidth, merged.panels, cerr) || + !cfgrules::validateFixedPanel(soc, merged.panelWidth, merged.panels, merged.panelHeight, + cerr) || !cfgrules::validateBrightnessWindow(merged.minBrightness, merged.maxBrightness, cerr) || !cfgrules::validateStaticNet(merged.netStatic, merged.ip, merged.subnet, cerr) || !cfgrules::validateMqttGate(merged.mqttEnabled, merged.mqttHost, cerr) || @@ -42,8 +81,13 @@ bool apply(DeviceConfig& cfg, api::JsonReader obj, int& applied, ApplyError& err err = {422, "validationFailed", cerr.message, cerr.field}; return false; } + if (soc.fixedPanelWidth && !sameWiring(merged, cfg)) { + err = {422, "validationFailed", std::string(soc.label) + ": the panel wiring is fixed", + "panelWiring"}; + return false; + } std::string pinErr; - if (!merged.validatePins(pinErr)) { + if (!pins::validate(merged.pinSet(), soc, pinErr)) { err = {400, "invalidPinConfig", pinErr, ""}; return false; } diff --git a/src/persistence/SystemConfigApply.h b/src/persistence/SystemConfigApply.h index c3389466..5be7d43c 100644 --- a/src/persistence/SystemConfigApply.h +++ b/src/persistence/SystemConfigApply.h @@ -17,10 +17,17 @@ struct ApplyError { enum class Origin { Interactive, Restore }; +// On a board with fixed wiring, replaces the pins and the panel size with the board's own, keeping +// a panel height the board allows (else its tallest). Run on the stored config at boot, so a pin +// map or panel stored by another build cannot make apply() refuse every later edit. +void adoptFixedBoard(DeviceConfig& cfg, const pins::SocProfile& soc = pins::activeProfile()); + // Validates obj against the cross-field rules and merges it into cfg, reporting how many fields // were taken. On failure cfg is left exactly as it was and err carries the HTTP status. +// soc is the board's pin and panel rules; tests pass another board's. bool apply(DeviceConfig& cfg, api::JsonReader obj, int& applied, ApplyError& err, - Origin origin = Origin::Interactive); + Origin origin = Origin::Interactive, + const pins::SocProfile& soc = pins::activeProfile()); } } diff --git a/src/platform/BuildFeatures.h b/src/platform/BuildFeatures.h new file mode 100644 index 00000000..b298e50d --- /dev/null +++ b/src/platform/BuildFeatures.h @@ -0,0 +1,26 @@ +#pragma once +#include "core/FeatureSet.h" + +#ifndef AWTRIX_FEATURE_SCRIPTING +#define AWTRIX_FEATURE_SCRIPTING 1 +#endif +#ifndef AWTRIX_FEATURE_MP3 +#define AWTRIX_FEATURE_MP3 1 +#endif +#ifndef AWTRIX_FEATURE_RADIO +#define AWTRIX_FEATURE_RADIO 1 +#endif +#ifndef AWTRIX_FEATURE_OUTBOUND_TLS +#define AWTRIX_FEATURE_OUTBOUND_TLS 1 +#endif +#ifndef AWTRIX_FEATURE_BROWSER_OTA +#define AWTRIX_FEATURE_BROWSER_OTA 1 +#endif + +namespace awtrix::platform { +inline constexpr FeatureSet buildFeatures() { + return {bool(AWTRIX_FEATURE_SCRIPTING), bool(AWTRIX_FEATURE_MP3), + bool(AWTRIX_FEATURE_RADIO), bool(AWTRIX_FEATURE_OUTBOUND_TLS), + bool(AWTRIX_FEATURE_BROWSER_OTA)}; +} +} diff --git a/src/platform/MatrixPins.h b/src/platform/MatrixPins.h new file mode 100644 index 00000000..3589c6de --- /dev/null +++ b/src/platform/MatrixPins.h @@ -0,0 +1,11 @@ +#pragma once +#include "core/SocProfile.h" + +// FastLED instantiates one driver per supported data pin. +#if defined(AWTRIX_SOC_ESP32S3) +#define AWTRIX_MATRIX_PIN_LIST(X) AWTRIX_MATRIX_PINS_ESP32S3(X) +#define AWTRIX_MATRIX_FALLBACK_PIN 21 +#else +#define AWTRIX_MATRIX_PIN_LIST(X) AWTRIX_MATRIX_PINS_ESP32(X) +#define AWTRIX_MATRIX_FALLBACK_PIN 32 +#endif diff --git a/src/platform/Preferences.h b/src/platform/Preferences.h new file mode 100644 index 00000000..db2c7da0 --- /dev/null +++ b/src/platform/Preferences.h @@ -0,0 +1,7 @@ +#pragma once + +#if defined(AWTRIX_PLATFORM_RP2040) +#include "platform/rp2040/LittleFsPreferences.h" +#else +#include +#endif diff --git a/src/platform/SocProfile.cpp b/src/platform/SocProfile.cpp new file mode 100644 index 00000000..40dcea6a --- /dev/null +++ b/src/platform/SocProfile.cpp @@ -0,0 +1,14 @@ +#include "core/SocProfile.h" + +namespace awtrix::pins { +// Build selection belongs at the platform boundary, not in portable policy. +const SocProfile& activeProfile() { +#if defined(AWTRIX_SOC_ESP32S3) + return esp32s3Profile(); +#elif defined(AWTRIX_SOC_RP2040) + return rp2040Profile(); +#else + return esp32Profile(); +#endif +} +} diff --git a/src/platform/rp2040/AssetFileRp2040.cpp b/src/platform/rp2040/AssetFileRp2040.cpp new file mode 100644 index 00000000..c659115d --- /dev/null +++ b/src/platform/rp2040/AssetFileRp2040.cpp @@ -0,0 +1,26 @@ +#include + +#include "media/AssetFile.h" + +namespace awtrix { +namespace media { + +// The ESP32 reads assets through its VFS; arduino-pico has none, so use the LittleFS File API. +bool readAsset(const std::string& path, PodBuffer& out, bool* outOfMemory) { + if (outOfMemory) *outOfMemory = false; + File f = LittleFS.open(path.c_str(), "r"); + if (!f || f.isDirectory() || f.size() == 0) return false; + const std::size_t n = f.size(); + if (!out.resize(n)) { + if (outOfMemory) *outOfMemory = true; + return false; + } + if (f.read(out.data(), n) != n) { + out.clear(); + return false; + } + return true; +} + +} +} diff --git a/src/platform/rp2040/BoundedHostLookup.h b/src/platform/rp2040/BoundedHostLookup.h new file mode 100644 index 00000000..e59c1d75 --- /dev/null +++ b/src/platform/rp2040/BoundedHostLookup.h @@ -0,0 +1,60 @@ +#pragma once + +#include "core/net/HostName.h" +#include "core/net/LinkStatus.h" + +namespace awtrix::platform::pico { + +// arduino-pico resolves .local through lwIP mDNS. Each call is bounded; unlike ESP32 this +// needs no worker task. The template lets host tests enforce timeouts and cache invalidation. +template +class BoundedHostLookup { + public: + static constexpr int kTimeoutMs = 1000; + + template + bool resolve(Wifi& wifi, const std::string& host) { + if (!wifi.isConnected()) { + forget(); + error_ = net::LinkError::NoWifi; + return false; + } + if (have_ && host == host_) return true; + forget(); + uint8_t octets[4]; + Address found; + bool ok = net::parseIpv4(host, octets); + if (ok) { + found = Address(octets[0], octets[1], octets[2], octets[3]); + } else if (!host.empty()) { + ok = wifi.hostByName(host.c_str(), found, kTimeoutMs) == 1; + if (!ok && net::isMdnsName(host)) + ok = wifi.hostByName(net::mdnsLabel(host).c_str(), found, kTimeoutMs) == 1; + } + if (!ok || static_cast(found) == 0) { + error_ = net::LinkError::HostNotFound; + return false; + } + host_ = host; + address_ = found; + have_ = true; + error_ = net::LinkError::None; + return true; + } + + Address address() const { return address_; } + net::LinkError error() const { return error_; } + void forget() { + have_ = false; + host_.clear(); + address_ = Address(); + error_ = net::LinkError::None; + } + + private: + std::string host_; + Address address_; + net::LinkError error_ = net::LinkError::None; + bool have_ = false; +}; +} diff --git a/src/platform/rp2040/DisabledStores.cpp b/src/platform/rp2040/DisabledStores.cpp new file mode 100644 index 00000000..faebc381 --- /dev/null +++ b/src/platform/rp2040/DisabledStores.cpp @@ -0,0 +1,8 @@ +#include "persistence/RadioStore.h" + +namespace awtrix { +namespace radiostore { +void save(const std::string&) {} +void load(CoreEngine&) {} +} +} diff --git a/src/platform/rp2040/FilesystemRp2040.cpp b/src/platform/rp2040/FilesystemRp2040.cpp new file mode 100644 index 00000000..c573c09c --- /dev/null +++ b/src/platform/rp2040/FilesystemRp2040.cpp @@ -0,0 +1,23 @@ +#include "persistence/Filesystem.h" +#include + +namespace awtrix::fs { +bool begin() { + // arduino-pico's LittleFS configuration formats an unmountable volume, matching + // the ESP32 begin(true) policy. Formatting also erases corrupt volumes. + LittleFSConfig config; + config.setAutoFormat(true); + LittleFS.setConfig(config); + if (!LittleFS.begin()) return false; + for (const char* dir : {"/ICONS", "/PALETTES", "/MELODIES", "/SCRIPTS", "/NVS"}) + if (!LittleFS.exists(dir) && !LittleFS.mkdir(dir)) return false; + return true; +} +bool usage(std::size_t& totalBytes, std::size_t& usedBytes) { + FSInfo info; + const bool ok = LittleFS.info(info); + totalBytes = ok ? info.totalBytes : 0; + usedBytes = ok ? info.usedBytes : 0; + return ok; +} +} diff --git a/src/platform/rp2040/GalacticUnicornPio.h b/src/platform/rp2040/GalacticUnicornPio.h new file mode 100644 index 00000000..81bd1a5a --- /dev/null +++ b/src/platform/rp2040/GalacticUnicornPio.h @@ -0,0 +1,35 @@ +#pragma once +// Pimoroni pico v1.23.0 galactic_unicorn.pio, expressed with SDK encoders to +// avoid an external pioasm build dependency. Copyright (c) 2021 Pimoroni Ltd. +// MIT; see LICENSES/MIT-Pimoroni.txt. Jump operands are relocated by pio_add_program. +#include +#include +namespace awtrix::galactic { +inline const uint16_t instructions[] = { + uint16_t(pio_encode_out(pio_y, 8)), // 0: pixel count - 1 + uint16_t(pio_encode_out(pio_pins, 8)), // 1: row select + uint16_t(pio_encode_out(pio_x, 1) | pio_encode_sideset_opt(1, 0) | pio_encode_delay(1)), + uint16_t(pio_encode_set(pio_pins, 4)), + uint16_t(pio_encode_jmp_not_x(6)), + uint16_t(pio_encode_set(pio_pins, 5)), + uint16_t(pio_encode_nop() | pio_encode_sideset_opt(1, 1) | pio_encode_delay(2)), + uint16_t(pio_encode_out(pio_x, 1) | pio_encode_sideset_opt(1, 0) | pio_encode_delay(1)), + uint16_t(pio_encode_set(pio_pins, 4)), + uint16_t(pio_encode_jmp_not_x(11)), + uint16_t(pio_encode_set(pio_pins, 5)), + uint16_t(pio_encode_nop() | pio_encode_sideset_opt(1, 1) | pio_encode_delay(2)), + uint16_t(pio_encode_out(pio_x, 1) | pio_encode_sideset_opt(1, 0) | pio_encode_delay(1)), + uint16_t(pio_encode_set(pio_pins, 4)), + uint16_t(pio_encode_jmp_not_x(16)), + uint16_t(pio_encode_set(pio_pins, 5)), + uint16_t(pio_encode_out(pio_null, 5) | pio_encode_sideset_opt(1, 1) | pio_encode_delay(2)), + uint16_t(pio_encode_jmp_y_dec(2)), + uint16_t(pio_encode_out(pio_null, 8)), // padding byte + uint16_t(pio_encode_set(pio_pins, 6) | pio_encode_delay(5)), // latch, blank + uint16_t(pio_encode_set(pio_pins, 0)), // enable output + uint16_t(pio_encode_out(pio_y, 32)), // binary-weighted dwell + uint16_t(pio_encode_jmp_y_dec(22)), + uint16_t(pio_encode_set(pio_pins, 4)), // blank before next row +}; +inline const pio_program program = {instructions, 24, -1}; +} diff --git a/src/platform/rp2040/HostResolverPico.cpp b/src/platform/rp2040/HostResolverPico.cpp new file mode 100644 index 00000000..f6e87523 --- /dev/null +++ b/src/platform/rp2040/HostResolverPico.cpp @@ -0,0 +1,28 @@ +#include "transport/net/HostResolver.h" + +#include +#include "platform/rp2040/BoundedHostLookup.h" +#include "system/Watchdog.h" + +namespace awtrix::net { +namespace { +class HostResolverPico final : public IHostResolver { + public: + ResolveState resolve(const std::string& host) override { + watchdog::feed(); + const bool ready = lookup_.resolve(WiFi, host); + watchdog::feed(); + return ready ? ResolveState::Ready : ResolveState::Failed; + } + IPAddress address() const override { return lookup_.address(); } + LinkError error() const override { return lookup_.error(); } + void forget() override { lookup_.forget(); } + private: + platform::pico::BoundedHostLookup lookup_; +}; +} + +std::unique_ptr makeHostResolver() { + return std::unique_ptr(new HostResolverPico()); +} +} diff --git a/src/platform/rp2040/LittleFsPreferences.cpp b/src/platform/rp2040/LittleFsPreferences.cpp new file mode 100644 index 00000000..a15b5b66 --- /dev/null +++ b/src/platform/rp2040/LittleFsPreferences.cpp @@ -0,0 +1,41 @@ +#include "platform/rp2040/LittleFsPreferences.h" +#include +#include "system/Log.h" + +namespace awtrix::storage { +namespace { +class Backend final : public KvBackend { + public: + Read read(const std::string& name, std::string& bytes) override { + const auto path = "/NVS/" + name + ".bin"; + if (!LittleFS.exists(path.c_str())) return Read::Missing; + File f = LittleFS.open(path.c_str(), "r"); + if (!f || f.size() > KvPreferences::kMaxBytes) return Read::Error; + bytes.resize(f.size()); + return f.read(reinterpret_cast(bytes.data()), bytes.size()) == bytes.size() + ? Read::Ok : Read::Error; + } + bool replace(const std::string& name, const std::string& bytes) override { + if (!LittleFS.exists("/NVS") && !LittleFS.mkdir("/NVS")) return false; + const auto path = "/NVS/" + name + ".bin"; + const auto temp = path + ".tmp"; + File f = LittleFS.open(temp.c_str(), "w"); + if (!f) return false; + bool ok = f.write(reinterpret_cast(bytes.data()), bytes.size()) == bytes.size(); + f.flush(); f.close(); + // Check the staged bytes before publishing. Never delete the old snapshot first. + f = LittleFS.open(temp.c_str(), "r"); + ok = ok && f && f.size() == bytes.size(); + for (std::size_t i = 0; ok && i < bytes.size(); ++i) ok = f.read() == uint8_t(bytes[i]); + f.close(); + if (ok && LittleFS.rename(temp.c_str(), path.c_str())) return true; + LittleFS.remove(temp.c_str()); + return false; + } +}; +} +KvBackend& littleFsKvBackend() { static Backend backend; return backend; } +} +void Preferences::end() { + if (!store_.end()) awtrix::logf("preferences: namespace commit failed"); +} diff --git a/src/platform/rp2040/LittleFsPreferences.h b/src/platform/rp2040/LittleFsPreferences.h new file mode 100644 index 00000000..888e43de --- /dev/null +++ b/src/platform/rp2040/LittleFsPreferences.h @@ -0,0 +1,50 @@ +#pragma once +#include +#include "persistence/KvPreferences.h" + +namespace awtrix::storage { KvBackend& littleFsKvBackend(); } + +// The Preferences subset used by AWTRIX. Unlike NVS, a namespace is committed +// atomically at end(), not once per put. Callers must explicitly end a write. +class Preferences { + public: + Preferences() : store_(awtrix::storage::littleFsKvBackend()) {} + bool begin(const char* name, bool readOnly = false) { return store_.begin(name, readOnly); } + void end(); + bool clear() { return store_.clear(); } + bool isKey(const char* key) const { return store_.isKey(key); } + bool remove(const char* key) { return store_.remove(key); } + String getString(const char* key, const char* fallback = "") const { + return String(store_.get(key, Store::String, fallback).c_str()); + } + size_t putString(const char* key, const char* value) { + return value ? store_.put(key, Store::String, value) : 0; + } +#define NUMBER(Name, CppType, Kind, Width) \ + CppType get##Name(const char* k, CppType v = 0) const { \ + return static_cast(store_.getNumber(k, Store::Kind, static_cast(v))); \ + } \ + size_t put##Name(const char* k, CppType v) { \ + return store_.putNumber(k, Store::Kind, static_cast(v), Width); \ + } + NUMBER(Bool, bool, Bool, 1) + NUMBER(Int, int32_t, Int, 4) + NUMBER(Long, int32_t, Int, 4) + NUMBER(UInt, uint32_t, UInt, 4) + NUMBER(UChar, uint8_t, UChar, 1) + NUMBER(UShort, uint16_t, UShort, 2) +#undef NUMBER + float getFloat(const char* k, float v = 0) const { + uint32_t bits; static_assert(sizeof(bits) == sizeof(v), "32-bit float required"); + std::memcpy(&bits, &v, sizeof(bits)); + bits = store_.getNumber(k, Store::Float, bits); + std::memcpy(&v, &bits, sizeof(v)); return v; + } + size_t putFloat(const char* k, float v) { + uint32_t bits; std::memcpy(&bits, &v, sizeof(bits)); + return store_.putNumber(k, Store::Float, bits, 4); + } + private: + using Store = awtrix::storage::KvPreferences; + Store store_; +}; diff --git a/src/platform/rp2040/RadioStartup.cpp b/src/platform/rp2040/RadioStartup.cpp new file mode 100644 index 00000000..7d1851bb --- /dev/null +++ b/src/platform/rp2040/RadioStartup.cpp @@ -0,0 +1,119 @@ +#include "platform/rp2040/RadioStartup.h" +#include +#include +#include "system/Log.h" +#include + +// The Pico W variants call this before setup(). Defer it until board->begin() +// has claimed the display SM/program and DMA channels. Do not override the +// entire variant (which would discard future board startup work). +extern "C" void __wrap_init_cyw43_wifi() {} +extern "C" void __real_init_cyw43_wifi(); + +namespace { +// Single producer (the driver's async context), single consumer (the main loop), one core. +constexpr uint32_t kEventSlots = 32; +awtrix::platform::RadioEvent events[kEventSlots]; +volatile uint32_t eventHead = 0; // written by the producer +volatile uint32_t eventTail = 0; // written by the consumer +volatile uint32_t eventsDropped = 0; +} + +// The driver's own trace (CYW43_TRACE_ASYNC_EV) prints from interrupt context through printf, +// which arduino-pico discards. Record the events here and log them from the main loop instead. +extern "C" void __real_cyw43_cb_process_async_event(void* cb_data, const cyw43_async_event_t* ev); +extern "C" void __wrap_cyw43_cb_process_async_event(void* cb_data, const cyw43_async_event_t* ev) { + __real_cyw43_cb_process_async_event(cb_data, ev); + if (ev->event_type == CYW43_EV_ESCAN_RESULT) return; + const uint32_t head = eventHead; + if (head - eventTail >= kEventSlots) { + eventsDropped = eventsDropped + 1; + return; + } + awtrix::platform::RadioEvent& e = events[head % kEventSlots]; + e.ms = millis(); + e.type = ev->event_type; + e.status = ev->status; + e.reason = ev->reason; + e.flags = ev->flags; + e.itf = ev->interface; + // wl_event_msg_t after `reason`: auth_type(4), datalen(4), addr(6). + memcpy(e.addr, ev->_1 + 8, sizeof e.addr); + e.joinState = static_cast(cb_data)->wifi_join_state; + __sync_synchronize(); + eventHead = head + 1; +} + +namespace awtrix::platform { +bool takeRadioEvent(RadioEvent& out, uint32_t& dropped) { + dropped = eventsDropped; + const uint32_t tail = eventTail; + if (tail == eventHead) return false; + __sync_synchronize(); + out = events[tail % kEventSlots]; + __sync_synchronize(); + eventTail = tail + 1; + return true; +} + +const char* radioEventName(uint32_t type) { + switch (type) { + case CYW43_EV_SET_SSID: return "SET_SSID"; + case CYW43_EV_JOIN: return "JOIN"; + case CYW43_EV_AUTH: return "AUTH"; + case CYW43_EV_DEAUTH: return "DEAUTH"; + case CYW43_EV_DEAUTH_IND: return "DEAUTH_IND"; + case CYW43_EV_ASSOC: return "ASSOC"; + case 9: return "REASSOC"; // WLC_E_REASSOC: firmware roam + case 32: return "ROAM_PREP"; // WLC_E_ROAM_PREP + case CYW43_EV_DISASSOC: return "DISASSOC"; + case CYW43_EV_DISASSOC_IND: return "DISASSOC_IND"; + case CYW43_EV_LINK: return "LINK"; + case CYW43_EV_PRUNE: return "PRUNE"; + case CYW43_EV_PSK_SUP: return "PSK_SUP"; + case CYW43_EV_ICV_ERROR: return "ICV_ERROR"; + case CYW43_EV_CSA_COMPLETE_IND: return "CSA_COMPLETE_IND"; + case CYW43_EV_ASSOC_REQ_IE: return "ASSOC_REQ_IE"; + case CYW43_EV_ASSOC_RESP_IE: return "ASSOC_RESP_IE"; + default: return nullptr; + } +} + +int disableFirmwareRoaming() { + uint8_t set[] = {'r', 'o', 'a', 'm', '_', 'o', 'f', 'f', 0, 1, 0, 0, 0}; + if (cyw43_ioctl(&cyw43_state, CYW43_IOCTL_SET_VAR, sizeof set, set, CYW43_ITF_STA) != 0) return -1; + return firmwareRoamOff(); +} + +int firmwareRoamOff() { + uint8_t get[] = {'r', 'o', 'a', 'm', '_', 'o', 'f', 'f', 0, 0, 0, 0, 0}; + if (cyw43_ioctl(&cyw43_state, CYW43_IOCTL_GET_VAR, sizeof get, get, CYW43_ITF_STA) != 0) return -1; + return get[0] | (get[1] << 8) | (get[2] << 16) | (get[3] << 24); +} + +void beginRadio() { + static bool started = false; + if (started) return; + started = true; + bool claimed[NUM_PIOS][NUM_PIO_STATE_MACHINES]{}; + for (uint p = 0; p < NUM_PIOS; ++p) + for (uint sm = 0; sm < NUM_PIO_STATE_MACHINES; ++sm) + claimed[p][sm] = pio_sm_is_claimed(pio_get_instance(p), sm); + __real_init_cyw43_wifi(); + // cyw43_init alone initializes software state; the SPI bus/PIO allocation + // is lazy. Reading the MAC brings the interface up before the second snapshot. + WiFi.macAddress(); + // Query the SDK allocation bitmap, not a guessed SM or private bus_data ABI. + // No other allocator runs between these snapshots on this core. + bool found = false; + for (uint p = 0; p < NUM_PIOS; ++p) { + for (uint sm = 0; sm < NUM_PIO_STATE_MACHINES; ++sm) { + if (!claimed[p][sm] && pio_sm_is_claimed(pio_get_instance(p), sm)) { + logf("wifi: CYW43 claimed PIO%u SM%u after display startup", p, sm); + found = true; + } + } + } + if (!found) logf("wifi: CYW43 PIO allocation not observed; check radio initialization"); +} +} diff --git a/src/platform/rp2040/RadioStartup.h b/src/platform/rp2040/RadioStartup.h new file mode 100644 index 00000000..c545c7e4 --- /dev/null +++ b/src/platform/rp2040/RadioStartup.h @@ -0,0 +1,31 @@ +#pragma once +#include +namespace awtrix::platform { +// Must run after the display claims PIO/DMA and before any WiFi call. +void beginRadio(); + +// Turns off the CYW43 firmware's own roaming (the "roam_off" variable) and reads it back; returns +// the value the firmware now reports, or -1 if it could not be read. ESP32 never roams on its own; +// on an eero mesh the firmware roamed back and forth between two nodes within half a minute and a +// roam's key exchange timed out, dropping the link. Roaming stays with NetworkService::roamIfWeak. +int disableFirmwareRoaming(); +// The firmware's current "roam_off" value, or -1 if it could not be read. +int firmwareRoamOff(); + +// One CYW43 driver event (join, auth, deauth, link, key exchange), recorded as the driver +// processes it. Scan results are not recorded. +struct RadioEvent { + uint32_t ms; + uint32_t type; + uint32_t status; + uint32_t reason; + uint16_t flags; + uint8_t itf; + uint8_t addr[6]; + uint32_t joinState; // the driver's join state after the event +}; +// Oldest recorded event not yet taken; false when none is pending. Events that arrive while the +// buffer is full are counted in `dropped`. +bool takeRadioEvent(RadioEvent& out, uint32_t& dropped); +const char* radioEventName(uint32_t type); +} diff --git a/src/platform/rp2040/ScriptHeapRp2040.cpp b/src/platform/rp2040/ScriptHeapRp2040.cpp new file mode 100644 index 00000000..147159f0 --- /dev/null +++ b/src/platform/rp2040/ScriptHeapRp2040.cpp @@ -0,0 +1,105 @@ +#include "platform/rp2040/ScriptHeapRp2040.h" + +#include +#include +#include + +#include +#include + +#include "core/script/ScriptHeap.h" +#include "core/script/ScriptServices.h" +#include "platform/BuildFeatures.h" + +// What the script VM may grow to. The ESP32 gets 96 KB of internal RAM. The Pico W (RP2040, 264 KB) +// has one heap of about 110 KB shared with Wi-Fi, lwIP, HTTP, MQTT and the frame buffers, so it +// gets less; the Pico 2 W (RP2350, 520 KB) has room for the ESP32's 96 KB. Set from build_flags +// (-D AWTRIX_RP2040_SCRIPT_HEAP_KB=n) to tune a board. +#ifndef AWTRIX_RP2040_SCRIPT_HEAP_KB +#if defined(PICO_RP2350) && PICO_RP2350 +#define AWTRIX_RP2040_SCRIPT_HEAP_KB 96 +#else +#define AWTRIX_RP2040_SCRIPT_HEAP_KB 48 +#endif +#endif + +namespace awtrix { +namespace script { +namespace heap { + +namespace { + +constexpr std::size_t kBudgetBytes = std::size_t(AWTRIX_RP2040_SCRIPT_HEAP_KB) * 1024; + +std::size_t g_installReserve = 0; +std::size_t g_installLowWater = 0; + +void noteFree(std::size_t freeNow) { + if (g_installLowWater == 0 || freeNow < g_installLowWater) g_installLowWater = freeNow; +} + +// Same rule as the ESP32 seam: while a script installs, the VM may not take the heap below the +// reserve, so an oversized script fails inside the compiler instead of starving Wi-Fi. +bool refusedByReserve(std::size_t size) { + if (g_installReserve == 0) return false; + const std::size_t freeNow = rp2040.getFreeHeap(); + noteFree(freeNow); + return !allocFitsReserve(freeNow, size, g_installReserve); +} + +} + +// A build without scripting (-D AWTRIX_FEATURE_SCRIPTING=0) has no VM, so it reports the pool as +// "unavailable" with no budget, as documented for /api/v1/device. +Info info() { + if (!AWTRIX_FEATURE_SCRIPTING) return {"unavailable", 0, false}; + Info i; + i.name = "internal"; + i.budgetBytes = kBudgetBytes; + return i; +} + +void setInstallReserve(std::size_t bytes) { + g_installReserve = bytes; + g_installLowWater = 0; +} +void clearInstallReserve() { g_installReserve = 0; } + +std::size_t installLowWater() { return g_installLowWater; } + +std::size_t growthBudget() { + if (!AWTRIX_FEATURE_SCRIPTING) return 0; + const std::size_t freeNow = rp2040.getFreeHeap(); + const std::size_t largest = picoLargestFreeBlock(); + const std::size_t usable = std::min(freeNow, largest); + return usable > kInstallHeadroomBytes ? usable - kInstallHeadroomBytes : 0; +} + +// newlib cannot walk its free list, so this is the block at the top of the heap: the free chunk +// malloc keeps there plus what sbrk has not handed out yet. The same reading /api/v1/device +// reports as largestFreeBlockBytes. +std::size_t picoLargestFreeBlock() { + const ptrdiff_t unclaimed = &__StackLimit - static_cast(sbrk(0)); + return static_cast(mallinfo().keepcost) + + static_cast(std::max(unclaimed, 0)); +} + +} +} +} + +extern "C" { + +void* awtrix_script_heap_alloc(size_t size) { + if (awtrix::script::heap::refusedByReserve(size)) return nullptr; + return std::malloc(size); +} + +void* awtrix_script_heap_realloc(void* ptr, size_t size) { + if (awtrix::script::heap::refusedByReserve(size)) return nullptr; + return std::realloc(ptr, size); +} + +void awtrix_script_heap_free(void* ptr) { std::free(ptr); } + +} diff --git a/src/platform/rp2040/ScriptHeapRp2040.h b/src/platform/rp2040/ScriptHeapRp2040.h new file mode 100644 index 00000000..fb1b0982 --- /dev/null +++ b/src/platform/rp2040/ScriptHeapRp2040.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace awtrix::script::heap { + +// Largest block malloc can hand out on the Pico, as far as newlib lets anyone tell. +std::size_t picoLargestFreeBlock(); + +} diff --git a/src/platform/rp2040/TimeService.h b/src/platform/rp2040/TimeService.h new file mode 100644 index 00000000..5acfd35f --- /dev/null +++ b/src/platform/rp2040/TimeService.h @@ -0,0 +1,27 @@ +#pragma once +#include +#include +#include +#include +#include "system/TimeConfig.h" + +namespace awtrix::platform { +class TimeService { + public: + void apply(const std::string& tz, const std::string& server, bool force = false) { + // Stop before changing owned hostname storage retained by lwIP. + if (!config_.needsUpdate(tz, server, force)) return; + sntp_stop(); + config_.update(tz, server, force); + setenv("TZ", config_.timezone().c_str(), 1); + tzset(); + sntp_setservername(0, config_.server().c_str()); + sntp_setoperatingmode(SNTP_OPMODE_POLL); + sntp_init(); // asynchronous DNS, retry and system-clock update supplied by the core + + } + private: + TimeConfig config_; + +}; +} diff --git a/src/platform/rp2040/UnicornToneSink.cpp b/src/platform/rp2040/UnicornToneSink.cpp new file mode 100644 index 00000000..290f80f9 --- /dev/null +++ b/src/platform/rp2040/UnicornToneSink.cpp @@ -0,0 +1,107 @@ +#include "platform/rp2040/UnicornToneSink.h" +#include +#include +#include + +namespace awtrix { +namespace { +constexpr int AmpEnable = 22; // LOW shuts the amplifier down; HIGH enables it. +uint32_t dmaClaims() { + uint32_t mask = 0; + for (uint i = 0; i < NUM_DMA_CHANNELS; ++i) + if (dma_channel_is_claimed(i)) mask |= 1u << i; + return mask; +} +uint32_t smClaims() { + uint32_t mask = 0; + for (uint p = 0; p < NUM_PIOS; ++p) + for (uint s = 0; s < NUM_PIO_STATE_MACHINES; ++s) + if (pio_sm_is_claimed(pio_get_instance(p), s)) mask |= 1u << (p * 4 + s); + return mask; +} +} + +bool UnicornToneSink::open() { + if (running_) return true; + const auto beforeSm = smClaims(), beforeDma = dmaClaims(); + running_ = i2s_.begin(sound::ToneSamples::SampleRate); + Serial.printf("tone: %s; new PIO-SM mask 0x%lx, DMA mask 0x%lx\n", + running_ ? "ready" : "unavailable", (unsigned long)(smClaims() & ~beforeSm), + (unsigned long)(dmaClaims() & ~beforeDma)); + return running_; +} + +void UnicornToneSink::begin() { + pinMode(AmpEnable, OUTPUT); + digitalWrite(AmpEnable, LOW); + i2s_.setBCLK(10); // LRCLK is BCLK + 1. + i2s_.setDATA(9); + i2s_.setBitsPerSample(16); + i2s_.setBuffers(BufferCount, BufferWords, 0); + setVolume(volume_); + // Called after the display and CYW43. Arduino-pico uses the same SDK + // program/SM/DMA claim bitmaps, never fixed state machines or DMA channels. + ready_ = open(); +} + +void UnicornToneSink::setVolume(uint8_t percent) { + volume_ = percent > 100 ? 100 : percent; + samples_.setVolume(volume_); + digitalWrite(AmpEnable, playing_ && volume_ ? HIGH : LOW); +} + +bool UnicornToneSink::playMelodyFile(const std::string& name) { + if (!ready_ || !rtttl::validName(name)) return false; + File file = LittleFS.open((std::string("/MELODIES/") + name + ".txt").c_str(), "r"); + if (!file || file.size() > rtttl::kMaxLength) return false; + std::string text; + text.reserve(file.size()); + while (file.available()) text.push_back(static_cast(file.read())); + return playRtttl(text); +} + +bool UnicornToneSink::playRtttl(const std::string& text) { + if (!ready_ || !samples_.play(text)) return false; + // Discard old queued samples on replacement, with the amplifier muted. + digitalWrite(AmpEnable, LOW); + if (running_) i2s_.end(); + running_ = false; + playing_ = false; + if (!open()) { samples_.stop(); return false; } + partial_ = 0; + draining_ = false; + playing_ = true; + tick(); // Prime without waiting for DMA. + digitalWrite(AmpEnable, volume_ ? HIGH : LOW); + return true; +} + +void UnicornToneSink::stop() { + digitalWrite(AmpEnable, LOW); + samples_.stop(); + playing_ = draining_ = false; + partial_ = 0; + if (running_) i2s_.end(); // Abort/release DMA; never flush() (which busy-waits). + running_ = false; +} + +void UnicornToneSink::tick() { + if (!playing_ || !running_) return; + // A strict finite budget, called on every loop, before the frame-rate early + // return. Every write is explicitly non-blocking; underrun produces silence. + for (int n = 0; n < BufferCount * BufferWords; ++n) { + if (!samples_.playing() && partial_ == 0) break; + if (i2s_.availableForWrite() < 4) break; + const auto word = sound::ToneSamples::stereo(samples_.next()); + i2s_.write(static_cast(word), false); + partial_ = (partial_ + 1) % BufferWords; // Pad the last partial DMA buffer with zeros. + } + if (samples_.playing() || partial_ != 0) return; + // Wait cooperatively for every buffer to return, then allow the PIO FIFO + // (< 1 ms) to empty before asserting mute. No wall-clock melody truncation. + if (i2s_.availableForWrite() == BufferCount * BufferWords * 4) { + if (!draining_) { draining_ = true; drainedAt_ = millis(); } + else if (millis() - drainedAt_ >= 1) stop(); + } +} +} diff --git a/src/platform/rp2040/UnicornToneSink.h b/src/platform/rp2040/UnicornToneSink.h new file mode 100644 index 00000000..4706fba6 --- /dev/null +++ b/src/platform/rp2040/UnicornToneSink.h @@ -0,0 +1,28 @@ +#pragma once +#include "core/sound/AudioSinks.h" +#include "core/sound/ToneSamples.h" +#include + +namespace awtrix { +class UnicornToneSink final : public sound::IToneSink { + public: + void begin() override; + void setVolume(uint8_t percent) override; + bool playRtttl(const std::string& text) override; + bool playMelodyFile(const std::string& name) override; + void stop() override; + void tick() override; + bool isPlaying() const override { return playing_; } + bool ready() const { return ready_; } + private: + bool open(); + static constexpr int BufferWords = 480; // 20 ms, three buffers + library silence buffer + static constexpr int BufferCount = 3; + I2S i2s_{OUTPUT}; + sound::ToneSamples samples_; + uint8_t volume_ = 80; + bool ready_ = false, running_ = false, playing_ = false, draining_ = false; + uint32_t drainedAt_ = 0; + int partial_ = 0; +}; +} diff --git a/src/platform/rp2040/WifiCompat.h b/src/platform/rp2040/WifiCompat.h new file mode 100644 index 00000000..3119cad2 --- /dev/null +++ b/src/platform/rp2040/WifiCompat.h @@ -0,0 +1,76 @@ +#pragma once + +#include +#include + +// Template seam keeps arduino-pico's differing API contract host-testable. +// No board includes: callers supply WiFi, IPAddress and the mode constants. + +namespace awtrix::platform::pico { +// Pico scanComplete() returns 0 both before any scan and for an empty result. +// Track the request lifecycle so an empty scan can finish and the next starts anew. +class WifiScan { + public: + template int poll(Wifi& wifi) { + if (!started_) { + wifi.scanNetworks(true); + started_ = true; + return -1; + } + return wifi.scanComplete(); + } + void consumed() { started_ = false; } + private: + bool started_ = false; +}; + +template +void configureStatic(Wifi& wifi, Address ip, Address gateway, Address subnet, + Address dns1, Address dns2) { + // Pico uses (ip, dns, gateway, subnet), unlike ESP32's five-argument overload. + wifi.config(ip, dns1, gateway, subnet); + wifi.setDNS(dns1, dns2); +} + +// arduino-pico's begin() does not block once mode() has been called, and calling it again restarts +// the association. Only start a new join once the previous one has had its full timeout. +// 32-bit like the Pico's millis(), so the subtraction survives its 49-day wrap. +inline bool joinDue(uint32_t nowMs, uint32_t lastJoinMs, bool joinedBefore, uint32_t timeoutMs) { + return !joinedBefore || nowMs - lastJoinMs >= timeoutMs; +} + +// arduino-pico joins through the CYW43 firmware, which picks the AP for the SSID. The Pico does not +// pin a BSSID: on an eero mesh, pinned joins (the "join" iovar) to the node next to the board were +// refused with "network not found", while plain joins to that same node succeeded. +template +void join(Wifi& wifi, Mode mode, const char* ssid, const char* password) { + // The pinned core's begin() changes _mode to STA even in AP_STA. Restore + // AP_STA after each attempt so the NEXT retry cannot tear down the portal. + wifi.mode(mode); + wifi.begin(ssid, password); + wifi.mode(mode); + // ESP32 runs with esp_wifi_set_ps(WIFI_PS_NONE). The CYW43 default (CYW43_PERFORMANCE_PM) is + // still power-save mode 2, which drops links on some mesh routers. begin() can re-initialise the + // radio, so apply it after every join. + wifi.noLowPowerMode(); +} + +// The pinned core's station-only begin() stops only the station, so the provisioning AP keeps +// running through a "paused" join. A second softAP() on a running AP fails, and its rollback tears +// the AP down: after the first failed retry the setup network was gone (softAPIP() unset). Stop the +// AP first so every start is a clean one. Returns whether the AP came up with an address. +template +bool startAp(Wifi& wifi, Mode apSta, const char* name) { + wifi.disconnectAP(); + wifi.mode(apSta); + wifi.softAP(name); + return static_cast(wifi.softAPIP()); +} + +// The core prints an unset address as "(IP unset)" where ESP32 prints "0.0.0.0". Callers read +// "0.0.0.0" as "no address"; the web UI switches to its Wi-Fi form on it in setup mode. +template +std::string addressText(const Address& ip) { + return ip ? std::string(ip.toString().c_str()) : std::string("0.0.0.0"); +} +} diff --git a/src/platform/rp2040/main_rp2040.cpp b/src/platform/rp2040/main_rp2040.cpp new file mode 100644 index 00000000..ec0acdbd --- /dev/null +++ b/src/platform/rp2040/main_rp2040.cpp @@ -0,0 +1,490 @@ +#include +#include +#include +#include "core/effects/EffectNoise.h" +#include "system/DeviceServices.h" +#include "system/DevicePageServices.h" +#include "system/ResetReason.h" +#include "platform/rp2040/TimeService.h" +#include "transport/net/DiscoveryService.h" +#include "transport/net/ArtnetService.h" +#include "transport/mqtt/MqttService.h" + +// Build-only measurement switch; production enables both UDP services. +#ifndef AWTRIX_PICO_UDP +#define AWTRIX_PICO_UDP 1 +#endif + +#include "AppConfig.h" +#include "platform/BuildFeatures.h" +#include "core/api/CapabilitiesJson.h" +#include "core/CoreEngine.h" +#include "core/FrameClock.h" +#include "core/apps/builtin/DateApp.h" +#include "core/apps/builtin/TimeApp.h" +#include "core/BuiltinCatalog.h" +#include "core/render/PaletteStore.h" +#include "core/render/PowerAnimator.h" +#include "core/render/BootScreen.h" +#include "core/render/ProvisioningScreen.h" +#include "core/render/TextRenderer.h" +#include "transport/net/NetworkService.h" +#include "transport/http/HttpApiServer.h" +#include "system/Log.h" +#include "platform/rp2040/RadioStartup.h" +#include "system/PeripheryHttp.h" +#include "system/PeripheryService.h" +#include "system/Watchdog.h" +#include "system/GalacticUnicornControls.h" +#include "core/render/RenderPipeline.h" +#include "hal/BoardRegistry.h" +#include "hal/GalacticUnicornBoard.h" +#include "media/AwtrixFontAdapter.h" +#include "media/DevicePageIcon.h" +#include "persistence/Filesystem.h" +#include "persistence/NvsSettings.h" +#include "persistence/PaletteFiles.h" +#include "persistence/SystemConfigApply.h" +#include "persistence/AppOrderStore.h" +#include +#if AWTRIX_FEATURE_SCRIPTING +#include "core/script/ScriptHeap.h" +#include "core/script/ScriptHost.h" +#include "core/script/ScriptService.h" +#include "core/script/ScriptSoundCommand.h" +#include "core/script/ScriptSourceService.h" +#include "persistence/ScriptStore.h" +#include "platform/rp2040/ScriptHeapRp2040.h" +#include "system/MonotonicClock.h" +#include "transport/ScriptMqttBridge.h" +#endif + +// Feature macros describe this build, not a claim that a runtime service exists. Scripting is on +// unless build_flags turn it off; the rest stay out. +static_assert(!AWTRIX_FEATURE_MP3 && + !AWTRIX_FEATURE_RADIO && !AWTRIX_FEATURE_OUTBOUND_TLS && + !AWTRIX_FEATURE_BROWSER_OTA, "Pico build must not enable unsupported services"); + +namespace { +using namespace awtrix; + +IBoard* board; +CoreEngine* engine; +Canvas* canvas; +RenderPipeline* pipeline; +sound::AudioRouter audioRouter; // Null sinks honestly report MP3/radio unavailable. +DeviceDisplay display; +DeviceSystem systemService; +AppRegistry apps; +EffectRegistry effects; +EffectRegistry overlays; +DevicePageClock pageClock; +DevicePageIcon pageIcon; +DevicePageIcon pageIconB; +platform::TimeService timeService; +bool networkWasConnected = false; +#if AWTRIX_PICO_UDP +DiscoveryService discovery; +ArtnetService artnet; +#endif +BuiltinCatalog builtins; +PeripheryService periphery; +GalacticUnicornControls controls; +NetworkService network; +HttpApiServer http; +MqttService mqtt; +std::unique_ptr mqttResolver; +render::PowerAnimator* powerAnimator; +int64_t nextFrameMs = 0; + +awtrix::DeviceConfig config; +bool storageReady = false; +bool settingsDirty = false; +int64_t lastSettingsSaveMs = 0; +#if AWTRIX_FEATURE_SCRIPTING +ScriptMqttBridge scriptMqtt; +ScriptStore scriptStore; +script::ScriptServices scriptSvc; +script::ScriptHost* scripts = nullptr; +#endif + +#if AWTRIX_FEATURE_SCRIPTING +// The same wiring as the ESP32's main.cpp, less what the Pico does not have: no HTTP requests +// (ScriptHttpWorker is ESP32-only) and no icons (ScriptIcon), so scripts that ask get "false". +// Every call into the VM is bounded by BerryVM::kInstructionLimit and returns to loop(), which +// feeds the watchdog. +void beginScripting() { + scriptSvc.mqtt = &scriptMqtt; + scriptSvc.storeSink = &scriptStore; + scriptSvc.effects = &effects; + scriptSvc.overlays = &overlays; + scriptSvc.notify = [](const std::string& json) { + DispatchDetail detail; + return engine->notify(json, static_cast(Source::Internal), detail) == + DispatchResult::Ok; + }; + scriptSvc.settings = [] { return &engine->state().settings(); }; + scriptSvc.runtime = [] { return &engine->state().runtime(); }; + scriptSvc.fonts[0] = &awtrixFont(FontId::Small); + scriptSvc.fonts[1] = &awtrixFont(FontId::Large); + scriptSvc.panel = canvas; + scriptSvc.setSettings = [](const std::string& json) { + Command c(CommandType::SetSettings); + c.payload = json; + c.source = Source::Internal; + return engine->submit(c); + }; + scriptSvc.setDisplayPower = [](bool on) { + Command c(CommandType::SetDisplay); + c.payload = on ? "{\"power\":true}" : "{\"power\":false}"; + c.source = Source::Internal; + return engine->submit(c); + }; + scriptSvc.sound = [](script::SoundAction a, const std::string& payload) { + Command c = scriptSoundCommand(a, payload); + return engine->submit(c); + }; + scriptSvc.soundPlaying = [] { return audioRouter.isPlaying(); }; + scriptSvc.soundSinks = [] { + const sound::Caps c = audioRouter.caps(); + return (c.buzzer ? 1 : 0) | (c.track ? 2 : 0) | (c.mp3 ? 4 : 0) | (c.radio ? 8 : 0); + }; + scriptSvc.rotateNext = [] { engine->scriptNextApp(); }; + scriptSvc.rotatePrevious = [] { engine->scriptPreviousApp(); }; + scriptSvc.showApp = [](const std::string& id) { return engine->scriptShowApp(id); }; + scriptSvc.holdRotation = [](bool p) { engine->setScriptRotationPaused(p); }; + scriptSvc.readSource = [](const std::string& n, std::string& out) { + return scriptStore.readSource(n, out); + }; + scriptSvc.readStore = [](const std::string& n, std::string& out) { + return scriptStore.readStore(n, out); + }; + scriptSvc.monotonicMs = [] { return monotonicMs(); }; + scriptSvc.log = [](const std::string& s) { logf("%s", s.c_str()); }; + scriptSvc.logDebug = [](const std::string& s) { logdbg("%s", s.c_str()); }; + scriptSvc.freeHeap = [] { return static_cast(rp2040.getFreeHeap()); }; + scriptSvc.maxAllocHeap = [] { return script::heap::picoLargestFreeBlock(); }; + { + const script::heap::Info h = script::heap::info(); + Serial.printf("scripts: Berry heap in %s, budget %u KB\n", h.name, + (unsigned)(h.budgetBytes / 1024)); + } + mqtt.setScriptingRunning(config.scriptingEnabled); + if (config.scriptingEnabled && storageReady) { + static script::ScriptHost host( + apps, scriptSvc, + [](const std::string& id) { engine->syncScriptApp(id); }, + [](const std::string& id) { engine->removeScriptApp(id); }); + scripts = &host; + scriptMqtt.begin([](const std::string& t, const std::string& p) { mqtt.publishRaw(t, p); }, + [](const std::string& t) { mqtt.subscribeRaw(t); }, + [](const std::string& t) { mqtt.unsubscribeRaw(t); }, + [](script::MqttMessage m) { scripts->pushMqttMessage(std::move(m)); }); + mqtt.setScriptBridge(&scriptMqtt); + static script::ScriptService scriptService( + host, [](const std::string& n, const std::string& s) { scriptStore.save(n, s); }, + [](const std::string& n) { scriptStore.remove(n); }); + engine->setScriptService(&scriptService); + http.setScripts( + &host, + [](const std::string& n, std::string& out) { return scriptStore.readSource(n, out); }, + [](const std::string& n, std::string& out) { return scriptStore.readStore(n, out); }); + // Modules first, so a script that imports one finds it registered. + for (const bool modulePass : {true, false}) { + scriptStore.loadAll( + [modulePass](const std::string& n, const std::string& src, const std::string& st) { + watchdog::feed(); + if (script::parseMeta(src).module != modulePass) return; + if (!scripts->set(n, src, st)) + Serial.printf("scripts: %s not restored (%s)\n", n.c_str(), + scripts->lastRefusal().c_str()); + }); + } + if (scripts->count()) { + scripts->staggerFirstLoops(script::kFirstLoopStaggerMs); + Serial.printf("scripts: %u restored\n", static_cast(scripts->count())); + } + } else if (storageReady) { + // No VM, but the sources stay listable and editable, as on the ESP32. + static script::ScriptSourceService sourceService( + [](const std::string& n, const std::string& s) { scriptStore.save(n, s); }, + [](const std::string& n) { scriptStore.remove(n); }); + engine->setScriptService(&sourceService); + http.setScripts( + nullptr, + [](const std::string& n, std::string& out) { return scriptStore.readSource(n, out); }, + [](const std::string& n, std::string& out) { return scriptStore.readStore(n, out); }, + [] { + std::vector out; + for (const std::string& n : scriptStore.names()) { + std::string src; + if (!scriptStore.readSource(n, src)) continue; + out.push_back({n, script::parseMeta(src)}); + } + return out; + }); + Serial.println("scripts: disabled by configuration (sources stay editable)"); + } + periphery.setButtonHook([](int btn, bool pressed) { + return scripts && scripts->handleButtonState(engine->currentAppId(), btn, pressed); + }); +} +#endif + +#if AWTRIX_FEATURE_SCRIPTING +// Rescue combo, as on the ESP32: hold A and C (left and right) for three seconds at power-on to +// turn scripting off and persist that, the way back from a script that takes the device down. +bool holdingRescueAtBoot() { + ButtonState buttons; + board->pollButtons(buttons); + if (!buttons.left || !buttons.right) return false; + const unsigned long start = millis(); + while (millis() - start < 3000) { + board->pollButtons(buttons); + if (!buttons.left || !buttons.right) return false; + delay(20); + } + canvas->clear(0); + text::drawText(*canvas, awtrixFont(), 0, 6, "NOSCR", 0xFF3000u); + board->show(*canvas); + if (config.scriptingEnabled) { + config.scriptingEnabled = false; + if (storageReady) config.save(); + } + logf("boot: LEFT+RIGHT held, scripting disabled (re-enable in the web UI)"); + delay(1500); + return true; +} +#endif + +bool holdingSelectAtBoot() { + ButtonState buttons; + board->pollButtons(buttons); + if (!buttons.select) return false; + const unsigned long start = millis(); + while (millis() - start < 1000) { + board->pollButtons(buttons); + if (!buttons.select) return false; + delay(20); + } + canvas->clear(0); + text::drawText(*canvas, awtrixFont(), 0, 6, "SETUP", 0xFFA000u); + board->show(*canvas); + Serial.println("boot: SELECT held, forcing provisioning AP (credentials kept)"); + return true; +} +} + +void setup() { + Serial.begin(115200); + awtrix::noise::reseed(get_rand_32()); + Serial.printf("reset: %s\n", platform::resetReasonName()); + // Never wait for a USB host: the panel must boot with power alone. + storageReady = awtrix::fs::begin(); + if (!storageReady) Serial.println("storage: mount failed; persistence unavailable"); + config = awtrix::galacticUnicornDefaults(); + if (storageReady) { + config.load(); + awtrix::palettefiles::install(); + } + awtrix::sysconfig::adoptFixedBoard(config); + logbuf::setVerbose(config.debugMode); + board = &awtrix::activeBoard(config); + board->begin(); + board->setMatrixLayout(config.matrixLayout()); + + canvas = new awtrix::Canvas(board->matrixWidth(), board->matrixHeight()); + systemService.setWakeButtonPin(27); + systemService.setDisplayOff([] { canvas->clear(0); board->show(*canvas); }); + engine = new awtrix::CoreEngine(audioRouter, display, systemService); + if (storageReady) { + awtrix::nvs::loadSettings(engine->state().settings()); + awtrix::apporder::load(*engine); + engine->setOrderPersist(awtrix::apporder::save); + engine->state().subscribe([](awtrix::StateEvent event) { + if (event == awtrix::StateEvent::SettingsChanged) settingsDirty = true; + }); + } + engine->state().runtime().tempDecimals = config.tempDecimals; + engine->setBatteryAvailable(false); + engine->setTemperatureAvailable(false); + engine->setHumidityAvailable(false); + engine->setPressureAvailable(false); + engine->setLightSensorAvailable(board->hasLightSensor()); + // Without scripting no script service is installed: the dispatcher returns Unavailable. + builtins.addTo(apps, effects, overlays); + engine->setEffectRegistry(&effects); + engine->setOverlayRegistry(&overlays); + + periphery.begin(*engine, *board, config); + powerAnimator = new render::PowerAnimator(board->matrixWidth(), board->matrixHeight()); + awtrix::RenderPipelineDeps deps; + deps.engine = engine; + deps.apps = &apps; + deps.audio = &audioRouter; + deps.effects = &effects; + deps.overlays = &overlays; + deps.clock = &pageClock; + deps.icons = &pageIcon; + deps.iconsB = &pageIconB; + deps.fonts[0] = &awtrix::awtrixFont(awtrix::FontId::Small); + deps.fonts[1] = &awtrix::awtrixFont(awtrix::FontId::Large); + pipeline = new awtrix::RenderPipeline(board->matrixWidth(), board->matrixHeight(), deps); + Serial.printf("boot: AWTRIX NG %s on %s (%dx%d); PIO/DMA panel\n", + AWTRIX_NG_VERSION, board->name(), board->matrixWidth(), board->matrixHeight()); + const int64_t bootT0 = time_us_64() / 1000; + auto showBootLogo = [bootT0] { + watchdog::feed(); // also the Wi-Fi join's wait callback: up to 3 x wifiConnectTimeout + render::drawBootLogo(*canvas, awtrixFont(), bootT0, time_us_64() / 1000); + board->show(*canvas); + }; +#if AWTRIX_FEATURE_SCRIPTING + // Before the watchdog is armed and long before the script host exists. + holdingRescueAtBoot(); +#endif + showBootLogo(); + const bool forceAp = holdingSelectAtBoot(); + platform::beginRadio(); + // Armed after the LittleFS mount (a first-boot format can take longer than the timeout) and the + // radio bring-up; everything from here on either returns quickly or feeds it. + watchdog::begin(); + network.setStatus(&engine->state().runtime().wifi); + network.setOnJoinedFromAp([] { systemService.reboot(); }); + network.begin(config, forceAp, showBootLogo); + static_cast(board)->beginAudio(); + audioRouter.setTone(board->toneSink()); + engine->state().subscribe([](StateEvent event) { + if (event != StateEvent::SettingsChanged) return; + const auto& s = engine->state().settings(); + audioRouter.setVolumes(s.buzzerVolume, s.dfplayerVolume, s.mp3Volume, s.radioVolume); + audioRouter.setMuted(!s.soundEnabled); + }); + engine->state().emit(StateEvent::SettingsChanged); + Serial.println(api::capabilitiesJson(effects.names(), effects.paletteNames(), + overlays.names(), audioRouter.caps(), platform::buildFeatures()).c_str()); + timeService.apply(config.tz, config.ntpServer); + networkWasConnected = network.isConnected(); + String mac = WiFi.macAddress(); + mac.replace(":", ""); + mac.toLowerCase(); + const uint16_t webPort = network.apMode() ? 80 : + (config.webPort > 0 ? static_cast(config.webPort) : 80); + http.begin(webPort, *engine, *board, *canvas, mac.c_str(), config, network.apMode()); + auto capabilities = std::make_shared(api::capabilitiesJson( + effects.names(), effects.paletteNames(), overlays.names(), audioRouter.caps(), + platform::buildFeatures())); + http.setCapabilitiesJson(capabilities); + mqtt.setCapabilitiesJson(std::move(capabilities)); + mqttResolver = net::makeHostResolver(); + mqtt.begin(*engine, *board, config, mac.c_str(), mac.c_str(), + config.hostname.empty() ? std::string("AWTRIX NG") : config.hostname, *mqttResolver); + display.setScreen(canvas); + display.setPublisher([](const std::string& topic, const std::string& payload) { + mqtt.publish(topic, payload, false); + }); + http.setOnConfigChanged([] { + // The panel size is fixed, so only mirror and rotate reach the board, and they apply live. + board->setMatrixLayout(config.matrixLayout()); + engine->state().runtime().tempDecimals = config.tempDecimals; + logbuf::setVerbose(config.debugMode); + timeService.apply(config.tz, config.ntpServer); + mqtt.applyHaConfig(config); + }); + http.setOnAssetsChanged([] { + pipeline->invalidateIcons(); + render::clearPaletteCache(); + }); +#if AWTRIX_FEATURE_SCRIPTING + beginScripting(); +#endif + periphery.setUid(mac.c_str()); + periphery.setButtonPost(postButton); +#if AWTRIX_PICO_UDP + if (networkWasConnected) discovery.begin(network.hostname(), config.webPort); +#endif + static_cast(board)->logRefreshProgress(); +} + +void loop() { + watchdog::feed(); + const int64_t nowMs = static_cast(time_us_64() / 1000); + network.tick(); + http.tick(); + const bool connected = network.isConnected(); + timeService.apply(config.tz, config.ntpServer, connected && !networkWasConnected); +#if AWTRIX_PICO_UDP + if (connected && !networkWasConnected) discovery.begin(network.hostname(), config.webPort); + if (connected && config.artnet) artnet.begin(); + else artnet.end(); + if (connected) discovery.tick(); +#endif + networkWasConnected = connected; + controls.tick(*engine, static_cast(board)->readInputs(), nowMs); + periphery.tick(nowMs); + mqtt.tick(); + if (settingsDirty && storageReady && !systemService.hasPending() && nowMs - lastSettingsSaveMs > 1500) { + awtrix::nvs::saveSettings(engine->state().settings()); + settingsDirty = false; + lastSettingsSaveMs = nowMs; + } + audioRouter.tick(nowMs); + if (nowMs < nextFrameMs) { delay(1); return; } + nextFrameMs = nowMs + awtrix::kFramePeriodMs; + { + static uint16_t frames = 0; + static int64_t windowStart = 0; + ++frames; + if (nowMs - windowStart >= 1000) { + engine->state().runtime().fps = frames; + frames = 0; + windowStart = nowMs; + } + } + engine->tick(nowMs); +#if AWTRIX_FEATURE_SCRIPTING + if (scripts) { + RenderCtx sctx; + sctx.settings = &engine->state().settings(); + sctx.runtime = &engine->state().runtime(); + sctx.font = &awtrixFont(FontId::Small); + sctx.fonts[0] = &awtrixFont(FontId::Small); + sctx.fonts[1] = &awtrixFont(FontId::Large); + pageClock.fill(sctx, nowMs); + scripts->tick(sctx, engine->currentAppId(), engine->incomingAppId()); + } + scriptStore.tick(nowMs); +#endif + const bool wakeNotif = engine->hasNotification() && engine->notifications().current().wakeup; + switch (powerAnimator->update(!engine->state().runtime().matrixOff || wakeNotif, nowMs)) { + case awtrix::render::PowerAnimator::Phase::Off: canvas->clear(0); break; + case awtrix::render::PowerAnimator::Phase::Out: powerAnimator->composeOut(*canvas); break; + default: + if (engine->state().runtime().moodlightMode) { + canvas->clear(engine->state().runtime().moodlightColor); + board->setBrightness(engine->state().runtime().moodlightBrightness); + } else if (network.apMode()) { + render::drawProvisioningScreen(*canvas, awtrixFont(), nowMs); +#if AWTRIX_PICO_UDP + } else if (artnet.tick(*canvas, nowMs)) { + // Art-Net owns this frame until the shared five-second hold expires. +#endif + } else { + pipeline->renderFrame(*canvas, nowMs); + } + powerAnimator->finish(*canvas); + break; + } + const auto& settings = engine->state().settings(); + board->applyColorGrade(awtrix::render::gradeFrom(settings)); + + board->show(*canvas); + + if (systemService.hasPending() && !powerAnimator->busy()) { + if (settingsDirty && storageReady && !systemService.resetsSettings()) + awtrix::nvs::saveSettings(engine->state().settings()); +#if AWTRIX_FEATURE_SCRIPTING + scriptStore.flush(); +#endif + systemService.runPending(); + } +} diff --git a/src/sim/SimHttpServer.cpp b/src/sim/SimHttpServer.cpp index bd457567..2fe49748 100644 --- a/src/sim/SimHttpServer.cpp +++ b/src/sim/SimHttpServer.cpp @@ -16,6 +16,7 @@ #include "core/CoreEngine.h" #include "core/SocProfile.h" #include "core/api/ApiRouter.h" +#include "platform/BuildFeatures.h" #include "core/api/JsonCoerce.h" #include "core/api/JsonStream.h" #include "core/api/JsonWriter.h" @@ -487,6 +488,15 @@ void SimHttpServer::Impl::handleSim(const httplib::Request& req, const std::stri } void SimHttpServer::Impl::route(const httplib::Request& req, httplib::Response& res) { + // The device's cap on a request body (HttpApiServer kMaxBodyBytes); uploads and script source + // are streamed there, so they are exempt here too. + constexpr std::size_t kMaxBodyBytes = 8192; + if (req.body.size() > kMaxBodyBytes && !req.is_multipart_form_data() && + !api::isRawBodyWrite(req.method, req.path)) { + const std::string msg = "body exceeds " + std::to_string(kMaxBodyBytes) + " bytes"; + sendError(res, 413, "payloadTooLarge", msg.c_str()); + return; + } const std::string& path = req.path; const api::MethodResolution resolved = api::resolveHttpMethod( req.method, path, @@ -586,7 +596,8 @@ bool SimHttpServer::Impl::serveCommand(const httplib::Request& req, const std::s httplib::Response& res) { Command cmd; api::HttpResult immediate; - switch (api::routeHttp(method, req.path, std::string(req.body), cmd, immediate)) { + switch (api::routeHttp(method, req.path, std::string(req.body), cmd, immediate, + platform::buildFeatures())) { case api::RouteOutcome::Respond: sendJson(res, immediate.status, immediate.body); return true; diff --git a/src/sim/main_sim.cpp b/src/sim/main_sim.cpp index ce320908..338e1adf 100644 --- a/src/sim/main_sim.cpp +++ b/src/sim/main_sim.cpp @@ -22,6 +22,7 @@ #include #include "AppConfig.h" +#include "platform/BuildFeatures.h" #include "core/CoreEngine.h" #include "core/FrameClock.h" #include "core/StrCase.h" @@ -314,10 +315,11 @@ int main(int argc, char** argv) { const std::string uid = "simulator"; if (!g_http.begin(port, *g_engine, g_board, *g_canvas, uid, cfg, webuiFile)) return 1; g_http.setOnConfigChanged([] { - // A layout change only takes effect live while the width still matches: a different width would + // A layout change only takes effect live while the size still matches: a different size would // mean rebuilding the canvas, the power animator and the pipeline, so that waits for a restart. const MatrixLayout layout = g_cfg.matrixLayout(); - if (layout.width() == g_board.matrixWidth()) g_board.setMatrixLayout(layout); + if (layout.width() == g_board.matrixWidth() && layout.height() == g_board.matrixHeight()) + g_board.setMatrixLayout(layout); logbuf::setVerbose(g_cfg.debugMode); }); { @@ -328,7 +330,8 @@ int main(int argc, char** argv) { g_engine->state().emit(StateEvent::SettingsChanged); std::string caps = api::capabilitiesJson( - g_effects.names(), g_effects.paletteNames(), g_overlays.names(), g_audio.caps()); + g_effects.names(), g_effects.paletteNames(), g_overlays.names(), g_audio.caps(), + platform::buildFeatures()); g_http.setCapabilitiesJson(caps); g_mqtt.setCapabilitiesJson(std::make_shared(caps)); } diff --git a/src/system/DevicePageServices.h b/src/system/DevicePageServices.h index 5a7e3f0e..83852d66 100644 --- a/src/system/DevicePageServices.h +++ b/src/system/DevicePageServices.h @@ -13,12 +13,15 @@ namespace awtrix { class DevicePageClock : public IPageClock { public: void fill(RenderCtx& ctx, int64_t nowMs) override { - ctx.nowMs = nowMs; const auto now = std::chrono::system_clock::now(); - const std::time_t t = std::chrono::system_clock::to_time_t(now); const int64_t epochMs = std::chrono::duration_cast( now.time_since_epoch()) .count(); + fillAt(ctx, nowMs, epochMs); + } + static void fillAt(RenderCtx& ctx, int64_t nowMs, int64_t epochMs) { + ctx.nowMs = nowMs; + const std::time_t t = static_cast(epochMs / 1000); std::tm tmv{}; localtime_r(&t, &tmv); ctx.hour = tmv.tm_hour; diff --git a/src/system/DeviceServices.h b/src/system/DeviceServices.h index ba764ae5..4ac75310 100644 --- a/src/system/DeviceServices.h +++ b/src/system/DeviceServices.h @@ -2,10 +2,16 @@ #include #include -#include +#include "platform/Preferences.h" #include +#if defined(AWTRIX_PLATFORM_RP2040) +#include +#include "system/PicoSleep.h" +#include "system/Watchdog.h" +#else #include #include +#endif #include @@ -49,11 +55,20 @@ class DeviceSystem : public ISystemService { void resetSettings() override { pending_ = Pending::ResetSettings; } // Only an RTC-capable GPIO survives deep sleep; anything else is stored as -1 so the device wakes - // on the timer alone rather than never. - void setWakeButtonPin(int pin) { wakePin_ = pins::isRtcWakePin(pin) ? pin : -1; } + // on the timer alone rather than never. The Pico's emulated sleep watches its Sleep key, GPIO27. + void setWakeButtonPin(int pin) { +#if defined(AWTRIX_PLATFORM_RP2040) + wakePin_ = pin == 27 ? pin : -1; +#else + wakePin_ = pins::isRtcWakePin(pin) ? pin : -1; +#endif + } void setDisplayOff(std::function fn) { displayOff_ = std::move(fn); } bool hasPending() const { return pending_ != Pending::None; } + bool resetsSettings() const { + return pending_ == Pending::FactoryReset || pending_ == Pending::ResetSettings; + } void runPending() { const Pending p = pending_; pending_ = Pending::None; @@ -61,10 +76,24 @@ class DeviceSystem : public ISystemService { case Pending::Reboot: // The delays give the pending HTTP response and MQTT publish time onto the wire. delay(200); - ESP.restart(); + restart(); break; case Pending::Sleep: if (displayOff_) displayOff_(); +#if defined(AWTRIX_PLATFORM_RP2040) + delay(200); + WiFi.aggressiveLowPowerMode(); + { + const auto pressed = [this] { return wakePin_ >= 0 && digitalRead(wakePin_) == LOW; }; + PicoSleep sleeper(time_us_64() / 1000, sleepMs_, pressed()); + while (!sleeper.wake(time_us_64() / 1000, pressed())) { + watchdog::feed(); + delay(10); + } + } + // Like ESP32 deep-sleep wake, begin a fresh application session. + restart(); +#else esp_sleep_enable_timer_wakeup(sleepMs_ * 1000ULL); if (wakePin_ >= 0) { const gpio_num_t g = static_cast(wakePin_); @@ -74,6 +103,7 @@ class DeviceSystem : public ISystemService { } delay(200); esp_deep_sleep_start(); +#endif break; case Pending::FactoryReset: // Three namespaces because older firmware wrote under different names; leaving one behind @@ -81,16 +111,23 @@ class DeviceSystem : public ISystemService { clearNvs("awtrix-ng"); clearNvs("awtrix-cfg"); clearNvs("awtrix"); +#if defined(AWTRIX_PLATFORM_RP2040) + watchdog::stop(); +#endif LittleFS.format(); +#if defined(AWTRIX_PLATFORM_RP2040) + WiFi.disconnect(true); +#else WiFi.disconnect(true, true); +#endif delay(300); - ESP.restart(); + restart(); break; case Pending::ResetSettings: clearNvs("awtrix-ng"); clearNvs("awtrix"); delay(200); - ESP.restart(); + restart(); break; case Pending::None: break; @@ -99,6 +136,13 @@ class DeviceSystem : public ISystemService { private: + static void restart() { +#if defined(AWTRIX_PLATFORM_RP2040) + rp2040.reboot(); +#else + ESP.restart(); +#endif + } static void clearNvs(const char* ns) { Preferences p; p.begin(ns, false); diff --git a/src/system/GalacticUnicornControls.h b/src/system/GalacticUnicornControls.h new file mode 100644 index 00000000..bf04ecce --- /dev/null +++ b/src/system/GalacticUnicornControls.h @@ -0,0 +1,41 @@ +#pragma once +#include "hal/GalacticUnicornDisplay.h" +#include "core/CoreEngine.h" + +namespace awtrix { +class GalacticUnicornControls { + public: + void tick(CoreEngine& engine, const std::array& pressed, int64_t nowMs) { + using namespace galactic; + for (size_t i = 3; i < Inputs.size(); ++i) { + if (!buttons_[i].update(pressed[i], nowMs)) continue; + const auto& s = engine.state().settings(); + Command c(CommandType::SetSettings); + switch (Inputs[i].action) { + case InputAction::Power: + c.type = CommandType::SetDisplay; + c.payload = engine.state().runtime().matrixOff ? "{\"power\":true}" : "{\"power\":false}"; + break; + case InputAction::BrightnessUp: + case InputAction::BrightnessDown: + c.payload = "{\"autoBrightness\":false,\"brightness\":" + + std::to_string(stepClamped(s.brightness, + Inputs[i].action == InputAction::BrightnessUp ? 10 : -10, 255)) + "}"; + break; + case InputAction::VolumeUp: + case InputAction::VolumeDown: + // The onboard I2S tone channel uses NG's buzzerVolume setting. + c.payload = "{\"buzzerVolume\":" + std::to_string(stepClamped(s.buzzerVolume, + Inputs[i].action == InputAction::VolumeUp ? 5 : -5, 100)) + "}"; + break; + default: continue; // D deliberately unmapped; A/B/C use PeripheryService. + } + // Exactly the dispatcher used by HTTP/MQTT, with the same StateEvents. + // Inline execution also makes simultaneous buttons compose deterministically. + engine.execute(c); + } + } + private: + std::array buttons_{}; +}; +} diff --git a/src/system/MonotonicClock.h b/src/system/MonotonicClock.h index b4da17b5..df8385e8 100644 --- a/src/system/MonotonicClock.h +++ b/src/system/MonotonicClock.h @@ -2,12 +2,22 @@ #include +#if defined(AWTRIX_PLATFORM_RP2040) +#include +#else #include +#endif namespace awtrix { // Milliseconds since boot in 64 bits. Unlike millis() this never wraps, so timestamps stored in the // engine stay comparable past the 49-day mark. -inline int64_t monotonicMs() { return esp_timer_get_time() / 1000; } +inline int64_t monotonicMs() { +#if defined(AWTRIX_PLATFORM_RP2040) + return time_us_64() / 1000; +#else + return esp_timer_get_time() / 1000; +#endif +} } diff --git a/src/system/PeripheryHttp.h b/src/system/PeripheryHttp.h new file mode 100644 index 00000000..384c1cc1 --- /dev/null +++ b/src/system/PeripheryHttp.h @@ -0,0 +1,27 @@ +#pragma once +#include +#include +#include +#include + +#include "core/api/ButtonEventJson.h" + +namespace awtrix { +// ESP32 and Pico transport adapter for the buttonCallback webhook. The shared periphery itself has +// no network dependency. It runs in the loop, so a dead listener may cost at most 300 ms per wait. +inline void postButton(const std::string& url, const char* btn, bool state, const std::string& uid) { + WiFiClient wc; + HTTPClient http; +#if defined(AWTRIX_PLATFORM_RP2040) + // arduino-pico's HTTPClient has no connect timeout; the client's own timeout bounds the connect. + wc.setTimeout(300); +#else + http.setConnectTimeout(300); +#endif + http.setTimeout(300); + if (!http.begin(wc, url.c_str())) return; + http.addHeader("Content-Type", "application/json"); + http.POST(String(api::buttonEventJson(btn, state, uid).c_str())); + http.end(); +} +} diff --git a/src/system/PeripheryService.cpp b/src/system/PeripheryService.cpp index e17d04ac..6ecc41ee 100644 --- a/src/system/PeripheryService.cpp +++ b/src/system/PeripheryService.cpp @@ -1,8 +1,5 @@ #include "system/PeripheryService.h" -#include -#include -#include #include @@ -15,20 +12,6 @@ namespace { constexpr long kSensorIntervalMs = 2000; constexpr long kLdrIntervalMs = 100; -// Fires from the main loop with very short timeouts: a callback host that is down or slow would -// otherwise freeze the display for the length of a TCP connect. -void postButton(const std::string& url, const char* btn, bool state, const std::string& uid) { - WiFiClient wc; - HTTPClient http; - http.setConnectTimeout(300); - http.setTimeout(300); - if (!http.begin(wc, url.c_str())) return; - http.addHeader("Content-Type", "application/json"); - String body = String("{\"button\":\"") + btn + "\",\"state\":" + (state ? "true" : "false") + - ",\"uid\":\"" + uid.c_str() + "\"}"; - http.POST(body); - http.end(); -} } @@ -96,10 +79,10 @@ void PeripheryService::tick(int64_t nowMs) { engine_->state().runtime().buttons = {cur.left, cur.select, cur.right}; engine_->state().emit(StateEvent::ButtonsChanged); } - if (!cfg_->buttonCallback.empty()) { - if (cur.left != prev_.left) postButton(cfg_->buttonCallback, "left", cur.left, uid_); - if (cur.select != prev_.select) postButton(cfg_->buttonCallback, "middle", cur.select, uid_); - if (cur.right != prev_.right) postButton(cfg_->buttonCallback, "right", cur.right, uid_); + if (buttonPost_ && !cfg_->buttonCallback.empty()) { + if (cur.left != prev_.left) buttonPost_(cfg_->buttonCallback, "left", cur.left, uid_); + if (cur.select != prev_.select) buttonPost_(cfg_->buttonCallback, "middle", cur.select, uid_); + if (cur.right != prev_.right) buttonPost_(cfg_->buttonCallback, "right", cur.right, uid_); } prev_ = cur; diff --git a/src/system/PeripheryService.h b/src/system/PeripheryService.h index 301cb055..e7dcdfc7 100644 --- a/src/system/PeripheryService.h +++ b/src/system/PeripheryService.h @@ -19,6 +19,8 @@ class PeripheryService { public: void begin(CoreEngine& engine, IBoard& board, const DeviceConfig& cfg); void setUid(const std::string& uid) { uid_ = uid; } + using ButtonPost = std::function; + void setButtonPost(ButtonPost post) { buttonPost_ = std::move(post); } void setButtonHook(std::function hook) { buttonHook_ = std::move(hook); } void tick(int64_t nowMs); @@ -30,6 +32,7 @@ class PeripheryService { const DeviceConfig* cfg_ = nullptr; std::function buttonHook_; std::string uid_; + ButtonPost buttonPost_; // raw_ is the pin as sampled, stable_ the debounced value, prev_ the debounced value from the // previous tick that edges are detected against. ButtonState prev_{}; diff --git a/src/system/PicoResetReason.h b/src/system/PicoResetReason.h new file mode 100644 index 00000000..195f3c18 --- /dev/null +++ b/src/system/PicoResetReason.h @@ -0,0 +1,17 @@ +#pragma once +namespace awtrix::platform { +// Use symbolic framework values, not enum ordinals. Debug/RUN resets map to +// the existing external value rather than adding a platform-only API string. +template +constexpr const char* picoResetReasonName(Reason reason) { + switch (reason) { + case Reason::PWRON_RESET: return "poweron"; + case Reason::RUN_PIN_RESET: return "external"; + case Reason::SOFT_RESET: return "software"; + case Reason::WDT_RESET: return "watchdog"; + case Reason::DEBUG_RESET: return "external"; + case Reason::BROWNOUT_RESET: return "brownout"; + default: return "unknown"; + } +} +} diff --git a/src/system/PicoSleep.h b/src/system/PicoSleep.h new file mode 100644 index 00000000..d568d934 --- /dev/null +++ b/src/system/PicoSleep.h @@ -0,0 +1,19 @@ +#pragma once +#include + +namespace awtrix { +// Elapsed arithmetic avoids deadline overflow. A held sleep key must first be +// released, so the press that requested sleep cannot immediately wake it. +class PicoSleep { + public: + PicoSleep(uint64_t startMs, uint64_t durationMs, bool pressed) + : start_(startMs), duration_(durationMs), released_(!pressed) {} + bool wake(uint64_t nowMs, bool pressed) { + if (!pressed) released_ = true; + return nowMs - start_ >= duration_ || (released_ && pressed); + } + private: + uint64_t start_, duration_; + bool released_; +}; +} diff --git a/src/system/ResetReason.h b/src/system/ResetReason.h new file mode 100644 index 00000000..d7448c9c --- /dev/null +++ b/src/system/ResetReason.h @@ -0,0 +1,32 @@ +#pragma once +#if defined(AWTRIX_PLATFORM_RP2040) +#include +#include "system/PicoResetReason.h" +#else +#include +#endif + +namespace awtrix::platform { +inline const char* resetReasonName() { +#if defined(AWTRIX_PLATFORM_RP2040) + // Read once, at the first call in setup(): arming the watchdog rewrites the scratch register the + // framework reads, after which every later reboot would read back as "watchdog". + static const char* const name = picoResetReasonName(rp2040.getResetReason()); + return name; +#else + switch (esp_reset_reason()) { + case ESP_RST_POWERON: return "poweron"; + case ESP_RST_EXT: return "external"; + case ESP_RST_SW: return "software"; + case ESP_RST_PANIC: return "panic"; + case ESP_RST_INT_WDT: return "interruptWatchdog"; + case ESP_RST_TASK_WDT: return "taskWatchdog"; + case ESP_RST_WDT: return "watchdog"; + case ESP_RST_DEEPSLEEP: return "deepSleep"; + case ESP_RST_BROWNOUT: return "brownout"; + case ESP_RST_SDIO: return "sdio"; + default: return "unknown"; + } +#endif +} +} diff --git a/src/system/TimeConfig.h b/src/system/TimeConfig.h new file mode 100644 index 00000000..e652c944 --- /dev/null +++ b/src/system/TimeConfig.h @@ -0,0 +1,25 @@ +#pragma once +#include + +namespace awtrix { +// Commit before invoking the platform adapter: server().c_str() remains owned +// for SNTP implementations that retain the hostname rather than copying it. +class TimeConfig { + public: + bool needsUpdate(const std::string& tz, const std::string& server, bool force = false) const { + return !applied_ || force || tz != tz_ || server != server_; + } + bool update(const std::string& tz, const std::string& server, bool force = false) { + if (!needsUpdate(tz, server, force)) return false; + tz_ = tz; + server_ = server; + applied_ = true; + return true; + } + const std::string& timezone() const { return tz_; } + const std::string& server() const { return server_; } + private: + bool applied_ = false; + std::string tz_, server_; +}; +} diff --git a/src/system/Watchdog.h b/src/system/Watchdog.h new file mode 100644 index 00000000..983fdce3 --- /dev/null +++ b/src/system/Watchdog.h @@ -0,0 +1,25 @@ +#pragma once +#include +#if defined(AWTRIX_PLATFORM_RP2040) +#include +#include +#include +#endif + +namespace awtrix::watchdog { +// The Pico has no task watchdog: without this a hang or hard fault freezes the panel until someone +// power-cycles it, where an ESP32 reboots itself. ESP32 and the simulator keep their own behaviour, +// so every call below is a no-op there. +constexpr uint32_t kTimeoutMs = 8000; // RP2040 maximum is ~8.3 s +#if defined(AWTRIX_PLATFORM_RP2040) +inline void begin() { rp2040.wdt_begin(kTimeoutMs); } +inline void feed() { rp2040.wdt_reset(); } +// For work that ends in a reboot anyway and can outlast the timeout (formatting LittleFS). A later +// rp2040.reboot() re-arms the hardware itself, and still reads back as "software". +inline void stop() { hw_clear_bits(&watchdog_hw->ctrl, WATCHDOG_CTRL_ENABLE_BITS); } +#else +inline void begin() {} +inline void feed() {} +inline void stop() {} +#endif +} diff --git a/src/transport/DeviceStateJson.cpp b/src/transport/DeviceStateJson.cpp index 84418f0b..825c2260 100644 --- a/src/transport/DeviceStateJson.cpp +++ b/src/transport/DeviceStateJson.cpp @@ -1,10 +1,17 @@ #include "transport/DeviceStateJson.h" #include +#if defined(AWTRIX_PLATFORM_RP2040) +#include +#include +#include "platform/rp2040/WifiCompat.h" +#else #include +#endif #include -#include +#include "system/ResetReason.h" +#include #include #include "AppConfig.h" @@ -12,7 +19,9 @@ #include "core/SocProfile.h" #include "core/render/Color.h" #include "hal/IBoard.h" +#if !defined(AWTRIX_PLATFORM_RP2040) #include "system/HeapCaps.h" +#endif #include "system/MonotonicClock.h" #include "transport/http/UpdateImage.h" @@ -21,22 +30,6 @@ namespace awtrix { namespace { const char* kBoardType = "awtrixng"; -const char* resetReasonName() { - switch (esp_reset_reason()) { - case ESP_RST_POWERON: return "poweron"; - case ESP_RST_EXT: return "external"; - case ESP_RST_SW: return "software"; - case ESP_RST_PANIC: return "panic"; - case ESP_RST_INT_WDT: return "interruptWatchdog"; - case ESP_RST_TASK_WDT: return "taskWatchdog"; - case ESP_RST_WDT: return "watchdog"; - case ESP_RST_DEEPSLEEP: return "deepSleep"; - case ESP_RST_BROWNOUT: return "brownout"; - case ESP_RST_SDIO: return "sdio"; - default: return "unknown"; - } -} - } std::string buildDeviceStateJson(CoreEngine& engine, IBoard& board, const std::string& uid, @@ -46,19 +39,37 @@ std::string buildDeviceStateJson(CoreEngine& engine, IBoard& board, const std::s facts.boardType = kBoardType; facts.soc = pins::activeProfile().id; facts.updateImage = kUpdateImageName; +#if defined(AWTRIX_PLATFORM_RP2040) + facts.ipAddress = platform::pico::addressText(WiFi.localIP()); +#else facts.ipAddress = std::string(WiFi.localIP().toString().c_str()); +#endif const char* hn = WiFi.getHostname(); facts.hostname = hn ? hn : ""; facts.wifiRssi = WiFi.RSSI(); facts.uptimeSeconds = static_cast(monotonicMs() / 1000); // Internal RAM only. PSRAM is reported separately, because it is the internal heap that runs out // first and it is the number worth watching. +#if defined(AWTRIX_PLATFORM_RP2040) + facts.freeHeapBytes = rp2040.getFreeHeap(); + // arduino-pico has no low-water API; this low water is sampled by device requests. + static uint32_t sampledMin = facts.freeHeapBytes; + sampledMin = std::min(sampledMin, facts.freeHeapBytes); + facts.minFreeHeapBytes = sampledMin; + // newlib cannot walk its free list, so this is the block at the top of the heap: the free chunk + // malloc keeps there plus what sbrk has not handed out yet, up to the stack. Holes freed further + // down are not counted, so the true largest block is at least this, less malloc's page rounding. + const ptrdiff_t unclaimed = &__StackLimit - static_cast(sbrk(0)); + facts.largestFreeBlockBytes = static_cast(mallinfo().keepcost) + + static_cast(std::max(unclaimed, 0)); +#else facts.freeHeapBytes = heap_caps_get_free_size(kGuardHeapCaps); facts.minFreeHeapBytes = heap_caps_get_minimum_free_size(kGuardHeapCaps); facts.largestFreeBlockBytes = heap_caps_get_largest_free_block(kGuardHeapCaps); facts.psramTotalBytes = heap_caps_get_total_size(MALLOC_CAP_SPIRAM); facts.psramFreeBytes = heap_caps_get_free_size(MALLOC_CAP_SPIRAM); - facts.resetReason = resetReasonName(); +#endif + facts.resetReason = platform::resetReasonName(); facts.hasBattery = board.hasBattery(); facts.hasLightSensor = board.hasLightSensor(); facts.hasTemperature = sensors.hasSensor(); diff --git a/src/transport/http/HttpApiServer.cpp b/src/transport/http/HttpApiServer.cpp index d8a80302..de039a32 100644 --- a/src/transport/http/HttpApiServer.cpp +++ b/src/transport/http/HttpApiServer.cpp @@ -1,14 +1,22 @@ #include "transport/http/HttpApiServer.h" +#include "platform/BuildFeatures.h" #include +#if AWTRIX_FEATURE_BROWSER_OTA #include +#endif #include +#if !defined(AWTRIX_PLATFORM_RP2040) #include #include +#include "system/HeapCaps.h" // Included by name rather than left to the Arduino headers: the image marker below reads // CONFIG_SPIRAM_MODE_QUAD out of it, and an absent macro reads as octal - which is the wrong // answer to be arriving at by accident. #include +#else +#include +#endif #include @@ -25,22 +33,27 @@ #include "core/backup/RestoreApplier.h" #include "core/payload/PayloadParser.h" #include "core/render/Canvas.h" -#include "core/script/ScriptConfig.h" #include "core/script/ScriptHeap.h" +#if AWTRIX_FEATURE_SCRIPTING +#include "core/script/ScriptConfig.h" #include "core/script/ScriptHost.h" #include "core/script/ScriptServices.h" +#endif #include "hal/IBoard.h" #include "media/AssetFile.h" #include "persistence/DeviceConfig.h" #include "persistence/Filesystem.h" -#include "persistence/FsRestoreSink.h" +#include "persistence/LittleFsRestoreSink.h" #include "persistence/IconOriginsStore.h" #include "persistence/SystemConfigApply.h" +#if !defined(AWTRIX_PLATFORM_RP2040) #include "persistence/VfsFile.h" -#include "system/HeapCaps.h" +#endif #include "system/HeapProbe.h" +#include "transport/http/RequestHead.h" #include "transport/http/UpdateImage.h" #include "system/Log.h" +#include "system/Watchdog.h" #include "transport/DeviceStateJson.h" #include "transport/http/WebUiAsset.h" @@ -72,9 +85,172 @@ String storageTail() { return String("],\"usedBytes\":") + used + ",\"totalBytes\":" + total + "}"; } +#if defined(AWTRIX_PLATFORM_RP2040) +// A connection whose request head is read off the socket ahead of WebServer's parser. The parser +// then reads that head back from here, and the rest of the request from the socket. lwIP keeps +// each TCP segment in its own buffer and WiFiClient::peekBytes() sees only the first, so a head +// that spans segments could not be checked in place. +class HeadClient : public WiFiClient { + public: + enum class Head { Waiting, Ready, TooLong }; + + HeadClient(const WiFiClient& accepted, char* buffer, size_t capacity) + : WiFiClient(accepted), buf_(buffer), cap_(capacity) {} + + // Moves what has arrived into the buffer. Ready once the head is in, up to its blank line, and + // a body small enough to be read in one piece has arrived as well; TooLong if the buffer fills + // before the head ends. + Head gather() { + if (!headEnd_) { + const int more = WiFiClient::available(); + if (more > 0 && len_ < cap_) + len_ += std::max(0, WiFiClient::read(reinterpret_cast(buf_ + len_), + std::min(cap_ - len_, static_cast(more)))); + headEnd_ = requesthead::end(buf_, len_, scanned_); + scanned_ = len_; + if (!headEnd_) return len_ == cap_ ? Head::TooLong : Head::Waiting; + } + const long body = requesthead::contentLength(buf_, headEnd_); + if (body <= 0 || body > kArenaBodyThresholdBytes) return Head::Ready; + const size_t have = len_ - headEnd_ + static_cast(std::max(0, WiFiClient::available())); + return have >= static_cast(body) ? Head::Ready : Head::Waiting; + } + + int available() override { return static_cast(pending()) + WiFiClient::available(); } + int read() override { + return pending() ? static_cast(buf_[pos_++]) : WiFiClient::read(); + } + int read(uint8_t* dst, size_t size) override { + const size_t n = std::min(size, pending()); + if (!n) return WiFiClient::read(dst, size); + memcpy(dst, buf_ + pos_, n); + pos_ += n; + return static_cast(n); + } + int peek() override { return pending() ? static_cast(buf_[pos_]) : WiFiClient::peek(); } + size_t peekBytes(uint8_t* dst, size_t size) override { + const size_t n = std::min(size, pending()); + if (!n) return WiFiClient::peekBytes(dst, size); + memcpy(dst, buf_ + pos_, n); + return n; + } + + private: + size_t pending() const { return len_ - pos_; } + + char* buf_; + size_t cap_; + size_t len_ = 0; + size_t pos_ = 0; + size_t scanned_ = 0; + size_t headEnd_ = 0; +}; +#endif + class RawWebServer : public WebServer { public: using WebServer::WebServer; +#if defined(AWTRIX_PLATFORM_RP2040) + void setRawReadTimeout(unsigned long ms) { client().Stream::setTimeout(ms); } + + // WebServer parses the request line and headers, and reads a small body, with blocking reads + // that wait up to 5 s per byte, so a client trickling them could hold loop() past the 8 s + // watchdog. The parser runs only once HeadClient holds the whole head, up to its blank line, + // and, for a body small enough to be read in one piece, the whole body has arrived too. A head + // longer than kHeadBytes is answered 431 and closed; a client that has not got that far within + // HTTP_MAX_DATA_WAIT is dropped, as a silent one is. Larger bodies arrive through the raw and + // upload callbacks, which feed the watchdog. WebServer would parse a request in the same pass + // that accepts it, before this check could run, so a connection is accepted here and handed to + // WebServer on a later pass. WebServer only ever sees HeadClients: it creates a client itself + // only on a pass that starts without one, and this override never lets it do that. + void handleClient() override { + if (_currentStatus == HC_NONE) { + WiFiClient accepted = getServer().accept(); + if (!accepted) return; + delete _currentClient; + _currentClient = new HeadClient(accepted, head_, sizeof(head_)); + _currentStatus = HC_WAIT_READ; + _statusChange = millis(); + return; + } + if (_currentStatus == HC_WAIT_READ && _currentClient) { + switch (static_cast(_currentClient)->gather()) { + case HeadClient::Head::Ready: + break; + case HeadClient::Head::TooLong: + refuse(kHeadTooLong, sizeof(kHeadTooLong) - 1); + return; + case HeadClient::Head::Waiting: + // WebServer applies the same timeout to a client that has sent nothing yet. + if (!_currentClient->available()) break; + if (millis() - _statusChange > HTTP_MAX_DATA_WAIT) refuse(nullptr, 0); + return; + } + } + WebServer::handleClient(); + } + + protected: + // Every response byte, headers included, goes through these two. A plain write() keeps going + // for as long as a slow reader drains a little every few seconds, which can outlast the + // watchdog; write only what the send buffer has room for and feed the watchdog while waiting. + // A client that takes nothing for HTTP_MAX_SEND_WAIT is given up on and its connection closed. + size_t _currentClientWrite(const char* b, size_t l) override { return writeFed(b, l); } + size_t _currentClientWrite_P(PGM_P b, size_t l) override { return writeFed(b, l); } + + private: + static constexpr size_t kHeadBytes = 2048; + static constexpr size_t kWriteSliceBytes = 1460; // one TCP segment + static constexpr char kHeadTooLong[] = + "HTTP/1.1 431 Request Header Fields Too Large\r\nConnection: close\r\n" + "Content-Length: 0\r\n\r\n"; + + // One request is handled at a time, so the connection being read owns this buffer. + char head_[kHeadBytes]; + + // Answers with reply, if any, and closes the connection. What the client has already sent is + // read and dropped first: closing with it unread would reset the connection and lose the reply. + // Released here as well, since its unread bytes would bring it straight back to gather(). + void refuse(const char* reply, size_t length) { + uint8_t sink[256]; + for (int left = _currentClient->available(); left > 0;) { + const int n = _currentClient->read(sink, std::min(sizeof(sink), static_cast(left))); + if (n <= 0) break; + left -= n; + } + if (reply) writeFed(reply, length); + _currentClient->stop(); + delete _currentClient; + _currentClient = nullptr; + _currentStatus = HC_NONE; + } + + size_t writeFed(const char* b, size_t l) { + size_t done = 0; + unsigned long progress = millis(); + while (done < l && _currentClient->connected()) { + watchdog::feed(); + const int room = _currentClient->availableForWrite(); + if (room > 0) { + const size_t n = _currentClient->write( + b + done, std::min({l - done, static_cast(room), kWriteSliceBytes})); + if (n) { + done += n; + progress = millis(); + continue; + } + } + if (millis() - progress > HTTP_MAX_SEND_WAIT) { + // Closed, not just left: a response goes out in many writes (a file 1 KB at a time), and + // each would otherwise wait out its own HTTP_MAX_SEND_WAIT. Once closed, they return at once. + _currentClient->stop(); + break; + } + delay(1); + } + return done; + } +#else void setRawReadTimeout(unsigned long ms) { _currentClient.Stream::setTimeout(ms); } // WebServer serves one client at a time. Browsers like to open a socket and send nothing, which @@ -86,8 +262,29 @@ class RawWebServer : public WebServer { } WebServer::handleClient(); } +#endif }; +#if defined(AWTRIX_PLATFORM_RP2040) +// arduino-pico's lwIP has five TCP pcbs, and ClientContext drops every accepted connection to +// TCP_PRIO_MIN while the listener stays at TCP_PRIO_NORMAL. A SYN that finds the pool full then +// makes lwIP abort the oldest accepted connection to make room, so a browser opening eight sockets +// at once saw two or three of them reset mid-request. At its clients' priority the listener can no +// longer evict them: the extra SYN is dropped, and the client's retransmit gets in once a request +// has been answered. +struct ListenPcb : WiFiServer { + static tcp_pcb* of(WiFiServer& server) { return server.*(&ListenPcb::_listen_pcb); } +}; + +// lwIP reports that dropped SYN as accept(NULL, ERR_MEM), and WiFiServer would wrap the NULL pcb in +// a client and fault. Only real connections reach it. +tcp_accept_fn serverAccept = nullptr; +err_t acceptConnected(void* arg, tcp_pcb* pcb, err_t err) { + if (pcb == nullptr || err != ERR_OK) return ERR_MEM; + return serverAccept(arg, pcb, err); +} +#endif + const char* methodName(HTTPMethod m) { switch (m) { case HTTP_GET: return "GET"; @@ -116,10 +313,18 @@ class HttpApiServer::BodyHandler : public RequestHandler { bool canRaw(String) override { return srv_.server_->clientContentLength() > kArenaBodyThresholdBytes; } - void raw(WebServer& server, String uri, HTTPRaw& raw) override { +#if defined(AWTRIX_PLATFORM_RP2040) + // Pico's parser invokes the newer overloads; the base implementations do + // not forward to the legacy hooks, even though those remain in the API. + bool canHandle(HttpServerBase&, HTTPMethod m, String uri) override { + return canHandle(m, uri); + } + bool canRaw(HttpServerBase&, String uri) override { return canRaw(uri); } +#endif + void raw(HttpServerBase& server, String uri, HTTPRaw& raw) override { srv_.collectBody(server, uri, raw); } - bool handle(WebServer&, HTTPMethod, String) override { + bool handle(HttpServerBase&, HTTPMethod, String) override { srv_.dispatch(); return true; } @@ -130,6 +335,7 @@ class HttpApiServer::BodyHandler : public RequestHandler { namespace { +#if AWTRIX_FEATURE_BROWSER_OTA // ESP image header: byte 0 is the magic, bytes 12 and 13 hold the chip id, little endian. An app // image carries an esp_app_desc_t at offset 32; a usb-*.bin install image starts with the // bootloader, which has none - and on the ESP32, whose bootloader sits at 0x1000, with erased @@ -194,6 +400,16 @@ const char* chipIdName(uint16_t id) { } } +#endif + +std::size_t bodyCopyRoom() { +#if defined(AWTRIX_PLATFORM_RP2040) + return rp2040.getFreeHeap(); +#else + return heap_caps_get_largest_free_block(scriptBufferHeapCaps()); +#endif +} + const char* mimeFor(const std::string& path) { const size_t dot = path.rfind('.'); const std::string ext = (dot == std::string::npos) ? "" : path.substr(dot); @@ -205,40 +421,7 @@ const char* mimeFor(const std::string& path) { return "application/octet-stream"; } -class LittleFsRestoreSink : public backup::FsRestoreSink { - public: - using backup::FsRestoreSink::FsRestoreSink; - bool beginFile(const std::string& path, std::string& err) override { - const String p(path.c_str()); - const int slash = p.lastIndexOf('/'); - if (slash > 0) { - const String dir = p.substring(0, slash); - if (!LittleFS.exists(dir)) LittleFS.mkdir(dir); - } - file_ = LittleFS.open(p, "w"); - curPath_ = path; - if (!file_) { - err = "could not open for writing"; - return false; - } - return true; - } - bool writeFile(const uint8_t* data, std::size_t n) override { - return file_ && file_.write(data, n) == n; - } - bool endFile() override { - if (file_) file_.close(); - return true; - } - void abortFile() override { - if (file_) file_.close(); - if (!curPath_.empty()) LittleFS.remove(String(curPath_.c_str())); - } - - private: - File file_; - std::string curPath_; -}; +using LittleFsRestoreSink = backup::LittleFsRestoreSink; } void HttpApiServer::begin(uint16_t port, CoreEngine& engine, IBoard& board, Canvas& screen, @@ -252,7 +435,7 @@ void HttpApiServer::begin(uint16_t port, CoreEngine& engine, IBoard& board, Canv server_ = new RawWebServer(port); static const char* kCollectHeaders[] = {"If-None-Match", "Content-Type", api::kMethodOverrideHeader}; - server_->collectHeaders(kCollectHeaders, 3); + server_->collectHeaders(static_cast(kCollectHeaders), std::size_t{3}); // Each pair is (completion handler, per-chunk upload handler). The upload handler runs many times // while the body streams in and cannot answer the client; only the completion handler can. server_->on( @@ -271,11 +454,27 @@ void HttpApiServer::begin(uint16_t port, CoreEngine& engine, IBoard& board, Canv if (!bodyArena_.init(kMaxBodyBytes)) logf("http: body arena allocation failed; body-carrying requests will be refused"); server_->begin(); +#if defined(AWTRIX_PLATFORM_RP2040) + if (tcp_pcb* listener = ListenPcb::of(server_->getServer())) { + tcp_setprio(listener, TCP_PRIO_MIN); + serverAccept = reinterpret_cast(listener)->accept; + tcp_accept(listener, acceptConnected); + } +#endif +} + +namespace { +std::string uploadPartPath(const std::string& path) { return path + ".part"; } } // Runs once per chunk of the multipart body. Failures are only recorded in the upload* flags here; // handleFileUploadDone turns them into a status code afterwards. void HttpApiServer::handleFileUpload() { + // Every chunk arrives inside one loop() pass, refused uploads included (a disabled route still + // has to read the whole body before it can answer); a slow client must not trip the watchdog. + watchdog::feed(); + if (featurePolicy(platform::buildFeatures(), std::string(server_->uri().c_str())) == + DispatchResult::Unavailable) return; HTTPUpload& up = server_->upload(); if (up.status == UPLOAD_FILE_START) { if (uploadFile_) uploadFile_.close(); @@ -308,7 +507,9 @@ void HttpApiServer::handleFileUpload() { uploadPath_ = fn.c_str(); uploadContentOk_ = true; uploadContentChecked_ = false; - uploadFile_ = LittleFS.open(fn, "w"); + // Written beside the target and renamed over it at the end, so a refused or broken upload + // leaves the file it would have replaced untouched (the simulator checks before it writes). + uploadFile_ = LittleFS.open(uploadPartPath(uploadPath_).c_str(), "w"); uploadWriteOk_ = static_cast(uploadFile_); } else if (up.status == UPLOAD_FILE_WRITE) { // Sniff the first chunk only, which is enough to catch a file dropped into the wrong folder. @@ -324,15 +525,25 @@ void HttpApiServer::handleFileUpload() { } } else if (up.status == UPLOAD_FILE_END) { if (uploadFile_) uploadFile_.close(); - if ((!uploadContentOk_ || !uploadWriteOk_) && !uploadPath_.empty()) - LittleFS.remove(uploadPath_.c_str()); + if (uploadPath_.empty()) return; + const std::string part = uploadPartPath(uploadPath_); + // LittleFS rename replaces an existing target in one step, so the old file stays readable + // until the new one takes its place. + if (uploadContentOk_ && uploadWriteOk_) + uploadWriteOk_ = LittleFS.rename(part.c_str(), uploadPath_.c_str()); + if (!uploadContentOk_ || !uploadWriteOk_) LittleFS.remove(part.c_str()); } else if (up.status == UPLOAD_FILE_ABORTED) { if (uploadFile_) uploadFile_.close(); - if (!uploadPath_.empty()) LittleFS.remove(uploadPath_.c_str()); + if (!uploadPath_.empty()) LittleFS.remove(uploadPartPath(uploadPath_).c_str()); } } void HttpApiServer::handleFileUploadDone() { + if (featurePolicy(platform::buildFeatures(), std::string(server_->uri().c_str())) == + DispatchResult::Unavailable) { + sendResult(api::httpResponse({}, DispatchResult::Unavailable, {})); + return; + } addCorsHeaders(false); if (apMode_) { sendError(403, "forbidden", "file upload is disabled during provisioning"); @@ -368,6 +579,7 @@ void HttpApiServer::handleFileUploadDone() { // The backup zip is piped chunk by chunk through the reader and applier straight onto the // filesystem; there is nowhere near enough heap to hold the archive. void HttpApiServer::handleRestoreUpload() { + watchdog::feed(); // see handleFileUpload() HTTPUpload& up = server_->upload(); if (up.status == UPLOAD_FILE_START) { restoreStarted_ = false; @@ -421,7 +633,8 @@ void HttpApiServer::dropRawBody() { // Called by WebServer for every raw-body chunk. Script sources use a second arena that is // allocated at RAW_START and released again on completion, since it dwarfs the fixed body arena. -void HttpApiServer::collectBody(WebServer& server, const String& uri, HTTPRaw& raw) { +void HttpApiServer::collectBody(HttpServerBase& server, const String& uri, HTTPRaw& raw) { + watchdog::feed(); // a script source arrives inside one loop() pass too; see handleFileUpload() const std::string method = methodName(server.method()); const std::string path = uri.c_str(); const bool rawSource = api::isRawBodyWrite(method, path); @@ -459,6 +672,7 @@ void HttpApiServer::collectBody(WebServer& server, const String& uri, HTTPRaw& r // across two chunks is still found. It stops at the first: a firmware image holds exactly one, and // an image from before the marker existed holds none - which is read as "says nothing" and let // through, so a downgrade to an older release still works. +#if AWTRIX_FEATURE_BROWSER_OTA void HttpApiServer::scanImageMarker(const uint8_t* buf, size_t len) { for (size_t i = 0; i < len; ++i) { const char c = static_cast(buf[i]); @@ -485,6 +699,8 @@ void HttpApiServer::scanImageMarker(const uint8_t* buf, size_t len) { } void HttpApiServer::handleUpdateUpload() { + watchdog::feed(); // see handleFileUpload() + if (!platform::buildFeatures().browserOta) return; HTTPUpload& up = server_->upload(); if (apMode_) return; if (up.status == UPLOAD_FILE_START) { @@ -560,6 +776,10 @@ void HttpApiServer::handleUpdateUpload() { } void HttpApiServer::handleUpdateDone() { + if (!platform::buildFeatures().browserOta) { + sendResult(api::httpResponse({}, DispatchResult::Unavailable, {})); + return; + } addCorsHeaders(false); if (apMode_) { sendError(403, "forbidden", "firmware update is disabled during provisioning"); @@ -580,6 +800,15 @@ void HttpApiServer::handleUpdateDone() { sendJson(200, "{\"ok\":true}"); engine_->execute(Command(CommandType::Reboot)); } +#else +void HttpApiServer::handleUpdateUpload() { + watchdog::feed(); // the refused image is still read to the end; see handleFileUpload() +} +void HttpApiServer::handleUpdateDone() { + addCorsHeaders(false); + sendError(503, "unavailable", "browser update is unavailable; flash a UF2 over USB (BOOTSEL)"); +} +#endif void HttpApiServer::tick() { if (server_) server_->handleClient(); @@ -660,6 +889,17 @@ void HttpApiServer::dispatch() { req.method = resolved.method; req.get = (req.method == "GET"); + // Reject absent features before allocating bodies or serving transport-only routes. + if (req.path == "/update" && !platform::buildFeatures().browserOta) { + dropRawBody(); + handleUpdateDone(); + return; + } + if (featurePolicy(platform::buildFeatures(), req.path) == DispatchResult::Unavailable) { + dropRawBody(); + sendResult(api::httpResponse({}, DispatchResult::Unavailable, {})); + return; + } if (takeBody(req)) return; if (rejectedByPolicy(req)) return; @@ -729,7 +969,7 @@ bool HttpApiServer::takeBody(Request& req) { // Refuse instead of fragmenting: the copy needs one contiguous block, plus margin for // whatever parsing and dispatch will allocate on top of it. if (received.size() > 15 && - heap_caps_get_largest_free_block(scriptBufferHeapCaps()) < + bodyCopyRoom() < received.size() + kBodyCopyMarginBytes) { arena.reset(); if (rawSource) arena.release(); @@ -776,6 +1016,25 @@ bool HttpApiServer::rejectedByPolicy(const Request& req) { return false; } +// streamFile() writes straight to the client, past the Pico's fed writes, so there a file goes out +// through sendContent() in pieces instead. Other boards keep streamFile(). +namespace { +void sendFile(WebServer& server, File& f, const char* type) { +#if defined(AWTRIX_PLATFORM_RP2040) + server.setContentLength(f.size()); + server.send(200, type, ""); + char buf[1024]; + while (server.client().connected()) { + const size_t n = f.read(reinterpret_cast(buf), sizeof(buf)); + if (n == 0) break; + server.sendContent(buf, n); + } +#else + server.streamFile(f, type); +#endif +} +} + // The web UI is a gzip blob in flash, sent verbatim without decompressing. The ETag never changes // within a build, so a repeat visit costs a 304 instead of the whole transfer. bool HttpApiServer::serveWebUi(const Request& req) { @@ -825,7 +1084,7 @@ bool HttpApiServer::serveAsset(const Request& req) { server_->send(304, "text/plain", ""); return true; } - server_->streamFile(f, mimeFor(req.path)); + sendFile(*server_, f, mimeFor(req.path)); f.close(); return true; } @@ -833,7 +1092,8 @@ bool HttpApiServer::serveAsset(const Request& req) { bool HttpApiServer::serveCommand(Request& req) { Command cmd; api::HttpResult immediate; - switch (api::routeHttp(req.method, req.path, std::move(req.body), cmd, immediate)) { + switch (api::routeHttp(req.method, req.path, std::move(req.body), cmd, immediate, + platform::buildFeatures())) { case api::RouteOutcome::Respond: probe::report("req:route", 128); probe::begin(); @@ -915,6 +1175,7 @@ bool HttpApiServer::serveState(const Request& req) { sendJson(200, respBuf_); return true; } +#if AWTRIX_FEATURE_SCRIPTING if (path == "/api/v1/scripts/shared") { if (!scripts_) { sendError(503, "unavailable", "scripting is not available"); @@ -953,6 +1214,7 @@ bool HttpApiServer::serveState(const Request& req) { return true; } } +#endif return false; } @@ -962,13 +1224,18 @@ bool HttpApiServer::serveDiagnostics(const Request& req) { // Scanning takes seconds and would block the loop, so the first call starts it and answers 202; // the caller polls until a result array comes back. if (req.path == "/api/v1/system/wifi-scan") { +#if defined(AWTRIX_PLATFORM_RP2040) + // Unlike ESP32, Pico reports zero (not FAILED) before the first scan. + const int n = wifiScan_.poll(WiFi); +#else const int n = WiFi.scanComplete(); if (n == WIFI_SCAN_FAILED) { WiFi.scanNetworks(true); sendJson(202, "{\"scanning\":true}"); return true; } - if (n == WIFI_SCAN_RUNNING) { +#endif + if (n < 0) { sendJson(202, "{\"scanning\":true}"); return true; } @@ -979,17 +1246,24 @@ bool HttpApiServer::serveDiagnostics(const Request& req) { for (int i = 0; i < n; ++i) { if (i) out.put(','); out.put("{\"ssid\":"); - out.putString(WiFi.SSID(i).c_str()); + out.putString(String(WiFi.SSID(i)).c_str()); out.put(",\"rssi\":"); out.putInt(WiFi.RSSI(i)); out.put(",\"enc\":"); +#if defined(AWTRIX_PLATFORM_RP2040) + out.put(WiFi.encryptionType(i) != ENC_TYPE_NONE ? "true" : "false"); +#else out.put(WiFi.encryptionType(i) != WIFI_AUTH_OPEN ? "true" : "false"); +#endif out.put('}'); } out.put(']'); out.flush(); server_->sendContent(""); WiFi.scanDelete(); +#if defined(AWTRIX_PLATFORM_RP2040) + wifiScan_.consumed(); +#endif return true; } @@ -1050,6 +1324,29 @@ bool HttpApiServer::serveSounds(const Request& req) { server_->send(200, "application/json", ""); server_->sendContent("{\"melodies\":["); bool first = true; +#if defined(AWTRIX_PLATFORM_RP2040) + // arduino-pico has no VFS, so the directory is walked with the LittleFS File API. + File root = LittleFS.open("/MELODIES", "r"); + if (root && root.isDirectory()) { + for (File file = root.openNextFile(); file; file = root.openNextFile()) { + if (file.isDirectory()) continue; + std::string leaf = file.name(); + leaf = leaf.substr(leaf.find_last_of('/') + 1); + const std::string name = api::melodies::nameFromFile(leaf); + if (name.empty()) continue; + media::PodBuffer raw; + std::string content; + if (media::readAsset("/MELODIES/" + leaf, raw)) + content.assign(reinterpret_cast(raw.data()), raw.size()); + const std::string entry = + (first ? "" : ",") + + api::melodies::entryJson(name, content, static_cast(content.size())); + server_->sendContent(entry.c_str()); + first = false; + } + root.close(); + } +#else if (DIR* root = ::opendir(fs::vfsPath("/MELODIES").c_str())) { while (const dirent* e = ::readdir(root)) { const std::string name = api::melodies::nameFromFile(std::string(e->d_name)); @@ -1066,6 +1363,7 @@ bool HttpApiServer::serveSounds(const Request& req) { } ::closedir(root); } +#endif server_->sendContent(storageTail()); server_->sendContent(""); return true; @@ -1143,9 +1441,33 @@ void HttpApiServer::listDir(const char* dir) { server_->setContentLength(CONTENT_LENGTH_UNKNOWN); server_->send(200, "application/json", ""); server_->sendContent("{\"files\":["); - const std::string base = dir; std::string batch; batch.reserve(kListBatchBytes + kListEntryReserveBytes); +#if defined(AWTRIX_PLATFORM_RP2040) + // arduino-pico has no VFS, so the directory is walked with the LittleFS File API. + File root = dir[0] == '/' ? LittleFS.open(dir, "r") : File(); + if (root && root.isDirectory()) { + bool first = true; + for (File file = root.openNextFile(); file; file = root.openNextFile()) { + if (!first) batch += ','; + first = false; + api::JsonWriter ew(batch); + ew.beginObject(); + std::string name = file.name(); + name = name.substr(name.find_last_of('/') + 1); + ew.member("name", name); + const long size = file.isDirectory() ? 0 : file.size(); + ew.member("size", static_cast(size > 0 ? size : 0)); + ew.endObject(); + if (batch.size() >= kListBatchBytes) { + server_->sendContent(batch.c_str(), batch.size()); + batch.clear(); + } + } + root.close(); + } +#else + const std::string base = dir; if (DIR* root = dir[0] == '/' ? ::opendir(fs::vfsPath(base).c_str()) : nullptr) { bool first = true; while (const dirent* e = ::readdir(root)) { @@ -1164,6 +1486,7 @@ void HttpApiServer::listDir(const char* dir) { } ::closedir(root); } +#endif if (!batch.empty()) server_->sendContent(batch.c_str(), batch.size()); server_->sendContent(storageTail()); server_->sendContent(""); diff --git a/src/transport/http/HttpApiServer.h b/src/transport/http/HttpApiServer.h index 85e56f58..29a78661 100644 --- a/src/transport/http/HttpApiServer.h +++ b/src/transport/http/HttpApiServer.h @@ -2,6 +2,12 @@ #include #include +#if defined(AWTRIX_PLATFORM_RP2040) +#include "platform/rp2040/WifiCompat.h" +using HttpServerBase = HTTPServer; +#else +using HttpServerBase = WebServer; +#endif #include #include @@ -74,7 +80,7 @@ class HttpApiServer { void listDir(const char* dir); bool authOk(); - void collectBody(WebServer& server, const String& uri, HTTPRaw& raw); + void collectBody(HttpServerBase& server, const String& uri, HTTPRaw& raw); void dropRawBody(); void handleUpdateUpload(); void scanImageMarker(const uint8_t* buf, size_t len); @@ -132,6 +138,9 @@ class HttpApiServer { StoredScriptsFn storedScripts_; std::string respBuf_; bool apMode_ = false; +#if defined(AWTRIX_PLATFORM_RP2040) + platform::pico::WifiScan wifiScan_; +#endif }; } diff --git a/src/transport/http/RequestHead.h b/src/transport/http/RequestHead.h new file mode 100644 index 00000000..ed28f27b --- /dev/null +++ b/src/transport/http/RequestHead.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include + +namespace awtrix { +namespace requesthead { + +// Offset just past the blank line that ends an HTTP request head in buf[0, len), or 0 while it has +// not arrived. Scanning starts at `from`, where the previous call stopped, and still finds a blank +// line that the two reads split. +inline std::size_t end(const char* buf, std::size_t len, std::size_t from = 0) { + for (std::size_t i = from < 3 ? 3 : from; i < len; ++i) + if (buf[i - 3] == '\r' && buf[i - 2] == '\n' && buf[i - 1] == '\r' && buf[i] == '\n') + return i + 1; + return 0; +} + +// The Content-Length a head announces, or 0 without one. The name matches in any case, and only +// at the start of a header line. +inline long contentLength(const char* head, std::size_t len) { + static const char kName[] = "\ncontent-length:"; + const std::size_t k = sizeof(kName) - 1; + for (std::size_t i = 0; i + k <= len; ++i) { + std::size_t j = 0; + while (j < k && std::tolower(static_cast(head[i + j])) == kName[j]) ++j; + if (j == k) return std::strtol(head + i + k, nullptr, 10); + } + return 0; +} + +} +} diff --git a/src/transport/http/UpdateImage.h b/src/transport/http/UpdateImage.h index 6b5fb3f2..d3a69fe5 100644 --- a/src/transport/http/UpdateImage.h +++ b/src/transport/http/UpdateImage.h @@ -1,6 +1,6 @@ #pragma once -#if !defined(AWTRIX_NATIVE) +#if !defined(AWTRIX_NATIVE) && !defined(AWTRIX_PLATFORM_RP2040) #include #endif @@ -8,6 +8,10 @@ namespace awtrix { #if defined(AWTRIX_NATIVE) constexpr const char* kUpdateImageName = ""; +#elif defined(AWTRIX_PLATFORM_RP2040) && defined(PICO_RP2350) && PICO_RP2350 +constexpr const char* kUpdateImageName = "firmware-galactic-unicorn-2w.uf2"; +#elif defined(AWTRIX_PLATFORM_RP2040) +constexpr const char* kUpdateImageName = "firmware-galactic-unicorn.uf2"; #elif defined(AWTRIX_SOC_ESP32S3) #if defined(CONFIG_SPIRAM_MODE_QUAD) constexpr const char* kUpdateImageName = "firmware-awtrix-ng-s3-quad.bin"; diff --git a/src/transport/http/WebUiAsset.h b/src/transport/http/WebUiAsset.h index 52a7b604..7de3a09b 100644 --- a/src/transport/http/WebUiAsset.h +++ b/src/transport/http/WebUiAsset.h @@ -1,4040 +1,4106 @@ #pragma once // GENERATED by scripts/build_webui.py from webui/index.html - DO NOT EDIT. -// 298993 B raw -> 248614 B minified -> 80488 B gzipped (budget 84 KB). -// ETag = MD5 of the gzip stream. SRC-MD5 28b9599d5dc82b3851e8100f4be32948 (source-unchanged check). +// 303841 B raw -> 252423 B minified -> 81812 B gzipped (budget 84 KB). +// ETag = MD5 of the gzip stream. SRC-MD5 9001404c9cff71b358c53860b0aadf99 (source-unchanged check). #include namespace awtrix { -inline constexpr char WEBUI_ETAG[] = "\"d24bf1ba818b7a624c8b1313f61863ae\""; -inline constexpr unsigned WEBUI_GZ_LEN = 80488; +inline constexpr char WEBUI_ETAG[] = "\"af4ba9c41739e39cb466c1698320969c\""; +inline constexpr unsigned WEBUI_GZ_LEN = 81812; inline const uint8_t WEBUI_GZ[] PROGMEM = { - 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x0a,0xc4,0xbd,0xdb,0x8e,0x1b,0x47,0xb6,0x28,0xf8,0x2b, - 0xd1,0xd4,0x69,0xb9,0xd8,0x26,0x53,0xbc,0x93,0xc5,0x72,0xc9,0xa7,0x74,0xb1,0xa4,0x6d,0x49,0xd6,0x51, - 0xc9,0xd6,0xde,0x36,0x8c,0x83,0x24,0x19,0x24,0xb3,0x2b,0x99,0x49,0x67,0x26,0xab,0x54,0x55,0x2a,0xa0, - 0x1f,0xe6,0x6d,0x9e,0xe6,0x65,0x06,0x07,0xd8,0x67,0xf6,0x3c,0x34,0xe6,0x75,0xde,0x7a,0x80,0xc1,0x06, - 0x06,0x18,0xfd,0x89,0xbf,0x64,0xd6,0x25,0x22,0x32,0x22,0x33,0xc9,0x62,0x49,0xde,0x38,0xed,0x56,0x31, - 0x2f,0x91,0x71,0x5d,0xf7,0x58,0x6b,0xc5,0x37,0x7f,0x9a,0xc5,0xd3,0xec,0x72,0x2d,0xc5,0x32,0x5b,0x85, - 0x0f,0xc5,0x37,0xf8,0x23,0x42,0x3f,0x5a,0x1c,0xd7,0x64,0x54,0xc3,0x07,0xd2,0x9f,0xc1,0xcf,0x4a,0x66, - 0xbe,0x98,0x2e,0xfd,0x24,0x95,0xd9,0x71,0x6d,0x93,0xcd,0x9b,0xa3,0x9a,0x7e,0x1c,0xf9,0x2b,0x79,0x5c, - 0x3b,0x0f,0xe4,0xc5,0x3a,0x4e,0xb2,0x9a,0x98,0xc6,0x51,0x26,0x23,0x28,0x76,0x11,0xcc,0xb2,0xe5,0xf1, - 0x4c,0x9e,0x07,0x53,0xd9,0xa4,0x9b,0x46,0x10,0x05,0x59,0xe0,0x87,0xcd,0x74,0xea,0x87,0xf2,0xb8,0x8d, - 0x75,0x64,0x41,0x16,0xca,0x87,0x27,0xef,0xdf,0xbd,0x7d,0xf1,0xcf,0xe2,0xf5,0xb3,0x6f,0x1e,0xf0,0x03, - 0xf1,0x4d,0x18,0x44,0x67,0x22,0x91,0xe1,0x71,0x2d,0x80,0x2a,0x6b,0x02,0xfb,0x09,0xd7,0x2b,0x7f,0x21, - 0x1f,0xa4,0xe7,0x8b,0xaf,0x3f,0xac,0xc2,0x9a,0x58,0x26,0x72,0x7e,0x5c,0x9b,0xf9,0x99,0x3f,0x76,0xde, - 0x34,0xfe,0xdc,0x7d,0x0c,0x97,0x02,0x2e,0xa3,0xf4,0xf8,0xab,0x65,0x96,0xad,0xc7,0x0f,0x1e,0x5c,0x5c, - 0x5c,0x78,0x17,0x5d,0x2f,0x4e,0x16,0x0f,0x3a,0xad,0x56,0x0b,0x0b,0x7f,0x25,0xb0,0xe7,0x8f,0xe2,0x0f, - 0xc7,0x5f,0xb5,0x44,0x4b,0xb4,0x0f,0xe1,0xff,0x5f,0xfd,0xb9,0xfb,0x14,0xbe,0x4f,0xe4,0x34,0x13,0x3c, - 0x88,0xaf,0xe0,0xa1,0x58,0xca,0x60,0xb1,0xcc,0xf8,0x3a,0x81,0xf2,0xbd,0xaf,0xc4,0x3c,0x08,0xc3,0xe3, - 0xaf,0xfe,0xdc,0xe9,0xb6,0x87,0xf8,0xdf,0x57,0x0f,0xf8,0xcb,0xb5,0x9f,0x2d,0xf3,0x77,0xf3,0xbe,0xdf, - 0x1f,0x8c,0xbe,0x12,0xf1,0xda,0x9f,0x06,0xd9,0xe5,0xf1,0x57,0x5e,0x7b,0xf0,0x95,0x98,0x1d,0x7f,0xf5, - 0xaa,0x23,0x3a,0xcb,0xee,0x79,0xf7,0x79,0xe7,0xea,0x55,0xbb,0xc7,0xd7,0xcb,0x66,0xf7,0xea,0xd5,0x40, - 0x0c,0xe8,0xf9,0x00,0x9e,0xb7,0xf8,0x5a,0x3d,0x6f,0xf7,0xac,0x17,0x7c,0x83,0x6f,0x76,0x37,0x8c,0x4d, - 0x0d,0x54,0x53,0xfc,0x65,0xde,0x54,0x47,0x35,0xc5,0x5d,0x18,0x58,0xcf,0xdb,0x2d,0xfd,0x62,0xa0,0xaf, - 0x55,0xb3,0x2d,0x53,0x0a,0x3e,0xb1,0xee,0x3a,0xba,0x7b,0x5c,0x59,0xb9,0x7b,0x38,0xe1,0x70,0x85,0xcb, - 0x9e,0x66,0x97,0xb0,0xca,0xe3,0x24,0x8e,0xb3,0xeb,0x69,0x1c,0xc6,0x09,0xc0,0xc4,0x52,0xae,0xe4,0x78, - 0xe6,0x27,0x67,0x47,0xcd,0xe6,0x64,0x31,0xbe,0xc7,0x93,0x0a,0x37,0x53,0x3f,0x99,0x8d,0xef,0x75,0xf0, - 0x7f,0x6d,0x75,0xdb,0x81,0xfb,0x43,0xf8,0x0f,0x5f,0x4f,0xe2,0x64,0x26,0x93,0xf1,0xbd,0xee,0xb0,0x3b, - 0xe8,0x76,0xf0,0x01,0xbd,0xef,0xb6,0x3a,0xf3,0xce,0x04,0x6e,0xe7,0x50,0xd7,0xbc,0x3b,0x6f,0xcb,0x29, - 0xdc,0xcc,0x82,0xd5,0xf8,0x9e,0x3f,0xf0,0xdb,0x87,0x23,0xb8,0xf3,0xa7,0x53,0x78,0x47,0xf3,0x04,0x77, - 0xeb,0x24,0xb0,0xee,0xe2,0xb3,0xf1,0xbd,0xd1,0x7c,0x32,0x1f,0x62,0x95,0x32,0x81,0x06,0xe6,0xf3,0xc3, - 0xd9,0x61,0x0b,0xee,0x2e,0xfc,0x24,0xc2,0xdb,0xc9,0xa0,0x3f,0xe5,0x97,0x13,0xec,0xe1,0xb0,0xd7,0xeb, - 0x75,0x67,0xd8,0x81,0xe8,0x02,0xda,0x9f,0x74,0x66,0x9d,0x16,0xdd,0xf9,0x70,0xd7,0xeb,0x0c,0xda,0xf4, - 0xce,0x9f,0xe1,0xe0,0x7a,0xed,0x4e,0x8f,0x46,0x03,0xf7,0xd4,0xc1,0xf9,0x6c,0x30,0xa3,0xd1,0xc5,0x50, - 0x75,0xbb,0xd5,0x6e,0xb5,0xe6,0x7c,0xe7,0x74,0x3f,0x5d,0x8e,0xef,0x01,0xe8,0x62,0xff,0xb2,0x04,0x3a, - 0xd8,0x6f,0xf7,0x64,0x0f,0x27,0x21,0x3b,0xbb,0xc0,0x4a,0x86,0x13,0xea,0x6e,0xe6,0xaf,0x71,0x28,0x73, - 0x7f,0xd0,0xa7,0x97,0xd3,0x38,0x91,0xe3,0x7b,0xb3,0x8e,0x3f,0x9a,0x63,0xad,0x59,0x9a,0xc1,0x70,0xfc, - 0xfe,0x6c,0xc0,0xb7,0xd1,0x06,0x26,0x65,0x78,0x38,0x6d,0xf1,0xed,0x34,0x86,0xdb,0xd1,0xe4,0xb0,0x77, - 0x28,0xf1,0x36,0x5e,0x8f,0xef,0x4d,0xda,0x13,0x7f,0xda,0xa3,0x4f,0x65,0x08,0x73,0x3f,0xeb,0xcd,0x87, - 0x03,0x75,0x1b,0x8f,0x93,0xc5,0xc4,0x3f,0xe8,0xf5,0x1b,0xc3,0xc3,0x46,0xbb,0x3d,0x6a,0x78,0xbd,0x7e, - 0x9d,0xea,0xd9,0x40,0x2b,0xed,0x39,0x0c,0x14,0xbb,0x9e,0x8c,0xdb,0x9d,0xf5,0x87,0xa3,0x39,0xd0,0x87, - 0x66,0x1a,0x5c,0xc9,0x71,0x7b,0x00,0xb7,0xb0,0x3c,0xed,0x71,0xbb,0xcd,0x57,0x9d,0x71,0xfb,0x90,0xae, - 0x56,0x71,0x14,0x8f,0x6b,0x8f,0x7d,0x20,0x14,0xb3,0xc0,0x17,0xaf,0xe0,0xb6,0xd6,0xa8,0xbd,0x78,0xf4, - 0x4a,0xbc,0x09,0xe5,0x07,0x75,0xbf,0x09,0xa8,0x5c,0x0a,0x78,0x25,0x1b,0x8f,0xe3,0x28,0x8d,0x43,0x3f, - 0x6d,0x98,0x47,0x37,0x04,0x5d,0xbf,0x20,0x71,0x68,0x66,0x08,0x5b,0xc7,0x21,0x22,0xf0,0xaf,0x2e,0xbc, - 0xd1,0x33,0x05,0x70,0xf3,0xfe,0xbc,0x37,0x6f,0x1b,0x80,0x9b,0xd3,0x6c,0x28,0x68,0x9b,0xb7,0xa4,0x94, - 0x87,0x16,0xb4,0xc9,0xce,0x6c,0x3e,0x1b,0x19,0x68,0x93,0x13,0x39,0x92,0x1d,0x05,0x6d,0x30,0xe2,0x2e, - 0x2d,0x2e,0x41,0xdb,0xb0,0x35,0x98,0x0e,0xfa,0x1a,0xda,0x60,0x1a,0x87,0xb4,0xb4,0x04,0x6d,0xe6,0x0e, - 0xa1,0xad,0x3b,0x1b,0x0e,0x3a,0x52,0x43,0xdb,0xa4,0x0b,0x10,0x23,0x0d,0xb4,0x1d,0xf6,0xfa,0xa3,0x76, - 0xd7,0x82,0x36,0xd9,0xf1,0xe7,0xfe,0x48,0x43,0x1b,0x74,0xb6,0xc5,0xdd,0x41,0x68,0x9b,0x4f,0xe4,0xe1, - 0x6c,0x9a,0x43,0xdb,0x7c,0x26,0x0f,0x65,0x3f,0x87,0xb6,0x61,0xbf,0x3d,0x69,0xf7,0x0d,0xb4,0x8d,0xe0, - 0xbf,0xa1,0x05,0x6d,0xc3,0x79,0xd7,0x40,0x1b,0x00,0xae,0xdf,0x69,0xb5,0xe7,0x1a,0xe2,0xa6,0xa3,0x69, - 0x77,0x72,0xa8,0x21,0x6e,0x3a,0x07,0xa4,0x94,0x06,0xe2,0x0e,0xfb,0xdd,0x51,0xab,0x95,0x43,0xdc,0xa8, - 0xd3,0x6f,0xcd,0x72,0x88,0x6b,0xf9,0xdd,0xd6,0xe0,0xd0,0x40,0x5c,0xab,0xdf,0x6f,0xf9,0xd2,0x40,0x5c, - 0xff,0x70,0xd0,0x1d,0x18,0x88,0x83,0x39,0x3c,0xec,0xcc,0x0d,0xc4,0x4d,0x06,0xb3,0xc3,0xf9,0xdc,0x85, - 0xb8,0x76,0x77,0xd8,0x00,0x3c,0x6e,0x74,0xfa,0x7d,0x80,0xb9,0x1c,0xe4,0xe6,0x2d,0xc0,0x97,0xc1,0xcd, - 0x5f,0xae,0x27,0xf1,0x07,0x04,0xb5,0x20,0x5a,0x8c,0x79,0xd9,0x60,0xf5,0x3e,0x1c,0xad,0xfc,0x64,0x11, - 0x44,0xe3,0xd6,0xd1,0xda,0x9f,0xcd,0xf0,0x5d,0xeb,0x06,0x19,0xdf,0x35,0x40,0xf8,0xd9,0x22,0x89,0x37, - 0xd1,0x6c,0x7c,0xee,0x27,0x07,0x08,0x13,0xf5,0x23,0x02,0x16,0x75,0x3f,0x5f,0xd4,0x6f,0x26,0xf1,0xec, - 0xf2,0x1a,0x61,0x78,0xdc,0xee,0xad,0x3f,0x3c,0x68,0x7b,0x7d,0x51,0x3b,0x95,0x8b,0x58,0x8a,0x1f,0x5f, - 0x88,0x9f,0xfc,0x24,0xf0,0x27,0xa1,0xac,0x35,0x4e,0xd6,0x59,0x9c,0x36,0xd2,0xcb,0x34,0x93,0xab,0xe6, - 0x26,0x68,0xa4,0x7e,0x94,0x36,0x53,0x99,0x04,0xf3,0xa3,0x55,0x10,0x35,0x99,0x97,0x8c,0x01,0xc9,0xcf, - 0x97,0xba,0x1b,0xd0,0xb7,0x2c,0x83,0x79,0x18,0xb6,0x00,0x05,0xf2,0xbe,0x34,0x89,0xb1,0x8d,0x13,0x44, - 0x84,0xb0,0xb9,0xc0,0x5f,0x60,0xaf,0x07,0xd3,0x20,0x99,0x86,0xb2,0xa1,0xc8,0x55,0x1b,0x68,0xef,0xfa, - 0x43,0x23,0x4b,0xa0,0x99,0xb5,0x9f,0x40,0x01,0xd1,0xf6,0x00,0xdb,0xea,0x76,0x45,0x06,0xe9,0x04,0xfe, - 0xb9,0xf1,0xaf,0xed,0xb1,0x01,0x6c,0xd6,0x8f,0x32,0xf9,0x21,0x6b,0xce,0x24,0xac,0x9d,0x9f,0x05,0x00, - 0x19,0x51,0x1c,0xc9,0x9b,0x65,0xfb,0xda,0xc2,0xd9,0x91,0x46,0xe1,0x0b,0x1e,0xc2,0x10,0x96,0x3b,0x94, - 0x59,0x06,0x73,0x8b,0x58,0x87,0xd3,0xd9,0xf4,0x5a,0x1d,0xb9,0xba,0x59,0x76,0xae,0x0b,0xb8,0x6e,0x7f, - 0x37,0xe8,0x57,0x7d,0xd7,0x96,0x2b,0xb5,0x3c,0x7a,0x36,0x60,0x10,0x37,0x93,0x0d,0x5c,0x46,0x3c,0xeb, - 0x41,0xb4,0x84,0x59,0xcc,0x8a,0xeb,0x72,0x54,0x5a,0x3c,0xc2,0x5b,0x78,0xce,0xe8,0x0a,0xb3,0x23,0x80, - 0x3e,0x04,0x33,0xa1,0x96,0x96,0x1e,0xeb,0xd7,0x4d,0x9c,0xd5,0x4d,0x3a,0x46,0xe2,0xa3,0x81,0x62,0x84, - 0xf3,0x04,0x4b,0x6c,0xaf,0x57,0x17,0x47,0x0f,0x20,0x96,0x42,0xd3,0xeb,0x38,0x00,0x41,0x27,0x39,0xba, - 0x58,0x06,0x99,0xa4,0x31,0x48,0x98,0xaf,0x8b,0xc4,0x5f,0x1f,0xd1,0x32,0x04,0x34,0x83,0xaa,0x7e,0xea, - 0xad,0xf0,0xda,0xbd,0xb4,0x91,0x77,0x94,0xef,0xa9,0xf0,0x3c,0x4e,0x56,0x74,0xab,0xc6,0x3a,0x5e,0xc6, - 0xe7,0x32,0xb9,0xb6,0xbf,0xb6,0xd7,0xa9,0x0c,0xa9,0x3c,0x1c,0xfd,0xb5,0x3f,0xcd,0x82,0x73,0xec,0x4e, - 0x76,0x30,0x9e,0x05,0x29,0x82,0xe4,0xac,0x7e,0x6d,0x5a,0x1a,0xd3,0x55,0xe8,0x67,0xf2,0x5f,0x0e,0x60, - 0x62,0xcc,0x67,0xba,0xe8,0xb5,0x12,0x55,0xc6,0x40,0xc8,0xf5,0x70,0x67,0x72,0xee,0x6f,0xc2,0xec,0xa8, - 0xa2,0x4b,0xba,0x71,0xdf,0x03,0x92,0xd6,0xe0,0xba,0xf0,0xb2,0x8c,0x50,0xf0,0xb0,0x5e,0x55,0x03,0x3d, - 0xe7,0x07,0xf7,0x50,0x98,0x6a,0xc9,0x22,0xac,0x70,0xe5,0xd7,0xd0,0xc3,0x75,0xe8,0x5f,0x02,0x14,0x80, - 0x78,0x28,0x9b,0x73,0x60,0x06,0x47,0x3e,0x90,0xf0,0xa8,0x09,0x8b,0xb0,0x4a,0xc7,0x53,0x49,0x6b,0xf2, - 0xd7,0x4d,0x9a,0x05,0xf3,0xcb,0xa6,0x92,0x45,0xf5,0xe3,0xe2,0x4a,0x96,0x96,0x7a,0x0b,0xb0,0xd8,0xdd, - 0xce,0x21,0x85,0xbb,0xa4,0x56,0x0a,0x84,0x2e,0x68,0x61,0x3c,0x49,0xb0,0xf6,0x48,0xa6,0xe9,0x41,0xdb, - 0x6b,0x0d,0xea,0xdb,0x78,0x90,0x18,0x07,0xe9,0x01,0xcf,0x54,0xc3,0xaf,0xd3,0xd0,0xd4,0xf0,0x81,0x8e, - 0xab,0xe5,0xf0,0x66,0x20,0x88,0x43,0xd5,0xf6,0x44,0x01,0xed,0xaf,0x9c,0x40,0xe6,0x09,0x75,0xf7,0x4b, - 0xcf,0x4f,0x56,0xb0,0x98,0xa5,0x55,0xa0,0x4a,0xf2,0xe6,0xb6,0xd4,0x67,0x2a,0x43,0xf1,0xfb,0x5a,0x4f, - 0xd5,0x10,0xa7,0xaa,0x65,0x70,0x92,0x5e,0x7a,0x67,0xf1,0xdc,0x59,0x6c,0x90,0x50,0x26,0x87,0x73,0xe9, - 0x56,0xac,0x1f,0xea,0x05,0x40,0x82,0xf0,0x45,0xcb,0x59,0xea,0x42,0x15,0xd2,0xe8,0x56,0x2b,0xd7,0x67, - 0x54,0xbf,0xa1,0x0f,0xc3,0x78,0x11,0x5f,0x93,0xa4,0xcf,0xf4,0x4d,0x53,0x67,0xa2,0x75,0xd0,0x27,0xa6, - 0x83,0x41,0xb4,0xde,0x64,0x0d,0xe0,0x3e,0xa0,0x17,0x34,0x90,0x52,0x02,0x9d,0xf5,0xef,0x48,0x94,0x90, - 0xa3,0x7c,0x19,0x45,0x6a,0xbb,0x14,0xa9,0x87,0xcc,0x42,0x75,0xbd,0xd5,0xfa,0x33,0xbd,0xe2,0xdb,0x16, - 0x77,0x78,0x3c,0x8f,0xa7,0x9b,0x54,0x75,0x5b,0xdd,0xe8,0xce,0xf3,0xed,0x75,0xbc,0xc9,0x70,0xfa,0x81, - 0x21,0x6e,0xa5,0x37,0xc8,0x47,0x97,0xfe,0x2c,0xbe,0x18,0xa3,0x96,0xd4,0x12,0x5d,0xe8,0x8a,0x66,0x3d, - 0xfe,0xcd,0xf8,0x02,0x86,0x2f,0x0f,0x7c,0x85,0xfb,0x8d,0xca,0x99,0x6a,0xa4,0x9b,0x15,0x90,0xf6,0xcb, - 0xc6,0x2f,0x99,0x3f,0x09,0xa2,0x99,0xfc,0xf0,0x6b,0x9d,0x3b,0xd0,0x3c,0x0f,0xd2,0x00,0xe8,0x8e,0xe9, - 0x48,0xa7,0x30,0x35,0xd4,0x07,0xf5,0xb2,0x19,0xcf,0xe7,0xa0,0x85,0x12,0x5f,0xa0,0x76,0x7e,0x21,0xc5, - 0x30,0x41,0x88,0xff,0xf5,0x0b,0xeb,0xf3,0xd2,0x8b,0x20,0x9b,0x2e,0x85,0x35,0x71,0xba,0xae,0xaf,0x83, - 0x2f,0xe9,0x1d,0x88,0x9a,0xd3,0x33,0x98,0xc4,0x5f,0x15,0x94,0xf9,0x9b,0x2c,0x76,0xde,0xe3,0x84,0xff, - 0x7a,0xad,0x51,0xa3,0x67,0xc3,0x5d,0x81,0xdf,0xdc,0x78,0xd3,0x75,0x30,0x3d,0xbb,0x5e,0xc7,0x8a,0xc3, - 0x80,0x8a,0xec,0x23,0xb5,0xaf,0x44,0xa6,0x1c,0x7a,0xf9,0x33,0x51,0x6e,0x94,0x7b,0x34,0x1a,0x58,0x80, - 0xa6,0x01,0x01,0x2f,0x72,0x08,0x86,0x75,0x3f,0x42,0x04,0x9b,0x87,0x00,0x06,0xcb,0x60,0x36,0x93,0xd1, - 0xd6,0x5a,0xc7,0x63,0xa0,0xdd,0x93,0xb3,0x20,0x6b,0x2a,0x61,0xfb,0xc2,0x87,0x89,0x6d,0x22,0x77,0x5c, - 0x03,0x8a,0xe6,0x82,0xd7,0xdd,0x2a,0xb8,0xce,0xfb,0xe5,0x60,0xc9,0x10,0x17,0x6f,0x7b,0x4d,0xab,0xf8, - 0xea,0xae,0xd5,0x78,0xb0,0x64,0x1f,0xf2,0x49,0xf6,0x27,0xb0,0xe2,0x9b,0x4c,0x1e,0x05,0x11,0x2e,0x6f, - 0xcb,0x4c,0xf6,0x1d,0x39,0x10,0x0b,0x8e,0x20,0x34,0xa2,0xe8,0xa8,0xe0,0x07,0x15,0x96,0x7a,0x51,0x16, - 0x22,0x11,0xea,0x48,0xad,0x79,0x53,0x9e,0xc3,0xe7,0x29,0x83,0x43,0xa9,0xcb,0x36,0x76,0x52,0xf7,0x04, - 0xe3,0x28,0x12,0x18,0x16,0x93,0x3b,0xa3,0x86,0xfe,0xe7,0xf5,0x3a,0x75,0x35,0x46,0x05,0xe0,0x00,0xf2, - 0xcb,0x20,0x52,0x03,0xde,0x52,0x15,0x82,0x7c,0x0e,0xec,0x65,0xbc,0xcb,0x17,0xf4,0x08,0x0a,0x40,0x5f, - 0xab,0x48,0x08,0x4d,0x39,0x0f,0xc1,0x01,0x2a,0xbb,0x3a,0xa0,0xc5,0x50,0x9b,0x9e,0x5c,0x06,0x5c,0xd0, - 0x06,0x26,0x7e,0x92,0xaf,0x05,0x4c,0xec,0xf4,0xec,0xf2,0x08,0x95,0x84,0xd6,0xd1,0x55,0x93,0x48,0xc9, - 0xb8,0xe3,0x80,0xaa,0x32,0x1d,0xcc,0x3b,0xf4,0x70,0x96,0xc4,0xeb,0xa6,0x66,0x00,0xe1,0x26,0x39,0x68, - 0xb3,0x64,0xac,0x35,0x02,0x92,0x33,0xb7,0x93,0x63,0x8b,0xf4,0x21,0x05,0xee,0xb6,0x90,0xf6,0x81,0x0e, - 0xde,0xdd,0xca,0xdc,0x75,0x97,0xed,0x1e,0xb1,0x6e,0x39,0xef,0xe8,0xf1,0x3c,0x44,0xd3,0x1a,0xa0,0xc2, - 0x6d,0x80,0xb4,0xf0,0xd7,0xac,0x1e,0xaf,0xfc,0x0f,0x8a,0xb2,0x83,0x8a,0xdd,0x5a,0x1b,0x35,0x06,0x69, - 0x89,0xc1,0x5c,0x1c,0x99,0xe8,0xe0,0x9f,0x43,0x47,0x89,0xa0,0x79,0x76,0x5b,0x16,0x5e,0xb8,0x50,0xc8, - 0xdf,0xe9,0xe5,0x4c,0xaf,0x53,0x20,0x3e,0xc5,0x75,0x54,0xf3,0x48,0x73,0xca,0xf3,0x72,0x80,0x10,0x32, - 0xca,0x19,0x02,0x28,0xff,0xc5,0xa6,0x8c,0x0a,0x91,0x25,0x12,0xf0,0x6f,0x2c,0x3f,0xac,0x7d,0x58,0xb6, - 0x59,0x85,0xf0,0x5c,0xfe,0xd4,0x03,0x9a,0x5a,0x12,0x82,0x6e,0x22,0xff,0xdc,0x9d,0x3b,0x9c,0xa8,0xc1, - 0xbe,0xf3,0x04,0xd8,0x31,0x52,0x92,0x8c,0xa1,0x69,0xcd,0x0f,0x5c,0xa6,0x40,0xf2,0xd2,0x69,0x12,0x87, - 0x21,0xf4,0x48,0xd5,0x8a,0xd8,0x82,0xad,0x0b,0xbf,0x82,0x06,0x3b,0xac,0xba,0x63,0x24,0x4a,0x8d,0xad, - 0xa4,0x3e,0x58,0x23,0x99,0x05,0xab,0xba,0x6d,0x10,0xe9,0x16,0x94,0x24,0xd0,0x8f,0xab,0xa6,0x88,0x5a, - 0x57,0xd2,0xce,0x5e,0x7a,0x50,0x9d,0x3f,0xf1,0x40,0x90,0xdb,0xaf,0xfc,0x2e,0x9a,0xe2,0x0a,0xfd,0xba, - 0xe2,0xf1,0x78,0x22,0x41,0xb7,0x90,0xd7,0x9a,0xe2,0xd5,0x6a,0x47,0x65,0xf2,0x19,0xca,0x39,0x6a,0xbd, - 0x30,0xcc,0x44,0x29,0xc0,0x34,0x47,0x84,0x81,0xcd,0xae,0x05,0x85,0x2e,0xf4,0x5a,0xb4,0x67,0xe5,0x07, - 0xd1,0xf5,0xb6,0x35,0x6e,0x09,0x67,0x95,0x11,0x96,0x09,0x1b,0x0c,0xb9,0x5e,0x24,0xc1,0x8c,0x51,0x0a, - 0x97,0x02,0xef,0x9a,0x80,0x6c,0x6b,0x54,0x85,0x90,0x64,0x6d,0x56,0x51,0x0a,0x8b,0xb9,0x96,0x7e,0x76, - 0x80,0x35,0x01,0xd5,0xc8,0x1a,0x20,0x52,0x41,0x7b,0x07,0xdd,0x0e,0x34,0xd4,0x68,0xcf,0x93,0x7a,0xdd, - 0xc1,0xd3,0x14,0xa4,0x9b,0x8c,0xba,0xf5,0xd0,0x83,0x3e,0xc9,0x6b,0xaa,0x95,0x2b,0x1b,0xb7,0x1f,0x34, - 0xdb,0x40,0x6e,0x61,0x4a,0xaf,0xb7,0x4e,0xf4,0x1d,0xa4,0x41,0x7e,0x07,0x8f,0x0d,0xbe,0x23,0xa0,0x61, - 0xc7,0x2a,0x46,0xd8,0x71,0x59,0x43,0x8b,0xa0,0x5d,0x74,0x46,0x8a,0x7c,0xc1,0xff,0xda,0x03,0xee,0x9b, - 0xf0,0x16,0x4b,0x19,0xae,0xaf,0x77,0x81,0x66,0x07,0x79,0x96,0xd6,0xcd,0x91,0xf6,0x36,0xd1,0x86,0xe0, - 0x25,0xf1,0xc5,0x7e,0x24,0xac,0xa5,0xc8,0x0a,0xc9,0x00,0x63,0xc6,0xf4,0x05,0x7e,0x4d,0xb4,0x06,0x26, - 0x09,0x80,0x2c,0x83,0x21,0xa5,0xa5,0xf9,0x2b,0x0c,0xad,0x72,0xcd,0xda,0x87,0x38,0x36,0xb5,0x52,0xad, - 0xc6,0x08,0xa7,0xa4,0x4e,0x0d,0x77,0x90,0x26,0x6c,0x51,0x20,0xbc,0x74,0x33,0x41,0x3a,0x52,0xc5,0x5a, - 0xd4,0x1a,0x2d,0x93,0x78,0x25,0x9b,0xcb,0x46,0xbb,0xd5,0xc3,0x1a,0x79,0x74,0x20,0xd9,0xce,0x79,0xdd, - 0x2b,0xa6,0x3d,0x97,0xa3,0x68,0x9a,0x7a,0x24,0x57,0x52,0x3b,0x48,0x31,0xd4,0xba,0x1d,0x7e,0x3e,0x7d, - 0x28,0x98,0x1f,0x54,0x05,0x84,0x58,0xb9,0x64,0x6a,0x19,0x82,0xf2,0xd6,0xef,0x46,0x31,0xcc,0x67,0x77, - 0xa2,0x1a,0xa6,0x33,0xdb,0x24,0x00,0x3d,0x54,0x66,0x19,0xf8,0x0f,0x18,0x13,0x70,0x03,0x19,0x5e,0x97, - 0xe7,0x52,0x9b,0x5f,0x94,0x46,0x53,0xb2,0x94,0x11,0x08,0xa6,0xa0,0x65,0xc0,0xe2,0xfd,0xb1,0x08,0xc6, - 0x54,0xbf,0x69,0xc1,0xfb,0xd4,0x0f,0xa7,0x07,0x95,0x50,0x21,0xbe,0x16,0x03,0x16,0x28,0x76,0x23,0x5b, - 0x2e,0x3d,0x4f,0xc3,0x60,0x6d,0x3a,0xae,0x25,0x01,0x83,0xd3,0xa8,0x5c,0xb5,0x8d,0xb2,0xb7,0xa7,0x98, - 0xb2,0x73,0x41,0xd4,0xe8,0xac,0x21,0x24,0x75,0xd1,0x44,0x6a,0x5e,0x17,0x95,0x0f,0x91,0xf1,0x95,0x58, - 0x00,0xf6,0x0b,0x99,0x80,0x45,0x8d,0x0b,0x63,0xf8,0x2c,0x42,0xd2,0xb1,0x16,0x51,0x20,0x41,0x49,0xcd, - 0x54,0x74,0xd4,0x4c,0x14,0xde,0x03,0xbc,0xcc,0xae,0x1d,0x91,0x87,0x0b,0xcd,0x6d,0x6a,0xb4,0x83,0x5a, - 0x18,0x3a,0x81,0xd4,0x9c,0x59,0x06,0x82,0x5b,0x4f,0xd3,0xd2,0x0a,0x1a,0xe6,0xb4,0xd6,0xba,0x6d,0x51, - 0xd0,0xf2,0xc8,0xdd,0x19,0x87,0x7e,0x0a,0xb8,0xb0,0x0c,0xc2,0xd9,0xb5,0xfb,0x11,0x0b,0xb7,0x58,0x06, - 0x24,0x31,0x7f,0x52,0x86,0xfe,0x8e,0x0b,0xfc,0x56,0x59,0xf8,0xd3,0xde,0x4e,0x75,0x27,0x3e,0xd0,0x27, - 0xd0,0x00,0xa9,0x12,0x33,0x2f,0xfc,0xe1,0xe4,0xda,0x11,0x2f,0x5a,0x2d,0x87,0xba,0xe0,0xca,0xe8,0xd2, - 0x67,0xf2,0xb2,0x20,0x87,0xf3,0xf3,0xdb,0xd7,0xd7,0x91,0xc1,0xfa,0x9d,0xe9,0x52,0x7f,0x3a,0xcd,0xc2, - 0xbd,0x78,0xc5,0xa8,0x82,0x62,0x13,0xeb,0x90,0xd1,0xec,0xe6,0xde,0x66,0x3d,0x6b,0x46,0x71,0x26,0x53, - 0xe1,0x05,0x53,0x2d,0xc0,0x76,0x2c,0xd1,0x81,0xe0,0x69,0x13,0x05,0x19,0x32,0x99,0x3d,0xf5,0xe4,0x72, - 0x4f,0xf2,0x2a,0x04,0x5d,0x55,0xe8,0x82,0x2c,0xc2,0x1c,0xde,0x42,0xb3,0xb1,0x6b,0x55,0x7a,0x9c,0x35, - 0x47,0xfd,0x3f,0x17,0x15,0x6b,0xb6,0xc4,0x9b,0x87,0x32,0x04,0x82,0x91,0x06,0x69,0xa5,0xbc,0x6c,0xfa, - 0x69,0xe9,0x51,0xd1,0x66,0x35,0x91,0x89,0xd1,0xcb,0x9a,0xdc,0x55,0x80,0xa6,0x03,0x0b,0xdd,0x37,0x21, - 0x92,0x2e,0xb4,0xcc,0xd7,0x1b,0xfd,0x11,0xda,0x81,0xf3,0x85,0xaa,0xaa,0x8c,0xf4,0x68,0x54,0xe0,0x7d, - 0xe0,0x2e,0xd0,0x01,0xec,0xe3,0x3c,0x90,0xe1,0x6c,0xf7,0x77,0xb9,0x2a,0x1f,0x44,0x11,0xa9,0xb8,0x68, - 0xdd,0x67,0x4b,0xd1,0x9e,0x1f,0xc6,0x9b,0xcc,0xfd,0xf0,0x5a,0xbf,0xb1,0xba,0xa3,0x66,0x95,0x05,0xc1, - 0x2d,0x5d,0x5a,0xfb,0x69,0x7a,0x01,0x68,0xf8,0xeb,0x96,0x96,0x71,0x48,0xce,0x3b,0x36,0x62,0x19,0x3d, - 0xa9,0x95,0x23,0xc8,0x96,0x49,0xd2,0x62,0xe9,0xf6,0x92,0x4a,0x65,0x56,0x05,0x0f,0xad,0x82,0xe7,0x7e, - 0x78,0x3b,0x6a,0x19,0x8a,0x40,0x26,0x6c,0x82,0x13,0x82,0xde,0x31,0xad,0x31,0x57,0xe5,0xcd,0x37,0x61, - 0x78,0xbd,0x45,0x54,0x9a,0x27,0x56,0x21,0xc6,0xca,0x4a,0x6c,0x63,0xc1,0xd6,0xcb,0xae,0x4a,0x78,0x4b, - 0xaf,0x67,0x41,0xc2,0x34,0x79,0xcc,0x35,0x3b,0x38,0xa4,0xd1,0x55,0x6b,0x65,0x58,0x4d,0x49,0x54,0x74, - 0xc5,0xc1,0xdb,0x51,0x1f,0xea,0x58,0x27,0xf2,0xfc,0xd6,0x29,0x2a,0xcf,0xc9,0xcc,0xbf,0x4c,0x6f,0x6d, - 0x7b,0xb0,0xb3,0x6d,0xa8,0x02,0x18,0xe2,0xbe,0x1b,0x10,0x8a,0x9d,0x18,0xb6,0x81,0xac,0x73,0xb8,0x7d, - 0x83,0x21,0x4b,0xce,0x8a,0xbc,0x7a,0x50,0x16,0xf5,0x0a,0xc3,0xdc,0xa4,0x88,0x13,0x6c,0xd7,0x65,0x0a, - 0xcd,0x7d,0x64,0x58,0xbb,0x36,0xbb,0x9c,0x45,0xfb,0x21,0x97,0x1a,0x2f,0xfd,0xf4,0x80,0x0d,0x9d,0x64, - 0x9d,0xc4,0x0d,0xa2,0x6d,0xe6,0xdf,0xe2,0x03,0x53,0x87,0x6d,0x41,0xba,0xbb,0xb5,0xf5,0x22,0x98,0x07, - 0x5b,0x68,0xf4,0x16,0x7c,0x33,0x9f,0x94,0x70,0xf6,0xda,0xb2,0x81,0xbb,0x44,0xaf,0x33,0xd2,0x6d,0x81, - 0x48,0x24,0xab,0xe8,0x38,0x5b,0x92,0xb8,0x74,0xeb,0x28,0xdf,0x9a,0xfd,0xb3,0xee,0x86,0xbd,0x55,0x71, - 0x47,0x83,0xdf,0x76,0xb3,0x57,0x99,0x69,0x6c,0x5f,0xee,0xb6,0x6d,0x9c,0xe5,0xc1,0xac,0x64,0xb4,0xb9, - 0xde,0xa2,0x60,0xe7,0x83,0x31,0x82,0x2b,0x0e,0x07,0x88,0x3d,0x29,0x31,0xda,0x66,0xd6,0xee,0x1f,0xfd, - 0x11,0x32,0xf3,0xb0,0xa8,0x67,0x92,0x4e,0xda,0x33,0x96,0x82,0x74,0x59,0x27,0x66,0xa7,0xf9,0xb3,0x6b, - 0x74,0xb9,0x64,0xa3,0x8b,0xa1,0xf4,0xfa,0x39,0x0b,0xe0,0x38,0xe0,0x2c,0xde,0x4c,0x97,0xf4,0x81,0x12, - 0xca,0x27,0x72,0xe9,0x9f,0x07,0x30,0x53,0x38,0xd7,0xa0,0x77,0xe7,0x13,0xf2,0x0b,0x73,0xcf,0xa2,0x05, - 0x11,0x5f,0xc7,0xeb,0xcc,0xa5,0x00,0xc5,0x05,0x23,0xa6,0x0a,0x75,0x67,0x17,0x52,0x46,0x5b,0xd5,0xd8, - 0x8e,0xb5,0x12,0x87,0x5a,0x44,0xdf,0xbe,0x70,0x5d,0x0d,0x7b,0xd0,0xfc,0xd7,0xa6,0x1f,0x6a,0xfe,0x70, - 0x71,0xb6,0x4c,0xb1,0xf9,0x48,0xef,0x69,0x55,0xee,0xa4,0x5a,0x5b,0x86,0xba,0x3c,0x48,0xe0,0xb7,0xd2, - 0xc7,0x2a,0x21,0xc2,0x69,0x2e,0xaf,0x04,0xeb,0x3e,0xbc,0xb9,0x97,0xfa,0xe7,0xd2,0xb1,0xc1,0xce,0x83, - 0x0f,0x72,0xc6,0xc0,0xd6,0x07,0x3c,0x61,0x70,0x63,0xeb,0x99,0x12,0x89,0x89,0x39,0x95,0x37,0x9c,0xff, - 0xf9,0xa0,0x09,0x1f,0xe4,0x30,0xd8,0xbb,0xdd,0x94,0x6e,0xe6,0x9d,0xb1,0x11,0x85,0x98,0xc3,0xde,0xf9, - 0x45,0x63,0x30,0x22,0x25,0xdf,0x48,0xe6,0x2d,0xa5,0x53,0xb3,0xea,0x45,0x0e,0x07,0x5f,0xe6,0x14,0x40, - 0xc3,0xeb,0x56,0x51,0x33,0x17,0x01,0x2a,0x2c,0x2d,0xe8,0x64,0x81,0xc4,0x2b,0x47,0x01,0x33,0x89,0xc2, - 0x8b,0xca,0x8e,0x17,0xce,0x6e,0x77,0xab,0xa5,0x77,0xa2,0xb6,0x52,0x46,0xda,0xf6,0xb3,0x04,0xde,0x1d, - 0xdb,0x45,0xf6,0x9e,0x56,0x05,0xc1,0xd0,0x5b,0xfd,0x2d,0x7b,0x17,0xd1,0xa6,0x81,0x05,0xe0,0xce,0x05, - 0x2c,0x5d,0xf1,0x8e,0x5d,0x92,0xc2,0x3c,0xb5,0xab,0x96,0x84,0x78,0x9f,0xed,0x31,0x61,0xfb,0x47,0xf4, - 0xd3,0x46,0x3e,0xb1,0x74,0x9f,0xb7,0xbb,0x97,0xc1,0x51,0x0d,0x6a,0x60,0xed,0xea,0x0e,0x4a,0x66,0x17, - 0x04,0x61,0xc7,0x56,0x3f,0x9f,0x13,0xe5,0x44,0x73,0x8b,0x06,0x02,0xbb,0x8b,0xf8,0xac,0xd0,0x19,0x9b, - 0x91,0x7e,0xbd,0xc5,0xf3,0x61,0x7b,0xe9,0x5d,0xdb,0xab,0x83,0x6d,0x9f,0xe9,0xf1,0xb3,0xe9,0xa7,0x8d, - 0x94,0x66,0xe2,0xa3,0x84,0xbd,0xdd,0x82,0x76,0x2b,0x8a,0x95,0x37,0xac,0xa3,0x8b,0xad,0xe8,0x82,0x7e, - 0x69,0xb7,0x5b,0x28,0x09,0x23,0xfb,0x55,0xdb,0x54,0xae,0x3d,0x81,0x6a,0xd3,0x43,0xf0,0x26,0xe1,0x46, - 0x56,0x38,0x64,0x45,0x7e,0x7d,0xdb,0x26,0xb5,0xf9,0x34,0x99,0x90,0x19,0xef,0x0e,0x56,0x3d,0xc3,0x10, - 0x0f,0x5d,0x34,0xee,0x29,0xbf,0x10,0x0b,0x8b,0x55,0x23,0xc2,0x9b,0x7c,0xb8,0xce,0x71,0xae,0xc0,0xd9, - 0x6d,0xa6,0x7f,0x07,0x2e,0x8f,0x93,0x44,0x42,0x92,0x86,0xd4,0x2d,0xe2,0xa3,0x25,0x22,0xda,0xfd,0xd9, - 0xc6,0x2a,0x14,0xcd,0x2b,0x3a,0xb2,0x79,0x53,0x7f,0x8d,0x14,0xa5,0x09,0xb2,0x5b,0xe6,0x30,0x4c,0x63, - 0x0c,0x19,0x95,0x6c,0xb6,0x25,0x43,0x8e,0x5b,0x8d,0xf0,0x6f,0x25,0x6d,0x55,0xdc,0xe7,0x5e,0x16,0xfb, - 0x69,0x96,0x16,0xd9,0x8b,0x62,0x25,0xb4,0x35,0x6d,0x58,0xcd,0x0e,0x9e,0x52,0xb2,0xa0,0x60,0xff,0xf5, - 0xda,0x1e,0x1e,0xda,0xfc,0xa3,0x03,0xfc,0xa3,0x87,0x44,0x94,0xb6,0xaa,0xa0,0xf1,0x82,0x39,0xa9,0x57, - 0x9a,0xec,0x76,0xeb,0x8f,0xe1,0x27,0xbd,0x42,0x99,0xf8,0xac,0x5e,0xc5,0x3b,0x5c,0xf1,0xa9,0x60,0x02, - 0x46,0x0d,0xb6,0x39,0x49,0xa4,0x7f,0x36,0xa6,0xbf,0x4d,0x7c,0x70,0xe4,0x47,0xc1,0x8a,0xdd,0xf6,0x32, - 0xdc,0xcf,0x6d,0x8f,0x52,0x35,0x36,0x4f,0x26,0xc6,0x2b,0xa6,0x64,0x9a,0xa5,0xcd,0x34,0x2e,0x27,0xbc, - 0xcc,0x9f,0x66,0x69,0x79,0x5b,0x6d,0x97,0x56,0x66,0x5b,0xf2,0x0e,0x49,0xd1,0xb3,0xaa,0x12,0x4a,0x5b, - 0xd7,0x93,0xdb,0xd7,0x66,0xef,0x12,0x18,0xfd,0xe7,0x33,0x79,0x39,0x4f,0xfc,0x95,0x4c,0x05,0xf4,0xfe, - 0x1a,0x44,0xfe,0xd5,0x75,0xce,0x9a,0x2a,0x3d,0xd7,0xc8,0x62,0x71,0x93,0x1b,0x81,0xda,0xd6,0xfe,0x11, - 0xef,0xa4,0x19,0xfc,0x4c,0xb3,0x24,0x3e,0x93,0x63,0x40,0x3d,0xb4,0x88,0x3f,0xc6,0xe1,0xe3,0x46,0x66, - 0x68,0xbf,0x55,0x5a,0x75,0x47,0xdf,0x22,0x26,0x02,0x6c,0x8f,0x69,0xb9,0xed,0x87,0x7f,0x05,0xcc,0xe5, - 0xa7,0x37,0xde,0x52,0x26,0x71,0x99,0xdc,0x7e,0x91,0x54,0xad,0xa0,0xbe,0x6f,0x4a,0x69,0x67,0xf0,0x02, - 0x3c,0x0e,0x2c,0x29,0x5a,0x5b,0x8d,0x5c,0x20,0xd6,0xa6,0x4a,0x1b,0xb8,0x68,0x07,0x7b,0x60,0x76,0xb0, - 0xa7,0x7e,0x74,0xee,0xa7,0xf7,0x40,0xb0,0x06,0xa1,0xd7,0x2c,0xfc,0x24,0x8c,0xa7,0x67,0xb6,0x3c,0xe0, - 0xa7,0x6b,0xd0,0x32,0x9b,0xe4,0x15,0x3a,0xee,0x3d,0x68,0x1f,0x91,0x4f,0x6a,0x13,0x26,0x13,0x7a,0x84, - 0x0d,0xae,0x01,0x61,0x71,0x55,0x66,0x0e,0x1f,0x6d,0xf5,0xf1,0xbf,0xf2,0xb8,0xb1,0xed,0x0a,0x75,0xb7, - 0x62,0xcf,0xb1,0xa7,0x4d,0xe1,0xf8,0x49,0x23,0xdf,0x83,0x44,0x16,0x8d,0x1e,0xcf,0x13,0x58,0x82,0x7d, - 0xcd,0x8a,0x84,0xc1,0xee,0x46,0x79,0x8e,0xe5,0xac,0x03,0x16,0x37,0xa8,0x96,0xa4,0x74,0xa2,0x75,0x36, - 0x07,0x58,0x45,0x41,0xdb,0xf5,0x12,0x69,0x27,0x2f,0x62,0x6f,0x9e,0x36,0xd4,0xaf,0x20,0x5f,0x61,0xa3, - 0x87,0xdb,0x42,0x95,0xeb,0x2c,0x57,0xf6,0xab,0x71,0x6a,0xf8,0x3c,0xd5,0xd3,0xd4,0xa1,0x57,0x37,0x77, - 0x3d,0xd2,0x5d,0xa1,0x6b,0x6b,0x2f,0xb5,0xd5,0x3a,0xbf,0xb0,0x55,0x35,0x76,0x4f,0x76,0x16,0x9f,0x3c, - 0x97,0x78,0x5e,0xca,0x26,0x2d,0xde,0xca,0xb3,0x4c,0x54,0x64,0x06,0x3b,0xb2,0x7c,0x9e,0xd4,0x8c,0xa2, - 0xa1,0x8b,0x5c,0x61,0xcc,0x64,0x16,0xbc,0x61,0x4a,0x5c,0x33,0xaf,0x93,0xb4,0xf1,0xb2,0x89,0xe7,0x3c, - 0xc8,0xfc,0xf0,0xf3,0x36,0x0f,0xb7,0x6c,0xf8,0x1e,0x0e,0xcc,0x7e,0xaf,0xb1,0xa4,0x43,0x2b,0x7f,0xc8, - 0x3e,0x93,0x0b,0x8b,0x6d,0x4d,0x16,0x4b,0x1c,0x6c,0x60,0x76,0x23,0x8c,0x9a,0x4a,0xdb,0x8e,0x15,0xa8, - 0x42,0xd8,0xae,0xa5,0xc6,0x4e,0x8f,0xfa,0x2a,0xbc,0xb3,0xbd,0x20,0x77,0x2f,0x01,0xb1,0x5f,0xdc,0x8f, - 0xe0,0x06,0x04,0xb0,0xf2,0xe8,0xfa,0x0b,0xec,0xd7,0x54,0xcd,0x39,0xc3,0x43,0xbf,0xa5,0xc5,0xc1,0x79, - 0x07,0x60,0xc2,0x73,0xa1,0x62,0xbf,0x2d,0x8f,0x8e,0x5a,0x28,0xa8,0x54,0x6c,0xf6,0x1b,0x7e,0xa5,0xdf, - 0x3b,0xd7,0x31,0x31,0x5e,0x79,0x25,0x91,0xa0,0x5a,0x60,0x56,0xeb,0x5d,0xf2,0x94,0xe3,0xda,0x44,0x50, - 0xa0,0xb2,0x0e,0x55,0x28,0x56,0xaf,0xbe,0x4a,0x4b,0xc8,0xe2,0x75,0x76,0xa2,0xcb,0x8d,0x87,0xa1,0x79, - 0xb7,0xe8,0x01,0xd5,0x26,0x50,0x22,0xb7,0x65,0xa5,0xfa,0xee,0x5e,0xab,0x5b,0xd0,0xa4,0x34,0x92,0xde, - 0x1e,0x23,0x11,0x93,0xd2,0x0e,0xb4,0x2d,0x56,0xf6,0x50,0x63,0xa6,0xc1,0xa2,0x2f,0x70,0x7a,0x7d,0x67, - 0x9c,0x0f,0x43,0x8d,0xf4,0xa4,0x11,0x58,0x58,0xdf,0xa6,0x55,0xc8,0x82,0x50,0x56,0xe8,0xe2,0x7f,0x48, - 0xcc,0x01,0x69,0xc5,0x25,0xf4,0xd9,0x1a,0x41,0xd0,0x77,0x23,0x06,0xaa,0x14,0x64,0xec,0xed,0x2d,0x01, - 0x04,0x95,0x02,0x55,0xb3,0x5d,0xda,0xc5,0xae,0xd2,0x80,0xb0,0x7a,0xe1,0xad,0x2f,0x2a,0x26,0xc4,0x61, - 0x15,0xed,0x12,0x97,0xdb,0xe1,0x54,0xa4,0x18,0x7a,0xbb,0x95,0xd7,0x2f,0x82,0xd5,0xe2,0x7a,0x8b,0x51, - 0x22,0x67,0xe3,0x7f,0x3e,0x8a,0x27,0x7f,0xc5,0x46,0x81,0x72,0x6b,0x83,0xe0,0x0e,0xf1,0xc4,0x41,0x3e, - 0xdd,0xd6,0x3c,0xdb,0x73,0x37,0xd5,0x76,0x92,0x1d,0x2a,0x27,0x3b,0x87,0x24,0xea,0xfa,0x84,0x17,0xad, - 0xca,0xec,0xd0,0xd9,0x6d,0x25,0x27,0xd0,0xaa,0xe8,0x91,0xfd,0x48,0xa9,0xdd,0x56,0x7a,0x65,0xe9,0xa2, - 0x56,0x13,0x2d,0x6a,0xa2,0xda,0x1c,0x78,0x8e,0xa1,0x4a,0xf0,0x1b,0x6d,0x56,0x30,0x47,0xd3,0x71,0xe6, - 0x4f,0x36,0xa1,0x9f,0xe0,0x7d,0xea,0x8e,0xc3,0x9b,0xae,0xaf,0x8b,0x46,0xa5,0xc2,0xfb,0x0a,0xcf,0x12, - 0x56,0xc9,0xb9,0x1c,0x69,0x15,0x5b,0xad,0x44,0x82,0xbd,0xb6,0x44,0xc1,0x12,0xb8,0x55,0xe1,0xd0,0xbc, - 0x48,0x2f,0x44,0xc1,0xd0,0x87,0x8b,0x05,0xe3,0x30,0x81,0x52,0x08,0x79,0x93,0x06,0x39,0x61,0xd4,0x2d, - 0x6b,0x57,0xd5,0x96,0xac,0x85,0x75,0xaa,0xa0,0x8d,0x51,0xae,0xbb,0x2c,0x8e,0xa9,0x61,0xa1,0x9a,0x1a, - 0xa5,0x6e,0xa0,0x5d,0x6c,0x80,0xc4,0x9f,0xff,0xbc,0x92,0xb3,0xc0,0x3f,0xa0,0x0f,0xa8,0xc9,0xfa,0xb5, - 0x3d,0x45,0xbb,0x3f,0xb6,0x67,0x53,0x2b,0x56,0x5f,0x1e,0x0f,0xa3,0x84,0x2a,0x2b,0xec,0xa1,0x63,0x33, - 0x00,0xc4,0xfd,0x41,0x41,0x61,0x73,0xe7,0xfb,0x5e,0x6b,0xd6,0x6e,0xb7,0x87,0xb3,0xc3,0x0a,0x39,0x9f, - 0x91,0xba,0x33,0xa8,0xd8,0x31,0x50,0xf6,0x65,0x39,0x90,0xb3,0x79,0xb7,0x62,0x68,0xbb,0x09,0x58,0xc5, - 0x07,0x6e,0xb8,0xcc,0xbd,0xf9,0xa8,0xdf,0xee,0x1d,0x56,0x95,0xdb,0x15,0x15,0xb3,0x25,0x14,0xc6,0xb1, - 0xb4,0x5b,0x35,0x5a,0xca,0x67,0xdf,0x52,0x3e,0xc9,0x2e,0x12,0x27,0xa9,0x5c,0xef,0xaf,0x98,0xec,0x32, - 0xda,0xb7,0xb5,0xc4,0x9b,0x93,0xed,0x0d,0xfa,0xd1,0x4f,0x81,0x36,0x95,0x1d,0xc7,0x87,0x72,0xa5,0x5a, - 0x1f,0x8f,0xfd,0x39,0xbc,0x6b,0xe8,0xbb,0xb2,0xc1,0x54,0x91,0x28,0xdd,0xf1,0x1d,0x02,0x0d,0x28,0xda, - 0xcb,0xd9,0x9e,0xee,0xca,0xbd,0x0a,0x5f,0x3f,0xfc,0x1a,0x28,0x55,0x56,0xa1,0x24,0xf4,0x5a,0x9f,0xb1, - 0xbf,0xe6,0x90,0x83,0xdb,0xfc,0xe6,0x98,0xd6,0xee,0x41,0xf7,0x74,0x2f,0x41,0x52,0xf3,0x13,0xee,0x2a, - 0xf0,0x27,0x41,0x52,0x81,0x9e,0x25,0xe5,0x74,0xb6,0xc0,0x12,0x25,0x53,0x49,0xa7,0x6c,0x32,0xdb,0xcb, - 0x81,0x4b,0xd7,0x58,0xb4,0x98,0x90,0x1b,0x58,0xb7,0xe4,0xcb,0x7d,0x54,0x8c,0x60,0xc8,0xa3,0x25,0xcb, - 0x1e,0x80,0x45,0xcf,0xbb,0xdb,0x5c,0x0c,0x0b,0x7d,0xa9,0x76,0x1b,0x2c,0x14,0xaa,0x74,0x12,0xb4,0xbb, - 0x56,0x85,0xc2,0x5b,0xf6,0x30,0xf5,0xee,0x81,0xf1,0xed,0x3f,0xda,0xc3,0xfb,0x60,0x0b,0x89,0xd3,0x6b, - 0xb2,0x85,0x59,0x28,0xe2,0x45,0x6e,0xf9,0xd8,0x1b,0x3d,0xfd,0xe5,0xdd,0x64,0x32,0xc8,0x8c,0x72,0x41, - 0xb8,0xd2,0x80,0x51,0xb5,0xc1,0xab,0x48,0x5c,0x19,0x1c,0x2d,0x1d,0x16,0xad,0x72,0x6e,0x0f,0xca,0xc6, - 0x5c,0x2d,0x21,0xf9,0x6e,0xc1,0x9d,0x64,0x0f,0x18,0x34,0xef,0xfb,0x54,0x88,0x22,0xb6,0x8f,0x5d,0xdf, - 0xa5,0xf0,0x6d,0xb6,0xec,0x9a,0x3a,0x74,0xfc,0xad,0x91,0x31,0xec,0x6f,0x87,0x85,0x6f,0xed,0x2f,0x3d, - 0x90,0xf6,0x80,0xe0,0x14,0x69,0x81,0xfb,0xda,0xe9,0x22,0x21,0x5b,0xeb,0xcf,0xa5,0x32,0x56,0x54,0xa9, - 0x76,0x18,0x2e,0x94,0xf0,0xc8,0x8e,0xed,0xd4,0xe2,0xc8,0x42,0x45,0xe3,0xba,0xd7,0xad,0x50,0x36,0x0a, - 0x75,0xfa,0x5c,0x69,0x51,0x3d,0xdc,0xa0,0x5c,0x89,0x95,0x6d,0xf9,0x60,0xab,0x38,0x04,0x5a,0x48,0x76, - 0x59,0x56,0xcb,0x1c,0x7f,0xf5,0xa2,0x0b,0x8b,0x02,0xe4,0xdb,0xdc,0x82,0x2d,0xe6,0x3b,0xf3,0xd3,0xa5, - 0xbc,0xdd,0xfe,0x70,0xe3,0x61,0x10,0x87,0x8e,0x85,0xea,0xec,0xf7,0x61,0x69,0x7f,0xa7,0xb3,0x67,0x77, - 0x0b,0xdb,0x1e,0x3b,0x15,0x1c,0xeb,0xb2,0xb0,0x1b,0xc8,0x7d,0xbe,0x45,0xb9,0x29,0x51,0x2a,0xfc,0xc6, - 0xdb,0xfb,0x93,0x62,0x84,0xb5,0x09,0xb1,0xbf,0x21,0xa6,0xa0,0xe0,0x67,0xb4,0x4b,0xf9,0x77,0xe7,0xac, - 0x57,0x56,0xf0,0xa8,0xaa,0x87,0xbb,0x6c,0x01,0x96,0x9f,0xd7,0xb6,0x58,0x88,0x8a,0x66,0xac,0x69,0xa5, - 0x8f,0x85,0xd7,0x49,0x55,0x5b,0xde,0x32,0xce,0xaa,0xa5,0x1e,0x20,0xe5,0x19,0x80,0xf6,0x02,0x00,0x39, - 0x9c,0x84,0x77,0xf1,0x92,0xb8,0xc5,0xd3,0xe0,0xc6,0x9b,0x52,0x56,0x8e,0x8a,0x9d,0x3c,0x78,0xe1,0xce, - 0x3a,0xa5,0x9e,0xb8,0xa3,0xea,0x5c,0xb4,0x54,0x18,0x0e,0x8d,0x66,0x4b,0x33,0xe3,0x64,0xe5,0xe4,0xc0, - 0x3b,0x04,0xf2,0x5b,0xb2,0x86,0x38,0x1a,0xd9,0x3a,0x91,0x44,0xb7,0xca,0x3b,0x2e,0x7e,0x18,0xde,0x78, - 0xf8,0xd1,0xf5,0xfe,0x35,0x97,0xc9,0xcd,0xda,0x0f,0xc9,0x01,0xea,0x73,0xac,0x96,0xc6,0x89,0xb9,0xcb, - 0x4e,0xe8,0x8e,0x53,0x73,0x2e,0x87,0x95,0x43,0x55,0xb0,0xd5,0xe5,0x6c,0x5f,0x4f,0x5c,0x55,0x5c,0x60, - 0x36,0x07,0x2d,0x0e,0xb1,0x29,0x97,0x9f,0x63,0xdc,0xe0,0xb9,0xbb,0x7d,0x58,0x86,0x0a,0xc3,0x38,0xd4, - 0x66,0x11,0xed,0x84,0x95,0x6a,0xb1,0xc5,0xe9,0x42,0x18,0x36,0x95,0x73,0x8c,0xe1,0x79,0x90,0x00,0x91, - 0xb2,0xc4,0x5f,0xad,0xb7,0xef,0x5f,0xd8,0xbb,0x42,0x65,0xa4,0xd9,0x0d,0x73,0xd4,0x74,0x18,0xa4,0x59, - 0xb9,0xe9,0xae,0xea,0x18,0xbe,0x15,0xde,0x22,0x59,0xef,0x69,0x46,0x18,0xda,0x70,0xdb,0xe5,0x8d,0x88, - 0x12,0x0f,0xa6,0x4d,0xcf,0x82,0x68,0xdf,0x97,0xab,0xed,0x8a,0x40,0x25,0x78,0x99,0xae,0x8d,0xe7,0x41, - 0x62,0x3c,0xd1,0xed,0x00,0x15,0x0a,0xbf,0x08,0xbf,0xcc,0x73,0x5e,0xcb,0x46,0x15,0x60,0xb4,0xb7,0x8d, - 0x6c,0xbb,0xc0,0x3a,0x72,0xe5,0x37,0x51,0x91,0x84,0x63,0x3b,0x3b,0xe9,0x14,0x78,0x08,0xd2,0x43,0x1e, - 0xef,0x76,0x2e,0x62,0xaf,0x3c,0x16,0xfc,0xfc,0xa8,0xf2,0xb6,0x82,0x10,0x74,0xb7,0xc5,0x10,0x95,0xbd, - 0xf3,0x79,0x44,0xbe,0x69,0xfe,0x0e,0xde,0xfe,0xc3,0xa2,0x3d,0x4a,0xd7,0x80,0xd6,0x28,0xa6,0x53,0x28, - 0xda,0x39,0x16,0xd7,0x2a,0xd2,0x56,0x5d,0x49,0xe6,0x2f,0xb6,0xd8,0x99,0xaa,0x60,0xb5,0xb7,0x2f,0xac, - 0x2a,0xc7,0x0f,0xdd,0x4a,0xf5,0x16,0x74,0x2f,0x9f,0x48,0xc1,0xc8,0x5e,0xa2,0x99,0x8e,0xf6,0x8d,0x64, - 0x45,0xfa,0xb3,0xcf,0x8f,0x4d,0x53,0x15,0x3c,0xdc,0x22,0x3f,0xb7,0xfb,0x2d,0xd5,0xcc,0x14,0x96,0x2d, - 0x2b,0xcc,0x8b,0x12,0xa1,0x6f,0xb1,0x6c,0xeb,0x8f,0x3d,0x40,0xa9,0xeb,0x8a,0x19,0xc1,0x61,0x7a,0x93, - 0x60,0xa1,0x45,0x8e,0x7e,0xaf,0x2a,0x60,0x8c,0x49,0xe3,0xfe,0x91,0x15,0x56,0x4a,0x00,0xf8,0x10,0x23, - 0x29,0xf6,0x08,0xe7,0xc8,0xa3,0xfe,0xf4,0x42,0xe0,0x87,0x63,0x96,0x67,0x5d,0x67,0x4b,0xec,0x8d,0xed, - 0x2a,0x58,0x8c,0x8d,0x35,0x8a,0x30,0x1a,0x4f,0xc9,0xb7,0xb3,0xe9,0x4f,0xad,0x5d,0x17,0x9c,0x78,0x3f, - 0x9a,0x85,0x32,0xbd,0xdd,0xbd,0x55,0x55,0x95,0xef,0xad,0x1e,0xea,0xb5,0xdf,0xea,0xe6,0xbb,0xc3,0x7f, - 0x44,0x7b,0xe4,0x5b,0xac,0xe7,0xd0,0xcd,0x8a,0xb0,0xdd,0xcd,0xa7,0xa4,0x62,0x33,0x7d,0x5a,0x24,0xfe, - 0x64,0xb7,0x59,0x53,0x47,0x9b,0x60,0xa7,0x41,0x20,0xdc,0xe2,0xca,0xe0,0x56,0x6f,0xcb,0xfb,0x5e,0xbf, - 0x40,0x86,0x58,0x8a,0x2a,0x38,0x94,0x59,0x71,0xbb,0x8b,0x7a,0x83,0xef,0xbb,0x8e,0x8b,0x89,0x45,0x41, - 0xed,0xfd,0x05,0xa6,0x96,0xcb,0xfd,0xa2,0x7b,0x09,0x40,0xfa,0x7b,0x7a,0xeb,0xa8,0x01,0xf4,0x76,0x31, - 0x80,0x0a,0xd3,0x01,0x09,0xf4,0xd4,0x25,0x22,0xdf,0x30,0x65,0x79,0x1b,0x94,0x56,0xf2,0xa0,0x0d,0x44, - 0x5e,0x95,0x01,0x9a,0xfb,0x30,0xd8,0x63,0x13,0x44,0x7f,0xd8,0xe9,0xe7,0x1f,0x9a,0x21,0xdf,0x66,0xc6, - 0xa0,0xf2,0x33,0x90,0x9f,0xaf,0xad,0x45,0x9f,0x00,0xc4,0xa8,0x7e,0x16,0x92,0xac,0xd8,0x4f,0x35,0x4f, - 0x79,0x78,0xf7,0xec,0x22,0x58,0x4b,0x2a,0xef,0x86,0xf6,0x05,0xfa,0x06,0x9f,0x8b,0xed,0x49,0x48,0xac, - 0x46,0xaa,0xe2,0x5c,0x94,0x30,0xd8,0x12,0x83,0x91,0xd9,0xe2,0x1f,0x8c,0xac,0x6f,0xbc,0x75,0x78,0xed, - 0xd2,0x9a,0x09,0xd0,0xe3,0x12,0xd5,0x2e,0x90,0x9a,0xb2,0x6b,0xd2,0x66,0x5d,0x2d,0x7c,0xf5,0xca,0x56, - 0xe9,0x0a,0x12,0x1b,0xa4,0x67,0x72,0x8b,0x8c,0x5d,0xa6,0x50,0xc5,0x9d,0x97,0x6a,0xad,0xe5,0xf3,0x02, - 0x4a,0xd5,0xb4,0x6a,0x67,0xfc,0xd9,0xf9,0x52,0x34,0x45,0x75,0x38,0x69,0x53,0x8c,0xd0,0xb7,0xc9,0x4d, - 0xf3,0xc3,0xec,0xc6,0x0c,0x47,0x04,0xe4,0x2d,0xb5,0x6d,0x7f,0xcc,0x18,0xa9,0x0a,0xfb,0x5d,0x5c,0x41, - 0x18,0x63,0xfc,0xe4,0xad,0x76,0xb7,0xf6,0xd1,0x1d,0xa3,0x7e,0x76,0xef,0x36,0x94,0xfc,0xe7,0x29,0xd5, - 0xc4,0x1e,0xa6,0x83,0xca,0x65,0xb0,0xc7,0x22,0x3c,0x0c,0x0d,0xbb,0xb6,0xfc,0x43,0xf4,0x56,0xc6,0x16, - 0x5f,0x5f,0x9e,0x9d,0xee,0xee,0x15,0x04,0x6a,0x56,0xa6,0x19,0xb9,0x93,0xdd,0x3a,0x3d,0xc3,0x56,0x85, - 0x37,0x4a,0x05,0xef,0x39,0x01,0x9a,0xcc,0x31,0xc3,0xad,0xb4,0xfb,0x86,0xce,0x77,0xaa,0x7f,0x0e,0x9f, - 0xb4,0x1c,0xde,0x54,0x4d,0xd7,0x59,0x6c,0xd1,0xb2,0x24,0xce,0x80,0x58,0x1e,0x74,0x07,0xad,0x99,0x5c, - 0xa0,0x9f,0xdb,0x4a,0x86,0x71,0x35,0x26,0x10,0xd6,0xe1,0xeb,0xbb,0x09,0xf1,0x87,0x3a,0x9f,0x41,0xae, - 0x3a,0x76,0x1d,0xa9,0xfe,0xb3,0x24,0xfa,0x2a,0xa1,0x5d,0xa7,0xda,0x30,0xbd,0xd4,0x21,0x4a,0xb6,0x94, - 0xa9,0x5f,0x79,0x49,0xb6,0x4d,0x56,0xb5,0x0a,0x6d,0x95,0x12,0x6d,0xf9,0xc6,0x94,0xae,0xf6,0x86,0x28, - 0x59,0x64,0x2b,0xbd,0x8e,0x34,0x5a,0xf5,0xac,0xfe,0x7b,0x48,0xca,0x34,0xc5,0x2e,0x12,0x02,0x26,0x5b, - 0x56,0x49,0xd5,0x7e,0x99,0xb4,0xe9,0x32,0x80,0x54,0x20,0x46,0xdd,0x1a,0x75,0xa0,0x05,0x28,0x2a,0x31, - 0xb4,0xbb,0x93,0xab,0x16,0x95,0x5f,0xa3,0x8f,0xe9,0xd6,0x8f,0x8d,0x69,0x15,0x66,0x12,0x0a,0x7c,0x49, - 0xd2,0xbe,0xbc,0x43,0xab,0x75,0x77,0x7b,0xf8,0x21,0x6f,0xf7,0xb2,0xfa,0x6f,0x7d,0x40,0x5a,0xca,0x17, - 0xec,0x87,0x3b,0x55,0xa5,0x57,0xd7,0x9f,0xb3,0xef,0xed,0x40,0x4c,0xa5,0x78,0xeb,0xaf,0xb7,0xf0,0x23, - 0xda,0x16,0x82,0xb7,0xfb,0x66,0xc4,0x18,0xdd,0xea,0x4f,0x5c,0x85,0x4a,0x3a,0xff,0xde,0x6e,0xfd,0xb9, - 0xc8,0xec,0xb9,0x5b,0xde,0x6c,0xf7,0x96,0x2a,0x97,0x42,0x6b,0x41,0xb0,0xb6,0x65,0x99,0x5d,0x06,0x9d, - 0x62,0x10,0xe2,0x6e,0x7f,0xf6,0x92,0xb8,0xef,0xe8,0xf5,0xbd,0x3c,0x91,0x0b,0x26,0x17,0x11,0xcd,0x4e, - 0x3e,0xa5,0x20,0x4e,0xc4,0x69,0xf5,0x92,0xb2,0xff,0xdc,0xad,0x66,0x3d,0x66,0x0e,0xad,0x0a,0xe7,0x41, - 0x9b,0x64,0xe8,0xd6,0xe0,0x0f,0x65,0x9a,0x31,0xfb,0x09,0x2d,0x67,0xf3,0x64,0x97,0x23,0xd5,0x96,0xf5, - 0x1e,0xd8,0x83,0x31,0xde,0x21,0xb8,0x53,0x41,0xeb,0xb9,0xc5,0x4b,0xa4,0xcb,0x5e,0x22,0x95,0xe6,0xc7, - 0xbc,0x32,0x81,0xc9,0x3a,0x0a,0xe6,0xaf,0x5b,0xf7,0x43,0xf3,0x0a,0xa6,0x4b,0x58,0xf0,0x9d,0x7e,0x23, - 0x76,0x0a,0x2f,0x7b,0x7f,0x9f,0x2c,0xe3,0xfd,0x7e,0xd1,0xfd,0xcb,0x56,0x9b,0xda,0x56,0x20,0x41,0x61, - 0x92,0xb1,0x5d,0xcf,0x5d,0xd5,0xf8,0xac,0x40,0x6b,0xee,0x75,0xa4,0xdf,0xea,0x75,0xfb,0xfd,0xe2,0x67, - 0x67,0x41,0x45,0x1e,0x82,0x5d,0xc6,0x1c,0x5c,0x52,0x67,0xc3,0xd1,0xc8,0x7d,0xbb,0xec,0x93,0xea,0xab, - 0x87,0xde,0x6a,0x92,0xe5,0xdb,0xb2,0x3d,0x8d,0x86,0xd6,0xac,0xf5,0x8a,0xe0,0x6e,0x7f,0x4c,0x34,0x63, - 0x5b,0x0a,0x81,0x5b,0xe2,0x34,0x7b,0x36,0xec,0x51,0xc0,0xf8,0x3e,0x82,0x99,0xd5,0x55,0xb3,0x0b,0xfa, - 0x47,0xb8,0xae,0x8e,0xb6,0x86,0x7b,0xa2,0x8f,0xcd,0xb0,0x38,0xe8,0x2d,0x21,0x99,0x6e,0xa1,0x87,0xe5, - 0x6d,0xd7,0xc2,0xee,0xe8,0x51,0x29,0x73,0x4e,0x71,0xff,0x6b,0x5f,0xdd,0x5c,0xa7,0x2d,0x2a,0x37,0xbf, - 0x3b,0x80,0x66,0xcb,0x47,0x55,0x59,0x5a,0x81,0xe7,0xd7,0xb5,0xaf,0x8f,0x9d,0x0a,0x03,0xe3,0x4d,0xae, - 0x8b,0x40,0x91,0x2f,0x2d,0x46,0xa6,0x0c,0x5b,0xe7,0x17,0x8d,0x0e,0x47,0xa6,0x18,0x88,0x2f,0xf8,0x04, - 0xf4,0x94,0xe7,0x59,0x71,0xb3,0x45,0x51,0x79,0x50,0x12,0x73,0xfa,0x65,0x32,0xf9,0x0e,0x19,0x81,0xa6, - 0x73,0xb6,0xe1,0x41,0x1f,0x81,0x69,0xaa,0xad,0x26,0x27,0x17,0xcb,0xd1,0xae,0xe8,0x54,0x9e,0x08,0xae, - 0x67,0xcb,0xca,0xf2,0x4b,0xc1,0xc9,0x58,0xec,0x55,0x6b,0xe5,0xef,0xe0,0x4f,0xc9,0x7b,0x62,0x07,0x9b, - 0xb4,0xcd,0xd5,0x2c,0x47,0xca,0x19,0xe9,0x74,0x77,0x07,0xdc,0x2d,0xb9,0x8e,0xb8,0x3e,0x37,0x9e,0x7d, - 0x2b,0x9f,0x94,0x33,0xe8,0x34,0x48,0x7f,0xfb,0xc8,0xda,0x9d,0xae,0x93,0x98,0x2a,0xdf,0x9b,0xe9,0x94, - 0xf6,0x66,0x28,0x35,0xde,0x8d,0x87,0x29,0x10,0xe1,0x5a,0xee,0x93,0x72,0xc1,0x66,0x1a,0x7f,0x14,0x6e, - 0x97,0x76,0x2a,0x75,0x87,0x70,0x9b,0x7b,0x6f,0x9b,0x6a,0x51,0x66,0xd1,0xff,0xda,0x9d,0xdb,0xc5,0x9e, - 0xdb,0x3c,0x65,0x8a,0x1d,0x32,0x7b,0x53,0xed,0xe2,0x06,0x4a,0x31,0xf6,0x6c,0x7f,0x27,0xaa,0x81,0x5c, - 0x7d,0x9e,0x97,0x7c,0xc9,0x04,0x5f,0xea,0x6d,0x35,0x36,0x43,0xc1,0x4c,0x99,0x92,0x51,0xa6,0x81,0xde, - 0x0a,0xe6,0xc3,0xb7,0x45,0x46,0xfc,0x31,0x89,0xcf,0x6d,0x8e,0xad,0xbd,0x3a,0x0a,0x93,0xd2,0x32,0x5d, - 0xac,0x14,0x8c,0xf3,0x71,0xde,0x65,0x47,0xb0,0xf8,0xdd,0xce,0x3d,0xc0,0x79,0x86,0x89,0xc2,0xf6,0x45, - 0x0c,0xf5,0x69,0xeb,0x28,0x97,0xe1,0x74,0x15,0xde,0x2a,0x9e,0xa5,0xd7,0x56,0xa4,0x0b,0x5e,0x2a,0x73, - 0x05,0x96,0x21,0xc2,0x6c,0xd9,0xfc,0x4d,0x55,0xee,0xa6,0xb2,0xed,0x54,0x54,0x99,0x08,0xae,0x22,0x74, - 0x03,0xab,0xdf,0xb9,0x53,0x58,0x80,0xa5,0xb2,0xd3,0xcd,0xa0,0xc2,0x25,0xec,0x2e,0x68,0x44,0x65,0xfe, - 0x43,0x11,0x45,0x8d,0xd1,0x40,0xfa,0x67,0xa6,0x60,0xda,0xea,0xb6,0x5a,0x10,0xd2,0x2c,0x0b,0xfd,0x16, - 0x6f,0x56,0x6b,0x0d,0x3b,0x8e,0x2c,0x5a,0xe1,0xc4,0x55,0x10,0xe1,0xec,0x91,0xec,0x67,0x05,0x67,0x33, - 0x1a,0xa7,0x47,0x9c,0x67,0x38,0xa0,0x3b,0x53,0xcc,0xae,0xe3,0x6b,0xb6,0x5f,0x4a,0x98,0x6e,0x41,0x64, - 0xc7,0x7d,0x00,0x87,0x3f,0xec,0x50,0x18,0x75,0x47,0x6f,0x93,0x80,0x54,0xa9,0xcf,0xdf,0x0f,0x6d,0xb6, - 0xf3,0x59,0xf1,0xb6,0xe5,0xec,0xeb,0xec,0x92,0xe3,0xcb,0x41,0x04,0x9d,0x8a,0xb4,0x74,0xdc,0xc2,0x43, - 0x8b,0x98,0x58,0x0e,0x9c,0x74,0xbd,0x93,0x24,0xe9,0xfe,0x51,0x05,0x65,0x01,0x40,0xbd,0x97,0x49,0x52, - 0x2a,0xc0,0x86,0x1d,0x2e,0xb0,0x2d,0x08,0xe0,0x0b,0x6c,0x1c,0x79,0xcb,0x54,0xf9,0xf6,0x96,0xe7,0x1f, - 0xca,0xd6,0xb1,0xb6,0x03,0xf9,0x85,0xe8,0xda,0xa2,0xdb,0x7b,0x6a,0xd7,0x45,0xc9,0x82,0xd8,0x71,0xba, - 0xde,0xc8,0xa7,0x07,0x5f,0x35,0x1c,0xd0,0xa1,0x86,0x8d,0x1b,0xbb,0x5d,0xc5,0x1f,0xe3,0xb1,0x5e,0x9d, - 0xee,0xcd,0xc6,0x9b,0x6a,0x45,0x40,0x41,0x92,0x6d,0x23,0xd9,0xa6,0x3b,0x6a,0x3b,0x71,0x0e,0xa8,0x56, - 0xf7,0xb7,0xa5,0xd0,0xdc,0xa1,0x76,0x96,0xea,0x50,0x1a,0x43,0x45,0x55,0xc5,0x25,0x74,0x3c,0xd6,0x1b, - 0x5b,0x6b,0xe2,0xf7,0xaa,0x3e,0x2b,0xca,0xb3,0x98,0x3d,0xa0,0x40,0xf3,0x3f,0xdf,0x03,0xde,0xea,0xc8, - 0x76,0x0c,0xc3,0x62,0x30,0xd1,0xdb,0xa2,0x60,0xcc,0x99,0x09,0xb6,0xd4,0x51,0x30,0xdd,0xdf,0x78,0xe9, - 0xd2,0x4d,0x0d,0x7a,0x27,0x96,0x6f,0x13,0xf8,0x9d,0xb9,0x76,0x54,0x2b,0x5e,0xbc,0xd6,0xfd,0xd5,0x5e, - 0x4e,0x76,0x34,0x6c,0xaf,0xff,0x67,0x53,0x94,0x8e,0x56,0xa1,0xf2,0xf5,0x87,0xf0,0xcc,0xb1,0x08,0x32, - 0x0d,0x51,0x05,0x1f,0x6a,0xa1,0xb9,0x94,0x96,0xc5,0x7d,0x5f,0x90,0x9a,0x6c,0xec,0x28,0xb1,0xbb,0x72, - 0xf8,0x62,0xe5,0xde,0x2d,0x7a,0xba,0xd8,0x23,0x2b,0x34,0x55,0xda,0x6a,0x68,0x8f,0x78,0xab,0x41,0x8f, - 0xe7,0xcb,0x65,0x1d,0x67,0x4d,0xb0,0xde,0x2f,0xf3,0x32,0x1a,0xed,0x4e,0xcd,0xb9,0x9d,0x69,0xee,0x66, - 0x7d,0xd4,0xad,0xdb,0x38,0x1f,0x15,0x12,0xf0,0x73,0x76,0xbd,0xc5,0x52,0x57,0xb5,0x01,0xf9,0x25,0xa4, - 0x3e,0x6f,0xf1,0x96,0xe8,0x47,0xce,0x17,0xa4,0x4b,0x9f,0x3b,0xfd,0xcb,0xad,0x0f,0x87,0x3a,0x8a,0x87, - 0x7d,0x15,0xb7,0xa9,0x14,0xf9,0x31,0x50,0xb6,0x81,0xf4,0x8f,0x18,0xc6,0xb9,0x07,0x30,0x11,0xca,0x2a, - 0x47,0x17,0x39,0x03,0xf4,0xfc,0x2c,0xb5,0xf2,0xf0,0xce,0xe1,0x16,0xbc,0x9c,0xd4,0xa2,0xda,0x85,0xb2, - 0xed,0x6a,0xb7,0xa4,0x74,0xa9,0x14,0x48,0x72,0x7d,0xad,0x4b,0x07,0x82,0xb9,0x01,0xad,0x85,0xf0,0x01, - 0xa7,0x69,0xe5,0x1a,0xb0,0xe3,0x94,0x98,0x4a,0xeb,0x03,0x7e,0xaf,0xf6,0x8c,0xb8,0xef,0xc3,0x9c,0x6c, - 0x0e,0x6f,0x4b,0x6e,0x64,0xa7,0xee,0xc9,0x47,0x4b,0xb2,0x5c,0x10,0x22,0xd7,0xd6,0x6a,0x3f,0xb5,0x83, - 0x8a,0x92,0x6e,0xcb,0x2a,0xa3,0x44,0x3f,0xd3,0x99,0x54,0x4e,0xcb,0xe2,0x46,0xb7,0xc2,0xeb,0x20,0x2f, - 0xaf,0xe5,0x81,0xcf,0x66,0xd7,0xf6,0xc4,0x1e,0x56,0xa5,0x14,0x29,0x37,0xf6,0x19,0xdc,0x9b,0xeb,0xc8, - 0x4f,0x1a,0xfa,0xc3,0x95,0x19,0x9b,0xae,0x2a,0x7f,0x6f,0x8b,0x91,0x76,0x0b,0x3b,0x9a,0xc5,0xee,0x00, - 0x2d,0x8f,0x6e,0x4f,0x69,0x68,0xc7,0x5a,0x15,0xc4,0xe0,0xfc,0x40,0x84,0xb2,0x9b,0xd1,0x70,0xab,0xe3, - 0xb9,0x33,0x55,0x0b,0x0b,0x05,0x0e,0x11,0x03,0x7a,0x05,0xfa,0x52,0xda,0xe2,0xaf,0x1a,0xc7,0x0e,0xb5, - 0x5f,0x16,0x4c,0x4e,0x95,0xf8,0x52,0xf0,0xaf,0x20,0xf7,0x8a,0x4e,0xbf,0x55,0xf0,0xa3,0x50,0x19,0x25, - 0x25,0xa6,0xbc,0xdf,0x64,0x0d,0xba,0x58,0x86,0xfc,0x9b,0xf9,0xf6,0xbe,0x33,0x9d,0xec,0xe7,0x8c,0xc2, - 0x9f,0x30,0x78,0x75,0x2a,0xf6,0xb5,0x55,0x85,0x96,0x1b,0x60,0x25,0x7d,0xb4,0x69,0xea,0x7e,0x86,0x9c, - 0x5c,0x2c,0xd5,0x11,0x7a,0x15,0xca,0x7c,0x69,0x13,0x2e,0x5f,0xf0,0x5e,0xaf,0x8a,0x23,0x92,0xbe,0x34, - 0xb0,0x3a,0x2e,0x8a,0xbb,0x47,0xa5,0xf0,0x7a,0x53,0xb0,0x22,0xd2,0xcb,0x7e,0x8b,0xb9,0x86,0x4a,0xc2, - 0x63,0xe1,0xc0,0x40,0x2e,0x8f,0xe9,0x54,0xb7,0xec,0xc5,0xb4,0x5d,0x13,0x5a,0x61,0x95,0xb6,0x7b,0xae, - 0x14,0x7c,0xf7,0xf3,0x2c,0x93,0x44,0x82,0x22,0x10,0x76,0xfc,0x70,0x5b,0x00,0x57,0xcb,0x4a,0x6d,0xc7, - 0x0d,0x96,0x92,0x5a,0x54,0xc5,0x0c,0x17,0x89,0x49,0x80,0x1b,0x8f,0xd4,0x3b,0xbe,0x92,0x37,0xba,0xdb, - 0xae,0x3c,0x95,0x48,0x02,0xa6,0xed,0x89,0x41,0x1d,0xe2,0x87,0x99,0x4b,0x8b,0x6e,0x70,0x5b,0x12,0xf6, - 0xe9,0xf6,0xca,0x7e,0x67,0xea,0xf9,0x98,0x21,0xa5,0x32,0x65,0x3e,0x1d,0xae,0x59,0x2f,0xf7,0x40,0x4f, - 0x49,0x65,0xb6,0xbf,0x82,0x53,0xa6,0x0b,0x48,0x7a,0x13,0x0b,0xcf,0xc1,0xd0,0x75,0x70,0x42,0xaa,0x12, - 0x16,0xe3,0x51,0xa5,0x75,0xab,0x14,0x88,0xcc,0x15,0x3d,0x84,0xa7,0xaa,0xd0,0x99,0x03,0x68,0xd9,0xd9, - 0x85,0x7a,0xee,0xba,0x5a,0xe0,0xc1,0xa4,0xea,0x85,0x2b,0x47,0xd1,0x11,0xa5,0xea,0x8d,0xbb,0x09,0x89, - 0x87,0x95,0xaa,0x17,0x2e,0xac,0xe3,0xb1,0xa5,0xea,0xc5,0xb4,0x58,0x97,0x7e,0x11,0xbb,0x2f,0xe2,0xb5, - 0x7a,0xbe,0xaa,0x9e,0xed,0x7a,0x55,0xd6,0x0f,0x39,0xdb,0xb9,0x3d,0xa2,0xf6,0x0a,0xf2,0xdd,0xef,0x5b, - 0x6d,0xc4,0xb7,0x6e,0xe9,0x50,0x8b,0x9c,0xca,0xc5,0x71,0x35,0xb0,0x4e,0x20,0xd8,0x45,0x81,0xaa,0xf2, - 0xba,0x70,0x95,0x9e,0x8c,0x66,0xd7,0x25,0x15,0xc6,0xa9,0xd2,0xd6,0xd3,0xf8,0x80,0x98,0xca,0x36,0xf6, - 0x95,0x38,0xf3,0x76,0x2b,0xed,0xd4,0x94,0x4f,0xc4,0x43,0x01,0xa8,0x2c,0x8a,0x56,0x91,0x3d,0xaa,0x6c, - 0x11,0xc7,0xb3,0xe2,0x3e,0xb5,0x79,0x89,0xce,0x40,0x65,0x35,0x5e,0xce,0x10,0xca,0x4b,0x52,0x51,0x65, - 0x6a,0x14,0x06,0xfd,0xa3,0xc2,0x1e,0xa2,0x25,0x9b,0x54,0xad,0x9c,0xad,0xae,0x9b,0x43,0x35,0x5a,0x7a, - 0xa7,0xa5,0x7c,0x6a,0xa0,0x73,0xf6,0x58,0x81,0xb9,0x55,0x66,0x94,0x53,0x63,0x28,0xa8,0x1f,0x4c,0xd0, - 0xdd,0x30,0x00,0x97,0xb4,0xf3,0xac,0xef,0x79,0x76,0xda,0x1f,0xe2,0x55,0xd8,0xae,0x74,0x24,0x74,0xfc, - 0x0c,0x2b,0x68,0xb7,0xe9,0x6b,0x6e,0xa8,0x2e,0x67,0x5d,0xf0,0xfc,0x69,0xc5,0x50,0x34,0x55,0xfb,0x1f, - 0x92,0x41,0x99,0x55,0x15,0x97,0x9d,0x58,0xa9,0x1c,0xd8,0x55,0xd4,0x9f,0x8a,0x59,0x70,0x5e,0xed,0xb0, - 0x40,0x2a,0x60,0x09,0x06,0x76,0x9c,0x6b,0x0b,0xbc,0x54,0xd7,0x58,0x69,0xb5,0x2d,0x65,0x23,0xe6,0xb2, - 0x55,0xc9,0x88,0xad,0x7a,0xdc,0x34,0xc3,0x53,0x8c,0x53,0x9c,0x2d,0x8c,0xbf,0xb5,0xa5,0xbf,0x57,0x6d, - 0x7c,0xe7,0x90,0xdc,0xdb,0x03,0x92,0xef,0x81,0x12,0xd0,0x5c,0x6e,0x26,0x42,0xb5,0x91,0xc3,0x6f,0x85, - 0x6a,0x6b,0x55,0xc1,0x22,0x83,0xf5,0x39,0x26,0x9b,0x2b,0x28,0x35,0xce,0xcb,0xca,0xc3,0x06,0x2c,0x5f, - 0x9f,0x51,0x8b,0x93,0x76,0x42,0x27,0x4a,0x74,0x43,0xa3,0xfc,0x16,0xea,0xb0,0x05,0xa4,0x0c,0x3e,0x5a, - 0x5b,0xfa,0xba,0x85,0x2a,0xb2,0x55,0xe1,0xc6,0x63,0x5c,0x6c,0xb4,0xcf,0x82,0x01,0xa6,0x21,0xe6,0x95, - 0xad,0x5f,0x9b,0x4d,0xba,0x87,0xc5,0x3d,0x60,0x8d,0x47,0xbc,0x23,0xce,0x07,0x60,0xdd,0xc9,0xd5,0xb9, - 0xdf,0x29,0xba,0x3a,0x77,0x5a,0x55,0xbb,0xd0,0x4e,0x13,0xe8,0xe3,0x30,0xb9,0x5b,0x3b,0xed,0x4e,0x97, - 0xb2,0x7d,0x3a,0xf5,0x3c,0xfc,0xcb,0xb5,0x6b,0xa2,0x52,0x7e,0x05,0xb7,0x53,0x28,0x5d,0x54,0xa0,0x76, - 0xe2,0x66,0xd1,0xe0,0x64,0x2d,0x25,0xf7,0x8f,0x91,0x72,0xff,0x70,0x62,0x3e,0x77,0x9b,0xbe,0x2a,0x6a, - 0x19,0x0e,0xb8,0x16,0xf4,0xae,0x68,0xf0,0xb9,0x49,0x8d,0xc2,0xd1,0x59,0xb7,0xd4,0x79,0x87,0x43,0xaf, - 0xfa,0xc3,0x42,0xba,0x78,0x67,0x5e,0x8a,0xe7,0xe6,0x15,0xcf,0x3c,0x18,0x71,0xfa,0xc9,0x6a,0xe3,0x86, - 0x45,0xec,0x06,0x3a,0x57,0x25,0x39,0xfd,0x59,0x89,0xa6,0xcc,0xa9,0x59,0x15,0x38,0x6a,0x8b,0x0b,0x45, - 0x19,0xba,0x60,0xb9,0xb3,0x8e,0xb1,0xda,0x49,0xb8,0xd4,0xc1,0xd3,0xe5,0x23,0x41,0xb7,0x1e,0xf3,0x58, - 0x3e,0x21,0x8b,0xa9,0x9f,0x3e,0x91,0x6a,0xbf,0x43,0xa4,0x68,0x96,0xc5,0xd7,0x7a,0xe4,0x54,0x27,0x3c, - 0xee,0x8d,0xf2,0xa3,0xa5,0xec,0x13,0x74,0xb6,0x9f,0xd5,0x51,0x75,0x5a,0x10,0xa5,0x5b,0xc4,0xe3,0x2f, - 0xec,0x43,0x4d,0xf8,0x4c,0x8f,0xc2,0x13,0x02,0xa8,0xc2,0x81,0x25,0x15,0x27,0xa1,0x54,0x5b,0x17,0x99, - 0xe8,0xfc,0x07,0x1c,0xb9,0x42,0x15,0xbb,0xe4,0xb7,0xf2,0x05,0x93,0x75,0x17,0x50,0x88,0x74,0xf3,0xc8, - 0x74,0xa5,0x86,0x10,0x33,0x6f,0x37,0x27,0x50,0x58,0x75,0x56,0xe0,0x9c,0xc2,0x5c,0xe3,0xf7,0xb3,0xe3, - 0x60,0x15,0x65,0x3b,0xb7,0xcf,0x3b,0x18,0x9c,0xdb,0x5e,0x3d,0x86,0xb0,0x19,0x1b,0x5a,0xc9,0xbf,0xa6, - 0x98,0x71,0xdd,0xa2,0x8d,0x83,0x8a,0x73,0x3f,0xcc,0xd9,0x09,0xa0,0xe9,0x34,0x97,0x50,0x8e,0xc0,0xb3, - 0x59,0xa1,0xc3,0x15,0x5b,0x52,0xe7,0xc4,0x5f,0x6f,0xcf,0xf9,0xb3,0xd5,0xd5,0x26,0x0f,0x03,0xdf,0xe2, - 0xf7,0xb1,0x73,0x07,0x63,0xfb,0x86,0x85,0xae,0x8d,0x76,0x2c,0x6e,0xdd,0xa9,0xb0,0xd9,0x12,0xd2,0xc2, - 0x86,0xf5,0x44,0x6f,0x1d,0x59,0x4b,0xd1,0xb2,0x36,0x3d,0x8b,0xda,0x44,0xc9,0x02,0x6a,0x77,0x32,0xaf, - 0x03,0x7a,0xd9,0x4b,0x85,0xf4,0x53,0xd9,0xc8,0xf7,0x4a,0x47,0xfc,0xa4,0xd0,0xfb,0x72,0xa7,0xd4,0x63, - 0xdd,0xb3,0x2a,0x83,0xaa,0x72,0x71,0x31,0xd1,0x55,0xc5,0x4d,0x28,0xd7,0x67,0xc6,0x69,0xc7,0x1e,0x69, - 0x8f,0x32,0x20,0x58,0xfb,0xb0,0x55,0x1f,0x94,0xbc,0x60,0xba,0x2d,0x1b,0x54,0x0b,0xbd,0xb5,0xcb,0xf5, - 0x0a,0xb5,0x67,0x45,0xa0,0xef,0x3a,0x40,0x5f,0xd8,0x2d,0xe3,0xfa,0xec,0xc4,0xbb,0xc8,0x4d,0x1b,0xda, - 0x28,0xd4,0x30,0x88,0xd6,0x50,0x4c,0x36,0x9f,0xc1,0x9d,0xe4,0x87,0xb7,0x11,0x8c,0xaf,0xb5,0x6d,0xe3, - 0xcf,0x05,0xb0,0x8e,0x9b,0x91,0xb6,0x68,0x68,0x22,0x8b,0xf1,0xc2,0xde,0xa7,0xb2,0x0d,0xaf,0x64,0xe8, - 0xce,0xc5,0x3f,0xc5,0x8b,0x4c,0x7c,0x72,0xc9,0x58,0x5c,0x3e,0xac,0x41,0xdb,0x1f,0x75,0x7a,0x29,0xd7, - 0x38,0x4e,0xea,0xe4,0x99,0xb4,0x0e,0x2b,0xd2,0xad,0x5f,0x57,0xd9,0x37,0xbb,0x2d,0xb2,0x6f,0x56,0xca, - 0x41,0xec,0x43,0x6a,0x13,0x8f,0x6e,0x4b,0xb5,0xad,0xa8,0x98,0xc2,0x4a,0xb5,0x51,0x32,0x68,0x59,0xfe, - 0x2a,0xb6,0xdb,0xe6,0xc8,0xdd,0x08,0xdf,0xbd,0xbb,0x6f,0x9d,0x4c,0xa5,0x5b,0xc5,0xef,0xcb,0x34,0x75, - 0x40,0xdd,0xbb,0x76,0x04,0x11,0xce,0xfa,0x8e,0x00,0x61,0x9f,0x24,0xd2,0x2a,0x07,0xfd,0xde,0xb6,0xa3, - 0x7b,0x54,0x3e,0x69,0xaf,0x94,0xd0,0xae,0x3a,0xb1,0x89,0xcf,0xd9,0xbe,0xb5,0xc8,0xd3,0x6d,0xa9,0x93, - 0x7e,0xb7,0x07,0x64,0x1c,0x56,0x78,0x82,0xf3,0xfe,0x43,0x2e,0x75,0x54,0x9f,0x01,0xe4,0x88,0x29,0xe4, - 0xac,0x6b,0x27,0xa7,0x3e,0xda,0xce,0x64,0x74,0xba,0x7c,0xbd,0xc5,0x85,0x20,0x9d,0x9f,0xd1,0xa2,0xf3, - 0x87,0xab,0xf8,0x4d,0x44,0xb5,0x62,0xe4,0x35,0x7d,0x50,0x9d,0xff,0x1f,0x61,0xd2,0x09,0x9b,0xdc,0x47, - 0xc8,0x1e,0x68,0x19,0xbb,0x64,0x6f,0xef,0x76,0x4c,0x98,0x3c,0x8c,0xd3,0xa2,0x03,0x84,0xa6,0xa5,0x03, - 0x3d,0xdb,0x76,0xe9,0x87,0x2a,0x51,0xc9,0x0e,0x76,0xd8,0xfb,0x22,0x76,0xe8,0xb6,0xb3,0x95,0x19,0x6a, - 0x41,0xd2,0x2d,0xbe,0x83,0xdd,0x6d,0xe7,0x6e,0xaa,0x0a,0x45,0x59,0xed,0x7a,0xb6,0xf3,0x38,0xbb,0x59, - 0x95,0x50,0x7c,0x2f,0x86,0xf6,0x19,0xec,0xab,0xd4,0xbd,0x62,0x7b,0x43,0x87,0xad,0xb8,0x26,0x08,0xf3, - 0xb9,0x3e,0x04,0xb4,0x3a,0x2d,0x80,0xbb,0xe0,0xec,0xe5,0x61,0x85,0xfc,0x3b,0xde,0x1f,0x14,0xc8,0x5f, - 0xde,0x14,0xcb,0x5f,0xe6,0x01,0xf3,0xd6,0x16,0x68,0x7b,0x68,0xe7,0x8a,0xb0,0x32,0x3f,0x36,0x74,0x68, - 0x72,0x4e,0xa1,0xa3,0x2d,0x24,0xda,0x72,0x29,0xfc,0xa2,0xed,0x3d,0x93,0x5b,0xc5,0x52,0x8a,0xf6,0x88, - 0xbd,0xd6,0xa5,0x9c,0x28,0xc7,0x5d,0xc7,0x1f,0xcf,0x13,0x01,0xff,0x9c,0x9c,0x3d,0xf8,0xad,0x0e,0x6c, - 0xb0,0x73,0xbf,0x94,0x8f,0xa7,0x56,0x85,0x2b,0xf9,0x9e,0x7e,0xa7,0xe8,0xfb,0x96,0x51,0x96,0x0d,0x07, - 0x83,0x1e,0x19,0x0e,0x08,0x80,0x8a,0x6b,0xde,0xaa,0xe4,0x08,0x7d,0xa5,0xd9,0xea,0x40,0xd6,0xdd,0xe1, - 0x83,0x6e,0xbc,0x68,0x79,0x4c,0x4e,0x14,0xc2,0x0e,0x79,0xdd,0x2e,0x77,0xeb,0x59,0x88,0x20,0xde,0x4f, - 0x93,0x60,0x9d,0xa1,0xca,0xd1,0x74,0x48,0x6b,0xf9,0xd8,0x90,0x5b,0xce,0xeb,0x2d,0x3b,0xe7,0x6d,0x39, - 0x78,0xb6,0x28,0x24,0x14,0x7b,0xb0,0x25,0x0a,0xa3,0x58,0x4c,0xd8,0x3a,0x8e,0x7d,0x88,0x53,0xb1,0x9c, - 0x7f,0x5d,0x0c,0x2b,0x31,0x22,0xb5,0x82,0x01,0xf5,0xf1,0xc8,0x39,0xe7,0x35,0x0f,0x5e,0x6a,0xf2,0x89, - 0xa2,0x37,0x84,0x5e,0x29,0xd4,0xba,0x90,0x7c,0x00,0xba,0x63,0x8e,0xa5,0x88,0xa4,0xce,0xf6,0xbc,0x96, - 0xf6,0xe7,0xa2,0x72,0x8c,0x7f,0x0a,0x56,0xeb,0x38,0xc9,0x7c,0xa4,0xe4,0x56,0x59,0x54,0x50,0xcc,0x00, - 0xba,0x15,0x99,0x69,0x9a,0xed,0x52,0x26,0xc0,0x8e,0x53,0x83,0x22,0x5f,0x96,0xd6,0x5e,0x0a,0x64,0xf4, - 0x06,0xa5,0x94,0x99,0x56,0x05,0xe3,0x20,0x3d,0x50,0x14,0xc7,0x6f,0xb0,0x1e,0xcd,0xfc,0xa9,0x91,0x6e, - 0x56,0x50,0xed,0x65,0xe3,0x97,0xcc,0x9f,0x90,0x84,0xf1,0x6b,0xfd,0x0b,0x9c,0x69,0x8b,0xed,0x72,0x86, - 0xd6,0x52,0xc2,0xaf,0xdd,0x39,0xdc,0xca,0x35,0xe4,0x59,0x5a,0x8d,0x17,0x5c,0xc1,0xc5,0xc6,0x9a,0x9a, - 0x51,0x45,0xf6,0x47,0xbb,0x42,0x95,0x27,0x35,0x4f,0xd4,0x55,0x7e,0xa9,0x69,0x4b,0x91,0xb1,0xbb,0x39, - 0xe8,0xbb,0x65,0x2f,0x75,0x5d,0x59,0x16,0xc7,0xe1,0xbe,0xe1,0x44,0x15,0xb9,0x69,0x8f,0x5c,0x41,0x98, - 0x7d,0x0e,0x9c,0x9a,0x4b,0x4a,0x04,0x19,0xe0,0x73,0xe0,0xa7,0x93,0x84,0x5c,0x1b,0xe6,0x8e,0x58,0x23, - 0xb7,0x6a,0xcf,0x06,0xb6,0xfc,0x1c,0xbd,0x02,0x44,0xe6,0xb9,0xed,0xef,0x98,0xce,0x1e,0x53,0x72,0xd8, - 0xe9,0xec,0x07,0xc5,0x35,0xa0,0xd4,0xf6,0x7b,0x9d,0x1e,0x5e,0x38,0x7e,0x76,0x9f,0x7d,0x9c,0x72,0x53, - 0xb7,0x26,0xdd,0x72,0x6d,0x83,0x7d,0x75,0x92,0x9f,0x39,0x44,0x7d,0x54,0xae,0x92,0x72,0xd1,0xdb,0x27, - 0x9a,0x14,0xb2,0xd0,0x2b,0x7a,0xa5,0x23,0x90,0x6e,0x39,0x79,0x86,0x37,0xb5,0x72,0x8f,0x9b,0xaa,0xd6, - 0x28,0x33,0xfd,0xb6,0xfd,0x2d,0x82,0xb0,0x32,0x51,0xec,0x8c,0x2a,0x54,0xb5,0xfc,0x45,0x2e,0x6f,0x94, - 0xd3,0xd9,0x73,0x27,0x88,0x46,0xb3,0x99,0x6b,0xfb,0x7e,0x54,0xfb,0x48,0x23,0x65,0x62,0xb2,0x54,0xda, - 0x9a,0x4f,0xe5,0x19,0xb4,0x2a,0x8c,0x77,0x30,0x28,0x05,0x05,0x15,0x36,0x2b,0xef,0xb5,0x87,0xf8,0x9f, - 0x1c,0x55,0xc5,0x06,0x5b,0xab,0xd6,0x61,0xb5,0x91,0x16,0x6d,0xc4,0xbb,0x35,0x43,0xed,0x1c,0xe4,0x6c, - 0xd6,0x54,0x26,0x0d,0xab,0xdc,0xa9,0x2b,0x2f,0xc3,0xbc,0x78,0x66,0x57,0x47,0x85,0x90,0x97,0x09,0x60, - 0xc5,0x49,0x17,0xbd,0x2a,0x3c,0x28,0x64,0xee,0xaf,0xc8,0x22,0xdb,0x2d,0xa5,0xec,0x27,0x97,0x12,0xd7, - 0xcf,0xc4,0x8f,0x2e,0x2f,0x96,0x32,0x91,0x05,0x9e,0xd1,0xeb,0x97,0x33,0x93,0x56,0xf7,0x00,0xf3,0xf9, - 0xd3,0x16,0x57,0xab,0x6a,0x9b,0xae,0xb4,0xa1,0x46,0xd0,0x11,0xc3,0x82,0xdb,0xf1,0xea,0xc5,0x9e,0x97, - 0xb9,0x5e,0x7f,0x77,0x55,0x6c,0xf0,0x4e,0x51,0x19,0x39,0x06,0xd0,0xfb,0xb5,0x22,0x0e,0x62,0x4b,0xe9, - 0x55,0x3c,0x0b,0xe6,0x81,0x9c,0xfd,0x5a,0xe5,0xeb,0x59,0x1e,0xb1,0x7b,0x3a,0x00,0x56,0x11,0x4c,0x8f, - 0x76,0xa6,0xc2,0x2f,0x0a,0x0d,0xe5,0xd3,0x4a,0xb4,0xaf,0xa8,0xc5,0xa9,0xca,0x54,0xb5,0x9c,0x4e,0x7f, - 0xcf,0xb3,0xf3,0x76,0x79,0x83,0x3a,0x47,0x2b,0x59,0x8a,0x70,0x9e,0x25,0xa9,0xb8,0x32,0x9d,0x6a,0x50, - 0xb4,0x53,0xd6,0x63,0xda,0xe3,0xcf,0xca,0xcb,0x41,0xdb,0x11,0x3b,0xeb,0x1e,0x03,0x15,0xf7,0x41,0xf2, - 0x98,0x59,0xa7,0x0f,0xec,0xef,0xfb,0xba,0x05,0x82,0xb0,0x15,0x95,0xe6,0xa1,0x22,0x4b,0xcb,0xb0,0xf2, - 0x80,0x99,0xca,0xa5,0x72,0x6a,0x7a,0xc8,0x8f,0xd2,0x25,0x88,0xf4,0x3b,0x12,0x5a,0x0f,0x55,0x32,0xcd, - 0xe2,0xec,0xef,0x3c,0x05,0x97,0xd0,0xb8,0x90,0x1f,0xba,0x20,0x1a,0x15,0xbb,0xa3,0x21,0xd7,0x50,0x6e, - 0x63,0xb4,0xed,0x5a,0x99,0x2c,0x5a,0x7b,0xd5,0x62,0x52,0x6c,0x9b,0x3e,0x76,0x5c,0x2d,0xb4,0x10,0x95, - 0xe6,0x2c,0x29,0x65,0x35,0x70,0x0f,0xd3,0x70,0x32,0xd7,0xb0,0xc4,0x9f,0x6f,0x48,0x8c,0x5a,0x77,0x3d, - 0xcf,0x67,0x50,0xf2,0x37,0x28,0xc9,0x94,0x44,0x68,0xad,0x25,0xd8,0xee,0x18,0x61,0x1f,0x47,0x87,0xab, - 0x8f,0x0c,0xd0,0xde,0xf6,0x2b,0x8d,0xcd,0x11,0xa8,0xeb,0x05,0x47,0x45,0x7b,0x95,0x0b,0xbb,0x8f,0x77, - 0x4e,0xd5,0x5e,0xf0,0xaf,0xaf,0x3c,0x51,0x9e,0x92,0x11,0x54,0x9f,0x17,0x75,0x4b,0xc7,0xf1,0x86,0xc5, - 0x9f,0x86,0x2b,0xf4,0xd7,0xf7,0xa2,0x3b,0x39,0xc9,0x75,0xdb,0xd8,0x9e,0x86,0x80,0xfd,0x90,0x6e,0xf9, - 0x62,0xbf,0x5e,0x01,0x21,0x39,0x9c,0x1d,0xb6,0xda,0xbd,0xa3,0x6d,0x0d,0xc0,0xb4,0xef,0x65,0xa9,0xf0, - 0x6c,0x5b,0x45,0xa7,0x55,0x9d,0xa1,0xd8,0x54,0xf9,0x50,0x6f,0xa5,0x1a,0xe5,0xf1,0xce,0xb0,0xdb,0xde, - 0x91,0xf8,0xa2,0x1c,0xc8,0x52,0x3a,0xe4,0xcc,0x74,0x45,0x2c,0xbb,0xb6,0x6a,0x3c,0xd8,0xae,0x8f,0x60, - 0x61,0xce,0xad,0x6e,0x42,0x53,0xcc,0x89,0xd4,0x2e,0x89,0x19,0x1e,0xed,0xf2,0xfd,0xb7,0x0e,0xd3,0xba, - 0xe5,0x84,0x71,0xab,0x5d,0x94,0x12,0xd3,0x78,0x93,0x4c,0xe5,0x75,0x65,0xf4,0x71,0x65,0x51,0xd0,0xfa, - 0x35,0x42,0x83,0xa6,0x3a,0x77,0xcb,0x32,0xe8,0xdc,0x92,0xba,0x9e,0xce,0x94,0x2c,0x2e,0xce,0x3e,0x89, - 0xe8,0xf7,0x4b,0x1f,0x5f,0xd1,0x97,0x62,0x40,0xa1,0x22,0x07,0x4c,0x75,0x49,0x67,0xe0,0x53,0x85,0xb6, - 0xee,0x3d,0x6c,0x35,0x50,0xb0,0xe3,0x82,0x86,0xcf,0xed,0xd6,0x85,0xce,0xa0,0x4a,0x01,0x27,0xf5,0xb9, - 0x9a,0x3c,0x56,0x27,0xde,0x28,0xb2,0x08,0x4b,0x65,0x6e,0x1d,0xed,0x6f,0xfc,0xdb,0xa5,0x5a,0x17,0xc8, - 0x99,0xc3,0x7c,0x4b,0x92,0xf0,0xbe,0xca,0x66,0xa7,0xe1,0x38,0x96,0xd4,0x8f,0xaa,0x95,0x7c,0x47,0x69, - 0x52,0x2a,0x52,0xbb,0x5a,0x45,0xea,0x6c,0x53,0x91,0x3a,0x05,0x83,0x52,0x95,0x0e,0xd0,0xd2,0x27,0xbf, - 0xdf,0x22,0xda,0x57,0x08,0x5e,0x0e,0x43,0x6e,0x6c,0x15,0x51,0x4b,0x5e,0xff,0xae,0xf9,0xa1,0x38,0xfc, - 0xb2,0xf1,0xc0,0x5d,0x7b,0x0d,0x8e,0x36,0xf3,0x40,0x2a,0xba,0xc3,0x5a,0xb9,0x9d,0x2e,0x92,0x62,0x7f, - 0xf3,0x17,0xe5,0x72,0x02,0xcd,0x3a,0xe2,0x1a,0x9e,0xb1,0xee,0x24,0x08,0xcb,0x8b,0x71,0x1f,0x30,0xe1, - 0xc9,0xcd,0x4e,0xcf,0x70,0x2b,0xee,0xc3,0x64,0x7b,0xc3,0x1c,0x4c,0x78,0x24,0xee,0x59,0x71,0x0f,0x8f, - 0xbd,0x78,0x09,0xb5,0x63,0xf7,0x18,0xe6,0x4e,0xab,0xb5,0xed,0xf0,0x39,0xca,0x0a,0xeb,0x6c,0xab,0xe5, - 0x21,0xed,0xc6,0x39,0x67,0x8f,0x73,0x10,0x46,0x05,0xca,0x3c,0x6c,0xb5,0xb6,0x65,0xb7,0xed,0xa5,0xd6, - 0x20,0x94,0xc3,0x7c,0xde,0x3b,0x5a,0x18,0x65,0xb2,0xbb,0x2e,0xbb,0x05,0x65,0x28,0x36,0xdb,0x56,0xd5, - 0x5c,0x4e,0x0e,0xfd,0x75,0x2a,0xc7,0xfa,0xe2,0x0f,0xf1,0x11,0x35,0x89,0x44,0x8b,0x9e,0x71,0xd9,0xac, - 0x91,0x2d,0xaf,0xcb,0x67,0x89,0x16,0x65,0x96,0x7d,0xe2,0xe2,0xa0,0xa2,0xea,0x14,0x6b,0x14,0xde,0xd6, - 0xae,0x70,0xb7,0xbc,0x5b,0xda,0xef,0x6d,0x7b,0x6b,0x19,0xee,0x13,0x00,0x80,0xde,0x16,0x85,0xe9,0x4f, - 0x1b,0x85,0xf4,0x49,0x0d,0xf2,0xe1,0x21,0x09,0x78,0xb7,0x11,0xeb,0x56,0x53,0x13,0x1d,0x33,0xdc,0x2b, - 0xc8,0xa2,0x5b,0x1b,0xb3,0xa2,0xcf,0xb6,0x24,0x86,0xe2,0xc2,0xf1,0x3a,0xab,0x00,0x9d,0x5d,0xf9,0xa7, - 0xcc,0x77,0x77,0x3d,0xcf,0xbd,0xe0,0x76,0xbd,0xfb,0x94,0xca,0x1c,0xd3,0xba,0x1d,0x75,0xe8,0xa7,0xaa, - 0xa1,0x2a,0xc9,0x45,0xd5,0xc1,0x0a,0x76,0x9e,0x55,0xce,0x60,0xa7,0xb8,0x19,0xf3,0xdd,0x62,0x86,0x92, - 0xe2,0xb1,0x7c,0x87,0xb8,0xbd,0xd9,0xc8,0x91,0x98,0x03,0x92,0x1a,0x16,0x91,0x62,0xc7,0x40,0x4c,0x52, - 0x9a,0x43,0x23,0x53,0xf8,0x76,0xb1,0x64,0x5b,0x4b,0x1f,0x0d,0x67,0x81,0xe9,0x91,0x93,0x29,0xd6,0x91, - 0x69,0xf9,0x5c,0xed,0x8a,0x44,0xb2,0xdb,0x8e,0x88,0xd0,0x29,0xe9,0xfa,0xed,0x9e,0xec,0x0d,0x77,0xe5, - 0x89,0x35,0x27,0x9f,0xa0,0x0b,0xcb,0x75,0xc5,0xb9,0x97,0x5d,0xdb,0xb0,0x39,0xb8,0x29,0x39,0xba,0x34, - 0xec,0x3d,0xf8,0xaa,0xb3,0x7b,0x4c,0x12,0x86,0x86,0x7d,0xbe,0x40,0xf5,0x39,0x02,0x56,0xbe,0x0d,0x67, - 0x1c,0x3a,0x7d,0xdf,0xb6,0xb8,0xc2,0x02,0xb9,0xdf,0x26,0x07,0x4d,0x43,0x7f,0xb5,0x3e,0xe8,0x00,0x2a, - 0x34,0x7a,0xe7,0x17,0x8d,0x2e,0x25,0xaf,0x73,0x28,0x70,0xbf,0x55,0xda,0x85,0xf1,0x5a,0xdd,0x3e,0x1e, - 0x54,0x57,0xb6,0x45,0x57,0x48,0xef,0x65,0x9d,0x51,0xe7,0x9b,0xeb,0xdc,0xc5,0xc4,0xbc,0xe3,0xe8,0xd3, - 0x4e,0xe9,0xe8,0x53,0x5a,0x9d,0xae,0x6e,0xa7,0xb7,0xc5,0xee,0x9c,0x6f,0x86,0x89,0x92,0xbf,0xab,0x39, - 0xb8,0xdd,0x3c,0x6a,0xd2,0xc1,0xa4,0x63,0x1c,0x9b,0x1f,0xe6,0xb8,0x30,0x0d,0x92,0x29,0x80,0x8a,0x39, - 0x03,0x15,0xd3,0xb3,0xbb,0xf0,0xed,0x71,0xff,0xf2,0x8a,0xcc,0xc1,0x0b,0x62,0x2f,0x89,0x6b,0x54,0x29, - 0x70,0xd1,0x46,0x5d,0x95,0xc0,0x55,0xda,0xc1,0xdb,0x66,0x94,0x72,0x21,0x64,0xab,0xa3,0xec,0xde,0x15, - 0x59,0xf6,0x2a,0x5b,0xca,0xa9,0x00,0x00,0x7b,0x53,0x60,0xa0,0x8f,0x53,0xaa,0x14,0x0f,0xb4,0x02,0xb0, - 0x4e,0xe4,0x5c,0x26,0x69,0x33,0x91,0xb3,0xcd,0x54,0xce,0x80,0x81,0x29,0x3a,0x89,0xb7,0xf5,0xeb,0xbf, - 0x34,0xf4,0x71,0x89,0x86,0x02,0x9a,0x64,0xcf,0xcd,0xd9,0x46,0x69,0xfa,0xaf,0xfd,0xd7,0x69,0xbe,0xf3, - 0x98,0xa7,0x83,0x46,0xfd,0x95,0x8b,0x34,0x39,0x45,0x56,0xdb,0x2a,0xa5,0xfc,0x80,0x27,0x72,0xe9,0x9f, - 0x07,0x30,0x4c,0x24,0x90,0xd6,0xeb,0x5c,0x38,0xd9,0xd6,0xce,0x76,0x07,0x2a,0xda,0x60,0x2f,0xc1,0x85, - 0xb6,0x87,0xdf,0x78,0x80,0xd6,0xe4,0x14,0x54,0xa9,0x66,0xc2,0x43,0x54,0x53,0x71,0xc7,0x28,0x53,0x0e, - 0x4a,0xfa,0x8b,0x87,0xe8,0xed,0x29,0x93,0xeb,0x92,0x9d,0x0e,0xdd,0x9a,0xae,0x8b,0xa7,0xea,0xf5,0xd9, - 0xa9,0x4a,0x10,0x0c,0xe1,0xcd,0xd7,0x42,0x46,0xe7,0x07,0xa9,0x3f,0x47,0x97,0x2a,0xe9,0x37,0x09,0x0a, - 0x95,0xec,0x01,0x9a,0xc2,0x0e,0x1f,0xe6,0x7d,0xcc,0x46,0x4d,0xea,0x0d,0x29,0xd5,0x08,0x02,0x7d,0x3d, - 0xc1,0x69,0xe4,0xaf,0x9b,0xe8,0x4f,0x31,0xfe,0x20,0xd6,0x49,0xfc,0x21,0x58,0x05,0xd9,0xa5,0xf2,0xe0, - 0x2a,0x78,0x54,0x5a,0x11,0x0e,0x85,0xad,0xbb,0x5e,0x31,0xc1,0x05,0x5c,0x4d,0x65,0x75,0xca,0x89,0x91, - 0x0a,0x48,0xb1,0xdb,0x67,0x91,0x8b,0x35,0xe8,0xed,0x8e,0xe7,0x26,0xcf,0xd1,0xd6,0x13,0x91,0x5d,0x4f, - 0x5c,0x5d,0x93,0x81,0x4d,0x16,0xb1,0xf3,0x9d,0x1e,0xba,0x34,0x07,0x30,0x28,0x29,0x8f,0x0c,0xa9,0xae, - 0x6b,0x99,0xf1,0xb6,0xef,0x68,0x3b,0x39,0x27,0x6b,0x71,0x34,0x60,0xd2,0x26,0x8a,0x1e,0x65,0x83,0x4e, - 0x89,0x88,0x9c,0x5f,0xa0,0x76,0x46,0x4c,0xb6,0xe4,0x94,0x36,0xd8,0x83,0x2c,0x0d,0xaa,0xc9,0xd2,0x36, - 0x3d,0x90,0x5e,0x54,0xe0,0x42,0x77,0xc4,0x0a,0xbd,0x03,0xba,0x62,0xd9,0x2e,0xd8,0x6b,0x8a,0xb0,0xad, - 0x6c,0xd1,0x85,0xc7,0x8e,0x77,0x90,0x1d,0x9d,0x6f,0x9d,0xc8,0x36,0xb8,0xb3,0xce,0x5c,0xf2,0xd0,0x61, - 0xc7,0x14,0x75,0x77,0xf3,0xcd,0x83,0x34,0xbb,0x0c,0xe5,0x43,0xf1,0x0d,0x3b,0x64,0x3c,0xcc,0x40,0xe5, - 0x98,0x81,0x3e,0x02,0x52,0x62,0xe6,0xe9,0x8b,0xa7,0xa1,0xe4,0x7b,0xa0,0xb0,0x30,0x7d,0x9e,0x22,0xb2, - 0x31,0xcc,0xd1,0x29,0x9f,0xe0,0xe6,0xf9,0x17,0x59,0x12,0x7c,0x78,0x87,0x2f,0x3e,0x7e,0x84,0x29,0xca, - 0xa6,0xcb,0x57,0x34,0x5b,0x35,0x43,0xff,0x88,0xd4,0x36,0xd3,0x29,0x96,0x19,0x13,0x85,0xae,0xd7,0xea, - 0x1e,0x15,0x95,0xe9,0xb7,0x35,0x7a,0x52,0x1b,0xd7,0x66,0x7e,0x72,0x56,0xab,0xdf,0x4c,0xf1,0xf9,0x01, - 0xd0,0x47,0xec,0x23,0xf7,0x4d,0x7c,0xf3,0x80,0x8e,0xc6,0x11,0xdf,0x20,0xf5,0x81,0x1f,0x5f,0x80,0x08, - 0x90,0xa6,0xc7,0x35,0xa3,0x4b,0xd5,0x44,0x30,0xe3,0xdb,0x9a,0x58,0x42,0xbb,0xc7,0xb5,0x7b,0xe7,0x81, - 0xbc,0xa8,0x3d,0xfc,0xe6,0x81,0x8f,0x83,0x3c,0x5f,0x08,0x9a,0xca,0xe3,0x5a,0x0b,0x0a,0xd0,0x4a,0xd3, - 0x25,0xcd,0xc2,0x71,0xad,0xb4,0xc1,0x59,0x13,0x98,0xb6,0xbb,0xc9,0x2a,0xcf,0x71,0x2d,0x4b,0x36,0x12, - 0xea,0x9a,0xc9,0x79,0x8a,0xb5,0x5d,0xae,0x26,0x71,0x48,0x2d,0x06,0xa0,0x62,0x67,0x35,0x81,0x6d,0x3d, - 0x8a,0x3f,0x40,0x95,0x80,0x4c,0x9d,0x1e,0xfc,0x1f,0x4a,0xe3,0xd6,0xb4,0x80,0x67,0xdd,0x9a,0xb8,0x3c, - 0xae,0x8d,0x6a,0xba,0x07,0xed,0x7e,0xde,0x85,0xc3,0x9a,0x48,0xa0,0x48,0xa7,0xf6,0xe0,0xe1,0x37,0x6b, - 0x3f,0x5b,0x0a,0xa8,0xf3,0x55,0x07,0x73,0x34,0x7b,0xfd,0x73,0x7a,0xfa,0x80,0x5b,0x2b,0x36,0x8b,0x32, - 0xfb,0x96,0x76,0x4d,0x3d,0x7d,0xca,0xe8,0xe8,0x23,0x7f,0x57,0x68,0x2e,0xda,0x3d,0xd1,0x7a,0x35,0xf2, - 0xe0,0x4d,0xcf,0x1f,0x88,0x81,0x7a,0x3a,0x14,0x2d,0xa7,0x03,0xed,0x8e,0x68,0x0f,0xbd,0xfe,0xd2,0x6b, - 0xb5,0x77,0x74,0x21,0xdd,0x44,0x5b,0x7a,0xc0,0xf2,0x85,0x98,0xc2,0xe3,0x76,0xa7,0x26,0xa6,0x97,0xfc, - 0x9b,0x1c,0xd7,0x7a,0xc5,0x76,0xba,0xe7,0x1d,0x6a,0xee,0x10,0x7e,0xbb,0x80,0x70,0x4b,0xb8,0x3d,0xe4, - 0xdf,0xbe,0x37,0x10,0xf8,0x6f,0x28,0x86,0xaf,0xda,0x43,0xe8,0x51,0x88,0xca,0x20,0xfc,0x7b,0xd5,0x1e, - 0xc1,0x05,0xbe,0x6a,0xe3,0x3b,0x7a,0xd5,0x54,0xef,0x76,0xf4,0x77,0x15,0xc7,0xd1,0x6d,0x53,0xd6,0x81, - 0xe9,0xe8,0x7b,0xfd,0x13,0x9c,0x22,0xfc,0xc7,0xf3,0x83,0x57,0x3d,0x3f,0x7f,0xd6,0xc6,0x7f,0xb8,0x4f, - 0x8a,0x7f,0xae,0x76,0x34,0x89,0x68,0x79,0x5b,0x93,0xb8,0x3c,0x5d,0xaf,0xff,0x53,0xdf,0xef,0x88,0x0e, - 0x2f,0x92,0x80,0x55,0x3a,0x87,0xa6,0xfc,0x1e,0x5e,0xe1,0x93,0x26,0xfc,0xee,0x6a,0x68,0xb9,0x59,0xdd, - 0xda,0x0e,0x4c,0x76,0xd8,0x17,0x03,0xa8,0x96,0x57,0x1e,0xab,0x45,0xc0,0xd8,0x55,0xef,0x7c,0x9d,0xde, - 0x56,0x2f,0xad,0x5a,0x2f,0xec,0x36,0x47,0xd0,0xd9,0xf6,0x40,0xc0,0xc5,0x72,0xd7,0x32,0x00,0x59,0x38, - 0xbf,0xb5,0xaf,0x23,0xd1,0x3f,0x6f,0xf7,0x5e,0xc2,0xd2,0x76,0xae,0x1c,0x90,0xe9,0xd3,0x8b,0x1d,0xd5, - 0x47,0xf2,0x43,0x76,0x5b,0xf5,0x03,0xaa,0x24,0x6c,0xb7,0x9b,0x43,0xb7,0x76,0x00,0xbd,0x5b,0xaa,0x9f, - 0x80,0xe2,0x76,0x5b,0xf5,0x50,0x89,0xdf,0x15,0x5d,0x05,0x3c,0x38,0xd5,0x39,0xaa,0x75,0xa1,0x81,0x6e, - 0x08,0x4b,0xf1,0xbc,0x1f,0x76,0x9a,0xdd,0xf3,0x66,0xf7,0xd5,0x21,0x00,0x52,0xa7,0xb5,0xec,0x3b,0x3d, - 0x81,0xef,0x43,0x98,0x85,0xf6,0x68,0x47,0x5f,0x80,0xc0,0xdc,0x19,0x01,0x87,0x3b,0xea,0x93,0x97,0xf2, - 0x56,0xfc,0x80,0x05,0x49,0x01,0x5a,0x9b,0xb0,0x32,0x2d,0xfa,0x23,0xf8,0x4f,0x13,0x1e,0xc2,0x5f,0xba, - 0xc4,0x37,0xf4,0x87,0x26,0x77,0x7b,0x5f,0xba,0xbb,0x30,0x27,0xf1,0xd3,0xe5,0x6d,0xbd,0xe9,0x89,0xe1, - 0xb2,0x3d,0x40,0x0c,0xea,0x2d,0x7b,0xb0,0xaa,0x40,0x21,0x00,0x97,0x96,0xed,0x56,0x08,0x90,0xdd,0x25, - 0xcc,0x6a,0x9f,0xc3,0xfb,0x1e,0xfd,0xee,0x02,0x73,0x10,0x15,0x6e,0x85,0xc9,0x1e,0x2c,0xda,0x50,0x21, - 0x29,0xfc,0xd7,0x84,0x2b,0x80,0x95,0xfc,0x01,0xfc,0x76,0xa0,0x6d,0xfb,0x41,0xb3,0xf3,0xd3,0xa8,0x00, - 0x61,0x50,0xcb,0x79,0xbf,0xb0,0xd8,0x08,0x01,0xed,0x2e,0xd2,0x30,0x80,0x04,0x41,0x7f,0xa1,0x20,0x3f, - 0xa4,0x3b,0x7e,0xb3,0x0b,0xa9,0x64,0x74,0xfb,0x64,0x01,0x90,0xf5,0x5e,0xb6,0x91,0x84,0x1d,0x22,0x5b, - 0xf0,0x00,0xbc,0xe0,0x9f,0x1a,0x0c,0xac,0x29,0xfc,0x7b,0xd9,0xc7,0x56,0x87,0x8a,0xaa,0xd9,0xbd,0x1e, - 0x86,0x00,0x92,0x3b,0x7a,0x80,0x5e,0xe5,0xb7,0xe3,0xdd,0x61,0x88,0xa8,0x30,0x68,0xee,0x5a,0x0c,0x14, - 0x03,0x6f,0xaf,0xa9,0x87,0xcb,0x0c,0xf4,0xf1,0xbc,0xdd,0xf6,0x29,0xd7,0x2e,0xa2,0x57,0x13,0xae,0x9e, - 0xf7,0xed,0xfb,0x66,0xfb,0x27,0xeb,0x1e,0x9f,0xb8,0x23,0x03,0xa2,0x75,0xde,0x5b,0x0e,0x0a,0xcf,0x3a, - 0xad,0xf3,0xe6,0x60,0x39,0xda,0x09,0x33,0xac,0x2c,0xed,0x43,0x75,0xcf,0xdb,0xad,0x42,0xfd,0x87,0xd8, - 0x73,0xd1,0x6b,0xf6,0x0a,0xb4,0xad,0x3d,0x3c,0xef,0x98,0xde,0x52,0x7f,0x97,0x6d,0xe7,0x41,0xb3,0x7d, - 0xde,0xec,0xec,0xec,0x14,0x08,0x65,0x7b,0xc9,0x23,0xfd,0x5c,0x1e,0x19,0xe5,0xf2,0x08,0xd0,0xbe,0x5c, - 0x20,0xb1,0x30,0x17,0x80,0x46,0xa1,0x6e,0x8b,0x50,0x57,0x71,0x5a,0x87,0x6f,0x0e,0xc2,0x26,0xc0,0x2c, - 0xfe,0x7b,0x79,0xb8,0x9b,0x70,0xc9,0x0f,0x7b,0x4e,0x5d,0x1b,0xd8,0x62,0x79,0xea,0x9a,0x34,0x79,0x7f, - 0xf4,0xd4,0xad,0xc3,0x4d,0xba,0x47,0x97,0x90,0x3f,0x60,0x73,0x80,0xea,0xbb,0xf8,0xc4,0x34,0x5e,0x5f, - 0xde,0xb2,0x0e,0x87,0xb4,0x0e,0x87,0xf9,0x3a,0xb4,0xad,0x75,0x68,0x57,0x09,0x86,0x6d,0xe0,0x7e,0x20, - 0x9c,0x90,0xe4,0xa1,0x84,0x13,0x16,0x1e,0x44,0xef,0x79,0xf9,0x05,0x8a,0x48,0xfd,0xf3,0x51,0xe1,0x29, - 0x21,0x78,0x7f,0x17,0x08,0x45,0xf3,0xf8,0xce,0x6c,0xe5,0xb0,0x24,0x3f,0x12,0xe1,0xed,0x00,0x81,0xde, - 0x2d,0x44,0x86,0xf1,0xa2,0xd8,0x5a,0x9b,0x3a,0xa8,0xaa,0x43,0xe7,0xd2,0xe3,0xda,0x74,0x93,0xa0,0x5d, - 0xea,0x31,0x6a,0x12,0x35,0xa1,0x1c,0x87,0x8e,0x6b,0x5e,0x7b,0x50,0xa3,0x06,0xe1,0xb3,0x65,0xf7,0xbc, - 0xfb,0xbc,0x75,0x85,0x6d,0xd2,0xf5,0xb2,0xd9,0xbd,0x02,0x9a,0xd7,0xa3,0xe7,0xbd,0x2b,0x44,0x74,0xba, - 0x1c,0xe1,0x53,0x58,0x3d,0xf3,0x98,0xaf,0xb1,0xb8,0x19,0x43,0x55,0xa3,0x4c,0x42,0x5b,0xf9,0x77,0x2d, - 0x5d,0x5d,0x4b,0xd5,0xcc,0x8d,0xf7,0x4c,0xe3,0x2d,0x31,0xd2,0xcf,0x7b,0xea,0x92,0x3e,0x1c,0xe9,0x0f, - 0xa1,0xf4,0xc8,0x2a,0xad,0x3a,0xc5,0xd5,0xb8,0xbd,0xda,0x26,0x8c,0xc4,0xf1,0xd9,0x1e,0x20,0x0b,0x22, - 0xdf,0x63,0xd4,0x04,0x04,0xcb,0xaf,0xc8,0x58,0x06,0xf8,0xf7,0x39,0x10,0xcf,0xee,0xb2,0x33,0xed,0x10, - 0x70,0xc0,0x03,0x7a,0x41,0x0c,0x88,0x18,0x0e,0xf2,0x79,0xf8,0xba,0x09,0xc2,0xf8,0x39,0xf0,0xd3,0x65, - 0xb3,0x33,0x6d,0x52,0xd9,0x26,0x95,0x6d,0x42,0xd9,0xab,0xe2,0xba,0x43,0x5b,0x50,0xe9,0x8e,0x3e,0xe3, - 0x61,0x3f,0xb7,0x0b,0x50,0x03,0x04,0x9b,0x57,0xa4,0x08,0xa8,0x8b,0x11,0x5d,0x00,0x6c,0x0c,0xf4,0x85, - 0x7a,0x87,0x57,0xa3,0x5b,0xa0,0xec,0x2c,0x76,0xb4,0xa5,0x21,0xea,0x41,0x7d,0xa0,0xcc,0x43,0x68,0x75, - 0x21,0x8c,0x85,0xf6,0xb8,0x06,0x5a,0x29,0xa8,0xb3,0x07,0x6d,0xef,0x70,0xd0,0x1f,0xb4,0xda,0x87,0x8d, - 0x16,0xfc,0x67,0xdf,0x35,0xfb,0x6d,0xaf,0xdd,0xea,0x0f,0xfa,0x75,0xdd,0x61,0xeb,0x6b,0x63,0xe0,0x3d, - 0x68,0x35,0x3a,0x83,0x7a,0x4d,0x01,0x12,0x5a,0x19,0x09,0x80,0x56,0xa2,0xd3,0xf1,0x3a,0xfd,0xe1,0x61, - 0xb7,0xdd,0x18,0x01,0xeb,0x5d,0xc2,0x54,0x0f,0x5a,0xc3,0x01,0xa8,0x31,0x8f,0x45,0x67,0x00,0xcd,0x0c, - 0xba,0x9d,0x1e,0xbd,0xea,0x1c,0x7a,0xbd,0x51,0x03,0xf4,0x8b,0x6e,0xbb,0x3b,0x18,0x0e,0xf4,0x7d,0xcf, - 0xeb,0xb5,0x7b,0x3d,0xe8,0xfa,0xb9,0x68,0x79,0xdd,0x6e,0xab,0x05,0xa3,0x9f,0x8a,0x56,0xa3,0x0b,0x9d, - 0x6a,0x0d,0xa1,0x1c,0x2e,0x10,0x7d,0xd1,0x00,0xfd,0x88,0x8b,0x36,0xf5,0x55,0xfe,0x68,0x29,0x9a,0xa6, - 0xe5,0x73,0xec,0xc4,0xe8,0x70,0x78,0xc8,0x35,0x01,0x65,0xef,0xb6,0xdb,0x9d,0x11,0x96,0x68,0xc3,0xa0, - 0xfb,0xa3,0x06,0x54,0x79,0x08,0x4f,0xb8,0x72,0xba,0xca,0x1f,0x3d,0x17,0x43,0xfc,0xa0,0x33,0xea,0xe3, - 0x18,0x06,0x1e,0x9a,0x47,0xfb,0xa3,0x76,0xa3,0xd3,0xf3,0x06,0x80,0x7d,0xde,0xa8,0xd7,0xe8,0x74,0xbd, - 0xde,0xf0,0x70,0xd4,0xeb,0xa8,0xdb,0x8e,0xd7,0xea,0x8d,0x86,0xb0,0x02,0x3f,0xa1,0x7e,0xda,0x3a,0xec, - 0x0f,0x7a,0x5d,0xf8,0x96,0x5e,0x1e,0x7a,0xdd,0x11,0x0c,0xe4,0xb0,0x0d,0x74,0xaa,0xd7,0xa1,0x2b,0x9a, - 0x8e,0x81,0xd7,0xee,0x42,0xb9,0xce,0x21,0xdd,0xfd,0x2c,0x56,0xd0,0xd3,0x8e,0x77,0x78,0x38,0x18,0xf6, - 0x71,0x04,0x00,0x8d,0x83,0x7e,0xaf,0xd5,0xa7,0x19,0xed,0x0d,0xfa,0xfd,0x61,0x17,0x06,0x03,0x30,0xdc, - 0x1d,0x8c,0x7a,0xbd,0x06,0x80,0x98,0x37,0x1c,0x75,0x86,0xad,0x6e,0x03,0x46,0xd5,0xe9,0xf5,0x47,0xfd, - 0x91,0xf5,0x48,0x5d,0x01,0xe1,0xc0,0xd7,0xf4,0x4d,0x5f,0xe8,0x82,0x87,0xe6,0x7d,0x57,0x34,0x4b,0xdf, - 0x74,0x45,0x8e,0x01,0x95,0x80,0x40,0xa3,0xea,0xc2,0x5f,0x1b,0x1a,0xfa,0xb2,0x3f,0x61,0x8a,0x02,0x08, - 0xd9,0xc5,0xa5,0xea,0x0c,0xb1,0xd1,0x11,0x4c,0xc3,0xc8,0x1b,0x0e,0x5a,0x9d,0xc3,0x5e,0xa7,0xd1,0x23, - 0x40,0x6b,0xc3,0x72,0x1d,0x7a,0xc3,0xd6,0xe8,0x10,0x56,0x1e,0xd6,0xb9,0x8f,0xb4,0xd5,0xeb,0xb4,0xfa, - 0x70,0xcf,0xb7,0x53,0x18,0x0a,0x74,0xb5,0x0f,0xc3,0xec,0x7a,0x00,0x04,0x00,0xac,0x30,0x37,0x00,0x64, - 0x83,0x3e,0xf4,0x0f,0x80,0xb7,0xd5,0x3a,0xec,0xf6,0xa0,0xba,0x41,0x07,0xea,0x6f,0x77,0xbc,0x6e,0xa7, - 0xd3,0x1e,0x8d,0x70,0xae,0xfb,0xc3,0xfe,0x60,0x40,0x66,0x82,0x61,0xf7,0x70,0x74,0x38,0x68,0xc0,0x15, - 0x80,0x42,0x7f,0x30,0xe4,0x8e,0x41,0xe1,0x21,0x2a,0xe1,0x87,0xa3,0x56,0xbb,0xd5,0x3d,0xb4,0x5e,0xf7, - 0xbc,0xee,0xe1,0x70,0xd4,0xee,0x74,0xad,0x6a,0xba,0x00,0x5e,0x00,0x0a,0x7d,0x58,0x23,0x58,0xdd,0x0e, - 0xc0,0xc5,0xa0,0x85,0xbd,0x1c,0x10,0x10,0x63,0x67,0xba,0x5e,0x07,0xf7,0x7f,0x46,0x43,0xee,0x39,0x2c, - 0x5b,0x1b,0x56,0x4d,0xdf,0x0e,0x01,0x89,0x61,0xc8,0x00,0x5e,0xea,0xf6,0xb0,0x7f,0x38,0x84,0x7b,0x6b, - 0x26,0x0a,0xd3,0xf5,0x33,0xe1,0xfc,0xc2,0xc6,0xfb,0x07,0x64,0xa4,0x81,0x07,0xe7,0x0b,0xb8,0xc3,0xa4, - 0x40,0xca,0x56,0xc4,0x46,0xb7,0x1a,0x3c,0x64,0xbb,0x9b,0x32,0x0b,0xa9,0xb7,0xe1,0xa2,0xda,0xe4,0xb3, - 0x49,0xa5,0x36,0x28,0x29,0x66,0xf5,0xc0,0x54,0xbe,0x6c,0x13,0x79,0x99,0xc0,0x62,0xcf,0x6a,0x0f,0x4f, - 0xde,0xbf,0x7b,0xfb,0xe2,0x9f,0xc5,0xeb,0x67,0xdf,0x3c,0x58,0xb6,0xb1,0xf2,0xb5,0x1f,0xe9,0xda,0x31, - 0xd0,0x0d,0x6d,0x51,0xf8,0x0c,0xcd,0x58,0x64,0xf1,0xd3,0x2f,0xd1,0x8c,0x27,0x98,0x42,0x61,0x75,0x78, - 0x35,0xc9,0x40,0x9c,0xcf,0x82,0x0c,0x6d,0x53,0xa7,0x9b,0x35,0x4a,0x4b,0x62,0x85,0xdd,0xb1,0x7a,0x8c, - 0xe5,0x98,0x7b,0xde,0xda,0x6f,0xaa,0x5c,0xf7,0xfb,0x9b,0x07,0xdc,0x7c,0x65,0x3f,0xb8,0x0b,0xb3,0x78, - 0x9a,0xda,0x5d,0x78,0xa2,0xec,0x81,0xb4,0x55,0xe0,0xf6,0x22,0x98,0xee,0xd1,0x3e,0xf1,0xa9,0x3b,0xb4, - 0x4f,0x76,0x46,0xbb,0x03,0x64,0x5f,0xfc,0x8c,0x86,0xd1,0x44,0x75,0x87,0x76,0x43,0x3f,0x5a,0xd8,0xcd, - 0xbe,0x84,0xfb,0x0d,0x0a,0xd4,0xf6,0xc7,0x0f,0x0c,0xf8,0xa0,0x8d,0x1c,0x3f,0x83,0x5f,0x2c,0x01,0x3f, - 0x04,0x7f,0x01,0xfe,0xa0,0x11,0x9c,0x5e,0x6a,0x33,0x24,0x3e,0x50,0x00,0x49,0x43,0x24,0xeb,0xb5,0x1a, - 0x42,0x18,0x9c,0x93,0x11,0x32,0x0c,0x8c,0xe5,0xd1,0xcf,0xe2,0x55,0x30,0x3d,0xae,0xcd,0x31,0x74,0x13, - 0xbf,0xe7,0x6a,0x95,0x45,0xb4,0x86,0xa3,0x4c,0x81,0x55,0x4d,0xb3,0xda,0x11,0x5a,0x81,0x33,0xf1,0x9f, - 0x8e,0xe5,0xf1,0x43,0x63,0xc1,0xfd,0x6d,0x23,0x93,0xcb,0x53,0xf2,0xae,0x89,0x93,0x03,0x59,0x3f,0x9a, - 0x6f,0x22,0xda,0xda,0x12,0x32,0x3c,0x90,0x8d,0xac,0xe1,0x79,0x5e,0x54,0xbf,0xe6,0x4f,0xfd,0x63,0xf3, - 0xdd,0x34,0x91,0x40,0xb5,0x94,0xdd,0x17,0xbf,0x0b,0xe6,0x07,0x59,0x1d,0x88,0xda,0x01,0x15,0xfd,0x45, - 0x36,0xa2,0x5f,0xe3,0xb9,0xf8,0x81,0x62,0x46,0x3c,0x28,0x93,0x04,0x32,0x85,0x12,0xf5,0x68,0x13,0x86, - 0x7f,0x3a,0x8e,0xee,0xdf,0x3f,0xa8,0xd1,0xb4,0xd6,0x8e,0x8f,0x8f,0xe5,0xb7,0xbe,0x47,0x37,0xaf,0xfd, - 0x95,0x3c,0x8e,0xc6,0xd2,0xa3,0x5d,0x8a,0xf4,0x7d,0x90,0x2d,0x0f,0x6a,0x30,0xe9,0x75,0x28,0xe0,0xcf, - 0x66,0x4f,0xd1,0xd3,0xfe,0x65,0x90,0x66,0x32,0x92,0xd0,0x59,0x2f,0x0d,0x83,0xa9,0x3c,0xe8,0xd4,0x1b, - 0x51,0x7d,0x5c,0x03,0xbd,0x72,0x7a,0x26,0x67,0x54,0xdf,0xc7,0x8f,0x35,0xed,0x3d,0xae,0xef,0xd9,0x83, - 0x48,0xdd,0x7f,0x8b,0xed,0xfb,0xbf,0xc8,0x5f,0x8f,0xff,0xd4,0x82,0x4f,0xcf,0xfd,0x10,0x40,0x42,0x75, - 0x84,0x6e,0xa0,0x13,0x3e,0x66,0x2f,0x3a,0xc9,0xa0,0xe3,0xb0,0xa2,0x12,0xe6,0x22,0xaa,0xe3,0xe6,0xb1, - 0x1a,0xa0,0x90,0x02,0x86,0x17,0x79,0x73,0x20,0xde,0x07,0x87,0x7a,0x58,0xf2,0xfe,0x7d,0x1f,0x23,0x37, - 0x65,0x34,0x83,0xee,0x45,0xf1,0x4c,0xbe,0xbb,0x5c,0xcb,0x6f,0xe5,0xf8,0x14,0xaa,0x89,0x16,0x30,0x4f, - 0xf5,0xa3,0x44,0x66,0x9b,0x24,0x12,0xfe,0x8d,0x99,0x69,0x5a,0x62,0x9c,0x6c,0xe8,0x4d,0xc3,0x9a,0x6c, - 0x58,0x01,0x18,0xc6,0x79,0xad,0x71,0x4d,0x93,0x33,0x66,0x58,0xa8,0x7d,0x7d,0x90,0x7d,0x5b,0xab,0x8d, - 0x6b,0x42,0x26,0x49,0xad,0xde,0x48,0xe2,0x50,0x8e,0xe1,0x09,0xc6,0x27,0x80,0x62,0x32,0xae,0xf9,0xa1, - 0x04,0x9d,0xe9,0xa6,0x21,0x4d,0x5b,0x30,0xda,0xc8,0x0b,0x65,0xb4,0xc8,0x96,0xdf,0xe6,0xfd,0x2b,0xd5, - 0x8e,0x5b,0x9f,0xf0,0x1d,0xae,0xb8,0xb7,0xf2,0xd7,0x07,0x00,0x27,0xaa,0x2f,0x19,0xf5,0x85,0x21,0xdb, - 0x7c,0x20,0x71,0x7f,0xf4,0xdb,0x1a,0xfc,0x81,0x46,0xb1,0x3d,0x2f,0xf4,0x27,0x98,0x37,0x52,0xb5,0x9a, - 0x95,0x97,0x0c,0x96,0x3c,0x98,0x9e,0xd5,0x1a,0x07,0x75,0xa8,0xda,0xf7,0x12,0xb9,0x8a,0xcf,0xe5,0x41, - 0x1d,0x3e,0x9d,0x47,0x07,0xf5,0x9b,0x7a,0x23,0xbb,0xa9,0xd7,0xeb,0x63,0x98,0xf8,0x77,0xc1,0x4a,0xc6, - 0x9b,0xec,0x00,0x4b,0x5a,0x05,0xb3,0x6f,0xbb,0xb2,0x3b,0x1e,0xc8,0x6e,0xbd,0xf1,0x9f,0x0e,0x6a,0x6a, - 0x6b,0xa7,0x56,0xd7,0x63,0xf2,0xeb,0x0d,0xff,0x26,0x94,0x99,0x88,0x64,0xf6,0xc3,0x19,0x4c,0x67,0x0e, - 0xce,0x50,0xe7,0x6b,0x89,0x90,0x7a,0x2d,0xff,0x74,0x7c,0x4c,0xef,0x01,0x06,0xb8,0x9c,0xa4,0xca,0x98, - 0x3c,0xd7,0x19,0x12,0xb1,0xcb,0x5e,0x16,0x2f,0x16,0xa1,0x04,0x08,0x04,0xb1,0xac,0xf1,0x27,0x58,0xbc, - 0x1b,0x3f,0xbd,0x8c,0xa6,0xc2,0x54,0xea,0xaf,0x03,0x04,0x8c,0xe3,0xeb,0x9b,0x7c,0xd5,0x22,0x79,0x21, - 0x4e,0x26,0x40,0x88,0x1f,0xc7,0x00,0xf5,0x71,0x08,0xab,0xd1,0x08,0x8e,0x4b,0x43,0xf2,0xb1,0x08,0x8c, - 0x28,0xf2,0x32,0x7e,0xfe,0xf1,0x63,0xbb,0x03,0xe3,0x42,0x7f,0x04,0x91,0x1e,0xe1,0x36,0x4b,0x7a,0xec, - 0x5f,0xf8,0x41,0x26,0xe6,0x92,0x76,0x3a,0x1a,0xd7,0x69,0xb0,0x88,0xfc,0x10,0x21,0x93,0x2e,0x68,0xa5, - 0x6e,0xac,0x9d,0x90,0x8c,0x52,0x9a,0x83,0xe6,0xe5,0x27,0xba,0xb1,0xa0,0xde,0x50,0x23,0xff,0x53,0x1b, - 0x1a,0x83,0xbe,0x3d,0x4d,0x12,0x00,0xe2,0xec,0xa0,0x06,0x63,0x27,0x08,0x82,0x0a,0xb6,0x7c,0xd1,0xaa, - 0x2b,0x9a,0x91,0xa8,0x9e,0xa4,0x1e,0x7a,0x50,0x1d,0x70,0x27,0xe3,0xe3,0x84,0xba,0x19,0x1f,0xff,0xd3, - 0xe9,0x0f,0xaf,0xbd,0xb5,0x9f,0xa4,0xf2,0x20,0xb1,0x37,0x66,0x80,0x26,0xfc,0x29,0xf5,0x62,0x98,0xe8, - 0x4e,0xab,0x03,0xb3,0x9e,0x7a,0x0c,0xa4,0x7a,0xb2,0xe4,0x71,0x7c,0xff,0x7e,0x8c,0x49,0x57,0xe3,0x04, - 0xa0,0x3f,0xef,0x9d,0xfc,0x16,0xd0,0x67,0x25,0xd3,0x14,0x68,0xea,0xc7,0x8f,0xd2,0x9b,0x02,0x26,0xd5, - 0xbf,0x86,0x67,0xf3,0x40,0x86,0xb3,0x6f,0x6b,0xe2,0xa0,0xf6,0xb5,0xba,0xf9,0xba,0x56,0x47,0xf0,0x03, - 0x2c,0x7e,0xfe,0xee,0xdd,0x1b,0x51,0xfb,0xda,0x34,0x72,0xc4,0xd3,0x91,0xa9,0x7b,0xd3,0x7a,0x23,0xa3, - 0xfa,0x10,0x59,0xb9,0x66,0x80,0x3a,0x06,0xd9,0x6b,0x2e,0x30,0x36,0x25,0x71,0x3f,0x6b,0x1c,0x37,0x70, - 0xd0,0xe3,0xe4,0xe6,0x46,0x4d,0x86,0xfc,0xed,0x98,0x48,0x63,0x84,0x0b,0x09,0x10,0x90,0x35,0xce,0xe3, - 0x60,0x26,0x5a,0x40,0x40,0xa2,0x6f,0xaf,0x57,0x32,0x5b,0xc6,0xb3,0xb1,0xbc,0x19,0x9b,0xcb,0x06,0x73, - 0x82,0x74,0x7c,0x5d,0x7b,0xcc,0x1b,0xcb,0x4d,0xa4,0x0b,0x88,0xab,0x78,0x68,0xeb,0x94,0xd8,0xe5,0x83, - 0xbf,0xa6,0x80,0x5c,0x37,0x0d,0xdc,0xba,0x1a,0xd3,0x8c,0xa6,0x44,0x34,0x82,0xf9,0xe5,0x41,0x84,0xb8, - 0xb1,0x8e,0xd3,0x8c,0x1a,0x86,0x66,0xa1,0x0f,0x07,0xb5,0x37,0x3f,0x9c,0xbe,0xab,0x35,0xf0,0x41,0x0e, - 0xe6,0xf3,0x55,0xf6,0xe8,0x32,0x03,0x52,0x0b,0xf3,0xaf,0xf0,0x50,0x3e,0x3c,0x6e,0x83,0x20,0xdd,0x1f, - 0x0e,0x60,0x56,0x1f,0xa8,0xcb,0x3a,0x00,0xf7,0x77,0xe8,0x12,0x79,0xd0,0xae,0x7f,0x5d,0x13,0xaf,0x1e, - 0xd5,0xc6,0x54,0xae,0xd3,0xe3,0x42,0x9d,0x5e,0xa1,0xc4,0xf7,0x58,0x02,0x7e,0x1f,0xd5,0x6c,0xc2,0xf5, - 0x5c,0x7e,0xc8,0x5b,0xaa,0x71,0x87,0x81,0x90,0xe2,0x56,0x37,0x90,0x47,0xa0,0x7c,0x0e,0x25,0xbf,0x07, - 0x84,0x5c,0x42,0xb5,0x3f,0xa2,0xdf,0xdd,0x63,0x1f,0xc0,0x05,0x96,0xed,0x1e,0x2e,0x65,0xf9,0xd9,0xc1, - 0x6b,0x3a,0xcf,0x1d,0x6a,0x7f,0xf8,0xf0,0x61,0xeb,0x7e,0x7b,0x30,0x1c,0x0e,0x3b,0xed,0x3e,0xf6,0x4a, - 0x11,0xd3,0x36,0x0c,0x62,0xed,0xcf,0x4e,0xb1,0x81,0x83,0x41,0xa3,0xd6,0xaa,0xd5,0xdd,0x7a,0xf2,0x8e, - 0x06,0xd1,0xd9,0x0f,0x11,0x76,0x54,0x93,0x33,0x02,0xd6,0x17,0xc8,0xb9,0x14,0x13,0x01,0xe4,0x80,0xfa, - 0x3e,0x7e,0x04,0x02,0x8c,0xfc,0x11,0xe6,0xe0,0xb8,0xd3,0xef,0xd7,0xbf,0x39,0xf6,0x40,0x9c,0xed,0x8c, - 0xbe,0x85,0x39,0x01,0x35,0xa2,0x33,0x7e,0x05,0x02,0xbc,0xb7,0x8e,0x2f,0x0e,0x0e,0xe4,0xd7,0x5e,0x0b, - 0x4a,0x3c,0x68,0xe3,0x0f,0xc8,0xd1,0x3d,0x4d,0xf8,0xbc,0x4e,0xbb,0x33,0xf8,0x4b,0x74,0x90,0x3d,0x7c, - 0xd8,0x1e,0xdc,0xc7,0x5a,0xbe,0xf6,0x86,0x20,0x93,0xf2,0xa3,0x91,0x7a,0xd2,0x1a,0x76,0xf0,0x09,0xdc, - 0xdc,0xcf,0xea,0x0f,0xbd,0xf6,0xf0,0xf0,0xdb,0x1a,0xfa,0x0c,0x00,0x50,0x90,0x1a,0x98,0x77,0x9e,0xb6, - 0x45,0xdf,0x00,0xdd,0x54,0x40,0xe7,0xf0,0x07,0xf2,0xe1,0x05,0x92,0x4c,0xce,0x05,0x35,0x2a,0x5a,0x6b, - 0x10,0x0b,0x1b,0xeb,0xd5,0x01,0xd0,0x09,0xa8,0x2c,0x0a,0x95,0x39,0xb9,0x07,0x7e,0xf9,0xa1,0x06,0xef, - 0xd2,0xaa,0x77,0x6b,0x24,0xd3,0x5f,0x1f,0x44,0x80,0x6a,0xb5,0xaf,0x23,0xc4,0xaf,0x1b,0x0c,0x19,0x07, - 0x6e,0x73,0x4c,0xb4,0x5b,0xe3,0xaf,0x62,0x97,0xee,0xbc,0x1f,0x05,0x40,0xb0,0xc9,0x39,0xe1,0x31,0x26, - 0x76,0x48,0x24,0x4e,0x7d,0x23,0xf0,0x68,0x0f,0xd5,0xa3,0x3e,0x1e,0xeb,0x15,0xb9,0x31,0xfc,0xb0,0x82, - 0x5b,0xa8,0xc1,0x51,0x8b,0x09,0x52,0xff,0xfb,0xf7,0x33,0x62,0x13,0x78,0x73,0x8d,0xec,0x75,0x9c,0x72, - 0x1c,0xfb,0xd8,0x6f,0x2c,0x64,0x36,0x66,0xd2,0x5a,0xd1,0x25,0x24,0x69,0x63,0x49,0x4c,0x87,0xf9,0xbb, - 0x9e,0x1c,0xac,0xea,0xe6,0x26,0x9f,0xec,0x99,0x9c,0xc4,0x70,0x2d,0x09,0xcf,0xae,0x89,0x95,0xa8,0x1e, - 0x1e,0x00,0xb5,0xf5,0x69,0xec,0x36,0xb5,0x8c,0x80,0xa8,0x16,0x89,0xbb,0xe4,0xa2,0x50,0xc1,0x8d,0xbd, - 0x8a,0xeb,0xcb,0x77,0x48,0x3c,0x01,0x0a,0x81,0x2e,0x82,0x0c,0x18,0x2c,0x40,0x76,0x4b,0x80,0xdd,0x04, - 0xeb,0x49,0xec,0x27,0x33,0x60,0xd2,0xe5,0x87,0xde,0x45,0x02,0xb2,0x1e,0x7e,0x58,0xd7,0xcc,0x7c,0x57, - 0x21,0x94,0xc4,0x6c,0x96,0x8d,0x94,0x0b,0xfd,0x5c,0x60,0x69,0x19,0x28,0xe4,0x8d,0xe1,0xcf,0x46,0x96, - 0x43,0x8a,0xa3,0x39,0x68,0x06,0xdd,0xf6,0x58,0x56,0x82,0x59,0x33,0x45,0xe4,0x07,0x39,0x7d,0x1c,0xaf, - 0x56,0xc0,0x21,0x81,0x89,0xa3,0xc9,0x12,0xcb,0x19,0xb6,0xfc,0x26,0x01,0x21,0x34,0x95,0xf0,0x20,0x8d, - 0xc3,0x73,0x07,0xf5,0xa6,0x61,0x9c,0xca,0xb7,0xf1,0xc5,0x2b,0x19,0x6d,0xd2,0x83,0xfa,0x75,0xb5,0xe4, - 0x79,0x12,0x42,0x67,0xb5,0xf3,0xa9,0x60,0xe7,0x53,0x40,0x67,0x10,0xb7,0x9e,0xfa,0xc8,0x4c,0x60,0xda, - 0xa5,0xa7,0x04,0xf8,0x3f,0xb5,0x6e,0xac,0x9e,0xed,0xac,0x06,0x65,0x74,0xa7,0x16,0xe9,0x0a,0x75,0x35, - 0x12,0xa1,0xe5,0x07,0x00,0xfe,0x19,0x88,0x86,0x0d,0x25,0x45,0xd7,0xad,0xfe,0x27,0xdc,0xf5,0x9c,0x78, - 0x44,0x65,0xb9,0x8c,0xbb,0xdb,0xe0,0xfe,0x8d,0x6b,0xfc,0x8b,0xb8,0xe5,0x57,0xc9,0x4d,0x35,0xec,0x96, - 0x20,0x65,0xa2,0x41,0xfa,0xc3,0x18,0x98,0xf1,0x2a,0x4e,0xa0,0xdd,0x06,0x77,0x68,0xe9,0xa7,0xeb,0x78, - 0xbd,0x59,0x03,0x2d,0xc0,0x81,0xd4,0x1a,0x85,0x7e,0x8e,0x55,0x3f,0x6f,0x1a,0xb5,0xdf,0xff,0xe7,0xff, - 0xab,0x56,0x3f,0x8a,0xb6,0x8b,0x5a,0x3c,0x68,0xd0,0x69,0x61,0x8d,0xd6,0xfe,0x82,0x58,0xcd,0x81,0x23, - 0xc9,0x66,0x28,0xc9,0x32,0x54,0xfe,0x29,0xab,0xa3,0xe7,0x53,0x10,0x6d,0xe4,0x91,0x96,0xe3,0x01,0xed, - 0x7f,0x3d,0xce,0x14,0x99,0xd0,0x43,0x09,0xbe,0xd5,0x83,0xe1,0x60,0xad,0xda,0xcd,0x18,0x25,0x60,0x94, - 0x39,0x83,0x6f,0xfd,0x64,0x85,0xa2,0xf7,0x41,0xca,0x98,0x5b,0x80,0x80,0x86,0x8f,0x28,0x0c,0x3c,0x76, - 0xb7,0x74,0x58,0xf9,0x15,0x48,0x4b,0x0a,0x4e,0xd3,0xfa,0x8d,0xc6,0x07,0x6f,0xaa,0xa8,0x8c,0x16,0x71, - 0x0f,0xfc,0x9d,0xd3,0x71,0x5d,0x31,0x1f,0x06,0x69,0x22,0x05,0x65,0x47,0xc5,0xf6,0x33,0x94,0x16,0x0d, - 0x08,0xb6,0x1b,0xfe,0x2d,0x90,0x44,0x5a,0x66,0x1d,0xfb,0x5c,0x02,0x17,0x05,0x9f,0x35,0x24,0xa9,0xa0, - 0x54,0xd0,0xcc,0xe5,0x00,0xa7,0x67,0x0f,0xe4,0x4a,0x80,0x1f,0x9c,0x0b,0x90,0xc3,0x88,0x12,0x05,0xc7, - 0x34,0xc7,0x29,0xfd,0x68,0x2c,0x96,0xb7,0xcc,0x23,0xac,0x2a,0x4c,0x1d,0xad,0x6e,0xa0,0x49,0x48,0x51, - 0xde,0x53,0x15,0x4b,0x4b,0xf4,0x55,0xa8,0x5d,0xa3,0x13,0xbc,0x6a,0x28,0xa1,0x17,0x49,0x3a,0xd0,0xb8, - 0xb4,0xce,0x92,0x0f,0x4e,0x60,0x7a,0xfc,0x0b,0x3c,0x91,0xbc,0x18,0xaf,0x81,0x34,0xa7,0xbf,0x3a,0x15, - 0x42,0x2f,0x77,0xd5,0x06,0x28,0x90,0x6e,0x10,0x05,0xea,0x65,0x61,0xf9,0xfa,0xf3,0xfb,0x77,0xd3,0x00, - 0x7d,0xa1,0x7e,0x23,0x01,0x5b,0x04,0x6b,0x18,0xf2,0xc6,0x90,0x8e,0xad,0x13,0xe7,0xac,0xbd,0x45,0x6b, - 0xca,0x1f,0x9c,0xc9,0xcb,0x59,0x7c,0x11,0x31,0x5c,0xd5,0x9e,0xa6,0x53,0x7f,0xcd,0x8a,0x24,0x26,0xcb, - 0xbb,0x7f,0xbf,0x00,0x44,0x37,0x1a,0xce,0x5e,0xb4,0x47,0xaf,0x8f,0xaf,0x81,0x56,0x5c,0xa3,0x27,0xd2, - 0xb8,0x76,0x0a,0x7f,0x41,0x9a,0x12,0xca,0xed,0xb0,0xd6,0x40,0x23,0x00,0x10,0xfa,0x71,0xed,0x15,0x9a, - 0x07,0x14,0xc9,0x47,0x9b,0x4a,0x03,0x43,0xd7,0xc6,0xb5,0x27,0xf0,0x97,0x48,0x3f,0x3c,0x50,0x2e,0x81, - 0xb5,0x27,0x7c,0x51,0x6b,0xa4,0x97,0x29,0x9e,0x7b,0x57,0x3b,0xa5,0x5f,0x40,0x56,0x6c,0x74,0x5c,0x7b, - 0x81,0x3f,0xb5,0xc6,0xda,0x27,0x8f,0x67,0x78,0xf0,0x46,0x5d,0xd5,0x1a,0x61,0xbc,0x18,0xd7,0x5e,0xc6, - 0x8b,0x5a,0xc3,0xdf,0xcc,0x82,0xf8,0x9d,0x3f,0x19,0xd7,0x4e,0xf0,0x0a,0x7a,0xb2,0xee,0x42,0xd1,0x57, - 0x6f,0xba,0x29,0x5f,0x63,0x56,0x90,0x71,0xed,0x5f,0xe2,0x4d,0x22,0x60,0xe0,0x02,0x5e,0xa0,0xb9,0x52, - 0xa6,0x0d,0x01,0x14,0x45,0x44,0x71,0x16,0xcc,0x95,0x40,0x9b,0x0a,0xc0,0x05,0xc1,0x86,0x88,0xd4,0xab, - 0x35,0xd0,0xa9,0x98,0xab,0x7e,0xeb,0x53,0xd5,0xf4,0xe0,0x39,0x74,0x0c,0x5d,0x17,0x41,0x1b,0x11,0xf4, - 0x40,0xa4,0x6c,0x3e,0x32,0x9f,0xa0,0xf7,0xe7,0xb8,0xf6,0x3a,0x7f,0x21,0x2e,0x65,0xe6,0x89,0x93,0xd9, - 0x4c,0xc0,0x1b,0x01,0x2a,0x67,0x7c,0x61,0xca,0xfa,0x2b,0x2c,0x0b,0x7f,0xd5,0x83,0x4d,0x12,0xc2,0x44, - 0x64,0xc0,0x02,0x57,0xe2,0xc7,0xb7,0x2f,0xd5,0x53,0x58,0x48,0x18,0x20,0x54,0xa0,0xaa,0x54,0x8f,0x71, - 0xfa,0xd0,0xa9,0xae,0xf6,0x86,0x2f,0xd4,0x63,0xa4,0x16,0x6b,0x39,0xc3,0x3e,0x64,0x62,0xed,0xbc,0x9a, - 0x6d,0x50,0xec,0xc2,0x56,0x85,0x1f,0x42,0x23,0xb3,0x4b,0xb1,0x49,0x11,0xff,0xe9,0xed,0xc4,0x9f,0x51, - 0xfb,0xab,0x0d,0xac,0x39,0x09,0xc2,0x02,0x8f,0x70,0x16,0xcb,0x2c,0x5b,0x8f,0x1f,0x3c,0x10,0x30,0x61, - 0x78,0x99,0xc2,0xb5,0xfa,0x22,0x8c,0xb1,0x79,0xaa,0x2f,0x48,0x01,0x22,0x62,0x81,0x4f,0xc4,0x41,0xa7, - 0x27,0xa6,0x4b,0x3f,0x01,0x0d,0x1d,0xd4,0x88,0x3a,0x2c,0xd3,0x7a,0x9d,0xf2,0x2a,0xc1,0x05,0xdd,0x86, - 0x71,0xbc,0xa6,0x5b,0x41,0x79,0xda,0x68,0x50,0xea,0x31,0x4c,0xf1,0xbb,0x25,0x74,0x10,0x8a,0x0a,0x65, - 0x7c,0xc4,0x50,0xf5,0x94,0xa6,0x8f,0x3c,0x8b,0x61,0xa5,0xe2,0x6c,0x09,0xbf,0x28,0xd4,0x43,0x51,0x05, - 0x53,0x9e,0x78,0x92,0xf8,0x0b,0xf1,0xfb,0xff,0xf1,0xff,0x22,0x70,0x26,0x92,0x5c,0x3e,0x61,0xaa,0x2d, - 0xa7,0xd1,0xda,0x23,0x73,0x6d,0x3f,0x87,0x26,0xdf,0x6e,0x22,0xa1,0x98,0x49,0xbc,0x49,0xc3,0xcb,0x06, - 0xfa,0x2f,0x82,0x62,0x8e,0x87,0x31,0x22,0x11,0xf7,0x4b,0xad,0x11,0x2c,0x93,0xd1,0x06,0xbb,0x4a,0x00, - 0xcd,0x26,0x1c,0xf3,0xfc,0x39,0xaf,0x01,0xa0,0x04,0xcc,0xb2,0x27,0x7e,0xff,0xdb,0xbf,0x9e,0x60,0x6e, - 0x3c,0x3f,0x93,0xbf,0xff,0xed,0xbf,0x0b,0x90,0x03,0x11,0xe6,0xb0,0x76,0x81,0x5d,0x81,0x72,0xd0,0x6d, - 0x6c,0x41,0x4f,0x09,0xce,0x38,0xde,0xe7,0x1d,0x85,0x46,0x7d,0x55,0x05,0xcc,0x9e,0xba,0x82,0x06,0x65, - 0xfe,0xf4,0x89,0xb9,0x06,0xd4,0x82,0xf5,0x9b,0x2e,0xb3,0x18,0x60,0x0a,0x66,0x10,0xc0,0xfd,0x02,0xb0, - 0x02,0x58,0x37,0x7f,0x4b,0xf8,0x05,0x20,0x01,0x1d,0x80,0xcf,0x36,0xac,0xda,0xc1,0x57,0x51,0x6c,0xcf, - 0x18,0x40,0x72,0x7e,0xab,0xf1,0x03,0x0b,0xf1,0xa8,0xe1,0xb5,0x4f,0x8b,0x3a,0x83,0xb9,0x87,0x19,0x1f, - 0xd7,0x7e,0xc0,0x69,0x07,0xaa,0xb4,0x0c,0xd6,0x6f,0x36,0x18,0xb8,0x3a,0xae,0xad,0xe9,0x97,0x9f,0x9d, - 0x52,0x0d,0xe3,0x1a,0xd7,0xc4,0xcf,0x5e,0x01,0x64,0x82,0x60,0x01,0x62,0x05,0xfe,0x62,0x1f,0xf1,0x17, - 0x11,0x99,0x2f,0xcc,0x93,0xe7,0x38,0x12,0x90,0x10,0xf1,0xf4,0x67,0x20,0x9c,0x00,0xd9,0x82,0x62,0x69, - 0x00,0x38,0x08,0x20,0x54,0xf7,0x60,0x6e,0x43,0xcc,0x0b,0xc7,0xf0,0xcb,0x1e,0x0d,0x1e,0x55,0xc2,0xd7, - 0xe3,0x9a,0xf2,0x72,0xc0,0x47,0x06,0x61,0x55,0x1b,0x88,0xaf,0xaa,0xab,0x44,0xed,0x90,0xe6,0xad,0x4d, - 0xef,0xe1,0x46,0x01,0x28,0xb7,0x25,0xd4,0x6b,0x58,0x28,0x40,0x01,0x5e,0x24,0xf1,0x82,0xf0,0xe7,0x32, - 0xc5,0x2e,0xd8,0x0b,0xea,0x71,0x25,0xcf,0xa8,0xc5,0x28,0x16,0xa8,0xb0,0xe7,0x8f,0xa8,0x5e,0xa8,0x04, - 0x01,0x02,0x7e,0x78,0xf1,0x24,0x92,0x0d,0x22,0x4d,0x67,0x52,0x02,0x46,0x04,0x30,0xba,0x34,0x8c,0x33, - 0x05,0x9f,0x31,0x46,0x1c,0x2e,0x04,0x88,0x60,0x22,0xc5,0x08,0x87,0x00,0x34,0xad,0xe8,0x92,0x2a,0x66, - 0xba,0x03,0x5d,0x81,0x95,0x01,0xec,0x01,0xe1,0x01,0x7a,0xa3,0x60,0x18,0xbd,0xc9,0x04,0xae,0x0a,0xf4, - 0x88,0xd0,0xe4,0xd4,0x3f,0xc7,0x85,0x42,0x84,0xa4,0x7b,0x81,0xde,0x2a,0x30,0xe6,0x74,0xf3,0x18,0x0d, - 0x95,0xe3,0x1a,0xfd,0x10,0xd1,0xdc,0xac,0xa1,0x76,0x5c,0x13,0xf5,0x8e,0x48,0x90,0xbe,0xb2,0x4b,0xfc, - 0xfe,0xb7,0xff,0x13,0x0b,0xbd,0x45,0x3a,0x33,0xae,0xfd,0x48,0x0f,0x85,0x7f,0xee,0x07,0x21,0x62,0x07, - 0x7d,0xcf,0x5b,0xd1,0xf8,0x12,0x51,0x76,0xc6,0x40,0xbb,0x79,0x89,0x9e,0xb8,0x58,0x27,0x0a,0x6b,0x34, - 0x7e,0xa6,0x03,0xf8,0xee,0x55,0x90,0xa6,0xd4,0xe2,0x6b,0x26,0x36,0x88,0x9e,0xba,0x4a,0x3d,0xba,0xe7, - 0x9b,0x09,0x16,0xfd,0x61,0x3e,0xa7,0x1c,0x60,0x35,0xb8,0x17,0x64,0x6f,0x15,0x9b,0xc8,0x69,0x9f,0xfb, - 0x64,0xfa,0xa6,0x41,0x12,0x3a,0x06,0x3a,0x03,0x52,0x7a,0x3c,0x6a,0x2f,0x14,0x30,0xb9,0xbe,0x40,0x73, - 0x8f,0x5d,0x20,0x9a,0x07,0xc9,0x2a,0x2f,0x43,0xcb,0x8f,0x0d,0x01,0xc1,0x48,0x61,0xa9,0xbf,0x15,0xc4, - 0x74,0xa6,0xf1,0x6a,0x0d,0x4b,0x8f,0x9d,0xd3,0xf0,0xa2,0x92,0xcc,0x83,0xe4,0x24,0x61,0x4d,0xd7,0x08, - 0x98,0x30,0x2c,0x95,0xeb,0x45,0xf1,0x2a,0xb4,0xf3,0xd0,0xa2,0x92,0x53,0x32,0x12,0x53,0x18,0x69,0x0a, - 0xab,0x69,0x5a,0x93,0x76,0x63,0xdc,0xc3,0x54,0xae,0x81,0xe6,0x9a,0x71,0xe0,0x8c,0x22,0xcc,0x88,0x4b, - 0xac,0xf1,0x22,0x4e,0xce,0xa8,0xa5,0x47,0x9b,0x54,0xaf,0x06,0xae,0x17,0x97,0x55,0x4b,0xf5,0x84,0x00, - 0x93,0x31,0x54,0xad,0x22,0xc1,0xc0,0x77,0x30,0xd4,0x0b,0x3f,0xc9,0x67,0x8a,0xaa,0x54,0xc4,0x79,0xae, - 0x5e,0x62,0x7b,0x64,0xbf,0xb7,0x3f,0x4f,0x3d,0x86,0x13,0x5a,0x49,0x07,0x6f,0x78,0x4c,0x80,0x2c,0x25, - 0xc8,0x62,0x50,0xa5,0x0f,0x91,0xd7,0x2e,0x12,0xcc,0xa6,0x42,0x9f,0xda,0x43,0x56,0xdf,0x0b,0xe0,0x59, - 0x38,0x0e,0x94,0x6b,0x30,0xf4,0xcc,0x13,0xef,0x92,0x4b,0xab,0x86,0x1f,0xa3,0x33,0x20,0x7b,0x11,0xc1, - 0x0b,0xd7,0x2f,0xd0,0x13,0x24,0xe1,0x70,0x13,0xc6,0x75,0x84,0x51,0xcc,0xd6,0x10,0x47,0x0c,0x2b,0xeb, - 0xcd,0x44,0x9b,0xb9,0x00,0x3b,0xe7,0x8b,0x77,0xa4,0xf6,0xd4,0x4e,0xd5,0xca,0xd1,0xb3,0xe7,0x01,0xa8, - 0xf3,0xb5,0xc7,0x28,0x31,0x99,0x25,0xa5,0x17,0x2f,0xa1,0x13,0x04,0xa0,0xea,0xc2,0xbc,0xa5,0x39,0x86, - 0x02,0xaf,0x69,0x92,0x09,0xd3,0xd5,0x54,0xc4,0x73,0x74,0x28,0x07,0x64,0x36,0x65,0x3d,0x2a,0xa9,0x90, - 0x52,0xb7,0xcb,0x38,0x29,0x9a,0xb4,0xfa,0x48,0x24,0x40,0x7f,0x45,0x2e,0x4d,0xb4,0x69,0xbe,0x78,0x22, - 0xe7,0xfe,0x26,0xcc,0x80,0x6a,0xfe,0x08,0x7d,0x9a,0xa9,0x3b,0x7a,0xf5,0xde,0x4f,0x22,0x87,0x6a,0xfd, - 0xfe,0xb7,0xff,0x96,0xe6,0x90,0xa8,0x1d,0xfd,0x09,0x8a,0xd6,0x49,0x0c,0xd0,0xba,0xf2,0xc4,0x77,0xc1, - 0x07,0x24,0x27,0x8a,0x84,0xc9,0x59,0x80,0x4a,0x3c,0x4c,0x16,0x74,0x02,0xfa,0x84,0xce,0x6c,0x74,0x3d, - 0xe3,0x1b,0x82,0x13,0x84,0x90,0x53,0xf8,0xfb,0x2d,0xb4,0xea,0x47,0x53,0x89,0x48,0x4c,0xbf,0xc8,0xa2, - 0x42,0xe4,0x4d,0x20,0xc2,0xc1,0x77,0x58,0xd9,0xb8,0xf6,0x14,0xfe,0x12,0xb3,0xa4,0x9c,0xb6,0xc8,0x3f, - 0xa7,0x24,0x22,0x6e,0x22,0x55,0xaf,0xba,0xd0,0xe0,0x8f,0x94,0x32,0x86,0xf9,0x46,0xca,0x80,0xbf,0x24, - 0xc9,0xd1,0xac,0xa2,0xef,0x6d,0x20,0x2f,0x14,0x9b,0xb3,0xe8,0x05,0x30,0x35,0x58,0x05,0x04,0x5b,0xfc, - 0xd5,0xf7,0x54,0xb7,0xba,0x02,0x4e,0x46,0x86,0x65,0xec,0xdc,0x79,0x30,0x95,0x48,0x52,0x61,0x62,0x41, - 0x01,0x67,0x22,0xb1,0x8e,0x2f,0x24,0xbc,0x7c,0x83,0x3f,0x20,0x32,0x50,0x90,0x48,0x24,0x51,0x2f,0x7a, - 0x64,0xae,0xb9,0x03,0xc4,0x46,0xdf,0x60,0x4f,0x40,0x80,0xc0,0xf5,0xc1,0xaa,0x3f,0x64,0xf4,0xf8,0x35, - 0xd2,0x5b,0x7a,0x04,0xc3,0x5d,0x05,0x29,0x8b,0x0b,0x78,0xe1,0xc8,0xa0,0xe6,0xb5,0x12,0xdf,0xcc,0x0b, - 0x61,0x9e,0xc3,0x34,0x47,0xfe,0x9a,0xe7,0x1c,0x17,0x53,0xca,0x08,0xa4,0x23,0x98,0xc7,0x44,0x4e,0x41, - 0x8a,0xc1,0x5c,0x2a,0x33,0xf1,0xec,0xc5,0x77,0xf4,0x00,0x45,0x41,0x94,0x27,0x63,0x84,0x15,0x7c,0x03, - 0xcb,0xdd,0x20,0x30,0xe2,0x22,0xb8,0x41,0xb7,0xc6,0x45,0x7b,0x09,0x17,0x42,0xcd,0x62,0xad,0xa1,0x50, - 0x6c,0x5c,0xfb,0x89,0x2f,0x6a,0x8d,0x25,0x48,0x95,0x80,0x1b,0xf0,0x37,0x22,0x61,0x15,0xf9,0xe2,0x8b, - 0x37,0x02,0x04,0xd3,0x84,0xc6,0x8f,0x6e,0xfb,0xe3,0xda,0xfb,0xe0,0xbb,0x00,0xe7,0x18,0xb7,0x08,0x70, - 0xce,0xf1,0x17,0x25,0x45,0x20,0x93,0xdf,0x61,0x66,0xfb,0xb7,0x27,0xaf,0x60,0xaa,0x52,0x7a,0xf0,0xe6, - 0x34,0xbf,0x8b,0x14,0x3f,0x04,0xf9,0xae,0x29,0x82,0x39,0xd3,0x52,0xd2,0x17,0x08,0x26,0xa9,0x68,0x43, - 0x90,0xd5,0x88,0x60,0xb1,0x99,0x76,0x9b,0xbf,0x6d,0xfc,0x19,0x14,0x26,0xbf,0x40,0x90,0xe4,0x30,0x28, - 0xf2,0x12,0xc5,0x3b,0xba,0xc0,0x91,0x61,0xd0,0x0b,0x8c,0x0b,0x93,0xf5,0x86,0x20,0xc5,0x01,0x08,0xa2, - 0xd7,0x3a,0x20,0x01,0xfc,0xc5,0x10,0x33,0x54,0xdf,0x1a,0xcb,0xcd,0x0a,0x51,0x7e,0x15,0x00,0x28,0xc2, - 0x57,0xd3,0x4d,0x42,0xcb,0xa5,0xf8,0x12,0xaf,0x98,0xfc,0x00,0x00,0x1c,0x12,0x9b,0x32,0x97,0xb5,0x06, - 0x1e,0x09,0x33,0xae,0xe1,0xdf,0x5a,0x63,0xee,0x07,0x09,0x1a,0x39,0x02,0x80,0x90,0x0b,0x3c,0xee,0xa6, - 0x86,0x7f,0x41,0x54,0x9b,0x9d,0x23,0xf4,0x93,0xf0,0xce,0x57,0xf4,0x8c,0x75,0x92,0xef,0x70,0x3b,0x20, - 0xe5,0xb1,0x1a,0x12,0x0a,0x5a,0x21,0x88,0x25,0xf8,0xd4,0xcf,0xf8,0x15,0x87,0x89,0xfa,0x44,0x1d,0x28, - 0xda,0x1e,0xfe,0x78,0xe2,0xad,0x7f,0x21,0xc8,0x42,0x96,0xc2,0x8c,0x31,0x7a,0xb0,0xac,0x83,0x27,0xdc, - 0xa1,0x76,0x21,0x27,0x71,0x0c,0x6a,0xc4,0x6f,0x0a,0x39,0x41,0xff,0x10,0xfc,0x0c,0x25,0x0b,0x78,0xbe, - 0x09,0x50,0x88,0xca,0x48,0x78,0x0b,0x2f,0x95,0x4c,0x70,0x81,0x12,0xf0,0x3c,0x58,0xa8,0xe0,0x39,0x53, - 0x0f,0x10,0x50,0x04,0x2d,0xfa,0x9c,0x64,0xc8,0x64,0x42,0xaa,0x62,0x0e,0xc4,0x2c,0xfc,0xc8,0x15,0x26, - 0x27,0x48,0xf4,0x67,0x44,0x05,0xdf,0xea,0x4b,0x45,0xb7,0x68,0x3c,0x89,0x44,0xe4,0x4b,0x29,0x86,0x0c, - 0x09,0x31,0xf0,0xb8,0xf0,0x92,0x30,0x99,0xbf,0xd4,0x9f,0xa1,0x4e,0x30,0xf1,0xa3,0x88,0x30,0x30,0x89, - 0x99,0x46,0x63,0x5d,0x2b,0x34,0xa6,0x62,0x6f,0x23,0x74,0x3a,0x54,0x8c,0x08,0x46,0x43,0x7c,0x09,0xc1, - 0xd0,0xe8,0x59,0x40,0x53,0x22,0x64,0x69,0x68,0x2f,0xc6,0xeb,0x88,0x7a,0x75,0xaa,0xae,0xa8,0x4d,0x20, - 0x00,0xc8,0x1d,0x01,0x27,0xf5,0x15,0x4c,0x32,0x69,0x08,0xa8,0xd7,0x66,0xac,0xd5,0x82,0xa2,0x8b,0x2b, - 0xa8,0x9e,0xe9,0x25,0x54,0xcb,0x66,0x18,0x17,0x88,0x69,0x80,0x10,0x92,0x14,0x48,0x7f,0x4d,0x45,0x51, - 0xb7,0x60,0x3a,0x6d,0xf5,0x33,0x9f,0x75,0xea,0xac,0xa1,0xc4,0xd0,0x7f,0xa6,0xf2,0xf0,0xfd,0xfc,0x02, - 0xe9,0x9b,0xa6,0x5d,0x39,0x8c,0x1c,0x78,0x93,0x20,0xaa,0x23,0x9e,0xb1,0xf0,0x52,0xe8,0x05,0xbd,0x98, - 0x2e,0xab,0x45,0x36,0x7a,0x55,0x92,0xd9,0x9e,0x05,0x19,0xb0,0x3d,0x9a,0x0b,0x2c,0xb0,0x81,0xd9,0xbe, - 0x3e,0xbf,0x21,0x95,0x0e,0x7a,0x88,0xfe,0x3e,0xb4,0x8f,0x14,0x62,0x76,0x6b,0x8f,0xca,0x44,0x48,0x6c, - 0x55,0x19,0x4b,0xa2,0x82,0x37,0x80,0x05,0x48,0xf5,0xe3,0x4d,0x38,0x23,0x52,0x3a,0x2d,0x76,0xc2,0x62, - 0xd0,0x54,0x75,0xc2,0x35,0x26,0x34,0x16,0xdd,0x13,0xe0,0x4e,0x21,0x46,0x1d,0xd2,0x87,0xa0,0xed,0x45, - 0x97,0x2b,0x24,0xaa,0x08,0xb8,0xd0,0x17,0x58,0x9f,0x24,0x5e,0x31,0xd0,0x05,0x5a,0x1b,0x57,0xc0,0x80, - 0xc4,0x12,0xd1,0x65,0x02,0x84,0x91,0xe9,0xb8,0x9c,0x6d,0x69,0x12,0xba,0x87,0x3a,0xc6,0x5b,0x1e,0x98, - 0xa0,0x5b,0x9e,0xd6,0x73,0x1a,0xc4,0xa6,0x24,0xb1,0xc2,0x93,0x80,0x25,0x30,0x00,0x7d,0x25,0x70,0x88, - 0xfb,0x42,0x3d,0xa3,0xf7,0x5a,0x0e,0xa1,0x19,0x7e,0x92,0xdf,0x98,0xf5,0xd3,0xd3,0xcc,0x0c,0x88,0x8a, - 0xfd,0xb8,0xde,0x56,0x28,0x42,0x24,0x26,0xf1,0x19,0x79,0xb7,0xae,0x1b,0x67,0x5d,0xb1,0x29,0xd0,0xe0, - 0xe7,0xa4,0x25,0x12,0xfe,0xf1,0x0a,0x59,0xa3,0x05,0xd6,0x90,0x64,0x00,0x69,0x34,0xfd,0xf4,0x29,0xae, - 0x28,0xc2,0x95,0x58,0xf9,0xd1,0x06,0xd1,0x8e,0xe7,0x02,0xcf,0xcc,0x22,0x68,0x33,0xd0,0x04,0x4c,0x20, - 0x67,0x3f,0xb8,0xaa,0x38,0x8f,0xaf,0x95,0xbe,0x71,0x01,0x33,0xac,0x39,0xa8,0x2b,0x71,0x61,0x5d,0x24, - 0x61,0x9e,0xe4,0x10,0xab,0xe5,0xae,0xd4,0x58,0x1d,0x92,0x0d,0xa1,0x1f,0x51,0x18,0x44,0x17,0x49,0x28, - 0x8f,0x81,0x9b,0xb9,0x2c,0xa5,0xdf,0x3c,0x57,0xaf,0x52,0xad,0x79,0xe7,0xe8,0x82,0x3a,0x83,0x92,0x73, - 0xc4,0x81,0x42,0x5e,0xd6,0xbc,0xea,0x88,0x40,0x3e,0x1a,0xd9,0xa1,0x2b,0xdf,0xf1,0x05,0xa3,0xa6,0x79, - 0x0e,0xf5,0x3e,0x4d,0x60,0xbe,0x52,0xf1,0xf4,0xa7,0xa7,0x6f,0xff,0xe5,0xdd,0xf3,0x17,0xaf,0x9f,0x89, - 0x03,0xc4,0xc7,0x86,0xb6,0x11,0xe9,0x86,0xea,0x30,0xc6,0xcb,0x35,0x33,0x9f,0xa5,0x62,0x82,0xca,0x00, - 0x86,0x83,0x84,0xb6,0x24,0xd6,0xa4,0x2a,0x14,0x68,0x34,0xb8,0xa4,0x89,0x52,0x2f,0x5e,0xc7,0x39,0xf3, - 0x84,0x55,0x94,0xbc,0x7c,0x14,0x2a,0x08,0xcc,0xeb,0xec,0x54,0x25,0x7b,0x25,0xeb,0xc4,0x66,0x0d,0x10, - 0x85,0x92,0x1d,0x9a,0xd8,0xf3,0x97,0xcf,0x2d,0x88,0xf3,0xc5,0xcf,0xc0,0x7c,0xe3,0xb9,0xb8,0x40,0x36, - 0x81,0x34,0x83,0x05,0xa3,0x06,0xae,0xb3,0xfa,0x14,0xad,0x25,0x9e,0xf5,0xfd,0xc9,0x9a,0xe9,0x90,0x5b, - 0xeb,0x09,0x2a,0xb3,0x8a,0xc0,0xf8,0x2c,0x00,0x90,0xf5,0x43,0xb0,0xc3,0xcc,0x8c,0x54,0x7f,0xe8,0x91, - 0x77,0x15,0xac,0xa9,0x36,0x25,0x0a,0x3f,0xa6,0xd7,0xea,0x2d,0x3e,0xd7,0x7d,0xb3,0x7a,0x59,0x7e,0x09, - 0x6d,0xe1,0xc6,0x20,0x77,0x1b,0xa6,0x2f,0x88,0xa6,0xe1,0x66,0x06,0xdd,0x86,0x79,0x8d,0x58,0x2c,0xf1, - 0xf3,0xa6,0xde,0xc3,0x62,0x32,0x9d,0x42,0xaf,0x84,0x69,0xa6,0xc9,0x35,0xd6,0x87,0xf2,0x82,0x9a,0x2c, - 0x8d,0x14,0xc8,0x5c,0x27,0x67,0x2c,0x5c,0xf3,0x06,0x8b,0xf0,0x91,0xf5,0xfb,0x40,0xbb,0x50,0xb2,0x40, - 0xdb,0xc6,0x22,0x46,0xd9,0x60,0x72,0x76,0x82,0x08,0x7c,0x82,0x18,0x0b,0xcd,0x58,0xa2,0x0b,0xce,0x0b, - 0xaf,0xb8,0x2d,0xed,0x4f,0xce,0x5e,0x38,0x26,0xc9,0xc9,0xd9,0x2b,0x60,0x2e,0xb3,0x80,0x0c,0x14,0xea, - 0x0a,0x9f,0xbe,0xa9,0x30,0x55,0x42,0xd9,0x75,0x57,0x1b,0x24,0xa1,0x7a,0xb6,0x4f,0x68,0x1d,0x8b,0x9e, - 0x9d,0xa0,0x1f,0x1c,0x26,0xb0,0xc9,0xb5,0x6f,0x7c,0xac,0x16,0xeb,0x9d,0x59,0x36,0x6b,0x42,0xd5,0x13, - 0x23,0x08,0xf3,0x1b,0x35,0x3b,0xea,0xa5,0xbd,0xb0,0xc5,0x55,0x7c,0xcc,0x47,0x56,0x3c,0x27,0xee,0xf6, - 0x8e,0xb8,0xd0,0xef,0x7f,0xfb,0x5f,0x90,0x11,0x05,0x8b,0x08,0xae,0x80,0x72,0xd0,0x8e,0x0e,0x4c,0x1a, - 0xdc,0xfe,0xb7,0x4c,0x13,0x0f,0x42,0x0b,0xc0,0x85,0x58,0x43,0x19,0x40,0x1c,0x9e,0x2f,0x94,0x4b,0x2a, - 0xf0,0x25,0x34,0x97,0xc4,0x17,0x29,0x0e,0x28,0xef,0xcd,0xcc,0xac,0x97,0xfa,0x92,0x56,0x0b,0xf5,0x12, - 0x9e,0xed,0x0b,0xbe,0x3a,0x40,0x6b,0x21,0x7e,0x84,0xdc,0xff,0xbf,0xe4,0x43,0x27,0xc7,0x03,0x24,0x35, - 0xb9,0x14,0xa2,0xd5,0xcd,0x20,0x03,0x6d,0x23,0xe5,0xb0,0x5d,0x92,0x75,0x13,0x12,0x09,0xe3,0xf9,0xb8, - 0x16,0xcf,0x01,0xd9,0xf1,0xdc,0x9c,0x1a,0xfe,0x65,0xb5,0x23,0x4e,0xc8,0x10,0x89,0x4b,0x29,0x9e,0xd2, - 0x3d,0x3e,0x2f,0x29,0x6d,0xb9,0xca,0x43,0xb3,0x2a,0x67,0x3f,0x46,0x46,0x29,0xe0,0x29,0xe3,0xb7,0x40, - 0x93,0x98,0xcf,0x91,0xee,0x89,0x05,0xb1,0xe6,0x1f,0x60,0x52,0xc8,0x35,0x84,0x8b,0x92,0x27,0xe4,0xd4, - 0xb0,0xc4,0x89,0xa4,0x59,0x23,0x26,0xbf,0xaa,0x80,0x24,0xfd,0x8c,0x85,0x8c,0x53,0x24,0xe1,0x02,0x75, - 0xdc,0x0c,0xc0,0x78,0x0f,0xc3,0x35,0xf0,0x66,0xac,0x01,0x95,0x8e,0x0b,0x41,0x75,0x5d,0x72,0x9d,0xb6, - 0xb5,0x99,0xb2,0xfe,0x67,0x59,0x06,0x78,0x30,0x3b,0xee,0x35,0xe2,0xe3,0x7e,0x63,0x72,0xdc,0xee,0xb4, - 0xc6,0xd3,0x86,0x6c,0x2c,0xf8,0x3d,0x69,0x06,0x6f,0x58,0x29,0x10,0x98,0x88,0xd7,0x3c,0xb6,0xf4,0x0a, - 0xa3,0x34,0xd0,0x2b,0xb2,0xec,0xa3,0x39,0xda,0x56,0xc2,0xf0,0x8d,0xf5,0x45,0xe1,0xcd,0x6a,0x93,0x91, - 0x0e,0x49,0xe6,0x45,0x00,0x23,0x50,0x86,0x41,0x54,0x54,0x76,0xeb,0xbc,0xb0,0x32,0xa8,0xa5,0x01,0x8a, - 0xdf,0x00,0x82,0xb8,0x31,0x14,0x20,0x66,0x8b,0x0d,0xca,0x9c,0x82,0x77,0x0f,0xc4,0xef,0x7f,0xfb,0x7f, - 0x04,0x6d,0x05,0x78,0xb4,0x39,0x90,0x1b,0xe3,0xa9,0xfa,0x78,0x93,0xad,0x37,0xf0,0x35,0xe0,0x36,0x82, - 0xe9,0xe6,0xea,0x0a,0x8d,0xc8,0x78,0x5e,0x2f,0xc8,0xeb,0x70,0xb9,0x0e,0x2a,0xaa,0x7b,0xf6,0xe6,0xc5, - 0x0f,0x6a,0xa5,0x72,0x53,0xa1,0x5a,0x22,0xb6,0x1f,0xf0,0x2b,0xc2,0x7c,0x25,0x44,0xe0,0x13,0xc0,0x82, - 0x33,0xdc,0x5f,0x7d,0xa2,0xe9,0x3d,0x79,0x71,0xc0,0xd8,0xe6,0xac,0x58,0xd3,0xaa,0x91,0x1a,0x8d,0xa5, - 0xe5,0x87,0x20,0x45,0xc2,0x70,0xa2,0x96,0x8c,0xc5,0x79,0x42,0x2c,0xc7,0x5e,0xcf,0xe5,0x54,0x0b,0xfe, - 0x2c,0x5f,0xd3,0xb1,0xe0,0xd4,0x30,0x00,0x21,0xb3,0x60,0x11,0x64,0xf0,0xfb,0x5f,0xa9,0x8d,0x66,0x03, - 0xd0,0x17,0xb1,0xc5,0xb1,0xca,0x83,0x0e,0x37,0x9b,0xe4,0xe3,0x41,0x56,0x84,0xf3,0x1d,0x30,0x89,0x83, - 0x77,0x45,0x41,0x8e,0xc0,0x5f,0x1b,0x9e,0xb4,0xd5,0x86,0xe4,0xed,0x2a,0x11,0x0c,0x1b,0xce,0x2c,0xb1, - 0x00,0x2a,0x84,0x42,0x2b,0x54,0x9b,0x2f,0xd9,0xbe,0x92,0x2e,0x49,0x19,0x45,0xee,0xe5,0x2f,0x50,0x3b, - 0x54,0xc6,0x6f,0x2a,0x86,0xcc,0x0d,0x28,0x08,0x2a,0xe4,0x1e,0x6a,0x69,0x93,0xc7,0x5c,0x35,0x76,0x88, - 0x65,0x7e,0x28,0x4d,0x66,0x3e,0x78,0xa7,0x70,0xfe,0x3b,0xea,0x30,0xe2,0xdb,0x99,0xbc,0x74,0xd1,0x2d, - 0x55,0x3a,0x50,0x18,0x22,0xdd,0x20,0xed,0x92,0x49,0x14,0x56,0xc3,0x14,0xe6,0x42,0x4e,0x52,0xd4,0x2f, - 0xc9,0x72,0x5a,0xec,0x3d,0x34,0x82,0x68,0xfd,0x63,0x6e,0x3d,0x54,0x06,0x1c,0xc2,0x6c,0x92,0xc6,0x76, - 0x19,0x23,0xb9,0x06,0xcd,0x05,0xbf,0x23,0x59,0x6a,0x1b,0x65,0xc8,0xd9,0x99,0x27,0xde,0xb0,0x60,0x5a, - 0xe8,0xc9,0x1b,0x9e,0xbd,0xdd,0xd5,0xa8,0x29,0xbe,0xb5,0x16,0xde,0x3f,0x32,0xd7,0x44,0xec,0x70,0x4a, - 0xb5,0x44,0xa2,0x90,0xcf,0x4c,0xb5,0x11,0x46,0xf4,0x3a,0x10,0x04,0xa0,0xd1,0xcc,0x9f,0x52,0xc2,0x16, - 0x92,0xc9,0x8c,0x9c,0x3a,0x75,0xc9,0x93,0xd6,0x01,0x1a,0x3c,0xc3,0x30,0xf7,0x68,0xcc,0xe7,0x62,0xdc, - 0xad,0x93,0x4d,0xb6,0x7c,0xab,0xd4,0xd3,0x3d,0x1b,0x51,0xba,0x80,0x35,0xd3,0x5c,0xc9,0x5f,0xc9,0x81, - 0x36,0x37,0x1c,0x6a,0x4a,0x0d,0x75,0xc8,0xb5,0xd2,0xae,0x01,0x52,0x34,0x28,0x23,0x31,0x49,0xd0,0xa2, - 0xa1,0x6c,0xbd,0x2c,0x3f,0x41,0x6d,0xef,0x13,0x58,0xd9,0xe7,0x64,0x00,0xc9,0xd7,0x7c,0x1a,0xaf,0xa4, - 0x52,0x43,0x7c,0xa8,0x19,0x0d,0x78,0x68,0x30,0x20,0xd4,0x40,0xea,0x4f,0x76,0x7a,0xb2,0x25,0x22,0x57, - 0x74,0xe6,0x24,0xe3,0x6a,0xdf,0x21,0x75,0x78,0x39,0x09,0x95,0x79,0x3a,0x47,0x1d,0xe8,0x53,0x5e,0xe0, - 0xb9,0x52,0xe0,0xa1,0x3b,0x20,0x95,0x05,0x91,0x03,0xbd,0xd0,0x75,0x7b,0x82,0xf4,0xe4,0xb0,0xe8,0x7f, - 0x81,0x32,0xd5,0x06,0x6d,0xe5,0x66,0xbb,0x4c,0x7f,0x46,0xd5,0xff,0x00,0xab,0xfb,0x3d,0x20,0x8a,0x32, - 0xf4,0xe3,0x93,0xf9,0x9c,0x88,0xc1,0x99,0xf3,0xf4,0x31,0xee,0xbe,0x23,0x27,0xc6,0x1d,0x6c,0xd3,0x39, - 0x7a,0x8a,0xb3,0x8b,0x9d,0xc7,0x0f,0x78,0x87,0x7b,0x66,0x69,0x66,0x4e,0x6b,0xa7,0x4a,0x08,0xd0,0xc5, - 0xd9,0xb0,0x57,0x1c,0x0f,0x15,0x7d,0x26,0x33,0x9a,0x96,0x67,0x44,0xa4,0x2b,0x26,0xe6,0x19,0xe9,0x04, - 0x68,0xa2,0xe7,0x71,0x63,0x7d,0xd4,0x6c,0x09,0x4c,0x2c,0x73,0x2a,0x7f,0x37,0xae,0xd1,0xe2,0x58,0x65, - 0x70,0xbf,0x19,0x3f,0x86,0xf7,0x68,0xa5,0xca,0x41,0x09,0x5f,0xac,0x8c,0x55,0xbe,0x62,0x2f,0x22,0x98, - 0x86,0xbc,0x4f,0xf1,0x03,0x2e,0x8d,0xf3,0xa2,0x42,0xc7,0xc6,0x26,0xd9,0x4d,0x93,0x70,0x2c,0x98,0x6e, - 0xb4,0x61,0x3a,0x7f,0xe3,0x6e,0x4f,0x04,0x53,0x36,0x93,0x90,0x86,0x6a,0x00,0x5d,0xf5,0x8c,0x5f,0x61, - 0xcf,0x48,0x92,0xd1,0xb7,0x45,0x64,0x08,0xa6,0xc8,0x9c,0x69,0x6c,0x3f,0x05,0x04,0xd4,0xba,0x82,0x73, - 0xf4,0x00,0x41,0xf1,0x8f,0xf6,0xd3,0xf2,0x2d,0x0e,0x76,0xf4,0x01,0xba,0xab,0xf8,0x91,0x43,0xe6,0x34, - 0x13,0x72,0x48,0x1b,0xbc,0xa4,0xd4,0xf5,0x73,0x43,0x7f,0x75,0xf1,0x54,0x41,0xae,0x9a,0x19,0xde,0xb2, - 0xd2,0x88,0x81,0xe9,0x4d,0x2a,0xa9,0x34,0x6a,0x93,0x4a,0xa3,0x26,0x8e,0x94,0xe5,0x4c,0x64,0x8a,0x0a, - 0x57,0x18,0x20,0x1f,0x38,0xb1,0xb0,0x8e,0xda,0xcb,0x25,0x05,0x54,0xff,0xb1,0x7b,0x29,0xf2,0x4d,0x66, - 0x90,0x34,0x63,0xe4,0x70,0xc1,0xd6,0x71,0x6b,0x23,0x01,0xdf,0xe1,0x36,0x09,0x62,0x83,0x5c,0x8b,0xd5, - 0xa5,0x99,0x02,0x45,0x43,0xe9,0xd0,0x27,0x3d,0x4f,0x99,0x99,0x8e,0x7c,0x0e,0x04,0x95,0x00,0x11,0x83, - 0x37,0x21,0x53,0x94,0x9a,0xf5,0x08,0xb0,0xfb,0xc4,0xc9,0x09,0x36,0x99,0x0a,0x7a,0xdc,0x1d,0xea,0xbc, - 0xee,0x50,0x5e,0x2f,0xef,0xa6,0x47,0xf6,0x07,0x63,0xd5,0x1b,0x1e,0xcb,0x0b,0x5d,0x4a,0x3d,0x95,0x1f, - 0xfc,0xd5,0x1a,0x39,0x92,0xf4,0x16,0x20,0xda,0x80,0x66,0x0d,0xe8,0x75,0x76,0x69,0x7d,0xc3,0x82,0xa4, - 0xd2,0x15,0x80,0x5c,0x49,0xae,0x16,0x6d,0xbe,0xf8,0x1a,0xf4,0xdc,0x0d,0xb0,0x76,0x98,0xb5,0xdf,0xff, - 0xf6,0xaf,0xe6,0xfb,0xdf,0xff,0xf6,0xdf,0x41,0xdf,0x27,0xaf,0x56,0x5c,0x78,0xda,0x7c,0x4f,0xd8,0x3c, - 0xee,0x23,0x1f,0x25,0xf1,0x15,0x2b,0x52,0xba,0x91,0x1e,0x2f,0x0b,0x10,0xfa,0x45,0x7c,0xa6,0xd4,0x26, - 0x36,0x56,0xe4,0x2f,0x18,0x5a,0x70,0x7b,0xbc,0x8a,0x63,0x8e,0xf3,0x82,0x64,0x9b,0x07,0xa8,0x4a,0x15, - 0x9f,0x70,0x61,0x46,0x4d,0x33,0x22,0x02,0xca,0x18,0xa9,0xc4,0x2d,0x6b,0xc5,0xcf,0x70,0x06,0x02,0x74, - 0x6a,0x37,0x63,0xe7,0x0a,0x50,0x80,0xa6,0xd9,0xd5,0xf6,0x04,0xb8,0x67,0x7d,0x97,0x1f,0x03,0x56,0xd2, - 0x12,0xa5,0x40,0xe2,0xa6,0x4b,0xd4,0x04,0xf1,0x37,0x6f,0xca,0x08,0x49,0xd3,0x29,0xd3,0x46,0x22,0x86, - 0x82,0x8b,0xd3,0x87,0x5a,0x1b,0x51,0x5b,0x0a,0xa9,0x56,0x4a,0x82,0xe9,0xac,0xac,0x27,0x6b,0x70,0xe3, - 0x1c,0x68,0x64,0x2d,0x56,0x57,0x44,0x26,0xd4,0x0e,0x06,0xba,0x7f,0xe8,0x92,0xfc,0xcc,0x5d,0xd5,0x88, - 0x6d,0xe1,0x16,0x21,0xc4,0xad,0xc7,0x0d,0x1a,0xbb,0x84,0xae,0x0f,0x8d,0xfe,0x29,0x09,0xd2,0x42,0x37, - 0x46,0x03,0xc5,0xe4,0x65,0xce,0xa6,0x4a,0x8a,0x53,0x82,0x4f,0x71,0x3d,0x56,0x24,0xfb,0x8b,0xff,0xef, - 0xff,0xc6,0xcf,0x1b,0xe2,0xcd,0xeb,0x67,0xf8,0xf6,0x9f,0xde,0x3c,0xc3,0x4f,0x99,0x6c,0x06,0x91,0xe6, - 0xf5,0x41,0x64,0xd3,0x4f,0x78,0xcb,0xbd,0xc4,0xbd,0x1d,0xcc,0x26,0x88,0x9d,0x5a,0x6d,0x22,0x3c,0x2f, - 0xcf,0x29,0x9f,0x8b,0x19,0x2c,0x2d,0xc8,0x68,0xc6,0x4d,0x93,0x50,0x18,0xa4,0x96,0xd3,0x05,0xd5,0x8a, - 0xfa,0x93,0xa2,0xe5,0x84,0x34,0x0b,0x5c,0x98,0x84,0x60,0x9e,0x57,0xd2,0x98,0x28,0xfc,0xc8,0x4c,0x1b, - 0xbf,0x51,0x1d,0x4a,0xfc,0x0b,0xfd,0x8e,0xf8,0xbe,0x4e,0x40,0x67,0xc4,0x72,0xc4,0x5c,0x6d,0x51,0xe6, - 0xee,0x31,0xad,0x43,0x92,0xfd,0x83,0x4d,0xec,0xb5,0x77,0x0e,0x5e,0x1b,0x81,0x9a,0x47,0x97,0xd3,0x24, - 0xd2,0x13,0x10,0xa4,0x2c,0xf8,0x34,0x32,0x2c,0x3c,0x5f,0xc6,0xd6,0xee,0xd5,0x4c,0xbb,0x46,0x01,0x44, - 0xcf,0xa8,0x46,0xda,0x14,0xce,0x85,0xcd,0x8b,0x5c,0xbe,0x2b,0xd0,0xe2,0x99,0x9a,0x1a,0xa2,0xf6,0x6a, - 0xe0,0x50,0xc9,0x66,0x7d,0x2b,0x25,0x07,0xfc,0xa7,0xb2,0x3e,0x08,0x4f,0xbb,0x25,0xaf,0xb5,0xee,0xbe, - 0xae,0xd0,0x33,0x1f,0x4e,0xfc,0x2f,0x15,0xb8,0x50,0x51,0x88,0xd3,0x4b,0xa0,0x28,0xcf,0x62,0x6c,0x4c, - 0x7b,0x85,0xa9,0x0d,0x07,0xda,0x70,0x65,0x54,0x0f,0x16,0x51,0x10,0x55,0x32,0xf4,0xd9,0x44,0xfe,0x57, - 0xe8,0xc9,0x77,0xb4,0xcb,0xab,0x07,0x4e,0xd8,0xe1,0xd0,0x0e,0x9c,0x01,0x65,0xbc,0x54,0x02,0x12,0xc2, - 0xbe,0xa7,0x2a,0xc8,0xe2,0xf8,0xa5,0x9f,0x2c,0x94,0xb6,0xcf,0x9f,0x93,0x67,0xd4,0x44,0x92,0xb8,0x8f, - 0xef,0xd0,0xf0,0x0a,0x40,0x34,0xe8,0x89,0xef,0x1f,0x79,0x79,0xc3,0xa4,0x8e,0x71,0xb3,0x44,0xcd,0x71, - 0xb3,0x81,0x9b,0x44,0x6f,0x2b,0x1c,0xbf,0xa6,0xc4,0x86,0x85,0x61,0x39,0x5d,0x83,0x45,0x9f,0xb1,0xa6, - 0x5c,0x1c,0x7e,0x86,0x14,0xfb,0xd2,0x80,0x82,0xcf,0xb5,0x13,0x7b,0x31,0xba,0xdf,0x67,0x93,0x72,0x3d, - 0xe8,0x47,0xc1,0x82,0x59,0x92,0x21,0x29,0xac,0x3d,0x76,0x3b,0xe2,0xd3,0xff,0x26,0x46,0xa0,0x23,0x7f, - 0x90,0x61,0xaa,0x3f,0x40,0xb3,0xfd,0x4b,0xb4,0xd4,0x93,0xa4,0x1d,0xa3,0x26,0x09,0x6d,0xe2,0x2e,0xdc, - 0x0a,0xad,0x11,0xe2,0x3d,0xc6,0xe1,0xf8,0x62,0x15,0xaf,0x68,0x3f,0xad,0xac,0x15,0xc2,0x70,0xb5,0xe7, - 0xd1,0x5e,0xc2,0x06,0x7e,0x01,0x1d,0x7f,0x19,0x2f,0x40,0x1c,0x7b,0x11,0xdd,0x1d,0x52,0x95,0xa1,0x84, - 0xac,0x40,0xc6,0x0a,0x07,0x0f,0x35,0xea,0xb2,0x81,0x1b,0xb1,0x88,0x1e,0xe3,0x29,0xc2,0xd0,0x48,0x96, - 0x84,0x4d,0x20,0xa4,0x6f,0x5e,0x20,0x1d,0xa4,0xbb,0x53,0xa6,0x12,0xfa,0xf6,0x01,0x91,0x36,0xda,0x1a, - 0x04,0x60,0x86,0x0f,0xd9,0xfe,0xc2,0xf2,0x98,0xca,0x62,0x07,0xdd,0x57,0xee,0x47,0x2f,0x94,0xfb,0x11, - 0x67,0x0c,0x19,0xd7,0x9e,0x72,0xe6,0x10,0xb2,0xdd,0xe0,0xbe,0x22,0x99,0x6e,0xc8,0x1d,0x49,0xeb,0x18, - 0x79,0x1d,0x50,0xf7,0x1d,0x15,0x7f,0x58,0x3a,0x5b,0xf1,0x07,0x80,0xa3,0x8f,0xdf,0x4a,0x96,0x22,0xf8, - 0x7e,0xa6,0x1f,0xcc,0xd4,0x74,0xa0,0x97,0x38,0xdb,0x4e,0x94,0x53,0x15,0xfb,0x4a,0x90,0xfb,0xd5,0x73, - 0x3c,0xf5,0x5c,0xb9,0x62,0xe1,0x33,0x43,0xf7,0xd4,0xa6,0xa4,0x2a,0xca,0xb4,0xf6,0x27,0x7e,0x96,0xfb, - 0x66,0xf1,0xa2,0x10,0xdc,0x72,0x75,0xe8,0x9c,0x7c,0x50,0xf7,0xc4,0x33,0x02,0xcd,0x2c,0x77,0x51,0xe2, - 0xed,0x40,0x5e,0x35,0xf4,0xa6,0x5d,0xa2,0xe0,0xa7,0x74,0x49,0x65,0x20,0xf1,0xb3,0x6a,0x03,0x09,0x94, - 0xda,0xee,0x48,0x80,0x1b,0xe7,0x94,0xa4,0xd9,0x36,0xe5,0x01,0x8c,0xd0,0x43,0x7a,0x8d,0x82,0xcb,0x5b, - 0xde,0xa5,0xe0,0x29,0x57,0xd6,0x1c,0xd2,0xc6,0x58,0x92,0xcd,0x72,0x67,0x16,0x63,0xd3,0x87,0x36,0xa9, - 0x78,0xc1,0x33,0x02,0xea,0x9b,0xcf,0xb5,0x1b,0x89,0x9a,0x07,0x44,0xc1,0xdc,0xc7,0x0b,0x63,0xf6,0xb8, - 0xd8,0x33,0x90,0x57,0xc8,0xbc,0xa5,0x7c,0x22,0x53,0x7e,0xbc,0xfd,0x43,0x05,0xd4,0x04,0x52,0xd8,0xa8, - 0xbe,0xca,0x1d,0x0a,0xa5,0x32,0x74,0x42,0xb1,0xad,0xae,0x12,0xf9,0x3b,0xea,0xb8,0xae,0x9f,0xf7,0x6c, - 0xf1,0x44,0x4b,0x34,0xd8,0x67,0x54,0x8e,0xbd,0xaa,0x5e,0xf2,0x48,0x5d,0x25,0x45,0x8d,0x36,0x88,0x80, - 0xc4,0xc1,0x0c,0xc2,0x74,0xa0,0x13,0x80,0xa0,0x98,0x39,0xe8,0x0f,0xf9,0xf3,0x2a,0xc1,0x25,0x0e,0x11, - 0x63,0x13,0x10,0x5e,0x59,0x24,0x93,0x40,0x0b,0xa7,0x08,0xbd,0x18,0x05,0xd2,0x20,0x88,0xcd,0xd8,0x78, - 0x40,0x7d,0x48,0xe2,0x05,0xfa,0x1a,0x88,0x89,0x8f,0x7a,0x22,0xba,0x05,0x93,0x13,0x89,0x32,0xb5,0x9b, - 0x21,0xda,0x46,0x4e,0x20,0x35,0x58,0x04,0x29,0xbc,0x35,0x50,0xc0,0xb1,0x35,0xaa,0x6d,0x88,0x63,0xca, - 0xbb,0x98,0xea,0x53,0x4b,0xa6,0x2b,0x54,0x1a,0x30,0xbc,0xe0,0x2a,0x5f,0x32,0x92,0x3d,0x60,0x1c,0x23, - 0x7d,0x9c,0xde,0xa2,0x23,0x62,0x86,0x8c,0xe8,0x11,0x5e,0xe8,0x31,0x22,0x35,0x4a,0x99,0x6f,0xb3,0x13, - 0xb3,0xc1,0x10,0xed,0xd0,0x8c,0x26,0x2e,0x2d,0x6e,0x32,0xbe,0xc0,0x1b,0x94,0x91,0x80,0x72,0xe0,0x60, - 0x54,0xe3,0xc4,0xba,0x2d,0xe7,0x4c,0x4c,0x52,0x2d,0xf5,0x7e,0x19,0x59,0xae,0xc8,0x43,0x14,0xdb,0x6e, - 0xaa,0xb6,0x93,0xdc,0xe4,0xae,0x1e,0x5b,0x46,0x77,0x1c,0x68,0x16,0xa3,0xe7,0x26,0xfd,0x98,0x07,0x6c, - 0x9c,0xa5,0x5b,0xcb,0xdd,0x58,0x3d,0x49,0x56,0x5c,0x44,0x19,0x01,0xcc,0xf3,0xf9,0x06,0x37,0x52,0xda, - 0x03,0x7a,0x92,0xea,0x0d,0xe3,0x55,0x8c,0xf1,0x5e,0x7a,0xa0,0x62,0x19,0x87,0xb3,0xd4,0x33,0x0d,0x4d, - 0xe3,0x50,0x19,0x82,0xa7,0x04,0x01,0xe6,0xc5,0x3a,0x86,0x4e,0xf9,0x3c,0x0f,0x78,0x48,0x19,0x94,0x5a, - 0x23,0x4a,0xe3,0x76,0x9a,0x99,0x6c,0x72,0xe6,0x41,0x53,0xfc,0x8c,0x34,0x86,0xa6,0x96,0xaf,0x2e,0x02, - 0xd0,0x3d,0xb4,0x1d,0x5e,0xef,0x47,0x50,0xfb,0xdc,0x32,0x14,0x26,0xf7,0x5f,0xfc,0xc9,0x1f,0x2c,0x73, - 0xfb,0x36,0xd9,0x57,0x9a,0x82,0x8c,0x9c,0xe8,0x5b,0x45,0x1b,0x8e,0xaa,0x0a,0xfa,0x0a,0x15,0x57,0x19, - 0xce,0x3d,0x03,0x2b,0x7e,0xaa,0xbc,0x70,0xd0,0x39,0x03,0x2d,0xe0,0x7a,0xfd,0xc8,0x33,0xec,0x2d,0xab, - 0x9b,0xee,0xca,0x18,0x82,0xf4,0xa3,0x4b,0x90,0x8c,0x98,0xeb,0xf4,0x19,0xc7,0x84,0x15,0x8e,0x6b,0x39, - 0x95,0x43,0xb7,0x06,0xb5,0xf3,0xe9,0x9b,0xba,0xcd,0x54,0x37,0x11,0x6a,0x91,0x7d,0x29,0x65,0x37,0x65, - 0x6b,0x13,0x76,0xec,0x22,0xd2,0xfa,0x02,0x39,0x8b,0x10,0x85,0x55,0xbb,0x98,0xe4,0x24,0x48,0xcd,0x13, - 0xf9,0xd5,0xf2,0xaf,0x4f,0x41,0x60,0xca,0x1e,0xae,0x1d,0x44,0x94,0x9c,0x12,0xc6,0x0b,0x25,0x47,0xb3, - 0x86,0x03,0xf7,0xd0,0xb8,0x76,0x83,0xa0,0xfd,0x4f,0x98,0x41,0x60,0xb8,0x28,0x59,0xd8,0x5a,0x12,0xdc, - 0x91,0x6b,0x25,0x5a,0x6f,0xe8,0x9a,0xad,0x2b,0xf4,0x8b,0x16,0x7b,0x90,0xfd,0x28,0x07,0x30,0x3a,0xf4, - 0x67,0x71,0x93,0x6f,0xc8,0x7b,0x4c,0x12,0x6d,0x63,0x0f,0x32,0x5c,0xc2,0x92,0xf3,0x3b,0xca,0xd0,0x11, - 0xd3,0xb5,0xc8,0xc1,0xf7,0x98,0x54,0x1a,0x42,0x3e,0x56,0x6e,0x08,0xdb,0x16,0xc9,0x9a,0x3d,0xb8,0x5c, - 0x4f,0x2e,0xf3,0xf8,0x39,0x6e,0xd9,0x5e,0x08,0xf6,0xf8,0x62,0xb8,0xa6,0x24,0x3a,0x00,0xe5,0x1e,0x15, - 0x3b,0x21,0xff,0x67,0xd7,0x85,0x5d,0x3d,0x56,0xdf,0x3a,0xbe,0xdc,0xc8,0x8d,0x40,0x1e,0x5a,0x06,0x0c, - 0x60,0x4c,0xc6,0x31,0x99,0x42,0x36,0x16,0xf8,0x8d,0xc8,0xfc,0x09,0x57,0xfc,0x18,0x3d,0x9a,0x49,0xd4, - 0x05,0x29,0xf9,0xbe,0xf2,0x8a,0xd5,0xcf,0xa1,0xea,0x97,0x3e,0xd0,0x0d,0x16,0xa6,0x18,0x85,0x88,0x96, - 0x90,0xed,0x1c,0x69,0x2d,0x3e,0x67,0xc7,0x05,0xa8,0x95,0x6b,0xc4,0x58,0x3b,0xf4,0x7c,0xfa,0x90,0x99, - 0x5b,0xa8,0xe7,0x19,0xee,0x20,0x84,0x44,0x6e,0x01,0x60,0x70,0x99,0x79,0x4b,0x1e,0x4a,0xfc,0x00,0x2b, - 0x48,0x7b,0x39,0xef,0x41,0x65,0x22,0x4f,0x7b,0x7e,0x60,0xbf,0x7c,0x9e,0xbf,0x65,0xd2,0x4d,0x8e,0xc6, - 0x11,0x15,0x55,0x20,0x00,0x3d,0xe0,0xfa,0x4e,0x65,0x94,0xc6,0x09,0xed,0xaa,0xd2,0x85,0xfd,0x10,0x37, - 0x2a,0xa3,0x40,0x91,0x7a,0x3d,0x20,0x64,0x08,0x29,0xbd,0xb7,0x86,0x41,0x29,0xab,0x34,0xe7,0xc8,0x9f, - 0x58,0xb3,0xad,0x96,0x08,0xc0,0x3f,0x89,0x31,0x1d,0x79,0xaa,0x2a,0xf4,0x70,0x8a,0xc3,0x80,0x31,0x2d, - 0xdf,0x9e,0xd7,0xb2,0x25,0x31,0x38,0x6e,0xc3,0xde,0x0e,0x56,0xb7,0xe8,0xc6,0xaf,0x7c,0x0b,0x72,0x6b, - 0x24,0x4a,0xf1,0x8c,0xbb,0x91,0x94,0xa8,0xc2,0x18,0x51,0x05,0xbf,0x92,0x13,0x9c,0x9c,0x09,0xed,0x61, - 0xc8,0x44,0x3f,0xc3,0xfd,0x6f,0xdc,0xcc,0xc3,0x81,0x02,0xc6,0xa0,0x3b,0xb6,0x72,0x76,0xbb,0x80,0xb2, - 0xb4,0x8d,0x32,0xf7,0x69,0xc7,0x03,0xca,0xbf,0xfa,0x2d,0x43,0xd7,0xa3,0xff,0xf2,0xee,0x9d,0xb9,0x7d, - 0x8e,0xa0,0x1a,0x9f,0x91,0x1a,0x6d,0xfa,0x51,0x6b,0xac,0x7e,0x3b,0xe5,0x40,0x70,0x2d,0x0b,0x13,0x28, - 0xea,0xa7,0xcf,0x95,0x77,0x1f,0x9d,0x29,0xa9,0x01,0x65,0x52,0x59,0x0d,0x49,0x19,0x3f,0xa0,0x24,0xb2, - 0xfa,0x6d,0xa6,0x9c,0x66,0xcd,0xae,0x0e,0x22,0xdd,0xea,0x37,0xf6,0xed,0xd0,0xed,0xa8,0x0d,0x83,0xd5, - 0x6f,0x9b,0xb5,0x79,0xc8,0xe5,0xde,0xca,0x0c,0x3d,0x2f,0x12,0xfc,0x21,0x9e,0xb8,0xfa,0x4d,0xbe,0x8e, - 0x79,0x72,0x01,0x0f,0x79,0x7e,0xe1,0xd9,0x73,0xe3,0x58,0x48,0xd4,0x5b,0xfb,0x5d,0xfd,0x06,0x5a,0xcf, - 0x7c,0x93,0xb2,0x50,0x3a,0xe7,0x18,0x15,0x78,0x78,0x42,0xba,0x29,0x19,0xe4,0x79,0x02,0x55,0x51,0x6d, - 0xea,0x57,0xb3,0x93,0x58,0x9f,0xa8,0xc8,0x2c,0x6a,0x15,0xb8,0xe0,0x1a,0x2d,0x4a,0xf4,0xe2,0x25,0xb5, - 0x8c,0x7f,0x19,0x27,0xc8,0x67,0xf1,0x1d,0x79,0x2c,0xaa,0x5b,0x5c,0xf7,0x77,0x6f,0xd4,0x1a,0xb2,0x20, - 0x02,0x4f,0xaf,0x58,0x4f,0xcd,0xae,0x9e,0x00,0x21,0x42,0x4b,0x24,0xea,0x4a,0xab,0x4b,0x81,0xcf,0xf3, - 0xc7,0xe8,0x6d,0xeb,0x9f,0x49,0x83,0x95,0xf8,0xd6,0xdd,0x79,0x0a,0xc8,0x01,0x17,0xe0,0x91,0x2b,0x4b, - 0x33,0x34,0xc8,0xcf,0xfc,0x4b,0xf2,0x5c,0xd4,0x74,0x9c,0x42,0x39,0xa4,0x2e,0x80,0xcb,0x03,0xcb,0x18, - 0xcd,0xd0,0x33,0x92,0x9d,0x2b,0xb3,0xab,0xd7,0xf1,0x13,0x1c,0x08,0x45,0x13,0x38,0x1f,0xd3,0x4b,0x42, - 0x7c,0x12,0xa5,0x99,0xd5,0xe0,0x43,0xe3,0x12,0xfd,0xce,0xee,0x8f,0x76,0x3d,0xf4,0x69,0x24,0x9a,0xaf, - 0x1a,0xc1,0xf6,0x8c,0x9c,0x00,0x71,0x6a,0xde,0x20,0xb2,0xa0,0x9c,0x14,0xa1,0x53,0xa5,0x7e,0xa0,0x90, - 0x90,0x24,0x9a,0x97,0x4f,0x9f,0x30,0x4a,0x31,0x91,0x23,0x36,0x45,0xf3,0x77,0x81,0x7a,0xac,0x27,0x9e, - 0xe6,0x08,0xa8,0xe5,0xe8,0x0c,0xc8,0x64,0xc8,0x19,0x03,0x81,0x10,0x9e,0x21,0x13,0x61,0x9a,0xc2,0xe4, - 0xd7,0xbf,0x20,0xdb,0xcf,0x3a,0x3a,0xc5,0x24,0xe4,0xb5,0x57,0x8c,0xe6,0x98,0x91,0x5c,0x3f,0x84,0xf6, - 0xbf,0x8b,0x51,0x99,0x4d,0x73,0x1b,0xf8,0x9c,0x5d,0x2c,0xb5,0x2b,0xe0,0x3a,0x7a,0x29,0x67,0x80,0x25, - 0xd0,0x3d,0x94,0x7b,0x22,0xea,0x77,0xfa,0x03,0x4c,0xaa,0xea,0x2c,0xfa,0x0b,0xac,0xa3,0x1f,0x50,0x50, - 0xc3,0x29,0x58,0xf3,0x08,0xd7,0xd1,0x23,0x7f,0xf6,0x9e,0x12,0x96,0x93,0xb6,0x60,0x77,0x55,0x1b,0x04, - 0xd4,0x21,0xe0,0xa8,0x69,0xe1,0x38,0xdb,0x9d,0x11,0x23,0xf1,0xf3,0x0b,0x9b,0xbb,0x00,0x31,0x4f,0x2d, - 0xfa,0xf7,0xfc,0xe2,0xb9,0x62,0x73,0xb9,0x5b,0x31,0xbb,0xbd,0xa5,0xda,0x0a,0x86,0xf4,0x6f,0xea,0x87, - 0xc1,0xc4,0x78,0x64,0xc2,0x77,0xcf,0xd6,0x01,0xa8,0x08,0xb8,0x2d,0x6d,0x6e,0x91,0x16,0x13,0x67,0xc1, - 0x1d,0x6c,0x5a,0x33,0xf4,0xb1,0xc9,0xa9,0x9e,0x0a,0x9b,0xca,0x89,0xd4,0x5a,0x09,0x91,0x6f,0xe8,0x17, - 0x17,0x86,0x20,0x86,0x1f,0xe3,0x5c,0x82,0xec,0x91,0xda,0x93,0x48,0xda,0x96,0x4f,0x60,0x10,0xb1,0x6f, - 0x2e,0x79,0xe9,0xf1,0x87,0xa6,0xc2,0x1f,0x43,0x3f,0xba,0x02,0x14,0xe7,0x5f,0xf1,0xee,0x71,0xab,0xd5, - 0xd6,0xef,0x4e,0x28,0xa5,0x7a,0xc7,0xec,0x29,0x76,0x04,0xfa,0x47,0xaa,0xb0,0x40,0x55,0x84,0xdd,0x3c, - 0x4c,0xb7,0x30,0xb3,0x18,0x6f,0x13,0x35,0x95,0x23,0xa1,0xd5,0xa3,0x7c,0xff,0x1c,0x06,0xfd,0x23,0xd1, - 0x0a,0x8e,0xb4,0xaa,0x35,0xe2,0x75,0xa6,0x37,0x9c,0x58,0xee,0x65,0xbd,0xb4,0xd6,0xb8,0x00,0xd0,0x42, - 0x67,0xac,0xc7,0x6c,0x91,0xc1,0x5b,0x13,0xc6,0x80,0x50,0x33,0x43,0x51,0x28,0x0d,0xf1,0x6f,0x93,0x45, - 0x42,0x52,0xf2,0xe8,0x01,0x22,0x1c,0xee,0xa1,0x91,0xe7,0x59,0x90,0x91,0x53,0x0d,0x2f,0xc8,0xa3,0x8c, - 0xc4,0x7f,0x8c,0x35,0x4e,0xf5,0x03,0xa4,0xf5,0xcb,0xcb,0x14,0x5d,0x5b,0x55,0x26,0x7c,0xa1,0xce,0xad, - 0xd8,0x24,0x8a,0x27,0x46,0x33,0x04,0x0f,0x15,0xb8,0xa8,0x1f,0x3c,0xd7,0xae,0x10,0xec,0xab,0xd0,0x10, - 0xe7,0x98,0xf9,0x9e,0xb9,0x3a,0x45,0x3b,0x0a,0xd0,0x8b,0x66,0x17,0xec,0xe6,0x8b,0x1f,0xa9,0x1d,0x02, - 0xfe,0xa5,0x45,0x34,0x4f,0x91,0x5f,0x80,0x3c,0x7a,0x69,0x54,0x6f,0x23,0x15,0x29,0x16,0x13,0xa4,0x53, - 0x40,0x26,0xf8,0x6b,0x6e,0xd1,0x29,0x2e,0xc7,0x4e,0x0c,0x44,0xf5,0x6a,0x37,0x20,0x7e,0x8d,0xaf,0xf7, - 0x0c,0xb5,0x7c,0x1a,0x2c,0x24,0xe0,0x0e,0x3c,0x6e,0x3e,0x01,0x86,0x13,0x00,0x52,0xcc,0x3f,0xfd,0x7b, - 0x22,0x5e,0xc1,0x9a,0x6d,0x80,0x00,0x91,0x83,0x85,0x38,0x3d,0xc3,0x0e,0xc9,0x7d,0xc2,0x2c,0xe9,0xbe, - 0x79,0x4a,0xf2,0x49,0x31,0xc6,0x12,0x00,0xfe,0x4c,0x82,0x32,0x2a,0xd4,0x6b,0xf1,0x23,0xfa,0xe9,0x0a, - 0x7c,0x84,0x86,0xdc,0x50,0x42,0x7b,0xfb,0xc4,0x5a,0x36,0x0b,0xb1,0x96,0x5c,0x9d,0x80,0x39,0xb8,0xda, - 0x40,0xef,0x17,0xb2,0x14,0x72,0xf9,0xf2,0xd3,0xdf,0x37,0xf3,0xac,0x14,0x71,0x09,0x28,0x08,0xc4,0xea, - 0x2c,0xc3,0xf8,0x69,0x2b,0xe2,0x12,0x5b,0x85,0x45,0x58,0xc2,0xfc,0xc3,0xe4,0x2e,0xe4,0xc4,0x54,0x68, - 0xc5,0x5c,0xa6,0x02,0x1d,0x5e,0x4d,0xb0,0x25,0x75,0x40,0x85,0x5b,0x02,0xe8,0x00,0xb3,0x8b,0xcc,0x57, - 0x1c,0x77,0x49,0xb5,0x5e,0x6d,0x04,0xa6,0xf7,0xa2,0x98,0xcb,0x9f,0x25,0xb4,0x2f,0xd1,0x37,0x98,0xe3, - 0x74,0x7f,0xde,0xac,0xc4,0x8b,0x68,0xe9,0x03,0xf5,0x4d,0xd7,0x08,0xb7,0x58,0x81,0x89,0xd5,0x7d,0xee, - 0x6f,0xd6,0x59,0x39,0x56,0xf7,0xd3,0xbf,0xa2,0x99,0x10,0x07,0x62,0x05,0xeb,0x9e,0x44,0x57,0x32,0x40, - 0xee,0x71,0xc7,0x60,0xdd,0xc8,0x09,0xd6,0xdd,0x1e,0x05,0xda,0x7c,0x5b,0x11,0x05,0xfa,0x24,0xc0,0x4d, - 0x1f,0x92,0x8d,0xb1,0x75,0xe3,0x3f,0x1d,0xa1,0x53,0x6f,0x10,0xf9,0xb4,0x46,0xfe,0x66,0x0e,0x58,0xbb, - 0x12,0x4f,0x74,0x0c,0x28,0x0e,0xfa,0xc7,0x15,0x10,0xce,0x2c,0x40,0xd3,0x2a,0x85,0x83,0x5e,0x05,0x72, - 0x49,0x90,0x60,0x07,0x36,0x3e,0x27,0x81,0x6b,0x91,0x94,0x63,0x41,0x5f,0x42,0xa5,0xf0,0xe5,0xcc,0xdf, - 0xc8,0x64,0x09,0xa4,0x13,0x17,0xa6,0x21,0x60,0x56,0xa8,0x5d,0x04,0x2d,0x98,0x22,0x11,0x05,0xb2,0xd4, - 0x7a,0x29,0x26,0x54,0x12,0x30,0x04,0x98,0xe2,0xca,0x09,0x0b,0x25,0x40,0x01,0x72,0xf5,0x48,0x46,0x9b, - 0xec,0x0a,0x10,0x03,0xc3,0x43,0xff,0xf7,0x13,0x55,0x58,0x46,0xbf,0xff,0xed,0x5f,0xa1,0x81,0xd5,0x2a, - 0x23,0x60,0xc6,0x49,0x00,0x52,0x2b,0x71,0xc0,0x48,0xe0,0xa1,0xe5,0xb7,0x26,0x46,0x54,0x3f,0x44,0x33, - 0x78,0x3e,0x24,0xec,0x9a,0x1b,0x2d,0x6a,0xea,0x2e,0xc5,0x8b,0x5a,0x6f,0xf2,0x88,0xd1,0x7f,0x92,0xd9, - 0x15,0x72,0x6d,0x5a,0xf8,0xc8,0xc4,0x8d,0x9e,0x61,0xa3,0x54,0x87,0x1d,0x38,0x7a,0xa5,0x3e,0x77,0x43, - 0x47,0xbf,0xa7,0xbe,0x5b,0x9d,0x6a,0x2a,0xbc,0xcf,0xc3,0x47,0xbf,0xd7,0xc3,0xb3,0x23,0x48,0xdf,0xca, - 0x00,0x96,0x6b,0x1e,0x87,0x08,0x71,0x76,0x1c,0x29,0x88,0xdb,0x88,0x99,0x99,0x1b,0x49,0xca,0x95,0xba, - 0x91,0xa4,0xf4,0x5b,0x0a,0x24,0xb5,0xe3,0x48,0x9f,0xc9,0x15,0xb4,0x4d,0x7b,0xc4,0x8f,0x7c,0x60,0xe3, - 0xd8,0x91,0x06,0x4d,0x2d,0x01,0x96,0xd4,0x34,0x4a,0xac,0x71,0x7e,0x57,0x9c,0xab,0x30,0xc8,0x26,0xb4, - 0x60,0x04,0x4c,0xbb,0xc3,0x49,0x0d,0x6d,0xd2,0x4d,0xe7,0x11,0xa5,0x9f,0xfe,0x1d,0x51,0x6c,0x9d,0x6c, - 0x18,0x23,0xad,0xb8,0xd2,0x27,0x7e,0xaa,0xda,0x15,0xa8,0xf2,0xcf,0x08,0x03,0xde,0xa2,0x0a,0x0e,0xeb, - 0x99,0x2e,0x24,0x26,0x14,0x80,0xb6,0xc5,0x53,0x90,0x6a,0x42,0x19,0x4c,0x32,0x5e,0xf9,0xc4,0x80,0x83, - 0x13,0x61,0xca,0xed,0x23,0x19,0x8e,0x9c,0x28,0x53,0x83,0x58,0x20,0x84,0x12,0x80,0xc1,0xbc,0x4e,0x91, - 0x4c,0x00,0xcb,0x45,0xd0,0x01,0x46,0xf5,0xe9,0xef,0x68,0xcb,0x5a,0x22,0x02,0x81,0x82,0x9d,0x5d,0x35, - 0x18,0xe6,0x41,0x94,0x20,0x53,0x04,0x8e,0x0e,0xe0,0x1f,0x13,0xac,0x70,0xfd,0x82,0xaa,0x08,0xa6,0x67, - 0x20,0x74,0x3c,0x92,0xc1,0x4a,0x44,0x9f,0xfe,0x3e,0x5d,0x62,0xde,0x01,0x81,0x8b,0x87,0x08,0x3c,0x5d, - 0xa2,0x8f,0x58,0x1a,0x48,0x05,0xc9,0xe5,0xd0,0xd3,0xa6,0xb5,0xf0,0x58,0xe1,0x9a,0xe8,0x59,0x92,0x59, - 0x61,0xa8,0xaf,0xd1,0x3e,0xf3,0xa3,0xb2,0x33,0xe0,0x5e,0x07,0x01,0xad,0x15,0x88,0xaa,0xdf,0x5d,0xc8, - 0x64,0x46,0xdd,0x5a,0x27,0x9f,0xfe,0x7d,0x9e,0x55,0xc6,0xa2,0xe2,0x09,0x90,0x40,0xdd,0x31,0x7d,0xa6, - 0x1d,0x8c,0x0a,0x30,0xbe,0xc1,0xe3,0x10,0xf2,0x48,0xd4,0x13,0x40,0x73,0x45,0x7c,0x16,0xf2,0xd3,0xdf, - 0x11,0x3e,0x32,0x27,0x18,0xf5,0x05,0x39,0x66,0xc0,0x94,0x20,0x5a,0xaf,0xe4,0x32,0x29,0xd4,0x6d,0x87, - 0xa2,0x36,0xdf,0x60,0x8f,0x60,0xed,0x55,0x71,0xb7,0xa4,0x0e,0x49,0x55,0x41,0x98,0x80,0x9b,0x1b,0x90, - 0xff,0x52,0x8d,0x9e,0x2a,0x32,0xf5,0x24,0x44,0xbd,0x13,0xad,0xea,0xaa,0x9c,0x76,0x98,0xc8,0x8b,0xa9, - 0xf8,0x54,0x5e,0x6b,0x6c,0x56,0x05,0x73,0x39,0x45,0xbf,0x15,0xdf,0xe7,0x01,0xaa,0x5c,0x55,0xf3,0x29, - 0x16,0x80,0xf1,0x33,0xb7,0x26,0x30,0x43,0x9e,0x9a,0x10,0x80,0x44,0x85,0x68,0xd5,0x27,0x00,0x3d,0xe2, - 0x31,0x46,0xab,0x5e,0x6c,0x60,0xc2,0x41,0x2b,0x3b,0x03,0x81,0xc7,0x4c,0x92,0x89,0x58,0xc5,0xd6,0x08, - 0xb9,0xec,0x9e,0xf8,0x30,0x8a,0xab,0x4d,0xfa,0xe9,0xef,0xd9,0x55,0x88,0x2b,0xad,0x47,0xd3,0x10,0x1b, - 0x14,0xc5,0x88,0x32,0x24,0x13,0x09,0x5c,0x11,0xb8,0x1c,0x4a,0x4f,0xa6,0x03,0x1c,0xc4,0x7a,0xaa,0x37, - 0x02,0x40,0x1d,0xb2,0x26,0xaa,0x32,0x9a,0xd5,0x7e,0xef,0x86,0xb4,0x9e,0x58,0x53,0x4c,0x5d,0xe4,0x95, - 0x6e,0xea,0x12,0xd4,0x1b,0x35,0x37,0x1a,0xba,0xa0,0x3f,0x86,0x0c,0x58,0xe1,0xad,0x84,0xbe,0xaa,0x53, - 0x34,0x1d,0xd6,0x44,0x9c,0x22,0xb0,0x0a,0x14,0x69,0x30,0x6e,0xdb,0x02,0xe3,0x62,0xa0,0xeb,0x93,0xc2, - 0x2c,0x21,0xc2,0x21,0x3f,0x86,0x19,0x00,0xbc,0x7a,0x2e,0xd1,0xa6,0x8e,0x06,0x18,0x06,0x6f,0x53,0x3f, - 0x16,0xe7,0x26,0x52,0xd5,0x4a,0x31,0xfe,0xd5,0x50,0x24,0x6e,0xb8,0xf9,0x22,0x8f,0x83,0x65,0xa0,0x71, - 0xa2,0x60,0xb1,0xfd,0x4f,0xff,0x00,0x25,0x2c,0xca,0x70,0x71,0x36,0x28,0x59,0xe6,0xb1,0xb0,0x0e,0x90, - 0x58,0x01,0xb1,0x2e,0xf0,0x00,0x49,0x80,0x95,0xff,0xf4,0x6f,0xaa,0x88,0xf1,0xb2,0x76,0x4b,0x19,0x54, - 0xa5,0x31,0xb9,0x61,0xb2,0x04,0xbe,0x86,0x26,0x4e,0x02,0x89,0x34,0x8a,0x47,0xe1,0x54,0xe2,0x04,0xcc, - 0xba,0xd5,0x5b,0x84,0x04,0x84,0x7a,0x5a,0x60,0xe4,0xa6,0xb4,0x3e,0x30,0x4d,0xf8,0x9e,0xa2,0x68,0xb3, - 0x42,0x14,0xed,0xa9,0xd2,0xb4,0xa1,0x7b,0xc8,0xb1,0xf2,0x30,0xda,0x27,0x40,0x08,0xad,0x26,0xd2,0xe6, - 0xf7,0xf1,0x1a,0xc5,0x00,0xdd,0x4d,0xa6,0x91,0x2c,0x29,0x7c,0x27,0x97,0x21,0x0a,0xa6,0x40,0x20,0xd8, - 0xdb,0x1c,0xe1,0x18,0xe5,0xbf,0x3c,0x92,0x56,0x75,0x2e,0x32,0xe1,0xb4,0xcf,0x5c,0xca,0x47,0x41,0xb5, - 0x74,0x6b,0x85,0xd5,0x9e,0x4c,0x26,0x89,0x64,0xea,0x47,0x91,0xb5,0x2f,0x3f,0xfd,0x23,0xe5,0x5b,0xde, - 0x16,0x79,0x24,0x7d,0xc2,0x1c,0x19,0x59,0x11,0xb6,0xb0,0xa2,0x30,0x98,0x39,0x3e,0xb3,0xb6,0xc6,0xac, - 0xf9,0x91,0xe2,0xd3,0xff,0x84,0xe0,0x64,0x18,0x13,0x87,0xdb,0x92,0x20,0x2f,0x2e,0x3e,0xfd,0x1d,0xc6, - 0x12,0xb9,0x01,0xb7,0x16,0x65,0xd4,0x82,0x82,0xf6,0x58,0x79,0x0e,0x00,0x47,0x2b,0x6a,0x87,0xdd,0x2e, - 0xe1,0xa1,0x5a,0xe8,0x3c,0xf2,0x56,0xcb,0x75,0x44,0x0e,0xe1,0x09,0xf6,0x86,0xc8,0xa1,0x0a,0xbe,0x85, - 0xc9,0x7e,0x70,0xb2,0x49,0xdd,0xf0,0xdb,0xe7,0x30,0xfb,0xc1,0x02,0x40,0x21,0xb3,0xc2,0x6f,0x7f,0x8a, - 0x13,0x18,0x07,0xf4,0x03,0xd7,0xd8,0x8e,0xbf,0x55,0xdc,0x88,0x1f,0x9b,0x18,0x5c,0x90,0xbe,0x00,0x11, - 0x13,0x6c,0x37,0x58,0x6c,0x28,0x1a,0x3e,0x07,0x58,0x2b,0x14,0xb7,0x54,0x8e,0xb8,0x5d,0x18,0x23,0x33, - 0x36,0x01,0xb9,0x26,0x16,0x57,0xa4,0xf9,0x92,0x52,0x54,0xee,0xb3,0x17,0xdf,0xa1,0x38,0x16,0xc9,0xe5, - 0x4a,0x46,0x56,0x60,0x2e,0x4c,0x5e,0xe4,0x2f,0xc9,0xaa,0x8f,0x62,0x4d,0xd4,0x40,0x0f,0x1b,0xfb,0x6b, - 0x27,0x3e,0xb7,0x09,0x83,0x43,0x36,0xbd,0xd9,0x3f,0x40,0xb7,0x79,0x42,0xf1,0xb9,0xd2,0x04,0xe8,0xbe, - 0x3c,0x79,0x9d,0x07,0xe8,0xa2,0x98,0x7b,0x45,0xf3,0xa7,0x43,0x74,0x03,0x94,0x24,0x76,0x06,0xe9,0x22, - 0xea,0x61,0xcc,0xa9,0x91,0x4e,0x52,0xf1,0x88,0x02,0x75,0x55,0x90,0xee,0x0c,0x14,0x6b,0x3c,0xaf,0xde, - 0x8a,0xd1,0x7d,0x41,0x4e,0x04,0xd0,0x56,0xba,0x06,0xc5,0x1d,0x27,0xc0,0x84,0xeb,0x9e,0x9c,0x9d,0x6d, - 0xac,0x58,0x5d,0x98,0xde,0x34,0xfb,0xf4,0xf7,0xe4,0x4c,0x96,0x83,0x75,0x55,0xac,0xee,0x4b,0xd0,0xba, - 0xe6,0x12,0xe8,0x1c,0xa1,0xa4,0x0a,0xd7,0x55,0x0c,0x5b,0xad,0xae,0x15,0xaf,0x4b,0x32,0x93,0x16,0x3d, - 0x4c,0xcc,0xee,0x26,0xd3,0x21,0xbb,0xab,0x4f,0x7f,0xff,0xf4,0x6f,0xc1,0x42,0x47,0xed,0xc2,0xec,0x5e, - 0xf8,0xe8,0xc2,0x95,0x07,0xee,0x3e,0x05,0x8c,0xc1,0x23,0x29,0x33,0x3b,0x72,0x17,0x54,0x59,0x99,0xb0, - 0xac,0xc8,0x12,0x9a,0x09,0x9a,0x5b,0xe1,0x2b,0x16,0xa2,0x48,0xeb,0xcd,0x8b,0x9c,0x62,0x35,0x44,0xb9, - 0x04,0xfa,0xa5,0x6c,0x42,0x1f,0x03,0xee,0x81,0x6e,0xbf,0x8d,0x97,0x44,0x61,0x60,0x52,0x51,0xff,0x7b, - 0x04,0xaa,0x03,0xa2,0x01,0xd3,0xf5,0xc8,0x8d,0xe5,0xb5,0x28,0x83,0x87,0x24,0x48,0xbc,0x96,0x1b,0x0e, - 0x2d,0x45,0x41,0x2e,0xfa,0xf4,0x0f,0x00,0x4f,0x5c,0x03,0xac,0x08,0x9b,0xfe,0xde,0x0e,0xe7,0x45,0x3e, - 0x79,0x96,0xb9,0x41,0xbd,0x2c,0xe4,0x23,0x15,0x64,0x1a,0x18,0x59,0xb1,0xbd,0x20,0xb7,0xc3,0xd8,0x31, - 0x48,0x37,0xa5,0xcd,0x32,0x06,0x5d,0x13,0xd8,0x6b,0x9a,0x66,0x9a,0xca,0xe3,0x0b,0x3f,0xfd,0x7d,0x96, - 0x99,0xb0,0xde,0x14,0xa5,0x44,0xb9,0x71,0x02,0x7b,0xf5,0x67,0x76,0x68,0x2f,0x8c,0x84,0x70,0x0b,0x89, - 0x29,0x0a,0xe8,0xe9,0x18,0xb9,0xd9,0x04,0x83,0x89,0x35,0x71,0xd9,0x90,0x62,0x4f,0xe3,0x42,0xc2,0xba, - 0x12,0x08,0xca,0x79,0x78,0xaf,0x16,0x04,0xf3,0x00,0x5f,0x7c,0x52,0x88,0xee,0x7d,0x0d,0x83,0x85,0xa9, - 0x3e,0x43,0xb6,0x3c,0xdf,0xf0,0x80,0x54,0x84,0x2f,0x50,0xf6,0x8c,0x38,0x5c,0x45,0x74,0xaf,0x61,0xfa, - 0xb8,0xaa,0x3f,0x6f,0x40,0x78,0x9b,0x9e,0xa5,0x52,0x31,0xff,0x3c,0xc8,0x57,0x0f,0xcc,0x9e,0x7f,0x9b, - 0xb4,0x46,0xd4,0xe5,0x82,0x74,0x85,0x4b,0x42,0xf5,0xe8,0x60,0x5f,0x03,0x49,0x4b,0x4d,0x3d,0xb7,0xc6, - 0xfb,0xaa,0x7e,0xe5,0xf1,0xbe,0x96,0x6c,0x6c,0x44,0x63,0x27,0xe0,0xf7,0x3b,0xf4,0x42,0xdc,0x1e,0xed, - 0xcb,0x7d,0x26,0xb1,0x12,0x6a,0x50,0xa4,0xa5,0x14,0xef,0xeb,0x0a,0xac,0x26,0xe2,0x57,0xc9,0x14,0x46, - 0xb6,0x9d,0x03,0xe3,0x63,0x2a,0xe9,0x23,0x7b,0x16,0x8f,0x02,0xda,0x54,0x5f,0x83,0xb0,0x87,0x7a,0x04, - 0x8b,0x41,0xe7,0x4a,0x66,0x89,0xca,0x31,0xc0,0xa9,0x78,0xc9,0x01,0xc0,0x88,0x46,0x1c,0x01,0x0c,0xc0, - 0x10,0xcd,0x71,0x08,0x91,0x20,0x0d,0x8a,0x31,0x2b,0x12,0xda,0x52,0xe4,0x47,0xd8,0x1c,0x1a,0x52,0x48, - 0xad,0x61,0x3e,0x92,0xed,0xd7,0x74,0x21,0x16,0xf8,0x75,0x31,0x16,0xb8,0x42,0x63,0xb0,0x83,0x81,0x5d, - 0xa9,0xec,0x7e,0x41,0x1c,0x2f,0x86,0x05,0x9b,0x45,0x26,0xc9,0x75,0xa9,0xbe,0xb5,0xe5,0x1f,0x37,0x3e, - 0xb8,0x50,0x3e,0x67,0xa1,0xe5,0x30,0x61,0x94,0x4d,0x8c,0x67,0xa9,0x26,0x41,0xa9,0x59,0x4d,0xa6,0x13, - 0xac,0xbd,0x21,0x95,0x81,0x59,0x04,0xbc,0xbd,0x6d,0x8a,0xd8,0xc6,0x80,0xc0,0xc1,0x92,0x00,0x86,0x0e, - 0x03,0x08,0xe7,0x30,0xba,0x25,0x86,0x78,0x3b,0x34,0x80,0xfe,0xaa,0x04,0x30,0x22,0xfa,0xf6,0x98,0x74, - 0x67,0xaa,0xd7,0x89,0xf7,0x9f,0x90,0xf4,0x15,0xd0,0x00,0x49,0x0f,0xf0,0x06,0x35,0xa2,0xd4,0x89,0x2c, - 0x76,0x71,0xee,0xca,0x46,0x61,0x27,0xcc,0xf8,0x94,0xa8,0xa1,0xb2,0x75,0x15,0x30,0x15,0x2d,0x3d,0x5a, - 0x22,0xd4,0x55,0x88,0x03,0x4d,0x52,0x94,0x36,0xee,0x44,0x1d,0xbf,0x87,0xe7,0xa9,0x74,0xe5,0xe4,0x3c, - 0xf4,0x98,0x05,0x36,0x68,0xed,0xe5,0xcb,0xa7,0xa7,0xe2,0x00,0x69,0x43,0x43,0x28,0x8b,0x69,0xc3,0x95, - 0x6d,0xeb,0x68,0xd4,0x4a,0x80,0x33,0x20,0x73,0x54,0x02,0x88,0x89,0x26,0x86,0x06,0x32,0x4c,0x40,0x15, - 0xe5,0x41,0xc8,0x27,0x21,0x6e,0x72,0x87,0xb9,0x44,0x58,0x0a,0x41,0x4e,0x33,0x32,0x2d,0x31,0x0c,0x10, - 0x2e,0x49,0xdc,0x4b,0xb3,0x22,0x91,0x59,0xe0,0xc4,0x96,0xee,0x8b,0xf7,0xa4,0xae,0xa3,0x67,0xbb,0xea, - 0x92,0x1b,0x96,0x7c,0x82,0x4c,0x96,0x84,0x43,0x58,0x05,0x36,0x37,0x4a,0x52,0xed,0x30,0x48,0x79,0xe9, - 0x20,0x06,0xc1,0x11,0x1b,0x6c,0x4d,0xfd,0x38,0x43,0x2c,0x18,0x14,0xc3,0x95,0xdd,0x76,0x65,0x54,0x8c, - 0x5b,0x46,0x28,0xb8,0xda,0x9c,0xa3,0xeb,0x10,0x17,0x41,0x22,0xcd,0x51,0xa6,0x4d,0x0c,0x75,0x2d,0x56, - 0xad,0xfd,0xaf,0xf2,0xa6,0xed,0x9a,0xf3,0x08,0x66,0x15,0xa8,0xea,0x74,0xbd,0x10,0xc6,0x0c,0x63,0x56, - 0xe2,0x70,0x83,0x62,0xe1,0x71,0xfe,0x44,0x1a,0x87,0xa1,0x92,0x80,0xa8,0x79,0x23,0xc8,0xb9,0xe1,0xcc, - 0xa7,0xfe,0x6a,0xa5,0xf2,0xd6,0x14,0x42,0x99,0x0b,0x94,0x20,0x8f,0x67,0x7e,0x85,0xac,0x10,0x8d,0x29, - 0x29,0xcf,0xde,0xf7,0x1c,0xcb,0x8c,0xa6,0x14,0xee,0x85,0x1d,0xd4,0x2c,0xad,0xa8,0x66,0x92,0xf7,0xec, - 0xa8,0xe6,0x82,0xde,0xb6,0x47,0x68,0x73,0x54,0x19,0xda,0x1c,0xed,0x08,0x6d,0xd6,0x36,0xbe,0x42,0x68, - 0x73,0xd3,0x31,0xeb,0xd9,0x01,0xce,0xf9,0x8a,0x5c,0x54,0x2c,0xb9,0x09,0x76,0xb6,0x8a,0x59,0xaa,0x88, - 0x1d,0xf0,0x6c,0x2f,0xbe,0x4d,0x9c,0x0a,0x11,0xcf,0x48,0x24,0x89,0x19,0x9f,0x44,0x24,0xb0,0x35,0x9f, - 0x04,0x3e,0x7a,0xb0,0x9c,0xe1,0xd2,0xe5,0x46,0x33,0xdc,0xbb,0xc8,0x6b,0x21,0xc3,0x72,0x11,0x24,0x1d, - 0xe1,0x0e,0xb4,0xf3,0x47,0x6a,0x33,0x15,0x15,0xe7,0x08,0x5d,0x98,0x9c,0x08,0xe8,0x8a,0x71,0xa2,0xf2, - 0x89,0x90,0xeb,0x46,0x43,0xe3,0xd5,0x06,0x0f,0x60,0x88,0xdc,0x70,0xe8,0xf7,0xc5,0xcf,0x3c,0x51,0x92, - 0xe0,0x9c,0x68,0x68,0x05,0x81,0x1c,0x0e,0x7d,0x8e,0x8a,0x82,0x89,0x87,0x0e,0x4a,0xf1,0xd0,0xcd,0x8a, - 0x78,0x68,0xa5,0xb4,0x12,0xe3,0xb1,0x99,0x4e,0x21,0x20,0x9a,0x54,0x62,0x55,0x34,0xa7,0xeb,0xfa,0x8b, - 0xaa,0xb8,0x68,0x34,0x95,0xbc,0xe0,0x13,0x62,0x22,0x80,0x79,0xf3,0x01,0xcf,0x5c,0xa6,0x8c,0x02,0x55, - 0x11,0xd2,0x51,0x31,0x42,0xfa,0xfb,0x4d,0x72,0x05,0x38,0x81,0xd1,0x42,0x32,0xcc,0x3e,0xfd,0x03,0x96, - 0x6f,0xe7,0x96,0x93,0x15,0x20,0xbd,0x91,0x42,0xd5,0xfa,0x05,0x21,0xd2,0xcf,0x03,0x72,0x0f,0x58,0x7e, - 0xfa,0x47,0xa2,0x3b,0x67,0x62,0xa4,0xb5,0xce,0x26,0x78,0x8f,0x28,0xb2,0xe3,0xa4,0x2d,0xdd,0xd9,0x9f, - 0x18,0xe5,0x28,0x8f,0x96,0xb6,0xde,0x3b,0x5f,0xab,0x88,0xe9,0x77,0x8a,0x9d,0x83,0x7c,0x8e,0x7e,0x70, - 0xba,0x06,0xe2,0x54,0xea,0x33,0x65,0x23,0x4e,0xb3,0xcd,0x6a,0x45,0x0a,0x83,0x32,0xf3,0x46,0x24,0x4f, - 0xef,0x0e,0x9a,0x66,0xcb,0x3c,0x34,0x82,0x4a,0x94,0x3f,0x91,0xc0,0x97,0x29,0x5e,0xba,0xc9,0x54,0x1c, - 0x94,0xc7,0x2c,0x5d,0x93,0x0d,0x22,0x69,0xbe,0x09,0x2a,0x6a,0xc4,0x0d,0x6a,0x61,0x04,0x65,0x3b,0x7c, - 0x3a,0x37,0x8d,0x3b,0x2b,0xaa,0x64,0x30,0x94,0xbd,0x22,0x37,0x84,0x9a,0xb7,0x4b,0x80,0xab,0x81,0xe0, - 0x05,0x63,0x3d,0x8b,0x13,0x8c,0x38,0xa3,0xed,0x1d,0x4a,0x4a,0x99,0x6b,0xcc,0x76,0x28,0xf5,0x53,0xab, - 0x09,0xa1,0x44,0xf2,0x14,0x3a,0x87,0xcb,0x1b,0x89,0x05,0xce,0x0c,0xb9,0x25,0x2f,0xe3,0xa8,0x32,0x9e, - 0xfa,0xd1,0x06,0x6d,0x06,0x30,0x74,0x20,0xf2,0x3f,0x93,0xa7,0x7e,0x84,0xae,0xd5,0x1b,0x76,0xad,0x5e, - 0xf9,0x1f,0x82,0x95,0x1f,0x8a,0x7c,0xdf,0xcd,0x0a,0xa9,0xe6,0xc9,0x5b,0x93,0xb5,0x1e,0x19,0x1f,0x87, - 0x40,0xe5,0x6a,0x87,0x89,0xaf,0x46,0xc4,0x41,0xcb,0x31,0xc9,0x65,0x05,0xfb,0x87,0x27,0x48,0x7e,0x92, - 0xca,0x14,0xaa,0xc5,0xdc,0x73,0x56,0x8d,0x90,0x8c,0x60,0x57,0xce,0xab,0xec,0x7e,0x79,0xb8,0xf5,0x2b, - 0x52,0x99,0x56,0xc2,0xb5,0xe6,0x21,0x98,0x9c,0x5d,0xc9,0x35,0xee,0x91,0xa1,0xdc,0xbf,0x21,0xe9,0xee, - 0x35,0x6f,0x45,0xa5,0x13,0x89,0xc8,0xaf,0xed,0x6a,0x76,0xf4,0xb5,0xae,0x4d,0xc5,0xcf,0x91,0x8a,0x16, - 0x95,0x83,0xb0,0x71,0x54,0xa7,0x40,0x38,0x3f,0xfd,0x3b,0x4c,0x40,0x58,0x44,0xf1,0xdc,0x1c,0xa7,0x90, - 0x5c,0x3c,0x05,0x26,0xbb,0x99,0x48,0xbd,0x40,0x8a,0x8a,0x36,0xc4,0x7b,0x0e,0xca,0x6e,0xf2,0x16,0xc3, - 0xd5,0x26,0x5f,0xe9,0xc6,0xf6,0xb1,0x57,0x05,0x6b,0x2b,0x33,0xe2,0x8b,0xa9,0xc2,0x99,0x60,0x87,0xbd, - 0xbe,0x3a,0x5a,0xbb,0x9a,0x5e,0x15,0x38,0xb6,0x19,0xd0,0x4f,0x5b,0x3a,0x56,0x88,0xdd,0xae,0xae,0xf4, - 0xdc,0x59,0xaa,0x6c,0xdf,0x4a,0x89,0x5e,0xbf,0x47,0x42,0x5d,0xa8,0x60,0xff,0xa0,0x6e,0xa3,0x75,0x23, - 0xc4,0x91,0x11,0xfa,0xfb,0x38,0xca,0x62,0xb2,0x80,0x33,0x08,0x13,0x25,0x75,0x6d,0xe1,0x7a,0x0e,0xae, - 0x36,0x3c,0x07,0x58,0x84,0x0b,0xc3,0x82,0x9d,0x17,0xc0,0xae,0x2a,0xca,0x7b,0x67,0xab,0x5a,0x9e,0x04, - 0x22,0xa7,0x01,0xaf,0xd0,0x60,0x55,0xcc,0xb7,0x46,0x2b,0x03,0xe4,0x99,0x56,0x16,0x2d,0xb0,0x8c,0x58, - 0x3d,0x54,0x48,0x16,0x2c,0x95,0x7c,0x4a,0x1b,0xfe,0xca,0x7c,0x8b,0xca,0x30,0xf9,0x13,0x94,0x42,0xc1, - 0x6d,0x88,0x02,0x22,0x81,0xe2,0x34,0xf6,0x91,0x8d,0x13,0xbc,0x83,0x18,0x71,0x38,0xf8,0xa7,0xff,0x15, - 0x39,0x9a,0x48,0x79,0x33,0x14,0x46,0x47,0xd2,0x02,0x8d,0xae,0x3c,0x7b,0x15,0xb1,0xe1,0xcd,0x9f,0x0c, - 0xc2,0xa7,0xa9,0xe9,0xbd,0x13,0x22,0xfe,0x7a,0xa3,0xf7,0x85,0x2d,0xf4,0xb1,0x31,0xcd,0x13,0xee,0x24, - 0xd3,0x04,0x53,0xb2,0x16,0xd5,0x53,0xf5,0x4d,0xe4,0x00,0x16,0x7a,0xa4,0x39,0xc6,0x68,0x1d,0x24,0x8e, - 0xe4,0xcd,0x9e,0xc9,0x45,0xa1,0x90,0x8a,0x19,0xb7,0x4a,0x00,0x00,0x20,0xfd,0x54,0xc4,0xc2,0x8e,0x1e, - 0x6f,0x5a,0xa5,0x68,0x95,0xdd,0x41,0xa8,0x0f,0xb3,0x52,0x18,0xb9,0xfd,0xdd,0xee,0xb1,0x3b,0x51,0xe5, - 0x95,0x93,0x09,0xfc,0x37,0xd9,0xcc,0x55,0xe7,0x38,0xbc,0xfc,0x7b,0x74,0x49,0x4e,0x14,0xed,0x75,0x06, - 0xcb,0xa0,0xa8,0xe6,0xd0,0xd1,0xef,0x14,0x59,0xb1,0xa2,0xcd,0x0d,0x30,0x6b,0x89,0xd0,0x09,0x37,0x3f, - 0xc9,0x81,0xda,0x8d,0x36,0xaf,0xde,0x6f,0x34,0x01,0xe7,0xb8,0xdc,0x39,0x97,0x77,0x03,0xce,0x69,0x66, - 0x38,0x9a,0x5c,0x09,0x6d,0xd6,0x06,0xa8,0x1b,0x75,0xae,0xcb,0x95,0xb7,0x21,0xf3,0xd0,0xf3,0x9f,0x62, - 0x45,0x29,0x25,0xfa,0x99,0x30,0xef,0x2a,0x06,0x9f,0x9f,0x5b,0x65,0x72,0x89,0xcf,0x0a,0x3d,0x57,0xbb, - 0xa3,0x7e,0x94,0x4a,0x66,0x93,0x79,0xf4,0x79,0xbe,0x91,0xc9,0x55,0x15,0xc8,0x85,0x1d,0x89,0x6e,0x63, - 0x9c,0x66,0xde,0x4a,0xdb,0xcf,0x27,0xde,0x0d,0x46,0x37,0xf4,0x95,0xe5,0x24,0x6b,0x52,0x2d,0xcc,0xc0, - 0xfd,0xb6,0x9f,0x37,0xa0,0xa7,0xa0,0xc8,0x0d,0x34,0x8b,0x3b,0x8b,0x16,0x0b,0x36,0x95,0x58,0x84,0x17, - 0x99,0xa4,0xda,0xd0,0x64,0x93,0x6a,0xce,0x70,0xed,0xd0,0x74,0xab,0x21,0xd5,0x4f,0x69,0x50,0x4d,0x75, - 0xa8,0x28,0x8e,0xb8,0x21,0xea,0xf6,0xf6,0xdf,0x39,0x6e,0xda,0x28,0xa9,0x41,0x05,0xaa,0xbf,0xc2,0xea, - 0xa8,0x1a,0xbd,0x29,0x5a,0x0e,0x57,0x2f,0xf0,0x7b,0xb2,0xc9,0xd3,0x27,0x57,0x1b,0x62,0xf9,0x3c,0x63, - 0xda,0x58,0xa9,0x5c,0x1e,0x64,0x6a,0x9b,0x58,0x2b,0xb6,0x96,0xc5,0x19,0x88,0xd7,0x91,0x5a,0x5f,0x2b, - 0x84,0xfd,0x27,0xd5,0x49,0x63,0x92,0x43,0x75,0x82,0xe5,0x2c,0x72,0x50,0xb0,0xea,0x2b,0x07,0xb3,0x37, - 0x5f,0x57,0x04,0xb3,0x5f,0x81,0xbc,0xe9,0x89,0x53,0x14,0x3c,0x22,0xf6,0xbb,0x29,0x05,0xb4,0xbf,0x27, - 0x2d,0x50,0x7b,0x7b,0x6d,0xe8,0xf8,0xad,0xb3,0xe4,0xd3,0xdf,0xe7,0x19,0x6e,0x44,0xf1,0xbc,0x36,0x84, - 0xcc,0x2e,0x7c,0xf4,0xad,0xb1,0xab,0xfa,0xfd,0x6f,0xff,0x8a,0xa9,0xa4,0x90,0x20,0xff,0xec,0xa3,0x26, - 0x29,0x52,0x0c,0x61,0xd6,0x02,0x18,0x0a,0x23,0x99,0x1b,0xdd,0xae,0x82,0x95,0x9d,0x4d,0xf6,0x52,0x88, - 0x3b,0x43,0x63,0x31,0xc6,0xdd,0xf1,0x0d,0xc8,0xb1,0xac,0x18,0xe2,0xce,0x1b,0xf5,0x5c,0x11,0x8b,0x03, - 0x91,0xfa,0x26,0x6f,0x56,0xcb,0x02,0x76,0xb0,0xfb,0x4f,0x15,0x28,0xa3,0xa2,0xde,0xd5,0x04,0x71,0x9d, - 0x6c,0x0c,0x44,0xc8,0x51,0xce,0x4a,0x44,0xc8,0x88,0xe3,0xd1,0x0e,0x28,0x72,0x59,0xda,0xc1,0x93,0x4e, - 0xf0,0x7b,0xbe,0x7f,0x9f,0xe9,0x9a,0xb4,0x6d,0xd9,0xc4,0xbf,0xf3,0xd6,0x76,0xc1,0xae,0x66,0x85,0xc1, - 0x3f,0x83,0x2e,0xfe,0x3d,0x33,0x38,0xe7,0xc6,0xc1,0x13,0x50,0x16,0x6c,0x2d,0xc5,0x60,0xf8,0x40,0xd1, - 0x3f,0xbd,0xb5,0xc8,0xdf,0xd8,0xde,0x79,0x6e,0x50,0x7c,0x0e,0x19,0xe2,0x51,0x10,0x82,0x40,0x14,0x1b, - 0x20,0x7c,0x6c,0xa2,0xe2,0x9f,0xbd,0xf8,0xae,0x79,0xa2,0xc3,0xbe,0xab,0x3d,0x1d,0x74,0x68,0xbc,0xb6, - 0x06,0xf8,0xc6,0xec,0xa3,0xfc,0xf3,0x48,0xf3,0x9b,0x90,0x9f,0xa1,0x1b,0x20,0x8f,0x6f,0xed,0x10,0x79, - 0x05,0x40,0x8a,0xb6,0x04,0x1a,0x9f,0x4d,0x80,0xfc,0xd3,0x28,0x9b,0xe1,0x81,0x90,0xd8,0x3f,0x0e,0x90, - 0x6f,0x9a,0x4f,0xac,0xe0,0xf8,0x8d,0x0a,0x8e,0x97,0xe4,0x47,0xe3,0x47,0x7a,0x0f,0xee,0x49,0x55,0x78, - 0x3c,0xe1,0xd6,0x33,0x3c,0x5f,0x11,0xca,0x5a,0xfc,0x47,0x47,0xc8,0x33,0x25,0x55,0x6b,0x5f,0x8a,0x90, - 0x7f,0x96,0x03,0x85,0x22,0x36,0xb9,0xf5,0xce,0x4c,0x9b,0xa3,0x7e,0x11,0xfd,0x60,0x8f,0x38,0x28,0x54, - 0x8e,0x9a,0x3f,0x71,0x58,0x16,0x39,0x5a,0x3e,0x77,0xd7,0xb0,0xa4,0x20,0xf2,0x1c,0xb8,0xbc,0x8e,0xc1, - 0xfe,0x85,0x51,0x42,0x4a,0xd0,0xcf,0xc1,0xf4,0x27,0xc6,0x73,0xcd,0x44,0xd1,0x3f,0x31,0x43,0x41,0x7e, - 0xf0,0x57,0xb2,0x9c,0x04,0x55,0xf5,0x64,0x76,0x28,0x3d,0x7d,0x90,0xf3,0x2e,0x15,0x4d,0x7f,0x3b,0x37, - 0x42,0x1b,0xa8,0x15,0x51,0xbf,0x4b,0xca,0x9d,0x59,0x95,0x55,0x0b,0xcd,0x76,0x7c,0xfd,0x7f,0x84,0x70, - 0x9b,0x87,0xdd,0xff,0xbc,0x29,0xc6,0xdc,0x9f,0x5a,0x9b,0xe2,0x56,0xe0,0x7d,0x95,0x6c,0x53,0x88,0xbc, - 0x57,0x93,0x44,0x38,0x58,0x50,0x02,0x43,0xea,0x70,0x59,0xb5,0x09,0x22,0xe3,0x80,0x47,0x58,0x57,0x0e, - 0xc7,0x47,0xa6,0x4e,0x35,0xce,0xfc,0x64,0x2e,0x96,0x9f,0xfe,0xc1,0x7e,0x66,0x29,0x87,0xe1,0x8b,0x45, - 0x12,0x7f,0xfa,0x37,0x92,0xb6,0x4b,0x11,0xf9,0xd4,0x9d,0x84,0x18,0x83,0xa5,0x70,0xaf,0x3e,0xfd,0x63, - 0x81,0xf3,0xec,0x09,0x97,0xa1,0x28,0xc9,0x98,0xd8,0xc8,0x1e,0xa1,0xf9,0x13,0x4d,0x61,0x68,0x15,0xb9, - 0x0e,0xe6,0x80,0xb4,0xad,0x6b,0xd9,0x12,0xbe,0x80,0x23,0x39,0x41,0xfa,0x86,0xe9,0x1a,0x3a,0x47,0x0e, - 0xc4,0xf9,0x84,0xe8,0x90,0xfd,0x37,0x18,0xb2,0x1f,0x55,0x86,0xec,0xc3,0x6a,0x9f,0xa3,0xd9,0xc8,0xac, - 0x00,0x86,0xec,0x27,0x99,0x9e,0x84,0x57,0x1c,0xb7,0xbf,0xcb,0xce,0xe0,0x04,0xf0,0xef,0x27,0xa3,0x95, - 0x62,0xf8,0xbf,0x0c,0x37,0x9c,0x88,0x7e,0x6d,0x7c,0xce,0x23,0xfa,0x79,0x87,0xc9,0x58,0x16,0xad,0xa8, - 0xfe,0xd3,0x2c,0x59,0xe4,0x51,0xfd,0x74,0x77,0x9a,0x9b,0x18,0xcc,0xb3,0x7b,0x00,0xbb,0x14,0xda,0xaf, - 0x9d,0x5c,0x4d,0x7c,0xff,0x86,0x78,0xe8,0x4f,0x71,0x12,0x72,0x7a,0x17,0x27,0xba,0x5f,0x95,0x76,0x43, - 0xfc,0xf3,0x2a,0x54,0x9c,0x3f,0x8a,0xbe,0xe4,0x21,0xea,0x56,0x55,0x0e,0xf2,0xdf,0xcf,0x1a,0x05,0x4b, - 0x6e,0xac,0x51,0x3a,0xce,0xff,0xc7,0x15,0x7c,0x24,0x95,0xfb,0xb8,0x8e,0xf5,0xa7,0x87,0x7e,0x14,0x65, - 0x85,0x68,0xff,0xdc,0xa5,0xde,0xcc,0xa4,0x15,0xf1,0x0f,0x4a,0x8d,0x0c,0xc2,0xcc,0x0e,0xf9,0x37,0x1f, - 0xbc,0x67,0x3f,0x29,0x1d,0xf5,0x4f,0xb7,0xec,0x24,0xa1,0x3d,0x69,0x11,0x3c,0xed,0x80,0xff,0xf2,0x62, - 0x0a,0xda,0xc3,0x66,0x3c,0x32,0x0e,0x06,0x17,0x72,0xe1,0x64,0x00,0xc0,0x7d,0x1f,0xe5,0x10,0x56,0xb2, - 0xea,0x91,0xb2,0x40,0x24,0x51,0x81,0x5d,0x31,0x11,0xc0,0x76,0x6f,0xa7,0x3c,0x27,0x80,0x65,0xcd,0x46, - 0x32,0x11,0x4a,0x99,0x98,0x9c,0x00,0xda,0xf1,0xdf,0x4a,0x09,0x60,0xa9,0xc8,0xca,0x4d,0x76,0x96,0xbb, - 0xf1,0xaa,0x6d,0xc9,0x88,0x1d,0xea,0xf3,0xcc,0x00,0xae,0x93,0x97,0x93,0x1f,0x40,0xcd,0x16,0x11,0x00, - 0xf2,0x60,0xd1,0xce,0xb9,0x76,0x86,0x00,0xcb,0x98,0x5b,0xc8,0x12,0xb0,0xf5,0xf3,0x52,0x9e,0x00,0x76, - 0x1a,0x57,0x23,0x35,0x9b,0x4e,0x76,0x92,0x80,0x0a,0xf7,0x2e,0x37,0x4f,0x00,0xc5,0x50,0x21,0x25,0x46, - 0x1e,0xbd,0x59,0x15,0xfa,0xca,0x3e,0xaf,0x3f,0x87,0x4e,0xa2,0x80,0xd7,0xb9,0x9a,0xe8,0xe4,0x0a,0xd0, - 0xee,0x48,0x73,0x72,0x99,0x73,0x93,0x05,0x7c,0xe7,0x27,0x13,0x8c,0x3a,0xc5,0xc9,0x54,0xd6,0xfd,0xa7, - 0x00,0x37,0x67,0x08,0x61,0xef,0x28,0x5d,0xc0,0x93,0xc0,0x5f,0x24,0x3e,0xa0,0x29,0x61,0x04,0x8e,0xeb, - 0x3b,0x0c,0x67,0x43,0xaf,0xad,0x2c,0x4b,0x27,0x7e,0xc8,0x7e,0x16,0xc5,0xbc,0x01,0xf9,0xa6,0x47,0x45, - 0xe2,0x00,0x6b,0xf4,0x19,0x6d,0xbf,0xd9,0xc9,0x03,0x36,0x52,0xbc,0xd9,0x9e,0x3d,0xc0,0xb1,0x88,0x98, - 0x1c,0x02,0xa8,0xb8,0xe7,0x78,0xfc,0x40,0xa1,0xb1,0x9b,0x46,0xe0,0x29,0x6e,0x63,0x20,0xb3,0xb7,0xf3, - 0x08,0xa0,0xe4,0x22,0x9d,0x3c,0x02,0x06,0xed,0x58,0x66,0x8f,0x44,0xbe,0x31,0x97,0xe7,0x11,0xb0,0x8c, - 0x07,0x4e,0x2a,0x01,0xed,0xae,0x9f,0x27,0x13,0x30,0xad,0xca,0x8a,0x3d,0x38,0x27,0xa7,0x40,0x55,0xc9, - 0x7c,0x17,0x2b,0x4f,0x2f,0x70,0xba,0x33,0xbd,0x00,0x25,0x00,0x70,0x24,0x78,0x2b,0xcd,0x00,0xbd,0xb4, - 0x2c,0x46,0x26,0xd3,0xc0,0x2b,0xb4,0xd4,0xe2,0xd6,0x72,0x7b,0x20,0xa8,0x7e,0xc1,0x8e,0xea,0x34,0x11, - 0x7a,0xea,0x23,0x25,0xc0,0x15,0xf3,0x0d,0x34,0x11,0x88,0xa4,0x9b,0x6e,0x60,0x82,0xdb,0x60,0x26,0xdf, - 0xc0,0xb3,0x10,0x97,0x4c,0x39,0x85,0x21,0x71,0x42,0x62,0xa7,0x3a,0x40,0x92,0x57,0x61,0x1f,0x42,0xc1, - 0x06,0x3b,0x3d,0xf1,0x4e,0x60,0x45,0x27,0xec,0xd4,0x03,0xba,0x32,0x95,0x7c,0x00,0xe1,0xc1,0xec,0x10, - 0x35,0xdd,0x74,0x03,0x29,0x89,0xa7,0x7f,0x95,0x33,0xf6,0x57,0x05,0x99,0x6e,0x92,0x66,0x6e,0xf6,0x01, - 0x6d,0x3c,0xb1,0x37,0x40,0x9c,0x24,0x04,0xd6,0x5a,0xc1,0x72,0x2a,0xc5,0xcc,0xcd,0x43,0xb0,0x8d,0x1e, - 0x1a,0xe5,0x22,0xd1,0x63,0x2a,0x26,0x25,0x98,0x59,0xd2,0xd4,0x42,0xe2,0xee,0x17,0x2f,0x44,0xc2,0x11, - 0x05,0xd4,0xac,0x01,0x4b,0x18,0x9d,0x71,0x74,0x55,0x7d,0xa1,0x58,0x80,0x42,0x76,0x02,0xaa,0x4c,0xb9, - 0xbe,0x99,0x30,0x04,0x9e,0x59,0x5b,0xd3,0x50,0x2b,0x4e,0x36,0x3a,0xb5,0xf1,0x84,0x76,0x34,0x16,0x68, - 0xb5,0xc0,0x66,0x72,0x14,0x28,0x7f,0xee,0x97,0x94,0xa3,0xc0,0xf6,0x03,0xe7,0xd9,0x3d,0x95,0x67,0xb8, - 0x2b,0x93,0x27,0x2a,0x78,0x29,0x19,0x3b,0x38,0x53,0x81,0x32,0x04,0x46,0x79,0xb6,0x02,0x7e,0x92,0x55, - 0xa4,0x2b,0x38,0x2d,0xa6,0x2b,0x78,0x26,0xd9,0x0d,0x23,0xb3,0x12,0x16,0x9c,0xe2,0x3e,0x5d,0x66,0xf2, - 0x15,0xd8,0xbb,0x80,0x11,0x79,0x2b,0x2e,0x32,0x27,0x69,0x81,0xc1,0x74,0xa5,0x85,0x3a,0xa9,0x0b,0x6c, - 0x2f,0x58,0x3b,0x75,0xc1,0x7b,0x98,0x98,0x25,0xfa,0xe8,0x20,0xff,0x55,0xe1,0xb2,0x21,0xfb,0x4d,0x66, - 0x85,0xf4,0x05,0x56,0xec,0x55,0x9e,0xbe,0xe0,0x3d,0x3b,0x2e,0xe6,0x61,0x46,0xcc,0xc7,0x40,0x3a,0x94, - 0x21,0x0a,0x81,0x14,0x95,0x35,0x03,0x2a,0x16,0x10,0xa3,0x19,0x0b,0x90,0xbe,0xe8,0xa1,0x93,0xc2,0xe0, - 0x47,0x40,0xd7,0xfb,0xd8,0xef,0xcd,0xaa,0x2a,0x83,0x01,0x2e,0x29,0x21,0x25,0xc7,0xb0,0x80,0xe0,0x92, - 0x35,0xe9,0x21,0x7d,0x91,0x36,0x4f,0x74,0xfa,0x80,0x5d,0xf9,0x0b,0x24,0x31,0x00,0xe0,0x40,0xda,0x0e, - 0x5b,0xca,0x60,0x80,0xce,0xa6,0xcd,0x1f,0xb6,0x24,0x30,0xc0,0x97,0x92,0x58,0x89,0x72,0x2a,0xf3,0x69, - 0x5f,0x3f,0x1f,0x4a,0x21,0x75,0x81,0x9a,0xff,0x3c,0x77,0x01,0xe0,0xd8,0x92,0x1c,0xad,0x8b,0xc3,0xe1, - 0x22,0xcd,0x93,0x62,0xfa,0x02,0x45,0x86,0xac,0xec,0x05,0x7a,0xb2,0xd5,0x3a,0xa9,0x3a,0x98,0xba,0xa2, - 0x14,0xed,0x89,0x67,0x18,0x41,0xcd,0xae,0x70,0xe4,0xdc,0xa3,0xe3,0xce,0xde,0x94,0x12,0x17,0x90,0xc7, - 0x87,0x93,0xb8,0x80,0x1c,0x94,0xf2,0x4d,0x43,0xcf,0xc1,0x72,0x99,0xcc,0xc9,0x43,0xc3,0x68,0x2c,0x4a, - 0xe8,0x72,0xf3,0x18,0x54,0xa7,0x31,0xc0,0xf1,0xbe,0xa4,0x34,0x06,0x8a,0x14,0xc0,0xbb,0x18,0xa6,0x70, - 0x1e,0xa2,0xb7,0xf5,0x1e,0x69,0x0c,0xac,0x9d,0x0d,0x27,0x8d,0x41,0xfe,0xd8,0x49,0x63,0xa0,0xdd,0x7c, - 0x13,0x76,0xc4,0xa2,0x49,0xae,0xae,0x88,0x04,0x21,0xf2,0x18,0x37,0x89,0x0c,0xb4,0xf5,0x6d,0xa2,0x1d, - 0x3f,0x55,0x2a,0x03,0xad,0x7a,0x58,0x89,0x0c,0x7e,0xb2,0x4b,0xa9,0x44,0x06,0x48,0x5a,0x12,0xad,0x24, - 0x15,0x13,0x1a,0xd0,0x76,0x08,0xcf,0x7c,0x21,0xa5,0x81,0x52,0x76,0x8d,0xb7,0xa9,0x95,0xd7,0xe0,0x64, - 0x82,0x4a,0xf0,0x92,0x8e,0x4f,0xd5,0x99,0x0d,0xbe,0x03,0xda,0x8e,0xd8,0xf5,0xf3,0x66,0x01,0xb4,0x20, - 0x9d,0x71,0xe4,0x56,0x55,0x8a,0x03,0xfa,0x12,0x84,0x4d,0x37,0xc7,0x81,0x8a,0xa6,0x8b,0xd0,0xe3,0x35, - 0xb3,0xb2,0x1c,0x80,0xd8,0x0e,0x80,0x1b,0xd9,0x99,0x0e,0x7e,0xd6,0x24,0x23,0xcf,0x74,0xd0,0x3c,0xe5, - 0x4c,0x07,0xe4,0xe7,0x0a,0xaf,0x4b,0x99,0x0e,0x5e,0xb1,0x7e,0x5a,0x4c,0x74,0x40,0x06,0x74,0x55,0x9e, - 0x91,0x88,0x3d,0xdd,0x1b,0x0c,0xa6,0xda,0x05,0x3a,0xc9,0xf7,0x74,0x28,0xe2,0x8c,0x24,0x06,0x14,0xb0, - 0xed,0x04,0x08,0xa7,0xa8,0x69,0x25,0x28,0x06,0xea,0x30,0xda,0x3c,0xf5,0xc1,0x7b,0x0a,0x24,0x64,0x8f, - 0x75,0x93,0xf7,0x80,0x49,0x23,0x36,0x0f,0x14,0xc3,0xf8,0xa7,0x99,0xcc,0x07,0xda,0xef,0xff,0x47,0xe7, - 0xa5,0x09,0x8a,0x79,0xe2,0x76,0x4c,0xb9,0x6f,0x9b,0x61,0x36,0xac,0x78,0x20,0xb5,0x98,0x67,0x38,0x8f, - 0xb7,0x24,0x42,0x20,0x7c,0xa6,0x4a,0x5e,0x3e,0x7d,0xd2,0x7c,0xa3,0x32,0x21,0x6c,0xe6,0xcc,0x14,0xb5, - 0x36,0x3d,0x4b,0x7c,0xa4,0xc6,0x44,0x3f,0x29,0x37,0x39,0xe1,0xf5,0xa7,0x7f,0x23,0x66,0x96,0x08,0x50, - 0x10,0xfc,0x55,0x36,0x49,0xc8,0xb5,0x88,0x5c,0xb7,0x45,0x1a,0xcf,0xf9,0x20,0x4b,0x37,0x0f,0x42,0xf3, - 0x19,0x68,0x51,0xf0,0x9d,0x95,0x0a,0xe1,0x29,0xd1,0x0d,0x0e,0x1b,0xd2,0xfb,0x55,0xec,0xb6,0x8e,0xde, - 0xf9,0x6c,0x6b,0xdd,0x99,0x11,0x41,0x75,0xfa,0xaf,0xd2,0x64,0x44,0x40,0x18,0x7f,0x53,0xce,0x88,0x80, - 0x8b,0xef,0x74,0x95,0x22,0x99,0xaf,0x2e,0x02,0x72,0x3e,0x44,0x7d,0x74,0xc3,0x09,0x11,0x44,0x18,0xa8, - 0x70,0x6c,0x95,0x17,0x21,0x67,0x5d,0xc0,0x23,0x1c,0xe2,0x4a,0x51,0xf0,0xcf,0xe0,0xee,0x4a,0x91,0x52, - 0x62,0xae,0x56,0x79,0xda,0x85,0x66,0xf2,0xfa,0x3d,0x65,0x47,0x08,0x88,0x9e,0xed,0x4c,0x8f,0x40,0x7c, - 0x0b,0x84,0x19,0x4c,0x8d,0x0d,0xea,0xd9,0xca,0x27,0xfb,0xd8,0x7b,0x9a,0xd8,0xa8,0xac,0x75,0x5a,0x39, - 0x12,0x8c,0x52,0x9e,0x67,0x47,0xf8,0xf4,0xef,0x21,0x0b,0x26,0x6a,0x56,0xd5,0xb6,0x09,0x3a,0x69,0x86, - 0x72,0xa1,0xdc,0x1a,0xc9,0xf6,0x81,0x3e,0x65,0xc8,0x1c,0x28,0x4a,0x22,0xfd,0x9c,0x44,0x09,0xcd,0x4e, - 0xf3,0xd5,0xd6,0x44,0x09,0xaa,0x6f,0x8c,0x52,0x19,0x3b,0x47,0x37,0x75,0xa7,0x68,0xe7,0xaf,0xec,0x23, - 0x63,0xd2,0x25,0x4c,0xb0,0xb3,0x99,0x93,0x2e,0xc1,0x16,0x07,0x13,0x52,0xe9,0xf3,0xa4,0x09,0xef,0xe5, - 0xf4,0x2c,0x73,0xb1,0x41,0x6f,0xcb,0xbf,0x0b,0xe4,0x9c,0xbc,0x7b,0xf1,0xec,0x06,0xed,0x1d,0x8b,0x56, - 0x13,0x0e,0xf8,0x24,0x9f,0xc8,0x08,0x84,0x5d,0xe5,0xb7,0xad,0x4c,0x95,0xfe,0xbc,0x89,0xd4,0x27,0xb1, - 0xb2,0x28,0xbc,0xf3,0x59,0xcf,0x32,0x49,0x14,0x7e,0xd2,0xe6,0x78,0x9a,0xde,0x35,0xa6,0x54,0x60,0xc8, - 0xe2,0x92,0xb7,0xa4,0x52,0xc8,0xdd,0x97,0x1a,0xec,0xb1,0xc4,0xe1,0x25,0x34,0x23,0xf0,0xae,0xf9,0xbc, - 0x3a,0x97,0x82,0x36,0x7d,0x94,0x32,0x29,0xe8,0x00,0x66,0xcb,0x24,0x6d,0xa7,0x52,0x38,0xc5,0xe3,0xb2, - 0x03,0xca,0x30,0x98,0xe7,0x53,0x50,0x98,0x4d,0xe6,0x44,0xaf,0x76,0x73,0x73,0x84,0x87,0xa3,0x03,0xb3, - 0x78,0x76,0x4c,0xdb,0xb9,0xca,0x71,0xc6,0xf3,0x69,0xd5,0x5f,0x02,0xdd,0xff,0xf8,0xf1,0x40,0x85,0xe5, - 0xc7,0x89,0x87,0xc1,0xfd,0x1b,0x78,0x7f,0xff,0x7e,0xf9,0x99,0x97,0xc5,0x2f,0x31,0x42,0xea,0xb1,0x9f, - 0xca,0x83,0xba,0x47,0x70,0x9b,0xbe,0x0f,0xb2,0xe5,0x41,0x6d,0x26,0x6b,0xf5,0x6f,0xf1,0x2f,0x20,0x6e, - 0x54,0xcb,0x0f,0x8c,0x97,0xc7,0x0f,0xf1,0x34,0xef,0x5f,0xb0,0xfd,0x5f,0xef,0xdf,0xcf,0xaf,0x7f,0x91, - 0xbf,0x7e,0xfc,0x88,0xb7,0x9e,0x8c,0xe8,0x5a,0x36,0x32,0x2a,0x7e,0xad,0x3f,0x3d,0xcd,0x30,0x85,0xc0, - 0x81,0x84,0x86,0x00,0xf8,0xb2,0x83,0xda,0x47,0xa8,0x97,0x8f,0x68,0xc7,0x86,0x8e,0x8f,0x8f,0xb1,0xa2, - 0xfb,0xf7,0xb3,0x5f,0xda,0xbf,0x7e,0x8b,0x7f,0xc6,0xd9,0x2f,0xad,0x5f,0x6f,0x1a,0xdf,0x1d,0x1f,0x40, - 0x5d,0x78,0x3c,0x7c,0x23,0xa8,0x1f,0x3f,0xfc,0x61,0x82,0xac,0xcc,0xf3,0x53,0xb4,0x23,0x1f,0x5c,0x2f, - 0xc6,0xb2,0x71,0x31,0xce,0x1a,0xe1,0x38,0x6a,0x2c,0xc7,0xfe,0x0d,0x94,0x69,0x3c,0x7f,0xfe,0xf4,0xe5, - 0x9b,0x63,0xd0,0x98,0xf0,0x54,0xe4,0x63,0x3a,0xe5,0x05,0xd3,0x70,0x2c,0xac,0x7c,0x55,0x2a,0xad,0xd3, - 0xc7,0x53,0x0c,0xd9,0x49,0xae,0xa0,0xd4,0xc2,0x92,0x06,0xe7,0x28,0x41,0xe5,0x3b,0xa7,0xb0,0x44,0x3f, - 0xfc,0xf4,0xf4,0xed,0xcb,0x93,0x7f,0x39,0x3d,0xfe,0xa5,0x96,0xf8,0xc8,0xbe,0x6b,0x29,0x9d,0x64,0x57, - 0x9b,0x25,0xc1,0xd5,0x15,0xfa,0xcc,0x52,0xa6,0x10,0x10,0x53,0x6b,0xd9,0x72,0xc3,0xa7,0xd8,0xd5,0xe6, - 0x09,0x66,0x07,0xfa,0xb5,0xf1,0xfa,0xc7,0x97,0x2f,0x4f,0x1e,0xbd,0x7c,0x7a,0x7c,0x8d,0x81,0x53,0x4a, - 0x8c,0xbb,0xd7,0xa2,0xff,0x61,0xda,0x84,0xac,0xf4,0x6c,0xa9,0x8e,0x14,0x2c,0x3e,0xcf,0xf2,0xc3,0x07, - 0x8b,0xaf,0x54,0x50,0x54,0xf1,0x31,0x0e,0x34,0x79,0x1c,0x27,0x89,0x76,0xde,0xb9,0xf7,0x1d,0xfd,0x4f, - 0xbd,0x79,0x47,0x0e,0xad,0xfa,0x19,0x4c,0xf6,0x8b,0xa7,0x2f,0x9f,0x9c,0x1e,0x5f,0x5b,0x91,0x72,0xdf, - 0x1d,0xd4,0xf8,0x0e,0xc7,0x18,0x06,0x3c,0xb4,0x3c,0x29,0xcd,0x47,0x5b,0x85,0xa8,0xbd,0x58,0x44,0x94, - 0x2f,0xe5,0x62,0x89,0x67,0x84,0xa1,0x82,0x23,0xac,0xe4,0x34,0x94,0x22,0xce,0xfb,0xf8,0xc3,0x12,0xcd, - 0x7d,0x40,0x39,0x91,0xd0,0xa1,0x0a,0x60,0x05,0xfc,0xe0,0xde,0x84,0xa9,0x10,0x26,0xfe,0x7a,0x15,0x44, - 0xe3,0x56,0x63,0xe5,0x7f,0x18,0x77,0xfa,0xfd,0x9b,0x3a,0x29,0x4d,0x8f,0xaa,0x7b,0x97,0xc5,0x8b,0x05, - 0x2d,0xc5,0x89,0xdb,0xee,0xc7,0x13,0xab,0x7e,0xe1,0xf4,0x57,0xe7,0xfc,0xa1,0x23,0x51,0x57,0x93,0x00, - 0xad,0xd5,0x2a,0x09,0x12,0xf1,0x07,0xef,0x23,0x94,0x58,0xb0,0xd3,0xda,0x8f,0x2b,0x60,0xc0,0xe8,0xf8, - 0x41,0x5b,0x3c,0xea,0x7d,0xad,0xae,0xa2,0x0c,0x2b,0x3b,0xa2,0xb7,0x4a,0xe3,0xe8,0xa3,0xda,0x4f,0x12, - 0x78,0x90,0x20,0xe5,0xe7,0x4c,0xed,0x8c,0x63,0x78,0x6a,0x0d,0xa6,0xc8,0x41,0xb5,0x66,0xba,0x21,0x6f, - 0x6b,0x41,0xf5,0x12,0x88,0x72,0x68,0xbd,0x25,0xe2,0x03,0x51,0x6a,0x88,0x18,0xa7,0x91,0x68,0x61,0x86, - 0xb9,0x67,0xae,0x36,0x82,0xa4,0x34,0x84,0xd7,0x3a,0x9a,0xf4,0x9e,0xa8,0xc0,0xad,0x57,0x34,0x4b,0x7c, - 0xca,0x76,0x2d,0xa2,0x34,0xbe,0xd8,0x05,0xcc,0xf5,0xb6,0xe6,0xd3,0xc9,0x3f,0xa2,0xfc,0x83,0x29,0x32, - 0x39,0x02,0x8e,0x32,0x31,0xd1,0x49,0xec,0x79,0x3a,0x43,0x3c,0x3d,0xc7,0xfb,0x88,0x92,0x49,0x48,0x09, - 0x00,0x8d,0x61,0x81,0x7d,0x44,0xf5,0x4a,0xb5,0x65,0x97,0xd6,0xaa,0x3b,0x90,0xfd,0x06,0x10,0xd8,0xf5, - 0xf8,0xff,0x27,0xee,0x7d,0x97,0xdb,0x48,0xb2,0x7c,0xb1,0x57,0x81,0xaa,0x67,0xb8,0x55,0x62,0x01,0x04, - 0x40,0x4a,0x23,0x81,0x02,0x79,0x49,0x91,0x92,0xd8,0x22,0x25,0x2e,0x49,0x75,0x4f,0x0f,0xc5,0xe6,0x2d, - 0x02,0x45,0xa0,0x86,0x85,0x2a,0x74,0x55,0x81,0x14,0x45,0xf0,0xc6,0x7e,0xba,0x1f,0xed,0x88,0x6b,0x87, - 0x1d,0x76,0xac,0x7d,0xfd,0x61,0x1e,0x60,0x3f,0xd9,0x0e,0x87,0xc3,0x8e,0xd8,0x79,0x93,0x79,0x02,0x3f, - 0x82,0xcf,0xef,0x9c,0xcc,0xac,0x2c,0x00,0xa4,0xba,0x77,0xf7,0xda,0xfd,0x87,0xa8,0xca,0xcc,0xca,0x3c, - 0x99,0x79,0xf2,0xe4,0x39,0x99,0xe7,0xcf,0xb3,0x66,0xd3,0xc7,0x85,0x64,0xc7,0x19,0xe5,0x8e,0x9a,0xbf, - 0x93,0x2c,0x48,0xf2,0x88,0xf1,0xb1,0x84,0xac,0x3a,0x7b,0xda,0xef,0x5d,0x65,0xee,0xb0,0xa3,0x10,0x3f, - 0x06,0x1e,0xc2,0x39,0x48,0xaf,0xb5,0xe3,0x43,0xe5,0xec,0x15,0x70,0xa6,0x12,0x39,0x03,0x2e,0xd8,0xa7, - 0xaa,0x6c,0xc1,0xd7,0xb7,0x72,0xfe,0x81,0xbd,0xc5,0x72,0x2d,0xc0,0x02,0xa2,0xe7,0x17,0x06,0x9c,0x6f, - 0x0c,0x99,0x29,0x87,0xa8,0xc1,0x02,0x1e,0xbb,0x3b,0x51,0xdc,0xf6,0x84,0x4b,0xed,0x87,0xc9,0xa0,0x18, - 0x6a,0x4f,0x69,0xe2,0x10,0xa3,0x51,0x6b,0x12,0x89,0xe1,0x8b,0xf8,0xa4,0x68,0x4c,0x77,0x50,0x94,0x2d, - 0x7e,0x15,0x8c,0xb9,0x14,0x30,0x0c,0x9a,0x85,0xf5,0xcf,0x68,0x44,0xed,0xf1,0x2b,0x81,0xdd,0x65,0x0f, - 0x57,0x16,0xa0,0x39,0x87,0x2d,0xab,0x02,0x2a,0x6e,0xb0,0x2c,0x30,0x45,0x58,0xc5,0x30,0x9b,0x4b,0x58, - 0xed,0x7d,0x8a,0xd8,0x7e,0xf1,0x96,0x37,0x2d,0xf3,0x0c,0x27,0x46,0x62,0x60,0xa4,0xc5,0xda,0xbb,0x14, - 0xdb,0x5c,0x09,0xc9,0x0c,0x60,0x3b,0x91,0xa6,0x36,0x8f,0xc3,0xd6,0xd7,0xe5,0x2c,0xf0,0xb4,0x21,0x1f, - 0xd6,0x66,0x1c,0x8d,0x89,0xd1,0xa2,0x79,0xe6,0x4b,0xa4,0x4b,0x8e,0x96,0xa5,0xbe,0x20,0x3a,0xae,0xfc, - 0xbd,0x36,0xa6,0xef,0xc3,0xa1,0x5c,0x61,0x12,0xf7,0x74,0x13,0x2a,0xfb,0x5a,0xae,0x07,0xf6,0xc1,0xfa, - 0xa0,0xb7,0x36,0x19,0x69,0xc8,0x4f,0x4f,0x9d,0x04,0x37,0x8c,0x40,0xa3,0x0f,0xfc,0x30,0x95,0x1f,0xa2, - 0xd5,0x44,0xdf,0xe1,0xdf,0x0f,0x36,0xaf,0xce,0x91,0x3c,0x4d,0xb1,0xf0,0xaf,0xd0,0x88,0x73,0x76,0x46, - 0x1d,0xe5,0x88,0xf1,0x1f,0x8c,0xe3,0x9b,0x45,0x28,0xbc,0xcd,0xbe,0x17,0xc5,0x6f,0x53,0x3e,0x15,0x56, - 0x03,0x2c,0x54,0xc6,0x2c,0xaa,0xa2,0x92,0x3a,0x9f,0x7d,0x33,0xe1,0x12,0xe9,0x52,0xbc,0x15,0x2a,0x9c, - 0x81,0x5f,0xac,0x29,0xce,0x57,0x14,0x8e,0xf0,0x62,0xe5,0xaa,0x98,0xfd,0xc0,0x07,0x11,0xea,0xe1,0xd3, - 0x25,0x46,0x63,0x5a,0xd1,0x07,0x08,0x6c,0x4a,0x00,0x41,0xd5,0xeb,0xca,0x1e,0x76,0xf1,0x06,0x19,0xf3, - 0xc1,0xc9,0xf4,0xd3,0x30,0xab,0xcb,0x19,0x0a,0xe5,0xfc,0x38,0x54,0x1e,0x93,0xf9,0x1b,0x06,0x80,0x23, - 0xbe,0xd3,0x02,0x0a,0x58,0x9d,0xae,0x86,0xe2,0x58,0xea,0xda,0x12,0xb6,0x1c,0xc7,0xa6,0xa2,0x23,0x70, - 0x75,0x35,0xc5,0x69,0x24,0x15,0x65,0x01,0x8b,0x06,0xb2,0x45,0x8d,0x06,0x38,0x8a,0x0c,0x32,0xbf,0x46, - 0xf8,0x75,0xd5,0x27,0x42,0x88,0x83,0x4f,0xf6,0xa7,0x36,0x7d,0xcf,0x79,0x24,0x2a,0xc7,0xb4,0x71,0xf9, - 0xb5,0x1f,0x53,0x60,0x59,0xc1,0xfe,0xc2,0xc1,0xf0,0xa2,0x86,0xf6,0x43,0x35,0xc0,0xed,0x62,0x3a,0x7e, - 0xa4,0x8a,0xf4,0x42,0x6a,0x58,0xf5,0x71,0x5c,0x96,0x21,0x04,0xfa,0x7c,0x45,0x0c,0xc6,0x11,0x0d,0xf3, - 0x95,0xaa,0x67,0x31,0x14,0x6b,0x8f,0xd4,0xa1,0x00,0x79,0xb0,0x12,0x0d,0xc7,0x33,0x42,0x89,0x68,0x20, - 0x23,0x3c,0x7d,0x8b,0x1b,0x66,0x1e,0x55,0x64,0x3d,0x47,0x56,0x12,0x64,0xb7,0x2a,0x97,0x5e,0x88,0xc7, - 0x9c,0x20,0x13,0xc8,0x86,0x49,0x6d,0xaf,0x0d,0xed,0x39,0x35,0x58,0xd6,0x5e,0xab,0x0f,0x39,0x52,0x03, - 0x7f,0x48,0x6f,0xc7,0x05,0x1f,0x14,0xd4,0x51,0xb5,0x0f,0x4f,0x8c,0x44,0x53,0x5a,0x6d,0xab,0x10,0x21, - 0x14,0x71,0xdc,0x9c,0x68,0x95,0xd5,0xc8,0xb3,0x1f,0xb2,0xd5,0xc6,0x9f,0xc2,0x2c,0x5d,0xd8,0x9e,0xca, - 0x27,0x3c,0xc8,0xd2,0x29,0xc9,0x30,0x43,0xf6,0xfa,0x59,0xfb,0x30,0xc1,0x99,0xa5,0x38,0x84,0x6e,0xfe, - 0xa1,0xd3,0x7c,0xc6,0x84,0x0e,0x9e,0x77,0x89,0x06,0xe2,0xbd,0x31,0x95,0x64,0xb8,0x90,0x2c,0x38,0xc5, - 0xf8,0x05,0xd2,0x4d,0xe3,0xe3,0x63,0x76,0xf8,0x9a,0x2f,0x6c,0x9a,0x2b,0x17,0x8f,0xb0,0xf9,0x54,0x9d, - 0xb8,0x26,0x96,0x77,0x21,0xb8,0x71,0x25,0xc9,0xac,0x67,0x61,0x39,0x23,0x65,0x83,0xb1,0x32,0x1a,0x41, - 0xc0,0xb9,0x0c,0x98,0x90,0x95,0xc8,0x6f,0x37,0xbe,0x35,0x3a,0x1c,0x2d,0x6c,0x79,0xeb,0x60,0xe5,0xf0, - 0x80,0x7a,0xd4,0xc7,0x15,0x75,0x9a,0x4d,0xe5,0xdd,0x6a,0xb9,0x32,0xc0,0xdc,0xe8,0x7a,0x6d,0x18,0xf5, - 0x59,0x9d,0x9b,0xb9,0x20,0x05,0x36,0x82,0xa9,0xde,0x08,0x3c,0xe0,0x79,0xaa,0x53,0xb0,0xce,0xf7,0x15, - 0x7f,0xfd,0x0b,0xc4,0x42,0xe4,0xea,0x2e,0x1a,0x10,0xc3,0x71,0x90,0xa1,0xfd,0x87,0x17,0x38,0xbc,0x7a, - 0x19,0x52,0x3e,0x64,0x2f,0xa8,0x20,0x2c,0xb4,0x93,0x4c,0x8a,0x30,0x9f,0xee,0xc0,0x02,0x24,0x1e,0x4f, - 0x12,0x92,0xc1,0x0c,0x51,0x57,0x10,0x30,0x41,0x39,0xe0,0x82,0x09,0x53,0xaf,0x28,0xe1,0xa0,0x43,0x80, - 0x58,0xc5,0xc2,0x51,0x7d,0xd0,0x3c,0x8a,0x78,0xb1,0x6e,0x4c,0xb9,0x28,0x76,0x07,0x76,0xb0,0x25,0x86, - 0xdc,0x6a,0x72,0x98,0x3d,0x51,0x57,0x54,0x16,0xe5,0x65,0xcc,0xb8,0xc5,0x94,0x16,0xca,0x3d,0xbf,0x6c, - 0x87,0xec,0x28,0x2b,0xe0,0xd5,0xe2,0x5c,0xa0,0x56,0x1b,0x10,0xdb,0x23,0xb0,0xb4,0xc9,0x9a,0x37,0xba, - 0xad,0x22,0xb8,0x62,0x92,0xe3,0x8c,0x27,0x31,0x53,0xee,0x43,0xfa,0xc5,0x77,0x2e,0xed,0xa8,0xb4,0x73, - 0x04,0xfd,0xd0,0x9b,0x72,0x1a,0x68,0x65,0xbf,0xe6,0xde,0x84,0xe2,0x2f,0x66,0x37,0x4a,0xea,0x70,0x0d, - 0xa1,0x0c,0xd4,0x3d,0x59,0x73,0xe0,0xc8,0x3f,0xb2,0xdd,0xd9,0xa2,0x81,0xde,0x61,0x3f,0xa8,0xc8,0x9e, - 0xaa,0x73,0xe6,0x8a,0x61,0x9a,0xa3,0x7d,0x26,0x32,0xcc,0x37,0xac,0xd7,0x14,0xd4,0x74,0x00,0x5b,0x3e, - 0xb4,0x6f,0x4c,0xf9,0x3c,0x96,0x85,0xd9,0x00,0x36,0x7f,0xb4,0xef,0xb2,0x62,0x1d,0xaa,0x33,0x7e,0xc2, - 0x2c,0x32,0x0b,0xbf,0x9e,0x07,0x69,0x52,0x0c,0x7f,0x62,0x17,0xc8,0x04,0xc2,0xad,0x4f,0x1b,0x23,0x25, - 0xf8,0xb5,0x5b,0xc4,0x8e,0x71,0x57,0x5b,0x8d,0x56,0xbb,0xd1,0x7e,0xe6,0xd1,0x66,0x33,0xf0,0x6b,0x54, - 0x38,0x20,0x8a,0xf8,0x7d,0x30,0xb4,0xf3,0x78,0x88,0xf8,0x33,0xaa,0x40,0x55,0x75,0x20,0xb5,0xf4,0x51, - 0xa3,0x54,0xd5,0x6a,0xaf,0xac,0xb6,0x56,0x50,0x95,0xaa,0x85,0x6b,0x94,0xaa,0x4c,0x1e,0x57,0x85,0xf2, - 0x07,0xaa,0x3a,0xaa,0x0a,0x35,0x1a,0xb0,0x40,0x1d,0xdd,0xf6,0xb3,0x3a,0xa1,0xf9,0x6a,0xcb,0x9b,0xe2, - 0x73,0x03,0x16,0x55,0x68,0xe5,0x95,0x63,0x6e,0x90,0xfc,0xe1,0x71,0xcf,0x75,0x11,0x3d,0xf6,0x27,0x60, - 0x79,0xbf,0x6a,0x95,0x05,0xb8,0xa7,0x96,0x38,0x05,0x66,0x25,0xf4,0x39,0x5a,0x4d,0x5f,0xe0,0x6a,0x4c, - 0x95,0x76,0x43,0xb9,0x04,0x00,0x0c,0xa3,0x3f,0x60,0xb3,0x87,0x3c,0xe5,0x46,0xd3,0x42,0x0f,0x20,0x30, - 0x08,0x78,0xa7,0x5f,0x79,0x08,0x72,0xa8,0x14,0x00,0x99,0xf1,0x8b,0xac,0x95,0x56,0xdb,0x03,0xcb,0x9e, - 0xfd,0xf5,0x2f,0x83,0xbc,0x00,0x17,0xa2,0x53,0xb9,0x7c,0x5f,0x8a,0xef,0xa8,0xd2,0x75,0x94,0xde,0x16, - 0xeb,0x4c,0x5d,0xb6,0xce,0x65,0xf5,0x98,0xfc,0xc4,0x63,0xfc,0xc0,0x9a,0x47,0xa6,0x0e,0x81,0x83,0xc2, - 0x3c,0xcc,0x58,0x18,0xea,0xca,0xc4,0x79,0x17,0xf5,0x55,0x0c,0xac,0x38,0x0c,0xc0,0x2f,0xc3,0x0b,0x1b, - 0xf1,0xd6,0x24,0x2e,0x54,0x5c,0x17,0x4f,0xcb,0x35,0x00,0x83,0xa6,0xe0,0xf2,0x52,0x99,0xb5,0xb0,0xf3, - 0xae,0xb9,0xeb,0x82,0x92,0x8b,0xc2,0x51,0x2e,0x5a,0xa1,0x0f,0xad,0x3a,0xb8,0xab,0xc4,0x4d,0xee,0x80, - 0x4a,0x60,0xa3,0x52,0xf4,0x02,0xb3,0xee,0x4d,0xdb,0x75,0x3e,0x4b,0x8d,0x18,0x09,0x64,0x58,0x2e,0x89, - 0x5c,0xe9,0xc2,0x6b,0x65,0xe1,0x26,0x8a,0xaf,0x59,0xc5,0x9b,0xfc,0x81,0xc1,0x17,0x5a,0x4c,0x3f,0xca, - 0x4e,0xbc,0x90,0x74,0xab,0x3c,0xc4,0x18,0xbd,0x8c,0xbe,0x4c,0xcd,0xbe,0x9c,0xd7,0xdf,0xff,0xf5,0xff, - 0x24,0x3e,0x45,0xed,0x5a,0xac,0x22,0x22,0x25,0x95,0x8f,0xf4,0x4b,0xed,0x17,0x9f,0x97,0xad,0xfb,0x23, - 0x09,0xb4,0x6a,0xd2,0x89,0xdb,0x94,0x4f,0x6b,0xb0,0x1b,0x66,0xd7,0x7d,0xbc,0x68,0x2b,0x65,0x1c,0x01, - 0x8f,0x97,0x06,0x6e,0x13,0x17,0x6f,0x69,0x9c,0xcd,0xce,0xdf,0xa9,0x88,0xac,0x35,0xbe,0x9b,0x16,0x15, - 0x02,0xd9,0xf1,0xfe,0xf6,0x0f,0xff,0xb8,0xda,0xaa,0xed,0x84,0xbd,0xbf,0xfd,0xc3,0xff,0x64,0xef,0xaa, - 0x9c,0x4e,0x8d,0x21,0x32,0xcb,0xf4,0x6f,0xff,0xf0,0x3f,0xeb,0x42,0xff,0xa8,0xf6,0x58,0x4e,0xe2,0xfc, - 0x7f,0xac,0x6c,0xb5,0x8e,0xea,0xe8,0x76,0x90,0x35,0x40,0x8a,0x9c,0x47,0xc7,0x8d,0x58,0x2d,0x6b,0xd0, - 0x48,0xce,0xcb,0x0b,0x66,0x8b,0x11,0xf8,0x01,0xf1,0x35,0xaf,0xa1,0x9c,0x16,0x48,0xbc,0xfb,0x4c,0x8d, - 0xd7,0xad,0x71,0x26,0x8e,0xa6,0x1a,0x53,0xa6,0x8d,0x7c,0xce,0x47,0xc4,0xf7,0x42,0x84,0x55,0x59,0x81, - 0xc6,0xc1,0x49,0xc9,0x2f,0xcd,0x81,0x88,0x13,0xa9,0x8f,0x09,0x8d,0x0d,0x25,0x3c,0x0c,0xab,0x98,0xae, - 0x42,0x0f,0x0a,0xe5,0x04,0x64,0xe5,0xf2,0xb2,0x40,0x22,0x55,0x6d,0xcb,0xe2,0x20,0xdd,0x16,0x73,0xc0, - 0x47,0xf4,0x32,0x46,0x59,0x49,0xc8,0x67,0x41,0xc1,0x23,0xe1,0x36,0x51,0xba,0xbc,0x02,0x08,0x7a,0xac, - 0xc0,0x08,0xd9,0x71,0xfa,0x6d,0xae,0xc6,0x8c,0x5e,0x0b,0x3e,0xf6,0x05,0xb9,0xce,0x25,0xd2,0x88,0x3e, - 0x8a,0x52,0xb5,0x69,0x77,0xe5,0x0d,0x50,0x6d,0xd1,0x6f,0x32,0xdf,0xf2,0x19,0xd4,0xdc,0xa4,0x89,0x43, - 0x67,0x3e,0xe4,0xa9,0x80,0xc1,0x87,0x39,0x90,0xae,0x52,0x8c,0xc0,0xbb,0x70,0xc2,0x33,0x75,0x40,0x93, - 0xa3,0xa7,0xa3,0x27,0xee,0xe9,0x00,0x61,0x63,0x2a,0x93,0xc0,0x12,0xe8,0x90,0xca,0xb2,0xbe,0x3b,0x40, - 0xc8,0x67,0xdb,0x23,0xce,0xf4,0x1b,0x2d,0x7e,0x64,0x0f,0xee,0x70,0x91,0xc2,0x7d,0x27,0x49,0x8e,0xfd, - 0x27,0xc1,0x7b,0x81,0xea,0xfe,0x01,0xa3,0x88,0x02,0x23,0x0b,0xe1,0xf0,0x04,0x44,0xa9,0xcf,0x27,0x0a, - 0x0a,0x1d,0xf8,0x74,0x96,0x36,0xc4,0xcc,0x80,0xf2,0xc0,0x04,0x6c,0xfd,0x9a,0x01,0xa8,0x71,0x74,0x23, - 0xf5,0x85,0x8c,0x46,0x2d,0x18,0x95,0x63,0x0b,0xa8,0x70,0x84,0x2d,0x41,0x2e,0x0b,0xfe,0x04,0x9e,0x6a, - 0xcc,0xbc,0xf0,0x20,0x61,0x93,0x06,0xab,0x9f,0x24,0x3c,0x48,0xa2,0x27,0x69,0xcf,0xad,0x5c,0x3e,0x2d, - 0x04,0x73,0xef,0xd7,0x8e,0x9b,0x8d,0x37,0x66,0xec,0x66,0xf0,0xe7,0x84,0xc7,0x0d,0x71,0xc8,0x2f,0x2b, - 0xd8,0x03,0x9d,0xbb,0xc6,0x14,0xda,0x66,0xb0,0x11,0xe7,0x21,0x34,0x9f,0x22,0x2f,0xd4,0xdc,0xa3,0x1c, - 0x0a,0x2e,0x1a,0x2d,0x08,0x6f,0x82,0x84,0x53,0x25,0xba,0x69,0x35,0x17,0x3e,0x44,0xf5,0xac,0xd3,0xc9, - 0x05,0x9f,0xf3,0x96,0xac,0x3e,0x57,0xfb,0x71,0xf5,0x6b,0x2d,0x31,0x41,0xfb,0x2f,0xcc,0x1e,0xac,0x47, - 0x4b,0x79,0x34,0xce,0x28,0x67,0x04,0x3b,0xf6,0x8c,0x86,0xb1,0x32,0xc1,0x4b,0x43,0x23,0x84,0x29,0x2e, - 0x3f,0x57,0x1c,0xbe,0xe8,0xa2,0x99,0x0f,0xf7,0x55,0xa6,0x53,0xc2,0x80,0x83,0xdd,0x6f,0x43,0x80,0xd3, - 0xe1,0xb2,0x7d,0x51,0x19,0xc0,0x02,0xae,0xc9,0x29,0x90,0xac,0xd4,0xfc,0x6b,0x30,0x8c,0xed,0xba,0xb7, - 0xd3,0xfe,0xed,0xb7,0xeb,0xbe,0xa0,0x52,0x65,0xdd,0xdb,0x90,0x5a,0xc1,0xe4,0x1a,0x8f,0xa7,0x8d,0xa9, - 0xe5,0xeb,0x94,0xe7,0xce,0x06,0xb9,0x10,0x58,0xcc,0xd4,0x95,0xc7,0xd8,0x53,0x73,0x66,0x6d,0xb1,0x9f, - 0x88,0xf0,0x11,0xcb,0x69,0xb7,0xe2,0x37,0xcd,0xfd,0x3f,0x9f,0x71,0x33,0x72,0x4c,0x48,0x26,0xc8,0x7a, - 0xf0,0xfa,0x51,0x36,0x60,0x48,0xeb,0x27,0x9d,0x29,0x12,0xeb,0x85,0x51,0x3c,0x53,0xbb,0x93,0x0e,0xd4, - 0xc1,0x07,0xea,0x10,0xbe,0x82,0x71,0x54,0xd0,0x0e,0xc6,0x4c,0xd6,0xa0,0xb0,0x9a,0x42,0xee,0x4c,0x1d, - 0xbc,0x6e,0x44,0xf9,0xa5,0x31,0x4a,0x71,0xd1,0x50,0x42,0x60,0xf8,0x1b,0xd1,0x87,0x41,0x24,0xab,0x70, - 0x0a,0xf5,0x3e,0xe4,0xd7,0xa1,0xed,0x9a,0x9b,0x73,0x0b,0xb4,0xad,0x1c,0x96,0x73,0xd4,0x5c,0x0e,0x22, - 0x93,0x4a,0x38,0x65,0xb3,0x2d,0x29,0x26,0x07,0xe7,0x19,0x3c,0x6c,0x7c,0x79,0xe7,0xf3,0x82,0xd1,0xfe, - 0x8f,0x31,0x38,0xb9,0x30,0x38,0xea,0x4e,0xb9,0x14,0x58,0x82,0x22,0xea,0xb1,0xc0,0xc2,0x2e,0xc3,0x8b, - 0x08,0x2c,0x7b,0x2f,0x8e,0xc6,0x8a,0xa0,0xe5,0x05,0x51,0x31,0x68,0xf7,0x6b,0x13,0x10,0x5f,0xd6,0x63, - 0x70,0x91,0xe3,0xb8,0x24,0xd2,0x0c,0xd1,0x4d,0x16,0x8c,0xa5,0x1a,0xe2,0x38,0x38,0xca,0x85,0xb8,0x55, - 0xe7,0x43,0x56,0xd8,0x7a,0x4f,0x59,0x7b,0x15,0x27,0xab,0xc4,0x56,0x4c,0x32,0xdc,0x70,0x11,0xe3,0x05, - 0xb3,0x38,0xe3,0xbf,0x19,0xf5,0xc0,0xbd,0x31,0xb6,0xe1,0x09,0xc2,0x08,0x27,0x05,0x89,0x6d,0xe9,0x24, - 0x8f,0x6f,0xa7,0xfc,0xc9,0x00,0x80,0x10,0x69,0x60,0x17,0xc4,0x22,0x4c,0x11,0x6a,0xf5,0x98,0xa3,0xb8, - 0x81,0x1b,0x72,0x38,0xd8,0x65,0x86,0x18,0x47,0x8d,0xc3,0xe9,0x0f,0xa9,0x5c,0xd8,0xeb,0x4b,0x37,0xfd, - 0x21,0x78,0x2c,0x3d,0x3f,0xe6,0xd4,0xed,0xb1,0x49,0x2a,0x0f,0xf3,0x30,0x53,0xd6,0x31,0x9e,0x38,0x96, - 0xbf,0x09,0x6e,0x55,0x78,0x6e,0x8c,0x3f,0xce,0x6e,0x1b,0xd3,0x3d,0x28,0xf0,0xb3,0x3a,0xd0,0x91,0x2a, - 0xce,0x53,0xc2,0x53,0xa4,0xf4,0x85,0xca,0x69,0x88,0x43,0xa8,0xcd,0x3a,0x47,0x12,0x4e,0x85,0x26,0x98, - 0xde,0x09,0x7a,0xc4,0x26,0x62,0x05,0x6d,0xbe,0x83,0x85,0x64,0x98,0xcb,0x29,0x9e,0x3a,0x8a,0xdf,0xa7, - 0x62,0x28,0xce,0xef,0x5c,0x9e,0xcb,0x48,0x71,0xf9,0xb4,0xda,0x59,0xda,0x23,0xb3,0xdb,0x85,0x1d,0x65, - 0xb8,0x38,0x9b,0x17,0x1c,0x9b,0x6e,0x46,0xa1,0x74,0x51,0xa4,0x3c,0xee,0x9c,0x62,0x46,0xc0,0xc1,0x4a, - 0x60,0x57,0x4c,0x2d,0x21,0x9f,0xc8,0x78,0x5c,0x49,0x2e,0xca,0x32,0xac,0x22,0x99,0x58,0x53,0xad,0x78, - 0x16,0xab,0xd7,0x51,0x12,0xb3,0xe6,0xa6,0xf3,0x43,0x94,0xb3,0x93,0xd5,0x32,0x9e,0xc1,0xf4,0x98,0x4f, - 0x8b,0xf9,0x92,0xbe,0x80,0xd9,0x25,0xba,0x9d,0x5e,0x5e,0xe6,0xec,0x48,0x50,0x21,0x08,0xb5,0xc8,0x8e, - 0xe9,0x29,0xbd,0xce,0xab,0x80,0x87,0x40,0xd4,0x04,0x86,0x41,0x7c,0x01,0x98,0x16,0x4d,0x39,0x56,0xd3, - 0x1b,0xa8,0x3f,0x3f,0x38,0x10,0xcc,0xcf,0x5c,0x52,0x91,0xa9,0x28,0xd0,0xf2,0xf5,0x2a,0xf5,0xb4,0xd0, - 0xf4,0x3a,0x90,0xf3,0x59,0x35,0x28,0xcc,0x66,0x87,0x49,0x3a,0x19,0x0c,0x67,0x97,0xe5,0x76,0x48,0x3c, - 0x00,0x24,0x0e,0xdc,0xf0,0x96,0x95,0x5d,0x4d,0xb2,0xaf,0x35,0xe2,0x06,0x26,0xbf,0x76,0x71,0xde,0xe6, - 0xb2,0x38,0xa7,0xdb,0xda,0x6d,0x05,0x9b,0xdc,0xb0,0x98,0xa6,0x14,0xeb,0xd4,0xad,0x41,0x90,0xdc,0x62, - 0x00,0x45,0x17,0xbb,0x56,0x64,0x69,0xf1,0x95,0xd6,0x5c,0x75,0x04,0xf2,0x71,0x18,0xf6,0x2b,0xdd,0xd7, - 0x77,0x5f,0x0a,0xe1,0xb9,0x40,0x49,0x96,0xe0,0x6a,0x30,0xc5,0x71,0x50,0xb3,0x59,0xfb,0x7d,0xad,0x5b, - 0x93,0x13,0x66,0xbf,0xd6,0x94,0xe0,0x56,0x8d,0xe9,0x7c,0x86,0xa8,0x27,0x06,0xc9,0xcc,0x35,0x97,0xb9, - 0x30,0xf9,0xbd,0x63,0xc1,0x33,0x20,0xe2,0xb1,0x08,0x9a,0x7d,0xa2,0x06,0x35,0xca,0x9c,0x6e,0x5d,0x70, - 0x6c,0x0f,0x16,0xff,0x34,0x46,0x01,0xda,0x31,0x87,0x91,0x52,0xd2,0x70,0x16,0x8e,0xc3,0x42,0xce,0xec, - 0x1b,0xe6,0x0b,0x23,0x0b,0x2b,0xff,0x30,0xa9,0xf1,0x89,0x6a,0x81,0xf5,0x7c,0x4d,0x41,0x35,0xfe,0x62, - 0x83,0x85,0xe8,0x5c,0x07,0xf9,0x42,0xc8,0x0e,0x89,0xeb,0x0f,0xa7,0xfc,0x17,0xdb,0x5c,0x29,0x55,0x59, - 0xcb,0x44,0x22,0xb9,0xc3,0xdd,0x29,0xd6,0xa3,0x90,0xaa,0x1a,0xae,0x84,0x1b,0x4c,0x99,0x40,0x09,0x85, - 0x5e,0xb2,0x4b,0xf2,0x44,0x11,0xc7,0x1f,0xb1,0x83,0xf2,0x51,0xd6,0xfc,0x5d,0x09,0x5f,0x3a,0xb5,0x66, - 0x2e,0x9d,0x54,0xf8,0x21,0x40,0x69,0x22,0x11,0x95,0xf8,0xac,0xf4,0xf9,0xa6,0x46,0xc7,0x0f,0x9e,0xbc, - 0x6a,0x17,0xb7,0xb5,0x21,0x01,0xe7,0x4b,0x60,0x19,0x2c,0xa2,0x2c,0x44,0xe0,0x0e,0x15,0xb3,0x88,0x18, - 0xa3,0xa0,0x31,0x3d,0x50,0xae,0xcc,0xe0,0x59,0xbc,0xf8,0x4a,0x98,0x5b,0xea,0x35,0x80,0xb6,0x60,0x4c, - 0x59,0x45,0x90,0x55,0xb1,0x2c,0xbc,0xa5,0x36,0xea,0x35,0x88,0xcf,0xb5,0xfa,0xb4,0x5e,0x53,0x5e,0x31, - 0x09,0x01,0x1b,0x44,0xd1,0x7b,0x41,0xe1,0xea,0xfb,0xe6,0xc6,0x28,0x18,0xbb,0x61,0x77,0xe3,0x34,0xf4, - 0xc3,0x33,0xcf,0x2b,0xbb,0x72,0x0c,0xec,0x9b,0xe9,0x8f,0x1e,0x78,0xd5,0x0f,0x85,0xa1,0xea,0x6d,0x06, - 0x41,0x55,0xac,0x35,0xf5,0x35,0xc7,0xe2,0x40,0x64,0x0e,0x20,0x8b,0x46,0x55,0xf6,0xe8,0x17,0xe0,0x90, - 0x8c,0x90,0x01,0x37,0xcf,0x29,0x0b,0x0c,0xaa,0xbe,0xdc,0x5c,0xf9,0x95,0x68,0x2b,0x17,0x7e,0x36,0xf6, - 0xd2,0xdc,0xbf,0x0e,0xe3,0x3c,0x9a,0xb0,0x0c,0x6c,0xa2,0x97,0x94,0x4c,0x86,0xca,0x9d,0xaa,0x5f,0x73, - 0x6c,0xfd,0x26,0xc0,0xe9,0x32,0x34,0x23,0xf5,0x99,0xb5,0x95,0xc2,0xac,0xd1,0xcc,0x4d,0x78,0xa5,0xfa, - 0x92,0x49,0x32,0xa5,0x4a,0x5e,0x49,0x27,0xcd,0xf0,0xaa,0xd5,0x3b,0xf7,0x85,0xd5,0xbd,0x53,0x45,0x74, - 0x5d,0x96,0x37,0xd1,0x99,0xca,0x2a,0xb7,0xf1,0x0b,0xeb,0xda,0x96,0x12,0xba,0x2a,0xb8,0x32,0x9d,0xa9, - 0x23,0x07,0x90,0xe6,0x8a,0x49,0x7f,0x57,0x92,0x21,0x93,0x3d,0x3d,0xfe,0xeb,0x5f,0x0a,0x71,0xec,0x46, - 0xe9,0x42,0x65,0x06,0x19,0x4d,0x11,0xd8,0xd3,0xc6,0x54,0x12,0xde,0x66,0xf0,0x52,0x0f,0x4a,0x5f,0x5d, - 0x33,0xad,0x2a,0xb9,0x19,0x04,0xa3,0x51,0x60,0xb7,0x67,0x6e,0x3f,0xdf,0x22,0x67,0xca,0x7f,0xf9,0xcc, - 0x67,0x80,0x55,0xd0,0x85,0x3a,0xd8,0x15,0x2b,0x30,0xf5,0xeb,0x05,0xe1,0x33,0x91,0x95,0x77,0x7f,0xfd, - 0x5f,0x55,0x16,0xad,0xd0,0x18,0x3b,0xe3,0x01,0x3c,0xf2,0x89,0x6b,0x25,0x83,0x35,0x72,0x4d,0x2c,0x28, - 0xd3,0x68,0x51,0xcb,0xb3,0x9a,0x0a,0x16,0x0c,0x86,0x93,0x96,0x98,0x8f,0x3d,0x53,0x68,0x8a,0x11,0x83, - 0x3b,0x9f,0xf0,0x8a,0x7d,0xbc,0x3a,0x6f,0xa2,0x2f,0xa0,0xef,0x6a,0x54,0x89,0x25,0xcd,0x0b,0x0e,0x9a, - 0x46,0x3c,0x68,0x97,0x63,0x5d,0x4e,0xdf,0x6b,0xe7,0x3f,0xc6,0xc5,0x32,0x55,0x41,0xfb,0x06,0x1b,0xf0, - 0x85,0xd1,0x5f,0xff,0x33,0x15,0xa4,0x91,0x62,0xee,0xde,0x68,0x48,0x3c,0x0c,0x0b,0xb1,0x5f,0x05,0x43, - 0x81,0xde,0xc9,0x04,0xe0,0x0b,0x59,0x5d,0x37,0x44,0x1d,0xf5,0x36,0x57,0x85,0xe2,0xcd,0x5f,0xff,0x42, - 0x9f,0xf0,0xf2,0x1a,0xb0,0xf6,0x5b,0xa8,0xb6,0x37,0xd8,0x1d,0xce,0xc0,0x71,0xef,0x1f,0xef,0x9e,0x9c, - 0xbf,0x3d,0xfa,0xf8,0xe9,0xf0,0xb8,0x4b,0xb4,0xc3,0xa8,0x19,0x18,0x85,0x6d,0xfb,0xf9,0x1d,0x6f,0x78, - 0x1a,0x4a,0xad,0x25,0x6c,0x3d,0x4a,0x01,0x75,0x63,0xa9,0x34,0xb6,0xcb,0x27,0xf5,0xb9,0x12,0x61,0xb4, - 0xce,0xb5,0xf5,0x28,0x05,0x14,0xad,0x57,0xca,0xd4,0xe5,0x93,0xe4,0x96,0x34,0xa9,0xd4,0x96,0xae,0xbc, - 0x48,0xb1,0x72,0x51,0x94,0x1a,0xd1,0x95,0x17,0x2a,0x76,0xe6,0x9f,0xfc,0xe9,0xfc,0x84,0xb5,0x67,0xa8, - 0xeb,0xaf,0x96,0x9b,0xcd,0x8d,0x26,0xfd,0x6d,0x6f,0xd4,0xdb,0xfe,0xc1,0x6a,0xe3,0x59,0xa3,0xb9,0xd2, - 0xf2,0x0f,0x5a,0x4d,0x7e,0x5a,0xe5,0x6b,0x6d,0xda,0x2f,0x08,0x39,0x7a,0xc1,0xca,0x09,0x6f,0xfa,0x68, - 0x89,0xbe,0x68,0x6d,0xd4,0x5b,0xc8,0x06,0x6b,0x1a,0xac,0xbc,0x0e,0x10,0x4b,0x23,0x20,0x5a,0x5b,0x53, - 0x29,0xbb,0xf1,0xf9,0x56,0x10,0x4d,0x12,0x5d,0x7e,0x75,0xb5,0xb9,0x51,0x5f,0xed,0xac,0x36,0xf1,0x51, - 0x1e,0x51,0x6d,0xe1,0x30,0x0b,0xca,0x6c,0xca,0xd4,0x39,0x5b,0xb4,0x24,0x92,0x1a,0x3f,0x6e,0x07,0x83, - 0x61,0x3f,0xe8,0xcb,0xcb,0x4e,0x30,0x0a,0xf2,0x1e,0x11,0x2f,0x7e,0xfb,0x7b,0xda,0x30,0x32,0x79,0x3c, - 0x8a,0x6e,0x83,0xfe,0xb0,0xb6,0x3b,0xc9,0xd2,0x71,0xb8,0xb2,0x87,0x5d,0xf8,0x62,0x12,0xeb,0xf7,0x03, - 0xda,0x0c,0xae,0x74,0x3b,0x6b,0x00,0x63,0xcd,0x02,0xe3,0x7d,0x40,0x45,0x4d,0x2e,0xe5,0xe9,0x8c,0xed, - 0xe0,0x6a,0xa2,0xda,0x9d,0x5c,0x04,0x91,0x3c,0x9e,0x5c,0x44,0x30,0x56,0x90,0x97,0x9f,0x42,0xf8,0xb9, - 0x4e,0x74,0x3b,0x5b,0x79,0x91,0x05,0x57,0xc3,0x32,0xe1,0x98,0xe0,0xcd,0x82,0xf2,0x0d,0x07,0xed,0xd7, - 0xfa,0xf5,0x53,0x7c,0x1b,0x24,0xe9,0x75,0x7e,0x55,0xdb,0x4b,0xfa,0x51,0x90,0xac,0x1c,0x04,0x93,0x8c, - 0x38,0x89,0x49,0xae,0x81,0x79,0x06,0x50,0x9f,0x59,0xa0,0x02,0xdd,0x46,0x17,0xa9,0xc9,0x5f,0x7b,0x86, - 0xfc,0xb5,0x67,0x65,0x57,0x8a,0x21,0x42,0x40,0x4c,0x4c,0x09,0xca,0x37,0x83,0x1a,0x8f,0x02,0xa2,0xb4, - 0xf2,0xfc,0x4b,0x11,0x4c,0xcc,0x63,0x7a,0x11,0xaa,0xe7,0x7c,0x38,0x08,0x88,0xd2,0xaa,0xb7,0xe2,0x36, - 0x0b,0xcc,0x08,0xe4,0xd4,0x2f,0x5d,0xee,0x23,0x2e,0x6f,0x65,0x0e,0x52,0x8c,0x75,0xa0,0xaa,0xfd,0xfb, - 0xdb,0xaf,0xb7,0xb4,0x20,0xfa,0x81,0xbc,0x72,0xf7,0xaf,0xf8,0x32,0x9e,0x87,0x2e,0xc8,0x87,0x57,0x38, - 0x31,0x53,0x63,0x77,0x45,0x5b,0x78,0x16,0xd1,0x44,0x65,0x83,0x72,0x08,0xe2,0x7e,0x04,0x86,0xd2,0x42, - 0xba,0x83,0xe0,0x26,0x47,0x9c,0xa4,0x32,0xe5,0x07,0xf8,0x63,0x33,0x13,0xfa,0x1c,0xa3,0xf4,0xdc,0x1a, - 0xa5,0x9f,0x48,0xfc,0x4c,0x0d,0x5e,0x3d,0xa7,0x4c,0x33,0xa3,0x11,0x20,0xb8,0x52,0x5d,0x1a,0x06,0x57, - 0x0a,0xd0,0x8f,0xa3,0x5c,0x25,0x9e,0x0c,0xa3,0xd1,0x78,0xa8,0x3a,0xfd,0x29,0x9b,0x8c,0x7e,0x89,0x34, - 0x6c,0xaf,0x87,0xc1,0x20,0x35,0x73,0xf3,0x87,0x8d,0xfa,0x1f,0x4a,0x44,0x49,0x06,0x57,0xe9,0x95,0x46, - 0xd8,0x2c,0x09,0x26,0x6a,0x78,0xde,0xa5,0xe7,0xaf,0x87,0xd1,0x39,0x21,0xe0,0x50,0x27,0x5c,0xab,0xd1, - 0x78,0x9f,0x05,0x79,0x92,0xde,0x06,0x99,0x6e,0xfa,0x43,0x7a,0x9d,0x5e,0x4d,0xbe,0x26,0x61,0x61,0xa7, - 0x90,0x90,0x12,0x99,0x22,0x27,0x29,0x03,0x5a,0x8e,0xc4,0x4e,0x70,0x1d,0x19,0x90,0x5e,0x00,0x1d,0x5e, - 0x28,0x74,0x98,0x00,0x17,0x63,0xfa,0x66,0x77,0xd2,0x8b,0x03,0x53,0x84,0x0a,0x68,0xa8,0xf7,0xb2,0xab, - 0x89,0x69,0xea,0xfd,0x84,0xf5,0x23,0xd4,0xbc,0xd1,0x53,0x30,0x06,0x73,0x29,0xc3,0x10,0x07,0x34,0xf5, - 0x81,0xac,0xb6,0xb2,0x6d,0x28,0x39,0xde,0xea,0x8a,0x5f,0x6e,0xd4,0x5f,0x1a,0x2c,0x25,0xba,0xac,0x06, - 0x76,0x87,0x16,0x8b,0x6a,0x00,0xac,0xdf,0xed,0x40,0xa5,0xff,0x14,0x48,0xdb,0x87,0x41,0x2f,0xba,0x8c, - 0x7a,0x2b,0x87,0x01,0x31,0xd7,0xaa,0xae,0x56,0x13,0x13,0xda,0x6a,0xd2,0x8c,0xd2,0x0b,0xa8,0x8c,0xd0, - 0xa3,0x56,0xa3,0xe9,0x1f,0xac,0xe1,0xa7,0xd2,0xbf,0x7d,0xc2,0xb7,0xf3,0x77,0xe9,0x4d,0x68,0x3e,0xc7, - 0xc7,0x1a,0x96,0x4f,0x79,0x51,0xff,0x40,0xdc,0x89,0x34,0xfb,0x43,0x1c,0x10,0x7a,0x31,0xf6,0x94,0x4d, - 0x93,0x1c,0x75,0x7e,0x40,0x9d,0xcd,0x2f,0x74,0x6f,0xa4,0x51,0x5d,0xc5,0x41,0x30,0x08,0xfa,0x9a,0x1c, - 0x1d,0x63,0x7d,0x93,0x04,0xa9,0xde,0xb2,0xb0,0x9f,0x84,0x57,0x69,0x7c,0x3b,0xb2,0x3a,0xb3,0x4d,0x32, - 0x59,0x10,0x25,0xd7,0x88,0x95,0x66,0x12,0x77,0x2f,0x83,0xa2,0x7c,0x7b,0x3b,0xa1,0x2a,0xe3,0x5e,0x00, - 0xb5,0x1b,0x9d,0xf6,0x3e,0xcd,0xb3,0xa0,0x2c,0xf2,0x21,0x9d,0x8c,0xc2,0xa0,0x02,0x11,0xfd,0xb6,0x37, - 0x66,0xc6,0x82,0x49,0x74,0xf9,0x4d,0x76,0x99,0xc6,0x7a,0x65,0xb4,0xda,0x40,0x88,0x56,0x9b,0x30,0x82, - 0x5e,0x56,0xe9,0xc5,0x3f,0x78,0xc9,0x64,0x1d,0x49,0xe6,0x7b,0x41,0x18,0x5d,0x05,0x61,0x39,0x09,0xa2, - 0x23,0x53,0x05,0x2a,0x30,0x14,0x24,0x09,0xfa,0xb7,0x8a,0xe2,0xbe,0x0f,0x46,0x3d,0x2a,0x4a,0x2b,0x48, - 0x7f,0xf9,0x26,0xfa,0x73,0x54,0x76,0xe6,0x26,0xf8,0x33,0xf1,0x4a,0xac,0xa2,0xae,0x60,0x23,0xea,0x36, - 0x31,0x6f,0x27,0x44,0x0b,0x6f,0x4c,0xef,0x88,0xf6,0xb7,0xec,0x7e,0x6c,0x8d,0x23,0xab,0x5e,0x5a,0xa6, - 0x24,0x98,0x97,0x55,0x07,0x09,0x82,0xb7,0x99,0x9a,0x52,0x42,0xd6,0x22,0x18,0x1b,0xf4,0x21,0x12,0xde, - 0x5a,0xb3,0x2a,0x7b,0x1f,0x81,0xaa,0x42,0xfb,0x4a,0x4a,0xd4,0x69,0xe7,0xe2,0xc9,0x2d,0x68,0xbb,0x2a, - 0xd0,0xe5,0x60,0x1c,0x9e,0xff,0x00,0xc7,0x07,0x56,0x01,0xde,0x18,0xf5,0x86,0xd8,0x34,0x1b,0x62,0xe5, - 0xc3,0xad,0xaf,0x40,0x1b,0xfd,0x51,0x7b,0x83,0x07,0x6a,0x14,0xf2,0xee,0x47,0x53,0x91,0x26,0x43,0xc2, - 0x3b,0x5d,0xf8,0x38,0x9d,0x14,0xc3,0xf3,0xb7,0x61,0x9a,0x0d,0xa2,0xc0,0xfa,0x86,0x9b,0xd3,0x0d,0xd5, - 0xcb,0xad,0xb7,0x69,0x57,0x36,0x99,0xd0,0x3a,0x55,0x2f,0xc7,0x3d,0x41,0xd6,0x1c,0x71,0xb2,0x54,0x3d, - 0xab,0x1b,0xab,0x56,0xf1,0xad,0x2c,0x18,0x4c,0x08,0x03,0x83,0x5a,0x99,0x02,0x89,0x83,0x52,0x56,0xb6, - 0x27,0x61,0x92,0xe6,0xe7,0x5b,0x11,0x3c,0x1f,0xcd,0x67,0xbf,0xa6,0xa1,0x24,0xa2,0xdd,0x5b,0xf4,0x29, - 0xb1,0x92,0xfd,0xf4,0x62,0x51,0xce,0xf7,0x93,0x3f,0x4f,0x6e,0x17,0xa4,0xef,0x07,0xe7,0x47,0x51,0xfa, - 0xe7,0x45,0x9f,0x1c,0x90,0xc4,0x99,0x7e,0x5d,0x94,0x43,0x5f,0x9c,0xbf,0xc5,0x51,0x27,0x51,0xdb,0x05, - 0xd9,0xc7,0x41,0x5c,0x04,0x0b,0xd3,0x93,0xf3,0xef,0x27,0x58,0xa7,0x0b,0xb3,0xf6,0x27,0xd1,0xa2,0xda, - 0x4e,0x26,0xbd,0xc9,0x68,0xe1,0x47,0x9f,0xf2,0x21,0x8d,0xa1,0xd5,0x12,0x8d,0x77,0x0f,0x4a,0x76,0x3a, - 0x61,0x3b,0x18,0x5a,0xd9,0xb0,0x33,0x18,0x99,0xb7,0xd7,0xc1,0x2d,0x14,0x47,0xcb,0xf7,0xf4,0x76,0x18, - 0x44,0xbf,0x4c,0xca,0x14,0x18,0x43,0xd3,0x02,0xb1,0x46,0xe0,0x80,0x24,0xc5,0x28,0x2d,0x5f,0x53,0x12, - 0x11,0xaf,0x49,0x34,0x29,0x93,0x0e,0x69,0xd1,0xd0,0xe4,0x44,0x17,0x56,0xd2,0x84,0x08,0xf2,0xf9,0x16, - 0xbc,0x08,0x94,0xdd,0x3b,0x0a,0x09,0xf3,0xcb,0xa6,0xa8,0xfb,0x44,0xb4,0x2d,0xe8,0x8e,0x83,0xf4,0xfc, - 0x90,0xf6,0xa8,0xd4,0xc2,0xce,0x02,0xd1,0xf9,0x6e,0x6d,0xfa,0x4e,0x34,0x19,0xf1,0x15,0xad,0x94,0xa3, - 0x14,0x82,0x7a,0x60,0x21,0x1d,0xa3,0x30,0x90,0xb7,0x0d,0x82,0xd4,0x6a,0x69,0xea,0xac,0xfb,0x80,0x2e, - 0xc7,0x7a,0x2f,0xae,0x13,0x77,0xb5,0x66,0xe5,0x6e,0xa7,0xc1,0xf9,0x0f,0x24,0x13,0x07,0xd6,0xb0,0x91, - 0x4c,0x7c,0x4e,0x82,0x15,0x07,0x1a,0x30,0x89,0x59,0xd0,0xb3,0x7a,0xf7,0x7a,0x12,0x05,0x16,0x16,0xbe, - 0x9d,0x10,0x1b,0x55,0xbe,0x12,0xca,0x1d,0x06,0x5f,0xad,0x41,0x85,0xbd,0x41,0x39,0x5c,0x34,0xea,0x29, - 0xad,0xf5,0x78,0x98,0x5a,0x30,0x71,0x5f,0x40,0x1b,0x5b,0x8d,0xe7,0x2b,0xed,0x35,0xa1,0x8c,0x78,0xb2, - 0x80,0xc5,0x20,0x46,0xc4,0x00,0xe8,0xcf,0x9e,0x6d,0x3c,0xab,0x74,0x65,0x90,0x5a,0xfd,0xd8,0x8d,0xb2, - 0x49,0x12,0x8e,0x43,0x0b,0xc8,0xe0,0x36,0xf8,0x65,0x12,0xc5,0x25,0x9c,0x44,0x91,0xca,0x09,0x23,0x94, - 0xdf,0xa6,0x5e,0xf7,0x4c,0xf5,0xcf,0x37,0x9e,0x5b,0x24,0x8c,0x96,0x43,0x30,0x2e,0xb9,0x0f,0xce,0x66, - 0x18,0x0c,0xd0,0x6d,0x03,0x74,0xdb,0xfa,0x6e,0x17,0xca,0x8d,0x99,0xfe,0xe8,0xc5,0xc6,0x0b,0x2b,0xef, - 0x30,0x2a,0x7a,0x41,0x94,0x99,0xb9,0x79,0x49,0xbb,0xee,0x4b,0xe1,0xa2,0x74,0x91,0x83,0x20,0xa3,0xf9, - 0xcb,0x03,0xd3,0xec,0xcb,0x8d,0x97,0x15,0xa8,0xa0,0xdf,0xad,0xab,0xa7,0x7d,0xb7,0x65,0x7f,0x7c,0x14, - 0x64,0x69,0x01,0xda,0x6c,0xd1,0x7c,0x62,0x0c,0x34,0x11,0xa6,0x1d,0x8d,0xb7,0x58,0xb3,0x3d,0x44,0x13, - 0x21,0xbf,0x5b,0xaf,0x8f,0x4f,0xea,0x0a,0x90,0x72,0x97,0xdf,0x09,0xb2,0x9b,0x28,0xa9,0x16,0xd8,0x7a, - 0xbd,0x73,0xb2,0x68,0x37,0x2c,0xbf,0xda,0xea,0x87,0x71,0x10,0x01,0x97,0x4c,0x12,0x9b,0xeb,0x25,0xe7, - 0xef,0x22,0x25,0xc8,0x6c,0xed,0x52,0x6d,0xad,0x6a,0x63,0x24,0xf7,0xe5,0x17,0x41,0x62,0x7f,0xb6,0x0f, - 0x95,0x92,0x91,0x92,0x56,0xd4,0x37,0x5b,0xbb,0xdf,0x6a,0xff,0x1d,0x91,0x4b,0x12,0x8b,0xcb,0x84,0x83, - 0x30,0xbe,0x20,0x21,0xb7,0x52,0xf5,0xf1,0x2d,0xf1,0x10,0xb7,0x55,0x8e,0xb7,0xf7,0xcb,0x84,0xd6,0xb9, - 0x1a,0x90,0xf7,0xc7,0x27,0x2f,0xb7,0xde,0xa3,0xad,0x87,0xd6,0xd9,0x56,0xd2,0x1b,0xb2,0xd1,0x8a,0xc1, - 0xa8,0xef,0x09,0xff,0xc0,0xbb,0xeb,0x65,0x10,0xd2,0x42,0x27,0x7e,0x3b,0x2e,0x71,0xee,0x43,0x3a,0xb2, - 0x48,0x44,0x84,0x9d,0x5c,0xbf,0x31,0x77,0x16,0x88,0x02,0xd8,0xd6,0xf1,0x49,0x65,0xcd,0x06,0x70,0x83, - 0x62,0x11,0x66,0xc2,0x11,0x22,0x97,0x15,0xd2,0x76,0x38,0x09,0xb1,0xca,0x8e,0xa2,0x5e,0x5a,0xa1,0x41, - 0xe9,0xf9,0x4e,0x3a,0x22,0xd6,0x32,0x35,0x15,0x6f,0x3d,0xd6,0xa9,0xb7,0x70,0xbd,0x77,0xbe,0x1d,0x94, - 0x1b,0xcb,0x5b,0x44,0x3f,0xaa,0xa4,0xbc,0xa3,0x11,0xbc,0x0c,0xbe,0xd8,0x44,0xb3,0x57,0x58,0x34,0xfa, - 0x64,0x38,0x41,0x14,0x1a,0x4d,0xe5,0xb6,0xc3,0x6c,0x34,0xe9,0x0b,0x01,0xdb,0xfa,0x91,0x26,0xf1,0x45, - 0x65,0xba,0x0e,0x09,0xee,0x21,0x67,0xbe,0xde,0x3a,0xa9,0xb7,0x4b,0xe1,0xf6,0xfb,0xc9,0x85,0x11,0x6b, - 0x89,0x91,0xa5,0xde,0x4d,0x46,0xfa,0xfd,0x80,0x58,0x8f,0x22,0xd5,0x6f,0x3f,0x12,0x9e,0x0c,0xd3,0x50, - 0x58,0xb0,0xd7,0xbb,0x27,0xb6,0x88,0xbc,0x15,0xe3,0x94,0x24,0xd7,0x45,0x4f,0x26,0x89,0xe2,0xdd,0xb9, - 0xdc,0x6b,0x42,0x2a,0xc5,0x06,0x54,0xc5,0x6f,0x25,0x5f,0x87,0x34,0x25,0x46,0xd0,0xa4,0xbd,0x33,0x2b, - 0x05,0x4b,0xda,0x7b,0x06,0x59,0x40,0x68,0x6e,0xde,0xe1,0xe8,0xc3,0xbc,0x65,0x13,0x38,0xa0,0xca,0xcd, - 0x3b,0x8d,0xc0,0x18,0xd7,0x69,0xea,0xfd,0x2d,0x82,0x19,0xc7,0x60,0xee,0xb5,0xb8,0x1c,0xf4,0xb3,0xa8, - 0x5f,0xbe,0xc5,0x65,0xc3,0xb4,0x03,0x45,0xa6,0xa2,0x43,0xb0,0x19,0xa6,0xd1,0x23,0xe0,0x93,0x7a,0x3e, - 0x89,0x32,0x2c,0x1f,0xf5,0xf6,0x43,0x44,0x7b,0xa1,0xa9,0xe2,0x47,0x92,0x78,0x82,0x1b,0xfd,0xf6,0xa7, - 0x09,0x2e,0xb6,0x64,0x14,0xf4,0x7c,0x08,0xd3,0xdd,0xd3,0xa2,0xe7,0x31,0x82,0xb9,0x0d,0x8d,0xfc,0x1d, - 0x44,0xe3,0x30,0xd2,0x1f,0x3c,0x7b,0x6d,0x30,0x68,0xc5,0xe0,0x90,0x30,0x69,0x06,0x43,0x48,0x40,0x0f, - 0x74,0xf9,0xe7,0x15,0x54,0xa6,0xfd,0x9b,0xb0,0x09,0x77,0xc7,0xd6,0xf6,0x42,0x83,0x19,0x7d,0xb5,0x76, - 0x9f,0x61,0x44,0x7c,0x00,0xfd,0x67,0xed,0xe5,0xb4,0x65,0x01,0xbb,0x2d,0x7a,0x1f,0x9f,0x13,0x5b,0x72, - 0x4d,0x0b,0x23,0xb3,0x49,0x7e,0x41,0x14,0x23,0x0e,0x2a,0x7b,0xd1,0xc0,0xaa,0xe8,0x80,0x7e,0xfa,0xf6, - 0xeb,0x17,0x5a,0x31,0xe7,0xaf,0x71,0x1c,0x5a,0x61,0x02,0xb2,0x2c,0xbc,0xb5,0xf6,0xf6,0x81,0xcd,0xd8, - 0x1d,0xdf,0x44,0x97,0xc5,0xb9,0x8a,0x94,0x58,0xa2,0x7d,0x38,0x98,0xf4,0xa2,0x41,0x10,0x8f,0xcb,0x9e, - 0xbf,0x7e,0x6c,0xad,0x51,0x2f,0x7b,0xb4,0xbf,0x98,0x0a,0x44,0xe4,0x25,0x64,0x4f,0xd2,0x2f,0x73,0x89, - 0x27,0x61,0x1c,0xcf,0x80,0x09,0xae,0x91,0x18,0x5e,0x8b,0x2c,0x10,0x97,0x49,0x6b,0x3d,0x0c,0x2d,0x7a, - 0x43,0x8b,0xeb,0x7c,0x27,0xb8,0xa2,0x8d,0x92,0x06,0x79,0x12,0x07,0xc3,0xc5,0x79,0xaf,0x43,0xf6,0x1f, - 0xb1,0x30,0xef,0x43,0x78,0x83,0x91,0xb6,0x78,0x99,0x8f,0x7f,0xa6,0xe1,0x18,0x58,0x5b,0x69,0x00,0x05, - 0xd7,0xf3,0xbd,0x04,0x46,0x7d,0xe5,0xa0,0xe5,0x69,0x0c,0x85,0x13,0x9d,0x40,0xcb,0x34,0x21,0x3c,0x1a, - 0xc8,0xe8,0x0c,0xf5,0x16,0x60,0x89,0x67,0x22,0x01,0xed,0x12,0x1d,0xb0,0x16,0xe1,0x07,0xda,0x30,0xd3, - 0x0b,0xc1,0xbe,0xdd,0xdd,0x0a,0x89,0x38,0xc9,0xa2,0x71,0x4a,0xc2,0xae,0xc2,0x6b,0x58,0xc1,0x42,0x29, - 0x87,0x96,0x65,0x59,0x7a,0x57,0x2d,0xf1,0xb5,0xc6,0xda,0xca,0x33,0x59,0xe5,0xf2,0xa8,0xb1,0xfe,0x6d, - 0xf0,0x55,0x49,0xaa,0xef,0xc2,0x8b,0x4c,0xf1,0x4d,0x95,0x4f,0xab,0xd2,0x88,0xf9,0x70,0x3b,0x24,0x8e, - 0xa3,0x58,0x5c,0x7c,0xd5,0x14,0x37,0x27,0x5b,0x6f,0x88,0x8d,0x1c,0x4c,0x72,0x2d,0xa5,0x7f,0x20,0xbc, - 0xa3,0x5f,0x43,0x5d,0x88,0xcb,0x4b,0x2c,0x72,0xd1,0x83,0x87,0xa8,0x92,0x5e,0x10,0xae,0xe4,0x34,0xe6, - 0x13,0xfd,0xfe,0x0e,0x17,0x0d,0x34,0xe8,0xa6,0xeb,0xb7,0x91,0x39,0xe3,0x3a,0x22,0x24,0x34,0xc7,0x5f, - 0xe9,0x65,0xd9,0xc6,0x09,0x5c,0x58,0x26,0x49,0x49,0x22,0xe2,0x44,0x1f,0x7c,0x59,0x1d,0x58,0x23,0xb0, - 0x9f,0x99,0xfe,0xae,0x29,0x8e,0x4c,0x1f,0x38,0xd2,0x5c,0xc8,0x07,0x44,0x07,0x6c,0x5c,0x26,0x3e,0x6a, - 0x52,0x6e,0x01,0xdf,0x53,0x5f,0xed,0xb5,0x7a,0x48,0x28,0x3c,0x0a,0xcc,0x87,0xbb,0x8f,0x2d,0x8b,0x9d, - 0xb0,0xc8,0xd2,0xa8,0xc4,0x23,0xe6,0x4c,0xcf,0x4f,0x26,0xd9,0xd5,0xdc,0xa2,0x50,0xbf,0xc0,0x81,0x7c, - 0x2e,0x93,0x36,0xc9,0x30,0x59,0xb0,0xbc,0x0e,0x61,0x4f,0x93,0xf3,0x01,0xd8,0x6c,0xd6,0x0f,0xe1,0xb5, - 0xb5,0xcf,0x99,0xd4,0x28,0xe9,0x41,0xb0,0x98,0x6f,0x82,0x30,0x9a,0xba,0xd5,0x2b,0xd3,0x7f,0x09,0xe2, - 0x89,0x05,0xfa,0x7b,0x5a,0x55,0x93,0xde,0xd5,0xed,0xca,0x7e,0x4a,0x92,0x90,0x9c,0x4d,0xcc,0xe5,0x81, - 0xdc,0x44,0x08,0xd6,0x56,0x82,0x8a,0x15,0xf7,0x53,0x6a,0x75,0x18,0x2c,0x74,0x3d,0x98,0xd4,0x0f,0x33, - 0xc0,0x52,0x92,0x1c,0xc8,0xbb,0x85,0x4c,0xc8,0xdb,0x83,0x93,0xa6,0xb5,0xed,0x5d,0x44,0xfd,0x3f,0x43, - 0xc4,0x92,0xd7,0xed,0x28,0xcf,0x41,0xda,0x2f,0x35,0x81,0xcb,0xd2,0xeb,0xc8,0xec,0xae,0x10,0x4d,0x4e, - 0x6c,0xce,0x64,0x27,0x48,0x58,0x23,0x72,0x18,0x5c,0x27,0xa6,0xf2,0xed,0x12,0xbb,0x8d,0xc0,0x4c,0x0d, - 0x2a,0x64,0xda,0x4f,0x69,0x7b,0x94,0xc2,0xef,0xde,0x5b,0x7b,0xca,0x3b,0xe2,0x46,0xcf,0xdf,0xd3,0x1f, - 0xc9,0x3a,0x3e,0xa9,0xac,0x79,0xca,0x25,0x1a,0x11,0x4f,0xca,0xcc,0x77,0x8f,0xb2,0x5c,0xfd,0x40,0x36, - 0xf9,0x3d,0x10,0x0f,0x00,0xa5,0x01,0x31,0x90,0x95,0x10,0xed,0xc0,0x13,0x70,0x62,0x8a,0xb7,0xf7,0x76, - 0x0c,0x1d,0x68,0x3f,0xb7,0x3a,0xc0,0x60,0x7e,0x1f,0xd2,0x86,0x0d,0x1a,0x67,0xca,0xdb,0x47,0xc0,0xef, - 0xd3,0x98,0xf8,0x38,0xc1,0xdf,0xef,0xc1,0x08,0x9b,0xd3,0xf4,0xf4,0xea,0x56,0x86,0xff,0xbd,0x9d,0x7c, - 0x78,0x4b,0x1d,0xbe,0x0d,0xcc,0xd1,0x5e,0x98,0xaa,0xc3,0xee,0x83,0xe3,0xf7,0x4c,0xda,0xf4,0xaa,0xa5, - 0xd5,0x64,0x96,0xed,0x41,0x9a,0xf7,0x52,0xb3,0x47,0x1f,0x47,0xa3,0xcb,0x90,0x9e,0x52,0x73,0xa0,0xfe, - 0x43,0x1a,0x0f,0x52,0x43,0xdb,0x0e,0x8e,0x4f,0xfe,0x60,0x2f,0x1a,0x75,0x5e,0x5b,0x79,0x3d,0x7f,0x9d, - 0x41,0xaf,0xd4,0x96,0x7e,0xcf,0x3f,0x10,0xe1,0xb0,0x0a,0xbe,0x23,0xe6,0x8c,0xc8,0x90,0x8d,0x7c,0x07, - 0x44,0x0f,0xc1,0xbb,0x95,0xc8,0x47,0xbc,0x55,0x12,0x95,0x5b,0x12,0x5f,0x01,0x11,0xeb,0x9b,0x87,0x06, - 0x92,0x83,0xc7,0x66,0x6d,0x3b,0x8d,0x72,0x5b,0xb2,0x1c,0x5d,0xd0,0x16,0x3c,0xa8,0xf2,0x94,0xaf,0x23, - 0x62,0x90,0xfa,0x38,0x4b,0xc8,0xc2,0x52,0x90,0xdc,0x09,0x93,0x6b,0x6b,0x57,0xda,0xed,0x43,0xfd,0xdd, - 0x82,0x7e,0x2f,0x99,0x5c,0x47,0x82,0x11,0x1f,0x8e,0x4f,0x70,0xcd,0xf1,0xe1,0x31,0x40,0x8e,0x8b,0xf3, - 0xef,0xd3,0x61,0x22,0x14,0xef,0xc3,0x9f,0x80,0x43,0xed,0x0f,0x7f,0xc2,0x17,0x2f,0x05,0x87,0xe6,0x0f, - 0xf7,0xb6,0x68,0x89,0xd2,0x58,0xc8,0x98,0x1f,0x12,0x62,0x5b,0xc7,0xfe,0x24,0x21,0x0f,0x65,0x5b,0x3a, - 0xac,0x72,0x51,0x49,0xa4,0x0e,0x7f,0x29,0xfd,0xc5,0xe1,0x63,0x10,0xed,0xe3,0x54,0x28,0x61,0x3f,0xa0, - 0xe5,0xa2,0x8e,0xfe,0x3c,0xb1,0x85,0xeb,0x1f,0x20,0xa2,0x4e,0xae,0x95,0xcc,0x77,0xbc,0x75,0x5c,0xe5, - 0x92,0xd3,0x21,0xe2,0x07,0x32,0x3d,0x93,0x02,0xb4,0x8a,0x6c,0x19,0xef,0x90,0x58,0x8c,0xf3,0x43,0x2d, - 0x44,0x7f,0x3a,0x79,0x8d,0xf6,0xe9,0x87,0x5f,0x7f,0xdc,0xaa,0x30,0xcb,0xfb,0x01,0x1f,0xff,0xa8,0x7d, - 0x97,0x08,0xc8,0x28,0x54,0x6c,0xdc,0x8f,0xbb,0x27,0xcd,0x1f,0x77,0x17,0x53,0x00,0xeb,0x4c,0x8f,0x2d, - 0xc0,0xcc,0xfb,0x1b,0x92,0x46,0x2d,0x41,0x80,0x58,0x5c,0xda,0x31,0xcd,0x6e,0xb4,0x4f,0xf2,0x9e,0xa2, - 0x18,0x3f,0xee,0x6d,0x97,0x07,0xfb,0xdf,0x93,0xcc,0x94,0xe9,0x5d,0xf2,0x10,0xc4,0x91,0xaa,0xbd,0x52, - 0xe5,0xac,0x45,0xf6,0x3d,0x49,0xf7,0xe3,0x89,0x3a,0x19,0xa1,0x9c,0x2d,0x7b,0x0a,0xae,0x02,0x22,0x78, - 0x99,0x5c,0xbc,0x1d,0x7d,0xda,0xdf,0xed,0x26,0xe1,0x4d,0x8d,0xa4,0x06,0x7a,0x7d,0xb3,0x77,0x74,0x7c, - 0xa2,0xdf,0xd7,0xf5,0xbd,0x5c,0xe3,0x32,0xcd,0x76,0x69,0x42,0x5d,0xf7,0x34,0xf4,0x8b,0x33,0xcf,0x98, - 0xfc,0x27,0xdd,0x42,0x9b,0xfa,0xd7,0x1c,0x6f,0x5d,0x7d,0xcf,0xae,0x1b,0x43,0x3f,0x39,0x6d,0x9e,0x79, - 0x7e,0x62,0x3e,0x2e,0xba,0x1b,0xd2,0x1e,0xe7,0x17,0x7e,0x08,0x65,0x07,0xe5,0x76,0x80,0xbe,0x3c,0x28, - 0xdb,0xbd,0x9c,0x24,0x7c,0xf7,0x5b,0x2b,0xbe,0xbe,0x19,0x15,0xb4,0x34,0xdd,0xd0,0xbb,0x8b,0x2e,0x5d, - 0x2e,0xd5,0x18,0x06,0x39,0xbd,0x7b,0xe2,0x57,0x40,0xbe,0x6c,0x0c,0xd0,0xa2,0xc7,0x7e,0x13,0x8a,0x6e, - 0x32,0x89,0xe3,0xf5,0x22,0xbb,0xbd,0x2b,0xb8,0xc6,0xbd,0xa4,0x88,0x1b,0xd0,0x63,0x85,0x2a,0xac,0xf8, - 0x9d,0x75,0xe1,0xf2,0xc0,0x67,0x5b,0x7d,0x38,0x71,0xe9,0x84,0xbe,0x7e,0x14,0x37,0xb0,0x50,0x2d,0xfc, - 0x78,0x79,0x49,0x70,0x3a,0xf7,0xde,0x7d,0x2f,0x28,0x08,0x7c,0x02,0xe1,0xbe,0xd2,0xa6,0xf4,0xb2,0xf0, - 0xfc,0xe2,0x5e,0x77,0xe2,0xc3,0xd6,0xc1,0xee,0x71,0xf7,0xb4,0xd1,0x68,0xa8,0x9e,0xc2,0x8b,0xa8,0xeb, - 0x9d,0x35,0x2e,0xa3,0x98,0x36,0x56,0xa8,0x79,0x58,0x5d,0xf2,0x1a,0x39,0x51,0x1d,0xd7,0xb3,0xfb,0x2b, - 0xad,0x72,0xbd,0xe5,0x18,0x97,0x9f,0xac,0xd3,0x28,0x3c,0x49,0x74,0xdf,0x9b,0x6a,0xf4,0x82,0x2e,0x8f, - 0x32,0x75,0xec,0x24,0x3d,0x84,0xce,0x8d,0x5b,0x78,0x0d,0xb8,0x90,0x46,0x83,0x8e,0xdd,0x35,0xf8,0x60, - 0x08,0x1b,0xc5,0xed,0x38,0xf4,0x1a,0xd7,0xb4,0x1f,0x87,0x7e,0xd4,0x5d,0xa1,0xbd,0xc2,0x3d,0x5d,0xae, - 0x9f,0x79,0xee,0xe7,0xfe,0xb2,0xe7,0x6e,0x76,0x3a,0xfc,0xe0,0x6d,0xae,0x34,0xc2,0x2f,0x61,0xcf,0x0d, - 0xb4,0x13,0x87,0x5a,0xb4,0xe9,0x3a,0x75,0xd4,0x11,0xc1,0x83,0x43,0xbd,0xd5,0x69,0x79,0x4f,0xdd,0xe7, - 0xcd,0xa7,0x1f,0x58,0x83,0xc0,0x8d,0x4e,0xdb,0x67,0xde,0xb2,0x79,0x59,0x3d,0x9b,0x4e,0x9b,0x9e,0xd7, - 0x69,0xaa,0xf1,0xd1,0xbd,0x3b,0x2e,0x32,0xb8,0x8d,0xe0,0x85,0xb6,0xec,0x86,0xaf,0x9a,0x9b,0x54,0x69, - 0xc7,0x59,0x76,0xbc,0x65,0xe2,0xdb,0x87,0x8d,0xcb,0x38,0xa5,0xce,0xf2,0x63,0x70,0x81,0xb9,0x5e,0x79, - 0xde,0xf4,0x96,0xed,0x84,0xdf,0x3f,0xa7,0x6f,0xe8,0x0b,0xe5,0x70,0xa2,0x9a,0xe3,0x35,0xc6,0x41,0x9f, - 0x55,0x8a,0xdc,0xb6,0xef,0x34,0x1d,0xaf,0xe3,0x38,0x95,0x31,0x86,0xbb,0xa8,0x10,0xf3,0xa9,0xfd,0x56, - 0x00,0x4b,0x80,0x20,0x3e,0xc6,0xda,0x9a,0x01,0x3f,0xe8,0xbe,0x78,0xbe,0x16,0x3e,0x63,0xbc,0x8a,0xba, - 0x89,0x9f,0xd3,0xff,0x99,0xe0,0x17,0x8d,0xb7,0x8b,0xe4,0xb4,0xdb,0x5a,0x4f,0x5f,0x75,0x57,0x9f,0x3f, - 0x5f,0x4f,0x97,0x97,0x75,0x9d,0xb1,0x5d,0x91,0xae,0xde,0x5d,0x2e,0x96,0xd3,0xa7,0x81,0x47,0xb3,0xd8, - 0x65,0x90,0x49,0x1e,0x71,0x23,0x3f,0xf6,0xa8,0x5e,0x79,0x0f,0xbe,0xb8,0x39,0xde,0xd1,0x02,0x8d,0x72, - 0xb6,0xb4,0x14,0x3f,0xe9,0x76,0x93,0xa5,0x25,0x37,0xeb,0xce,0xd5,0xa2,0xb0,0xf1,0x0e,0xae,0xac,0x12, - 0xbf,0x9f,0x17,0x9d,0x7c,0x23,0x5a,0x5a,0x4a,0xe8,0xc3,0xdc,0xef,0x71,0xc0,0xf1,0x1c,0x49,0x1c,0xe3, - 0xb8,0x93,0xdd,0xab,0x59,0x38,0xfe,0xe9,0xf8,0x4d,0xf7,0x0e,0xd1,0x7e,0x8f,0xf3,0x88,0xf5,0x8b,0xf0, - 0x4c,0xd4,0x41,0xfd,0xfc,0x18,0xbd,0x89,0x6a,0x2a,0x24,0xea,0x94,0x63,0xa0,0xc1,0x43,0x18,0x88,0x66, - 0x04,0xb5,0x52,0x9d,0x55,0x83,0x86,0x1f,0xe1,0x11,0x6b,0x41,0xc2,0xbe,0xa5,0x31,0x45,0xb9,0x5a,0xc5, - 0xfb,0xb9,0xf2,0xb8,0x5a,0x06,0x20,0xf4,0x38,0xcc,0xf0,0x61,0x20,0x6e,0x1d,0x54,0x8b,0x79,0xd8,0xcb, - 0xc2,0x42,0x37,0x0d,0x0d,0x43,0x6a,0xa0,0x2f,0x6d,0x1f,0xca,0x9b,0xe8,0x79,0x06,0xd7,0x61,0x8d,0x1d, - 0xb0,0x42,0xdd,0x13,0x81,0x0e,0xc4,0x70,0x11,0x8e,0x0a,0xcd,0x67,0x8d,0x29,0x9c,0xf3,0xd5,0x62,0x0e, - 0xac,0x24,0xee,0x81,0x45,0x03,0xa3,0xf4,0x61,0xa8,0xeb,0xac,0xc6,0x8c,0xf7,0x38,0x42,0x32,0x7b,0xe1, - 0x2c,0x41,0x53,0x4a,0x10,0x3a,0x2c,0xe2,0xb4,0x0c,0x9f,0x2c,0x8e,0x08,0x95,0x89,0x95,0x1e,0x13,0x77, - 0xb4,0xf3,0xe1,0xd8,0x6b,0xd4,0x76,0x19,0xc8,0x2e,0x94,0x1c,0x23,0x00,0xc7,0xba,0x65,0x28,0x78,0xb0, - 0xf5,0xba,0x16,0xf4,0x39,0xe4,0x32,0x8d,0x17,0x7b,0x99,0x86,0x43,0x21,0x15,0x22,0x52,0x7f,0xce,0x3d, - 0xe8,0x56,0x82,0xe4,0x8a,0x1b,0x9d,0x0c,0x15,0xe8,0x90,0xcd,0x00,0x39,0xc1,0x6a,0x82,0x7e,0xa4,0x0d, - 0xb3,0xb1,0xa8,0xe5,0x9c,0xda,0xde,0xe1,0xf4,0x0d,0xc7,0x6b,0xdd,0x3b,0x34,0xba,0x57,0x3b,0xef,0x5e, - 0x1f,0xd6,0xdc,0x2c,0xec,0xb1,0xdb,0xe2,0x7e,0xd8,0xf7,0xb4,0x0e,0x96,0xe4,0xd0,0x28,0x5f,0xa6,0x98, - 0x47,0x36,0x75,0x8a,0xc6,0xf3,0x43,0xb2,0x77,0xa8,0x3b,0x32,0xb5,0xa3,0x48,0x3b,0x70,0x2e,0xa3,0xdc, - 0x5e,0xe4,0x57,0xb0,0x7d,0x0a,0x94,0x71,0x96,0x5f,0x0b,0x1b,0x83,0x46,0xad,0xf5,0xb2,0xdd,0x68,0x3d, - 0x7f,0x41,0x7b,0xfd,0xb3,0x26,0x89,0x4f,0x8d,0x29,0x02,0x46,0x1d,0x50,0x59,0x89,0x08,0x79,0x88,0xe8, - 0x0c,0x28,0x2c,0xd1,0x1d,0x66,0x4b,0x13,0xd1,0x86,0x51,0xd3,0xde,0x25,0xfc,0xad,0xa9,0xae,0xc3,0x8f, - 0x63,0xd0,0xef,0xf0,0x8a,0xa5,0x9d,0x09,0x14,0x32,0x9c,0x4e,0x9f,0xd0,0xce,0x34,0xb9,0xa0,0x42,0x9a, - 0x58,0x86,0xeb,0x9a,0x9e,0xfe,0x07,0x57,0xe7,0xe9,0xcd,0x8b,0x3a,0xc9,0x6a,0x78,0x42,0xba,0xbc,0x46, - 0x16,0xf6,0x27,0xbd,0xd0,0x55,0x55,0x86,0xaf,0x5e,0xbd,0x98,0x16,0xde,0xc6,0xc6,0x46,0x93,0xff,0x68, - 0x6a,0xd8,0xa4,0xb5,0xe9,0x26,0xcb,0xad,0xa5,0xc4,0xdb,0xa4,0x3d,0x64,0xd9,0x59,0x21,0x72,0xb6,0x0a, - 0x5f,0x4c,0xb4,0x96,0x59,0xdd,0x5f,0x28,0x53,0x9c,0x0e,0xda,0x28,0xe7,0xd1,0x9a,0x65,0xfd,0xab,0x22, - 0xbc,0x11,0x4d,0xc5,0xea,0x90,0xbe,0x95,0x8c,0xa9,0xfa,0x65,0x0b,0x96,0x09,0x89,0xa5,0xb7,0x35,0xf8, - 0x78,0xad,0x51,0x8d,0xf0,0xc9,0x35,0x3d,0x08,0x59,0x6d,0x0f,0x57,0x99,0x47,0x92,0xb4,0x70,0x54,0xa8, - 0x25,0xe9,0x24,0x1a,0x12,0x6b,0xe5,0xb2,0xa9,0x63,0xce,0xe1,0x39,0x9a,0xca,0xf3,0x57,0x3c,0x63,0x02, - 0x61,0xda,0x96,0xe4,0xad,0x79,0xf0,0x08,0x37,0x6b,0xad,0x29,0xff,0xd5,0xe8,0x2f,0x5e,0xff,0x68,0x95, - 0x2d,0x82,0x93,0x17,0x7f,0xae,0x8b,0x8c,0x7e,0x35,0xd4,0xd4,0x7a,0x7b,0x71,0xeb,0x6d,0x6e,0x1d,0x0c, - 0xde,0x1b,0x6a,0x8e,0xd5,0xdc,0x23,0xb1,0x97,0x11,0x35,0x6c,0x28,0x5b,0xb2,0xa5,0x00,0xf4,0x39,0x83, - 0x24,0x67,0xe7,0x2a,0xbb,0x59,0x1e,0x14,0x5f,0x95,0x95,0x0f,0xc7,0x27,0x80,0x4e,0xb6,0xd6,0xe2,0x14, - 0x47,0x78,0xe2,0xf0,0x60,0x21,0x34,0x80,0x42,0x05,0x37,0xd3,0x4e,0xf4,0x4a,0xd8,0x8c,0xe6,0x9c,0x2a, - 0x51,0x2b,0xa4,0xc8,0xd4,0x8a,0x21,0x54,0x87,0xe7,0x95,0x18,0xde,0xd4,0x6d,0xb7,0x2b,0x44,0xc0,0x6e, - 0x82,0x48,0x5c,0x5e,0x30,0xd9,0x0b,0x8a,0x1a,0x42,0x38,0x6a,0xd3,0x44,0x04,0x16,0x80,0xfa,0x83,0x58, - 0x66,0x17,0x08,0xfd,0x99,0x16,0xf9,0x38,0x2d,0x6c,0x0f,0x2d,0x17,0x61,0xa4,0x95,0x67,0xa1,0x5b,0x0e, - 0x82,0x49,0x94,0xee,0x06,0xde,0xd9,0x0b,0x8e,0xed,0xe3,0x53,0x11,0xb1,0x62,0xcc,0x6a,0x76,0x08,0xed, - 0xfa,0x3b,0xa9,0x4c,0x5c,0xce,0x0d,0x8d,0x8e,0xed,0x33,0xe5,0xdb,0xa5,0xd5,0x0e,0xd7,0x2a,0xda,0xb5, - 0xe8,0xef,0x51,0x1a,0x8c,0x8e,0xf2,0x3c,0x5a,0xd4,0x7f,0xe4,0x29,0x77,0x0b,0xca,0x97,0x85,0x0a,0xf7, - 0x07,0x0d,0x74,0x36,0x4c,0x80,0xbf,0x8b,0x5a,0xd0,0xeb,0xc1,0x49,0xd0,0x38,0xa5,0x1d,0x41,0x59,0x66, - 0xa1,0x7f,0xd1,0x00,0x6a,0x07,0xec,0x80,0x86,0x12,0xa2,0x1c,0x1a,0xb8,0x57,0xe2,0x2f,0x85,0x55,0xe9, - 0xb6,0xe4,0xb3,0x43,0xf9,0x4c,0xd5,0xaf,0x67,0x14,0x8e,0xb4,0xa5,0x82,0xbe,0x31,0x32,0xcf,0xd3,0x9a, - 0x8a,0xd4,0xce,0xca,0xe4,0x5c,0x13,0x6b,0xda,0x49,0x37,0xeb,0x2f,0x45,0x31,0x52,0xab,0x45,0xf6,0xb7, - 0x47,0xdc,0xc9,0xf0,0x02,0x67,0x09,0xdc,0xbf,0xf0,0xc2,0xee,0x1e,0x92,0xa7,0x87,0xb2,0x0d,0xbd,0x3b, - 0x39,0x39,0xac,0xc1,0x41,0xb6,0xd8,0x6a,0x45,0x08,0xfa,0x42,0x1d,0xbd,0x84,0x0e,0xb6,0xdb,0x0f,0x2f, - 0x83,0x49,0x5c,0xd4,0x5e,0x10,0x17,0x32,0x45,0xc9,0x3a,0xfb,0xc1,0x54,0xde,0x0d,0x3f,0x96,0xae,0x2f, - 0x6b,0xae,0x09,0x15,0x8c,0xb2,0x15,0x95,0xc9,0xe7,0xcf,0x9e,0xad,0x2a,0x3f,0x48,0xc3,0xdd,0x04,0xc1, - 0x43,0xfa,0x25,0x4c,0x86,0xba,0x4b,0x0e,0x61,0xd3,0x20,0x4a,0xa6,0xe2,0x64,0x93,0xfd,0x21,0x2a,0x57, - 0xb4,0x8e,0x8a,0x3c,0x40,0xf4,0x97,0x8b,0x18,0x95,0xfc,0x4f,0x7b,0xda,0x1b,0x49,0x43,0x7d,0xc6,0x56, - 0x43,0x94,0xac,0x7d,0x8e,0xb0,0x02,0x5f,0xa2,0xec,0x49,0x01,0xc4,0xa7,0x5c,0x0c,0xe5,0x15,0x04,0xb2, - 0x20,0x91,0xc8,0x7b,0xe2,0x76,0x98,0x4c,0x8a,0xaf,0xf2,0x02,0xc2,0x10,0x86,0xb4,0x9f,0xd0,0x5a,0xec, - 0x95,0x6d,0x47,0x88,0x7f,0x2b,0x81,0x10,0x88,0x2e,0xa8,0x20,0xf4,0x39,0xbc,0x71,0xf5,0xd9,0x64,0x42, - 0xe0,0x50,0xed,0x0a,0xea,0xea,0xb6,0x0d,0xaf,0xc0,0x6d,0x1b,0x56,0xe1,0x50,0x73,0x09,0xff,0x5f,0x32, - 0x08,0xa3,0x5f,0x8a,0xc2,0x9a,0x10,0xbc,0x2e,0x98,0x11,0x78,0x32,0x9d,0xe2,0x4f,0x75,0x3e,0x0c,0x89, - 0x10,0x7f,0x46,0x17,0xe2,0xa5,0x93,0xd7,0x8c,0x6c,0x82,0x7d,0x09,0x4e,0x76,0xc5,0xfe,0x35,0xa1,0x57, - 0x6e,0xc2,0x27,0xea,0xb6,0xd9,0x6f,0xa8,0xd5,0xb0,0x4c,0x84,0xfa,0x06,0xdc,0xcb,0x54,0x39,0x3b,0x45, - 0x41,0xd9,0xa3,0x53,0xc9,0x10,0x06,0x0d,0xef,0x20,0x05,0x9a,0x8b,0xd1,0xf5,0x6a,0xac,0x57,0xf5,0x1a, - 0xb4,0x57,0x35,0x03,0xd9,0x75,0xcd,0x6a,0x11,0xb4,0x5e,0xbc,0x58,0x05,0xf3,0x33,0x82,0x0f,0x53,0xe9, - 0x0a,0xec,0x1f,0x90,0x0a,0xdf,0x16,0x30,0xd4,0x63,0x82,0x2f,0x71,0xe3,0xae,0x94,0x7f,0x88,0x79,0x14, - 0x47,0x8b,0x1a,0xbb,0xaa,0xbd,0x7a,0x08,0xbd,0xec,0x49,0x56,0xc4,0x5f,0x0d,0x65,0x20,0x7e,0xbe,0x24, - 0x12,0x7c,0x4a,0xcc,0x8c,0x50,0x9b,0x99,0xf9,0x36,0xdb,0x80,0xea,0x9c,0x0a,0x1c,0x9f,0xc0,0xa3,0x2a, - 0x6c,0x54,0xca,0x50,0x1a,0x6a,0x6c,0x14,0xfe,0x29,0xe8,0xfe,0xff,0x47,0xc0,0x43,0xe6,0xa6,0xe6,0x07, - 0xec,0x24,0x1d,0x13,0xb3,0xa7,0x0c,0xe1,0xf9,0xa5,0xae,0x98,0x29,0xa0,0xa6,0x61,0x48,0xaf,0x23,0x5a, - 0x97,0x7b,0x3b,0x0a,0x88,0x6e,0x4d,0x45,0x5e,0xaa,0x53,0x12,0x58,0xe0,0x60,0x87,0xd8,0x4d,0x28,0xf7, - 0xde,0x2e,0xc2,0xf0,0x77,0x5b,0x44,0xca,0x54,0xfe,0xf4,0xdd,0x56,0xdd,0x14,0x66,0xad,0xdc,0x44,0xd9, - 0x76,0xb0,0xad,0x2f,0xb7,0x43,0x83,0xf0,0x8e,0xcf,0x4e,0x69,0xdb,0x50,0x8e,0xb1,0xa4,0x3d,0xc6,0x92, - 0x6a,0x16,0xcd,0x04,0x3b,0x57,0x15,0x56,0x3c,0x78,0xa8,0x9b,0x04,0x82,0xea,0x23,0xb5,0x3f,0xdf,0xc1, - 0x21,0xd5,0x19,0x94,0xad,0xa9,0x4e,0x56,0x53,0xc1,0x37,0x17,0x63,0x71,0x65,0xcb,0x56,0x2d,0x11,0x63, - 0x96,0x6a,0xe0,0x03,0x91,0x77,0x61,0x5a,0xa6,0xa5,0xc7,0x5b,0x6d,0x48,0x9b,0x13,0x83,0xd3,0x0b,0x1b, - 0xb5,0x1d,0xa1,0xf3,0x1d,0x5a,0x1b,0x69,0xdc,0xa0,0xda,0x1a,0x69,0x36,0x60,0xab,0xc8,0xe2,0x17,0xf6, - 0x40,0xdc,0x30,0xa1,0xe0,0x67,0xca,0xc0,0xb0,0xe1,0xeb,0x07,0x25,0x65,0xe8,0x96,0xbf,0xaa,0xfa,0xe1, - 0x1f,0x77,0xaa,0x1d,0xe5,0xb2,0xe5,0x4f,0x0f,0xee,0x0c,0xd9,0xff,0x92,0xf1,0x26,0x49,0x52,0xe0,0xad, - 0x72,0x60,0x17,0x5c,0xb3,0x0f,0x17,0xde,0x5c,0xd9,0x37,0xac,0x08,0x0c,0x3d,0x30,0x63,0xa0,0xee,0xf0, - 0x58,0xa4,0x1d,0x36,0xb1,0x8f,0x34,0x5d,0x85,0x38,0xd1,0xad,0xaf,0x94,0x0e,0x73,0x6b,0x3a,0x2c,0x83, - 0x2d,0x76,0x60,0xd1,0x8a,0x0c,0xd3,0x21,0x81,0xdd,0xbd,0x2b,0xbe,0x76,0xd4,0xc1,0x86,0x1c,0xb8,0x4c, - 0xa7,0x72,0x68,0x76,0x0f,0xb3,0x15,0xca,0x5c,0xc0,0x69,0xea,0x6e,0xd5,0xb2,0x49,0x5c,0xf6,0x2d,0xa9, - 0x1f,0x85,0x03,0xf6,0xce,0x00,0xef,0x7a,0x50,0x8b,0x17,0x67,0xb1,0x54,0xc1,0x58,0x3c,0xc8,0x5a,0x9b, - 0x2f,0x6b,0xcd,0xdf,0x20,0x7f,0xca,0xcf,0xf5,0x6d,0xf6,0x23,0xcb,0x22,0xe9,0x17,0x76,0x9c,0xdb,0xcb, - 0xd2,0x3c,0x67,0xf6,0x4f,0x19,0x9c,0x71,0x86,0x98,0x0c,0x63,0xa5,0xb3,0xdb,0x59,0xf1,0xb7,0x2a,0x6e, - 0x6b,0xab,0xd4,0xa8,0xd5,0x7e,0x51,0xb1,0x7c,0xe2,0x4a,0xf2,0x87,0x81,0xc9,0x05,0x8e,0x5c,0x31,0x74, - 0xa3,0x20,0xb9,0x95,0x86,0x09,0x14,0x98,0xa1,0x0c,0x03,0x6a,0xaa,0x2f,0x9c,0x9a,0xc4,0xce,0x51,0xce, - 0x72,0x09,0x93,0xae,0x60,0x2c,0xa4,0x5c,0xfa,0xce,0x02,0xa1,0x9b,0x66,0x96,0xce,0x6e,0xde,0xd8,0x31, - 0xbd,0x61,0x3e,0x77,0x7f,0x77,0x07,0x6c,0x6d,0xc1,0xde,0x83,0x79,0x6b,0xc9,0xe0,0x54,0x5f,0xb9,0xb3, - 0x08,0x6a,0x3d,0xde,0x87,0x82,0x2c,0x63,0xcd,0xe5,0x80,0xd6,0xc1,0x6e,0xef,0x2a,0xf4,0xd9,0x61,0xbf, - 0x8a,0x3d,0xc2,0xf1,0x72,0xaf,0x82,0x0b,0x44,0xab,0x4c,0xd8,0x0d,0xab,0x65,0xba,0x54,0xa4,0xe3,0x7d, - 0xb1,0xc5,0x24,0x3a,0x22,0x66,0x98,0x1f,0xe1,0xd8,0xa1,0xb4,0xbd,0xa4,0x12,0x47,0xca,0x2c,0x01,0x45, - 0xc4,0xf4,0x92,0xcb,0x68,0x83,0x4b,0x36,0x4b,0x2d,0x08,0x93,0x54,0x4d,0xdb,0xfc,0x22,0x95,0x7d,0xe2, - 0xed,0xad,0xac,0x4d,0x0a,0xea,0x0a,0x55,0x49,0xa9,0x53,0x8a,0xda,0x56,0x9c,0x0a,0x5b,0x70,0xf0,0xb3, - 0x70,0x88,0x24,0xcb,0x32,0x56,0xfd,0x41,0x39,0x52,0x9e,0x54,0x7d,0xcf,0x61,0xe6,0x98,0x38,0x17,0x59, - 0x44,0x3d,0x98,0x70,0xf4,0x3e,0x48,0xab,0xca,0x92,0x38,0x12,0x8f,0x05,0xc7,0x70,0x7a,0x37,0x80,0x98, - 0x2e,0x78,0x38,0x67,0xb5,0x0a,0xc7,0xd0,0x20,0x7f,0xc2,0xd6,0xc3,0x5c,0x98,0x12,0xa6,0xbb,0x49,0xc1, - 0x46,0xc7,0xca,0x6b,0x7d,0xac,0xac,0x14,0x7b,0x69,0x3c,0x19,0x25,0xd5,0xf2,0x2a,0xad,0xf2,0xc9,0xf1, - 0x58,0xe2,0xb6,0x94,0x3d,0x66,0xc3,0x0e,0xe3,0xb2,0x68,0xae,0xd7,0x84,0x08,0x6c,0x11,0x93,0x29,0xbf, - 0x45,0x70,0x2b,0x0d,0x9b,0x95,0xac,0xe2,0xb8,0x68,0xfb,0x56,0x3b,0x36,0xaa,0x85,0x5f,0xc6,0xec,0x2f, - 0x1c,0x46,0x70,0x96,0xa5,0x26,0xa2,0x79,0x2a,0x33,0x95,0x4c,0x04,0x89,0xb0,0x86,0xaf,0x6c,0x0f,0x48, - 0x56,0xe7,0x07,0x19,0xb8,0xb2,0xb7,0x47,0xdb,0x62,0x91,0x3b,0xc0,0xdb,0xd1,0x5b,0xf5,0x76,0x81,0x61, - 0x3e,0xda,0x7e,0xcb,0x6f,0x83,0x0b,0xb6,0x30,0xda,0x3e,0x92,0x19,0xcf,0x90,0xb7,0x7d,0x24,0x79,0x17, - 0x03,0xe6,0x36,0xde,0x1e,0x59,0xfd,0x25,0xba,0x3b,0x66,0xc5,0xc7,0xd0,0xee,0x6f,0x79,0xb6,0x61,0xb2, - 0xa7,0xe5,0x23,0xf6,0x01,0xcb,0x8d,0x14,0x26,0xb5,0x36,0x80,0x3c,0x08,0x51,0xf1,0x06,0xde,0x95,0x6b, - 0xee,0xd7,0x68,0xf0,0x35,0x18,0x10,0x77,0xfe,0x3d,0xdc,0x5b,0xc2,0xe5,0x21,0xf5,0x50,0x5c,0x98,0xa8, - 0x40,0x3c,0x6c,0x25,0x7d,0xf3,0xd7,0xbf,0xc0,0xc4,0xd7,0xfd,0x53,0xd4,0xbb,0xfa,0x4a,0x5f,0xf3,0x39, - 0x88,0x4c,0x04,0x56,0xb7,0xf2,0x1b,0xb8,0x10,0x34,0x95,0x27,0x64,0x60,0xfa,0x9e,0x63,0x5b,0x4c,0x46, - 0xf0,0x2e,0xc8,0x74,0xf1,0x84,0x3d,0x1c,0x60,0x81,0xb2,0x5a,0x41,0x5e,0x8e,0x3e,0x96,0xaa,0x98,0xec, - 0xb1,0xf9,0x61,0x08,0x77,0x01,0x08,0x65,0xf6,0x9e,0x97,0xe9,0x05,0x6c,0x68,0x0b,0xf1,0xc0,0xa5,0x1d, - 0x86,0x97,0x71,0x84,0x77,0x39,0x3e,0x85,0x0d,0xe2,0x37,0x06,0x70,0x0b,0x07,0xd2,0x49,0x20,0x6e,0x48, - 0x85,0xa8,0x69,0xc9,0xad,0xaf,0x1b,0x98,0x1d,0xcf,0xb1,0x32,0xcf,0x25,0xb6,0x0f,0x1c,0x6a,0x5f,0x5c, - 0x78,0xd2,0x6f,0xeb,0x45,0xf3,0x9f,0xff,0x49,0x86,0x34,0xd7,0x63,0x6a,0x6c,0x79,0xc1,0xe1,0x70,0x01, - 0xe2,0x71,0xfa,0x59,0x88,0x78,0x6a,0x29,0x47,0xca,0x12,0x1e,0x2b,0xca,0xb2,0x34,0x5b,0x08,0xe2,0x01, - 0x67,0x4d,0x11,0x0d,0x83,0xf6,0x8a,0xc4,0xf8,0x8b,0xe4,0x01,0x8b,0x7a,0x6c,0xf2,0x17,0xdb,0xc6,0xdf, - 0x8d,0xe9,0xfb,0x68,0x3c,0x16,0x9b,0x2b,0x8e,0x76,0xc6,0x24,0x66,0x45,0xa8,0x07,0x1a,0x13,0x78,0x17, - 0xcf,0x1a,0x67,0x09,0xa0,0x53,0x01,0x17,0xc0,0xf2,0x94,0x7d,0x1a,0xe7,0xd0,0xd9,0x43,0x9c,0x00,0xb1, - 0x66,0xcd,0x6f,0x02,0x05,0x07,0xb7,0x8f,0x24,0xb1,0xda,0x16,0x7f,0x8f,0x8d,0x29,0xb7,0x2e,0x3e,0x95, - 0x10,0x06,0x78,0x7c,0xe9,0xd7,0x0a,0x12,0x40,0x39,0x36,0x0c,0xdc,0xa9,0xb1,0xac,0xc5,0x70,0x85,0xe2, - 0xf0,0x51,0x86,0x22,0xa9,0xba,0xbd,0x1d,0xde,0xd8,0x5b,0xcf,0x01,0x91,0x27,0xcb,0xe3,0xed,0x01,0xcc, - 0xc8,0x2a,0x9e,0x6e,0xd9,0xd3,0x73,0x8d,0x8f,0x1a,0xc4,0xd1,0x64,0xd5,0x47,0x6e,0x83,0x89,0x69,0x36, - 0x60,0xaf,0xe9,0x8b,0x9c,0xa6,0x2f,0xf2,0xc5,0x4b,0x4f,0x8f,0xc2,0x14,0x7c,0xa9,0xc0,0x14,0x7c,0x99, - 0x81,0x89,0x3d,0x4c,0x3c,0x06,0x13,0x64,0xe2,0xdf,0x06,0x52,0xdc,0xcf,0xde,0x04,0x3d,0xe5,0x43,0xac, - 0x0a,0xce,0xfe,0xce,0x51,0xed,0x92,0xf3,0xa6,0xf4,0x48,0x04,0xf0,0x8a,0x03,0x37,0x39,0xc7,0x30,0x93, - 0x54,0x13,0x66,0xb9,0xfe,0x85,0xb9,0x6f,0x9f,0x9d,0x70,0x1e,0x13,0xa7,0x24,0x61,0x12,0x69,0xbe,0xf6, - 0x4b,0xe7,0xbf,0xf5,0x03,0x02,0xf2,0x26,0x9c,0xf5,0xd8,0xda,0x6a,0x5a,0x56,0x8d,0x04,0xcf,0x5b,0x6d, - 0x52,0x39,0x0f,0x0e,0x5b,0x5b,0x32,0x34,0xf3,0x76,0x95,0x11,0x98,0x30,0x2c,0x7a,0xb8,0xbf,0x40,0xd0, - 0x3d,0x81,0xae,0x51,0x6b,0x35,0xcc,0xd9,0xc7,0xac,0xa9,0x25,0x73,0xce,0x34,0x9a,0x05,0xcc,0x2e,0x47, - 0x02,0x2b,0x7d,0xe0,0xcf,0x1c,0x71,0x34,0x5a,0x0b,0x01,0xfd,0x98,0xbc,0xe5,0x83,0x49,0x03,0x6b,0xe9, - 0xf9,0x91,0x60,0x25,0x06,0xf1,0xed,0x87,0x1d,0x00,0x0b,0x56,0x81,0x1e,0x95,0x9d,0xb4,0x92,0xb3,0x2a, - 0x43,0x17,0x71,0xf4,0x68,0x5a,0xfb,0x34,0x9f,0xda,0xb7,0xc9,0x31,0xc7,0x0f,0xb2,0x64,0x2c,0x6b,0x24, - 0x69,0xf1,0xc3,0xef,0xcf,0x01,0xa4,0x1e,0x3b,0xb6,0x81,0x72,0xb0,0x53,0xa2,0xc4,0xf1,0x28,0x25,0xfa, - 0xa7,0x76,0xf7,0xea,0x78,0x96,0x98,0x58,0xcb,0x75,0x29,0xcb,0x39,0x75,0x5e,0xdf,0xf9,0xeb,0x5f,0x46, - 0xe3,0x4b,0xb5,0xbf,0xeb,0x61,0xee,0x89,0xda,0x78,0x46,0x02,0x16,0x22,0xe9,0xb2,0x67,0x09,0xee,0x89, - 0xba,0x23,0xb1,0xc6,0x38,0x9b,0x0c,0xd9,0x47,0x14,0x6d,0x08,0x90,0xdd,0xd9,0x8f,0xc2,0xa5,0xf4,0x42, - 0x1d,0x3b,0xcd,0x58,0xcc,0xcf,0x1c,0x93,0x29,0x9b,0xe0,0x9d,0x08,0x6a,0xf2,0xd9,0x11,0x4c,0x77,0x17, - 0xf4,0x42,0x99,0x05,0xf7,0xa5,0x94,0xd8,0x05,0x9f,0x80,0x47,0xc8,0xb4,0x63,0x05,0x81,0x8c,0x7d,0x9d, - 0xc8,0xd0,0xc3,0x4d,0x8b,0x72,0x38,0x8a,0x81,0x47,0x90,0x79,0xf1,0x8a,0xa3,0x22,0x21,0xe9,0x31,0xc7, - 0xde,0x90,0xa5,0x5f,0x51,0x54,0x39,0xa3,0xbe,0xe4,0x80,0x21,0xda,0xa7,0xc2,0x22,0xd4,0x68,0x02,0x37, - 0x60,0x6c,0x2d,0x17,0x56,0xf3,0x00,0xdb,0x26,0xd6,0x29,0x97,0xb1,0x4d,0xac,0xd5,0x3d,0x29,0xed,0x28, - 0xfd,0xbe,0xa0,0x83,0xf8,0x4c,0x91,0x95,0x55,0xab,0xbf,0xa4,0x09,0x20,0xb1,0x30,0xce,0x95,0x6f,0x9f, - 0x1c,0x61,0x87,0x02,0x3e,0xc7,0xcc,0xfa,0x1c,0x4c,0x5b,0xaf,0x31,0x5c,0x28,0xf0,0xb6,0x80,0x8f,0x06, - 0x1c,0x69,0x4b,0xb6,0xbb,0xb7,0x08,0xf3,0x34,0xc9,0x43,0x6c,0xca,0xa3,0xb0,0x72,0x92,0xd7,0xd6,0xa6, - 0xe9,0x1a,0xcf,0xd5,0x7c,0xfc,0xf3,0x3f,0x61,0x3e,0x86,0x93,0xd1,0x43,0x9d,0x32,0x86,0xde,0xaa,0x47, - 0xb6,0xa1,0xf7,0xe3,0x5d,0x7a,0x04,0x70,0x0d,0xd5,0x33,0xe5,0xac,0x60,0x16,0x2a,0xb6,0xbf,0xc6,0x50, - 0xef,0x84,0x3d,0x04,0x63,0xcc,0x1f,0x1f,0xec,0xbe,0x2a,0x65,0x0f,0x37,0x1c,0xc8,0x80,0x5f,0x0f,0x4c, - 0xec,0x35,0x67,0x47,0x9c,0xe9,0x89,0xab,0x19,0x91,0xbe,0xf9,0x3b,0x39,0x67,0x85,0x03,0x2e,0x2e,0x29, - 0x0e,0x51,0x70,0xca,0xf4,0x1e,0xdf,0xcf,0x90,0x56,0xd0,0x87,0xf4,0x46,0xe1,0xe6,0x09,0xf1,0x2a,0x39, - 0xfc,0x3e,0x2c,0xa0,0x69,0xe9,0x4d,0x5d,0xa1,0x39,0xb5,0xa5,0x8a,0x09,0x0e,0xff,0x18,0x64,0x88,0x38, - 0x78,0x83,0xd6,0xc0,0x88,0x07,0x1c,0xa1,0x2b,0x66,0x3e,0x9b,0xb0,0x16,0x5a,0x7b,0xc4,0x3c,0x96,0xc7, - 0xba,0x28,0x10,0x26,0x3a,0x3a,0x97,0xc4,0x68,0xdc,0x0f,0xe0,0x28,0x31,0x40,0xbc,0x93,0x19,0x8a,0xb6, - 0xd0,0x96,0x1d,0x1b,0xf1,0xb6,0xf8,0x58,0x66,0xf7,0xec,0x45,0x52,0x61,0x12,0x29,0x77,0xd6,0x45,0xb3, - 0x6c,0xc3,0xb2,0xad,0xe7,0x7a,0x89,0xcd,0xec,0xe2,0x41,0x4f,0xf8,0x30,0x5e,0x67,0xec,0xd7,0x46,0x11, - 0xb8,0x0f,0x13,0x8b,0xc0,0x89,0x97,0x19,0xb3,0x91,0x2b,0xe9,0x0e,0x8e,0xaa,0x11,0xab,0x9a,0x7d,0x49, - 0x0c,0x8c,0xe7,0x66,0x81,0xe2,0xb5,0xba,0xb6,0xb0,0x60,0x55,0x67,0x78,0x9c,0x4d,0xf5,0x5e,0x20,0xd2, - 0xa1,0x82,0xb5,0xfe,0xa3,0xbc,0xea,0x43,0xe7,0x4f,0x47,0xfb,0x20,0x66,0x31,0x9f,0xae,0xaa,0x7e,0xe1, - 0x30,0x04,0xdb,0x28,0x9f,0x35,0x53,0x01,0x89,0x47,0x83,0x3d,0x42,0xea,0xe8,0x67,0x13,0xdc,0xda,0xe2, - 0x98,0x3f,0x83,0x67,0x00,0x73,0xb6,0x3a,0x8e,0x12,0xf1,0x34,0x0f,0x58,0x06,0x63,0x44,0xc5,0x28,0xa5, - 0x09,0xe5,0x83,0x1e,0xc2,0xe4,0x54,0x45,0x90,0xd9,0x91,0x48,0x43,0x70,0x08,0x16,0xa0,0xeb,0xa1,0x5e, - 0x16,0x90,0x3c,0xc4,0xc5,0x3d,0xb8,0x55,0x2a,0x14,0x23,0xd2,0x0e,0x7c,0x08,0x13,0x79,0x82,0x18,0x22, - 0x15,0x18,0xa1,0xa1,0xed,0xaf,0xf9,0xcf,0xfc,0xd6,0xaa,0xdf,0x5a,0xf3,0x5b,0xf4,0xf0,0xdc,0x6f,0xbd, - 0xf0,0xdb,0x2d,0xbf,0xfd,0xcc,0x6f,0x3f,0xf7,0xdb,0x7f,0xf0,0x57,0xdb,0xfe,0xea,0xea,0x99,0xe5,0x16, - 0x83,0x23,0xb5,0xd4,0x9c,0xe5,0x10,0xb7,0x6b,0x50,0x60,0xd8,0x74,0x6a,0xae,0x84,0x45,0xf1,0x1c,0x5c, - 0xee,0x9f,0xe1,0xf8,0x81,0x3a,0xb4,0x5d,0x24,0x90,0x36,0xad,0x1e,0x95,0x44,0x57,0x46,0x8b,0xc5,0x4f, - 0xf1,0xb0,0x2d,0xe2,0x27,0x55,0x9e,0x96,0x4e,0xe6,0x39,0x6c,0x25,0x1f,0x1d,0x8e,0xc7,0xb4,0x6e,0xc6, - 0x90,0x24,0xc5,0xa3,0xfc,0x75,0x8a,0x28,0x86,0xec,0xba,0x4e,0x62,0x8e,0xc9,0x42,0x57,0x3e,0x0e,0x5e, - 0x9a,0xf6,0x8f,0x79,0x08,0x1f,0x81,0x40,0xc6,0x58,0xc1,0xc0,0x5e,0x13,0xd8,0x75,0x77,0x18,0x64,0x7c, - 0x6d,0x05,0xb5,0x24,0xf6,0xf8,0x90,0xaf,0xcb,0xd4,0xd6,0x8a,0x1b,0x75,0x92,0x26,0x68,0x2d,0x0b,0x5c, - 0x05,0xf3,0x9e,0x4a,0xc8,0xc0,0x82,0x28,0x51,0xdc,0x57,0x41,0xf9,0x26,0xf4,0x25,0x58,0x70,0x10,0x80, - 0x3e,0xcb,0x32,0xca,0xe3,0xa7,0x89,0x30,0xa0,0xe3,0x14,0x88,0xbb,0xf4,0xc5,0xfd,0x60,0x61,0xfc,0x91, - 0x6e,0x88,0x74,0x2e,0xbd,0x50,0xd2,0x79,0x75,0x28,0xb5,0xbf,0xfe,0xea,0x30,0xce,0x38,0xe6,0x5f,0xdc, - 0xba,0x50,0x97,0x85,0x8d,0x4b,0x16,0x93,0x1b,0x3e,0x72,0x0c,0xe2,0x14,0x1a,0xff,0x51,0x32,0x9e,0x18, - 0xdf,0x79,0x17,0xd5,0xfd,0x15,0xae,0xee,0x51,0x0c,0xf1,0x6f,0x44,0xbc,0xce,0x6b,0xd6,0x96,0x9b,0x3f, - 0x00,0xc5,0x7e,0x3f,0x5b,0x04,0xc1,0xbe,0xc5,0x03,0x4d,0x2d,0xf6,0xe6,0x41,0x68,0x88,0x99,0x5a,0x04, - 0x01,0x92,0x1f,0xe8,0xfe,0xe4,0xeb,0xd7,0x30,0x5b,0x3c,0xf4,0xc8,0x99,0xca,0x0f,0x9f,0x7e,0x85,0x5f, - 0x89,0x99,0xe6,0x57,0xb9,0xde,0x81,0x77,0x0e,0x71,0x85,0x4b,0x64,0x17,0x14,0x15,0x27,0x61,0x54,0xa8, - 0x7e,0x3c,0x61,0x56,0x93,0x6f,0x7a,0x4e,0xe0,0xa4,0x43,0x1c,0xe2,0x4a,0xa9,0xe4,0x01,0x48,0xf6,0xda, - 0xbd,0xe3,0x7e,0xb0,0x08,0x92,0xbd,0xf6,0xeb,0xda,0xf1,0xce,0xd6,0x54,0xfd,0x32,0x9b,0xc8,0x4c,0xde, - 0x05,0xd4,0x14,0xd8,0x6d,0x8e,0x0a,0xbe,0xb4,0x8d,0x30,0x16,0x3b,0xda,0x35,0xce,0x03,0x8d,0xf4,0xe2, - 0x07,0x1b,0x79,0xbd,0x3f,0x55,0xbf,0xd5,0x46,0x94,0xaf,0x73,0xbb,0x95,0x93,0xa0,0x74,0x16,0x34,0xd3, - 0xc8,0xce,0xe5,0xd1,0x97,0x45,0x4d,0xec,0xbc,0x39,0xa4,0x65,0x04,0xef,0x8a,0x7f,0x9c,0x5a,0xcf,0x9a, - 0x0d,0x83,0x2b,0xec,0x9a,0x49,0x0f,0xe5,0xe6,0xa7,0xf4,0xef,0xad,0xaf,0x77,0x0a,0x38,0x73,0x53,0xa5, - 0x1e,0x04,0xe0,0xe4,0x71,0x00,0x4e,0x2c,0x00,0x4e,0xfe,0x0b,0x00,0xb0,0xd7,0xce,0xb7,0x7b,0xf1,0xd5, - 0xe2,0x71,0x3e,0xae,0x6d,0xbf,0xde,0x7f,0x3f,0xd5,0x0f,0x10,0xfb,0xbf,0xf0,0xe9,0x40,0x5c,0xdb,0xd9, - 0x7a,0xcd,0xa8,0xc5,0xe7,0xc4,0x50,0x19,0xc8,0x88,0x09,0x4a,0x19,0xc7,0x0e,0x0e,0x57,0x09,0xbf,0xa4, - 0x24,0x41,0xc7,0x25,0x81,0x5f,0x7b,0xaa,0xa8,0x94,0x9c,0xe8,0x92,0x0f,0xc2,0xb5,0x9f,0x3d,0x02,0xd8, - 0xfe,0x91,0x86,0x8c,0x9f,0xd8,0x29,0x0e,0xb1,0x80,0xd4,0x18,0x7c,0x6a,0x67,0x7d,0x45,0x4f,0x81,0x09, - 0xf1,0x85,0x40,0x01,0xf7,0xfc,0x19,0xb6,0xf9,0x1b,0x76,0xe1,0xf8,0x50,0xb3,0x3b,0xea,0x2a,0x7f,0x51, - 0xab,0x3b,0x1f,0x3f,0x9d,0x4c,0xf5,0x43,0xa5,0x4d,0x8d,0xdc,0x65,0x63,0x8f,0x23,0x77,0x7e,0xf0,0x48, - 0xe7,0x0e,0x74,0xdf,0x0e,0xa4,0x6b,0x3c,0xe7,0x79,0x2a,0x6d,0x21,0x70,0x2b,0xed,0xf4,0xf0,0x8e,0xb4, - 0x9d,0x05,0x13,0xf6,0xde,0x05,0xf7,0x69,0x23,0xe2,0xa6,0x87,0x52,0xe2,0x81,0x56,0xb7,0x46,0x63,0xb9, - 0x8a,0x5c,0xd4,0x2e,0x65,0xc6,0xb4,0xc9,0x18,0x74,0xc2,0xf1,0xa8,0x8a,0x79,0x95,0xd5,0xe5,0x33,0x73, - 0x5f,0x1f,0xea,0xa8,0x39,0xfa,0x13,0x1c,0x6d,0x94,0xc1,0x6a,0x08,0x20,0xeb,0x63,0xf6,0x6b,0xb3,0x00, - 0xa0,0x1c,0xac,0x93,0x75,0x6b,0x9a,0x27,0xfd,0xaa,0xe4,0x79,0x8c,0x02,0xd3,0x13,0x44,0x17,0x25,0xc6, - 0x03,0xf6,0xa1,0xea,0x46,0x83,0x11,0x8f,0x48,0x5a,0x9d,0x78,0x4c,0xdc,0xe9,0x53,0xb1,0xbc,0x51,0x3b, - 0x62,0xb4,0xc2,0xdd,0x5a,0x5e,0x53,0x11,0x53,0x89,0xfd,0x09,0x26,0xe3,0x42,0x6d,0x72,0x8a,0xcc,0xed, - 0x46,0xb4,0xcd,0xc5,0x57,0x31,0x49,0x48,0xe0,0x3a,0xe5,0x33,0x75,0xc4,0xc7,0x27,0x54,0xbc,0x54,0x82, - 0x71,0xd4,0x21,0xbe,0x87,0xc3,0xf1,0x88,0x08,0xc7,0xe4,0xf4,0x07,0x9c,0xc9,0x86,0x36,0xb8,0x65,0x5c, - 0x24,0xa1,0xb7,0xd7,0x5c,0x42,0x11,0xe3,0xba,0x15,0x39,0x0c,0x67,0x49,0x27,0x27,0x27,0xfb,0x16,0x0d, - 0xe6,0xf7,0xfa,0x2c,0xb5,0x2d,0x19,0xda,0x39,0x20,0xfa,0x97,0x63,0x5e,0xcc,0x8f,0x80,0x61,0xa8,0x82, - 0x02,0x44,0xbf,0xcf,0x80,0x72,0x92,0x11,0xbb,0x09,0xef,0xc3,0xd4,0xe1,0xf8,0x57,0xb4,0x3c,0x1a,0xaf, - 0x3e,0xd2,0x28,0x2d,0x64,0xdd,0x1e,0x3d,0xce,0x34,0x25,0x01,0xe2,0x14,0x59,0x78,0x6b,0x5f,0x67,0xda, - 0xeb,0xff,0x91,0xb6,0x99,0x60,0x3c,0xd2,0xba,0x4c,0xa1,0x6a,0x9f,0x5f,0x66,0x20,0xd8,0xab,0x10,0x29, - 0x78,0x9f,0xb4,0x28,0xd1,0xaf,0x05,0xe0,0x20,0x2c,0x82,0x85,0x78,0x2a,0xcd,0x17,0x19,0xab,0x1d,0x25, - 0x97,0xa9,0x02,0x81,0x47,0x56,0x49,0xdb,0xda,0xa9,0xb7,0xdc,0x2b,0x48,0x78,0x1d,0x90,0x4a,0xf1,0xa2, - 0x0a,0x0d,0x4e,0xf9,0xbc,0x40,0x1c,0x77,0xde,0xbd,0xfa,0x2a,0x9a,0x26,0xbc,0xde,0x25,0x2a,0x3c,0x31, - 0xd7,0x68,0x39,0xf5,0x5e,0x80,0xa5,0x1a,0x41,0x16,0x02,0xaa,0x51,0xc1,0xe0,0x84,0x4d,0xd0,0x03,0x44, - 0xc0,0xc3,0x81,0x13,0xec,0x50,0x95,0xfa,0xa2,0xc1,0x25,0x22,0x1e,0xb4,0xc2,0x34,0x4d,0x27,0x3e,0x09, - 0x85,0xb9,0xac,0xdc,0x1d,0x25,0xa6,0x68,0xfd,0x10,0x45,0x49,0x8e,0x40,0x37,0x73,0x1e,0xe8,0xeb,0x80, - 0xb7,0xf1,0x51,0x94,0xf7,0x6c,0x82,0x03,0x55,0x2a,0xa5,0x23,0x43,0x25,0xa6,0xfc,0x5a,0xd7,0x1f,0xc4, - 0xea,0x22,0x26,0xbd,0xe4,0xf0,0x39,0x5c,0x74,0x90,0xd6,0x38,0xb6,0x07,0xac,0x1b,0xa0,0x46,0x21,0x77, - 0x31,0x88,0xf2,0x20,0x55,0x8d,0x55,0x3a,0x7b,0xe4,0x63,0xee,0xf7,0x06,0xae,0x32,0x92,0xd9,0x00,0x55, - 0x88,0x4f,0x55,0x09,0x4b,0x95,0x15,0x4a,0x1b,0x4e,0x81,0x58,0x9e,0x85,0x67,0xf0,0xc9,0x52,0x4c,0xd5, - 0x2f,0x9f,0xe1,0xf7,0xc2,0xe8,0x9a,0x58,0x65,0x49,0xa9,0xed,0x1c,0xfc,0x11,0x83,0xf5,0x69,0xe7,0xb0, - 0xf6,0x7c,0xed,0xd9,0x5a,0x63,0x6a,0x67,0xe0,0x8c,0x48,0xe7,0xe0,0xf6,0xff,0xd2,0x28,0xcf,0xf4,0xc3, - 0x8b,0xc9,0x40,0xfb,0xf6,0x9f,0x6d,0x75,0x07,0x99,0xe2,0xf9,0x96,0x1f,0x8d,0xdb,0x5b,0x28,0x8f,0xa5, - 0x39,0x6b,0xd7,0x45,0x34,0x63,0xc4,0x39,0x0e,0x24,0x52,0xd0,0x24,0xbf,0x44,0x48,0x96,0x58,0x22,0x5b, - 0x20,0x3b,0xe4,0xc8,0x81,0xfb,0xaa,0x04,0xa6,0x83,0x83,0x11,0xd2,0x8b,0x4d,0x71,0x39,0xad,0x82,0xca, - 0x13,0x88,0x04,0x48,0xcd,0xa7,0x65,0xbc,0x42,0xa9,0x9d,0xa5,0x3c,0x68,0x89,0x5e,0x66,0x21,0xb8,0xc9, - 0x0b,0x4c,0xc6,0x5a,0xb3,0xf6,0x7e,0x1b,0x2c,0xed,0xd1,0xd6,0x81,0x9c,0x80,0x73,0x6c,0x75,0x15,0xb4, - 0x83,0x6b,0x6a,0xd0,0xc6,0x4f,0x13,0xc8,0xe2,0xa9,0xaa,0x9b,0x6f,0x43,0xaf,0x42,0xe4,0x69,0x9f,0xc5, - 0x72,0x48,0x11,0x90,0xcc,0x00,0x6d,0x37,0x51,0x3a,0xcd,0xc7,0xd0,0x60,0xeb,0x05,0x0d,0xd5,0x0c,0xda, - 0x98,0xa8,0x36,0xc6,0xca,0xc9,0xb0,0x82,0xd2,0x34,0xc2,0x5c,0x8f,0x4e,0xd5,0x5e,0x79,0x6b,0x3a,0x12, - 0xe4,0xa3,0x51,0x3b,0xe1,0x6d,0xed,0xa7,0x63,0xcb,0xdb,0x9a,0x52,0x66,0x53,0x21,0x91,0xcb,0x27,0x71, - 0x61,0x26,0x8a,0x47,0x12,0xd7,0xd8,0x3c,0x48,0x96,0xd2,0x4c,0x50,0x41,0x8b,0xcb,0x27,0xe5,0x40,0x4d, - 0x2e,0xf7,0x55,0x00,0xdd,0xf2,0x49,0x72,0xf5,0x05,0x84,0x0e,0x0a,0x6b,0x3d,0x4a,0x01,0x5e,0xd3,0x1c, - 0xea,0x54,0xff,0x4a,0xba,0xda,0xd0,0x55,0xdc,0xd2,0xf2,0x49,0x72,0xe5,0x54,0x41,0x62,0x63,0x9a,0x07, - 0xe5,0x8b,0x4d,0xd1,0x09,0x1d,0xfc,0xd2,0x7a,0x7c,0xa7,0x5d,0xa8,0x0a,0x9e,0x98,0xa0,0x96,0xf6,0xb3, - 0xea,0xb2,0x20,0xb1,0x8a,0x5d,0x59,0x3e,0xb1,0x1f,0xb7,0xe3,0x8f,0x9f,0x3e,0xec,0x9c,0xbf,0xdf,0xfd, - 0xe9,0xb8,0xab,0x62,0x38,0xb2,0xfd,0x03,0x34,0xce,0x3d,0xcb,0x04,0xa2,0xa4,0x64,0x24,0xcc,0x23,0xf3, - 0x34,0x3c,0x6b,0x10,0x89,0xf3,0xfc,0xe3,0xee,0x9d,0x15,0x72,0xac,0x73,0x7a,0x26,0xe4,0xa5,0x03,0x7d, - 0x78,0x22,0xd7,0x9d,0x27,0x2d,0x3f,0xbf,0xcd,0x25,0x7c,0xb2,0x83,0xc7,0x4f,0x51,0x1f,0x4f,0x18,0x13, - 0x55,0x68,0xd2,0x97,0x07,0x85,0x82,0x08,0x0b,0x8c,0xf7,0xfb,0xd2,0x00,0x00,0xe7,0x78,0x4c,0xd8,0x5e, - 0x07,0xe3,0xdc,0x36,0x03,0x08,0x1b,0x4c,0x1c,0xa7,0xd3,0xbb,0xfb,0xf5,0x63,0x3c,0x77,0xef,0x84,0x1b, - 0xe8,0x3c,0x69,0x12,0xa4,0x45,0x43,0xde,0x7c,0xa6,0xe1,0x3a,0x8d,0x5f,0xb0,0x6d,0xea,0x04,0x7a,0x94, - 0x8d,0x44,0x27,0xf0,0x8b,0xd6,0xbe,0x1f,0x06,0xf9,0x71,0x94,0x5c,0x75,0xdd,0x46,0xa3,0x11,0x7a,0xdd, - 0x8d,0x27,0xdc,0xd0,0x74,0x1a,0x36,0xc0,0xf7,0x61,0x74,0x38,0x81,0x46,0x84,0x08,0x56,0x72,0xab,0xe1, - 0xec,0xba,0x54,0x56,0x7d,0xeb,0x3a,0x17,0x5a,0x02,0xe4,0xc6,0xe9,0x97,0xda,0xa4,0xbf,0xdc,0x90,0xe3, - 0xad,0x07,0xf9,0x6d,0xd2,0xab,0x99,0xfe,0x96,0x23,0xe1,0xb2,0x15,0x8d,0x32,0x2e,0x38,0x6e,0x94,0x19, - 0x1e,0xac,0x65,0xec,0x84,0xee,0x93,0x16,0x15,0x71,0x03,0xd6,0x51,0xa5,0xa9,0x71,0x9d,0x15,0xfa,0xbb, - 0x72,0xdd,0x5a,0x11,0xcd,0x1e,0x65,0x3c,0x03,0x16,0x7a,0x2d,0x5c,0xbd,0xf7,0xbc,0x06,0x33,0xc6,0x86, - 0xfa,0x10,0x81,0x81,0xfa,0x6a,0x69,0x3a,0x33,0x53,0xb9,0xb6,0xa4,0xb1,0x93,0xef,0x0d,0xc4,0x01,0x11, - 0x8b,0x5b,0xe0,0xf4,0xfc,0x0c,0x29,0x05,0xcb,0x1c,0x93,0xe4,0x27,0x6c,0x46,0xa2,0x4f,0x87,0xfc,0xa0, - 0xab,0x14,0xb6,0xdd,0x70,0x3a,0x3d,0x3d,0xf3,0xcc,0x90,0x16,0x1b,0xdd,0xf0,0xb4,0x79,0xb6,0xb4,0x54, - 0xbc,0xa2,0x87,0x16,0x0d,0x6d,0xd4,0x3d,0x3d,0x33,0x26,0x1c,0x45,0xb7,0xb9,0x8e,0x1c,0xd8,0x5f,0xac, - 0x17,0xcb,0xcb,0x5e,0xe0,0xd2,0x73,0x94,0x23,0xbe,0x10,0xd5,0x37,0x9d,0xd2,0x2b,0x62,0xea,0x66,0xd7, - 0x61,0x7f,0xbe,0xe2,0x46,0x9c,0x4a,0xc5,0x8d,0x61,0x44,0x65,0xa3,0xc6,0x78,0x92,0x0f,0xdd,0x42,0x5b, - 0x36,0xe5,0xdd,0x48,0xa3,0x7e,0x41,0xd3,0x8d,0xaa,0xf9,0x7c,0x00,0xbc,0x3e,0x55,0x4e,0x4c,0x47,0xa5, - 0x00,0xf2,0x83,0x7e,0xaf,0xc5,0x59,0x29,0x3a,0x24,0x31,0x51,0xef,0x74,0x6d,0x01,0x1f,0x8c,0x05,0xdd, - 0x8d,0xd3,0x80,0x3a,0x4c,0xf8,0x45,0xa8,0xb2,0x99,0xb8,0x81,0xb7,0xec,0x18,0xf5,0x53,0x6f,0xea,0x2c, - 0xeb,0x24,0xad,0x86,0xe4,0x39,0x1d,0x24,0x9d,0x79,0xeb,0x7a,0xc5,0xdd,0x74,0xcd,0x81,0x9f,0x4e,0xba, - 0x1c,0x15,0xdd,0xc4,0xbc,0xa5,0xe3,0xa2,0x1b,0x6d,0x9e,0x9e,0x12,0x37,0xcf,0xae,0x6c,0xe1,0x8c,0x9e, - 0x75,0x18,0x89,0xc2,0xc3,0xa7,0xad,0x56,0xa1,0xa6,0x7d,0xb8,0x37,0x8c,0x53,0xa8,0xb3,0x55,0x3c,0xdc, - 0xe6,0x5e,0x27,0xbf,0x5f,0x4f,0x5d,0xc7,0x9c,0x35,0x3a,0x3e,0x06,0x19,0x4f,0x18,0x47,0xff,0x49,0xcb, - 0x03,0x25,0x34,0x47,0x3e,0x84,0xc3,0x72,0xf2,0xe2,0x9c,0x19,0xab,0x31,0x1a,0xe5,0x94,0x46,0x21,0xf3, - 0x9f,0x34,0x3d,0x5d,0x5a,0x8e,0xf9,0xa4,0xb4,0x39,0x73,0x33,0xaf,0x5a,0x8f,0xc4,0x9c,0xa5,0xc8,0xb3, - 0x9c,0x66,0x94,0xcf,0xbd,0x58,0x9e,0x21,0x9a,0xeb,0x54,0x96,0x91,0xcd,0x0b,0x0b,0xa6,0xe6,0x6d,0x47, - 0x62,0xe9,0x95,0x52,0x9d,0xbc,0x18,0x61,0x6b,0x1e,0xe6,0x5c,0x60,0x96,0x01,0xc0,0x11,0x84,0xe3,0x47, - 0x48,0x5a,0x37,0x36,0x42,0x8d,0xb2,0xd5,0x8d,0x6e,0x73,0x53,0x68,0x7b,0x47,0xeb,0x50,0xad,0x9f,0xfe, - 0x5b,0x43,0x75,0xa7,0xa7,0x76,0xd0,0x8d,0x61,0xd8,0xc6,0x70,0x1c,0xee,0x7d,0x60,0x92,0x7d,0x6a,0xcf, - 0xd3,0x6f,0x1c,0xe7,0xd9,0xf9,0xfb,0x0d,0xa3,0x7f,0xf4,0xe5,0xdf,0x7a,0x1e,0xfc,0xa3,0xdd,0xed,0x8f, - 0x1f,0x4f,0x64,0x23,0x02,0xd3,0x7d,0x1c,0x16,0xae,0x6c,0xf3,0x30,0x79,0x52,0xa6,0x4e,0xd0,0xb1,0x04, - 0x9f,0x5a,0x9a,0x91,0x38,0x11,0x9c,0xee,0x0f,0x8c,0xf5,0x85,0x98,0x4f,0x20,0x02,0x4c,0x92,0xb7,0xe4, - 0xa7,0xad,0x3e,0xae,0x5a,0x04,0x50,0xe2,0xb0,0x34,0x0c,0x52,0x6a,0xe4,0x20,0xcb,0xa5,0xbe,0xb0,0x7a, - 0x53,0x8a,0xb9,0x5a,0xe9,0x56,0x3d,0x42,0xd7,0x55,0xa7,0x0a,0x54,0xa5,0xa2,0x27,0x87,0x1d,0xb6,0x58, - 0x6c,0xc0,0xa1,0x98,0x7f,0xc7,0x77,0x66,0xd9,0x3d,0xc7,0x2c,0x3e,0x35,0xab,0x9e,0x65,0xf9,0x36,0x0e, - 0x88,0x0b,0x3f,0xe4,0xd0,0xde,0x25,0x51,0x4d,0x8c,0xd5,0xa5,0xfa,0xc2,0xb6,0xd7,0xbc,0xd3,0xf6,0x85, - 0xe1,0x69,0x71,0xc6,0xb6,0x87,0x81,0x32,0xa7,0x51,0x38,0x1c,0x11,0x3d,0x82,0x2a,0xa0,0xb7,0x1e,0x11, - 0x02,0x2f,0x2d,0x3d,0x49,0xd8,0x3c,0x33,0xf2,0x96,0x96,0x12,0x36,0x90,0x8c,0xfc,0xa2,0x60,0x06,0x80, - 0x2a,0x68,0xc4,0xec,0xde,0x7a,0xb6,0x9d,0xc0,0xb4,0x13,0x51,0x3b,0x01,0xed,0xf9,0xdd,0x68,0x69,0x29, - 0x6a,0x64,0xe9,0x4d,0xe3,0x97,0x09,0xa1,0x95,0xe0,0x1d,0x11,0x6b,0x4d,0xaf,0xc4,0x0c,0x32,0xaf,0x82, - 0x02,0x3a,0x2a,0xa0,0x80,0xae,0x4b,0x1a,0xab,0x4d,0xe6,0x20,0x64,0xe0,0x27,0x3c,0xd3,0x1d,0x65,0xa2, - 0x18,0x8a,0x0d,0x24,0xb6,0x83,0x84,0xbf,0x0d,0xbc,0xf5,0xb0,0x21,0x21,0x39,0xa0,0x77,0x86,0x0d,0xc7, - 0x7a,0x33,0xa6,0xae,0xff,0xfc,0xbf,0xd5,0x1c,0x8f,0x36,0x94,0x65,0x37,0xe0,0x5e,0x13,0xb8,0xc1,0x93, - 0x6e,0x37,0xdb,0x94,0xac,0xe5,0x82,0x57,0x3c,0xc2,0xcf,0x38,0x44,0x83,0x3b,0x94,0x12,0xe1,0x9a,0xe2, - 0x9e,0x96,0x5c,0x75,0x32,0x7e,0x0c,0xae,0x42,0x9a,0x10,0xd8,0x08,0x96,0xc0,0x85,0x0d,0x7b,0xb9,0x11, - 0x6c,0xc7,0x0d,0xd0,0x85,0xa5,0x25,0xf9,0x6d,0x64,0x45,0x4f,0xa6,0x62,0x3a,0x7d,0x12,0x55,0xc7,0x20, - 0x37,0xd3,0x91,0x54,0xba,0x91,0xcb,0xe4,0x44,0x66,0xe3,0xca,0xf5,0x8e,0x98,0xab,0x1d,0x71,0x93,0x60, - 0x96,0x28,0xee,0x6c,0x2f,0x39,0x03,0x27,0xb3,0xa5,0xc7,0xd1,0xd7,0xb0,0x0a,0xa9,0x19,0xc6,0x52,0x83, - 0x53,0x9a,0xc7,0x88,0x56,0x33,0x73,0x9d,0x41,0x20,0x3e,0x8d,0x68,0xd3,0xcb,0x5f,0xad,0xb6,0xa7,0xd3, - 0x7c,0xa3,0xd5,0x7e,0x81,0xb6,0xc7,0x44,0x43,0xfa,0x5c,0x03,0xb7,0x4f,0xf0,0xf7,0xa0,0x20,0x0d,0x45, - 0xd9,0xae,0x73,0x11,0xf4,0x07,0x21,0x8d,0xa2,0x4b,0x23,0x4c,0xcf,0x44,0x21,0x07,0x69,0xda,0x87,0x1a, - 0x2f,0xed,0xcb,0x63,0x78,0x65,0x7a,0x3d,0x8c,0xe2,0x3e,0x89,0x2e,0x6e,0x46,0x75,0xd2,0xb6,0xf7,0xd7, - 0xff,0xbe,0xf6,0xa2,0xd6,0xa5,0x4f,0x5e,0x3c,0xc5,0xab,0x4c,0x09,0x51,0xb3,0x7e,0x8e,0x19,0x91,0x59, - 0x72,0xa3,0x8d,0xd6,0x66,0x54,0xe6,0x8a,0xce,0xd3,0xc7,0x4b,0x2e,0xe1,0x2c,0x07,0xaa,0x1a,0xa7,0xc3, - 0xb9,0x1f,0x93,0xd0,0x81,0x01,0x17,0x18,0x06,0x92,0xee,0x88,0x65,0x28,0x87,0x28,0x25,0x09,0x25,0xab, - 0xda,0xec,0x52,0x11,0xb6,0x1a,0x0d,0xa8,0xe0,0x93,0x19,0x86,0x2c,0x52,0x7c,0x18,0xa1,0x0c,0x15,0x9b, - 0x9d,0x41,0x47,0x97,0x23,0xee,0x18,0x06,0x96,0xb8,0x47,0xa0,0x11,0xf2,0x3a,0x05,0x8d,0x1a,0x0e,0x1b, - 0x1b,0x49,0x7a,0xe3,0x8a,0xad,0x73,0xda,0xcd,0x19,0x15,0xfa,0x69,0x6f,0x82,0x08,0xba,0x0d,0xd9,0x39, - 0x98,0x9d,0x13,0xde,0x2d,0x74,0x61,0xc5,0xda,0x24,0x56,0xc2,0x58,0x98,0x36,0xfd,0xbc,0xee,0x96,0x15, - 0xd5,0x33,0xcf,0x32,0x71,0x0e,0x96,0x97,0x4d,0x59,0x42,0xcc,0xb5,0xa7,0xf9,0xd3,0xc0,0x6f,0x85,0x6b, - 0xde,0x3d,0xad,0x66,0x45,0xee,0x68,0x51,0xa7,0xde,0xbd,0x6b,0x21,0x73,0x2e,0x44,0x34,0x57,0x9c,0x1e, - 0x1e,0xbb,0xa1,0x3f,0xcf,0x50,0x86,0x73,0x1c,0x22,0x31,0x04,0x9a,0x74,0x2e,0x2d,0xb9,0xf4,0x85,0xb0, - 0xf7,0xdd,0x32,0xd9,0x37,0x9d,0xe3,0x53,0x13,0x2b,0x87,0x26,0xe8,0x6f,0xff,0xf0,0xdf,0x28,0x9d,0xe6, - 0xda,0x87,0xb7,0x84,0x10,0x61,0x63,0x12,0xf5,0x75,0x45,0x24,0x1c,0x74,0x39,0x41,0xef,0x74,0x27,0x5b, - 0xdb,0x2c,0xf0,0x71,0x50,0x2f,0x44,0xe9,0xbb,0x8e,0xc2,0x1b,0x04,0xea,0xb3,0xdc,0x65,0xe3,0xe7,0x24, - 0xb8,0x90,0x3c,0xb8,0xcb,0x2e,0x25,0xa3,0xdc,0x10,0xdc,0xb2,0x84,0xc8,0x46,0x5c,0x28,0x42,0x23,0xd8, - 0x45,0xe4,0x17,0xb9,0x7b,0x78,0x44,0x5e,0xd8,0x8f,0x44,0x13,0x49,0x1e,0xcc,0xe7,0xbb,0xfc,0xca,0xcd, - 0x83,0xd3,0x47,0xfb,0xf8,0x2d,0x01,0xc0,0x9b,0x88,0x8b,0x31,0x14,0x09,0x51,0x7f,0xf9,0x88,0x12,0x87, - 0xea,0x8d,0x43,0x0f,0xca,0xb5,0x20,0xba,0xa7,0x9f,0xb8,0x87,0xf2,0xc2,0x1d,0xb9,0xcd,0x8b,0x10,0x61, - 0x03,0xf5,0x03,0xf7,0x81,0x9f,0x25,0xee,0x0c,0x34,0x67,0xf8,0x2f,0x32,0xf6,0xd3,0xc1,0xd9,0x59,0x89, - 0xe7,0x2a,0xbe,0x18,0x9b,0xef,0xb9,0x1a,0xd5,0xc3,0x6e,0x9c,0xca,0x8d,0x25,0x28,0xff,0x50,0x2f,0x48, - 0x77,0xe5,0xe7,0xef,0x3e,0xaf,0x6c,0xae,0x40,0xc1,0x7b,0xdd,0x30,0xfb,0xc1,0x78,0x53,0xb7,0xdc,0xb9, - 0x93,0x03,0xdd,0x8e,0xee,0xb9,0xc8,0x4c,0xea,0xed,0x9e,0x98,0x14,0x12,0x8a,0x4a,0x0c,0x4b,0x82,0x6b, - 0xab,0xc9,0x2a,0x24,0x24,0x07,0x70,0xd5,0x98,0x5e,0xcd,0x4a,0xbb,0x90,0xa0,0x20,0x6a,0x4a,0x6b,0xc0, - 0x3d,0xaf,0xb3,0xa8,0x80,0xb4,0x47,0x4b,0x91,0x64,0x06,0x4b,0xe0,0x22,0x52,0xb5,0xfe,0x3b,0xd7,0xf9, - 0x8e,0xda,0x75,0x3c,0xec,0x64,0x5b,0x05,0x31,0x46,0x17,0x68,0xcf,0x09,0xb2,0x28,0xa8,0xc7,0x50,0xca, - 0x74,0x7c,0xa2,0x0d,0x88,0x76,0xc6,0xc5,0x3c,0xbf,0xfc,0x62,0x96,0x2e,0x91,0xb8,0x97,0x30,0xe7,0xee, - 0x9e,0x26,0x7e,0x80,0x96,0xc3,0x98,0x6a,0x22,0x39,0x6a,0x48,0xdb,0x7c,0xc7,0xf9,0x6e,0x85,0x58,0x76, - 0x9f,0x69,0x5e,0x27,0x24,0x68,0x93,0x4d,0x07,0xc1,0x78,0x80,0xaa,0xdc,0x9c,0xea,0xb1,0xa3,0x33,0xc7, - 0x88,0x1b,0x26,0x92,0xad,0x8f,0x7d,0x0b,0xa4,0xc9,0x92,0x70,0x71,0xae,0x48,0xe3,0x45,0xe4,0x65,0x79, - 0x79,0x7d,0xf1,0xa8,0x71,0xf7,0xf2,0x2b,0xe2,0x79,0xbc,0xca,0x5e,0x41,0x3d,0x92,0x54,0x9f,0xc7,0xdc, - 0x58,0xcd,0x02,0x5e,0x74,0x95,0x40,0x86,0xd0,0x0d,0xfc,0x70,0xee,0xa5,0x16,0x7e,0x36,0x7d,0x86,0x05, - 0xb0,0x9b,0x78,0xbe,0xab,0x86,0x3b,0xe9,0x53,0xa7,0xd9,0x6b,0x44,0xc1,0xd3,0x30,0x9d,0x22,0x03,0xce, - 0x21,0x4e,0xdb,0x67,0x54,0xf0,0xfe,0x86,0x8a,0xd0,0x5e,0x1f,0xf4,0xfb,0xbb,0xd7,0x04,0xc1,0x3e,0xdb, - 0x0d,0x11,0xfc,0x0e,0x10,0x4a,0x54,0xa1,0x08,0x3d,0xb8,0x4f,0x32,0xc4,0x50,0x93,0xc6,0x41,0x87,0xb7, - 0xe0,0x9b,0x5e,0x1c,0x41,0x24,0x86,0xbc,0x7c,0xb7,0xbf,0xf5,0xe1,0x6d,0x17,0xae,0x1e,0xa8,0x5d,0x3c, - 0x6f,0x3a,0x88,0x42,0xc5,0xbe,0x1f,0x80,0xb4,0x31,0x4e,0xac,0x11,0x87,0x2e,0xb8,0x01,0xd3,0xbb,0x4f, - 0xb5,0x72,0xb1,0x99,0x36,0x66,0xa7,0x12,0x45,0x1a,0x45,0xca,0x9a,0x8d,0x70,0x39,0x8d,0x5d,0x4d,0x8f, - 0xf8,0xbd,0x00,0x78,0x95,0x5e,0x46,0xbf,0x02,0x40,0xd5,0x71,0xd8,0x7a,0x52,0x67,0x8b,0x62,0x9c,0x77, - 0x56,0x56,0xae,0xd2,0xfa,0x65,0x44,0x5c,0xdc,0x68,0xe5,0x82,0x78,0x13,0xe2,0x65,0x7a,0xcc,0xe9,0x9d, - 0xc3,0x97,0x3d,0x78,0xdd,0x24,0x45,0x79,0x4a,0x53,0xf8,0x46,0xe4,0x31,0xff,0x97,0xb6,0x55,0xb6,0xd0, - 0x18,0xd0,0xac,0x4d,0x2e,0x1a,0x51,0xba,0x22,0xa3,0x51,0x4f,0x06,0x2b,0x0f,0x34,0xab,0x50,0xa2,0x18, - 0x86,0xa3,0x90,0x98,0x9c,0x2e,0xa0,0xe0,0x17,0x01,0x63,0x86,0x67,0x43,0x6c,0x98,0x59,0x26,0xf4,0x04, - 0xa5,0x09,0x3f,0x75,0x15,0x33,0x0b,0x0c,0x4b,0x02,0x74,0x88,0x05,0x0c,0x9a,0x3b,0xb3,0x03,0xe8,0x87, - 0xdd,0x38,0x94,0xf7,0xa0,0xa0,0x09,0xa0,0x9d,0x01,0xf5,0x6c,0x3a,0xdf,0x45,0xf5,0x51,0xca,0xcb,0x86, - 0x9e,0xf2,0x09,0x01,0x53,0xae,0x89,0xd1,0x95,0xdc,0x69,0x55,0xb7,0x69,0x20,0x35,0x8b,0xe3,0x38,0xd0, - 0xa0,0xcd,0xb6,0xe3,0xf4,0x86,0x61,0xef,0xea,0x22,0x25,0xbe,0x9b,0x9f,0xc2,0x7e,0x27,0xbc,0x37,0x14, - 0xac,0x00,0x5b,0xbb,0x60,0x98,0x15,0x8e,0x16,0x9e,0x7f,0x97,0xe0,0xb4,0x17,0xd5,0x2a,0x02,0x71,0x27, - 0x6b,0xda,0x91,0x2b,0x2d,0xe7,0xde,0x4f,0x7c,0x6e,0x14,0xd3,0xc7,0x2d,0x77,0x92,0xfb,0xfb,0x99,0x11, - 0x7c,0x1c,0xab,0xf5,0x72,0xfe,0xd6,0xa8,0x80,0x95,0x45,0x9d,0xdd,0x72,0x20,0x43,0x3d,0x52,0x08,0xe9, - 0x41,0xc3,0x24,0x19,0xec,0x2b,0x65,0xc1,0x82,0xe0,0x59,0xd2,0xdf,0x58,0x5e,0x50,0xec,0x29,0xf4,0x59, - 0x67,0xe5,0xf6,0x30,0xca,0xaf,0xc2,0x58,0xa5,0x19,0xaf,0x2e,0x3f,0xee,0xee,0xbe,0xdf,0xd9,0xfa,0x89, - 0xf7,0x5c,0x38,0x87,0x96,0xc0,0x3b,0x93,0x64,0x7a,0x9c,0xea,0x40,0xc5,0x92,0x76,0x90,0x26,0xd3,0x03, - 0x49,0x2b,0x26,0x61,0x2e,0x89,0x27,0x93,0x70,0xba,0x13,0xa9,0x33,0xd8,0x7e,0xa2,0x93,0x7f,0x0c,0xfb, - 0xd3,0x03,0x49,0x26,0x8c,0xcd,0x74,0xe1,0xe1,0x64,0xba,0x23,0x35,0x5c,0xc2,0x89,0x21,0xd2,0xde,0x64, - 0xd1,0xf4,0x8d,0x78,0x06,0xe2,0x40,0x2b,0xaa,0xfd,0xa0,0x98,0x1e,0x07,0x38,0xae,0xfc,0x71,0x6f,0xe7, - 0xed,0xee,0x09,0xce,0x1c,0xf9,0x5c,0x1c,0x98,0x41,0xb3,0x13,0x78,0x46,0x1a,0x31,0x38,0xf3,0xe4,0x09, - 0xd2,0x35,0x16,0xd0,0xf8,0xc0,0x9b,0x45,0xdf,0x8d,0x1a,0x98,0x6d,0x9a,0x74,0x99,0xc8,0x48,0x4e,0x76, - 0x7c,0xe2,0x74,0x3b,0x98,0x29,0xf5,0xde,0x50,0x88,0xe4,0x43,0x0f,0x31,0x9c,0x4b,0xee,0x3e,0x79,0x12, - 0xde,0xdf,0xfb,0x72,0xcb,0x35,0x0f,0xc3,0x3c,0x86,0x66,0x82,0x6c,0xb8,0xea,0x28,0xc0,0xa4,0x6d,0x6e, - 0xca,0x95,0x56,0x01,0xee,0x6e,0x73,0xb3,0xfd,0xec,0x99,0x68,0x1d,0x92,0xbc,0x42,0x3f,0x9b,0x9b,0x2d, - 0x9f,0xa5,0x9c,0x8e,0x62,0xc8,0x13,0x22,0xc0,0x4d,0xdc,0xcb,0x72,0xd5,0x39,0x71,0xe7,0x25,0x92,0x42, - 0xbe,0xbc,0xf7,0x95,0x57,0x95,0xc4,0x5b,0x76,0x8b,0x06,0x6e,0x50,0xa6,0x53,0xc7,0xe1,0x93,0x2a,0x48, - 0x0e,0x73,0xf4,0x50,0x15,0x0f,0x67,0x8a,0x1b,0x9f,0x31,0x0b,0xd0,0x59,0x75,0x88,0xd1,0x39,0xa3,0x61, - 0x54,0x62,0x58,0x40,0x72,0x14,0xd3,0xd0,0x72,0x84,0xfd,0xbc,0x1c,0x5e,0x33,0xb0,0xda,0xc3,0x8c,0xfe, - 0x4e,0x0d,0xec,0x9d,0x4a,0x20,0xd6,0x13,0xbe,0x72,0xee,0x69,0x54,0xd9,0x24,0x66,0x7e,0x50,0x39,0x19, - 0xfe,0x4c,0xdc,0xdf,0x3a,0xaf,0x2c,0x63,0x72,0x83,0x11,0x88,0x16,0x26,0x8e,0x29,0x1d,0x04,0x23,0x3e, - 0xaa,0x33,0x07,0x75,0xae,0x63,0x1d,0x65,0x63,0xf1,0x25,0x90,0x43,0x37,0x8f,0x1b,0x56,0x72,0x35,0xf6, - 0x53,0x87,0x4b,0x10,0xb7,0x41,0x8b,0x1d,0x1b,0xb4,0x1c,0xd4,0x92,0x98,0x97,0x97,0x87,0xc3,0x6a,0xac, - 0xb1,0x7b,0xe2,0x0c,0x57,0x5e,0x69,0xfb,0x47,0xa1,0x49,0x92,0x0f,0xa3,0xcb,0xc2,0x3d,0x0d,0x7c,0x37, - 0xc1,0x59,0xde,0x26,0xff,0xa5,0xec,0x4e,0x59,0x90,0x98,0xe6,0xba,0x48,0x3c,0xd4,0x96,0x5c,0xd9,0x42, - 0x81,0xce,0x08,0xd1,0x8c,0x14,0xea,0xa0,0x47,0x0e,0xd2,0x15,0xdb,0xa2,0x3c,0x3f,0x21,0x5f,0xe4,0x69, - 0x42,0x1b,0x41,0x2c,0x83,0x00,0x6a,0x2c,0x88,0x66,0x9a,0x24,0x1b,0xc8,0x7b,0x9c,0x05,0x14,0x60,0x55, - 0xd6,0xb3,0x47,0xa8,0x68,0x64,0xcd,0x7f,0xa6,0x01,0x23,0x49,0xa7,0x11,0x87,0xc9,0xa0,0x18,0x6e,0x90, - 0x24,0xab,0x6f,0x17,0x8d,0x84,0x94,0xd3,0x80,0xd0,0x7f,0x6a,0x26,0xd5,0xbc,0x65,0x06,0x61,0xd2,0x4d, - 0x85,0x32,0x99,0x42,0x99,0x8e,0x7a,0xd0,0xa8,0xa3,0x5e,0xbb,0x06,0x6e,0x9a,0xd8,0x44,0x09,0xb0,0xdf, - 0x5e,0x91,0xfa,0xae,0xd3,0x2c,0xc9,0x72,0x3d,0x2e,0x5e,0x8a,0xc9,0xfd,0xaf,0x59,0x1e,0x81,0x35,0x10, - 0xb2,0xb2,0x36,0xe7,0x97,0x2c,0x92,0x25,0xec,0x64,0x5e,0xdc,0xc6,0x04,0x4c,0xbd,0x3e,0x89,0x3b,0x34, - 0xc1,0xfc,0x81,0x1a,0xb3,0x65,0x87,0xb7,0x9e,0xc8,0x5f,0xfc,0x3d,0x65,0x49,0x71,0xcf,0xeb,0x44,0xbf, - 0x7e,0xbd,0x99,0xe5,0x46,0x83,0x85,0xe8,0xb6,0xf3,0x43,0xa5,0x37,0x80,0x2a,0x0a,0x3d,0x32,0x92,0xf3, - 0xbb,0xef,0x56,0x96,0x05,0xb7,0x8d,0x28,0xe7,0x5f,0xa2,0x49,0xd8,0x81,0xa3,0xa4,0x17,0x4f,0xfa,0x21, - 0xc4,0xcd,0x72,0x20,0x03,0x9c,0x19,0x3d,0x8c,0x55,0x81,0xc7,0x7c,0x6b,0xe8,0xeb,0xce,0x3d,0xb4,0x51, - 0x53,0x4f,0x00,0x40,0x75,0xb4,0x78,0x25,0x28,0xec,0xbd,0xbf,0x9f,0xa7,0x18,0x28,0xd9,0x8f,0xae,0x2b, - 0xb5,0xe4,0x54,0x07,0xb1,0xfd,0x91,0x5e,0xe4,0xa1,0x50,0x15,0xaf,0x1c,0x60,0xc2,0xd8,0xb9,0x2d,0xa3, - 0xbc,0x26,0x0b,0xab,0xfb,0x84,0x57,0xd6,0x43,0x12,0x6d,0x39,0x07,0xd6,0x71,0x5d,0x31,0xb3,0xb3,0x54, - 0xc7,0x2e,0xa4,0xb1,0x0b,0xcb,0xb1,0x2b,0x50,0x8d,0xc7,0x04,0x0c,0x26,0xed,0xbf,0x06,0xcf,0xb5,0x05, - 0xbb,0x03,0xcf,0x0c,0x29,0xb1,0xa8,0x63,0x92,0x3d,0x81,0xff,0xe1,0x4d,0xbd,0xcc,0xe3,0xdd,0x01,0x5a, - 0xe1,0x61,0xd6,0x01,0xc3,0x6d,0x98,0x6f,0x77,0x02,0x8f,0x85,0x62,0xb1,0x50,0x10,0x15,0x8a,0x4b,0x33, - 0x78,0x56,0xa7,0xdf,0x56,0x96,0xee,0x50,0xea,0xa5,0xb2,0x32,0x73,0x7d,0x2e,0x38,0x67,0x57,0xef,0x39, - 0xbf,0x79,0x09,0xd9,0x98,0xcd,0x5c,0x6d,0xe7,0x49,0xd3,0x1a,0xf8,0x92,0x1e,0xf0,0xb6,0xa4,0x91,0xdb, - 0x71,0xb0,0x8f,0xe0,0xcc,0x77,0x9e,0xc4,0xcf,0xcd,0x3a,0x8a,0xf1,0x62,0xbc,0xe7,0xdd,0x72,0x6e,0x00, - 0x45,0xdb,0x5b,0x68,0x40,0xb0,0xb9,0xe9,0xcc,0x0e,0x64,0x7a,0x49,0x7c,0x6f,0x96,0x62,0x19,0xf7,0x10, - 0x57,0x89,0x57,0x82,0x08,0x80,0x76,0x41,0xe6,0xdc,0xf8,0x20,0x99,0xb3,0xc2,0x2f,0x63,0x98,0x01,0xe2, - 0x5c,0x0c,0xd6,0x1e,0x21,0x0f,0xcd,0xc3,0x63,0x12,0x95,0x34,0x15,0x10,0x8a,0x1e,0xb9,0x01,0x51,0xbf, - 0x5a,0x3d,0xea,0x05,0xec,0xf2,0xa0,0x08,0xd8,0x1b,0xc5,0x17,0x22,0x31,0x2d,0xdd,0xb4,0xac,0x1d,0x9c, - 0x90,0x29,0x17,0x58,0x39,0xae,0xd7,0x9d,0xbf,0xfd,0x77,0xff,0x17,0xc9,0x8f,0xf1,0xe2,0x01,0x22,0x1e, - 0x75,0xa2,0x7b,0x89,0x6e,0xf0,0x6a,0xf3,0xd6,0x63,0x75,0x78,0xd5,0xa5,0x59,0xc9,0x0d,0xfd,0xf7,0x53, - 0x3f,0x96,0xb3,0xae,0x1e,0xae,0xec,0x04,0xf0,0x3e,0x18,0x91,0xbb,0x1c,0x47,0xdd,0x05,0xf1,0xa2,0x44, - 0x07,0x1a,0x05,0x6c,0x0b,0x70,0x57,0x47,0x92,0xbb,0x75,0xd7,0x4b,0x6f,0x77,0xba,0xe2,0xe9,0xd4,0xb5, - 0xdb,0xc8,0x16,0x49,0xf5,0x66,0x28,0x7d,0x35,0x94,0x5e,0x79,0xfc,0x94,0x85,0x08,0x6a,0x3b,0x33,0xa6, - 0x6c,0x62,0x11,0x66,0x30,0x0d,0x74,0xfc,0xbe,0x2d,0x84,0x4f,0x70,0x5e,0xa1,0xe8,0xef,0xd2,0x12,0x35, - 0xbd,0xe0,0x48,0xa0,0xa7,0xd7,0x74,0x79,0xc3,0xb9,0x68,0xc4,0x52,0xdc,0xc4,0xcb,0x80,0xa9,0xad,0xf7, - 0x7e,0x96,0x36,0x91,0x08,0x95,0x83,0x2c,0xcc,0x13,0xf8,0x01,0x0a,0x37,0x32,0xca,0xa6,0xad,0x1f,0x9e, - 0x6e,0x96,0x69,0xb8,0xc2,0xa4,0xb7,0xe9,0xd4,0xfe,0x9f,0xff,0xfc,0xdf,0xfe,0x27,0x56,0xa0,0x2f,0xb9, - 0xb5,0xe2,0x1b,0xc2,0x87,0xde,0x28,0xa5,0x3d,0x1f,0x07,0xf5,0x24,0x04,0x8c,0x99,0x6b,0x2b,0xee,0xc1, - 0x24,0x36,0x48,0xa8,0x24,0x49,0xd8,0x2f,0xc7,0xba,0xf5,0xcd,0xb1,0x2e,0xb2,0x49,0x65,0xa8,0xe7,0x61, - 0x98,0x1b,0xe7,0xf4,0x5b,0x85,0x30,0xaa,0x61,0x03,0x1a,0xfd,0x54,0x46,0xf9,0x6b,0xb0,0xc0,0xda,0xa4, - 0xf9,0xe9,0x08,0xdc,0x8b,0xd6,0xca,0x55,0x78,0x5b,0x56,0xe3,0xec,0xe6,0xbd,0x60,0xac,0x9c,0x27,0x52, - 0xce,0xd2,0xd2,0xd8,0x92,0x72,0x86,0x8f,0x2c,0x23,0x1c,0xce,0x38,0xf4,0x71,0x62,0x31,0xc4,0xc3,0x87, - 0x87,0x98,0x0f,0x8a,0x79,0x9c,0x87,0x8d,0x7e,0x94,0xf3,0x95,0x0e,0x70,0x75,0x38,0x87,0x3c,0xaa,0x5a, - 0x1c,0xa1,0xa2,0x6a,0x96,0xe0,0x42,0x48,0x85,0x0b,0xae,0xec,0xe5,0x0c,0x6c,0x05,0x98,0x54,0x17,0x58, - 0x66,0xae,0xbe,0xdb,0xc4,0x52,0xb5,0x9b,0x6d,0x39,0xa0,0x2d,0x48,0x54,0xca,0xe5,0x1a,0x9c,0xab,0xc2, - 0xf5,0xd0,0x61,0x96,0x8e,0xa2,0x5c,0x6e,0x0e,0xca,0x63,0xe0,0xd0,0x6f,0x85,0xab,0x34,0xe5,0xbf,0xb6, - 0xd1,0xe8,0xd2,0x9d,0xd9,0x91,0x58,0x54,0xf5,0xaa,0x57,0x51,0xc7,0x24,0xb9,0xf6,0xba,0x92,0x55,0xd9, - 0x0d,0x81,0x70,0xe6,0x86,0x49,0xe1,0xbb,0x92,0xc7,0xf5,0xab,0xf2,0xa8,0xa9,0xd4,0x00,0x0a,0xc6,0xfa, - 0xba,0x20,0x3f,0xa1,0x67,0x1a,0xe4,0x85,0xdb,0x33,0x2c,0x91,0x70,0xc1,0x25,0xdd,0xf2,0x7c,0x42,0x89, - 0xfb,0x52,0xce,0x95,0xf2,0x61,0x63,0x14,0xe6,0x39,0x09,0xc5,0xb8,0xad,0xbe,0xb7,0xa7,0xa5,0xf5,0xf0, - 0xb4,0x38,0x5e,0x45,0x8a,0xc9,0xfd,0xa1,0xd9,0x7b,0x4a,0xa6,0xf4,0x01,0x16,0x34,0xc4,0xbe,0x40,0x5b, - 0x4e,0xf1,0x75,0xf1,0x86,0x63,0x33,0xe7,0x7a,0x97,0xa9,0x50,0x8c,0xe2,0x2b,0x90,0x9e,0x63,0xe2,0x3e, - 0x46,0xe0,0xf9,0x34,0x1d,0x94,0xbb,0xf8,0xba,0x43,0x7b,0x4a,0xaf,0x78,0x07,0xd2,0x6d,0xbd,0x03,0xaf, - 0x80,0x23,0x71,0x57,0xf9,0xfc,0xc0,0xb8,0x07,0x34,0xe4,0xc6,0x1f,0x69,0xe0,0x6d,0x06,0x1d,0x76,0xe3, - 0xa9,0x96,0x42,0xaf,0x74,0xa5,0xd9,0x9f,0xf7,0xe6,0x3a,0xb6,0x4e,0x70,0xb5,0x17,0x4e,0x38,0xbb,0xec, - 0x56,0xb8,0x84,0x7e,0x58,0xdf,0xd9,0xe5,0x53,0xba,0xfa,0xdb,0x6d,0x5a,0x12,0x0f,0xfa,0x70,0x4d,0x2c, - 0x07,0xae,0xb1,0x8f,0xf0,0xbb,0xc7,0xc2,0x01,0x8f,0xc2,0x7e,0x34,0x19,0x39,0xec,0xd3,0x55,0x25,0x71, - 0x70,0x6a,0x1a,0x12,0xe5,0x26,0xd5,0xd5,0x60,0xe2,0xa2,0x2a,0x6c,0x28,0x43,0xd0,0x4d,0x42,0xba,0x1c, - 0x77,0x2d,0x18,0x82,0xbc,0xf8,0x48,0xd3,0xd8,0x31,0x2f,0xb4,0x33,0xab,0xb7,0x0f,0x29,0xbd,0x3b,0x2c, - 0x40,0xeb,0x2f,0xc1,0x58,0xc1,0xe0,0xc5,0xba,0x00,0xa4,0x72,0xd8,0xec,0xe5,0x2e,0xe9,0x91,0x2e,0xcc, - 0xc3,0x5d,0x42,0x29,0x95,0xf2,0x7d,0x58,0x36,0x87,0x6a,0x81,0xbe,0xc7,0xb2,0xdc,0xaa,0xd2,0x17,0xc4, - 0x42,0x98,0x1b,0xae,0x68,0x39,0xf7,0x4a,0x9f,0xb5,0xec,0x9c,0xb6,0xa2,0x0d,0x50,0xaa,0xd5,0x18,0xae, - 0xd0,0x59,0x71,0x3c,0x1a,0x07,0x75,0xd3,0xb9,0xc2,0xd7,0x9c,0xb4,0xe1,0x3b,0xeb,0x7d,0x9e,0x7e,0xec, - 0xb0,0x7d,0xe5,0xbf,0xf7,0xf4,0x8c,0x28,0x36,0x5f,0xeb,0x91,0xcc,0xca,0x4a,0x2f,0x60,0xc7,0xfd,0x7c, - 0xd1,0x46,0x07,0x97,0xb8,0xfd,0xb3,0x85,0x92,0x24,0x8c,0x87,0x49,0x7a,0xb9,0x63,0x56,0xa2,0x13,0x42, - 0x14,0xd1,0x8c,0xee,0xbc,0xa8,0x49,0xd9,0xc8,0x71,0x1f,0x83,0x58,0xc9,0xcf,0x2d,0xaf,0xf1,0x67,0xda, - 0x0f,0x38,0xa9,0x13,0x7a,0xe5,0xc5,0xc4,0xf9,0xca,0xc0,0x87,0xbb,0xe2,0x45,0xe3,0x67,0x79,0x6d,0xed, - 0xd1,0xae,0x08,0x27,0xbd,0xf8,0x87,0x3a,0x25,0x8b,0x13,0xe2,0xf0,0xe3,0xc7,0x19,0x71,0x57,0x95,0x9d, - 0x4e,0x63,0xec,0x8b,0x6a,0x8b,0xc4,0x6a,0xfc,0x95,0xe7,0x7a,0x8b,0x10,0x05,0xe0,0xe7,0x69,0x7c,0x1d, - 0xf6,0x3f,0xca,0x5d,0x36,0xa5,0x68,0xe4,0x5f,0xb7,0x96,0x67,0xe8,0x6d,0xba,0xb9,0x39,0x05,0xc9,0x41, - 0xad,0xc6,0xa0,0x67,0xdc,0x2c,0x63,0xbd,0x3c,0x19,0xbe,0xf4,0x62,0x72,0x41,0xd4,0x2c,0x27,0x56,0x98, - 0x36,0x6f,0x42,0x70,0xa6,0x79,0x8c,0xbe,0x9f,0x92,0xab,0x04,0x3b,0xa0,0x60,0xb0,0x90,0x3f,0xde,0xe9, - 0xfd,0x87,0xa5,0x9e,0xe2,0x6b,0xaf,0x88,0x15,0x73,0x32,0x93,0x91,0xa5,0x37,0x94,0x91,0xe2,0x3c,0x27, - 0x2b,0x45,0xa0,0xdc,0x50,0xc3,0xd8,0x9c,0xe2,0x54,0xe8,0x4d,0x08,0xd7,0x9a,0x4c,0x62,0xac,0x39,0xc0, - 0xee,0x4b,0x14,0x32,0x0b,0x6e,0x7e,0x8d,0xd4,0x62,0x33,0xdd,0x4e,0xce,0x02,0x7e,0x79,0x70,0x90,0x6c, - 0x26,0x9d,0xef,0x8f,0x3f,0x7e,0x68,0x48,0x46,0x74,0x09,0x19,0xf3,0x5f,0x25,0x5a,0xe8,0x0e,0xdd,0x61, - 0x4f,0x56,0xd5,0x70,0x0b,0xe3,0x20,0xa3,0x2d,0x54,0x0b,0xd1,0xe5,0x3e,0x63,0x9a,0xe2,0x0c,0x16,0xc8, - 0x2a,0xe2,0xf5,0x1c,0xcc,0x21,0x0d,0xc9,0x0c,0xcc,0x7c,0x60,0x81,0x8e,0xea,0x01,0x99,0xdd,0x35,0x1e, - 0x1e,0x92,0x84,0xf7,0x1b,0xde,0x9d,0x8b,0x06,0xf8,0xf1,0x92,0x48,0x3b,0xfd,0xf8,0x9c,0xa8,0xc8,0x7a, - 0x3e,0xc3,0xbe,0x89,0xf0,0x11,0x5a,0x0c,0x1b,0x75,0x5a,0x9d,0x3e,0x6f,0xdf,0xee,0xf5,0xd9,0x33,0x94, - 0xc9,0xbb,0x48,0xfb,0xb7,0x15,0x8c,0xa1,0x8d,0x5d,0x6a,0x60,0x81,0x1c,0x0b,0x1e,0xaf,0x8f,0xae,0x7a, - 0xbe,0xdf,0x52,0x03,0x95,0xff,0xba,0x39,0xc9,0x17,0x20,0x59,0x5e,0xdd,0x72,0xf3,0xea,0x96,0x6b,0xc9, - 0x0d,0xa3,0xab,0x37,0x51,0x18,0xf7,0x17,0xa3,0x57,0x05,0xb3,0x19,0xe1,0xb1,0x19,0xb8,0xea,0x38,0xf9, - 0xb4,0x68,0xdc,0x9c,0x4d,0xa7,0xea,0x8d,0xaf,0xd6,0x3c,0xa8,0xc1,0xf0,0xac,0x84,0x33,0x7c,0x40,0xca, - 0xa0,0xc4,0x4a,0x1e,0xed,0xdd,0x77,0x73,0xda,0x38,0x8b,0x06,0x51,0xaa,0x28,0xd9,0xc4,0x60,0x74,0x8a, - 0xc2,0x1f,0xcf,0xb7,0x7a,0x29,0xcb,0x69,0x2e,0x9d,0x88,0xe8,0xc2,0xe4,0x96,0x4a,0xbd,0x50,0xe2,0x02, - 0x0e,0x94,0x62,0x6f,0x91,0xb8,0x40,0xec,0x2d,0xca,0x52,0x5e,0xd1,0x18,0x6e,0xce,0xd5,0x34,0x0c,0x63, - 0x92,0x6e,0xf9,0xfb,0x21,0xd1,0x0b,0x61,0x42,0x22,0x61,0x14,0x26,0x5d,0x12,0x2a,0x9c,0x4e,0x4a,0x24, - 0x62,0xd8,0x9d,0x41,0xd0,0x89,0x5e,0x52,0x77,0x04,0x79,0x67,0xac,0x3a,0xdf,0x0f,0x2f,0x3b,0x85,0x4f, - 0x4d,0x76,0x42,0x3f,0x0b,0x2f,0x82,0x3c,0x94,0xa5,0xd3,0xdb,0xcc,0x8c,0xf8,0xdd,0x71,0x27,0xdd,0x07, - 0xaa,0x24,0x7e,0xa5,0x1f,0x65,0xc5,0x2d,0x7f,0x64,0xbe,0x31,0xe7,0x84,0xb3,0x8b,0x84,0x6a,0xf1,0x9e, - 0x74,0xbb,0x43,0x1f,0x32,0x01,0x1c,0xaf,0xdf,0xc5,0x54,0xc9,0xbd,0x4f,0x4c,0x66,0x8c,0x85,0x88,0x3f, - 0xbc,0xfa,0xf4,0x8b,0xdf,0x23,0x99,0xf1,0x91,0xd6,0xef,0x2d,0x0d,0x88,0xe0,0x3a,0xdc,0x0e,0x32,0x8b, - 0xc3,0x99,0x1f,0x5a,0x88,0x03,0xf0,0x47,0xee,0x27,0x55,0xbe,0x4c,0x65,0x8f,0xb3,0x48,0xc9,0x0b,0x54, - 0x17,0xd8,0xd1,0xa0,0x52,0x4c,0x8e,0xa0,0x30,0x1d,0xc4,0x61,0x66,0x7d,0xbe,0x3f,0xb2,0x10,0x03,0x77, - 0xb2,0xf8,0xf0,0x22,0xc8,0xcc,0x51,0xa0,0xd2,0x02,0xe8,0x24,0xf0,0x26,0x47,0x93,0x3a,0x77,0xa0,0xe5, - 0x3a,0x93,0x84,0x9d,0x13,0x3a,0x0b,0x71,0x61,0xc0,0x58,0x46,0x80,0xf8,0x89,0x99,0x3e,0xaa,0x9f,0x88, - 0x1c,0x77,0xb7,0x48,0xe0,0x77,0x9c,0xc0,0xc1,0x53,0xe0,0xc3,0x7d,0x6e,0xa7,0x60,0xa9,0xeb,0x81,0x2b, - 0x02,0xe8,0xb4,0x46,0x0d,0x06,0xae,0xa1,0x60,0xeb,0x16,0x40,0x19,0x47,0x20,0xb4,0xc7,0x53,0x9c,0x77, - 0x1d,0x13,0xbe,0xc5,0x15,0x0d,0xe0,0x59,0x84,0x84,0x92,0x5e,0x00,0x6e,0x77,0x1d,0xbb,0xdb,0x51,0x98, - 0x47,0x5f,0xc3,0x8f,0x17,0xe2,0xc0,0xcf,0x05,0x5e,0x3c,0x78,0x4d,0x26,0x70,0xd0,0x74,0x1f,0x22,0xe4, - 0x02,0xa1,0x91,0xeb,0xd4,0xeb,0x52,0x5d,0x7d,0x48,0xdc,0x63,0x43,0x3c,0x43,0xbc,0x0b,0x71,0x49,0xb6, - 0x0c,0xd7,0x70,0x24,0x5f,0xa4,0x52,0x75,0xa9,0xdf,0x9b,0xcc,0x83,0x24,0xaa,0xfd,0x18,0xb7,0xae,0x98, - 0x24,0xa9,0xce,0x68,0xb0,0x88,0x5a,0xd5,0xe4,0x3a,0x76,0x53,0x31,0x86,0x73,0x45,0x5c,0x91,0x5e,0x6d, - 0x66,0x8d,0x58,0x9e,0xbc,0x2c,0x9a,0x0c,0x88,0x0f,0xaf,0x5e,0xb5,0x6e,0xc5,0xac,0x51,0xe0,0x55,0x4f, - 0x04,0x19,0x26,0x10,0xca,0x86,0xba,0xe5,0x72,0x98,0xf9,0x37,0x57,0xa7,0x54,0x9b,0x5c,0x0c,0xf2,0x01, - 0x8a,0x9c,0x09,0xd2,0x2a,0xa0,0x65,0x9a,0x16,0x07,0x94,0x16,0x25,0x38,0xef,0x79,0xf6,0xfb,0x5a,0x73, - 0xfc,0xa5,0x56,0xff,0x43,0x93,0x1f,0xa8,0x73,0xbc,0xf4,0xbf,0x7d,0x0e,0x5a,0x1a,0x2d,0x81,0x02,0x62, - 0xe3,0x57,0x3d,0xed,0xe8,0xa9,0x26,0x1a,0x4b,0xf8,0xe4,0x67,0x7e,0x5a,0x3a,0xcf,0x17,0x39,0xa7,0xa7, - 0x36,0x01,0x53,0x95,0x4a,0x60,0x54,0x0f,0x7b,0x75,0xe2,0x4a,0x84,0xaa,0x0d,0xc3,0x80,0x2d,0xc4,0xe4, - 0x24,0x04,0x09,0x6d,0xf5,0x42,0x1b,0x73,0x3e,0x4f,0xc4,0x06,0x8a,0x8a,0xe5,0x9a,0x80,0xcd,0x96,0x48, - 0x37,0xd9,0xad,0x5b,0x6d,0xcc,0xca,0x66,0xec,0xe1,0xed,0x1e,0x6c,0xcb,0x7a,0xa2,0x3b,0x1a,0x7b,0x46, - 0xe4,0xd1,0x8a,0x1c,0xbc,0xb1,0xd5,0x09,0x30,0xc7,0x02,0x2f,0x32,0xac,0x44,0xef,0x71,0xf6,0x2f,0x86, - 0x6a,0x54,0x1a,0xc7,0x34,0xc5,0xe9,0x0f,0x51,0x78,0xe3,0xde,0xc1,0xf1,0xe7,0x75,0x94,0x66,0x54,0x1b, - 0x3b,0xbb,0x71,0x68,0x97,0x48,0x7b,0x57,0xe0,0x61,0x02,0x16,0x66,0x40,0xa2,0x15,0x38,0x3d,0xb9,0x3c, - 0x33,0xe8,0x49,0x7d,0x8a,0xef,0xc5,0x19,0x18,0xee,0x97,0x6d,0x45,0x2d,0x9e,0x8e,0x43,0x12,0x68,0x45, - 0xbc,0x54,0x83,0x6e,0xa6,0x25,0x52,0x5f,0xe5,0xb4,0x17,0x55,0xd7,0x20,0xc9,0x9a,0xa7,0x67,0x24,0x53, - 0xd2,0x1f,0xa6,0x02,0xb1,0xa1,0x02,0x3d,0x43,0x05,0xfa,0x42,0x05,0xc6,0xf4,0xb1,0x26,0x88,0xeb,0x95, - 0x13,0xb1,0xb1,0x9b,0x55,0x84,0x7a,0xa6,0xdf,0x44,0x97,0x15,0xd1,0xc6,0x61,0x8c,0x8d,0xf4,0xec,0xcc, - 0x1d,0x4a,0xff,0x0d,0x71,0xce,0x5d,0x51,0x96,0x3b,0x25,0x8c,0x3a,0x33,0x57,0x36,0x76,0x29,0x2d,0x0d, - 0x74,0xe1,0x44,0xb8,0x9b,0x99,0x58,0x18,0x7c,0x7a,0x03,0xa5,0x79,0xe8,0x79,0x42,0xbf,0xb4,0x4a,0x8b, - 0x68,0x08,0xdd,0xeb,0x34,0xea,0xd7,0x9a,0xac,0x64,0xa3,0x74,0x29,0xcd,0xe5,0x99,0x52,0x61,0x44,0x9e, - 0x67,0x51,0x2d,0x70,0xf6,0x16,0xcc,0xd0,0x07,0xb9,0xff,0xf6,0x9c,0x97,0x47,0x3d,0x7a,0xc3,0xb8,0xbb, - 0x5f,0x7f,0x60,0x6c,0x6c,0x8d,0xdc,0xf0,0x94,0xad,0x6a,0xce,0xba,0x85,0x80,0x83,0xa5,0x4c,0x1d,0x17, - 0x2f,0x9d,0x4b,0x4b,0xca,0xee,0x06,0xce,0x4e,0x07,0x58,0x5a,0x76,0xae,0xab,0x3e,0xe1,0xc3,0x89,0x9e, - 0x7d,0xc0,0xb4,0x5e,0x2a,0x0c,0x26,0x3c,0xd3,0x95,0x0e,0x35,0x64,0x6b,0x86,0x9e,0x8b,0x91,0x0f,0xcc, - 0xae,0xa1,0x8e,0x7e,0x5c,0x9b,0xa3,0x5d,0x74,0x72,0xd2,0xab,0x9c,0x9c,0x4c,0x58,0x22,0xea,0x7f,0xf3, - 0xb0,0xf1,0xd1,0xe1,0x50,0xb0,0xc9,0x5e,0xee,0xa9,0x3a,0xc3,0x72,0x85,0xfa,0x16,0x52,0x53,0x43,0xcc, - 0xd1,0xe5,0x16,0xdd,0xf1,0x66,0x28,0x6c,0xa6,0xa5,0x58,0x3f,0x9c,0x57,0x3e,0x66,0xea,0x2a,0x97,0x35, - 0x5a,0x0b,0xb9,0x0a,0xc8,0x83,0x4c,0xe9,0x84,0xc7,0x1b,0xd0,0xe9,0xa5,0xe5,0x4f,0xc6,0x10,0xfb,0x3b, - 0x13,0x3f,0x4d,0x3e,0xc9,0x63,0x7a,0x3f,0xab,0xbe,0x75,0xac,0x96,0x2a,0x08,0xc2,0xfc,0x49,0x10,0x21, - 0x8b,0x51,0x73,0x3e,0xe5,0x53,0xf2,0x33,0x92,0x0c,0xa2,0x92,0x51,0xb5,0x0d,0xb0,0x02,0xdb,0xfa,0x2a, - 0x10,0xfd,0x7f,0x8e,0x2e,0xe2,0xc2,0x59,0x45,0x2d,0x99,0x4e,0xb5,0x5f,0x63,0x4a,0xe6,0xfc,0x1b,0x4f, - 0x74,0xac,0x23,0xbd,0x2e,0x71,0xd4,0x1e,0x25,0x93,0xd0,0x50,0x3d,0x73,0xad,0x55,0xb2,0xca,0xf8,0x92, - 0xff,0x34,0x10,0x90,0x61,0xd3,0x3c,0xb9,0x09,0x32,0x12,0x22,0xb6,0xfc,0x0b,0x8a,0x4b,0xd4,0xd3,0x1e, - 0xbd,0xfc,0x34,0x14,0xa4,0xe6,0xb1,0x37,0x73,0x05,0xb2,0x86,0x1d,0x5a,0xe6,0x2b,0x23,0x7e,0x25,0x25, - 0x14,0xc4,0xcc,0xf6,0xca,0xcb,0x30,0x9a,0x29,0x4b,0x36,0xb0,0x8c,0x88,0xfa,0xd7,0xf0,0x3b,0xd5,0x3f, - 0x0e,0xf5,0x36,0x33,0x33,0x84,0xc6,0x32,0xa0,0xd1,0x68,0x54,0x47,0x8b,0xaf,0xed,0x60,0xa1,0x72,0x06, - 0xa2,0x67,0xe7,0x25,0xf6,0x48,0x3e,0xc9,0x75,0x2c,0x22,0x1e,0xab,0x4c,0x8f,0x55,0x45,0xa1,0x37,0x25, - 0xf2,0x33,0x37,0x52,0x6f,0x68,0xc7,0xe8,0x5f,0xb3,0xc9,0xd6,0x0d,0x09,0x52,0xcb,0xce,0x14,0x12,0x36, - 0x7c,0xe1,0xda,0x43,0x64,0x8f,0x44,0x6a,0x8f,0x84,0x7c,0x5c,0xf0,0x2f,0xf7,0x11,0x4e,0x85,0xf9,0x8d, - 0x37,0x36,0x10,0xa4,0x99,0xe1,0x51,0xa1,0x5f,0x7e,0x78,0xfb,0xe1,0xb8,0xcb,0xda,0x5f,0x9d,0x95,0x95, - 0x9b,0x9b,0x9b,0xc6,0xcd,0x2a,0x9c,0x12,0xaf,0xb4,0x9b,0xcd,0xe6,0x4a,0x7e,0x3d,0x70,0x4a,0x62,0x0d, - 0x2d,0x56,0x9b,0xf1,0x32,0x6c,0x14,0xe1,0x09,0x21,0xac,0x62,0xa2,0x3e,0x1c,0xbb,0x5c,0xa9,0xef,0xe0, - 0x6b,0x6f,0xbd,0x98,0x91,0x14,0x79,0x3b,0x65,0x9d,0x58,0x80,0xb8,0xe8,0x16,0xa0,0xf4,0x17,0xcc,0x77, - 0x00,0x86,0xab,0xfa,0x56,0x7b,0xa2,0x56,0xa6,0xa6,0x3d,0x59,0xac,0x40,0xf6,0x5d,0x84,0x4d,0xd8,0xda, - 0x26,0x93,0x32,0x58,0x13,0x31,0xf1,0x7f,0x5f,0xda,0x8b,0x6d,0x6c,0xb4,0x9e,0x2f,0xb5,0x9f,0x3d,0xf3, - 0x36,0x36,0x8a,0x57,0xaf,0xe8,0xbf,0xd6,0xf3,0x29,0x52,0x5f,0x54,0x12,0x5f,0x4c,0x5d,0x7a,0x5d,0x0a, - 0x55,0x42,0x39,0x58,0x54,0x99,0xd2,0xc3,0x15,0xf5,0x32,0x7d,0xbc,0x0e,0x35,0xf1,0xf5,0xa4,0x0c,0x0b, - 0x14,0xe8,0x43,0x51,0xf7,0xf4,0xb4,0xe9,0x37,0x09,0xbf,0xcc,0x49,0x7c,0x44,0x45,0x23,0xaa,0x33,0x2a, - 0x4b,0x17,0x5d,0x00,0xe9,0x86,0xa7,0x11,0x56,0xcf,0x7a,0x60,0x4e,0xe0,0x02,0x75,0x02,0x47,0xbf,0xc4, - 0xed,0x7a,0xf7,0x84,0x7d,0xf2,0xf8,0xaa,0xdb,0x7e,0xf6,0x5c,0xe1,0xdf,0xdd,0x08,0x3c,0x39,0x76,0xff, - 0x7b,0x1b,0xce,0xfd,0xaf,0x37,0x55,0x15,0x38,0xda,0xce,0x83,0x6e,0x8b,0xba,0x43,0xe2,0x44,0xb0,0xdc, - 0x62,0x49,0x2e,0x37,0x21,0xc1,0xb2,0x6e,0xb4,0xdc,0xa2,0x4d,0xbf,0xa0,0xbf,0x71,0xb7,0xe9,0xf7,0xba, - 0xcd,0xca,0x25,0x1c,0x83,0x3f,0xed,0x86,0xaf,0x5e,0xf5,0xfc,0xde,0x72,0x37,0x5d,0xef,0x6d,0x74,0x5f, - 0xac,0x7b,0x89,0x90,0x52,0x8c,0x16,0x58,0x91,0x0d,0x4a,0xf4,0x7b,0xf5,0xee,0x8b,0xfb,0xf5,0x3e,0x8c, - 0x2c,0xd0,0xc6,0x98,0x2d,0x10,0xd6,0xcb,0xa1,0x6a,0xad,0x27,0xaf,0xb4,0xf0,0x66,0x0f,0x1a,0xb1,0x83, - 0xa7,0xc9,0x19,0xb5,0x2c,0x36,0x04,0xd4,0xc3,0xa7,0xe3,0xe5,0x98,0xd7,0x9c,0xd9,0xac,0x7b,0xac,0x51, - 0xdf,0x77,0xc7,0xb4,0x60,0x5f,0xad,0x35,0x5f,0x3e,0xf7,0x50,0x2f,0x9f,0x5b,0xe8,0x0f,0xfc,0x8c,0xaa, - 0x5c,0xcf,0x36,0xa8,0xab,0xe9,0xd2,0x52,0xfa,0xaa,0xd5,0x5e,0xf7,0xd2,0xe5,0xe5,0xf5,0x30,0xce,0xc3, - 0x1a,0xa0,0xf2,0x17,0xf6,0x7a,0x7d,0xdc,0x8d,0xef,0xb9,0xcc,0xb8,0xdb,0xd3,0x64,0x86,0x1b,0xe2,0x63, - 0x9f,0x1e,0x6e,0x20,0xec,0xbe,0x26,0x95,0xd1,0xde,0x4d,0x7a,0x69,0x7f,0x81,0x66,0x19,0x2c,0x5b,0xbb, - 0xc5,0xd3,0x00,0xd1,0xa4,0xe8,0x6f,0xda,0xe5,0xf3,0x1e,0x53,0x0f,0x49,0x6a,0x1a,0xf7,0x70,0x8b,0xaa, - 0xc6,0x59,0x61,0x05,0x6c,0x5a,0x42,0x4f,0xdb,0x19,0xe2,0x08,0x3a,0x7b,0x4d,0x8d,0x6c,0x15,0x6e,0x93, - 0x56,0xfa,0x3a,0x6d,0x53,0x6f,0xf7,0xde,0xbc,0x78,0x19,0x80,0x0e,0xe0,0x14,0x24,0x75,0x33,0x88,0x5d, - 0x5c,0xbc,0xd5,0x6a,0xfb,0x84,0x78,0xe6,0x7d,0x75,0xd5,0x87,0xbe,0x58,0xab,0x45,0xed,0xb8,0xce,0x87, - 0xdd,0x93,0xe3,0xd7,0x5b,0x87,0xbb,0xed,0x06,0xa4,0x54,0x5d,0xc4,0x6f,0xe1,0x13,0xfa,0xc8,0xcc,0x15, - 0x21,0xc2,0x7a,0x5c,0xce,0x55,0x5c,0xce,0x15,0x71,0xc3,0xa7,0xf1,0x99,0xdf,0xc7,0xcf,0x72,0x8b,0x18, - 0xc5,0x11,0xc9,0xfa,0x79,0x67,0x72,0xdf,0xb5,0x96,0x48,0xaf,0x31,0xfe,0xe2,0x17,0x4f,0x13,0x48,0xd5, - 0x20,0xbe,0x63,0x1d,0x26,0x8d,0xf1,0x62,0x44,0x88,0x80,0x86,0xd6,0x69,0xa2,0x46,0xaf,0xc6,0x8c,0xd7, - 0xeb,0xde,0x88,0x66,0xca,0x82,0x79,0xed,0xa5,0xbf,0xe6,0xaf,0xa1,0x6f,0xc6,0x54,0xa1,0xfd,0xcc,0x37, - 0x26,0x0e,0x6d,0xdf,0x8a,0xc1,0xe3,0xf6,0x37,0xfb,0x8d,0xa2,0xde,0x6b,0x14,0xf0,0xfa,0xe0,0xad,0xb4, - 0x9a,0x7c,0xa4,0xab,0x6a,0xb3,0x47,0x63,0x8d,0x6b,0x6c,0x9a,0x3f,0xb3,0x83,0xd7,0x7e,0x31,0x1d,0xd5, - 0x5b,0xe5,0x38,0x84,0x34,0x0e,0xe1,0x2b,0xc0,0xb9,0x1e,0xda,0xcb,0xb6,0x39,0x1d,0x12,0x19,0xd7,0xf0, - 0x16,0x9a,0xb8,0xf8,0x85,0x9a,0x54,0x8c,0xf9,0x52,0xa1,0xa9,0xf2,0x00,0xd8,0x70,0x89,0x3f,0x17,0x18, - 0xa5,0xb7,0x30,0xef,0xf4,0xfc,0x9b,0x6e,0x50,0xbf,0x98,0x69,0x29,0x91,0x66,0x2e,0xd5,0xc0,0xc3,0x06, - 0xc5,0x22,0x34,0x09,0x51,0x8f,0x0a,0xad,0x19,0xf3,0x7a,0x61,0x1a,0x82,0x21,0x3f,0x0d,0x9f,0x16,0xcb, - 0xb4,0x90,0x26,0xde,0x6c,0x0f,0x6e,0xb8,0xde,0x4b,0x01,0x37,0x98,0xcd,0xbd,0xb0,0x73,0x9b,0xde,0xfd, - 0xc2,0x6f,0x2b,0x69,0x1a,0x40,0xce,0x1a,0xc8,0x87,0x97,0xd0,0xb7,0x5f,0x5c,0xf3,0x37,0xbf,0x6d,0xea, - 0xa1,0xba,0xee,0x5a,0x53,0x3c,0xf2,0xfc,0xdb,0xae,0xa2,0x68,0x03,0xff,0xda,0xd3,0xe3,0x7d,0x3d,0xdb, - 0xcc,0x6d,0x59,0x65,0x17,0x4b,0xca,0xcc,0x93,0x85,0x3b,0xcf,0x7c,0x5d,0xaa,0x1e,0x9a,0x9a,0x0a,0x6f, - 0xe1,0x00,0xab,0xdc,0xdb,0xd3,0x90,0x86,0x93,0xa8,0xaf,0x01,0xd2,0x9c,0xe4,0x72,0xc2,0xb3,0x97,0x1e, - 0x87,0x7e,0xfb,0x14,0x25,0xc5,0x0b,0xb9,0xf0,0x8c,0xbc,0x72,0xf7,0xa1,0x79,0xc6,0xca,0x0e,0x37,0x5a, - 0x9b,0xa6,0x53,0x2d,0x1b,0x6f,0x43,0xc6,0xd4,0x4e,0xd3,0xdf,0x7b,0xfd,0xf1,0xc3,0xf9,0xc1,0xd6,0x1f, - 0xbb,0xab,0xed,0x59,0xdb,0xee,0x68,0x34,0x38,0x49,0xdf,0x12,0xe9,0x63,0x0a,0x53,0x4e,0xbd,0x43,0x15, - 0x84,0x97,0xf0,0x42,0xef,0x3c,0xd1,0xc7,0xc6,0x7b,0x23,0xe2,0xc5,0xb7,0xa3,0x82,0x58,0x83,0xa5,0x25, - 0x30,0x7e,0xf0,0xb3,0xd8,0x9b,0xc9,0xd9,0x0c,0x3b,0xc2,0xd1,0xcb,0xb6,0x6b,0xe5,0xb8,0x7c,0x59,0x56, - 0x60,0xf7,0x61,0x5f,0xfc,0x20,0x97,0x78,0x19,0xf2,0xf9,0x88,0xba,0x88,0xec,0x05,0xc9,0x75,0x40,0x1b, - 0xfe,0x1d,0x17,0x21,0xbe,0x5b,0x72,0x49,0x9a,0xf4,0x80,0x8c,0x6c,0x63,0xf0,0x85,0x58,0x95,0x76,0x1f, - 0x9b,0x77,0x23,0x42,0xf5,0xc6,0xe1,0xab,0xb2,0x61,0xec,0x46,0x4f,0x88,0x0b,0x95,0x46,0xa6,0xd3,0x9c, - 0x5f,0x74,0x23,0x8d,0x3e,0x71,0x4c,0x0c,0x94,0x1b,0x30,0x55,0x62,0x05,0xd1,0xa0,0xd1,0x8b,0xd3,0x3c, - 0x84,0x00,0xcc,0x0f,0xae,0x67,0x31,0x5f,0xd4,0x2c,0x7f,0x00,0xc7,0x85,0xae,0xfe,0x84,0x8f,0x3f,0x88, - 0xb4,0x5a,0x56,0xe0,0x82,0x2b,0xd1,0xd3,0xbc,0xba,0x96,0xd3,0xd3,0xb5,0xa7,0xe1,0xf2,0xea,0xd9,0x0a, - 0xe1,0xc8,0x7a,0x2c,0x33,0x6b,0x4d,0x12,0x67,0x9f,0x3d,0x2d,0x3c,0x66,0x19,0x66,0x33,0x88,0x04,0x72, - 0xd6,0x8b,0xf9,0x9c,0x36,0x72,0x0c,0xca,0x00,0x4f,0xb6,0xe3,0xf4,0xc2,0x3d,0x2d,0x37,0x8d,0xd3,0xbb, - 0x82,0x26,0x7f,0xfc,0xa5,0x13,0xdf,0x9f,0xf1,0x11,0x49,0xcb,0x3b,0xd3,0x07,0xf8,0x3c,0x70,0x2b,0x54, - 0x16,0xa1,0x17,0x66,0x71,0x82,0x40,0xdf,0xca,0x15,0x52,0xf0,0xbe,0xf8,0x64,0xe5,0x67,0xfe,0xe0,0xf3, - 0x8a,0x3b,0x4e,0x06,0xd3,0x3f,0x8f,0xc3,0x81,0xf7,0xbb,0x95,0x46,0x11,0xb2,0x94,0x86,0x1a,0x59,0x65, - 0x77,0x69,0xe9,0xc9,0xca,0xe7,0x86,0x2e,0xb2,0x89,0x32,0x91,0x14,0x52,0x2a,0xbd,0x1a,0x58,0x1d,0x5f, - 0x53,0xb3,0x10,0x8f,0x60,0x0c,0x42,0x53,0x0a,0xba,0xc0,0xc6,0x52,0xa6,0xb1,0xe4,0xda,0xd4,0xb4,0x25, - 0x7a,0xda,0xfc,0x60,0x03,0x56,0x81,0x11,0xfd,0xdd,0x44,0x2b,0x9d,0xbb,0x0b,0x1a,0x14,0x85,0x91,0x25, - 0xae,0xc3,0x34,0x65,0x64,0xf4,0x4e,0x0b,0xeb,0x6e,0xef,0x73,0xe3,0xf4,0xe7,0xc6,0xd9,0xf2,0xef,0xd8, - 0xee,0x68,0xd9,0x69,0xf0,0x08,0xcd,0x5d,0xb5,0xb0,0xd9,0xcc,0xec,0xb0,0xf5,0xb3,0x74,0x7c,0x5c,0x04, - 0x5a,0x0f,0xdc,0xb3,0xb6,0xdc,0x00,0x5b,0xae,0x11,0x17,0x8a,0xd2,0xec,0x10,0x0d,0x52,0x13,0x34,0x4e, - 0xbe,0xd3,0xf8,0xf3,0x78,0x00,0x4d,0x5a,0x0f,0xdc,0x18,0xa2,0x36,0x5a,0x56,0x78,0xfd,0x30,0x7e,0x13, - 0xa1,0x66,0x8e,0x11,0x17,0xd8,0x21,0x45,0x67,0x2c,0x2d,0x17,0xdd,0xdf,0x44,0x75,0xb5,0x2d,0x44,0x90, - 0x09,0x70,0x5a,0xcd,0x17,0xc6,0x5d,0xe7,0x3b,0x62,0xdb,0x61,0x52,0x8f,0xa4,0x23,0x28,0x21,0x03,0xbd, - 0x93,0xa7,0x24,0xed,0x3e,0x8d,0x4a,0xd2,0x95,0x11,0x62,0x67,0xaf,0x88,0xcd,0x58,0x5a,0xca,0x5e,0x69, - 0x8d,0xd0,0xf5,0xcc,0xde,0x29,0x48,0x84,0x3c,0xab,0x56,0x9d,0x0d,0x2e,0x5c,0x07,0xf6,0xad,0x9a,0x31, - 0x5e,0x26,0x7e,0x9a,0xdf,0x5f,0x58,0xaf,0xd8,0xc7,0xe0,0x66,0xc0,0xab,0x40,0x91,0xfd,0x1e,0x30,0xb8, - 0xd9,0x4a,0x32,0x6d,0x7a,0x4f,0x81,0xb9,0xb9,0xa7,0xfd,0x5f,0x4c,0xc6,0x72,0x2b,0xcf,0xba,0xe4,0x55, - 0x42,0x2c,0x61,0x3f,0xc3,0x95,0x17,0xcf,0xd7,0x68,0x9b,0xf6,0x93,0x4a,0xea,0xef,0x39,0x75,0x65,0xf5, - 0x39,0x65,0x29,0xfc,0x71,0x8b,0xcd,0x62,0xd9,0xe9,0xd7,0x58,0x83,0x69,0xd9,0x25,0x62,0x54,0x6c,0x26, - 0xcb,0xce,0x50,0x25,0x54,0xbe,0xc6,0x77,0x1c,0x45,0xd4,0x19,0x39,0xa2,0xcd,0xf7,0x63,0x9a,0x31,0x07, - 0x4b,0x23,0xbe,0xd1,0xad,0x3f,0x7b,0xb6,0xe9,0x84,0x5f,0x7a,0xec,0x27,0x17,0x46,0x56,0x94,0xf4,0x9c, - 0x92,0xd8,0xcc,0x94,0xdf,0xfe,0x40,0x6f,0x97,0x41,0x94,0x51,0xdd,0x08,0x4e,0x46,0xec,0x11,0x89,0x36, - 0xa3,0x71,0x57,0x21,0x4b,0x77,0xc3,0xd0,0xf0,0xc2,0x37,0xdb,0x4a,0xc2,0xf7,0x28,0x27,0x1f,0x3f,0xec, - 0x76,0xef,0xd2,0x2b,0xa8,0xd7,0x67,0x6e,0xbd,0x9e,0x5e,0xd1,0x70,0xdd,0x04,0x59,0xa2,0x13,0xf0,0x8c, - 0x11,0xcc,0x32,0x9d,0x42,0x8f,0x94,0x90,0x84,0x93,0x22,0x0b,0x62,0x9d,0x18,0xf4,0x7a,0x9e,0x63,0xdd, - 0x51,0x5d,0x47,0x84,0xad,0x3b,0xe1,0x65,0x6e,0x1b,0x73,0x9f,0xb2,0x99,0xb6,0xa3,0x7c,0x60,0x1e,0x8a, - 0xdb,0x68,0x1c,0x38,0x87,0xb6,0x81,0x71,0x35,0x7b,0x5d,0x71,0xb0,0x77,0x51,0xaf,0x83,0x2f,0x1d,0xff, - 0x0a,0x9a,0x0e,0xaa,0x10,0x75,0xf5,0xba,0xd4,0x1f,0xf7,0x27,0xf0,0xbc,0xeb,0xe3,0xfc,0x8f,0x07,0x80, - 0xc9,0x30,0xd8,0x2a,0x1f,0xce,0x27,0x3b,0xc1,0x46,0x77,0xad,0xb9,0xe9,0xa4,0x57,0x0e,0x1e,0xdb,0xf4, - 0x88,0xce,0x41,0x9b,0x23,0xc3,0xb5,0x44,0xc7,0x35,0x6d,0xff,0x90,0xc6,0x70,0x67,0xbd,0xb9,0xd9,0xf4, - 0x1a,0x45,0xfa,0x26,0xfa,0x12,0xf6,0xdd,0x36,0xee,0x9a,0x7f,0x70,0x8c,0x67,0x02,0x80,0xca,0x91,0xe7, - 0xf2,0x3c,0x42,0xb7,0x6c,0x38,0xc5,0x69,0x0f,0x03,0xca,0x8f,0x73,0x50,0x42,0xd5,0xcd,0x82,0x93,0x60, - 0x7c,0xea,0x92,0x7c,0x03,0x0e,0xf0,0x79,0x73,0x16,0x68,0x9e,0x6d,0x05,0x35,0xcf,0x75,0x15,0x6c,0x8d, - 0x30,0x50,0x62,0xf7,0x94,0x61,0xd2,0x7e,0x78,0x1d,0xc6,0x73,0x23,0x5b,0x66,0x55,0x46,0x15,0xc6,0x48, - 0x02,0xac,0x98,0xdc,0x58,0xd0,0x5a,0x3b,0x43,0xe0,0x7d,0x6b,0x7c,0x1d,0x85,0x13,0x6a,0x2c,0xe3,0x7e, - 0x76,0x14,0xdc,0x60,0x0c,0x69,0xe0,0x70,0x96,0x70,0xaf,0x77,0x14,0xa7,0x28,0xfd,0x48,0x33,0x90,0x46, - 0x4e,0x61,0x78,0x90,0xab,0x00,0xe2,0xc7,0xc5,0xf0,0xb4,0x9a,0x4f,0x61,0x00,0x6f,0x2a,0x62,0xde,0x19, - 0x10,0xfe,0xf3,0x3f,0x39,0x33,0xf0,0x60,0x58,0x86,0xca,0xa5,0xf6,0x82,0xf6,0x86,0xd0,0xc7,0xe1,0xe6, - 0xf0,0xb4,0xb8,0xb5,0xb0,0xa1,0x2b,0x58,0x30,0x0c,0x65,0xe6,0xe2,0xf1,0x40,0xfb,0x97,0xe3,0x7c,0x41, - 0xd3,0x48,0xa5,0xa6,0x9d,0x37,0x87,0xc7,0x4e,0xd9,0x2e,0x91,0xab,0x71,0xce,0xcd,0xcc,0x22,0x09,0xe7, - 0xac,0xac,0xb5,0x2b,0xed,0x70,0x62,0x89,0xdb,0xea,0x95,0x76,0xa9,0x19,0x44,0x71,0x56,0x6a,0x6b,0x6d, - 0x00,0x63,0x89,0x81,0xbc,0x4e,0x4f,0x98,0xfc,0x9b,0x1d,0x68,0xee,0x4a,0xe2,0x9a,0xb5,0xf0,0xe7,0x92, - 0xaf,0xa0,0x87,0xce,0x27,0x31,0x8d,0xa8,0xe7,0xcd,0x2b,0x7d,0x5e,0x79,0xf3,0x97,0x17,0xce,0x35,0x6b, - 0x7c,0x5e,0xc3,0x18,0x9a,0xef,0x3e,0x26,0xa6,0xf8,0x44,0x5f,0x78,0x88,0x69,0x09,0x16,0x63,0x26,0x1b, - 0xed,0x5c,0x25,0x17,0x5a,0xc5,0x57,0x1d,0xd0,0x74,0xe4,0x80,0xe6,0x5e,0x59,0xaf,0xf9,0x77,0xea,0x8e, - 0x51,0x18,0x3d,0x67,0x99,0xeb,0x32,0x2b,0xb9,0x45,0x08,0xf9,0xfb,0x75,0xb8,0xba,0x96,0xd8,0x00,0x54, - 0x00,0x64,0xf0,0x94,0xd0,0x89,0x86,0xf3,0x0c,0x77,0x17,0x61,0x63,0xc1,0xcd,0x4c,0xce,0xa0,0xeb,0x7b, - 0x19,0x45,0x06,0x46,0x61,0x11,0xec,0x11,0x1a,0x96,0xc4,0x76,0x76,0x1c,0xa0,0xa2,0x62,0xee,0xb7,0x37, - 0x55,0x65,0xc9,0xbd,0x78,0x82,0x2a,0x2f,0x1f,0x3d,0x9b,0x78,0x8a,0xe5,0xb7,0x4d,0x3b,0x2b,0x0c,0x2c, - 0x5f,0x32,0x11,0x4b,0x83,0xb3,0x29,0xe9,0xe3,0x6a,0xbb,0xa9,0xd9,0xd9,0x17,0x4d,0xa5,0x8e,0x4b,0x3c, - 0xc9,0xbc,0x2a,0x74,0x1c,0x5d,0x87,0x63,0x5a,0x76,0xde,0xbd,0xf0,0x3f,0x73,0x8c,0xaf,0x9c,0xf7,0xac, - 0xb6,0x89,0x85,0x7e,0x51,0x31,0xbc,0x79,0xd0,0xd0,0xcb,0xc4,0xbf,0x50,0x4a,0x1b,0xca,0xc8,0x7e,0x53, - 0xfd,0x36,0xca,0xf0,0x09,0x9d,0x16,0x81,0x39,0x0b,0x51,0x99,0xcd,0x40,0xa5,0xdf,0x32,0xfd,0x7a,0xbc, - 0x7a,0xef,0x51,0xf5,0x72,0xb6,0xb7,0x99,0xf7,0xcb,0xa0,0xd4,0x5e,0x16,0x6b,0xdb,0xaa,0x4f,0xfb,0xe1, - 0x05,0x87,0x90,0xe3,0x7b,0xdb,0x2c,0xfc,0xc5,0x75,0x0e,0xb7,0x4e,0x5e,0xbf,0xa3,0x11,0x36,0x5a,0xa5, - 0xfa,0x3a,0xd1,0xbf,0xb3,0x60,0x9a,0x31,0xee,0x21,0x59,0x43,0xf1,0x57,0xb4,0xbd,0xcf,0x5f,0x45,0x78, - 0xfe,0x6a,0xb3,0xe9,0x59,0x5e,0x78,0x0a,0xf7,0xcd,0xde,0xee,0xfe,0x0e,0x1c,0x6f,0x15,0x69,0x19,0x63, - 0xa2,0x81,0x73,0x66,0xcb,0x06,0xb0,0x65,0xdd,0xd9,0xf4,0x49,0xa2,0xae,0x5a,0x67,0x58,0x57,0x28,0xdf, - 0x82,0xbc,0xda,0x4c,0x67,0xa6,0xa6,0xfb,0x6f,0x5c,0xa4,0x40,0xef,0x58,0x7d,0xf1,0xb0,0x59,0xba,0xb9, - 0x9e,0x94,0x53,0xba,0x99,0x26,0x60,0x20,0x57,0x5e,0xc7,0x84,0xf7,0xeb,0x55,0xcd,0x5d,0x0d,0xa9,0x07, - 0xcb,0xcf,0xc4,0x75,0xa1,0xa3,0x18,0x40,0x09,0xa7,0xbb,0xd1,0x77,0x9f,0x3c,0x09,0x67,0xc6,0xc9,0xd3, - 0xc3,0xcd,0x23,0x63,0xd4,0xa2,0xc7,0xd6,0xd0,0x29,0x3c,0x9a,0x4e,0x9f,0xe8,0x47,0xe5,0x06,0xea,0x10, - 0x21,0x6b,0xac,0x71,0xfd,0xc6,0x20,0x1a,0xb7,0x06,0x77,0x63,0x7c,0xd8,0x19,0xff,0xe6,0xa1,0x1b,0x7f, - 0x73,0xe8,0xe0,0xed,0x03,0x95,0x97,0x86,0xce,0x93,0x92,0xf0,0x94,0x3b,0xfd,0x02,0x05,0x0e,0x10,0x6a, - 0xa3,0x57,0x3b,0xb3,0x06,0x2d,0x3b,0x25,0xa3,0x34,0x26,0x27,0xec,0x10,0x5f,0x1f,0xbc,0x06,0x4b,0x28, - 0xf7,0xde,0x1f,0x96,0x00,0x4c,0xf8,0x1e,0x03,0x63,0x35,0x4e,0x73,0xd6,0xbc,0x7c,0x14,0xd5,0x3d,0x75, - 0xa4,0xc6,0x84,0x70,0x20,0x91,0xeb,0xa5,0x0b,0x97,0xec,0x52,0xae,0x54,0x84,0x25,0xc2,0xbc,0x77,0xfc, - 0x51,0xad,0x7f,0x4b,0xa2,0x3a,0xad,0x77,0x4e,0xce,0xa0,0x31,0x69,0x14,0x2b,0x69,0x5f,0x5c,0xf3,0xfc, - 0x8b,0xee,0x84,0xd6,0xed,0x68,0xcc,0x5e,0x8c,0x70,0x21,0x98,0x04,0x60,0x23,0x5c,0x1d,0x82,0x7b,0x50, - 0xbd,0x06,0x09,0x17,0x1d,0x0f,0x60,0xbb,0x35,0x47,0x04,0x78,0xc9,0x31,0x43,0x22,0x06,0xcd,0x51,0x4d, - 0x7f,0x20,0x42,0x30,0xf6,0x64,0x6c,0x23,0x2c,0x2e,0x87,0xd0,0xef,0xb8,0x49,0xf8,0x96,0xc9,0x51,0x86, - 0xeb,0xce,0xf2,0xa5,0x0b,0xd9,0x6f,0x8c,0x30,0x30,0x21,0x5f,0xbe,0xdd,0x00,0xd8,0x2c,0xec,0x31,0xa4, - 0xf8,0x15,0x40,0xaf,0xdd,0xca,0x96,0x60,0x29,0xef,0x8c,0xd6,0x47,0xdd,0x50,0x76,0x46,0x63,0x75,0x92, - 0x74,0x0b,0x77,0xb4,0x89,0xcf,0xe1,0x98,0x12,0x7a,0x01,0xa8,0x68,0xfd,0x66,0x81,0x8a,0x45,0x1f,0x94, - 0x9b,0x18,0x82,0x27,0x4f,0x46,0xd4,0xb8,0x72,0x5c,0x92,0xd0,0xd3,0xc3,0x68,0x47,0x33,0x1d,0x42,0x8d, - 0x58,0x1b,0x8c,0x3c,0xd8,0x2d,0x88,0xb4,0xfe,0xa2,0xf3,0x02,0xd1,0xa3,0x20,0xf2,0xbc,0xf0,0x94,0xc0, - 0xbb,0x7f,0x58,0x49,0x63,0x18,0x66,0xa9,0xb1,0x4c,0xaf,0xe6,0x88,0x3e,0xe7,0x98,0x4d,0xd7,0x16,0x68, - 0x08,0x89,0xbe,0x99,0xb5,0x64,0x1e,0x2b,0x63,0xef,0x42,0x1e,0x14,0x3e,0xfc,0xde,0xe3,0xf5,0x12,0x01, - 0x1e,0x52,0xd5,0xd0,0x66,0x2f,0x69,0x00,0x1c,0xb4,0xac,0xe8,0x40,0x0d,0xb2,0x5c,0xe9,0x85,0x52,0x51, - 0xe9,0x10,0x0a,0xfd,0x1c,0x51,0xa3,0x52,0x5c,0xd2,0x0a,0xc9,0x54,0x45,0x09,0x23,0x68,0xe0,0x65,0xc1, - 0x13,0x5d,0x81,0xbf,0x3f,0x68,0x0b,0x3c,0x44,0x8a,0x76,0x76,0xf7,0x77,0x4f,0x76,0xad,0x8a,0x2b,0xc1, - 0x1a,0x56,0x02,0xc2,0x21,0x68,0x6d,0x95,0x37,0xe4,0xaa,0x4e,0xbe,0x25,0xff,0x16,0x59,0xf2,0x2f,0xfc, - 0x1b,0x9c,0x49,0x2b,0x4f,0x42,0x33,0xba,0x01,0x9a,0xfe,0x2e,0x32,0xb3,0x50,0x14,0x71,0x45,0xb3,0x2a, - 0x55,0xb7,0x8c,0x7e,0xd1,0x65,0xa4,0x1a,0x73,0x9c,0x4c,0xbe,0xa5,0xac,0x5a,0x60,0x14,0xde,0xac,0x13, - 0xad,0x50,0x1f,0xbc,0x11,0x7b,0x92,0xc2,0xd9,0x0e,0xaf,0xce,0xe9,0xf4,0xc5,0x7a,0xd6,0xed,0xc2,0x31, - 0x57,0x4a,0x3f,0x44,0xc9,0x5d,0x75,0xae,0xd3,0x25,0x21,0x21,0xf3,0xf5,0xd1,0x0e,0xde,0x52,0x7a,0x13, - 0xbd,0x8a,0x20,0x47,0x8c,0x41,0x0e,0x83,0xd4,0xcd,0xf8,0xe8,0x23,0xf5,0xa3,0x6e,0x46,0x6c,0x4f,0x4a, - 0xcb,0xb9,0x5b,0xf8,0xa3,0xa5,0x25,0x77,0xa4,0x78,0xf5,0xa2,0x53,0xfa,0x24,0xc2,0xa9,0x57,0x61,0xc8, - 0x4d,0xf6,0x34,0xc5,0x22,0x1e,0x69,0xc5,0xbe,0x2e,0xed,0xdf,0x4b,0x4b,0x58,0xbc,0xbe,0x10,0x8b,0x80, - 0x88,0x23,0xd0,0x89,0xa4,0x93,0x7b,0x5e,0xd8,0xa3,0xcd,0xb5,0x26,0x71,0x4b,0xc6,0xd5,0xde,0x6d,0x77, - 0x11,0xc3,0x1d,0xc4,0xec,0x17,0xf8,0x6a,0x3e,0x13,0x1c,0x27,0x54,0xca,0x0c,0x6d,0xd8,0xc2,0xdc,0xdd, - 0x2e,0xd2,0x6c,0xb7,0xa5,0x70,0xbe,0x75,0x35,0xec,0xbe,0x57,0x5e,0x66,0x4e,0xc6,0xfd,0xad,0xeb,0x20, - 0x8a,0xb1,0xe1,0xba,0xf4,0xf2,0x3a,0xa0,0x1d,0xab,0x0f,0xea,0x73,0x35,0x57,0x67,0xb2,0xa9,0xf9,0x5d, - 0x60,0x11,0x42,0x09,0x42,0xe9,0x09,0x34,0x4f,0x3d,0xc3,0xed,0xd1,0x7f,0xfc,0x4f,0xb0,0x2a,0xb0,0x52, - 0xd8,0xe6,0x00,0x6a,0x05,0x68,0x86,0x4a,0x8b,0x5c,0xe2,0x75,0xbe,0x51,0x17,0x8d,0xaa,0x55,0x00,0x8e, - 0x95,0x38,0x57,0x7b,0x58,0x9a,0x4e,0x8d,0x47,0xa6,0x6a,0x49,0xf6,0x0f,0x43,0x32,0xc9,0x78,0xab,0xdf, - 0x47,0x94,0x92,0x6a,0xae,0x1c,0xf2,0x50,0x09,0x73,0xda,0x43,0x18,0xaf,0x9e,0x39,0x92,0x20,0xf1,0x0c, - 0x95,0x0f,0xb2,0x00,0x42,0xe1,0xe5,0xa8,0x40,0xa8,0x49,0x18,0xf7,0xc0,0xf7,0xf0,0xbb,0x30,0x18,0xf3, - 0xbb,0xc7,0x17,0xf2,0x84,0xc5,0x39,0x95,0x3b,0x49,0x69,0x78,0x39,0x79,0xf3,0xd4,0xae,0x82,0x33,0xab, - 0x95,0x70,0xd2,0x1b,0xaa,0x49,0x6a,0xa1,0x51,0x5a,0xa1,0x71,0x9a,0x2d,0x50,0x56,0xe8,0x79,0x67,0x24, - 0xc8,0xe5,0xe3,0xd5,0x76,0xbe,0x2a,0xb6,0x5e,0x79,0xda,0x5b,0xdc,0x8a,0x7e,0x64,0x0d,0x20,0x33,0xda, - 0x67,0xf0,0x58,0x6b,0x17,0xef,0x4d,0x32,0xa6,0x36,0x34,0x54,0xca,0xf9,0xce,0xd6,0x78,0x6c,0x93,0xe2, - 0x5b,0xff,0xca,0xf3,0x15,0x4b,0xb4,0xb4,0xb4,0xa5,0x19,0xef,0x7f,0x11,0x25,0x58,0xe8,0x98,0x75,0xdd, - 0x72,0xcd,0xe5,0x8f,0xe7,0x3d,0x4f,0x54,0xf8,0xb0,0xd2,0xfe,0x8e,0xa9,0x99,0xba,0x73,0x7f,0x22,0xaa, - 0x22,0xa5,0xe5,0x5f,0x49,0xc7,0xfd,0xf4,0x41,0x6f,0x10,0x56,0x29,0x50,0xb6,0x2d,0xd6,0xad,0x6d,0x87, - 0xab,0x96,0x85,0x64,0xef,0x72,0x40,0x0b,0xc7,0x56,0x32,0xb8,0xbb,0x21,0xc1,0x33,0x4d,0x63,0xe5,0xab, - 0x84,0x36,0xb1,0x4d,0xed,0xb4,0xba,0x23,0xef,0x3e,0x89,0xaa,0x0d,0xde,0x32,0xe1,0x33,0xf7,0x2a,0xbc, - 0xf5,0x87,0x1d,0x10,0xa9,0x78,0x8c,0x23,0x6a,0x9f,0x15,0xa7,0x11,0x50,0x97,0xfe,0x86,0xc6,0x12,0x3f, - 0x2c,0x2d,0xf1,0x43,0xb6,0xc4,0x17,0xbf,0xe0,0x21,0xdb,0xbc,0xfb,0xfd,0xcb,0x18,0xcf,0xca,0x77,0xea, - 0xbd,0xe2,0xd3,0xb4,0x9d,0x95,0x81,0x84,0x86,0xa0,0x60,0x97,0xa8,0x30,0xb2,0x11,0x23,0x0c,0x71,0x06, - 0x5b,0xf1,0xe1,0x50,0x2a,0x18,0x00,0x25,0xb6,0xe1,0xb8,0xae,0xab,0x94,0xda,0xab,0xe2,0x35,0xbb,0xb4, - 0x83,0x33,0xbb,0xd2,0x10,0x8b,0xc6,0x03,0x21,0xb1,0xd8,0x0e,0x0b,0x8a,0x30,0x59,0x76,0x42,0xdb,0x55, - 0x97,0x7d,0xee,0x75,0x37,0x9c,0xdd,0xa3,0xa3,0x0e,0x07,0x41,0x4a,0x1a,0x88,0xbf,0x84,0x20,0x48,0xbc, - 0xea,0x89,0xf4,0xe3,0x5d,0x9b,0x1a,0x71,0x26,0x8e,0x64,0xf9,0x14,0x54,0xbc,0x3d,0x24,0x66,0xbf,0xa1, - 0x4a,0x05,0x28,0xa5,0xfa,0xf0,0x08,0x60,0xf7,0x1a,0x02,0x2e,0x2a,0x0b,0x76,0x3b,0x82,0x67,0x37,0x74, - 0x96,0xc6,0x2b,0xef,0x4d,0xa7,0xea,0x60,0x81,0x24,0x82,0x61,0x0a,0xef,0x7c,0xb7,0xb0,0x15,0x51,0xaf, - 0x1d,0x95,0xa9,0x68,0xcd,0xa6,0x73,0x8d,0x3c,0xf5,0xc6,0x99,0x96,0x73,0x31,0x38,0x46,0xdb,0x2e,0x92, - 0x59,0x79,0xfc,0x51,0x1e,0xdb,0x65,0x77,0x6a,0x62,0x71,0xfc,0x8f,0xff,0x95,0xad,0x0e,0xf2,0xb8,0x5e, - 0x19,0x8d,0xd8,0x21,0xad,0x3e,0xc2,0xd3,0xee,0x1d,0xdf,0x24,0xd0,0xb6,0x03,0x4f,0x73,0x21,0x87,0x22, - 0x0d,0x1b,0xfc,0x2b,0x7d,0xbb,0xf7,0x2b,0xee,0xcd,0xba,0xce,0x77,0x2b,0xda,0x19,0x1c,0x9f,0xf2,0xcc, - 0x5c,0x22,0xe0,0x0c,0x9c,0xb8,0xd6,0xcb,0x68,0xc0,0xde,0x04,0xb5,0x8a,0x25,0x0b,0xfc,0xeb,0xf3,0xde, - 0x0a,0xe7,0x37,0x9e,0x34,0x49,0x85,0x59,0x22,0x64,0xd8,0x4f,0x39,0xe0,0x1c,0x9b,0xe7,0x82,0x1b,0x51, - 0x82,0x58,0xb4,0x70,0xf9,0x33,0x9f,0x43,0xe3,0xcb,0xbc,0xe0,0xa7,0xa3,0xbd,0xd7,0x29,0xf1,0xe6,0x09, - 0x6c,0x7d,0x42,0xc2,0x82,0x95,0x1e,0x03,0x55,0x61,0x45,0xcc,0x60,0x7d,0x13,0xaa,0x0a,0x4e,0x68,0x54, - 0x22,0x8c,0x78,0xd2,0xba,0x37,0x77,0x14,0x44,0xbd,0x2a,0x9c,0x05,0x3c,0x19,0x40,0x73,0xc9,0xdb,0xd4, - 0x4f,0x20,0x8e,0xd9,0xa2,0x82,0x58,0x29,0x10,0x38,0x51,0x54,0x3f,0x77,0xe4,0x20,0xfb,0x49,0x5e,0x55, - 0xaa,0x5a,0x00,0x2d,0x6d,0x0d,0xa2,0x61,0x65,0x16,0xdc,0x82,0x23,0xb1,0xca,0xb8,0x7e,0x48,0xc5,0x97, - 0xa3,0xff,0xa4,0x69,0x79,0x17,0x99,0x55,0xd2,0x62,0xe2,0x62,0x48,0x94,0xaf,0x7c,0x85,0xfa,0x43,0x4f, - 0x1b,0xb6,0x7f,0x53,0x7f,0xbf,0xf7,0x2d,0xfd,0xfd,0xfe,0x8c,0x7d,0xa6,0x45,0x08,0x94,0xc1,0xb2,0x32, - 0xa7,0xff,0x8f,0xff,0x07,0x22,0xb6,0x75,0x1f,0x9b,0x18,0x88,0xb6,0xda,0xe0,0x3a,0x80,0x32,0xf0,0x78, - 0x7e,0x5e,0xcd,0x72,0x0e,0x2c,0xd9,0x76,0xde,0xa2,0xe5,0x72,0x00,0x23,0x82,0x7b,0xbf,0xff,0x88,0x49, - 0x40,0x0f,0x47,0x0c,0x06,0xed,0x87,0x96,0xe8,0x94,0x1a,0x67,0x35,0xa5,0xca,0xe6,0x7a,0x6c,0x69,0x7f, - 0x86,0x15,0xdd,0xd3,0x50,0x5f,0x81,0xc6,0xbf,0x5e,0x57,0x36,0x80,0xfa,0x23,0x61,0x47,0x3a,0xa3,0x20, - 0xaf,0x9a,0x23,0x4a,0x1d,0x18,0x85,0x42,0xa5,0xf2,0x4a,0x20,0xcf,0x68,0x44,0x2a,0xbc,0xba,0x8b,0xe7, - 0x14,0x61,0xad,0xad,0xd6,0xac,0xb5,0x85,0xc7,0x11,0xbf,0x6e,0xcd,0x59,0x1e,0x86,0xd8,0xaf,0xad,0xa2, - 0x2e,0x46,0x50,0xa0,0xf1,0x3e,0xd6,0xda,0xb4,0xac,0xd0,0x24,0x2d,0x2e,0x22,0x25,0xe5,0xf7,0xdf,0x10, - 0x29,0x86,0x2e,0x8b,0x15,0xdf,0xd0,0x39,0xbf,0x4b,0x1f,0xd2,0xa5,0x1d,0xfe,0x2a,0xfd,0xdc,0xea,0xf8, - 0x8b,0x32,0x16,0x3c,0x29,0x8a,0xce,0x31,0x6d,0xab,0x90,0x3d,0xc4,0xba,0xc6,0x24,0xa1,0x5e,0xa9,0xfd, - 0xd7,0x2d,0x65,0x4a,0x9b,0xd1,0x66,0xf4,0x69,0xfb,0xe6,0x3a,0x68,0xfd,0xce,0xd2,0x5f,0xed,0xb4,0x93, - 0x2d,0x78,0x42,0xa3,0xde,0x46,0x7f,0x94,0xce,0x15,0xd3,0x20,0xe7,0xf4,0xcc,0x21,0xe1,0xc6,0x3a,0x0d, - 0x89,0x8d,0xb5,0xb2,0xb8,0x9a,0x30,0x86,0xe8,0xfa,0x10,0x6d,0x76,0x91,0xc0,0x45,0x3d,0x6c,0xd8,0xee, - 0x17,0xae,0x4b,0x2b,0x77,0xf2,0x68,0xee,0xf0,0xd1,0xdc,0xd1,0x82,0xc5,0x49,0xa4,0xa3,0x46,0x82,0x97, - 0x3e,0x89,0x37,0x96,0x0e,0x7c,0x61,0xa7,0x8f,0xdb,0x9d,0x45,0xd7,0x02,0xda,0xea,0xa1,0x52,0xf2,0x1d, - 0x8a,0x8e,0x21,0x8d,0xfd,0xa6,0xa6,0xf4,0x92,0x61,0xa7,0xa9,0xdf,0x68,0x4c,0x97,0xe5,0xa6,0x68,0xe6, - 0x2e,0x7f,0x5b,0x53,0x12,0xaa,0xe6,0x9b,0xad,0xa8,0x62,0xdc,0x08,0xac,0xed,0x71,0xa9,0x73,0x61,0x2c, - 0x14,0x6e,0x8c,0x85,0xc2,0xb5,0x58,0x28,0xdc,0x5a,0x16,0x0a,0x24,0x01,0x02,0x9d,0x4f,0x8d,0x8f,0x4e, - 0x71,0xd6,0x43,0x1c,0x01,0xa3,0x5f,0x30,0x93,0x76,0xe6,0x1f,0x73,0xf9,0x19,0x83,0xb0,0xd3,0x2b,0x18, - 0xfb,0xce,0x96,0x25,0xce,0x77,0x11,0xd9,0x4e,0xe0,0x49,0xf1,0x01,0x33,0x2d,0xe7,0x6f,0xff,0xf5,0xff, - 0xae,0xae,0x33,0x16,0xd1,0x5e,0xd6,0xf4,0xa5,0x61,0x87,0xb9,0x08,0x8c,0xd2,0xed,0x23,0xac,0x5d,0xf1, - 0xcf,0xcc,0x56,0x13,0x15,0x6d,0x0d,0x73,0xd1,0x4f,0xcc,0xa3,0xf2,0x7f,0x01,0xba,0x73,0x82,0x1d,0xc7, - 0x61,0x92,0xff,0x0e,0xa3,0xaf,0x4d,0xca,0x66,0xb7,0xb6,0xd1,0x45,0x21,0x7a,0x25,0xe0,0xd9,0xe1,0xa3, - 0x70,0xd9,0xaa,0x87,0xbe,0xaf,0x61,0xef,0xf3,0x14,0x5b,0x16,0x54,0x8f,0x3e,0x83,0x39,0x2f,0x35,0x4a, - 0x44,0x78,0xa2,0xab,0xe0,0x2d,0xee,0x7f,0xfc,0x1f,0x9c,0x47,0xad,0x6e,0x15,0xdd,0x81,0x12,0x52,0x29, - 0x41,0x9c,0x60,0x9d,0x8b,0x8d,0x88,0x10,0xdb,0xe9,0xb4,0xa7,0xdc,0x43,0xf0,0xf0,0xab,0x31,0x38,0x65, - 0x5c,0x12,0x86,0xb3,0xa7,0xfc,0x45,0x70,0xfe,0xba,0xf8,0xc0,0x88,0x79,0x93,0xd0,0x69,0xc5,0x74,0xea, - 0x16,0x0b,0xd7,0x25,0x75,0xde,0xf1,0x05,0x66,0xe3,0xa4,0x1f,0x71,0x73,0x59,0xcd,0x54,0xf1,0x90,0x85, - 0x71,0xf4,0x71,0x3a,0xbb,0x6d,0x25,0x5d,0xed,0xa0,0x79,0xbd,0x30,0x7b,0x75,0xe2,0xef,0xc1,0x8b,0xe2, - 0xd2,0xd2,0x93,0xd2,0x26,0x0b,0xe7,0x7e,0x61,0x7f,0x69,0xe9,0x81,0x8d,0x40,0x37,0xc4,0x12,0x49,0xf5, - 0x9b,0xae,0xd3,0x62,0x2f,0x0e,0x67,0xe5,0x18,0xed,0x73,0x24,0x82,0xac,0xd4,0xa6,0x75,0xe2,0x34,0x1d, - 0x43,0xae,0xc9,0x14,0x87,0x32,0xdb,0x4d,0xa0,0xd9,0xb2,0xcb,0xce,0x88,0xba,0xe2,0xd5,0x1c,0x8f,0xec, - 0xc1,0x1c,0xd4,0x2e,0xde,0x5c,0x84,0x9a,0xf0,0x9d,0x6f,0x18,0x98,0x7e,0x16,0x0c,0xe0,0x0b,0x8a,0x67, - 0xf6,0x7f,0xf9,0xbf,0x1d,0x65,0x2d,0x16,0x83,0x2b,0xf9,0x17,0xb9,0x6d,0xe1,0x7d,0x79,0xcc,0xc6,0x7a, - 0x52,0xf8,0x75,0x30,0xc6,0x8d,0x34,0x84,0x78,0x49,0xd8,0xeb,0xdb,0x5a,0x35,0xc4,0xd0,0xd1,0xe6,0x57, - 0x1e,0xcc,0x62,0xce,0x9d,0x3e,0x42,0x4a,0x19,0x15,0xf3,0xa2,0xdb,0x6b,0x50,0x8b,0x61,0xb6,0xa3,0xa4, - 0x5e,0xd8,0x5b,0x5a,0x2c,0x46,0xd1,0x08,0x45,0xfe,0x7d,0x93,0xa5,0x23,0x6e,0x95,0x1a,0x23,0x2c,0xa4, - 0x94,0x3f,0xfa,0xfa,0xe9,0x27,0xac,0x98,0xc0,0x28,0x9e,0xe5,0xc5,0xa6,0x79,0x72,0x9d,0x86,0x1a,0x4b, - 0x4f,0x45,0xa4,0x41,0x30,0x0d,0xf8,0x41,0x20,0xf9,0x5b,0x36,0x3c,0x78,0xff,0xea,0x87,0x5f,0x3e,0x5e, - 0xba,0x91,0xd7,0xa9,0xb7,0xc0,0xd2,0xe4,0xaf,0x9a,0x22,0x78,0x74,0xbb,0xe9,0x74,0x9a,0xd3,0xf8,0xa7, - 0x55,0x9b,0xa7,0xec,0xac,0x9b,0xb0,0x79,0x53,0x2f,0x74,0x53,0xbf,0x05,0x93,0x34,0xf5,0x96,0xfb,0x4d, - 0x9a,0x66,0x1f,0x5d,0xdf,0x73,0xcb,0xeb,0xad,0xb2,0xb9,0xd3,0xfc,0x0c,0x53,0x10,0x3f,0x30,0x2e,0xf7, - 0xd4,0x15,0x39,0xf9,0x7c,0xd4,0xd5,0x11,0x72,0xd8,0xd2,0xfa,0xf1,0x62,0xf0,0xe9,0x10,0x7d,0xab,0x90, - 0x44,0x06,0xe7,0x82,0xb2,0x1d,0x57,0x26,0x4d,0xbe,0x34,0xf0,0xa1,0x57,0xf7,0xeb,0x8f,0x38,0x07,0xb2, - 0x20,0x7b,0xb0,0x8c,0x01,0xeb,0xc1,0x12,0x25,0x4c,0xf7,0x25,0x93,0xac,0x63,0x23,0xf1,0x69,0x40,0x9a, - 0x45,0x83,0x28,0xa1,0xbd,0xdb,0xc1,0xc9,0x25,0x51,0x34,0x3b,0x75,0xd4,0x9d,0x4c,0xa7,0x43,0xff,0x74, - 0xe0,0x5f,0x9e,0x75,0x27,0x9b,0xa0,0x50,0x1d,0x8b,0xfe,0xf8,0x17,0x5d,0x42,0x89,0x83,0x30,0x99,0xb8, - 0xa7,0xf1,0xe6,0x29,0xa4,0x05,0xbe,0x23,0x2b,0xd2,0xc7,0x0e,0x9f,0x0f,0x39,0x0a,0x65,0x85,0xed,0x54, - 0x07,0xce,0xbe,0x2d,0xc0,0xde,0xdb,0x06,0x5a,0x43,0x76,0xde,0xf0,0xad,0xa3,0xe7,0x33,0xc1,0x4d,0x01, - 0xa5,0x3f,0x19,0xcb,0x71,0x15,0xc3,0x50,0x22,0xd6,0x32,0x34,0xc0,0x43,0x99,0x00,0xf5,0xc1,0x84,0x3f, - 0x10,0xf1,0xfb,0xdf,0x54,0xa8,0x3e,0xd3,0xa7,0x06,0x38,0x6e,0x80,0x85,0x12,0x3f,0x34,0xd8,0xa9,0xba, - 0x9c,0xb7,0x08,0xe3,0x2e,0x63,0x47,0x5f,0xb1,0xb7,0x75,0x81,0xe1,0x0b,0x75,0x53,0x7d,0x5f,0x52,0x2f, - 0x94,0xe3,0xc1,0x0a,0x8a,0xd0,0x5c,0x50,0x55,0x62,0xee,0xe0,0x84,0x8b,0x25,0x3c,0xd8,0x91,0x12,0x0f, - 0x91,0x6f,0x06,0xac,0x97,0x1e,0xf8,0xe1,0x59,0xc5,0xa1,0x90,0xf4,0xe8,0x55,0xc1,0x3f,0x9b,0xf5,0x56, - 0xa7,0x05,0x9f,0x9d,0xda,0x68,0x4c,0x46,0x87,0xc7,0x31,0x9c,0x6b,0xf0,0xd2,0x8d,0xc5,0xe9,0x7f,0xb9, - 0x5a,0x5b,0x60,0x81,0x59,0x56,0x62,0x43,0x5d,0xd4,0xc9,0x88,0x64,0xef,0x5c,0x35,0x66,0xaa,0x51,0x33, - 0x9b,0x20,0x04,0xdd,0x60,0x0e,0x6e,0xad,0xac,0xac,0x21,0xf0,0x87,0xd3,0xa9,0x72,0xb6,0x8f,0x00,0xd2, - 0x84,0xe2,0x32,0xb7,0x61,0xfc,0x9b,0xae,0x37,0x1e,0x91,0x6d,0x14,0x84,0xd6,0x55,0x47,0x08,0xaf,0x74, - 0xcc,0x75,0x26,0x44,0x9d,0xe6,0x46,0x76,0x11,0xd8,0xfe,0xc2,0x39,0x40,0x0f,0x1e,0x47,0x58,0x62,0xfa, - 0x65,0x8a,0xcf,0x70,0xad,0x27,0xd8,0xc1,0xc1,0xa0,0xae,0xbb,0xa7,0x37,0x0d,0x89,0x23,0x20,0xbf,0x4f, - 0xf4,0x60,0x6e,0xca,0x8f,0x20,0x06,0xcd,0xab,0x3e,0xc8,0x72,0x6f,0xbc,0x33,0x0d,0xc2,0x76,0x9a,0xc6, - 0x61,0x60,0xcc,0xdc,0x4f,0xc7,0xfe,0xa2,0x6d,0x6e,0x9c,0xe6,0xa5,0x92,0x04,0x2d,0x0b,0xe5,0x01,0x61, - 0x9e,0x31,0xa5,0x35,0xce,0xbe,0xd2,0xef,0x17,0xb0,0x71,0x09,0xab,0x20,0x36,0xe4,0x7c,0x5d,0x2d,0x92, - 0x6b,0x8d,0xd5,0xf3,0xc5,0xf3,0x09,0xae,0xc2,0xae,0x95,0x33,0x1b,0x89,0x3d,0xa2,0xd5,0x78,0x46,0x0b, - 0xca,0x13,0xb5,0x1f,0xd3,0xf6,0x3d,0xa1,0x6d,0x3b,0x97,0x4d,0x9b,0x38,0x46,0x7a,0x43,0xba,0x8a,0xea, - 0x26,0x85,0x0e,0x85,0x78,0xe9,0x3e,0xc4,0x10,0xd6,0xe0,0xf9,0x7d,0x1c,0xf6,0x1f,0xa8,0xb6,0xc6,0x8e, - 0xe1,0xad,0x03,0x4b,0x54,0x49,0x49,0xda,0x73,0x94,0x7e,0x37,0x75,0xce,0xe0,0xe1,0xaf,0xaf,0xf5,0x2d, - 0xa1,0x9a,0x5d,0xeb,0x5b,0x39,0xb2,0xd1,0xb4,0x81,0x69,0xc9,0xa6,0x3e,0xcb,0xd4,0x1c,0x91,0x4a,0xd7, - 0x83,0xb3,0xeb,0x12,0x0d,0xc6,0xd5,0xda,0x65,0x35,0x06,0x12,0x21,0x48,0xcf,0x5c,0x85,0xb2,0x29,0xec, - 0xac,0x14,0xf9,0xa5,0x1a,0x73,0x4c,0x28,0xd1,0x2c,0x21,0x52,0x0e,0x53,0xe4,0x14,0xa1,0x5c,0x4d,0x91, - 0xc4,0x27,0x94,0x91,0xe6,0xf8,0x0f,0x30,0xd4,0xb2,0xb3,0xc2,0x3e,0x92,0xf7,0xfa,0xb9,0xfb,0x4d,0xea, - 0x6c,0x20,0x7a,0x3d,0x7b,0x2e,0xba,0x88,0x67,0x63,0x75,0x23,0x6b,0x45,0x90,0xc8,0x2b,0x82,0x91,0xba, - 0xa6,0x97,0x03,0x62,0xa8,0x92,0xf1,0xbb,0x46,0x3e,0xaf,0xb2,0x26,0x82,0xf9,0x35,0xe1,0x9f,0x12,0xff, - 0x78,0xd6,0xc5,0x56,0xa6,0x97,0xc7,0x6f,0x47,0xf8,0xa0,0x8a,0xf0,0x0f,0xe1,0x79,0x54,0xc5,0xf3,0x45, - 0xf7,0xc9,0x82,0x33,0x8e,0xc1,0x8d,0x03,0x96,0xfc,0x58,0x3e,0xfc,0xb5,0x88,0x01,0x7e,0xd8,0x37,0xfb, - 0xf0,0xbf,0x76,0xaf,0xf9,0x2f,0xb5,0x13,0xc2,0xfa,0x74,0x0e,0x75,0x93,0x0a,0xea,0x5a,0x6a,0x86,0x7b, - 0x38,0x83,0xd3,0x07,0x17,0x7e,0xff,0x91,0x08,0x14,0xb2,0x99,0xed,0xb3,0x4e,0x89,0x08,0x03,0x18,0xe8, - 0x44,0x75,0x16,0x0e,0xbe,0x7e,0xc3,0x39,0x75,0x92,0xaa,0x33,0x00,0x5c,0x2f,0x2d,0x68,0xd3,0x48,0xcf, - 0x68,0x0f,0x91,0xe4,0x2e,0xf8,0x40,0x9b,0xf0,0x41,0x37,0x37,0xfe,0x6d,0xcd,0x55,0x4e,0x39,0x70,0x2b, - 0x3c,0x63,0xc3,0xaf,0xe7,0xcc,0x18,0xe8,0xfb,0x93,0x45,0x70,0x45,0xb3,0x70,0x29,0x61,0xda,0x1f,0xcc, - 0x54,0x18,0xcd,0x55,0x68,0x54,0x5a,0xf2,0x8a,0x7d,0xba,0x96,0x40,0x35,0xb6,0xad,0x0f,0x17,0xb5,0x1b, - 0x72,0xbb,0xaf,0xa9,0xa1,0xcb,0x99,0x86,0xc2,0x79,0xc8,0x6f,0xdd,0x63,0xd7,0xe3,0xc8,0x52,0xad,0x4e, - 0x73,0xce,0xd0,0xe3,0x50,0x9f,0xba,0x3e,0x76,0x2d,0x28,0xb3,0xa3,0x04,0xdd,0x59,0x87,0xc0,0x9b,0x61, - 0xa9,0xde,0x92,0xaa,0xaf,0xed,0x70,0x91,0xeb,0x29,0x64,0x4c,0x12,0x85,0xec,0xe0,0x9d,0xb2,0x87,0x3c, - 0x29,0x79,0xde,0xa5,0x25,0x75,0xfa,0x62,0x27,0xe2,0xce,0x6f,0xa6,0x83,0xa9,0xd5,0xb3,0xbc,0x5a,0xa9, - 0xfa,0xde,0x62,0xa4,0xbd,0x6f,0x71,0x5e,0x7e,0xb1,0xb0,0x0a,0x1b,0x04,0x3f,0xa9,0x14,0x81,0xd3,0xb8, - 0x7d,0x42,0x77,0x9e,0x22,0xb1,0x35,0x22,0xb1,0xbb,0x64,0xfb,0x40,0x3e,0xed,0xf2,0x4f,0xf4,0x07,0x20, - 0xfe,0xe6,0x03,0xab,0xfc,0x37,0x41,0x8c,0x66,0xeb,0x53,0xb5,0xc0,0xac,0x9c,0x66,0x96,0xd9,0x9d,0x9b, - 0x5f,0x73,0xee,0x7d,0xf3,0x80,0xb7,0x86,0x87,0xa4,0x03,0x12,0xbe,0x71,0xc0,0x74,0xc7,0xbf,0x1d,0x9c, - 0x4c,0xe9,0xef,0x3b,0xb3,0x47,0x54,0xb6,0xd0,0xc0,0xc5,0x8f,0xab,0xae,0x1d,0x0e,0xbf,0xc5,0x92,0xd9, - 0xb0,0xb5,0xa8,0xb6,0xeb,0xc7,0x4f,0x8d,0xa9,0xbe,0x6f,0xe8,0xac,0x95,0x3e,0x1c,0xb6,0x1e,0x73,0x36, - 0xf7,0xd8,0xa1,0x21,0x0e,0x51,0x85,0xb0,0x3d,0x7a,0x68,0xa8,0x8a,0xf1,0xa1,0x21,0x4d,0xca,0xc8,0x27, - 0x8e,0xc1,0xbf,0xb0,0x75,0x39,0xcb,0xde,0x27,0xde,0x02,0xc7,0x46,0x8f,0x02,0x25,0xde,0x45,0xa1,0x19, - 0xce,0x5e,0xc3,0x95,0x0d,0xfe,0xeb,0xa3,0xbd,0xc3,0x93,0xf3,0x93,0xdd,0x83,0xc3,0xfd,0xad,0x93,0xdd, - 0xee,0xdf,0x7d,0x57,0xfb,0x77,0x98,0x87,0xda,0xc1,0x2d,0x82,0x24,0x7f,0x4e,0xe8,0x1d,0x57,0xab,0xb5, - 0x1f,0x87,0x01,0x62,0xac,0x44,0x39,0xc2,0xa1,0xd6,0x20,0xce,0xe5,0x9f,0x13,0x64,0x6f,0x71,0x80,0xd4, - 0x1a,0x32,0x6a,0xdc,0xea,0x3a,0x07,0xf1,0xa6,0x27,0x12,0xf7,0xa3,0x24,0xac,0xc9,0x1e,0x9d,0x23,0x64, - 0xb7,0x36,0xf2,0x6b,0xd4,0x60,0x38,0xe7,0x7a,0xf8,0x8a,0x70,0x66,0x12,0x65,0x61,0xdf,0x47,0x65,0x12, - 0xc1,0x39,0xa5,0x0a,0x32,0xe8,0x59,0x0f,0xd3,0x7e,0xcd,0x8d,0x70,0x2b,0x5e,0xc3,0xc0,0xf8,0xb5,0x34, - 0x39,0x97,0xc3,0x40,0x1f,0xbe,0x63,0x26,0x63,0xae,0x41,0xae,0xbf,0x83,0xb8,0xf1,0x39,0x61,0x00,0x08, - 0x76,0x06,0xbd,0x56,0xbb,0x0e,0xb2,0x5a,0x02,0x30,0x6b,0xb5,0x7e,0x78,0x59,0x43,0x4d,0xae,0x87,0xb7, - 0x1a,0x7d,0x1e,0x5f,0x36,0x92,0x5a,0x17,0x61,0x9d,0x33,0xb9,0x96,0x71,0x7a,0x44,0xc6,0x0b,0xc7,0xaf, - 0x35,0xb9,0x0c,0xcd,0x72,0xf9,0xa9,0x82,0xb7,0xfc,0x47,0xc3,0x7a,0x99,0x61,0xb4,0x6e,0x68,0x06,0xc2, - 0xda,0x75,0x94,0x47,0x84,0x78,0xd2,0x40,0x8f,0x98,0x95,0x4c,0xb7,0xf6,0x1d,0x8f,0x89,0x28,0x37,0x00, - 0xe4,0xd5,0xf6,0x97,0x17,0xeb,0xb5,0x5b,0x3c,0x22,0x03,0x6a,0x85,0xb5,0xed,0xad,0xe3,0xdd,0xfd,0xbd, - 0x0f,0xbb,0xf2,0x05,0x6b,0x1a,0xb6,0xfc,0xda,0x73,0xbf,0xe6,0x24,0x5d,0xa7,0xb6,0x4c,0x80,0x66,0xae, - 0x40,0xed,0x11,0x88,0x5f,0x9a,0xcd,0xad,0xe6,0x9b,0x37,0x25,0xa4,0x0a,0x5c,0x25,0xa8,0xf1,0x10,0xa0, - 0xf5,0xbf,0xf3,0x0f,0x3e,0xee,0x7c,0xda,0xdf,0x2d,0xa7,0x98,0xf0,0xfc,0xdf,0xd3,0xac,0x0a,0x81,0x2a, - 0x27,0xf8,0x78,0x18,0xd0,0x2c,0xd4,0x80,0x8d,0x61,0xa6,0xe6,0xf6,0x23,0x4f,0x84,0x0e,0x9f,0x7d,0x93, - 0x45,0x45,0x58,0x53,0x5a,0x96,0xb5,0xdf,0xdd,0x85,0xf7,0x0e,0x07,0xdf,0xee,0x11,0x17,0xc9,0xaf,0x8d, - 0xe2,0x06,0xb2,0x64,0xdb,0xa3,0x99,0xc0,0xd0,0x8f,0x68,0x78,0xa5,0x19,0xd7,0xe1,0xe2,0x04,0xcf,0x48, - 0x0a,0x51,0x0e,0x86,0xd5,0xbd,0xf6,0x6a,0x5a,0xb4,0xac,0x3d,0xad,0xb5,0xa5,0x2b,0x2a,0x65,0xf4,0x39, - 0xf9,0xf7,0xeb,0x33,0x71,0x83,0x0f,0x88,0x23,0xaa,0x3a,0x0c,0x10,0x3f,0x5b,0x83,0xdd,0x2f,0x63,0xd7, - 0xf9,0xf9,0xbb,0xd3,0xda,0xe7,0xcf,0xc5,0xd9,0xd3,0x7f,0xe7,0x2c,0x17,0xcb,0x8e,0xbc,0x2c,0xbb,0x8d, - 0x65,0xef,0x77,0x88,0x62,0xe9,0x78,0x8d,0xf0,0x4b,0xd8,0x2b,0x19,0x47,0xf8,0x5b,0x3c,0x6d,0x9d,0x35, - 0x68,0x5a,0x46,0x2e,0x07,0x1a,0x94,0x5a,0x61,0xe2,0x7a,0xac,0x6d,0x5c,0x67,0x20,0x10,0x26,0xda,0xe2, - 0xc8,0x95,0xd1,0xa6,0x82,0x07,0xb6,0x79,0x5a,0xe9,0x84,0xcd,0x14,0x95,0xf3,0x9f,0x95,0xcf,0xd9,0xe6, - 0xe7,0x64,0xc5,0x2b,0x6f,0x26,0x13,0xd5,0xec,0xba,0x9c,0x8f,0x1b,0x97,0x26,0x30,0x98,0xfa,0x8e,0x37, - 0x0e,0x84,0xd5,0xb8,0xc8,0xc2,0xe0,0xca,0x1c,0x98,0xaf,0x70,0x0f,0xd1,0x41,0x66,0xfe,0x3e,0x5f,0xc8, - 0x9b,0xdb,0x78,0xca,0xd6,0x91,0xba,0x77,0xb0,0xf9,0xf3,0x66,0xe2,0x4e,0x06,0xe8,0xa8,0x82,0xe5,0xd4, - 0xff,0x9c,0x9f,0x2d,0x13,0x30,0x2b,0x3f,0x9f,0x6e,0xd5,0xff,0x14,0xd4,0xbf,0x36,0xeb,0x2f,0xcf,0xeb, - 0x67,0x77,0x2d,0x7f,0xb5,0x7d,0x6f,0x6c,0x31,0xe1,0x5c,0xd7,0x9c,0x09,0x86,0xde,0xab,0x26,0xde,0x85, - 0x2b,0x78,0xb5,0xda,0xc6,0x8b,0xf6,0xb3,0xaa,0xdd,0x75,0xeb,0x0b,0x78,0x1e,0x29,0x8e,0x96,0xa8,0x6e, - 0xf2,0xb4,0xfa,0xee,0xcf,0x76,0x73,0x33,0x7a,0xbc,0xab,0x6d,0xeb,0xee,0xc0,0x28,0x9c,0xce,0x98,0x12, - 0x17,0xb6,0xa5,0x30,0x74,0x4e,0x37,0x8b,0x4e,0xa9,0x7e,0x5a,0x68,0x65,0x53,0x38,0x91,0xc1,0x12,0x5a, - 0x61,0x15,0x1c,0xc8,0x22,0x51,0xf7,0xd3,0xd1,0xbe,0x72,0xdf,0x21,0x77,0xaf,0xf4,0x2e,0x7e,0x16,0x2a, - 0xb1,0xcf,0x22,0x5f,0x37,0xcd,0xa1,0x96,0x16,0xfa,0x8d,0xcc,0xe1,0x82,0x95,0x37,0x11,0x57,0x3c,0xcc, - 0xf2,0xc9,0x20,0x47,0x41,0xd0,0xde,0xa8,0xb1,0xb7,0xa0,0xc1,0x2c,0xbc,0x4e,0xaf,0xac,0x06,0x23,0x8f, - 0xdd,0x54,0xab,0x81,0xea,0x65,0xbd,0xd5,0x76,0xd7,0xad,0x38,0x5e,0xd2,0x46,0xda,0xab,0x6d,0xe1,0x8b, - 0xe0,0x43,0x63,0xd6,0x43,0xf6,0xb3,0xe7,0xec,0x12,0x5b,0x5d,0x2a,0x16,0x33,0x56,0xc3,0x2f,0xd8,0x66, - 0x38,0xe9,0xb6,0x96,0x92,0xcd,0xd5,0x97,0x2f,0x5e,0xb4,0x5f,0xb6,0x57,0x5f,0xac,0xfd,0x9c,0x6c,0x6c, - 0x6c,0xb4,0x3a,0xfc,0x77,0x1d,0x11,0x54,0xbb,0x78,0x6c,0x9a,0xb9,0x83,0xaf,0x53,0xae,0x6e,0xad,0xfd, - 0x72,0xed,0xe5,0xf3,0x3f,0xb4,0x5f,0x3e,0x33,0xf5,0x22,0x6e,0x64,0x50,0x5a,0x6b,0x06,0x5c,0x7d,0x78, - 0x0a,0x83,0x4b,0x37,0xf9,0xb9,0x38,0x0d,0xce,0xbc,0x33,0xae,0xff,0x85,0xb6,0x86,0x2c,0x2b,0xf9,0x39, - 0xf1,0xb8,0x9d,0x7b,0xcf,0xf6,0xbe,0xf5,0x95,0x64,0x73,0x50,0x5e,0x7b,0x25,0xa1,0xe7,0x50,0x09,0x10, - 0x0d,0xe2,0xcc,0x37,0xd7,0xa5,0xeb,0xda,0x25,0x89,0xf1,0x21,0xda,0xdd,0x38,0xad,0x7a,0xa6,0x38,0x93, - 0x78,0x40,0x33,0xa9,0xbe,0x71,0xa5,0x82,0xa7,0x8d,0xf6,0x9a,0x14,0x4d,0x4b,0xc7,0xd0,0x71,0x69,0xc3, - 0xdf,0x7a,0xf9,0xa2,0x59,0x5a,0x4b,0xb6,0x5b,0xcd,0x3f,0xf8,0x29,0x36,0x86,0x37,0xb4,0x8b,0xff,0xc4, - 0xc4,0x9c,0xb5,0x28,0x38,0xed,0x5d,0x3a,0xc9,0x48,0x62,0x7e,0xf5,0xaa,0xd5,0x9a,0x72,0xc2,0x01,0xad, - 0x5d,0xa8,0xf1,0x51,0xd2,0x33,0x49,0x51,0xba,0x85,0x2e,0xf5,0xbe,0xe5,0xf7,0xbb,0x71,0x1d,0xf5,0xbf, - 0x7a,0xf5,0x52,0x95,0xa7,0xe5,0x3e,0x74,0xbd,0xe5,0x96,0x29,0x0f,0x70,0x2a,0xe1,0x62,0x53,0x71,0xad, - 0x51,0x3a,0xa9,0x6e,0xc8,0xf1,0x97,0x9b,0x2a,0x41,0x39,0x26,0x58,0xc0,0x6b,0xdb,0x4b,0xa2,0x34,0xef, - 0xdf,0x94,0xcc,0x8e,0xf9,0x4c,0x91,0xa5,0x54,0xb9,0x39,0xf7,0xc7,0x5d,0x46,0x3f,0x38,0x30,0x9a,0x74, - 0x63,0xe3,0xea,0x44,0x16,0xf5,0x8c,0xab,0x00,0x1c,0x40,0x66,0xee,0xf3,0x3f,0xac,0xb6,0xd7,0xfe,0xf0, - 0xac,0xcd,0x32,0x7a,0xee,0xb6,0x9b,0xea,0x61,0xf6,0xb7,0xa7,0x7e,0xfb,0xfc,0x9b,0xc1,0x3d,0x09,0xff, - 0x4e,0x2a,0xbf,0xb8,0x17,0xd3,0x7e,0xd6,0xd4,0xe7,0x24,0x63,0x86,0xd0,0xb3,0x0e,0x1e,0x01,0x62,0x75, - 0xf5,0xf9,0xea,0xcb,0xf6,0xda,0x8b,0x59,0x20,0xfe,0xed,0xa1,0x79,0xec,0x37,0x33,0xbf,0x11,0x43,0x4d, - 0x04,0x66,0xb9,0xbb,0xda,0x5c,0xd6,0x95,0x2c,0x4f,0xee,0xc5,0xad,0x4c,0x73,0x36,0x00,0x70,0xe0,0x8d, - 0x97,0x8d,0x74,0x65,0x8e,0xf4,0x17,0x76,0xb5,0xd5,0xc4,0xbf,0x20,0x00,0x8b,0x41,0x99,0x81,0xb8,0xf2, - 0x5a,0xf6,0x33,0xb2,0x86,0x77,0x7d,0xce,0xc2,0x1f,0x82,0x38,0xdf,0x2b,0xfb,0x13,0xa3,0xa9,0xcf,0x97, - 0xfe,0x72,0x10,0xb0,0x42,0x0b,0xb5,0x34,0x81,0x85,0xe3,0x35,0x4d,0xd6,0x4d,0x70,0x22,0xdb,0xd9,0xf5, - 0x38,0x25,0xae,0x63,0xd6,0x2d,0x44,0x0f,0xda,0xa3,0xbd,0x62,0x9b,0x44,0xe5,0xc9,0xb8,0x6a,0x1e,0xac, - 0xb5,0x21,0xe4,0x0b,0xaa,0x75,0x66,0x1c,0x98,0xed,0x75,0xd5,0xcd,0x63,0x28,0x6c,0xbf,0xd7,0x08,0x90, - 0xb7,0x3d,0xb9,0xbc,0x44,0x90,0x43,0x0e,0xe2,0xab,0x3f,0x9f,0x2b,0xca,0x7c,0x14,0x04,0x1c,0x53,0x64, - 0xd6,0x79,0x8d,0x6a,0x62,0xa6,0x86,0x8a,0xd4,0x4a,0x42,0x53,0x98,0x6f,0xf6,0xa3,0xac,0xfb,0x80,0x7a, - 0x8d,0xe7,0x99,0x00,0x01,0xa1,0x9c,0xd5,0x20,0xd1,0x6c,0x5a,0x7a,0xd8,0xdc,0x42,0x5d,0xea,0x6a,0x8b, - 0x50,0x75,0x1e,0xa3,0x5d,0x84,0x8b,0x3d,0xbe,0xcf,0xcb,0x56,0x1d,0xd2,0x29,0x23,0xfd,0x05,0xad,0x06, - 0xec,0x1a,0xf3,0x5e,0x45,0xde,0xe5,0x1b,0x4d,0xda,0xf7,0x5d,0xb1,0x51,0x86,0x50,0xa9,0x2d,0xa7,0x70, - 0x33,0x9b,0x76,0xdd,0x07,0xa3,0x22,0x6c,0x8a,0xb7,0xb5,0xbc,0xdb,0x72,0x54,0x3f,0x20,0xe7,0xa0,0x16, - 0xfa,0xb0,0x02,0xa9,0x23,0x87,0x0a,0x1c,0x46,0xa1,0xf1,0xe7,0x1c,0x77,0xf2,0x0c,0xeb,0x8c,0xee,0xc1, - 0x9d,0x8e,0x6d,0xde,0x49,0x1b,0xfa,0x91,0xf5,0x61,0x75,0xa0,0x73,0x95,0x8e,0x47,0xa4,0xdf,0xb3,0x69, - 0xa2,0x34,0xa4,0xcc,0xa7,0xc5,0xbf,0x98,0x82,0xbf,0xf4,0x49,0x08,0xf5,0x9b,0xfb,0x75,0x39,0xe0,0xaf, - 0x85,0xa6,0x72,0xbf,0x92,0x82,0x6a,0xfd,0x85,0x70,0x4b,0x7f,0x1f,0x81,0x5c,0x4e,0xb1,0x16,0x7e,0xaa, - 0x80,0x79,0xe4,0xe3,0x85,0x23,0x6c,0xac,0xd7,0xd4,0xc8,0x5a,0x3d,0x2d,0xf3,0xe0,0x32,0x2b,0x94,0x83, - 0x3e,0x4f,0x8b,0xd2,0x54,0x07,0xb3,0xa1,0x8e,0x37,0xab,0x05,0xb6,0xf8,0x64,0x85,0xbf,0x5e,0x91,0xa3, - 0x86,0x5c,0xc5,0x24,0x9f,0x8d,0x6f,0x21,0x2d,0x78,0xc5,0x30,0x4b,0x6f,0x98,0x04,0xec,0xe2,0x68,0x88, - 0x35,0xe8,0x7b,0xf2,0xe5,0x25,0xeb,0xeb,0xcf,0x20,0xa8,0x1e,0x03,0x7c,0x5e,0x57,0x2d,0x7c,0x63,0x10, - 0x4b,0x19,0x9d,0xe0,0x58,0x6b,0xae,0x3d,0x29,0x83,0x79,0xa8,0xe6,0xc3,0x7b,0x3d,0x0e,0xea,0x1c,0x53, - 0x06,0x61,0x14,0xc6,0x69,0x3f,0x0a,0x73,0xdb,0xe1,0x05,0xc8,0xe6,0xa2,0xc1,0xe5,0x60,0xb9,0x2b,0xfa, - 0x0b,0x3d,0xc4,0xa6,0x0a,0x5e,0x87,0xd5,0x8e,0x1c,0xec,0xee,0x7f,0xdc,0xd9,0xdb,0x3d,0xc6,0x8a,0x6a, - 0x48,0xd0,0xe6,0x46,0x01,0x63,0x1c,0x19,0xd8,0x46,0x56,0x14,0x45,0x7c,0x0f,0xe7,0x66,0x02,0x5a,0x59, - 0xb7,0x40,0xa7,0x83,0x1d,0x43,0xa7,0xcf,0x4c,0xd3,0xe1,0xd6,0xfe,0xee,0xc9,0xc9,0xee,0xb1,0x53,0x4e, - 0xad,0x09,0x8a,0xcc,0x88,0x3c,0x1a,0xaf,0x56,0x3e,0x38,0x38,0x5c,0xb5,0xca,0x52,0xae,0xc2,0x77,0x91, - 0xb3,0x2a,0x45,0x45,0x3e,0xb7,0xab,0xd6,0x07,0xb2,0xfa,0x60,0x82,0x0f,0x49,0xf8,0xc4,0x3f,0x31,0x21, - 0xf7,0x54,0x6f,0xd5,0x79,0x82,0x3d,0x55,0xea,0x50,0x8d,0xc7,0xd0,0xca,0xb4,0xd1,0x52,0xd7,0xe9,0xd8, - 0x1a,0x0c,0x46,0xdf,0x75,0xa6,0x89,0x51,0x90,0x44,0x97,0x24,0x2c,0x3c,0x46,0x0d,0xa8,0xc2,0x8e,0x63, - 0xc2,0xb8,0xc2,0xc0,0x1d,0xfb,0x80,0x84,0x12,0xe8,0xb4,0x7c,0x61,0xc9,0xfb,0x5b,0x45,0xe7,0x21,0xf3, - 0x3f,0x5f,0x8c,0x09,0x3a,0x77,0xda,0x10,0xa4,0x63,0xec,0x40,0xee,0x7d,0x82,0x31,0x1c,0x10,0x52,0x86, - 0x79,0x27,0xb8,0x9f,0x39,0x84,0xfe,0x32,0xcc,0x0e,0x61,0x97,0xa8,0x9c,0x2d,0x42,0xf1,0xa4,0xdb,0x2c, - 0x55,0x8d,0xad,0x50,0x32,0x2e,0x02,0x3b,0x19,0x26,0x5c,0x0e,0xae,0x01,0x21,0xdc,0xf4,0xac,0x9b,0xfb, - 0x19,0xf1,0x84,0x62,0xd4,0xf0,0x50,0xe8,0x8f,0x07,0xfb,0xef,0x8a,0x62,0x7c,0x14,0xfe,0x32,0xa1,0x61, - 0x58,0xef,0xab,0x90,0xb6,0x87,0x1f,0x8f,0x4f,0xc4,0x27,0x7d,0x43,0x19,0x40,0x74,0x33,0x7a,0x86,0x8c, - 0x27,0x6f,0xec,0x64,0xd7,0xad,0xac,0xc1,0xf2,0x74,0x86,0x4a,0x4e,0xc6,0x10,0x41,0xe8,0x83,0x71,0x96, - 0x0e,0x60,0xd3,0xd2,0x15,0x55,0x14,0xd9,0xe1,0xb1,0x0b,0x4c,0x0a,0x9c,0x72,0x2d,0x2d,0x11,0xc2,0xf0, - 0xd6,0xcf,0x1a,0x37,0x2b,0xb0,0x45,0x2c,0x82,0x18,0xbe,0xc8,0xe9,0x63,0x24,0x72,0x53,0x29,0xb8,0x1f, - 0xa4,0xf0,0x61,0xf0,0x37,0x5b,0xcf,0xc5,0x8b,0xef,0xbc,0x37,0x1f,0x82,0x04,0x5c,0xbb,0xde,0xca,0x6d, - 0x41,0x5c,0x50,0x4b,0x0f,0xb9,0x59,0xa4,0xea,0x0b,0x84,0xb0,0xa2,0xcd,0xd1,0x81,0xdb,0x6f,0xad,0x31, - 0xa4,0x42,0xd2,0xdf,0xdd,0xcb,0x09,0x57,0xd7,0x8a,0x4b,0x00,0x6d,0xcc,0x9c,0x36,0xba,0x3c,0x84,0x40, - 0x60,0x63,0xa2,0xdc,0x5a,0x33,0x25,0x61,0xd3,0xab,0x39,0x6a,0x16,0xe8,0x1b,0x0d,0xe7,0xdd,0xc9,0xc9, - 0x21,0x9b,0x1b,0x28,0xc2,0x63,0x6c,0x5e,0x99,0x35,0xb3,0xee,0x45,0x44,0x21,0xa6,0x97,0xed,0x64,0xc1, - 0x65,0x21,0x5b,0xe9,0x83,0x51,0xa0,0x2f,0x10,0xa2,0x38,0x9c,0xf0,0xd0,0x8a,0x7e,0x90,0xfe,0x90,0xe6, - 0x41,0x3d,0x89,0xea,0x2f,0x9b,0xba,0xcd,0x68,0x0e,0x19,0x25,0x8e,0xed,0xdd,0xa3,0xa3,0x9f,0xce,0xb7, - 0x0e,0xf7,0xba,0xa7,0xce,0x45,0x90,0x9d,0xc3,0x6f,0x5e,0xe1,0x42,0xd5,0xd2,0x17,0xd7,0x3b,0x9b,0x7e, - 0x0d,0x86,0xcd,0x79,0x8f,0x48,0x09,0x3d,0x7f,0x69,0x6e,0x7a,0x34,0x86,0xbd,0x28,0xeb,0xc5,0xa1,0xdb, - 0xfb,0xe2,0xd7,0x7a,0xb7,0x7e,0x2d,0xf3,0x6b,0x1c,0x3c,0xb4,0xcc,0x3a,0x67,0x05,0xd7,0x85,0xf9,0x7c, - 0x20,0xc5,0xaf,0x5c,0x55,0x9f,0xb6,0x04,0xfc,0x86,0xc4,0x46,0xf5,0x0a,0x97,0xe7,0xc4,0x78,0x64,0xe6, - 0x12,0xe1,0x38,0xed,0x0d,0xcf,0x47,0x39,0x17,0xbb,0x4c,0x13,0x29,0x84,0x17,0x31,0xaf,0xe3,0xf4,0x61, - 0x8a,0xf8,0x5a,0x78,0xc8,0xaf,0xdd,0x21,0xd5,0xe0,0xd7,0xae,0x3d,0x15,0x77,0x5e,0x55,0x4a,0xc0,0xdc, - 0x7a,0x1c,0x41,0x39,0x09,0xdd,0x2f,0x4d,0x7a,0xa3,0xff,0xbf,0xb4,0xe8,0xb7,0x65,0xc1,0x87,0xdc,0x5f, - 0x3b,0x0c,0x71,0x3a,0x70,0xc5,0xba,0x1e,0xe7,0x3a,0x2c,0x7a,0x31,0x0c,0x23,0x91,0xaa,0x38,0x40,0xf4, - 0x8d,0x86,0x1c,0xfa,0x3a,0x31,0xa2,0x35,0xce,0xf7,0x90,0x2d,0x11,0x5d,0xc0,0x67,0x01,0xa2,0x57,0x9c, - 0x3b,0xee,0x59,0x50,0x5c,0x0c,0xca,0xe6,0xb3,0x60,0x34,0x3e,0x67,0xce,0x52,0x3e,0x25,0x62,0x87,0x82, - 0x4c,0xf3,0xe9,0x6d,0x1c,0x24,0x9b,0xf8,0x09,0xc3,0xbe,0x14,0xc7,0xf8,0x4a,0xc9,0x1b,0xbf,0x36,0xb4, - 0x9a,0x42,0x8e,0xcc,0xd8,0xe2,0xec,0xc1,0x85,0x4b,0x35,0x0f,0xa8,0x75,0xbc,0x8a,0x4b,0x6e,0x69,0x98, - 0x76,0x2d,0x55,0x90,0x9a,0x4a,0x69,0x43,0xe0,0x96,0x72,0x96,0x39,0xb9,0xd7,0x16,0x78,0x56,0x59,0x9d, - 0x73,0x1e,0x25,0x57,0xe7,0x6c,0x31,0x89,0x9a,0x4c,0x6a,0x25,0x45,0x99,0xc6,0x70,0x6d,0x37,0x61,0x78, - 0xa5,0x11,0x46,0x0a,0xe1,0xe9,0x96,0xa5,0x62,0xc6,0x2d,0xf8,0x2b,0xb9,0xc6,0x31,0x2d,0xf5,0x20,0x62, - 0xf4,0x92,0x6b,0x16,0xe2,0x3e,0xce,0x55,0x1d,0x3a,0x85,0x8d,0x73,0xdd,0x34,0x61,0xa4,0x21,0xda,0xd9, - 0x10,0xee,0xcd,0x9d,0x64,0x31,0x81,0x79,0x61,0x75,0x87,0x73,0x71,0x34,0xfb,0x40,0x16,0x07,0x93,0x91, - 0x4c,0x1c,0xcf,0x2c,0x2c,0x02,0x62,0xf4,0x78,0x89,0xc9,0x37,0x0a,0x64,0x42,0xdb,0x5d,0x39,0x90,0xf6, - 0x6b,0xf3,0xc0,0xe0,0xf4,0x20,0x50,0x93,0x84,0xb3,0x03,0xf3,0xfc,0x4b,0x81,0x33,0xb2,0x0b,0xc2,0x67, - 0x1a,0xd5,0x74,0x1c,0xf5,0x80,0x26,0xb7,0x20,0x1d,0x26,0x3b,0x9f,0x5c,0x60,0x4b,0xbf,0x08,0x75,0x81, - 0x9e,0x7c,0x3a,0xc9,0xa3,0x5e,0xe3,0x22,0xc0,0x09,0x02,0xb0,0x09,0xc1,0x94,0xad,0xf4,0x30,0x90,0xd5, - 0x27,0xaf,0x31,0x3c,0xfc,0x58,0xef,0x18,0x66,0xde,0x39,0x79,0x21,0x20,0x22,0xb6,0x0b,0xdb,0x57,0x7e, - 0x9d,0x8c,0x30,0x4f,0xd0,0x7d,0x57,0xb8,0x09,0x9b,0x3b,0x1a,0xc5,0x31,0x3b,0x42,0x4a,0x7c,0x3e,0x79, - 0xb6,0x73,0x02,0xc2,0xce,0x45,0x99,0x39,0x4d,0xfe,0xc2,0xef,0x68,0xff,0xe1,0x2b,0xe4,0x84,0x45,0x2f, - 0x3b,0x65,0x1c,0x4c,0xf2,0x70,0x26,0x49,0x99,0x4e,0x57,0x53,0x69,0xf9,0x4d,0x46,0x33,0x25,0x71,0xe7, - 0xa0,0x52,0xe0,0x9f,0x07,0x9d,0x20,0x4e,0xd4,0x20,0x7e,0x92,0xa7,0x99,0xf6,0xe6,0xe4,0xce,0x27,0x9d, - 0x5f,0xa7,0x71,0x91,0xdb,0x19,0xda,0x83,0x8f,0x9d,0x16,0x1b,0xb2,0xa6,0x12,0xa0,0x2b,0x92,0x43,0xb3, - 0xd3,0x4a,0xb3,0x5c,0x10,0xa9,0x64,0x25,0x1a,0x80,0xa5,0xba,0x3d,0xef,0xc1,0x39,0x39,0x51,0x84,0x4a, - 0x16,0x90,0xf8,0x2a,0xbc,0xad,0xa4,0xe5,0x92,0x46,0xf4,0x52,0x53,0xb2,0x9c,0xcf,0xe0,0x1b,0xf0,0x27, - 0xa8,0x0b,0x4b,0xca,0x40,0x17,0x35,0xf3,0xa6,0x32,0xd8,0x7c,0x84,0xf5,0x46,0xed,0xd4,0x05,0x35,0x63, - 0xcc,0x84,0x33,0xbe,0x35,0x54,0x5c,0x25,0x8e,0x57,0x67,0x52,0xc6,0x9a,0x5a,0x56,0x93,0x34,0x46,0x49, - 0x0a,0xb3,0xca,0xae,0xd4,0x58,0xa6,0xe6,0x44,0x57,0x72,0xab,0x14,0x7c,0x13,0x58,0xaf,0x45,0x16,0x20, - 0xca,0x35,0x3b,0x48,0xe1,0x54,0x73,0xf9,0x72,0x65,0xf7,0x8d,0x53,0x73,0x49,0xe5,0xcd,0x04,0x5c,0x53, - 0xd6,0xa0,0x9d,0x95,0x08,0xc7,0x88,0x76,0x18,0x5c,0x39,0x80,0x8d,0x2c,0xf3,0x44,0x4f,0xd2,0x8d,0xfa, - 0x65,0x12,0x5f,0xd0,0xcc,0x15,0x1f,0xa5,0xfd,0x8b,0x09,0xce,0x6c,0x83,0xfe,0xbb,0x34,0xc6,0xf6,0x7f, - 0x14,0x0e,0xb0,0xbb,0x67,0xb9,0x0b,0xfe,0x92,0xf6,0x1b,0x31,0x22,0x06,0xc9,0x9c,0x24,0x45,0xf9,0xb5, - 0xbd,0xe0,0xcb,0x4a,0xf6,0x60,0xc3,0xfa,0xaf,0xab,0xe2,0x75,0x1a,0xc5,0xff,0xb2,0x2f,0x77,0x22,0x58, - 0xda,0x17,0x21,0x03,0xf1,0xdb,0xab,0xa0,0x9d,0xad,0xf5,0xdc,0xda,0x48,0x4d,0xea,0x6a,0xdb,0x1d,0xd2, - 0x52,0x00,0x3d,0xbf,0xb1,0x72,0x2e,0x89,0x72,0xcd,0xe4,0x9d,0xf9,0xc2,0xc9,0x1c,0x7c,0xdc,0x39,0x26, - 0x56,0xc6,0xb8,0x44,0x61,0xd2,0xa9,0x68,0x9c,0xa6,0x4b,0x4c,0x37,0xac,0x25,0x6d,0x96,0x94,0xb5,0x2a, - 0x0c,0x12,0x6b,0x9c,0xd1,0xf8,0xa0,0xa7,0xd5,0xb4,0xf8,0xfa,0xe3,0xd1,0x2e,0xb5,0x88,0x80,0xbd,0x70, - 0xfa,0x21,0x96,0xba,0xb4,0x15,0x05,0x71,0x2c,0x3b,0x52,0x9e,0x03,0x87,0xf5,0x73,0x0a,0x17,0xdc,0x08, - 0x59,0xcb,0x5c,0xa8,0x23,0x31,0xed,0xe8,0x61,0x00,0xb0,0x06,0x71,0x7a,0x01,0x37,0x66,0xda,0xf5,0x0f, - 0xfd,0xf2,0xdf,0x5c,0x9f,0xac,0xf2,0x0b,0x91,0x6a,0xed,0x41,0x5c,0xc4,0x1d,0x22,0xfc,0x08,0x84,0xa1, - 0x2f,0xfb,0x7d,0x13,0x7a,0x1b,0xd6,0x77,0x5c,0x03,0x4d,0x12,0xaa,0x85,0xd7,0x60,0xee,0x48,0x26,0x7f, - 0x23,0x84,0x4c,0xd4,0x91,0xb4,0xe8,0x61,0x32,0xe6,0xaf,0x70,0xfa,0x66,0x46,0xdb,0x74,0xf4,0xfd,0x8f, - 0xa5,0x73,0x78,0x07,0xee,0x36,0x9c,0x30,0x56,0x3f,0x39,0x8a,0xf3,0xe5,0xa3,0x74,0x09,0xbb,0x2c,0xfb, - 0x1a,0x0f,0x79,0xe0,0x34,0xb4,0x7c,0x89,0xc4,0xdd,0x97,0x3b,0x26,0x06,0x8c,0xcd,0x8a,0x95,0xa3,0x73, - 0x1d,0x5f,0x96,0x7a,0x10,0x01,0xde,0xeb,0x80,0xab,0x4a,0xd1,0x6d,0xe5,0x54,0xc5,0x81,0xa7,0x14,0x2a, - 0x8d,0xb9,0x85,0x6f,0xc2,0x31,0x77,0x2f,0x88,0x72,0xe9,0x18,0x4d,0x68,0x8f,0xa7,0x31,0xbe,0x74,0xce, - 0x3c,0x8d,0x14,0xbb,0x07,0x06,0x74,0xc3,0xf0,0xce,0xa8,0x40,0xe8,0xb8,0x79,0x0d,0xc8,0xef,0x46,0x17, - 0x40,0x1d,0x29,0x52,0x62,0x79,0x6d,0xe5,0xb8,0x1c,0xff,0xcf,0xd3,0xb5,0xbf,0xf9,0xf0,0x68,0xe5,0x4f, - 0xbe,0x59,0xfb,0x4c,0x7d,0x40,0xe1,0xdd,0x93,0x99,0x3a,0x91,0xe8,0x59,0x18,0x37,0x5f,0x02,0xa9,0xba, - 0xc4,0xc9,0xc7,0xf7,0xdd,0x15,0xf7,0xbb,0xfa,0xe9,0xe7,0xfc,0xf3,0xf1,0xd9,0xd3,0x4d,0x77,0xb3,0x53, - 0xff,0x6e,0xfa,0x3b,0xcf,0x9b,0xba,0xdf,0x9d,0xfe,0xfc,0x39,0x39,0x7b,0x4a,0x4f,0x7f,0x47,0xa9,0x9f, - 0x3f,0x37,0xa6,0xa7,0x3f,0xff,0xdd,0xe7,0xcf,0x67,0xde,0xd3,0xbf,0xdb,0x9c,0x3a,0x26,0xc9,0xe1,0x24, - 0x67,0x93,0xca,0x35,0x4f,0xbf,0xfc,0xf1,0xec,0xb4,0x59,0x7f,0x19,0xd4,0x2f,0xb7,0xea,0x6f,0xce,0x96, - 0xa7,0x9f,0xfb,0xcb,0x28,0xd8,0xa0,0x5f,0x0f,0x75,0x9f,0x86,0xbb,0x67,0xa7,0xcb,0xf5,0xb3,0x4d,0x4e, - 0xa0,0x4f,0xd4,0x6d,0xde,0xf9,0xd9,0xe7,0x1b,0xb4,0x74,0xea,0x92,0xc0,0x74,0xfa,0xf9,0xec,0x0c,0xcf, - 0xf5,0xe5,0xa7,0x2b,0xbf,0x7f,0xb5,0xd1,0x7d,0xb2,0x34,0xfd,0xf9,0x3f,0x6c,0x76,0x1a,0xfe,0xfa,0xd9, - 0xb2,0xb7,0x32,0xb0,0xa2,0x8c,0x61,0xb7,0xdf,0x06,0x85,0x96,0xf8,0xdb,0xa5,0x68,0xe7,0xb8,0xa7,0x77, - 0x88,0x7d,0xe9,0x78,0x67,0xf7,0x8e,0x75,0x9e,0x1d,0xd5,0xd2,0xcb,0xd3,0xc2,0x2f,0xea,0xad,0x33,0x4b, - 0x43,0xf1,0x34,0x3a,0xab,0x78,0x43,0x2f,0xca,0xbb,0x4d,0xf1,0xe6,0xde,0x84,0xd1,0x9b,0x23,0x2e,0x14, - 0xcb,0x00,0xe0,0x9e,0x97,0x77,0x5b,0x38,0xa8,0x3d,0x4d,0xcc,0xa5,0x63,0xe1,0x9d,0xb1,0x47,0x74,0xb6, - 0xaa,0x09,0x2a,0x85,0x4d,0x9d,0x79,0xb7,0x8e,0xcf,0x92,0xd3,0xc0,0xfe,0xec,0x5e,0x8e,0x45,0x6d,0x9f, - 0xd4,0xd1,0x7a,0xb2,0xd1,0x6d,0x2e,0x2d,0x55,0xfc,0xba,0x77,0x73,0x78,0x48,0x85,0x4b,0x77,0x86,0xd4, - 0xb8,0x60,0x2f,0x13,0xb3,0xa5,0xa5,0x27,0xb5,0x7a,0x5d,0x1b,0x3e,0xd4,0xf2,0x8d,0xe6,0xe6,0x69,0xe4, - 0x27,0x67,0x9d,0xd3,0xc4,0x8f,0xce,0xee,0x6d,0x2f,0xae,0x56,0xc4,0x36,0x38,0x41,0xdf,0x25,0xfe,0x22, - 0x9d,0x8d,0xc2,0x55,0xd5,0xfe,0x98,0xb0,0x69,0xdd,0x02,0x03,0x9f,0x61,0xfc,0x80,0xcb,0x3b,0x1d,0xb0, - 0x0b,0xfc,0x16,0x11,0xca,0xc0,0x0a,0x6b,0x48,0xcf,0xc4,0xe7,0xc5,0x31,0x7b,0x54,0xd0,0xe1,0xb7,0x7d, - 0x84,0x00,0x57,0xc1,0xbc,0x39,0x6c,0x37,0x09,0xe6,0x08,0x79,0xf7,0x35,0xb4,0x13,0xab,0x41,0xbf,0x25, - 0x29,0x83,0x78,0xa2,0x52,0x2a,0x46,0x54,0xce,0x36,0x89,0xd8,0xb7,0x35,0xa2,0xcf,0x59,0x2f,0x54,0x8a, - 0x9e,0x73,0x56,0x65,0x1c,0xb5,0x1e,0x77,0xb7,0xfe,0x82,0x38,0x75,0x21,0x1b,0x6f,0xfb,0xe6,0xfa,0x35, - 0xb2,0xb2,0xb2,0xcc,0x0a,0x58,0x6e,0xe9,0xb2,0x4c,0x32,0x0e,0xcc,0x2d,0xf3,0xaa,0xdc,0xff,0x4b,0xf8, - 0x38,0xf9,0x19,0x9b,0x0b,0xc2,0x09,0x1f,0x70,0xb0,0xcb,0x26,0x9c,0x93,0x84,0x7d,0x76,0x23,0xeb,0xb2, - 0x8b,0x77,0xf6,0x33,0x75,0x37,0xec,0xf0,0x39,0xc3,0x1b,0x6c,0x68,0xee,0xc4,0xf5,0xd8,0x4d,0x81,0xc4, - 0xd6,0x82,0x02,0xd2,0x78,0x36,0x7b,0x4c,0x9b,0x2a,0xd1,0xea,0x93,0x74,0xec,0xf9,0x71,0x78,0x59,0x3c, - 0x90,0xbf,0x4f,0x59,0xde,0xbd,0x76,0x73,0xd5,0xb4,0x42,0x32,0x20,0xd8,0x90,0x81,0x0f,0x6e,0xf8,0xc4, - 0x7e,0x3b,0xea,0xc2,0x72,0xb4,0xd7,0x65,0x9d,0x56,0x7f,0xd2,0x5d,0xec,0xf3,0x82,0xe3,0xff,0x54,0x96, - 0x67,0x00,0x65,0x7d,0x76,0x09,0x81,0x90,0x48,0x88,0xc0,0xa4,0x8d,0x9a,0xa4,0x65,0x7f,0x40,0x2b,0xcc, - 0xbf,0xc4,0x32,0x33,0x94,0xa9,0x01,0x9d,0x9c,0x3d,0x2c,0x11,0x6b,0x59,0x84,0xeb,0x61,0xb7,0x2c,0xc1, - 0x0a,0x04,0x81,0xb7,0x0e,0xe5,0x22,0x5e,0x4c,0x1b,0x23,0xa8,0x27,0x8b,0x27,0x76,0x75,0x4d,0x31,0xf2, - 0x55,0x1e,0xd4,0x1d,0xbb,0x0b,0x6a,0x5f,0x2f,0x29,0x41,0x53,0xae,0x6e,0x13,0xc0,0x11,0x12,0x25,0x9f, - 0x4e,0xc3,0xd3,0xf6,0xd9,0x26,0xbd,0xf7,0x9c,0x4e,0x78,0xba,0xca,0x8f,0x39,0x1e,0xd7,0xf8,0x31,0xc1, - 0xe3,0xb3,0xb3,0x4d,0xbd,0xf1,0xa9,0x18,0x13,0xc8,0xba,0x72,0x3a,0x36,0x99,0x36,0xd1,0x27,0x88,0xb4, - 0xd3,0xf0,0x0c,0x96,0x96,0xe6,0x72,0x2f,0x3d,0x93,0xb8,0x7b,0x60,0xca,0xeb,0xbd,0xc3,0xaa,0x3a,0xd0, - 0x55,0xff,0xbf,0xdc,0xbd,0xd9,0x72,0xdc,0x58,0x9a,0x26,0xf8,0x2a,0x24,0x32,0x93,0x01,0x84,0x1f,0x3a, - 0x7d,0xe3,0x06,0x17,0xe4,0x45,0x49,0x54,0x86,0x2a,0xa5,0x90,0x52,0x94,0x72,0x63,0x30,0x64,0x70,0x77, - 0x90,0x44,0xc9,0x09,0x78,0x02,0x70,0x51,0x0a,0xd2,0xe7,0xb2,0x6e,0xda,0x6c,0xca,0xa6,0xcb,0xba,0xdb, - 0x6c,0xac,0xcc,0xba,0xef,0x66,0x2e,0xc6,0xac,0xef,0x7a,0xfa,0x6a,0x2e,0xe6,0x51,0xf2,0x05,0xa6,0x1f, - 0x61,0xfe,0xe5,0x6c,0x58,0xdc,0x9d,0x8a,0xcc,0xaa,0x31,0x9b,0x4c,0x0b,0xd1,0x01,0x1c,0x1c,0x9c,0xf5, - 0x3f,0xff,0xfa,0xfd,0x92,0xc0,0xcb,0x47,0x68,0xfd,0x08,0x9c,0x31,0x06,0x4c,0x05,0xdb,0x0b,0xb4,0xa8, - 0x50,0xb7,0xb7,0x83,0x60,0x01,0x1d,0x43,0xed,0x8e,0xb9,0xee,0x5e,0x8c,0x9c,0x14,0x36,0x46,0xba,0x75, - 0xe3,0x08,0x39,0x60,0x49,0xdd,0xc3,0x3c,0x81,0x1d,0xe1,0xf9,0xb0,0xc4,0x5c,0xec,0x26,0x8e,0xc6,0x01, - 0xfd,0x7b,0x78,0x81,0x5f,0xbb,0x0c,0xae,0x10,0x87,0xc8,0x5b,0xde,0x3c,0x0a,0x35,0xf2,0x56,0x75,0xf4, - 0xd1,0x06,0x2d,0x35,0xb5,0x3f,0x24,0x0e,0x87,0x34,0xd5,0x33,0xb9,0x2b,0x35,0xd3,0x6d,0x10,0xaa,0xd3, - 0x0e,0x4b,0xcb,0x5a,0xc5,0xa7,0x20,0xd4,0x6e,0x17,0xb5,0x85,0xd4,0xf0,0xc2,0xf0,0x16,0x7a,0x39,0xc3, - 0xbc,0xf1,0xc1,0xad,0x88,0x9a,0xbe,0xc8,0xa6,0x86,0xcb,0x2c,0xbd,0x71,0xef,0xf8,0x1d,0xff,0x16,0xb3, - 0xe3,0x6a,0x58,0x0f,0x95,0xeb,0x51,0xe1,0x5f,0x62,0xb8,0x82,0xe7,0x55,0x3d,0x1b,0x22,0x1d,0x1e,0xa6, - 0xbe,0x4c,0x7e,0x0e,0xe6,0xf6,0x79,0x71,0xc1,0x31,0x59,0x64,0x86,0x84,0x5a,0x30,0x26,0x6d,0x44,0x44, - 0xc3,0xe7,0xab,0x4f,0x23,0xcc,0x29,0x87,0xce,0x3c,0xb9,0xf4,0xf8,0x9c,0xe4,0x39,0x41,0x97,0x50,0xa2, - 0x8d,0xe0,0x16,0x41,0x5c,0x80,0x20,0xb6,0xdc,0xb8,0x0d,0x3f,0x5a,0x6e,0xba,0xdb,0xf5,0xbe,0x8d,0xdb, - 0xd7,0x1e,0x66,0xd5,0x1b,0x4a,0xfc,0x37,0xa7,0x05,0x77,0x28,0xcd,0x5e,0x25,0x22,0x16,0xb3,0xc7,0x97, - 0x6a,0xfd,0xc4,0x2d,0x28,0x15,0xf2,0x2b,0x9f,0xf8,0xb4,0xfe,0x13,0x62,0x8c,0x4a,0xee,0x9d,0x9d,0xa9, - 0x6b,0xe1,0xd1,0x5c,0x22,0xc9,0xb8,0xbf,0x77,0xe7,0x81,0x54,0x40,0x9c,0x24,0xf1,0x0d,0xf1,0xcd,0xcf, - 0xd1,0xe7,0xcc,0xbd,0xf2,0xac,0xc2,0x50,0xc1,0x5d,0x21,0x73,0xb6,0x01,0x91,0x0a,0x22,0xeb,0x77,0x62, - 0x7e,0x0b,0x55,0x06,0x09,0x95,0x7e,0x80,0x17,0xa6,0x2a,0x10,0xb2,0xef,0x90,0xc0,0x5e,0xba,0x94,0x4f, - 0x64,0xe2,0x1a,0x58,0xf8,0xd5,0x58,0x99,0xb7,0x68,0x36,0xab,0x3f,0xe5,0xfa,0xa1,0x7f,0x9e,0x38,0x57, - 0x5e,0x97,0x98,0xd3,0x13,0xe3,0xde,0x14,0xa4,0x4d,0xc9,0xa7,0xbc,0xa1,0x92,0x48,0x5c,0x7a,0xcd,0xb5, - 0x8f,0x67,0x70,0x24,0x60,0x50,0xc5,0x1d,0xe2,0xb6,0xf9,0xb1,0x28,0x42,0x3f,0x11,0x70,0xf0,0xf8,0x21, - 0x66,0xf4,0x64,0xe9,0xd7,0xb5,0xa0,0x45,0x38,0xa5,0x2d,0xba,0xe9,0xc8,0x67,0x91,0x77,0x97,0xe8,0xfc, - 0xc4,0x78,0xa2,0xc8,0x8e,0x2f,0xc5,0x25,0x10,0x62,0x10,0x64,0xe1,0xb1,0xfc,0xb5,0x14,0x69,0x82,0xe7, - 0x39,0xd9,0xaf,0x83,0x08,0x2f,0x5f,0xa1,0xd7,0x0f,0x5c,0x22,0x68,0xa5,0xb8,0x09,0xb3,0x8f,0xac,0x80, - 0x66,0xa3,0x57,0x1a,0x44,0xf7,0xf7,0x1d,0x93,0x46,0x30,0x22,0x4a,0x8f,0x01,0x1c,0x66,0xd1,0x45,0xed, - 0xeb,0xa1,0x5b,0x3c,0xb2,0x26,0xe8,0xfe,0xbe,0x78,0x6c,0x5d,0xb6,0x12,0x19,0xd9,0xc9,0x47,0xd3,0x2e, - 0xbc,0x40,0x64,0xc9,0x9a,0x5d,0xed,0xbe,0xd2,0x01,0x3e,0xac,0x5c,0x7c,0xaf,0x87,0x4b,0x04,0x9b,0x3e, - 0x01,0x46,0xa1,0x70,0x6d,0xdf,0x33,0xce,0x4d,0xba,0x92,0x06,0x50,0x43,0x35,0x45,0x07,0x96,0x8a,0xa8, - 0x81,0xca,0xba,0x89,0x87,0xa5,0x1f,0x35,0x11,0x96,0x49,0x4a,0x88,0x48,0x9c,0xba,0xa2,0x58,0xca,0x2f, - 0xff,0xe1,0x8f,0x6e,0x75,0x18,0xd0,0x95,0xb4,0x2d,0x9b,0xa5,0xf4,0xf2,0x37,0xf7,0xf7,0x3a,0x1d,0x9a, - 0x29,0xbf,0x70,0x15,0x7f,0x24,0x49,0xa9,0x8c,0x53,0x9f,0xa7,0x79,0x4c,0xe9,0xd4,0xc2,0x71,0x9e,0xce, - 0xe0,0x94,0x1f,0x92,0xff,0x65,0x0c,0x6d,0xfa,0xe2,0xcb,0xc0,0x66,0x10,0x8d,0x8a,0x68,0x17,0xde,0x9b, - 0x44,0xfe,0x3c,0x8b,0x86,0xa8,0xc4,0xde,0xbd,0x0c,0x6f,0xe2,0xd9,0x17,0x02,0x09,0xc6,0xeb,0xe7,0x74, - 0xd9,0x72,0xf8,0x61,0x4e,0x7c,0x91,0x7c,0x74,0x06,0x17,0x94,0x24,0x15,0x29,0x1e,0xaa,0xdc,0x06,0x88, - 0xd4,0xaa,0x21,0x33,0x11,0x85,0x8c,0x13,0xdf,0x3d,0x41,0x49,0x15,0xc8,0xda,0x53,0x1a,0x7d,0x82,0x9d, - 0xf7,0x18,0x90,0x6e,0x6f,0xd0,0xd1,0x51,0xa7,0x30,0x13,0xd0,0x97,0xbb,0xcf,0x34,0x42,0x97,0x45,0x0b, - 0xd3,0xe5,0xa4,0x33,0x5c,0x08,0x37,0xbb,0xf6,0x5e,0x14,0x5f,0x7c,0x5e,0x25,0x05,0xb1,0x25,0xb8,0x4c, - 0x76,0xad,0x29,0x87,0x51,0x05,0xb1,0x14,0x84,0xde,0x52,0xf2,0x38,0xe4,0x90,0x35,0xf7,0x80,0xe7,0x38, - 0xf0,0x3e,0x37,0x61,0x32,0xbd,0xbf,0x6f,0xbc,0x8d,0x3b,0x17,0xeb,0x78,0x47,0x58,0x84,0xdb,0x5d,0x61, - 0xfc,0x15,0x88,0x30,0x94,0x96,0x03,0xe1,0x06,0xeb,0x5b,0xa7,0xc9,0x74,0xa8,0x76,0x4d,0x75,0x21,0x15, - 0x5e,0x2b,0x6a,0x95,0x6f,0x86,0x5e,0x6d,0x79,0x55,0x6a,0x03,0x32,0xae,0xd6,0xcc,0xf2,0x16,0x97,0x2b, - 0x8c,0x36,0x21,0xe9,0x79,0x77,0x33,0xb9,0x1f,0xad,0xe0,0xa3,0xeb,0xc5,0x98,0xc3,0x99,0x5e,0x93,0x25, - 0xda,0x76,0x20,0xdb,0xfb,0xf1,0x17,0x5b,0x7f,0x07,0xcf,0xb7,0x5c,0xe3,0xd6,0x78,0x71,0xd7,0xed,0x2d, - 0x3d,0xb8,0x03,0x52,0x14,0x5d,0x1e,0x0c,0x96,0x1e,0x3b,0x63,0x56,0xbd,0x41,0x8b,0x11,0xe2,0x2c,0x17, - 0x70,0x98,0x8b,0xfc,0x3a,0xec,0xed,0x1f,0xc0,0xef,0xde,0x85,0x40,0xcf,0x0b,0xed,0xa4,0x51,0xc0,0xd1, - 0xaf,0xdc,0x6c,0x18,0xd1,0xb9,0xa1,0x65,0xdf,0x49,0x28,0x67,0x05,0x20,0x30,0xc1,0xb4,0x95,0x58,0xa1, - 0xeb,0x56,0x7c,0xdc,0x3c,0xe5,0x9c,0x15,0xd9,0xd4,0x5c,0x57,0xf4,0x32,0x4e,0x3e,0x1a,0x10,0x05,0xdb, - 0x5b,0x93,0xba,0x65,0x3c,0x35,0x9b,0x6c,0xfa,0xf9,0x02,0x13,0xb4,0x5e,0x65,0x88,0x81,0xae,0x61,0x00, - 0x1c,0x39,0x42,0x08,0xdd,0x85,0xf1,0x57,0xe5,0x36,0x27,0x70,0x40,0xc1,0x76,0x6e,0xd5,0x90,0xa4,0x74, - 0xb1,0xb7,0x30,0x6f,0xa8,0xe0,0x84,0x46,0x05,0x4e,0xc6,0x17,0xce,0xc6,0xe6,0xc1,0x22,0x3c,0xd7,0xa5, - 0x49,0xb1,0x83,0x82,0xc3,0x85,0x11,0xe8,0x92,0x87,0xf4,0x40,0xc3,0xed,0x9c,0x4c,0x50,0xff,0xe0,0xeb, - 0x1a,0x89,0x3f,0x2e,0x79,0x2d,0x91,0x7e,0xc6,0x2f,0xb9,0x80,0x92,0x63,0xad,0xfc,0x32,0x25,0xcd,0x34, - 0x14,0x69,0x31,0x7e,0x97,0x7e,0x04,0x3e,0x46,0xf9,0xe2,0x72,0x53,0xe0,0xf6,0x33,0xe9,0x0a,0xca,0x2d, - 0x72,0xe0,0xce,0xc9,0xa2,0xb8,0x7e,0x2b,0x5d,0xd6,0x1d,0xa4,0x05,0x27,0x04,0x2e,0x16,0xff,0x44,0xdf, - 0x0d,0x40,0x32,0x02,0x9a,0x96,0xe1,0xf0,0x2e,0x19,0x66,0x0b,0x4d,0x9b,0x71,0x60,0xbb,0x25,0x91,0x6a, - 0x2c,0xf7,0xf7,0xf6,0xd8,0x26,0xde,0x9e,0x46,0xda,0x5b,0x84,0x6d,0xfb,0x7b,0x34,0x39,0xf0,0x6f,0x02, - 0x7c,0x23,0x7c,0x07,0xb6,0x6e,0x0c,0xa2,0x1c,0x70,0x97,0x37,0x31,0x6c,0x56,0xb8,0x13,0xb3,0x64,0x46, - 0x86,0x4e,0xe0,0x37,0x11,0xbf,0x11,0x43,0x59,0x76,0xa5,0xa6,0x8c,0x33,0xd0,0xe6,0x98,0x71,0x2d,0xbe, - 0x4a,0xc2,0x99,0x7f,0x32,0x4e,0x33,0xa0,0x66,0xf8,0x5b,0xd9,0xa3,0xdd,0xee,0x3e,0xfa,0xa1,0xda,0xd1, - 0x14,0x4d,0x13,0xf0,0xfa,0xf2,0x92,0xe1,0xdc,0xc8,0x03,0x62,0xd0,0x41,0x0e,0x2b,0x96,0x06,0xd5,0xfb, - 0xfb,0x41,0xa7,0x6f,0x5d,0x6f,0x1e,0x37,0xf4,0x82,0xa5,0x71,0xe3,0x6c,0x8e,0xe9,0x47,0xaf,0xe4,0xf6, - 0xaa,0xbe,0x3b,0xe8,0x0c,0xac,0x6a,0x47,0xd0,0x8c,0x57,0x71,0x9e,0xa3,0xae,0xcc,0x2f,0x35,0x69,0x28, - 0x5d,0x49,0x64,0x41,0xfd,0x86,0x88,0x96,0xd5,0xc9,0xd6,0x58,0x1e,0xec,0x10,0xa6,0x3d,0x49,0xa5,0x9b, - 0x15,0xf9,0x2f,0xf0,0xfc,0xe7,0xed,0x78,0x8a,0xee,0x2a,0xb0,0x66,0x19,0xc9,0xbb,0x1d,0xe7,0x67,0xe1, - 0x65,0x44,0x4b,0x31,0xc2,0x34,0x6e,0x68,0xb2,0x20,0xb8,0xca,0xfb,0x7b,0x73,0xf1,0xa8,0x0b,0x2f,0xc0, - 0x16,0xb0,0xc8,0x8c,0x5a,0xff,0xc0,0x87,0xd2,0xee,0x47,0x69,0x45,0xea,0xfc,0x74,0x1a,0xa4,0xbc,0x9d, - 0xa4,0x08,0xf6,0xf8,0xd0,0xfd,0xbb,0x95,0x57,0xb7,0xe6,0x1c,0xa9,0x65,0x16,0x7d,0xa7,0x76,0x28,0xa7, - 0xf0,0x64,0x9f,0x87,0xa0,0xba,0x6f,0x4d,0xce,0xb7,0x3a,0x19,0xe5,0x49,0xb9,0xbf,0x8f,0x79,0x00,0x12, - 0xcc,0xbe,0xdc,0xd8,0xac,0xa7,0xd7,0x08,0x28,0x3c,0x35,0x5b,0x52,0x0d,0x63,0xe8,0xe2,0xbb,0x7a,0x7f, - 0x53,0x8d,0x65,0x02,0x93,0x7b,0x54,0xb3,0x1c,0x8f,0x87,0x76,0xfa,0x8e,0x2b,0xf4,0xcb,0x74,0x91,0xbe, - 0x85,0x58,0x9f,0xe9,0x34,0xbe,0x8c,0xa3,0xa9,0x5f,0xfe,0x54,0xdc,0x46,0xc2,0x8a,0xdf,0x8b,0xe5,0xf7, - 0x96,0xcb,0x12,0x32,0x13,0x97,0x2d,0xe5,0x2b,0x29,0xab,0x6d,0xa4,0x5a,0xa3,0x0c,0x83,0x5f,0xd0,0x81, - 0x49,0xf2,0xcf,0x75,0x3a,0xc3,0x78,0x26,0x74,0x9e,0x08,0x09,0x60,0x14,0xd8,0x30,0x29,0xfb,0x38,0xfd, - 0x5e,0xa3,0x2e,0x46,0x5a,0xcb,0x7c,0xa7,0xc1,0xef,0x9e,0xbd,0xd4,0xeb,0x5f,0x64,0xbf,0x89,0x50,0xd2, - 0xbc,0x76,0x88,0xf9,0xae,0xa5,0xda,0x84,0x38,0x22,0xa5,0x2b,0x91,0x17,0x4d,0x70,0xfa,0xa8,0x0e,0x5e, - 0x2a,0xa4,0xb8,0x8a,0x22,0x86,0x73,0x45,0x34,0x61,0xff,0x28,0xcc,0x38,0x4b,0x09,0x43,0x8e,0x0d,0xf8, - 0x64,0xda,0x54,0x15,0x02,0x51,0x13,0x28,0x4b,0xe5,0x94,0x23,0x25,0xc0,0x82,0xb5,0x34,0xd7,0x98,0x70, - 0xf7,0x46,0xab,0x42,0xae,0x74,0x96,0xc3,0x06,0x20,0x26,0xa6,0x87,0xbb,0x30,0xaf,0xbb,0x9c,0xc5,0x5c, - 0xc1,0xdd,0x6c,0x77,0xa4,0x92,0x65,0xac,0xb1,0xb1,0x2c,0xf9,0x05,0xf5,0x4a,0x8c,0x6e,0x60,0x31,0xe5, - 0x84,0x66,0x8d,0x40,0x95,0xfc,0xc7,0xef,0x10,0x52,0x4e,0x39,0xe4,0xd1,0x8a,0x08,0x4c,0x2d,0x29,0x93, - 0xb5,0xe9,0x5a,0x9f,0x19,0x96,0xd0,0x10,0xea,0x98,0xa3,0xea,0x14,0xd1,0xa4,0x6d,0x1b,0xdf,0x3a,0x6b, - 0x9b,0x50,0x46,0xb5,0x97,0xeb,0xef,0x42,0x13,0xfe,0xf2,0x9f,0xfe,0xdd,0x96,0x42,0xd2,0x94,0x79,0x8d, - 0x7d,0xe7,0x2f,0xff,0xf2,0xcf,0xfa,0x66,0xfa,0x51,0x61,0xb3,0xb9,0x76,0x2b,0xe1,0x55,0x6c,0x27,0x4d, - 0xf6,0x16,0xa5,0x0a,0x52,0x5e,0xbb,0x71,0x70,0x8e,0x20,0xba,0xe9,0xc7,0x91,0x0c,0x1c,0x4e,0xf0,0x42, - 0x06,0x60,0xf3,0x93,0x96,0xe3,0x7a,0x8e,0x8a,0x67,0xa7,0x61,0xaa,0x41,0x79,0xca,0x71,0x23,0xb0,0x83, - 0x6a,0x4c,0x76,0x29,0x4c,0x7a,0x58,0xef,0x96,0xf3,0x97,0xff,0xfd,0xbf,0x72,0xb0,0xf7,0xda,0xba,0x11, - 0x54,0x14,0xfb,0x56,0x1d,0x7c,0x46,0x26,0x9d,0x35,0xc6,0xbb,0x29,0xbd,0x42,0x58,0xcb,0x47,0xe2,0xc6, - 0xa3,0x98,0x11,0x47,0x09,0x7b,0xd4,0x82,0x8a,0x5c,0x36,0xa2,0xac,0x27,0x5a,0x1e,0xc9,0x6b,0x5f,0x5a, - 0xd1,0xe2,0x96,0x43,0xb2,0x02,0x70,0xf1,0x56,0x9d,0x5f,0xac,0x3a,0xed,0x98,0x21,0xc9,0x16,0xd3,0xf2, - 0x78,0xb2,0x39,0xda,0x76,0x3b,0x6a,0xcc,0xe0,0x8b,0x31,0xf5,0x96,0x91,0x63,0xac,0x93,0xfe,0x3e,0xb1, - 0x02,0x1f,0xc3,0xb2,0x7b,0x79,0x6c,0xe2,0x90,0x4b,0xa1,0xe3,0x2d,0x02,0x6d,0x55,0xcf,0x08,0xa5,0xd5, - 0x7a,0x8e,0x4b,0x04,0x6a,0x65,0xb8,0xf8,0x58,0x3c,0x59,0x03,0x17,0x1f,0x7b,0xf0,0xb8,0x41,0x2b,0x74, - 0x4e,0x5e,0x40,0x8c,0xfc,0xee,0x98,0x28,0xeb,0x26,0xe8,0x85,0xa4,0x30,0x58,0x16,0xaa,0x9c,0x84,0x58, - 0xa8,0x2d,0x37,0x6b,0xb0,0x3f,0x5a,0x83,0x3d,0x57,0xcc,0xb4,0x1a,0x69,0x35,0x0a,0x9f,0xd0,0x03,0xbc, - 0xbe,0x7a,0xa0,0xfb,0x4f,0xa0,0x55,0x4f,0xcd,0xc0,0x5d,0x8b,0x37,0xd6,0x28,0x2e,0xee,0xef,0x65,0x4d, - 0xa8,0xe3,0x6b,0xe7,0xd9,0x04,0x53,0x46,0x2c,0xd0,0xbf,0x4c,0xeb,0x38,0x1b,0x0b,0x85,0xd6,0x0d,0x3c, - 0x1a,0x86,0xd3,0x06,0x54,0x7e,0x38,0xb6,0x1c,0x51,0xec,0xec,0x6c,0x6f,0xab,0xe6,0x8a,0x2f,0xd8,0x4e, - 0x0c,0x24,0x7a,0x59,0x59,0x1e,0xb2,0xc4,0xc8,0x91,0xda,0x25,0xc7,0x78,0xab,0xb1,0x23,0xa6,0xfc,0xa2, - 0x80,0xcf,0xfb,0x4a,0xb7,0x4c,0xb4,0xda,0x2f,0x44,0x9a,0x3c,0x63,0xff,0xc9,0x85,0x75,0x00,0x9e,0x50, - 0x60,0x55,0x0c,0x5c,0x5f,0xe0,0x5a,0xce,0xfc,0xa3,0x11,0x46,0x64,0x99,0x7c,0x72,0xd9,0x0f,0xc9,0x08, - 0xc3,0xb4,0x50,0xc6,0xf7,0x50,0xe0,0x0d,0xb5,0xba,0x44,0x89,0x80,0x85,0x58,0x04,0x9a,0x36,0xc6,0x32, - 0x51,0x1e,0x3b,0xb6,0x53,0x73,0x0a,0x4a,0x25,0x16,0x2f,0xc5,0xad,0x1b,0x4b,0x84,0x5e,0xab,0x38,0xff, - 0xf4,0xa1,0xf3,0x18,0x4b,0x25,0xbd,0xee,0x94,0xa8,0xeb,0xde,0xa1,0x1a,0xad,0x23,0xc6,0xd1,0x75,0xf8, - 0x29,0x4e,0x33,0x38,0x11,0x28,0x3b,0x23,0x7a,0x8c,0xdb,0x28,0x73,0xe5,0x10,0x22,0x34,0xcd,0x85,0x30, - 0x8a,0x95,0xc8,0x62,0x26,0xcb,0x85,0xda,0x2f,0x2a,0xf5,0x91,0x65,0x20,0xea,0x71,0x76,0x64,0xab,0x58, - 0x2b,0x31,0x05,0x5b,0x49,0x05,0xe9,0x6d,0xce,0x99,0x61,0x6c,0x21,0xbc,0x88,0x6c,0x18,0xc7,0x22,0x38, - 0x45,0x82,0xfe,0x7d,0x74,0x2b,0x41,0x21,0x7c,0xfc,0x7d,0x82,0x98,0x46,0xc3,0x13,0x17,0xc6,0x65,0x54, - 0x89,0xcd,0x84,0x01,0xf6,0x2b,0x11,0xb9,0x70,0x06,0xe3,0x82,0xf8,0x8c,0xff,0x18,0x5d,0x14,0x89,0x8b, - 0xfc,0x91,0x97,0x8d,0x67,0xfa,0xcd,0x1c,0x8f,0x69,0xb1,0x0a,0x18,0x16,0xd6,0x04,0x69,0xe3,0x7c,0xec, - 0xc0,0x3b,0x17,0xe3,0xa6,0x39,0x3e,0xf8,0x16,0x86,0x9e,0x7c,0x40,0x3f,0xaf,0xc2,0x3b,0xb6,0xa0,0x51, - 0x14,0x90,0x47,0x2d,0xc1,0x8f,0x7a,0x20,0xb3,0x45,0xe9,0x6b,0x6f,0xf8,0x79,0x7d,0x34,0x76,0xac,0xa2, - 0xea,0x10,0xbb,0xb0,0xa1,0xe4,0x35,0xe7,0x20,0xaa,0x42,0xd9,0x45,0x0c,0xde,0x13,0xe5,0x68,0x70,0x80, - 0xe9,0x8b,0xe5,0xd2,0x84,0x7d,0x02,0xe7,0xfe,0x36,0x03,0xa2,0x94,0xfd,0x54,0x23,0x25,0x08,0x20,0x8b, - 0xaa,0x28,0xec,0x89,0x6b,0x22,0x17,0x5d,0x2b,0xe0,0x34,0x11,0x92,0xc3,0x43,0x8e,0xdf,0x94,0xe0,0x85, - 0x65,0x67,0x5f,0x0c,0x3f,0x53,0xf2,0x45,0x2a,0xe8,0xbc,0xa0,0x5e,0xa3,0x27,0x43,0xa2,0x82,0xda,0x95, - 0xd3,0xb9,0x3e,0xcb,0x63,0x55,0xc6,0x7b,0x40,0x9e,0x1d,0xea,0xc0,0xd3,0x55,0x68,0xbf,0x5b,0xe5,0xc9, - 0x61,0xd8,0xdf,0xda,0xd4,0xf0,0x6d,0x35,0x31,0x12,0x1b,0xb8,0x1a,0xb0,0x83,0xe0,0x1d,0xd6,0xb8,0x6c, - 0x77,0x35,0xc6,0x84,0xdc,0xfe,0x76,0xe8,0xea,0x86,0x18,0x52,0xb5,0x7f,0x0c,0x14,0xd8,0x24,0x83,0xe3, - 0x5c,0x72,0xcc,0xd0,0x35,0xf8,0x8f,0xea,0x49,0x4a,0x55,0x37,0xbd,0xc6,0xab,0x5a,0xbf,0xa4,0xce,0x36, - 0x20,0xc9,0x3b,0x3b,0x0b,0x8d,0x58,0x05,0xac,0xb1,0xbe,0x46,0x39,0x6e,0xb4,0x30,0x78,0x4b,0xc3,0xa7, - 0x35,0xe4,0x02,0xf2,0x41,0x2e,0x59,0x21,0xc8,0xe4,0x60,0x21,0x5c,0x87,0xab,0x11,0xae,0x79,0x31,0xac, - 0x02,0xdd,0x15,0x77,0xec,0x32,0xe8,0x33,0x26,0x82,0x92,0xca,0xef,0x1c,0xca,0x24,0x93,0x14,0xbb,0xef, - 0xd0,0xdf,0xa3,0xac,0xa5,0x10,0xe8,0x85,0xa8,0x48,0xf8,0x12,0xa6,0x86,0x7c,0x37,0x4a,0xe1,0x14,0x4e, - 0x1e,0x65,0x48,0xcf,0x9f,0x2c,0xf2,0x2f,0x0c,0x30,0x81,0xdf,0x46,0xcd,0x71,0xd0,0x57,0xc1,0x15,0x43, - 0x6e,0xb1,0xed,0xe2,0x0e,0x94,0xd0,0x8a,0x4f,0x8d,0xc4,0x31,0xa6,0x9d,0x5a,0xaa,0x44,0x1b,0x84,0x1a, - 0x68,0x41,0xc1,0x90,0x24,0xec,0xfd,0x7c,0x58,0xae,0x7c,0xd3,0x82,0x96,0xf3,0xbb,0x08,0xec,0xb3,0x42, - 0x1d,0x5d,0x78,0x62,0x64,0x78,0x62,0x64,0xe8,0x43,0x5f,0x90,0x76,0x1e,0x29,0xa0,0x5a,0x0d,0xd9,0x88, - 0x96,0x51,0x86,0x5a,0x1b,0xc7,0xcf,0x31,0x0d,0x0e,0xd6,0x82,0xdc,0xaf,0x64,0x99,0xc5,0x36,0x66,0xca, - 0x86,0xcd,0x9f,0xed,0xec,0x34,0xf1,0xa3,0xff,0xe9,0x9f,0xf4,0x1e,0xcc,0x22,0xf2,0xe5,0xf6,0xf8,0x08, - 0x02,0xd1,0xe2,0x21,0xed,0xa6,0xa2,0xdd,0xe5,0xd3,0xd5,0xf4,0xec,0x85,0xda,0xb1,0x6f,0x1e,0x40,0x4a, - 0xa1,0x19,0xe4,0x09,0x19,0xdd,0x36,0xed,0x59,0xeb,0xa1,0xda,0xb9,0xd1,0x17,0xda,0xb8,0x6f,0x1e,0x02, - 0xd7,0xf1,0xb5,0xf0,0x7d,0x8b,0x3a,0x7c,0x9f,0x6e,0xc1,0xd7,0x90,0xaa,0x27,0xab,0x3b,0xde,0x8c,0x35, - 0x5b,0xe2,0x16,0x91,0xf7,0x7c,0x40,0xe7,0x9e,0xac,0xc0,0x22,0x69,0x40,0xbe,0x6a,0x62,0xc6,0xc5,0x78, - 0x43,0x6f,0xb0,0xc6,0x71,0xb0,0x0a,0x32,0xcb,0x0a,0x4c,0xf8,0x62,0x79,0xf7,0x3f,0x7f,0xc0,0x94,0x47, - 0x9f,0x57,0x9c,0x9e,0xea,0x81,0x9e,0xea,0xcf,0xea,0xf4,0x7c,0xbe,0x01,0x01,0xbb,0x4c,0x42,0x47,0x3a, - 0x86,0xde,0x2d,0x93,0x6d,0x54,0x43,0x31,0x6c,0x0e,0x66,0x70,0x0a,0x3f,0x3b,0x8a,0x97,0xf3,0xfc,0x15, - 0xe4,0x56,0x77,0xec,0x6d,0x03,0xdc,0xd7,0x64,0x95,0xfa,0x80,0x24,0xf4,0x67,0x18,0xe0,0xf9,0x4a,0xcb, - 0xfb,0xdf,0x31,0xa8,0xe7,0xdb,0x0a,0x83,0x2b,0x65,0x1e,0x2c,0x6c,0xe5,0x94,0xfd,0xde,0x62,0xee,0xf7, - 0xb4,0x6f,0xd3,0xf9,0x0f,0xb7,0xed,0x8b,0x6f,0x7f,0x29,0xd5,0xf7,0x49,0xbb,0x08,0x6b,0xd6,0x2c,0xb8, - 0x55,0x31,0x68,0x69,0xfd,0x59,0x34,0xba,0x43,0x7a,0xeb,0xa3,0x73,0x82,0x08,0x31,0xd5,0x06,0x59,0xf1, - 0xab,0xba,0xfc,0x9f,0xe0,0xd3,0x6f,0x9b,0x44,0x9a,0x67,0x36,0x6a,0x95,0x01,0x41,0xd3,0xbe,0x47,0xe8, - 0x55,0x36,0x5c,0x91,0x57,0x13,0x1d,0x39,0x5e,0x29,0xf3,0x34,0xf0,0x60,0x37,0xe9,0x22,0x8f,0x70,0x96, - 0xfc,0x66,0x9c,0x59,0x18,0xb7,0x42,0xbc,0x46,0xf3,0x87,0x48,0x1e,0x75,0x46,0xc6,0x0a,0xd1,0x41,0x96, - 0x02,0x6f,0xe9,0x6c,0x99,0x15,0x00,0x5c,0x4e,0x5c,0x49,0x65,0x13,0x84,0x7b,0xb1,0x45,0xa6,0xf7,0x36, - 0xc3,0xfc,0xbd,0x3c,0xc5,0x51,0x10,0xd1,0x20,0xcd,0xdf,0xf1,0x4d,0xba,0x87,0x30,0x0f,0x38,0x60,0x0a, - 0xf8,0xa1,0x67,0x17,0xd2,0xa8,0x0c,0x23,0x59,0xa8,0x48,0x5f,0xa2,0x77,0xff,0x53,0x34,0x11,0x20,0xa0, - 0x06,0x56,0xf3,0x2c,0x30,0xee,0x79,0xf0,0x02,0xec,0x18,0xcb,0xb7,0xce,0x72,0xad,0xf3,0x4a,0x9e,0x81, - 0xa5,0x9a,0x50,0xaf,0x9b,0x15,0xf9,0xef,0xe3,0xe2,0x1a,0xe3,0x5e,0xf5,0x28,0x0c,0x3a,0xb0,0x3c,0x9f, - 0x69,0xec,0x2e,0x68,0x30,0xea,0xa7,0x9f,0x69,0xe7,0x89,0x67,0x68,0xad,0x29,0x79,0xfb,0xa1,0x97,0x17, - 0x35,0xd5,0xee,0x06,0x2c,0x4f,0xf1,0x93,0xee,0x4e,0xac,0x34,0x01,0x68,0xb6,0x1c,0xbe,0xad,0x98,0xfb, - 0x1d,0x72,0xff,0x71,0x5a,0x96,0xdd,0x35,0x6e,0x7f,0xde,0x3d,0x60,0xd3,0xbe,0x36,0xfb,0x7f,0x69,0x0d, - 0xe8,0x8e,0x63,0xc6,0xfd,0xb5,0xb5,0x9a,0x9f,0x9d,0xbf,0xba,0x18,0x96,0x80,0xb1,0xcd,0x70,0xf2,0xa4, - 0x14,0x64,0xe7,0xad,0x2d,0x64,0x68,0x7d,0x58,0x54,0x56,0x38,0x99,0xd0,0xe0,0x76,0xab,0x34,0x53,0x9e, - 0xa5,0x30,0x30,0x8e,0x90,0x2e,0xa3,0x6a,0x83,0xa4,0x3c,0xe5,0xe1,0x44,0xc5,0x0f,0xc6,0x7b,0xb2,0x39, - 0xd0,0xad,0x38,0x47,0xb6,0xdc,0x70,0x44,0xaa,0x21,0x87,0x20,0x98,0x60,0x41,0xc4,0x2b,0xda,0x55,0x6f, - 0x52,0xed,0xce,0x2e,0xf0,0x6d,0xdf,0xb9,0x8a,0xe7,0xf8,0x7d,0xe0,0x6c,0x6d,0x39,0xe2,0x43,0xb0,0xf7, - 0xe3,0x0f,0xf9,0xb7,0xee,0x34,0xba,0xbc,0x8f,0x2f,0xef,0xd1,0xb5,0xf5,0x1e,0x3d,0xf0,0xee,0xc9,0xad, - 0xf5,0x1e,0x18,0xb3,0xfb,0x69,0x7a,0x4f,0xeb,0xfa,0x1e,0x68,0xf1,0x3d,0xfb,0x9e,0x7a,0x3f,0x8c,0xdd, - 0xd1,0x76,0xfb,0xdb,0x1f,0xc6,0x88,0x18,0x33,0xf6,0xf6,0x0c,0xd1,0xf8,0x73,0x49,0xa5,0xa3,0x88,0x43, - 0xa3,0x41,0xbb,0x89,0x52,0x40,0x23,0x5b,0x5d,0x19,0x99,0x66,0xed,0xea,0x7a,0x69,0xe8,0x90,0x06,0x20, - 0x2c,0x44,0x88,0xfb,0x53,0x8e,0xbc,0x1f,0x5a,0x80,0xd7,0xbf,0xd6,0xbb,0x0d,0x4b,0x5d,0x04,0x7f,0x46, - 0x5c,0xf6,0xa0,0x46,0xb5,0xe0,0x59,0xd9,0xf1,0x86,0x33,0xd6,0x4b,0xc5,0x1a,0x19,0xdf,0x1b,0x57,0x43, - 0xc3,0x52,0x40,0xdf,0x30,0x39,0x9b,0xb1,0x27,0x1e,0xfa,0x56,0xd1,0x52,0xd0,0x72,0x4b,0x7a,0x58,0x3f, - 0x69,0x3e,0x46,0x5f,0x0c,0x28,0x36,0xee,0x6b,0x9d,0xb4,0x02,0xe3,0xce,0x9d,0x13,0x60,0x1e,0x6f,0xd1, - 0xf0,0xc3,0xb8,0x69,0x50,0x1a,0xce,0x19,0xba,0xf9,0x7e,0xae,0x6f,0x79,0x04,0x71,0x46,0x21,0xa4,0xbf, - 0x81,0xab,0x66,0x9a,0xe7,0xbe,0x6a,0x35,0x55,0x37,0xea,0xfa,0xea,0x93,0x30,0x49,0xde,0xaf,0xd4,0x85, - 0xb5,0x75,0x8b,0xe0,0x6d,0xfb,0xcf,0x8b,0x28,0xfb,0x72,0x46,0x5d,0x43,0xdb,0x53,0x3b,0x35,0x8e,0x0b, - 0xa4,0xb1,0x45,0xb2,0xa6,0xdc,0x60,0x5e,0x24,0x45,0xfa,0x3b,0xe0,0x6a,0xdc,0xbb,0xf1,0x2c,0x45,0x35, - 0x7d,0x82,0xe6,0x3b,0x4a,0x77,0x40,0xf6,0x2e,0xe7,0x14,0x31,0x98,0xed,0x0e,0xbd,0x0b,0xc7,0xa6,0x33, - 0x8a,0xcc,0xd7,0x3b,0x41,0x6a,0x8d,0xd7,0x4c,0x46,0x9d,0xd3,0x7c,0x12,0xce,0xa3,0x07,0xbf,0x66,0xb6, - 0x08,0x65,0x77,0x9a,0x14,0xd9,0xec,0x37,0xf8,0x6d,0xc6,0x83,0xfc,0x8d,0x1a,0xc4,0x70,0x86,0x43,0x28, - 0xe9,0xb4,0xcb,0x6e,0x70,0xaa,0x95,0x6f,0xa2,0x2c,0x4e,0x25,0x12,0x34,0x59,0x41,0x36,0x7d,0xf3,0xbd, - 0xbb,0xdd,0xf1,0x74,0x5d,0x7b,0x76,0x5d,0xbf,0xb0,0x2f,0x30,0xf0,0x33,0x87,0x6d,0x74,0x6d,0xea,0x86, - 0xbb,0x67,0xe5,0x3b,0x3b,0x3b,0xce,0x2e,0x0b,0x26,0xd8,0xdb,0xa6,0x49,0x1e,0xfe,0x8c,0x0d,0x51,0x3a, - 0x1c,0x58,0x46,0x94,0x21,0x1e,0x70,0x8b,0x68,0xc8,0x2f,0x8c,0xd0,0x69,0x4f,0x38,0x6e,0xc1,0xe0,0x71, - 0x3c,0xb2,0x24,0xf5,0x1f,0x5d,0x28,0xee,0xfd,0xe2,0x87,0x7c,0xb4,0x27,0x9c,0x5f,0x76,0x1d,0xcf,0xd7, - 0x4c,0x53,0xad,0x14,0x95,0xf8,0xc5,0x16,0x96,0xe1,0x35,0xf1,0xc0,0x25,0xd0,0xb0,0xf1,0xc8,0xf6,0x55, - 0xd9,0x78,0x84,0xd4,0x20,0xf7,0xc3,0x48,0x36,0xb7,0x20,0x27,0x75,0x75,0xb3,0xb0,0x5a,0xb4,0x05,0xe2, - 0x75,0x6f,0xb9,0x87,0x2a,0x06,0xbf,0x50,0x4d,0xfe,0x7d,0xab,0xf0,0xd1,0xff,0x53,0xed,0xfa,0xdf,0xcb, - 0x65,0x57,0x5a,0xbb,0xb6,0x77,0x87,0x26,0x8a,0x88,0x30,0xf8,0x60,0xa2,0x48,0xf8,0x81,0xd2,0xa7,0xa3, - 0x91,0xc7,0x02,0xc9,0xdb,0xa5,0x89,0x90,0xac,0x59,0x0c,0x9c,0xe6,0xb9,0xe3,0x5c,0xe0,0x41,0x32,0xdc, - 0xb0,0x00,0x75,0xe3,0xc9,0xff,0x20,0x6f,0xb9,0x1f,0x78,0x2e,0x63,0xe8,0x1e,0x1d,0x3e,0x98,0x40,0xc6, - 0x78,0xc7,0xae,0x26,0x4e,0x26,0x85,0x97,0x5b,0x78,0x77,0x65,0xf8,0x26,0xf4,0x19,0x07,0x29,0x3b,0xa7, - 0x03,0xcc,0x1b,0x6d,0x17,0x6a,0x73,0x51,0xbe,0x03,0xb9,0xbb,0x80,0x8d,0x90,0x7b,0x0b,0x56,0x36,0xfc, - 0x7b,0x86,0x4b,0xb9,0x50,0x0b,0x3b,0xe7,0x2b,0xf8,0x5c,0x99,0x43,0xc1,0x2c,0x0d,0xf5,0xae,0xbd,0x80, - 0x45,0xea,0xeb,0x36,0x34,0x62,0xcf,0x1b,0xaa,0xaa,0x1c,0x87,0x7f,0x13,0x6c,0x77,0x81,0xd8,0x4b,0x77, - 0xb3,0x32,0x36,0x94,0x7d,0x9e,0x35,0x4c,0x01,0x21,0xee,0xd6,0x26,0x54,0x9e,0x69,0xc8,0x6e,0xfc,0x66, - 0x67,0x07,0x16,0x11,0x08,0xec,0x53,0xad,0xa1,0xd1,0x53,0x0a,0x4c,0x32,0xe1,0x6b,0x06,0xda,0x1a,0x01, - 0x03,0xf0,0x03,0xd3,0xdf,0xf3,0xe2,0x42,0xd3,0x10,0x68,0x5f,0x23,0x8f,0x1d,0x84,0x4d,0xc7,0x8a,0xb0, - 0x59,0x0b,0xfd,0xa5,0xe6,0x25,0x2d,0xad,0x5a,0x38,0x00,0xde,0xf0,0x56,0x46,0x10,0x48,0x6d,0x31,0x4b, - 0xe7,0xef,0x49,0x57,0x89,0x9b,0x4b,0xba,0xdf,0x7d,0x92,0x1b,0x6d,0x95,0x77,0x20,0x0e,0x9f,0xa5,0xf6, - 0xf8,0x4e,0x50,0xc6,0xf0,0xc6,0x24,0xc7,0xd2,0xea,0xfa,0x11,0x6b,0x1c,0xa7,0x9f,0x95,0x97,0xd7,0x4b, - 0xf1,0x56,0x1d,0x2f,0xbf,0xab,0x4b,0x3f,0x97,0x85,0x4a,0x8f,0xf3,0x0f,0xeb,0x1e,0xfe,0xb1,0xc1,0x28, - 0x7b,0x59,0x30,0xe0,0x20,0x3c,0xfe,0xd3,0xfa,0xc7,0x7f,0x58,0xff,0xf8,0x97,0x2b,0x13,0x80,0x19,0x69, - 0x53,0xa9,0x76,0x6b,0xd2,0xa6,0x7a,0xb0,0x14,0x4e,0x0b,0x1e,0xff,0xfd,0xc3,0xea,0x42,0xe3,0x45,0x63, - 0x5d,0xf4,0x80,0xeb,0xa2,0xc5,0xfc,0x5b,0x14,0xff,0xa2,0x08,0xff,0x95,0xca,0x71,0x91,0x44,0x81,0xd6, - 0xde,0x85,0x11,0xc9,0x83,0xbf,0x55,0x82,0x41,0x84,0x40,0x4a,0x7c,0xcf,0xb6,0x99,0xe8,0x8d,0x4b,0x56, - 0x93,0x9a,0xbe,0x12,0x37,0xa0,0xad,0xb0,0xd4,0x99,0x4e,0x5b,0xad,0x9b,0x61,0x1a,0xd9,0x1a,0x02,0x91, - 0xb2,0xe6,0x57,0xaa,0xe0,0x02,0xe9,0xd0,0x10,0x4d,0x3e,0x52,0x6e,0x3b,0xcd,0x33,0x93,0x01,0x81,0xd7, - 0x2b,0x1d,0x4f,0x32,0x1f,0x53,0xf5,0xc3,0x2e,0xe3,0x94,0x0c,0x8d,0xbf,0x76,0x02,0xdb,0xe5,0x86,0x9c, - 0xc3,0x73,0xf8,0x46,0x42,0x0e,0x2f,0x43,0xc3,0x91,0x86,0x4c,0xd7,0x5d,0x1b,0xd5,0x85,0xe4,0xd1,0xe2, - 0x67,0x6a,0x19,0x15,0xfc,0x7d,0x58,0xf3,0xe8,0x28,0x58,0xb2,0x0b,0xbd,0xbb,0x2b,0x15,0x62,0xad,0x92, - 0xca,0xa8,0xe0,0x99,0x65,0x4c,0x76,0x8e,0x10,0x5d,0x3d,0xd0,0xf1,0x03,0x63,0x2e,0xf1,0x42,0xd4,0xfc, - 0xbd,0xa8,0x48,0xdd,0x6d,0xe6,0x4a,0xbe,0x40,0x9f,0x4a,0x80,0x34,0xde,0xa8,0x29,0xb8,0xb2,0xd3,0xd0, - 0xdc,0xa9,0x30,0x5f,0xbf,0x10,0xd2,0x69,0xcb,0xcf,0x57,0x39,0x6e,0x84,0xda,0x71,0x23,0x94,0x8e,0x1b, - 0x02,0xdd,0x7a,0xe0,0x0d,0x79,0x69,0x3d,0x41,0xdf,0xa0,0xb7,0x51,0x38,0xfd,0x42,0x9e,0x41,0x4f,0x39, - 0xab,0xa9,0xa3,0xbd,0x9a,0xe0,0x04,0x90,0xf3,0x51,0x6e,0x0e,0xd7,0xc7,0x6e,0x46,0xc5,0x06,0x37,0x23, - 0x04,0x59,0x5a,0x4a,0xf8,0x55,0x56,0xa5,0xb6,0x31,0x24,0xfa,0x3c,0x47,0xc0,0x3f,0x17,0xc1,0xbf,0x9a, - 0xa6,0x1c,0x31,0x97,0xec,0x85,0xd7,0x5d,0xbd,0xf0,0x1c,0x69,0xe3,0x41,0xcb,0x9f,0x25,0xa6,0x67,0x72, - 0x51,0x5f,0xea,0xe4,0x3c,0x0b,0xb1,0xbd,0xa8,0xe6,0x31,0xbf,0xe2,0xf8,0x78,0x89,0x08,0x57,0x77,0xeb, - 0x21,0x8b,0x24,0xcd,0x8e,0xa9,0x27,0x16,0xdb,0xb1,0xaa,0x87,0x1e,0x34,0xd9,0xd5,0xcb,0xd4,0xc6,0x80, - 0xd4,0x9a,0x51,0xc6,0x73,0x61,0x44,0x83,0x47,0xce,0x15,0x6a,0x36,0x71,0x1c,0x5f,0xa6,0x93,0x10,0x48, - 0x82,0x7a,0x8c,0x0a,0xa7,0xc5,0xfb,0xe4,0x63,0xc2,0x49,0x40,0x40,0x66,0x87,0x27,0x72,0x1d,0x94,0x3b, - 0x94,0x07,0xa6,0xa2,0x9a,0x61,0x95,0x1b,0x6b,0x01,0xf0,0x6a,0xd0,0xc6,0x06,0x97,0xba,0xcb,0x59,0x7a, - 0x4b,0x30,0x3f,0xf2,0x3b,0xb8,0xaa,0xe1,0x94,0x82,0xd1,0xf2,0x9d,0x0f,0xe3,0x59,0x98,0x7c,0x44,0x4f, - 0xba,0x19,0x5a,0xdb,0x11,0xb2,0x25,0xca,0x54,0xf7,0xde,0x4a,0x87,0x2e,0x6d,0xe8,0x57,0x15,0x68,0xb7, - 0x2f,0x4f,0xe8,0x55,0xa7,0x71,0x8d,0x74,0x3f,0x4c,0x79,0x72,0xec,0xda,0xd9,0x29,0xb5,0x78,0x5e,0x19, - 0x52,0xa5,0x39,0xab,0x38,0x2a,0xef,0x62,0xcc,0x16,0xe9,0x70,0x4a,0x95,0x21,0xd6,0xd9,0x86,0x0a,0x65, - 0x27,0x5e,0xc9,0x31,0xa4,0x84,0x5c,0x4a,0xc7,0xcf,0xab,0x44,0x3a,0x08,0x35,0x92,0x78,0x0d,0xcb,0x7c, - 0x5d,0xb2,0x10,0xde,0x5d,0x9b,0x04,0x81,0xbc,0x4f,0x54,0xf5,0xb4,0xeb,0x10,0x1d,0x2a,0xbb,0x21,0x4d, - 0xa1,0x38,0xbf,0xa3,0xe3,0xc0,0x97,0x05,0x9f,0xa6,0x73,0xde,0x9a,0xec,0x95,0x86,0x79,0x23,0xb3,0xd8, - 0x07,0x32,0x7c,0x99,0x50,0xcd,0x65,0x7a,0xca,0x49,0xe3,0xcb,0xa4,0x1c,0x7e,0x2f,0x46,0xda,0x98,0x63, - 0xdd,0xdd,0x86,0xa1,0x88,0x23,0xb7,0x9c,0x9b,0xc4,0xd6,0x5f,0x2e,0x12,0x6d,0x0b,0xe8,0x9a,0x41,0x50, - 0x26,0x86,0x54,0xd9,0xb2,0x86,0xd7,0x78,0x2c,0x7c,0x74,0x6b,0x38,0x5b,0xb3,0x46,0x8a,0x0c,0xa2,0x5c, - 0x48,0x4e,0xe6,0x04,0x0b,0x45,0x0d,0x99,0x8d,0xa4,0x6f,0x0f,0x77,0x72,0x85,0x33,0xdf,0x73,0x18,0xa3, - 0x5b,0x90,0x2e,0xb5,0xdb,0x1c,0xd3,0xfd,0xc9,0xcf,0xb5,0x2e,0xd1,0xb7,0x27,0xe4,0xde,0xa6,0xa8,0xeb, - 0x03,0xdd,0xf5,0xa6,0xf2,0x8b,0x2b,0x3c,0x07,0x27,0x22,0xd6,0x9b,0x13,0xbf,0x31,0xd5,0x3b,0x12,0xd8, - 0xe4,0x87,0x7e,0x63,0x1e,0xe4,0xa3,0x53,0xd7,0xe8,0x2b,0x7b,0x7d,0xd8,0x4e,0xe8,0xc9,0x85,0x72,0x54, - 0x15,0x12,0xd1,0x56,0xcc,0x4f,0xdb,0xec,0xec,0xe7,0x79,0xf2,0x8c,0x99,0x8e,0x5f,0xb0,0xda,0xdd,0x8d, - 0xd4,0xc0,0xd1,0xf4,0x5c,0x6f,0x1a,0xb8,0xdd,0x05,0xf5,0xa7,0x79,0xfc,0xe6,0x0f,0xb6,0xce,0xd5,0xdc, - 0x8a,0xa5,0x8d,0xae,0x0a,0x73,0x15,0x7d,0x9e,0x13,0xe5,0xff,0x20,0x9d,0x15,0x73,0x56,0xce,0x4e,0x84, - 0xbc,0x56,0x1d,0x43,0x90,0x2a,0xb2,0x3a,0x8f,0x24,0x32,0x7f,0x75,0x40,0xaf,0xf9,0xbe,0xb2,0x42,0xc0, - 0xd6,0x73,0x2d,0x6b,0x17,0x7a,0xbd,0xea,0x45,0xbe,0x78,0xc6,0x99,0x48,0x44,0x7e,0x7f,0x6f,0xed,0x12, - 0x10,0x46,0x94,0x77,0x06,0xc5,0xaf,0x86,0xfa,0x22,0x1d,0xb9,0xe8,0xf9,0xa1,0xda,0x22,0x38,0x05,0x05, - 0x1a,0xd8,0x3c,0xdf,0x2d,0xdb,0xe2,0x74,0x19,0x34,0xc6,0x71,0x76,0x08,0x34,0xcc,0xaf,0x35,0x97,0x08, - 0xe5,0xea,0x8b,0x2e,0xcb,0x3c,0x66,0x46,0x2d,0x30,0x3a,0x9f,0xf0,0xe9,0x08,0x0b,0xee,0x44,0x46,0x79, - 0x5c,0xf8,0x92,0xbb,0x5f,0x5e,0xc6,0x09,0xcc,0xf1,0x97,0x3b,0xf2,0x0f,0xe4,0x89,0x25,0x93,0xdf,0x47, - 0x54,0x7f,0xa3,0x1d,0x10,0x08,0xc3,0x52,0x68,0xea,0xe2,0xc8,0xc4,0x58,0x9e,0xa2,0x24,0x77,0xcb,0xe5, - 0x05,0x2a,0xca,0x0b,0x18,0x58,0x18,0x18,0x32,0x8e,0xfa,0xcd,0x34,0xc8,0x1b,0x6a,0x12,0x9a,0x2a,0x55, - 0x4b,0x1a,0x95,0xa9,0xa2,0x22,0x7f,0x79,0xa4,0x4e,0x3d,0x3e,0xaa,0x6b,0xbc,0x27,0x36,0xf2,0xee,0x41, - 0x08,0x7d,0x9c,0xfb,0x40,0x14,0x41,0x09,0xa2,0xbf,0x8d,0x29,0x37,0x66,0x11,0xae,0x4c,0xd8,0x8b,0x0a, - 0x21,0x12,0x78,0x0a,0xb7,0x31,0x3d,0x82,0xd7,0x90,0xfc,0xc0,0xca,0x53,0x00,0x27,0x6d,0x53,0xf2,0x02, - 0xe9,0x09,0xe3,0x6e,0x4a,0x00,0x22,0xf8,0x65,0xbf,0xa1,0x12,0xb4,0x45,0xff,0xd6,0xa4,0x53,0xe2,0x00, - 0x7b,0x2e,0x26,0x33,0x0f,0x14,0x1e,0x32,0xfa,0x49,0x49,0x51,0x53,0x29,0x60,0xd6,0x8e,0x91,0x0b,0x96, - 0x13,0x86,0x4e,0xd6,0x40,0xfc,0x3c,0x9b,0x76,0x66,0x76,0x1c,0x62,0x5b,0x6a,0x88,0x82,0xdf,0x2a,0x9f, - 0xb5,0x48,0xc7,0x72,0xff,0xb1,0xc4,0x5e,0x45,0x23,0x8d,0x4f,0x8a,0xb6,0x96,0x3f,0x95,0x1e,0xaa,0xb7, - 0x55,0x19,0x75,0x4d,0x45,0xff,0x50,0xae,0x27,0xaa,0x94,0xd5,0x37,0xc8,0xbc,0xa1,0x04,0x8d,0xd3,0xc8, - 0xc8,0x28,0xcd,0x31,0xbc,0xb4,0xe7,0x7f,0xd7,0x64,0x51,0xd2,0xad,0xf9,0x2d,0xcd,0xd3,0x35,0xa6,0x68, - 0xab,0xfb,0xf4,0x48,0x8f,0x1e,0xa6,0x05,0x49,0x4a,0x82,0xa5,0x87,0xdc,0xe7,0x3f,0x34,0xe6,0xf5,0xd0, - 0xcd,0x8e,0xa2,0x87,0xd5,0x0a,0x33,0x95,0x30,0x31,0x41,0x8e,0xd6,0x08,0x2c,0xd0,0xb3,0xaa,0x46,0xf5, - 0x12,0x24,0xc1,0xe8,0x86,0x14,0xab,0xf7,0xf7,0x2b,0x9f,0xc3,0xe1,0x48,0x7c,0xa1,0xf2,0x59,0xa2,0x78, - 0x88,0xa9,0x74,0x90,0x32,0xde,0xeb,0x91,0xf4,0x6a,0xb0,0x0f,0xfc,0x6d,0xfb,0x5c,0x47,0x50,0x64,0x54, - 0xbd,0x4c,0x23,0x1d,0x46,0xa5,0x87,0xbd,0x6a,0xd7,0x54,0xa3,0x83,0xfd,0x80,0x97,0x02,0xa6,0x50,0x49, - 0xcb,0xf1,0xb5,0xb5,0xdf,0xe6,0x0a,0x2c,0x6e,0x45,0xf9,0xcb,0x18,0xf6,0xc4,0x98,0x98,0x79,0x2f,0xbf, - 0xc0,0x54,0xce,0x11,0x19,0xe3,0xcc,0x5b,0x3a,0x7d,0x36,0xbe,0x11,0x6d,0xa6,0x4f,0xba,0xdf,0x1c,0x7c, - 0x88,0x24,0x19,0xd9,0xe3,0x04,0xfe,0x93,0xee,0x64,0x55,0x8e,0xc8,0x26,0x2e,0x7f,0x95,0xa0,0xe8,0x95, - 0x7d,0x9d,0xf4,0x10,0xe2,0xc6,0x03,0xe2,0x3b,0x2d,0xe7,0x7d,0x43,0x0f,0x35,0x82,0x5e,0xc7,0x1c,0x3f, - 0x16,0x85,0x90,0xde,0x18,0xda,0x29,0x6d,0x83,0x2b,0x40,0x25,0xae,0x29,0x2a,0x25,0x8e,0x52,0x1f,0x2b, - 0xa2,0x26,0x88,0x00,0xb9,0x8a,0x5a,0x6e,0x82,0x29,0x3f,0x13,0x76,0xe2,0x75,0x55,0x52,0x25,0x67,0x8b, - 0x42,0x7e,0x1d,0xf4,0x7e,0x4f,0x91,0x62,0x29,0xca,0x5d,0x00,0x77,0x86,0xca,0x2f,0xdf,0xe9,0x28,0xd4, - 0x82,0x89,0x14,0x58,0x7c,0xa8,0x89,0x30,0x14,0xd8,0xd1,0x99,0xf5,0x19,0xba,0xc2,0xd3,0xb7,0x6f,0x7d, - 0xf6,0x51,0xae,0x1c,0xbf,0x0e,0xa9,0x87,0xc9,0x25,0x42,0x5a,0xe4,0xc9,0x23,0xdf,0x5b,0x95,0x5b,0xca, - 0xf8,0x1b,0xae,0x37,0xd7,0x2f,0x22,0x23,0xbd,0xc7,0xeb,0x54,0x9a,0x08,0xcd,0x8e,0x2b,0xa4,0x68,0xb3, - 0x00,0x83,0x3c,0x1f,0x1c,0xf1,0x46,0xc1,0x5b,0x48,0xed,0xfc,0x96,0xbe,0x18,0x35,0x69,0x23,0xad,0x0f, - 0xfa,0x96,0x7d,0x45,0x29,0x34,0x77,0x76,0xb4,0xb9,0x66,0x5b,0xd7,0xd9,0x54,0x8f,0xc5,0xae,0x5b,0x20, - 0x21,0x88,0x24,0x5d,0x25,0x06,0x27,0xc0,0xb5,0x19,0x7a,0x70,0x41,0x71,0x84,0x26,0xa1,0xc0,0x30,0xa4, - 0xf4,0xa2,0xe7,0x6e,0xd8,0x2a,0x5a,0x2a,0xe0,0xdb,0xfb,0x95,0xfa,0x75,0x61,0xdc,0x1d,0x63,0x51,0xb6, - 0x07,0x15,0xd2,0x1e,0x84,0x76,0x20,0xe3,0x9c,0x90,0xaf,0x48,0x60,0xcf,0xce,0x41,0x0d,0xfa,0x2a,0xf5, - 0x40,0xcd,0xeb,0x9c,0xf9,0xab,0x7c,0xfd,0xbc,0x59,0xdd,0xe7,0xc0,0x3c,0x9c,0x1b,0xbd,0xaf,0xf0,0x9c, - 0xea,0x48,0xc0,0x7a,0x7d,0x60,0xe5,0xa5,0xb0,0x0e,0xbd,0xc0,0xe1,0xfb,0x30,0xbb,0x56,0x58,0x09,0x51, - 0x33,0x75,0x3e,0x6f,0x8c,0x26,0x59,0xa2,0x4d,0xb0,0x4a,0xfc,0x4b,0x2b,0x94,0x12,0x15,0xc8,0x51,0x14, - 0xb9,0xd4,0xcc,0xd2,0xcf,0xd5,0x29,0x8d,0xc9,0xf6,0x50,0xa4,0xf3,0x37,0x59,0x3a,0x0f,0xaf,0x42,0xe6, - 0xd3,0x8c,0xfc,0xc4,0x09,0x24,0x61,0x61,0xc4,0x28,0x36,0x4d,0x48,0x67,0x51,0xe5,0x89,0x52,0xd6,0x5c, - 0xc4,0x55,0x5a,0x93,0xd7,0xbd,0x07,0x81,0x63,0x49,0x4c,0x9e,0x49,0x49,0xf2,0x33,0x7e,0x48,0x5f,0x58, - 0xef,0x5f,0x98,0x3c,0xc0,0xbf,0x10,0xdb,0x48,0x29,0x31,0x48,0xa5,0x87,0x19,0x2e,0xb5,0x53,0x30,0x85, - 0x86,0x35,0xd5,0x30,0x21,0x8b,0x96,0xf5,0x7e,0x85,0x08,0xc7,0x7f,0x9d,0xb6,0x6e,0xf8,0x73,0x5e,0x4e, - 0xfe,0x0a,0x87,0xc2,0x78,0xa9,0x12,0x28,0xfd,0xfc,0xfc,0x9a,0x26,0x1f,0x28,0x9a,0x09,0xe0,0x20,0xd7, - 0xce,0xe0,0x89,0x58,0xc0,0x2d,0xe9,0x82,0x99,0x10,0xcf,0x6e,0x39,0x8f,0x29,0xdf,0x3c,0x9d,0xc3,0x69, - 0xb6,0xe9,0xdc,0xa0,0x21,0x5f,0x2e,0xf3,0x4d,0x46,0xe8,0x8a,0x89,0x6b,0xe4,0x36,0x58,0x97,0x52,0x34, - 0xc1,0x54,0x4d,0xb0,0x94,0x5d,0xaf,0x56,0x14,0xc1,0xe4,0x97,0xcd,0x9b,0x83,0x8d,0x09,0x29,0x7a,0x5e, - 0x8b,0xd8,0xda,0x0d,0x61,0x76,0x83,0x0a,0x13,0xb7,0x49,0xa3,0x32,0x45,0x91,0x38,0xb3,0xf3,0x50,0x13, - 0x3f,0x50,0x25,0x42,0x74,0x57,0x51,0xa0,0x22,0xa3,0x75,0x67,0xa7,0x46,0xc5,0x5d,0x72,0xed,0xfd,0x2b, - 0x25,0x48,0xad,0x4f,0x2a,0x9e,0x8c,0x27,0x2e,0xf0,0xc1,0xce,0x57,0x4c,0x18,0x1a,0xe7,0x9a,0xe2,0xce, - 0x2e,0x11,0x03,0x08,0xd3,0x1b,0x0e,0xd3,0x9f,0x4b,0x71,0x66,0x52,0xc5,0xa9,0x54,0xd7,0x32,0x8c,0x59, - 0x29,0xe0,0xa0,0xf9,0x33,0xad,0x84,0x8c,0x6d,0xcd,0x58,0xb9,0x25,0x63,0xcc,0xc0,0x68,0x3b,0x5c,0xca, - 0xf7,0x29,0x27,0xf8,0x3f,0xfe,0x2f,0x0e,0x9f,0xc1,0x4a,0x28,0x14,0xb1,0x14,0x0b,0x6f,0x1a,0x30,0x9b, - 0xf2,0x6b,0x69,0xd5,0xb1,0xe0,0x7d,0x4a,0x79,0x4c,0x6c,0xe6,0x4d,0x35,0x97,0xc3,0x3e,0x69,0xb0,0x91, - 0xe0,0x8f,0xaa,0x98,0xe9,0xca,0x01,0x8f,0x93,0x6d,0x07,0x91,0x0e,0xf8,0x80,0x4e,0xa8,0x14,0xf5,0xaa, - 0xd0,0xd2,0x8a,0x59,0x6f,0x68,0x1d,0x26,0xdf,0xd4,0xcc,0x0d,0x61,0x43,0xb6,0x9c,0x36,0x2a,0x32,0x61, - 0xe1,0xb7,0x9c,0xad,0x60,0x8b,0x92,0x23,0x6d,0x61,0xe8,0x0f,0x37,0xa6,0xe5,0x08,0x64,0x7c,0x90,0x23, - 0x83,0xf9,0x7c,0x95,0x0b,0x37,0x79,0xd4,0x8d,0xfa,0x23,0xcb,0xc5,0x09,0x03,0xc3,0x6f,0x72,0x60,0x9c, - 0x1e,0x1d,0x44,0x03,0x7e,0xc0,0x30,0x9c,0xc9,0x1e,0xa6,0xb3,0x69,0x39,0xf4,0xac,0x7f,0x10,0xed,0x97, - 0x1f,0x42,0x69,0x7c,0xd3,0xf1,0x4b,0x77,0xb1,0x1c,0xdc,0xbe,0x46,0x15,0xab,0x87,0x53,0xd0,0x90,0x7f, - 0xf3,0xfa,0xa3,0x8a,0x5f,0x90,0xe1,0x5c,0xb2,0x2f,0xb0,0x81,0x54,0x67,0xbc,0xc6,0xf7,0x3e,0x11,0x0f, - 0x47,0x1d,0x79,0xdc,0x87,0xf6,0x38,0x5b,0xa8,0x3d,0x8a,0x54,0xf2,0x59,0x58,0x58,0x94,0x16,0xac,0x1a, - 0x46,0x7b,0x29,0xd5,0xed,0xdb,0xb7,0x51,0xa3,0xe1,0x29,0x65,0xe6,0xc0,0x3e,0xd1,0xd6,0x09,0xfb,0x2a, - 0x94,0x5b,0x82,0x19,0xa2,0x40,0xdf,0x9c,0xee,0xf0,0x26,0x6a,0xce,0x8d,0x29,0xc5,0x37,0x4e,0x92,0x79, - 0xb5,0x51,0x26,0xbc,0xd6,0xc2,0x9b,0x4a,0xd5,0x11,0x35,0xb1,0xd4,0x78,0x64,0x38,0x9b,0x39,0xe6,0xe8, - 0x33,0x0c,0xea,0x94,0xf4,0xbb,0x92,0xd5,0xd0,0x39,0xed,0x0c,0x5b,0x95,0x5f,0x93,0xc6,0xd9,0x93,0x0d, - 0xc0,0x7e,0x7e,0x17,0xb1,0x23,0x75,0x53,0x9a,0xd4,0xe8,0x93,0xf6,0xf0,0xa5,0x0b,0xb4,0x03,0xdc,0x36, - 0x6e,0x2f,0x8e,0xf5,0x84,0x93,0x0b,0x78,0xa0,0xc8,0xda,0x65,0x8c,0xb6,0x52,0x9a,0x1f,0x15,0x4c,0x45, - 0xb3,0x83,0xbe,0xe2,0xe3,0xa8,0x29,0x4c,0x4d,0xf7,0x47,0x44,0x4a,0x04,0x90,0x1d,0xe3,0x93,0x9d,0x74, - 0x30,0x98,0x8f,0x08,0x96,0x4d,0x9b,0x6d,0x08,0x9c,0x0f,0x0d,0xa3,0x2a,0xbb,0x0e,0x8e,0x8c,0xe5,0xe9, - 0x0b,0x94,0xe6,0xb2,0xae,0xae,0x80,0x2f,0xaf,0x65,0x1b,0xa1,0xf5,0x1b,0xd6,0x16,0xb5,0xfe,0x61,0x47, - 0xde,0xb6,0x3e,0xc8,0x80,0xe9,0xdf,0xd6,0xfe,0x39,0x4d,0xa7,0xda,0x38,0xd2,0x41,0x35,0x4b,0xee,0x2d, - 0xf4,0x08,0xc9,0xe6,0xaa,0x3e,0xef,0xec,0x60,0x53,0x3b,0xb6,0x6f,0xf3,0xdf,0xaf,0xef,0xda,0x3b,0x2c, - 0xee,0x89,0x5f,0x6e,0x2c,0xd5,0xd5,0x64,0xfd,0x4b,0x14,0x3c,0x6c,0x91,0x88,0x8f,0x7f,0xcd,0x42,0x2e, - 0x39,0xd1,0xe3,0x86,0x44,0xe7,0x1d,0xaf,0x9e,0xa1,0xd1,0x7e,0x2a,0xfe,0xe8,0x89,0x2f,0xb0,0x94,0xce, - 0x1a,0x3f,0x8c,0x8b,0x53,0x7d,0x18,0x13,0xbf,0xce,0x1f,0xf2,0xa9,0x4a,0x1d,0x57,0xd9,0x5c,0xab,0x72, - 0xcc,0x67,0xff,0x24,0x7e,0xe9,0x89,0xdf,0x79,0xe2,0x64,0xe5,0x77,0x31,0x9b,0x5e,0xbe,0xe1,0xe3,0xac, - 0x71,0xcb,0xd7,0x7c,0xd9,0x1c,0x82,0xb2,0xac,0x4a,0x6d,0xad,0x5f,0x15,0x7f,0x10,0x7f,0xef,0x89,0x7f, - 0xf0,0xc4,0x69,0x53,0x53,0x40,0xb4,0x00,0xc9,0x05,0x69,0xc2,0xc7,0x48,0xa4,0x11,0x8c,0x13,0x34,0x19, - 0xb6,0xb2,0xb5,0x53,0xdf,0xd1,0x4e,0x45,0xe7,0x61,0x42,0xad,0x7b,0x15,0x4d,0xe3,0xd0,0x75,0x5c,0x38, - 0x4b,0x76,0x09,0x15,0xc7,0x3f,0xec,0x75,0xe6,0x9f,0x3d,0x72,0x73,0x84,0xe7,0x68,0x26,0x3b,0x57,0xd5, - 0x5c,0x58,0x3c,0xfa,0x26,0x9d,0x9a,0xb7,0xb3,0xf3,0x51,0x6b,0x98,0xc4,0xe9,0x5a,0xca,0xf0,0x71,0x03, - 0x65,0xd0,0xfa,0x42,0x6f,0xb9,0xa9,0xa8,0xa6,0x1d,0x32,0x04,0x8f,0x1d,0x16,0xa0,0xd3,0xdb,0xa7,0x6b, - 0x37,0xb8,0xf8,0x6c,0x4a,0x76,0xbd,0xe1,0xc7,0x35,0x14,0xe3,0x25,0xb7,0xf8,0x6f,0x4e,0x0d,0x5e,0x46, - 0xcc,0xe4,0x4e,0x15,0xb3,0x13,0x8a,0x49,0x03,0xb9,0xbe,0x92,0x19,0xbc,0xeb,0xd4,0x39,0x9a,0xc0,0xc4, - 0x7f,0x16,0xcf,0xc5,0x13,0xf1,0xc6,0x13,0x4f,0x75,0x58,0x5a,0xd4,0x14,0x87,0x28,0xcd,0x98,0x53,0x71, - 0x29,0x92,0x36,0x82,0x74,0x89,0x86,0x42,0xe3,0x30,0x63,0x2e,0xb1,0xa1,0x1d,0x88,0x6f,0xad,0xb7,0x0a, - 0x5d,0x60,0x78,0xb8,0x87,0x39,0xc2,0x5e,0x94,0x35,0xf6,0xd6,0x4e,0x4e,0x2f,0x2f,0x7f,0x9d,0xa2,0x20, - 0xff,0x62,0x03,0x49,0xbe,0xab,0xa6,0xbb,0xe6,0x04,0x41,0x8e,0xd6,0x28,0xbc,0x69,0xe8,0xd5,0x38,0x4c, - 0xd0,0x5a,0xbc,0x22,0x84,0xc5,0xf9,0xcb,0x3f,0xfd,0xf7,0x2d,0x67,0xe5,0x88,0x9a,0x16,0xbe,0xc3,0x4d, - 0x88,0xbd,0x79,0x01,0x33,0xfd,0xa4,0x71,0xf4,0xa0,0xda,0x74,0x51,0xa8,0xfc,0xad,0xa7,0x91,0x78,0x0a, - 0x7b,0xcc,0x4e,0x88,0xdc,0x46,0x43,0x8b,0x4a,0xc5,0xed,0xbe,0x89,0xaa,0x41,0x15,0x0e,0x54,0x6c,0xad, - 0x47,0x18,0x0b,0x17,0xd1,0x3c,0x91,0xd8,0xdc,0xba,0x3c,0x60,0x11,0xad,0x06,0x9d,0xd6,0xf6,0x4d,0x64, - 0x5d,0x3c,0x41,0x59,0x47,0x90,0x8a,0x81,0xe1,0x98,0x54,0x74,0x0b,0xc5,0xb5,0x53,0xf8,0x31,0xca,0xd5, - 0xe8,0x97,0x55,0x8f,0x8c,0x31,0x6d,0x1b,0x07,0x91,0xa0,0xe0,0x98,0xf2,0x81,0x29,0x4c,0x02,0x8e,0x52, - 0xbc,0xbc,0xbc,0x37,0xac,0xe6,0xe7,0xf8,0x79,0x92,0x36,0x37,0xc3,0x55,0xaa,0x53,0xfc,0xf4,0x89,0x72, - 0x03,0x29,0x74,0x2a,0x76,0x52,0x6a,0xf2,0x4d,0x12,0x3d,0x37,0xe4,0x04,0x5e,0x12,0x44,0xec,0x73,0x1c, - 0xf4,0x45,0xf0,0x1c,0x18,0x53,0x19,0x61,0x2d,0x8d,0x28,0x4a,0x2c,0x7e,0x2e,0xab,0x4c,0xcc,0x75,0x9e, - 0x4d,0x48,0x3a,0x1e,0x92,0x6d,0xab,0xce,0x45,0x88,0x39,0xe6,0x4a,0xcb,0xdc,0xcb,0x48,0xf4,0x4d,0x9a, - 0xc8,0xef,0x4f,0xcf,0xde,0x9d,0x3e,0x0b,0xce,0x35,0x9e,0x9e,0xca,0xc7,0xf0,0x04,0xb6,0xce,0x85,0x85, - 0xe0,0x1b,0x65,0x57,0xd1,0x33,0x9e,0x7d,0xcc,0x5c,0x53,0x56,0xd0,0x61,0xf6,0xac,0x48,0x50,0xf6,0x05, - 0x7f,0x7b,0xbb,0xe0,0x3c,0x0c,0x42,0x66,0xc7,0xf0,0x8b,0xb6,0xfc,0x45,0x99,0xba,0xe4,0xef,0x33,0xcc, - 0x61,0x61,0xf3,0xee,0xdd,0x4e,0xe7,0x5b,0xd7,0xd5,0x65,0xcf,0x24,0x6a,0xf7,0xfd,0x3d,0xb4,0xbd,0xcd, - 0x19,0x2f,0x46,0x38,0x40,0x55,0x0b,0x2f,0xf7,0xc0,0x4a,0xea,0x44,0xbe,0xbf,0xf0,0x80,0x33,0x63,0xb6, - 0x61,0xca,0x30,0x85,0x8f,0x9b,0x9c,0x47,0x17,0x54,0x99,0x07,0xbf,0x48,0x6c,0x29,0x2e,0x82,0x50,0x65, - 0xfc,0xc2,0xa7,0x4b,0xbb,0xe6,0x38,0xd9,0xfa,0xfe,0xfd,0xcb,0x97,0x27,0x4f,0x5e,0x9e,0x7a,0x74,0x85, - 0xea,0x6a,0x92,0xa0,0xb0,0x28,0x46,0x2a,0xc0,0x9f,0x40,0x15,0x81,0xdf,0x26,0x01,0x5e,0x95,0xff,0xc7, - 0xe0,0x36,0x39,0x74,0x78,0x76,0x51,0x44,0x38,0x83,0x37,0x81,0x4c,0x70,0x86,0xc8,0xf5,0x09,0xe3,0xcd, - 0xe5,0xda,0x39,0x12,0x6e,0x87,0x8b,0xa9,0x59,0xbc,0xee,0x46,0x77,0x01,0xce,0x50,0x85,0x1d,0x1c,0x36, - 0x57,0xe9,0x96,0x6e,0xa3,0xb0,0x68,0xae,0x28,0x9f,0x95,0xa0,0x6f,0xde,0xdf,0x23,0xfa,0xfb,0x09,0xe6, - 0xbf,0x7a,0x1a,0xce,0x31,0x9e,0x7d,0x99,0x04,0xb5,0xd9,0x7f,0x48,0x42,0x32,0xd1,0x54,0x48,0xa1,0xb8, - 0xeb,0xa4,0x65,0x3a,0xe7,0xb4,0xed,0x6b,0xf1,0xb0,0x5c,0xd8,0xe5,0xb4,0xd3,0xca,0xbd,0x4e,0x35,0xe3, - 0x0d,0xe6,0x3a,0x88,0x84,0x49,0xce,0xa7,0x64,0xe8,0xbb,0x25,0x48,0x4c,0x77,0xd6,0x3a,0x3a,0x0f,0x45, - 0xdc,0xb0,0x60,0x60,0x8b,0xa3,0xaf,0x33,0xad,0x65,0x87,0xc0,0x59,0xe4,0xc2,0x0e,0x62,0x0d,0xe4,0xac, - 0x32,0xc0,0xa8,0xe7,0xf2,0x12,0xe8,0xa3,0x41,0x2c,0xa8,0x97,0xa6,0xb5,0x5f,0x79,0x45,0xad,0xf7,0xe0, - 0x8e,0xd6,0xba,0x1f,0xef,0xc1,0x86,0x58,0x32,0x44,0xb5,0x5a,0x05,0xbc,0xd4,0xd9,0xa4,0x02,0x3d,0x0a, - 0xed,0xd8,0x25,0x5a,0xd2,0xb0,0xfb,0xa3,0x91,0x5c,0xe9,0xbc,0x40,0x71,0xbd,0x9f,0x2b,0x44,0x56,0x9d, - 0x41,0xb2,0xeb,0x5d,0x04,0xb1,0x9f,0x9c,0x87,0xb0,0x03,0xec,0x95,0xbe,0xb3,0x13,0x43,0xab,0xf4,0xa2, - 0x0e,0x2f,0x64,0x0f,0x96,0x72,0x68,0x28,0x27,0x44,0xe2,0x69,0x8f,0x44,0x3b,0xf4,0xf3,0xe4,0xdd,0xd3, - 0xef,0x2c,0xad,0x91,0x41,0xdd,0x4f,0x3c,0x61,0xbf,0x5e,0x3c,0xe8,0x75,0x8d,0xf6,0x5f,0x00,0x03,0x69, - 0x34,0x56,0x4b,0xdc,0x65,0x09,0xe6,0x6e,0x97,0xd5,0x63,0x98,0x05,0xfa,0x8c,0x8b,0xe7,0x2f,0x4e,0x5f, - 0x3e,0x3b,0x13,0x67,0xa7,0xef,0x3e,0xfc,0xfa,0xed,0xeb,0xf7,0x6f,0xce,0x3c,0x11,0x4e,0x3f,0xa1,0xa5, - 0x6c,0x7a,0xc6,0x3e,0xc3,0xa5,0x62,0xaf,0xdf,0x7f,0xff,0xec,0xc3,0x6f,0x4e,0xff,0x78,0xe6,0x35,0xed, - 0xd6,0x33,0x3a,0xac,0xcb,0x9b,0x35,0x59,0x93,0xe7,0x50,0x2d,0xe7,0xbf,0xdd,0x6a,0x66,0xd2,0x20,0x53, - 0x91,0x91,0x8a,0x0e,0x06,0xf4,0xac,0x08,0x8b,0xbc,0x71,0xef,0x71,0x1a,0x33,0x12,0xa1,0xc9,0x1b,0xd9, - 0x1f,0x44,0xfd,0x65,0x65,0x8f,0xc9,0x14,0x57,0x50,0xed,0xd5,0x3c,0x4e,0x0d,0x8d,0x31,0x08,0x06,0x5f, - 0x49,0x67,0xaa,0x84,0x42,0x70,0xcd,0x40,0x5a,0xf8,0x03,0xe4,0xd9,0x61,0xbe,0xcd,0x4f,0x61,0xd6,0x31, - 0x97,0xc9,0xaf,0xe7,0xf2,0x35,0xbe,0xab,0x3a,0x1c,0xce,0x37,0xb7,0xa7,0x4a,0x67,0x86,0x66,0x32,0x35, - 0xde,0x2b,0xda,0xb5,0x30,0xa8,0x76,0x2b,0x22,0x4a,0x0d,0x94,0x9e,0xfc,0xcc,0x6d,0x4c,0xba,0xa5,0x46, - 0x4e,0x07,0x71,0x60,0xe4,0xe4,0xc9,0xf4,0xfa,0x16,0xc4,0x71,0x09,0x89,0x3e,0x3c,0xfb,0xe3,0xd9,0xf3, - 0xf6,0x78,0xf1,0xd3,0x4f,0x51,0xf6,0xbb,0x74,0x06,0x12,0x42,0xfb,0x2a,0x88,0x5c,0x60,0xe6,0xce,0x10, - 0x20,0xcc,0xe1,0x27,0xc8,0x64,0x51,0xc1,0xe9,0x25,0xae,0xd6,0xe6,0xa2,0x94,0x99,0x44,0x97,0xbc,0x99, - 0xf7,0x9b,0x0a,0xc9,0x54,0x7d,0x54,0x24,0x0b,0x61,0x4c,0x9b,0x0a,0xd1,0x83,0x72,0x31,0x04,0x91,0x58, - 0x57,0x88,0x12,0x5d,0x9c,0x26,0xe4,0x7a,0xd7,0xd8,0x03,0x21,0xdb,0x27,0x64,0x13,0x96,0xe7,0x8e,0xca, - 0x74,0x29,0x73,0x6c,0xc8,0x9f,0xe1,0xa2,0xb8,0xa6,0x9f,0x25,0x54,0xdd,0x3b,0x3e,0x1b,0x15,0xb9,0x71, - 0x28,0xdf,0x9f,0x8b,0x13,0x39,0x9a,0x67,0x29,0x7b,0x35,0xc2,0x64,0x21,0x31,0xf6,0x79,0xaf,0xe0,0x4f, - 0x8f,0x0c,0x5c,0xc6,0x7a,0xcb,0x4f,0xce,0xca,0x94,0xdb,0x4a,0xcd,0xbd,0xca,0xab,0x90,0x76,0x4d,0x16, - 0x8d,0xd3,0xb4,0x48,0x80,0x07,0xf6,0x14,0xca,0x59,0xb5,0xec,0xf8,0xb3,0x25,0x9a,0x66,0xe3,0xc9,0x2c, - 0xcd,0x1b,0x8d,0x76,0xea,0x09,0x32,0xdb,0xff,0xf2,0x1f,0x9c,0x8d,0x76,0xd6,0xbb,0xbc,0x31,0xd8,0xb8, - 0x62,0x36,0x6c,0xe0,0xf1,0xb7,0xb2,0x71,0x5e,0x50,0x35,0xab,0x78,0xfd,0xff,0xf5,0xbf,0xfc,0x3f,0xff, - 0xfd,0x9f,0x36,0xb0,0xfb,0xdc,0x73,0xa0,0x9f,0xa4,0x4f,0xc7,0xfc,0x81,0xe1,0xfa,0xf6,0x4e,0xd3,0xb7, - 0xf4,0x0a,0x46,0xba,0x1a,0x66,0x3c,0x37,0x46,0x07,0xf4,0xbd,0x81,0x7d,0x08,0x2b,0x87,0xce,0x10,0x93, - 0x3b,0x05,0x44,0x3f,0x79,0x17,0xde,0x8a,0x49,0x25,0x1f,0x3c,0x66,0x10,0x43,0x02,0xe1,0x64,0xbb,0xe4, - 0x2c,0x48,0x5d,0x32,0xeb,0x93,0x9e,0xed,0xf7,0x28,0x8f,0x7b,0xdf,0xda,0xb7,0x4c,0xa6,0xbc,0xbf,0xe5, - 0x31,0xed,0x66,0xd0,0xa1,0x51,0xe2,0x17,0x1e,0x9e,0x68,0xf1,0xf0,0x5f,0xff,0xb4,0x2a,0xe1,0x1c,0xc8, - 0x33,0xc0,0x1c,0x55,0xa5,0x7e,0xd8,0xb5,0x45,0xb6,0x8f,0xd5,0x36,0x8e,0x1c,0x7a,0xd7,0xcf,0x46,0x29, - 0x25,0x00,0x55,0x43,0x36,0x1a,0x55,0x07,0x50,0x3e,0xcd,0xf5,0x93,0xdc,0xf3,0x3b,0x43,0x60,0x96,0x95, - 0x3e,0xe3,0xed,0xe9,0x93,0xd7,0xaf,0xdf,0x31,0x0d,0x64,0x14,0x22,0xa4,0xef,0x3c,0x61,0xf0,0x13,0x21, - 0x38,0x10,0x66,0x1d,0xa3,0x70,0x6a,0x4b,0xd6,0xa1,0xe8,0x5b,0x77,0x06,0xdc,0x88,0x70,0xcc,0x77,0x1d, - 0x45,0x3d,0xad,0xb6,0x04,0x76,0x33,0x55,0xe9,0xbc,0x52,0x32,0x57,0xa5,0x72,0xcf,0x76,0xb5,0xaa,0x92, - 0x03,0xde,0xe1,0xab,0xcf,0x46,0xb9,0x51,0xc6,0xb3,0x05,0x6d,0x88,0xff,0xf1,0x9f,0xff,0xf9,0xbf,0xc1, - 0x76,0x28,0x30,0x8b,0xa8,0x94,0x93,0x3d,0x0b,0xb8,0x75,0x05,0x05,0x59,0xc5,0x2d,0xe0,0xd0,0x88,0x73, - 0x26,0x75,0x98,0xa4,0x27,0x9b,0xff,0xbe,0xf4,0xeb,0x3b,0xe7,0xe2,0x02,0x43,0x79,0x72,0xc9,0x3a,0x38, - 0x37,0x21,0x65,0xdd,0x29,0xd4,0x2f,0x8f,0x5b,0x42,0x17,0xdf,0xc1,0xd5,0x79,0x48,0x05,0xdf,0xa6,0xb7, - 0xae,0xde,0x98,0xa8,0x9a,0x47,0xa1,0xed,0xbc,0xc9,0x94,0xa7,0x94,0x0a,0xaa,0xa8,0x57,0xde,0xa0,0xa8, - 0x6e,0x87,0x16,0x70,0x42,0x53,0xc3,0xc0,0xa0,0x41,0xac,0x42,0x35,0xcd,0x58,0xbe,0xfb,0xd3,0xdb,0xf7, - 0x2f,0x4f,0xc9,0xa4,0x95,0xb4,0x8b,0x9f,0x10,0x48,0x88,0x31,0x31,0x8b,0x9f,0x38,0xb2,0x9a,0x6e,0x05, - 0xef,0xfe,0xf4,0xfc,0xc5,0xdb,0xb3,0x77,0xba,0x1c,0x82,0x36,0xbc,0x7f,0xf7,0xd4,0xd9,0x38,0x98,0x40, - 0x5c,0xd7,0x0d,0x27,0xfc,0xa3,0x58,0xaf,0x61,0x13,0xeb,0x85,0x85,0xd0,0x14,0xa6,0x52,0xad,0xee,0xec, - 0x68,0x06,0x07,0x9a,0x67,0xee,0x83,0x3c,0x78,0x5b,0x75,0xfc,0x62,0xff,0x06,0xaf,0x6d,0x81,0x63,0x06, - 0x86,0x3d,0x82,0x4a,0xe9,0xa0,0xca,0xa2,0xcb,0xf8,0xb3,0xac,0xf6,0x7d,0x3c,0xa5,0x5a,0xcd,0x83,0xaf, - 0xaa,0xf7,0x3d,0x06,0x9e,0x28,0x22,0x1e,0xdb,0x9b,0x33,0xe4,0x8b,0x6a,0x4d,0xbf,0x80,0xa5,0x22,0xa1, - 0x24,0x65,0xbe,0x0c,0x82,0xb9,0x59,0x9d,0x9f,0x85,0xcc,0x86,0x8c,0xa6,0xb8,0x44,0xc7,0x90,0xaa,0xab, - 0x1b,0xb4,0x36,0xc7,0x96,0x21,0x3e,0x38,0x2a,0xd3,0xec,0xf5,0x35,0x4f,0x10,0x3f,0x9c,0x17,0x21,0xff, - 0xa6,0x35,0x18,0x5d,0x50,0xfc,0x59,0x9a,0xb0,0x3b,0x2a,0xe7,0x72,0xc0,0x65,0x45,0x4a,0x96,0x37,0xd8, - 0x38,0x2c,0xeb,0xc6,0x82,0x08,0x4f,0x9b,0xbd,0x98,0x5d,0x6f,0xa9,0x60,0x8a,0xf5,0x74,0x59,0x66,0xe8, - 0x35,0xdd,0xa5,0x0c,0x5c,0xe4,0x00,0x91,0x6d,0xea,0x28,0xf6,0x31,0xfb,0xaa,0x3e,0xde,0xfc,0xf9,0x8c, - 0x82,0x67,0xb8,0x97,0xea,0xca,0xf4,0x93,0xfa,0xf4,0x0a,0x5a,0x00,0x6b,0xf3,0x8c,0xcc,0xb4,0x39,0x4d, - 0x3d,0xfe,0xa0,0x59,0xd7,0x1a,0x8f,0x0a,0xa6,0x17,0xdb,0xd6,0x9a,0x7d,0xdd,0x9a,0xf9,0xe8,0xa1,0xe6, - 0xbd,0x8b,0xf2,0x77,0x0b,0xfe,0xd0,0x52,0xec,0x1b,0x8d,0x4a,0x1a,0x28,0x46,0xd7,0x89,0xf2,0x79,0xbf, - 0x47,0x47,0x27,0xdd,0x01,0x6a,0x3d,0x61,0x81,0x6a,0xdd,0xa0,0x62,0x49,0x1e,0x54,0x0b,0xe0,0xff,0x6e, - 0x31,0x0b,0x93,0x9f,0x62,0xff,0x6e,0x1e,0x27,0xaf,0x42,0x34,0xa8,0xf8,0xfd,0x9e,0x80,0x8b,0x27,0x45, - 0x82,0xb8,0xee,0x7e,0xef,0x40,0x5e,0x71,0x6d,0x7e,0xef,0x50,0x5e,0xbf,0xa5,0x84,0x10,0xdd,0x01,0x5d, - 0x72,0xc2,0x42,0xbf,0x4f,0x57,0x2f,0xa7,0x99,0xdf,0xdf,0xa7,0xfb,0xc4,0x0a,0xfa,0x5d,0xba,0x78,0xd1, - 0x9b,0x9c,0x4d,0x43,0xbf,0xd7,0x55,0x17,0x93,0x99,0xdf,0xa3,0x6f,0x3d,0xbb,0x7c,0xfb,0xd9,0xef,0xf5, - 0xf9,0xe7,0xbb,0xcf,0x7e,0xf7,0x48,0x28,0xbe,0xd7,0xdf,0xee,0xc2,0xd9,0x47,0x96,0x9e,0x9e,0xdd,0x48, - 0xae,0x65,0x55,0x23,0xbb,0x07,0xa5,0x46,0xee,0xdb,0x6d,0xdc,0xed,0xea,0x36,0x1e,0x58,0x6d,0xdc,0xed, - 0x5a,0x6d,0xec,0x1e,0x7e,0x5d,0x1b,0x3b,0x88,0x76,0x12,0xb8,0x89,0xc8,0x4d,0xe4,0x6b,0x56,0x57,0xf5, - 0x26,0x9a,0x49,0xc9,0x36,0xb0,0x7f,0x55,0x56,0xe4,0x3c,0x47,0x2f,0x6a,0xc9,0x1d,0xbb,0xe7,0xb0,0x40, - 0x2e,0xc8,0xcf,0x82,0x34,0x46,0xf8,0x6f,0x9b,0x32,0xb2,0x16,0x9c,0x14,0x5b,0x6d,0x3f,0xe3,0x3e,0x81, - 0x39,0x21,0xa3,0xe2,0x04,0xc3,0x02,0x18,0x0d,0xc9,0x13,0xd9,0x72,0x98,0x7e,0x1d,0x6d,0xa0,0x3a,0x24, - 0x6d,0xa0,0xdf,0xb4,0x67,0x12,0xf3,0xec,0x3d,0xad,0x25,0xe4,0x7f,0x17,0xea,0x97,0xf5,0xf4,0x84,0x67, - 0x91,0xd8,0x63,0xf5,0xf3,0x82,0x25,0x52,0x29,0xab,0xdd,0xad,0x26,0x31,0x71,0xf2,0x3e,0x07,0xfa,0xa2, - 0x0f,0x66,0x84,0xcf,0xb3,0xa7,0x1c,0x97,0x35,0x11,0x7e,0xda,0x0f,0x59,0x31,0xb1,0x92,0x7b,0xd5,0xd2, - 0x54,0x51,0xd0,0x91,0x37,0x6c,0x3c,0x10,0xda,0x33,0x34,0x6c,0x59,0xe9,0x12,0x56,0xb6,0xe9,0xf7,0xe1, - 0xc7,0x08,0xda,0x05,0x44,0xaf,0x80,0x5e,0x58,0x44,0x8f,0xce,0xee,0x28,0xc1,0x73,0xca,0xd0,0xbd,0xfa, - 0x89,0xdb,0xa9,0x69,0x08,0xf4,0x21,0x8d,0x6e,0xb6,0xe4,0xef,0x63,0x45,0x81,0x7a,0x16,0x50,0xd4,0xbc, - 0x94,0xae,0x9a,0x69,0xcb,0x9e,0x3a,0xf0,0x4d,0x1c,0x61,0xd9,0x49,0xac,0xe4,0xad,0x44,0x41,0xcb,0xd5, - 0x6f,0xa0,0x16,0xd4,0x72,0x81,0xc2,0xea,0x28,0xc2,0x14,0x5d,0xdd,0x75,0x38,0x32,0xe5,0xe1,0x56,0x36, - 0x08,0xc6,0x21,0x83,0x95,0x76,0x6c,0xe8,0xd4,0xab,0xdf,0x9e,0xbe,0x7d,0x1b,0xdc,0x25,0x29,0xf2,0x3b, - 0x3e,0x10,0xd8,0xe8,0xfb,0x94,0x99,0x20,0x3c,0x88,0xbf,0x4f,0x8b,0xe7,0x28,0x3a,0xd2,0x03,0x3c,0x64, - 0x31,0xa4,0xed,0x12,0x31,0x85,0xe8,0xce,0x5b,0xfe,0x8d,0x19,0xd7,0xa7,0x4f,0x6d,0x1c,0x79,0x78,0x86, - 0x41,0x1a,0x58,0x9a,0x11,0xd9,0x65,0x71,0x09,0xcf,0x2e,0x14,0x5d,0xc5,0xbb,0xb2,0xa9,0x8e,0x00,0xa1, - 0x8b,0xef,0xbc,0xc4,0x0f,0x2d,0xc5,0xab,0xdf,0x9e,0xbd,0x3b,0x79,0x77,0x1a,0xdc,0xe9,0xa0,0x31,0x78, - 0x48,0xb9,0xc2,0x52,0x8e,0x9c,0xc4,0x6b,0x36,0x55,0xc9,0xb8,0x0f,0xe8,0x3f,0xde,0x1b,0x63,0x68,0x86, - 0xba,0xc7,0xaf,0x2d,0x60,0x0d,0x59,0x3e,0xe1,0x16,0xf1,0x96,0xa9,0x0f,0x12,0x03,0xb4,0x50,0x83,0x5b, - 0x96,0xe3,0x6f,0x63,0x06,0xf3,0x69,0x66,0x78,0xa5,0xf3,0xc2,0x95,0xcd,0x3d,0xe7,0x6c,0xe0,0x24,0x37, - 0xc9,0xe6,0x79,0x17,0x43,0x47,0xb7,0x86,0xd0,0xe2,0x95,0x3f,0x51,0x82,0x30,0x39,0xf3,0x14,0x5a,0x83, - 0x31,0x34,0x9c,0xd4,0x49,0xdf,0x42,0xcb,0x08,0x59,0x0f,0xf4,0x33,0x9a,0xac,0x73,0x79,0xf7,0x62,0x54, - 0x54,0x6e,0x20,0x42,0x83,0x34,0x37,0xe0,0x64,0xc3,0x0a,0x7c,0x91,0xbc,0xca,0x1f,0x77,0xf4,0xfb,0x74, - 0x82,0xbe,0xc5,0x07,0x32,0xf6,0x90,0x14,0xef,0x93,0x28,0x9e,0xb9,0xd6,0x0b,0xd2,0xe1,0x66,0x0b,0xcf, - 0xdc,0x86,0x4e,0xb7,0xdc,0xc6,0xce,0x8c,0x1c,0xe6,0x62,0x28,0x9d,0x1b,0xc5,0xb5,0x96,0x9e,0x21,0xc0, - 0x32,0x39,0x53,0xd7,0xc7,0x37,0x2c,0x81,0x3b,0x97,0xb3,0x54,0x94,0xf8,0x11,0xdb,0xb5,0xbb,0x06,0x62, - 0x3e,0x87,0x66,0xde,0xa6,0xd9,0xb4,0x31,0xdd,0x5c,0x03,0x50,0x3a,0x7b,0xc2,0x9a,0xcc,0x0c,0x35,0x35, - 0x80,0x7a,0xf4,0x72,0x3c,0x23,0x75,0x46,0xd8,0x68,0x0d,0x84,0x52,0x4f,0x31,0xef,0xb9,0xd1,0x3a,0xe8, - 0x98,0x51,0x8c,0x54,0x9a,0x50,0x0c,0xfd,0xfb,0x6c,0x86,0xf4,0x7d,0x73,0x70,0x28,0xbc,0xf2,0xeb,0x88, - 0xc4,0x80,0x7c,0x0d,0x07,0x65,0x22,0x78,0x2d,0x24,0xa2,0xed,0x6d,0x2b,0xcb,0x44,0xde,0x34,0x6d,0xd6, - 0x14,0xa1,0xe7,0x6e,0x03,0x04,0x35,0x94,0x80,0x4a,0x5e,0xa3,0x2b,0x3c,0xfe,0x85,0x91,0x23,0x06,0xd1, - 0xd0,0x9c,0x68,0x69,0xb9,0xe0,0xca,0xc8,0x81,0x68,0xd4,0xe0,0xe8,0xf1,0x9d,0x6c,0x4b,0x10,0xf9,0xd2, - 0xb4,0xb2,0xa6,0x90,0xd1,0xc6,0x95,0x13,0x29,0x59,0x79,0x33,0xcc,0xe1,0x88,0xf1,0xc7,0x5c,0xcb,0xf3, - 0x30,0x9e,0x69,0xb0,0xce,0xa5,0xf1,0xec,0x45,0x84,0xc5,0x64,0x0d,0xb8,0x6b,0x05,0xf0,0xa2,0xe4,0x31, - 0x6c,0x92,0x35,0x61,0xff,0x76,0x76,0xd4,0x67,0x79,0x64,0xf0,0xc3,0xe4,0xb3,0xa4,0x66,0x5d,0x1d,0xcf, - 0xc9,0x57,0x3a,0x92,0xe2,0xce,0x47,0x8f,0x4f,0x97,0x59,0x80,0x07,0x81,0xee,0xa1,0xb5,0x35,0x75,0x61, - 0xea,0x4c,0xab,0x6a,0xed,0xc8,0x5c,0xe3,0xd5,0x18,0x19,0xb1,0x15,0xa3,0x22,0xe5,0xf2,0x92,0x7b,0x89, - 0x19,0x03,0x73,0x5d,0x17,0x5e,0x4b,0xcb,0x5f,0x58,0x37,0xa8,0x68,0x8e,0xc9,0x1f,0x50,0x36,0xae,0xbc, - 0x02,0xab,0xd7,0x7e,0xe1,0xd7,0x92,0xed,0x88,0x51,0x8c,0x1d,0x92,0x1b,0x05,0x06,0x83,0x4a,0xc1,0x11, - 0x33,0xd2,0x55,0x6e,0x61,0x6c,0x5e,0x73,0x36,0x32,0x36,0xa7,0x57,0x60,0x95,0x46,0x6d,0xf7,0xae,0x86, - 0xdd,0x2c,0x24,0xd4,0x12,0x99,0x45,0x28,0x9d,0xa5,0xf6,0xf3,0xb7,0xa9,0x8b,0x69,0x3a,0x85,0xa1,0x20, - 0xa4,0xff,0x2a,0x97,0xc7,0x4b,0xd6,0xb5,0xd5,0xee,0x23,0xf7,0xd1,0x74,0xbb,0x5b,0xf5,0x2c,0x84,0x81, - 0x1a,0x35,0xfa,0x1e,0x40,0xc1,0x90,0x05,0x45,0x18,0xb2,0xd1,0x0a,0xe6,0x47,0x14,0xaa,0x48,0xdd,0x74, - 0x50,0xa0,0x1f,0x5b,0x09,0xb0,0x7c,0x9e,0xa5,0x57,0x98,0x9e,0x19,0x7b,0x56,0x96,0xc7,0x62,0x93,0xdb, - 0x8a,0x9d,0x64,0x3a,0xbf,0x5a,0x91,0x1b,0x14,0x3b,0x0c,0x9c,0x0e,0x5a,0x82,0x9b,0x35,0x93,0x0d,0xc4, - 0x09,0x49,0x98,0x01,0x46,0xba,0x83,0x1a,0xfc,0x42,0x70,0x4e,0xf5,0x3b,0xe5,0x38,0x40,0x9f,0x0d,0x1c, - 0xf8,0x2e,0x26,0x8a,0xab,0x28,0xa0,0x96,0x98,0x7c,0x21,0xe2,0x3c,0x73,0x4d,0xea,0x54,0xe4,0x6b,0x90, - 0x51,0x2a,0x57,0x46,0x16,0xe3,0xc2,0x6b,0x17,0xe9,0xf3,0xf8,0x73,0x34,0x75,0xbb,0x70,0x74,0x41,0xb7, - 0x96,0x92,0xbf,0x79,0x7b,0xfa,0xf2,0xf4,0xe4,0xec,0xf4,0x0c,0xc1,0x01,0x03,0x13,0xc5,0x3f,0x8f,0xdb, - 0x57,0x71,0x01,0x2b,0xb4,0x0d,0x27,0x05,0x30,0x63,0xc0,0xa3,0xed,0x3d,0x81,0x4d,0x06,0x5c,0xfb,0x24, - 0xca,0x64,0x94,0xff,0x6e,0x72,0xb5,0x27,0xe3,0x94,0xf3,0xbd,0x19,0x06,0x5e,0xc3,0x71,0xf3,0xfa,0xdd, - 0xc9,0x87,0x27,0x50,0xa3,0xa9,0x6c,0xac,0xdf,0x53,0x75,0xc6,0xa9,0x55,0xc3,0xa5,0x0c,0xcb,0xde,0x4b, - 0x8b,0x70,0xcf,0x21,0x05,0xa9,0xba,0x85,0x31,0xa4,0x26,0x86,0xe3,0xfd,0x1b,0x32,0x5f,0x04,0x92,0xe1, - 0x96,0xc1,0xa4,0x02,0x6f,0xbf,0x7b,0xf7,0xf2,0xc3,0xab,0xb3,0xa0,0xd7,0x3d,0x88,0xf6,0xc5,0xa7,0x28, - 0x7b,0x83,0x06,0xbf,0xc0,0x82,0x55,0xa7,0x20,0x22,0x0b,0xf3,0xe6,0x13,0xc1,0xdd,0x58,0x59,0x8e,0x55, - 0x84,0x26,0xa5,0x15,0x7d,0x81,0xfe,0x0b,0xa2,0xdb,0x41,0x8d,0x6d,0xc9,0xfd,0x31,0xfb,0x3e,0xba,0xa5, - 0x8c,0x78,0x96,0x55,0x5f,0x7d,0x0e,0x4d,0x3b,0xa1,0xb9,0x2a,0x4c,0x66,0xc5,0x28,0xe8,0x0c,0xa3,0x47, - 0xfd,0x61,0xc4,0xd8,0xe6,0xd2,0xf2,0xd8,0x41,0xad,0x93,0x1b,0xca,0xdf,0x92,0xbd,0xd2,0xcf,0x1e,0xeb, - 0x27,0x43,0x85,0x01,0x6d,0xc5,0xae,0xcd,0xa7,0x4f,0x31,0xe5,0xd0,0xd4,0x2d,0xdb,0x81,0xc8,0xa7,0x99, - 0x7a,0xe0,0x96,0x8e,0x13,0x38,0x56,0x5f,0xa0,0xa5,0x4e,0x8e,0x20,0xaa,0xb2,0x70,0xbf,0xb0,0xfc,0x0c, - 0x6c,0xd6,0x33,0x94,0x07,0x12,0x5c,0x89,0xbb,0x70,0xf6,0x14,0x8f,0xcc,0x90,0x6a,0xae,0xcf,0xb2,0x08, - 0xd9,0xf9,0x76,0x2b,0x3c,0x3f,0x36,0x0c,0xb9,0x08,0xe9,0xc9,0x8b,0x58,0x90,0x09,0x10,0x9f,0xab,0x10, - 0x1a,0x02,0x92,0xc7,0x4b,0x60,0x7b,0x9a,0xc2,0xd7,0xe1,0xb5,0x4b,0x3a,0xac,0x8c,0x40,0x64,0xe7,0x6b, - 0xb2,0xd7,0x28,0xf0,0x0e,0x2a,0xe8,0x42,0x25,0xa1,0xb2,0xe3,0xc3,0x3f,0x25,0x53,0xb9,0xc8,0x5a,0x32, - 0x54,0xbc,0x96,0x9b,0x69,0x5d,0x46,0xa6,0x68,0x20,0x63,0xc3,0xb7,0x23,0xcc,0x8d,0x54,0x6f,0x2a,0xe7, - 0x5b,0x52,0xf9,0x8e,0x76,0x76,0x9c,0x0e,0x9f,0x59,0xb2,0x51,0x23,0x52,0x17,0x3a,0x9f,0x77,0x33,0x18, - 0xd1,0x59,0x7c,0x13,0x17,0xbb,0x59,0x84,0x12,0x14,0x49,0x1e,0xf7,0xf7,0x83,0xde,0xb1,0xf5,0xfa,0x08, - 0x3b,0x8e,0x25,0xe1,0xc4,0xac,0x0d,0x81,0xc1,0x49,0xe7,0xcc,0x48,0xb0,0xb6,0xee,0x6a,0x5e,0x1d,0x70, - 0xae,0xe6,0xb0,0xeb,0xd9,0x33,0x81,0x82,0x3d,0x65,0x20,0x01,0x2c,0x1e,0xfa,0x79,0x01,0x1f,0x1b,0xa3, - 0x1c,0x1c,0x65,0x1f,0x14,0x1a,0xed,0x87,0x45,0x36,0x33,0x50,0x9b,0x77,0x61,0xe1,0x9b,0xf9,0xc7,0xcd, - 0x83,0xda,0x67,0xe5,0xf1,0x8e,0xd0,0x4e,0x57,0x1f,0xb0,0xa6,0xe6,0x1d,0x24,0x16,0xc4,0xfa,0xf8,0xdb, - 0x49,0x7b,0x8a,0xee,0x48,0x3b,0x3b,0xf0,0x0b,0x24,0x64,0x49,0x16,0xc4,0x7c,0x31,0x9e,0xc5,0x39,0xac, - 0x54,0x53,0xa1,0xbe,0xf5,0x21,0x2c,0xb8,0x52,0x05,0x51,0x00,0x1b,0x4e,0x10,0xcc,0x06,0xf0,0xe9,0xd7, - 0xc5,0xcd,0x0c,0x1b,0x4a,0xce,0x30,0xdc,0x49,0x3f,0x5c,0xd6,0x7d,0x85,0xf3,0xf2,0xd2,0x16,0x15,0xb7, - 0xfe,0xd8,0x0e,0x97,0x57,0x2b,0x37,0x2e,0xed,0xa4,0x93,0x4f,0x30,0xee,0xac,0x78,0x36,0x62,0x76,0x4d, - 0x55,0x26,0xc7,0x45,0x7b,0xfd,0xe3,0x58,0x73,0xdf,0x81,0xdd,0x40,0x87,0x5d,0x45,0x1a,0x54,0x49,0x20, - 0x11,0x23,0xc6,0x3c,0xaf,0x0b,0xc6,0x3c,0x0f,0x0a,0x8f,0xa2,0x6c,0xc4,0xab,0x7d,0x99,0x25,0xf1,0x17, - 0x88,0xc9,0x4c,0x2b,0xf3,0xdc,0x51,0xe4,0x71,0x57,0x13,0xd1,0xf6,0x38,0xc6,0x54,0xf2,0xf5,0x07,0xbb, - 0x79,0x7f,0x37,0x9d,0x14,0xb0,0xc6,0xd7,0x95,0xf8,0xf3,0x22,0x9c,0x52,0x01,0x2b,0x21,0x5c,0xe8,0xad, - 0xd8,0xa9,0x09,0xda,0xd2,0x28,0x72,0xc3,0x5a,0x44,0x0d,0x59,0xd2,0xbe,0x6a,0xe3,0xf5,0x70,0xe7,0x89, - 0xbc,0xb4,0xed,0xd5,0x49,0xd2,0x72,0xc8,0xa9,0x98,0xf6,0x01,0x66,0x3a,0x61,0xec,0x91,0xe6,0xfd,0xd9, - 0xdc,0xc0,0x4c,0xd6,0x9b,0xab,0xbd,0x94,0x06,0x99,0xdc,0x39,0x3b,0x3b,0xea,0xd7,0x79,0x48,0x80,0xb0, - 0x99,0x9a,0x40,0xa0,0xce,0xce,0x27,0x0c,0x74,0x90,0xd7,0x94,0x5d,0xec,0xd3,0x0f,0xd3,0x16,0xa5,0x7f, - 0xa7,0x7f,0x54,0x10,0x9c,0x7e,0x07,0xed,0x49,0xe9,0x03,0x9a,0x85,0x3d,0x68,0xcc,0x6d,0x96,0xb6,0x31, - 0xff,0x25,0x54,0xc3,0x3f,0x1e,0xf5,0xf6,0x0f,0xd4,0xef,0xc7,0xdd,0x83,0xc3,0xc3,0x43,0x38,0xe2,0x56, - 0xa6,0x39,0x4b,0x55,0x5a,0xaf,0x15,0x2d,0x00,0x41,0x87,0xc3,0x12,0x0d,0x13,0xdc,0x38,0xde,0xba,0x3b, - 0x94,0x03,0x2f,0x54,0x43,0x3e,0x6b,0x1a,0x72,0xe7,0xbb,0x77,0xef,0xde,0x80,0xa4,0x3c,0x53,0x29,0xe8, - 0x64,0xd5,0x93,0x60,0xc6,0x90,0x7f,0x40,0x10,0xdf,0x12,0x71,0xc4,0x0c,0xbb,0x04,0xe3,0xf5,0x1e,0x64, - 0xf7,0x23,0x8e,0xc1,0x90,0xdd,0xa5,0x43,0x1f,0xb3,0x73,0xe3,0xf6,0x26,0x38,0x2f,0x05,0xd8,0x75,0x37, - 0x4d,0x31,0xd3,0xa9,0x94,0x46,0x75,0x22,0x80,0x49,0x1b,0x87,0x92,0xa3,0x0a,0x23,0x8f,0x10,0xfa,0xf1, - 0xe7,0x5c,0xa7,0xd2,0x79,0x3c,0x55,0xd1,0xac,0x1b,0x87,0x62,0xca,0xa0,0x5b,0x62,0xee,0x89,0x79,0x4b, - 0xe7,0xe9,0x11,0x89,0x3b,0xdf,0xd3,0x95,0x2c,0x35,0x3a,0x86,0xfa,0x3e,0x47,0x97,0xbb,0xa4,0xf0,0x9b, - 0xc3,0x52,0xe1,0x9e,0xdc,0xdf,0xf7,0xfa,0x7d,0xb8,0x9a,0x9e,0x77,0xe0,0xec,0xb6,0xd2,0x4e,0x4e,0x3d, - 0x2e,0xb3,0x32,0xed,0x5a,0xb9,0x4d,0xea,0x88,0x85,0x12,0xcf,0xe1,0x96,0x7b,0x3e,0xbd,0x10,0xa1,0x92, - 0xe4,0xed,0xf3,0x0e,0xf6,0x76,0x54,0xc0,0x06,0x83,0x11,0xb8,0x29,0x25,0x65,0x61,0xaa,0x41,0xdc,0xbb, - 0x74,0xcf,0xb1,0x13,0xa3,0x84,0xcd,0x71,0x73,0xf1,0x94,0x0e,0xa2,0x5d,0xe9,0x4c,0x5a,0xf7,0x6d,0x87, - 0x87,0x93,0xeb,0x8f,0xd2,0x5b,0x5d,0x5d,0x78,0x52,0x0c,0x1b,0x21,0xd4,0xb5,0x9f,0x51,0xe4,0x02,0xdd, - 0xda,0xde,0x4e,0x6c,0xa1,0x5f,0xd5,0x4e,0x24,0x5e,0x33,0xce,0x32,0x71,0xbb,0x3f,0x98,0x7f,0x1e,0xa2, - 0x5a,0x64,0x57,0x26,0x67,0xee,0x38,0x82,0x91,0xa5,0x7e,0xe1,0x6c,0xd0,0x0c,0x18,0x9f,0x05,0xde,0x65, - 0xe4,0x40,0xdf,0xd0,0x72,0xf9,0xa8,0x1c,0x43,0x5e,0xd6,0x24,0xa8,0x26,0xf2,0x5a,0x06,0x1a,0x56,0x12, - 0x33,0x9c,0x3a,0xf0,0x9d,0x4a,0x36,0x6c,0x73,0xac,0x3a,0x10,0xd9,0x1e,0xf1,0x2c,0xb0,0x98,0x36,0xce, - 0x72,0x58,0x01,0x23,0x93,0x7b,0x4e,0x6a,0x9e,0xdc,0x55,0x27,0x10,0x1d,0x99,0x02,0x56,0x5a,0x86,0x1a, - 0x66,0x1b,0x58,0x2f,0x22,0xb3,0x75,0xa5,0x56,0x9a,0x24,0x05,0xae,0x67,0x45,0xd1,0x6e,0xa5,0x41,0xf9, - 0xec,0x1b,0xf1,0xca,0x36,0x1c,0x9c,0x9f,0x61,0xbe,0xba,0xb5,0xc7,0x51,0x3a,0x6a,0xfc,0x60,0x82,0x79, - 0x12,0x34,0xab,0xe0,0xdc,0x7d,0x5a,0x62,0x3a,0x37,0x45,0x22,0x5b,0xb0,0xeb,0x35,0x0f,0x30,0xa2,0x04, - 0x58,0xd6,0x0d,0xca,0x81,0x85,0x3d,0x9c,0x61,0xda,0x08,0x49,0x99,0x67,0xe4,0x49,0x1a,0xa4,0x25,0x5d, - 0x4b,0x97,0xac,0xa4,0x12,0x51,0x2d,0x65,0x7c,0x2e,0x7d,0x07,0xc3,0xa3,0xdb,0xb8,0x7e,0x82,0x54,0x21, - 0x77,0xf9,0xcd,0x83,0xb3,0xc8,0x6a,0x6d,0x5d,0x3f,0xf4,0xe6,0xa3,0x76,0x84,0xce,0x5f,0x37,0x9d,0x56, - 0x9d,0xa2,0xe2,0xef,0x8c,0xc1,0xf6,0xae,0x66,0x14,0x11,0x1e,0x57,0x3e,0xf0,0x6d,0xc6,0x99,0x4c,0xde, - 0x61,0xa5,0x0d,0x09,0x31,0x98,0x6a,0x33,0xfb,0x7a,0xc3,0x92,0xc5,0x7e,0x55,0x26,0xb1,0x52,0x25,0x65, - 0xed,0x56,0x77,0xa9,0x39,0x28,0xab,0xbd,0x19,0x86,0x52,0x88,0xbf,0xb9,0x4e,0x80,0x7b,0xc7,0x70,0x41, - 0x14,0x47,0xbf,0x42,0xb6,0x3f,0x8f,0x51,0xd1,0x62,0x51,0xbe,0x06,0x83,0xc5,0x5a,0xc5,0x68,0x25,0xbb, - 0x23,0xb2,0x41,0x2b,0xb5,0x99,0x93,0xeb,0x94,0x3c,0x9f,0x90,0xac,0x95,0xf4,0x08,0x9b,0x5c,0x8a,0x12, - 0x1d,0x02,0xd6,0xe0,0xf3,0x84,0x54,0xe7,0xf2,0xb6,0x91,0xe8,0xc8,0x50,0x23,0xf9,0xe8,0x6b,0x49,0x50, - 0x05,0x92,0x0d,0xcf,0x18,0x54,0xfd,0x33,0x1e,0x5b,0x59,0xc8,0xee,0x88,0x32,0x31,0xc1,0x94,0x9d,0xd4, - 0x31,0x3d,0x70,0xcd,0x09,0x12,0x50,0x5d,0x8d,0x9f,0xfa,0x9d,0x54,0xc1,0x2d,0x87,0x32,0x85,0x58,0x43, - 0x08,0x37,0x6a,0x01,0xa2,0x05,0xf1,0xbe,0xe8,0x41,0xa4,0x29,0xa3,0x8e,0x2d,0x02,0x22,0x2f,0x03,0x8b, - 0x9e,0x7c,0x79,0x31,0x75,0x4b,0x67,0x11,0x1c,0x8a,0x40,0x04,0xb2,0xba,0x11,0x49,0x22,0xc5,0x0f,0x23, - 0xce,0x0e,0x02,0xd3,0x0e,0x82,0x11,0x9e,0x9a,0x40,0x03,0x9a,0x76,0xbc,0x62,0xbf,0x89,0x22,0xc2,0x3c, - 0x33,0xdd,0x6b,0x60,0xca,0x09,0x65,0x9d,0x51,0x2b,0x51,0x1d,0xbc,0xa1,0x26,0x63,0x2f,0x30,0x8e,0xfa, - 0x11,0xeb,0x5a,0x28,0xb4,0x19,0xeb,0xe9,0x34,0xd7,0xb3,0x98,0xeb,0x5a,0x2a,0x0c,0xeb,0xe7,0xeb,0xec, - 0x0d,0x5b,0xc7,0xe4,0x5e,0x30,0x1c,0x3c,0x2c,0x59,0x98,0x32,0xc6,0x91,0xda,0xd4,0x50,0xeb,0x03,0x6b, - 0x9a,0x29,0x88,0x0b,0x27,0x5e,0x2c,0xa5,0x91,0x4d,0x6d,0x85,0x02,0xa6,0xef,0xcb,0xe7,0xd0,0xba,0x08, - 0xb3,0x30,0x54,0xbc,0x65,0x33,0xc9,0xfd,0x3d,0xea,0x75,0x3a,0x70,0x32,0xc9,0xab,0xc7,0x41,0x1f,0x2f, - 0xb7,0xd1,0x8b,0xb6,0x43,0xfc,0xcf,0x1a,0x06,0x52,0xbd,0xc4,0x09,0x23,0x5b,0xe5,0xcf,0x69,0x11,0xf1, - 0xa8,0x43,0xf0,0x20,0x95,0x2e,0x5a,0xd6,0x3d,0xd1,0x6c,0xf2,0x93,0x8b,0xb2,0x11,0x00,0xba,0xba,0x2e, - 0x37,0xdb,0x07,0x61,0xa0,0xfa,0x2b,0x69,0x3f,0xc8,0xab,0x4d,0x88,0x0a,0x44,0x32,0x29,0xe6,0xa4,0xac, - 0xdc,0x2a,0x53,0x58,0x51,0x5d,0xe4,0xdd,0xaf,0x6b,0xfb,0xf2,0x6b,0x34,0xfb,0x3a,0x63,0x1b,0x70,0x0e, - 0x48,0x45,0x56,0x28,0xea,0x9b,0x75,0xed,0xda,0x7b,0x33,0x0d,0x7e,0x96,0xe3,0x16,0xf0,0x16,0x0f,0xc0, - 0x6e,0x90,0x0e,0x9c,0xc8,0x05,0xb0,0xdd,0xa7,0x29,0xa9,0x52,0xd9,0x80,0xac,0x9c,0x14,0xf7,0xb4,0x85, - 0x5f,0xc3,0x8a,0x30,0xee,0xd4,0x66,0x24,0x85,0xc9,0x83,0xd2,0x0e,0x6b,0xcf,0xaa,0x06,0x8b,0x9a,0x4e, - 0xd0,0xbb,0xae,0x5f,0x51,0x46,0xb9,0xdb,0x51,0x04,0x79,0x40,0x9e,0x25,0xf2,0x2c,0xd0,0x9e,0x60,0x13, - 0x8d,0x28,0x68,0x1c,0xbc,0xee,0xa6,0x2b,0x52,0x31,0x35,0x5a,0xd8,0x2f,0x43,0xf4,0x11,0xf8,0xb2,0x5b, - 0x1b,0xa6,0xaf,0xb3,0x95,0x57,0xf6,0x42,0xd3,0xd2,0x9f,0x96,0x79,0x08,0x8a,0xf3,0xd0,0x5f,0xa3,0x41, - 0xf8,0x3e,0x55,0x69,0x8e,0x44,0xb4,0xc1,0x9b,0x90,0x7e,0x72,0xdc,0xbb,0x38,0x37,0x52,0x4e,0x56,0xb1, - 0xb5,0x5c,0xde,0x4a,0x04,0x1e,0xe9,0x5b,0x28,0x92,0x0b,0xe8,0x0c,0x02,0x6b,0xa6,0xb7,0x62,0x9d,0x17, - 0x62,0x5a,0xb5,0xda,0x98,0xd5,0x67,0xaf,0x45,0x32,0xdb,0xcc,0xaa,0x65,0xe5,0x98,0x72,0x51,0x79,0x41, - 0x25,0x27,0x62,0x7a,0x61,0xa0,0x01,0x9e,0xfc,0xe6,0xc3,0xd3,0x93,0x77,0x67,0x81,0x71,0xad,0x1c,0x7f, - 0x24,0xa7,0x82,0x0b,0x71,0x6e,0x9c,0x89,0xf1,0xae,0xb2,0xfb,0xd0,0x13,0x4e,0x1a,0x8b,0xb7,0x09,0xa9, - 0x93,0xee,0xdd,0xc0,0x3c,0x4c,0x31,0xe4,0x00,0x6f,0xbf,0x52,0x17,0xf8,0x64,0x1e,0xc2,0x72,0x2c,0xe4, - 0x93,0x37,0xea,0x82,0xde,0x99,0xf7,0xb9,0x38,0xfc,0xa5,0x2f,0x72,0x44,0x23,0x7f,0x50,0xfe,0xc6,0xfb, - 0x20,0x68,0xa6,0xd9,0x94,0xbc,0xdf,0xc7,0x1f,0x4f,0xd4,0xc5,0x85,0x15,0xef,0x56,0x76,0x03,0x29,0xe9, - 0xb1,0xce,0x49,0x9b,0x62,0xe1,0xd8,0x91,0xa7,0xb2,0xec,0xb9,0xf2,0xef,0x75,0xd1,0x49,0x2d,0x78,0xec, - 0x9a,0x6e,0x30,0x7a,0x66,0x3d,0x80,0x00,0xb3,0x62,0x60,0xbb,0x2b,0xcf,0xd9,0x1b,0xbf,0x39,0x6d,0x37, - 0xc9,0x3d,0xe3,0x54,0x66,0xeb,0xb6,0x68,0x5f,0x61,0x30,0x12,0xdd,0x73,0xf2,0x3d,0xc2,0xb0,0x87,0x36, - 0x95,0x8f,0xa6,0x3a,0x69,0x6d,0xac,0xee,0x04,0x05,0x99,0xea,0xa5,0x62,0x20,0x26,0x00,0x2d,0x78,0xf9, - 0x26,0x4e,0x60,0xf1,0x05,0x05,0x3a,0x10,0x14,0x8f,0xd4,0xf3,0xa5,0xc8,0x02,0x42,0x8a,0x90,0xfc,0xf4, - 0x5d,0xc5,0x40,0x14,0x27,0x24,0xe5,0x5e,0xce,0xa2,0xcf,0xc3,0x70,0x16,0x5f,0x25,0xbb,0x88,0xcd,0x95, - 0xfb,0x93,0x08,0x2d,0xa0,0xc3,0xab,0x70,0xee,0xb7,0xfb,0x40,0xeb,0x87,0x37,0x20,0xf4,0xc6,0xc9,0x6e, - 0xc6,0x9e,0x69,0x19,0x46,0xc5,0x8a,0x18,0xd7,0x15,0xcc,0x05,0xf2,0x43,0x9e,0x20,0x98,0x0a,0x4a,0x86, - 0x75,0x4e,0xd6,0x46,0xdd,0xc1,0x0d,0xa3,0xa1,0x95,0x98,0xe7,0xc9,0x45,0x10,0xaf,0x4d,0xf4,0x29,0xf9, - 0xee,0x7f,0xad,0xbe,0x84,0x68,0x95,0xbd,0x18,0xc6,0x9b,0xce,0xac,0xc4,0x72,0x17,0x63,0x67,0x31,0x7b, - 0xc6,0x02,0x3d,0x53,0x98,0xc0,0xbd,0x32,0x3d,0x40,0x71,0xcc,0x49,0xb5,0x36,0x42,0x62,0xfc,0xf1,0x99, - 0x64,0xe8,0x90,0x26,0xa7,0x0f,0xa1,0xc9,0x6a,0xb1,0xdf,0x2d,0x0d,0xe0,0x18,0xe5,0x3d,0xaf,0x36,0x37, - 0x54,0xc1,0x35,0xaa,0xa5,0x02,0xef,0xa0,0xeb,0x2d,0x89,0x91,0x1e,0x26,0x02,0x4e,0xcb,0x30,0xf9,0x4d, - 0x29,0xb0,0x81,0x4c,0xa4,0x59,0x5d,0x96,0x8f,0x82,0x9f,0xe2,0x39,0x19,0xdf,0x65,0x24,0xd0,0x04,0x5d, - 0x3a,0x27,0xc5,0x13,0xda,0x9e,0x38,0xca,0x43,0x9d,0x8a,0x4e,0x5a,0xcf,0x76,0x79,0xeb,0xee,0xb2,0x68, - 0xca,0x07,0x08,0xc8,0xa2,0xfc,0x10,0xd9,0x44,0x7c,0x82,0x5c,0x1a,0xda,0x06,0xd0,0x7a,0xf8,0xe2,0xec, - 0xb5,0x54,0xe1,0x97,0x14,0xf6,0x2d,0xa7,0x0d,0xdf,0x76,0x44,0x24,0x4a,0x7a,0x29,0xbc,0x67,0x1d,0x29, - 0x38,0xb4,0x84,0x8e,0xb2,0xfe,0xe8,0x4d,0xcb,0x78,0xed,0xcd,0x23,0x60,0x4d,0x52,0xe5,0x28,0x19,0x7f, - 0xfc,0x9e,0xbe,0x22,0x4f,0x12,0xe9,0xd4,0xb3,0xc6,0x78,0x6b,0xc9,0xa1,0x44,0xfc,0x61,0x43,0x65,0x9e, - 0xa7,0xdf,0x2c,0x91,0xf6,0xf1,0x47,0x19,0x30,0x5e,0x5e,0x2a,0x44,0xdd,0x53,0x14,0x40,0x13,0x4c,0x3b, - 0xdd,0xfc,0x45,0xcb,0x49,0x7f,0x6b,0x12,0xce,0x11,0x40,0x61,0xf7,0x3a,0xa6,0x84,0xdb,0x95,0x94,0xe9, - 0x54,0xf7,0x53,0x2e,0xf2,0x1d,0x9d,0x79,0xbc,0x01,0xcb,0x40,0xeb,0xfe,0xde,0x5e,0xf7,0xb8,0xd7,0xee, - 0x1e,0x1c,0xb5,0x07,0xed,0xee,0x1e,0xca,0x85,0xd6,0xb5,0xe5,0xf1,0x1f,0x6f,0x96,0x77,0x61,0xa6,0x44, - 0x75,0xe6,0x96,0x4a,0x2b,0x56,0xe5,0xe6,0xc6,0x1f,0xdf,0x46,0xac,0xcd,0x87,0x76,0x65,0x15,0x11,0x38, - 0xff,0xeb,0x52,0x0b,0x5b,0x5c,0x66,0x6c,0x71,0x99,0x7f,0x55,0x1e,0x62,0x62,0xce,0xed,0x5d,0x95,0x29, - 0xb1,0xb6,0x9e,0x90,0x38,0xe3,0x9e,0xc9,0x3d,0x43,0x52,0x55,0x26,0x85,0x2a,0x8f,0x70,0x13,0x43,0x76, - 0x38,0xc5,0xa0,0x3e,0xca,0x97,0x04,0x4c,0x7c,0xc2,0xb1,0xd7,0x70,0xd6,0x59,0x8b,0x50,0x0e,0xd1,0x14, - 0xd1,0x32,0x63,0x9d,0x56,0x9e,0xa4,0x9a,0x58,0x67,0x7a,0x67,0x38,0x54,0xd8,0xcf,0xb2,0x12,0xc7,0xe3, - 0x0c,0x6f,0xb1,0xde,0x5c,0xfb,0x9e,0x1d,0x41,0x26,0xb7,0x0b,0x45,0xbf,0x0b,0x37,0x6c,0x23,0xdf,0x80, - 0x0b,0x8e,0x83,0x10,0xe8,0x97,0x0e,0x05,0x0f,0xb1,0xa9,0x2f,0xd3,0x74,0x6e,0xbb,0xc2,0x60,0xbb,0x90, - 0xd1,0xf9,0x2d,0xee,0x8f,0x8e,0x0d,0xbc,0x6a,0x45,0x86,0x55,0xc0,0xe1,0x0d,0xbb,0x8e,0xd0,0xa9,0x6b, - 0xb7,0x6e,0x5e,0x96,0x62,0xa4,0xb0,0xb3,0x5c,0xae,0xda,0x4c,0x72,0x90,0xde,0x21,0xdf,0x35,0xb2,0xef, - 0x7c,0x27,0x03,0x03,0xd0,0x87,0x26,0xbe,0x30,0x9b,0x31,0x43,0xce,0xad,0xc4,0x1e,0x32,0x05,0x43,0xfe, - 0x30,0x19,0x11,0xab,0xc4,0x9e,0x3b,0xbe,0xf9,0x7d,0x42,0x44,0xa8,0xf4,0xf8,0xbb,0xf2,0x73,0xdc,0xbe, - 0xa1,0x1d,0x2c,0xc2,0x66,0xc5,0xa7,0x61,0x36,0x2d,0x23,0xa5,0xa2,0x1f,0xe7,0x93,0x2f,0xc0,0x41,0xdd, - 0xdf,0x77,0x28,0xc9,0x4f,0x91,0x16,0xe1,0x4c,0xde,0xe9,0xae,0x04,0x03,0xa3,0xd0,0x55,0x59,0xa9,0x0a, - 0x61,0xad,0x41,0xdf,0xf0,0x63,0xb5,0xd5,0x9b,0xdc,0x46,0xa4,0x73,0x0a,0xdf,0x4c,0xf6,0xc2,0xc7,0xed, - 0xe3,0x91,0x73,0x0d,0x5c,0x2b,0x65,0xa2,0xb7,0x5d,0x56,0x90,0x6a,0xef,0x85,0xdf,0x82,0x58,0x5f,0x73, - 0xf9,0x68,0xaa,0x7f,0x36,0x9e,0xd5,0x89,0xd0,0xe5,0x4d,0x41,0x1d,0x73,0x13,0x4f,0x2d,0xd4,0xf4,0x52, - 0xaa,0x0e,0xf4,0xb3,0xb0,0x84,0x32,0x55,0x7e,0x2f,0xdc,0x35,0x6f,0x5e,0x22,0x52,0x8d,0xe7,0x79,0x25, - 0xdb,0x04,0x52,0xce,0x3f,0x01,0xad,0x46,0x96,0x11,0x43,0xf2,0x84,0x0e,0x01,0xc9,0x36,0x51,0xac,0x44, - 0xdc,0x2c,0x66,0x45,0x3c,0xc7,0x2e,0x3b,0x1a,0xf5,0xae,0xd4,0x29,0xa8,0x5f,0x66,0xfd,0x99,0xd5,0x1f, - 0x4e,0xb3,0x14,0x75,0xf9,0xa1,0x48,0x6b,0x9a,0xb4,0x09,0xb2,0xab,0xc6,0xc2,0x1e,0x92,0x85,0xbd,0xac, - 0x3a,0x34,0x67,0x45,0xa8,0x32,0x89,0xef,0x6e,0x75,0x7e,0xe5,0x10,0xbf,0xc0,0x5e,0xd6,0x89,0x4d,0x5c, - 0xe2,0x20,0x97,0x8a,0x75,0x64,0xde,0x4f,0xf2,0x5f,0x23,0x0c,0xa6,0x7c,0x57,0xae,0xf3,0x2c,0x88,0x47, - 0x31,0x67,0xc8,0xe6,0xfb,0x43,0xa5,0x89,0x67,0x7d,0x14,0x08,0xc8,0x58,0x60,0x3c,0x4b,0xc7,0x7e,0x08, - 0xe7,0x6c,0x86,0x94,0xa9,0x0e,0x3b,0x9a,0x49,0xc5,0x89,0xd4,0xe8,0xe8,0xc9,0xef,0xd0,0xe4,0x7b,0x94, - 0x8b,0x59,0xaa,0xba,0x60,0x04,0xce,0x10,0x91,0x0d,0x03,0x0a,0x59,0x83,0x24,0x3d,0x62,0xeb,0x35,0xfe, - 0xe5,0x5f,0xfe,0x99,0xa7,0x91,0x5b,0x53,0x11,0x9f,0x93,0x06,0x5f,0x55,0x39,0x2a,0x7f,0xf9,0x97,0xff, - 0x44,0xb9,0x3b,0x24,0x8d,0x50,0xbc,0x80,0x7a,0xee,0xdb,0x0f,0x59,0xec,0xae,0x48,0x9a,0x69,0x83,0x9f, - 0xf1,0x00,0x44,0x4d,0x11,0xbb,0x3a,0x07,0xf4,0x6c,0xfd,0x39,0x92,0x99,0x13,0xa7,0xa9,0xe4,0x14,0x76, - 0x1d,0xc2,0x0a,0xb0,0x07,0x62,0x83,0x6e,0x73,0x56,0x83,0x6e,0xc1,0xd2,0xc8,0x5a,0xac,0xaa,0x6e,0x16, - 0x21,0x88,0x35,0x7d,0xdc,0x7e,0x59,0xc2,0x66,0xcb,0xf7,0x57,0xbd,0x9e,0xce,0x1f,0xd4,0x92,0x72,0x65, - 0x62,0x82,0x4e,0xef,0x61,0x11,0xbe,0x43,0x9c,0x8a,0xcb,0x28,0xe3,0xf3,0x8f,0x9c,0x1d,0x37,0x6a,0x82, - 0x5c,0x55,0x1a,0xca,0x5a,0x27,0x6e,0x79,0xa1,0xc3,0x0a,0xf5,0x08,0x3a,0x9c,0x8c,0x31,0x6f,0xa3,0x4f, - 0x41,0x67,0x58,0x73,0xfb,0xd1,0x4b,0x55,0xfb,0x0a,0xaa,0xf5,0x5f,0xd8,0xf0,0x0b,0xac,0x83,0x70,0xbc, - 0x11,0x70,0x1e,0x4a,0x1d,0x41,0x2d,0x18,0x4d,0xe3,0x2c,0x68,0xc4,0x91,0xa1,0xac,0x76,0x65,0x6d,0x68, - 0x2c,0x24,0x49,0x20,0xea,0x21,0xad,0x69,0x96,0xca,0x71,0xa5,0x8e,0x31,0xd7,0x46,0x6a,0xd5,0x97,0x56, - 0xab,0xe6,0x9d,0x11,0xcd,0xb8,0x23,0xde,0x5d,0x43,0xe4,0x13,0x37,0x76,0x1e,0xa2,0x97,0xde,0xa6,0x9c, - 0xf3,0x12,0x22,0x14,0x8f,0x40,0xf3,0xb5,0x12,0x80,0x02,0x27,0xdc,0x88,0x1a,0x48,0x8c,0x89,0x62,0x8e, - 0xa7,0xbb,0x2c,0xf7,0x6b,0xa3,0x44,0x19,0x0e,0x8a,0xe8,0x5c,0xdc,0xc8,0xad,0xc1,0x7b,0x94,0xee,0x47, - 0xe4,0x0d,0x44,0x35,0x8f,0xc2,0x6c,0x72,0x5d,0xd6,0x68,0xd1,0x3b,0xf2,0x41,0xdd,0x84,0x6a,0x1e,0xe1, - 0xe2,0x0a,0x56,0xe4,0x28,0xaa,0x58,0x2c,0xa4,0x3e,0x19,0x93,0x0d,0xcc,0x74,0x0e,0xea,0x49,0x05,0x27, - 0x9a,0x1a,0xa4,0x2e,0xed,0xbc,0x37,0xd7,0x6e,0x97,0x42,0x4b,0xb8,0x37,0xb0,0x9c,0xb1,0x37,0xd3,0xc0, - 0x3a,0x40,0x9c,0xbd,0x17,0x4f,0x5f,0x7f,0x7f,0xe6,0x08,0xa7,0x3d,0x4f,0xae,0x44,0xfb,0x1f,0xe6,0xf4, - 0x4f,0x04,0xff,0x5e,0xc5,0x97,0x0e,0xbf,0x48,0x7b,0xcb,0x13,0x57,0x58,0x97,0x98,0x07,0xd3,0x5a,0x98, - 0x0c,0x17,0x18,0xce,0x2b,0x76,0x31,0xec,0x0a,0x2a,0x3f,0xb8,0x65,0xf0,0x6a,0xbb,0x08,0xc7,0x94,0xd9, - 0x2f,0xe8,0xc0,0xc5,0xdf,0x1c,0x1b,0x6c,0x6e,0x03,0x05,0xf2,0x50,0x2d,0x82,0xf3,0xf3,0xb8,0xb2,0x23, - 0x6b,0x8b,0x80,0x16,0xc8,0x6e,0x91,0xa6,0x33,0x03,0xe5,0x35,0xc1,0x24,0x02,0x17,0xe2,0xbc,0x79,0x61, - 0xc8,0xa1,0x34,0x35,0xb1,0x3d,0x4f,0x03,0x3b,0x2c,0x57,0x7d,0x04,0x5f,0x94,0x0c,0x83,0xe4,0xb7,0x4c, - 0x9b,0xae,0xfb,0xf6,0x27,0x78,0x92,0xd4,0x57,0xac,0x34,0x49,0x57,0x26,0x4f,0x92,0x2a,0xc5,0xfa,0x3c, - 0x98,0x5a,0xaf,0x5c,0xb5,0x5e,0x59,0x8b,0xf1,0x2e,0x27,0x43,0x51,0xfc,0x53,0xe9,0x53,0x94,0xd5,0x66, - 0xfd,0x77,0xa0,0x88,0xfa,0x88,0x92,0xa7,0xec,0xbc,0x4b,0x24,0x5b,0x61,0x0f,0x9f,0x8d,0x1f,0x1c,0x8c, - 0x40,0x95,0x32,0xb0,0x1c,0x1e,0x78,0xff,0xf8,0xef,0x35,0xf0,0xe6,0x86,0x91,0x99,0x64,0x11,0xdb,0x35, - 0xd7,0xb6,0x98,0x4b,0x55,0x1b,0x2d,0x7d,0x22,0xf6,0xa2,0x69,0x0c,0x4b,0x57,0xea,0x91,0xe9,0x37,0x61, - 0x18,0xea,0x86,0x78,0x9e,0xad,0xa7,0xbb,0x46,0xba,0x8c,0xc6,0x84,0xbb,0x85,0xad,0x9a,0x10,0xc9,0x05, - 0xd0,0x4f,0xd4,0xa5,0x37,0xe1,0xf6,0x41,0x07,0x42,0xca,0x44,0x80,0xbe,0xc8,0x75,0x7b,0x31,0x63,0x99, - 0x5b,0xc0,0x7d,0x5c,0x18,0x4b,0xeb,0x5d,0x42,0xb7,0x46,0x1d,0x8c,0x47,0x4c,0x94,0xc9,0x18,0x43,0xec, - 0x23,0x74,0xab,0xde,0xd9,0x59,0x9c,0x47,0x17,0x98,0x20,0x5c,0xb9,0x9f,0x1b,0x1b,0xae,0xe5,0x99,0x5d, - 0xc6,0x2c,0x2f,0x27,0xfd,0x84,0x06,0xa6,0x4a,0x95,0xa7,0xb3,0x27,0x54,0x32,0x97,0x6b,0x8f,0x36,0x72, - 0xbe,0xae,0xe4,0x28,0x09,0x2b,0x02,0x99,0xe6,0x73,0x53,0x95,0x4a,0xda,0x71,0x1a,0x58,0xa3,0x76,0xbb, - 0xad,0xde,0x84,0x2a,0x50,0x05,0x77,0xb9,0x1e,0x1f,0x36,0xd5,0x72,0x60,0x3c,0x1d,0x93,0xbb,0x36,0x6e, - 0x28,0x86,0x8c,0x15,0x0f,0x24,0x86,0x77,0xba,0x12,0x37,0x37,0x21,0x0f,0x37,0xae,0x05,0x31,0xef,0xf9, - 0x8a,0x62,0x56,0x3e,0x3a,0x99,0x50,0x10,0x8e,0xaf,0xb7,0x3e,0x2a,0xa3,0x2b,0x27,0xdf,0x95,0x35,0xe8, - 0xad,0xd6,0xac,0x9a,0x8d,0x2b,0x69,0x0c,0x05,0xde,0x70,0x7a,0x2b,0xf2,0x0c,0xc7,0x62,0xd5,0x1f,0x90, - 0xb5,0xb2,0xd2,0x0a,0x45,0x0e,0xac,0x9c,0xa4,0xe6,0x01,0xc9,0x79,0xd8,0xef,0x8b,0xa0,0x1a,0xa4,0xaf, - 0x4d,0x0a,0xcb,0x44,0xe7,0xd8,0x21,0x98,0x35,0xce,0x30,0xe8,0x68,0xe7,0x97,0xa5,0x67,0xa7,0x20,0x2b, - 0x89,0x73,0x13,0x0c,0xfe,0x2f,0x89,0x73,0x61,0x63,0x46,0xbe,0x8d,0x92,0x59,0xb6,0x37,0x59,0x2b,0x99, - 0xc1,0xf3,0x75,0x92,0x59,0x59,0x0f,0x04,0xc7,0xad,0x12,0x0c,0x99,0x5f,0xd6,0xe2,0x55,0xb6,0x46,0x2c, - 0x9b,0x90,0x36,0xbc,0x49,0x73,0x26,0xb9,0x81,0x16,0x79,0xdc,0xe4,0x7a,0xdd,0x7b,0x30,0x37,0x37,0x6e, - 0x35,0x33,0x19,0x92,0xc2,0x17,0x09,0x9e,0x4e,0x69,0xf6,0x05,0xa1,0x4f,0xea,0x03,0x3e,0xc5,0xd7,0x36, - 0x98,0xd2,0x0c,0xb8,0x73,0x3d,0xef,0x88,0xf1,0x25,0xfe,0xa1,0x7d,0xfe,0x63,0xfb,0xa2,0xf5,0x4b,0xf6, - 0x28,0x0e,0x83,0x3b,0x9d,0x97,0x12,0x1a,0xad,0x7e,0x3b,0x42,0x4d,0x25,0xde,0xd5,0xd3,0x2a,0x16,0x9c, - 0xd5,0x10,0x6f,0xca,0x9f,0xce,0xf2,0x3c,0xd2,0x31,0x86,0x34,0x9a,0x8d,0xc9,0x4d,0x9c,0x65,0x73,0xfe, - 0x10,0x8d,0xdc,0xcd,0x09,0x47,0x92,0x46,0x90,0xeb,0x9f,0xe0,0x6d,0x3d,0xe6,0x11,0x7b,0x31,0x36,0x07, - 0xb1,0xe0,0x48,0xee,0x72,0x06,0x27,0x60,0x25,0x70,0x27,0x91,0xa3,0x07,0x10,0x00,0xd9,0xc8,0x25,0xeb, - 0xc1,0x65,0x04,0x4b,0x43,0x5c,0xdb,0x5c,0xf9,0xd1,0xc4,0x37,0x57,0xa8,0x83,0xcf,0x26,0xbe,0xdc,0x56, - 0x6b,0x91,0x17,0x5b,0xce,0xe8,0x13,0x6e,0x4a,0x6a,0x1c,0x21,0xf9,0x29,0x36,0x54,0x84,0xb3,0x42,0xe5, - 0xb8,0x90,0x8e,0x01,0xe8,0x97,0xf3,0xd3,0x17,0xdc,0x93,0x14,0x0c,0xa5,0x9d,0xd4,0xa3,0x55,0x3d,0xc2, - 0x13,0x59,0x42,0xba,0x97,0x3a,0x25,0x63,0xa9,0x94,0x47,0x5e,0x3c,0xb9,0xcc,0xd2,0x1b,0x3a,0x9f,0x97, - 0xc2,0xf9,0x8e,0xb2,0xcf,0x71,0x47,0xb3,0x15,0xb9,0x42,0x6e,0x48,0xbb,0xd8,0x80,0xaa,0x9b,0xe9,0x8d, - 0x90,0xc8,0xa7,0xd7,0x61,0x3e,0x4f,0xe7,0x8b,0x39,0x7c,0xf5,0x26,0x4a,0x16,0x6b,0xb0,0xb3,0x9d,0xbf, - 0xfc,0xbb,0xff,0xea,0xa0,0xae,0xa0,0xa4,0x2b,0xac,0xa3,0x49,0x14,0x54,0x8f,0xcc,0x9b,0xa4,0x92,0x1d, - 0x89,0xec,0x61,0x60,0xb4,0x4b,0xa9,0x6e,0x58,0x41,0xca,0xed,0xd1,0x43,0x25,0xa4,0xd3,0xc4,0x60,0xe3, - 0x7d,0xd5,0x4b,0xc9,0x07,0xf0,0x3d,0xe0,0xa3,0x1f,0x62,0x90,0x98,0x3d,0xc8,0x02,0x9c,0xa4,0x05,0xec, - 0x29,0x56,0xf8,0xe6,0xe8,0x80,0x04,0x6d,0xf2,0x13,0x41,0x10,0x9d,0x0e,0x0d,0xf0,0x74,0x91,0xd1,0xd3, - 0x57,0xb9,0xdf,0x8f,0xfa,0x48,0x4c,0xe1,0x10,0x42,0x53,0x8a,0x65,0x4d,0xbf,0x66,0xe9,0x62,0x3d,0x09, - 0x50,0x7e,0xb3,0xb3,0xb2,0x0d,0x78,0x85,0x74,0x6a,0xeb,0x80,0x51,0xa8,0x5b,0x31,0x3f,0xca,0xbd,0x29, - 0xc5,0xcc,0x54,0xca,0x79,0xa8,0x21,0xef,0x0d,0xb3,0xac,0x73,0xd4,0xbd,0xa9,0x57,0x4b,0xa8,0x5c,0x3a, - 0xa8,0xbe,0x4d,0x88,0x56,0x38,0x44,0xed,0x82,0xcc,0xc6,0xd5,0x2f,0x9f,0x97,0xe6,0xfc,0x02,0x51,0xcb, - 0x77,0x76,0x8a,0x87,0xad,0x0b,0x61,0x96,0xd2,0x72,0xf3,0x62,0x22,0x70,0x74,0x13,0x38,0xcd,0x02,0xb5, - 0x6d,0x6b,0x2a,0x31,0xf4,0xa3,0x6a,0xae,0x0b,0x96,0xbe,0xb0,0xaf,0x94,0xf2,0x67,0xe9,0xdf,0x55,0xef, - 0x08,0x93,0xbb,0x20,0x19,0x29,0x17,0x8c,0x90,0x07,0x3d,0x45,0xce,0x17,0x9b,0xe9,0x6f,0x0a,0xba,0xd4, - 0x25,0x45,0xb8,0x6c,0x52,0xb3,0xf1,0x70,0x5b,0xcd,0x41,0x9d,0x9b,0x2b,0x99,0x55,0x47,0xba,0x0c,0xcf, - 0x19,0x5e,0x16,0xd3,0xac,0xa3,0x28,0x1c,0x68,0x9a,0x54,0x06,0x05,0xd6,0xcc,0x6e,0x33,0x75,0xd2,0x6c, - 0x31,0x4e,0x37,0x67,0xdd,0x05,0x42,0xe3,0xaa,0xbc,0x79,0x6d,0x78,0xc5,0x6b,0xa6,0x93,0xb2,0x40,0x3e, - 0x5b,0x5c,0x6d,0xe2,0xf8,0x6b,0x03,0xcb,0x9b,0x13,0xa5,0x78,0x96,0x3e,0x7c,0xea,0x9d,0x3e,0xad,0xac, - 0x36,0x62,0x31,0x9c,0x65,0x4c,0x80,0x45,0x42,0x74,0x32,0x95,0x03,0x40,0x98,0xfd,0x1c,0x61,0x99,0x88, - 0x58,0x5c,0xb1,0x4d,0x57,0xb5,0x6b,0x74,0x1e,0xf2,0xb9,0xcd,0xbe,0x16,0x6a,0xd0,0xb4,0xd5,0x82,0x36, - 0x7d,0x88,0x5c,0x7d,0xc9,0x1b,0x86,0x4b,0xc3,0x08,0xe0,0x90,0x42,0xcd,0x77,0xf2,0x9c,0xf5,0x43,0x7b, - 0xf7,0xaa,0x5a,0x39,0x0b,0xc9,0x95,0xbb,0x21,0xab,0x24,0x0e,0x2d,0xa6,0x99,0x85,0x15,0x50,0xd8,0x09, - 0x25,0x8d,0x15,0x01,0x96,0x46,0x14,0xcd,0x4b,0xe9,0xd6,0x84,0xfd,0x54,0xb6,0xc2,0x14,0x48,0xc8,0x51, - 0xfc,0xc2,0xff,0xf9,0x19,0x2b,0x97,0xc3,0x04,0x57,0xe0,0x85,0x8f,0x99,0x0c,0x4b,0xf2,0xd1,0x03,0x8e, - 0x47,0xa1,0x2c,0xa2,0xea,0x24,0x6c,0x9e,0xe0,0xa9,0xb1,0x36,0xf2,0xfa,0xe5,0x1c,0x32,0x4d,0x6e,0x48, - 0x4a,0x73,0x64,0x7d,0x5d,0x7e,0xaa,0x29,0xf1,0xcb,0xd5,0x46,0xe6,0x09,0xf9,0x78,0xb2,0xaa,0xb1,0x5e, - 0x79,0x86,0x6a,0xc0,0x32,0x59,0xfa,0xe6,0x1c,0x1b,0x1d,0x98,0x46,0x5f,0x7c,0xe3,0x8d,0x4c,0x30,0x6f, - 0x49,0xdb,0x52,0xde,0x9d,0x48,0xe4,0x50,0x4f,0x10,0x37,0xcb,0xf9,0xbb,0x58,0x60,0x97,0x4d,0x36,0xe8, - 0x76,0xda,0xa0,0x73,0x80,0x87,0xf8,0x04,0xed,0xa5,0x8a,0x9c,0x4c,0x36,0x6b,0x44,0xaa,0x59,0x80,0x56, - 0x92,0x78,0x4c,0xdf,0x4d,0x47,0xaf,0x92,0x6c,0xd0,0x2d,0x6b,0xb9,0xa8,0xc0,0xc6,0x30,0x65,0xc4,0xd4, - 0xd2,0x81,0x52,0x82,0x84,0xe3,0x5d,0x3c,0xc0,0xa2,0x66,0x55,0x4e,0x41,0x40,0xff,0x8d,0xe8,0xf2,0x08, - 0x16,0x0f,0xa5,0xd0,0x0d,0x46,0x9d,0x1b,0x49,0x84,0x75,0xa1,0x44,0x6b,0x3e,0xa0,0xee,0xd6,0x84,0x62, - 0xf3,0x05,0x89,0x6f,0xd5,0x2c,0x36,0xd3,0x96,0x80,0x63,0x70,0xfc,0x05,0xc6,0x04,0x13,0xb7,0x8b,0x0d, - 0x18,0xe9,0x08,0x94,0xda,0x5c,0xa8,0x34,0xb6,0xea,0x2c,0xe3,0x3c,0x6d,0x04,0x15,0x64,0xe5,0x65,0x4a, - 0x5a,0x5d,0xef,0x57,0x0b,0x2d,0xd3,0x52,0x19,0x04,0x1b,0x2a,0x15,0x51,0xcf,0x77,0x4b,0x65,0xbf,0x4b, - 0x6f,0xcc,0x8c,0x81,0x2c,0xef,0x9c,0x26,0x53,0x73,0x6d,0xde,0x61,0x38,0x2f,0xfc,0x07,0x93,0xd7,0x35, - 0x27,0x78,0xba,0x76,0x0b,0x5a,0xd5,0x98,0x82,0x17,0x2e,0x3a,0xcd,0xb9,0x9e,0xa4,0xa2,0x12,0x3b,0x7f, - 0xe3,0xda,0x10,0x8c,0xab,0x91,0x61,0xb7,0xcc,0x51,0xdf,0xa8,0xbb,0xba,0x9e,0x66,0x35,0x6b,0x7f,0xd5, - 0x0e,0xc7,0x6a,0xd6,0x0d,0x5a,0x99,0x18,0x17,0x09,0xb9,0x1c,0x85,0x8d,0xe0,0xfc,0x57,0x28,0x17,0x4a, - 0x5a,0x02,0x4b,0x81,0x0c,0x51,0x0d,0x8c,0x1e,0x7d,0x69,0x89,0xd4,0x7e,0xa1,0xe4,0xd6,0xe8,0xbc,0x73, - 0xc1,0x07,0x80,0x75,0xab,0x7b,0xe1,0x49,0x5a,0x61,0x29,0xa8,0xd9,0x5f,0x2b,0xfe,0x14,0x21,0x85,0x47, - 0x0c,0x0b,0x03,0x0d,0xb1,0xf7,0xc3,0xfc,0xee,0xe5,0x72,0x6f,0xc1,0x01,0x61,0xe5,0xe8,0x67,0x56,0xa0, - 0xd8,0xc6,0x4e,0xfb,0xf8,0xc1,0x30,0xaf,0x3b,0xe5,0x9b,0x7e,0x4e,0x0a,0x8e,0x09,0x4a,0x8f,0xdf,0x03, - 0xfd,0xcc,0x2f,0x44,0xb6,0xd2,0x25,0x92,0x43,0xb3,0x9a,0x5a,0x95,0x20,0xda,0xa4,0xd3,0xa0,0x62,0x9e, - 0x2f,0xc6,0xd1,0xe7,0x10,0xfd,0x25,0x1b,0xd5,0xcc,0xf0,0x58,0x66,0x8f,0x43,0xa8,0x83,0x38,0x03,0x41, - 0x70,0xbb,0xa3,0x4d,0x7d,0x2b,0xfd,0x77,0xe2,0xe9,0x98,0xcf,0x56,0xaf,0xc6,0x88,0x2b,0xe1,0x42,0xe7, - 0x04,0xad,0x7e,0x54,0x3d,0x50,0x90,0xa6,0x62,0xc2,0xa2,0x42,0xd8,0x60,0x78,0xa1,0x61,0xa3,0x28,0x8a, - 0x06,0xb5,0x50,0xee,0x2d,0xd7,0x71,0xea,0x93,0x66,0xc6,0x77,0x6d,0x52,0xb5,0x54,0x69,0x85,0x1b,0xb2, - 0xa8,0x4d,0x88,0x05,0x4b,0x1f,0xe8,0x3f,0xba,0xdd,0x34,0x4b,0xd2,0xf4,0xa3,0x99,0xea,0x46,0x06,0x35, - 0x4e,0xa0,0x50,0x6c,0xf8,0x53,0x43,0x98,0x45,0x39,0xc6,0x00,0x26,0x21,0xfa,0x60,0x7d,0x06,0x3f,0xf1, - 0x56,0xce,0xa2,0x0c,0x3c,0x48,0x6b,0x32,0x4a,0xd5,0x11,0x23,0xa4,0x2c,0x06,0x4f,0x66,0xe9,0x58,0x9f, - 0xd6,0x61,0xb0,0xf7,0x03,0x6a,0xf4,0x7f,0xb9,0x17,0xf3,0xda,0x96,0x0f,0x60,0x85,0x49,0x8d,0xc5,0xcd, - 0xd5,0xbb,0xf4,0xd7,0xe4,0x72,0xa8,0x0d,0x46,0xd0,0x98,0xb3,0xc5,0xf8,0x26,0xc6,0xf0,0xbe,0xac,0xa4, - 0x46,0x14,0x8a,0xc9,0x42,0x41,0xcf,0xf0,0x89,0x08,0x47,0x8e,0x76,0xda,0x79,0x4c,0x5a,0xe0,0x51,0x89, - 0x45,0x64,0xc1,0xd5,0x12,0xaa,0xd0,0x9f,0xf8,0x85,0xe6,0x39,0x55,0x52,0x83,0x9c,0x0a,0x0b,0xa3,0x47, - 0xc1,0x7e,0x7c,0x17,0x22,0x74,0x91,0x27,0xec,0xda,0x6b,0xe7,0x3f,0x53,0x06,0xaa,0xcc,0x8a,0xea,0x99, - 0xd8,0xe8,0x2e,0xd1,0x67,0x98,0x60,0x99,0xc8,0x2c,0xd7,0x61,0xe4,0xf1,0x84,0xee,0xe7,0xc8,0x5f,0x4e, - 0xc7,0x53,0xe9,0x04,0x55,0x72,0xf2,0x80,0xfb,0xac,0xaa,0xae,0xb8,0x78,0x48,0xe7,0x72,0x7c,0x06,0xf2, - 0xd6,0x3c,0x13,0x9a,0xff,0x35,0xbc,0x6f,0x39,0xed,0xb7,0x44,0x05,0xb6,0xb3,0xea,0xa2,0x6d,0x39,0xb6, - 0xf9,0x19,0x84,0xe5,0x2b,0x39,0x84,0x40,0x65,0xc5,0xcb,0xf4,0xea,0x2a,0x9a,0xbe,0xb0,0xd8,0x3b,0xa3, - 0x12,0x2a,0xa1,0xf3,0xa8,0xde,0x26,0xa4,0x2d,0x45,0x44,0x65,0x46,0x47,0x92,0x17,0x32,0x73,0x30,0x1e, - 0x2f,0xa3,0x52,0x07,0x31,0xc0,0x38,0xd6,0x5d,0x4c,0x9a,0xba,0x18,0xad,0xec,0x22,0x1b,0xe3,0x4d,0x7d, - 0x08,0x1d,0xc3,0xbc,0xa7,0xac,0x90,0xea,0xbb,0x4a,0xdf,0xa5,0x16,0x1c,0xcb,0x86,0x81,0x51,0xaa,0xe9, - 0x27,0x29,0x9c,0x07,0x61,0x52,0x76,0x58,0x8b,0x68,0x9d,0x8c,0xb8,0xe9,0xd3,0xc5,0x5c,0x6a,0xf2,0xf8, - 0xb6,0x5f,0xf5,0x49,0xd7,0xfa,0xb9,0x8a,0xf5,0x82,0xdc,0xc8,0x84,0xc2,0x53,0x7a,0x17,0x65,0x37,0xf9, - 0xc3,0x0d,0x18,0xd3,0x31,0xfa,0x49,0xe6,0x94,0x54,0xbd,0x6a,0xeb,0x56,0x54,0x2e,0x5b,0x7f,0x40,0x67, - 0x92,0x2c,0xae,0x22,0x18,0x5e,0x13,0x9d,0xcc,0x44,0x2a,0x59,0xca,0x8a,0x01,0x91,0x7d,0xe2,0xec,0x43, - 0xc0,0xb2,0x0c,0x19,0x92,0x93,0xe9,0x44,0xaa,0x55,0x1d,0x36,0x7b,0x59,0xd0,0xa6,0xcf,0xf3,0x52,0xe8, - 0x57,0x51,0x8a,0x75,0x5e,0x2f,0x21,0xc8,0x08,0xed,0x62,0x5d,0xbc,0x4a,0x51,0x09,0x78,0x56,0xd4,0xab, - 0x20,0x4f,0x0d,0x57,0x31,0xc5,0x55,0xaa,0x85,0x04,0xcb,0x22,0x55,0xd2,0x21,0x1c,0x1b,0xf3,0xec,0xc9, - 0x87,0xf7,0x6f,0x5f,0x7e,0x78,0x76,0xfa,0xfc,0xe4,0xfd,0xcb,0x77,0x16,0x16,0x0b,0xb9,0x64,0xb6,0xa7, - 0xd1,0x1e,0xb1,0x0d,0x7b,0x8e,0xc0,0xd2,0x27,0x6f,0x5e,0x3c,0xb0,0xb8,0xb1,0x02,0x4d,0x2e,0xaf,0x70, - 0x6d,0x10,0x7a,0x09,0x87,0x04,0x17,0x12,0xb3,0xdf,0x86,0x54,0x20,0xd8,0x91,0xa2,0x01,0xef,0x03,0x81, - 0xd7,0x94,0x19,0xdf,0xc1,0x7e,0x50,0x7c,0xb8,0xec,0x81,0xb6,0x9d,0xd1,0xb9,0x29,0xbf,0x24,0xdd,0x49, - 0x5f,0xa8,0x67,0xdc,0xf4,0x72,0x47,0x6d,0x9a,0xb8,0xe2,0x5d,0x7e,0xd8,0xd8,0x6f,0x7e,0x5b,0x0b,0xfd, - 0x18,0xa5,0xa6,0x47,0x02,0x91,0x66,0x2e,0x67,0xe9,0x6d,0xde,0xb6,0x10,0x68,0xcc,0xb8,0x20,0x15,0x02, - 0xb2,0x65,0x6c,0x7e,0x70,0xa3,0xde,0xbc,0x51,0xfd,0x96,0x1f,0xb1,0xb3,0xef,0x74,0x4c,0xf1,0xbc,0x1c, - 0xe5,0x5b,0x5d,0x87,0xd3,0xf1,0x4b,0x8a,0x8f,0xa0,0x63,0x57,0x15,0x35,0xf6,0x15,0x7b,0x2d,0x5a,0x4d, - 0x28,0x43,0x1d,0x58,0x26,0x13,0xfa,0xf5,0x57,0x61,0x97,0xa8,0x75,0x1b,0x55,0xd6,0x6d,0x51,0xc1,0x19, - 0x19,0xea,0x7e,0xb9,0x05,0x2b,0xd0,0xd8,0x36,0xa3,0xad,0x2b,0x4c,0x9e,0x80,0x59,0x15,0xe4,0xb3,0x84, - 0x3c,0xea,0xfd,0x3d,0x5d,0xdf,0xc2,0x45,0xef,0x42,0x5c,0xc3,0x9f,0xfe,0x85,0xb8,0x44,0x58,0xaa,0x1c, - 0x7e,0x0f,0x2e,0xc4,0x18,0xf5,0xe4,0xf0,0x73,0xff,0x42,0x00,0xdb,0xe2,0xbb,0x58,0x9c,0xe3,0x62,0xf9, - 0x75,0x74,0x7d,0x2c,0x9b,0xed,0x10,0x8a,0x4a,0x05,0x9b,0xca,0x06,0xa9,0x95,0x36,0x1d,0x93,0xda,0x9d, - 0xd6,0x0b,0xdb,0x8a,0xec,0x11,0x6c,0xdc,0xcf,0x9c,0xc8,0x66,0x68,0x23,0xe7,0x29,0x07,0x5e,0x1e,0x1d, - 0xeb,0x28,0xb2,0xc3,0xf2,0x23,0x2b,0x16,0x9f,0x4e,0xac,0xa0,0x41,0x5b,0x21,0x6a,0xa9,0x6c,0xac,0xea, - 0x95,0x2f,0x89,0x5d,0x3b,0xac,0x25,0x06,0x0b,0x52,0x17,0x25,0xae,0x00,0xa7,0x50,0xae,0x61,0x87,0x70, - 0xa9,0xe7,0x59,0x8a,0xe1,0x45,0xb3,0xfb,0xfb,0x44,0xb2,0x23,0x70,0x3b,0x94,0x3f,0xf1,0xe6,0x22,0x8f, - 0x32,0x86,0x68,0x41,0x6c,0x71,0x86,0xf9,0x6b,0xc2,0x18,0x80,0x66,0xfd,0x3e,0x4b,0x93,0x2b,0x02,0xaa, - 0xb4,0x7c,0x84,0xad,0xa3,0x97,0x56,0xab,0x7c,0xb7,0x36,0x48,0xaa,0xef,0x86,0x9f,0xa3,0x8d,0x90,0x13, - 0x11,0x29,0x63,0x77,0x24,0x14,0x7c,0x6d,0x83,0xf5,0xc0,0x7b,0xd0,0xe2,0x9f,0x68,0xc8,0x7c,0xe7,0x09, - 0x82,0xb2,0x65,0xe8,0x11,0xbb,0x14,0x0d,0xd8,0x21,0x70,0x07,0x3e,0x30,0x81,0xe3,0x8b,0xf0,0x1a,0xbf, - 0x12,0x4c,0x84,0x60,0x86,0x6d,0xee,0xaa,0x3e,0x14,0xb0,0x88,0x24,0xdc,0x0e,0x86,0x2f,0x0e,0x3a,0x5d, - 0x8b,0x9f,0xba,0xbf,0x67,0x94,0x1f,0xed,0x2d,0xb4,0x71,0x38,0x24,0x6c,0xa7,0x41,0xed,0x27,0x7f,0xa9, - 0x06,0xec,0x36,0x2b,0x61,0x6d,0x99,0x91,0x70,0xd1,0xf1,0xb0,0x5a,0xbc,0xa3,0xd1,0x90,0x7e,0x29,0x51, - 0x8f,0x49,0xd5,0x48,0x0b,0x44,0xa2,0xe9,0x43,0x33,0x27,0x8b,0x0c,0xce,0xd4,0xe2,0x6d,0x8a,0x87,0xaf, - 0x07,0xfc,0xac,0x62,0xe4,0x9b,0xb0,0xe3,0xa2,0x9f,0x05,0x10,0x27,0xf3,0xb3,0x34,0xa3,0x82,0x6b,0x85, - 0xd3,0xb0,0xa6,0xb7,0x55,0xd9,0xdc,0xcc,0x09,0x54,0xd3,0xe6,0x49,0xb9,0x75,0x05,0xdf,0xd5,0xc0,0x71, - 0x2d,0xeb,0x94,0xf6,0x79,0x24,0x27,0x9a,0x0f,0xb5,0x41,0x67,0x60,0xe1,0x24,0x15,0x5b,0xe9,0xe5,0xb9, - 0x43,0xbe,0x40,0xce,0x3f,0xcc,0xaf,0x9c,0x0b,0x13,0xa2,0xc4,0x0b,0xb6,0xba,0x59,0x2d,0xfa,0x42,0xe4, - 0x85,0x53,0x97,0x23,0x49,0x95,0x4d,0x65,0x4f,0x4c,0x36,0x85,0xcb,0xc3,0x5e,0x70,0x72,0x33,0x8a,0xfd, - 0x08,0x42,0xb9,0x6e,0x04,0x34,0x84,0x76,0xaa,0x5c,0x46,0x04,0x53,0xb2,0x6c,0xc2,0x94,0x1a,0x60,0x7c, - 0x11,0x21,0x28,0xe2,0x71,0xf7,0x3e,0x09,0x15,0x2c,0x03,0xdb,0xd3,0x74,0xf3,0xe0,0x2e,0x7b,0x60,0x96, - 0xf8,0x1d,0x09,0x31,0x62,0x71,0x3a,0xe7,0xdd,0x6e,0xf7,0xa0,0xbf,0xdf,0x1b,0x74,0x8e,0x44,0xf7,0xe8, - 0xf8,0x78,0x30,0x38,0x1c,0x0c,0xba,0xa2,0xdf,0x19,0x1c,0xf7,0x7b,0xfd,0xc1,0x21,0xfc,0x3c,0xee,0x75, - 0x3b,0x9d,0xe3,0xfd,0xc3,0xbe,0x38,0x3e,0xe8,0x1e,0x1f,0x1d,0x42,0x79,0xd1,0xdd,0xef,0x1c,0x1d,0x1f, - 0x76,0x8e,0x8f,0xfb,0xa2,0x37,0xd8,0xef,0x43,0x0d,0x87,0x83,0x23,0xd1,0x3b,0x3a,0xec,0x1c,0x1e,0xf4, - 0x7b,0x3d,0x78,0xeb,0xa0,0x37,0xe8,0x1f,0x75,0x3b,0x47,0x1d,0xd1,0xef,0x76,0xf6,0x8f,0x8f,0x60,0xe3, - 0x88,0x83,0xce,0x61,0xaf,0xb7,0xdf,0x3b,0x84,0x4f,0x0d,0x7a,0x07,0x47,0x47,0x58,0x9b,0xe8,0x1e,0xf7, - 0xf6,0x3b,0x87,0x47,0xfd,0x23,0x78,0xbf,0x7b,0xd0,0x83,0x9f,0xbd,0xce,0x81,0xe8,0x1d,0x74,0x07,0x47, - 0x50,0xa2,0xd3,0x17,0xfd,0xde,0xe0,0xa8,0x07,0xef,0x61,0x55,0x47,0xfd,0xfd,0xfe,0x71,0x07,0xeb,0x1a, - 0x74,0xe0,0x5e,0x6f,0x70,0x78,0x38,0x80,0xb2,0x03,0x68,0x29,0xbc,0x08,0x1f,0x18,0x1c,0x41,0x0b,0x7a, - 0x47,0xe2,0xf0,0xb0,0xd3,0xdb,0x87,0xcf,0x42,0x53,0x7b,0x83,0x63,0x68,0x6e,0xb7,0xd7,0x83,0x56,0xef, - 0x43,0xbb,0xbb,0x07,0xc7,0xf0,0xf3,0xf8,0xf8,0xa0,0x73,0x30,0x38,0x3e,0x82,0x4f,0xed,0xef,0x0f,0x7a, - 0xbd,0xce,0xd1,0x51,0x0f,0x3a,0xd0,0xeb,0x1e,0xf5,0xa1,0xb6,0x63,0xd1,0x3b,0xde,0xef,0x41,0x99,0x23, - 0x18,0x97,0x3e,0x0c,0x40,0xbf,0xdb,0x3f,0xc0,0xc1,0xe8,0xf7,0x0f,0xf6,0x0f,0x61,0xa0,0xe0,0xe7,0xfe, - 0xd1,0x60,0x1f,0x7a,0xdc,0xed,0x8a,0x6e,0x17,0x06,0xe9,0x00,0x07,0xa3,0xdf,0x3f,0xea,0x0d,0xe0,0xf1, - 0xbe,0x38,0x38,0x38,0xe8,0x43,0x77,0x3b,0xfb,0xd0,0x94,0x3e,0x56,0xd5,0x85,0x8f,0xf6,0x8e,0x07,0x87, - 0x30,0x90,0x87,0xf0,0xb3,0x0f,0x83,0x09,0xdd,0x82,0x8a,0xa0,0x3d,0xfb,0xf0,0xd5,0xc3,0x4e,0x07,0x5a, - 0x75,0x04,0xef,0xc1,0x78,0x75,0x61,0x2c,0xb0,0x0b,0x30,0xb0,0x1d,0x1c,0x61,0x28,0x72,0xd0,0xe9,0x1f, - 0x8a,0xde,0x21,0xcc,0xcc,0xd1,0x3e,0x4c,0x09,0xb6,0xb5,0xd3,0xef,0xc0,0xd7,0xa0,0x29,0xbd,0xfd,0x63, - 0x78,0x70,0x04,0x35,0xf4,0xfb,0x83,0xfd,0xc3,0x03,0x18,0x16,0x6c,0x60,0x17,0xba,0xb8,0x7f,0xd4,0x3d, - 0x84,0xd9,0xe8,0x74,0xa0,0x11,0x47,0x9d,0x01,0x8c,0xdb,0x31,0x94,0xe8,0x1e,0x77,0xa0,0x8b,0x87,0xd0, - 0x71,0x78,0x01,0x6e,0x42,0x45,0x3d,0x68,0xe7,0x40,0xec,0x77,0x0e,0x8e,0x07,0x47,0x07,0xdd,0x03,0x71, - 0xb0,0x7f,0xdc,0x39,0xe8,0xec,0xef,0x1f,0x88,0xa3,0xa3,0xfe,0xf1,0xf1,0xe1,0xd1,0xe1,0xa1,0x38,0x86, - 0xda,0xfa,0xb0,0x14,0xa0,0xd1,0x30,0xcb,0x38,0x2b,0x5d,0x98,0xcb,0x7d,0x6c,0x3b,0x4c,0x1a,0x8c,0xf5, - 0xe1,0x00,0xca,0xf5,0x0f,0x0f,0x8f,0xa1,0x2b,0x30,0xd8,0x07,0x38,0x47,0xa2,0x87,0xad,0x84,0x66,0x77, - 0xf7,0x45,0x8f,0x3e,0xd3,0x81,0x81,0x13,0xbd,0x3e,0x0c,0x00,0x2c,0xbc,0x1e,0x4c,0xe0,0xa0,0x77,0x34, - 0xe8,0x43,0xab,0x07,0xd8,0xa6,0x03,0x68,0x47,0x17,0x16,0x46,0xbf,0x07,0x13,0xdd,0xef,0x0e,0xa0,0xb2, - 0x7e,0xbf,0x07,0xcb,0x11,0x46,0xf1,0x08,0x58,0x09,0x58,0xb3,0xf0,0x81,0x4e,0x1f,0xbe,0x0a,0x03,0xde, - 0x85,0xe5,0xda,0x1f,0x40,0xad,0xa2,0xdb,0xe9,0xe2,0xda,0x80,0xca,0x04,0xf5,0x85,0x56,0x02,0x34,0x14, - 0x56,0xc1,0x71,0xbf,0xdb,0x85,0xfe,0xc2,0x28,0xe0,0x90,0xc3,0x17,0x71,0xe2,0xfa,0x03,0x18,0x5d,0x68, - 0xfd,0xa0,0x3b,0x80,0x01,0xed,0x01,0xc3,0x11,0x56,0x41,0x87,0x0e,0x06,0xdf,0x1a,0x5c,0x5f,0x93,0xed, - 0xeb,0xd8,0xdb,0x3b,0x18,0x90,0x24,0x24,0x23,0xe9,0x11,0x43,0x8d,0x9f,0x5d,0x04,0xdd,0xde,0x91,0x3e, - 0x2e,0x65,0x54,0x54,0x88,0xf4,0x13,0x08,0xc3,0x78,0x71,0x79,0x19,0x65,0x98,0x04,0x07,0x41,0xc3,0xe1, - 0x33,0xfd,0x9e,0xab,0x9c,0x83,0x76,0x8f,0x04,0x7d,0x0a,0xd8,0x50,0x64,0x32,0xe4,0xdd,0x3d,0xd8,0x5b, - 0xb0,0xa9,0x60,0xf1,0x28,0x64,0x80,0xea,0x6b,0x03,0x71,0xf4,0xad,0x2a,0x6d,0x10,0x23,0x54,0x3f,0xfa, - 0x3d,0xd5,0x11,0x34,0xa3,0x2b,0x7f,0x99,0xc7,0x8f,0x1f,0x17,0xf7,0xd1,0xa3,0x47,0xfd,0xde,0x6e,0x51, - 0x81,0x1e,0x54,0xf5,0x0e,0xa3,0x56,0x00,0x2f,0xdd,0xa9,0xa7,0x05,0x42,0x2e,0x3d,0xea,0x1e,0x0c,0x8b, - 0x56,0xcb,0xcb,0x31,0x44,0x2d,0x46,0x0c,0x06,0xd9,0x9a,0xa8,0x35,0xf8,0xb6,0x84,0x62,0x08,0x05,0xa3, - 0x47,0x07,0x03,0xc2,0x31,0xd4,0xb4,0x26,0x3f,0x8f,0x76,0xbb,0xfb,0x38,0x83,0xf8,0xab,0x77,0x31,0xcc, - 0x31,0xc3,0x11,0xdd,0x3d,0xb8,0x68,0xb9,0x40,0xe0,0xc4,0xa1,0xf7,0x23,0xfe,0xe9,0x1e,0x79,0x3f,0x16, - 0xd0,0xca,0xbe,0xd7,0xc2,0xc7,0x87,0xf4,0x34,0x81,0xe5,0x85,0x8f,0xe1,0xef,0xb1,0xf7,0x63,0x02,0x8f, - 0xbb,0x1d,0x72,0x37,0x3e,0x0f,0x49,0x48,0x9c,0x88,0xa9,0x98,0x8b,0x85,0x80,0x39,0x48,0x2a,0xbd,0x2a, - 0xb7,0x24,0x09,0xae,0xb1,0xbe,0xa9,0x38,0xc0,0xea,0xa6,0xb0,0x7d,0xf9,0x6f,0x6f,0xdf,0xf3,0x5a,0xee, - 0x74,0x67,0xfe,0xe3,0xff,0x34,0xdd,0x59,0x78,0xad,0x02,0x9a,0x87,0xdf,0xbf,0x80,0x4f,0x75,0x44,0x1c, - 0x60,0x56,0x1c,0xd1,0xc3,0xb2,0x21,0x2c,0x2b,0xfe,0xdb,0xeb,0xe1,0x3b,0xe1,0x4e,0xfa,0x63,0xb8,0x33, - 0xfb,0x31,0xdd,0x99,0x79,0x58,0x78,0x78,0x1d,0x2c,0xc4,0x22,0x98,0xa3,0x07,0xa9,0x98,0x06,0x93,0x56, - 0x42,0x55,0x4c,0x82,0x99,0x98,0x05,0xa9,0x48,0x83,0x10,0xd7,0x5a,0x2b,0xc6,0xbb,0xcb,0x5a,0xf3,0x8d, - 0xe5,0x82,0xe7,0x8b,0xd2,0x6d,0xe1,0x3f,0x2d,0x9c,0xb9,0x8e,0x67,0xc4,0x2c,0xa5,0xfc,0x05,0x86,0x58, - 0x2a,0x70,0xbb,0x07,0x1e,0x30,0x76,0xd3,0x33,0x3c,0x8f,0xdd,0x23,0xe1,0x74,0x90,0x5d,0x66,0x50,0x68, - 0xa7,0x51,0x04,0xd6,0x2a,0x27,0x83,0x19,0x6c,0x9d,0x14,0x7c,0x76,0xe1,0x6a,0x7a,0x93,0x01,0xbf,0x05, - 0xec,0xb6,0x5b,0xb1,0x31,0x2b,0xe0,0x29,0x46,0xee,0x1a,0x22,0x6a,0x3c,0x1e,0x40,0x24,0x9f,0x15,0x6e, - 0x65,0x3f,0xa1,0x7c,0x9f,0x2f,0x66,0x85,0xcc,0xaa,0x41,0x1c,0x5b,0x90,0x90,0xd8,0x1f,0x4e,0x4f,0x38, - 0xdb,0xfa,0x13,0xda,0x24,0x84,0x31,0x60,0x9d,0x5e,0xa4,0x22,0xb0,0x35,0x68,0x2c,0x2e,0x21,0x24,0xe5, - 0xde,0x8f,0xe7,0xbb,0x27,0xbb,0x7f,0x0a,0x77,0x7f,0xea,0xec,0x1e,0x7f,0xb8,0xb8,0x43,0x7a,0xb8,0xfc, - 0xa1,0xed,0xc2,0x41,0x7e,0x0f,0xc7,0xb8,0xa7,0x30,0xcf,0xa4,0x1a,0x90,0x5f,0x28,0x97,0x36,0x45,0xc8, - 0xc0,0x4b,0x45,0x1a,0x50,0xd3,0x22,0x8d,0x9a,0xe6,0x29,0xa4,0x4d,0x4b,0x29,0x59,0x18,0x8e,0x9d,0x0c, - 0xc9,0x92,0xc5,0x53,0x0c,0x3a,0xa2,0xf3,0x68,0x06,0x7d,0x67,0x67,0xbb,0xd0,0xcc,0x38,0x5d,0x28,0x6e, - 0x9c,0x2e,0xd8,0x7b,0x9a,0x7e,0x22,0x83,0x84,0xfe,0x03,0xe8,0x48,0x4e,0xbe,0x50,0x25,0xd1,0xba,0x8a, - 0xf7,0x8c,0x0e,0x13,0x95,0x49,0xae,0xaa,0x1e,0x59,0x81,0x1f,0x58,0x82,0x90,0x51,0xe6,0xdf,0xb1,0x9c, - 0x26,0xa0,0xf9,0xbe,0x96,0x38,0x2c,0x23,0x3b,0x30,0xea,0x1e,0xb3,0xeb,0xac,0xe5,0x14,0x3c,0x1e,0x08, - 0xb7,0x88,0xb3,0x51,0x9d,0xa4,0xbc,0x11,0x5e,0xae,0xac,0xb8,0xd4,0x9c,0xf0,0xca,0x6c,0x50,0x2c,0x84, - 0xf3,0x3b,0x39,0xc5,0x19,0xe7,0xd5,0x3e,0x96,0xf5,0xc0,0x3f,0x4b,0x8f,0xd3,0xe4,0x75,0xf8,0x35,0xaa, - 0x1d,0x95,0x73,0x40,0xb2,0x79,0x0d,0x72,0x1e,0x36,0x10,0xb3,0xcb,0x4d,0x39,0xdb,0x6b,0x52,0x9e,0x02, - 0x0a,0x9b,0x60,0x8d,0x71,0x59,0x3c,0x5a,0x25,0xa6,0xee,0xdd,0xc8,0xba,0x7e,0xbe,0x0a,0xe0,0x2b,0xe4, - 0x9e,0xed,0x70,0x15,0xca,0x29,0x72,0xa4,0xa1,0xd6,0x2f,0x37,0x32,0xa6,0xa6,0x2a,0x7d,0x32,0x2a,0xa6, - 0x58,0x69,0x12,0x2e,0xdd,0x98,0xf6,0x1e,0x07,0xed,0xaf,0x40,0x2d,0x8c,0xd7,0xa1,0x16,0x5a,0x1f,0xd1, - 0xe0,0x9d,0x0d,0xf4,0xce,0xb8,0x2a,0x4a,0x12,0x12,0x79,0x9b,0xb3,0xd8,0x18,0xd7,0xd5,0x5f,0xf5,0x9e, - 0xcb,0x28,0x82,0xa6,0xf5,0x12,0xc1,0x16,0xd7,0x4e,0xaa,0x4b,0x96,0x31,0xce,0x91,0xaf,0xb0,0xad,0x17, - 0xfc,0xa1,0xa8,0xf1,0x43,0x95,0xb5,0xbe,0x6a,0x4d,0x12,0xa1,0x6c,0xc7,0x4c,0x30,0x81,0xdc,0xd0,0x6b, - 0x0f,0xda,0x6c,0xe8,0x39,0x43,0xa5,0x95,0xc2,0xb9,0xb2,0x67,0xad,0x35,0x11,0x06,0x3c,0xb9,0x4a,0x0d, - 0xb4,0xb4,0xb9,0x9a,0x57,0x70,0xf2,0xe8,0xf3,0x47,0x22,0xc8,0x0a,0x4c,0x23,0xc4,0x72,0xbe,0xc4,0x74, - 0x88,0x74,0x3e,0xb5,0xed,0x98,0xd3,0xa8,0x49,0xaf,0x5c,0x20,0x6d,0xdd,0xed,0x26,0xc4,0x5f,0x4b,0x3d, - 0xa0,0x15,0x63,0xb5,0x14,0x93,0x19,0x35,0x01,0xe4,0x3c,0x37,0x37,0x47,0x20,0x51,0x6e,0xb4,0xfc,0xc1, - 0xa7,0xcb,0x32,0xdd,0x96,0xa5,0x4d,0x43,0x8f,0xdf,0x42,0x7a,0xfc,0x86,0x23,0x87,0xb4,0x99,0x88,0x77, - 0x26,0xfd,0x41,0x05,0x8f,0x96,0x4f,0xcc,0x8d,0xf2,0x21,0x96,0xae,0xa1,0x92,0xd6,0x11,0x4e,0xab,0xca, - 0x36,0xac,0x4e,0x84,0xa0,0xc1,0x86,0xd3,0x60,0xa2,0x52,0x4e,0xc9,0xda,0xa6,0xe4,0x49,0xcf,0x9f,0x40, - 0x57,0x84,0xe3,0xad,0x2c,0x49,0x74,0x87,0xf6,0x14,0xfa,0x2d,0x2a,0x7f,0x21,0x3b,0x85,0x6d,0x12,0x14, - 0xeb,0x3c,0x64,0x19,0xa5,0x14,0x07,0x3e,0xf1,0x68,0x6c,0x5d,0x2d,0xc8,0x96,0xa8,0x11,0x3c,0xb5,0xbf, - 0xcf,0x3f,0xc9,0x2e,0xcf,0x4d,0x09,0x1a,0xad,0x58,0x85,0x4c,0x99,0x2d,0xf4,0xb9,0x28,0x54,0x77,0x1c, - 0xf6,0xe3,0x34,0x13,0xb7,0x34,0xd9,0x59,0x74,0x19,0xed,0x84,0x9b,0xca,0x60,0x78,0xcd,0xd9,0xa4,0x0d, - 0xa2,0xfb,0x0b,0x46,0xf7,0xb2,0xdd,0x94,0x12,0x74,0x10,0xc4,0x8c,0xbc,0x72,0x63,0xa9,0xc0,0x47,0x90, - 0xb0,0xe3,0xa5,0x59,0x45,0x4a,0xe8,0x37,0xc6,0xbe,0xd2,0x34,0x01,0xe9,0xa7,0x1d,0x99,0xfd,0x35,0x5b, - 0x1f,0x1d,0x46,0x33,0xdb,0x41,0xbd,0x16,0x6a,0xd0,0x3c,0x43,0x14,0x08,0x21,0x53,0x3d,0xa2,0xd2,0xa7, - 0x1c,0x52,0x9a,0x9a,0x58,0xd7,0x87,0x2d,0xb0,0xd0,0xf2,0x7a,0xcf,0x60,0x83,0xe5,0x88,0xb2,0xdc,0xac, - 0xb0,0x44,0xd7,0x68,0xe5,0xa6,0x25,0xed,0x49,0xde,0x50,0x52,0x10,0xa9,0xc0,0x2c,0xb9,0x72,0xa1,0xee, - 0x92,0x6a,0xc7,0x26,0x93,0x96,0x34,0xde,0xd9,0xc9,0x02,0xfa,0x86,0x3b,0x23,0x6c,0x8a,0xd9,0xfd,0x7d, - 0x2d,0x20,0x35,0x14,0x3a,0xee,0x4a,0xbe,0x25,0xd8,0xab,0xb7,0x1a,0x61,0x5a,0x29,0xe6,0x92,0x22,0x86, - 0x92,0x3e,0x93,0x32,0xc6,0xa7,0x6b,0x4f,0x55,0xb2,0xce,0xb8,0x2a,0x3f,0x13,0x01,0xab,0xf0,0x30,0xbb, - 0xe9,0xaa,0xf3,0x62,0xa5,0x7f,0x5c,0x65,0xe1,0xa1,0xab,0xa5,0xdc,0x29,0x8d,0x7c,0x50,0xb8,0xe9,0xc0, - 0x52,0x94,0xb5,0xec,0x96,0x18,0x12,0x1b,0xa9,0x57,0x6d,0x75,0xd3,0x86,0x6c,0x3d,0x96,0x90,0xbb,0x58, - 0xf5,0xdb,0xe8,0xea,0xf4,0xf3,0xdc,0x75,0x7e,0x74,0x5a,0xfc,0xb0,0xe5,0xfc,0x60,0x33,0xc2,0xe8,0xd9, - 0x81,0xe7,0x28,0x11,0xff,0x48,0x43,0x75,0x3f,0xa8,0x71,0xd9,0x2a,0x1d,0x58,0x13,0x7f,0x62,0x3e,0x20, - 0xed,0x63,0xd9,0x3a,0xee,0x21,0x5b,0xcf,0x3d,0x34,0xa9,0xb5,0x0c,0xa0,0x18,0xef,0x01,0xa5,0x5c,0x9b, - 0x35,0xed,0x93,0x94,0xda,0x80,0xbe,0x46,0xf9,0x1a,0x58,0xdd,0x5a,0x8f,0x27,0x0f,0xdc,0x73,0x91,0xb5, - 0xe7,0x26,0xac,0xc5,0x93,0xf4,0x13,0xaf,0x66,0x5f,0xb5,0x03,0xb9,0xaa,0x0d,0xdb,0x50,0xd9,0x77,0xcd, - 0x28,0xdb,0xd9,0x09,0xe6,0xe9,0x1c,0xe3,0x03,0xd7,0x87,0x4e,0xd0,0x16,0x99,0x6a,0x6f,0xbc,0x80,0xda, - 0x39,0x27,0xe2,0xcf,0xcb,0xa2,0xb6,0x8f,0x53,0xb3,0x8f,0xe7,0x9b,0x76,0xf0,0xbc,0xf1,0xab,0x72,0x3f, - 0x4f,0x47,0x4e,0x9b,0x37,0x74,0x9b,0x77,0xf4,0x5c,0xd5,0x54,0xd9,0xc7,0x73,0x21,0x57,0xf8,0x0c,0xd6, - 0xb8,0x98,0xd7,0x8e,0x04,0x3e,0x0f,0x22,0x9a,0x88,0x17,0xd3,0xdc,0xad,0x9a,0xcc,0xca,0xdc,0x5e,0x09, - 0x29,0x19,0x59,0x87,0xc8,0xca,0x1c,0x5b,0xf1,0x15,0x66,0x5b,0xdf,0x0a,0xff,0x60,0xe9,0xf8,0x21,0x19, - 0x77,0xcb,0x29,0x04,0xdb,0xaa,0x47,0x70,0xc5,0xb8,0x7b,0x86,0x5f,0xb1,0x3d,0x8a,0xbd,0x15,0x9d,0x63, - 0x88,0x2d,0x19,0xfb,0xab,0xf2,0x6b,0x19,0x1b,0x8c,0x57,0x4e,0x74,0xd6,0x60,0x75,0x21,0xf7,0x87,0x06, - 0xc7,0x58,0x4f,0x74,0x4c,0xc2,0xad,0x0b,0x10,0x07,0x9b,0x98,0x26,0x43,0x61,0xad,0xe3,0xb7,0xd0,0x30, - 0x1b,0x36,0xb2,0x63,0x2c,0x6f,0x55,0xc2,0xf5,0x35,0x69,0x0d,0x75,0xd2,0x5f,0x13,0x14,0x00,0x7d,0xc3, - 0xcf,0xa5,0x1f,0x55,0x18,0x83,0xca,0x5e,0x25,0xb6,0x18,0xde,0x64,0xe5,0x2b,0x94,0xd3,0x9d,0x36,0x4c, - 0x6c,0xbd,0xb2,0xba,0xaf,0xea,0xeb,0x0d,0x5c,0x85,0x74,0xfa,0x51,0x52,0x31,0x2d,0xec,0x95,0xfe,0x4f, - 0x49,0xa0,0x52,0x13,0x94,0xdc,0xe4,0xcc,0xc2,0xab,0x12,0x94,0x35,0xfe,0x4d,0x6a,0x93,0x47,0x72,0x93, - 0xaf,0x2a,0x28,0x94,0x31,0x93,0x95,0x7a,0xcf,0xd3,0xec,0x06,0x35,0x8a,0xc6,0xd9,0x57,0x07,0xb8,0x13, - 0x9d,0x90,0x7b,0xca,0x3c,0x25,0xf7,0x38,0x82,0xaa,0xd4,0xb7,0x64,0x78,0xac,0x70,0x6e,0xa3,0xf1,0x22, - 0x2e,0x95,0x0e,0xaf,0x10,0x83,0x43,0x38,0xdd,0xd2,0x5d,0x85,0xaf,0x09,0x0f,0xe0,0x67,0x3a,0xfb,0x14, - 0x71,0x8a,0x63,0x53,0x62,0x1c,0xe6,0xd1,0xf4,0x03,0xc5,0x81,0x92,0x8b,0x8f,0x6b,0x1e,0x31,0xf0,0xde, - 0x07,0x5c,0xe7,0x8e,0x88,0xa5,0x07,0xbd,0x79,0x1c,0x7d,0x9e,0x93,0x49,0xec,0x03,0x13,0x4d,0x2a,0x22, - 0x85,0x3c,0x7d,0xf2,0x58,0x56,0x47,0x1b,0x72,0xb4,0x6a,0x19,0x57,0x76,0xd1,0x96,0x93,0xd3,0xac,0x3a, - 0x22,0x1b,0xe9,0x10,0xfb,0x37,0xaf,0xcf,0xde,0x39,0x02,0x71,0xe6,0xfd,0x5c,0x6c,0xb4,0x35,0x66,0xcb, - 0xa5,0xdf,0xf8,0xea,0xc3,0x85,0x66,0xe6,0xe9,0xee,0x64,0x22,0x0a,0xd9,0xd8,0x54,0x0a,0xbc,0x65,0x4c, - 0x54,0x44,0x3b,0xdd,0xd9,0x99,0x19,0xc3,0x51,0xd9,0x63,0x40,0xcc,0xf4,0x89,0xf4,0xa2,0x7b,0xf4,0x7d, - 0x3b,0x4a,0xce,0x79,0x71,0x21,0x96,0x3e,0xe7,0xab,0x93,0x78,0xf9,0xdc,0x0e,0x77,0x32,0x52,0xcb,0x4f, - 0x97,0x20,0xcc,0xa0,0xfb,0xfb,0x99,0xda,0x99,0xf7,0xf7,0x4c,0x2e,0xde,0x30,0x9a,0xb6,0x39,0x58,0xb9, - 0x53,0x53,0x5e,0x95,0xf2,0x65,0xca,0xac,0x31,0x65,0x02,0x37,0xa3,0x3f,0x3b,0x3b,0x0e,0x42,0xc5,0xa2, - 0x5d,0x9b,0x7c,0x0c,0x65,0xc1,0xd1,0xcc,0xb8,0xbf,0xc1,0x0b,0xf3,0x0c,0x1e,0xcc,0xe5,0xeb,0x72,0x19, - 0xbf,0x79,0x71,0xf6,0x9b,0xd3,0x97,0x9b,0x1c,0x52,0xe6,0x71,0xfe,0x31,0x9a,0xed,0xb1,0x8b,0x03,0x26, - 0xf8,0x70,0x86,0xb5,0x5c,0x76,0x32,0xa3,0x8d,0x02,0xf8,0x58,0x9d,0x14,0x0d,0xbf,0x5f,0x55,0x94,0xc1, - 0x9d,0x52,0x76,0x3c,0x3b,0xbd,0x9c,0x5d,0xad,0xd2,0x82,0x81,0x3c,0xc0,0x25,0xac,0xcc,0xe6,0x25,0x5b, - 0x3c,0xa9,0xc5,0x6a,0xe9,0xd7,0xec,0x22,0xe5,0x0f,0x1a,0xff,0xab,0xe6,0xcf,0x91,0xbb,0xd5,0x6e,0x7a, - 0xb9,0x0b,0xd4,0x8e,0x53,0xe8,0xfe,0xfc,0xcf,0x81,0x2c,0xfb,0x86,0x06,0xb4,0xf6,0xbd,0x86,0x51,0xd3, - 0x25,0xef,0xef,0xeb,0x73,0x55,0xfb,0x62,0x43,0x11,0x2b,0x7f,0x16,0x55,0x25,0x8f,0xf3,0xc6,0x7e,0x96, - 0x5b,0xe6,0xc9,0x43,0x71,0xed,0x64,0x61,0x7c,0xda,0xbb,0x94,0xdf,0xb2,0x75,0x7d,0x68,0xf8,0xe6,0x0f, - 0x52,0x96,0x33,0x44,0x8b,0x0a,0xca,0x0d,0xe0,0x40,0xac,0x09,0x47,0x74,0xff,0x9e,0x5c,0xfd,0x76,0x76, - 0x92,0xda,0xbd,0x36,0x7e,0xe1,0x15,0x6f,0x13,0x57,0x26,0xa4,0x0d,0x73,0x54,0xa6,0xb9,0x77,0x09,0x86, - 0x33,0x30,0xf0,0x1d,0x46,0x47,0x21,0x8c,0xae,0x6e,0x18,0x85,0xca,0x7d,0xe1,0x86,0xbd,0xbb,0x8e,0x6e, - 0x30,0xff,0x56,0xa9,0xb1,0xca,0x17,0x1a,0x9f,0x39,0x82,0xfe,0xf8,0xce,0x4c,0xb9,0xdf,0xeb,0xe8,0x34, - 0xf5,0x43,0xe2,0x5b,0x13,0x64,0x0b,0x2c,0xba,0x36,0xbd,0x30,0x92,0x2f,0x60,0x18,0x57,0xf6,0x11,0xf3, - 0x38,0x50,0x42,0x8c,0x4a,0x74,0x14,0xed,0x3f,0xee,0x3c,0xea,0xe5,0x09,0x3c,0x98,0x2f,0xf1,0x31,0x6a, - 0x55,0xd8,0x15,0xc9,0x92,0x74,0x72,0x35,0x13,0xaa,0x04,0xb6,0xbe,0x74,0x03,0xf8,0x59,0x8c,0x0c,0x57, - 0xc8,0x3b,0xe5,0x87,0xa4,0x59,0xcc,0xbc,0xa6,0xaf,0x98,0x11,0x1a,0x1f,0x0c,0xde,0xa5,0xcc,0x33,0xdb, - 0x69,0xb1,0xc2,0x82,0xb4,0xb6,0x84,0x9c,0xa6,0x90,0x33,0xab,0x96,0xb8,0xb0,0x9a,0x23,0x2b,0xe4,0x1c, - 0x59,0x68,0x41,0x02,0x3e,0xf9,0x3a,0xcc,0x9e,0x02,0xc1,0x3a,0x41,0xd5,0xa8,0xcd,0xe8,0xd1,0xc7,0xce, - 0xe3,0x0b,0xe9,0x87,0x4e,0xb8,0x85,0x0f,0xc9,0x89,0x81,0xe2,0x04,0x34,0xf5,0x60,0x60,0xa7,0x52,0xb4, - 0xad,0x20,0x09,0xa3,0x21,0xd8,0x2a,0x31,0xcb,0x0a,0x12,0xdb,0x56,0x90,0x44,0x39,0xd7,0xc7,0xca,0xfa, - 0xa1,0xd8,0x75,0xe1,0x78,0xca,0xa7,0x49,0xc4,0xda,0x1e,0x82,0xef,0x84,0x6e,0xe9,0x58,0x49,0x10,0xa5, - 0x32,0x73,0x54,0xc0,0x36,0xda,0x4a,0x90,0x09,0x60,0xef,0xa0,0x65,0xc5,0xc8,0xff,0x62,0xfa,0x1c,0x5a, - 0x69,0x35,0x7c,0x45,0x66,0xb3,0x12,0x63,0x6a,0x6e,0x9f,0xff,0x68,0x8c,0x29,0xbb,0x17,0x7b,0x57,0xc2, - 0xf9,0x60,0x25,0x5e,0xea,0xf7,0x30,0x25,0x18,0x7e,0xc6,0xa9,0x72,0x53,0x3c,0xf5,0x67,0xb0,0x14,0xd1, - 0xfd,0xd3,0xce,0x37,0xb6,0x4e,0xe3,0xf9,0xd7,0xa0,0x02,0x0c,0x9b,0xb6,0x17,0xc6,0x51,0xec,0xf2,0x40, - 0x3b,0x82,0x6a,0xf7,0x23,0xa3,0x98,0x11,0x3a,0x9c,0xdf,0xb7,0x90,0xda,0x84,0x89,0xe9,0xf7,0x6d,0xbc, - 0x36,0xfb,0xb4,0x7f,0xe0,0xb7,0x30,0xc0,0x0c,0xa7,0xcd,0xb8,0xe5,0x42,0x25,0xab,0x87,0x8a,0x35,0x0b, - 0xc4,0x72,0x96,0xb7,0x8e,0x8a,0x9e,0x57,0x9b,0xa4,0x46,0xde,0x46,0x65,0xaa,0x25,0x21,0x74,0x2b,0xfb, - 0xef,0x4e,0xfa,0xf6,0x26,0x4b,0xcb,0x50,0x15,0xfe,0x4d,0xec,0x22,0xe1,0x3a,0xbb,0x48,0x58,0x71,0x1d, - 0x34,0x0a,0x7f,0xe9,0xf2,0xca,0x5a,0x62,0x22,0x42,0x95,0x65,0x52,0x3c,0x40,0x31,0xee,0x0d,0xf3,0x8a, - 0xcf,0xe1,0x65,0x8c,0x59,0xab,0x95,0xb2,0x8d,0x1d,0x36,0xab,0x6a,0x98,0xc2,0x93,0xaa,0xdc,0x32,0xf7, - 0x85,0x3e,0x72,0x9b,0x46,0xb7,0x3c,0x1b,0x19,0xcb,0xe4,0xbb,0x4e,0xcb,0xa4,0x43,0x33,0x26,0xd8,0xfe, - 0x01,0x63,0xa2,0x32,0x74,0x7e,0x08,0xaf,0xdf,0x54,0x1e,0xcb,0xdd,0xd4,0x43,0xad,0x61,0x05,0xcb,0xac, - 0x32,0x81,0xa3,0xb6,0x4c,0xe1,0xf9,0x62,0x8a,0x8a,0x12,0x44,0x7c,0x6f,0xa2,0xd4,0x70,0xd4,0x6d,0xee, - 0x83,0x25,0x48,0xb1,0xd0,0xfc,0x1a,0x8e,0x0d,0x9a,0x36,0x56,0x83,0x79,0x4b,0x41,0xfe,0x70,0xc3,0xea, - 0x1a,0xd2,0x4d,0xf0,0x33,0x4a,0x37,0x9d,0xf9,0xa9,0xd0,0xeb,0x4a,0x34,0xee,0x0b,0x78,0x4f,0xef,0x0b, - 0xfb,0x75,0x69,0x5f,0xbc,0x81,0x5a,0xfc,0xb8,0x8d,0x85,0x91,0x9a,0x60,0x86,0x98,0x3d,0xf2,0xbb,0xc2, - 0x15,0xf0,0x04,0x4e,0xbb,0x83,0x81,0x74,0x9b,0x32,0x84,0x38,0xf6,0x94,0x72,0x3e,0x17,0x4a,0xdc,0xf0, - 0x73,0x14,0x42,0x1a,0xa2,0x31,0x72,0xc3,0x87,0x2e,0x4b,0x46,0xd2,0xa6,0xc1,0x6b,0x0c,0xa9,0x5c,0xb1, - 0x65,0xc3,0x4f,0x25,0x1f,0xcd,0x4d,0x63,0x0e,0x67,0x5a,0x99,0x07,0x41,0x80,0x09,0x38,0x12,0x46,0x25, - 0x26,0xc3,0x66,0x2b,0x28,0xac,0x17,0x53,0x99,0x8a,0x3c,0xb0,0xa9,0xb9,0x0c,0x6e,0xc9,0x82,0xbc,0xc5, - 0x8a,0x13,0x89,0x96,0x65,0x9d,0xa9,0x6d,0x33,0x7a,0x02,0x7a,0x13,0xdf,0x94,0x07,0xd7,0x53,0x46,0x0b, - 0x79,0x0f,0xa1,0xaf,0x58,0xe9,0x81,0x45,0x31,0x8a,0x32,0xa8,0xc4,0xc7,0xa4,0x9e,0x52,0xcd,0x34,0x2b, - 0x82,0xb2,0x4d,0x8a,0x20,0x6c,0x2b,0xea,0x7a,0x10,0x35,0xd0,0x84,0xd1,0x54,0xf7,0xe5,0x9d,0x15,0xc9, - 0xcc,0x2b,0x24,0x5b,0x7a,0xde,0x4a,0xfd,0x6e,0x26,0x4a,0xca,0x13,0x51,0xb1,0x97,0x88,0x92,0xb6,0xe6, - 0x61,0x0a,0xe0,0x58,0x2d,0x5c,0xfc,0x94,0x5e,0xb8,0xe9,0x47,0x8c,0x7e,0x51,0x0d,0x92,0xcb,0x24,0x53, - 0x80,0x2a,0x8d,0x30,0x87,0xab,0x2b,0xea,0xca,0x8a,0xea,0xa7,0x43,0xf3,0xfa,0xe3,0x15,0xf6,0xf2,0xc5, - 0xef,0x4e,0x3f,0x7c,0x7f,0xf2,0xea,0x34,0x40,0xd0,0xc0,0xdb,0x5d,0x0c,0x93,0x8c,0xa3,0x5b,0x9e,0x7c, - 0x5e,0x59,0x52,0x82,0x03,0xd2,0x82,0x06,0x84,0xc6,0x55,0x2b,0x8b,0xfc,0x1b,0x2d,0xdc,0xa1,0x3e,0xcb, - 0x4c,0xd3,0x3c,0x3d,0x30,0x32,0x7d,0x53,0x03,0x75,0x88,0x0c,0xad,0x93,0x23,0xc6,0x43,0xe5,0x70,0x12, - 0x7a,0x2b,0x97,0x91,0x91,0x5b,0x09,0xdf,0x1a,0x0d,0xaf,0x68,0x12,0xab,0x8f,0x47,0x47,0x2d,0xf9,0xed, - 0x73,0x9b,0xca,0xd8,0x1b,0xc0,0xca,0x63,0xc8,0x1b,0x01,0xf9,0x1b,0xce,0x0a,0xe9,0x6c,0x07,0xd8,0x66, - 0xd4,0x85,0x59,0x5b,0xeb,0xfe,0xde,0xbe,0x52,0x49,0xe4,0x8e,0xa3,0xc1,0x83,0x94,0xca,0xc9,0xfa,0x0d, - 0xcb,0x07,0x63,0xc8,0x07,0x23,0x6e,0x55,0x99,0xcc,0x85,0xb6,0x29,0x07,0x59,0xb3,0x7a,0x6a,0x93,0x0f, - 0x0b,0xf1,0x7a,0x2b,0x0d,0xe9,0x51,0xbb,0xa2,0x76,0x79,0x88,0x1d,0x20,0x0c,0xa4,0x43,0x3f,0x6f,0x3b, - 0x69,0x0e,0xad,0x55,0xb5,0xd4,0xfa,0xaa,0x6a,0x64,0x5d,0xa2,0xe0,0xbf,0x94,0x92,0x19,0xf9,0xde,0x75, - 0x1d,0x51,0x64,0x9e,0x4a,0x8e,0xcc,0x35,0xeb,0x17,0x42,0xa4,0x86,0x77,0xe8,0xaa,0x62,0x93,0x7e,0xf6, - 0x4c,0xc9,0x4b,0x6d,0x6c,0x0c,0xb0,0x5b,0xc2,0xe1,0x5b,0x27,0xb0,0x8a,0xb8,0x5a,0xba,0xcf,0x0d,0xea, - 0x7f,0x20,0x92,0x6c,0xc3,0x90,0x4a,0xff,0x46,0x9a,0x95,0x62,0x20,0x12,0xb6,0x48,0x95,0x43,0xdc,0xe3, - 0x12,0x79,0x5a,0xfe,0x8c,0x1d,0xd2,0xc1,0x3d,0x97,0xab,0x63,0x31,0xd3,0x27,0x5d,0x61,0x11,0xa2,0xaf, - 0xdf,0x6f,0x05,0xe9,0x7e,0x60,0xcc,0x2f,0x59,0x29,0x64,0x76,0x9e,0xa6,0x50,0x73,0x2c,0x25,0x15,0x3b, - 0x34,0xde,0x85,0x5e,0x74,0x4b,0x03,0xe4,0xd2,0x40,0x9f,0xe0,0x5c,0x35,0x94,0xeb,0x65,0xfc,0x29,0x7a, - 0x8d,0xa6,0x34,0x31,0x03,0x02,0x88,0x57,0xb0,0xec,0x10,0xa8,0xcc,0x3c,0xfe,0x35,0x46,0x91,0x91,0xac, - 0x86,0x30,0x8a,0xfa,0xf6,0x6f,0x17,0xd1,0x22,0x0a,0xa4,0x30,0xd6,0x96,0x3a,0x49,0xd7,0x6b,0xa6,0x7e, - 0xf8,0x02,0x31,0xf0,0xa5,0x8f,0x76,0x74,0x50,0x4b,0xd3,0xd7,0x80,0xa1,0x72,0xc6,0x71,0x71,0x13,0xce, - 0xe5,0x09,0x89,0x08,0x13,0x77,0x18,0x98,0x8c,0xa3,0xae,0x30,0x6e,0x98,0xa4,0x6b,0x1a,0x2d,0x51,0x71, - 0x80,0x8b,0x01,0x52,0xed,0x9f,0x9f,0xab,0x1a,0x44,0x07,0xfe,0x1f,0xb5,0x6f,0xe1,0xbf,0x6b,0x61,0x6f, - 0xfa,0x8b,0x8b,0xa5,0xff,0xe0,0x4a,0x09,0x79,0xc7,0x7e,0x7b,0xa9,0x04,0xdd,0xea,0xb8,0x54,0xae,0xdb, - 0xbc,0x28,0x38,0xd2,0xd0,0x43,0x35,0x42,0xe2,0x96,0x62,0x7d,0xed,0x81,0x01,0x26,0x11,0x3a,0xdc,0x34, - 0x24,0xde,0x03,0x21,0x82,0x12,0xaf,0x32,0x9d,0x66,0x8d,0xeb,0x23,0x0e,0xed,0x62,0xa6,0x0c,0xda,0x8f, - 0xad,0x37,0xcc,0x41,0xd8,0x70,0x30,0x12,0x4e,0x78,0xa5,0x83,0xcb,0x95,0xd3,0xfe,0xfa,0xf2,0xd2,0xad, - 0x4e,0x7c,0x77,0x68,0x90,0xeb,0x9a,0xfa,0x49,0x3e,0xfc,0xdc,0xcd,0xf2,0x67,0xc4,0x76,0x79,0xa0,0xa2, - 0xcd,0x03,0x55,0x12,0x61,0x4a,0xe3,0x04,0xe2,0x96,0x99,0xe2,0x3a,0x0e,0xac,0xed,0x39,0x51,0xc2,0x81, - 0x3d,0x25,0x7c,0x9b,0xea,0x72,0xde,0xd9,0xa9,0xf4,0xb9,0xaa,0xfc,0x69,0x64,0x7c,0xf5,0x91,0x54,0xd6, - 0xc2,0xc1,0xd1,0xff,0x57,0x6a,0xa5,0x50,0x7d,0xd3,0x72,0x13,0x73,0xb2,0x3a,0x23,0xa0,0xdf,0xce,0x0e, - 0x3c,0x1f,0xa1,0xe1,0x86,0xde,0x69,0x96,0xf7,0x43,0x78,0xbc,0x83,0x30,0x64,0x79,0x70,0xf4,0x19,0x5d, - 0xef,0x3f,0x1f,0xed,0x5c,0xc3,0x72,0x0b,0x98,0xcb,0x20,0xc3,0x1c,0x8c,0x67,0xf3,0xcb,0x25,0x0d,0x29, - 0xd4,0x83,0xa0,0x66,0x56,0xc2,0xea,0x26,0xc0,0x34,0xea,0x36,0xa1,0xb6,0x34,0x61,0xbc,0xe5,0x73,0x4e, - 0xf1,0x57,0x87,0xdc,0x8b,0xa6,0x2f,0x55,0x9e,0x34,0x4f,0x21,0x94,0xc5,0x14,0xc7,0x26,0xb3,0xf4,0xd9, - 0xcc,0x95,0x40,0x20,0xb6,0xd8,0x40,0x9d,0x59,0x28,0x9c,0x02,0x28,0x65,0x7a,0xeb,0x63,0x0c,0xfe,0x7c, - 0x9c,0x86,0x19,0x8a,0x4d,0xe1,0x74,0xb8,0x65,0xae,0x6f,0xb3,0xb8,0x60,0xe7,0xb2,0x95,0xd8,0x16,0xfc, - 0xad,0xdb,0x2c,0x9c,0x2b,0xe0,0xf8,0x1c,0xd1,0x56,0xaa,0x19,0x99,0xee,0xb6,0xad,0x55,0xb1,0xb3,0xa3, - 0xa7,0x16,0x19,0xbf,0x10,0xc4,0x6a,0x37,0xf7,0xc8,0x72,0x53,0x09,0xef,0x25,0xcd,0x93,0xc8,0x57,0xe3, - 0x1c,0x9a,0x31,0x79,0x9f,0x40,0xeb,0x27,0xd7,0x64,0xb8,0x27,0x20,0x77,0x71,0x80,0x01,0x56,0x2b,0xf3, - 0xfc,0xc9,0x8d,0x6d,0xc3,0x92,0x34,0xb0,0xa6,0xec,0xdf,0x80,0x7c,0x17,0x5b,0xae,0x28,0xd4,0xad,0xc4, - 0xad,0xe2,0x33,0x1d,0xef,0x56,0xe6,0x5b,0xcb,0x92,0x3b,0x3a,0x6a,0xe0,0xca,0xa5,0x4d,0xbe,0xb3,0xa3, - 0x78,0x57,0x72,0x61,0x4c,0x72,0x8f,0xa5,0x23,0x14,0xed,0x6d,0x09,0x96,0x9e,0xe2,0x69,0xaa,0xb6,0x59, - 0xb3,0x74,0x1e,0x9a,0x2b,0x0d,0x90,0xd0,0x28,0x6f,0x62,0x8c,0x14,0x67,0xbc,0x0f,0xc9,0xf0,0xa3,0xf0, - 0xce,0xb5,0x69,0x26,0x54,0x66,0x97,0x95,0xa2,0x3a,0xf1,0x86,0x9c,0x23,0x5a,0xb7,0x4e,0x91,0x04,0xb9, - 0xe9,0xcb,0x21,0x61,0xa5,0x01,0xb5,0xe6,0xbe,0x8a,0xa9,0x63,0x6d,0x08,0x46,0x72,0x2c,0xc1,0xdb,0x35, - 0xa8,0xb8,0x1b,0xe5,0x7f,0x74,0x6b,0x88,0x41,0xec,0xc3,0x9d,0x6b,0x04,0x04,0xda,0xd6,0xfe,0xb9,0x03, - 0x1b,0x1b,0x78,0x70,0xdc,0xda,0xce,0x85,0x4a,0xfb,0xfe,0xbb,0x38,0x7c,0x13,0x62,0x70,0x1a,0xe3,0x77, - 0x54,0x14,0xda,0xc6,0xc2,0x5a,0x79,0x30,0x5c,0xa3,0xf9,0xb6,0xd4,0x6b,0x9c,0x49,0x8c,0x84,0x32,0x33, - 0x5e,0x23,0x4b,0xa4,0x0f,0x3d,0xcd,0x29,0xd5,0x0a,0x28,0xe9,0x09,0xcb,0x10,0x48,0x4b,0xad,0x06,0xad, - 0xf2,0x64,0xcd,0x87,0xbd,0x60,0xd8,0x65,0x6a,0x54,0x69,0x91,0x42,0xf5,0x87,0xfa,0x1a,0x5a,0x44,0x0c, - 0x4b,0x28,0x9f,0xee,0x62,0x8e,0xb8,0xda,0x0a,0xd4,0x84,0x1e,0x8f,0xc3,0x95,0xdb,0x0b,0x7d,0xc7,0x4b, - 0x30,0xee,0xe5,0x33,0x43,0xd2,0x21,0x0c,0x1d,0xad,0x46,0x06,0x56,0xbf,0xb2,0xe6,0x23,0x08,0xa4,0x83, - 0x29,0x3c,0x0c,0x18,0x9f,0xfd,0x15,0x3a,0x0c,0x95,0xa2,0xf1,0xab,0x0f,0x42,0x81,0x40,0x61,0x21,0x0e, - 0x03,0x2d,0x0b,0xfb,0x54,0x54,0xa7,0xd7,0xdb,0x77,0xef,0xde,0xbd,0xfc,0xf0,0xfc,0xed,0xe9,0x6f,0x83, - 0xf3,0x8e,0xe8,0x1d,0x50,0xf0,0x8f,0xe8,0x1d,0x0f,0x44,0x1f,0x23,0xa3,0xfa,0x1d,0x81,0xd1,0x5c,0xfd, - 0xc3,0x0e,0x06,0xb2,0x89,0x41,0x77,0x5f,0x0c,0x06,0x1d,0x31,0x38,0x38,0x10,0x83,0x63,0x8c,0x03,0xea, - 0x8b,0xfd,0x7d,0xf8,0x7b,0x74,0x28,0x0e,0x7a,0x3d,0x0c,0x7a,0x12,0x07,0xc7,0x47,0xe2,0x10,0xca,0x1c, - 0x1e,0x0d,0xc4,0x51,0xbf,0x2b,0x8e,0x8e,0x3a,0xe2,0xb8,0xdf,0x13,0xc7,0x47,0x47,0xa2,0xdb,0x19,0x1c, - 0x8a,0x6e,0xb7,0x73,0x0c,0xff,0x1c,0xee,0x63,0x6c,0x19,0xfc,0xd3,0xef,0x1e,0x63,0x3c,0x17,0x3c,0x18, - 0x40,0xd1,0xee,0xfe,0x01,0x94,0x3b,0x38,0xe8,0x8a,0xee,0xe1,0x01,0x5c,0x1e,0x1d,0x40,0x91,0xe3,0xc3, - 0x03,0xd1,0xeb,0x60,0xb4,0x5c,0xaf,0x0b,0xad,0xa3,0x00,0xb3,0xc1,0x11,0x86,0x24,0x51,0x50,0x17,0xb4, - 0xa4,0x77,0x7c,0x80,0xa1,0x72,0xfd,0x03,0x0c,0x76,0xea,0x89,0xfe,0x7e,0x0f,0x2e,0x0f,0x7b,0xd0,0xf4, - 0xe3,0xfd,0xee,0x85,0xe0,0x6e,0x9e,0x9d,0xbe,0x7a,0x11,0xdc,0x4d,0xfc,0xae,0x98,0xfa,0x7d,0x11,0xf9, - 0xfb,0xe2,0xd2,0x3f,0x10,0x57,0xfe,0x91,0x08,0xfd,0x6e,0x47,0x8c,0xfd,0x6e,0x6f,0x29,0x8b,0xbe,0x3a, - 0xf9,0x43,0xb0,0xdf,0xed,0xc9,0xab,0x5f,0x9f,0xbc,0x09,0xda,0x9d,0xce,0x01,0xee,0xe0,0xe8,0x55,0xae, - 0x22,0x81,0xec,0x88,0xa3,0x6f,0x8b,0xbd,0x9e,0x67,0x59,0x84,0x8a,0xa2,0x98,0xbd,0xa1,0x7c,0x9e,0x96, - 0x91,0x4d,0xbe,0xe7,0xde,0xd9,0x02,0x43,0x24,0xc8,0x4e,0xeb,0x17,0xac,0x19,0x56,0xd1,0x48,0x8f,0xe1, - 0xf3,0xda,0x43,0x45,0xe6,0x6d,0xfb,0xb2,0x15,0xe7,0x5b,0xb3,0x14,0x01,0x08,0xb7,0x0a,0x58,0x99,0x5b, - 0x50,0x66,0x0b,0xad,0x37,0x20,0xdb,0x46,0x19,0x70,0x8f,0xf8,0x8e,0x49,0x24,0x4b,0x09,0xba,0x3e,0xbf, - 0x06,0x5a,0xe7,0x33,0x39,0x4a,0x1e,0x75,0xec,0x2a,0x11,0xb9,0x21,0xb9,0xda,0xfa,0xc6,0xff,0x66,0x2b, - 0xbc,0x2c,0xa8,0xce,0x68,0x4b,0x7e,0x88,0x1d,0x1f,0xaa,0xa1,0x51,0x61,0xb9,0x52,0x81,0x68,0x57,0x74, - 0x18,0xac,0xac,0x98,0xf3,0x66,0x52,0xcd,0x32,0x1d,0x79,0xb5,0xce,0x18,0xfd,0x86,0xa4,0x7d,0x24,0x51, - 0x5e,0x21,0x32,0x3e,0xda,0xd4,0x59,0x69,0x1a,0x0e,0x04,0x83,0x3e,0x8b,0x8e,0xf4,0x7f,0x97,0xc3,0xd6, - 0x1b,0xac,0x7f,0xcb,0x1e,0xbe,0xde,0xa0,0x34,0x7a,0xf0,0xaa,0x0e,0x01,0xbb,0x9b,0xfa,0x03,0x91,0xc2, - 0xf2,0x18,0xfb,0x07,0x7d,0x4c,0x35,0x77,0x87,0x12,0xaf,0x6a,0x29,0xf4,0x5b,0x48,0x9b,0x9a,0x24,0xad, - 0xe4,0x6f,0x6a,0x59,0xa6,0x8c,0x6f,0x23,0x94,0x6d,0xa5,0x7a,0xd4,0x22,0x85,0x1c,0x20,0xbd,0x5f,0xf0, - 0x20,0x8e,0x93,0x45,0xa4,0x07,0x63,0xef,0xc7,0x1f,0xf2,0x6f,0xdd,0xf3,0x69,0x3a,0x7e,0xf6,0xfa,0xc9, - 0x85,0x07,0x17,0x01,0xde,0xf8,0x61,0xda,0xc2,0xdf,0x20,0xdd,0x47,0x9f,0xa3,0x89,0xaa,0xc6,0x1e,0x21, - 0xa5,0x48,0xd8,0xfa,0x66,0x1a,0x7c,0x23,0xb6,0xbe,0x49,0x83,0x6f,0xb6,0xd2,0x6c,0xeb,0x9b,0x31,0xfc, - 0xbd,0x8e,0x28,0x8f,0xad,0xea,0xde,0x2c,0x88,0xcf,0xbb,0x17,0x15,0x84,0xef,0x49,0xd0,0x8a,0xcf,0x7b, - 0xe4,0x78,0x9e,0x61,0xc2,0x45,0x53,0xf3,0x37,0x4e,0x6b,0xd6,0x72,0xbe,0xc1,0xd1,0xcb,0x31,0x98,0xed, - 0x96,0x0c,0xea,0xac,0xaa,0xc2,0xa2,0x41,0x57,0x38,0x44,0xb6,0xd1,0x5b,0xef,0xbc,0x2b,0x80,0x50,0x08, - 0xdc,0xc4,0xc0,0x7f,0x5a,0xfa,0xa1,0x89,0x67,0x57,0x39,0xfd,0x66,0xeb,0x66,0x01,0x4d,0x19,0x47,0x5b, - 0x5d,0xb1,0xd5,0x13,0x5b,0x03,0xb1,0x75,0x24,0xb6,0xba,0x07,0xd8,0xe6,0x7e,0x4f,0x55,0xef,0xa4,0xb2, - 0x5e,0x77,0xf2,0x68,0x70,0x7f,0x3f,0x79,0x7c,0x58,0xaa,0x25,0x35,0xb5,0xc0,0xfb,0xfb,0x62,0x8b,0x5e, - 0x3f,0xd4,0x6f,0x8f,0xcd,0xdb,0xdd,0x0e,0xbe,0x8e,0x49,0x2b,0xec,0x0a,0xc6,0xa6,0x82,0x71,0x54,0xdc, - 0x46,0x51,0xb2,0xd5,0xed,0x6c,0x85,0xc9,0x74,0x0b,0x4a,0x52,0x35,0x98,0x14,0x3d,0x98,0x2c,0xd5,0xc0, - 0x59,0x7b,0xde,0xfa,0xd9,0x1b,0x44,0x83,0xbd,0xbc,0x3d,0xf6,0xf6,0xfa,0x3d,0x1c,0xc9,0xf3,0x0b,0xd2, - 0x44,0x4d,0x83,0xb0,0xa5,0x04,0xa6,0xb9,0x5e,0x3c,0x70,0xcf,0xb6,0x61,0x56,0x57,0xd1,0xdc,0xa8,0x19, - 0xa7,0xc3,0x69,0x2b,0xd0,0x71,0x93,0x5d,0xbd,0x09,0x79,0x8d,0xe0,0x92,0x18,0xb9,0xe7,0xe1,0xee,0xd5, - 0xfc,0x64,0xf7,0xd7,0x6f,0x2e,0x3c,0xf7,0x17,0x70,0xfd,0x43,0x1b,0xff,0x99,0xca,0x5f,0xf5,0x25,0x13, - 0x9a,0xee,0xab,0x45,0x38,0xc2,0x19,0x56,0x17,0x72,0xa2,0x61,0xb3,0x6e,0x85,0xb4,0x65,0x1d,0x09,0xaf, - 0xce,0x17,0x26,0x9d,0x74,0x1c,0x30,0x3c,0x24,0x9e,0xae,0xb0,0x9a,0x46,0x79,0x7b,0xea,0xb7,0xf0,0x17, - 0x7d,0x66,0xe5,0x32,0x88,0xed,0xf1,0xc7,0x2a,0xb7,0xb8,0x7b,0x1b,0x96,0x83,0x95,0xc5,0x3a,0x84,0x55, - 0x5a,0x59,0xbb,0x69,0xe0,0x90,0xaa,0x21,0x23,0x62,0x74,0xde,0xbf,0xd8,0xd9,0x49,0xad,0xcf,0x84,0x94, - 0x73,0x6c,0x6b,0x12,0x26,0xd8,0x2d,0xf8,0x06,0x62,0xee,0xcc,0xa9,0x52,0x5d,0x5e,0x2e,0x16,0xd4,0xca, - 0x10,0x4f,0x91,0x79,0xe5,0x1d,0x90,0xb5,0x9c,0x5f,0x54,0x46,0x66,0xb8,0xb5,0xc8,0x25,0x69,0x8b,0x3e, - 0xc3,0xe2,0xc0,0xc4,0x9f,0x99,0xa9,0x75,0x00,0xb5,0x86,0xe7,0x07,0x17,0xd5,0xfe,0x42,0x1d,0xd3,0xb4, - 0xc0,0x9d,0x2a,0x77,0x52,0x62,0xf6,0xa5,0x35,0xa4,0xfb,0x38,0xa4,0x29,0x0e,0xe9,0x3e,0x0d,0xe9,0x0c, - 0x37,0xc0,0x0c,0x36,0x80,0xa9,0x2e,0x9d,0x14,0xc0,0x7e,0xad,0xd8,0x02,0x09,0x6b,0x43,0xe7,0xc1,0xc1, - 0x60,0x2f,0x1e,0x52,0x7b,0x80,0x37,0xc6,0xf6,0x40,0x67,0xe7,0xad,0x60,0xbe,0x87,0x4b,0x95,0x3d,0x0f, - 0xef,0x2e,0xfd,0x74,0xd4,0xf1,0x0d,0x37,0x70,0xde,0xed,0x7d,0xeb,0xce,0x76,0x07,0x5e,0xcb,0x1c,0x9d, - 0xe7,0xd9,0x45,0x8b,0x06,0x6b,0xd4,0xf5,0x3b,0xde,0x05,0x1c,0xa2,0xf3,0x25,0x47,0x37,0x4d,0x14,0x49, - 0x6f,0xa4,0xbc,0xc0,0x47,0xc1,0x70,0x29,0xf2,0x8f,0xab,0x5f,0xa7,0xdc,0x98,0x00,0x73,0x3c,0x5d,0xc0, - 0x9e,0x50,0xb1,0xb5,0x2d,0x3e,0x61,0x5d,0x90,0x90,0xc5,0xcc,0x43,0xda,0x2e,0xb1,0x00,0x58,0x61,0xc7, - 0x32,0x60,0x4c,0x76,0xb4,0xf7,0x49,0x5c,0xf8,0x33,0x3a,0x92,0x73,0x7f,0x62,0x03,0x29,0x2f,0x58,0x4d, - 0x16,0x2e,0xa6,0x71,0xfa,0xb4,0xf8,0xcc,0x5c,0x2d,0x5d,0x9d,0x15,0xe9,0xdc,0xba,0x7c,0xc3,0xf6,0x80, - 0x27,0x85,0xe4,0x7c,0x39,0x61,0xef,0x9b,0x59,0xf8,0xa5,0xe1,0x16,0xca,0x82,0x59,0xc5,0xf1,0x03,0x93, - 0x73,0x9e,0xa1,0xcf,0x2b,0xbb,0x40,0x52,0xe2,0x07,0x9d,0x8f,0xc7,0x4d,0x46,0xe1,0x88,0x0e,0xee,0x39, - 0xa5,0xbc,0x63,0xf8,0xec,0x59,0xca,0x3f,0xcd,0x23,0x79,0x1b,0xeb,0x72,0x48,0xcc,0x6e,0x7f,0xa0,0xd6, - 0x7d,0x4f,0xc1,0x8d,0xf6,0x95,0x8b,0x62,0x6c,0x3d,0x81,0x04,0xbe,0x49,0x10,0xed,0x09,0x43,0x20,0x97, - 0x05,0xcd,0x64,0xe4,0xfc,0xe5,0x3f,0xfe,0x17,0xfa,0xe0,0xff,0xf8,0xcf,0xff,0xf3,0xff,0x06,0x5f,0xfb, - 0xcb,0x7f,0xfc,0x6f,0x84,0xcd,0x49,0xa3,0x19,0xc4,0xcd,0x28,0x9d,0x32,0x13,0x69,0xdc,0x72,0xf3,0x11, - 0xf9,0x97,0xe6,0x9c,0x37,0xaf,0xb1,0x30,0x76,0x30,0x47,0x65,0x27,0x7c,0x8c,0x70,0xeb,0x7c,0x8d,0xd5, - 0xad,0xc7,0x8a,0x47,0x1c,0xc7,0x96,0xd0,0x02,0x75,0xa2,0x0c,0x3b,0x25,0x4f,0x15,0x72,0x10,0x85,0x49, - 0x04,0xaf,0x29,0x46,0x8e,0xb4,0xdd,0xec,0xd2,0x30,0xf9,0x0e,0xcf,0x0b,0x5f,0x79,0x4b,0x0b,0x3c,0xc6, - 0x8c,0x56,0xe0,0xa8,0x6f,0xc3,0x7e,0x56,0xa6,0x88,0x51,0x44,0xa0,0x61,0x91,0x30,0x53,0x97,0xa0,0xeb, - 0x6b,0x01,0xe2,0x99,0xe5,0x25,0xc5,0x1f,0xc3,0xe5,0xe2,0x7a,0x77,0x7a,0xe9,0xc0,0xc6,0xd1,0xbf,0x51, - 0xd3,0x53,0x5a,0x52,0x5e,0x75,0x4d,0xe1,0x36,0xd3,0x1f,0xa9,0x3c,0xc3,0x4f,0x62,0x8e,0x9c,0xa6,0x65, - 0xe8,0xd5,0xda,0x81,0xa3,0xc6,0x1e,0xcc,0xa5,0x86,0xb1,0x9a,0x5d,0xad,0x72,0xf5,0xe3,0xfe,0x3e,0x89, - 0x6e,0x5d,0x29,0x70,0x9c,0xd0,0x4d,0x14,0xf6,0x3f,0x17,0xf7,0xf7,0xf2,0xe6,0x6d,0x34,0xfe,0x18,0x17, - 0xf6,0xa3,0x5a,0x24,0xec,0x56,0x19,0x6c,0x50,0x79,0xd0,0x90,0x71,0xcd,0xc9,0x17,0x39,0x0a,0x8e,0x0c, - 0xbe,0xac,0x3e,0xab,0x7c,0xbf,0xf5,0x35,0x8a,0xff,0xb4,0x64,0xb5,0xdb,0x84,0x7a,0xc2,0x09,0x57,0x5e, - 0xe7,0x93,0x78,0x36,0xc3,0xf0,0x35,0x32,0x8f,0x55,0x9e,0xfe,0x3a,0x24,0x9f,0x33,0x96,0xdb,0x02,0x27, - 0xff,0xf3,0x02,0x51,0xd2,0x34,0x7b,0x66,0x4a,0xb3,0xe8,0x85,0x9b,0xb3,0xd5,0xee,0xf4,0x88,0xe4,0x65, - 0x41,0x3e,0x8c,0xdb,0x57,0x21,0x1a,0x35,0xa3,0xe2,0x77,0x88,0x46,0x78,0x42,0x25,0x80,0xc3,0xcc,0xbd, - 0x9a,0xa7,0x76,0x9b,0x48,0x88,0x15,0x64,0x60,0x48,0x50,0xd4,0x56,0x94,0xc6,0xdb,0xeb,0x46,0x7d,0x24, - 0xc3,0x45,0xfb,0x12,0x56,0x44,0xfb,0x92,0xb4,0x15,0xc9,0xe4,0x4b,0xf5,0x13,0xf0,0x5c,0x64,0x9e,0xd6, - 0x1e,0x24,0x8f,0xdb,0x9d,0x6e,0x6f,0x84,0xd2,0x83,0xdf,0x59,0xd1,0xaa,0x76,0xb7,0x8f,0x26,0xde,0x55, - 0x4d,0xce,0x5a,0xc9,0x6e,0x24,0x11,0xed,0x56,0x96,0x81,0x1d,0xd0,0x0a,0x30,0xc6,0x48,0xba,0x70,0xa3, - 0xc1,0x3f,0xd6,0x17,0x7a,0xb8,0xe0,0x04,0x2e,0x30,0x5d,0x2f,0x2a,0x5a,0x45,0xc8,0x19,0xc3,0xdc,0x9c, - 0x7f,0xc2,0x92,0xca,0x60,0x0c,0xf7,0xed,0x85,0xad,0x91,0x97,0xe5,0x87,0x19,0xbe,0xf3,0x6c,0x72,0x0d, - 0x64,0x7b,0x16,0x4d,0xa9,0x11,0xb9,0xdb,0x34,0x1b,0xab,0xfb,0xd3,0x5c,0x5a,0xb6,0xa0,0x24,0xa5,0xd6, - 0xb7,0x47,0x79,0xdb,0x76,0x78,0x0f,0xa1,0xef,0x17,0x2e,0x47,0x89,0x24,0xba,0x9e,0xd0,0x07,0x41,0x79, - 0x63,0x6e,0xd8,0x8a,0xf5,0xac,0x65,0xfa,0x3c,0x60,0xea,0xcb,0x84,0xbf,0x63,0xe8,0x7e,0xf9,0x10,0x09, - 0x82,0xa8,0x9a,0x1d,0x20,0x1e,0x69,0x59,0x9e,0xbe,0xb9,0x27,0xcf,0x86,0xf2,0x4d,0xa2,0x6c,0x22,0x1e, - 0xdd,0x2d,0x7d,0x98,0xaa,0x52,0xa5,0x3b,0x3b,0xa6,0xf9,0xa5,0x07,0x94,0x04,0xbe,0xe4,0x66,0x58,0x39, - 0xbe,0xbc,0xc6,0xf3,0xac,0x72,0xee,0xc5,0x23,0xbc,0x89,0x72,0xe9,0xfd,0xbd,0x6b,0x9f,0x70,0x38,0x4a, - 0x9a,0x24,0xa8,0x43,0xc7,0x23,0x5f,0xf6,0xea,0x87,0x6a,0x8e,0x39,0xb5,0x51,0x29,0x4d,0x82,0x4c,0x5f, - 0x5f,0x3b,0x7e,0x3d,0x58,0x02,0xad,0xde,0x7e,0xc7,0xf3,0x1e,0x9c,0x00,0x45,0x25,0x38,0x57,0xb9,0xd2, - 0x8d,0xf2,0xab,0xa6,0xf8,0xc5,0xa2,0x32,0x81,0xe5,0x50,0x45,0x1b,0x57,0x8d,0x60,0x61,0xdd,0x13,0x2f, - 0x6c,0x74,0xb1,0xe2,0x59,0xd3,0xe9,0xd5,0x29,0xe7,0x0e,0x2a,0x25,0xf9,0xfa,0x6b,0xd3,0xee,0x24,0x81, - 0x15,0x9b,0xcb,0xbe,0x2b,0x51,0x23,0x0a,0xae,0x2a,0x15,0x23,0x84,0x1a,0xea,0x99,0x99,0x13,0x43,0x95, - 0xee,0xc6,0xcc,0x3a,0x26,0x6b,0x12,0x0d,0x05,0x27,0x49,0x7a,0xf8,0x48,0xc7,0x46,0xb5,0x11,0x07,0xdb, - 0x11,0x7a,0xdc,0x8c,0x1c,0x47,0xa3,0xbc,0xaf,0xc4,0x31,0xae,0xa0,0x14,0xd3,0xa7,0xd9,0xe5,0xf8,0x26, - 0xfc,0xac,0xc0,0xb0,0x7b,0x03,0x05,0x78,0x9c,0xd7,0x53,0x94,0xe8,0x37,0x28,0x72,0x94,0xbe,0xaa,0x6d, - 0xe3,0xa4,0x79,0x61,0x5f,0x4d,0x29,0x63,0xf9,0xda,0x01,0xb3,0xab,0xc0,0x3c,0xe0,0x96,0x84,0x2e,0x6e, - 0x6a,0xa0,0x1c,0x9e,0xac,0xb9,0xad,0xf4,0x01,0x78,0x9f,0x5b,0x97,0x96,0x5b,0xe7,0x10,0xbb,0x8c,0x46, - 0x8f,0x49,0xd3,0x7a,0x2b,0x42,0x7c,0x34,0x6d,0x5e,0x8a,0x59,0x7a,0x0b,0xac,0x0e,0xf4,0x66,0x6b,0x1a, - 0x67,0x05,0x32,0x39,0xd4,0x41,0x26,0xc2,0x15,0x54,0xdd,0x45,0x50,0x65,0xa7,0xe6,0xb4,0x3d,0xaf,0xeb, - 0xf7,0x61,0x58,0x57,0xf3,0x56,0x94,0x93,0x4d,0x5b,0x56,0x48,0xc3,0x5b,0xc7,0x6c,0x96,0xb7,0x15,0xcc, - 0x2c,0x2a,0x13,0x05,0xf0,0x92,0xff,0xfe,0xff,0xc2,0x54,0x7f,0x81,0xca,0x6c,0xd1,0xf4,0x0d,0x4e,0x96, - 0x41,0x4e,0x00,0xd6,0x67,0xa6,0x8d,0xc8,0xd0,0x53,0x86,0x85,0xc6,0xb2,0x20,0x3e,0x64,0x61,0x7e,0x4d, - 0xb4,0xc5,0x36,0xb5,0xc6,0xde,0x54,0x6b,0xd3,0x87,0x8c,0xf0,0xda,0x6c,0x2c,0x2c,0x6f,0xc6,0x66,0xe7, - 0xcc,0xbc,0x31,0x83,0x64,0x53,0x06,0x81,0x70,0x63,0x06,0x01,0x4f,0x5c,0xd2,0x2c,0xb9,0xe5,0x69,0x82, - 0x65,0x48,0x29,0xde,0x7d,0x0c,0x24,0x29,0xcd,0xdf,0x98,0x8a,0x03,0x81,0x2d,0xbf,0x80,0x41,0x96,0x18, - 0x66,0x52,0xb9,0x97,0x1a,0x89,0xe3,0xd6,0x22,0x68,0x96,0x92,0xf1,0xd2,0xa5,0xdc,0xd9,0x7b,0x3f,0x9e, - 0xdb,0xee,0xc7,0x77,0x20,0x84,0x1b,0xb7,0x95,0xf2,0xa7,0x90,0xe7,0xaa,0x7f,0x7c,0x67,0xc7,0xb2,0x3b, - 0x56,0x5e,0x50,0x3c,0xf6,0xb4,0x41,0x04,0x41,0xdc,0x60,0xc1,0x78,0x98,0xa2,0xe9,0x39,0xaf,0x68,0x31, - 0x66,0x94,0xf9,0xf4,0xe3,0x28,0x1e,0x4d,0x9a,0x72,0x67,0xe1,0x94,0x49,0x88,0x65,0xcf,0xf3,0xb7,0xe1, - 0x64,0x29,0x37,0x62,0xf5,0x5b,0xd0,0x02,0xa6,0x09,0x9e,0x5f,0x2f,0x23,0x79,0xbc,0x4a,0x0e,0x3a,0x26, - 0x7a,0x28,0x95,0x62,0x38,0xdc,0xff,0xfd,0x7f,0x12,0x4c,0x66,0xdb,0x08,0x92,0xc8,0xf2,0x95,0x53,0x88, - 0x6d,0x61,0xfa,0xf0,0xa6,0xea,0x39,0x4a,0x48,0xdc,0x58,0x58,0xcc,0x18,0xf7,0xf8,0x11,0xf8,0xe1,0x9d, - 0x9d,0xed,0x78,0x67,0x87,0x7a,0xbe,0x30,0x8f,0xaf,0xad,0x92,0x58,0x50,0x44,0xcb,0x59,0xa3,0x79,0x20, - 0x2f,0xa2,0x72,0xde,0x01,0x17,0x45,0x40,0x69,0xde,0x44,0x37,0x76,0xcd,0xd6,0x97,0xee,0x7a,0x08,0xc1, - 0x80,0x3f,0x5c,0x26,0x6a,0x4a,0xb1,0x6a,0x11,0xc5,0x61,0x21,0xc7,0xe3,0x51,0xbf,0x39,0x4b,0x66,0x75, - 0x31,0xab,0x05,0x11,0x14,0x98,0x4b,0x50,0xd6,0xb7,0xc6,0xf3,0xdd,0x72,0x7c,0xef,0x0d,0x28,0x1b,0xaf, - 0x7c,0xbd,0x89,0x1c,0xdf,0xda,0xc9,0x38,0x3f,0x01,0x17,0x35,0x4e,0x61,0xcd,0x47,0xee,0x2d,0xa2,0xe5, - 0xe9,0xb5,0xb7,0x06,0x24,0xf9,0x53,0x73,0xba,0x5f,0xf3,0x74,0xb1,0x39,0x11,0x52,0x9d,0x59,0x5c,0x28, - 0x9d,0x46,0x59,0xf2,0x52,0x5b,0xf0,0x96,0x44,0x72,0x9c,0xe7,0xb2,0xa8,0xb6,0xa0,0xbc,0x0b,0x1b,0x3e, - 0x58,0xaf,0xa4,0xc6,0x5d,0x5e,0x8b,0x3b,0xda,0xe5,0x3e,0x9a,0x91,0x84,0xbd,0x38,0xf1,0x03,0x37,0x0f, - 0x81,0xa3,0xd7,0xd4,0xa2,0x34,0x9b,0xc3,0x9b,0x15,0x09,0xac,0x1a,0x20,0x84,0x1e,0x42,0x4d,0xd1,0xd5, - 0x9d,0x5b,0x5a,0xa6,0x5e,0x98,0x33,0x17,0x98,0x91,0x80,0x08,0xdb,0xbf,0x0e,0xa5,0xc6,0xe3,0xe9,0x41, - 0x74,0xba,0xb4,0x3d,0x29,0x37,0xd6,0x54,0x39,0x05,0x64,0x6b,0x32,0xaf,0x2c,0xc4,0xb5,0xb8,0x11,0x57, - 0x1e,0xe6,0x14,0x40,0xb4,0xa9,0x2e,0xf9,0x34,0x91,0x1b,0xee,0x1a,0x72,0x94,0x61,0xec,0x9c,0x8a,0xcd, - 0x55,0x14,0x82,0x1d,0x05,0x7d,0x74,0xa7,0x98,0x6a,0x47,0xbf,0x5a,0xe2,0x58,0xa7,0xc5,0xf4,0x09,0xe4, - 0x78,0xac,0xca,0xc2,0xe4,0xc9,0x37,0xac,0xa8,0x1a,0x74,0x68,0x9b,0x79,0x3c,0x8f,0xed,0xd0,0x95,0x34, - 0xdf,0xda,0x87,0x2b,0x76,0x19,0x71,0x5f,0xfb,0x48,0x14,0x98,0x53,0xa5,0x19,0x85,0xd4,0x64,0xbd,0xc1, - 0xf1,0x16,0xe7,0x51,0x7d,0xdc,0x90,0x91,0x51,0x29,0x19,0x6f,0xc2,0x0c,0xbd,0xeb,0xba,0x9d,0xf9,0xe7, - 0xad,0xce,0x56,0x07,0x9d,0x2b,0xbc,0x0b,0xc3,0x43,0x66,0x21,0x0a,0x6b,0x92,0x55,0x5f,0x9b,0x9f,0x99, - 0x73,0x1e,0x97,0x6a,0xdd,0x9d,0x45,0x97,0x85,0x1f,0x2e,0x8a,0x94,0x99,0x58,0xaa,0x0c,0x85,0xa9,0xb9, - 0x5c,0x0f,0x9b,0x59,0x7e,0x0e,0xdd,0xd6,0x60,0x5f,0x1a,0x26,0x95,0xf3,0x72,0x34,0x64,0x3a,0x53,0x8c, - 0x1a,0x74,0xa2,0x0a,0x77,0xe1,0x7a,0x9b,0xb6,0x10,0xaa,0x48,0x64,0x26,0x38,0xf5,0xd3,0x87,0x6f,0x1a, - 0xc8,0x67,0x76,0xf0,0xaf,0x4d,0x62,0x06,0x0b,0xa9,0xc2,0xff,0x65,0xb3,0xa6,0x72,0x8b,0x4a,0xb9,0xa5, - 0xe7,0x59,0x71,0xfa,0xcc,0x99,0xe3,0x52,0x80,0xd7,0x4b,0x81,0x4f,0x29,0xb4,0x1d,0x1b,0x62,0xe5,0x6c, - 0x83,0x53,0x06,0x53,0x3f,0x62,0x69,0xfa,0x51,0x4a,0x68,0x32,0xb3,0xe7,0x0a,0x58,0xff,0x10,0x61,0xa7, - 0xb8,0xf5,0x8e,0x43,0x8d,0x73,0x60,0x4a,0xe2,0x75,0x7c,0x6e,0x52,0xe5,0x73,0xcb,0xfc,0xb8,0x5a,0x4a, - 0x89,0x12,0x03,0xd8,0xe8,0x5f,0x65,0xc8,0x69,0xca,0x9b,0xa5,0x87,0x2a,0x7f,0x69,0x15,0xd5,0xec,0x79, - 0xf5,0x6b,0x0b,0xf3,0x35,0xe8,0x44,0xe3,0xc7,0xe0,0x7e,0x03,0xf3,0x6a,0x1e,0x35,0xf3,0xf7,0xd9,0xcd, - 0x96,0xe2,0xfe,0xeb,0x2c,0x3a,0x67,0xb1,0x2f,0x33,0x67,0xff,0xbf,0xe1,0xd9,0x13,0x1d,0x94,0x6d,0x1c, - 0x61,0x48,0xb9,0x88,0x39,0x05,0xcd,0x3d,0xfb,0x04,0x72,0x9b,0xd9,0xf0,0xf9,0x26,0xf2,0x3e,0x77,0x2d, - 0x56,0x3c,0x69,0xe0,0xa3,0x43,0xe9,0x39,0x3d,0xa9,0x3f,0x80,0xb9,0x83,0xd6,0xd0,0x4a,0x0f,0xd4,0x32, - 0xb7,0x58,0xed,0x0a,0xfb,0x9e,0x04,0xe5,0x2a,0x60,0x03,0xe0,0xf6,0x21,0xb8,0x2e,0x0c,0xa3,0x82,0x2a, - 0x63,0x8c,0x8c,0xdd,0xb8,0x91,0x59,0x13,0x22,0x1d,0xd7,0xd1,0xdd,0x53,0x51,0xfa,0xc8,0xd8,0xb3,0x47, - 0x59,0xa0,0x56,0x18,0x1a,0xaf,0x31,0xb1,0x27,0x9c,0x42,0x7b,0x3f,0x52,0xdc,0xf7,0xc8,0xff,0x61,0xef, - 0x87,0x3d,0x95,0xf5,0x20,0xf1,0xac,0xc2,0xc0,0x11,0xd3,0x8a,0xf4,0x51,0x3f,0x63,0x6e,0x4f,0x17,0xf3, - 0x88,0x11,0x22,0x56,0xb1,0xf1,0xdb,0x59,0xf3,0x53,0xc9,0xc4,0x93,0xac,0x31,0xad,0xe7,0x9a,0xa8,0xb2, - 0xbf,0x14,0x1d,0xbc,0x9d,0xed,0xec,0xd0,0x0b,0xd7,0x4d,0xcf,0x3c,0xb1,0x9d,0x2d,0xd7,0xf1,0x49,0x75, - 0x36,0xa6,0x3c,0x13,0x43,0x95,0x11,0xae,0xc6,0x37,0xc1,0x47,0x47,0x77,0x48,0x89,0xca,0x33,0xb5,0xf4, - 0x15,0xe9,0xf5,0x31,0x78,0x64,0xe1,0x3e,0x98,0x8f,0x5a,0xc9,0x30,0xb9,0x4d,0xbc,0xc8,0xfc,0x6b,0x79, - 0x11,0x79,0x18,0x8f,0x0d,0xe7,0x8b,0x5f,0xc5,0xd4,0x6c,0x16,0xff,0x7b,0x3e,0x13,0x93,0x8b,0x32,0x95, - 0x5e,0xc9,0xf1,0x8e,0x1b,0xf3,0x13,0x23,0x52,0xea,0x2a,0x46,0x47,0xb2,0x39,0x53,0x78,0xcf,0x42,0x12, - 0xc7,0x63,0xad,0x49,0xf5,0xa4,0x3c,0x2e,0x46,0x31,0x9d,0x5f,0xb3,0xf5,0x79,0xb9,0x25,0xf9,0x65,0x15, - 0xd3,0x85,0x27,0x52,0xd7,0x5b,0xda,0x99,0x56,0x4a,0x0c,0x90,0x2a,0xce,0x19,0xb4,0x6b,0x7e,0xe9,0x0f, - 0x0d,0x8e,0x25,0x3a,0x8b,0x9e,0x2f,0x12,0x99,0x26,0x96,0xf1,0x8e,0x62,0x52,0x56,0x33,0x57,0xea,0x5f, - 0xd4,0xeb,0xcf,0xd7,0xd6,0x5f,0x4f,0x5b,0x9e,0xb7,0xa9,0xfd,0x6d,0xa9,0x24,0x1d,0xa9,0x0e,0x69,0xa5, - 0x29,0xb3,0x85,0xaa,0x98,0x6c,0x5c,0x4b,0xbf,0x47,0x64,0x17,0x0e,0xc8,0x5d,0xab,0x10,0x93,0x62,0x38, - 0x2b,0x7d,0x75,0xc7,0xb8,0x39,0x56,0x39,0x9f,0xed,0x4a,0x03,0x6c,0xc9,0x82,0x14,0xc8,0xa1,0x71,0x5b, - 0x2d,0x3d,0xf1,0x4a,0x6a,0xd9,0xba,0x72,0xb9,0xc1,0x42,0xfa,0xf5,0xfa,0x66,0x54,0xd9,0x53,0xca,0x33, - 0xe9,0x0d,0xfd,0x14,0x91,0x21,0x40,0xbc,0x8c,0x65,0x26,0x00,0x7b,0x9e,0x88,0xe5,0x8e,0xdc,0xbc,0x34, - 0x61,0x5a,0x11,0xb1,0x9e,0x1b,0x0e,0x57,0x73,0xc3,0xe1,0x4a,0x6e,0x18,0x28,0x8c,0xe4,0x86,0x43,0xc9, - 0x0d,0x53,0x11,0x14,0x70,0x52,0x4a,0x67,0xb5,0x91,0x2d,0x5e,0x90,0x5b,0xe7,0x6c,0x06,0xcd,0x59,0x88, - 0x41,0xd4,0x07,0x26,0x39,0xfc,0x5a,0x26,0x79,0x2a,0x12,0x9b,0x4d,0xbe,0x99,0xf7,0x57,0xeb,0xb3,0xf1, - 0x38,0xda,0xc8,0xe8,0x86,0x78,0xb6,0x94,0x55,0xb7,0xc4,0xb4,0x39,0x8e,0xe4,0x83,0x39,0xa9,0xe0,0x5a, - 0x96,0xb7,0x21,0xa5,0x6f,0x22,0x3d,0x82,0xd1,0x97,0x1d,0x1a,0x89,0xf6,0xc0,0x9d,0x1d,0x07,0x7d,0x22, - 0xc3,0x46,0x53,0x35,0x6d,0x71,0xe3,0x65,0x55,0x67,0x61,0x89,0x4b,0x82,0x2d,0x35,0xaa,0x7b,0x4c,0xa3, - 0xdd,0x9a,0x05,0xa3,0xf2,0x5e,0xa2,0x0d,0x51,0x9d,0x4d,0x81,0x56,0x9e,0xb8,0xe1,0x03,0x25,0xc3,0x31, - 0x89,0xa7,0x95,0xcd,0x81,0x67,0xf7,0xc8,0xfd,0x0a,0x83,0x4b,0xc5,0x7a,0x62,0x99,0xa8,0x62,0xca,0xc1, - 0xe8,0x6f,0xc7,0xb5,0xfd,0x97,0xfc,0x7f,0xba,0xff,0xac,0xcc,0x84,0xeb,0xd3,0xc5,0xc3,0x94,0xfe,0x72, - 0x2f,0x96,0xd9,0xe2,0xab,0x6c,0x2b,0x1a,0xe0,0x68,0x97,0x7c,0xbd,0x56,0x25,0x6c,0xd6,0xaa,0x34,0xe9, - 0x58,0x18,0x17,0x9a,0x8c,0xd5,0x40,0x79,0x5f,0xbd,0xe9,0xff,0xcc,0x5c,0xec,0xd0,0xd2,0x4a,0x33,0x42, - 0x6b,0xa6,0x42,0x6d,0x4c,0x2c,0x99,0x3e,0x11,0x38,0x7a,0x41,0x1e,0x46,0x45,0x83,0x91,0xb1,0xdc,0x25, - 0xad,0x02,0xe2,0xe6,0xc3,0xa1,0x47,0xd4,0x17,0xd8,0x42,0x2b,0x82,0xe8,0x01,0xef,0x19,0x2d,0x58,0x5c, - 0x1f,0x72,0x64,0x99,0xd7,0x8e,0x77,0x8d,0x13,0x8a,0xc5,0x1d,0xcc,0xa2,0x9f,0x2c,0x3d,0xb3,0xed,0xfe, - 0xad,0xd8,0xff,0xf5,0xda,0xf9,0xf9,0x8a,0xa9,0x4c,0x1e,0xac,0x98,0xcf,0x36,0x2b,0xe6,0x35,0x3f,0xbd, - 0x42,0x12,0x45,0xd2,0x0a,0xb2,0x22,0xd2,0xb0,0x5d,0xfc,0x89,0x31,0xf9,0xf5,0x48,0x96,0xe4,0x46,0x8d, - 0x05,0xaf,0xb3,0x25,0xb9,0xda,0xd4,0x03,0x5e,0x7e,0x02,0xd2,0x7d,0x79,0x53,0x10,0xfa,0x85,0xcb,0x8b, - 0xd0,0xf3,0x56,0xf2,0x5b,0xa1,0x88,0x11,0x8f,0x7b,0x95,0x9d,0xc8,0x6b,0xd2,0x30,0x54,0x18,0x93,0x6c, - 0x9d,0x2d,0x12,0x7b,0xf6,0x15,0x60,0xab,0x40,0xd5,0xf5,0x96,0x2f,0x61,0xbe,0x7f,0x8d,0xe1,0xb2,0xae, - 0x66,0xca,0x19,0x1f,0xe9,0x69,0x98,0x4d,0x5d,0x0c,0xab,0x49,0x9a,0x98,0xc9,0x94,0x78,0xc8,0x1c,0x11, - 0x88,0xb5,0x05,0x33,0xf9,0x2a,0x0b,0x66,0x92,0x52,0x8f,0x18,0xe5,0xc5,0x0d,0x37,0x2d,0x8c,0x4c,0x43, - 0x1a,0xde,0x25,0x98,0x78,0xd5,0x3f,0xe7,0x88,0xf4,0x3f,0xc1,0x1a,0x6c,0x1c,0x48,0x07,0x47,0x46,0xa8, - 0x1b,0xd1,0x15,0xdc,0xf9,0xcb,0xff,0xf1,0x8f,0x76,0x30,0x3b,0x59,0x11,0x5c,0x2c,0xe6,0x61,0x70,0x3f, - 0x92,0xeb,0xe4,0x42,0xc0,0xd9,0xfe,0xd1,0x87,0x79,0x86,0x51,0x38,0x9b,0xa5,0x05,0xb0,0xaa,0xd5,0x69, - 0xc5,0xbd,0xcf,0xf4,0xcd,0xa2,0xc5,0x57,0x11,0x83,0xa1,0x9e,0xb5,0xe1,0x93,0x0a,0xfc,0x29,0x9c,0xb2, - 0xd3,0x4e,0x38,0xcf,0x5d,0xb7,0x61,0xde,0x27,0xe1,0x3c,0x1c,0xc7,0xb3,0xb8,0x20,0x0b,0xb4,0x47,0x27, - 0xf3,0xfd,0xfd,0x9d,0x76,0xfd,0x4f,0xca,0xee,0x3d,0x0f,0x48,0xf7,0x2b,0xc7,0x56,0x03,0xe8,0x28,0xc4, - 0x0f,0x68,0x9e,0x24,0xe1,0x0c,0x6f,0x9e,0x7c,0x51,0x2d,0x33,0xb8,0x8a,0x5f,0xf7,0x0d,0xe8,0xa6,0x32, - 0x40,0x33,0x9d,0xba,0xcb,0x99,0xe3,0xf1,0x81,0x4e,0x63,0x9e,0x67,0x04,0x25,0x96,0xb7,0xce,0xae,0x23, - 0x84,0x32,0x6e,0x8c,0x49,0x2b,0x2b,0x0a,0x41,0xc6,0x42,0x22,0xec,0x63,0xd5,0x50,0x2d,0x6c,0x79,0xff, - 0x53,0x98,0xb9,0xbb,0xbb,0xb7,0x61,0x96,0x78,0xc6,0xf6,0x7d,0xb3,0x60,0x92,0x02,0xe4,0x15,0xa8,0x31, - 0x35,0x38,0x37,0x1e,0xa7,0xc0,0x8a,0xa6,0xca,0x79,0x5f,0xe6,0x3e,0x22,0x76,0x49,0x79,0x36,0xdd,0x7c, - 0x7c,0x1e,0x47,0xc8,0x23,0x8a,0x0a,0xe0,0xd5,0x52,0x9c,0xfd,0xf1,0xec,0xf9,0x79,0x74,0x21,0xee,0xae, - 0x51,0x25,0xe6,0x89,0x8e,0x54,0xfd,0xdb,0x87,0x76,0x82,0x1c,0x5c,0xc5,0x61,0x82,0x75,0x88,0x27,0xef, - 0x9e,0x7e,0x67,0x69,0x11,0x0d,0x78,0xda,0x1d,0xd4,0xe9,0x87,0x04,0xb3,0x0d,0xe7,0x85,0x3c,0x61,0x60, - 0x03,0x37,0xc5,0x7c,0x0a,0x74,0x7a,0x5e,0x5a,0x26,0x14,0x72,0xf9,0x3c,0x8f,0x44,0x78,0x81,0xac,0x69, - 0x1b,0xa8,0xe0,0x05,0xb2,0x23,0x50,0x09,0xa2,0x52,0x0e,0xdd,0x32,0x01,0xdf,0x28,0x66,0xe9,0x56,0x61, - 0x0e,0x75,0x1a,0xf7,0xb6,0x1c,0xf6,0x40,0xea,0xca,0x73,0x60,0xf0,0xa7,0xa7,0x09,0x49,0xbb,0x68,0xac, - 0x77,0x68,0xa6,0x29,0xcf,0xa4,0x4a,0x32,0x5e,0xc0,0x5e,0xa1,0x2f,0x6e,0xc5,0x40,0xac,0x91,0x41,0xa2, - 0xe4,0x30,0xe7,0xc5,0x85,0x57,0x89,0x5c,0x71,0x15,0xe0,0x33,0x87,0xe4,0x8a,0x89,0x0e,0xf7,0xbf,0x0e, - 0xf3,0xb3,0x38,0xf9,0x08,0x33,0x0a,0x1b,0xd6,0xc2,0x95,0xb4,0xb9,0xe7,0xe1,0x0c,0x23,0x64,0x61,0x4f, - 0x8a,0x90,0xcb,0xd1,0x0a,0x98,0xf7,0xd1,0x63,0x43,0xfe,0xe2,0x4c,0x98,0xc0,0xed,0xe3,0xd5,0xef,0xd2, - 0xd9,0x82,0x23,0x21,0x88,0x4c,0x80,0x34,0x4e,0xba,0xc3,0xb6,0xda,0xcf,0x4b,0xfb,0xbb,0xc4,0x97,0xc2, - 0x97,0x43,0xf5,0x53,0x4b,0xb2,0x1c,0xad,0xa8,0xae,0xbe,0xe3,0xea,0xe9,0xb7,0xfa,0x40,0x59,0x13,0x1e, - 0x3c,0x9e,0xe1,0x2c,0xce,0xfb,0x5a,0x84,0xe4,0x2b,0xa9,0x62,0x45,0x22,0xd7,0x95,0x26,0xf0,0x35,0x1d, - 0xff,0xca,0x89,0x54,0xf2,0xec,0xfa,0x4f,0xdb,0x93,0x31,0x8c,0x8c,0xac,0x13,0x91,0xac,0xb3,0xd4,0x6d, - 0x19,0x2f,0x7e,0xfa,0x09,0x13,0xbe,0x82,0xb0,0x25,0xc3,0x57,0x90,0x2a,0xa9,0x0d,0x27,0x9d,0x64,0xac, - 0x2b,0x33,0xec,0xfc,0xa6,0x1a,0x98,0x9a,0x43,0x0f,0xcf,0xc1,0xce,0x8e,0xd9,0xaa,0x13,0xa5,0x4b,0x78, - 0x73,0xc2,0xa1,0x3b,0xdd,0x03,0x81,0x3f,0x9f,0xbc,0x7f,0xf1,0xf2,0xdd,0x8b,0xef,0x83,0xf3,0x73,0xe7, - 0xe9,0x2c,0x5d,0x60,0x56,0xe5,0x0e,0xfc,0xef,0xf9,0xf3,0x2d,0xfc,0x73,0xf4,0xe4,0x2b,0xff,0x98,0xf7, - 0x8e,0x0e,0x9f,0x9e,0x9e,0xea,0x3f,0x27,0xcf,0x9e,0x1d,0x9d,0x1e,0x6c,0x3d,0xa7,0xff,0xa9,0x2b,0x7e, - 0xe6,0x5c,0x88,0x73,0xe7,0x65,0xf8,0x29,0x94,0x9f,0xee,0x74,0xb6,0x8e,0xf8,0x4f,0xf9,0xea,0xe8,0x49, - 0xe9,0x4f,0xe3,0x4d,0xfe,0xf3,0xfc,0xb9,0xfc,0x73,0xb2,0x4f,0x7f,0xe8,0x9b,0xfa,0xca,0x2a,0x49,0x9f, - 0x7e,0x3d,0x89,0x90,0x41,0x71,0xba,0xc7,0xdd,0xe3,0xc3,0x8e,0x6a,0xbe,0x7d,0xd5,0xb1,0x7b,0xf8,0xf4, - 0xd9,0x56,0xef,0xf4,0xe8,0xc9,0xfe,0xe1,0x16,0x3e,0x81,0x67,0xfb,0xcf,0x8f,0x4f,0x4f,0x3a,0xa6,0xf7, - 0x47,0x4f,0xa0,0xe4,0xc1,0xe0,0x78,0xff,0xf4,0xd9,0xd6,0x21,0x7c,0xf9,0xd9,0xc0,0xbc,0x40,0x2d,0xc1, - 0x6e,0x3f,0x3f,0xa1,0x6f,0x3f,0x4f,0xd1,0xed,0x99,0x3a,0x7e,0x30,0xa0,0x1e,0xd3,0x9f,0xfd,0xfd,0x83, - 0x27,0xbd,0xe7,0x5b,0xfa,0x26,0x76,0x76,0xab,0xd7,0x3b,0x7a,0xd2,0xeb,0x6d,0x1d,0x3c,0x39,0x3a,0xed, - 0xf5,0xf5,0x4d,0xae,0xf9,0xe0,0xe0,0xe9,0xb3,0x93,0x93,0xad,0x7e,0xef,0xe9,0xb3,0x7e,0x6f,0xeb,0xf8, - 0x84,0xff,0x74,0x4e,0x4f,0x8f,0x3b,0x5b,0x87,0x4f,0x9f,0x3f,0x85,0x92,0xb2,0x08,0xd7,0x42,0x1f,0x47, - 0x7f,0xa0,0x39,0x42,0xae,0xca,0x31,0x91,0xc3,0x7d,0xf2,0x64,0x7f,0xdf,0xbe,0x3a,0x79,0x62,0xae,0xb0, - 0x07,0xf6,0x15,0x96,0x35,0x57,0x7a,0xfa,0xa9,0x0b,0xf8,0xd4,0xd4,0xd2,0xe9,0xe8,0x92,0xf4,0xf1,0x37, - 0x21,0x29,0x4a,0x1d,0x59,0xee,0x08,0x3a,0x7a,0xf8,0x74,0xeb,0x09,0x5c,0x0d,0x9e,0x6c,0x9d,0xc2,0x9f, - 0x2e,0xfc,0x39,0xea,0x1e,0xc2,0xcb,0x4f,0x8e,0x06,0x87,0x54,0xc7,0xe1,0xa1,0x69,0x90,0x6c,0xe5,0xb3, - 0x67,0xbd,0x1e,0xce,0x2a,0xfc,0xd3,0x39,0xdd,0x7a,0x0a,0x7f,0xfa,0xa7,0x5b,0x47,0xd0,0xc6,0xc3,0x2e, - 0x4c,0x0c,0x54,0xdd,0xdd,0xea,0xc1,0x9f,0x67,0xd4,0xbc,0xc3,0xe7,0xc7,0xf4,0xed,0xef,0xa2,0xb0,0x30, - 0x8b,0xad,0xdf,0xa7,0x3f,0x07,0x07,0xf4,0xe7,0xf8,0x98,0xfe,0x3c,0x7d,0x5a,0x5e,0x49,0x58,0x08,0xfe, - 0x60,0x21,0xf8,0x83,0x85,0xe0,0x0f,0x16,0xa2,0xe5,0x25,0xff,0xf4,0xfb,0xf4,0xe7,0x80,0xd7,0xf9,0xf1, - 0x31,0xfd,0x79,0xfa,0x54,0xae,0x40,0xfa,0xf4,0x5b,0x90,0x67,0xc7,0xa8,0xd6,0x50,0x83,0xfe,0x6c,0xbf, - 0x77,0x62,0xba,0x03,0x7d,0x7c,0x6e,0xfa,0xb8,0x7f,0xf0,0x6c,0xdf,0x1e,0x74,0x2c,0x6b,0x06,0x7d,0xff, - 0xe0,0xe4,0x44,0x0d,0x3a,0xd6,0xf1,0x6c,0x5f,0x0d,0x3a,0xd6,0x71,0xd4,0x55,0x83,0x8e,0x75,0xf4,0x60, - 0x97,0x5d,0x00,0x8f,0x30,0x7b,0x1e,0x27,0x53,0x84,0xd9,0xb1,0xb6,0xbe,0x41,0x36,0x23,0x97,0x05,0x3b, - 0x68,0x84,0x4e,0xa6,0xd2,0x1d,0x0f,0x2b,0x79,0xb2,0x00,0x6e,0x38,0x4e,0x02,0xdb,0xe5,0x42,0xd6,0x6d, - 0xd0,0x11,0xef,0x50,0xd7,0x96,0xfb,0x6e,0x31,0x2a,0x30,0x90,0x4a,0xfa,0x54,0x6c,0x39,0x9e,0x5f,0xca, - 0xe0,0x3a,0xf1,0x9d,0x5f,0x80,0x88,0x23,0xe6,0x7e,0x67,0x89,0xb5,0x23,0x33,0x3b,0xf5,0x51,0xdd,0x8b, - 0x5f,0x7a,0x91,0x3f,0xe8,0x5b,0x5b,0xf8,0x91,0xce,0x05,0x59,0xd4,0xe0,0xe1,0xf7,0xd1,0x2d,0xbb,0x1a, - 0xc9,0x36,0x9c,0xd3,0x57,0x78,0xc0,0x1d,0xfa,0x92,0xa0,0x3b,0x3c,0x78,0x78,0xa7,0xdb,0xe9,0x2c,0x2f, - 0xac,0x8f,0x5b,0x61,0x8a,0x50,0xdf,0xcb,0x28,0x9b,0x23,0x6b,0x23,0x12,0x2b,0x5f,0xa3,0x85,0xcd,0x18, - 0x3d,0x7e,0x1c,0xee,0xf4,0xf6,0xf7,0xd1,0xbd,0xaf,0xe5,0xba,0x6e,0x21,0xaf,0xbd,0xdd,0xd8,0xfb,0x36, - 0xb9,0x37,0xae,0x19,0xf9,0xa3,0xce,0xa8,0xe3,0xe7,0x8f,0xe1,0xd9,0x08,0xfe,0xf3,0x73,0x8d,0xb0,0x11, - 0x62,0x5e,0xad,0x47,0x8f,0xba,0x07,0xf7,0xa1,0x7b,0x04,0x3f,0x8e,0xe0,0x6f,0xc7,0xf6,0x72,0x0f,0x67, - 0xa7,0x9f,0x81,0xc7,0x9b,0xda,0xb1,0x92,0x14,0x5d,0x75,0x43,0xd9,0xde,0x25,0xaa,0xa5,0x24,0xee,0xc8, - 0x2c,0x91,0x4a,0x80,0x90,0x2d,0xa1,0x66,0xce,0x33,0xe4,0xe9,0x08,0x00,0x90,0x03,0x66,0x50,0xbf,0x15, - 0xb2,0xa8,0xbc,0x50,0x0a,0x3d,0x37,0x73,0xf4,0x9a,0x7a,0x91,0x30,0xde,0x0f,0xfb,0xa2,0x88,0xee,0x01, - 0x47,0x86,0x23,0xcf,0x52,0xad,0x2e,0x84,0x19,0xa8,0x62,0x68,0x62,0x96,0x36,0x93,0x16,0x0d,0x46,0xea, - 0x5b,0xb7,0xd8,0xed,0x7a,0x7b,0x5d,0x1c,0x2b,0x2b,0x38,0x2c,0xf6,0x86,0x09,0x02,0x6d,0xaa,0xc1,0x0e, - 0xcf,0xf3,0x0b,0x11,0x9e,0xeb,0x0e,0xe6,0xad,0xae,0xc0,0x17,0x2f,0x44,0xbc,0x9b,0x9b,0xf4,0x64,0x0d, - 0xe3,0xf3,0x86,0xe6,0xf0,0xdf,0x6e,0x94,0xdc,0xbb,0x4f,0xbe,0x35,0x52,0x93,0xd2,0x58,0xc1,0xca,0x8a, - 0xda,0xf3,0x65,0x4d,0x3a,0x9c,0xef,0x16,0xed,0xf9,0xda,0x81,0x6c,0x7f,0xda,0x34,0x94,0xb0,0x64,0xbf, - 0x8d,0x28,0xac,0xf3,0x51,0xd0,0xdd,0xff,0x96,0x5e,0x9a,0x7b,0x77,0x34,0x8c,0x5c,0xc3,0x50,0x05,0x4e, - 0x2e,0x19,0x0b,0xb1,0x43,0x35,0x0e,0x61,0x2c,0x1f,0x15,0x3b,0x3b,0xf4,0x0e,0xfc,0x86,0xb7,0x1e,0x05, - 0xf1,0xd0,0xcb,0x5b,0x2d,0xac,0x0d,0xee,0x3c,0x86,0x16,0xa9,0x7a,0x60,0xd0,0x4b,0x35,0x29,0x76,0x9f, - 0xdf,0x86,0x77,0x81,0xeb,0xb7,0x6a,0xaa,0xcf,0x62,0xfb,0x93,0x90,0x0f,0x3f,0x89,0xf4,0x71,0x36,0x72, - 0xe3,0xdd,0xcc,0xdb,0x73,0x53,0xf8,0xd7,0xb7,0x12,0xcd,0xc9,0x8a,0xe1,0xcd,0x77,0xc8,0x02,0x07,0x64, - 0xb7,0xe1,0xfd,0x38,0xaa,0xcd,0x2d,0xb9,0xc1,0xe7,0x9e,0x6f,0x6d,0x0a,0xbe,0x65,0xfc,0x81,0x27,0x4c, - 0xa9,0x50,0x09,0xa4,0xa4,0x92,0xe2,0x71,0x77,0x44,0x83,0xb6,0x47,0x6b,0xd0,0xef,0x60,0x81,0x37,0x69, - 0xfe,0xfa,0x32,0x30,0x13,0xc3,0x5f,0x94,0xd5,0x01,0x67,0xdd,0x9e,0xfb,0xb2,0x1a,0xb7,0x10,0xea,0x2b, - 0x32,0x92,0x8b,0xe9,0xe9,0x2c,0x7a,0x17,0x7d,0x2e,0xb8,0xc1,0xa6,0x11,0x04,0x14,0x69,0x16,0x03,0x10, - 0xd1,0xf7,0x20,0xe3,0x49,0x22,0x8a,0xbe,0x2e,0xf2,0x4b,0xce,0xdf,0x61,0x8a,0xaf,0x39,0xf1,0xab,0xd2, - 0xd3,0xeb,0x07,0x72,0x89,0x81,0x7f,0x4b,0x34,0x88,0x7c,0x18,0xcb,0x09,0x9c,0x0b,0x15,0x43,0x99,0xc8, - 0xa9,0xb5,0xf2,0xba,0xa8,0x84,0x0d,0x7b,0x3f,0x64,0xa3,0x1f,0x92,0x3d,0x8f,0x80,0x27,0x94,0x33,0xdb, - 0xe3,0x40,0xed,0x00,0x4a,0x03,0x3b,0xe4,0x45,0x16,0x5a,0x71,0xc5,0x11,0x87,0x3d,0xc8,0x34,0x70,0xbf, - 0x40,0x0e,0xd5,0x8d,0x02,0x43,0x08,0x3c,0xb1,0x1d,0xd5,0xe3,0x72,0xad,0xc0,0xe7,0xbf,0x23,0xef,0xee, - 0x18,0xe8,0x5d,0xe4,0x9b,0x6d,0x23,0x33,0x89,0xec,0xfd,0x78,0xde,0xd9,0x3d,0x3e,0xd9,0x7d,0x1e,0xee, - 0x5e,0x5e,0xdc,0x1d,0x68,0xef,0xcb,0x5c,0xcb,0xc5,0x24,0xae,0xb0,0xbd,0xb7,0x43,0x6b,0xfc,0xb1,0x09, - 0x1f,0x28,0x74,0x3b,0x62,0x19,0x5a,0x0d,0x15,0xfe,0x30,0x45,0x68,0x2f,0x5d,0x53,0x51,0xae,0x09,0x83, - 0x70,0x03,0xbd,0x4b,0x0b,0xd1,0xed,0x78,0x22,0x7b,0x0c,0x8b,0xa1,0x54,0x2a,0x69,0xb5,0x96,0x85,0x0c, - 0xf6,0xe3,0x63,0x29,0x2f,0xcf,0x1b,0x6c,0x67,0x84,0xc0,0x92,0x89,0xf0,0x0a,0xa3,0x85,0x01,0x59,0x6c, - 0x1b,0x93,0xef,0x49,0x6b,0x1f,0xc5,0x06,0xb8,0x84,0xfb,0xdc,0xb4,0xef,0x85,0x3c,0x96,0x0a,0x7d,0xe0, - 0x6c,0x27,0x4b,0xcf,0xec,0x80,0x33,0xd4,0x1a,0x1d,0xe9,0x45,0x09,0x24,0x13,0xfa,0xf9,0xf8,0xf1,0x51, - 0x69,0x3d,0x9c,0x85,0x37,0x73,0x0a,0xad,0x28,0x9d,0x4a,0x70,0xf2,0x0c,0x04,0xd0,0x86,0xfd,0x9d,0x02, - 0x05,0xff,0xf3,0xf0,0x42,0x45,0xfb,0x3c,0x7e,0xdc,0x3d,0xa0,0x33,0x2a,0xc5,0xdf,0x47,0xf4,0x73,0x16, - 0xc0,0xbf,0x3b,0x39,0x0d,0x30,0x74,0xc1,0x1a,0xe0,0xf3,0xee,0x3e,0xea,0x5d,0xe1,0xb0,0x0a,0x61,0xeb, - 0x62,0x26,0xb9,0x47,0x8f,0x06,0x50,0x23,0x94,0xdf,0x4d,0x86,0x38,0x96,0xb2,0x95,0x6e,0x26,0x72,0xaf, - 0x65,0x2e,0x0b,0xfd,0x9d,0x04,0x95,0x68,0xe6,0x41,0x5a,0x2b,0x77,0xa4,0x8a,0xcd,0xac,0x62,0xb3,0x72, - 0x31,0x6c,0x1f,0x76,0x50,0x8e,0x39,0xce,0x89,0xeb,0x66,0x74,0x4e,0xa6,0x78,0x48,0x72,0x32,0x4c,0x6f, - 0x45,0x76,0xca,0x03,0xca,0x4e,0x69,0x06,0xf6,0xf5,0x98,0x53,0x1c,0xbc,0x8d,0x50,0xeb,0x08,0x57,0x51, - 0xf6,0x49,0xb9,0xfd,0x58,0x76,0x1b,0xda,0x6d,0x31,0x91,0x73,0x06,0x21,0x45,0x7d,0x8b,0x3d,0xf6,0x6f, - 0x61,0xec,0xed,0x6d,0x88,0x0a,0x96,0x49,0x98,0x7c,0x0a,0x73,0xcb,0x76,0x05,0x65,0xd0,0xa9,0x6d,0x44, - 0x59,0x57,0xd8,0x7f,0x47,0xc3,0x69,0x51,0x53,0xda,0x29,0x37,0x80,0x3c,0xc9,0x4a,0x27,0x19,0x25,0x0f, - 0xe1,0x89,0x8d,0xda,0x1f,0x3e,0x05,0x6a,0xbd,0x94,0x89,0x1c,0x2e,0x52,0x20,0x74,0xfa,0x8c,0x51,0xab, - 0xa9,0x90,0xb4,0x05,0x7d,0x21,0x3f,0x8c,0x67,0x18,0x10,0xa4,0x3b,0x54,0xe6,0x28,0xd4,0x4d,0x6b,0x63, - 0x4d,0x66,0x31,0x61,0xde,0x4c,0xe1,0x98,0x4c,0xf4,0xf5,0x77,0x11,0x82,0x2f,0xf1,0xf1,0x78,0x7f,0x8f, - 0x48,0x39,0xdb,0xd8,0xb0,0x2a,0xf2,0x8d,0x3e,0x69,0xa5,0xb7,0xad,0x54,0xb4,0xc7,0x9f,0x23,0x18,0x32, - 0xf8,0xe8,0xfd,0x7d,0x57,0xf4,0x50,0xff,0x79,0x8b,0xf5,0xcb,0xe2,0xe1,0x67,0xb7,0xcb,0x89,0x69,0x33, - 0x54,0x81,0xb8,0xc5,0xb7,0x21,0x39,0x40,0x5f,0xd3,0x37,0x57,0x14,0x4a,0xb0,0x90,0xa6,0x3b,0xea,0xd4, - 0x70,0xa9,0x51,0x14,0x1e,0x0a,0xb3,0x26,0xe3,0xf6,0x5c,0xa7,0x87,0x69,0x4a,0x10,0xf5,0x8b,0x3e,0x3b, - 0x2c,0x27,0x9c,0xcd,0x38,0xdf,0x2c,0x9d,0xbc,0x67,0xa8,0x98,0x09,0xcc,0xe6,0x8a,0xed,0x4f,0xf6,0x06, - 0x9d,0x6f,0x5d,0x20,0x1a,0xa3,0x62,0xcf,0xcd,0xe8,0xfc,0xa0,0x66,0xc2,0x08,0x63,0x48,0x09,0xbe,0xfe, - 0x16,0xc3,0xc8,0x0a,0xd1,0x11,0x5d,0xdd,0x7c,0xaf,0x8c,0xad,0xf5,0x26,0xa4,0x00,0xe8,0xdc,0xe4,0x07, - 0xbf,0x5b,0x0a,0xc6,0x62,0x84,0x5d,0x8b,0x50,0x77,0x01,0xb3,0xaf,0xe8,0x59,0xcc,0xb7,0xd3,0x60,0xbb, - 0x03,0x3b,0x04,0x9e,0x4d,0x0c,0xb2,0x18,0xb1,0xf0,0xd6,0x21,0x02,0xe7,0x87,0xef,0xc0,0x22,0xf3,0x5a, - 0xf5,0x83,0xb0,0x85,0x47,0x0c,0x14,0x55,0xc7,0x8b,0x70,0x28,0x77,0x4f,0x0d,0xe1,0x29,0x9c,0x49,0x5b, - 0xa8,0x58,0x04,0x75,0xb5,0xfd,0x65,0x41,0xb9,0x09,0xd8,0x39,0xab,0xe9,0xe5,0xeb,0xa9,0x23,0xb2,0x14, - 0xf5,0x89,0xca,0x5a,0x52,0x84,0x63,0x46,0xed,0x80,0x4d,0x28,0xcd,0x22,0x11,0x9d,0xd6,0xd1,0x54,0xc7, - 0xbe,0xb2,0x21,0xe1,0xba,0x67,0x9c,0x1a,0xe6,0x72,0x88,0xd0,0x76,0xb1,0x68,0xb0,0x1f,0x4c,0xae,0xa3, - 0x4f,0x8e,0xb2,0xa7,0xd0,0x85,0xc7,0xae,0x60,0xc0,0x8f,0x5f,0xb7,0xe7,0x84,0xf0,0xf3,0x7d,0x3a,0x6d, - 0x34,0xac,0xce,0x23,0xa8,0x28,0x42,0x3f,0x9b,0x86,0xf8,0x5c,0xdd,0x36,0x11,0xd5,0x02,0x74,0x87,0x1b, - 0xdc,0x94,0x6f,0xdc,0xed,0x15,0xdf,0xd6,0x26,0x4c,0xfe,0xba,0xe7,0x35,0xbb,0x3c,0x7f,0x8c,0xbe,0x4c, - 0x29,0x3b,0x20,0x76,0xc3,0x39,0x4d,0x30,0x48,0x1e,0x13,0x55,0xb6,0xe1,0xc1,0xce,0x0e,0x90,0x10,0x75, - 0xd1,0xec,0x85,0xfe,0x35,0xdf,0xd7,0xa6,0xb3,0xab,0x95,0xc1,0x3d,0x15,0x2f,0xc1,0x8a,0x8b,0x9f,0xf6, - 0x0f,0xbc,0x6c,0x58,0x27,0x30,0x7d,0x7a,0xa1,0x8c,0x03,0x45,0x2b,0x9d,0x71,0x7c,0x85,0xfe,0xeb,0xcd, - 0x2b,0x07,0x86,0x1d,0xad,0x12,0xf0,0xc6,0xa7,0xc6,0x02,0xe3,0x30,0x83,0x19,0x1f,0x8b,0x5b,0x4f,0x7c, - 0x69,0x2c,0x40,0xa8,0x0b,0xf0,0xfa,0xc7,0x80,0xd4,0xd7,0x6f,0x60,0x5e,0x5c,0x23,0xef,0xe1,0x04,0x69, - 0x77,0x35,0x8c,0xde,0x6d,0x4f,0x48,0xaa,0xb5,0x0e,0x76,0x6d,0x47,0xcd,0xe5,0xf6,0x51,0x7c,0x4c,0x86, - 0x32,0x02,0x3a,0xba,0xde,0xb2,0x37,0x06,0x8c,0xf0,0x05,0x70,0x85,0x43,0xb4,0x9c,0x23,0xb7,0x9e,0xe5, - 0x05,0x59,0x5e,0xa4,0x4e,0x77,0x1c,0x4e,0x3e,0x5e,0x11,0xb9,0x08,0xe0,0x2b,0xde,0xf0,0x23,0x69,0x68, - 0xf1,0xa7,0x78,0xed,0x7a,0x4b,0xf7,0x23,0x6b,0xa3,0x3d,0x7c,0x42,0x03,0xbf,0x26,0xaa,0x9c,0xf7,0x02, - 0x36,0x07,0x3a,0x65,0xe0,0x5d,0xcf,0x1a,0x66,0x2d,0x59,0xdc,0x8c,0x11,0x55,0x01,0x48,0x2f,0x6d,0x36, - 0x98,0x3f,0xdf,0xe9,0x62,0xdf,0x61,0x7d,0x01,0x6d,0xe8,0xd6,0x3d,0x3d,0x65,0xd5,0xf3,0x34,0xa7,0xa9, - 0x3c,0x59,0xed,0x4a,0xc9,0xc6,0x4e,0xcb,0xce,0x09,0xaf,0x66,0x37,0x14,0x8f,0xe9,0x35,0x55,0xab,0x9e, - 0x2d,0x85,0xf3,0x97,0x7f,0xf9,0x0f,0x50,0xe6,0xb4,0xd1,0x79,0x09,0xf7,0xf9,0x27,0x5a,0x91,0xe2,0x5d, - 0x70,0xf3,0xf1,0xec,0x36,0x46,0x8d,0xe9,0xb6,0xd4,0xfd,0xa7,0xc1,0x3b,0x39,0x40,0xe4,0x6e,0x18,0x4d, - 0x69,0xfc,0x3c,0xf1,0xb2,0x5e,0x17,0x53,0x82,0xf9,0x6c,0x81,0xba,0x52,0x47,0x7b,0x85,0x43,0xfd,0x58, - 0xf7,0xe7,0x87,0xbd,0x00,0xa5,0xd9,0x91,0x4a,0x3c,0x6d,0x6c,0x6d,0x91,0x7d,0x89,0x0b,0x7c,0xfc,0xa2, - 0x71,0xa0,0xd0,0xdd,0x94,0xec,0x24,0xec,0x52,0x6a,0x71,0x0b,0x6f,0xf8,0x20,0x17,0x29,0xf9,0x92,0x8c, - 0xee,0x3e,0xc2,0xca,0xf2,0x23,0x46,0xe0,0x2c,0x96,0xbe,0xa4,0xfc,0x11,0x6a,0xfc,0x91,0x63,0x93,0x27, - 0x7d,0xf2,0xb0,0x93,0x3e,0xd1,0x27,0x7d,0xa6,0x56,0x2e,0x08,0x7e,0x98,0x00,0x1c,0xeb,0x43,0xf3,0x8c, - 0xf8,0xe0,0x5a,0x47,0xd0,0x13,0x5c,0xfe,0x78,0x1b,0xd1,0x31,0x47,0x26,0x4c,0x35,0x9c,0x2d,0x12,0xe9, - 0x95,0x47,0x29,0xae,0xee,0x68,0x42,0xc9,0x7a,0x1d,0xe7,0x68,0x83,0x82,0xfb,0x97,0xe8,0x0c,0x28,0xcc, - 0x13,0xe9,0x3c,0x0b,0x3d,0x47,0xd0,0x09,0x78,0x8a,0xf3,0xf6,0x67,0x57,0xa2,0x7f,0x16,0xa8,0x4f,0x47, - 0xa7,0x24,0xb4,0x4c,0x5c,0x78,0x7e,0x64,0x37,0xe3,0x39,0x8c,0x49,0x4c,0x00,0x82,0x77,0x2a,0xc9,0x5e, - 0xd3,0xae,0x66,0x1f,0xe8,0x10,0x1d,0x91,0x70,0xd4,0xd8,0x0d,0x54,0x27,0x88,0xc4,0x18,0x40,0x98,0x02, - 0x64,0xac,0xd6,0x9c,0x3b,0xda,0x67,0xba,0xc1,0xb6,0x4c,0xa2,0x43,0x5e,0xf6,0x15,0x6a,0xda,0x01,0xe5, - 0xa5,0x3f,0x5d,0xac,0x58,0xf7,0xf4,0x40,0x1f,0x4c,0xe9,0x1c,0x5d,0x67,0x86,0xd1,0xfa,0x73,0xc3,0x90, - 0x25,0xcc,0x56,0xf2,0x84,0xfd,0x1f,0xd8,0x15,0xa9,0x87,0xcb,0xa2,0x15,0xb2,0xc8,0x9e,0x9c,0xc7,0x65, - 0x35,0xdc,0xc5,0xfd,0xbd,0xad,0x1d,0x43,0xfd,0x89,0x87,0xe5,0xb7,0x5a,0xf0,0xca,0x1b,0x97,0x97,0x15, - 0x2c,0x3c,0x74,0xd7,0x78,0xcb,0x07,0x44,0x17,0xa7,0xc2,0x45,0x6b,0x3a,0x05,0x01,0x49,0x8b,0x23,0x59, - 0x2b,0x1d,0xcc,0x13,0x4e,0x30,0xb4,0xf7,0xf7,0x99,0x19,0x10,0xa0,0x5c,0x23,0x9a,0x08,0xc4,0x18,0x24, - 0x3c,0x89,0x19,0x49,0x75,0xeb,0x5c,0x23,0x1a,0x48,0x46,0x54,0x1e,0xad,0x68,0x8d,0x33,0x84,0x46,0x04, - 0xa8,0xf5,0xd7,0x72,0x26,0x85,0x66,0x90,0x1c,0xec,0xec,0x81,0x14,0x7b,0xfa,0xee,0xdd,0x29,0x65,0x96, - 0x20,0x63,0xbd,0x71,0x81,0xd0,0x2d,0x47,0x83,0xfe,0x94,0x1b,0xaf,0x63,0x15,0xa9,0x9a,0xdf,0xb8,0x14, - 0x95,0x6d,0x16,0x14,0x7a,0x00,0x8f,0xde,0x60,0x97,0x68,0x4c,0x1d,0x18,0x40,0xa3,0xeb,0x44,0x4c,0x1e, - 0x5f,0x0e,0x2c,0xe2,0x07,0x4b,0x2e,0xcd,0xa3,0xe1,0xdd,0xe8,0x60,0xa1,0xc7,0x3b,0x57,0xd2,0xc8,0x24, - 0xc8,0x47,0xea,0x74,0x84,0xed,0xd1,0x78,0xea,0x4d,0x99,0xa6,0xc8,0xdf,0xac,0x78,0xcb,0x77,0x76,0xa4, - 0x80,0x30,0x81,0x1d,0x84,0xd3,0x9b,0x6e,0x76,0x01,0x98,0x75,0x9d,0x15,0x1e,0x1b,0x4b,0x4c,0x7c,0x98, - 0x8d,0xea,0xcf,0x8a,0xf0,0x4a,0x7f,0x3d,0xfd,0xc4,0x96,0x6d,0x9f,0x1d,0x13,0x67,0x18,0xe4,0x93,0x1b, - 0xa1,0x81,0xf6,0xba,0x94,0x94,0x80,0xf3,0x48,0x73,0x14,0xc0,0xd5,0xc2,0xf0,0xee,0xef,0x1b,0x17,0xb9, - 0x46,0xfe,0x3a,0x2f,0xaa,0x33,0xcd,0x24,0x53,0x4f,0x03,0xe7,0xeb,0xc6,0x10,0xc1,0x10,0xce,0xd7,0xe9, - 0x28,0x04,0x46,0x67,0xe6,0x5b,0x33,0x53,0x78,0x95,0x35,0x0e,0xd4,0x05,0x58,0xb6,0x74,0xf5,0xd6,0x2b, - 0x70,0xd4,0xfe,0xe6,0x4c,0x18,0x4a,0x52,0xde,0xd2,0xca,0x30,0xac,0x09,0xde,0x5b,0xcb,0x23,0xb1,0xee, - 0x00,0x7c,0x95,0xcd,0xcd,0x44,0xcb,0x4e,0x7b,0x38,0x0e,0xb6,0x8a,0xde,0x18,0x81,0x2f,0x36,0x0c,0x5f, - 0xc4,0x1a,0x8c,0xe7,0xd6,0x42,0x2e,0xc4,0xda,0xe1,0x13,0xdb,0xdb,0xa1,0xc5,0x17,0x86,0x81,0xb4,0xd0, - 0x43,0x4f,0x31,0xad,0xb3,0xe5,0xfb,0xb2,0x5d,0x22,0x3a,0xda,0xeb,0x45,0x2b,0x43,0x51,0xfb,0xe7,0xa9, - 0x16,0xac,0xed,0xe8,0x97,0x74,0x91,0xe1,0xf9,0x5b,0x5f,0x79,0x37,0x69,0x82,0xb1,0x4a,0x52,0x9e,0x57, - 0x89,0x15,0x11,0xeb,0x55,0xc8,0x8a,0x29,0xee,0x48,0xaa,0x5a,0x42,0xf5,0xe9,0xe7,0x92,0x8a,0x09,0x95, - 0x29,0x9c,0x7a,0xcb,0x28,0x0d,0xd8,0x65,0x32,0xf3,0xaf,0x77,0xbf,0x26,0x4e,0x52,0x39,0x5f,0xcf,0x9b, - 0x5c,0x70,0x22,0x8c,0x90,0xac,0xde,0x97,0x2d,0xb5,0xa7,0x4b,0xc6,0xd0,0x9a,0xc6,0x9b,0xb5,0xf0,0xcc, - 0x25,0x55,0x5c,0x2e,0x8f,0xee,0xb2,0x08,0x1d,0x69,0x06,0x94,0x5f,0x1c,0xaa,0x4b,0x3d,0xff,0xa8,0x14, - 0xa0,0xfd,0x36,0x0f,0x2c,0xd9,0x54,0xa9,0x28,0x13,0x41,0x4b,0x50,0xa8,0xda,0x51,0x76,0x3c,0x2d,0x39, - 0xd1,0xf3,0x77,0x5e,0x95,0xe0,0x19,0x51,0xba,0xee,0x08,0x2d,0xbc,0x03,0xe3,0x68,0xcb,0xbd,0x6e,0xb4, - 0x8b,0x8a,0xad,0xcb,0xc2,0xdb,0xb3,0x64,0xf1,0x82,0x85,0x69,0xef,0x5b,0x54,0xa2,0xd9,0x0c,0xcf,0x77, - 0xd6,0x5a,0xaf,0x73,0xd3,0xc3,0x0a,0x2f,0x5d,0xed,0x58,0xb1,0xca,0x1f,0x96,0xb2,0x58,0x5b,0xc3,0xf8, - 0x3d,0x46,0x63,0x95,0xc7,0xea,0xb6,0x19,0xfc,0xc1,0x70,0x52,0x04,0x0f,0x64,0x6d,0x9e,0xd2,0xf9,0xc5, - 0x9c,0xb4,0xba,0xb4,0xa4,0x13,0x54,0xe2,0x20,0xd6,0x99,0xc5,0x6f,0x48,0xc7,0x19,0x0a,0xad,0x73,0x5a, - 0x4a,0x8b,0xec,0xe6,0x50,0x7d,0xcb,0xf9,0x55,0x99,0x5f,0x60,0x66,0x98,0xc2,0xa9,0x11,0x12,0xd1,0x5b, - 0xc5,0x89,0xdb,0x65,0x5a,0x98,0x6d,0xb4,0x55,0x9e,0x5f,0xf3,0x09,0xfa,0x06,0xd3,0xf3,0x98,0xa2,0xe4, - 0xa8,0x31,0x46,0xf4,0xf0,0xf1,0x34,0x9c,0x2c,0x4d,0x44,0x64,0x93,0xfb,0xe9,0x3c,0x8d,0x91,0xbe,0x31, - 0xbd,0x2b,0xd8,0x07,0xb5,0x68,0x73,0xf7,0xd5,0x9a,0x2c,0x1a,0xc2,0x9d,0x83,0x48,0xc0,0x0c,0x8b,0x9f, - 0x2c,0x6c,0xef,0x4f,0x28,0xd4,0x3c,0xc1,0x2f,0xc3,0x36,0x78,0x4a,0xfa,0x22,0xd2,0x84,0x60,0xf4,0xbc, - 0xd5,0xf0,0xea,0x62,0x40,0x4f,0x38,0x4e,0x30,0xa3,0xd5,0x1a,0x33,0x3a,0x4b,0x94,0x07,0xe6,0x2b,0xb7, - 0x90,0xea,0xa7,0x3f,0xa0,0x3f,0xb4,0x9b,0xde,0xdf,0xe7,0xe8,0x78,0xec,0x51,0x22,0x99,0x09,0xae,0xed, - 0x67,0xe4,0x6d,0x3e,0x0f,0x72,0x82,0xc6,0x41,0x09,0x0c,0xe7,0x04,0x13,0xd8,0xc0,0x2c,0x84,0x55,0x98, - 0xe9,0x69,0x16,0xa2,0x14,0x7a,0x26,0x43,0xac,0xe5,0xbe,0xcd,0x49,0x36,0x03,0xce,0x4d,0xba,0xad,0x4a, - 0xdd,0x15,0x07,0x5d,0x35,0x8f,0x1a,0x3e,0x71,0x10,0x7b,0xed,0x01,0x65,0x81,0x2b,0xc4,0x68,0x91,0x07, - 0x94,0x64,0xdc,0x20,0x2a,0x9d,0x12,0x4a,0x36,0x8f,0x57,0xa3,0x06,0xf9,0x7b,0x9e,0x83,0x3a,0x00,0x37, - 0x2a,0x89,0x96,0xa2,0x03,0xe7,0xdf,0x6a,0x38,0xdd,0xe6,0x4e,0xac,0x2c,0x58,0xee,0xc1,0xca,0x62,0xa6, - 0xf9,0x18,0xf6,0xba,0xe6,0xf0,0x25,0xf2,0x85,0x7d,0x7b,0x93,0xa5,0xf3,0xf0,0x2a,0x64,0x8f,0x15,0x81, - 0xa0,0xdb,0x94,0x7e,0xca,0x2c,0xb1,0x55,0x35,0xe9,0x83,0xba,0xb0,0x9c,0xec,0x9d,0x93,0x0c,0x24,0x86, - 0x97,0x30,0xff,0xc8,0xc9,0xd2,0xe9,0x35,0xda,0xed,0xfa,0x7c,0xfb,0xad,0x42,0x9b,0xe7,0xfb,0x5d,0xbf, - 0xc3,0x90,0xdf,0x6b,0x96,0xba,0x5a,0x5b,0xab,0x48,0x24,0x3c,0x6b,0x25,0xdf,0xc2,0x1a,0xcd,0xaf,0xe3, - 0xcb,0xe2,0x37,0x58,0x6b,0xc7,0xef,0x32,0xc0,0xcc,0x9a,0x99,0xc3,0xee,0xc9,0xd9,0xc3,0x75,0x67,0x72, - 0x24,0x57,0x94,0x0c,0xf5,0xed,0x72,0x31,0x24,0x76,0xd5,0x8a,0x2d,0x5e,0xda,0x14,0xf1,0xa7,0xf5,0x84, - 0x17,0x8d,0x3a,0x06,0x81,0xb6,0x24,0x2f,0xe2,0x66,0xb6,0x34,0x15,0x95,0xfd,0xd1,0x4c,0x86,0x08,0x49, - 0xe7,0xc4,0x1c,0x2d,0x65,0x5a,0xfc,0xa8,0x67,0xda,0xf5,0x1e,0xda,0x75,0xd9,0x10,0xfd,0x63,0x97,0x6f, - 0x39,0xc0,0xc2,0x4b,0x9b,0x54,0xcb,0x88,0xe4,0x54,0x04,0x39,0xf6,0xcb,0x86,0x63,0x01,0xa6,0xc4,0x11, - 0xe5,0x6a,0x8c,0x5d,0xab,0x74,0xea,0xa9,0xd3,0xd0,0x1e,0x77,0xd3,0xbe,0xd7,0x98,0xbf,0xe1,0xff,0x6d, - 0xed,0x6a,0x7b,0xdb,0xb6,0x81,0xf0,0x5f,0xc9,0xf2,0x21,0xb0,0x1a,0xf9,0x25,0x4d,0x37,0x04,0x72,0x64, - 0x23,0x6b,0xd7,0x20,0x68,0x50,0x0c,0xd8,0x86,0x7e,0x58,0x87,0x41,0x49,0x64,0x5b,0x98,0x23,0xb9,0x96, - 0x90,0x26,0x88,0xfd,0xdf,0x77,0xcf,0x1d,0x49,0x51,0x14,0x65,0x27,0xc3,0xd0,0x0f,0x8d,0x4c,0x89,0xa2, - 0xc8,0x3b,0xf2,0x5e,0x9e,0xbb,0x13,0x91,0xfa,0x86,0x44,0xea,0xc2,0x6a,0xfa,0x62,0x57,0xfc,0x26,0x09, - 0x50,0x0b,0x54,0x9c,0x2c,0x1b,0x3a,0xe9,0xf8,0xaa,0x2d,0x7c,0x4f,0x2d,0xa1,0x19,0xc8,0x4d,0x8e,0x2d, - 0x9c,0xfb,0xc3,0x2c,0xd5,0xbd,0xd0,0xa5,0x13,0xa4,0xcd,0xa8,0x2d,0x08,0xf5,0x20,0xfe,0xde,0x3b,0x08, - 0xd5,0x79,0x9c,0x4c,0xa5,0xd7,0x28,0x0b,0xe7,0xd6,0xe7,0xff,0x90,0x86,0x4f,0xad,0x61,0x42,0x20,0x34, - 0x43,0xfd,0x9e,0x0b,0xb0,0x8c,0x0f,0x37,0xfa,0xe8,0x90,0xd6,0xcc,0x45,0xe0,0x7e,0xb3,0x86,0xd1,0xfc, - 0x1a,0xed,0xd2,0xeb,0xce,0xaa,0x92,0xb6,0xeb,0x88,0x43,0xd6,0x92,0x90,0x64,0x60,0x80,0xcd,0x09,0x90, - 0xc7,0x8e,0x84,0xa9,0xce,0x30,0xb8,0x1c,0xbc,0x1f,0x3f,0xbd,0x44,0xa9,0xec,0x94,0x74,0x13,0xab,0x76, - 0x26,0xe4,0x77,0x79,0x53,0x2e,0x41,0x64,0xf2,0xc2,0xef,0xd9,0x92,0x97,0xa5,0x65,0xe5,0x50,0x5b,0x57, - 0xa0,0xcd,0x18,0x29,0x6b,0x12,0xfb,0x8c,0x1d,0x97,0x90,0x8d,0xd9,0xda,0x91,0xc2,0xc6,0xb1,0x6d,0x4d, - 0xd9,0x25,0x34,0xc2,0xab,0x56,0x48,0xa4,0x3e,0x95,0xdd,0xb2,0x67,0x75,0x35,0x51,0xcb,0xaf,0x4c,0xc7, - 0xd3,0x5f,0xb6,0x71,0x16,0x39,0xcf,0xa4,0x62,0x44,0xad,0xfe,0x92,0xcc,0x7b,0x7c,0x38,0xa8,0x60,0xb9, - 0x55,0xa1,0x63,0xb1,0xd8,0x99,0x9c,0xb9,0x9c,0x9a,0xe9,0x8b,0x94,0xac,0x2c,0xb1,0xf4,0x5b,0xf1,0x3d, - 0x2c,0x63,0xb6,0x18,0xd9,0x4b,0x54,0xa7,0x8d,0x30,0x2a,0x33,0x91,0x23,0xa9,0x9d,0xad,0x5c,0x88,0xbe, - 0xf0,0x4d,0x3a,0x89,0x74,0xa1,0x9e,0xab,0x66,0x24,0xa7,0x33,0x51,0x9f,0xfe,0xb7,0x52,0x9e,0x66,0x4a, - 0x68,0xcc,0x15,0x4a,0x63,0x4b,0x27,0xba,0x8e,0x0f,0xca,0xcb,0xf7,0xd2,0x4e,0x5c,0x3f,0x4d,0x61,0x1b, - 0xd7,0x0f,0xc9,0x51,0xc6,0xdb,0x0c,0xe9,0x72,0xe3,0x80,0xe4,0x61,0xc4,0x01,0x59,0xf5,0x26,0xb9,0xb4, - 0x8e,0x93,0x0c,0xcd,0xb6,0x5a,0x74,0x06,0xe9,0x78,0x83,0x12,0x44,0x9e,0x32,0x40,0x80,0x84,0xde,0xf4, - 0x67,0xee,0xe8,0x7f,0x71,0x36,0x95,0x24,0x03,0x39,0x97,0x0b,0xd5,0xa9,0xc6,0xa0,0xf4,0x65,0xdb,0xc8, - 0xd7,0x44,0x7a,0x12,0x42,0xdf,0x1b,0x00,0x62,0x98,0xbd,0xab,0x17,0x98,0x36,0x1e,0xba,0xcf,0xf9,0x54, - 0x84,0xca,0x5b,0xa4,0x59,0x73,0x8d,0x03,0x03,0x16,0xac,0x4d,0xe5,0x0c,0xd6,0x87,0xfc,0x1b,0xb9,0x37, - 0xd5,0x26,0x3d,0x3d,0x23,0x42,0x97,0xcd,0xe3,0x05,0x72,0x68,0x42,0xb2,0x64,0x6a,0xc9,0x92,0x32,0x91, - 0xca,0xc9,0x67,0x9c,0x87,0x44,0xfb,0xd6,0x59,0x97,0x0c,0x81,0x15,0x79,0xfb,0x0e,0x16,0x16,0x07,0xbe, - 0x31,0xfe,0xd0,0xab,0xb3,0x11,0x3f,0xa3,0xee,0xca,0x8a,0xd6,0xd8,0xe8,0x6a,0xac,0xa3,0x2e,0xf7,0x8a, - 0x01,0x4b,0xde,0x65,0x71,0xdc,0x76,0x86,0x27,0x37,0x6c,0x62,0x06,0xbe,0xa0,0xce,0x67,0x80,0x18,0xc6, - 0x59,0xf9,0x31,0xcb,0x33,0x64,0x07,0x84,0x54,0xfc,0x81,0x13,0x12,0xed,0x10,0x59,0xf6,0x09,0x27,0x9f, - 0x7b,0x4a,0x18,0xc6,0xd9,0xbe,0x37,0x66,0xcd,0x3d,0xf3,0xbb,0x74,0x59,0x4b,0x0a,0x31,0x6f,0x5f,0x31, - 0x80,0x23,0x05,0x4c,0xb9,0x96,0x45,0x6a,0xa4,0x96,0x73,0xb0,0x33,0xf2,0x4b,0xa6,0xeb,0x97,0x3d,0xe3, - 0xaa,0x55,0xdf,0x93,0xd0,0xd5,0x9e,0x53,0x4e,0xff,0xb2,0x8a,0x51,0xff,0x43,0x7a,0x7b,0x7c,0xed,0x57, - 0xd6,0x94,0xd9,0x41,0x8d,0x5c,0x27,0xd0,0x56,0xf0,0x9f,0x15,0x84,0x8b,0xf6,0xa3,0xfe,0x89,0x71,0x3e, - 0x03,0xb2,0x43,0xaa,0xde,0xb9,0xa3,0xc3,0xe6,0x35,0xc2,0x2b,0x31,0xd3,0x92,0x33,0xb4,0xaa,0x6f,0x2e, - 0x81,0xb3,0x4a,0x26,0x15,0x2d,0x78,0x15,0x27,0xc4,0x67,0xb9,0x36,0x2a,0x12,0xcf,0x4e,0x46,0x53,0x5b, - 0x77,0xd7,0xcf,0xa4,0xf4,0xcc,0xb1,0xb9,0xe0,0xfe,0x82,0xe1,0xdb,0x20,0x6a,0x90,0x87,0x6e,0x77,0xe7, - 0x1e,0xcf,0x9e,0xf0,0xa9,0x72,0x1b,0xed,0xe5,0x9b,0xbc,0x9b,0x6f,0x88,0x4d,0x72,0x87,0x4d,0x92,0xbd, - 0x6c,0x92,0x48,0x52,0xd7,0xc6,0x53,0x34,0x8e,0xee,0xb1,0xde,0x0a,0x94,0xd4,0x22,0xab,0xd6,0x3d,0xe3, - 0x3f,0x24,0x0b,0xc6,0xbc,0x9b,0xf5,0xbe,0x04,0xe1,0xf5,0x6e,0xda,0x50,0x86,0x4c,0x8f,0x4d,0xb8,0xb6, - 0x46,0xd2,0x1b,0x8c,0xb8,0x1e,0x84,0xef,0x5f,0x93,0xc3,0x41,0xd3,0xcf,0xb4,0x6c,0xf9,0x82,0x38,0x44, - 0x87,0xfd,0x41,0x45,0xa9,0x3c,0x42,0x51,0xd9,0x06,0xc0,0x8d,0x5f,0x58,0x4e,0xed,0xd9,0x14,0x95,0xab, - 0xd3,0x83,0xbf,0x4b,0x4f,0xc3,0x74,0x36,0xa3,0xed,0x33,0x3a,0xfc,0x95,0x44,0xef,0xfb,0x84,0xbf,0x0f, - 0x9e,0xf9,0x28,0xd5,0x7f,0xfd,0x4c,0x13,0x7a,0x17,0x15,0x8d,0x3c,0x53,0x0b,0xe8,0x65,0xc1,0xfe,0x5c, - 0x80,0x57,0xbb,0x27,0xf7,0x9b,0x24,0xc1,0xeb,0x2c,0x47,0x95,0x70,0x2d,0x2a,0x65,0x05,0x69,0x87,0x4c, - 0xc1,0x0b,0x0d,0xb7,0x15,0xf2,0x35,0x78,0x6d,0xeb,0xc5,0xdd,0x93,0xef,0x61,0x09,0x8c,0xd2,0xc6,0x40, - 0x11,0x8a,0x89,0x6c,0xfd,0x91,0xe9,0xdb,0xf0,0x3a,0xf0,0x45,0x2e,0xaa,0x37,0xfb,0x80,0x0d,0x77,0xe2, - 0x44,0xf4,0x7a,0xc1,0x53,0xb6,0xf7,0xcf,0xc3,0x59,0xe8,0xf5,0xaa,0xdf,0x2c,0x9b,0x76,0xa5,0x1b,0x4c, - 0xfe,0x02,0x1e,0xa7,0x4e,0x13,0xaa,0x75,0x23,0xbb,0x59,0x39,0x3c,0x87,0xfe,0x78,0xf0,0x0e,0xa0,0x24, - 0x09,0x78,0x1b,0xfe,0xc3,0x37,0x75,0xf4,0x79,0xb0,0x5a,0x9a,0x6e,0x8d,0xf7,0x98,0x4e,0x30,0xcf,0xed, - 0x73,0x9e,0x21,0xda,0xae,0xc3,0x8b,0x20,0x7c,0xf2,0x4e,0x20,0x56,0x49,0x45,0x79,0x3e,0xee,0xe8,0xe1, - 0x7d,0x78,0xc5,0xc6,0x5f,0x1f,0xa3,0x7d,0xea,0x39,0x00,0x9b,0xeb,0x62,0xbe,0x33,0x45,0x16,0x1a,0x8a, - 0x65,0x5a,0x47,0xfc,0x8f,0x48,0x16,0x40,0x69,0x44,0x40,0x29,0x73,0x0f,0x4d,0x96,0xb7,0xeb,0x82,0xf6, - 0x76,0x75,0x1a,0xc4,0xf9,0x40,0x7e,0xf8,0xbd,0x20,0xe5,0xbf,0x01,0x8e,0x9a,0x98,0x36,0xb9,0xee,0x9f, - 0x85,0xcb,0xa6,0x0b,0x3b,0xce,0xb6,0x75,0xb8,0x9c,0xcf,0xc9,0xcc,0x01,0x6f,0x9c,0xc9,0x6c,0xdf,0x19, - 0x87,0x68,0xbb,0x76,0xe8,0x67,0x6d,0xc2,0x2f,0xfc,0xfd,0x2b,0xa7,0x64,0xf1,0x92,0x7d,0x48,0x36,0x0e, - 0x3c,0x22,0x6a,0x88,0x05,0x4e,0xb5,0xf8,0x9d,0xda,0x33,0x29,0x50,0x5c,0x4b,0x44,0x2d,0x67,0x7e,0x16, - 0x3b,0x33,0xb1,0xb3,0xd4,0x9c,0x1d,0xf3,0xe8,0xf2,0xd0,0xb2,0x98,0x7b,0xf9,0xc7,0xe2,0x5b,0xba,0x45, - 0xf3,0x6d,0x07,0xd7,0xae,0xc3,0x62,0x07,0xb9,0xed,0xe2,0x26,0xa4,0x51,0x53,0x04,0xc1,0x4e,0x54,0xe6, - 0x27,0x58,0x64,0x75,0x7c,0x97,0xb3,0x8d,0xef,0x52,0x65,0x68,0x9c,0xe5,0x94,0x4b,0x0a,0x91,0x2e,0x93, - 0xd0,0x26,0x2c,0x56,0x3c,0xec,0xbc,0x98,0x9e,0xa3,0x23,0x46,0xa5,0x0f,0xb2,0x52,0xd0,0xe9,0xe9,0x60, - 0x99,0xe5,0x29,0x97,0xcf,0x03,0x0e,0x1d,0xc5,0x34,0x42,0xf5,0x9b,0x3a,0xd7,0xd8,0x64,0xa8,0xfd,0x23, - 0xfa,0x76,0x93,0xec,0x78,0x72,0x36,0x1a,0x4d,0x7b,0x25,0xce,0x44,0x96,0xbc,0xfa,0x3f,0x8d,0x46,0xbe, - 0x38,0xe3,0xc6,0x3a,0x07,0x91,0x7e,0x85,0x25,0x41,0xe5,0x66,0xe5,0x8e,0x15,0x35,0x64,0x0c,0x86,0x31, - 0x8c,0xe1,0x30,0x02,0x17,0xe9,0x43,0x96,0xd0,0x26,0xa7,0x7e,0xa4,0x25,0xa5,0xdb,0x52,0xd0,0xed,0x73, - 0x67,0x0d,0x48,0xc7,0x82,0x3b,0x43,0x00,0xa5,0xed,0xaf,0x37,0xa8,0x4b,0x14,0x44,0x94,0xee,0x0e,0x43, - 0xf6,0x4c,0x44,0xa7,0x6f,0x47,0xa1,0x80,0xf0,0xa2,0xb3,0x91,0x82,0x08,0x64,0xf7,0xf3,0x36,0x14,0x06, - 0xc5,0xbf,0x50,0x62,0x02,0x34,0x6c,0x06,0x82,0x13,0xa2,0x6d,0xdb,0xb1,0x0b,0x47,0xb9,0x08,0x43,0xb5, - 0xa1,0x9c,0xc2,0x71,0x7f,0x66,0xd2,0x08,0x58,0x67,0x7a,0x1b,0xcb,0x68,0xd5,0xc8,0x81,0x0c,0x96,0xe5, - 0xc4,0x8a,0x0c,0xbd,0x1c,0x26,0x21,0x5f,0xc8,0x0c,0x0e,0xb3,0xa0,0x36,0xe6,0x6b,0xf0,0x64,0x1c,0x27, - 0x6f,0x80,0xb0,0xd0,0x38,0xc9,0x38,0xce,0xde,0x54,0xec,0x98,0x94,0x76,0x6a,0xad,0x41,0x94,0xd4,0x04, - 0x8c,0xe9,0xb8,0xcd,0xf7,0x6b,0x86,0xc2,0xca,0xbe,0x52,0xf6,0xfe,0x13,0x25,0xab,0x40,0xd6,0xa1,0x9e, - 0xfe,0x26,0x29,0x93,0xd8,0xcb,0xe9,0xf4,0x56,0x40,0x81,0x96,0xe3,0x26,0x55,0x57,0x9a,0x9e,0x79,0xcc, - 0x9b,0x0d,0x4f,0x9e,0x1e,0xf5,0x66,0x73,0x46,0x5b,0x3d,0x10,0xaa,0x39,0x3c,0x98,0x80,0x8c,0xf4,0x98, - 0x98,0x90,0xec,0x1c,0xb0,0x85,0xe1,0xd7,0xe1,0xcc,0x50,0xd1,0xd7,0xe1,0x54,0x9b,0x9b,0x10,0x76,0x0f, - 0x3a,0x23,0x2d,0xb3,0x5a,0x88,0x16,0xef,0x52,0x9c,0x88,0xe9,0x28,0x5b,0xb8,0x4c,0xf2,0xf9,0x4d,0x85, - 0x9c,0x63,0xee,0x6a,0x5f,0x5f,0x7c,0xbe,0x6c,0x0a,0xb0,0x81,0x8c,0x47,0xd7,0x25,0x5c,0x23,0xd9,0xc5, - 0xda,0xca,0x8a,0x43,0xfd,0xd1,0x03,0x2b,0xe0,0xd5,0xf0,0xdd,0x9c,0x6b,0xa2,0x8b,0xb2,0xc5,0x5d,0x81, - 0xe2,0x8d,0xeb,0x82,0x5e,0x50,0x3d,0xf5,0x0e,0xfb,0xfd,0xdb,0xc5,0xba,0xb8,0x4f,0xfb,0x0b,0x78,0x31, - 0x8b,0xd9,0x8c,0x5a,0x85,0x02,0x8e,0x0f,0x57,0x8f,0xb0,0x2b,0x20,0x67,0x4b,0x1b,0xbf,0x5c,0x05,0x06, - 0x4a,0x4c,0xdb,0xd1,0x6b,0x43,0x93,0x05,0xa4,0x6b,0x2d,0xdb,0x8f,0xbc,0x03,0xd1,0xbb,0x91,0xf6,0x03, - 0x50,0x55,0xa8,0xa8,0x2b,0xa4,0xe0,0xcd,0x56,0x17,0x77,0x77,0x28,0x63,0xb2,0xd9,0x1c,0x8e,0x06,0xfc, - 0x4f,0x8a,0x17,0x9b,0x06,0xbe,0xf5,0xe8,0x48,0xcf,0x8c,0x65,0x53,0x30,0x63,0xa1,0x79,0x7a,0x4d,0x5c, - 0xfe,0xf8,0xb7,0x41,0xb5,0x4e,0xf2,0x32,0x63,0x69,0xd5,0x40,0xee,0x7b,0x8d,0x9f,0x81,0xe7,0xab,0xaf, - 0xd8,0xb2,0x13,0x36,0x53,0x01,0xa0,0x7a,0x82,0x1d,0x80,0xbf,0xd9,0xe4,0xc9,0x43,0xcf,0x8d,0x9a,0xde, - 0x9e,0x83,0x8a,0xb3,0x55,0x35,0x39,0x38,0x1f,0x62,0x0b,0xc0,0xff,0x8b,0xea,0x7e,0x39,0x39,0xf8,0x17, - 0xf1,0x1d,0xbc,0xd8,0x26,0xcb,0x03,0x00, + 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0xc4,0xbd,0xdb,0x8e,0xdb,0x48,0xb6,0x28,0xf8,0x2b, + 0xd1,0xf2,0x69,0x57,0xaa,0x4b,0xa2,0x75,0x97,0x52,0x59,0xe9,0x3a,0xe9,0xbb,0x77,0xd9,0x2e,0x1f,0xa7, + 0xab,0xbc,0x77,0x15,0x0a,0x07,0x94,0x14,0x92,0xd8,0x49,0x91,0x2a,0x92,0xca,0x74,0x66,0x56,0x02,0xfd, + 0x30,0x6f,0xf3,0x34,0x2f,0x33,0x38,0xc0,0x3e,0xb3,0xe7,0xa1,0x31,0xaf,0xf3,0xd6,0x03,0x0c,0x36,0x30, + 0xc0,0xf8,0x4f,0xea,0x4b,0x66,0x5d,0x22,0x82,0x11,0x24,0xa5,0x54,0xda,0xb5,0x71,0xba,0xda,0x29,0x32, + 0x18,0x8c,0xeb,0x5a,0x2b,0xd6,0x9d,0xdf,0xfc,0x69,0x16,0x4f,0xb3,0xcb,0xb5,0x14,0xcb,0x6c,0x15,0x3e, + 0x14,0xdf,0xe0,0x8f,0x08,0xfd,0x68,0x71,0x5c,0x93,0x51,0x0d,0x0b,0xa4,0x3f,0x83,0x9f,0x95,0xcc,0x7c, + 0x31,0x5d,0xfa,0x49,0x2a,0xb3,0xe3,0xda,0x26,0x9b,0x37,0x47,0x35,0x5d,0x1c,0xf9,0x2b,0x79,0x5c,0x3b, + 0x0f,0xe4,0xc5,0x3a,0x4e,0xb2,0x9a,0x98,0xc6,0x51,0x26,0x23,0xa8,0x76,0x11,0xcc,0xb2,0xe5,0xf1,0x4c, + 0x9e,0x07,0x53,0xd9,0xa4,0x9b,0x46,0x10,0x05,0x59,0xe0,0x87,0xcd,0x74,0xea,0x87,0xf2,0xb8,0x8d,0x6d, + 0x64,0x41,0x16,0xca,0x87,0x27,0x1f,0xde,0xbf,0x7b,0xf9,0xcf,0xe2,0xcd,0xf3,0x6f,0x1e,0x70,0x81,0xf8, + 0x26,0x0c,0xa2,0x33,0x91,0xc8,0xf0,0xb8,0x16,0x40,0x93,0x35,0x81,0xe3,0x84,0xeb,0x95,0xbf,0x90,0x0f, + 0xd2,0xf3,0xc5,0xd7,0x1f,0x57,0x61,0x4d,0x2c,0x13,0x39,0x3f,0xae,0xcd,0xfc,0xcc,0x1f,0x3b,0x4f,0x1a, + 0x7f,0xee,0x3e,0x86,0x4b,0x01,0x97,0x51,0x7a,0xfc,0xd5,0x32,0xcb,0xd6,0xe3,0x07,0x0f,0x2e,0x2e,0x2e, + 0xbc,0x8b,0xae,0x17,0x27,0x8b,0x07,0x9d,0x56,0xab,0x85,0x95,0xbf,0x12,0x38,0xf2,0x47,0xf1,0xc7,0xe3, + 0xaf,0x5a,0xa2,0x25,0xda,0x87,0xf0,0xff,0xaf,0xfe,0xdc,0x7d,0x0a,0xef,0x27,0x72,0x9a,0x09,0x9e,0xc4, + 0x57,0x50,0x28,0x96,0x32,0x58,0x2c,0x33,0xbe,0x4e,0xa0,0x7e,0xef,0x2b,0x31,0x0f,0xc2,0xf0,0xf8,0xab, + 0x3f,0x77,0xba,0xed,0x21,0xfe,0xf7,0xd5,0x03,0x7e,0x73,0xed,0x67,0xcb,0xfc,0xd9,0xbc,0xef,0xf7,0x07, + 0xa3,0xaf,0x44,0xbc,0xf6,0xa7,0x41,0x76,0x79,0xfc,0x95,0xd7,0x1e,0x7c,0x25,0x66,0xc7,0x5f,0xbd,0xee, + 0x88,0xce,0xb2,0x7b,0xde,0x7d,0xd1,0xb9,0x7a,0xdd,0xee,0xf1,0xf5,0xb2,0xd9,0xbd,0x7a,0x3d,0x10,0x03, + 0x2a,0x1f,0x40,0x79,0x8b,0xaf,0x55,0x79,0xbb,0x67,0x3d,0xe0,0x1b,0x7c,0xb2,0xbb,0x63,0xec,0x6a,0xa0, + 0xba,0xe2,0x37,0xf3,0xae,0x3a,0xaa,0x2b,0x1e,0xc2,0xc0,0x2a,0x6f,0xb7,0xf4,0x83,0x81,0xbe,0x56,0xdd, + 0xb6,0x4c,0x2d,0x78,0xc5,0xba,0xeb,0xe8,0xe1,0x71,0x63,0xe5,0xe1,0xe1,0x82,0xc3,0x15,0x6e,0x7b,0x9a, + 0x5d,0xc2,0x2e,0x8f,0x93,0x38,0xce,0xae,0xa7,0x71,0x18,0x27,0x00,0x13,0x4b,0xb9,0x92,0xe3,0x99,0x9f, + 0x9c,0x1d,0x35,0x9b,0x93,0xc5,0xf8,0x1e,0x2f,0x2a,0xdc,0x4c,0xfd,0x64,0x36,0xbe,0xd7,0xc1,0xff,0xb5, + 0xd5,0x6d,0x07,0xee,0x0f,0xe1,0x3f,0x7c,0x3c,0x89,0x93,0x99,0x4c,0xc6,0xf7,0xba,0xc3,0xee,0xa0,0xdb, + 0xc1,0x02,0x7a,0xde,0x6d,0x75,0xe6,0x9d,0x09,0xdc,0xce,0xa1,0xad,0x79,0x77,0xde,0x96,0x53,0xb8,0x99, + 0x05,0xab,0xf1,0x3d,0x7f,0xe0,0xb7,0x0f,0x47,0x70,0xe7,0x4f,0xa7,0xf0,0x8c,0xd6,0x09,0xee,0xd6,0x49, + 0x60,0xdd,0xc5,0x67,0xe3,0x7b,0xa3,0xf9,0x64,0x3e,0xc4,0x26,0x65,0x02,0x1d,0xcc,0xe7,0x87,0xb3,0xc3, + 0x16,0xdc,0x5d,0xf8,0x49,0x84,0xb7,0x93,0x41,0x7f,0xca,0x0f,0x27,0x38,0xc2,0x61,0xaf,0xd7,0xeb,0xce, + 0x70,0x00,0xd1,0x05,0xf4,0x3f,0xe9,0xcc,0x3a,0x2d,0xba,0xf3,0xe1,0xae,0xd7,0x19,0xb4,0xe9,0x99,0x3f, + 0xc3,0xc9,0xf5,0xda,0x9d,0x1e,0xcd,0x06,0xee,0x69,0x80,0xf3,0xd9,0x60,0x46,0xb3,0x8b,0xa1,0xe9,0x76, + 0xab,0xdd,0x6a,0xcd,0xf9,0xce,0x19,0x7e,0xba,0x1c,0xdf,0x03,0xd0,0xc5,0xf1,0x65,0x09,0x0c,0xb0,0xdf, + 0xee,0xc9,0x1e,0x2e,0x42,0x76,0x76,0x81,0x8d,0x0c,0x27,0x34,0xdc,0xcc,0x5f,0xe3,0x54,0xe6,0xfe,0xa0, + 0x4f,0x0f,0xa7,0x71,0x22,0xc7,0xf7,0x66,0x1d,0x7f,0x34,0xc7,0x56,0xb3,0x34,0x83,0xe9,0xf8,0xfd,0xd9, + 0x80,0x6f,0xa3,0x0d,0x2c,0xca,0xf0,0x70,0xda,0xe2,0xdb,0x69,0x0c,0xb7,0xa3,0xc9,0x61,0xef,0x50,0xe2, + 0x6d,0xbc,0x1e,0xdf,0x9b,0xb4,0x27,0xfe,0xb4,0x47,0xaf,0xca,0x10,0xd6,0x7e,0xd6,0x9b,0x0f,0x07,0xea, + 0x36,0x1e,0x27,0x8b,0x89,0x7f,0xd0,0xeb,0x37,0x86,0x87,0x8d,0x76,0x7b,0xd4,0xf0,0x7a,0xfd,0x3a,0xb5, + 0xb3,0x81,0x5e,0xda,0x73,0x98,0x28,0x0e,0x3d,0x19,0xb7,0x3b,0xeb,0x8f,0x47,0x73,0xa0,0x0f,0xcd,0x34, + 0xb8,0x92,0xe3,0xf6,0x00,0x6e,0x61,0x7b,0xda,0xe3,0x76,0x9b,0xaf,0x3a,0xe3,0xf6,0x21,0x5d,0xad,0xe2, + 0x28,0x1e,0xd7,0x1e,0xfb,0x40,0x28,0x66,0x81,0x2f,0x5e,0xc3,0x6d,0xad,0x51,0x7b,0xf9,0xe8,0xb5,0x78, + 0x1b,0xca,0x8f,0xea,0x7e,0x13,0x50,0xbd,0x14,0xf0,0x4a,0x36,0x1e,0xc7,0x51,0x1a,0x87,0x7e,0xda,0x30, + 0x45,0x37,0x04,0x5d,0x3f,0x23,0x71,0x68,0x66,0x08,0x5b,0xc7,0x21,0x22,0xf0,0x2f,0x2e,0xbc,0x51,0x99, + 0x02,0xb8,0x79,0x7f,0xde,0x9b,0xb7,0x0d,0xc0,0xcd,0x69,0x35,0x14,0xb4,0xcd,0x5b,0x52,0xca,0x43,0x0b, + 0xda,0x64,0x67,0x36,0x9f,0x8d,0x0c,0xb4,0xc9,0x89,0x1c,0xc9,0x8e,0x82,0x36,0x98,0x71,0x97,0x36,0x97, + 0xa0,0x6d,0xd8,0x1a,0x4c,0x07,0x7d,0x0d,0x6d,0xb0,0x8c,0x43,0xda,0x5a,0x82,0x36,0x73,0x87,0xd0,0xd6, + 0x9d,0x0d,0x07,0x1d,0xa9,0xa1,0x6d,0xd2,0x05,0x88,0x91,0x06,0xda,0x0e,0x7b,0xfd,0x51,0xbb,0x6b,0x41, + 0x9b,0xec,0xf8,0x73,0x7f,0xa4,0xa1,0x0d,0x06,0xdb,0xe2,0xe1,0x20,0xb4,0xcd,0x27,0xf2,0x70,0x36,0xcd, + 0xa1,0x6d,0x3e,0x93,0x87,0xb2,0x9f,0x43,0xdb,0xb0,0xdf,0x9e,0xb4,0xfb,0x06,0xda,0x46,0xf0,0xdf,0xd0, + 0x82,0xb6,0xe1,0xbc,0x6b,0xa0,0x0d,0x00,0xd7,0xef,0xb4,0xda,0x73,0x0d,0x71,0xd3,0xd1,0xb4,0x3b,0x39, + 0xd4,0x10,0x37,0x9d,0x03,0x52,0x4a,0x03,0x71,0x87,0xfd,0xee,0xa8,0xd5,0xca,0x21,0x6e,0xd4,0xe9,0xb7, + 0x66,0x39,0xc4,0xb5,0xfc,0x6e,0x6b,0x70,0x68,0x20,0xae,0xd5,0xef,0xb7,0x7c,0x69,0x20,0xae,0x7f,0x38, + 0xe8,0x0e,0x0c,0xc4,0xc1,0x1a,0x1e,0x76,0xe6,0x06,0xe2,0x26,0x83,0xd9,0xe1,0x7c,0xee,0x42,0x5c,0xbb, + 0x3b,0x6c,0x00,0x1e,0x37,0x3a,0xfd,0x3e,0xc0,0x5c,0x0e,0x72,0xf3,0x16,0xe0,0xcb,0xe0,0xe6,0x2f,0xd7, + 0x93,0xf8,0x23,0x82,0x5a,0x10,0x2d,0xc6,0xbc,0x6d,0xb0,0x7b,0x1f,0x8f,0x56,0x7e,0xb2,0x08,0xa2,0x71, + 0xeb,0x68,0xed,0xcf,0x66,0xf8,0xac,0x75,0x83,0x07,0xdf,0x35,0x40,0xf8,0xd9,0x22,0x89,0x37,0xd1,0x6c, + 0x7c,0xee,0x27,0x07,0x08,0x13,0xf5,0x23,0x02,0x16,0x75,0x3f,0x5f,0xd4,0x6f,0x26,0xf1,0xec,0xf2,0x1a, + 0x61,0x78,0xdc,0xee,0xad,0x3f,0x3e,0x68,0x7b,0x7d,0x51,0x3b,0x95,0x8b,0x58,0x8a,0x1f,0x5e,0x8a,0x1f, + 0xfd,0x24,0xf0,0x27,0xa1,0xac,0x35,0x4e,0xd6,0x59,0x9c,0x36,0xd2,0xcb,0x34,0x93,0xab,0xe6,0x26,0x68, + 0xa4,0x7e,0x94,0x36,0x53,0x99,0x04,0xf3,0xa3,0x55,0x10,0x35,0xf9,0x2c,0x19,0x03,0x92,0x9f,0x2f,0xf5, + 0x30,0x60,0x6c,0x59,0x06,0xeb,0x30,0x6c,0x01,0x0a,0xe4,0x63,0x69,0xd2,0xc1,0x36,0x4e,0x10,0x11,0xc2, + 0xe6,0x02,0x7f,0xe1,0x78,0x3d,0x98,0x06,0xc9,0x34,0x94,0x0d,0x45,0xae,0xda,0x40,0x7b,0xd7,0x1f,0x1b, + 0x59,0x02,0xdd,0xac,0xfd,0x04,0x2a,0x88,0xb6,0x07,0xd8,0x56,0xb7,0x1b,0x32,0x48,0x27,0xf0,0xcf,0x8d, + 0x7f,0x6d,0xcf,0x0d,0x60,0xb3,0x7e,0x94,0xc9,0x8f,0x59,0x73,0x26,0x61,0xef,0xfc,0x2c,0x00,0xc8,0x88, + 0xe2,0x48,0xde,0x2c,0xdb,0xd7,0x16,0xce,0x8e,0x34,0x0a,0x5f,0xf0,0x14,0x86,0xb0,0xdd,0xa1,0xcc,0x32, + 0x58,0x5b,0xc4,0x3a,0x5c,0xce,0xa6,0xd7,0xea,0xc8,0xd5,0xcd,0xb2,0x73,0x5d,0xc0,0x75,0xfb,0xbd,0x41, + 0xbf,0xea,0xbd,0xb6,0x5c,0xa9,0xed,0xd1,0xab,0x01,0x93,0xb8,0x99,0x6c,0xe0,0x32,0xe2,0x55,0x0f,0xa2, + 0x25,0xac,0x62,0x56,0xdc,0x97,0xa3,0xd2,0xe6,0x11,0xde,0x42,0x39,0xa3,0x2b,0xac,0x8e,0x00,0xfa,0x10, + 0xcc,0x84,0xda,0x5a,0x2a,0xd6,0x8f,0x9b,0xb8,0xaa,0x9b,0x74,0x8c,0xc4,0x47,0x03,0xc5,0x08,0xd7,0x09, + 0xb6,0xd8,0xde,0xaf,0x2e,0xce,0x1e,0x40,0x2c,0x85,0xae,0xd7,0x71,0x00,0x8c,0x4e,0x72,0x74,0xb1,0x0c, + 0x32,0x49,0x73,0x90,0xb0,0x5e,0x17,0x89,0xbf,0x3e,0xa2,0x6d,0x08,0x68,0x05,0x55,0xfb,0x34,0x5a,0xe1, + 0xb5,0x7b,0x69,0x23,0x1f,0x28,0xdf,0x53,0xe5,0x79,0x9c,0xac,0xe8,0x56,0xcd,0x75,0xbc,0x8c,0xcf,0x65, + 0x72,0x6d,0xbf,0x6d,0xef,0x53,0x19,0x52,0x79,0x3a,0xfa,0x6d,0x7f,0x9a,0x05,0xe7,0x38,0x9c,0xec,0x60, + 0x3c,0x0b,0x52,0x04,0xc9,0x59,0xfd,0xda,0xf4,0x34,0xa6,0xab,0xd0,0xcf,0xe4,0xbf,0x1c,0xc0,0xc2,0x98, + 0xd7,0x74,0xd5,0x6b,0xc5,0xaa,0x8c,0x81,0x90,0xeb,0xe9,0xce,0xe4,0xdc,0xdf,0x84,0xd9,0x51,0xc5,0x90, + 0x74,0xe7,0xbe,0x07,0x24,0xad,0xc1,0x6d,0xe1,0x65,0x19,0xa1,0xa0,0xb0,0x5e,0xd5,0x02,0x95,0x73,0xc1, + 0x3d,0x64,0xa6,0x5a,0xb2,0x08,0x2b,0xdc,0xf8,0x35,0x8c,0x70,0x1d,0xfa,0x97,0x00,0x05,0xc0,0x1e,0xca, + 0xe6,0x1c,0x0e,0x83,0x23,0x1f,0x48,0x78,0xd4,0x84,0x4d,0x58,0xa5,0xe3,0xa9,0xa4,0x3d,0xf9,0xeb,0x26, + 0xcd,0x82,0xf9,0x65,0x53,0xf1,0xa2,0xba,0xb8,0xb8,0x93,0xa5,0xad,0xde,0x02,0x2c,0xf6,0xb0,0x73,0x48, + 0xe1,0x21,0xa9,0x9d,0x02,0xa6,0x0b,0x7a,0x18,0x4f,0x12,0x6c,0x3d,0x92,0x69,0x7a,0xd0,0xf6,0x5a,0x83, + 0xfa,0xb6,0x33,0x48,0x8c,0x83,0xf4,0x80,0x57,0xaa,0xe1,0xd7,0x69,0x6a,0x6a,0xfa,0x40,0xc7,0xd5,0x76, + 0x78,0x33,0x60,0xc4,0xa1,0x69,0x7b,0xa1,0x80,0xf6,0x57,0x2e,0x20,0x9f,0x09,0x75,0xf7,0x4d,0xcf,0x4f, + 0x56,0xb0,0x99,0xa5,0x5d,0xa0,0x46,0xf2,0xee,0xb6,0xb4,0x67,0x1a,0x43,0xf6,0xfb,0x5a,0x2f,0xd5,0x10, + 0x97,0xaa,0x65,0x70,0x92,0x1e,0x7a,0x67,0xf1,0xdc,0xd9,0x6c,0xe0,0x50,0x26,0x87,0x73,0xe9,0x36,0xac, + 0x0b,0xf5,0x06,0x20,0x41,0xf8,0xa2,0xed,0x2c,0x0d,0xa1,0x0a,0x69,0x74,0xaf,0x95,0xfb,0x33,0xaa,0xdf, + 0xd0,0x8b,0x61,0xbc,0x88,0xaf,0x89,0xd3,0x67,0xfa,0xa6,0xa9,0x33,0xd1,0x3a,0x18,0x13,0xd3,0xc1,0x20, + 0x5a,0x6f,0xb2,0x06,0x9c,0x3e,0x20,0x17,0x34,0x90,0x52,0x02,0x9d,0xf5,0xef,0x48,0x94,0xf0,0x44,0xf9, + 0x32,0x8a,0xd4,0x76,0x29,0x52,0x0f,0x0f,0x0b,0x35,0xf4,0x56,0xeb,0xcf,0xf4,0x88,0x6f,0x5b,0x3c,0xe0, + 0xf1,0x3c,0x9e,0x6e,0x52,0x35,0x6c,0x75,0xa3,0x07,0xcf,0xb7,0xd7,0xf1,0x26,0xc3,0xe5,0x87,0x03,0x71, + 0x2b,0xbd,0xc1,0x73,0x74,0xe9,0xcf,0xe2,0x8b,0x31,0x4a,0x49,0x2d,0xd1,0x85,0xa1,0xe8,0xa3,0xc7,0xbf, + 0x19,0x5f,0xc0,0xf4,0xe5,0x81,0xaf,0x70,0xbf,0x51,0xb9,0x52,0x8d,0x74,0xb3,0x02,0xd2,0x7e,0xd9,0xf8, + 0x39,0xf3,0x27,0x41,0x34,0x93,0x1f,0x7f,0xa9,0xf3,0x00,0x9a,0xe7,0x41,0x1a,0x00,0xdd,0x31,0x03,0xe9, + 0x14,0x96,0x86,0xc6,0xa0,0x1e,0x36,0xe3,0xf9,0x1c,0xa4,0x50,0x3a,0x17,0xa8,0x9f,0x9f,0x49,0x30,0x4c, + 0x10,0xe2,0x7f,0xf9,0xc2,0xf6,0xbc,0xf4,0x22,0xc8,0xa6,0x4b,0x61,0x2d,0x9c,0x6e,0xeb,0xeb,0xe0,0x4b, + 0x46,0x07,0xac,0xe6,0xf4,0x0c,0x16,0xf1,0x17,0x05,0x65,0xfe,0x26,0x8b,0x9d,0xe7,0xb8,0xe0,0xbf,0x5c, + 0x6b,0xd4,0xe8,0xd9,0x70,0x57,0x38,0x6f,0x6e,0xbc,0xe9,0x3a,0x98,0x9e,0x5d,0xaf,0x63,0x75,0xc2,0x80, + 0x88,0xec,0x23,0xb5,0xaf,0x44,0xa6,0x1c,0x7a,0xf9,0x35,0x51,0xee,0x94,0x47,0x34,0x1a,0x58,0x80,0xa6, + 0x01,0x01,0x2f,0x72,0x08,0x86,0x7d,0x3f,0x42,0x04,0x9b,0x87,0x00,0x06,0xcb,0x60,0x36,0x93,0xd1,0xd6, + 0x56,0xc7,0x63,0xa0,0xdd,0x93,0xb3,0x20,0x6b,0x2a,0x66,0xfb,0xc2,0x87,0x85,0x6d,0xe2,0xe9,0xb8,0x06, + 0x14,0xcd,0x19,0xaf,0xbb,0x35,0x70,0x9d,0x8f,0xcb,0xc1,0x92,0x21,0x6e,0xde,0xf6,0x96,0x56,0xf1,0xd5, + 0x5d,0x9b,0xf1,0x60,0xcb,0x3e,0xe6,0x8b,0xec,0x4f,0x60,0xc7,0x37,0x99,0x3c,0x0a,0x22,0xdc,0xde,0x96, + 0x59,0xec,0x3b,0x9e,0x40,0xcc,0x38,0x02,0xd3,0x88,0xac,0xa3,0x82,0x1f,0x14,0x58,0xea,0x45,0x5e,0x88, + 0x58,0xa8,0x23,0xb5,0xe7,0x4d,0x79,0x0e,0xaf,0xa7,0x0c,0x0e,0xa5,0x21,0xdb,0xd8,0x49,0xc3,0x13,0x8c, + 0xa3,0x48,0x60,0x98,0x4d,0xee,0x8c,0x1a,0xfa,0x9f,0xd7,0xeb,0xd4,0xd5,0x1c,0x15,0x80,0x03,0xc8,0x2f, + 0x83,0x48,0x4d,0x78,0x4b,0x53,0x08,0xf2,0x39,0xb0,0x97,0xf1,0x2e,0xdf,0xd0,0x23,0xa8,0x00,0x63,0xad, + 0x22,0x21,0xb4,0xe4,0x3c,0x05,0x07,0xa8,0xec,0xe6,0x80,0x16,0x43,0x6b,0x7a,0x71,0x19,0x70,0x41,0x1a, + 0x98,0xf8,0x49,0xbe,0x17,0xb0,0xb0,0xd3,0xb3,0xcb,0x23,0x14,0x12,0x5a,0x47,0x57,0x4d,0x22,0x25,0xe3, + 0x8e,0x03,0xaa,0x4a,0x75,0x30,0xef,0x50,0xe1,0x2c,0x89,0xd7,0x4d,0x7d,0x00,0x84,0x9b,0xe4,0xa0,0xcd, + 0x9c,0xb1,0x96,0x08,0x88,0xcf,0xdc,0x4e,0x8e,0x2d,0xd2,0x87,0x14,0xb8,0xdb,0x42,0xda,0x07,0x32,0x78, + 0x77,0xeb,0xe1,0xae,0x87,0x6c,0x8f,0x88,0x65,0xcb,0x79,0x47,0xcf,0xe7,0x21,0xaa,0xd6,0x00,0x15,0x6e, + 0x03,0xa4,0x85,0xbf,0x66,0xf1,0x78,0xe5,0x7f,0x54,0x94,0x1d,0x44,0xec,0xd6,0xda,0x88,0x31,0x48,0x4b, + 0x0c,0xe6,0xe2,0xcc,0x44,0x07,0xff,0x1c,0x3a,0x42,0x04,0xad,0xb3,0xdb,0xb3,0xf0,0xc2,0x85,0x42,0xfe, + 0x4e,0x2f,0x3f,0xf4,0x3a,0x05,0xe2,0x53,0xdc,0x47,0xb5,0x8e,0xb4,0xa6,0xbc,0x2e,0x07,0x08,0x21,0xa3, + 0xfc,0x40,0x00,0xe1,0xbf,0xd8,0x95,0x11,0x21,0xb2,0x44,0x02,0xfe,0x8d,0xe5,0xc7,0xb5,0x0f,0xdb,0x36, + 0xab,0x60,0x9e,0xcb,0xaf,0x7a,0x40,0x53,0x4b,0x4c,0xd0,0x4d,0xe4,0x9f,0xbb,0x6b,0x87,0x0b,0x35,0xd8, + 0x77,0x9d,0x00,0x3b,0x46,0x8a,0x93,0x31,0x34,0xad,0xf9,0x91,0xeb,0x14,0x48,0x5e,0x3a,0x4d,0xe2,0x30, + 0x84,0x11,0xa9,0x56,0x11,0x5b,0xb0,0x77,0xe1,0x57,0xd0,0x60,0xe7,0xa8,0xee,0x18,0x8e,0x52,0x63,0x2b, + 0x89,0x0f,0xd6,0x4c,0x66,0xc1,0xaa,0x6e,0x2b,0x44,0xba,0x05,0x21,0x09,0xe4,0xe3,0xaa,0x25,0xa2,0xde, + 0x15,0xb7,0xb3,0x97,0x1c,0x54,0xe7,0x57,0x3c,0x60,0xe4,0xf6,0xab,0xbf,0x8b,0xa6,0xb8,0x4c,0xbf,0x6e, + 0x78,0x3c,0x9e,0x48,0x90,0x2d,0xe4,0xb5,0xa6,0x78,0xb5,0xda,0x51,0x99,0x7c,0x86,0x72,0x8e,0x52,0x2f, + 0x4c,0x33,0x51,0x02,0x30,0xad,0x11,0x61,0x60,0xb3,0x6b,0x41,0xa1,0x0b,0xbd,0x16,0xed,0x59,0xf9,0x41, + 0x74,0xbd,0x6d,0x8f,0x5b,0xc2,0xd9,0x65,0x84,0x65,0xc2,0x06,0x43,0xae,0x17,0x49,0x30,0x63,0x94,0xc2, + 0xad,0xc0,0xbb,0x26,0x20,0xdb,0x1a,0x45,0x21,0x24,0x59,0x9b,0x55,0x94,0xc2,0x66,0xae,0xa5,0x9f,0x1d, + 0x60,0x4b,0x40,0x35,0xb2,0x06,0xb0,0x54,0xd0,0xdf,0x41,0xb7,0x03,0x1d,0x35,0xda,0xf3,0xa4,0x5e,0x77, + 0xf0,0x34,0x05,0xee,0x26,0xa3,0x61,0x3d,0xf4,0x60,0x4c,0xf2,0x9a,0x5a,0xe5,0xc6,0xc6,0xed,0x07,0xcd, + 0x36,0x90,0x5b,0x58,0xd2,0xeb,0xad,0x0b,0x7d,0x07,0x6e,0x90,0x9f,0x41,0xb1,0xc1,0x77,0x04,0x34,0x1c, + 0x58,0xc5,0x0c,0x3b,0xee,0xd1,0xd0,0x22,0x68,0x17,0x9d,0x91,0x22,0x5f,0xf0,0xbf,0xf6,0x80,0xc7,0x26, + 0xbc,0xc5,0x52,0x86,0xeb,0xeb,0x5d,0xa0,0xd9,0xc1,0x33,0x4b,0xcb,0xe6,0x48,0x7b,0x9b,0xa8,0x43,0xf0, + 0x92,0xf8,0x62,0x3f,0x12,0xd6,0x52,0x64,0x85,0x78,0x80,0x31,0x63,0xfa,0x02,0xdf,0x26,0x5a,0x03,0x8b, + 0x04,0x40,0x96,0xc1,0x94,0xd2,0xd2,0xfa,0x15,0xa6,0x56,0xb9,0x67,0xed,0x43,0x9c,0x9b,0xda,0xa9,0x56, + 0x63,0x84,0x4b,0x52,0xa7,0x8e,0x3b,0x48,0x13,0xb6,0x08,0x10,0x5e,0xba,0x99,0x20,0x1d,0xa9,0x3a,0x5a, + 0xd4,0x1e,0x2d,0x93,0x78,0x25,0x9b,0xcb,0x46,0xbb,0xd5,0xc3,0x16,0x79,0x76,0xc0,0xd9,0xce,0x79,0xdf, + 0x2b,0x96,0x3d,0xe7,0xa3,0x68,0x99,0x7a,0xc4,0x57,0x52,0x3f,0x48,0x31,0xd4,0xbe,0x1d,0x7e,0x3e,0x7d, + 0x28,0xa8,0x1f,0x54,0x03,0x84,0x58,0x39,0x67,0x6a,0x29,0x82,0xf2,0xde,0xef,0x46,0x31,0xcc,0x6b,0x77, + 0xa2,0x1a,0x66,0x30,0xdb,0x38,0x00,0x3d,0x55,0x3e,0x32,0xf0,0x1f,0x1c,0x4c,0x70,0x1a,0xc8,0xf0,0xba, + 0xbc,0x96,0x5a,0xfd,0xa2,0x24,0x9a,0x92,0xa6,0x8c,0x40,0x30,0x05,0x29,0x03,0x36,0xef,0x8f,0x45,0x30, + 0xa6,0xfa,0x4d,0x0b,0xde,0xa7,0x7e,0x38,0x3d,0xa8,0x84,0x0a,0xf1,0xb5,0x18,0x30,0x43,0xb1,0x1b,0xd9, + 0x72,0xee,0x79,0x1a,0x06,0x6b,0x33,0x70,0xcd,0x09,0x18,0x9c,0x46,0xe1,0xaa,0x6d,0x84,0xbd,0x3d,0xd9, + 0x94,0x9d,0x1b,0xa2,0x66,0x67,0x4d,0x21,0xa9,0x8b,0x26,0x52,0xf3,0xba,0xa8,0x2c,0xc4,0x83,0xaf,0x74, + 0x04,0xe0,0xb8,0xf0,0x10,0xb0,0xa8,0x71,0x61,0x0e,0x9f,0x45,0x48,0x3a,0xd6,0x26,0x0a,0x24,0x28,0xa9, + 0x59,0x8a,0x8e,0x5a,0x89,0xc2,0x73,0x80,0x97,0xd9,0xb5,0xc3,0xf2,0x70,0xa5,0xb9,0x4d,0x8d,0x76,0x50, + 0x0b,0x43,0x27,0x90,0x9a,0xf3,0x91,0x81,0xe0,0xd6,0xd3,0xb4,0xb4,0x82,0x86,0x39,0xbd,0xb5,0x6e,0xdb, + 0x14,0xd4,0x3c,0xf2,0x70,0xc6,0xa1,0x9f,0x02,0x2e,0x2c,0x83,0x70,0x76,0xed,0xbe,0xc4,0xcc,0x2d,0xd6, + 0x01,0x4e,0xcc,0x9f,0x94,0xa1,0xbf,0xe3,0x02,0xbf,0x55,0x17,0xfe,0xb4,0xb7,0x53,0xdd,0x89,0x0f,0xf4, + 0x09,0x24,0x40,0x6a,0xc4,0xac,0x0b,0xbf,0x38,0xb9,0x76,0xd8,0x8b,0x56,0xcb,0xa1,0x2e,0xb8,0x33,0xba, + 0xf6,0x99,0xbc,0x2c,0xf0,0xe1,0x5c,0x7e,0xfb,0xfe,0x3a,0x3c,0x58,0xbf,0x33,0x5d,0xea,0x57,0xa7,0x59, + 0xb8,0xd7,0x59,0x31,0xaa,0xa0,0xd8,0x74,0x74,0xc8,0x68,0x76,0x73,0x6f,0xb3,0x9e,0x35,0xa3,0x38,0x93, + 0xa9,0xf0,0x82,0xa9,0x66,0x60,0x3b,0x16,0xeb,0x40,0xf0,0xb4,0x89,0x82,0x0c,0x0f,0x99,0x3d,0xe5,0xe4, + 0xf2,0x48,0xf2,0x26,0x04,0x5d,0x55,0xc8,0x82,0xcc,0xc2,0x1c,0xde,0x42,0xb3,0x71,0x68,0x55,0x72,0x9c, + 0xb5,0x46,0xfd,0x3f,0x17,0x05,0x6b,0xd6,0xc4,0x9b,0x42,0x19,0x02,0xc1,0x48,0x83,0xb4,0x92,0x5f,0x36, + 0xe3,0xb4,0xe4,0xa8,0x68,0xb3,0x9a,0xc8,0xc4,0xc8,0x65,0x4d,0x1e,0x2a,0x40,0xd3,0x81,0x85,0xee,0x9b, + 0x10,0x49,0x17,0x6a,0xe6,0xeb,0x8d,0xfe,0x08,0xf5,0xc0,0xf9,0x46,0x55,0x35,0x46,0x72,0x34,0x0a,0xf0, + 0x3e,0x9c,0x2e,0x30,0x00,0x1c,0xe3,0x3c,0x90,0xe1,0x6c,0xf7,0x7b,0xb9,0x28,0x1f,0x44,0x11,0x89,0xb8, + 0xa8,0xdd,0x67,0x4d,0xd1,0x9e,0x2f,0xc6,0x9b,0xcc,0x7d,0xf1,0x5a,0x3f,0xb1,0x86,0xa3,0x56,0x95,0x19, + 0xc1,0x2d,0x43,0x5a,0xfb,0x69,0x7a,0x01,0x68,0xf8,0xcb,0x96,0x9e,0x71,0x4a,0xce,0x33,0x56,0x62,0x19, + 0x39,0xa9,0x95,0x23,0xc8,0x96,0x45,0xd2,0x6c,0xe9,0xf6,0x9a,0x4a,0x64,0x56,0x15,0x0f,0xad,0x8a,0xe7, + 0x7e,0x78,0x3b,0x6a,0x19,0x8a,0x40,0x2a,0x6c,0x82,0x13,0x82,0xde,0x31,0xed,0x31,0x37,0xe5,0xcd,0x37, + 0x61,0x78,0xbd,0x85,0x55,0x9a,0x27,0x56,0x25,0xc6,0xca,0x4a,0x6c,0x63,0xc6,0xd6,0xcb,0xae,0x4a,0x78, + 0x4b,0x8f,0x67,0x41,0xc2,0x34,0x79,0xcc,0x2d,0x3b,0x38,0xa4,0xd1,0x55,0x4b,0x65,0xd8,0x4c,0x89,0x55, + 0x74,0xd9,0xc1,0xdb,0x51,0x1f,0xda,0x58,0x27,0xf2,0xfc,0xd6,0x25,0x2a,0xaf,0xc9,0xcc,0xbf,0x4c,0x6f, + 0xed,0x7b,0xb0,0xb3,0x6f,0x68,0x02,0x0e,0xc4,0x7d,0x0d,0x10,0xea,0x38,0x31,0xc7,0x06,0x1e,0x9d,0xc3, + 0xed,0x06,0x86,0x2c,0x39,0x2b,0x9e,0xd5,0x83,0x32,0xab,0x57,0x98,0xe6,0x26,0x45,0x9c,0x60,0xbd,0x2e, + 0x53,0x68,0x1e,0x23,0xc3,0xda,0xb5,0xb1,0x72,0x16,0xf5,0x87,0x5c,0x6b,0xbc,0xf4,0xd3,0x03,0x56,0x74, + 0x92,0x76,0x12,0x0d,0x44,0xdb,0xd4,0xbf,0xc5,0x02,0xd3,0x86,0xad,0x41,0xba,0xbb,0xb6,0xf5,0x22,0x98, + 0x07,0x5b,0x68,0xf4,0x16,0x7c,0x33,0xaf,0x94,0x70,0xf6,0xda,0xd2,0x81,0xbb,0x44,0xaf,0x33,0xd2,0x7d, + 0x01,0x4b,0x24,0xab,0xe8,0x38,0x6b,0x92,0xb8,0x76,0xeb,0x28,0x37,0xcd,0xfe,0x59,0x0f,0xc3,0x36,0x55, + 0xdc,0x51,0xe1,0xb7,0x5d,0xed,0x55,0x3e,0x34,0xb6,0x6f,0x77,0xdb,0x56,0xce,0xf2,0x64,0x56,0x32,0xda, + 0x5c,0x6f,0x11,0xb0,0xf3,0xc9,0x18,0xc6,0x15,0xa7,0x03,0xc4,0x9e,0x84,0x18,0xad,0x33,0x6b,0xf7,0x8f, + 0xfe,0x08,0x9e,0x79,0x58,0x94,0x33,0x49,0x26,0xed,0x19,0x4d,0x41,0xba,0xac,0xd3,0x61,0xa7,0xcf,0x67, + 0x57,0xe9,0x72,0xc9,0x4a,0x17,0x43,0xe9,0x75,0x39,0x33,0xe0,0x38,0xe1,0x2c,0xde,0x4c,0x97,0xf4,0x82, + 0x62,0xca,0x27,0x72,0xe9,0x9f,0x07,0xb0,0x52,0xb8,0xd6,0x20,0x77,0xe7,0x0b,0xf2,0x33,0x9f,0x9e,0x45, + 0x0d,0x22,0x3e,0x8e,0xd7,0x99,0x4b,0x01,0x8a,0x1b,0x46,0x87,0x2a,0xb4,0x9d,0x5d,0x48,0x19,0x6d,0x15, + 0x63,0x3b,0xd6,0x4e,0x1c,0x6a,0x16,0x7d,0xfb,0xc6,0x75,0x35,0xec,0x41,0xf7,0x5f,0x9b,0x71,0xa8,0xf5, + 0xc3,0xcd,0xd9,0xb2,0xc4,0xe6,0x25,0x6d,0xd3,0xaa,0xb4,0xa4,0x5a,0x26,0x43,0x5d,0x1f,0x38,0xf0,0x5b, + 0xe9,0x63,0x15,0x13,0xe1,0x74,0x97,0x37,0x82,0x6d,0x1f,0xde,0xdc,0x4b,0xfd,0x73,0xe9,0xe8,0x60,0xe7, + 0xc1,0x47,0x39,0x63,0x60,0xeb,0x03,0x9e,0x30,0xb8,0xb1,0xf6,0x4c,0xb1,0xc4,0x74,0x38,0x95,0x0d,0xce, + 0xff,0x7c,0xd0,0x84,0x17,0x72,0x18,0xec,0xdd,0xae,0x4a,0x37,0xeb,0xce,0xd8,0x88,0x4c,0xcc,0x61,0xef, + 0xfc,0xa2,0x31,0x18,0x91,0x90,0x6f,0x38,0xf3,0x96,0x92,0xa9,0x59,0xf4,0x22,0x87,0x83,0x2f,0x73,0x0a, + 0xa0,0xe9,0x75,0xab,0xa8,0x99,0x8b,0x00,0x15,0x9a,0x16,0x74,0xb2,0x40,0xe2,0x95,0xa3,0x80,0x59,0x44, + 0xe1,0x45,0x65,0xc7,0x0b,0xc7,0xda,0xdd,0x6a,0x69,0x4b,0xd4,0x56,0xca,0x48,0x66,0x3f,0x8b,0xe1,0xdd, + 0x61,0x2e,0xb2,0x6d,0x5a,0x15,0x04,0x43,0x9b,0xfa,0x5b,0xb6,0x15,0xd1,0xa6,0x81,0x05,0xe0,0xce,0x19, + 0x2c,0xdd,0xf0,0x0e,0x2b,0x49,0x61,0x9d,0xda,0x55,0x5b,0x42,0x67,0x9f,0xed,0x31,0x61,0xfb,0x47,0xf4, + 0xd3,0x46,0xbe,0xb0,0x74,0x9f,0xf7,0xbb,0x97,0xc2,0x51,0x4d,0x6a,0x60,0x59,0x75,0x07,0x25,0xb5,0x0b, + 0x82,0xb0,0xa3,0xab,0x9f,0xcf,0x89,0x72,0xa2,0xba,0x45,0x03,0x81,0x3d,0x44,0x2c,0x2b,0x0c,0xc6,0x3e, + 0x48,0xbf,0xde,0xe2,0xf9,0xb0,0xbd,0xf6,0x2e,0xf3,0xea,0x60,0xdb,0x6b,0x7a,0xfe,0xac,0xfa,0x69,0x23, + 0xa5,0x99,0xf8,0xc8,0x61,0x6f,0xd7,0xa0,0xdd,0x8a,0x62,0x65,0x83,0x75,0x74,0xb1,0x15,0x5d,0xd0,0x2f, + 0xed,0x76,0x0d,0x25,0x61,0x64,0xbf,0xca,0x4c,0xe5,0xea,0x13,0xa8,0x35,0x3d,0x05,0x6f,0x12,0x6e,0x64, + 0x85,0x43,0x56,0xe4,0xd7,0xb7,0x19,0xa9,0xcd,0xab,0xc9,0x84,0xd4,0x78,0x77,0xd0,0xea,0x99,0x03,0xf1, + 0xd0,0x45,0xe3,0x9e,0xf2,0x0b,0xb1,0xb0,0x58,0x75,0x22,0xbc,0xc9,0xc7,0xeb,0x1c,0xe7,0x0a,0x27,0xbb, + 0x7d,0xe8,0xdf,0xe1,0x94,0xc7,0x45,0x22,0x26,0x49,0x43,0xea,0x16,0xf6,0xd1,0x62,0x11,0xed,0xf1,0x6c, + 0x3b,0x2a,0x14,0xcd,0x2b,0x3a,0xb2,0x79,0x53,0x7f,0x8d,0x14,0xa5,0x09,0xbc,0x5b,0xe6,0x1c,0x98,0x46, + 0x19,0x32,0x2a,0xe9,0x6c,0x4b,0x8a,0x1c,0xb7,0x19,0xe1,0xdf,0x4a,0xda,0xaa,0x4e,0x9f,0x7b,0x59,0xec, + 0xa7,0x59,0x5a,0x3c,0x5e,0xd4,0x51,0x42,0xa6,0x69,0x73,0xd4,0xec,0x38,0x53,0x4a,0x1a,0x14,0x1c,0xbf, + 0xde,0xdb,0xc3,0x43,0xfb,0xfc,0xe8,0xc0,0xf9,0xd1,0x43,0x22,0x4a,0xa6,0x2a,0xe8,0xbc,0xa0,0x4e,0xea, + 0x95,0x16,0xbb,0xdd,0xfa,0x63,0xce,0x93,0x5e,0xa1,0x4e,0x7c,0x56,0xaf,0x3a,0x3b,0x5c,0xf6,0xa9,0xa0, + 0x02,0x46,0x09,0xb6,0x39,0x49,0xa4,0x7f,0x36,0xa6,0xbf,0x4d,0x2c,0x38,0xf2,0xa3,0x60,0xc5,0x6e,0x7b, + 0x19,0xda,0x73,0xdb,0xa3,0x54,0xcd,0xcd,0x93,0x89,0xf1,0x8a,0x29,0xa9,0x66,0xc9,0x98,0xc6,0xf5,0x84, + 0x97,0xf9,0xd3,0x2c,0x2d,0x9b,0xd5,0x76,0x49,0x65,0xb6,0x26,0xef,0x90,0x04,0x3d,0xab,0x29,0xa1,0xa4, + 0x75,0xbd,0xb8,0x7d,0xad,0xf6,0x2e,0x81,0xd1,0x7f,0x3e,0x93,0x97,0xf3,0xc4,0x5f,0xc9,0x54,0xc0,0xe8, + 0xaf,0x81,0xe5,0x5f,0x5d,0xe7,0x47,0x53,0xa5,0xe7,0x1a,0x69,0x2c,0x6e,0x72,0x25,0x50,0xdb,0xb2,0x1f, + 0xb1,0x25,0xcd,0xe0,0x67,0x9a,0x25,0xf1,0x99,0x1c,0x03,0xea,0xa1,0x46,0xfc,0x31,0x4e,0x1f,0x0d,0x99, + 0xa1,0xfd,0x54,0x49,0xd5,0x1d,0x7d,0x8b,0x98,0x08,0xb0,0x3d,0xa6,0xed,0xb6,0x0b,0xff,0x0a,0x98,0xcb, + 0xa5,0x37,0xde,0x52,0x26,0x71,0x99,0xdc,0x7e,0x11,0x57,0xad,0xa0,0xbe,0x6f,0x6a,0x69,0x67,0xf0,0x02, + 0x3c,0x0e,0x2c,0x2e,0x5a,0x6b,0x8d,0x5c,0x20,0xd6,0xaa,0x4a,0x1b,0xb8,0xc8,0x82,0x3d,0x30,0x16,0xec, + 0xa9,0x1f,0x9d,0xfb,0xe9,0x3d,0x60,0xac,0x81,0xe9,0x35,0x1b,0x3f,0x09,0xe3,0xe9,0x99,0xcd,0x0f,0xf8, + 0xe9,0x1a,0xa4,0xcc,0x26,0x79,0x85,0x8e,0x7b,0x0f,0xda,0x47,0xe4,0x93,0xda,0x84,0xc5,0x84,0x11,0x61, + 0x87,0x6b,0x40,0x58,0xdc,0x95,0x99,0x73,0x8e,0xb6,0xfa,0xf8,0x5f,0x79,0xde,0xd8,0x77,0x85,0xb8,0x5b, + 0x61,0x73,0xec,0x69,0x55,0x38,0xbe,0xd2,0xc8,0x6d,0x90,0x78,0x44,0xa3,0xc7,0xf3,0x04,0xb6,0x60,0x5f, + 0xb5,0x22,0x61,0xb0,0x6b,0x28,0xcf,0xb1,0x9c,0x65,0xc0,0xa2,0x81,0x6a,0x49,0x42,0x27,0x6a,0x67,0x73, + 0x80,0x55,0x14,0xb4,0x5d,0x2f,0x91,0x76,0xf2,0x22,0xf6,0xe6,0x69,0x43,0xfd,0x0a,0xf2,0x15,0x36,0x72, + 0xb8,0xcd,0x54,0xb9,0xce,0x72,0x65,0xbf,0x1a,0xa7,0x85,0xcf,0x13,0x3d,0x4d,0x1b,0x7a,0x77,0x73,0xd7, + 0x23,0x3d,0x14,0xba,0xb6,0x6c,0xa9,0xad,0xd6,0xf9,0x85,0x2d,0xaa,0xb1,0x7b,0xb2,0xb3,0xf9,0xe4,0xb9, + 0xc4,0xeb,0x52,0x56,0x69,0xb1,0x29,0xcf,0x52,0x51,0x91,0x1a,0xec,0xc8,0xf2,0x79,0x52,0x2b,0x8a,0x8a, + 0x2e,0x72,0x85,0x31,0x8b,0x59,0xf0,0x86,0x29,0x9d,0x9a,0x79,0x9b,0x24,0x8d,0x97,0x55,0x3c,0xe7,0x41, + 0xe6,0x87,0x9f,0x67,0x3c,0xdc,0x62,0xf0,0x3d,0x1c,0x18,0x7b,0xaf,0xd1,0xa4,0x43,0x2f,0x7f,0x88,0x9d, + 0xc9,0x85,0xc5,0xb6,0x26,0x8b,0xa5,0x13,0x6c,0x60,0xac,0x11,0x46,0x4c,0x25,0xb3,0x63,0x05,0xaa,0x10, + 0xb6,0x6b,0xae,0xb1,0xd3,0xa3,0xb1,0x0a,0xef,0x6c,0x2f,0xc8,0xdd,0x8b,0x41,0xec,0x17,0xed,0x11,0xdc, + 0x81,0x80,0xa3,0x3c,0xba,0xfe,0x02,0xfd,0x35,0x35,0x73,0xce,0xf0,0xd0,0x6f,0x69,0x76,0x70,0xde,0x01, + 0x98,0xf0,0x5c,0xa8,0xd8,0xcf,0xe4,0xd1,0x51,0x1b,0x05,0x8d,0x8a,0xcd,0x7e,0xd3,0xaf,0xf4,0x7b,0xe7, + 0x36,0x26,0xc6,0x2b,0xaf,0xc4,0x12,0x54,0x33,0xcc,0x6a,0xbf,0x4b,0x9e,0x72,0xdc,0x9a,0x08,0x0a,0x54, + 0xd6,0xa1,0x0a,0xc5,0xe6,0xd5,0x5b,0x69,0x09,0x59,0xbc,0xce,0x4e,0x74,0xb9,0xf1,0x30,0x34,0xef,0x16, + 0x39,0xa0,0x5a,0x05,0x4a,0xe4,0xb6,0x2c,0x54,0xdf,0xdd,0x6b,0x75,0x0b,0x9a,0x94,0x66,0xd2,0xdb,0x63, + 0x26,0x62,0x52,0xb2,0x40,0xdb,0x6c,0x65,0x0f,0x25,0x66,0x9a,0x2c,0xfa,0x02,0xa7,0xd7,0x77,0xc6,0xf9, + 0x30,0xd4,0x48,0x4f,0x12,0x81,0x85,0xf5,0x6d,0xda,0x85,0x2c,0x08,0x65,0x85,0x2c,0xfe,0x87,0xc4,0x1c, + 0x90,0x54,0x5c,0x42,0x9f,0xad,0x11,0x04,0x7d,0x37,0x62,0xa0,0x4a,0x40,0xc6,0xd1,0xde,0x12,0x40,0x50, + 0xc9,0x50,0x35,0xdb,0x25,0x2b,0x76,0x95,0x04,0x84,0xcd,0x0b,0x6f,0x7d,0x51,0xb1,0x20,0xce,0x51,0xd1, + 0x2e,0x9d,0x72,0x3b,0x9c,0x8a,0xd4,0x81,0xde,0x6e,0xe5,0xed,0x8b,0x60,0xb5,0xb8,0xde,0xa2,0x94,0xc8, + 0x8f,0xf1,0x3f,0x1f,0xc5,0x93,0xbf,0x62,0xa7,0x40,0xb9,0xb5,0x42,0x70,0x07,0x7b,0xe2,0x20,0x9f,0xee, + 0x6b,0x9e,0xed,0x69,0x4d,0xb5,0x9d,0x64,0x87,0xca,0xc9,0xce,0x21,0x89,0xba,0x3d,0xe1,0x45,0xab,0xf2, + 0x71,0xe8,0x58,0x5b,0xc9,0x09,0xb4,0x2a,0x7a,0x64,0x3f,0x52,0x6a,0xf7,0x95,0x5e,0x59,0xb2,0xa8,0xd5, + 0x45,0x8b,0xba,0xa8,0x56,0x07,0x9e,0x63,0xa8,0x12,0xfc,0x46,0x9b,0x15,0xac,0xd1,0x74,0x9c,0xf9,0x93, + 0x4d,0xe8,0x27,0x78,0x9f,0xba,0xf3,0xf0,0xa6,0xeb,0xeb,0xa2,0x52,0xa9,0xf0,0xbc,0xc2,0xb3,0x84,0x45, + 0x72,0xae,0x47,0x52,0xc5,0x56,0x2d,0x91,0x60,0xaf,0x2d,0x51,0xd0,0x04,0x6e,0x15,0x38,0xf4,0x59,0xa4, + 0x37,0xa2,0xa0,0xe8,0xc3,0xcd,0x82,0x79,0x98,0x40,0x29,0x84,0xbc,0x49,0x83,0x9c,0x30,0xea,0x96,0xb6, + 0xab,0xca,0x24,0x6b,0x61,0x9d,0xaa,0x68,0x63,0x94,0xeb,0x2e,0x8b,0x73,0x6a,0x58,0xa8,0xa6,0x66,0xa9, + 0x3b,0x68,0x17,0x3b,0x20,0xf6,0xe7,0x3f,0xaf,0xe4,0x2c,0xf0,0x0f,0xe8,0x05,0xea,0xb2,0x7e,0x6d,0x2f, + 0xd1,0xee,0x97,0xed,0xd5,0xd4,0x82,0xd5,0x97,0xc7,0xc3,0x28,0xa6,0xca,0x0a,0x7b,0xe8,0xd8,0x07,0x00, + 0xe2,0xfe,0xa0,0x20,0xb0,0xb9,0xeb,0x7d,0xaf,0x35,0x6b,0xb7,0xdb,0xc3,0xd9,0x61,0x05,0x9f,0xcf,0x48, + 0xdd,0x19,0x54,0x58,0x0c,0x94,0x7e,0x59,0x0e,0xe4,0x6c,0xde,0xad,0x98,0xda,0x6e,0x02,0x56,0xf1,0x82, + 0x1b,0x2e,0x73,0x6f,0x3e,0xea,0xb7,0x7b,0x87,0x55,0xf5,0x76,0x45,0xc5,0x6c,0x09,0x85,0x71,0x34,0xed, + 0x56,0x8b,0x96,0xf0,0xd9,0xb7,0x84,0x4f,0xd2,0x8b,0xc4,0x49,0x2a,0xd7,0xfb,0x0b,0x26,0xbb,0x94,0xf6, + 0x6d,0xcd,0xf1,0xe6,0x64,0x7b,0x83,0x7e,0xf4,0x53,0xa0,0x4d,0x65,0xc7,0xf1,0xa1,0x5c,0xa9,0xde,0xc7, + 0x63,0x7f,0x0e,0xcf,0x1a,0xfa,0xae,0xac,0x30,0x55,0x24,0x4a,0x0f,0x7c,0x07,0x43,0x03,0x82,0xf6,0x72, + 0xb6,0xa7,0xbb,0x72,0xaf,0xc2,0xd7,0x0f,0xdf,0x06,0x4a,0x95,0x55,0x08,0x09,0xbd,0xd6,0x67,0xd8,0xd7, + 0x1c,0x72,0x70,0x9b,0xdf,0x1c,0xd3,0xda,0x3d,0xe8,0x9e,0x1e,0x25,0x70,0x6a,0x7e,0xc2,0x43,0x85,0xf3, + 0x49,0x10,0x57,0xa0,0x57,0x49,0x39,0x9d,0x2d,0xb0,0x46,0x49,0x55,0xd2,0x29,0xab,0xcc,0xf6,0x72,0xe0, + 0xd2,0x2d,0x16,0x35,0x26,0xe4,0x06,0xd6,0x2d,0xf9,0x72,0x1f,0x15,0x23,0x18,0xf2,0x68,0xc9,0xb2,0x07, + 0x60,0xd1,0xf3,0xee,0x36,0x17,0xc3,0xc2,0x58,0xaa,0xdd,0x06,0x0b,0x95,0x2a,0x9d,0x04,0xed,0xa1,0x55, + 0xa1,0xf0,0x16,0x1b,0xa6,0xb6,0x1e,0x18,0xdf,0xfe,0xa3,0x3d,0xbc,0x0f,0xb6,0x90,0x38,0xbd,0x27,0x5b, + 0x0e,0x0b,0x45,0xbc,0xc8,0x2d,0x1f,0x47,0xa3,0x97,0xbf,0x6c,0x4d,0x26,0x85,0xcc,0x28,0x67,0x84,0x2b, + 0x15,0x18,0x55,0x06,0x5e,0x45,0xe2,0xca,0xe0,0x68,0xc9,0xb0,0xa8,0x95,0x73,0x47,0x50,0x56,0xe6,0x6a, + 0x0e,0xc9,0x77,0x2b,0xee,0x24,0x7b,0x70,0x40,0xb3,0xdd,0xa7,0x82,0x15,0xb1,0x7d,0xec,0xfa,0x2e,0x85, + 0x6f,0xb3,0x66,0xd7,0xb4,0xa1,0xe3,0x6f,0x0d,0x8f,0x61,0xbf,0x3b,0x2c,0xbc,0x6b,0xbf,0xe9,0x01,0xb7, + 0x07,0x04,0xa7,0x48,0x0b,0xdc,0xc7,0xce,0x10,0x09,0xd9,0x5a,0x7f,0x2e,0xd5,0xb1,0xa2,0x4a,0xb5,0xc3, + 0x70,0xa1,0x86,0x47,0x7a,0x6c,0xa7,0x15,0x87,0x17,0x2a,0x2a,0xd7,0xbd,0x6e,0x85,0xb0,0x51,0x68,0xd3, + 0xe7,0x46,0x8b,0xe2,0xe1,0x06,0xf9,0x4a,0x6c,0x6c,0xcb,0x0b,0x5b,0xd9,0x21,0x90,0x42,0xb2,0xcb,0xb2, + 0x58,0xe6,0xf8,0xab,0x17,0x5d,0x58,0x14,0x20,0xdf,0xe6,0x16,0x6c,0x1d,0xbe,0x33,0x3f,0x5d,0xca,0xdb, + 0xf5,0x0f,0x37,0x1e,0x06,0x71,0xe8,0x58,0xa8,0xce,0x7e,0x2f,0x96,0xec,0x3b,0x9d,0x3d,0x87,0x5b,0x30, + 0x7b,0xec,0x14,0x70,0xac,0xcb,0x82,0x35,0x90,0xc7,0x7c,0x8b,0x70,0x53,0xa2,0x54,0xf8,0x8e,0xb7,0xf7, + 0x2b,0xc5,0x08,0x6b,0x13,0x62,0x7f,0x43,0x87,0x82,0x82,0x9f,0xd1,0x2e,0xe1,0xdf,0x5d,0xb3,0x5e,0x59, + 0xc0,0xa3,0xa6,0x1e,0xee,0xd2,0x05,0x58,0x7e,0x5e,0xdb,0x62,0x21,0x2a,0xba,0xb1,0x96,0x95,0x5e,0x16, + 0x5e,0x27,0x55,0x7d,0x79,0xcb,0x38,0xab,0xe6,0x7a,0x80,0x94,0x67,0x00,0xda,0x0b,0x00,0xe4,0x70,0x12, + 0xde,0xc5,0x4b,0xe2,0x16,0x4f,0x83,0x1b,0x6f,0x4a,0x59,0x39,0x2a,0x2c,0x79,0xf0,0xc0,0x5d,0x75,0x4a, + 0x3d,0x71,0x47,0xd1,0xb9,0xa8,0xa9,0x30,0x27,0x34,0xaa,0x2d,0xcd,0x8a,0x93,0x96,0x93,0x03,0xef,0x10, + 0xc8,0x6f,0xc9,0x1a,0xe2,0x48,0x64,0xeb,0x44,0x12,0xdd,0x2a,0x5b,0x5c,0xfc,0x30,0xbc,0xf1,0xf0,0xa5, + 0xeb,0xfd,0x5b,0x2e,0x93,0x9b,0xb5,0x1f,0x92,0x03,0xd4,0xe7,0x68,0x2d,0x8d,0x13,0x73,0x97,0x9d,0xd0, + 0x1d,0xa7,0xe6,0x9c,0x0f,0x2b,0x87,0xaa,0x60,0xaf,0xcb,0xd9,0xbe,0x9e,0xb8,0xaa,0xba,0xc0,0x6c,0x0e, + 0x9a,0x1d,0x62,0x55,0x2e,0x97,0x63,0xdc,0xe0,0xb9,0x6b,0x3e,0x2c,0x43,0x85,0x39,0x38,0x94,0xb1,0x88, + 0x2c,0x61,0xa5,0x56,0x6c,0x76,0xba,0x10,0x86,0x4d,0xf5,0x1c,0x65,0x78,0x1e,0x24,0x40,0xa4,0x2c,0xf1, + 0x57,0xeb,0xed,0xf6,0x0b,0xdb,0x2a,0x54,0x46,0x9a,0xdd,0x30,0x47,0x5d,0x87,0x41,0x9a,0x95,0xbb,0xee, + 0xaa,0x81,0xe1,0x53,0xe1,0x2d,0x92,0xf5,0x9e,0x6a,0x84,0xa1,0x0d,0xb7,0x5d,0x36,0x44,0x94,0xce,0x60, + 0x32,0x7a,0x16,0x58,0xfb,0xbe,0x5c,0x6d,0x17,0x04,0x2a,0xc1,0xcb,0x0c,0x6d,0x3c,0x0f,0x12,0xe3,0x89, + 0x6e,0x07,0xa8,0x50,0xf8,0x45,0xf8,0x65,0x9e,0xf3,0x9a,0x37,0xaa,0x00,0xa3,0xbd,0x75,0x64,0xdb,0x19, + 0xd6,0x91,0xcb,0xbf,0x89,0x8a,0x24,0x1c,0xdb,0x8f,0x93,0x4e,0xe1,0x0c,0x41,0x7a,0xc8,0xf3,0xdd,0x7e, + 0x8a,0xd8,0x3b,0x8f,0x15,0x3f,0x3f,0xaa,0xbc,0xad,0x20,0x04,0xdd,0x6d,0x31,0x44,0x65,0xef,0x7c,0x1e, + 0x91,0x6f,0xba,0xbf,0x83,0xb7,0xff,0xb0,0xa8,0x8f,0xd2,0x2d,0xa0,0x36,0x8a,0xe9,0x14,0xb2,0x76,0x8e, + 0xc6,0xb5,0x8a,0xb4,0x55,0x37,0x92,0xf9,0x8b,0x2d,0x7a,0xa6,0x2a,0x58,0xed,0xed,0x0b,0xab,0xca,0xf1, + 0x43,0xf7,0x52,0x6d,0x82,0xee,0xe5,0x0b,0x29,0x18,0xd9,0x4b,0x34,0xd3,0x91,0xbe,0x91,0xac,0x48,0x7f, + 0xf6,0xf9,0xb1,0x69,0xaa,0x81,0x87,0x5b,0xf8,0xe7,0x76,0xbf,0xa5,0xba,0x99,0xc2,0xb6,0x65,0x85,0x75, + 0x51,0x2c,0xf4,0x2d,0x9a,0x6d,0xfd,0xb2,0x07,0x28,0x75,0x5d,0xb1,0x22,0x38,0x4d,0x6f,0x12,0x2c,0x34, + 0xcb,0xd1,0xef,0x55,0x05,0x8c,0x31,0x69,0xdc,0x3f,0xb2,0xc2,0x4a,0x09,0x00,0x2f,0x62,0x24,0xc5,0x1e, + 0xe1,0x1c,0x79,0xd4,0x9f,0xde,0x08,0x7c,0x71,0xcc,0xfc,0xac,0xeb,0x6c,0x89,0xa3,0xb1,0x5d,0x05,0x8b, + 0xb1,0xb1,0x46,0x10,0x46,0xe5,0x29,0xf9,0x76,0x36,0xfd,0xa9,0x65,0x75,0xc1,0x85,0xf7,0xa3,0x59,0x28, + 0xd3,0xdb,0xdd,0x5b,0x55,0x53,0xb9,0x6d,0xf5,0x50,0xef,0xfd,0x56,0x37,0xdf,0x1d,0xfe,0x23,0xda,0x23, + 0xdf,0x3a,0x7a,0x0e,0xdd,0xac,0x08,0xdb,0xdd,0x7c,0x4a,0x22,0x36,0xd3,0xa7,0x45,0xe2,0x4f,0x76,0xab, + 0x35,0x75,0xb4,0x09,0x0e,0x1a,0x18,0xc2,0x2d,0xae,0x0c,0x6e,0xf3,0x36,0xbf,0xef,0xf5,0x0b,0x64,0x88, + 0xb9,0xa8,0x82,0x43,0x99,0x15,0xb7,0xbb,0xa8,0x37,0xf8,0xbe,0xeb,0xb8,0x98,0x58,0x14,0xd4,0xb6,0x2f, + 0x30,0xb5,0x5c,0xee,0x17,0xdd,0x4b,0x00,0xd2,0xdf,0xd3,0x5b,0x47,0x4d,0xa0,0xb7,0xeb,0x00,0xa8,0x50, + 0x1d,0x10,0x43,0x4f,0x43,0x22,0xf2,0x0d,0x4b,0x96,0xf7,0x41,0x69,0x25,0x0f,0xda,0x40,0xe4,0x55,0x1d, + 0xa0,0xb9,0x0f,0x83,0x3d,0x8c,0x20,0xfa,0xc5,0x4e,0x3f,0x7f,0xd1,0x4c,0xf9,0x36,0x35,0x06,0xd5,0x9f, + 0x01,0xff,0x7c,0x6d,0x6d,0xfa,0x04,0x20,0x46,0x8d,0xb3,0x90,0x64,0xc5,0x2e,0xd5,0x67,0xca,0xc3,0xbb, + 0x67,0x17,0xc1,0x56,0x52,0x79,0x37,0xb4,0x2f,0xd0,0x37,0x78,0x5d,0x6c,0x4f,0x42,0x62,0x75,0x52,0x15, + 0xe7,0xa2,0x98,0xc1,0x96,0x18,0x8c,0x8c,0x89,0x7f,0x30,0xb2,0xde,0xf1,0xd6,0xe1,0xb5,0x4b,0x6b,0x26, + 0x40,0x8f,0x4b,0x54,0xbb,0x40,0x6a,0xca,0xae,0x49,0x9b,0x75,0x35,0xf3,0xd5,0x2b,0x6b,0xa5,0x2b,0x48, + 0x6c,0x90,0x9e,0xc9,0x2d,0x3c,0x76,0x99,0x42,0x15,0x2d,0x2f,0xd5,0x52,0xcb,0xe7,0x05,0x94,0xaa,0x65, + 0xd5,0xce,0xf8,0xb3,0xf3,0xa5,0x68,0x8a,0xea,0x70,0xd2,0xa6,0x18,0xa1,0x6f,0x93,0x9b,0xe6,0x87,0x8f, + 0x1b,0x33,0x1d,0x11,0x90,0xb7,0xd4,0x36,0xfb,0x98,0x51,0x52,0x15,0xec,0x5d,0xdc,0x40,0x18,0x63,0xfc, + 0xe4,0xad,0x7a,0xb7,0xf6,0xd1,0x1d,0xa3,0x7e,0x76,0x5b,0x1b,0x4a,0xfe,0xf3,0x94,0x6a,0x62,0x0f,0xd5, + 0x41,0xe5,0x36,0xd8,0x73,0x11,0x1e,0x86,0x86,0x5d,0x5b,0xfe,0x21,0xda,0x94,0xb1,0xc5,0xd7,0x97,0x57, + 0xa7,0xbb,0x7b,0x07,0x81,0x9a,0x95,0x69,0x46,0xee,0x64,0xb7,0x4e,0xcf,0xb0,0x57,0xe1,0x8d,0x52,0xc1, + 0x36,0x27,0x40,0x93,0x39,0x66,0xb8,0x95,0xf6,0xd8,0xd0,0xf9,0x4e,0x8d,0xcf,0x39,0x27,0x2d,0x87,0x37, + 0xd5,0xd2,0x75,0x16,0x5b,0xb4,0x2c,0x89,0x33,0x20,0x96,0x07,0xdd,0x41,0x6b,0x26,0x17,0xe8,0xe7,0xb6, + 0x92,0x61,0x5c,0x8d,0x09,0x84,0x75,0xf8,0xf8,0x6e,0x4c,0xfc,0xa1,0xce,0x67,0x90,0x8b,0x8e,0x5d,0x87, + 0xab,0xff,0x2c,0x8e,0xbe,0x8a,0x69,0xd7,0xa9,0x36,0xcc,0x28,0x75,0x88,0x92,0xcd,0x65,0xea,0x47,0x5e, + 0x92,0x6d,0xe3,0x55,0xad,0x4a,0x5b,0xb9,0x44,0x9b,0xbf,0x31,0xb5,0xab,0xbd,0x21,0x4a,0x1a,0xd9,0x4a, + 0xaf,0x23,0x8d,0x56,0x3d,0x6b,0xfc,0x1e,0x92,0x32,0x4d,0xb1,0x8b,0x84,0x80,0xc9,0x96,0x55,0x53,0xf5, + 0x5f,0x26,0x6d,0xba,0x0e,0x20,0x15,0xb0,0x51,0xb7,0x46,0x1d,0x68,0x06,0x8a,0x6a,0x0c,0xed,0xe1,0xe4, + 0xa2,0x45,0xe5,0xdb,0xe8,0x63,0xba,0xf5,0x65,0xa3,0x5a,0x85,0x95,0x84,0x0a,0x5f,0x92,0xb4,0x2f,0x1f, + 0xd0,0x6a,0xdd,0xdd,0x1e,0x7e,0xc8,0xe6,0x5e,0x16,0xff,0xad,0x17,0x48,0x4a,0xf9,0x02,0x7b,0xb8,0xd3, + 0x54,0x7a,0x75,0xfd,0x39,0x76,0x6f,0x07,0x62,0x2a,0xd9,0x5b,0x7f,0xbd,0xe5,0x3c,0x22,0xb3,0x10,0x3c, + 0xdd,0x37,0x23,0xc6,0xe8,0x56,0x7f,0xe2,0x2a,0x54,0xd2,0xf9,0xf7,0x76,0xcb,0xcf,0xc5,0xc3,0x9e,0x87, + 0xe5,0xcd,0x76,0x9b,0x54,0xb9,0x16,0x6a,0x0b,0x82,0xb5,0xcd,0xcb,0xec,0x52,0xe8,0x14,0x83,0x10,0x77, + 0xfb,0xb3,0x97,0xd8,0x7d,0x47,0xae,0xef,0xe5,0x89,0x5c,0x30,0xb9,0x88,0x68,0x76,0xf2,0x25,0x05,0x76, + 0x22,0x4e,0xab,0xb7,0x94,0xfd,0xe7,0x6e,0x55,0xeb,0xf1,0xe1,0xd0,0xaa,0x70,0x1e,0xb4,0x49,0x86,0xee, + 0x0d,0xfe,0x50,0xa6,0x19,0x63,0x4f,0x68,0x39,0xc6,0x93,0x5d,0x8e,0x54,0x5b,0xf6,0x7b,0x60,0x4f,0xc6, + 0x78,0x87,0xa0,0xa5,0x82,0xf6,0x73,0x8b,0x97,0x48,0x97,0xbd,0x44,0x2a,0xd5,0x8f,0x79,0x63,0x02,0x93, + 0x75,0x14,0xd4,0x5f,0xb7,0xda,0x43,0xf3,0x06,0xa6,0x4b,0xd8,0xf0,0x9d,0x7e,0x23,0x76,0x0a,0x2f,0xdb, + 0xbe,0x4f,0x9a,0xf1,0x7e,0xbf,0xe8,0xfe,0x65,0x8b,0x4d,0x6d,0x2b,0x90,0xa0,0xb0,0xc8,0xd8,0xaf,0xe7, + 0xee,0x6a,0x7c,0x56,0xa0,0x35,0xf7,0x3a,0xd2,0x6f,0xf5,0xba,0xfd,0x7e,0xf1,0xb5,0xb3,0xa0,0x22,0x0f, + 0xc1,0x2e,0x65,0x0e,0x6e,0xa9,0x63,0x70,0x34,0x7c,0xdf,0x2e,0xfd,0xa4,0x7a,0xeb,0xa1,0xb7,0x9a,0x64, + 0xb9,0x59,0xb6,0xa7,0xd1,0xd0,0x5a,0xb5,0x5e,0x11,0xdc,0xed,0x97,0x89,0x66,0x6c,0x4b,0x21,0x70,0x4b, + 0x9c,0x66,0xcf,0x86,0x3d,0x0a,0x18,0xdf,0x87,0x31,0xb3,0x86,0x6a,0xac,0xa0,0x7f,0x84,0xeb,0xea,0x68, + 0x6b,0xb8,0x27,0xfa,0xd8,0x0c,0x8b,0x93,0xde,0x12,0x92,0xe9,0x56,0x7a,0x58,0x36,0xbb,0x16,0xac,0xa3, + 0x47,0xa5,0xcc,0x39,0x45,0xfb,0xd7,0xbe,0xb2,0xb9,0x4e,0x5b,0x54,0xee,0x7e,0x77,0x00,0xcd,0x96,0x97, + 0xaa,0xb2,0xb4,0xc2,0x99,0x5f,0xd7,0xbe,0x3e,0x76,0x2a,0x0c,0x8c,0x37,0xb9,0x2e,0x02,0x45,0xbe,0xb5, + 0x18,0x99,0x32,0x6c,0x9d,0x5f,0x34,0x3a,0x1c,0x99,0x62,0x20,0xbe,0xe0,0x13,0xd0,0x53,0x9e,0x67,0x45, + 0x63,0x8b,0xa2,0xf2,0x20,0x24,0xe6,0xf4,0xcb,0x64,0xf2,0x1d,0x32,0x02,0x4d,0xe7,0xac,0xc3,0x83,0x31, + 0xc2,0xa1,0xa9,0x4c,0x4d,0x4e,0x2e,0x96,0xa3,0x5d,0xd1,0xa9,0xbc,0x10,0xdc,0xce,0x96,0x9d,0xe5,0x87, + 0x82,0x93,0xb1,0xd8,0xbb,0xd6,0xca,0x9f,0xc1,0x9f,0x92,0xf7,0xc4,0x8e,0x63,0xd2,0x56,0x57,0x33,0x1f, + 0x29,0x67,0x24,0xd3,0xdd,0x1d,0x70,0xb7,0xe4,0x3a,0xe2,0xf6,0xdc,0x78,0xf6,0xad,0xe7,0xa4,0x9c,0xc1, + 0xa0,0x81,0xfb,0xdb,0x87,0xd7,0xee,0x74,0x9d,0xc4,0x54,0xb9,0x6d,0xa6,0x53,0xb2,0xcd,0x50,0x6a,0xbc, + 0x1b,0x0f,0x53,0x20,0xc2,0xb5,0xdc,0x27,0xe5,0x82,0x7d,0x68,0xfc,0x51,0xb8,0x5d,0xb2,0x54,0xea,0x01, + 0xa1,0x99,0x7b,0x6f,0x9d,0x6a,0x91,0x67,0xd1,0xff,0xda,0x9d,0xdb,0xd9,0x9e,0xdb,0x3c,0x65,0x8a,0x03, + 0x32,0xb6,0xa9,0x76,0xd1,0x80,0x52,0x8c,0x3d,0xdb,0xdf,0x89,0x6a,0x20,0x57,0x9f,0xe7,0x25,0x5f,0x52, + 0xc1,0x97,0x46,0x5b,0x8d,0xcd,0x50,0x31,0x53,0xaa,0x64,0xe4,0x69,0x60,0xb4,0x82,0xcf,0xe1,0xdb,0x22, + 0x23,0xfe,0x98,0xc4,0xe7,0xf6,0x89,0xad,0xbd,0x3a,0x0a,0x8b,0xd2,0x32,0x43,0xac,0x64,0x8c,0xf3,0x79, + 0xde,0xc5,0x22,0x58,0x7c,0x6f,0xa7,0x0d,0x70,0x9e,0x61,0xa2,0xb0,0x7d,0x11,0x43,0xbd,0xda,0x3a,0xca, + 0x79,0x38,0xdd,0x84,0xb7,0x8a,0x67,0xe9,0xb5,0x15,0xe9,0x82,0x97,0x4a,0x5d,0x81,0x75,0x88,0x30,0x5b, + 0x3a,0x7f,0xd3,0x94,0x6b,0x54,0xb6,0x9d,0x8a,0x2a,0x13,0xc1,0x55,0x84,0x6e,0x60,0xf3,0x3b,0x2d,0x85, + 0x05,0x58,0x2a,0x3b,0xdd,0x0c,0x2a,0x5c,0xc2,0xee,0x82,0x46,0x54,0xe7,0x3f,0x14,0x51,0xd4,0x1c,0x0d, + 0xa4,0x7f,0x66,0x0a,0xa6,0xad,0x6e,0xab,0x05,0x26,0xcd,0xd2,0xd0,0x6f,0xf1,0x66,0xb5,0xf6,0xb0,0xe3, + 0xf0,0xa2,0x15,0x4e,0x5c,0x05,0x16,0xce,0x9e,0xc9,0x7e,0x5a,0x70,0x56,0xa3,0x71,0x7a,0xc4,0x79,0x86, + 0x13,0xba,0x33,0xc5,0xec,0x3a,0xbe,0x66,0xfb,0xa5,0x84,0xe9,0x16,0x58,0x76,0xb4,0x03,0x38,0xe7,0xc3, + 0x0e,0x81,0x51,0x0f,0xf4,0x36,0x0e,0x48,0xd5,0xfa,0x7c,0x7b,0x68,0xb3,0x9d,0xaf,0x8a,0xb7,0x2d,0x67, + 0x5f,0x67,0x17,0x1f,0x5f,0x0e,0x22,0xe8,0x54,0xa4,0xa5,0xe3,0x1e,0x1e,0x5a,0xc4,0xc4,0x72,0xe0,0xa4, + 0xeb,0x9d,0x24,0x49,0x8f,0x8f,0x1a,0x28,0x33,0x00,0xea,0xb9,0x4c,0x92,0x52,0x05,0x56,0xec,0x70,0x85, + 0x6d,0x41,0x00,0x5f,0xa0,0xe3,0xc8,0x7b,0xa6,0xc6,0xb7,0xf7,0x3c,0xff,0x58,0xd6,0x8e,0xb5,0x1d,0xc8, + 0x2f,0x44,0xd7,0x16,0xdd,0xde,0x53,0xbb,0x2d,0x4a,0x16,0xc4,0x8e,0xd3,0xf5,0x46,0xbe,0x3c,0xf8,0xa8, + 0xe1,0x80,0x0e,0x75,0x6c,0xdc,0xd8,0xed,0x26,0xfe,0x18,0x8f,0xf5,0xea,0x74,0x6f,0x36,0xde,0x54,0x0b, + 0x02,0x0a,0x92,0x6c,0x1d,0xc9,0x36,0xd9,0x51,0xeb,0x89,0x73,0x40,0xb5,0x86,0xbf,0x2d,0x85,0xe6,0x0e, + 0xb1,0xb3,0xd4,0x86,0x92,0x18,0x2a,0x9a,0x2a,0x6e,0xa1,0xe3,0xb1,0xde,0xd8,0xda,0x12,0x3f,0x57,0xed, + 0x59,0x51,0x9e,0xc5,0xec,0x01,0x05,0x9a,0xff,0xf9,0x1e,0xf0,0xd6,0x40,0xb6,0x63,0x18,0x56,0x83,0x85, + 0xde,0x16,0x05,0x63,0xbe,0x99,0x60,0x73,0x1d,0x05,0xd5,0xfd,0x8d,0x97,0x2e,0xdd,0xd4,0xa0,0x77,0x3a, + 0xf2,0x6d,0x02,0xbf,0x33,0xd7,0x8e,0xea,0xc5,0x8b,0xd7,0x7a,0xbc,0xda,0xcb,0xc9,0x8e,0x86,0xed,0xf5, + 0xff,0x6c,0xaa,0xd2,0xa7,0x55,0xa8,0x7e,0xfd,0x21,0x94,0x39,0x1a,0x41,0xa6,0x21,0xaa,0xe2,0x43,0xcd, + 0x34,0x97,0xd2,0xb2,0xb8,0xcf,0x0b,0x5c,0x93,0x8d,0x1d,0xa5,0xe3,0xae,0x1c,0xbe,0x58,0x69,0xbb,0x45, + 0x4f,0x17,0x7b,0x66,0x85,0xae,0x4a,0xa6,0x86,0xf6,0x88,0x4d,0x0d,0x7a,0x3e,0x5f,0xce,0xeb,0x38,0x7b, + 0x82,0xed,0x7e,0x99,0x97,0xd1,0x68,0x77,0x6a,0xce,0xed,0x87,0xe6,0xee,0xa3,0x8f,0x86,0x75,0xdb,0xc9, + 0x47,0x95,0x04,0xfc,0x9c,0x5d,0x6f,0xd1,0xd4,0x55,0x19,0x20,0xbf,0x84,0xd4,0xe7,0x3d,0xde,0x12,0xfd, + 0xc8,0xf9,0x82,0x74,0xed,0x73,0x67,0x7c,0xb9,0xf6,0xe1,0x50,0x47,0xf1,0xb0,0xaf,0xe2,0x36,0x91,0x22, + 0xff,0x0c,0x94,0xad,0x20,0xfd,0x23,0xa6,0x71,0xee,0x01,0x4c,0x84,0xb2,0xca,0xd1,0x45,0xce,0x00,0x3d, + 0x3f,0x4b,0xac,0x3c,0xbc,0x73,0xb8,0x05,0x6f,0x27,0xf5,0xa8,0xac,0x50,0xb6,0x5e,0xed,0x96,0x94,0x2e, + 0x95,0x0c,0x49,0x2e,0xaf,0x75,0xe9,0x83,0x60,0x6e,0x40,0x6b,0x21,0x7c,0xc0,0xe9,0x5a,0xb9,0x06,0xec, + 0xf8,0x4a,0x4c,0xa5,0xf6,0x01,0xdf,0x57,0x36,0x23,0x1e,0xfb,0x30,0x27,0x9b,0xc3,0xdb,0x92,0x1b,0xd9, + 0xa9,0x7b,0xf2,0xd9,0x12,0x2f,0x17,0x84,0x78,0x6a,0x6b,0xb1,0x9f,0xfa,0x41,0x41,0x49,0xf7,0x65,0xd5, + 0x51,0xac,0x9f,0x19,0x4c,0x2a,0xa7,0x65,0x76,0xa3,0x5b,0xe1,0x75,0x90,0xd7,0xd7,0xfc,0xc0,0x67,0x1f, + 0xd7,0xf6,0xc2,0x1e,0x56,0xa5,0x14,0x29,0x77,0xf6,0x19,0xa7,0x37,0xb7,0x91,0x7f,0x69,0xe8,0x0f,0x17, + 0x66,0x6c,0xba,0xaa,0xfc,0xbd,0xad,0x83,0xb4,0x5b,0xb0,0x68,0x16,0x87,0x03,0xb4,0x3c,0xba,0x3d,0xa5, + 0xa1,0x1d,0x6b,0x55,0x60,0x83,0xf3,0x0f,0x22,0x94,0xdd,0x8c,0x86,0x5b,0x1d,0xcf,0x9d,0xa5,0x5a,0x58, + 0x28,0x70,0x88,0x18,0xd0,0x2b,0xd0,0x97,0x92,0x89,0xbf,0x6a,0x1e,0x3b,0xc4,0x7e,0x59,0x50,0x39,0x55, + 0xe2,0x4b,0xc1,0xbf,0x82,0xdc,0x2b,0x3a,0xfd,0x56,0xc1,0x8f,0x42,0x65,0x94,0x94,0x98,0xf2,0x7e,0x93, + 0x35,0xe8,0x62,0x19,0xf2,0x6f,0xe6,0xdb,0x76,0x67,0xfa,0xb2,0x9f,0x33,0x0b,0x7f,0xc2,0xe0,0xd5,0xa9, + 0xb0,0x6b,0xab,0x06,0x2d,0x37,0xc0,0x4a,0xfa,0x68,0xd3,0xd4,0xfd,0x14,0x39,0x39,0x5b,0xaa,0x23,0xf4, + 0x2a,0x84,0xf9,0x92,0x11,0x2e,0xdf,0xf0,0x5e,0xaf,0xea,0x44,0x24,0x79,0x69,0x60,0x0d,0x5c,0x14,0xad, + 0x47,0xa5,0xf0,0x7a,0x53,0xb1,0x22,0xd2,0xcb,0x7e,0x8a,0xb9,0x86,0x4a,0xcc,0x63,0xe1,0x83,0x81,0x5c, + 0x1f,0xd3,0xa9,0x6e,0xb1,0xc5,0xb4,0x5d,0x15,0x5a,0x61,0x97,0xb6,0x7b,0xae,0x14,0x7c,0xf7,0xf3,0x2c, + 0x93,0x44,0x82,0x22,0x60,0x76,0xfc,0x70,0x5b,0x00,0x57,0xcb,0x4a,0x6d,0xc7,0x1d,0x96,0x92,0x5a,0x54, + 0xc5,0x0c,0x17,0x89,0x49,0x80,0x86,0x47,0x1a,0x1d,0x5f,0xc9,0x1b,0x3d,0x6c,0x97,0x9f,0x4a,0x24,0x01, + 0xd3,0xf6,0xc4,0xa0,0x0e,0xf1,0xc3,0xcc,0xa5,0x45,0x37,0xb8,0x2d,0x09,0xfb,0x74,0x7f,0x65,0xbf,0x33, + 0x55,0x3e,0x66,0x48,0xa9,0x4c,0x99,0x4f,0x1f,0xd7,0xac,0x97,0x47,0xa0,0x97,0xa4,0x32,0xdb,0x5f,0xc1, + 0x29,0xd3,0x05,0x24,0x6d,0xc4,0xc2,0xef,0x60,0xe8,0x36,0x38,0x21,0x55,0x09,0x8b,0xf1,0x53,0xa5,0x75, + 0xab,0x16,0xb0,0xcc,0x15,0x23,0x84,0x52,0x55,0xe9,0xcc,0x01,0xb4,0xec,0xec,0x42,0x95,0xbb,0xae,0x16, + 0xf8,0x61,0x52,0xf5,0xc0,0xe5,0xa3,0xe8,0x13,0xa5,0xea,0x89,0x6b,0x84,0xc4,0x8f,0x95,0xaa,0x07,0x2e, + 0xac,0xe3,0x67,0x4b,0xd5,0x83,0x69,0xb1,0x2d,0xfd,0x20,0x76,0x1f,0xc4,0x6b,0x55,0xbe,0xaa,0x5e,0xed, + 0x7a,0x55,0xd6,0x0f,0x39,0xdb,0x69,0x1e,0x51,0xb6,0x82,0xdc,0xfa,0x7d,0xab,0x8e,0xf8,0x56,0x93,0x0e, + 0xf5,0xc8,0xa9,0x5c,0x1c,0x57,0x03,0xeb,0x0b,0x04,0xbb,0x28,0x50,0x55,0x5e,0x17,0x6e,0xd2,0x93,0xd1, + 0xec,0xba,0x24,0xc2,0x38,0x4d,0xda,0x72,0x1a,0x7f,0x20,0xa6,0xb2,0x8f,0x7d,0x39,0xce,0xbc,0xdf,0x4a, + 0x3d,0x35,0xe5,0x13,0xf1,0x90,0x01,0x2a,0xb3,0xa2,0x55,0x64,0x8f,0x1a,0x5b,0xc4,0xf1,0xac,0x68,0xa7, + 0x36,0x0f,0xd1,0x19,0xa8,0x2c,0xc6,0xcb,0x19,0x42,0x79,0x89,0x2b,0xaa,0x4c,0x8d,0xc2,0xa0,0x7f,0x54, + 0xb0,0x21,0x5a,0xbc,0x49,0xd5,0xce,0xd9,0xe2,0xba,0xf9,0xa8,0x46,0x4b,0x5b,0x5a,0xca,0x5f,0x0d,0x74, + 0xbe,0x3d,0x56,0x38,0xdc,0x2a,0x33,0xca,0xa9,0x39,0x14,0xc4,0x0f,0x26,0xe8,0x6e,0x18,0x80,0x4b,0xda, + 0x79,0xd5,0xf7,0xfc,0x76,0xda,0x1f,0xe2,0x55,0xd8,0xae,0x74,0x24,0x74,0xfc,0x0c,0x2b,0x68,0xb7,0x19, + 0x6b,0xae,0xa8,0x2e,0x67,0x5d,0xf0,0xfc,0x69,0xc5,0x54,0x34,0x55,0xfb,0x1f,0x92,0x41,0x99,0x45,0x15, + 0xf7,0x38,0xb1,0x52,0x39,0xb0,0xab,0xa8,0x3f,0x15,0xb3,0xe0,0xbc,0xda,0x61,0x81,0x44,0xc0,0x12,0x0c, + 0xec,0xf8,0xae,0x2d,0x9c,0xa5,0xba,0xc5,0x4a,0xad,0x6d,0x29,0x1b,0x31,0xd7,0xad,0x4a,0x46,0x6c,0xb5, + 0xe3,0xa6,0x19,0x9e,0x62,0x9c,0xe2,0x6c,0x61,0xfc,0xad,0x2d,0xf9,0xbd,0xca,0xf0,0x9d,0x43,0x72,0x6f, + 0x0f,0x48,0xbe,0x07,0x42,0x40,0x73,0xb9,0x99,0x08,0xd5,0x47,0x0e,0xbf,0x15,0xa2,0xad,0xd5,0x04,0xb3, + 0x0c,0xd6,0xeb,0x98,0x6c,0xae,0x20,0xd4,0x38,0x0f,0x2b,0x3f,0x36,0x60,0xf9,0xfa,0x8c,0x5a,0x9c,0xb4, + 0x13,0x06,0x51,0xa2,0x1b,0x1a,0xe5,0xb7,0x50,0x87,0x2d,0x20,0x65,0xf0,0xd1,0x32,0xe9,0xeb,0x1e,0xaa, + 0xc8,0x56,0x85,0x1b,0x8f,0x71,0xb1,0xd1,0x3e,0x0b,0x06,0x98,0x86,0x98,0x57,0xb6,0x7e,0x6d,0x8c,0x74, + 0x0f,0x8b,0x36,0x60,0x8d,0x47,0x6c,0x11,0xe7,0x0f,0x60,0xdd,0xc9,0xd5,0xb9,0xdf,0x29,0xba,0x3a,0x77, + 0x5a,0x55,0x56,0x68,0xa7,0x0b,0xf4,0x71,0x98,0xdc,0xad,0x9f,0x76,0xa7,0x4b,0xd9,0x3e,0x9d,0x76,0x1e, + 0xfe,0xe5,0xda,0x55,0x51,0x29,0xbf,0x82,0xdb,0x29,0x94,0xae,0x2a,0x50,0x3a,0x71,0xb3,0x68,0x70,0xb2, + 0x96,0x92,0xfb,0xc7,0x48,0xb9,0x7f,0x38,0x31,0x9f,0xbb,0x55,0x5f,0x15,0xad,0x0c,0x07,0xdc,0x0a,0x7a, + 0x57,0x34,0xf8,0xbb,0x49,0x8d,0xc2,0xa7,0xb3,0x6e,0x69,0xf3,0x0e,0x1f,0xbd,0xea,0x0f,0x0b,0xe9,0xe2, + 0x9d,0x75,0x29,0x7e,0x37,0xaf,0xf8,0xcd,0x83,0x11,0xa7,0x9f,0xac,0x56,0x6e,0x58,0xc4,0x6e,0xa0,0x73, + 0x55,0x92,0xd3,0x9f,0x95,0x68,0xca,0x7c,0x35,0xab,0x02,0x47,0x6d,0x76,0xa1,0xc8,0x43,0x17,0x34,0x77, + 0xd6,0x67,0xac,0x76,0x12,0x2e,0xf5,0xe1,0xe9,0xf2,0x27,0x41,0xb7,0x7e,0xe6,0xb1,0xfc,0x85,0x2c,0xa6, + 0x7e,0xfa,0x8b,0x54,0xfb,0x7d,0x44,0x8a,0x56,0x59,0x7c,0xad,0x67,0x4e,0x6d,0x42,0x71,0x6f,0x94,0x7f, + 0x5a,0xca,0xfe,0x82,0xce,0xf6,0x6f,0x75,0x54,0x7d,0x2d,0x88,0xd2,0x2d,0xe2,0xe7,0x2f,0xec,0x8f,0x9a, + 0xf0,0x37,0x3d,0x0a,0x25,0x04,0x50,0x85,0x0f,0x96,0x54,0x7c,0x09,0xa5,0x5a,0xbb,0xc8,0x44,0xe7,0x3f, + 0xe0,0x93,0x2b,0xd4,0xb0,0x4b,0x7e,0x2b,0x1f,0x30,0x59,0x77,0x01,0x85,0x48,0x37,0xcf,0x4c,0x37,0x6a, + 0x08,0x31,0x9f,0xed,0xe6,0x0b,0x14,0x56,0x9b,0x15,0x38,0xa7,0x30,0xd7,0xf8,0xfd,0xec,0xf8,0xb0,0x8a, + 0xd2,0x9d,0xdb,0xdf,0x3b,0x18,0x9c,0xdb,0x5e,0x3d,0x86,0xb0,0x19,0x1d,0x5a,0xc9,0xbf,0xa6,0x98,0x71, + 0xdd,0xa2,0x8d,0x83,0x8a,0xef,0x7e,0x98,0x6f,0x27,0x80,0xa4,0xd3,0x5c,0x42,0x3d,0x02,0xcf,0x66,0x85, + 0x0c,0x57,0xec,0x49,0x7d,0x27,0xfe,0x7a,0x7b,0xce,0x9f,0xad,0xae,0x36,0x79,0x18,0xf8,0x16,0xbf,0x8f, + 0x9d,0x16,0x8c,0xed,0x06,0x0b,0xdd,0x1a,0x59,0x2c,0x6e,0xb5,0x54,0xd8,0xc7,0x12,0xd2,0xc2,0x86,0x55, + 0xa2,0x4d,0x47,0xd6,0x56,0xb4,0x2c,0xa3,0x67,0x51,0x9a,0x28,0x69,0x40,0xed,0x41,0xe6,0x6d,0xc0,0x28, + 0x7b,0xa9,0x90,0x7e,0x2a,0x1b,0xb9,0xad,0x74,0xc4,0x25,0x85,0xd1,0x97,0x07,0xa5,0x8a,0xf5,0xc8,0xaa, + 0x14,0xaa,0xca,0xc5,0xc5,0x44,0x57,0x15,0x8d,0x50,0xae,0xcf,0x8c,0xd3,0x8f,0x3d,0xd3,0x1e,0x65,0x40, + 0xb0,0xec,0xb0,0x55,0x2f,0x94,0xbc,0x60,0xba,0x2d,0x1b,0x54,0x0b,0xa3,0xb5,0xeb,0xf5,0x0a,0xad,0x67, + 0x45,0xa0,0xef,0x3a,0x40,0x5f,0xb0,0x96,0x71,0x7b,0x76,0xe2,0x5d,0x3c,0x4d,0x1b,0x5a,0x29,0xd4,0x30, + 0x88,0xd6,0x50,0x87,0x6c,0xbe,0x82,0x3b,0xc9,0x0f,0x9b,0x11,0x8c,0xaf,0xb5,0xad,0xe3,0xcf,0x19,0xb0, + 0x8e,0x9b,0x91,0xb6,0xa8,0x68,0x22,0x8d,0xf1,0xc2,0xb6,0x53,0xd9,0x8a,0x57,0x52,0x74,0xe7,0xec,0x9f, + 0x3a,0x8b,0x4c,0x7c,0x72,0x49,0x59,0x5c,0xfe,0x58,0x83,0xd6,0x3f,0xea,0xf4,0x52,0xae,0x72,0x9c,0xc4, + 0xc9,0x33,0x69,0x7d,0xac,0x48,0xf7,0x7e,0x5d,0xa5,0xdf,0xec,0xb6,0x48,0xbf,0x59,0xc9,0x07,0xb1,0x0f, + 0xa9,0x4d,0x3c,0xba,0x2d,0xd5,0xb7,0xa2,0x62,0x0a,0x2b,0x95,0xa1,0x64,0xd0,0xb2,0xfc,0x55,0x6c,0xb7, + 0xcd,0x91,0x6b,0x08,0xdf,0x6d,0xdd,0xb7,0xbe,0x4c,0xa5,0x7b,0xc5,0xf7,0xcb,0x34,0x75,0x40,0xc3,0xbb, + 0x76,0x18,0x11,0xce,0xfa,0x8e,0x00,0x61,0x7f,0x49,0xa4,0x55,0x0e,0xfa,0xbd,0xcd,0xa2,0x7b,0x54,0xfe, + 0xd2,0x5e,0x29,0xa1,0x5d,0x75,0x62,0x13,0x9f,0xb3,0x7d,0x6b,0x96,0xa7,0xdb,0x52,0x5f,0xfa,0xdd,0x1e, + 0x90,0x71,0x58,0xe1,0x09,0xce,0xf6,0x87,0x9c,0xeb,0xa8,0xfe,0x06,0x90,0xc3,0xa6,0x90,0xb3,0xae,0x9d, + 0x9c,0xfa,0x68,0xfb,0x21,0xa3,0xd3,0xe5,0x6b,0x13,0x17,0x82,0x74,0xfe,0x8d,0x16,0x9d,0x3f,0x5c,0xc5, + 0x6f,0x22,0xaa,0x15,0x23,0xaf,0xe9,0x85,0xea,0xfc,0xff,0x08,0x93,0x4e,0xd8,0xe4,0x3e,0x4c,0xf6,0x40, + 0xf3,0xd8,0x25,0x7d,0x7b,0xb7,0x63,0xc2,0xe4,0x61,0x9e,0x16,0x1d,0x20,0x34,0x2d,0x7d,0xd0,0xb3,0x6d, + 0xd7,0x7e,0xa8,0x12,0x95,0xec,0x38,0x0e,0x7b,0x5f,0x74,0x1c,0xba,0xfd,0x6c,0x3d,0x0c,0x35,0x23,0xe9, + 0x56,0xdf,0x71,0xdc,0x6d,0x3f,0xdd,0x54,0x13,0x8a,0xb2,0xda,0xed,0x6c,0x3f,0xe3,0xec,0x6e,0x55,0x42, + 0xf1,0xbd,0x0e,0xb4,0xcf,0x38,0xbe,0x4a,0xc3,0x2b,0xf6,0x37,0x74,0x8e,0x15,0x57,0x05,0x61,0x5e,0xd7, + 0x1f,0x01,0xad,0x4e,0x0b,0xe0,0x6e,0x38,0x7b,0x79,0x58,0x21,0xff,0x8e,0xf7,0x07,0x05,0xf2,0x97,0x8d, + 0x62,0xf9,0xc3,0x3c,0x60,0xde,0x32,0x81,0xb6,0x87,0x76,0xae,0x08,0x2b,0xf3,0x63,0x43,0x87,0x26,0xe7, + 0x14,0x3a,0xda,0x42,0xa2,0x2d,0x97,0xc2,0x2f,0x32,0xef,0x99,0xdc,0x2a,0x96,0x50,0xb4,0x47,0xec,0xb5, + 0xae,0xe5,0x44,0x39,0xee,0xfa,0xfc,0xf1,0x3c,0x11,0xf0,0xcf,0xc9,0xd9,0x83,0xef,0xea,0xc0,0x06,0x3b, + 0xf7,0x4b,0xf9,0xf3,0xd4,0xaa,0x72,0xe5,0xb9,0xa7,0x9f,0x29,0xfa,0xbe,0x65,0x96,0x65,0xc5,0xc1,0xa0, + 0x47,0x8a,0x03,0x02,0xa0,0xe2,0x9e,0xb7,0x2a,0x4f,0x84,0xbe,0x92,0x6c,0x75,0x20,0xeb,0xee,0xf0,0x41, + 0x37,0x5e,0xb4,0x3c,0x27,0x27,0x0a,0x61,0x07,0xbf,0x6e,0xd7,0xbb,0xf5,0x5b,0x88,0xc0,0xde,0x4f,0x93, + 0x60,0x9d,0xa1,0xc8,0xd1,0x74,0x48,0x6b,0xf9,0xb3,0x21,0xb7,0x7c,0xaf,0xb7,0xec,0x9c,0xb7,0xe5,0xc3, + 0xb3,0x45,0x26,0xa1,0x38,0x82,0x2d,0x51,0x18,0xc5,0x6a,0xc2,0x96,0x71,0xec,0x8f,0x38,0x15,0xeb,0xf9, + 0xd7,0xc5,0xb0,0x12,0xc3,0x52,0x2b,0x18,0x50,0x2f,0x8f,0x9c,0xef,0xbc,0xe6,0xc1,0x4b,0x4d,0xfe,0xa2, + 0xe8,0x0d,0xa1,0x57,0x0a,0xad,0x2e,0x24,0x7f,0x00,0xdd,0x51,0xc7,0x52,0x44,0x52,0x67,0x7b,0x5e,0x4b, + 0xfb,0x75,0x51,0x39,0xc7,0x3f,0x05,0xab,0x75,0x9c,0x64,0x3e,0x52,0x72,0xab,0x2e,0x0a,0x28,0x66,0x02, + 0xdd,0x8a,0xcc,0x34,0xcd,0x76,0x29,0x13,0x60,0xc7,0x69,0x41,0x91,0x2f,0x4b,0x6a,0x2f,0x05,0x32,0x7a, + 0x83,0x52,0xca,0x4c,0xab,0x81,0x71,0x90,0x1e,0x28,0x8a,0xe3,0x37,0x58,0x8e,0xe6,0xf3,0xa9,0x91,0x6e, + 0x56,0xd0,0xec,0x65,0xe3,0xe7,0xcc,0x9f,0x10,0x87,0xf1,0x4b,0xfd,0x0b,0x9c,0x69,0x8b,0xfd,0x72,0x86, + 0xd6,0x52,0xc2,0xaf,0xdd,0x39,0xdc,0xca,0x2d,0xe4,0x59,0x5a,0x8d,0x17,0x5c,0xc1,0xc5,0xc6,0x5a,0x9a, + 0x51,0x45,0xf6,0x47,0xbb,0x41,0x95,0x27,0x35,0x4f,0xd4,0x55,0x7e,0xa8,0x69,0x4b,0xf1,0x60,0x77,0x73, + 0xd0,0x77,0xcb,0x5e,0xea,0xba,0xb1,0x2c,0x8e,0xc3,0x7d,0xc3,0x89,0x2a,0x72,0xd3,0x1e,0xb9,0x8c,0x30, + 0xfb,0x1c,0x38,0x2d,0x97,0x84,0x08,0x52,0xc0,0xe7,0xc0,0x4f,0x5f,0x12,0x72,0x75,0x98,0x3b,0x62,0x8d, + 0xdc,0xa6,0x3d,0x1b,0xd8,0xf2,0xef,0xe8,0x15,0x20,0x32,0xcf,0x6d,0x7f,0xc7,0x74,0xf6,0x98,0x92,0xc3, + 0x4e,0x67,0x3f,0x28,0xee,0x01,0xa5,0xb6,0xdf,0xeb,0xeb,0xe1,0x85,0xcf,0xcf,0xee,0x63,0xc7,0x29,0x77, + 0x75,0x6b,0xd2,0x2d,0x57,0x37,0xd8,0x57,0x5f,0xf2,0x33,0x1f,0x51,0x1f,0x95,0x9b,0xa4,0x5c,0xf4,0xf6, + 0x17,0x4d,0x0a,0x59,0xe8,0x15,0xbd,0xd2,0x11,0x48,0xb7,0x7c,0x79,0x86,0x8d,0x5a,0xb9,0xc7,0x4d,0x55, + 0x6f,0x94,0x99,0x7e,0x9b,0x7d,0x8b,0x20,0xac,0x4c,0x14,0x3b,0xa3,0x0a,0x51,0x2d,0x7f,0x90,0xf3,0x1b, + 0xe5,0x74,0xf6,0x3c,0x08,0xa2,0xd1,0xac,0xe6,0xda,0x6e,0x8f,0x6a,0x1f,0x69,0xa4,0x4c,0x4c,0x96,0x4a, + 0x5b,0xf2,0xa9,0xfc,0x06,0xad,0x0a,0xe3,0x1d,0x0c,0x4a,0x41,0x41,0x05,0x63,0xe5,0xbd,0xf6,0x10,0xff, + 0x93,0xa3,0xaa,0xd8,0x60,0x6b,0xd7,0x3a,0x2c,0x36,0xd2,0xa6,0x8d,0xd8,0x5a,0x33,0xd4,0xce,0x41,0x8e, + 0xb1,0xa6,0x32,0x69,0x58,0xa5,0xa5,0xae,0xbc,0x0d,0xf3,0xe2,0x37,0xbb,0x3a,0x2a,0x84,0xbc,0x4c,0x00, + 0x2b,0xbe,0x74,0xd1,0xab,0xc2,0x83,0x42,0xe6,0xfe,0x8a,0x2c,0xb2,0xdd,0x52,0xca,0x7e,0x72,0x29,0x71, + 0xfd,0x4c,0xfc,0xe8,0xf2,0x62,0x29,0x13,0x59,0x38,0x33,0x7a,0xfd,0x72,0x66,0xd2,0xea,0x11,0x60,0x3e, + 0x7f,0x32,0x71,0xb5,0xaa,0xcc,0x74,0x25,0x83,0x1a,0x41,0x47,0x0c,0x1b,0x6e,0xc7,0xab,0x17,0x47,0x5e, + 0x3e,0xf5,0xfa,0xbb,0x9b,0x62,0x85,0x77,0x8a,0xc2,0xc8,0x31,0x80,0xde,0x2f,0x15,0x71,0x10,0x5b,0x6a, + 0xaf,0xe2,0x59,0x30,0x0f,0xe4,0xec,0x97,0x2a,0x5f,0xcf,0xf2,0x8c,0xdd,0xaf,0x03,0x60,0x13,0xc1,0xf4, + 0x68,0x67,0x2a,0xfc,0x22,0xd3,0x50,0xfe,0x5a,0x89,0xf6,0x15,0xb5,0x4e,0xaa,0x32,0x55,0x2d,0xa7,0xd3, + 0xdf,0xf3,0xdb,0x79,0xbb,0xbc,0x41,0x9d,0x4f,0x2b,0x59,0x82,0x70,0x9e,0x25,0xa9,0xb8,0x33,0x9d,0x6a, + 0x50,0xb4,0x53,0xd6,0x63,0xda,0xe3,0xcf,0xca,0xcb,0x41,0xe6,0x88,0x9d,0x6d,0x8f,0x81,0x8a,0xfb,0xc0, + 0x79,0xcc,0xac,0xaf,0x0f,0xec,0xef,0xfb,0xba,0x05,0x82,0xb0,0x17,0x95,0xe6,0xa1,0x22,0x4b,0xcb,0xb0, + 0xf2,0x03,0x33,0x95,0x5b,0xe5,0xb4,0xf4,0x90,0x8b,0xd2,0x25,0xb0,0xf4,0x3b,0x12,0x5a,0x0f,0x55,0x32, + 0xcd,0xe2,0xea,0xef,0xfc,0x0a,0x2e,0xa1,0x71,0x21,0x3f,0x74,0x81,0x35,0x2a,0x0e,0x47,0x43,0xae,0xa1, + 0xdc,0x46,0x69,0xdb,0xb5,0x32,0x59,0xb4,0xf6,0x6a,0xc5,0xa4,0xd8,0x36,0x63,0xec,0xb8,0x52,0x68,0x21, + 0x2a,0xcd,0xd9,0x52,0xca,0x6a,0xe0,0x7e,0x4c,0xc3,0xc9,0x5c,0xc3,0x1c,0x7f,0x6e,0x90,0x18,0xb5,0xee, + 0xfa,0x3d,0x9f,0x41,0xc9,0xdf,0xa0,0xc4,0x53,0x12,0xa1,0xb5,0xb6,0x60,0xbb,0x63,0x84,0xfd,0x39,0x3a, + 0xdc,0x7d,0x3c,0x00,0x6d,0xb3,0x5f,0x69,0x6e,0x0e,0x43,0x5d,0x2f,0x38,0x2a,0xda,0xbb,0x5c,0xb0,0x3e, + 0xde,0x39,0x55,0x7b,0xc1,0xbf,0xbe,0xf2,0x8b,0xf2,0x94,0x8c,0xa0,0xfa,0x7b,0x51,0xb7,0x0c,0x1c,0x6f, + 0x98,0xfd,0x69,0xb8,0x4c,0x7f,0x7d,0x2f,0xba,0x93,0x93,0x5c,0xb7,0x8f,0xed,0x69,0x08,0xd8,0x0f,0xe9, + 0x96,0x37,0xf6,0x1b,0x15,0x10,0x92,0xc3,0xd9,0x61,0xab,0xdd,0x3b,0xda,0xd6,0x01,0x2c,0xfb,0x5e,0x9a, + 0x0a,0xcf,0xd6,0x55,0x74,0x5a,0xd5,0x19,0x8a,0x4d,0x93,0x0f,0xb5,0x29,0xd5,0x08,0x8f,0x77,0x86,0xdd, + 0xf6,0x8e,0xc4,0x17,0xe5,0x40,0x96,0xd2,0x47,0xce,0xcc,0x50,0xc4,0xb2,0x6b,0x8b,0xc6,0x83,0xed,0xf2, + 0x08,0x56,0xe6,0xdc,0xea,0x26,0x34,0xc5,0x7c,0x91,0xda,0x25,0x31,0xc3,0xa3,0x5d,0xbe,0xff,0xd6,0xc7, + 0xb4,0x6e,0xf9,0xc2,0xb8,0xd5,0x2f,0x72,0x89,0x69,0xbc,0x49,0xa6,0xf2,0xba,0x32,0xfa,0xb8,0xb2,0x2a, + 0x48,0xfd,0x1a,0xa1,0x41,0x52,0x9d,0xbb,0x75,0x19,0x74,0x6e,0x49,0x5d,0x4f,0xdf,0x94,0x2c,0x6e,0xce, + 0x3e,0x89,0xe8,0xf7,0x4b,0x1f,0x5f,0x31,0x96,0x62,0x40,0xa1,0x22,0x07,0x4c,0x75,0x49,0x66,0xe0,0xaf, + 0x0a,0x6d,0xb5,0x3d,0x6c,0x55,0x50,0xb0,0xe3,0x82,0x86,0xcf,0xed,0xda,0x85,0xce,0xa0,0x4a,0x00,0x27, + 0xf1,0xb9,0x9a,0x3c,0x56,0x27,0xde,0x28,0x1e,0x11,0x96,0xc8,0xdc,0x3a,0xda,0x5f,0xf9,0xb7,0x4b,0xb4, + 0x2e,0x90,0x33,0xe7,0xf0,0x2d,0x71,0xc2,0xfb,0x0a,0x9b,0x9d,0x86,0xe3,0x58,0x52,0x3f,0xaa,0x16,0xf2, + 0x1d,0xa1,0x49,0x89,0x48,0xed,0x6a,0x11,0xa9,0xb3,0x4d,0x44,0xea,0x14,0x14,0x4a,0x55,0x32,0x40,0x4b, + 0x7f,0xf9,0xfd,0x16,0xd6,0xbe,0x82,0xf1,0x72,0x0e,0xe4,0xc6,0x56,0x16,0xb5,0xe4,0xf5,0xef,0xaa,0x1f, + 0x8a,0xd3,0x2f,0x2b,0x0f,0xdc,0xbd,0xd7,0xe0,0x68,0x1f,0x1e,0x48,0x45,0x77,0x68,0x2b,0xb7,0xd3,0x45, + 0x12,0xec,0x6f,0xfe,0xa2,0x5c,0x4e,0xa0,0x5b,0x87,0x5d,0xc3,0x6f,0xac,0x3b,0x09,0xc2,0xf2,0x6a,0x3c, + 0x06,0x4c,0x78,0x72,0xb3,0xd3,0x33,0xdc,0x8a,0xfb,0x30,0xd9,0xde,0x30,0x07,0x13,0x7e,0x12,0xf7,0xac, + 0x68,0xc3,0x63,0x2f,0x5e,0x42,0xed,0xd8,0xfd,0x0c,0x73,0xa7,0xd5,0xda,0xf6,0xf1,0x39,0xca,0x0a,0xeb, + 0x98,0xd5,0xf2,0x90,0x76,0xe3,0x9c,0xb3,0xc7,0x77,0x10,0x46,0x05,0xca,0x3c,0x6c,0xb5,0xb6,0x65,0xb7, + 0xed,0xa5,0xd6,0x24,0x94,0xc3,0x7c,0x3e,0x3a,0xda,0x18,0xa5,0xb2,0xbb,0x2e,0xbb,0x05,0x65,0xc8,0x36, + 0xdb,0x5a,0xd5,0x9c,0x4f,0x0e,0xfd,0x75,0x2a,0xc7,0xfa,0xe2,0x0f,0xf1,0x11,0x35,0x89,0x44,0x8b,0x9e, + 0x71,0xd9,0xac,0x91,0x2d,0xaf,0xcb,0xdf,0x12,0x2d,0xf2,0x2c,0xfb,0xc4,0xc5,0x41,0x43,0xd5,0x29,0xd6, + 0x28,0xbc,0xad,0x5d,0xe1,0x6e,0x79,0xb7,0xb4,0xdf,0xdb,0x6c,0x6b,0x19,0xda,0x09,0x00,0x40,0x6f,0x8b, + 0xc2,0xf4,0xa7,0x8d,0x42,0xfa,0xa4,0x06,0xf9,0xf0,0x10,0x07,0xbc,0x5b,0x89,0x75,0xab,0xaa,0x89,0x3e, + 0x33,0xdc,0x2b,0xf0,0xa2,0x5b,0x3b,0xb3,0xa2,0xcf,0xb6,0x24,0x86,0xe2,0xca,0xf1,0x3a,0xab,0x00,0x9d, + 0x5d,0xf9,0xa7,0xcc,0x7b,0x77,0xfd,0x9e,0x7b,0xc1,0xed,0x7a,0xf7,0x57,0x2a,0x73,0x4c,0xeb,0x76,0xd4, + 0x47,0x3f,0x55,0x0b,0x55,0x49,0x2e,0xaa,0x3e,0xac,0x60,0xe7,0x59,0xe5,0x0c,0x76,0xea,0x34,0xe3,0x73, + 0xb7,0x98,0xa1,0xa4,0xf8,0x59,0xbe,0x43,0x34,0x6f,0x36,0x72,0x24,0xe6,0x80,0xa4,0x86,0x45,0xa4,0xd8, + 0x31,0x10,0x93,0x94,0xe6,0xd0,0xc8,0x14,0xbe,0x5d,0xac,0xd9,0xd6,0xdc,0x47,0xc3,0xd9,0x60,0x2a,0x72, + 0x32,0xc5,0x3a,0x3c,0x2d,0x7f,0x57,0xbb,0x22,0x91,0xec,0xb6,0x4f,0x44,0xe8,0x94,0x74,0xfd,0x76,0x4f, + 0xf6,0x86,0xbb,0xf2,0xc4,0x9a,0x2f,0x9f,0xa0,0x0b,0xcb,0x75,0xc5,0x77,0x2f,0xbb,0xb6,0x62,0x73,0x70, + 0x53,0x72,0x74,0x69,0xd8,0x36,0xf8,0xaa,0x6f,0xf7,0x98,0x24,0x0c,0x0d,0xfb,0xfb,0x02,0xd5,0xdf,0x11, + 0xb0,0xf2,0x6d,0x38,0xf3,0xd0,0xe9,0xfb,0xb6,0xc5,0x15,0x16,0xc8,0xfd,0x36,0x3e,0x68,0x1a,0xfa,0xab, + 0xf5,0x41,0x07,0x50,0xa1,0xd1,0x3b,0xbf,0x68,0x74,0x29,0x79,0x9d,0x43,0x81,0xfb,0xad,0x92,0x15,0xc6, + 0x6b,0x75,0xfb,0xf8,0xa1,0xba,0xb2,0x2e,0xba,0x82,0x7b,0x2f,0xcb,0x8c,0x3a,0xdf,0x5c,0xe7,0x2e,0x2a, + 0xe6,0x1d,0x9f,0x3e,0xed,0x94,0x3e,0x7d,0x4a,0xbb,0xd3,0xd5,0xfd,0xf4,0xb6,0xe8,0x9d,0x73,0x63,0x98, + 0x28,0xf9,0xbb,0x9a,0x0f,0xb7,0x9b,0xa2,0x26,0x7d,0x98,0x74,0x8c,0x73,0xf3,0xc3,0x1c,0x17,0xa6,0x41, + 0x32,0x05,0x50,0x31,0xdf,0x40,0xc5,0xf4,0xec,0x2e,0x7c,0x7b,0x3c,0xbe,0xbc,0x21,0xf3,0xe1,0x05,0xb1, + 0x17,0xc7,0x35,0xaa,0x64,0xb8,0xc8,0x50,0x57,0xc5,0x70,0x95,0x2c,0x78,0xdb,0x94,0x52,0x2e,0x84,0x6c, + 0x75,0x94,0xdd,0xbb,0x21,0x4b,0x5f,0x65,0x73,0x39,0x15,0x00,0x60,0x1b,0x05,0x06,0xfa,0x73,0x4a,0x95, + 0xec,0x81,0x16,0x00,0xd6,0x89,0x9c,0xcb,0x24,0x6d,0x26,0x72,0xb6,0x99,0xca,0x19,0x1c,0x60,0x8a,0x4e, + 0xe2,0x6d,0xfd,0xfa,0x2f,0x0d,0xfd,0xb9,0x44,0x43,0x01,0x4d,0xb2,0xe7,0xe6,0x6c,0xa3,0x24,0xfd,0x37, + 0xfe,0x9b,0x34,0xb7,0x3c,0xe6,0xe9,0xa0,0x51,0x7e,0xe5,0x2a,0x4d,0x4e,0x91,0xd5,0xb6,0x6a,0x29,0x3f, + 0xe0,0x89,0x5c,0xfa,0xe7,0x01,0x4c,0x13,0x09,0xa4,0xf5,0x38,0x67,0x4e,0xb6,0xf5,0xb3,0xdd,0x81,0x8a, + 0x0c,0xec,0x25,0xb8,0xd0,0xfa,0xf0,0x1b,0x0f,0xd0,0x9a,0x9c,0x82,0x2a,0xc5,0x4c,0x28,0x44,0x31,0x15, + 0x2d,0x46,0x99,0x72,0x50,0xd2,0x6f,0x3c,0x44,0x6f,0x4f,0x99,0x5c,0x97,0xf4,0x74,0xe8,0xd6,0x74,0x5d, + 0xfc,0xaa,0x5e,0x9f,0x9d,0xaa,0x04,0xc1,0x10,0xde,0x7c,0x2d,0x64,0x74,0x7e,0x90,0xfa,0x73,0x74,0xa9, + 0x92,0x7e,0x93,0xa0,0x50,0xf1,0x1e,0x20,0x29,0xec,0xf0,0x61,0xde,0x47,0x6d,0xd4,0xa4,0xd1,0x90,0x50, + 0x8d,0x20,0xd0,0xd7,0x0b,0x9c,0x46,0xfe,0xba,0x89,0xfe,0x14,0xe3,0x8f,0x62,0x9d,0xc4,0x1f,0x83,0x55, + 0x90,0x5d,0x2a,0x0f,0xae,0x82,0x47,0xa5,0x15,0xe1,0x50,0x30,0xdd,0xf5,0x8a,0x09,0x2e,0xe0,0x6a,0x2a, + 0xab,0x53,0x4e,0x8c,0x54,0x40,0x8a,0xdd,0x3f,0xb3,0x5c,0x2c,0x41,0x6f,0x77,0x3c,0x37,0x79,0x8e,0xb6, + 0x7e,0x11,0xd9,0xf5,0xc4,0xd5,0x2d,0x19,0xd8,0x64,0x16,0x3b,0xb7,0xf4,0xd0,0xa5,0xf9,0x00,0x83,0xe2, + 0xf2,0x48,0x91,0xea,0xba,0x96,0x19,0x6f,0xfb,0x8e,0xd6,0x93,0x73,0xb2,0x16,0x47,0x02,0x26,0x69,0xa2, + 0xe8,0x51,0x36,0xe8,0x94,0x88,0xc8,0xf9,0x05,0x4a,0x67,0x74,0xc8,0x96,0x9c,0xd2,0x06,0x7b,0x90,0xa5, + 0x41,0x35,0x59,0xda,0x26,0x07,0xd2,0x83,0x0a,0x5c,0xe8,0x8e,0x58,0xa0,0x77,0x40,0x57,0x2c,0xdb,0x05, + 0x7d,0x4d,0x11,0xb6,0x95,0x2e,0xba,0x50,0xec,0x78,0x07,0xd9,0xd1,0xf9,0xd6,0x17,0xd9,0x06,0x77,0x96, + 0x99,0x4b,0x1e,0x3a,0xec,0x98,0xa2,0xee,0x6e,0xbe,0x79,0x90,0x66,0x97,0xa1,0x7c,0x28,0xbe,0x61,0x87, + 0x8c,0x87,0x19,0x88,0x1c,0x33,0x90,0x47,0x80,0x4b,0xcc,0x3c,0x7d,0xf1,0x34,0x94,0x7c,0x0f,0x14,0x16, + 0x96,0xcf,0x53,0x44,0x36,0x86,0x35,0x3a,0xe5,0x2f,0xb8,0x79,0xfe,0x45,0x96,0x04,0x1f,0xdf,0xe3,0x83, + 0xdf,0x7e,0x83,0x25,0xca,0xa6,0xcb,0xd7,0xb4,0x5a,0x35,0x43,0xff,0x88,0xd4,0x36,0xd3,0x29,0xd6,0x19, + 0x13,0x85,0xae,0xd7,0xea,0x1e,0x55,0x95,0xe9,0xb7,0x35,0x2a,0xa9,0x8d,0x6b,0x33,0x3f,0x39,0xab,0xd5, + 0x6f,0xa6,0x58,0x7e,0x00,0xf4,0x11,0xc7,0xc8,0x63,0x13,0xdf,0x3c,0xa0,0x4f,0xe3,0x88,0x6f,0x90,0xfa, + 0xc0,0x8f,0x2f,0x80,0x05,0x48,0xd3,0xe3,0x9a,0x91,0xa5,0x6a,0x22,0x98,0xf1,0x6d,0x4d,0x2c,0xa1,0xdf, + 0xe3,0xda,0xbd,0xf3,0x40,0x5e,0xd4,0x1e,0x7e,0xf3,0xc0,0xc7,0x49,0x9e,0x2f,0x04,0x2d,0xe5,0x71,0xad, + 0x05,0x15,0x68,0xa7,0xe9,0x92,0x56,0xe1,0xb8,0x56,0x32,0x70,0xd6,0x04,0xa6,0xed,0x6e,0xb2,0xc8,0x73, + 0x5c,0xcb,0x92,0x8d,0x84,0xb6,0x66,0x72,0x9e,0x62,0x6b,0x97,0xab,0x49,0x1c,0x52,0x8f,0x01,0x88,0xd8, + 0x59,0x4d,0x60,0x5f,0x8f,0xe2,0x8f,0xd0,0x24,0x20,0x53,0xa7,0x07,0xff,0x87,0xda,0x68,0x9a,0x16,0x50, + 0xd6,0xad,0x89,0xcb,0xe3,0xda,0xa8,0xa6,0x47,0xd0,0xee,0xe7,0x43,0x38,0xac,0x89,0x04,0xaa,0x74,0x6a, + 0x0f,0x1e,0x7e,0xb3,0xf6,0xb3,0xa5,0x80,0x36,0x5f,0x77,0x30,0x47,0xb3,0xd7,0x3f,0xa7,0xd2,0x07,0xdc, + 0x5b,0xb1,0x5b,0xe4,0xd9,0xb7,0xf4,0x6b,0xda,0xe9,0x53,0x46,0x47,0x1f,0xcf,0x77,0x85,0xe6,0xa2,0xdd, + 0x13,0xad,0xd7,0x23,0x0f,0x9e,0xf4,0xfc,0x81,0x18,0xa8,0xd2,0xa1,0x68,0x39,0x03,0x68,0x77,0x44,0x7b, + 0xe8,0xf5,0x97,0x5e,0xab,0xbd,0x63,0x08,0xe9,0x26,0xda,0x32,0x02,0xe6,0x2f,0xc4,0x14,0x8a,0xdb,0x9d, + 0x9a,0x98,0x5e,0xf2,0x6f,0x72,0x5c,0xeb,0x15,0xfb,0xe9,0x9e,0x77,0xa8,0xbb,0x43,0xf8,0xed,0x02,0xc2, + 0x2d,0xe1,0xf6,0x90,0x7f,0xfb,0xde,0x40,0xe0,0xbf,0xa1,0x18,0xbe,0x6e,0x0f,0x61,0x44,0x21,0x0a,0x83, + 0xf0,0xef,0x75,0x7b,0x04,0x17,0xf8,0xa8,0x8d,0xcf,0xe8,0x51,0x53,0x3d,0xdb,0x31,0xde,0x55,0x1c,0x47, + 0xb7,0x2d,0x59,0x07,0x96,0xa3,0xef,0xf5,0x4f,0x70,0x89,0xf0,0x1f,0xaf,0x0f,0x5e,0xf5,0xfc,0xbc,0xac, + 0x8d,0xff,0xd0,0x4e,0x8a,0x7f,0xae,0x76,0x74,0x89,0x68,0x79,0x5b,0x97,0xb8,0x3d,0x5d,0xaf,0xff,0x63, + 0xdf,0xef,0x88,0x0e,0x6f,0x92,0x80,0x5d,0x3a,0x87,0xae,0xfc,0x1e,0x5e,0x61,0x49,0x13,0x7e,0x77,0x75, + 0xb4,0xdc,0xac,0x6e,0xed,0x07,0x16,0x3b,0xec,0x8b,0x01,0x34,0xcb,0x3b,0x8f,0xcd,0x22,0x60,0xec,0x6a, + 0x77,0xbe,0x4e,0x6f,0x6b,0x97,0x76,0xad,0x17,0x76,0x9b,0x23,0x18,0x6c,0x7b,0x20,0xe0,0x62,0xb9,0x6b, + 0x1b,0x80,0x2c,0x9c,0xdf,0x3a,0xd6,0x91,0xe8,0x9f,0xb7,0x7b,0xaf,0x60,0x6b,0x3b,0x57,0x0e,0xc8,0xf4, + 0xe9,0xc1,0x8e,0xe6,0x23,0xf9,0x31,0xbb,0xad,0xf9,0x01,0x35,0x12,0xb6,0xdb,0xcd,0xa1,0xdb,0x3a,0x80, + 0xde,0x2d,0xcd,0x4f,0x40,0x70,0xbb,0xad,0x79,0x68,0xc4,0xef,0x8a,0xae,0x02,0x1e,0x5c,0xea,0x1c,0xd5, + 0xba,0xd0,0x41,0x37,0x84,0xad,0x78,0xd1,0x0f,0x3b,0xcd,0xee,0x79,0xb3,0xfb,0xfa,0x10,0x00,0xa9,0xd3, + 0x5a,0xf6,0x9d,0x91,0xc0,0xfb,0x21,0xac,0x42,0x7b,0xb4,0x63,0x2c,0x40,0x60,0xee,0x8c,0x80,0xc3,0x1d, + 0xed,0xc9,0x4b,0x79,0x2b,0x7e,0xc0,0x86,0xa4,0x00,0xad,0x4d,0xd8,0x99,0x16,0xfd,0x11,0xfc,0xa7,0x09, + 0x85,0xf0,0x97,0x2e,0xf1,0x09,0xfd,0xa1,0xc5,0xdd,0x3e,0x96,0xee,0x2e,0xcc,0x49,0xfc,0x74,0x79,0xdb, + 0x68,0x7a,0x62,0xb8,0x6c,0x0f,0x10,0x83,0x7a,0xcb,0x1e,0xec,0x2a,0x50,0x08,0xc0,0xa5,0x65,0xbb,0x15, + 0x02,0x64,0x77,0x09,0xb3,0xda,0xe7,0xf0,0xbc,0x47,0xbf,0xbb,0xc0,0x1c,0x58,0x85,0x5b,0x61,0xb2,0x07, + 0x9b,0x36,0x54,0x48,0x0a,0xff,0x35,0xe1,0x0a,0x60,0x25,0x2f,0x80,0xdf,0x0e,0xf4,0x6d,0x17,0x34,0x3b, + 0x3f,0x8e,0x0a,0x10,0x06,0xad,0x9c,0xf7,0x0b,0x9b,0x8d,0x10,0xd0,0xee,0x22,0x0d,0x03,0x48,0x10,0xf4, + 0x17,0x2a,0x72,0x21,0xdd,0xf1,0x93,0x5d,0x48,0x25,0xa3,0xdb,0x17,0x0b,0x80,0xac,0xf7,0xaa,0x8d,0x24, + 0xec,0x10,0x8f,0x05,0x0f,0xc0,0x0b,0xfe,0xa9,0xc9,0xc0,0x9e,0xc2,0xbf,0x57,0x7d,0xec,0x75,0xa8,0xa8, + 0x9a,0x3d,0xea,0x61,0x08,0x20,0xb9,0x63,0x04,0xe8,0x55,0x7e,0x3b,0xde,0x1d,0x86,0x88,0x0a,0x83,0xe6, + 0xae,0xcd,0x40,0x36,0xf0,0xf6,0x96,0x7a,0xb8,0xcd,0x40,0x1f,0xcf,0xdb,0x6d,0x9f,0x72,0xed,0x22,0x7a, + 0x35,0xe1,0xea,0x45,0xdf,0xbe,0x6f,0xb6,0x7f,0xb4,0xee,0xb1,0xc4,0x9d,0x19,0x10,0xad,0xf3,0xde,0x72, + 0x50,0x28,0xeb,0xb4,0xce,0x9b,0x83,0xe5,0x68,0x27,0xcc,0xb0,0xb0,0xb4,0x0f,0xd5,0x3d,0x6f,0xb7,0x0a, + 0xed,0x1f,0xe2,0xc8,0x45,0xaf,0xd9,0x2b,0xd0,0xb6,0xf6,0xf0,0xbc,0x63,0x46,0x4b,0xe3,0x5d,0xb6,0x9d, + 0x82,0x66,0xfb,0xbc,0xd9,0xd9,0x39,0x28,0x60,0xca,0xf6,0xe2,0x47,0xfa,0x39,0x3f,0x32,0xca,0xf9,0x11, + 0xa0,0x7d,0x39,0x43,0x62,0x61,0x2e,0x00,0x8d,0x42,0xdd,0x16,0xa1,0xae,0x3a,0x69,0x9d,0x73,0x73,0x10, + 0x36,0x01,0x66,0xf1,0xdf,0xab,0xc3,0xdd,0x84,0x4b,0x7e,0xdc,0x73,0xe9,0xda,0x70,0x2c,0x96,0x97,0xae, + 0x49,0x8b,0xf7,0x47,0x2f,0xdd,0x3a,0xdc,0xa4,0x7b,0x0c,0x09,0xcf,0x07,0xec,0x0e,0x50,0x7d,0xd7,0x39, + 0x31,0x8d,0xd7,0x97,0xb7,0xec,0xc3,0x21,0xed,0xc3,0x61,0xbe,0x0f,0x6d,0x6b,0x1f,0xda,0x55,0x8c,0x61, + 0x1b,0x4e,0x3f,0x60,0x4e,0x88,0xf3,0x50,0xcc,0x09,0x33,0x0f,0xa2,0xf7,0xa2,0xfc,0x00,0x59,0xa4,0xfe, + 0xf9,0xa8,0x50,0x4a,0x08,0xde,0xdf,0x05,0x42,0xd1,0x3c,0xbe,0xf3,0xb1,0x72,0x58,0xe2,0x1f,0x89,0xf0, + 0x76,0x80,0x40,0xef,0x66,0x22,0xc3,0x78,0x51,0xec,0xad,0x4d,0x03,0x54,0xcd,0xa1,0x73,0xe9,0x71,0x6d, + 0xba,0x49,0x50,0x2f,0xf5,0x18,0x25,0x89,0x9a,0x50,0x8e,0x43,0xc7,0x35,0xaf,0x3d,0xa8,0x51,0x87,0xf0, + 0xda,0xb2,0x7b,0xde,0x7d,0xd1,0xba,0xc2,0x3e,0xe9,0x7a,0xd9,0xec,0x5e,0x01,0xcd,0xeb,0x51,0x79,0xef, + 0x0a,0x11,0x9d,0x2e,0x47,0x58,0x0a,0xbb,0x67,0x8a,0xf9,0x1a,0xab,0x9b,0x39,0x54,0x75,0xca,0x24,0xb4, + 0x95,0xbf,0xd7,0xd2,0xcd,0xb5,0x54,0xcb,0xdc,0x79,0xcf,0x74,0xde,0x12,0x23,0x5d,0xde,0x53,0x97,0xf4, + 0xe2,0x48,0xbf,0x08,0xb5,0x47,0x56,0x6d,0x35,0x28,0x6e,0xc6,0x1d,0xd5,0x36,0x66,0x24,0x8e,0xcf,0xf6, + 0x00,0x59,0x60,0xf9,0x1e,0xa3,0x24,0x20,0x98,0x7f,0xc5,0x83,0x65,0x80,0x7f,0x5f,0x00,0xf1,0xec,0x2e, + 0x3b,0xd3,0x0e,0x01,0x07,0x14,0xd0,0x03,0x3a,0x80,0xe8,0xc0,0xc1,0x73,0x1e,0xde,0x6e,0x02,0x33,0x7e, + 0x0e,0xe7,0xe9,0xb2,0xd9,0x99,0x36,0xa9,0x6e,0x93,0xea,0x36,0xa1,0xee,0x55,0x71,0xdf,0xa1,0x2f,0x68, + 0x74,0xc7,0x98,0xf1,0x63,0x3f,0xb7,0x33,0x50,0x03,0x04,0x9b,0xd7,0x24,0x08,0xa8,0x8b,0x11,0x5d,0x00, + 0x6c,0x0c,0xf4,0x85,0x7a,0x86,0x57,0xa3,0x5b,0xa0,0xec,0x2c,0x76,0xa4,0xa5,0x21,0xca,0x41,0x7d,0xa0, + 0xcc,0x43,0xe8,0x75,0x21,0x8c,0x86,0xf6,0xb8,0x06,0x52,0x29,0x88,0xb3,0x07,0x6d,0xef,0x70,0xd0,0x1f, + 0xb4,0xda,0x87,0x8d,0x16,0xfc,0x67,0xdf,0x35,0xfb,0x6d,0xaf,0xdd,0xea,0x0f,0xfa,0x75,0x3d,0x60,0xeb, + 0x6d,0xa3,0xe0,0x3d,0x68,0x35,0x3a,0x83,0x7a,0x4d,0x01,0x12,0x6a,0x19,0x09,0x80,0x56,0xa2,0xd3,0xf1, + 0x3a,0xfd,0xe1,0x61,0xb7,0xdd,0x18,0xc1,0xd1,0xbb,0x84,0xa5,0x1e,0xb4,0x86,0x03,0x10,0x63,0x1e,0x8b, + 0xce,0x00,0xba,0x19,0x74,0x3b,0x3d,0x7a,0xd4,0x39,0xf4,0x7a,0xa3,0x06,0xc8,0x17,0xdd,0x76,0x77,0x30, + 0x1c,0xe8,0xfb,0x9e,0xd7,0x6b,0xf7,0x7a,0x30,0xf4,0x73,0xd1,0xf2,0xba,0xdd,0x56,0x0b,0x66,0x3f,0x15, + 0xad,0x46,0x17,0x06,0xd5,0x1a,0x42,0x3d,0xdc,0x20,0x7a,0xa3,0x01,0xf2,0x11,0x57,0x6d,0xea,0xab,0xbc, + 0x68,0x29,0x9a,0xa6,0xe7,0x73,0x1c,0xc4,0xe8,0x70,0x78,0xc8,0x2d,0x01,0x65,0xef,0xb6,0xdb,0x9d,0x11, + 0xd6,0x68,0xc3,0xa4,0xfb,0xa3,0x06,0x34,0x79,0x08,0x25,0xdc,0x38,0x5d,0xe5,0x45,0x2f,0xc4,0x10,0x5f, + 0xe8,0x8c,0xfa,0x38,0x87,0x81,0x87,0xea,0xd1,0xfe,0xa8,0xdd,0xe8,0xf4,0xbc,0x01,0x60,0x9f,0x37,0xea, + 0x35,0x3a,0x5d,0xaf,0x37,0x3c,0x1c,0xf5,0x3a,0xea,0xb6,0xe3,0xb5,0x7a,0xa3,0x21,0xec,0xc0,0x8f,0x28, + 0x9f,0xb6,0x0e,0xfb,0x83,0x5e,0x17,0xde,0xa5,0x87,0x87,0x5e,0x77,0x04,0x13,0x39,0x6c,0x03,0x9d,0xea, + 0x75,0xe8,0x8a,0x96,0x63,0xe0,0xb5,0xbb,0x50,0xaf,0x73,0x48,0x77,0x3f,0x89,0x15,0x8c,0xb4,0xe3,0x1d, + 0x1e,0x0e,0x86,0x7d,0x9c,0x01,0x40,0xe3,0xa0,0xdf,0x6b,0xf5,0x69,0x45,0x7b,0x83,0x7e,0x7f,0xd8,0x85, + 0xc9,0x00,0x0c,0x77,0x07,0xa3,0x5e,0xaf,0x01,0x20,0xe6,0x0d,0x47,0x9d,0x61,0xab,0xdb,0x80,0x59,0x75, + 0x7a,0xfd,0x51,0x7f,0x64,0x15,0xa9,0x2b,0x20,0x1c,0xf8,0x98,0xde,0xe9,0x0b,0x5d,0xf1,0xd0,0x3c,0xef, + 0x8a,0x66,0xe9,0x9d,0xae,0xc8,0x31,0xa0,0x12,0x10,0x68,0x56,0x5d,0xf8,0x6b,0x43,0x43,0x5f,0xf6,0x27, + 0x4c,0x51,0x00,0x21,0xbb,0xb8,0x55,0x9d,0x21,0x76,0x3a,0x82,0x65,0x18,0x79,0xc3,0x41,0xab,0x73,0xd8, + 0xeb,0x34,0x7a,0x04,0x68,0x6d,0xd8,0xae,0x43,0x6f,0xd8,0x1a,0x1d,0xc2,0xce,0xc3,0x3e,0xf7,0x91,0xb6, + 0x7a,0x9d,0x56,0x1f,0xee,0xf9,0x76,0x0a,0x53,0x81,0xa1,0xf6,0x61,0x9a,0x5d,0x0f,0x80,0x00,0x80,0x15, + 0xd6,0x06,0x80,0x6c,0xd0,0x87,0xf1,0x01,0xf0,0xb6,0x5a,0x87,0xdd,0x1e,0x34,0x37,0xe8,0x40,0xfb,0xed, + 0x8e,0xd7,0xed,0x74,0xda,0xa3,0x11,0xae,0x75,0x7f,0xd8,0x1f,0x0c,0x48,0x4d,0x30,0xec,0x1e,0x8e,0x0e, + 0x07,0x0d,0xb8,0x02,0x50,0xe8,0x0f,0x86,0x3c,0x30,0xa8,0x3c,0x44,0x21,0xfc,0x70,0xd4,0x6a,0xb7,0xba, + 0x87,0xd6,0xe3,0x9e,0xd7,0x3d,0x1c,0x8e,0xda,0x9d,0xae,0xd5,0x4c,0x17,0xc0,0x0b,0x40,0xa1,0x0f,0x7b, + 0x04,0xbb,0xdb,0x01,0xb8,0x18,0xb4,0x70,0x94,0x03,0x02,0x62,0x1c,0x4c,0xd7,0xeb,0xa0,0xfd,0x67,0x34, + 0xe4,0x91,0xc3,0xb6,0xb5,0x61,0xd7,0xf4,0xed,0x10,0x90,0x18,0xa6,0x0c,0xe0,0xa5,0x6e,0x0f,0xfb,0x87, + 0x43,0xb8,0xb7,0x56,0xa2,0xb0,0x5c,0x3f,0x11,0xce,0x2f,0x6c,0xbc,0x7f,0x40,0x4a,0x1a,0x28,0x38,0x5f, + 0xc0,0x1d,0x26,0x05,0x52,0xba,0x22,0x56,0xba,0xd5,0xa0,0x90,0xf5,0x6e,0x4a,0x2d,0xa4,0x9e,0x86,0x8b, + 0x6a,0x95,0xcf,0x26,0x95,0x5a,0xa1,0xa4,0x0e,0xab,0x07,0xa6,0xf1,0x65,0x9b,0xc8,0xcb,0x04,0x36,0x7b, + 0x56,0x7b,0x78,0xf2,0xe1,0xfd,0xbb,0x97,0xff,0x2c,0xde,0x3c,0xff,0xe6,0xc1,0xb2,0x8d,0x8d,0xaf,0xfd, + 0x48,0xb7,0x8e,0x81,0x6e,0xa8,0x8b,0xc2,0x32,0x54,0x63,0x91,0xc6,0x4f,0x3f,0x44,0x35,0x9e,0x60,0x0a, + 0x85,0xcd,0xe1,0xd5,0x24,0x03,0x76,0x3e,0x0b,0x32,0xd4,0x4d,0x9d,0x6e,0xd6,0xc8,0x2d,0x89,0x15,0x0e, + 0xc7,0x1a,0x31,0xd6,0xe3,0xd3,0xf3,0xd6,0x71,0x53,0xe3,0x7a,0xdc,0xdf,0x3c,0xe0,0xee,0x2b,0xc7,0xc1, + 0x43,0x98,0xc5,0xd3,0xd4,0x1e,0xc2,0x13,0xa5,0x0f,0x24,0x53,0x81,0x3b,0x8a,0x60,0xba,0x47,0xff,0x74, + 0x4e,0xdd,0xa1,0x7f,0xd2,0x33,0xda,0x03,0x20,0xfd,0xe2,0x67,0x74,0x8c,0x2a,0xaa,0x3b,0xf4,0x1b,0xfa, + 0xd1,0xc2,0xee,0xf6,0x15,0xdc,0x6f,0x90,0xa1,0xb6,0x5f,0x7e,0x60,0xc0,0x07,0x75,0xe4,0xf8,0x1a,0xfc, + 0x62,0x0d,0xf8,0x21,0xf8,0x0b,0xf0,0x07,0x95,0xe0,0xf4,0x50,0xab,0x21,0xb1,0x40,0x01,0x24,0x4d,0x91, + 0xb4,0xd7,0x6a,0x0a,0x61,0x70,0x4e,0x4a,0xc8,0x30,0x30,0x9a,0x47,0x3f,0x8b,0x57,0xc1,0xf4,0xb8,0x36, + 0xc7,0xd0,0x4d,0x7c,0x9f,0x9b,0x55,0x1a,0xd1,0x1a,0xce,0x32,0x85,0xa3,0x6a,0x9a,0xd5,0x8e,0x50,0x0b, + 0x9c,0x89,0xff,0x74,0x2c,0x8f,0x1f,0x1a,0x0d,0xee,0xaf,0x1b,0x99,0x5c,0x9e,0x92,0x77,0x4d,0x9c,0x1c, + 0xc8,0xfa,0xd1,0x7c,0x13,0x91,0x69,0x4b,0xc8,0xf0,0x40,0x36,0xb2,0x86,0xe7,0x79,0x51,0xfd,0x9a,0x5f, + 0xf5,0x8f,0xcd,0x7b,0xd3,0x44,0x02,0xd5,0x52,0x7a,0x5f,0x7c,0x2f,0x98,0x1f,0x64,0x75,0x20,0x6a,0x07, + 0x54,0xf5,0x67,0xd9,0x88,0x7e,0x89,0xe7,0xe2,0x7b,0x8a,0x19,0xf1,0xa0,0x4e,0x12,0xc8,0x14,0x6a,0xd4, + 0xa3,0x4d,0x18,0xfe,0xe9,0x38,0xba,0x7f,0xff,0xa0,0x46,0xcb,0x5a,0x3b,0x3e,0x3e,0x96,0xdf,0xfa,0x1e, + 0xdd,0xbc,0xf1,0x57,0xf2,0x38,0x1a,0x4b,0x8f,0xac,0x14,0xe9,0x87,0x20,0x5b,0x1e,0xd4,0x60,0xd1,0xeb, + 0x50,0xc1,0x9f,0xcd,0x9e,0xa2,0xa7,0xfd,0xab,0x20,0xcd,0x64,0x24,0x61,0xb0,0x5e,0x1a,0x06,0x53,0x79, + 0xd0,0xa9,0x37,0xa2,0xfa,0xb8,0x06,0x72,0xe5,0xf4,0x4c,0xce,0xa8,0xbd,0xdf,0x7e,0xab,0x69,0xef,0x71, + 0x7d,0xcf,0x1e,0x44,0xea,0xfe,0x5b,0xec,0xdf,0xff,0x59,0xfe,0x72,0xfc,0xa7,0x16,0xbc,0x7a,0xee,0x87, + 0x00,0x12,0x6a,0x20,0x74,0x03,0x83,0xf0,0x31,0x7b,0xd1,0x49,0x06,0x03,0x87,0x1d,0x95,0xb0,0x16,0x51, + 0x1d,0x8d,0xc7,0x6a,0x82,0x42,0x0a,0x98,0x5e,0xe4,0xcd,0x81,0x78,0x1f,0x1c,0xea,0x69,0xc9,0xfb,0xf7, + 0x7d,0x8c,0xdc,0x94,0xd1,0x0c,0x86,0x17,0xc5,0x33,0xf9,0xfe,0x72,0x2d,0xbf,0x95,0xe3,0x53,0x68,0x26, + 0x5a,0xc0,0x3a,0xd5,0x8f,0x12,0x99,0x6d,0x92,0x48,0xf8,0x37,0x66,0xa5,0x69,0x8b,0x71,0xb1,0x61,0x34, + 0x0d,0x6b,0xb1,0x61,0x07,0x60,0x1a,0xe7,0xb5,0xc6,0x35,0x2d,0xce,0x98,0x61,0xa1,0xf6,0xf5,0x41,0xf6, + 0x6d,0xad,0x36,0xae,0x09,0x99,0x24,0xb5,0x7a,0x23,0x89,0x43,0x39,0x86,0x12,0x8c,0x4f,0x00,0xc1,0x64, + 0x5c,0xf3,0x43,0x09,0x32,0xd3,0x4d,0x43,0x9a,0xbe,0x60,0xb6,0x91,0x17,0xca,0x68,0x91,0x2d,0xbf,0xcd, + 0xc7,0x57,0x6a,0x1d,0x4d,0x9f,0xf0,0x1e,0xee,0xb8,0xb7,0xf2,0xd7,0x07,0x00,0x27,0x6a,0x2c,0x19,0x8d, + 0x85,0x21,0xdb,0xbc,0x20,0xd1,0x3e,0xfa,0x6d,0x0d,0xfe,0x40,0xa7,0xd8,0x9f,0x17,0xfa,0x13,0xcc,0x1b, + 0xa9,0x7a,0xcd,0xca,0x5b,0x06,0x5b,0x1e,0x4c,0xcf,0x6a,0x8d,0x83,0x3a,0x34,0xed,0x7b,0x89,0x5c,0xc5, + 0xe7,0xf2,0xa0,0x0e,0xaf,0xce,0xa3,0x83,0xfa,0x4d,0xbd,0x91,0xdd,0xd4,0xeb,0xf5,0x31,0x2c,0xfc,0xfb, + 0x60,0x25,0xe3,0x4d,0x76,0x80,0x35,0xad,0x8a,0xd9,0xb7,0x5d,0xd9,0x1d,0x0f,0x64,0xb7,0xde,0xf8,0x4f, + 0x07,0x35,0x65,0xda,0xa9,0xd5,0xf5,0x9c,0xfc,0x7a,0xc3,0xbf,0x09,0x65,0x26,0x22,0x99,0x7d,0x7f,0x06, + 0xcb,0x99,0x83,0x33,0xb4,0xf9,0x46,0x22,0xa4,0x5e,0xcb,0x3f,0x1d,0x1f,0xd3,0x73,0x80,0x01,0xae,0x27, + 0xa9,0x31,0x26,0xcf,0x75,0x86,0x44,0x1c,0xb2,0x97,0xc5,0x8b,0x45,0x28,0x01,0x02,0x81,0x2d,0x6b,0xfc, + 0x09,0x36,0xef,0xc6,0x4f,0x2f,0xa3,0xa9,0x30,0x8d,0xfa,0xeb,0x00,0x01,0xe3,0xf8,0xfa,0x26,0xdf,0xb5, + 0x48,0x5e,0x88,0x93,0x09,0x10,0xe2,0xc7,0x31,0x40,0x7d,0x1c,0xc2,0x6e,0x34,0x82,0xe3,0xd2,0x94,0x7c, + 0xac,0x02,0x33,0x8a,0xbc,0x8c,0xcb,0x7f,0xfb,0xad,0xdd,0x81,0x79,0xa1,0x3f,0x82,0x48,0x8f,0xd0,0xcc, + 0x92,0x1e,0xfb,0x17,0x7e,0x90,0x89,0xb9,0x24,0x4b,0x47,0xe3,0x3a,0x0d,0x16,0x91,0x1f,0x22,0x64,0xd2, + 0x05,0xed,0xd4,0x8d,0x65,0x09,0xc9,0x28,0xa5,0x39,0x48,0x5e,0x7e,0xa2,0x3b,0x0b,0xea,0x0d,0x35,0xf3, + 0x3f,0xb5,0xa1,0x33,0x18,0xdb,0xd3,0x24,0x01,0x20,0xce,0x0e,0x6a,0x30,0x77,0x82,0x20,0x68,0x60,0xcb, + 0x1b,0xad,0xba,0xa2,0x19,0x89,0x1a,0x49,0xea,0xa1,0x07,0xd5,0x01,0x0f,0x32,0x3e,0x4e,0x68,0x98,0xf1, + 0xf1,0x3f,0x9d,0x7e,0xff,0xc6,0x5b,0xfb,0x49,0x2a,0x0f,0x12,0xdb,0x30,0x03,0x34,0xe1,0x4f,0xa9,0x17, + 0xc3,0x42,0x77,0x5a,0x1d,0x58,0xf5,0xd4,0x63,0x20,0xd5,0x8b,0x25,0x8f,0xe3,0xfb,0xf7,0x63,0x4c,0xba, + 0x1a,0x27,0x00,0xfd,0xf9,0xe8,0xe4,0xb7,0x80,0x3e,0x2b,0x99,0xa6,0x40,0x53,0x7f,0xfb,0x4d,0x7a,0x53, + 0xc0,0xa4,0xfa,0xd7,0x50,0x36,0x0f,0x64,0x38,0xfb,0xb6,0x26,0x0e,0x6a,0x5f,0xab,0x9b,0xaf,0x6b,0x75, + 0x04,0x3f,0xc0,0xe2,0x17,0xef,0xdf,0xbf,0x15,0xb5,0xaf,0x4d,0x27,0x47,0xbc,0x1c,0x99,0xba,0x37,0xbd, + 0x37,0x32,0x6a,0x0f,0x91,0x95,0x5b,0x06,0xa8,0x63,0x90,0xbd,0xe6,0x0a,0x63,0x53,0x13,0xed,0x59,0xe3, + 0xb8,0x81,0x93,0x1e,0x27,0x37,0x37,0x6a,0x31,0xe4,0xaf,0xc7,0x44,0x1a,0x23,0xdc,0x48,0x80,0x80,0xac, + 0x71,0x1e,0x07,0x33,0xd1,0x02,0x02,0x12,0x7d,0x7b,0xbd,0x92,0xd9,0x32,0x9e,0x8d,0xe5,0xcd,0xd8,0x5c, + 0x36,0xf8,0x24,0x48,0xc7,0xd7,0xb5,0xc7,0x6c,0x58,0x6e,0x22,0x5d,0x40,0x5c,0xc5,0x8f,0xb6,0x4e,0xe9, + 0xb8,0x7c,0xf0,0xd7,0x14,0x90,0xeb,0xa6,0x81,0xa6,0xab,0x31,0xad,0x68,0x4a,0x44,0x23,0x98,0x5f,0x1e, + 0x44,0x88,0x1b,0xeb,0x38,0xcd,0xa8,0x63,0xe8,0x16,0xc6,0x70,0x50,0x7b,0xfb,0xfd,0xe9,0xfb,0x5a,0x03, + 0x0b,0x72,0x30,0x9f,0xaf,0xb2,0x47,0x97,0x19,0x90,0x5a,0x58,0x7f,0x85,0x87,0xf2,0xe1,0x71,0x1b,0x18, + 0xe9,0xfe,0x70,0x00,0xab,0xfa,0x40,0x5d,0xd6,0x01,0xb8,0x9f,0xa1,0x4b,0xe4,0x41,0xbb,0xfe,0x75,0x4d, + 0xbc,0x7e,0x54,0x1b,0x53,0xbd,0x4e,0x8f,0x2b,0x75,0x7a,0x85,0x1a,0xdf,0x61,0x0d,0xf8,0x7d,0x54,0xb3, + 0x09,0xd7,0x0b,0xf9,0x31,0xef,0xa9,0xc6,0x03,0x06,0x42,0x8a,0xa6,0x6e,0x20,0x8f,0x40,0xf9,0x1c,0x4a, + 0x7e,0x0f,0x08,0xb9,0x84,0x66,0x7f,0x40,0xbf,0xbb,0xc7,0x3e,0x80,0x0b,0x6c,0xdb,0x3d,0xdc,0xca,0x72, + 0xd9,0xc1,0x1b,0xfa,0x9e,0x3b,0xb4,0xfe,0xf0,0xe1,0xc3,0xd6,0xfd,0xf6,0x60,0x38,0x1c,0x76,0xda,0x7d, + 0x1c,0x95,0x22,0xa6,0x6d,0x98,0xc4,0xda,0x9f,0x9d,0x62,0x07,0x07,0x83,0x46,0xad,0x55,0xab,0xbb,0xed, + 0xe4,0x03,0x0d,0xa2,0xb3,0xef,0x23,0x1c,0xa8,0x26,0x67,0x04,0xac,0x2f,0xf1,0xe4,0x52,0x87,0x08,0x20, + 0x07,0xb4,0xf7,0xdb,0x6f,0x40,0x80,0xf1,0x7c,0x84,0x35,0x38,0xee,0xf4,0xfb,0xf5,0x6f,0x8e,0x3d,0x60, + 0x67,0x3b,0xa3,0x6f,0x61,0x4d,0x40,0x8c,0xe8,0x8c,0x5f,0x03,0x03,0xef,0xad,0xe3,0x8b,0x83,0x03,0xf9, + 0xb5,0xd7,0x82,0x1a,0x0f,0xda,0xf8,0x03,0x7c,0x74,0x4f,0x13,0x3e,0xaf,0xd3,0xee,0x0c,0xfe,0x12,0x1d, + 0x64,0x0f,0x1f,0xb6,0x07,0xf7,0xb1,0x95,0xaf,0xbd,0x21,0xf0,0xa4,0x5c,0x34,0x52,0x25,0xad,0x61,0x07, + 0x4b,0xe0,0xe6,0x7e,0x56,0x7f,0xe8,0xb5,0x87,0x87,0xdf,0xd6,0xd0,0x67,0x00,0x80,0x82,0xc4,0xc0,0x7c, + 0xf0,0x64,0x16,0x7d,0x0b,0x74,0x53,0x01,0x9d,0x73,0x3e,0x90,0x0f,0x2f,0x90,0x64,0x72,0x2e,0xa8,0x51, + 0xd5,0x5a,0x83,0x8e,0xb0,0xb1,0xde,0x1d,0x00,0x9d,0x80,0xea,0x22,0x53,0x99,0x93,0x7b,0x38,0x2f,0x3f, + 0xd6,0xe0,0x59,0x5a,0xf5,0x6c,0x8d,0x64,0xfa,0xeb,0x83,0x08,0x50,0xad,0xf6,0x75,0x84,0xf8,0x75,0x83, + 0x21,0xe3,0x70,0xda,0x1c,0x13,0xed,0xd6,0xf8,0xab,0x8e,0x4b,0x77,0xdd,0x8f,0x02,0x20,0xd8,0xe4,0x9c, + 0xf0,0x18,0x13,0x3b,0x24,0x12,0x97,0xbe,0x11,0x78,0x64,0x43,0xf5,0x68,0x8c,0xc7,0x7a,0x47,0x6e,0xcc, + 0x79,0x58,0x71,0x5a,0xa8,0xc9,0x51,0x8f,0x09,0x52,0xff,0xfb,0xf7,0x33,0x3a,0x26,0xf0,0xe6,0x1a,0x8f, + 0xd7,0x71,0xca,0x71,0xec,0x63,0xbf,0xb1,0x90,0xd9,0x98,0x49,0x6b,0xc5,0x90,0x90,0xa4,0x8d,0x25,0x1d, + 0x3a,0x7c,0xbe,0xeb,0xc5,0xc1,0xa6,0x6e,0x6e,0xf2,0xc5,0x9e,0xc9,0x49,0x0c,0xd7,0x92,0xf0,0xec,0x9a, + 0x8e,0x12,0x35,0xc2,0x03,0xa0,0xb6,0x3e,0xcd,0xdd,0xa6,0x96,0x11,0x10,0xd5,0x22,0x71,0x97,0x5c,0x15, + 0x1a,0xb8,0xb1,0x77,0x71,0x7d,0xf9,0x1e,0x89,0x27,0x40,0x21,0xd0,0x45,0xe0,0x01,0x83,0x05,0xf0,0x6e, + 0x09,0x1c,0x37,0xc1,0x7a,0x12,0xfb,0xc9,0x0c,0x0e,0xe9,0x72,0xa1,0x77,0x91,0x00,0xaf,0x87,0x2f,0xd6, + 0xf5,0x61,0xbe,0xab,0x12,0x72,0x62,0xf6,0x91,0x8d,0x94,0x0b,0xfd,0x5c,0x60,0x6b,0x19,0x28,0xe4,0x8d, + 0x39,0x9f,0x0d,0x2f,0x87,0x14,0x47,0x9f,0xa0,0x19,0x0c,0xdb,0x63,0x5e,0x09,0x56,0xcd,0x54,0x91,0x1f, + 0xe5,0xf4,0x71,0xbc,0x5a,0xc1,0x09,0x09,0x87,0x38,0xaa,0x2c,0xb1,0x9e,0x39,0x96,0xdf,0x26,0xc0,0x84, + 0xa6,0x12,0x0a,0xd2,0x38,0x3c,0x77,0x50,0x6f,0x1a,0xc6,0xa9,0x7c,0x17,0x5f,0xbc,0x96,0xd1,0x26,0x3d, + 0xa8,0x5f,0x57,0x73,0x9e,0x27,0x21,0x0c,0x56,0x3b,0x9f,0x0a,0x76,0x3e,0x05,0x74,0x06,0x76,0xeb,0xa9, + 0x8f,0x87,0x09,0x2c,0xbb,0xf4,0x14,0x03,0xff,0xa7,0xd6,0x8d,0x35,0xb2,0x9d,0xcd,0x20,0x8f,0xee,0xb4, + 0x22,0x5d,0xa6,0xae,0x46,0x2c,0xb4,0xfc,0x08,0xc0,0x3f,0x03,0xd6,0xb0,0xa1,0xb8,0xe8,0xba,0x35,0xfe, + 0x84,0x87,0x9e,0x13,0x8f,0xa8,0xcc,0x97,0xf1,0x70,0x1b,0x3c,0xbe,0x71,0x8d,0x7f,0x11,0xb7,0xfc,0x2a, + 0xbe,0xa9,0x86,0xc3,0x12,0x24,0x4c,0x34,0x48,0x7e,0x18,0xc3,0x61,0xbc,0x8a,0x13,0xe8,0xb7,0xc1,0x03, + 0x5a,0xfa,0xe9,0x3a,0x5e,0x6f,0xd6,0x40,0x0b,0x70,0x22,0xb5,0x46,0x61,0x9c,0x63,0x35,0xce,0x9b,0x46, + 0xed,0xf7,0xff,0xf9,0xff,0xaa,0xd5,0x8f,0xa2,0xed,0xac,0x16,0x4f,0x1a,0x64,0x5a,0xd8,0xa3,0xb5,0xbf, + 0xa0,0xa3,0xe6,0xc0,0xe1,0x64,0x33,0xe4,0x64,0x19,0x2a,0xff,0x94,0xd5,0xd1,0xf3,0x29,0x88,0x36,0xf2, + 0x48,0xf3,0xf1,0x80,0xf6,0xbf,0x1c,0x67,0x8a,0x4c,0xe8,0xa9,0x04,0xdf,0xea,0xc9,0x70,0xb0,0x56,0xed, + 0x66,0x8c,0x1c,0x30,0xf2,0x9c,0xc1,0xb7,0x7e,0xb2,0x42,0xd6,0xfb,0x20,0x65,0xcc,0x2d,0x40,0x40,0xc3, + 0x47,0x14,0x86,0x33,0x76,0x37,0x77,0x58,0xf9,0x16,0x70,0x4b,0x0a,0x4e,0xd3,0xfa,0x8d,0xc6,0x07,0x6f, + 0xaa,0xa8,0x8c,0x66,0x71,0x0f,0xfc,0x9d,0xcb,0x71,0x5d,0xb1,0x1e,0x06,0x69,0x22,0x05,0x65,0x47,0xc5, + 0xfe,0x33,0xe4,0x16,0x0d,0x08,0xb6,0x1b,0xfe,0x2d,0x90,0x44,0x52,0x66,0x1d,0xc7,0x5c,0x02,0x17,0x05, + 0x9f,0x35,0x24,0xa9,0x20,0x54,0xd0,0xca,0xe5,0x00,0xa7,0x57,0x0f,0xf8,0x4a,0x80,0x1f,0x5c,0x0b,0xe0, + 0xc3,0x88,0x12,0x05,0xc7,0xb4,0xc6,0x29,0xfd,0x68,0x2c,0x96,0xb7,0xac,0x23,0xec,0x2a,0x2c,0x1d,0xed, + 0x6e,0xa0,0x49,0x48,0x91,0xdf,0x53,0x0d,0x4b,0x8b,0xf5,0x55,0xa8,0x5d,0xa3,0x2f,0x78,0xd5,0x90,0x43, + 0x2f,0x92,0x74,0xa0,0x71,0x69,0x9d,0x39,0x1f,0x5c,0xc0,0xf4,0xf8,0x67,0x28,0x91,0xbc,0x19,0x6f,0x80, + 0x34,0xa7,0xbf,0x38,0x0d,0xc2,0x28,0x77,0xb5,0x06,0x28,0x90,0x6e,0x10,0x05,0xea,0x65,0x66,0xf9,0xfa, + 0xf3,0xc7,0x77,0xd3,0x00,0x79,0xa1,0x7e,0x23,0x01,0x5b,0x04,0x4b,0x18,0xf2,0xc6,0x90,0x8e,0xad,0x0b, + 0xe7,0xec,0xbd,0x45,0x6b,0xca,0x2f,0x9c,0xc9,0xcb,0x59,0x7c,0x11,0x31,0x5c,0xd5,0x9e,0xa6,0x53,0x7f, + 0xcd,0x82,0x24,0x26,0xcb,0xbb,0x7f,0xbf,0x00,0x44,0x37,0x1a,0xce,0x5e,0xb6,0x47,0x6f,0x8e,0xaf,0x81, + 0x56,0x5c,0xa3,0x27,0xd2,0xb8,0x76,0x0a,0x7f,0x81,0x9b,0x12,0xca,0xed,0xb0,0xd6,0x40,0x25,0x00,0x10, + 0xfa,0x71,0xed,0x35,0xaa,0x07,0x14,0xc9,0x47,0x9d,0x4a,0x03,0x43,0xd7,0xc6,0xb5,0x27,0xf0,0x97,0x48, + 0x3f,0x14,0x28,0x97,0xc0,0xda,0x13,0xbe,0xa8,0x35,0xd2,0xcb,0x14,0xbf,0x7b,0x57,0x3b,0xa5,0x5f,0x40, + 0x56,0xec,0x74,0x5c,0x7b,0x89,0x3f,0xb5,0xc6,0xda,0x27,0x8f,0x67,0x28,0x78,0xab,0xae,0x6a,0x8d,0x30, + 0x5e,0x8c,0x6b,0xaf,0xe2,0x45,0xad,0xe1,0x6f,0x66,0x41,0xfc,0xde,0x9f,0x8c,0x6b,0x27,0x78,0x05,0x23, + 0x59,0x77,0xa1,0xea,0xeb,0xb7,0xdd,0x94,0xaf,0x31,0x2b,0xc8,0xb8,0xf6,0x2f,0xf1,0x26,0x11,0x30,0x71, + 0x01,0x0f,0x50,0x5d,0x29,0xd3,0x86,0x00,0x8a,0x22,0xa2,0x38,0x0b,0xe6,0x8a,0xa1,0x4d,0x05,0xe0,0x82, + 0x60,0x45,0x44,0xea,0xd5,0x1a,0xe8,0x54,0xcc,0x4d,0xbf,0xf3,0xa9,0x69,0x2a,0x78,0x01,0x03,0x43,0xd7, + 0x45,0x90,0x46,0x04,0x15,0x88,0x94,0xd5,0x47,0xe6,0x15,0xf4,0xfe,0x1c,0xd7,0xde,0xe4,0x0f,0xc4,0xa5, + 0xcc,0x3c,0x71,0x32,0x9b,0x09,0x78,0x22,0x40,0xe4,0x8c,0x2f,0x4c,0x5d,0x7f,0x85,0x75,0xe1,0xaf,0x2a, + 0xd8,0x24,0x21,0x2c,0x44,0x06,0x47,0xe0,0x4a,0xfc,0xf0,0xee,0x95,0x2a,0x85,0x8d,0x84,0x09,0x42,0x03, + 0xaa,0x49,0x55,0x8c,0xcb,0x87,0x4e,0x75,0xb5,0xb7,0x7c,0xa1,0x8a,0x91,0x5a,0xac,0xe5,0x0c,0xc7,0x90, + 0x89,0xb5,0xf3,0x68,0xb6,0x41,0xb6,0x0b,0x7b,0x15,0x7e,0x08,0x9d,0xcc,0x2e,0xc5,0x26,0x45,0xfc,0xa7, + 0xa7,0x13,0x7f,0x46,0xfd,0xaf,0x36,0xb0,0xe7,0xc4,0x08,0x0b,0xfc,0x84,0xb3,0x58,0x66,0xd9,0x7a,0xfc, + 0xe0,0x81,0x80,0x05,0xc3,0xcb,0x14,0xae,0xd5,0x1b,0x61,0x8c,0xdd,0x53,0x7b,0x41,0x0a,0x10,0x11,0x0b, + 0x2c,0x11,0x07,0x9d,0x9e,0x98,0x2e,0xfd,0x04,0x24,0x74,0x10,0x23,0xea,0xb0,0x4d,0xeb,0x75,0xca,0xbb, + 0x04,0x17,0x74,0x1b,0xc6,0xf1,0x9a,0x6e,0x05,0xe5,0x69,0xa3,0x49,0xa9,0x62,0x58,0xe2,0xf7,0x4b,0x18, + 0x20,0x54,0x15,0x4a,0xf9,0x88,0xa1,0xea,0x29,0x2d,0x1f,0x79,0x16,0xc3,0x4e,0xc5,0xd9,0x12,0x7e,0x91, + 0xa9,0x87,0xaa,0x0a,0xa6,0x3c,0xf1,0x24,0xf1,0x17,0xe2,0xf7,0xff,0xe3,0xff,0x45,0xe0,0x4c,0x24,0xb9, + 0x7c,0xc2,0x52,0x5b,0x4e,0xa3,0xb5,0x47,0xe6,0xda,0x2e,0x87,0x2e,0xdf,0x6d,0x22,0xa1,0x0e,0x93,0x78, + 0x93,0x86,0x97,0x0d,0xf4,0x5f,0x04,0xc1,0x1c,0x3f,0xc6,0x88,0x44,0xdc,0x2f,0xf5,0x46,0xb0,0x4c,0x4a, + 0x1b,0x1c,0x2a,0x01,0x34,0xab,0x70,0x4c,0xf9,0x0b,0xde,0x03,0x40,0x09,0x58,0x65,0x4f,0xfc,0xfe,0xb7, + 0x7f,0x3d,0xc1,0xdc,0x78,0x7e,0x26,0x7f,0xff,0xdb,0x7f,0x17,0xc0,0x07,0x22,0xcc,0x61,0xeb,0x02,0x87, + 0x02,0xf5,0x60,0xd8,0xd8,0x83,0x5e,0x12,0x5c,0x71,0xbc,0xcf,0x07,0x0a,0x9d,0xfa,0xaa,0x09,0x58,0x3d, + 0x75,0x05,0x1d,0xca,0xbc,0xf4,0x89,0xb9,0x06,0xd4,0x82,0xfd,0x9b,0x2e,0xb3,0x18,0x60,0x0a,0x56,0x10, + 0xc0,0xfd,0x02,0xb0,0x02,0x8e,0x6e,0x7e,0x97,0xf0,0x0b,0x40,0x02,0x06,0x00,0xaf,0x6d,0x58,0xb4,0x83, + 0xb7,0xa2,0xd8,0x5e,0x31,0x80,0xe4,0xfc,0x56,0xe3,0x07,0x56,0xe2,0x59,0xc3,0x63,0x9f,0x36,0x75,0x06, + 0x6b,0x0f,0x2b,0x3e,0xae,0x7d,0x8f,0xcb,0x0e,0x54,0x69,0x19,0xac,0xdf,0x6e,0x30,0x70,0x75,0x5c,0x5b, + 0xd3,0x2f,0x97,0x9d,0x52,0x0b,0xe3,0x1a,0xb7,0xc4,0x65,0xaf,0x01,0x32,0x81,0xb1,0x00,0xb6,0x02,0x7f, + 0x71,0x8c,0xf8,0x8b,0x88,0xcc,0x17,0xa6,0xe4,0x05,0xce,0x04,0x38,0x44,0xfc,0xfa,0x33,0x10,0x4e,0x80, + 0x6c,0x41,0xb1,0x34,0x00,0x1c,0x04,0x10,0x6a,0x78,0xb0,0xb6,0x21,0xe6,0x85,0x63,0xf8,0x65,0x8f,0x06, + 0x8f,0x1a,0xe1,0xeb,0x71,0x4d,0x79,0x39,0x60,0x91,0x41,0x58,0xd5,0x07,0xe2,0xab,0x1a,0x2a,0x51,0x3b, + 0xa4,0x79,0x6b,0x33,0x7a,0xb8,0x51,0x00,0xca,0x7d,0x09,0xf5,0x18,0x36,0x0a,0x50,0x80,0x37,0x49,0xbc, + 0x24,0xfc,0xb9,0x4c,0x71,0x08,0xf6,0x86,0x7a,0xdc,0xc8,0x73,0xea,0x31,0x8a,0x05,0x0a,0xec,0x79,0x11, + 0xb5,0x0b,0x8d,0x20,0x40,0xc0,0x0f,0x6f,0x9e,0x44,0xb2,0x41,0xa4,0xe9,0x4c,0x4a,0xc0,0x88,0x00,0x66, + 0x97,0x86,0x71,0xa6,0xe0,0x33,0xc6,0x88,0xc3,0x85,0x00,0x16,0x4c,0xa4,0x18,0xe1,0x10,0x80,0xa4,0x15, + 0x5d,0x52,0xc3,0x4c,0x77,0x60,0x28,0xb0,0x33,0x80,0x3d,0xc0,0x3c,0xc0,0x68,0x14,0x0c,0xa3,0x37,0x99, + 0xc0,0x5d,0x81,0x11,0x11,0x9a,0x9c,0xfa,0xe7,0xb8,0x51,0x88,0x90,0x74,0x2f,0xd0,0x5b,0x05,0xe6,0x9c, + 0x6e,0x1e,0xa3,0xa2,0x72,0x5c,0xa3,0x1f,0x22,0x9a,0x9b,0x35,0xb4,0x8e,0x7b,0xa2,0x9e,0x11,0x09,0xd2, + 0x57,0x76,0x8d,0xdf,0xff,0xf6,0x7f,0x62,0xa5,0x77,0x48,0x67,0xc6,0xb5,0x1f,0xa8,0x50,0xf8,0xe7,0x7e, + 0x10,0x22,0x76,0xd0,0xfb,0x6c,0x8a,0xc6,0x87,0x88,0xb2,0x33,0x06,0xda,0xcd,0x2b,0xf4,0xc4,0xc5,0x36, + 0x91,0x59,0xa3,0xf9,0x33,0x1d,0xc0,0x67,0xaf,0x83,0x34,0xa5,0x1e,0xdf,0x30,0xb1,0x41,0xf4,0xd4,0x4d, + 0xea,0xd9,0xbd,0xd8,0x4c,0xb0,0xea,0xf7,0xf3,0x39,0xe5,0x00,0xab,0xc1,0xbd,0x20,0x7d,0xab,0xd8,0x44, + 0x4e,0xff,0x3c,0x26,0x33,0x36,0x0d,0x92,0x30,0x30,0x90,0x19,0x90,0xd2,0xe3,0xa7,0xf6,0x42,0x01,0x8b, + 0xeb,0x0b,0x54,0xf7,0xd8,0x15,0xa2,0x79,0x90,0xac,0xf2,0x3a,0xb4,0xfd,0xd8,0x11,0x10,0x8c,0x14,0xb6, + 0xfa,0x5b,0x41,0x87,0xce,0x34,0x5e,0xad,0x61,0xeb,0x71,0x70,0x1a,0x5e,0x54,0x92,0x79,0xe0,0x9c,0x24, + 0xec,0xe9,0x1a,0x01,0x13,0xa6,0xa5,0x72,0xbd,0xa8,0xb3,0x0a,0xf5,0x3c,0xb4,0xa9,0xe4,0x94,0x8c,0xc4, + 0x14,0x66,0x9a,0xc2,0x6e,0x9a,0xde,0xa4,0xdd,0x19,0x8f,0x30,0x95,0x6b,0xa0,0xb9,0x66,0x1e,0xb8,0xa2, + 0x08,0x33,0xe2,0x12,0x5b,0xbc,0x88,0x93,0x33,0xea,0xe9,0xd1,0x26,0xd5,0xbb,0x81,0xfb,0xc5,0x75,0xd5, + 0x56,0x3d,0x21,0xc0,0x64,0x0c,0x55,0xbb,0x48,0x30,0xf0,0x0c,0xa6,0x7a,0xe1,0x27,0xf9,0x4a,0x51,0x93, + 0x8a,0x38,0xcf,0xd5,0x43,0xec,0x8f,0xf4,0xf7,0xf6,0xeb,0xa9,0xc7,0x70,0x42,0x3b,0xe9,0xe0,0x0d,0xcf, + 0x09,0x90,0xa5,0x04,0x59,0x0c,0xaa,0xf4,0x22,0x9e,0xb5,0x8b,0x04,0xb3,0xa9,0xd0,0xab,0xf6,0x94,0xd5, + 0xfb,0x02,0xce,0x2c,0x9c,0x07,0xf2,0x35,0x18,0x7a,0xe6,0x89,0xf7,0xc9,0xa5,0xd5,0xc2,0x0f,0xd1,0x19, + 0x90,0xbd,0x88,0xe0,0x85,0xdb,0x17,0xe8,0x09,0x92,0x70,0xb8,0x09,0xe3,0x3a,0xc2,0x28,0x66,0x6b,0x88, + 0x23,0x86,0x95,0xf5,0x66,0xa2,0xd5,0x5c,0x80,0x9d,0xf3,0xc5,0x7b,0x12,0x7b,0x6a,0xa7,0x6a,0xe7,0xa8, + 0xec,0x45,0x00,0xe2,0x7c,0xed,0x31,0x72,0x4c,0x66,0x4b,0xe9,0xc1,0x2b,0x18,0x04,0x01,0xa8,0xba,0x30, + 0x4f,0x69,0x8d,0xa1,0xc2,0x1b,0x5a,0x64,0xc2,0x74,0xb5,0x14,0xf1,0x1c,0x1d,0xca,0x01,0x99,0x4d,0x5d, + 0x8f,0x6a,0x2a,0xa4,0xd4,0xfd,0x32,0x4e,0x8a,0x26,0xed,0x3e,0x12,0x09,0x90,0x5f,0xf1,0x94,0x26,0xda, + 0x34,0x5f,0x3c,0x91,0x73,0x7f,0x13,0x66,0x40,0x35,0x7f,0x80,0x31,0xcd,0xd4,0x1d,0x3d,0xfa,0xe0,0x27, + 0x91,0x43,0xb5,0x7e,0xff,0xdb,0x7f,0x4b,0x73,0x48,0xd4,0x8e,0xfe,0x04,0x45,0xeb,0x24,0x06,0x68,0x5d, + 0x79,0xe2,0x59,0xf0,0x11,0xc9,0x89,0x22,0x61,0x72,0x16,0xa0,0x10,0x0f,0x8b,0x05,0x83,0x80,0x31,0xa1, + 0x33,0x1b,0x5d,0xcf,0xf8,0x86,0xe0,0x04,0x21,0xe4,0x14,0xfe,0x7e,0x0b,0xbd,0xfa,0xd1,0x54,0x22,0x12, + 0xd3,0x2f,0x1e,0x51,0x21,0x9e,0x4d,0xc0,0xc2,0xc1,0x7b,0xd8,0xd8,0xb8,0xf6,0x14,0xfe,0xd2,0x61,0x49, + 0x39,0x6d,0xf1,0xfc,0x9c,0x12,0x8b,0xb8,0x89,0x54,0xbb,0xea,0x42,0x83,0x3f,0x52,0xca,0x18,0xd6,0x1b, + 0x29,0x03,0xfe,0x12,0x27,0x47,0xab,0x8a,0xbe,0xb7,0x81,0xbc,0x50,0xc7,0x9c,0x45,0x2f,0xe0,0x50,0x83, + 0x5d,0x40,0xb0,0xc5,0x5f,0x7d,0x4f,0x6d,0xab,0x2b,0x38,0xc9,0x48,0xb1,0x8c,0x83,0x3b,0x0f,0xa6,0x12, + 0x49,0x2a,0x2c,0x2c,0x08,0xe0,0x4c,0x24,0xd6,0xf1,0x85,0x84,0x87,0x6f,0xf1,0x07,0x58,0x06,0x0a,0x12, + 0x89,0x24,0xca,0x45,0x8f,0xcc,0x35,0x0f,0x80,0x8e,0xd1,0xb7,0x38,0x12,0x60,0x20,0x70,0x7f,0xb0,0xe9, + 0x8f,0x19,0x15,0xbf,0x41,0x7a,0x4b,0x45,0x30,0xdd,0x55,0x90,0x32,0xbb,0x80,0x17,0x0e,0x0f,0x6a,0x1e, + 0x2b,0xf6,0xcd,0x3c,0x10,0xa6,0x1c,0x96,0x39,0xf2,0xd7,0xbc,0xe6,0xb8,0x99,0x52,0x46,0xc0,0x1d,0xc1, + 0x3a,0x26,0x72,0x0a,0x5c,0x0c,0xe6,0x52,0x99,0x89,0xe7,0x2f,0x9f,0x51,0x01,0xb2,0x82,0xc8,0x4f,0xc6, + 0x08,0x2b,0xf8,0x04,0xb6,0xbb,0x41,0x60,0xc4,0x55,0xd0,0x40,0xb7,0xc6,0x4d,0x7b,0x05,0x17,0x42,0xad, + 0x62,0xad,0xa1,0x50,0x6c,0x5c,0xfb,0x91,0x2f,0x6a,0x8d,0x25,0x70,0x95,0x80,0x1b,0xf0,0x37,0x22,0x66, + 0x15,0xcf,0xc5,0x97,0x6f,0x05,0x30,0xa6,0x09,0xcd,0x1f,0xdd,0xf6,0xc7,0xb5,0x0f,0xc1,0xb3,0x00,0xd7, + 0x18,0x4d,0x04,0xb8,0xe6,0xf8,0x8b,0x9c,0x22,0x90,0xc9,0x67,0x98,0xd9,0xfe,0xdd,0xc9,0x6b,0x58,0xaa, + 0x94,0x0a,0xde,0x9e,0xe6,0x77,0x91,0x3a,0x0f,0x81,0xbf,0x6b,0x8a,0x60,0xce,0xb4,0x94,0xe4,0x05,0x82, + 0x49,0xaa,0xda,0x10,0xa4,0x35,0x22,0x58,0x6c,0xa6,0xdd,0xe6,0xaf,0x1b,0x7f,0x06,0x95,0xc9,0x2f,0x10, + 0x38,0x39,0x0c,0x8a,0xbc,0x44,0xf6,0x8e,0x2e,0x70,0x66,0x18,0xf4,0x02,0xf3,0xc2,0x64,0xbd,0x21,0x70, + 0x71,0x00,0x82,0xe8,0xb5,0x0e,0x48,0x00,0x7f,0x31,0xc4,0x0c,0xc5,0xb7,0xc6,0x72,0xb3,0x42,0x94,0x5f, + 0x05,0x00,0x8a,0xf0,0xd6,0x74,0x93,0xd0,0x76,0xa9,0x73,0x89,0x77,0x4c,0x7e,0x04,0x00,0x0e,0xe9,0x98, + 0x32,0x97,0xb5,0x06,0x7e,0x12,0x66,0x5c,0xc3,0xbf,0xb5,0xc6,0xdc,0x0f,0x12,0x54,0x72,0x04,0x00,0x21, + 0x17,0xf8,0xb9,0x9b,0x1a,0xfe,0x05,0x56,0x6d,0x76,0x8e,0xd0,0x4f,0xcc,0x3b,0x5f,0x51,0x19,0xcb,0x24, + 0xcf,0xd0,0x1c,0x90,0xf2,0x5c,0x0d,0x09,0x05,0xa9,0x10,0xd8,0x12,0x2c,0xf5,0x33,0x7e,0xc4,0x61,0xa2, + 0x3e,0x51,0x07,0x8a,0xb6,0x87,0x3f,0x9e,0x78,0xe7,0x5f,0x08,0xd2,0x90,0xa5,0xb0,0x62,0x8c,0x1e,0xcc, + 0xeb,0xe0,0x17,0xee,0x50,0xba,0x90,0x93,0x38,0x06,0x31,0xe2,0x57,0x85,0x9c,0x20,0x7f,0x08,0x2e,0x43, + 0xce,0x02,0xca,0x37,0x01,0x32,0x51,0x19,0x31,0x6f,0xe1,0xa5,0xe2,0x09,0x2e,0x90,0x03,0x9e,0x07,0x0b, + 0x15,0x3c,0x67,0xda,0x01,0x02,0x8a,0xa0,0x45,0xaf,0x13,0x0f,0x99,0x4c,0x48,0x54,0xcc,0x81,0x98,0x99, + 0x1f,0xb9,0xc2,0xe4,0x04,0x89,0x7e,0x8d,0xa8,0xe0,0x3b,0x7d,0xa9,0xe8,0x16,0xcd,0x27,0x91,0x88,0x7c, + 0x29,0xc5,0x90,0x21,0x21,0x86,0x33,0x2e,0xbc,0x24,0x4c,0xe6,0x37,0xf5,0x6b,0x28,0x13,0x4c,0xfc,0x28, + 0x22,0x0c,0x4c,0x62,0xa6,0xd1,0xd8,0xd6,0x0a,0x95,0xa9,0x38,0xda,0x08,0x9d,0x0e,0xd5,0x41,0x04,0xb3, + 0xa1,0x73,0x09,0xc1,0xd0,0xc8,0x59,0x40,0x53,0x22,0x3c,0xd2,0x50,0x5f,0x8c,0xd7,0x11,0x8d,0xea,0x54, + 0x5d,0x51,0x9f,0x40,0x00,0xf0,0x74,0x04,0x9c,0xd4,0x57,0xb0,0xc8,0x24,0x21,0xa0,0x5c,0x9b,0xb1,0x54, + 0x0b,0x82,0x2e,0xee,0xa0,0x2a,0xd3,0x5b,0xa8,0xb6,0xcd,0x1c,0x5c,0xc0,0xa6,0x01,0x42,0x48,0x12,0x20, + 0xfd,0x35,0x55,0x45,0xd9,0x82,0xe9,0xb4,0x35,0xce,0x7c,0xd5,0x69,0xb0,0x86,0x12,0xc3,0xf8,0x99,0xca, + 0xc3,0xfb,0xf3,0x0b,0xa4,0x6f,0x9a,0x76,0xe5,0x30,0x72,0xe0,0x4d,0x82,0xa8,0x8e,0x78,0xc6,0xcc,0x4b, + 0x61,0x14,0xf4,0x60,0xba,0xac,0x66,0xd9,0xe8,0x51,0x89,0x67,0x7b,0x1e,0x64,0x70,0xec,0xd1,0x5a,0x60, + 0x85,0x0d,0xac,0xf6,0xf5,0xf9,0x0d,0x89,0x74,0x30,0x42,0xf4,0xf7,0x21,0x3b,0x52,0x88,0xd9,0xad,0x3d, + 0xaa,0x13,0x21,0xb1,0x55,0x75,0x2c,0x8e,0x0a,0x9e,0x00,0x16,0x20,0xd5,0x8f,0x37,0xe1,0x8c,0x48,0xe9, + 0xb4,0x38,0x08,0xeb,0x80,0xa6,0xa6,0x13,0x6e,0x31,0xa1,0xb9,0xe8,0x91,0xc0,0xe9,0x14,0x62,0xd4,0x21, + 0xbd,0x08,0xd2,0x5e,0x74,0xb9,0x42,0xa2,0x8a,0x80,0x0b,0x63,0x81,0xfd,0x49,0xe2,0x15,0x03,0x5d,0xa0, + 0xa5,0x71,0x05,0x0c,0x48,0x2c,0x11,0x5d,0x26,0x40,0x18,0x99,0x8e,0xcb,0xd9,0x96,0x2e,0x61,0x78,0x28, + 0x63,0xbc,0xe3,0x89,0x09,0xba,0xe5,0x65,0x3d,0xa7,0x49,0x6c,0x4a,0x1c,0x2b,0x94,0x04,0xcc,0x81,0x01, + 0xe8,0x2b,0x86,0x43,0xdc,0x17,0xaa,0x8c,0x9e,0x6b,0x3e,0x84,0x56,0xf8,0x49,0x7e,0x63,0xf6,0x4f,0x2f, + 0x33,0x1f,0x40,0x54,0xed,0x87,0xf5,0xb6,0x4a,0x11,0x22,0x31,0xb1,0xcf,0x78,0x76,0xeb,0xb6,0x71,0xd5, + 0xd5,0x31,0x05,0x12,0xfc,0x9c,0xa4,0x44,0xc2,0x3f,0xde,0x21,0x6b,0xb6,0x70,0x34,0x24,0x19,0x40,0x1a, + 0x2d,0x3f,0xbd,0x8a,0x3b,0x8a,0x70,0x25,0x56,0x7e,0xb4,0x41,0xb4,0xe3,0xb5,0xc0,0x6f,0x66,0x11,0xb4, + 0x19,0x68,0x82,0x43,0x20,0x3f,0x7e,0x70,0x57,0x71,0x1d,0xdf,0x28,0x79,0xe3,0x02,0x56,0x58,0x9f,0xa0, + 0x2e,0xc7,0x85,0x6d,0x11,0x87,0x79,0x92,0x43,0xac,0xe6,0xbb,0x52,0xa3,0x75,0x48,0x36,0x84,0x7e,0x44, + 0x61,0x10,0x5d,0x24,0xa1,0x3c,0x06,0x6e,0xe6,0xbc,0x94,0x7e,0xf2,0x42,0x3d,0x4a,0xb5,0xe4,0x9d,0xa3, + 0x0b,0xca,0x0c,0x8a,0xcf,0x11,0x07,0x0a,0x79,0x59,0xf2,0xaa,0x23,0x02,0xf9,0xa8,0x64,0x87,0xa1,0x3c, + 0xe3,0x0b,0x46,0x4d,0x53,0x0e,0xed,0x3e,0x4d,0x60,0xbd,0x52,0xf1,0xf4,0xc7,0xa7,0xef,0xfe,0xe5,0xfd, + 0x8b,0x97,0x6f,0x9e,0x8b,0x03,0xc4,0xc7,0x86,0xd6,0x11,0xe9,0x8e,0xea,0x30,0xc7,0xcb,0x35,0x1f,0x3e, + 0x4b,0x75,0x08,0x2a,0x05,0x18,0x4e,0x12,0xfa,0x92,0xd8,0x92,0x6a,0x50,0xa0,0xd2,0xe0,0x92,0x16,0x4a, + 0x3d,0x78,0x13,0xe7,0x87,0x27,0xec,0xa2,0xe4,0xed,0xa3,0x50,0x41,0x38,0xbc,0xce,0x4e,0x55,0xb2,0x57, + 0xd2,0x4e,0x6c,0xd6,0x00,0x51,0xc8,0xd9,0xa1,0x8a,0x3d,0x7f,0xf8,0xc2,0x82,0x38,0x5f,0xfc,0x04,0x87, + 0x6f,0x3c,0x17,0x17,0x78,0x4c,0x20,0xcd,0x60,0xc6,0xa8,0x81,0xfb,0xac,0x5e,0x45,0x6d,0x89,0x67,0xbd, + 0x7f,0xb2,0x66,0x3a,0xe4,0xb6,0x7a,0x82,0xc2,0xac,0x22,0x30,0x3e,0x33,0x00,0xa4,0xfd,0x10,0xec,0x30, + 0x33,0x23,0xd1,0x1f,0x46,0xe4,0x5d,0x05,0x6b,0x6a,0x4d,0xb1,0xc2,0x8f,0xe9,0xb1,0x7a,0x8a,0xe5,0x7a, + 0x6c,0xd6,0x28,0xcb,0x0f,0xa1,0x2f,0x34,0x0c,0xf2,0xb0,0x61,0xf9,0x82,0x68,0x1a,0x6e,0x66,0x30,0x6c, + 0x58,0xd7,0x88,0xd9,0x12,0x3f,0xef,0xea,0x03,0x6c,0x26,0xd3,0x29,0xf4,0x4a,0x98,0x66,0x9a,0x5c,0x63, + 0x7b,0xc8,0x2f,0xa8,0xc5,0xd2,0x48,0x81,0x87,0xeb,0xe4,0x8c,0x99,0x6b,0x36,0xb0,0x08,0x1f,0x8f,0x7e, + 0x1f,0x68,0x17,0x72,0x16,0xa8,0xdb,0x58,0xc4,0xc8,0x1b,0x4c,0xce,0x4e,0x10,0x81,0x4f,0x10,0x63,0xa1, + 0x1b,0x8b,0x75,0xc1,0x75,0xe1,0x1d,0xb7,0xb9,0xfd,0xc9,0xd9,0x4b,0x47,0x25,0x39,0x39,0x7b,0x0d,0x87, + 0xcb,0x2c,0x20,0x05,0x85,0xba,0xc2,0xd2,0xb7,0x15,0xaa,0x4a,0xa8,0xbb,0xee,0x6a,0x85,0x24,0x34,0xcf, + 0xfa,0x09,0x2d,0x63,0x51,0xd9,0x09,0xfa,0xc1,0x61,0x02,0x9b,0x5c,0xfa,0xc6,0x62,0xb5,0x59,0xef,0xcd, + 0xb6,0x59,0x0b,0xaa,0x4a,0x0c,0x23,0xcc,0x4f,0xd4,0xea,0xa8,0x87,0xf6,0xc6,0x16,0x77,0xf1,0x31,0x7f, + 0xb2,0xe2,0x05,0x9d,0x6e,0xef,0xe9,0x14,0xfa,0xfd,0x6f,0xff,0x0b,0x1e,0x44,0xc1,0x22,0x82,0x2b,0xa0, + 0x1c,0x64,0xd1,0x81,0x45,0x83,0xdb,0xff,0x96,0x69,0xe2,0x41,0x68,0x01,0xb8,0x10,0x6b,0x28,0x03,0x88, + 0xc3,0xef,0x0b,0xe5,0x9c,0x0a,0xbc,0x09,0xdd,0x25,0xf1,0x45,0x8a,0x13,0xca,0x47,0x33,0x33,0xfb,0xa5, + 0xde,0xa4,0xdd,0x42,0xb9,0x84,0x57,0xfb,0x82,0xaf,0x0e,0x50,0x5b,0x88,0x2f,0xe1,0xe9,0xff,0x5f,0xf2, + 0xa9,0x93,0xe3,0x01,0x92,0x9a,0x9c,0x0b,0xd1,0xe2,0x66,0x90,0x81,0xb4,0x91,0x72,0xd8,0x2e,0xf1,0xba, + 0x09,0xb1,0x84,0xf1,0x7c,0x5c,0x8b,0xe7,0x80,0xec,0xf8,0xdd,0x9c,0x1a,0xfe,0x65,0xb1,0x23,0x4e,0x48, + 0x11,0x89,0x5b,0x29,0x9e,0xd2,0x3d,0x96,0x97,0x84,0xb6,0x5c,0xe4,0xa1,0x55,0x95,0xb3,0x1f,0x22,0x23, + 0x14,0xf0,0x92,0xf1,0x53,0xa0,0x49,0x7c,0xce,0x91,0xec,0x89,0x15,0xb1,0xe5,0xef,0x61,0x51,0xc8,0x35, + 0x84,0xab,0x92,0x27,0xe4,0xd4,0x1c,0x89,0x13,0x49,0xab,0x46,0x87,0xfc,0xaa,0x02,0x92,0x74,0x19,0x33, + 0x19,0xa7,0x48,0xc2,0x05,0xca,0xb8,0x19,0x80,0xf1,0x1e,0x8a,0x6b,0x38,0x9b,0xb1,0x05,0x14,0x3a,0x2e, + 0x04,0xb5,0x75,0xc9,0x6d,0xda,0xda,0x66,0xca,0xfa,0x9f,0x65,0x19,0xe0,0xc1,0xec,0xb8,0xd7,0x88,0x8f, + 0xfb,0x8d,0xc9,0x71,0xbb,0xd3,0x1a,0x4f,0x1b,0xb2,0xb1,0xe0,0xe7,0x24,0x19,0xbc,0x65,0xa1,0x40,0x60, + 0x22,0x5e,0x53,0x6c,0xc9,0x15,0x46,0x68,0xa0,0x47,0xa4,0xd9,0x47,0x75,0xb4,0x2d,0x84,0xe1,0x13,0xeb, + 0x8d,0xc2,0x93,0xd5,0x26,0x23,0x19,0x92,0xd4,0x8b,0x00,0x46,0x20,0x0c,0x03,0xab,0xa8,0xf4,0xd6,0x79, + 0x65,0xa5,0x50,0x4b,0x03,0x64,0xbf,0x01,0x04,0xd1,0x30,0x14,0x20,0x66,0x8b,0x0d,0xf2,0x9c,0x82,0xad, + 0x07,0xe2,0xf7,0xbf,0xfd,0x3f,0x82,0x4c,0x01,0x1e,0x19,0x07,0x72,0x65,0x3c,0x35,0x1f,0x6f,0xb2,0xf5, + 0x06,0xde,0x06,0xdc,0x46,0x30,0xdd,0x5c,0x5d,0xa1,0x12,0x19,0xbf,0xd7,0x0b,0xfc,0x3a,0x5c,0xae,0x83, + 0x8a,0xe6,0x9e,0xbf,0x7d,0xf9,0xbd,0xda,0xa9,0x5c,0x55,0xa8,0xb6,0x88,0xf5,0x07,0xfc,0x88,0x30,0x5f, + 0x31,0x11,0x58,0x02,0x58,0x70,0x86,0xf6,0xd5,0x27,0x9a,0xde,0x93,0x17,0x07,0xcc,0x6d,0xce,0x82,0x35, + 0xed,0x1a,0x89,0xd1,0x58,0x5b,0x7e,0x0c,0x52,0x24,0x0c,0x27,0x6a,0xcb,0x98,0x9d,0x27,0xc4,0x72,0xf4, + 0xf5,0x5c,0x4f,0xf5,0xe0,0xcf,0xf2,0x3d,0x1d,0x0b,0x4e,0x0d,0x03,0x10,0x32,0x0b,0x16,0x41,0x06,0xbf, + 0xff,0x95,0xfa,0x68,0x36,0x00,0x7d,0x11,0x5b,0x1c,0xad,0x3c,0xc8,0x70,0xb3,0x49,0x3e,0x1f,0x3c,0x8a, + 0x70,0xbd,0x03,0x26,0x71,0xf0,0xac,0xc8,0xc8,0x11,0xf8,0x6b,0xc5,0x93,0xd6,0xda,0x10,0xbf,0x5d,0xc5, + 0x82,0x61,0xc7,0x99,0xc5,0x16,0x40,0x83,0x50,0x69,0x85,0x62,0xf3,0x25,0xeb,0x57,0xd2,0x25,0x09,0xa3, + 0x78,0x7a,0xf9,0x0b,0x94,0x0e,0x95,0xf2,0x9b,0xaa,0xe1,0xe1,0x06,0x14,0x04,0x05,0x72,0x0f,0xa5,0xb4, + 0xc9,0x63,0x6e,0x1a,0x07,0xc4,0x3c,0x3f,0xd4,0x26,0x35,0x1f,0x3c,0x53,0x38,0xff,0x8c,0x06,0x8c,0xf8, + 0x76,0x26,0x2f,0x5d,0x74,0x4b,0x95,0x0c,0x14,0x86,0x48,0x37,0x48,0xba,0x64,0x12,0x85,0xcd,0x30,0x85, + 0xb9,0x90,0x93,0x14,0xe5,0x4b,0xd2,0x9c,0x16,0x47,0x0f,0x9d,0x20,0x5a,0xff,0x90,0x6b,0x0f,0x95,0x02, + 0x87,0x30,0x9b,0xb8,0xb1,0x5d,0xca,0x48,0x6e,0x41,0x9f,0x82,0xcf,0x88,0x97,0xda,0x46,0x19,0xf2,0xe3, + 0xcc,0x13,0x6f,0x99,0x31,0x2d,0x8c,0xe4,0x2d,0xaf,0xde,0xee,0x66,0xd4,0x12,0xdf,0xda,0x0a,0xdb,0x8f, + 0xcc,0x35,0x11,0x3b,0x5c,0x52,0xcd,0x91,0x28,0xe4,0x33,0x4b,0x6d,0x98,0x11,0xbd,0x0f,0x04,0x01,0xa8, + 0x34,0xf3,0xa7,0x94,0xb0,0x85,0x78,0x32,0xc3,0xa7,0x4e,0x5d,0xf2,0xa4,0x65,0x80,0x06,0xaf,0x30,0xac, + 0x3d,0x2a,0xf3,0xb9,0x1a,0x0f,0xeb,0x64,0x93,0x2d,0xdf,0x29,0xf1,0x74,0xcf,0x4e,0x94,0x2c,0x60,0xad, + 0x34,0x37,0xf2,0x57,0x72,0xa0,0xcd,0x15,0x87,0x9a,0x52,0x43,0x1b,0x72,0xad,0xa4,0x6b,0x80,0x14,0x0d, + 0xca,0x48,0x4c,0x12,0xd4,0x68,0x28,0x5d,0x2f,0xf3,0x4f,0xd0,0xda,0x87,0x04,0x76,0xf6,0x05,0x29,0x40, + 0xf2,0x3d,0x9f,0xc6,0x2b,0xa9,0xc4,0x10,0x1f,0x5a,0x46,0x05,0x1e,0x2a,0x0c,0x08,0x35,0x90,0xfa,0x93, + 0x9e,0x9e,0x74,0x89,0x78,0x2a,0x3a,0x6b,0x92,0x71,0xb3,0xef,0x91,0x3a,0xbc,0x9a,0x84,0x4a,0x3d,0x9d, + 0xa3,0x0e,0x8c,0x29,0xaf,0xf0,0x42,0x09,0xf0,0x30,0x1c,0xe0,0xca,0x82,0xc8,0x81,0x5e,0x18,0xba,0xbd, + 0x40,0x7a,0x71,0x98,0xf5,0xbf,0x40,0x9e,0x6a,0x83,0xba,0x72,0x63,0x2e,0xd3,0xaf,0x51,0xf3,0xdf,0xc3, + 0xee,0x7e,0x07,0x88,0xa2,0x14,0xfd,0x58,0x32,0x9f,0x13,0x31,0x38,0x73,0x4a,0x1f,0xa3,0xf5,0x1d,0x4f, + 0x62,0xb4,0x60,0x9b,0xc1,0x51,0x29,0xae,0x2e,0x0e,0x1e,0x5f,0x60,0x0b,0xf7,0xcc,0x92,0xcc,0x9c,0xde, + 0x4e,0x15,0x13,0xa0,0xab,0xb3,0x62,0xaf,0x38,0x1f,0xaa,0xfa,0x5c,0x66,0xb4,0x2c,0xcf,0x89,0x48,0x57, + 0x2c,0xcc,0x73,0x92,0x09,0x50,0x45,0xcf,0xf3,0xc6,0xf6,0xa8,0xdb,0x12,0x98,0x58,0xea,0x54,0x7e,0x6f, + 0x5c,0xa3,0xcd,0xb1,0xea,0xa0,0xbd,0x19,0x5f,0x86,0xe7,0xa8,0xa5,0xca,0x41,0x09,0x1f,0xac,0x8c,0x56, + 0xbe,0xc2,0x16,0x11,0x4c,0x43,0xb6,0x53,0x7c,0x8f,0x5b,0xe3,0x3c,0xa8,0x90,0xb1,0xb1,0x4b,0x76,0xd3, + 0x24,0x1c,0x0b,0xa6,0x1b,0xad,0x98,0xce,0x9f,0xb8,0xe6,0x89,0x60,0xca,0x6a,0x12,0x92,0x50,0x0d,0xa0, + 0xab,0x91,0xf1,0x23,0x1c,0x19,0x71,0x32,0xfa,0xb6,0x88,0x0c,0xc1,0x14,0x0f,0x67,0x9a,0xdb,0x8f,0x01, + 0x01,0xb5,0x6e,0xe0,0x1c,0x3d,0x40,0x90,0xfd,0x23,0x7b,0x5a,0x6e,0xe2,0x60,0x47,0x1f,0xa0,0xbb,0xea, + 0x3c,0x72,0xc8,0x9c,0x3e,0x84,0x1c,0xd2,0x06,0x0f,0x29,0x75,0xfd,0xdc,0xd0,0x5f,0x5d,0x3d,0x55,0x90, + 0xab,0x56,0x86,0x4d,0x56,0x1a,0x31,0x30,0xbd,0x49,0x25,0x95,0x46,0x69,0x52,0x49,0xd4,0x74,0x22,0x65, + 0xf9,0x21,0x32,0x45,0x81,0x2b,0x0c,0xf0,0x1c,0x38,0xb1,0xb0,0x8e,0xfa,0xcb,0x39,0x05,0x14,0xff,0x71, + 0x78,0x29,0x9e,0x9b,0x7c,0x40,0xd2,0x8a,0x91,0xc3,0x05,0x6b,0xc7,0x2d,0x43,0x02,0x3e,0x43,0x33,0x09, + 0x62,0x83,0x5c,0x8b,0xd5,0xa5,0x59,0x02,0x45,0x43,0xe9,0xa3,0x4f,0x7a,0x9d,0x32,0xb3,0x1c,0xf9,0x1a, + 0x08,0xaa,0x01,0x2c,0x06,0x1b,0x21,0x53,0xe4,0x9a,0xf5,0x0c,0x70,0xf8,0x74,0x92,0x13,0x6c,0x32,0x15, + 0xf4,0x78,0x38,0x34,0x78,0x3d,0xa0,0xbc,0x5d,0xb6,0xa6,0x47,0xf6,0x0b,0x63,0x35,0x1a,0x9e,0xcb,0x4b, + 0x5d,0x4b,0x95,0xca,0x8f,0xfe,0x6a,0x8d,0x27,0x92,0xf4,0x16,0xc0,0xda,0x80,0x64,0x0d,0xe8,0x75,0x76, + 0x69,0xbd,0xc3,0x8c,0xa4,0x92,0x15,0x80,0x5c,0x49,0x6e,0x16,0x75,0xbe,0xf8,0x18,0xe4,0xdc,0x0d,0x1c, + 0xed,0xb0,0x6a,0xbf,0xff,0xed,0x5f,0xcd,0xfb,0xbf,0xff,0xed,0xbf,0x83,0xbc,0x4f,0x5e,0xad,0xb8,0xf1, + 0x64,0x7c,0x4f,0x58,0x3d,0xee,0xe3,0x39,0x4a,0xec,0x2b,0x36,0xa4,0x64,0x23,0x3d,0x5f,0x66,0x20,0xf4, + 0x83,0xf8,0x4c,0x89,0x4d,0xac,0xac,0xc8,0x1f,0x30,0xb4,0xa0,0x79,0xbc,0xea,0xc4,0x1c,0xe7,0x15,0x49, + 0x37,0x0f,0x50,0x95,0xaa,0x73,0xc2,0x85,0x19,0xb5,0xcc,0x88,0x08,0xc8,0x63,0xa4,0x12,0x4d,0xd6,0xea, + 0x3c,0xc3,0x15,0x08,0xd0,0xa9,0xdd,0xcc,0x9d,0x1b,0x40,0x06,0x9a,0x56,0x57,0xeb,0x13,0xe0,0x9e,0xe5, + 0x5d,0x2e,0x06,0xac,0xa4,0x2d,0x4a,0x81,0xc4,0x4d,0x97,0x28,0x09,0xe2,0x6f,0xde,0x95,0x61,0x92,0xa6, + 0x53,0xa6,0x8d,0x44,0x0c,0x05,0x57,0xa7,0x17,0xb5,0x34,0xa2,0x4c,0x0a,0xa9,0x16,0x4a,0x82,0xe9,0xac, + 0x2c,0x27,0x6b,0x70,0xe3,0x1c,0x68,0xa4,0x2d,0x56,0x57,0x44,0x26,0x94,0x05,0x03,0xdd,0x3f,0x74,0x4d, + 0x2e,0x73,0x77,0x35,0x62,0x5d,0xb8,0x45,0x08,0xd1,0xf4,0xb8,0x41,0x65,0x97,0xd0,0xed,0xa1,0xd2,0x3f, + 0x25,0x46,0x5a,0xe8,0xce,0x68,0xa2,0x98,0xbc,0xcc,0x31,0xaa,0xa4,0xb8,0x24,0x58,0x8a,0xfb,0xb1,0x22, + 0xde,0x5f,0xfc,0x7f,0xff,0x37,0xbe,0xde,0x10,0x6f,0xdf,0x3c,0xc7,0xa7,0xff,0xf4,0xf6,0x39,0xbe,0xca, + 0x64,0x33,0x88,0xf4,0x59,0x1f,0x44,0x36,0xfd,0x84,0xa7,0x3c,0x4a,0xb4,0xed,0x60,0x36,0x41,0x1c,0xd4, + 0x6a,0x13,0xe1,0xf7,0xf2,0x9c,0xfa,0x39,0x9b,0xc1,0xdc,0x82,0x8c,0x66,0xdc,0x35,0x31,0x85,0x41,0x6a, + 0x39,0x5d,0x50,0xab,0x28,0x3f,0x29,0x5a,0x4e,0x48,0xb3,0xc0,0x8d,0x49,0x08,0xe6,0x79,0x27,0x8d,0x8a, + 0xc2,0x8f,0xcc,0xb2,0xf1,0x13,0x35,0xa0,0xc4,0xbf,0xd0,0xcf,0xe8,0xdc,0xd7,0x09,0xe8,0x0c,0x5b,0x8e, + 0x98,0xab,0x35,0xca,0x3c,0x3c,0xa6,0x75,0x48,0xb2,0xbf,0xb7,0x89,0xbd,0xf6,0xce,0xc1,0x6b,0xc3,0x50, + 0xf3,0xec,0x72,0x9a,0x44,0x72,0x02,0x82,0x94,0x05,0x9f,0x86,0x87,0x85,0xf2,0x65,0x6c,0x59,0xaf,0x66, + 0xda,0x35,0x0a,0x20,0x7a,0x46,0x2d,0x92,0x51,0x38,0x67,0x36,0x2f,0x72,0xfe,0xae,0x40,0x8b,0x67,0x6a, + 0x69,0x88,0xda,0xab,0x89,0x43,0x23,0x9b,0xf5,0xad,0x94,0x1c,0xf0,0x9f,0xea,0xfa,0xc0,0x3c,0xed,0xe6, + 0xbc,0xd6,0x7a,0xf8,0xba,0x41,0xcf,0xbc,0x38,0xf1,0xbf,0x94,0xe1,0x42,0x41,0x21,0x4e,0x2f,0x81,0xa2, + 0x3c,0x8f,0xb1,0x33,0xed,0x15,0xa6,0x0c,0x0e,0x64,0x70,0x65,0x54,0x0f,0x16,0x51,0x10,0x55,0x1e,0xe8, + 0xb3,0x89,0xfc,0xaf,0x30,0x92,0x67,0x64,0xe5,0xd5,0x13,0x27,0xec,0x70,0x68,0x07,0xae,0x80,0x52,0x5e, + 0x2a,0x06,0x09,0x61,0xdf,0x53,0x0d,0x64,0x71,0xfc,0xca,0x4f,0x16,0x4a,0xda,0xe7,0xd7,0xc9,0x33,0x6a, + 0x22,0x89,0xdd,0xc7,0x67,0xa8,0x78,0x05,0x20,0x1a,0xf4,0xc4,0x77,0x8f,0xbc,0xbc,0x63,0x12,0xc7,0xb8, + 0x5b,0xa2,0xe6,0x68,0x6c,0xe0,0x2e,0xd1,0xdb,0x0a,0xe7,0xaf,0x29,0xb1,0x39,0xc2,0xb0,0x9e,0x6e,0xc1, + 0xa2,0xcf,0xd8,0x52,0xce,0x0e,0x3f,0x47,0x8a,0x7d,0x69,0x40,0xc1,0xe7,0xd6,0xe9,0x78,0x31,0xb2,0xdf, + 0x67,0x93,0x72,0x3d,0xe9,0x47,0xc1,0x82,0x8f,0x24,0x43,0x52,0x58,0x7a,0xec,0x76,0xc4,0xa7,0xff,0x4d, + 0x8c,0x40,0x46,0xfe,0x28,0xc3,0x54,0xbf,0x80,0x6a,0xfb,0x57,0xa8,0xa9,0x27,0x4e,0x3b,0x46,0x49,0x12, + 0xfa,0x44,0x2b,0xdc,0x0a,0xb5,0x11,0xe2,0x03,0xc6,0xe1,0xf8,0x62,0x15,0xaf,0xc8,0x9e,0x56,0x96,0x0a, + 0x61,0xba,0xda,0xf3,0x68,0x2f,0x66,0x03,0xdf,0x80,0x81,0xbf,0x8a,0x17,0xc0,0x8e,0xbd,0x8c,0xee,0x0e, + 0xa9,0x4a,0x51,0x42,0x5a,0x20,0xa3,0x85,0x83,0x42,0x8d,0xba,0xac,0xe0,0x46,0x2c,0xa2,0x62,0xfc,0x8a, + 0x30,0x74,0x92,0x25,0x61,0x13,0x08,0xe9,0xdb,0x97,0x48,0x07,0xe9,0xee,0x94,0xa9,0x84,0xbe,0x7d,0x40, + 0xa4,0x8d,0x4c,0x83,0x00,0xcc,0xf0,0x22,0xeb,0x5f,0x98,0x1f,0x53,0x59,0xec,0x60,0xf8,0xca,0xfd,0xe8, + 0xa5,0x72,0x3f,0xe2,0x8c,0x21,0xe3,0xda,0x53,0xce,0x1c,0x42,0xba,0x1b,0xb4,0x2b,0x92,0xea,0x86,0xdc, + 0x91,0xb4,0x8c,0x91,0xb7,0x01,0x6d,0xdf,0x51,0xf0,0x87,0xad,0xb3,0x05,0x7f,0x00,0x38,0x7a,0xf9,0x9d, + 0x64,0x2e,0x82,0xef,0x67,0xba,0x60,0xa6,0x96,0x03,0xbd,0xc4,0x59,0x77,0xa2,0x9c,0xaa,0xd8,0x57,0x82, + 0xdc,0xaf,0x5e,0xe0,0x57,0xcf,0x95,0x2b,0x16,0x96,0x19,0xba,0xa7,0x8c,0x92,0xaa,0x2a,0xd3,0xda,0x1f, + 0xb9,0x2c,0xf7,0xcd,0xe2,0x4d,0x21,0xb8,0xe5,0xe6,0xd0,0x39,0xf9,0xa0,0xee,0x89,0xe7,0x04,0x9a,0x59, + 0xee,0xa2,0xc4,0xe6,0x40,0xde,0x35,0xf4,0xa6,0x5d,0x22,0xe3,0xa7,0x64,0x49,0xa5,0x20,0xf1,0xb3,0x6a, + 0x05,0x09,0xd4,0xda,0xee,0x48,0x80,0x86,0x73,0x4a,0xd2,0x6c,0xab,0xf2,0x00,0x46,0xa8,0x90,0x1e,0x23, + 0xe3,0xf2,0x8e,0xad,0x14,0xbc,0xe4,0x4a,0x9b,0x43,0xd2,0x18,0x73,0xb2,0x59,0xee,0xcc,0x62,0x74,0xfa, + 0xd0,0x27,0x55,0x2f,0x78,0x46,0x40,0x7b,0xf3,0xb9,0x76,0x23,0x51,0xeb,0x80,0x28,0x98,0xfb,0x78,0x61, + 0xcc,0x1e,0x57,0x7b,0x0e,0xfc,0x0a,0xa9,0xb7,0x94,0x4f,0x64,0xca,0xc5,0xdb,0x5f,0x54,0x40,0x4d,0x20, + 0x85,0x9d,0xea,0xab,0xdc,0xa1,0x50,0x2a,0x45,0x27,0x54,0xdb,0xea,0x2a,0x91,0x3f,0xa3,0x81,0xeb,0xf6, + 0xd9,0x66,0x8b,0x5f,0xb4,0x44,0x85,0x7d,0x46,0xf5,0xd8,0xab,0xea,0x15,0xcf,0xd4,0x15,0x52,0xd4,0x6c, + 0x83,0x08,0x48,0x1c,0xac,0x20,0x2c,0x07,0x3a,0x01,0x08,0x8a,0x99,0x83,0xf1,0x90,0x3f,0xaf,0x62,0x5c, + 0xe2,0x10,0x31,0x36,0x01,0xe6,0x95,0x59,0x32,0x09,0xb4,0x70,0x8a,0xd0,0x8b,0x51,0x20,0x0d,0x82,0xd8, + 0x8c,0x95,0x07,0x34,0x86,0x24,0x5e,0xa0,0xaf,0x81,0x98,0xf8,0x28,0x27,0xa2,0x5b,0x30,0x39,0x91,0x28, + 0x55,0xbb,0x99,0xa2,0xad,0xe4,0x04,0x52,0x83,0x55,0x90,0xc2,0x5b,0x13,0x05,0x1c,0x5b,0xa3,0xd8,0x86, + 0x38,0xa6,0xbc,0x8b,0xa9,0x3d,0xb5,0x65,0xba,0x41,0x25,0x01,0xc3,0x03,0x6e,0xf2,0x15,0x23,0xd9,0x03, + 0xc6,0x31,0x92,0xc7,0xe9,0x29,0x3a,0x22,0x66,0x78,0x10,0x3d,0xc2,0x0b,0x3d,0x47,0xa4,0x46,0x29,0x9f, + 0xdb,0xec,0xc4,0x6c,0x30,0x44,0x3b,0x34,0xa3,0x8a,0x4b,0xb3,0x9b,0x8c,0x2f,0xf0,0x04,0x79,0x24,0xa0, + 0x1c,0x38,0x19,0xd5,0x39,0x1d,0xdd,0x96,0x73,0x26,0x26,0xa9,0x96,0xda,0x5e,0x46,0x9a,0x2b,0xf2,0x10, + 0xc5,0xbe,0x9b,0xaa,0xef,0x24,0x57,0xb9,0xab,0x62,0x4b,0xe9,0x8e,0x13,0xcd,0x62,0xf4,0xdc,0xa4,0x1f, + 0x53,0xc0,0xca,0x59,0xba,0xb5,0xdc,0x8d,0x55,0x49,0xb2,0xe2,0x2a,0x4a,0x09,0x60,0xca,0xe7,0x1b,0x34, + 0xa4,0xb4,0x07,0x54,0x92,0x6a,0x83,0xf1,0x2a,0xc6,0x78,0x2f,0x3d,0x51,0xb1,0x8c,0xc3,0x59,0xea,0x99, + 0x8e,0xa6,0x71,0xa8,0x14,0xc1,0x53,0x82,0x00,0xf3,0x60,0x1d,0xc3,0xa0,0x7c,0x5e,0x07,0xfc,0x48,0x19, + 0xd4,0x5a,0x23,0x4a,0xa3,0x39,0xcd,0x2c,0x36,0x39,0xf3,0xa0,0x2a,0x7e,0x46,0x12,0x43,0x53,0xf3,0x57, + 0x17,0x01,0xc8,0x1e,0x5a,0x0f,0xaf,0xed,0x11,0xd4,0x3f,0xf7,0x0c,0x95,0xc9,0xfd,0x17,0x7f,0xf2,0x82, + 0x65,0xae,0xdf,0x26,0xfd,0x4a,0x53,0x90,0x92,0x13,0x7d,0xab,0xc8,0xe0,0xa8,0x9a,0xa0,0xb7,0x50,0x70, + 0x95,0xe1,0xdc,0x33,0xb0,0xe2,0xa7,0xca,0x0b,0x07,0x9d,0x33,0x50,0x03,0xae,0xf7,0x8f,0x3c,0xc3,0xde, + 0xb1,0xb8,0xe9,0xee,0x8c,0x21,0x48,0x3f,0xb8,0x04,0xc9,0xb0,0xb9,0xce,0x98,0x71,0x4e,0xd8,0xe0,0xb8, + 0x96,0x53,0x39,0x74,0x6b,0x50,0x96,0x4f,0xdf,0xb4,0x6d,0x96,0xba,0x89,0x50,0x8b,0xc7,0x97,0x12,0x76, + 0x53,0xd6,0x36,0xe1,0xc0,0x2e,0x22,0x2d,0x2f,0x90,0xb3,0x08,0x51,0x58,0x65,0xc5,0x24,0x27,0x41,0xea, + 0x9e,0xc8,0xaf,0xe6,0x7f,0x7d,0x0a,0x02,0x53,0xfa,0x70,0xed,0x20,0xa2,0xf8,0x94,0x30,0x5e,0x28,0x3e, + 0x9a,0x25,0x1c,0xb8,0x87,0xce,0xb5,0x1b,0x04,0xd9,0x3f,0x61,0x05,0xe1,0xc0,0x45,0xce,0xc2,0x96,0x92, + 0xe0,0x8e,0x5c,0x2b,0x51,0x7b,0x43,0xd7,0xac,0x5d,0xa1,0x5f,0xd4,0xd8,0x03,0xef,0x47,0x39,0x80,0xd1, + 0xa1,0x3f,0x8b,0x9b,0x7c,0x43,0xde,0x63,0x92,0x68,0x1b,0x7b,0x90,0xe1,0x16,0x96,0x9c,0xdf,0x91,0x87, + 0x8e,0x98,0xae,0x45,0x0e,0xbe,0xc7,0x24,0xd2,0x10,0xf2,0xb1,0x70,0x43,0xd8,0xb6,0x48,0xd6,0xec,0xc1, + 0xe5,0x7a,0x72,0x99,0xe2,0x17,0x68,0xb2,0xbd,0x10,0xec,0xf1,0xc5,0x70,0x4d,0x49,0x74,0x00,0xca,0x3d, + 0xaa,0x76,0x42,0xfe,0xcf,0xae,0x0b,0xbb,0x2a,0x56,0xef,0x3a,0xbe,0xdc,0x78,0x1a,0x01,0x3f,0xb4,0x0c, + 0x18,0xc0,0x98,0x8c,0x63,0x32,0x85,0x6c,0x2c,0xf0,0x1d,0x91,0xf9,0x13,0x6e,0xf8,0x31,0x7a,0x34,0x13, + 0xab,0x0b,0x5c,0xf2,0x7d,0xe5,0x15,0xab,0xcb,0xa1,0xe9,0x57,0x3e,0xd0,0x0d,0x66,0xa6,0x18,0x85,0x88, + 0x96,0x90,0xee,0x1c,0x69,0x2d,0x96,0xb3,0xe3,0x02,0xb4,0xca,0x2d,0x62,0xac,0x1d,0x7a,0x3e,0x7d,0xcc, + 0xcc,0x2d,0xb4,0xf3,0x1c,0x2d,0x08,0x21,0x91,0x5b,0x00,0x18,0xdc,0x66,0x36,0xc9,0x43,0x8d,0xef,0x61, + 0x07,0xc9,0x96,0xf3,0x01,0x44,0x26,0xf2,0xb4,0xe7,0x02,0xfb,0xe1,0x8b,0xfc,0x29,0x93,0x6e,0x72,0x34, + 0x8e,0xa8,0xaa,0x02,0x01,0x18,0x01,0xb7,0x77,0x2a,0xa3,0x34,0x4e,0xc8,0xaa,0x4a,0x17,0x76,0x21,0x1a, + 0x2a,0xa3,0x40,0x91,0x7a,0x3d,0x21,0x3c,0x10,0x52,0x7a,0x6e,0x4d,0x83,0x52,0x56,0xe9,0x93,0x23,0x2f, + 0xb1,0x56,0x5b,0x6d,0x11,0x80,0x7f,0x12,0x63,0x3a,0xf2,0x54,0x35,0xe8,0xe1,0x12,0x87,0x01,0x63,0x5a, + 0x6e,0x9e,0xd7,0xbc,0x25,0x1d,0x70,0xdc,0x87,0x6d,0x0e,0x56,0xb7,0xe8,0xc6,0xaf,0x7c,0x0b,0x72,0x6d, + 0x24,0x72,0xf1,0x8c,0xbb,0x91,0x94,0x28,0xc2,0x18,0x56,0x05,0xdf,0x92,0x13,0x5c,0x9c,0x09,0xd9,0x30, + 0x64,0xa2,0xcb,0xd0,0xfe,0x8d,0xc6,0x3c,0x9c,0x28,0x60,0x0c,0xba,0x63,0x2b,0x67,0xb7,0x0b,0xa8,0x4b, + 0x66,0x94,0xb9,0x4f,0x16,0x0f,0xa8,0xff,0xfa,0xd7,0x0c,0x5d,0x8f,0xfe,0xcb,0xfb,0xf7,0xe6,0xf6,0x05, + 0x82,0x6a,0x7c,0x46,0x62,0xb4,0x19,0x47,0xad,0xb1,0xfa,0xf5,0x94,0x03,0xc1,0x35,0x2f,0x4c,0xa0,0xa8, + 0x4b,0x5f,0x28,0xef,0x3e,0xfa,0xa6,0xa4,0x06,0x94,0x49,0x65,0x33,0xc4,0x65,0x7c,0x8f,0x9c,0xc8,0xea, + 0xd7,0x99,0x72,0x9a,0x35,0x56,0x1d,0x44,0xba,0xd5,0xaf,0xec,0xdb,0xa1,0xfb,0x51,0x06,0x83,0xd5,0xaf, + 0x9b,0xb5,0x29,0xe4,0x7a,0xef,0x64,0x86,0x9e,0x17,0x09,0xfe,0xd0,0x99,0xb8,0xfa,0x55,0xbe,0x89,0x79, + 0x71,0x01,0x0f,0x79,0x7d,0xa1,0xec,0x85,0x71,0x2c,0x24,0xea,0xad,0xfd,0xae,0x7e,0x05,0xa9,0x67,0xbe, + 0x49,0x99,0x29,0x9d,0x73,0x8c,0x0a,0x14,0x9e,0x90,0x6c,0x4a,0x0a,0x79,0x5e,0x40,0x55,0x55,0xab,0xfa, + 0xd5,0xea,0x24,0xd6,0x2b,0x2a,0x32,0x8b,0x7a,0x85,0x53,0x70,0x8d,0x1a,0x25,0x7a,0xf0,0x8a,0x7a,0xc6, + 0xbf,0x8c,0x13,0xe4,0xb3,0xf8,0x9e,0x3c,0x16,0xd5,0x2d,0xee,0xfb,0xfb,0xb7,0x6a,0x0f,0x99,0x11,0x81, + 0xd2,0x2b,0x96,0x53,0xb3,0xab,0x27,0x40,0x88,0x50,0x13,0x89,0xb2,0xd2,0xea,0x52,0x60,0x79,0x5e,0x8c, + 0xde,0xb6,0xfe,0x99,0x34,0x58,0x89,0x4f,0x5d,0xcb,0x53,0x40,0x0e,0xb8,0x00,0x8f,0xdc,0x58,0x9a,0xa1, + 0x42,0x7e,0xe6,0x5f,0x92,0xe7,0xa2,0xa6,0xe3,0x14,0xca,0x21,0x75,0x05,0xdc,0x1e,0xd8,0xc6,0x68,0x86, + 0x9e,0x91,0xec,0x5c,0x99,0x5d,0xbd,0x89,0x9f,0xe0,0x44,0x28,0x9a,0xc0,0x79,0x99,0x1e,0x12,0xe2,0x13, + 0x2b,0xcd,0x47,0x0d,0x16,0x1a,0x97,0xe8,0xf7,0xf6,0x78,0xb4,0xeb,0xa1,0x4f,0x33,0xd1,0xe7,0xaa,0x61, + 0x6c,0xcf,0xc8,0x09,0x10,0x97,0xe6,0x2d,0x22,0x0b,0xf2,0x49,0x11,0x3a,0x55,0xea,0x02,0x85,0x84,0xc4, + 0xd1,0xbc,0x7a,0xfa,0x84,0x51,0x8a,0x89,0x1c,0x1d,0x53,0xb4,0x7e,0x17,0x28,0xc7,0x7a,0xe2,0x69,0x8e, + 0x80,0x9a,0x8f,0xce,0x80,0x4c,0x86,0x9c,0x31,0x10,0x08,0xe1,0x19,0x1e,0x22,0x4c,0x53,0x98,0xfc,0xfa, + 0x17,0xa4,0xfb,0x59,0x47,0xa7,0x98,0x84,0xbc,0xf6,0x9a,0xd1,0x1c,0x33,0x92,0xeb,0x42,0xe8,0xff,0x59, + 0x8c,0xc2,0x6c,0x9a,0xeb,0xc0,0xe7,0xec,0x62,0xa9,0x5d,0x01,0xd7,0xd1,0x2b,0x39,0x03,0x2c,0x81,0xe1, + 0x21,0xdf,0x13,0xd1,0xb8,0xd3,0xef,0x61,0x51,0xd5,0x60,0xd1,0x5f,0x60,0x1d,0x7d,0x8f,0x8c,0x1a,0x2e, + 0xc1,0x9a,0x67,0xb8,0x8e,0x1e,0xf9,0xb3,0x0f,0x94,0xb0,0x9c,0xa4,0x05,0x7b,0xa8,0x5a,0x21,0xa0,0x3e, + 0x02,0x8e,0x92,0x16,0xce,0xb3,0xdd,0x19,0x31,0x12,0xbf,0xb8,0xb0,0x4f,0x17,0x20,0xe6,0xa9,0x45,0xff, + 0x5e,0x5c,0xbc,0x50,0xc7,0x5c,0xee,0x56,0xcc,0x6e,0x6f,0xa9,0xd6,0x82,0x21,0xfd,0x9b,0xfa,0x61,0x30, + 0x31,0x1e,0x99,0xf0,0xde,0xf3,0x75,0x00,0x22,0x02,0x9a,0xa5,0xcd,0x2d,0xd2,0x62,0x3a,0x59,0xd0,0x82, + 0x4d,0x7b,0x86,0x3e,0x36,0x39,0xd5,0x53,0x61,0x53,0x0e,0x91,0xc2,0xf7,0x28,0x63,0x02,0xbe,0x4c,0xee, + 0xa0,0x8a,0x1a,0x92,0xe7,0x6d,0x03,0xf5,0xd9,0x70,0x77,0x69,0x69,0x2f,0xb4,0xcb,0x7e,0xbe,0xeb,0xfa, + 0x7d,0xcd,0xfb,0x2a,0x79,0x83,0x5a,0x18,0x33,0x4f,0x45,0x3e,0x53,0x92,0x77,0x51,0xf1,0xf2,0x71,0x12, + 0xe8,0xac,0x4b,0xa4,0x2b,0xe7,0x76,0x71,0x87,0x82,0x08,0x5d,0xbd,0x92,0x73,0x46,0x7c,0xbe,0x22,0xef, + 0x6a,0xe2,0x78,0xdf,0xd2,0x2f,0x42,0x11,0x81,0x37,0x17,0xe3,0xc6,0x03,0xa3,0x94,0xda,0x3b,0x4e,0xa2, + 0xa1,0x4f,0x30,0x1b,0xf1,0x60,0xc8,0xa5,0x90,0x5f,0xf4,0xf4,0x9b,0x3f,0x84,0x7e,0x74,0x05,0xf4,0x88, + 0x7f,0xc5,0xfb,0xc7,0xad,0x56,0x5b,0x3f,0x3b,0xa1,0xfc,0xef,0x1d,0x63,0x00,0xed,0x08,0x74,0xe6,0x54, + 0x31,0x8c,0xaa,0x0a,0xfb,0xa4,0x98,0x61,0x61,0x1a,0x34,0xb6,0x69,0x35,0x95,0xd7,0xa3,0x35,0xa2,0xdc, + 0xd8,0x0f,0x73,0xfc,0x81,0x08,0x1b,0x87,0x85,0xd5,0x1a,0xf1,0x3a,0xd3,0xd6,0x31,0x66,0xd2,0x59,0x88, + 0xae,0x35,0x2e,0x00,0x0f,0xd0,0x73,0xec,0x31,0x6f,0x00,0xde,0x9a,0x98,0x0b,0x04,0xf1,0x19,0xf2,0x6d, + 0x69,0x88,0x7f,0x9b,0xf9,0x5a,0x73,0x01,0x52,0x07,0x34,0xf8,0x91,0x9b,0x5c,0x90,0x91,0x07,0x10,0xef, + 0xdb,0xa3,0x8c,0x64,0x15,0x0c,0x8c,0x4e,0x75,0x01,0x1e,0x4c,0xcb,0xcb,0x14,0xfd,0x70,0x55,0xda,0x7e, + 0xa1,0x3e,0xb2,0xb1,0x49,0xd4,0x01,0x1e,0xcd,0x10,0x96,0x55,0x94,0xa5,0x2e,0x78,0xa1,0xfd,0x36,0xd8, + 0xb1,0xa2,0x21,0xce,0x31,0x4d,0x3f,0xb3,0x20,0x14,0x9a,0x29,0x40,0x88,0x9b,0x5d,0xb0,0x4f,0x32,0xbe, + 0xa4,0xcc,0x19,0xfc,0x4b,0x9b,0x68,0x4a,0x11,0x8a,0x80,0x79,0xbe,0x34,0x7a,0x02,0xc3,0xc2,0xa9,0xf3, + 0x30,0x48,0xa7,0x80,0xf9,0xf0,0xd7,0xdc,0xa2,0x07,0x5f,0x4e,0x4a,0x30,0x6a,0xd6,0xab,0xdd,0x00,0xaf, + 0x38,0xbe,0xde,0x33,0x2e,0xf4,0x69,0xb0,0x90,0x80,0xe8,0x50,0xdc,0x7c,0x02,0xa7,0x23,0x40,0xa5,0x98, + 0x7f,0xfa,0xf7,0x44,0xbc,0x86,0x3d,0xdb,0x00,0x48,0x92,0x37,0x88,0x38,0x3d,0xc3,0x01,0xc9,0x7d,0x62, + 0x42,0xe9,0xbe,0x79,0x4a,0xcc,0x54,0x31,0x20,0x14,0xb0,0xf3,0x4c,0x82,0xe4,0x2c,0xd4,0x63,0xf1,0x03, + 0x3a,0x15,0x0b,0x2c,0x42,0xad,0x73,0x28,0xa1,0xbf,0x7d,0x02,0x43,0x9b,0x85,0xc0,0x50,0x6e,0x4e,0xc0, + 0x1a,0x5c,0x6d,0x60,0xf4,0x0b,0x59,0x8a,0x0f,0x7d,0xf5,0xe9,0xef,0x9b,0x79,0x56,0x0a,0x0f,0x05,0x7a, + 0x01,0x38,0x79,0x96,0x61,0xb0,0xb7,0x15,0x1e,0x8a,0xbd,0xc2,0x26,0x2c,0x61,0xfd,0x61,0x71,0x17,0x72, + 0x62,0x1a,0xb4,0x02,0x44,0x53,0x81,0xde,0xb9,0x26,0x32,0x94,0x06,0xa0,0x62,0x43,0x01,0x74,0xe0,0x64, + 0x8e,0xcc,0x5b,0x1c,0x24,0x4a,0xad,0x5e,0x6d,0x04,0xe6,0x22,0xa3,0x00,0xd1,0x9f,0x24,0xf4,0x2f,0xd1, + 0x91,0x99,0x83,0x8a,0x7f,0xda,0xac,0xc4,0xcb,0x68,0xe9,0x03,0x1d,0x49,0xd7,0x08,0xb7,0xd8,0x80,0x09, + 0x2c,0x7e,0xe1,0x6f,0xd6,0x59,0x39,0xb0,0xf8,0xd3,0xbf,0xa2,0x4e,0x13,0x27,0x62,0x45,0x16,0x9f,0x44, + 0x57,0x40,0x6f,0xe4,0x9d,0x23,0x8b,0x23,0x27,0xb2,0x78,0x7b,0xc8,0x6a,0xf3,0x5d,0x45,0xc8,0xea,0x93, + 0x00,0x2d,0x54,0xc4,0xc8,0x63,0xef,0xc6,0xd9,0x3b,0x42,0x0f,0xe4,0x20,0xf2,0x69,0x8f,0xfc,0xcd,0x1c, + 0xb0,0x76,0x25,0x9e,0xe8,0x80,0x55,0x9c,0xf4,0x0f,0x2b,0xa0,0xf2,0x59,0x80,0x7a,0x60,0x8a,0x5d,0xbd, + 0x0a,0xe4,0x92,0x20,0xc1,0x8e,0xc2,0x7c,0x41,0xdc,0xe1,0x22,0x29,0x07,0xae,0xbe,0x82,0x46,0xe1,0xcd, + 0x99,0xbf,0x91,0xc9,0x12,0xe8,0x3c,0x6e,0x4c,0x43,0xc0,0xaa,0x50,0xbf,0x08,0x5a,0xb0,0x44,0x22,0x0a, + 0x64,0xa9,0xf7,0x52,0x00,0xab,0x24,0x60,0x08,0x30,0x1f,0x97,0x13,0xc3,0x4a,0x80,0x02,0xe4,0xea,0x91, + 0x8c,0x36,0xd9,0x15,0x20,0x06,0xc6,0xb2,0xfe,0xef,0x27,0xaa,0xb2,0x8c,0x7e,0xff,0xdb,0xbf,0x42,0x07, + 0xab,0x55,0x46,0xc0,0x8c,0x8b,0x00,0xa4,0x56,0xe2,0x84,0xf1,0x34,0x82,0x9e,0xdf,0x99,0x80,0x56,0x5d, + 0x88,0x3a,0xfb,0x7c,0x4a,0x38,0x34,0x37,0xb4,0xd5,0xb4,0x5d,0x0a,0x6e,0xb5,0x9e,0xe4,0xe1,0xad,0xff, + 0x24,0xb3,0x2b,0x3c,0x5f,0x68,0xe3,0x23,0x13,0xe4,0x7a,0x86,0x9d,0x52,0x1b,0x76,0x94,0xeb,0x95,0x7a, + 0xdd,0x8d,0x73,0xfd,0x8e,0xc6,0x6e,0x0d,0xaa,0xa9,0xf0,0x3e,0x8f,0x75,0xfd,0x4e,0x4f,0xcf,0x0e,0x77, + 0x7d,0x27,0x03,0xd8,0xae,0x79,0x1c,0x22,0xc4,0xd9,0x41,0xaf,0x20,0x1b,0x20,0x66,0x66,0x6e,0xd8,0x2b, + 0x37,0xea,0x86,0xbd,0xd2,0x6f,0x29,0xea,0xd5,0x0e,0x7a,0x7d,0x2e,0x57,0xd0,0x37,0x19,0xb4,0x1f,0xf9, + 0xc0,0x73,0xe0,0x40,0x1a,0xb4,0xb4,0x04,0x58,0x52,0xd3,0x28,0xb1,0xc6,0xf5,0x5d,0x71,0x62,0xc5,0x20, + 0x9b,0xd0,0x86,0x11,0x30,0xed,0x8e,0x7d,0x35,0xb4,0x49,0x77,0x9d,0x87,0xbf,0x7e,0xfa,0x77,0x44,0xb1, + 0x75,0xb2,0x61,0x8c,0xb4,0x82,0x60,0x9f,0xf8,0xa9,0xea,0x57,0xa0,0x7e,0x62,0x46,0x18,0xf0,0x0e,0xf5, + 0x05,0xb0,0x9f,0xe9,0x42,0x62,0xf6,0x03,0xe8,0x5b,0x3c,0x05,0x16,0x2c,0x94,0xc1,0x24,0xe3,0x9d,0x4f, + 0x0c,0x38,0x38,0xe1,0xb0,0xdc,0x3f,0x92,0xe1,0xc8,0x09,0x89,0x35,0x88,0x05,0x1c,0x33,0x01,0x18,0xac, + 0xeb,0x14,0xc9,0x04,0x1c,0xb9,0x08,0x3a,0x70,0x50,0x7d,0xfa,0x3b,0x32,0x1f,0x4b,0x44,0xa0,0xb7,0xa1, + 0x9f,0x5d,0x35,0x18,0xe6,0x81,0xef,0x21,0xbd,0x09,0xce,0x0e,0xe0,0x1f,0xb3,0xc1,0x70,0xfb,0x82,0x9a, + 0x08,0xa6,0x67,0xc0,0x21,0x3d,0x92,0xc1,0x4a,0x44,0x9f,0xfe,0x3e,0x5d,0x62,0x92,0x04,0x81,0x9b,0x87, + 0x08,0x3c,0x5d,0xa2,0x43,0x5b,0x1a,0x48,0x05,0xc9,0xe5,0x38,0xd9,0xa6,0xb5,0xf1,0xd8,0xe0,0x9a,0xe8, + 0x59,0x92,0x59,0x31,0xb3,0x6f,0x50,0x99,0xf4,0x83,0x52,0x8a,0xa0,0x61,0x86,0x80,0xd6,0x8a,0x9a,0xd5, + 0xcf,0x2e,0x64,0x32,0xa3,0x61,0xad,0x93,0x4f,0xff,0x3e,0xcf,0x2a,0x03,0x67,0xf1,0x73,0x95,0x40,0xdd, + 0x31,0xd7,0xa7,0x1d,0x39,0x0b,0x30,0xbe,0xc1,0x6f,0x37,0xe4,0x61,0xb3,0x27,0x80,0xe6,0x8a,0xf8,0x2c, + 0xe4,0xa7,0xbf,0x23,0x7c,0x64,0x4e,0xe4,0xec,0x4b,0xf2,0x22,0x81,0x25,0x41,0xb4,0x5e,0xc9,0x65,0x52, + 0x68,0xdb,0x8e,0x9b,0x6d,0xbe,0xc5,0x11,0xc1,0xde,0xab,0xea,0x6e,0x4d,0x1d,0x3f,0xab,0x22,0x46,0x01, + 0x37,0x37,0xc0,0xac,0xa6,0x1a,0x3d,0x55,0x18,0xed,0x49,0x88,0x42,0x32,0x9a,0x00,0x54,0x3d,0xed,0xdd, + 0x91,0x57,0x53,0xc1,0xb4,0xbc,0xd7,0xd8,0xad,0x8a,0x3c,0x73,0xaa,0x7e,0x2b,0xbe,0xcb,0xa3,0x69,0xb9, + 0xa9,0xe6,0x53,0xac,0x00,0xf3,0xe7,0xd3,0x9a,0xc0,0x0c,0xcf,0xd4,0x84,0x00,0x24,0x2a,0x84,0xd6,0x3e, + 0x01,0xe8,0x11,0x8f,0x31,0xb4,0xf6,0x62,0x03,0x0b,0x0e,0x22,0xe4,0x19,0x30,0x3c,0x66,0x91,0x4c,0x78, + 0x2d,0xf6,0x46,0xc8,0x65,0x8f,0xc4,0x87,0x59,0x5c,0x6d,0xd2,0x4f,0x7f,0xcf,0xae,0x42,0xdc,0x69,0x3d, + 0x9b,0x86,0xd8,0x20,0x2b,0x46,0x94,0x21,0x99,0x48,0x38,0x15,0xe1,0x94,0x43,0xee,0xc9,0x0c,0x80,0x23, + 0x6e,0x4f,0xb5,0xd5,0x02,0x64,0x37,0x6b,0xa1,0x2a,0x43,0x6f,0xed,0xe7,0x6e,0xfc,0xed,0x89,0xb5,0xc4, + 0x34,0x44,0xde,0xe9,0xa6,0xae,0x41,0xa3,0x51,0x6b,0xa3,0xa1,0x0b,0xc6,0x63,0xc8,0x80,0x15,0x8b,0x4b, + 0xe8,0xab,0x06,0x45,0xcb,0x61,0x2d,0xc4,0x29,0x02,0xab,0x40,0x96,0x06,0x83,0xcc,0x2d,0x30,0x2e,0x46, + 0xe5,0x3e,0x29,0xac,0x12,0x22,0x1c,0x9e,0xc7,0xb0,0x02,0x80,0x57,0x2f,0x24,0x1a,0x00,0x50,0x5b,0xc4, + 0xe0,0x6d,0xda,0xc7,0xea,0xdc,0x45,0xaa,0x7a,0x29,0x06,0xeb,0x1a,0x8a,0xc4,0x1d,0x37,0x5f,0xe6,0x41, + 0xbb,0x0c,0x34,0x4e,0xc8,0x2e,0xf6,0xff,0xe9,0x1f,0x20,0x31,0x46,0x19,0x6e,0xce,0x06,0x39,0xcb,0x3c, + 0x70,0xd7,0x01,0x12,0x2b,0x7a,0xd7,0x05,0x1e,0x20,0x09,0xb0,0xf3,0x9f,0xfe,0x4d,0x55,0x31,0x2e,0xe1, + 0x6e,0x2d,0x83,0xaa,0x34,0x27,0x37,0xa6,0x97,0xc0,0xd7,0xd0,0xc4,0x49,0x20,0x91,0x46,0xf1,0x2c,0x9c, + 0x46,0x9c,0xe8,0x5e,0xb7,0x79,0x8b,0x90,0x00,0x53,0x4f,0x1b,0x8c,0xa7,0x29,0xed,0x0f,0x2c,0x13,0x3e, + 0xa7,0x90,0xdf,0xac,0x10,0xf2,0x7b,0xaa,0xd4,0x02,0x30,0x3c,0x3c,0xb1,0xf2,0x98,0xdf,0x27,0x40,0x08, + 0xad,0x2e,0xd2,0xe6,0x77,0xf1,0x1a,0xd9,0x00,0x3d,0x4c,0xa6,0x91,0xcc,0x29,0x3c,0x93,0xcb,0x10,0x19, + 0x53,0x20,0x10,0xec,0x1a,0x8f,0x70,0x8c,0xfc,0x5f,0x1e,0xf6,0xab,0x06,0x17,0x99,0xd8,0xdf,0xe7,0x2e, + 0xe5,0xa3,0x08,0x60,0xba,0xb5,0x62,0x80,0x4f,0x26,0x93,0x44,0x32,0xf5,0xa3,0x30,0xe0,0x57,0x9f,0xfe, + 0x91,0xf2,0x2d,0xdb,0x70,0x1e,0x49,0x9f,0x30,0x47,0x46,0x56,0x38,0x30,0xec,0x28,0x4c,0x66,0x8e,0x65, + 0x96,0x1d,0xcf,0x5a,0x1f,0x29,0x3e,0xfd,0x4f,0x08,0x4e,0xe6,0x60,0xe2,0xd8,0x60,0x62,0xe4,0xc5,0xc5, + 0xa7,0xbf,0xc3,0x5c,0x22,0x37,0x3a,0xd8,0xa2,0x8c,0x9a,0x51,0xd0,0xee,0x35,0x2f,0x00,0xe0,0x68,0x47, + 0xed,0x18,0xe1,0x25,0x14,0xaa,0x8d,0xce,0xc3,0x84,0x35,0x5f,0x47,0xe4,0x10,0x4a,0x70,0x34,0x44,0x0e, + 0x55,0xa4,0x30,0x2c,0xf6,0x83,0x93,0x4d,0xea,0xc6,0x0a,0xbf,0x80,0xd5,0x0f,0x16,0x00,0x0a,0x99,0x15, + 0x2b,0xfc,0x63,0x9c,0xc0,0x3c,0x60,0x1c,0xb8,0xc7,0x76,0xb0,0xb0,0x3a,0x8d,0xb8,0xd8,0x04,0x0c,0x03, + 0xf7,0x05,0x88,0x98,0x60,0xbf,0xc1,0x62,0x43,0xa1,0xfb,0x39,0xc0,0x5a,0x71,0xc3,0xa5,0x7a,0x74,0xda, + 0x85,0x31,0x1e,0xc6,0x26,0x7a,0xd8,0x04,0x0e,0x8b,0x34,0xdf,0x52,0x0a,0x21,0x7e,0xfe,0xf2,0x19,0xb2, + 0x63,0x91,0x5c,0xae,0x64,0x64,0x45,0x11,0xc3,0xe2,0x45,0xfe,0x92,0x4c,0x10,0xc8,0xd6,0x44,0x0d,0x74, + 0x07,0xb2,0xdf,0x76,0x82,0x89,0x9b,0x30,0x39,0x3c,0xa6,0x37,0xfb,0x47,0x13,0x37,0x4f,0x28,0x98,0x58, + 0x9a,0x68,0xe2,0x57,0x27,0x6f,0xf2,0x68,0x62,0x64,0x73,0xaf,0x68,0xfd,0x74,0x3c,0x71,0x80,0x9c,0xc4, + 0xce,0x88,0x62,0x44,0x3d,0x0c,0x90,0x35,0xdc,0x49,0x2a,0x1e,0x51,0x54,0xb1,0x8a,0x28,0x9e,0x81,0x60, + 0x0d,0x7f,0x52,0x2b,0xa0,0xf8,0x25,0x79,0x3c,0x40,0x5f,0xe9,0x1a,0x04,0x77,0x5c,0x00,0x13,0x5b,0x7c, + 0x72,0x76,0xb6,0xb1,0x02,0x8b,0x61,0x79,0xd3,0xec,0xd3,0xdf,0x93,0x33,0x59,0x8e,0x2c,0x56,0x81,0xc5, + 0xaf,0x40,0xea,0x9a,0x4b,0xa0,0x73,0x84,0x92,0x2a,0xb6,0x58,0x1d,0xd8,0x6a,0x77,0xad,0xe0,0x62,0xe2, + 0x99,0x34,0xeb,0x61,0x02,0x8c,0x37,0x99,0x8e,0x2f,0x5e,0x7d,0xfa,0xfb,0xa7,0x7f,0x0b,0x16,0x3a,0xc4, + 0x18,0x56,0xf7,0xc2,0x47,0x7f,0xb3,0x3c,0xca,0xf8,0x29,0x60,0x0c,0x7e,0x3f,0x33,0xb3,0xc3,0x8c,0x41, + 0x94,0x95,0x09,0xf3,0x8a,0xcc,0xa1,0x99,0x08,0xbf,0x15,0x3e,0x62,0x26,0x8a,0xa4,0xde,0xbc,0xca,0x29, + 0x36,0x43,0x94,0x4b,0xa0,0x13,0xcd,0x26,0xf4,0x31,0x3b,0x00,0xd0,0xed,0x77,0xf1,0x92,0x28,0x0c,0x2c, + 0x2a,0xca,0x7f,0x8f,0x40,0x74,0x40,0x34,0x60,0xba,0x1e,0xb9,0x81,0xc7,0x16,0x65,0xf0,0x90,0x04,0x89, + 0x37,0x72,0xc3,0x71,0xb0,0xc8,0xc8,0x45,0x9f,0xfe,0x01,0xe0,0x89,0x7b,0x80,0x0d,0x61,0xd7,0xdf,0xd9, + 0xb1,0xc7,0x78,0x4e,0x9e,0x65,0x6e,0x04,0x32,0x33,0xf9,0x48,0x05,0x99,0x06,0x46,0x56,0x20,0x32,0xf0, + 0xed,0x30,0x77,0x8c,0x28,0x4e,0xc9,0xb2,0xc7,0xa0,0x6b,0xa2,0x90,0x4d,0xd7,0x4c,0x53,0x79,0x7e,0xe1, + 0xa7,0xbf,0xcf,0x32,0x13,0x83,0x9c,0x22,0x97,0x28,0x37,0x4e,0x14,0xb2,0x7e,0xcd,0x8e,0x43,0x86,0x99, + 0x10,0x6e,0x21,0x31,0x45,0x06,0x3d,0x1d,0xe3,0x69,0x36,0xc1,0xc8,0x67,0x4d,0x5c,0x36,0x24,0xd8,0xd3, + 0xbc,0x90,0xb0,0xae,0x04,0x82,0x72,0x1e,0x8b,0xac,0x19,0xc1,0x3c,0x1a,0x19,0x4b,0x0a,0xa1,0xc8,0x6f, + 0x60,0xb2,0xb0,0xd4,0x67,0x78,0x2c,0xcf,0x37,0x3c,0x21,0x15,0x8e,0x0c,0x94,0x3d,0xa3,0x13,0xae,0x22, + 0x14,0xd9,0x1c,0xfa,0xb8,0xab,0x3f,0x6d,0x80,0x79,0x9b,0x9e,0xa5,0x52,0x1d,0xfe,0x79,0x44,0xb2,0x9e, + 0x98,0xbd,0xfe,0x36,0x69,0x8d,0x68,0xc8,0x05,0xee,0x0a,0xb7,0x84,0xda,0xd1,0x91,0xc9,0x06,0x92,0x96, + 0x9a,0x7a,0x6e,0x0d,0x4e,0x56,0xe3,0xca,0x83,0x93,0x2d,0xde,0xd8,0xb0,0xc6,0x4e,0x74,0xf2,0x33,0x74, + 0x99,0xdc,0x1e,0x9a,0xcc,0x63,0x26,0xb6,0x12,0x5a,0x50,0xa4,0xa5,0x14,0x9c,0xec,0x32,0xac,0x26,0x3c, + 0x59,0xf1,0x14,0x86,0xb7,0x9d,0xc3,0xc1,0xc7,0x54,0xd2,0xc7,0xe3,0x59,0x3c,0x0a,0xc8,0x03,0x60,0x0d, + 0xcc,0x1e,0xca,0x11,0xcc,0x06,0x9d,0x2b,0x9e,0x25,0x2a,0x07,0x2c,0xa7,0xe2,0x15,0x47,0x2b,0x23,0x1a, + 0x71,0xb8,0x32,0x00,0x43,0x34,0xc7,0x29,0x44,0x82,0x24,0x28,0xc6,0xac,0x48,0x68,0x4d,0x91,0x1f,0x61, + 0x77,0xa8,0x48,0x21,0xb1,0x86,0xcf,0x91,0x6c,0xbf,0xae,0x0b,0x81,0xcb,0x6f,0x8a,0x81,0xcb,0x15,0x12, + 0x83,0x1d,0xb9,0xec,0x72,0x65,0xf7,0x0b,0xec,0x78,0x31,0x86,0xd9,0x6c,0x32,0x71,0xae,0x4b,0xf5,0xae, + 0xcd,0xff,0xb8,0xc1,0xcc,0x85,0xfa,0xf9,0x11,0x5a,0x8e,0x69,0x46,0xde,0xc4,0xb8,0xc1,0x6a,0x12,0x94, + 0x9a,0xdd,0x64,0x3a,0xc1,0xd2,0x1b,0x52,0x19,0x58,0x45,0xc0,0xdb,0xdb,0x96,0x88,0x75,0x0c,0x08,0x1c, + 0xcc,0x09,0x60,0x9c,0x33,0x80,0x70,0x0e,0xa3,0x5b,0x02,0x9e,0xb7,0x43,0x03,0xc8,0xaf,0x8a,0x01,0x23, + 0xa2,0x6f,0xcf,0x49,0x0f,0xa6,0x7a,0x9f,0xd8,0x58,0x86,0xa4,0xaf,0x80,0x06,0x48,0x7a,0xe0,0x6c,0x50, + 0x33,0x4a,0x9d,0x30,0x68,0x17,0xe7,0xae,0x6c,0x14,0x76,0x62,0xa2,0x4f,0x89,0x1a,0x2a,0x5d,0x57,0x01, + 0x53,0x51,0xd3,0xa3,0x39,0x42,0xdd,0x84,0x38,0xd0,0x24,0x45,0x49,0xe3,0x4e,0x88,0xf4,0x07,0x28,0x4f, + 0xa5,0xcb,0x27,0xe7,0x71,0xd2,0xcc,0xb0,0x41,0x6f,0xaf,0x5e,0x3d,0x3d,0x15,0x07,0x48,0x1b,0x1a,0x42, + 0x69,0x4c,0x1b,0x2e,0x6f,0x5b,0x47,0xa5,0x56,0x02,0x27,0x03,0x1e,0x8e,0x8a,0x01,0x31,0xa1,0xcf,0xd0, + 0x41,0x86,0xd9,0xb2,0xa2,0x3c,0x62,0xfa,0x24,0x44,0x8b,0x7c,0x98,0x73,0x84,0xa5,0x78,0xe9,0x34,0x23, + 0xd5,0x12,0xc3,0x00,0xe1,0x92,0x44,0xc3,0x9f,0x15,0x36,0xcd,0x0c,0x27,0xf6,0x74,0x5f,0x7c,0x20,0x71, + 0x1d,0xdd,0xf0,0xd5,0x90,0xdc,0x18,0xea,0x13,0x3c,0x64,0x89,0x39,0x84,0x5d,0x60,0x75,0xa3,0x24,0xd1, + 0x0e,0x23,0xaa,0x97,0x0e,0x62,0x10,0x1c,0xb1,0xc2,0xd6,0xb4,0x8f,0x2b,0xc4,0x8c,0x41,0x31,0xb6,0xda, + 0xed,0x57,0x46,0xc5,0x20,0x6b,0x84,0x82,0xab,0xcd,0x39,0xfa,0x39,0x71,0x15,0x24,0xd2,0x1c,0x12,0xdb, + 0xc4,0xb8,0xdc,0x62,0xd3,0xda,0x59,0x2c,0xef,0xda,0x6e,0x39,0x0f,0xb7,0x56,0x51,0xb5,0xce,0xd0,0x0b, + 0x31,0xd7,0x30,0x67,0xc5,0x0e,0x37,0x28,0x70,0x1f,0xd7,0x4f,0xa4,0x71,0x18,0x2a,0x0e,0x88,0xba,0x37, + 0x8c,0x9c,0x1b,0x7b,0x7d,0xea,0xaf,0x56,0x2a,0xc9,0x4e,0x21,0xee,0xba,0x40,0x09,0xf2,0xe0,0xeb,0xd7, + 0x78,0x14,0xa2,0x32,0x25,0xe5,0xd5,0xfb,0x8e,0x03,0xaf,0x51,0x95,0xc2,0xa3,0xb0,0x23,0xb0,0xa5,0x15, + 0x82,0x4d,0xfc,0x9e,0x1d,0x82,0x5d,0x90,0xdb,0xf6,0x88,0xc3,0x8e,0x2a,0xe3,0xb0,0xa3,0x1d,0x71,0xd8, + 0x5a,0xc7,0x57,0x88,0xc3,0x6e,0x3a,0x6a,0x3d,0x3b,0x1a,0x3b,0xdf,0x91,0x8b,0x8a,0x2d,0x37,0x91,0xd9, + 0x56,0x35,0x4b,0x14,0xb1,0xa3,0xb3,0xed,0xcd,0xb7,0x89,0x53,0x21,0x3c,0x1b,0x89,0x24,0x1d,0xc6,0x27, + 0x11,0x31,0x6c,0xcd,0x27,0x81,0x8f,0xee,0x36,0x67,0xb8,0x75,0xb9,0xd2,0x0c,0x6d,0x17,0x79,0x2b,0xa4, + 0x58,0x2e,0x82,0xa4,0xc3,0xdc,0x81,0x74,0xfe,0x48,0x59,0x7e,0x51,0x70,0x8e,0xd0,0xdf,0xca,0x09,0xd7, + 0xae,0x98,0x27,0x0a,0x9f,0x08,0xb9,0x6e,0xe8,0x36,0x5e,0x6d,0xf0,0x6b,0x11,0x91,0x1b,0xbb,0xfd,0xa1, + 0xf8,0x9a,0x27,0x4a,0x1c,0x9c,0x13,0xba,0xad,0x20,0x90,0x63,0xb7,0xcf,0x51,0x50,0x30,0xc1,0xdb,0x41, + 0x29,0x78,0xbb,0x59,0x11,0xbc,0xad,0x84,0x56,0x3a,0x78,0xec,0x43,0xa7,0x10,0xbd,0x4d,0x22,0xb1,0xaa, + 0x9a,0xd3,0x75,0xfd,0x46,0x55,0x10,0x37,0xaa,0x4a,0x5e,0xf2,0xe7,0x6c,0x22,0x80,0x79,0xf3,0x02,0xaf, + 0x5c,0xa6,0x94,0x02,0x55,0xe1,0xdc,0x51,0x31,0x9c,0xfb,0xbb,0x4d,0x72,0x05,0x38,0x81,0xa1,0x4d,0x32, + 0xcc,0x3e,0xfd,0x03,0xb6,0x6f,0xa7,0xc9,0xc9,0x8a,0xe6,0xde,0x48,0xa1,0x5a,0xfd,0x82,0x78,0xee,0x17, + 0x01,0xf9,0x32,0x2c,0x3f,0xfd,0x23,0xd1,0x83,0x33,0x01,0xdd,0x5a,0x66,0x13,0x6c,0x23,0x8a,0xec,0xa0, + 0x6e,0x4b,0x76,0xf6,0x27,0x46,0x38,0xca,0x43,0xbb,0xad,0xe7,0xce,0xdb,0x2a,0xbc,0xfb,0xbd,0x3a,0xce, + 0x81,0x3f,0x47,0xa7,0x3d,0xdd,0x02,0x9d,0x54,0xea,0x35,0xa5,0x23,0x4e,0xb3,0xcd,0x6a,0x45,0x02,0x83, + 0x52,0xf3,0x46,0xc4,0x4f,0xef,0x8e,0xf0,0x66,0xcd,0x3c,0x74,0x82,0x42,0x94,0x3f,0x91,0x70,0x2e,0x53, + 0x70,0x77,0x93,0xa9,0x38,0x08,0x8f,0x59,0xba,0x26,0x1d,0x44,0xd2,0x7c,0x1b,0x54,0xb4,0x88,0xd6,0x74, + 0x61,0x18,0x65,0x3b,0xd6,0x3b,0x57,0x8d,0x3b,0x3b,0xaa,0x78,0x30,0xe4,0xbd,0x22,0x37,0xde,0x9b,0xcd, + 0x25,0x70,0xaa,0x01,0xe3,0x05,0x73,0x3d,0x8b,0x13,0x0c,0x8f,0x23,0xf3,0x0e,0x65,0xd0,0xcc,0x25,0x66, + 0x3b,0xee,0xfb,0xa9,0xd5,0x85,0x50,0x2c,0x79,0x0a,0x83,0xc3,0xed,0x8d,0xc4,0x02,0x57,0x86,0x7c,0xa8, + 0x97,0x71,0x54,0x19,0xfc,0xfd,0x68,0x83,0x3a,0x03,0x98,0x3a,0x10,0xf9,0x9f,0x28,0xac,0x20,0x42,0x3f, + 0xf0,0x0d,0xfb,0x81,0xaf,0xfc,0x8f,0xc1,0xca,0x0f,0x45,0x6e,0x77,0xb3,0xe2,0xbf,0x79,0xf1,0xd6,0xa4, + 0xad,0xc7,0x83,0x8f,0xe3,0xb5,0x72,0xb1,0xc3,0x04,0x83,0x23,0xe2,0xa0,0xe6,0x98,0xf8,0xb2,0x82,0xfe, + 0xc3,0x13,0xc4,0x3f,0x49,0xa5,0x0a,0xd5,0x6c,0xee,0x39,0x8b,0x46,0x48,0x46,0x70,0x28,0xe7,0x55,0x7a, + 0xbf,0x3c,0x36,0xfc,0x35,0x89,0x4c,0x2b,0xe1,0x6a,0xf3,0x10,0x4c,0xce,0xae,0xe4,0x1a,0x6d,0x64,0xc8, + 0xf7,0x6f,0x88,0xbb,0x7b,0xc3,0xa6,0xa8,0x74,0x22,0x11,0xf9,0xb5,0x5e,0xcd,0x0e,0x15,0xd7,0xad,0xa9, + 0x60,0x3f,0x12,0xd1,0xa2,0x72,0xc4,0x38,0xce,0xea,0x14,0x08,0xe7,0xa7,0x7f,0x87,0x05,0x08,0x8b,0x28, + 0x9e,0xab,0xe3,0x14,0x92,0x8b,0xa7,0x70,0xc8,0x6e,0x26,0x52,0x6f,0x90,0xa2,0xa2,0x0d,0xf1,0x81,0x23, + 0xc8,0x9b,0x6c,0x62,0xb8,0xda,0xe4,0x3b,0xdd,0xd8,0x3e,0xf7,0xaa,0xc8,0x72,0xa5,0x46,0x7c,0x39,0x55, + 0x38,0x13,0xec,0xd0,0xd7,0x57,0x87,0x96,0x57,0xd3,0xab,0xc2,0x89,0x6d,0x26,0xf4,0xe3,0x96,0x81,0x15, + 0x02,0xcd,0xab,0x1b,0x3d,0x77,0xb6,0x2a,0xdb,0xb7,0x51,0xa2,0xd7,0x1f,0x90,0x50,0x17,0x1a,0xd8,0x3f, + 0x02,0xdd,0x48,0xdd,0x08,0x71,0xa4,0x84,0xfe,0x2e,0x8e,0xb2,0x98,0x34,0xe0,0x0c,0xc2,0x44,0x49,0x5d, + 0x5d,0xb8,0x5e,0x83,0xab,0x0d,0xaf,0x01,0x56,0xe1,0xca,0xb0,0x61,0xe7,0x05,0xb0,0xab,0x0a,0x49,0xdf, + 0xd9,0xab,0xe6,0x27,0x81,0xc8,0x69,0xc0,0x2b,0x74,0x58,0x15,0xa0,0xae,0xd1,0xca,0x00,0x79,0xa6,0x85, + 0x45,0x0b,0x2c,0x23,0x16,0x0f,0x15,0x92,0x05,0x4b,0xc5,0x9f,0x92,0xc1,0x5f,0xa9,0x6f,0x51,0x18,0x26, + 0x7f,0x82,0x52,0xdc,0xba,0x0d,0x51,0x40,0x24,0x90,0x9d,0xc6,0x31,0xb2,0x72,0x82,0x2d,0x88,0x11,0xc7, + 0xae,0x7f,0xfa,0x5f,0xf1,0x44,0x13,0x29,0x1b,0x43,0x61,0x76,0xc4,0x2d,0xd0,0xec,0xca,0xab,0x57,0x11, + 0xc8,0xde,0xfc,0xd1,0x20,0x7c,0x9a,0x9a,0xd1,0x3b,0xf1,0xec,0x6f,0x36,0xda,0x2e,0x6c,0xa1,0x8f,0x8d, + 0x69,0x9e,0x70,0x17,0x99,0x16,0x98,0x32,0xcb,0xa8,0x91,0xaa,0x77,0x22,0x07,0xb0,0xd0,0x7d,0xce,0x51, + 0x46,0xeb,0x88,0x76,0x24,0x6f,0xf6,0x4a,0x2e,0x0a,0x95,0x54,0x80,0xbb,0x55,0x03,0x00,0x00,0xe9,0xa7, + 0x22,0x16,0x76,0xa8,0x7b,0xd3,0xaa,0x45,0xbb,0xec,0x4e,0x42,0xbd,0x98,0x95,0x62,0xde,0xed,0xf7,0x76, + 0xcf,0xdd,0x09,0x81,0xaf,0x5c,0x4c,0x38,0x7f,0x93,0xcd,0x5c,0x0d,0x8e,0x63,0xe1,0xbf,0x43,0xff,0xe9, + 0x44,0xd1,0x5e,0x67,0xb2,0x0c,0x8a,0x6a,0x0d,0x1d,0xf9,0x4e,0x91,0x15,0x2b,0x34,0xde,0x00,0xb3,0xe6, + 0x08,0x9d,0xd8,0xf8,0x93,0x1c,0xa8,0xdd,0xd0,0xf8,0x6a,0x7b,0xa3,0x89,0x8e,0xc7,0xed,0xce,0x4f,0x79, + 0x37,0x3a,0x9e,0x56,0x86,0x43,0xdf,0x15,0xd3,0x66,0x19,0x40,0xdd,0x10,0x79,0x5d,0xaf,0x6c,0x86,0xcc, + 0xe3,0xe4,0x7f,0x8c,0x15,0xa5,0x94,0xe8,0x67,0xc2,0x67,0x57,0x31,0x52,0xfe,0xdc,0xaa,0x93,0x73,0x7c, + 0x56,0x9c,0xbc,0xb2,0x8e,0xfa,0x51,0x2a,0xf9,0x98,0xcc,0x43,0xe5,0x73,0x43,0x26,0x37,0x55,0x20,0x17, + 0x76,0xd8,0xbc,0x8d,0x71,0xfa,0xf0,0x56,0xd2,0x7e,0xbe,0xf0,0x6e,0xe4,0xbc,0xa1,0xaf,0xcc,0x27,0x59, + 0x8b,0x6a,0x61,0x06,0xda,0xdb,0x7e,0xda,0x80,0x9c,0x82,0x2c,0x37,0xd0,0x2c,0x1e,0x2c,0x6a,0x2c,0x58, + 0x55,0x62,0x11,0x5e,0x3c,0x24,0x95,0x41,0x93,0x55,0xaa,0xf9,0x81,0x6b,0xc7,0xd1,0x5b,0x1d,0xa9,0x71, + 0x4a,0x83,0x6a,0x6a,0x40,0x45,0x76,0xc4,0x8d,0xa7,0xb7,0xcd,0x7f,0xe7,0x68,0xb4,0x51,0x5c,0x83,0x8a, + 0xaa,0x7f,0x8d,0xcd,0x51,0x33,0xda,0x28,0x5a,0x8e,0xad,0x2f,0x9c,0xf7,0xa4,0x93,0xa7,0x57,0xae,0x36, + 0x74,0xe4,0xf3,0x8a,0x69,0x65,0xa5,0x72,0x79,0x90,0xa9,0xad,0x62,0xad,0x30,0x2d,0x8b,0x33,0x60,0xaf, + 0x23,0xb5,0xbf,0x56,0xbc,0xfd,0x8f,0x6a,0x90,0x46,0x25,0x87,0xe2,0x04,0xf3,0x59,0xe4,0xa0,0x60,0xb5, + 0x57,0x8e,0xbc,0x6f,0xbe,0xa9,0x88,0xbc,0xbf,0x02,0x7e,0xd3,0x13,0xa7,0xc8,0x78,0x44,0xec,0x77,0x53, + 0x8a,0xbe,0xff,0x40,0x52,0xa0,0xf6,0xf6,0xda,0xd0,0xb7,0xc2,0xce,0x92,0x4f,0x7f,0x9f,0x67,0x68,0x88, + 0xe2,0x75,0x6d,0x08,0x99,0x5d,0xf8,0xe8,0x5b,0x63,0x37,0xf5,0xfb,0xdf,0xfe,0x15,0xf3,0x5e,0x21,0x41, + 0xfe,0xc9,0x47,0x49,0x52,0xa4,0x18,0x6f,0xad,0x19,0x30,0x64,0x46,0x32,0x37,0x14,0x5f,0x45,0x56,0x3b, + 0x46,0xf6,0x52,0x3c,0x3e,0x43,0x63,0x31,0x20,0xdf,0xf1,0x0d,0xc8,0xb1,0xac,0x18,0x8f,0xcf,0x86,0x7a, + 0x6e,0x88,0xd9,0x81,0x48,0xbd,0x93,0x77,0xab,0x79,0x01,0x3b,0x32,0xff,0xc7,0x0a,0x94,0x51,0x21,0xfa, + 0x6a,0x81,0xb8,0x4d,0x56,0x06,0x22,0xe4,0x28,0x67,0x25,0x22,0x64,0x74,0xe2,0x91,0x05,0x14,0x4f,0x59, + 0xb2,0xe0,0x49,0x27,0x52,0x3f,0xb7,0xdf,0x67,0xba,0x25,0xad,0x5b,0x36,0xc1,0xfa,0x6c,0xda,0x2e,0xe8, + 0xd5,0xac,0x98,0xfd,0xe7,0x30,0xc4,0xbf,0x67,0x06,0xe7,0xdc,0xa0,0x7d,0x02,0xca,0x82,0xae,0xa5,0x18, + 0xb9,0x1f,0x28,0xfa,0xa7,0x4d,0x8b,0xfc,0x8e,0xed,0x9d,0xe7,0x46,0xf0,0xe7,0x90,0x21,0x1e,0x05,0x21, + 0x30,0x44,0xb1,0x01,0xc2,0xc7,0x26,0x84,0xff,0xf9,0xcb,0x67,0xcd,0x13,0x1d,0xa3,0x5e,0xed,0xe9,0xa0, + 0xe3,0xf8,0xb5,0x36,0xc0,0x37,0x6a,0x1f,0xe5,0x9f,0x47,0x92,0xdf,0x84,0xfc,0x0c,0xdd,0x68,0x7e,0x7c, + 0x6a,0xc7,0xf3,0x2b,0x00,0x52,0xb4,0x25,0xd0,0xf8,0x6c,0xa2,0xf9,0x9f,0x46,0xd9,0x0c,0xbf,0x5e,0x89, + 0xe3,0xe3,0x68,0xfe,0xa6,0x79,0xc5,0x8a,0xe4,0xdf,0xa8,0x48,0x7e,0x49,0x7e,0x34,0x7e,0xa4,0x6d,0x70, + 0x4f,0xaa,0x62,0xf9,0x09,0xb7,0x9e,0xe3,0xc7,0x20,0xa1,0xae,0x75,0xfe,0xe8,0x70,0x7e,0xa6,0xa4,0x6a, + 0xef,0x4b,0xe1,0xfc,0xcf,0x73,0xa0,0x50,0xc4,0x26,0xd7,0xde,0x99,0x65,0x73,0xc4,0x2f,0xa2,0x1f,0xec, + 0x11,0x07,0x95,0xca,0x21,0xfe,0x27,0xce,0x91,0x45,0x8e,0x96,0x2f,0xdc,0x3d,0x2c,0x09,0x88,0xbc,0x06, + 0xee,0x59,0xc7,0x60,0xff,0xd2,0x08,0x21,0x25,0xe8,0xe7,0xc8,0xff,0x13,0xe3,0xb9,0x66,0x42,0xfe,0x9f, + 0x98,0xa9,0xe0,0x79,0xf0,0x57,0xd2,0x9c,0x04,0x55,0xed,0x64,0x76,0xdc,0x3f,0xbd,0x90,0x9f,0x5d,0x2a, + 0xf4,0xff,0xf6,0xd3,0x08,0x75,0xa0,0x56,0xf8,0xff,0x2e,0x2e,0x77,0x66,0x35,0x56,0xcd,0x34,0xdb,0xc9, + 0x00,0xfe,0x23,0x98,0xdb,0x3c,0x47,0xc0,0x4f,0x9b,0x62,0x82,0x80,0x53,0xcb,0x28,0x6e,0x65,0x09,0xa8, + 0xe2,0x6d,0x0a,0x69,0x02,0xd4,0x22,0x11,0x0e,0x16,0x84,0xc0,0x90,0x06,0x5c,0x16,0x6d,0x82,0xc8,0x38, + 0xe0,0x11,0xd6,0x95,0x73,0x07,0xe0,0xa1,0x4e,0x2d,0xce,0xfc,0x64,0x2e,0x96,0x9f,0xfe,0xc1,0x7e,0x66, + 0x29,0xe7,0x0c,0x10,0x8b,0x24,0xfe,0xf4,0x6f,0xc4,0x6d,0x97,0xd2,0x07,0xd0,0x70,0x12,0x3a,0x18,0x2c, + 0x81,0x7b,0xf5,0xe9,0x1f,0x0b,0x5c,0x67,0x4f,0xb8,0x07,0x8a,0xe2,0x8c,0xe9,0x18,0xd9,0x23,0x8f,0xc0, + 0x44,0x53,0x18,0xda,0x45,0x6e,0x83,0x4f,0x40,0x32,0xeb,0x5a,0xba,0x84,0x2f,0x38,0x91,0x9c,0x8c,0x02, + 0xe6,0xd0,0x35,0x74,0x8e,0x1c,0x88,0xf3,0x05,0xd1,0xf9,0x05,0xde,0x62,0x7e,0x81,0xa8,0x32,0xbf,0x00, + 0xec,0xf6,0x39,0xaa,0x8d,0xcc,0x0e,0x60,0x7e,0x81,0x24,0xd3,0x8b,0xf0,0x9a,0x93,0x0c,0xec,0xd2,0x33, + 0x38,0xd9,0x06,0xf6,0xe3,0xd1,0x4a,0x09,0x07,0xbe,0x0c,0x37,0x9c,0xf4,0x03,0x5a,0xf9,0x9c,0xa7,0x1f, + 0x60,0x0b,0x93,0xd1,0x2c,0x5a,0x29,0x08,0x4e,0xb3,0x64,0x91,0xa7,0x20,0xa0,0xbb,0xd3,0x5c,0xc5,0x60, + 0xca,0xee,0x01,0xec,0x52,0x1e,0x02,0xed,0xe4,0x6a,0x92,0x11,0x6c,0xe8,0x0c,0xfd,0x31,0x4e,0x42,0xce, + 0x45,0xe3,0xa4,0x22,0x50,0xb5,0xdd,0x7c,0x04,0x79,0x13,0x2a,0x29,0x01,0xb2,0xbe,0xe4,0x21,0xea,0x36, + 0x55,0xce,0x48,0xb0,0x9f,0x36,0x0a,0xb6,0xdc,0x68,0xa3,0x74,0x52,0x82,0x1f,0x56,0xf0,0x92,0x54,0xee, + 0xe3,0x3a,0x31,0x01,0x15,0xfa,0x51,0x94,0x15,0x52,0x13,0xe4,0x2e,0xf5,0x66,0x25,0xad,0xf4,0x04,0x20, + 0xd4,0xc8,0x20,0xcc,0xec,0xfc,0x04,0xe6,0x85,0x0f,0xec,0x27,0xa5,0x53,0x14,0xd0,0x2d,0x3b,0x49,0x68, + 0x4f,0x5a,0x04,0x4f,0x3b,0x3b,0x41,0x79,0x33,0x05,0xd9,0xb0,0x19,0x8f,0x8c,0x83,0xc1,0x85,0x5c,0x38, + 0xe9,0x0a,0xd0,0xee,0xa3,0x1c,0xc2,0x4a,0x5a,0x3d,0x12,0x16,0x88,0x24,0x2a,0xb0,0x2b,0x66,0x2d,0xd8, + 0xee,0xed,0x94,0x27,0x30,0xb0,0xb4,0xd9,0x48,0x26,0x42,0x29,0x13,0x93,0xc0,0x40,0x3b,0xfe,0x5b,0xf9, + 0x0b,0x2c,0x11,0x59,0xb9,0xc9,0xce,0x72,0x37,0x5e,0x65,0x96,0x8c,0xd8,0xa1,0x3e,0x4f,0x63,0xe0,0x3a, + 0x79,0x39,0xc9,0x0c,0xd4,0x6a,0x11,0x01,0x20,0x0f,0x16,0xed,0x9c,0x6b,0xa7,0x33,0xb0,0x94,0xb9,0x85, + 0x94,0x06,0x5b,0x5f,0x2f,0x25,0x35,0x60,0xa7,0x71,0x35,0x53,0x63,0x74,0xb2,0x33,0x1a,0x54,0xb8,0x77, + 0xb9,0x49,0x0d,0x28,0x64,0x09,0x29,0x31,0x9e,0xd1,0x9b,0x55,0x61,0xac,0xec,0xf3,0xfa,0x53,0xe8,0x64, + 0x35,0x78,0x93,0x8b,0x89,0x4e,0x62,0x03,0xed,0x8e,0x34,0x27,0x97,0x39,0x37,0xb3,0xc1,0x33,0x3f,0x99, + 0x60,0x88,0x2c,0x2e,0xa6,0xd2,0xee,0x3f,0x05,0xb8,0x39,0x43,0x08,0x7b,0x4f,0xb9,0x0d,0x9e,0x04,0xfe, + 0x22,0xf1,0x01,0x4d,0x09,0x23,0x70,0x5e,0xcf,0x30,0xf6,0x0e,0xbd,0xb6,0xb2,0x2c,0x9d,0xf8,0x21,0xfb, + 0x59,0x14,0x93,0x1c,0xe4,0x46,0x8f,0x8a,0x2c,0x07,0xd6,0xec,0x33,0x32,0xbf,0xd9,0x99,0x0e,0x36,0x52, + 0xbc,0xdd,0x9e,0xea,0xc0,0xd1,0x88,0x98,0x84,0x07,0x28,0xb8,0xe7,0x78,0xfc,0x40,0xa1,0xb1,0x9b,0xf3, + 0xe0,0x29,0x9a,0x31,0xf0,0xb0,0xb7,0x93,0x1e,0x20,0xe7,0x22,0x9d,0xa4,0x07,0x06,0xed,0x98,0x67,0x8f, + 0x44,0x6e,0x98,0xcb,0x93,0x1e,0x58,0xca,0x03,0x27,0xef,0x81,0x76,0xd7,0xcf,0x33,0x1f,0x98,0x5e,0x65, + 0x85,0x0d,0xce,0x49,0x80,0x50,0x55,0x33,0xb7,0x62,0xe5,0xb9,0x10,0x4e,0x77,0xe6,0x42,0xa0,0x6c,0x05, + 0x0e,0x07,0x6f,0xe5,0x44,0xa0,0x87,0x96,0xc6,0xc8,0xa4,0x45,0x78,0x8d,0x9a,0x5a,0x34,0x2d,0xb7,0x07, + 0x82,0xda,0x17,0xec,0xa8,0x4e,0x0b,0xa1,0x97,0x3e,0x52,0x0c,0x5c,0x31,0x39,0x42,0x13,0x81,0x48,0xba, + 0xb9,0x11,0x26,0x68,0x06,0x33,0xc9,0x11,0x9e,0x87,0xb8,0x65,0xca,0x29,0x0c,0x89,0x13,0x12,0x3b,0x35, + 0x00,0xe2,0xbc,0x0a,0x76,0x08,0x05,0x1b,0xec,0xf4,0xc4,0x96,0xc0,0x8a,0x41,0xd8,0x79,0x12,0x74,0x63, + 0x2a,0x53,0x02,0xc2,0x83,0xb1,0x10,0x35,0xdd,0xdc,0x08,0x29,0xb1,0xa7,0x7f,0x95,0x33,0xf6,0x57,0x05, + 0x9e,0x6e,0x92,0x66,0x6e,0xaa,0x04,0xad,0x3c,0xb1,0x0d,0x20,0x4e,0xc6,0x04,0x6b,0xaf,0x60,0x3b,0x95, + 0x60,0xe6,0x26,0x4d,0xd8,0x46,0x0f,0x8d,0x70,0x91,0xe8,0x39,0x15,0x33,0x28,0xcc,0x2c,0x6e,0x6a,0x21, + 0xd1,0xfa,0xc5,0x1b,0x91,0x70,0x44,0x01,0x75,0x6b,0xc0,0x12,0x66,0x67,0x1c,0x5d,0xd5,0x58,0x28,0x16, + 0xa0,0x90,0x4a,0x81,0x1a,0x53,0xae,0x6f,0x26,0x0c,0x81,0x57,0xd6,0x96,0x34,0xd4,0x8e,0x93,0x8e,0x4e, + 0x19,0x9e,0x50,0x8f,0xc6,0x0c,0xad,0x66,0xd8,0x4c,0x42,0x05,0xe5,0xcf,0xfd,0x8a,0x12,0x2a,0xd8,0x7e, + 0xe0,0xbc,0xba,0xa7,0xf2,0x0c,0xad,0x32,0x79,0x56,0x85,0x57,0x92,0xb1,0x83,0xd3,0x2a,0x28,0x45,0x60, + 0x94,0xa7,0x56,0xe0,0x92,0xac,0x22,0xb7,0xc2,0x69,0x31,0xb7,0xc2,0x73,0xc9,0x6e,0x18,0x99,0x95,0x5d, + 0xe1,0x14,0xed,0x74,0x99,0x49,0xae,0x60,0x5b,0x01,0x23,0xf2,0x56,0x5c,0x64,0x4e,0x86,0x05,0x83,0xe9, + 0x4a,0x0a,0x75,0xf2,0x2c,0xd8,0x5e,0xb0,0x76,0x9e,0x85,0x0f,0x01,0x86,0x88,0x86,0x21,0x9d,0xbf,0x2a, + 0xb6,0x37,0x64,0xbf,0xc9,0xac,0x90,0x6b,0xc1,0x8a,0xbd,0xca,0x73,0x2d,0x7c,0x60,0xc7,0xc5,0x3c,0xcc, + 0x88,0xcf,0x31,0xe0,0x0e,0x65,0x88,0x4c,0x20,0x45,0x65,0xcd,0x80,0x8a,0x05,0x74,0xd0,0x8c,0x05,0x70, + 0x5f,0x54,0xe8,0xe4,0x5b,0xf8,0x01,0xd0,0xf5,0x3e,0x8e,0x7b,0xb3,0xaa,0x4a,0xb7,0x80,0x5b,0x4a,0x48, + 0xc9,0x31,0x2c,0xc0,0xb8,0x64,0x4d,0x2a,0xa4,0x37,0xd2,0xe6,0x89,0xce,0x75,0xb0,0x2b,0xd9,0x82,0xa4, + 0x03,0x00,0x4e,0x20,0xad,0x87,0x2d,0xa5,0x5b,0x40,0x67,0xd3,0xe6,0xf7,0x5b,0xb2,0x2d,0xe0,0x43,0x49, + 0x47,0x89,0x72,0x2a,0xf3,0xc9,0xae,0x9f,0x4f,0xa5,0x90,0x67,0x41,0xad,0x7f,0x9e,0x68,0x01,0x70,0x6c, + 0x49,0x8e,0xd6,0xc5,0xe9,0x70,0x95,0xe6,0x49,0x31,0xd7,0x82,0x22,0x43,0x56,0xaa,0x05,0xbd,0xd8,0x6a, + 0x9f,0x54,0x1b,0x4c,0x5d,0x91,0x8b,0xf6,0xc4,0x73,0x8c,0x05,0x66,0x57,0x38,0x72,0xee,0xd1,0x71,0x67, + 0x6f,0x4b,0x59,0x16,0xc8,0xe3,0xc3,0xc9,0xb2,0x40,0x0e,0x4a,0xb9,0xd1,0xd0,0x73,0xb0,0x5c,0x26,0x73, + 0xf2,0xd0,0x30,0x12,0x8b,0x62,0xba,0xdc,0xa4,0x0b,0xd5,0x39,0x17,0x70,0xbe,0xaf,0x28,0xe7,0x82,0x22, + 0x05,0xf0,0x2c,0x86,0x25,0x9c,0x87,0xe8,0x6d,0xbd,0x47,0xce,0x05,0xcb,0xb2,0xe1,0xe4,0x5c,0xc8,0x8b, + 0x9d,0x9c,0x0b,0xda,0xcd,0x37,0x61,0x47,0x2c,0x5a,0xe4,0xea,0x86,0x88,0x11,0x22,0x8f,0x71,0x93,0x75, + 0x41,0x6b,0xdf,0x26,0xda,0xf1,0x53,0xe5,0x5d,0xd0,0xa2,0x87,0x95,0x75,0xe1,0x47,0xbb,0x96,0xca,0xba, + 0x80,0xa4,0x25,0xd1,0x42,0x52,0x31,0xfb,0x02,0x99,0x43,0x78,0xe5,0x0b,0xf9,0x17,0x94,0xb0,0x6b,0xbc, + 0x4d,0xad,0x24,0x0c,0x27,0x13,0x14,0x82,0x97,0xf4,0xad,0x57,0x9d,0x86,0xe1,0x19,0xd0,0x76,0xc4,0xae, + 0x9f,0x36,0x0b,0xa0,0x05,0xe9,0x8c,0x23,0xb7,0xaa,0xf2,0x31,0xd0,0x9b,0xc0,0x6c,0xba,0x09,0x19,0x54, + 0x34,0x5d,0x84,0x1e,0xaf,0x99,0x95,0x92,0x01,0xd8,0x76,0x00,0xdc,0xc8,0x4e,0xcb,0xf0,0x93,0x26,0x19, + 0x79,0x5a,0x86,0xe6,0x29,0xa7,0x65,0x20,0x3f,0x57,0x78,0x5c,0x4a,0xcb,0xf0,0x9a,0xe5,0xd3,0x62,0x56, + 0x06,0x52,0xa0,0xab,0xfa,0x8c,0x44,0xec,0xe9,0xde,0x60,0x30,0xd5,0x2e,0xd0,0x49,0x6e,0xd3,0xa1,0x88, + 0x33,0xe2,0x18,0x90,0xc1,0xb6,0xb3,0x35,0x9c,0xa2,0xa4,0x95,0x20,0x1b,0xa8,0xc3,0x68,0xf3,0x3c,0x0d, + 0x1f,0x28,0x90,0x90,0x3d,0xd6,0x4d,0x92,0x06,0x26,0x8d,0xd8,0x3d,0x50,0x0c,0xe3,0x9f,0x66,0xd2,0x34, + 0x68,0xbf,0xff,0x1f,0x9c,0x87,0x26,0x28,0xe6,0x89,0x3b,0x30,0xe5,0xbe,0x6d,0xa6,0xd9,0xb0,0xe2,0x81, + 0xd4,0x66,0x9e,0xe1,0x3a,0xde,0x92,0xb5,0x81,0xf0,0x99,0x1a,0x79,0xf5,0xf4,0x49,0xf3,0xad,0x4a,0xdb, + 0xb0,0x99,0xf3,0xa1,0xa8,0xa5,0xe9,0x59,0xe2,0x23,0x35,0x26,0xfa,0x49,0x89,0xd4,0x09,0xaf,0x3f,0xfd, + 0x1b,0x1d,0x66,0x89,0x00,0x01,0xc1,0x5f,0x65,0x93,0x84,0x5c,0x8b,0xc8,0x75,0x5b,0xa4,0xf1,0x9c,0xbf, + 0xba,0xe9,0x26,0x6d,0x68,0x3e,0x07,0x29,0x0a,0xde,0xb3,0xf2,0x36,0x3c,0x25,0xba,0xc1,0x61,0x43,0xda, + 0x5e,0xc5,0x6e,0xeb,0xe8,0x9d,0xcf,0xba,0xd6,0x9d,0xe9,0x1b,0xd4,0xa0,0xff,0x2a,0x4d,0xfa,0x06,0x84, + 0xf1,0xb7,0xe5,0xf4,0x0d,0xb8,0xf9,0xce,0x50,0x29,0x92,0xf9,0xea,0x22,0x20,0xe7,0x43,0x94,0x47,0x37, + 0x9c,0xbd,0x41,0x84,0x81,0x0a,0xc7,0x56,0x49,0x1c,0xf2,0xa3,0x0b,0xce,0x08,0x87,0xb8,0x52,0x14,0xfc, + 0x73,0xb8,0xbb,0x52,0xa4,0x94,0x0e,0x57,0xab,0x3e,0x59,0xa1,0x99,0xbc,0x7e,0x47,0xa9,0x1c,0x02,0xa2, + 0x67,0x3b,0x73,0x39,0xd0,0xb9,0x05,0xcc,0x0c,0xe6,0xf1,0x06,0xf1,0x6c,0xe5,0x93,0x7e,0xec,0x03,0x2d, + 0x6c,0x54,0x96,0x3a,0xcb,0x09,0x1d,0x4e,0x14,0xcd,0xe5,0x78,0x87,0x7c,0x03,0xd1,0x86,0xb2,0xa4,0x78, + 0xe0,0xdc,0x6f,0x9f,0xdd,0x08,0x8a,0x29,0x1d,0x9e,0x49,0x36,0xbc,0x98,0x16,0x10,0x1c,0xc6,0x22,0xc2, + 0x2c,0x8b,0x9f,0xfe,0xb1,0x64,0x1e,0x07,0xc8,0x96,0x76,0x86,0x17,0x1c,0xee,0xc9,0xdb,0x98,0x07,0x04, + 0x54,0xa4,0x74,0x60,0x7e,0x44,0x27,0x75,0x30,0x5a,0x84,0x3c,0x9d,0xc3,0xa7,0x7f,0x0f,0x99,0x93,0x52, + 0x60,0xa0,0xec,0x3c,0xe8,0x55,0x1a,0xca,0x85,0xf2,0xc3,0x24,0x65,0x0d,0x3a,0xc1,0xe1,0x69,0x46,0x83, + 0x4c,0x3f,0x27,0xb3,0x43,0xb3,0xd3,0x7c,0xbd,0x35,0xb3,0x83,0x1a,0x1b,0xd3,0x80,0x8c,0xbd,0xb9,0x9b, + 0x7a,0x50,0x64,0xaa,0x2c,0x3b,0xf5,0x98,0xfc,0x0e,0x13,0x1c,0x6c,0xe6,0xe4,0x77,0xb0,0xf9,0xd7,0x84, + 0x74,0x10,0x79,0x96,0x87,0x0f,0x72,0x7a,0x96,0xb9,0xe8,0xab,0xfd,0x08,0xde,0x07,0x72,0x4e,0xee,0xc8, + 0xf8,0x65,0x0c,0xed,0xce,0x8b,0x6a,0x1e,0x8e,0x50,0x25,0x27,0x4e,0xdc,0x17,0xe5,0x68,0xae,0x74,0xab, + 0xfe,0xbc,0x89,0xe4,0x32,0xb1,0xd2,0x3e,0xbc,0xf7,0x59,0x30,0x34,0x59,0x1f,0x7e,0xd4,0xf6,0x03,0x5a, + 0xde,0x35,0xe6,0x80,0x60,0x54,0xe0,0x9a,0xb7,0xe4,0x7e,0xc8,0xfd,0xad,0x1a,0xec,0x62,0xc5,0xf1,0x30, + 0xb4,0x22,0xf0,0xac,0xf9,0xa2,0x3a,0xf9,0x83,0xd6,0xd5,0x94,0x52,0x3f,0xe8,0x88,0x6b,0x4b,0x87,0x6e, + 0xe7,0x7e,0x38,0xc5,0x8f,0x91,0x07,0x94,0xbf,0x31,0x4f,0x00,0xa1,0x48,0x11,0xe9,0x3f,0xbd,0xda,0xcd, + 0xcd,0x11,0x7e,0x7a,0x1e,0x4e,0xb7,0xe7,0xc7,0x64,0x7f,0x56,0x9e,0x3e,0x9e,0x4f,0xbb,0xfe,0x0a,0x0e, + 0xaa,0xdf,0x7e,0x3b,0x50,0x79,0x04,0xe2,0xc4,0xc3,0x6c,0x04,0x1b,0x78,0x7e,0xff,0x7e,0xb9,0xcc,0xcb, + 0xe2,0x57,0x18,0xd2,0xf5,0xd8,0x4f,0xe5,0x41,0xdd,0x23,0x44,0x4b,0x3f,0x04,0xd9,0xf2,0xa0,0x36,0x93, + 0xb5,0xfa,0xb7,0xf8,0x17,0x28,0x4d,0x54,0xd3,0x9f,0x49,0xcf,0x8e,0xe5,0xf1,0x43,0xfc,0x56,0xfa,0xcf, + 0xd8,0xff,0x2f,0xf7,0xef,0xe7,0xd7,0x3f,0xcb,0x5f,0x7e,0xfb,0x0d,0x6f,0x3d,0x19,0xd1,0xb5,0x6c,0x64, + 0x54,0xfd,0x5a,0xbf,0x7a,0x9a,0x61,0xce,0x83,0x03,0x09,0x1d,0x01,0xf0,0x65,0x07,0xb5,0xdf,0xa0,0xdd, + 0x44,0x66,0x1b,0x80,0xa9,0x19,0x7d,0xa4,0x1d,0x1b,0xba,0x7f,0x3f,0xfb,0xb9,0xfd,0xcb,0xb7,0xf8,0x67, + 0x9c,0xfd,0xdc,0xfa,0xe5,0xa6,0xf1,0xec,0xf8,0x00,0xda,0x6a,0x44,0x0d,0xbf,0x11,0xd4,0x8f,0x1f,0x7e, + 0x3f,0xc1,0xb3,0xd7,0x03,0x54,0x0c,0x16,0xd1,0xc1,0xf5,0x62,0x2c,0x1b,0x17,0xe3,0xac,0x11,0x8e,0xa3, + 0xc6,0x72,0xec,0xdf,0x40,0x9d,0xc6,0x8b,0x17,0x4f,0x5f,0xbd,0x3d,0x06,0x11,0x0f,0xbf,0x39,0x7d,0x4c, + 0xdf,0xd0,0xc1,0xbc,0x21,0x0b,0x2b,0x1b,0x98,0x4a,0x9a,0xf5,0xdb,0x29,0xc6,0x18,0x25,0x57,0x50,0x6b, + 0x61,0xb1,0xaf,0x73,0x64,0xf9,0x72,0x53,0x2f,0x6c,0xd1,0xf7,0x3f,0x3e,0x7d,0xf7,0xea,0xe4,0x5f,0x4e, + 0x8f,0x7f,0xae,0x25,0x3e,0xf2,0x1b,0xb5,0x94,0xbe,0x13,0x58,0x9b,0x25,0xc1,0xd5,0x15,0x3a,0xf9,0x52, + 0x6a,0x13,0xe0,0xab,0x6b,0xd9,0x72,0xc3,0xdf,0x08,0xac,0xcd,0x13,0xcc,0xbd,0xf4,0x4b,0xe3,0xcd,0x0f, + 0xaf,0x5e,0x9d,0x3c,0x7a,0xf5,0xf4,0xf8,0x1a,0x23,0xbd,0x14,0xdf,0x79,0xaf,0x45,0xff,0xc3,0x3c,0x0f, + 0x59,0xa9,0x6c,0xa9,0x3e,0xd8,0x58,0x2c,0xcf,0xf2,0x4f,0x3b,0x16,0x1f,0xa9,0x28,0xae,0x62,0x31,0x4e, + 0x34,0x79,0x1c,0x27,0x89,0xf6,0x36,0xba,0xf7,0x8c,0xfe,0xa7,0x9e,0xbc,0x27,0x0f,0x5c,0x5d,0x06,0x8b, + 0xfd,0xf2,0xe9,0xab,0x27,0xa7,0xc7,0xd7,0x56,0x68,0xdf,0xb3,0x83,0x1a,0xdf,0xe1,0x1c,0xc3,0x80,0xa7, + 0x96,0xa7,0xfc,0xf9,0xcd,0x96,0x79,0x6a,0x2f,0x17,0x11,0x25,0x78,0xb9,0x58,0xe2,0x17,0xd8,0x50,0x22, + 0x13,0x56,0xea,0x1f,0x4a,0xc0,0xe7,0xfd,0xf6,0xfd,0x12,0xf5,0x93,0x40,0xea,0x91,0xd0,0xa1,0xcc,0x62, + 0x45,0x28,0xa1,0x31,0xc5,0x34,0x08,0x0b,0x7f,0xbd,0x0a,0xa2,0x71,0xab,0xb1,0xf2,0x3f,0x8e,0x3b,0xfd, + 0xfe,0x4d,0x9d,0xa4,0xbc,0x47,0xd5,0xa3,0xcb,0xe2,0xc5,0x82,0xb6,0xe2,0xc4,0xed,0xf7,0xb7,0x13,0xab, + 0x7d,0xe1,0x8c,0x57,0x67,0x54,0xa2,0x0f,0xce,0xae,0x26,0x98,0xb5,0x47,0xa8,0x14,0x53,0x74,0xa0,0x79, + 0xbf,0x41,0x8d,0x05,0x7b,0xd9,0xfd,0xb0,0x02,0x8e,0x01,0x3d,0x55,0xc8,0x26,0xa5,0x9e,0xd7,0xfe,0x7f, + 0xe2,0xde,0x75,0x39,0x8e,0x24,0x49,0x17,0x7b,0x95,0x62,0xf5,0x0c,0x36,0x93,0xc8,0x4a,0x54,0x01,0x20, + 0x87,0x2c,0xb0,0x88,0x03,0x10,0xe0,0xa5,0x09,0x90,0x58,0x00,0xec,0x9e,0x1e,0x10,0x83,0x93,0xa8,0x4a, + 0x54,0x65,0x23,0x2b,0xb3,0x3a,0x2f,0x00,0x41,0x14,0x64,0xfb,0xeb,0xfc,0x94,0xcc,0x8e,0x64,0x92,0x49, + 0xb6,0xd2,0xd1,0x8f,0x79,0x80,0xfd,0x25,0xc9,0x64,0x32,0xc9,0x6c,0xe7,0x4d,0xe6,0x09,0xf4,0x08,0xf2, + 0xcf,0x3d,0x22,0x32,0xb2,0xaa,0x00,0x76,0xef,0xee,0x39,0x9a,0x0b,0x51,0x99,0x11,0x19,0xe1,0x11,0xe1, + 0xe1,0xe1,0xee,0xe1,0x17,0x57,0xb9,0x45,0x2e,0x04,0x44,0xdf,0xed,0xa6,0xc9,0x54,0x5d,0x80,0x35,0x90, + 0xa6,0x91,0xa3,0x9f,0xe6,0x76,0x3c,0x37,0xe4,0x04,0x42,0x4c,0x1f,0xc8,0x61,0xfd,0x92,0xcd,0xc3,0x1b, + 0xdc,0x2e,0xa3,0xa8,0xc4,0x02,0xb0,0x64,0x12,0x22,0x4a,0x5e,0x23,0xc5,0x34,0x32,0x2d,0x2c,0x10,0x2c, + 0xe7,0x6b,0xd9,0x60,0xb6,0x12,0xf8,0xea,0x42,0x07,0xb9,0xa3,0x3c,0xcd,0xf6,0x79,0x96,0x24,0x87,0x79, + 0x33,0xe1,0x20,0xc9,0x00,0x01,0x91,0xf4,0x26,0x92,0xfb,0x7d,0x0a,0x86,0x0d,0x01,0x48,0xc5,0x65,0x8f, + 0xe3,0x5c,0x71,0x9e,0xfb,0x2a,0x58,0x24,0x72,0x13,0xf9,0x53,0xb0,0x52,0x31,0x87,0x57,0x34,0x9a,0x10, + 0x31,0x6a,0xd5,0x2b,0xd5,0x09,0xd7,0x78,0xad,0xd6,0x9e,0x86,0x4f,0x3c,0x22,0xb0,0x93,0xee,0x93,0x76, + 0xdb,0xc3,0x0d,0x6a,0xb7,0x39,0xce,0x9b,0x6a,0xfd,0x8e,0xb3,0x20,0xc9,0x23,0xc6,0xc7,0x0a,0xb2,0xfa, + 0xea,0xe9,0xa8,0x82,0xb5,0xb5,0xc3,0x89,0x42,0x0c,0x24,0x98,0x9e,0xe6,0x7e,0x7a,0xa5,0xc3,0x4a,0xaa, + 0x50,0xba,0x80,0x33,0x95,0xbc,0x24,0x08,0x70,0x3f,0x55,0x75,0x0b,0xbe,0x6f,0x16,0x85,0x0d,0xce,0x16, + 0x2b,0x16,0x02,0x4b,0xb4,0xae,0x57,0x18,0x70,0xbe,0x31,0x65,0xa6,0x1e,0x72,0x32,0x0b,0x78,0x1c,0x9f, + 0x45,0x89,0x07,0x25,0xd7,0xda,0x0b,0x93,0x61,0x31,0xd2,0x71,0xe8,0x24,0x82,0x87,0xdf,0x68,0x13,0x89, + 0x61,0xcb,0x81,0xa4,0xf0,0xa7,0x3b,0xa8,0xca,0x2e,0xca,0x0a,0xc6,0x5c,0x2a,0x18,0x8e,0xd2,0xc2,0xfa, + 0x27,0x34,0xa3,0xf6,0xfc,0x55,0xc0,0xee,0x72,0xfc,0x30,0x0b,0xd0,0x9c,0x93,0xc2,0xd5,0x01,0x95,0x20, + 0x63,0x16,0x98,0x22,0x5d,0x63,0x9a,0xcd,0xad,0xb1,0x8e,0xed,0x45,0x72,0x8a,0xc4,0x22,0x9c,0x56,0x65, + 0x86,0x75,0x24,0xb9,0x35,0xd2,0x72,0xf8,0x6d,0x8a,0x63,0xae,0x82,0x64,0x06,0xb0,0x9d,0x48,0x53,0x9b, + 0x87,0x61,0x1b,0xe8,0x7a,0x16,0x78,0x9a,0xd9,0xc2,0xde,0x8c,0xa3,0x09,0x71,0x86,0xb4,0xce,0x7c,0xeb, + 0x75,0xc1,0xb9,0xc8,0xd4,0x17,0x44,0xc7,0x55,0x34,0x5d,0x7f,0xfa,0x3e,0x1c,0xc9,0x9d,0x2b,0x71,0x4f, + 0xd7,0xa1,0x72,0x08,0xe6,0x76,0xe0,0xd0,0xac,0x35,0xd3,0x8d,0x72,0xac,0x21,0x3f,0x39,0x69,0x26,0xb8, + 0x12,0x05,0x1a,0x7d,0xe0,0x1f,0x53,0xf9,0x43,0xb4,0x9a,0xe8,0x3b,0xa2,0x27,0xc2,0x49,0x97,0x98,0x39, + 0xfe,0x35,0xc5,0xc6,0xbf,0x44,0x27,0xcd,0xd3,0x53,0x1a,0xe8,0x39,0xd4,0x26,0x1f,0x4c,0xa4,0x9e,0x45, + 0x28,0xbc,0xcd,0x91,0x2d,0x25,0xd0,0x54,0x3e,0x15,0x56,0x03,0x2c,0x54,0xc6,0x3c,0xb5,0xa2,0x92,0xba, + 0x9c,0x83,0x49,0xe1,0xd6,0xeb,0x42,0x62,0x41,0x2a,0x9c,0x41,0x20,0xaf,0x29,0x14,0x42,0x0a,0x47,0x78, + 0xb3,0x72,0x53,0xc2,0x98,0xd2,0x07,0x11,0xda,0x61,0x75,0x18,0xa3,0x31,0xed,0xe8,0x7d,0xa4,0x8d,0x25, + 0x80,0x60,0x9b,0x76,0x69,0x4f,0xbb,0xc4,0xda,0x8c,0x59,0xd3,0x33,0xfd,0x34,0xca,0x5a,0xa2,0xf4,0xa1, + 0x92,0x1f,0x47,0x2a,0x1e,0x35,0x7f,0xc3,0x00,0x20,0xcc,0x25,0x76,0x7b,0xc0,0xf6,0x7f,0x0d,0x54,0xc7, + 0x56,0xd7,0xae,0xbb,0xd5,0x3c,0xb6,0x15,0x1d,0x41,0x6c,0xae,0x29,0xd4,0xa7,0x54,0x95,0x25,0x42,0x9a, + 0xc8,0x0e,0x75,0x1a,0x40,0x77,0x1a,0x64,0x5e,0x83,0xf0,0xeb,0x72,0x40,0x84,0x10,0x9a,0x5a,0x8e,0x56, + 0x37,0x7d,0xcf,0x65,0xc4,0x74,0xc7,0x74,0x70,0x79,0x8d,0x1f,0x53,0x60,0x59,0xc1,0xd1,0xd8,0xc1,0xf0, + 0xa2,0x85,0xd5,0xfb,0x5a,0x40,0x18,0xb7,0x74,0xf2,0x40,0x13,0xe9,0xb9,0xb4,0xb0,0xe6,0x41,0xbf,0x97, + 0x21,0xc1,0xfc,0x7c,0x43,0x0c,0xc6,0x21,0x4d,0xf3,0xa5,0x6a,0x67,0x31,0x14,0xeb,0x0f,0xb4,0xa1,0x00, + 0xb9,0xb7,0x11,0x0d,0xc7,0x13,0x42,0x89,0x68,0x28,0x33,0x3c,0x7d,0x83,0x2b,0x71,0x9e,0x55,0x14,0x3d, + 0x45,0x51,0x12,0x64,0x37,0xaa,0x94,0x1e,0x88,0xc7,0x2c,0x51,0x08,0x64,0xc3,0xa2,0xae,0xae,0x8f,0xec, + 0x35,0x35,0x58,0xb6,0xba,0xde,0x1a,0x71,0x1e,0x0c,0xfe,0x90,0x9e,0x8e,0x0a,0xd6,0x6c,0xb4,0xd0,0xb4, + 0x87,0x38,0x97,0x44,0x53,0x3a,0xab,0x56,0x25,0x42,0x28,0xe2,0xb8,0xf9,0xa5,0x55,0x57,0x23,0xcf,0x5e, + 0xc8,0x6e,0x26,0x7f,0x0a,0xb3,0x74,0x61,0x7f,0xaa,0x9c,0xf0,0x20,0x4b,0xa7,0x24,0xc3,0x8c,0x38,0xa6, + 0x6a,0xe3,0x43,0x09,0x25,0xab,0x84,0xdb,0x6e,0xff,0xa1,0xdb,0x7e,0xc2,0x84,0x0e,0x71,0x8d,0x89,0x06, + 0xe2,0xd9,0x9f,0xca,0x6b,0x04,0xe8,0x2c,0xf8,0x8d,0x09,0x64,0xa4,0xbb,0xc6,0xc7,0x47,0x1c,0x4e,0x37, + 0x5f,0xd8,0x35,0x37,0x2e,0xf1,0x76,0xf3,0xa9,0x52,0x11,0x27,0x56,0x38,0x24,0x04,0xc9,0x25,0x51,0xb2, + 0x6f,0x61,0x39,0x23,0xa5,0xcf,0x58,0x49,0x42,0x5e,0x08,0x23,0x44,0x26,0x64,0x15,0xf2,0xdb,0x9d,0x6f, + 0x8d,0x0f,0xc6,0x0b,0x7b,0xde,0xda,0x5f,0x39,0xd8,0xa7,0x11,0x0d,0x70,0xa7,0x9e,0x66,0x53,0x79,0xb6, + 0x7a,0xae,0x4d,0x30,0x77,0xba,0xd1,0x18,0x45,0x03,0xb6,0x3f,0x67,0x2e,0x48,0x81,0x8d,0x54,0xb5,0xd7, + 0x02,0x0f,0x78,0x9e,0xfa,0x12,0x6c,0xf0,0x05,0xcb,0x5f,0xff,0x02,0xb1,0x10,0xa5,0x7a,0x88,0x06,0xc4, + 0x70,0x12,0x64,0xe8,0xff,0xfe,0x0d,0x8e,0x30,0x64,0x86,0x94,0x8f,0x38,0xc6,0x2c,0x08,0x0b,0x9d,0x24, + 0x65,0x11,0xe6,0xd3,0x1d,0xb8,0xac,0xc4,0x93,0x32,0x21,0x19,0xcc,0x10,0x75,0x05,0x01,0x13,0x94,0x7d, + 0xae,0x98,0x30,0xf5,0x8a,0x12,0x4e,0xe9,0x04,0x88,0x55,0xa6,0x21,0x35,0x06,0xcd,0xa3,0x48,0x8c,0x70, + 0x7f,0xca,0x55,0x71,0x3a,0x70,0x44,0x30,0xf1,0x3c,0x57,0x8b,0xc3,0xec,0x89,0xba,0x53,0xb3,0x28,0x2f, + 0x63,0xc6,0x0d,0x96,0xb4,0x50,0xc9,0x0f,0xe4,0x38,0xe4,0xc8,0x5e,0x01,0xef,0x96,0xe6,0x39,0x5a,0xb5, + 0x01,0xb1,0xe3,0x2d,0x4b,0x9f,0x2c,0xb9,0xeb,0xbe,0x8a,0xe0,0x92,0x49,0x4e,0x73,0x52,0xc6,0x4c,0xb9, + 0x0f,0xe8,0x2f,0xbe,0x73,0xe8,0x44,0xa5,0x93,0x23,0x18,0x84,0xee,0x94,0xdf,0x81,0x56,0x0e,0x1a,0xce, + 0x75,0x28,0x01,0x6e,0x76,0xa3,0xa4,0x85,0x58,0x16,0xca,0xa3,0xde,0x95,0x3d,0x07,0x8e,0xfc,0x23,0x3b, + 0xca,0x2d,0x9a,0xe8,0x1d,0x8e,0x32,0x8b,0xe2,0xa9,0x52,0x8c,0xd7,0x3c,0xe9,0x9a,0x3a,0x22,0x25,0xc3, + 0x7c,0xcd,0x86,0x58,0x41,0x43,0xa7,0x07,0xe6,0x5b,0x06,0x7f,0xca,0x0a,0x64,0x16,0x66,0x03,0x38,0x29, + 0xd2,0xb9,0xcb,0x96,0x80,0x68,0xce,0x04,0x36,0xb3,0xc8,0x2c,0xa2,0xa6,0xee,0xa7,0x49,0x31,0xfa,0x89, + 0x03,0x4c,0x13,0x08,0x37,0x1e,0x1d,0x8c,0xf4,0xc2,0x6b,0xdc,0x20,0x33,0x8f,0xb3,0xd6,0xf1,0x3b,0xab, + 0xfe,0xea,0x13,0x97,0x0e,0x9b,0xa1,0xd7,0xa0,0xca,0x01,0x51,0xc4,0xef,0x83,0x91,0x5d,0xc6,0x53,0xc4, + 0x9f,0x51,0x03,0xaa,0xa9,0x7d,0x69,0x65,0x80,0x16,0xa5,0xa9,0xce,0xea,0xca,0x5a,0x67,0x05,0x4d,0xa9, + 0x56,0xb8,0x45,0x69,0xca,0x94,0x71,0x53,0xa8,0xbf,0xaf,0x9a,0xa3,0xa6,0xd0,0xa2,0x01,0x0b,0xd4,0xd1, + 0x59,0x7d,0xd2,0x22,0x34,0x5f,0xeb,0xb8,0x53,0x7c,0x6e,0xc0,0xa2,0x06,0xad,0xb2,0x6a,0xce,0x0d,0x92, + 0xdf,0x3f,0xef,0xb9,0xae,0xa2,0xe7,0xfe,0x18,0x2c,0xef,0x57,0x6d,0x63,0x81,0xe0,0xdf,0x92,0x05,0xc2, + 0xec,0x84,0x01,0xe7,0x02,0x1a,0x08,0x5c,0xfe,0x54,0x99,0x63,0x54,0x5b,0x00,0xc0,0x30,0xfa,0x03,0x36, + 0x7b,0xca,0x53,0xee,0x34,0x2d,0xf4,0x04,0x02,0x83,0x80,0x77,0xfa,0x91,0xa7,0x20,0x87,0x0d,0x04,0x90, + 0x19,0x7f,0x51,0xb4,0xd2,0x59,0x75,0xc1,0xb2,0x67,0x7f,0xfd,0xcb,0x30,0x2f,0xc0,0x85,0xe8,0xb7,0x5c, + 0x7f,0x20,0xd5,0x77,0x54,0xed,0x16,0x6a,0x6f,0x8b,0x3b,0xa9,0xae,0xdb,0xe2,0xba,0x7a,0x4e,0x7e,0xe2, + 0x39,0xbe,0x67,0xcf,0xa3,0x50,0x27,0x18,0x42,0x65,0x9e,0x66,0x6c,0x0c,0x75,0xc7,0xd3,0x7c,0x1b,0x0d, + 0x54,0x86,0xb1,0x38,0x0c,0xc0,0x2f,0x23,0x6c,0x1c,0xf1,0xd6,0x24,0x2e,0xd4,0x02,0x43,0x4f,0xab,0x3d, + 0x00,0x0f,0xac,0xe0,0xe2,0x42,0xf9,0xe1,0x70,0xb4,0xb1,0xb9,0xfb,0x8d,0x8a,0x8b,0x82,0xee,0x19,0xbd, + 0xd0,0x87,0x56,0x1b,0x3c,0x54,0xe2,0x26,0x77,0x40,0x25,0x70,0x50,0x29,0x7a,0x81,0x55,0x77,0xa7,0xab, + 0x2d,0x56,0xfe,0x46,0x8c,0x04,0x32,0x2d,0x17,0x44,0xae,0x74,0xe5,0xf5,0xaa,0x72,0x1b,0xd5,0xd7,0xad, + 0xea,0x6d,0xfe,0xc0,0xe0,0x0b,0x6d,0xa6,0x1f,0xe5,0x24,0x5e,0x48,0xba,0x55,0x19,0x32,0xb8,0x5e,0x44, + 0x5f,0xa6,0xe6,0x5c,0xce,0x5b,0xef,0xff,0xfa,0x7f,0x11,0x9f,0xa2,0x4e,0x2d,0xb6,0x69,0x91,0x9a,0x2a, + 0x02,0xfd,0x85,0xce,0x3a,0xc0,0xdb,0xd6,0xf9,0x91,0x04,0x5a,0xb5,0xe8,0xc4,0x6d,0xca,0xa7,0x0d,0x38, + 0x3a,0x73,0xac,0x41,0xde,0xb4,0xb5,0x3a,0x4d,0x01,0x8f,0xb7,0x06,0xae,0x3f,0x17,0x1f,0x69,0x5c,0xcc, + 0xa1,0xf5,0xa9,0x8a,0xec,0x35,0xbe,0x4c,0x17,0x9b,0x07,0x39,0xf1,0xfe,0xf6,0x0f,0xff,0xb8,0xd6,0x69, + 0xec,0x84,0xfd,0xbf,0xfd,0xc3,0xff,0x6c,0x9f,0xaa,0xfc,0x9e,0x3a,0x43,0xde,0x9b,0xe9,0xdf,0xfe,0xe1, + 0x7f,0xd1,0x95,0xfe,0x51,0x9d,0xb1,0xfc,0x8a,0xcb,0xff,0xb1,0x76,0xd4,0x36,0xd5,0x40,0xb7,0x83,0xcc, + 0x07,0x29,0x6a,0x3e,0x38,0x6f,0xc4,0x6a,0x59,0x93,0x46,0x72,0x5e,0x5e,0x30,0x5b,0x8c,0xb4,0x1a,0xc8, + 0x5e,0x7a,0x05,0x6b,0xba,0x20,0xbb,0xcc,0x55,0x86,0x76,0xcc,0xd7,0x8d,0x09,0xd5,0x8e,0xae,0xfc,0x29, + 0xd3,0x46,0xd6,0xf3,0x11,0xf1,0x3d,0x17,0x61,0x55,0x76,0xa0,0x89,0xc8,0x52,0xf1,0x4b,0x73,0x20,0x42, + 0x23,0xf5,0x31,0xa1,0xb9,0xa1,0x17,0xf7,0xc3,0x2a,0xbe,0xb6,0x30,0xdc,0x42,0x3d,0x01,0x59,0xc5,0xe8, + 0x2c,0xf0,0x92,0x9a,0xb6,0x65,0x71,0x90,0x6e,0x8b,0x39,0xe0,0x3b,0x05,0x99,0xa3,0xac,0x22,0xe4,0xb3, + 0xa0,0xe0,0x27,0xe1,0x36,0x51,0xba,0xbc,0x06,0x08,0x46,0xac,0xc0,0x08,0x39,0x2c,0xfd,0x4d,0xae,0xe6, + 0x8c,0x1e,0x0b,0x56,0xfb,0x82,0x5c,0xe7,0x92,0xc7,0x45,0xab,0xa2,0x54,0x6b,0x3a,0x18,0xbc,0x0f,0xaa, + 0x2d,0x06,0x59,0xe6,0x5b,0xd6,0x41,0xcd,0x2d,0x9a,0x84,0xcb,0x66,0x25,0x4f,0x0d,0x0c,0x56,0xe6,0x40, + 0xba,0x4a,0x31,0x03,0x6f,0xc3,0x92,0x57,0x6a,0x9f,0x16,0x47,0x2f,0x47,0x5f,0xe2,0xe9,0x01,0x42,0x7f, + 0x2a,0x8b,0xc0,0x12,0xe8,0x88,0xea,0xb2,0x81,0x3e,0x40,0xc8,0x67,0xfb,0x23,0xce,0xf4,0x1b,0x3d,0x7e, + 0xe4,0xf8,0xf8,0x88,0xe9,0xc2,0x63,0x27,0x49,0x8e,0x03,0x3e,0x21,0xdc,0x82,0x1a,0xfe,0x3e,0xa3,0x88, + 0x02,0x23,0x0b,0x11,0xa1,0x05,0x44,0x69,0xc0,0x1a,0x05,0x85,0x0e,0xac,0x9d,0xa5,0x03,0x31,0x33,0xa0, + 0xdc,0xb3,0x00,0x5b,0xbf,0x66,0x02,0x1a,0x9c,0x3b,0x4a,0x7d,0x21,0xb3,0xd1,0x08,0xc6,0xd5,0xdc,0x02, + 0x2a,0xa8,0xb0,0x25,0x85,0x68,0xc1,0x9f,0x20,0xb4,0x8e,0x59,0x17,0x9e,0x24,0x1c,0xd2,0x60,0xf5,0x93, + 0x84,0x27,0x49,0x0c,0x3b,0xed,0xb5,0x95,0xdb,0xb2,0x85,0x60,0xbe,0xfb,0xb5,0xf3,0x66,0xe3,0x8d,0x99, + 0xbb,0x19,0xfc,0x39,0xe6,0x79,0x43,0x96,0xf7,0x8b,0x1a,0xf6,0xc0,0x48,0xd0,0x9f,0xc2,0x3c,0x0e,0x4e, + 0xed,0x3c,0x85,0xe6,0x53,0x94,0x85,0x9a,0x7b,0x14,0xa5,0xe0,0xa2,0xd9,0x82,0xf0,0x26,0x48,0x38,0x55, + 0xa2,0x9b,0xb6,0xcb,0x61,0x25,0xaa,0x6b,0x69,0x27,0x17,0x7c,0xce,0x47,0xb2,0xfa,0x5c,0x9d,0xc7,0xf5, + 0xaf,0xb5,0xc4,0x04,0x73,0xc5,0x30,0xbb,0xb7,0x1d,0x2d,0xe5,0xd1,0x3c,0xa3,0x9e,0x11,0xec,0x38,0x94, + 0x1b,0xe6,0xca,0xa4,0x86,0x0d,0x8d,0x10,0xa6,0xb8,0xfc,0x5c,0x71,0xf8,0x62,0x3c,0x67,0x3e,0xdc,0x53, + 0x85,0xcd,0x0a,0x06,0x28,0x76,0xbf,0x0d,0x01,0xb4,0xc3,0x55,0xff,0x62,0xe3,0x80,0x0d,0xdc,0x10,0x2d, + 0x90,0xec,0xd4,0xfc,0x6b,0x30,0x8a,0xed,0xb6,0xb7,0xd3,0xc1,0xcd,0xb7,0xdb,0x3e,0xa7,0x5a,0x55,0xdb, + 0xdb,0x90,0x5a,0xc1,0xe4,0x9a,0x10,0xad,0xfe,0xd4,0x0a,0xce,0xca,0x6b,0x67,0x83,0x5c,0x08,0x2c,0x66, + 0xe9,0x2a,0x35,0xf6,0xd4,0xe8,0xac,0x2d,0xf6,0x13,0xf9,0x53,0x62,0xd1,0x76,0x2b,0x7e,0xd3,0x18,0x2c, + 0xb0,0x8e,0x9b,0x91,0xa3,0x24,0x99,0x20,0xeb,0x23,0x4c,0x49,0xd5,0x81,0x21,0xad,0x9f,0x74,0xa1,0x48, + 0xac,0xe7,0xc6,0x52,0x4e,0x9d,0x4e,0x3a,0x0d,0x0a,0x2b,0xd4,0x21,0x7c,0x05,0x93,0xa8,0xa0,0x13,0x8c, + 0x99,0xac,0x61,0x61,0x75,0x85,0xd2,0x99,0x36,0x78,0xdf,0x88,0xb5,0x8e,0x3f,0x4e,0x71,0xd1,0x50,0x41, + 0x60,0xf8,0x1b,0x31,0xe0,0x41,0x9e,0xb0,0x70,0x0a,0x7b,0x44,0x94,0xb7,0x60,0x9e,0x9b,0x1b,0xbd,0x05, + 0xfa,0x56,0xe1,0xe0,0x39,0x27,0x31,0xa7,0xe8,0x49,0x25,0x59,0xb5,0x39,0x96,0x14,0x93,0x03,0x7d,0x06, + 0x4f,0x1b,0xdf,0x36,0x7a,0xbc,0x61,0x74,0xc0,0x66,0x4c,0x4e,0x2e,0x0c,0x8e,0xba,0x04,0xaf,0x04,0x96, + 0xa0,0x88,0xfa,0x2c,0xb0,0x70,0x8c,0xf3,0x22,0x02,0xcb,0xde,0x8f,0xa3,0x89,0x22,0x68,0x79,0x41,0x54, + 0x0c,0xee,0x08,0xda,0x67,0xc5,0x93,0xfd,0x18,0x9c,0xe7,0x50,0x97,0x44,0x9a,0x21,0xba,0xce,0x82,0x89, + 0x34,0x43,0x1c,0x07,0xe7,0x10,0x91,0xa0,0xf5,0xac,0x64,0x85,0x73,0xfa,0x94,0xcd,0x6d,0xa1,0x59,0x25, + 0xb6,0xa2,0xcc,0x70,0xc3,0x45,0x8c,0x17,0xfc,0xf8,0x4c,0xc0,0x69,0xb4,0x83,0x78,0xcc,0x38,0x86,0x4b, + 0x24,0x69,0x4e,0x0a,0x12,0xdb,0xd2,0x32,0x8f,0x6f,0xa6,0xfc,0xc9,0x10,0x80,0x10,0x69,0xe0,0x98,0xc9, + 0x22,0x4c,0x11,0x6a,0xf5,0x99,0xa3,0xb8,0x46,0xdc,0x74,0x44,0x04,0x66,0x86,0x18,0xaa,0xc6,0xd1,0xf4, + 0x87,0x54,0x2c,0x0c,0xf4,0xa5,0x9b,0xfe,0x10,0x3c,0x96,0x5e,0x1f,0xa3,0x75,0x7b,0x68,0x91,0x2a,0x65, + 0x1e,0x56,0xca,0x52,0xe3,0x49,0xd8,0xfe,0xeb,0xe0,0x46,0x25,0x3f,0xc7,0xfc,0x43,0x77,0xeb,0x4f,0xdf, + 0xc1,0xe3,0x80,0xed,0x97,0x0e,0xf5,0x15,0x2b,0x96,0x84,0x97,0x48,0x19,0x38,0x55,0xcb,0x10,0x87,0xb0, + 0xf3,0x6d,0x1e,0x4a,0xb2,0x1a,0x5a,0x60,0x7a,0x26,0xe8,0x91,0xf9,0x89,0x2d,0xca,0xf9,0xd2,0x18,0x92, + 0x61,0x2e,0x5a,0x3c,0xa5,0x8a,0xdf,0xa3,0x6a,0xa8,0xce,0xcf,0x5c,0x9f,0xeb,0x48,0x75,0xf9,0xb4,0x3e, + 0x58,0x3a,0x23,0xb3,0x9b,0x85,0x03,0x65,0xb8,0xb8,0x98,0x37,0x1c,0xfb,0x9a,0x46,0xa1,0x0c,0x51,0xa4, + 0x3c,0x1e,0x9c,0x62,0x46,0xc0,0xc1,0x4a,0xda,0x5c,0x2c,0x2d,0x21,0x9f,0xc8,0x78,0xdc,0x48,0x2e,0xd6, + 0x3d,0x6c,0xd3,0x99,0x58,0x4b,0xad,0x78,0x16,0x6b,0xd4,0x51,0x12,0xb3,0xa9,0x69,0xf3,0x87,0x28,0xe7, + 0xa8,0xb0,0x55,0xb6,0x88,0xe9,0x11,0x6b,0x8b,0xf9,0x3a,0xba,0x80,0x9f,0x28,0x86,0x9d,0x5e,0x5c,0xe4, + 0x1c,0xf9,0x50,0x21,0x08,0xf5,0xc8,0x91,0xf4,0xe9,0x7d,0x8b,0x77,0x01,0x4f,0x81,0xd8,0x35,0x8c,0x82, + 0xf8,0x1c,0x30,0x2d,0x5a,0x72,0xec,0xa6,0xd7,0xb0,0xd7,0xbe,0x77,0x22,0x98,0x9f,0xb9,0xa0,0x2a,0x53, + 0xb1,0xf8,0xe5,0xeb,0x55,0x1a,0x69,0xa1,0xe9,0x75,0x20,0xfa,0x59,0x35,0x29,0xcc,0x66,0x87,0x49,0x5a, + 0x0e,0x47,0xb3,0xdb,0x72,0x3b,0x24,0x1e,0x00,0x12,0x07,0x6e,0x78,0xab,0xc6,0x2e,0xcb,0xec,0x6b,0x83, + 0xb8,0x81,0xf2,0xd7,0x6e,0xce,0x9b,0x5c,0x36,0xe7,0x74,0x5b,0xc7,0xd9,0x60,0x1f,0x21,0x16,0xd3,0x94, + 0x25,0xa0,0xba,0x35,0x08,0x92,0x1b,0x4c,0xa0,0x18,0x8f,0x37,0x8a,0x2c,0x2d,0xbe,0xd2,0x9e,0xab,0xcf, + 0x40,0x3e,0x09,0xc3,0x41,0x6d,0xf8,0xfa,0xee,0x4b,0x21,0x3c,0x57,0xa8,0xc8,0x12,0x62,0x23,0xa6,0x50, + 0x07,0xb5,0xdb,0x8d,0xdf,0x37,0x7a,0x0d,0xd1,0x30,0x7b,0x8d,0xb6,0xa4,0x0e,0xf3,0xa7,0xf3,0x05,0x62, + 0x4f,0x19,0x24,0x33,0xd7,0x5c,0xe6,0xc2,0xe4,0xf7,0x4d,0x0b,0x9e,0x21,0x11,0x8f,0x45,0xd0,0xec,0x11, + 0x35,0x68,0x50,0xe1,0x74,0xeb,0x9c,0x33,0xa7,0xb0,0xf8,0xa7,0x31,0x0a,0xd0,0x4e,0x38,0x49,0x97,0x92, + 0x86,0xb3,0x70,0x12,0x16,0xa2,0xb3,0xf7,0xcd,0x17,0x46,0x16,0x56,0x01,0x6d,0x52,0x13,0xc4,0xd5,0x02, + 0xeb,0xe9,0xba,0x82,0x6a,0xf2,0xc5,0x06,0x0b,0xb9,0xcf,0xf6,0xf3,0x85,0x90,0x1d,0x10,0xd7,0x1f,0x4e, + 0xf9,0x5f,0x1c,0x73,0x95,0x54,0x65,0x6d,0x13,0x4f,0x32,0x29,0x14,0x42,0x04,0x85,0x54,0x35,0x70,0x25, + 0xec,0x33,0x65,0x02,0x25,0x14,0x7a,0xc9,0x31,0xd4,0x13,0x45,0x1c,0x7f,0xc4,0x09,0xca,0xaa,0xac,0xf9, + 0xbb,0x12,0xbe,0x74,0xea,0xcc,0x5c,0x3a,0xa9,0xe4,0x4e,0x80,0xd2,0xe4,0x79,0xaa,0xf0,0x59,0x19,0x20, + 0x4e,0x8d,0x51,0x22,0x42,0x8f,0x35,0xce,0x6f,0x1a,0x23,0x02,0xce,0x93,0xb4,0x3d,0xd8,0x44,0x59,0x88, + 0xb4,0x28,0x2a,0x23,0x14,0x31,0x46,0x81,0x3f,0xdd,0x57,0xb1,0xd7,0x10,0x0a,0xbd,0xf8,0x4a,0x98,0x5b, + 0xd9,0x35,0x80,0xb6,0x60,0x4e,0xd9,0xa6,0x91,0x6d,0xc7,0x2c,0xbc,0xa5,0x3e,0x5a,0x0d,0x88,0xcf,0x8d, + 0xd6,0xb4,0xd5,0x50,0x61,0x3c,0x09,0x01,0x7d,0xa2,0xe8,0xfd,0xa0,0x70,0xf4,0x7d,0xb3,0x3f,0x0e,0x26, + 0x4e,0xd8,0x7b,0x79,0x12,0x7a,0xe1,0xa9,0xeb,0x56,0x43,0x39,0x02,0xf6,0xcd,0x8c,0x47,0x4f,0xbc,0x1a, + 0x87,0xc2,0x50,0xf5,0x34,0x83,0xa0,0x2a,0x93,0x9d,0xfa,0x9a,0x93,0x87,0x20,0x95,0x08,0x90,0x45,0xa3, + 0x2a,0x87,0x20,0x0c,0xa0,0x24,0x23,0x64,0xc0,0xcd,0x73,0xca,0x02,0x83,0x6a,0x2f,0x37,0x57,0x7e,0x15, + 0xda,0xca,0x85,0x9f,0x8d,0xbd,0xb4,0xf6,0xaf,0xc2,0x38,0x8f,0x4a,0x96,0x81,0x4d,0x6e,0x98,0x8a,0xc9, + 0x50,0xa5,0x53,0xf5,0xd7,0xa8,0xad,0x5f,0x07,0xd0,0x2e,0xc3,0x94,0x53,0xeb,0xac,0xad,0x37,0xcc,0x1a, + 0xcd,0xdc,0x84,0xd7,0x9a,0xaf,0x98,0x24,0x53,0xab,0xe2,0x95,0xf4,0xab,0x19,0x5e,0xb5,0x7e,0xe7,0xbe, + 0xb0,0xb9,0xb7,0xaa,0x8a,0x6e,0xcb,0x0a,0x7f,0x3a,0xd3,0x58,0xed,0x36,0x7e,0x61,0x5b,0xdb,0x52,0x43, + 0x37,0x85,0xd8,0xab,0x33,0x6d,0xe4,0x00,0xd2,0x5c,0x31,0xe9,0xef,0x2a,0x32,0x64,0x8a,0xa7,0x47,0x7f, + 0xfd,0x4b,0x21,0x91,0xe8,0xe8,0xbd,0x50,0x99,0x61,0x46,0x4b,0x04,0xf6,0xd4,0x9f,0xca,0x8b,0x37,0x19, + 0xc2,0xea,0x83,0xd2,0xd7,0xf7,0x4c,0xa7,0x4e,0x6e,0x86,0xc1,0x78,0x1c,0xd8,0xfd,0x99,0xdb,0xcf,0x37, + 0x28,0x99,0xf2,0xbf,0xac,0xf3,0x19,0x62,0x17,0xf4,0x60,0xbf,0x76,0xc9,0x06,0x4c,0x83,0x56,0x41,0xf8, + 0x4c,0x64,0x85,0x8d,0xa7,0xb8,0x88,0x76,0x68,0x8c,0x93,0x71,0x1f,0x21,0x04,0x25,0x16,0x94,0xc1,0x1a, + 0xb9,0x26,0x16,0x94,0xf1,0x3b,0xd4,0xf3,0xac,0xa5,0x82,0x05,0x83,0xe1,0xa4,0x25,0xa3,0x66,0xdf,0x54, + 0x9a,0x62,0xc6,0x10,0x7f,0x28,0xbc,0xe4,0xa0,0xb4,0x4d,0xd8,0x76,0xe5,0x9c,0xd8,0x4f,0x6a,0x06,0x79, + 0xc1,0x29,0xe9,0x88,0x07,0xed,0x71,0x26,0xd1,0xe9,0x7b,0x1d,0xad,0xc8,0xc4,0x84,0xa6,0x26,0xe8,0xdc, + 0x60,0x8f,0xc3,0x30,0xfa,0xeb,0x7f,0xa2,0x8a,0x34,0x53,0xcc,0xdd,0x1b,0x0b,0x89,0xfb,0x61,0x21,0xf6, + 0xab,0x60,0x28,0x30,0x3a,0x59,0x00,0x7c,0x21,0xbb,0xeb,0x9a,0xa8,0xa3,0x3e,0xe6,0xea,0x50,0xbc,0xfe, + 0xeb,0x5f,0xe8,0x13,0xde,0x5e,0x43,0x36,0xd7,0x0b,0xd5,0xf1,0x06,0x47,0xc9,0x19,0x38,0xee,0xbc,0xa3, + 0xdd,0xe3,0xb3,0x37,0x87,0x1f,0x3f,0x1d,0x1c,0xf5,0x88,0x76,0x18,0x33,0x03,0x63,0x61,0x6e,0xff,0x7e, + 0xcb,0x07,0x9e,0x86,0x52,0x9b,0x35,0x5b,0x3f,0xa5,0x82,0xba,0xb1,0x54,0x26,0xe6,0xd5,0x2f,0xf5,0xb9, + 0x12,0x61,0xb4,0x91,0xb8,0xf5,0x53,0x2a,0x28,0x5a,0xaf,0xac,0xbf,0xab,0x5f,0x52,0x5a,0xd1,0xa4,0xca, + 0xbc,0xbb,0xf6,0x20,0xd5,0xaa,0x4d,0x51,0x99,0x70,0xd7,0x1e,0xa8,0xda,0xa9,0x77,0xfc,0xa7,0xb3,0x63, + 0xb6,0x9e,0xa1,0xa1,0xbf,0x58,0x6e,0xb7,0x5f,0xb6,0xe9,0xdf,0xd5,0x97,0xad,0x55,0x6f,0x7f,0xcd,0x7f, + 0xe2,0xb7,0x57,0x3a,0xde,0x7e,0xa7,0xcd,0xbf,0xd6,0xf8,0x5a,0x9b,0xce,0x0b,0x42,0x8e,0x7e,0xb0,0x72, + 0xcc,0x87,0x3e,0x7a,0xa2,0x2f,0x3a,0x2f,0x5b,0x1d,0x14,0x83,0x35,0x0d,0x56,0x5e,0x05,0x48,0xfe,0x11, + 0x10,0xad,0x6d,0xa8,0x37,0xbb,0xf1,0xd9,0x56,0x10,0x95,0x89,0xae,0xbf,0xb6,0xd6,0x7e,0xd9,0x5a,0xeb, + 0xae,0xb5,0xf1,0x51,0x1e,0x51,0x6b,0xe1,0x28,0x0b,0xaa,0x62,0x2a,0xd4,0x25,0x5b,0xb4,0x25,0x92,0x06, + 0xff,0xdc,0x0e,0x86,0xa3,0x41,0x30,0x90,0x87,0x9d,0x60,0x1c,0xe4,0x7d,0x22,0x5e,0xfc,0xf4,0xf7,0x74, + 0x60,0x64,0xf2,0xf3,0x30,0xba,0x09,0x06,0xa3,0xc6,0x6e,0x99,0xa5,0x93,0x70,0xe5,0x1d,0x4e,0xe1,0xf3, + 0x32,0xd6,0xcf,0xfb,0x74,0x18,0x5c,0xea,0x7e,0xd6,0x01,0xc6,0xba,0x05,0xc6,0xfb,0x80,0xaa,0x9a,0x52, + 0x2a,0xd3,0x05,0xdb,0xc1,0x65,0xa9,0xfa,0x2d,0xcf,0x83,0x48,0x7e,0x1e,0x9f,0x47,0xf0,0xae,0x90,0x87, + 0x9f,0x42,0x04,0xe6,0x4e,0x74,0x3f,0x5b,0x79,0x91,0x05,0x97,0xa3,0xea,0xc5,0x11,0xc1,0x9b,0x05,0xd5, + 0x13,0x14,0xed,0x57,0xfa,0xf1,0x53,0x7c,0x13,0x24,0xe9,0x55,0x7e,0xd9,0x78,0x97,0x0c,0xa2,0x20,0x59, + 0xd9,0x0f,0xca,0x8c,0x38,0x89,0x32,0xd7,0xc0,0x3c,0x01,0xa8,0x4f,0x2c,0x50,0x81,0x6e,0xe3,0xf3,0xd4, + 0x94,0xaf,0x3f,0x41,0xf9,0xfa,0x93,0x6a,0x28,0xc5,0x08,0x39,0x2b,0x4a,0x53,0x83,0xca,0xcd,0xa4,0xc6, + 0xe3,0x80,0x28,0xad,0xfc,0xfe,0xa5,0x08,0x4a,0xf3,0x33,0x3d,0x0f,0xd5,0xef,0x7c,0x34,0x0c,0x88,0xd2, + 0xaa,0xa7,0xe2,0x26,0x0b,0xcc,0x0c,0xe4,0x34,0x2e,0x5d,0xef,0x23,0x2e,0x6f,0x65,0x0d,0x52,0xcc,0x75, + 0xa0,0x9a,0xfd,0xfb,0x9b,0xaf,0x37,0xb4,0x21,0x06,0x81,0x3c,0xf2,0xf0,0x2f,0xf9,0x32,0x9e,0xa7,0x2e, + 0xc8,0x47,0x97,0xd0,0x98,0xa9,0xb9,0xbb,0xa4,0x23,0x3c,0x8b,0x68,0xa1,0xb2,0x61,0x35,0x05,0xf1,0x20, + 0x02,0x43,0x69,0x21,0xdd,0x7e,0x70,0x9d,0x23,0xb1,0x53,0xf5,0xe6,0x07,0x04,0x90,0x33,0x0b,0xfa,0x14, + 0xb3,0xf4,0xd4,0x9a,0xa5,0x9f,0x48,0xfc,0x4c,0x0d,0x5e,0x3d,0xa5,0x42,0xb3,0xa2,0x11,0x20,0xb8,0x54, + 0x43,0x1a,0x05,0x97,0x0a,0xd0,0x8f,0xe3,0x5c,0xbd,0x3c,0x1e,0x45,0xe3,0xc9,0x48,0x0d,0xfa,0x53,0x56, + 0x8e,0x7f,0x89,0x34,0x6c,0xaf,0x46,0xc1,0x30,0x35,0x6b,0xf3,0x87,0x97,0xad,0x3f,0x54,0x88,0x92,0x0c, + 0x2f,0xd3,0x4b,0x8d,0xb0,0x59,0x12,0x94,0x6a,0x7a,0xde,0xa6,0x67,0xaf,0x46,0xd1,0x19,0x21,0xe0,0x48, + 0xbf,0xb8,0x52,0xb3,0xf1,0x3e,0x0b,0xf2,0x24,0xbd,0x09,0x32,0xdd,0xf5,0x87,0xf4,0x2a,0xbd,0x2c,0xbf, + 0x26,0x61,0x61,0xbf,0x21,0x21,0x25,0x32,0x55,0x8e,0x53,0x06,0xb4,0x9a,0x89,0x9d,0xe0,0x2a,0x32,0x20, + 0x3d,0x03,0x3a,0x3c,0x53,0xe8,0x50,0x02,0x17,0x63,0xfa,0x66,0xb7,0xec,0xc7,0x81,0xa9,0x42,0x15,0x34, + 0xd4,0xef,0xb2,0xcb,0xd2,0x74,0xf5,0xbe,0x64,0xfb,0x08,0xb5,0x6e,0xf4,0x2b,0x98,0x80,0xb9,0x94,0x69, + 0x88,0x03,0x5a,0xfa,0x40,0x76,0x5b,0xd5,0x37,0x8c,0x1c,0x6f,0x74,0xc3,0xcf,0x5f,0xb6,0x9e,0x1b,0x2c, + 0x25,0xba,0xac,0x26,0x76,0x87,0x36,0x8b,0xea,0x00,0xac,0xdf,0xcd,0x50,0xbd,0xff,0x29,0x90,0xbe,0x0f, + 0x82,0x7e,0x74,0x11,0xf5,0x57,0x0e,0x02,0x62,0xae,0x55,0x5b,0x9d,0x36,0x16,0xb4,0xd3,0xa6,0x15,0xa5, + 0x07,0x50,0x19,0xa1,0x47,0x1d,0xbf,0xed,0xed,0xaf,0xe3,0x4f,0x6d,0x7c,0x7b,0x84,0x6f,0x67,0x6f,0xd3, + 0xeb,0xd0,0x7c,0x8e,0x8f,0x35,0x2c,0x9f,0xf2,0xa2,0xf5,0x81,0xb8,0x13,0xe9,0xf6,0x87,0x38,0x20,0xf4, + 0x62,0xec,0xa9,0xba,0x26,0x39,0xea,0x6c,0x9f,0x06,0x9b,0x9f,0xeb,0xd1,0x48,0xa7,0xba,0x89,0xfd,0x60, + 0x18,0x0c,0x34,0x39,0x3a,0xc2,0xfe,0x26,0x09,0x52,0x3d,0x65,0xe1,0x20,0x09,0x2f,0xd3,0xf8,0x66,0x6c, + 0x0d,0x66,0x9b,0x64,0xb2,0x20,0x4a,0xae,0x90,0xdc,0xcd,0xbc,0xdc,0xbd,0x08,0x8a,0xea,0xe9,0x4d,0x49, + 0x4d,0xc6,0xfd,0x00,0x66,0x37,0xfa,0xdd,0xfb,0x34,0xcf,0x82,0xaa,0xca,0x87,0xb4,0x1c,0x87,0x41,0x0d, + 0x22,0xfa,0xbb,0xfa,0x72,0x66,0x2e,0x98,0x44,0x57,0xdf,0x64,0x17,0x69,0xac,0x77,0x46,0x67,0x15,0x08, + 0xd1,0x59,0x25,0x8c,0xa0,0x87,0x35,0x7a,0xf0,0xf6,0x9f,0x33,0x59,0xc7,0x2b,0xf3,0xbd,0x20,0x8c,0x6e, + 0x82,0xb0,0x9c,0x04,0xd1,0xb1,0x69,0x02,0x0d,0x18,0x0a,0x92,0x04,0x83,0x1b,0x45,0x71,0xdf,0x07,0xe3, + 0x3e,0x55,0xa5,0x1d,0xa4,0xbf,0x7c,0x1d,0xfd,0x1c,0x55,0x83,0xb9,0x0e,0x7e,0x26,0x5e,0x89,0x6d,0xea, + 0x15,0x6c,0x44,0xdd,0x4a,0xf3,0x74,0x4c,0xb4,0xf0,0xda,0x8c,0x8e,0x68,0x7f,0xc7,0x1e,0xc7,0xd6,0x24, + 0xb2,0xda,0xa5,0x6d,0x4a,0x82,0x79,0xd5,0x74,0x90,0x20,0xdb,0x9c,0x69,0x29,0x25,0x64,0x2d,0x82,0x89, + 0x41,0x1f,0x22,0xe1,0x9d,0x75,0xab,0xb1,0xf7,0x11,0xa8,0x2a,0xac,0xaf,0xa4,0x46,0x8b,0x4e,0x2e,0x5e, + 0xdc,0x82,0x8e,0xab,0x02,0x43,0x0e,0x26,0xe1,0xd9,0x0f,0x88,0xd4,0x60,0x55,0xe0,0x83,0x51,0x1f,0x88, + 0x6d,0x73,0x20,0xd6,0x3e,0xdc,0xfa,0x0a,0xb4,0xd1,0x1f,0xad,0xbe,0xe4,0x89,0x1a,0x87,0x7c,0xfa,0xd1, + 0x52,0xa4,0xc9,0x88,0xf0,0x4e,0x57,0x3e,0x4a,0xcb,0x62,0x74,0xf6,0x26,0x4c,0xb3,0x61,0x14,0x58,0xdf, + 0x70,0x77,0xba,0xa3,0x56,0x75,0xf4,0xb6,0xed,0xc6,0xca,0x92,0xf6,0xa9,0x7a,0x38,0xea,0x0b,0xb2,0xe6, + 0x48,0xec,0xa5,0xda,0x59,0x7b,0xb9,0x66,0x55,0xdf,0xca,0x82,0x61,0x49,0x18,0x18,0x34,0xaa,0x37,0x90, + 0x38,0xe8,0xcd,0xca,0x76,0x19,0x26,0x69,0x7e,0xb6,0x15,0x21,0x54,0xd3,0x7c,0xf1,0x2b,0x9a,0x4a,0x22, + 0xda,0xfd,0x45,0x9f,0x12,0x2b,0x39,0x48,0xcf,0x17,0x95,0x7c,0x5f,0xfe,0x5c,0xde,0x2c,0x78,0xbf,0x17, + 0x9c,0x1d,0x46,0xe9,0xcf,0x8b,0x3e,0xd9,0x27,0x89,0x33,0xfd,0xba,0xa8,0x84,0xbe,0x38,0x7b,0x03,0x55, + 0x27,0x51,0xdb,0x05,0xc5,0x47,0x41,0x5c,0x04,0x0b,0xdf,0x27,0x67,0xdf,0x97,0xd8,0xa7,0x0b,0x8b,0xf6, + 0xca,0x68,0x51,0x6b,0xc7,0x65,0xbf,0x1c,0x2f,0xfc,0xe8,0x53,0x3e,0xa2,0x39,0xb4,0x7a,0xa2,0xf9,0xee, + 0xc3,0xc8,0x4e,0xbf,0xd8,0x0e,0x46,0x56,0x31,0xfc,0x0c,0xc6,0xe6,0xe9,0x55,0x70,0x03,0xc3,0xd1,0xea, + 0x39,0xbd,0x19,0x05,0xd1,0x2f,0x65,0xf5,0x06,0xde,0xdb,0xb4,0x41,0xac,0x19,0xd8,0x27,0x49,0x31,0x4a, + 0xab,0xc7,0x94,0x44,0xc4,0x2b,0x12,0x4d,0xaa,0x57,0x07,0xb4,0x69,0x68,0x71,0xa2,0x73,0xeb,0x55,0x49, + 0x04,0xf9,0x6c,0x0b,0x61,0x0f,0xaa,0xe1,0x1d,0x86,0x84,0xf9,0x55,0x57,0x34,0x7c,0x22,0xda,0x16,0x74, + 0x47,0x41,0x7a,0x76,0x40,0x67,0x54,0x6a,0x61,0x67,0x81,0x74,0x82,0x37,0x36,0x7d,0x27,0x9a,0x8c,0x84, + 0x90,0xd6,0x9b,0xc3,0x14,0x82,0x7a,0x60,0x21,0x1d,0xa3,0x30,0x90,0x77,0x15,0x04,0xa9,0xd3,0xd1,0xd4, + 0x59,0x8f,0x01,0x43,0x8e,0xf5,0x59,0xdc,0x22,0xee,0x6a,0xdd,0x2a,0xdd,0x4e,0x83,0xb3,0x1f,0x48,0x26, + 0x0e,0xac,0x69,0x23,0x99,0xf8,0x8c,0x04,0x2b,0xce,0x8c,0x60,0x5e,0x66,0x41,0xdf,0x1a,0xdd,0xab,0x32, + 0x0a,0x2c,0x2c,0x7c,0x53,0x12,0x1b,0x55,0x3d,0x12,0xca,0x1d,0x04,0x5f,0xad,0x49,0x85,0xbf,0x41,0x35, + 0x5d,0x34,0xeb,0x29,0xed,0xf5,0x78,0x94,0x5a,0x30,0xf1,0x58,0x40,0x1b,0x3b,0xfe,0xd3,0x95,0xd5,0x75, + 0xa1,0x8c,0xf8,0x65,0x01,0x8b,0x49,0x8c,0x88,0x01,0xd0,0x9f,0x3d,0x79,0xf9,0xa4,0x36,0x94,0x61,0x6a, + 0x8d,0x63,0x37,0xca,0xca,0x24,0x9c,0x84,0x16,0x90,0xc1,0x4d,0xf0,0x4b,0x19,0xc5,0x15,0x9c,0x44,0x91, + 0xaa,0x05,0x23,0x94,0xdf,0xa6,0x51,0xf7,0x4d,0xf3,0x4f,0x5f,0x3e,0xb5,0x48,0x18,0x6d,0x87,0x60,0x52, + 0x71,0x1f,0x5c,0xcc,0x30,0x18,0xa0,0x57,0x0d,0xd0,0xab,0xd6,0x77,0xbb,0x30,0x6e,0xcc,0xf4,0x47,0xcf, + 0x5e,0x3e,0xb3,0xca,0x0e,0xa2,0xa2,0x1f,0x44,0x99,0x59,0x9b,0xe7,0x74,0xea,0x3e,0x17,0x2e,0x4a,0x57, + 0xd9,0x0f,0x32,0x5a,0xbf,0x3c,0x30,0xdd,0x3e,0x7f,0xf9,0xbc,0x06,0x15,0xec,0xbb,0x75,0xf3,0x74,0xee, + 0x76,0xec,0x8f,0x0f,0x83,0x2c,0x2d,0x40,0x9b,0x2d,0x9a,0x4f,0x8c,0x81,0x26,0xc2,0x74,0xa2,0xf1,0x11, + 0x6b,0x8e,0x87,0xa8,0x14,0xf2,0xbb,0xf5,0xea,0xe8,0xb8,0xa5,0x00,0xa9,0x4e,0xf9,0x9d,0x20,0xbb,0x8e, + 0x92,0x7a,0x85,0xad,0x57,0x3b,0xc7,0x8b,0x4e,0xc3,0xea,0xab,0xad,0x41,0x18,0x07,0x11,0x70,0xc9,0xbc, + 0x62,0xff,0xc2,0xe4,0xec,0x6d,0xa4,0x04,0x99,0xad,0x5d,0x6a,0xad,0x53,0xef,0x8c,0xe4,0xbe,0xfc,0x3c, + 0x48,0xec,0xcf,0xf6,0x60,0x52,0x32,0x56,0xd2,0x8a,0xfa,0x66,0x6b,0xf7,0x5b,0xfd,0xbf,0x25,0x72,0x49, + 0x62,0x71,0xf5,0x62,0x3f,0x8c,0xcf,0x49,0xc8,0xad,0x35,0x7d,0x74,0x43,0x3c,0xc4,0x4d,0x9d,0xe3,0xed, + 0xff,0x52,0xd2,0x3e,0x57,0x13,0xf2,0xfe,0xe8,0xf8,0xf9,0xd6,0x7b,0xf4,0x75,0xdf,0x3e,0xdb,0x4a,0xfa, + 0x23,0x76,0x5a,0x31,0x18,0xf5,0x3d,0xe1,0x1f,0x78,0x77,0xbd,0x0d,0x42,0xda,0xe8,0xc4,0x6f,0xc7,0x15, + 0xce,0x7d,0x48,0xc7,0x16,0x89,0x88,0x70,0x92,0xeb,0x27,0xe6,0xce,0x02,0x31,0x00,0xdb,0x3a,0x3a,0xae, + 0xed,0xd9,0x00,0x71,0x5b,0x2c,0xc2,0x4c,0x38,0x42,0xe4,0xb2,0x46,0xda,0x0e,0xca,0x10,0xbb,0xec,0x30, + 0xea,0xa7,0x35,0x1a,0x94,0x9e,0xed,0xa4,0x63,0x62,0x2d,0x53,0xd3,0xf0,0xd6,0x43,0x83,0x7a,0x83,0x58, + 0x81,0x67,0xdb,0x41,0x75,0xb0,0xbc,0x41,0xba,0xa6,0xda,0x9b,0xb7,0x34,0x83,0x17,0xc1,0x17,0x9b,0x68, + 0xf6,0x0b,0x8b,0x46,0x1f,0x8f,0x4a,0xa4,0xcd,0xd1,0x54,0x6e,0x3b,0xcc,0xc6,0xe5,0x40,0x08,0xd8,0xd6, + 0x8f,0xb4,0x88,0xcf,0x6a,0xcb,0x75,0x40,0x70,0x8f,0xb8,0xf0,0xd5,0xd6,0x71,0x6b,0xb5,0x12,0x6e,0xbf, + 0x2f,0xcf,0x8d,0x58,0x4b,0x8c,0x2c,0x8d,0xae,0x1c,0xeb,0xe7,0x7d,0x62,0x3d,0x8a,0x54,0x3f,0xfd,0x48, + 0x78,0x32,0x4a,0x43,0x61,0xc1,0x5e,0xed,0x1e,0xdb,0x22,0xf2,0x56,0x0c,0x2d,0x49,0xae,0xab,0x1e,0x97, + 0x89,0xe2,0xdd,0xb9,0xde,0x2b,0x42,0x2a,0xc5,0x06,0xd4,0xc5,0x6f,0x25,0x5f,0x87,0xb4,0x24,0x46,0xd0, + 0xa4,0xb3,0x33,0xab,0x04,0x4b,0x3a,0x7b,0x86,0x59,0x40,0x68,0x6e,0x9e,0x11,0x99,0xc4,0x3c,0x65,0x25, + 0x22,0x66,0xe5,0xe6,0x99,0x66,0x60,0x82,0xeb,0x34,0xf5,0xfc,0x06,0xa9,0xa2,0x63,0x30,0xf7,0x5a,0x5c, + 0x0e,0x06,0x59,0x34,0xa8,0x9e,0xe2,0xaa,0x63,0x3a,0x81,0x22,0xd3,0xd0,0x01,0xd8,0x0c,0xd3,0xe9,0x21, + 0xf0,0x49,0xfd,0x3e,0x8e,0x32,0x6c,0x1f,0xf5,0xf4,0x43,0x44,0x67,0xa1,0x69,0xe2,0x47,0x92,0x78,0x82, + 0x6b,0xfd,0xf4,0xa7,0x12,0x17,0x5b,0x32,0x0b,0x7a,0x3d,0x84,0xe9,0xee,0x6b,0xd1,0xf3,0x08,0xd9,0xe7, + 0x46,0x46,0xfe,0x0e,0xa2,0x49,0x18,0xe9,0x0f,0x9e,0xbc,0x32,0x18,0xb4,0x62,0x70,0x48,0x98,0x34,0x83, + 0x21,0x24,0xa0,0x07,0xba,0xfe,0xd3,0x1a,0x2a,0xd3,0xf9,0x4d,0xd8,0x84,0xbb,0x63,0xeb,0x78,0xa1,0xc9, + 0x8c,0xbe,0x5a,0xa7,0xcf,0x28,0x22,0x3e,0x80,0xfe,0x67,0x9d,0xe5,0x74,0x64,0x01,0xbb,0x2d,0x7a,0x1f, + 0x9f,0x11,0x5b,0x72,0x45,0x1b,0x23,0xb3,0x49,0x7e,0x41,0x14,0x23,0x0e,0x6a,0x67,0xd1,0xd0,0x6a,0x68, + 0x9f,0xfe,0x0c,0xec,0xc7,0x2f,0xb4,0x63,0xce,0x5e,0x41,0x1d,0x5a,0x63,0x02,0xb2,0x2c,0xbc,0xb1,0xce, + 0xf6,0xa1,0xcd,0xd8,0x1d,0x5d,0x47,0x17,0xc5,0x99,0x4a,0xed,0x58,0xa1,0x7d,0x38,0x2c,0xfb,0xd1,0x30, + 0x88,0x27,0xd5,0xc8,0x5f,0x3d,0xb4,0xd7,0x68,0x94,0x7d,0x3a,0x5f,0x4c,0x03,0x22,0xf2,0x12,0xb2,0x27, + 0xe9,0x97,0xb9,0x97,0xc7,0x61,0x1c,0xcf,0x80,0x09,0xae,0x91,0x18,0x5e,0x8b,0x2c,0x10,0x97,0x49,0x7b, + 0x3d,0x0c,0x2d,0x7a,0x43,0x9b,0xeb,0x6c,0x27,0xb8,0xa4,0x83,0x92,0x26,0xb9,0x8c,0x83,0xd1,0xe2,0xb2, + 0x57,0x21,0x07,0xbc,0x58,0x58,0xf6,0x21,0xbc,0xc6,0x4c,0x5b,0xbc,0xcc,0xc7,0x9f,0x69,0x3a,0x86,0xd6, + 0x51,0x1a,0xc0,0xc0,0xf5,0xec,0x5d,0x02,0xa7,0xbe,0x6a,0xd2,0xf2,0x34,0x86,0xc1,0x89,0x7e,0x41,0xdb, + 0x34,0x21,0x3c,0x1a,0xca,0xec,0x8c,0xf4,0x11,0x60,0x89,0x67,0x22,0x01,0xed,0x12,0x1d,0xb0,0x36,0xe1, + 0x07,0x3a,0x30,0xd3,0x73,0xc1,0xbe,0xdd,0xdd,0x1a,0x89,0x38,0xce,0xa2,0x49,0x4a,0xc2,0xae,0xc2,0x6b, + 0xb8,0xed,0xc2,0x28,0x87,0xb6,0x65,0x55,0x7b,0x57,0x6d,0xf1,0x75,0x7f,0x7d,0xe5,0x89,0xec,0x72,0xf9, + 0xa9,0xb1,0xfe,0x4d,0xf0,0x55,0x49,0xaa,0x6f,0xc3,0xf3,0x4c,0xf1,0x4d,0xb5,0x4f,0xeb,0xd2,0x88,0xf9, + 0x70,0x3b,0x24,0x8e,0xa3,0x58,0x5c,0x7d,0xcd,0x54,0x37,0x9a,0xad,0xd7,0xc4,0x46,0x0e,0xcb,0x5c,0x4b, + 0xe9,0x1f,0x08,0xef,0xe8,0xaf,0xa1,0x2e,0xc4,0xe5,0x25,0x16,0xb9,0xe8,0x23,0xa4,0x55,0x45,0x2f,0x08, + 0x57,0x72,0x9a,0xf3,0x52,0x3f,0xbf,0xc5,0x45,0x03,0x4d,0xba,0x19,0xfa,0x4d,0x64,0x74,0x5c,0x87,0x84, + 0x84,0x46,0xfd,0x95,0x5e,0x54,0x7d,0x1c,0x23,0xe6,0x66,0x92,0x54,0x24,0x22,0x4e,0xb4,0xe2,0xcb,0x1a, + 0xc0,0x3a,0x81,0xfd,0xc4,0x8c,0x77,0x5d,0x71,0x64,0x5a,0xe1,0x48,0x6b,0x21,0x1f,0x10,0x1d,0xb0,0x71, + 0x99,0xf8,0xa8,0xb2,0x3a,0x02,0xbe,0xa7,0xb1,0xda,0x7b,0xf5,0x80,0x50,0x78,0x1c,0x98,0x0f,0x77,0x1f, + 0xda,0x16,0x3b,0x61,0x91,0xa5,0x51,0x85,0x47,0xcc,0x99,0x9e,0x1d,0x97,0xd9,0xe5,0xdc,0xa6,0x50,0x7f, + 0x81,0x03,0xf9,0x5c,0x21,0x1d,0x92,0x61,0xb2,0x60,0x7b,0x1d,0xc0,0x9f,0x26,0x67,0x05,0xd8,0x6c,0xd1, + 0x0f,0xe1,0x95,0x75,0xce,0x99,0xb7,0x51,0xd2,0x87,0x60,0x31,0xdf,0x05,0x61,0x34,0x0d,0xab,0x5f,0xbd, + 0xff,0x25,0x88,0x4b,0x0b,0xf4,0xf7,0xb4,0xab,0xca,0xfe,0xe5,0xcd,0xca,0x5e,0x4a,0x92,0x90,0xe8,0x26, + 0xe6,0xca,0x40,0x6e,0x22,0x64,0x97,0xab,0x40,0xc5,0x8e,0xfb,0x29,0xb5,0x06,0x0c,0x16,0xba,0x15,0x94, + 0xad,0x83,0x0c,0xb0,0x54,0x24,0x07,0xf2,0x6e,0x21,0x0b,0xf2,0x66,0xff,0xb8,0x6d,0x1d,0x7b,0xe7,0xd1, + 0xe0,0x67,0x88,0x58,0xf2,0xb8,0x1d,0xe5,0x39,0x48,0xfb,0x85,0x26,0x70,0x59,0x7a,0x15,0x99,0xd3,0x15, + 0xa2,0xc9,0xb1,0xcd,0x99,0xec,0x04,0x09,0x5b,0x44,0x8e,0x82,0xab,0xc4,0x34,0xbe,0x5d,0x61,0xb7,0x11, + 0x98,0xa9,0x43,0x85,0x4c,0x7b,0x29,0x1d,0x8f,0x52,0xf9,0xed,0x7b,0xeb,0x4c,0x79,0x4b,0xdc,0xe8,0xd9, + 0x7b,0xfa,0x47,0x8a,0x8e,0x8e,0x6b,0x7b,0x9e,0x4a,0x89,0x46,0xc4,0x65,0x55,0xf8,0xf6,0x41,0x96,0x6b, + 0x10,0xc8,0x21,0xff,0x0e,0xc4,0x03,0x40,0x69,0x40,0x0c,0x64,0x15,0x44,0x3b,0x08,0x5d,0x9c,0x98,0xea, + 0xab,0xef,0x76,0x0c,0x1d,0x58,0x7d,0x6a,0x0d,0x80,0xc1,0xfc,0x3e,0xa4,0x03,0x1b,0x34,0xce,0xd4,0xb7, + 0x55,0xc0,0xef,0xd3,0x98,0xf8,0x38,0xc1,0xdf,0xef,0xc1,0x08,0x1b,0x6d,0x7a,0x7a,0x79,0x23,0xd3,0xff, + 0xde,0x7e,0x7d,0x70,0x43,0x03,0xbe,0x09,0x8c,0x6a,0x2f,0x4c,0x95,0xb2,0x7b,0xff,0xe8,0x3d,0x93,0x36, + 0xbd,0x6b,0x69,0x37,0x99,0x6d,0xbb,0x9f,0xe6,0xfd,0xd4,0x9c,0xd1,0x47,0xd1,0xf8,0x22,0xa4,0x5f,0xa9, + 0x51,0xa8,0xff,0x90,0xc6,0xc3,0xd4,0xd0,0xb6,0xfd,0xa3,0xe3,0x3f,0xd8,0x9b,0x46,0xe9,0x6b,0x6b,0x8f, + 0x67,0xaf,0x32,0xd8,0x95,0xda,0xd2,0xef,0xd9,0x07,0x22,0x1c,0x56,0xc5,0xb7,0xc4,0x9c,0x11,0x19,0xb2, + 0x91,0x6f,0x9f,0xe8,0x21,0x78,0xb7,0x0a,0xf9,0x88,0xb7,0x4a,0xa2,0xea,0x48,0xe2,0x2b,0x20,0x62,0x7d, + 0xf3,0xd0,0x40,0xb2,0xff,0xd0,0xaa,0x6d,0xa7,0x51,0x6e,0x4b,0x96,0xe3,0x73,0x3a,0x82,0x87,0x75,0x9e, + 0xf2,0x55,0x44,0x0c,0xd2,0x00,0xba,0x84,0x2c,0xac,0x04,0xc9,0x9d,0x30,0xb9,0xb2,0x4e,0xa5,0xdd,0x01, + 0xcc,0xdf,0x2d,0xe8,0xdf,0x25,0xe5,0x55,0x24,0x18,0xf1,0xe1,0xe8,0x18,0xd7,0x1c,0x1f,0x1e,0x02,0xe4, + 0xa8,0x38,0xfb,0x3e,0x1d,0x25,0x42,0xf1,0x3e,0xfc,0x09,0x38,0xb4,0xfa,0xe1,0x4f,0xf8,0xe2,0xb9,0xe0, + 0xd0,0xbc,0x72,0x6f,0x8b,0xb6,0x28,0xcd,0x85,0xcc,0xf9,0x01,0x21,0xb6,0xa5,0xf6,0x27,0x09,0x79,0x24, + 0xc7,0xd2,0x41,0x9d,0x8b,0x4a,0x22,0xa5,0xfc,0xa5,0xf7,0xcf,0x0e,0x1e,0x82,0x68,0x0f,0x5a,0xa1,0x84, + 0x03,0x97,0x56,0x9b,0x3a,0xfa,0xb9,0xb4,0x85,0xeb,0x1f,0x20,0xa2,0x96,0x57,0x4a,0xe6,0x3b,0xda,0x3a, + 0xaa,0x73,0xc9,0xe9,0x08,0x09,0x0f,0x99,0x9e,0x49,0x05,0xda,0x45,0xb6,0x8c,0x77,0x40,0x2c,0xc6,0xd9, + 0x81,0x16,0xa2,0x3f,0x1d,0xbf,0x42,0xff,0xf4,0x87,0x1f,0x7f,0xdc,0xaa,0x31,0xcb,0x7b,0x01,0xab,0x7f, + 0xd4,0xb9,0x4b,0x04,0x64,0x1c,0x2a,0x36,0xee,0xc7,0xdd,0xe3,0xf6,0x8f,0xbb,0x8b,0x29,0x80,0xa5,0xd3, + 0x63,0x0f,0x30,0xf3,0xfc,0x9a,0xa4,0x51,0x4b,0x10,0x20,0x16,0x97,0x4e,0x4c,0x73,0x1a,0xed,0x91,0xbc, + 0xa7,0x28,0xc6,0x8f,0xef,0xb6,0x2b,0xc5,0xfe,0xf7,0x24,0x33,0x65,0xfa,0x94,0x3c,0x00,0x71,0xa4,0x66, + 0x2f,0x55,0x3d,0x6b,0x93,0x7d,0x4f,0xd2,0xfd,0xa4,0x54,0x9a,0x11,0x2a,0xd9,0xb2,0x97,0xe0,0x32,0x20, + 0x82,0x97,0xc9,0xc5,0xdb,0xe1,0xa7,0xbd,0xdd,0x5e,0x12,0x5e,0x37,0x48,0x6a,0xa0,0xc7,0xd7,0xef,0x0e, + 0x8f,0x8e,0xf5,0xf3,0x86,0xbe,0x97,0xf3,0x2f,0xd2,0x6c,0x97,0x16,0xd4,0x71,0x4e,0x42,0xaf,0x38,0x75, + 0x8d,0xcb,0x7f,0xd2,0x2b,0xb4,0xab,0x7f,0xa3,0xe9,0x6e,0xa8,0xef,0x39,0xd6,0x64,0xe8,0x25,0x27,0xed, + 0x53,0xd7,0x4b,0xcc,0xc7,0x45,0xef,0xa5,0xf4,0xc7,0xe5,0x85,0x17,0xc2,0xd8,0x41,0x85,0x1d,0xa0,0x2f, + 0xf7,0xab,0x7e,0x2f,0xca,0x84,0xef,0x7e,0x1b,0xc5,0xd7,0xd7,0xe3,0x82,0xb6,0xa6,0x13,0xba,0xb7,0xd1, + 0x85,0xc3,0xb5,0xfc,0x51,0x90,0xd3,0xb3,0x2b,0x71,0x05,0xe4,0x4b,0x7f,0x88,0x1e,0x5d,0x8e,0x9b,0x50, + 0xf4,0x92,0x32,0x8e,0x37,0x8a,0xec,0xe6,0xb6,0xe0,0x16,0xdf,0x25,0x45,0xec,0xc3,0x8e,0x15,0xa6,0xb0, + 0x12,0x28,0xd7,0x41,0xc8,0x03,0x8f,0x7d,0xf5,0x11,0x75,0xa6,0x1b,0x7a,0xfa,0xa7,0xc4,0xad,0x85,0x69, + 0xe1,0xc7,0x8b,0x0b,0x82,0xb3,0x79,0xe7,0xde,0xf5,0x83,0x82,0xc0,0x27,0x10,0xee,0x6a,0x7d,0xca,0x28, + 0x0b,0xd7,0x2b,0xee,0xf4,0x20,0x3e,0x6c,0xed,0xef,0x1e,0xf5,0x4e,0x7c,0xdf,0x57,0x23,0x45,0xd8,0x53, + 0xc7,0x3d,0xf5,0x2f,0xa2,0x98,0x0e,0x56,0x98,0x79,0x58,0x43,0x72,0xfd,0x9c,0xa8,0x8e,0xe3,0xda,0xe3, + 0x95,0x5e,0xb9,0xdd,0x6a,0x8e,0xab,0x4f,0x36,0x68,0x16,0x1e,0x25,0x7a,0xec,0x6d,0x35,0x7b,0x41,0x8f, + 0x67,0x99,0x06,0x76,0x9c,0x1e,0xc0,0xe6,0xc6,0x29,0x5c,0x1f,0x31,0xaf,0xd1,0x61,0xd3,0x1e,0x1a,0x62, + 0x30,0x84,0x7e,0x71,0x33,0x09,0x5d,0xff,0x8a,0xce,0xe3,0xd0,0x8b,0x7a,0x2b,0x74,0x56,0x38,0x27,0xcb, + 0xad,0x53,0xd7,0xf9,0x3c,0x58,0x76,0x9d,0xcd,0x6e,0x97,0x7f,0xb8,0x9b,0x2b,0x7e,0xf8,0x25,0xec,0x3b, + 0x81,0x0e,0xe2,0xd0,0x88,0x36,0x9d,0x66,0x0b,0x6d,0x44,0x88,0xe0,0xd0,0xea,0x74,0x3b,0xee,0x63,0xe7, + 0x69,0xfb,0xf1,0x07,0xb6,0x20,0x70,0xa2,0x93,0xd5,0x53,0x77,0xd9,0x3c,0xac,0x9d,0x4e,0xa7,0x6d,0xd7, + 0xed,0xb6,0xd5,0xfc,0xe8,0xd1,0x1d,0x15,0x19,0xc2,0x46,0xf0,0x46,0x5b,0x76,0xc2,0x17,0xed,0x4d,0x6a, + 0xb4,0xdb,0x5c,0x6e,0xba,0xcb,0xc4,0xb7,0x8f,0xfc,0x8b,0x38,0xa5,0xc1,0xf2,0xcf,0xe0,0x1c,0x6b,0xbd, + 0xf2,0xb4,0xed,0x2e,0xdb,0x2f,0x7e,0xff,0x94,0xbe,0xa1,0x2f,0x54,0xc0,0x89,0x7a,0x89,0xeb,0x4f,0x82, + 0x01,0x9b,0x14,0x39,0xab,0x5e,0xb3,0xdd,0x74,0xbb,0xcd,0x66,0x6d,0x8e,0x11,0xdf,0x2a,0xc4,0x7a,0xea, + 0xb8,0x15,0xc0,0x12,0x20,0x88,0x87,0xb9,0xb6,0x56,0xc0,0x0b,0x7a,0xcf,0x9e,0xae,0x87,0x4f,0x18,0xaf, + 0xa2,0x5e,0xe2,0xe5,0xf4,0xff,0x4c,0xf0,0x8b,0xe6,0xdb,0xc1,0xeb,0xb4,0xd7,0xd9,0x48,0x5f,0xf4,0xd6, + 0x9e,0x3e,0xdd,0x48,0x97,0x97,0x75,0x9b,0xb1,0xdd,0x90,0x6e,0xde,0x59,0x2e,0x96,0xd3,0xc7,0x81,0x4b, + 0xab,0xd8,0x63,0x90,0x49,0x1e,0x71,0x22,0x2f,0x76,0xa9,0x5d,0x79,0x0e,0xbe,0x38,0x39,0x9e,0xd1,0x03, + 0xcd,0x72,0xb6,0xb4,0x14,0x3f,0xea,0xf5,0x92,0xa5,0x25,0x27,0xeb,0xcd,0xb5,0xa2,0xb0,0xf1,0x16,0xb1, + 0xb7,0x12,0x6f,0x90,0x17,0xdd,0xfc,0x65,0xb4,0xb4,0x94,0xd0,0x87,0xb9,0xd7,0xe7,0x0c,0xe9,0x39,0x5e, + 0x71,0x52,0xe6,0x6e,0x76,0xa7,0x56,0xe1,0xe8,0xa7,0xa3,0xd7,0xbd,0x5b,0xa4,0x27,0x3e,0xca,0x23,0xb6, + 0x2f,0xc2,0x6f,0xa2,0x0e,0xea,0xcf,0x8f,0xd1,0xeb,0xa8,0xa1,0x72,0xb8,0x4e,0x39,0x69,0x1b,0x42,0x9a, + 0x81,0x68,0x46,0x30,0x2b,0xd5,0x45,0x0d,0x58,0xf8,0x11,0x1e,0xb1,0x15,0x24,0xfc,0x5b,0xfc,0x29,0xea, + 0x35,0x6a,0xe1,0xda,0x55,0x88,0xd8,0x2a,0x63,0xa2,0xcb,0x79,0x91,0x0f,0x02,0x09,0xeb,0xa0,0x7a,0xcc, + 0xc3,0x7e,0x16,0x16,0xba,0x6b,0x58,0x18,0x52,0x07,0x03,0xe9,0xfb,0x40,0x9e,0xc4,0xce,0x33,0xb8,0x0a, + 0x1b,0x1c,0x31,0x16,0xe6,0x9e,0xc8,0xcc,0x20,0x8e,0x8b,0x88,0xac,0x68,0x3e,0xf3,0xa7,0x88,0x26,0xa8, + 0x02,0xf9,0x48,0x3c,0x63,0xb1,0xc0,0xa8,0x82,0x2e,0xea,0x36,0xeb,0x49,0xee,0x5d,0x4e,0xe9,0xcc,0x61, + 0x43,0x2b,0xd0,0x94,0x11,0x84,0xce,0xe3,0x38,0xad,0xf2,0x3d,0x4b,0xe4,0x44,0xe5,0x62,0xa5,0xe7,0xc4, + 0x19,0xef,0x7c,0x38,0x72,0xfd,0xc6,0x2e,0x03,0xd9,0x83,0x91,0x63,0x04,0xe0,0xd8,0xb6,0x0c,0x15,0xf7, + 0xb7,0x5e,0x35,0x82,0x01,0xe7,0x88,0xa6,0xf9,0xe2,0xb0,0xd8,0x88,0x80,0xa4,0x72,0x5a,0xea,0xcf,0x79, + 0x04,0xbd,0x5a,0x56,0x5f,0x09,0xa3,0x93,0xa1,0x01,0x9d,0x63,0x1a,0x20,0x27,0xd8,0x4d,0xb0,0x8f,0xb4, + 0x61,0x36,0x1e,0xb5,0x5c,0xd2,0x78,0x77,0x30,0x7d,0xcd,0x09,0x66,0xdf,0x1d,0x18,0xdb,0xab,0x9d,0xb7, + 0xaf,0x0e,0x1a,0x4e,0x16,0xf6,0x39,0xce,0xf2,0x20,0x1c,0xb8,0xda,0x06,0x4b,0x4a,0x68,0x96,0x2f,0x52, + 0xac,0x23,0xbb,0x3a,0x45,0x93,0xf9,0x29,0x79,0x77,0xa0,0x07,0x32,0xb5,0xd3,0x5e,0x37,0x11,0x5c,0x46, + 0x85,0xbd,0xc8,0x2f,0xe1,0xfb,0x14,0x28,0xe7,0x2c,0xaf,0x11,0xfa,0x43,0xbf,0xd1,0x79,0xbe,0xea,0x77, + 0x9e,0x3e,0xa3,0xb3,0xfe,0x49,0x9b,0xc4,0x27,0x7f,0x8a,0x0c,0x57,0xfb,0x54,0x57,0x52,0x58,0x1e,0x20, + 0x9d,0x04,0x2a,0x4b,0x3a,0x8a,0xd9,0xda,0x44,0xb4,0xe1,0xd4,0xf4,0xee,0x02,0x01,0xe2,0xd4,0xd0,0x11, + 0x78,0x32,0x18,0x74,0x79,0xc7,0xd2,0xc9,0x04,0x0a,0x19,0x4e,0xa7,0x8f,0xe8,0x64,0x2a,0xcf,0xa9,0x92, + 0x26,0x96,0xe1,0x86,0xa6,0xa7,0xff,0x95,0xa3,0xcb,0xf4,0xe1,0x45,0x83,0x64,0x33,0x3c,0x21,0x5d,0xae, + 0x9f,0x85,0x83,0xb2,0x1f,0x3a,0xaa,0xc9,0xf0,0xc5,0x8b,0x67,0xd3,0xc2,0x7d,0xf9,0xf2,0x65,0x9b,0xff, + 0xd1,0xd4,0xb0,0x4d,0x7b,0xd3,0x49,0x96,0x3b,0x4b,0x89,0xbb,0x49,0x67,0xc8,0x72,0x73,0x85,0xc8,0xd9, + 0x1a,0x62,0x31,0xd1,0x5e,0x66,0x73,0x7f,0xa1,0x4c,0x71,0x3a,0x5c,0x45,0x3d,0x97,0xf6,0x2c,0xdb,0x5f, + 0x15,0xe1,0xb5,0x58,0x2a,0xd6,0xa7,0xf4,0x8d,0x14,0x4c,0xd5,0x5f,0xf6,0x60,0x29,0x49,0x2c,0xbd,0x69, + 0x20,0x28,0x6d,0x83,0x5a,0x44,0x10,0xb1,0xe9,0x7e,0xc8,0x66,0x7b,0xb8,0xca,0x3c,0x94,0x57,0x0b,0x67, + 0x85,0x7a,0x92,0x41,0xa2,0x23,0xf1,0x56,0xae,0xba,0x3a,0xe2,0x12,0x5e,0xa3,0xa9,0xfc,0xfe,0x8a,0xdf, + 0x58,0x40,0xb8,0xb6,0x25,0x79,0x67,0x1e,0x3c,0xc2,0xcd,0x46,0x67,0xca,0xff,0x6a,0xf4,0x97,0x30,0x85, + 0xb4,0xcb,0x16,0xc1,0xc9,0x9b,0x3f,0xd7,0x55,0xc6,0xbf,0x1a,0x6a,0xea,0x7d,0x75,0x71,0xef,0xab,0xdc, + 0x3b,0x18,0xbc,0xd7,0xd4,0x1d,0x9b,0xb9,0x47,0xe2,0x2f,0x23,0x66,0xd8,0x30,0xb6,0x64,0x4f,0x01,0xd8, + 0x73,0x06,0x49,0xce,0xc1,0x55,0x76,0xb3,0x3c,0x28,0xbe,0x2a,0x2f,0x1f,0x4e,0xa8,0x00,0x9b,0x6c,0x6d, + 0xc5,0x29,0x91,0xfb,0x24,0xe0,0xc1,0x42,0x68,0x00,0x85,0xca,0xc6,0xa6,0xa3,0xfe,0x55,0xb0,0x19,0xcb, + 0x39,0x55,0xa3,0x51,0x48,0x95,0xa9,0x95,0xf4,0xa8,0x85,0xc8,0x2b,0x31,0xc2,0xbf,0xdb,0x61,0x57,0x88, + 0x80,0x5d,0x07,0x91,0x84,0xbc,0x60,0xb2,0x17,0x14,0x0d,0xe4,0x9c,0xd4,0xae,0x89,0xc8,0x84,0x00,0xf3, + 0x07,0xf1,0xcc,0x2e,0x90,0xab,0x34,0x2d,0xf2,0x49,0x5a,0xd8,0x11,0x5a,0xce,0xc3,0x48,0x1b,0xcf,0xc2, + 0xb6,0x1c,0x04,0x93,0x28,0xdd,0x35,0xc2,0xc9,0x17,0x9c,0x8c,0xc8,0xa3,0x2a,0xe2,0xc5,0x98,0x35,0xec, + 0x9c,0xdf,0xad,0xb7,0xd2,0x98,0xc4,0xc8,0x1b,0x19,0x1b,0xdb,0x27,0x2a,0xb6,0x4b,0x67,0x35,0x5c,0xaf, + 0x59,0xd7,0x62,0xbc,0x87,0x69,0x30,0x3e,0xcc,0xf3,0x68,0xd1,0xf8,0x51,0xa6,0xc2,0x2d,0xa8,0x58,0x16, + 0x2a,0x3f,0x21,0x2c,0xd0,0xd9,0x31,0x01,0xf1,0x2e,0x1a,0x41,0xbf,0x8f,0x20,0x41,0x93,0x94,0x4e,0x04, + 0xe5,0x99,0x85,0xf1,0x45,0x43,0x98,0x1d,0x70,0x00,0x1a,0x7a,0x11,0xe5,0xb0,0xc0,0xbd,0x94,0x78,0x29, + 0x6c,0x4a,0xb7,0x25,0x9f,0x1d,0xc8,0x67,0xaa,0x7d,0xbd,0xa2,0x88,0xfc,0x2d,0x0d,0x0c,0x8c,0x93,0x79, + 0x9e,0x36,0x54,0x6a,0x79,0x36,0x26,0xe7,0x96,0xd8,0xd2,0x4e,0x86,0xd9,0x7a,0x2e,0x86,0x91,0xda,0x2c, + 0x72,0xb0,0x3d,0xe6,0x41,0x86,0xe7,0xd0,0x25,0xf0,0xf8,0xc2,0x73,0x7b,0x78,0x78,0x3d,0x3d,0x90,0x63, + 0xe8,0xed,0xf1,0xf1,0x41,0x03,0x11,0xbd,0xc5,0x57,0x2b,0x42,0x96,0x1a,0x1a,0xe8,0x05,0x6c,0xb0,0x9d, + 0x41,0x78,0x11,0x94,0x71,0xd1,0x78,0x46,0x5c,0xc8,0x14,0x35,0x5b,0x1c,0xb8,0x53,0x85,0x63,0xfc,0x58, + 0xc5,0xea,0x6c,0x38,0x26,0xb7,0x31,0xea,0xd6,0x4c,0x26,0x9f,0x3e,0x79,0xb2,0xa6,0xe2,0x20,0x8d,0x76, + 0x13,0x64,0x3b,0x19,0x54,0x30,0x19,0xea,0x2e,0x25,0x84,0x4d,0xc3,0x28,0x99,0x4a,0x54,0x50,0x0e,0xe0, + 0xa8,0x62,0xe7,0x36,0x55,0xaa,0x04,0xa2,0xbf,0x5c,0xc5,0x98,0xe4,0x7f,0x7a,0xa7,0xa3,0x91,0xf8,0xea, + 0x33,0xf6,0x1a,0xa2,0xd7,0x3a,0xe6,0x08,0x1b,0xf0,0x25,0xca,0x9f,0x14,0x40,0x7c,0xca,0xc5,0x51,0x5e, + 0x41,0x20,0x1b,0x12,0x2f,0xf9,0x4c,0xdc,0x0e,0x93,0xb2,0xf8,0x2a,0x0f,0x20,0x0c,0x61,0x48,0xe7,0x09, + 0xed,0xc5,0x7e,0xd5,0x77,0x84,0x84,0xbd,0x92,0xb9,0x81,0xe8,0xc2,0x5f,0xff,0xb7,0x22,0x1a,0x7a,0xb4, + 0x48,0xe7,0x41,0x3c,0x60,0x97,0x09,0x81,0x43,0xf5,0x2b,0xa8,0xab,0xfb,0x36,0xbc,0x02,0xf7,0x6d,0x58, + 0x85,0x03,0xcd,0x25,0xfc,0x97,0x64,0x10,0xc6,0xbf,0x14,0x85,0xb5,0x20,0x78,0x5c,0xb0,0x22,0x08,0xbd, + 0x3a,0xc5,0x3f,0xf5,0xf5,0x30,0x24,0x42,0xe2,0x19,0x9d,0x4b,0x58,0x51,0xde,0x33,0x72,0x08,0x0e,0x24, + 0x9b,0xda,0x25,0x07,0x04,0x85,0x5d,0xb9,0xc9,0xf7,0xa8,0xfb,0xe6,0x40,0xa7,0x56,0xc7,0xb2,0x10,0xea, + 0x1b,0x70,0x2f,0x53,0x15,0x9d,0x15,0x15,0xe5,0x8c,0x4e,0xa5,0x40,0x18,0x34,0x3c,0x83,0x14,0x68,0x2e, + 0x46,0xb7,0xab,0xb1,0x5e,0xb5,0x6b,0xd0,0x5e,0xb5,0x0c,0x64,0xd7,0x2d,0xab,0x4d,0xd0,0x79,0xf6,0x6c, + 0x0d,0xcc,0xcf,0x18,0x41,0x57,0x65,0x28,0xf0,0x7f,0xc0,0x5b,0xc4,0xb6,0x80,0xa3,0x1e,0x13,0x7c,0x49, + 0x74,0x77,0xa9,0xe2,0x43,0xcc,0xa3,0x38,0x7a,0xd4,0xd8,0x55,0x1f,0xd5,0x7d,0xe8,0x65,0x2f,0xb2,0x22, + 0xfe,0x6a,0x2a,0x03,0x89,0xf3,0x25,0xa9,0xeb,0x53,0x62,0x66,0x84,0xda,0xcc,0xac,0xb7,0x39,0x06,0xd4, + 0xe0,0x54,0xa6,0xfb,0x04,0x21,0x60,0xe1,0xa3,0x52,0xe5,0xfe,0x50,0x73,0xa3,0xf0,0x4f,0x41,0xf7,0xff, + 0x3f,0x02,0x1e,0x30,0x37,0x35,0x3f,0x61,0xc7,0xe9,0x84,0x98,0x3d,0xe5,0x08,0xcf,0x0f,0x2d,0xc5,0x4c, + 0x01,0x35,0x0d,0x43,0x7a,0x15,0xd1,0xbe,0x7c,0xb7,0xa3,0x80,0xe8,0x35,0x54,0xaa,0xa8,0x16,0xbd,0x02, + 0x0b,0x1c,0xec,0x10,0xbb,0x09,0xe3,0xde,0x9b,0x45,0x18,0xfe,0x76,0x8b,0x48,0x99,0x2a,0x9f,0xbe,0xdd, + 0x6a,0x99,0xca,0x6c,0x95,0x9b,0x28,0xdf,0x0e,0xf6,0xf5,0xe5,0x7e,0x68,0x12,0xde,0xb2,0xee,0x94,0x8e, + 0x0d,0x15,0x18,0x4b,0xfa,0x63,0x2c,0xa9,0x17,0xd1,0x4a,0x70,0x34,0x58,0x61,0xc5,0x83,0xfb,0x86,0x49, + 0x20,0xa8,0x31,0x52,0xff,0xf3,0x03,0x1c,0x51,0x9b,0x41,0xd5,0x9b,0x1a,0x64,0xfd,0x2d,0xf8,0xe6,0x62, + 0x22,0xb1,0x77,0xd9,0xab,0x25,0x62,0xcc,0x52,0x1d,0x7c,0x20,0xf2,0x2e,0x4c,0xcb,0xb4,0x0a,0xd1,0xab, + 0x1d,0x69,0x73,0x62,0x70,0xfa,0xa1,0xdf,0xd8,0x11,0x3a,0xdf,0xa5,0xbd,0x91,0xc6,0x3e,0xb5,0xe6,0xa7, + 0xd9,0x90,0xbd,0x22,0x8b,0x5f,0x38,0x64,0xb2,0x6f,0x72,0xd7,0xcf,0xd4,0x81,0x63,0xc3,0xd7,0x0f,0x4a, + 0xca,0xd0,0x3d,0x7f,0x55,0xed,0x23,0xa0,0xef,0x54,0x47,0xf6,0x65,0xcf,0x9f,0x3e,0xc2,0x19,0x72,0xfc, + 0x25,0x13,0x4d,0x92,0xa4,0xc0,0x1b,0x15,0xc0,0x2e,0xb8,0xe2,0x18,0x2e,0x7c,0xb8,0x72,0x30,0x5b,0x11, + 0x18,0xfa,0x60,0xc6,0x40,0xdd,0x11,0xb1,0x48,0x07,0x6c,0xe2,0x18,0x69,0xba,0x09,0x89,0xfa,0xdb,0x5a, + 0xa9,0x22,0xfc,0x36,0x74,0x1e,0x09,0x5b,0xec,0xc0,0xa6,0x15,0x19,0xa6,0x4b,0x02,0xbb,0x73,0x5b,0x7c, + 0xed,0x2a,0xc5,0x86,0x28,0x5c,0xa6,0x53,0x51,0x9a,0xdd,0xc1,0x6d,0x85,0x0a,0x17,0x70,0x9a,0x7a,0x58, + 0x8d,0xac,0x8c,0xab,0xb1,0x25,0xad,0xc3,0x70,0xc8,0xd1,0x19,0x10,0x5d,0x0f,0x66,0xf1,0x12,0xdd,0x96, + 0x1a,0x98,0x48,0xc8,0x5b,0xeb,0xf0,0x65,0xab,0xf9,0x6b,0x94,0x4f,0xf9,0x77,0x6b,0x9b,0x03,0xdf,0xb2, + 0x48,0xfa,0x85,0x23,0xfd,0xf6,0xb3,0x34,0xcf,0x99,0xfd,0x53,0x0e,0x67,0x5c,0x20,0x2e,0xc3,0xd8,0xe9, + 0x1c,0x27,0x57,0xe2,0xad,0x4a,0x9c,0xdd,0x3a,0x35,0xea,0xac,0x3e,0xab,0x79,0x3e,0x71,0x23,0x6f,0x43, + 0x0e,0xf8,0x7e,0x3f,0x44,0x23,0xae,0xa0,0x40,0x62,0x8f,0x88,0x0a,0xa2,0x11,0x15,0x6d,0xe8,0x33,0x0f, + 0x32,0x50,0xc6,0x19,0xc5,0x67,0x00,0xe3,0x8f,0x36,0xaa,0xbc,0x2b,0x3a,0x36,0x38,0x27,0x47,0x52,0x10, + 0x3e,0x13,0x08,0x9f,0xce,0x03,0x98,0xdf,0x0f,0x5b,0x2e,0x50,0xe5,0x8a,0xe3,0x1c,0x07,0xc9,0x8d,0xcc, + 0x0c,0x81,0x02,0x3f,0x99,0x51,0x40,0x73,0x31,0x10,0x56,0x52,0xb2,0x11,0xa9,0xf0,0xc3,0x84,0xea,0x97, + 0xf0,0x66,0x52,0x41,0x92,0x67,0x67,0x49,0x77,0xcd,0x3c,0xa7,0xdd,0xbd,0x71,0xb4,0x7a,0xcd,0x8c,0xf8, + 0xde,0xee,0x0e,0xf8,0xee,0x82,0xe3,0x31,0xf3,0xd9,0x97,0x21,0x4d,0x81,0x8a,0xb7,0x11,0x34,0xfa,0x7c, + 0x50,0x06,0x59,0xc6,0xa6,0xd5,0x01,0xcd,0xcb,0x6e,0xff,0x32,0xf4,0x38,0x05,0x82,0xca,0xe6,0xc2,0x19, + 0x88,0x2f,0x83,0x73,0xe4,0xff,0x4c,0x38,0x4e,0xac,0xe5,0x5b,0x55,0xa4,0x93,0x3d,0x71,0x16,0x25,0x42, + 0x27,0x7e,0xa2,0x1f,0x11,0x79,0xa2,0x72,0x0e,0xa5,0x1a,0x87,0xca,0x6f,0x02,0x55,0xc4,0x37,0x94,0xeb, + 0x68,0x8f,0x50,0xf6,0x9b,0x2d,0x08,0xd5,0x55,0x4b,0xdb,0xfc,0x20,0x8d,0x7d,0xe2,0xf3,0xb7,0x6a,0x4d, + 0x2a,0xea,0x06,0x55,0x4d,0x69,0x53,0xaa,0xda,0x6e,0xa6,0x0a,0x9d,0xa1,0x99,0x5a,0x38,0x45,0x52,0x64, + 0x79,0xd3,0xfe,0xa0,0x22,0x1b,0x97,0xf5,0xe0,0x78,0x58,0x39,0x3e,0x3d,0x8a,0x2c,0xa2,0x11,0x94,0x9c, + 0x0f,0x11,0xe2,0xb4,0x72,0x75,0x8e,0x24,0xa4,0xc2,0x11,0xa2,0xf2,0x0d,0xa1,0x47,0x10,0xb4,0x9c,0x73, + 0xab,0x45,0xa8,0x6d,0xd0,0x67,0x91,0x3b,0xe0,0xcf,0x4c,0x2f,0xa6,0xbb,0x49,0xc1,0x5e,0xd1,0x2a,0x0f, + 0x40,0xac,0xdc,0x28,0xfb,0x69,0x5c,0x8e,0x93,0x7a,0x7d,0xf5,0xae,0xf6,0xc9,0xd1,0x44,0x32,0xe1,0x54, + 0x23,0x66,0xcf,0x13,0x13,0x53,0x69,0x6e,0xd4,0x84,0x08,0xec,0xb2,0x93,0xa9,0xc0,0x4a,0x08,0xd4,0x0d, + 0xa7,0x9a,0xac,0x16,0x59,0x69,0xfb,0x46,0x47,0x5e,0x6a,0x84,0x5f,0x26,0x1c,0x81,0x1d,0x5e,0x7a,0x96, + 0x2b,0x29,0xf2,0xa3,0x2a,0x3f,0x9a,0x4c,0x24,0x9d,0xb0,0x81,0xaf,0xec,0x10,0x4d,0xd6,0xe0,0x87,0x19, + 0xd8,0xc6,0x37,0x87,0xdb,0xe2,0x32,0x3c,0xc4,0xd3,0xe1,0x1b,0xf5,0x74,0x8e,0x69,0x3e,0xdc,0x7e,0xc3, + 0x4f,0xc3,0x73,0x76,0x81,0xda,0x3e,0x94,0x15,0xcf,0x50,0xb6,0x7d,0x28,0x65,0xe7,0x43,0x66,0x87,0xde, + 0x1c,0x5a,0xe3,0xa5,0x83,0x61,0xc2,0x96,0x99,0xa1,0x3d,0xde,0x4a,0xf9,0x62,0x8a,0xa7,0xd5,0x4f,0x1c, + 0x54,0x56,0x9c,0x2b,0x2c,0x6a,0x63,0x08,0x81,0x15,0xb2,0xec,0x35,0xc2,0x3f,0x37,0x9c,0xaf,0xd1,0xf0, + 0x6b,0x30,0x24,0xf1,0xe1,0x7b,0xc4,0xdf,0x44,0x4c,0x46,0x1a,0xa1,0xc4,0x58,0x51,0xa9,0x8d,0xd8,0x8d, + 0xfb,0xfa,0xaf,0x7f,0x81,0x0f,0xb2,0xf3,0xa7,0xa8,0x7f,0xf9,0x95,0xbe,0x66,0x45,0x8d,0x2c,0x04,0x76, + 0xb7,0x0a,0x6c,0xb8,0x10,0x34,0x55,0x26,0x64,0x60,0xfa,0x9e,0xb3,0x85,0x94,0x63,0x84,0x3f,0x64,0xc2, + 0x7d,0xcc,0x21,0x18,0xb0,0x41,0xd9,0xee,0x21,0xaf,0x66,0x1f,0x5b,0x55,0x7c,0x0a,0xd9,0x3f,0x32,0x44, + 0x3c,0x03,0x24,0x87,0x7b,0xcf,0xdb,0xf4,0x1c,0x4e,0xbe,0x85,0x84,0x08,0xd3,0x21,0xd8,0xab,0xcc,0xcc, + 0xbb,0x9c,0xf1,0xc3,0x06,0xf1,0x1b,0x13,0xb8,0x05,0x8d,0x79,0x12,0x48,0x9c,0x54,0x21,0x6a,0x5a,0xb4, + 0x1c,0xe8,0x0e,0x66,0xe7,0x73,0xa2,0xfc,0x87,0x89,0x2f,0x05,0x0b,0x3d,0x90,0x18,0xa3,0xf4,0xb7,0xf3, + 0xac,0xfd,0xcf,0xff,0x24,0x53,0x9a,0xeb,0x39,0x35,0xce,0xc6,0x60,0xc1,0xb8,0x02,0x31,0x61,0x83,0x2c, + 0x44,0x86,0xba,0x94,0x73,0x8f,0x09,0x13,0x18,0x65,0x59,0x9a,0x2d,0x04,0x71,0x9f,0x8b,0xa6,0xc8,0x2f, + 0x42,0x87,0x59,0x62,0x02,0x5a,0xf2,0x84,0x45,0x7d,0xf6,0x49,0x8c,0x6d,0xef,0x74,0x7f,0xfa,0x3e,0x9a, + 0x4c,0xc4,0x29,0x8c,0xf3,0xc7,0x31,0x89,0x59,0x11,0xea,0x81,0xce,0x04,0xde,0xc5,0xab,0xc6,0x45,0x02, + 0xe8,0x54,0xc0,0x05,0xb0,0xbc,0x64,0x9f,0x26,0x39,0x8c,0x0a,0x91,0x79,0x41,0xdc,0x6d,0xf3,0xeb,0x40, + 0xc1,0xc1,0xfd,0xe3,0x95,0xb8,0x95,0x4b,0x40,0x4a,0x7f,0xca,0xbd,0x4b,0xd0,0x27,0x24,0x56,0x9e,0x5c, + 0x78,0x8d,0x82,0x24,0x64,0xce,0xb6,0x83,0x78,0x6f,0x2c,0x0c,0x32,0x5c,0xa1,0x44,0xa4,0x94,0xa9,0x48, + 0xea,0x71,0x79,0x47,0xd7,0xf6,0xd1,0xb3,0x4f,0xe4,0xc9,0x0a,0xc9,0xbb,0x0f,0x3f,0xb7,0x5a,0x28,0x5e, + 0x0e,0x45,0xdd,0x60,0x5d,0x88,0x44,0xc2,0xac,0x07,0xf1,0xf5,0x99,0x98,0x66,0x43,0x8e,0x43,0xbf,0x28, + 0x0c,0xfd,0xa2,0x60,0xc1,0xf4,0xeb,0x41,0x98,0x82,0x2f,0x35,0x98,0x82,0x2f,0x33,0x30,0x71,0x08,0x8c, + 0x87,0x60,0x82,0xd0,0xfe,0xdb,0x40,0x8a,0x07,0xd9,0xeb,0xa0,0xaf,0x82,0x9c,0xd5,0xc1,0xd9,0xdb,0x39, + 0x6c,0x5c,0x70,0xd9,0x94,0x7e,0x12,0x01,0xbc,0xe4,0x54,0x58,0xcd,0x23,0xf8,0x71,0xaa,0x05,0xb3,0x62, + 0x13,0xc3,0x1f,0x79,0xc0,0x51,0x42,0x8f,0x88,0x95,0x93,0xc4,0x93,0xb4,0x5e,0x7b,0x55,0x74,0xe2,0xd6, + 0x3e,0x01,0x79,0x1d,0xce,0x86,0x94,0xed,0xb4,0x2d,0xb7,0x4b,0x82,0xe7,0x8d,0xf6,0xf9,0x9c,0x07,0x87, + 0xdd,0x41,0x19,0x9a,0x79,0xc7,0xcf,0x08,0x5c,0x22,0x36,0x3d,0xe2,0x73,0x20,0x8d,0xa1,0x40,0xe7,0x37, + 0x3a,0xbe,0x51,0xce,0xcc,0xfa,0x82,0x32,0x6b,0x4f,0xb3,0x59,0xc0,0x2f,0x74,0x2c,0xb0,0xd2,0x07,0xde, + 0x8c,0x0e,0xc6,0xef,0x2c,0x04,0xf4,0x63,0xf2,0x86,0x35,0xa7,0x06,0xd6,0x2a,0x34,0x25,0xc1,0x4a,0x1c, + 0xec,0x9b,0x0f,0x3b,0x00,0x16,0xac,0x02,0xfd,0x54,0x8e,0xdc,0x4a,0x10,0xac,0x4d,0x5d,0xc4,0xf9,0xb8, + 0x69,0xef,0xd3,0x7a,0xea,0xe0,0x2b,0x47,0x9c,0x91,0xc9,0x12,0x02,0xad,0x99,0xa4,0xcd,0x8f,0xc0,0x44, + 0xfb,0x10,0xcb,0xec,0x6c,0x11,0x2a,0x02,0x50,0x85,0x12,0x47,0x63,0xe2,0xe4,0x46,0xea,0x74,0xaf,0xcf, + 0x67,0x85,0x89,0x8d,0x5c,0xd7,0xb2,0xa2,0x67,0xe7,0xad,0x9d,0xbf,0xfe,0x65,0x3c,0xb9,0x50,0xe7,0xbb, + 0x9e,0xe6,0xbe,0xd8,0xb5,0x13,0xa3,0x38,0x41,0x6e,0x62,0x0e,0x7d,0xc1,0x23,0x51,0x97,0x38,0xd6,0x1c, + 0x67,0xe5,0x88,0x83,0x58,0xd1,0x81,0x00,0xe5,0x02,0x07,0x7a,0xb8,0x90,0x51,0x28,0xbd,0xd8,0x8c,0x4b, + 0xff,0x8c,0x1e,0x4f,0x39,0x2d,0xef,0x44,0xb0,0xe3,0xcf,0x0e,0xe1,0x5b,0xbc,0x60,0x14,0xca,0x6f,0x79, + 0x20,0xb5,0xc4,0x71,0xf9,0x18,0x3c,0x42,0xa6,0x23,0x3f,0x08,0x64,0x1c,0x8c,0x45,0xa6,0x1e,0x71,0x64, + 0x54,0x44,0x54,0x4c,0x7c,0x96,0x02,0x69,0x11,0xb6,0x47,0x65,0x51,0xd0,0x73,0x8e,0xb3,0x21,0x4b,0xbf, + 0xa2,0xaa,0x8a,0x96,0x7d,0xc1,0x29,0x58,0x74,0xd0,0x87,0x45,0xa8,0xd1,0x06,0x6e,0xc0,0x1b,0x5c,0x6e, + 0xd4,0xe6,0x01,0xb6,0x7d,0xc0,0x53,0xae,0x63,0xfb,0x80,0xab,0x8b,0x5c,0x3a,0x51,0x06,0x03,0x41,0x07, + 0x09,0xea,0x22,0x3b,0xab,0xd1,0x7a,0x4e,0x0b,0x40,0x72,0x6b,0x9c,0xab,0xe0,0x43,0x39,0x12,0x39,0x05, + 0xac,0x68,0xcd,0x06,0x9c,0x9e,0x5c,0xef,0x31,0xdc,0x78,0xf0,0xb1,0x80,0x8f,0x86,0x9c,0xbb,0x4c,0x8e, + 0xbb,0x37,0x48,0x9c,0x55,0xe6,0x21,0x0e,0xe5,0x71,0x58,0x53,0x35,0xae,0x6a,0xdf,0x79,0x8d,0xe7,0x6a, + 0x3d,0xfe,0xf9,0x9f,0xb0,0x1e,0xa3,0x72,0x7c,0xdf,0xa0,0x8c,0x27,0xba,0x1a,0x91,0xed,0x89,0xfe,0xf0, + 0x90,0x1e,0x00,0x5c,0x43,0xf5,0x44,0x45,0x53,0x98,0x85,0x8a,0x1d,0xc4,0x31,0xd5,0x3b,0x61,0x1f,0xe9, + 0x2d,0xf3,0x87,0x27,0x7b,0xa0,0x6a,0xd9,0xd3,0x8d,0x08,0x37,0xe0,0xd7,0x03,0x93,0xcd,0xae,0xb9,0x23, + 0xd1,0xfe,0x24,0x16,0x8e,0xa8,0x07,0xf8,0x3b,0x51,0x04,0x23,0x42,0x18,0xd7,0x94,0x88,0x2d,0x50,0x83, + 0xbd,0xc7,0xf7,0x33,0xa4,0x15,0xf4,0x21,0xbd,0x56,0xb8,0x79,0x4c,0xbc,0x4a,0x8e,0xc0,0x14,0x0b,0x68, + 0x5a,0x7a,0xdd,0x52,0x68,0x4e,0x7d,0xa9,0x6a,0x82,0xc3,0x3f,0x06,0x19,0x72,0x38,0x5e,0xa3,0x37,0x30, + 0xe2,0x01,0xe7,0x3c,0x8b,0x99,0xcf,0x26,0xac,0x85,0x59,0x21,0x31,0x8f,0x95,0xde,0x19,0x15,0xc2,0x44, + 0xe7,0x3b,0x93,0xac,0x97,0x7b,0x01,0x22,0x39,0x06,0xc8,0x20,0x33,0x43,0xd1,0x16,0x3a,0xdb,0xe3,0x20, + 0xde,0x96,0x20,0xd0,0x1c,0x3f,0xbe,0x48,0x6a,0x4c,0x22,0x95,0xce,0xc6,0x90,0x96,0x63,0x58,0x8e,0xf5, + 0x5c,0x6f,0xb1,0x99,0x53,0x3c,0xe8,0x0b,0x1f,0xc6,0xfb,0x8c,0x03,0xef,0x28,0x02,0xf7,0xa1,0xb4,0x08, + 0x9c,0x84,0xc1,0x31,0x07,0xb9,0x92,0xee,0x10,0x49,0x1b,0xd9,0xbf,0x39,0xd8,0xc5,0xd0,0x84,0x96,0x16, + 0x28,0x5e,0xa9,0x7b,0x15,0x0b,0x56,0xa5,0x64,0xe4,0x62,0x6a,0xf7,0x1c,0xb9,0x23,0x15,0xac,0xad,0x1f, + 0xe5,0x51,0x6b,0xc5,0x3f,0x1d,0xee,0x81,0x98,0xc5,0xac,0xfe,0x55,0xe3,0x82,0xb6,0x06,0xc7,0x28,0x2b, + 0xc3,0xa9,0x82,0x64,0xf8,0xc1,0x19,0x21,0x6d,0x0c,0xb2,0x12,0xd7,0xca,0xb8,0x87,0xc8,0x10,0xba,0xc0, + 0x28,0x7f,0x27,0x51,0x22,0xa1,0xf0,0x01,0xcb,0x70,0x82,0xb4,0x1d,0x95,0x34,0xa1,0x82,0xe4,0x43,0x98, + 0x9c,0xaa,0x9c,0x3c,0x3b,0x92,0xbb,0x09,0x11,0xcb,0x02,0x0c,0x3d,0xd4,0xdb,0x02,0x92,0x87,0xc4,0xe0, + 0x07,0xb7,0x4a,0x95,0x62,0xe4,0x2e,0x42,0x90,0x63,0x22,0x4f,0x10,0x43,0xa4,0x01,0x23,0x34,0xac,0x7a, + 0xeb,0xde,0x13,0xaf,0xb3,0xe6,0x75,0xd6,0xbd,0x0e,0xfd,0x78,0xea,0x75,0x9e,0x79,0xab,0x1d,0x6f,0xf5, + 0x89,0xb7,0xfa,0xd4,0x5b,0xfd,0x83,0xb7,0xb6,0xea,0xad,0xad,0x9d,0x5a,0x71,0x3b,0x38,0xf7,0x4d,0xa3, + 0xb9,0x1c,0xe2,0xfa,0x0f,0x16,0x16,0x9b,0xcd,0x86,0x23,0x79,0x5b,0xdc,0x26,0xac,0x0f,0x4e,0xa1,0x1f, + 0xa1,0x01,0x6d,0x17,0x09,0xa4,0x4d,0x6b,0x44,0x15,0xd1,0x95,0xd9,0x62,0xf1,0x53,0x42,0x80,0x8b,0xf8, + 0x49,0x8d,0xa7,0x55,0x14,0x7c,0x4e,0x04,0xca,0xba,0xcd,0xc9,0x84,0xf6,0xcd,0x04,0x92,0xa4,0x84,0xbc, + 0xbf,0x4a,0x91,0x17,0x92,0x63,0xeb,0x49,0x16,0x37,0xd9,0xe8,0x2a,0x08,0xc3,0x73,0xd3,0xff,0x11,0x4f, + 0xe1,0x03,0x10,0xc8,0x1c,0x2b,0x18,0x38,0xac,0x03,0xc7,0x16,0x0f,0x83,0x8c,0xef,0xd5,0x60,0x37,0xc5, + 0x21,0x29,0xf2,0x0d,0x59,0xda,0x46,0x71,0xad,0x54,0x7d,0x82,0xd6,0xb2,0xc1,0x55,0x7a,0xf4,0xa9,0x24, + 0x61,0x2c,0x88,0x12,0xc5,0x03,0x95,0xe6,0xb0,0xa4,0x2f,0xc1,0x82,0x83,0x00,0x0c,0x58,0x96,0x51,0x21, + 0x49,0x4d,0x0a,0x04,0x9d,0x48,0x41,0xe2,0xb9,0x2f,0x1e,0xc7,0xa1,0xd6,0xce,0xdc,0x33,0x0c,0x91,0xce, + 0x65,0x14,0x4a,0x3a,0xaf,0x4f,0xa5,0x4e,0x28,0x50,0x9f,0xc6,0x99,0xcc,0x01,0x8b,0x7b,0x17,0xea,0xb2, + 0xb0,0x73,0x29,0x62,0x72,0xc3,0x3a,0xd1,0x20,0x4e,0xe1,0x92,0x10,0x25,0x93,0xd2,0x04,0xf7,0x3b,0xaf, + 0x9f,0xaf,0x88,0xc5,0x8f,0x6a,0x48,0xd0,0x23,0xe2,0x75,0xde,0xb0,0x8e,0xdc,0xfc,0x1e,0x28,0xf6,0x06, + 0xd9,0x22,0x08,0xf6,0x2c,0x1e,0x68,0x6a,0xb1,0x37,0xf7,0x42,0x43,0xcc,0xd4,0x22,0x08,0xf0,0xfa,0x9e, + 0xe1,0x97,0x5f,0xbf,0x86,0xd9,0xe2,0xa9,0x47,0xc9,0x54,0xfe,0xb0,0x32,0x2c,0xfc,0x4a,0xcc,0x34,0x3f, + 0xca,0xfd,0x13,0xc2,0x87,0x48,0xac,0x5e,0x22,0xbb,0xa0,0xa8,0xd0,0x88,0x51,0xa5,0xd6,0x51,0xc9,0xac, + 0x26,0x5f,0x45,0x1d,0x23,0x8a,0x88,0x44,0xec,0x95,0x5a,0xc9,0x3d,0x90,0xbc,0x5b,0xed,0x1f,0x0d,0x82, + 0x45,0x90,0xbc,0x5b,0x7d,0xd5,0x38,0xda,0xd9,0x9a,0xaa,0xbf,0xcc,0x26,0x32,0x93,0x77,0x0e,0x3b,0x0a, + 0x8e,0xeb,0xa3,0xd2,0x59,0x6d,0x23,0xcf,0xc6,0x8e,0x8e,0xdd,0x73,0x4f,0x27,0xfd,0xf8,0xde,0x4e,0x5e, + 0xed,0x4d,0xd5,0xdf,0x7a,0x27,0x2a,0x18,0xbb,0xdd,0xcb,0x71,0x50,0x45,0x33,0x9a,0xe9,0x64,0xe7,0xe2, + 0xf0,0xcb,0xa2,0x2e,0x76,0x5e,0x1f,0xd0,0x36,0x42,0xf8,0xc7,0x3f,0x4e,0xad,0xdf,0x9a,0x0d,0x43,0xac, + 0xee,0x86,0x79,0x1f,0xca,0xd5,0x54,0x15,0x80,0x5c,0xdf,0x3f,0x15,0x88,0x36,0xa7,0x6a,0xdd,0x0b,0xc0, + 0xf1,0xc3,0x00,0x1c,0x5b,0x00,0x1c,0xff,0x67,0x00,0xe0,0xdd,0x6a,0xbe,0xdd,0x8f,0x2f,0x17,0xcf,0xf3, + 0x51,0x63,0xfb,0xd5,0xde,0xfb,0xa9,0xfe,0x01,0xb1,0xff,0x0b,0x6b,0x07,0xe2,0xc6,0xce,0xd6,0x2b,0x46, + 0x2d,0x56,0x64,0xc3,0xa6,0x21,0x23,0x26,0x28,0x65,0x1c,0xdb,0x3f,0x58,0x23,0xfc,0x92,0x9a,0x04,0x1d, + 0xd7,0x04,0x7e,0xbd,0x53,0x55,0xa5,0x66,0xa9,0x6b,0xde,0x0b,0xd7,0x5e,0xf6,0x00,0x60,0x7b,0x87,0x1a, + 0x32,0xfe,0xc5,0x51,0x7b,0x88,0x05,0xa4,0xce,0x10,0xf4,0x3b,0x1b,0x28,0x7a,0x0a,0x4c,0x88,0xcf,0x05, + 0x0a,0xe4,0x0f,0xc8,0x70,0xcc,0x5f,0x73,0x8c,0xc9,0xfb,0xba,0xdd,0x51,0xb6,0x06,0x8b,0x7a,0xdd,0xf9, + 0xf8,0xe9,0x78,0xaa,0x7f,0xd4,0xfa,0xd4,0xc8,0x5d,0x75,0xf6,0x30,0x72,0xe7,0xfb,0x0f,0x0c,0x6e,0x5f, + 0x8f,0x6d,0x5f,0x86,0xc6,0x6b,0x9e,0xa7,0xd2,0x17,0x52,0xe1,0xd2,0x49,0x8f,0xf0,0x4d,0xdb,0x59,0x50, + 0x72,0x78,0x31,0xc4,0x77,0x1b,0x13,0x37,0x3d,0x92,0x1a,0xf7,0xf4,0xba,0x35,0x9e,0xc8,0x5d,0xe9,0xa2, + 0x7e,0xa9,0x30,0xa6,0x43,0xc6,0xa0,0x13,0xd4,0xa3,0x2a,0x29,0x57,0xd6,0x92,0xcf,0x8c,0x41,0x41,0xa8, + 0xd3,0xfa,0xe8,0x4f,0xa0,0xda,0xa8,0xb2,0xe9,0x10,0x40,0xd6,0xc7,0x1c,0x78,0x67,0x01,0x40,0x39,0x58, + 0x27,0xeb,0x5a,0x37,0x4f,0x06,0x75,0xc9,0xf3,0x08,0x15,0xa6,0xc7,0xc8,0xd7,0x4a,0x8c,0x07,0x1c,0x58, + 0xd5,0x95,0x0b,0x23,0x1e,0x91,0xb4,0x16,0xf1,0x98,0x30,0x3a,0xa0,0x6a,0xb9,0xdf,0x38,0x64,0xb4,0xc2, + 0xe5,0x5f,0xde,0x50,0x39,0x68,0x89,0xfd,0x09,0xca,0x49,0xa1,0x0e,0x39,0x45,0xe6,0x76,0x23,0x3a,0xe6, + 0xe2,0xcb,0x98,0x24,0x24,0x70,0x9d,0xf2,0x99,0x52,0xf1,0xb1,0x86,0x8a,0xb7,0x4a,0x30,0x89,0xba,0xc4, + 0xf7,0x70,0xbe,0x20,0x11,0xe1,0x98,0x9c,0xfe,0x00,0x9d,0x6c,0x68,0x83,0x5b,0x25,0x6e,0x12,0x7a,0x7b, + 0xc5,0x35,0x14,0x31,0x6e,0x59,0xa9,0xcd,0xa0,0x4b,0x3a,0x3e,0x3e,0xde,0xb3,0x68,0x30,0x3f,0xb7,0x66, + 0xa9,0x6d,0xc5,0xd0,0xce,0x01,0x31,0xb8,0x98,0xf0,0x66,0x7e,0x00,0x0c,0x43,0x15,0x14,0x20,0xfa,0x79, + 0x06,0x94,0xe3,0x8c,0xd8,0x4d,0x84,0x47,0xa6,0x01,0xc7,0xbf,0xa2,0xe7,0xf1,0x64,0xed,0x81,0x4e,0x69, + 0x23,0xeb,0xfe,0xe8,0xe7,0x4c,0x57,0x92,0xc1,0x4e,0x91,0x85,0x37,0xf6,0x7d,0xab,0xbd,0xff,0x1f,0xe8, + 0x9b,0x09,0xc6,0x03,0xbd,0xcb,0x12,0xaa,0xfe,0xf9,0x61,0x06,0x82,0x77,0x35,0x22,0x85,0xf0,0x98,0x16, + 0x25,0xfa,0xb5,0x00,0xec,0x87,0x45,0xb0,0x10,0x4f,0xa5,0xfb,0x22,0x63,0xbb,0xa8,0xe4,0x22,0x55,0x20, + 0xf0,0xcc,0x2a,0x69,0x5b,0x47,0x1d,0x97,0x7b,0x05,0xc9,0xff,0x03,0x52,0x29,0x61,0x5e,0x61,0x62,0x2a, + 0x9f,0x17,0x51,0x81,0xb8,0x62,0x47,0x1c,0xc7,0x96,0x49,0x24,0xc2,0xf2,0x25,0x2a,0xe1,0x33,0xb7,0x68, + 0x45,0x1d,0x5f,0x80,0xa5,0x1a,0x41,0x16,0x02,0xaa,0x51,0xc1,0xe0,0x84,0x4d,0xd0,0x03,0xa4,0xe8,0x83, + 0xc2,0x09,0x8e,0xb2,0xca,0xbe,0xd2,0xe0,0x12,0x11,0x0f,0xda,0x61,0x9a,0xa6,0x13,0x9f,0x84,0xca,0x5c, + 0x57,0xee,0x8e,0x12,0x53,0xb5,0x75,0x80,0xaa,0x24,0x47,0x60,0x98,0x39,0x4f,0xf4,0x55,0xc0,0xc7,0xf8, + 0x38,0xca,0xfb,0x36,0xc1,0x81,0xad,0x97,0x32,0xe2,0xa1,0x1a,0x53,0x7e,0x6c,0xe9,0x0f,0x62,0x75,0x11, + 0x93,0x5e,0x70,0x7e,0x1f,0xae,0x3a,0x4c,0x1b,0x9c,0x7c,0x04,0xee,0x17,0xb0,0xf3,0x90,0xbb,0x18,0xa4, + 0xa1,0x90,0xa6,0x26,0xea,0x3d,0x87,0x0c,0x64,0xee,0xf7,0x1a,0xb1,0x3c,0x92,0xd9,0x0c,0x5a,0x48,0xa0, + 0x55,0xcb,0x9b,0x95,0x15,0xca,0x5c,0x4f,0x81,0x58,0xe9,0xc2,0x33,0x04,0x8d,0x29,0xa6,0xea,0x2f,0xeb, + 0xf0,0xfb,0x61,0x74,0x45,0xac,0xb2,0xbc,0x69,0xec,0xec,0xff,0x11,0x93,0xf5,0x69,0xe7,0xa0,0xf1,0x74, + 0xfd,0xc9,0xba,0x3f,0xb5,0x0b,0xa0,0x23,0xd2,0x25,0x30,0x4f,0xb8,0x30,0xd6,0x3d,0x83,0xf0,0xbc,0x1c, + 0xea,0xe4,0x03,0xb3,0xbd,0xee,0xa0,0x50,0x42,0xf3,0xf2,0x4f,0x13,0x97,0x17,0xd6,0x6d,0x69,0xce,0xe6, + 0x7f,0x11,0xad,0x18,0x71,0x8e,0x43,0x49,0x65,0x54,0xe6,0x17,0xc8,0x19,0x13,0x4b,0xea,0x0d,0x14,0x87, + 0x9c,0xda,0x70,0x4f,0xd5,0xc0,0x72,0x70,0xb6,0x44,0x7a,0xb0,0x29,0x2e,0xbf,0xab,0xa1,0x72,0x09,0x91, + 0x00,0x6f,0xf3,0x69,0x95,0x50,0x51,0x5a,0x67,0x29,0x0f,0x66,0xac,0x17,0x59,0x08,0x6e,0xf2,0x1c,0x8b, + 0xb1,0xde,0x6e,0xbc,0xdf,0x06,0x4b,0x7b,0xb8,0xb5,0x2f,0x1a,0x70,0xce,0x56,0xaf,0xb2,0x8a,0x70,0x4b, + 0x3e,0x1d,0xfc,0xb4,0x80,0x2c,0x9e,0xaa,0xb6,0xf9,0x36,0xf4,0x32,0x44,0x99,0x0e,0xaa,0x2c,0x4a,0x8a, + 0xea,0xc2,0x16,0x56,0xb1,0xf9,0x04,0xb7,0xb3,0xfd,0xc0,0x57,0xdd,0xa0,0x8f,0x52,0xf5,0x31,0x51,0x51, + 0x90,0x15,0x94,0xa6,0x13,0xe6,0x7a,0xf4,0x5b,0x1d,0x36,0xb8,0xa1,0x53,0x55,0x3e,0x98,0x07,0x15,0xe1, + 0xe0,0x7e,0x3a,0xb2,0xc2,0xc1,0x29,0x6b,0x3b,0x95,0x64,0xba,0xfa,0x25,0x31,0xd6,0xc4,0x32,0x4a,0x32, + 0x45,0x9b,0x1f,0x52,0xa4,0x4c,0x27,0x54,0x1a,0xe8,0xea,0x97,0x8a,0xf0,0x26,0xd6,0x07,0x2a,0x25,0x71, + 0xf5,0x4b,0x4a,0xf5,0x05,0x84,0xce,0xa9,0x6a,0xfd,0x94,0x0a,0xbc,0xa7,0x39,0x79,0xac,0xfe,0x2b,0xef, + 0xd5,0x81,0xae,0x92,0xb9,0x56,0xbf,0xa4,0x54,0xb4,0x0a,0x92,0xbc,0xd3,0xfc,0x50,0xc1,0xe2,0x14,0x9d, + 0xd0,0xd9,0x39,0xad,0x9f,0x6f,0x75,0x8c,0x57,0xc1,0x13,0x93,0x75,0xd3,0xfe,0xad,0x86,0x2c,0x48,0xac, + 0x92,0x6b,0x56,0xbf,0x38,0xd0,0xdc,0xd1,0xc7,0x4f,0x1f,0x76,0xce,0xde,0xef,0xfe,0x74,0xd4,0x53,0x49, + 0x26,0xd9,0x41,0x03,0x26,0xf1,0xae,0xe5,0xa3,0x51,0x51,0x32,0x12,0xe6,0x51,0x78,0x12,0x9e,0xfa,0x44, + 0xe2,0x5c,0xef,0xa8,0x77,0x6b,0xe5,0x44,0xeb,0x9e,0x9c,0x0a,0x79,0xe9,0xc2,0x60,0x9f,0xc8,0x75,0xf7, + 0x51,0xc7,0xcb,0x6f,0x72,0x49,0x48,0xdd,0xc4,0xcf,0x4f,0xd1,0x00,0xbf,0x30,0x27,0xaa,0x52,0x39,0x90, + 0x1f,0x0a,0x05,0x91,0x68,0x19,0xcf,0x77,0x95,0x87,0x02,0xf4,0x78,0x4c,0xd8,0x5e,0x05,0x13,0xf8,0x34, + 0xdc,0x1e,0xf9,0x66,0xd7,0xf4,0x1e,0x75,0x1e,0xc1,0x85,0xc3,0xbc,0xa8,0xf2,0x76,0xfa,0x4c,0x39,0xa7, + 0xd3,0xdb,0xbb,0x8d,0x23,0xfc,0xee,0xdd,0x0a,0xab,0xd0,0x7d,0xd4,0xa6,0x61,0x14,0xbe,0x3c,0x79,0x4c, + 0xe0,0xf5,0x3b,0x7e,0xc0,0x99,0xaa,0x5f,0xd0,0x4f,0x39,0x65,0xf4,0x0b,0x7e,0xb8,0xf3,0x42,0x1f,0x43, + 0x58,0x5a,0x72,0x8e,0xf8,0x47,0x4f,0x9e,0x91,0x83,0x30,0xbe,0xc1,0xe2,0x32,0xa8,0x52,0xe6,0xba,0xca, + 0xd3,0x60,0x14,0xe4,0x47,0x51,0x72,0xd9,0x73,0x7c,0xdf,0x0f,0xdd,0xde,0xcb,0x47,0x0c,0xd6,0x74,0x4a, + 0xd0,0x13,0x0b,0x89,0x89,0xe6,0x17,0x34,0xb9,0x44,0xfb,0x92,0x1b,0x3d,0xe4,0x9e,0x43,0x75,0xd5,0xb7, + 0x4e,0xf3,0x5c,0x0b,0x93,0x0c,0x2a,0xfd,0x25,0x08,0xe9,0x5f,0x06,0x8b,0x0d,0x85,0xf2,0x23,0x33,0x37, + 0xf8,0x90,0xe7,0xc7,0x9a,0x30,0xa2,0xb0,0xc1,0x55,0x10,0xc5,0x20,0x36,0x1f,0xd2,0x22,0xe4,0x4a,0x45, + 0xe1,0x34,0x3f,0xc0,0xfc,0x55,0x97,0xc8,0x41,0x13,0xe5,0x0d,0xce,0xa1,0x8b,0x5d,0x7f,0xa1,0x15,0x7e, + 0x92,0x3b,0x38,0xd1,0xe9,0xcc,0x89,0x04,0x0d,0x39,0xd9,0xb0,0xbb,0x11,0xe4,0x37,0x49,0xbf,0x61,0x96, + 0xad,0x5a,0x50,0x87,0xbd,0x95,0x94,0x13,0x87,0x86,0x05,0x05,0x2e,0xbc,0x92,0xec,0x17,0xb4,0x9c,0x54, + 0xc5,0x09,0xd8,0x16,0x98,0x30,0xcc,0x69,0xae,0xd0,0xbf,0x2b,0x57,0x9d,0x15,0xb1,0xa0,0x52,0x4e,0x4a, + 0x90,0x04,0xd6,0xc3,0xb5,0x3b,0xd7,0xf5,0x99,0xbf,0x37,0xa3,0x23,0x3a,0x09,0x33,0xe1,0xca,0x45,0x69, + 0xa6,0x71,0xed,0xb1,0x64,0xbf,0xbe,0x33,0x10,0xd7,0x57,0xcf,0x72,0x88,0x09,0x7d,0x65,0xc8,0x9a,0x03, + 0x9d,0xbc,0x84,0xdd,0x75,0xb4,0x92,0xcb,0x0b,0x7a,0xca,0x30,0xde,0x09,0xa7,0xd3,0x93,0x53,0xd7,0x2c, + 0x67,0xf1,0xb2,0x17,0x9e,0xb4,0x4f,0x97,0x96,0x8a,0x17,0xf4,0xa3,0x43,0xcb,0x1a,0xf5,0x4e,0x4e,0x8d, + 0xab,0x4c,0xd1,0x6b,0x6f,0xa0,0x04,0x7e,0x2e,0x1b,0xc5,0xf2,0xb2,0x1b,0x38,0xf4,0x3b,0xca,0x91,0xc7, + 0x89,0xda,0x9b,0x4e,0xe9,0x31,0x53,0x79,0x96,0xe7,0x1b,0xf6,0xe3,0x54,0x1a,0xf6,0x47,0x11,0xd5,0x8d, + 0xfc,0x49,0x99,0x8f,0x9c,0x42,0x7b,0x90,0xe5,0xbd,0x48,0xef,0xe0,0x82,0xb0,0x00,0x4d,0xb3,0x9a,0x03, + 0x22,0x0b,0x35,0x4e,0xbc,0x53,0xad,0x02,0xca,0x83,0x41,0xbf,0xc3,0x45,0x29,0x06,0x24,0xb9,0x67,0x6f, + 0x75,0x6b,0x01,0xeb,0xf7,0x82,0xde,0xcb,0x93,0x80,0x06,0x4c,0x3b,0x81,0xd0,0x74,0x33,0x71,0x02,0x77, + 0xb9,0x69,0xcc,0x7c,0xdd,0x69,0x73,0x59,0xbf,0xd2,0xe6,0x5e,0x6e,0xb3,0x8b,0x57,0xa7,0xee,0x86,0x26, + 0x1c,0xd7,0x3d,0xa3,0xb7,0xd4,0xaf,0x2e,0xc6,0x45,0x2f,0x31,0x4f,0xe9,0xa4,0xe8,0x45,0x9b,0x27,0x27, + 0x24,0x94,0x70,0xc8,0x60,0x04,0xfd,0x67,0x5b,0x51,0x3a,0xa8,0x10,0x3b,0x58,0x9b,0xaa,0x13,0x3b,0xd1, + 0x1f,0xc5,0x29,0x67,0xa8,0xb6,0x23,0x09,0xe7,0x6e,0x37,0xbf,0xdb,0x48,0x9d,0xa6,0x51,0x99,0x36,0x3d, + 0x4c,0x32,0x7e,0x61,0x1e,0xbd,0x47,0x1d,0x17,0x04,0xdd,0x68,0xae,0x68,0xff,0x88,0x02,0xa9,0x79,0x6a, + 0xbc,0xf3,0x68,0x96,0x53,0x9a,0x85,0xcc,0x7b,0xd4,0x76,0x75,0x6d,0xd1,0x56,0x4a,0x6d,0xa3,0x3a,0x34, + 0x8f,0xda,0x1c,0xc6,0xa8,0x84,0xe4,0xb7,0x28,0x65,0xaa,0xdf,0xfd,0x58,0x7e,0x43,0xc3,0xa0,0xdf,0xb2, + 0xa8,0x6f,0x1e,0x58,0xbe,0x36,0x4f,0x3b,0x92,0xb3,0xb0,0x12,0x4e,0xe5,0xc1,0xc8,0x8c,0xf3,0x30,0xe7, + 0x02,0xb3,0x4c,0x00,0x34,0x29,0x4d,0x2f,0xc2,0xab,0x0d,0xe3,0x8b,0xe5,0x57,0xbd,0xbe,0xec,0xb5,0x37, + 0xe5,0x88,0xea,0x6a,0x5b,0xb5,0x8d,0x93,0x7f,0x6b,0xa8,0x6e,0xf5,0xd2,0x0e,0x7b,0x31,0x31,0x76,0x21, + 0x21,0xde,0x97,0x70,0xb0,0xb4,0xc4,0x1b,0x8e,0x93,0x93,0x33,0x55,0xa1,0x2d,0x37,0xb3,0x19,0x6b,0x65, + 0x0f,0x6e,0xc7,0xb0,0xd6,0x9f,0xa3,0x3a,0x9c,0x4e,0x25,0xbd,0x2f,0x68,0x2a,0x75,0xae,0x47,0x78,0xe7, + 0x6e,0x1c,0xbc,0xfb,0x80,0x73,0x6f,0x21,0x94,0x84,0xa1,0x0c,0x60,0x85,0xa0,0x43,0xc6,0xf7,0x05,0x73, + 0x45,0xa3,0x41,0x1d,0x6b,0x42,0xfd,0x51,0x8f,0x4d,0x46,0xce,0x4b,0xda,0x5c,0xad,0x88,0x93,0x60,0x06, + 0x6c,0x59,0xab,0xa5,0x72,0xaf,0x71,0x4e,0xd4,0x4d,0x29,0xc4,0x6c,0x81,0x1c,0x7a,0x46,0x4e,0x4b,0x8e, + 0xb4,0xec,0xb8,0xd7,0x86,0xb0,0x34,0x81,0xb6,0x96,0x2a,0x79,0x8d,0xed,0xa8,0x28,0x44,0x65,0x66,0x75, + 0xc9,0xcb,0x82,0x3e,0x59,0xe5,0x61,0xf5,0xb1,0x48,0xd9,0x62,0x75,0x36,0xab,0x74,0xb1,0x9a,0xc4,0xda, + 0x2e,0x6a,0xb1,0xa6,0x4a,0xa9,0x35,0xa5,0x55,0x2a,0x89,0x73,0xd2,0xb4,0x2e,0xad,0x9b,0x44,0xf1,0x18, + 0xd7,0x80,0x84,0x2f,0xda,0x4b,0x4b,0x28,0xd7,0x92,0x90,0x29,0x54,0x9b,0x50,0x97,0x2f,0xb8,0x92,0x25, + 0xdc,0x5a,0x70,0xd5,0x45,0x6f,0xed,0x98,0xd3,0xa6,0x3d,0xd9,0x70,0xba,0xb9,0xea,0x9e,0x94,0xea,0x9b, + 0xeb,0x45,0xbe,0xc8,0xa9,0x6e,0xf5,0xd4,0xa3,0x1d,0x5d,0x5b,0x6a,0x57,0xe1,0xb1,0x2b,0x70,0x79,0x6f, + 0xa3,0xf9,0xc2,0x9a,0x2f,0x42,0x0d,0x30,0x03,0x98,0x44,0x5b,0x21,0xe1,0xc7,0xbd,0x26,0xab,0x11,0x6e, + 0x8c,0x18,0x2e,0x4a,0x85,0xba,0x20,0x3c,0xff,0x1d,0x4d,0x7f,0x5d,0x29,0xe1,0x69,0xd9,0x6f,0x16,0xaf, + 0x66,0xb5,0x15,0x56,0xc6,0xf8,0xfb,0x70,0x09,0x72,0x47,0xe8,0x33,0x43,0xab,0x81,0xae,0x6c,0x4e,0x09, + 0xfb,0xab,0x37,0xb9,0xb5,0x17,0x30,0x9b,0x95,0xb5,0x23,0xf6,0x7b,0x65,0xd8,0xa7,0x9f,0x2a,0xa3,0x37, + 0xfd,0xa6,0x66,0xec,0x35,0x67,0x8f,0x55,0x7b,0x67,0x55,0xa5,0xc9,0xae,0x67,0x3d,0xaf,0x40,0x12,0x3b, + 0x54,0xef,0xf6,0xba,0x6b,0x8e,0x11,0x5c,0x53,0xa9,0xf1,0xf8,0x62,0x85,0x9a,0xdb,0x51,0xe4,0xe9,0x38, + 0x9a,0x7c,0x69,0xe2,0xce,0x49,0x73,0x62,0x6a,0xf3,0xf7,0x4e,0xec,0x23,0xe2,0x37,0x92,0xf8,0xd9,0xa3, + 0xe3,0x37,0x10,0xfe,0xc3,0x2f,0xff,0xd6,0x47,0x80,0x77,0xb8,0xbb,0xfd,0xf1,0xe3,0xb1,0xb0,0xf2,0x50, + 0x5b,0x1c,0x85,0x85,0x5e,0x2e,0x99,0x30,0xe5,0xd0,0x0a,0x1f,0x57,0xf5,0x13,0x46,0xf5,0x90,0xfb,0x2b, + 0xbf,0xc1,0x66,0x84,0x2c,0x2b,0x43,0xe3,0x6e,0x27,0xfe,0x72,0x48,0xf9,0x95,0xe4,0x1d,0xf9,0xb3,0xaa, + 0x3e,0xae,0xbb,0x80,0x61,0xb3,0x54,0x9e,0xa0,0xca,0x6f,0x08,0xbc,0x69,0xe5,0x20,0xa2,0x9e,0x94,0x27, + 0x86,0xf6,0xb2,0x50,0x3f,0xe1,0xdc,0xa0,0xdf,0x0a,0x54,0x95,0x65,0x3f,0xe7,0x99,0xb7,0x54,0x16,0x80, + 0x43,0x93,0x10,0xaf,0x39,0x2b,0x3e,0x37,0x0d,0x17,0xa0,0xd6,0xd8,0xb5,0x5c,0x9d,0x27,0x84,0x64,0xc5, + 0x41,0x94,0x50,0x77,0xd5,0x71,0x92,0x18,0x37,0xfb,0xd9,0x23,0xa1,0x30,0xec,0x4f,0x40,0xec,0x5b,0x71, + 0xca,0xce,0xe6,0x81,0xf2,0x9f,0x54,0x87,0x69,0x44,0x8c,0x11,0x6c,0xbf,0xdd,0x8d,0x88,0x49,0xc0,0xa3, + 0x84,0xfd,0xf1,0x23,0x97,0xa8,0x0f,0x7b,0xc4,0x47,0x1e,0x31,0xd7,0x7c,0x8c,0x14,0xa7,0x7e,0xcc,0xf9, + 0x0c,0x66,0xfb,0x09,0x4c,0x3f,0x11,0xf5,0x13,0x90,0x0c,0xd5,0x8b,0x96,0x96,0x22,0x3f,0x4b,0xaf,0xfd, + 0x5f,0x4a,0x42,0x32,0xc1,0x42,0xe2,0x1a,0x35,0xc6,0x8b,0xdf,0x7b,0x5e,0x07,0x05,0x0c,0x9d,0x80,0x02, + 0x06,0x53,0xde,0xb1,0x9d,0x7c,0x0e,0x8e,0x0a,0xf2,0x99,0x6b,0x86,0xa3,0x7c,0xd2,0x43,0x71,0x7a,0x07, + 0x5f,0x9a,0xf0,0xb7,0x81,0xbb,0x11,0xfa,0x92,0x83,0x09,0x76,0xbc,0x38,0x6a,0xad,0x27,0x13,0xdb,0xe0, + 0x9f,0xff,0xf7,0x46,0xd3,0x25,0xce,0x76,0xd9,0x09,0x78,0xd4,0x04,0x6e,0x40,0x62,0x46,0xb6,0x29,0x45, + 0xcb,0x05,0xb3,0x1e,0xc8,0x37,0xd6,0x24,0x66,0xb0,0x4b,0x6f,0x22,0x5c,0xfb,0xde,0xdd,0x59,0xe7,0x3b, + 0x2f,0xc6,0x8f,0x44,0xc1,0x68,0x41,0xe0,0x14,0x5e,0x01,0x17,0xfa,0xf6,0xe6,0x23,0xd8,0x8e,0x94,0xb0, + 0x25,0x7f,0xfd,0xac,0xe8,0xcb,0x52,0x4c,0xa7,0x8f,0xa2,0xfa,0x1c,0xe4,0x66,0x39,0x92,0xda,0x30,0x72, + 0x59,0x9c,0xc8,0x70,0xd0,0xb9,0x66,0xcd,0x73,0xc5,0x9a,0x6f,0x12,0xcc,0xd7,0x04,0xcd,0x87,0x94,0x1d, + 0xe4,0x67,0xe0,0x64,0x31,0xff,0x28,0xfa,0x1a,0xd6,0x21,0x35,0xd3,0x68,0x91,0x4f,0xee,0x1e,0x33,0x5a, + 0x2f,0xcc,0x75,0x01,0x81,0xf8,0x38,0x22,0xee,0x3b,0x7f,0xb1,0xb6,0x3a,0x9d,0xe6,0x2f,0x3b,0xab,0xcf, + 0xd0,0xf7,0x84,0x28,0xca,0x80,0x5b,0xe0,0xfe,0x09,0xfe,0x3e,0x3c,0x62,0xe0,0x19,0xd1,0xa3,0x73,0x6e, + 0x30,0x0c,0x69,0x16,0x1d,0x9a,0x61,0xfa,0x4d,0xec,0xc7,0x30,0x4d,0x69,0x6e,0xd5,0xa8,0xd3,0x99,0xbe, + 0x64,0xc7,0xab,0x0e,0xa9,0xa5,0x2c,0x9c,0x20,0x54,0xdf,0xab,0x51,0x44,0x87,0x73,0x98,0x38,0x19,0xf5, + 0x4b,0x44,0xf1,0xaf,0xff,0x03,0x35,0x99,0xd2,0x8f,0x1e,0xfd,0xcd,0x1f,0xe3,0x97,0x2c,0x1d,0xd1,0xc0, + 0x41,0x8e,0x95,0x93,0xd5,0x74,0xa2,0x97,0x9d,0xcd,0xa8,0x2a,0x15,0x5b,0xd3,0x8f,0x17,0x5c,0xa3,0xb9, + 0x1c,0x98,0xa6,0xba,0x5c,0xfc,0x91,0xe8,0x37,0x5c,0x7b,0x21,0xe2,0x0c,0xc3,0x84,0x84,0x9c,0x6a,0x2e, + 0xd3,0x38,0x06,0x98,0x76,0x34,0x07,0xaa,0xc2,0xf1,0x04,0x02,0xaa,0xf8,0x68,0x46,0x84,0x8c,0x94,0xe4, + 0x48,0xb8,0x45,0xd5,0x66,0x97,0xba,0xa9,0xeb,0x35,0x49,0x1c,0xb9,0x99,0x84,0xb8,0xc0,0xa5,0xa9,0x74, + 0xbb,0x05,0x4d,0x2f,0x58,0x12,0x3f,0x49,0xaf,0x1d,0x89,0x82,0x91,0xf6,0x72,0xc6,0x99,0x41,0xda,0x2f, + 0x91,0x5b,0xdd,0x17,0xfe,0x8d,0x05,0x50,0x91,0x36,0x43,0x07,0xf1,0x0d,0xda,0x24,0xfc,0x98,0xd8,0x03, + 0x6d,0x2f,0x6f,0x39,0x55,0x43,0xad,0xcc,0xb5,0x82,0x5f,0x04,0xcb,0xcb,0xa6,0x2e,0x61,0xf0,0xfa,0xe3, + 0xfc,0x71,0xe0,0x75,0xc2,0x75,0xf7,0x8e,0xb6,0xbd,0xa2,0x8b,0xb4,0xfb,0x53,0xf7,0xce,0xb1,0xb0,0x3e, + 0x17,0x6a,0xab,0xd5,0x18,0xf8,0xd9,0x0b,0xbd,0x79,0x11,0x38,0x9c,0x93,0x69,0xe9,0xc4,0xd6,0x34,0x96, + 0xd5,0x0e,0x4a,0xaf,0xd2,0xab,0x5e,0x7b,0x66,0x70,0xac,0xae,0xb6,0x4a,0x68,0x85,0xfe,0xf6,0x0f,0xff, + 0xad,0xf2,0x76,0x69,0x7c,0x78,0xc3,0xe7,0x7f,0x19,0x0d,0x74,0x43,0x9f,0xa2,0x41,0x8f,0x5f,0xe8,0x03, + 0xf2,0x78,0x6b,0x9b,0x35,0x6d,0x9c,0xee,0x11,0xf9,0x5b,0xaf,0xa2,0xf0,0x1a,0x29,0x5c,0xad,0x44,0x0a, + 0xf8,0x73,0x1c,0x9c,0x4b,0x19,0x12,0x29,0x54,0x2a,0xa9,0xdc,0x50,0xe6,0xaa,0x86,0xa8,0x25,0xb8,0x52, + 0x84,0x4e,0x70,0xdc,0xc8,0x5f,0x94,0xbe,0xc3,0x4f,0x94,0x85,0xc4,0x71,0x31,0xf7,0x25,0x3f,0xcc,0xe7, + 0xbb,0xfc,0xc8,0xdd,0x43,0x2f,0x82,0xfe,0xf1,0xb7,0x02,0x00,0x4f,0xa2,0xa7,0x8b,0x61,0xc1,0x9d,0x33, + 0x6b,0xa1,0x7f,0xa2,0xc6,0x81,0x7a,0xe2,0xa4,0xb4,0x62,0x8f,0x81,0xe1,0xe9,0x5f,0x3c,0x42,0x79,0xe0, + 0x81,0xdc,0xe4,0xc4,0x12,0x62,0x1c,0xea,0x07,0x8f,0x81,0x7f,0x4b,0x46,0xb2,0x21,0x73,0xa5,0x43,0x29, + 0xd8,0x4b,0x87,0xa7,0xa7,0x15,0x9e,0xab,0xcc,0x93,0xec,0xd8,0xed,0x68,0x54,0x0f,0x7b,0xc4,0xf1,0xf3, + 0x15,0x03,0x8e,0x88,0x91,0xde,0x95,0xce,0xca,0x9f,0xbf,0xfb,0xbc,0xb2,0xb9,0x02,0xd7,0x9f,0x0d,0xa3, + 0x9e,0x08,0x26,0x9b,0xba,0xe7,0xee,0xad,0xdc,0xa4,0x75,0xf5,0xc8,0x45,0x1f,0xa5,0x9e,0xee,0x58,0xca, + 0x09,0x2b,0x0c,0x4b,0x82,0x2b,0xab,0xcb,0x3a,0x24,0x24,0x2a,0x71,0xd3,0x58,0x5e,0x2d,0xfc,0x3b,0x90, + 0x8d,0xa0,0xe3,0x93,0xde,0x80,0x7b,0x6e,0x77,0x41,0x05,0x47,0x75,0x08,0x75,0xdb,0x74,0x6a,0xe9,0xa7, + 0x88,0xc6,0x10,0x1e,0x99,0x95,0x97,0x72,0x5b,0x0f,0x45,0x15,0xdc,0x8d,0xdf,0x39,0xcd,0xef,0x08,0xb4, + 0xa6,0x8b,0x53,0x71,0xab,0x20,0x96,0xeb,0x1c,0x20,0x35,0x83,0x2c,0x0a,0x5a,0x31,0x0c,0xe6,0x9b,0x1e, + 0x91,0x0f,0xa4,0xca,0xe4,0x6a,0xae,0x57,0x7d,0x31,0x4b,0xbf,0x7c,0xdf,0x4f,0x98,0xc1,0x73,0x4e,0x12, + 0x2f,0x00,0x70,0x61,0x4c,0x2d,0x35,0xbd,0x5b,0x92,0x0d,0x2e,0xba,0xcd,0xef,0x56,0x9a,0xcb,0x89,0xc7, + 0xf4,0xb3,0x1b,0xd2,0x80,0x92,0xcd,0x26,0x32,0xb9,0x01,0x9b,0xb9,0x3b,0x35,0x29,0x4d,0x5d,0x38,0x41, + 0xd2,0x49,0xd1,0x3a,0x7a,0x38,0x03,0x41,0xbd,0x2c,0xed,0x23,0xee,0x7c,0x68,0x4a,0x89,0x02,0x2d,0x2f, + 0x6f,0x2c,0x9e,0x58,0x1e,0x5e,0x7e,0x49,0xfc,0x93,0x5b,0x3b,0x77,0x68,0x44,0xf2,0xd6,0xe3,0x65,0x31, + 0x21,0x17,0x00,0x2f,0x86,0x4a,0x20,0x43,0x21,0x0a,0x14,0x82,0x50,0x8a,0x56,0xf8,0xb7,0x19,0x33,0xc2, + 0x47,0x38,0x89,0xeb,0x39,0x6a,0x45,0x92,0x01,0x0d,0x9a,0x43,0x0e,0x15,0xbc,0x52,0xd3,0x29,0x0a,0x10, + 0x59,0xe8,0x64,0xf5,0x94,0x2a,0xde,0x5d,0x53,0x15,0xe2,0x1b,0x82,0xc1,0x60,0xf7,0x8a,0x20,0xd8,0x63, + 0xa7,0x53,0x82,0xbf,0x09,0x9c,0x13,0x33,0x55,0xc2,0x20,0x1e,0x93,0x4c,0x31,0x5c,0x58,0xa0,0x84,0x76, + 0x17,0x7c,0xd3,0x8f,0x23,0xe8,0x18,0xa1,0x22,0xbc,0xdd,0xdb,0xfa,0xf0,0xa6,0x87,0x38,0x41,0xd4,0x2f, + 0x7e,0x6f,0x36,0x91,0xc2,0x90,0x03,0x07,0x01,0xaf,0x63,0xdc,0x26,0x22,0x89,0x69,0x70,0x0d,0x76,0x7a, + 0x8f,0x5a,0xe5,0x6a,0x33,0x7d,0xcc,0x2e,0x25,0xaa,0xf8,0x45,0xca,0x56,0xe7,0xc8,0x57,0x80,0x13,0x52, + 0xcf,0xf8,0x9d,0x00,0x78,0x99,0x5e,0x44,0xbf,0x02,0x40,0x35,0x70,0x04,0x0a,0xa0,0xc1,0x16,0xc5,0x24, + 0xef,0xae,0xac,0x5c,0xa6,0xad,0x8b,0x88,0x38,0xc2,0xf1,0xca,0x39,0xf1,0x39,0xc4,0x17,0xf5,0x99,0x6b, + 0x3c,0x43,0x22,0x14,0x70,0xd1,0x49,0x8a,0xfa,0xf4,0x4e,0xe1,0x1b,0x51,0xd0,0xfc,0x5f,0xda,0x57,0xd5, + 0x83,0x3f,0xa4,0x55,0x2b,0xcf,0xfd,0x28,0x5d,0x91,0xd9,0x68,0x25,0xc3,0x95,0x7b,0xba,0xd5,0xfa,0xea, + 0x51,0x38,0x0e,0x89,0x61,0xea,0x01,0x0a,0x7e,0x10,0x30,0x66,0xf8,0x3f,0x24,0x16,0x9b,0x65,0x68,0x8f, + 0x51,0x9b,0xf0,0x53,0x37,0x31,0xb3,0xc1,0xb0,0x25,0x40,0xaa,0x58,0x08,0xa0,0xb5,0x33,0x87,0x84,0xfe, + 0xb1,0x1b,0x87,0xf2,0x4c,0xe2,0x3d,0x7d,0xea,0x73,0x3b,0x9b,0xcd,0xef,0xa2,0xd6,0x38,0xe5,0x6d,0x43, + 0xbf,0xf2,0x92,0x80,0xa9,0xf6,0xc4,0xf8,0x52,0xec,0x0d,0xea,0x27,0x39,0x90,0x9a,0x75,0x8c,0xd0,0xd2, + 0xd2,0x79,0xdc,0x6d,0x92,0xb0,0xd9,0xbf,0x3c,0x4f,0x89,0x87,0xe7,0x5f,0xe1,0xa0,0x1b,0xde,0x19,0x22, + 0x57,0x80,0x45,0x5e,0x30,0xcd,0x0a,0x47,0x0b,0xd7,0xbb,0x4d,0x70,0x13,0x87,0x66,0x15,0x81,0xb8,0x95, + 0x3d,0xdd,0x14,0x73,0x83,0xe6,0x9d,0x97,0x78,0xdc,0x29,0x96,0x8f,0x7b,0xee,0x26,0x77,0x77,0x33,0x33, + 0xf8,0x30,0x56,0xeb,0xed,0xfc,0xad,0x59,0x01,0x5b,0x8c,0x36,0x7b,0xd5,0x44,0x86,0x7a,0xa6,0x90,0x0f, + 0x8a,0xa6,0x49,0x0a,0x38,0xd0,0xd6,0x82,0x0d,0xc1,0xab,0xa4,0xbf,0xb1,0x42,0x68,0xd9,0x4b,0xe8,0xb1, + 0x3d,0xe1,0xcd,0x41,0x94,0x5f,0x86,0xb1,0x7a,0x67,0x42,0x82,0xfd,0xb8,0xbb,0xfb,0x7e,0x67,0xeb,0x27, + 0x3e,0x96,0x91,0x59,0x40,0xb2,0xb6,0x95,0xc9,0xf4,0x28,0xd5,0x59,0xee,0xe5,0xdd,0x7e,0x9a,0x4c,0xf7, + 0xe5,0x5d,0x51,0x86,0xb9,0xbc,0x3c,0x2e,0xc3,0xe9,0x4e,0xa4,0xee,0xc7,0x06,0x89,0x7e,0xfd,0x63,0x38, + 0x98,0xee,0xcb,0x6b,0xc2,0xd8,0x4c,0x57,0x1e,0x95,0xd3,0x1d,0x69,0xe1,0x02,0x11,0x70,0xf1,0xee,0x75, + 0x16,0x4d,0x5f,0x4b,0x58,0x39,0xce,0xd2,0xa5,0xfa,0x0f,0x8a,0xe9,0x51,0x80,0xab,0xa4,0x1f,0xdf,0xed, + 0xbc,0xd9,0x3d,0xc6,0x7d,0x10,0xdf,0x59,0x02,0x33,0x68,0x75,0x02,0xd7,0x48,0x36,0x06,0x67,0x1e,0x3d, + 0xc2,0x7b,0x8d,0x05,0x34,0x3f,0x08,0x85,0x34,0x70,0x22,0x1f,0xab,0x4d,0x8b,0x2e,0x0b,0x19,0x89,0xba, + 0xda,0x23,0x26,0xb6,0x8b,0x95,0x52,0xcf,0xbe,0x42,0x24,0x0f,0x36,0xe2,0xe1,0xdc,0xeb,0xde,0xa3,0x47, + 0xe1,0xdd,0x9d,0x27,0x16,0x08,0xf3,0x30,0xcc,0x63,0x68,0x26,0xc8,0x86,0x6b,0xe8,0x02,0x7c,0xdc,0xe6, + 0xa6,0x98,0x1b,0x14,0x60,0x00,0x37,0x37,0x57,0x9f,0x3c,0x11,0x8b,0x70,0x92,0x7d,0xe8,0xcf,0xe6,0x66, + 0xc7,0x63,0x89,0xa9,0xab,0x18,0xee,0x84,0x08,0x70,0x1b,0x36,0x33,0xdc,0x74,0x4e,0xdc,0x77,0x85,0xa4, + 0x90,0x55,0xef,0x3c,0x15,0x92,0x2b,0x71,0x97,0x9d,0xc2,0xc7,0xed,0xf6,0x74,0xda,0x6c,0xb2,0xfa,0x1d, + 0x52,0xc8,0x1c,0x3d,0x54,0xd5,0xc3,0x99,0xea,0x26,0xe0,0xd8,0x02,0x74,0x56,0x03,0x62,0x74,0xce,0x68, + 0x1a,0x95,0x48,0x17,0x90,0x4c,0xc6,0x34,0xb4,0x9a,0x61,0x2f,0xaf,0xa6,0xd7,0x4c,0xac,0x0e,0x4f,0xa6, + 0xbf,0x53,0x13,0x7b,0xab,0x5e,0x10,0x77,0x8a,0x40,0x6b,0x77,0x34,0xab,0xec,0xae,0x38,0x3f,0xa9,0xfc, + 0x1a,0xc1,0xb0,0x9c,0xdf,0xba,0xae,0x2c,0xaf,0x72,0x87,0x11,0x88,0x16,0x16,0x8e,0x29,0x1d,0x84,0x2c, + 0xbe,0x7f,0x30,0xb7,0x0f,0x4e,0xd3,0xba,0x66,0xc4,0xe6,0x4b,0x20,0xd3,0x6e,0x1e,0xf9,0xd6,0xeb,0x7a, + 0xe2,0xc0,0x2e,0xd7,0x20,0x6e,0x83,0x36,0x3b,0x0e,0x68,0xb9,0x7d,0x22,0x91,0x31,0xaf,0x6e,0xdb,0xd4, + 0x5c,0xe3,0xf4,0xc4,0xc5,0x94,0x3c,0xd2,0xf1,0x8f,0x4a,0x65,0x92,0x8f,0xa2,0x8b,0xc2,0x39,0x09,0x3c, + 0x27,0xc1,0x05,0xc5,0x26,0xff,0x4b,0xc5,0xdd,0xaa,0x22,0xf1,0xd5,0x2d,0x91,0x8a,0xa8,0x2f,0x31,0xa7, + 0x81,0x71,0xb3,0x11,0xc8,0x19,0x29,0x94,0x0a,0x49,0x2e,0x39,0x15,0xdb,0xa2,0xc2,0x06,0xa2,0x5c,0x64, + 0x73,0x42,0x1b,0x41,0x2c,0x83,0x00,0x6a,0x2e,0x88,0x66,0x9a,0x57,0x36,0x90,0x77,0xd0,0x2b,0x14,0x60, + 0x55,0x36,0xb2,0x07,0xa8,0x68,0x64,0xad,0x7f,0x56,0xc9,0x8b,0xb9,0x1f,0x87,0xc9,0xb0,0x18,0xbd,0x24, + 0xa9,0x58,0x5b,0x7e,0x18,0x21,0x2a,0xa7,0x09,0xa1,0xff,0xa9,0x95,0x54,0xeb,0x96,0x19,0x84,0x49,0x37, + 0x15,0xca,0x64,0x0a,0x65,0xba,0xea,0x87,0x46,0x1d,0xf5,0xd8,0x33,0x70,0xd3,0xc2,0x26,0x4a,0x40,0xfd, + 0xf6,0x8e,0xd4,0x76,0x28,0x66,0x4b,0x56,0xfb,0x71,0xf1,0x56,0x4c,0xee,0x7e,0xcd,0xf6,0x08,0xac,0x89, + 0x90,0x9d,0xb5,0x39,0xbf,0x65,0xf1,0x5a,0x72,0x16,0xe7,0xc5,0x4d,0x4c,0xc0,0xb4,0x5a,0x65,0xdc,0xa5, + 0x05,0xe6,0x0f,0xd4,0x9c,0x2d,0x37,0xf9,0xe8,0x89,0xbc,0xc5,0xdf,0x53,0x91,0x54,0x77,0xdd,0x6e,0xf4, + 0xeb,0xf7,0x9b,0xd9,0x6e,0x34,0x59,0x48,0x8d,0x3e,0x3f,0x55,0xfa,0x00,0xa8,0xa3,0xd0,0x03,0x33,0x39, + 0x7f,0xfa,0x6e,0x65,0x59,0x70,0xe3,0x47,0x39,0xff,0x25,0x9a,0x84,0x13,0x38,0x4a,0xfa,0x71,0x39,0x08, + 0x21,0x91,0x56,0x13,0x19,0x40,0xff,0x74,0x3f,0x56,0x05,0x2e,0xf3,0xad,0xa1,0xa7,0x07,0x77,0xdf,0x41, + 0x4d,0x23,0x01,0x00,0xf5,0xd9,0xe2,0x9d,0xa0,0xb0,0xf7,0xee,0x6e,0x9e,0x62,0xa0,0xe6,0x20,0xba,0xaa, + 0xb5,0x92,0x53,0x1b,0xc4,0xf6,0x47,0x7a,0x93,0x87,0x42,0x55,0xdc,0x6a,0x82,0x09,0x63,0xe7,0x8e,0x8c, + 0xca,0x84,0x21,0xac,0x9f,0x13,0x6e,0xd5,0x0e,0x09,0xbd,0xd5,0x1a,0x58,0xaa,0xbf,0x62,0xe6,0x64,0xa9, + 0xcf,0x5d,0x48,0x73,0x17,0x56,0x73,0x57,0xa0,0x19,0x97,0x09,0x18,0xe2,0xa1,0xfc,0x1a,0x3c,0xd7,0xe1, + 0x4f,0x9a,0x08,0xeb,0x93,0x12,0x8b,0x3a,0x21,0xf1,0x14,0xf8,0x1f,0x5e,0xb7,0xaa,0x32,0x3e,0x1d,0x70, + 0xdb,0x11,0x66,0x5d,0x30,0xdc,0x86,0xf9,0x76,0x4a,0x84,0xbb,0x15,0x6f,0xb2,0x82,0xa8,0x50,0x5c,0xc5, + 0x50,0x61,0x57,0xa7,0x6d,0x15,0x26,0x05,0x0e,0x17,0x54,0x57,0x56,0x6e,0xc0,0x15,0xe7,0x82,0xb2,0xb8, + 0xcd,0xdf,0xbc,0x85,0x6c,0xcc,0x66,0xae,0xb6,0xfb,0xa8,0x6d,0x4d,0x7c,0x45,0x0f,0xf8,0x58,0xd2,0xc8, + 0xdd,0x6c,0xe2,0x1c,0x81,0xfe,0x78,0x9e,0xc4,0xcf,0xad,0x3a,0xaa,0xf1,0x66,0xbc,0xe3,0xd3,0x72,0x6e, + 0x02,0xc5,0x13,0x47,0x68,0x40,0xb0,0xb9,0xd9,0x9c,0x9d,0xc8,0xf4,0x82,0xf8,0xde,0x2c,0xc5,0x36,0xee, + 0x23,0x29,0x1f,0xef,0x04,0x11,0x00,0xed,0x8a,0xcc,0xb9,0xb1,0x52,0x9a,0x8b,0xc2,0x2f,0x13,0xb8,0x68, + 0x43,0xc7,0x06,0x4f,0xbc,0x90,0xa7,0xe6,0xfe,0x39,0x89,0x2a,0x9a,0x0a,0x08,0xc5,0xc7,0xc7,0x80,0xa8, + 0x1f,0xad,0x11,0xf5,0x03,0x8e,0x97,0x53,0x04,0x1c,0xca,0xe8,0x0b,0x91,0x98,0x8e,0xee,0x5a,0xf6,0x0e, + 0x94,0x68,0x2a,0x7e,0x62,0x0e,0xd3,0xa7,0xe6,0xdf,0xfe,0xfb,0xff,0x9b,0xe4,0xc7,0x78,0xf1,0x04,0x11, + 0x8f,0x5a,0xea,0x51,0x62,0x18,0xbc,0xdb,0xdc,0x8d,0x58,0xe9,0xb7,0x7a,0xb4,0x2a,0xb9,0xa1,0xff,0x5e, + 0xea,0xc5,0xa2,0x0e,0xeb,0xc3,0x0e,0x41,0x00,0x1f,0x80,0x11,0xb9,0xcd,0xa1,0x36,0x2f,0x88,0x17,0x25, + 0x3a,0xe0,0x17,0xf0,0xfb,0x82,0x01,0x02,0xc9,0xf6,0x96,0x1d,0x0e,0x3d,0xdd,0xea,0x86,0xa7,0x53,0xc7, + 0xee,0x23,0x5b,0x24,0xd5,0x9b,0xa9,0xf4,0xd4,0x54,0xba,0x95,0x86,0x2a,0x0b,0x91,0x11,0x7d,0x66,0x4e, + 0xd9,0xfd,0x2d,0xcc,0xe0,0xb6,0xdd,0xf4,0x06,0xb6,0x10,0x5e,0x42,0xa5,0xa1,0xe8,0xef,0xd2,0x12,0x75, + 0xbd,0x40,0x25,0xd0,0xd7,0x7b,0xba,0xba,0x27,0x5e,0x34,0x63,0x29,0xac,0xa4,0x64,0xc2,0xd4,0xd1,0x7b, + 0x37,0x4b,0x9b,0x48,0x84,0xca,0x41,0x16,0xe6,0x09,0xfc,0x10,0x95,0xfd,0x8c,0x8a,0xe9,0xe8,0x47,0x98, + 0xb4,0x65,0x9a,0xae,0x30,0xe9,0x6f,0x36,0x1b,0xff,0xef,0x7f,0xfa,0xef,0xfe,0x23,0x3b,0x37,0x55,0xdc, + 0x5a,0xf1,0x0d,0xe1,0x43,0x1f,0x94,0xd2,0x9f,0x07,0xa5,0x3f,0x09,0x01,0x13,0xe6,0xda,0x8a,0x3b,0x30, + 0x89,0x3e,0x09,0x95,0x24,0x09,0x7b,0xd5,0x5c,0x77,0xbe,0x39,0xd7,0x45,0x56,0xd6,0xa6,0x7a,0x1e,0x86, + 0xb9,0x79,0x4e,0xbf,0x55,0x09,0xb3,0x1a,0xfa,0xf0,0xb6,0xa2,0x3a,0x2a,0xd8,0x8f,0x05,0xd6,0x26,0xad, + 0x4f,0x57,0xe0,0x5e,0xb4,0x57,0x2e,0xc3,0x9b,0xaa,0x99,0xe6,0x6e,0xde,0x0f,0x26,0x2a,0xf2,0x2e,0x95, + 0x2c,0x2d,0x4d,0x2c,0x29,0x67,0xf4,0xc0,0x36,0x82,0x72,0xa6,0x49,0x1f,0x27,0x16,0x43,0x3c,0xba,0x7f, + 0x8a,0x59,0x97,0xcc,0xf3,0x3c,0xf2,0x07,0x51,0xce,0xd7,0x43,0xc0,0xd5,0xd1,0x1c,0xf2,0xa8,0x66,0xa1, + 0x65,0x45,0xd3,0x2c,0xc1,0x85,0x90,0x0a,0x17,0xd8,0x21,0x89,0x9a,0x6c,0x05,0x98,0xd4,0x12,0x58,0x66, + 0xec,0x79,0x56,0x89,0xa5,0x5a,0x6d,0xaf,0x8a,0x0e,0xb7,0x20,0x51,0x29,0x17,0xdb,0x1e,0x6e,0x0a,0x57, + 0x4d,0x07,0x59,0x3a,0x8e,0x72,0xb9,0x85,0xa8,0x34,0xc5,0xa1,0xd7,0x09,0xd7,0x68,0xc9,0x7f,0x6d,0xa7, + 0xd1,0x85,0x33,0x73,0x22,0xb1,0xa8,0xea,0xd6,0xaf,0xb5,0x8e,0x48,0x72,0xed,0xf7,0xa4,0xa8,0x76,0x1a, + 0x02,0xe1,0xcc,0x6d,0x95,0xc2,0x77,0x25,0x8f,0xeb,0x47,0x15,0x8e,0x59,0xd9,0x36,0x15,0x8c,0xf5,0x2d, + 0x41,0x7e,0x42,0xcf,0x34,0xc8,0x0b,0xa7,0x6f,0x58,0x22,0xe1,0x82,0x2b,0xba,0xe5,0x7a,0x84,0x12,0x77, + 0x95,0x9c,0x2b,0xf5,0x43,0x7f,0x1c,0xe6,0x39,0x09,0xc5,0x30,0xc1,0xb9,0xb3,0x97,0xa5,0x73,0xff,0xb2, + 0x34,0xdd,0x9a,0x14,0x93,0x7b,0x23,0x73,0xf6,0x54,0x4c,0xe9,0x3d,0x2c,0x68,0x88,0x73,0x81,0x8e,0x9c, + 0xe2,0xeb,0xe2,0x03,0xc7,0x66,0xce,0xf5,0x29,0x53,0xa3,0x18,0xc5,0x57,0x20,0x3d,0x27,0x54,0x7f,0x88, + 0xc0,0xb3,0xc2,0x1d,0x94,0xbb,0xf8,0xba,0x43,0x67,0x4a,0xbf,0x78,0x0b,0xd2,0x6d,0x3d,0x03,0xaf,0x80, + 0x23,0x71,0x4f,0x05,0x8c,0xc2,0xbc,0x07,0x34,0xe5,0x26,0x98,0x75,0xe0,0x6e,0x06,0x5d,0x8e,0x01,0xad, + 0xb6,0x42,0xbf,0x8a,0xc3,0x3c,0x98,0x0f,0x05,0x3e,0xb1,0x94,0xbc,0x3a,0x84,0x33,0x22,0x25,0xf7,0x6a, + 0x5c,0xc2,0x20,0x6c,0xed,0xec,0xb2,0x96,0xae,0xf5,0x66,0x9b,0xb6,0xc4,0xbd,0x01,0xc0,0x13,0x2b,0xfa, + 0x77,0xec,0x21,0x77,0xfb,0x91,0x70,0xc0,0xe3,0x70,0x10,0x95,0xe3,0x26,0x07,0x04,0x57,0xaf,0xf2,0x11, + 0x6e,0x6e,0xef,0x5c,0x15,0x63,0xdb,0xd1,0x60,0xe2,0xd2,0x2b,0xf4,0x95,0x93,0xfe,0x26,0x21,0x5d,0x8e, + 0xeb,0x18,0x4c,0x41,0x5e,0x7c,0xa4,0x65,0xec,0x9a,0x07,0x3a,0x99,0xd5,0xd3,0x87,0x94,0x9e,0x9b,0x2c, + 0x40,0xeb,0x2f,0xc1,0x58,0xc1,0x19,0xd1,0xba,0x4c,0xa4,0x7a,0x38,0xec,0xe5,0xbe,0xe9,0x81,0x21,0xcc, + 0xc3,0x5d,0x41,0x29,0x8d,0xf2,0xdd,0x5a,0x36,0x87,0x6a,0x81,0xbe,0xeb,0xb2,0x62,0x72,0xd3,0x17,0xc4, + 0x42,0x98,0x5b,0xb0,0x68,0x39,0x77,0xab,0x80,0xe7,0x1c,0xd9,0xbc,0x66,0x3c,0x54,0x19,0x27,0x19,0xae, + 0xb0,0xb9,0xd2,0x74,0x69,0x1e,0xd4,0xad,0xe9,0x0a,0x5f,0x99,0xd2,0x81,0xdf,0xdc,0x18,0xf0,0xf2,0xe3, + 0x84,0x1d,0xa8,0xe0,0xef,0x27,0xa7,0x44,0xb1,0xf9,0xc6,0x8e,0x64,0x56,0xb6,0xe4,0x03,0x3b,0xee,0xe5, + 0x8b,0x0e,0x3a,0xc4,0x53,0x1f,0x9c,0x2e,0x94,0x24,0x11,0xd8,0x81,0xa4,0x97,0x5b,0x66,0x25,0xba,0x21, + 0x44,0x11,0xcd,0xe8,0xce,0x8b,0x9a,0x54,0x8c,0x12,0xe7,0x21,0x88,0x95,0xfc,0xdc,0x71,0xfd,0x9f,0xe9, + 0x3c,0xe0,0x57,0xdd,0xd0,0xad,0xee,0x2e,0xce,0x56,0x86,0x1e,0x62,0xdd,0x2f,0x9a,0x3f,0x2b,0xe4,0x77, + 0x9f,0x4e,0x45,0x44,0x78,0xc7,0x7f,0x68,0x50,0xb2,0x39,0x21,0x0e,0x3f,0xac,0xce,0x88,0x7b,0xaa,0xee, + 0x74,0x1a,0xe3,0x5c,0x54,0x47,0x24,0x76,0xe3,0xaf,0xd4,0xeb,0x2d,0x42,0x14,0x80,0x9f,0xa7,0xf1,0x55, + 0x38,0xf8,0x28,0xf7,0xe2,0xf4,0x46,0x23,0xff,0x86,0xb5,0x3d,0x43,0x77,0xd3,0xc9,0x8d,0x16,0x24,0x07, + 0xb5,0x9a,0x80,0x9e,0x71,0xb7,0x8c,0xf5,0xf2,0xcb,0xf0,0xa5,0xe7,0xe5,0x39,0x51,0xb3,0x9c,0x58,0x61, + 0x3a,0xbc,0x09,0xc1,0x99,0xe6,0x31,0xfa,0x7e,0x4a,0x2e,0x13,0x9c,0x80,0x82,0xc1,0x42,0xfe,0xf8,0xa4, + 0xf7,0xee,0x97,0x7a,0x8a,0xaf,0xfd,0x22,0x56,0xcc,0xc9,0x4c,0x41,0x96,0x5e,0x53,0x41,0x0a,0x7d,0x4e, + 0x56,0x89,0x40,0xb9,0xa1,0x86,0xb1,0xd1,0xe2,0xd4,0xe8,0x4d,0x88,0xb8,0xcc,0x4c,0x62,0xac,0x35,0xc0, + 0xe9,0x4b,0x14,0x92,0x8d,0x7c,0xba,0x22,0xb8,0xb0,0x29,0xab,0x0d,0x57,0x9d,0x09,0x1a,0xa7,0x49,0x4a, + 0xdd,0x93,0xd0,0x03,0xb5,0x08,0xff,0x4b,0xb2,0x64,0xd7,0x68,0xba,0x8c,0xee,0x6a,0x93,0x8f,0x05,0x5f, + 0x7c,0x3a,0x9a,0x96,0xb0,0xc6,0x5c,0x96,0x06,0x36,0xa9,0xe4,0x84,0x3b,0xf6,0xe9,0xb9,0xfe,0x35,0xe2, + 0x93,0xcd,0xfd,0x37,0x73,0xee,0xba,0xd2,0x60,0x24,0x9b,0x49,0xf7,0xfb,0xa3,0x8f,0x1f,0x7c,0x29,0x88, + 0x2e,0x20,0xec,0xfe,0xab,0x64,0x1c,0x0d,0xec,0x2d,0x98,0x03,0xd5,0x0c,0xf7,0x30,0x09,0x32,0x3a,0xcb, + 0xb5,0x34,0x5f,0x1d,0x78,0xa6,0x2b,0x2e,0x60,0xc9,0xb0,0x26,0xe7,0xcf,0xc1,0x1c,0xd2,0xda,0xcc,0xc0, + 0xcc,0x9a,0x13,0x0c,0x54,0x4f,0xc8,0xec,0xf1,0x75,0xff,0x94,0x24,0x7c,0xf0,0x31,0x9b,0x50,0xf8,0x10, + 0x0c,0xaa,0xd3,0xa2,0x39,0x88,0xcf,0x88,0x9c,0x6d,0xe4,0x33,0x7c,0xa4,0x48,0x41,0xa1,0xc5,0x39,0xd2, + 0xa0,0x95,0x1a,0x7c,0xfb,0xe6,0xdd,0x80,0xe3,0x1b,0x9a,0xb2,0xf3,0x74,0x70,0x53,0x43,0x5d,0xe2,0x30, + 0xa4,0x05,0xd6,0x0c,0x80,0xf2,0xe0,0xf1,0x41,0xf2,0xc3,0x17,0x6d,0x6a,0xa2,0xf2,0x5f,0xb7,0x26,0xf9, + 0x02,0x6c,0xcf,0xeb,0x67,0x7f,0x5e,0x3f,0xfb,0x2d,0x01,0x66,0x7c,0xf9,0x3a,0x0a,0xe3,0xc1,0x62,0xf4, + 0xaa,0x6d,0x31,0xde,0x79,0x38,0x95,0x1c,0xa5,0xd7,0x3e,0x29,0xfc,0xeb,0xd3,0xe9,0x54,0x3d,0xf1,0x1d, + 0x9f,0x0b,0xdb,0x1e,0x5e,0x95,0x70,0x86,0x21,0x49,0x19,0x94,0x58,0x09,0xc6,0xfd,0xbb,0x5e,0x4e,0x27, + 0x78,0xe1,0x13,0xc9,0x8c,0x92,0x4d,0x4c,0x46,0xb7,0x28,0xbc,0xc9,0x7c,0xaf,0x17,0xb2,0xaf,0xe7,0xde, + 0x13,0x35,0x5f,0xf8,0xba,0xa3,0xde,0x9e,0x2b,0xb9,0x05,0x9a,0xad,0xd8,0x5d,0x24,0xb7,0x10,0x9f,0x8d, + 0xba,0x2e,0x6c,0x18,0x47,0x9b,0x73,0x2d,0x8d,0xc2,0x98,0xc4,0x6c,0xfe,0x7e,0x44,0x84,0x4b,0xb8,0xa1, + 0x48,0x38,0x96,0xb2,0x47,0xd2,0x4d,0xb3,0x9b,0x12,0xad,0x1a,0xf5,0x66,0x10,0xb4,0xd4,0x5b,0xea,0x96, + 0x20,0xef,0x4e,0xd4,0xe0,0x07,0xe1,0x45,0xb7,0xf0,0xa8,0xcb,0x6e,0xe8,0x65,0xe1,0x79,0x90,0x87,0xb2, + 0x75,0xfa,0x9b,0x99,0xd1,0x03,0x74,0x9d,0xb2,0x77,0x4f,0x93,0xc4,0x38,0x0d,0xa2,0xac,0xb8,0xe1,0x8f, + 0xcc,0x37,0x46,0x61,0x39,0xbb,0x49,0xa8,0x15,0xf7,0x51,0xaf,0x37,0xf2,0x20,0x9c,0x20,0x7d,0xc8,0x6d, + 0x4c,0x8d,0x80,0xa0,0xc5,0x31,0x36,0x22,0xfe,0xe1,0xdd,0xa7,0x1f,0xbc,0x3e,0x09,0xaf,0x0f,0xf4,0x7e, + 0x67,0x59,0x6b,0x04,0x57,0xe1,0x76,0x90,0x59,0xac,0xd6,0xfc,0xd4,0x42,0x2e,0x41,0x56,0x0d,0x2f,0xa9, + 0x33,0x88,0xaa,0x78,0x92,0x45,0x4a,0x70,0xa1,0xb6,0xc0,0x17,0x07,0xb5,0x6a,0xa2,0x0b,0xc3,0x72,0x10, + 0xab,0x9b,0x0d,0xf8,0x22,0xcb,0x42,0x0c,0x5c,0x0e,0xe3,0xc3,0xf3,0x20,0x33,0x3a,0x49,0x65,0xb1,0xd0, + 0x4d,0x10,0x13,0x95,0x16,0x75,0x4e,0xb3,0xe6,0x34,0xcb,0x84,0x43,0xec,0x36,0x17,0xe2,0xc2,0x90,0xb1, + 0x8c,0x00,0x21,0x42,0xaf,0x97,0x8f,0xda,0x27,0x22,0xc7,0xc3,0x2d,0x12,0x64,0xcf,0x20,0x70,0xf0,0x2b, + 0xf0,0x10,0x04,0xbe,0x5b,0xb0,0xf8,0x77,0xcf,0x5d,0x05,0x3c,0x06,0x22,0x9f,0x81,0xf3,0x15,0x6c,0xbd, + 0x02,0x28,0xd3,0x14,0x08,0xed,0xf9,0x94,0x08,0x8f,0x47,0x84,0x6f,0x71,0xcd,0xa0,0x7b,0x16,0x21,0x61, + 0x79,0x18,0x80,0xed,0xde,0xc0,0x31,0x7b,0x18,0xe6,0xd1,0xd7,0xf0,0xe3,0xb9,0x84,0xa1,0x75,0x80,0x17, + 0xf7,0xde,0xd7,0x09,0x1c,0xb4,0xdc,0x07,0x48,0x1c,0x44,0x68,0xe4,0x34,0x5b,0x2d,0x69,0xae,0x35,0x22, + 0x36,0xd6,0x97,0xf0,0x41,0x62,0x22,0xb5,0x8c,0xf8,0xa1,0x24,0xe8,0xa4,0xd2,0x74,0xe5,0x3d,0x91,0xcc, + 0x83,0x24,0xfe,0x5f,0x98,0xb7,0x9e,0xf8,0xad,0xaa,0xc1,0x68,0xb0,0x88,0x5a,0x35,0xe4,0x5e,0x78,0x53, + 0x71,0xa8,0x73,0x55,0x1c,0x11,0xa3,0x6d,0xae,0x91,0x78,0xaf,0xbc,0xaa,0x9a,0x0c,0x61,0x55,0x5c,0xbb, + 0xf3,0xdd,0x8a,0xd9,0xb4,0xc1,0xad,0xab,0x26,0x19,0x26,0x10,0x4a,0x5f,0x5d,0xb7,0x35,0x59,0x0a,0x31, + 0x77,0xb8,0xd4,0x9a,0xdc,0x50,0xb2,0x26,0x47,0x94,0x93,0xb4,0x0b,0x68,0x9b,0xa6,0xc5,0x3e,0xbd,0x8b, + 0x12,0x28,0x9e,0x9e,0xfc,0xbe,0xd1,0x9e,0x7c,0x69,0xb4,0xfe,0xd0,0xe6,0x1f,0x34,0x38,0xde,0xfa,0xdf, + 0x56,0xc8,0x56,0x9e,0xad,0xcc,0x2e,0x10,0xf9,0x53,0x23,0xed,0xea,0xa5,0x26,0x1a,0x4b,0xf8,0xe4,0x65, + 0x5e,0x5a,0xa5,0x80,0x11,0x81,0xab,0xaf,0x0e,0x01,0xd3,0x94,0x7a,0xc1,0xa8,0x1e,0xf6,0x5b,0xc4,0x1e, + 0x09,0x55,0x1b,0x85,0x01,0xdb,0x11,0x8b,0x4a,0x06,0x2f,0x56,0xd5,0x03,0x1d,0xcc,0xf9,0x3c,0x11,0x1b, + 0x2a,0x2a,0x96,0x6b,0x02,0x36,0x5b,0x23,0xdd,0xe4,0xd8,0x9f,0x8d,0x09,0x5b,0xd0,0x71,0x18,0xd0,0x3b, + 0xf0,0x4f,0x1b,0x89,0x1e,0x68,0xec,0x1a,0xd9,0x4b,0x5b,0x94,0xf0,0xc1,0xd6,0x22,0xc0,0x9a,0x16,0x78, + 0x91,0x61,0x25,0xfa,0x0f,0xf3,0xa1,0x31,0xcc,0xb8,0xd2,0x38,0xa6,0x25,0x4e,0x7f,0x88,0xc2,0x6b,0xe7, + 0x16,0xe1,0xab,0xaf,0xa2,0x34,0xa3,0xd6,0x38,0x22,0x5a,0x93,0x4e,0x89,0xb4,0x7f,0x09,0x1e,0x26,0x60, + 0xa9,0x0a,0x24,0x5a,0x81,0xd3,0x97,0x5b,0x3c,0x83,0x9e,0x34,0xa6,0xf8,0x4e,0x22,0x46,0xe2,0xa2,0xdb, + 0x36,0x2a,0xe3,0xe5,0x38,0x20,0xc9,0x5a,0xe4,0x5c,0x35,0xe9,0x66,0x59,0x22,0xf5,0x55,0x4e,0x67,0x51, + 0x7d,0x0f,0x92,0xd0,0x7b,0x72,0x4a,0xc2,0x2d,0xfd,0xc3,0x54,0x20,0x36,0x54,0xa0,0x6f,0xa8,0xc0,0x40, + 0xa8,0xc0,0x84,0x3e,0xd6,0x04,0x71,0xa3,0xa6,0x9a,0x9b,0x38,0x59,0x4d,0xbb,0xc0,0xf4,0x9b,0xe8,0xb2, + 0x22,0xda,0xd0,0x0a,0xd9,0x48,0xcf,0x29,0x49,0xe0,0xc3,0xe1,0x4b,0x8a,0x89,0x9a,0x61,0xdf,0x09,0x61, + 0xd4,0xa9,0xb9,0x3b,0xb2,0x6b,0x69,0xb1,0xa4,0x87,0x50,0xf8,0xbd,0xcc,0x64,0x74,0x62,0x35,0x12,0x5c, + 0x92,0x60,0xbc,0x0a,0xa3,0xd9,0x3a,0x2d,0xa2,0x29,0x74,0xae,0xd2,0x68,0xd0,0x68,0xb3,0xb5,0x8f,0x32, + 0x10,0x35,0xb7,0x78,0xca,0x4c,0x12,0x65,0xae,0x45,0xb5,0x20,0x62,0x58,0x30,0xc3,0x30,0xe5,0xee,0xdb, + 0x6b,0x5e,0xe9,0x9c,0xf4,0x81,0x71,0x7b,0xb7,0x71,0xcf,0xdc,0xd8,0x66,0xc6,0xe1,0x09,0xbb,0x5e,0x9e, + 0xf6,0x94,0xd5,0x26,0xb6,0x32,0x0d,0x5c,0x62,0x4d,0x2f,0x2d,0xd5,0x6d,0xe1,0xc3,0x5a,0xa9,0xa3,0x0d, + 0x3d,0x21,0x51,0xf4,0x6d,0x4d,0xd7,0x46,0x65,0xdc,0x98,0xf0,0x4a,0xd7,0x06,0xe4,0xcb,0xd1,0x0c,0x83, + 0x1b,0x23,0xa8,0x98,0x53,0x43,0xe9,0xa0,0x1c,0x9b,0xa3,0x5d,0xa4,0xc2,0xe9,0xd7,0x54,0x38,0x25,0x8b, + 0x66,0x83,0x6f,0x6a,0x3d,0x1f,0x9c,0x0e,0x05,0x9b,0x9c,0xe5,0xae,0x6a,0x33,0xac,0x76,0xa8,0x67,0x21, + 0x35,0x75,0xc4,0x1c,0x5d,0x6e,0xd1,0x1d,0x77,0x86,0xc2,0x66,0x5a,0x9c,0xf6,0xc2,0x79,0x8b,0x6a,0xa6, + 0xae,0x72,0x6b,0xa4,0x4d,0xab,0xeb,0x80,0xdc,0xcb,0x94,0x96,0x3c,0xdf,0x80,0x4e,0x6f,0x2d,0xaf,0x9c, + 0x40,0xff,0xd0,0x2d,0xbd,0x34,0xf9,0x24,0x3f,0xd3,0xbb,0x59,0x3b,0xb2,0x23,0xb5,0x55,0x41,0x10,0xe6, + 0x55,0x52,0x84,0x2c,0xc6,0x76,0xfb,0x84,0xd5,0xf5,0xa7,0x24,0x19,0x44,0x15,0xa3,0x6a,0x7b,0xe9,0x06, + 0xb6,0x8b,0x6e,0x20,0x5e,0x4a,0x9c,0x23,0xcb,0x41,0x44,0xa3,0x46,0x32,0x9d,0xea,0xe8,0xfc,0xf4,0x9a, + 0xcb,0xaf,0x5d,0x31,0x1c,0x8f,0xf4,0xbe,0x84,0xce,0x3f,0x4a,0xca,0xd0,0x50,0x3d,0x73,0xbf,0x56,0xb1, + 0xca,0xf8,0x92,0xff,0xf1,0x91,0x56,0x68,0xd3,0xfc,0x72,0x12,0x14,0x90,0xdc,0x27,0x7f,0x41,0x71,0x89, + 0x7a,0xda,0xb3,0x97,0x9f,0x84,0x82,0xd4,0x3c,0xf7,0x66,0xad,0x40,0xd6,0x70,0x42,0xcb,0x7a,0x65,0xc4, + 0xaf,0xa4,0x84,0x82,0x58,0xd9,0x7e,0x75,0x2b,0x47,0x2b,0x65,0xc9,0x06,0x96,0x57,0xd8,0xe0,0x0a,0xc1, + 0x09,0x07,0x47,0xa1,0x3e,0x66,0x66,0xa6,0xd0,0x38,0x3f,0xf8,0xbe,0x5f,0x9f,0x2d,0xbe,0x3f,0x84,0xff, + 0xdf,0x29,0x88,0x9e,0x5d,0x96,0xd8,0x33,0xf9,0x28,0xd7,0x19,0xf5,0x78,0xae,0x32,0x3d,0x57,0x35,0xe3, + 0xe3,0x94,0xc8,0xcf,0xdc,0x4c,0xbd,0xa6,0x13,0x63,0x70,0xc5,0xce,0xb8,0xd7,0x4d,0xb8,0x9d,0x4c,0x21, + 0xea,0x23,0xa2,0xbb,0x3d,0x45,0xf6,0x4c,0xa4,0xf6,0x4c,0xc8,0xc7,0x05,0xff,0xe5,0x31,0x22,0x34,0x3e, + 0x3f,0xf1,0xc1,0x06,0x82,0x34,0x33,0x3d,0x2a,0x81,0xd9,0x0f,0x6f,0x3e,0x1c,0xf5,0xd8,0x0c,0xad,0xbb, + 0xb2,0x72,0x7d,0x7d,0xed,0x5f,0xaf,0x21,0xb4,0xfe,0xca,0x6a,0xbb,0xdd,0x5e,0xc9,0xaf,0x86,0xcd,0x8a, + 0x58,0xc3,0xe2,0xd6,0x66,0xbc,0x0c,0x1b,0x45,0x78,0x42,0x08,0xab,0x98,0xa8,0x0f,0x47,0x0e,0x37,0xea, + 0x35,0xf1,0xb5,0xbb,0x51,0xcc,0x48,0x8a,0x7c,0x9c,0xb2,0xfd,0x2e,0x40,0x5c,0x74,0x1d,0x51,0x45,0xbd, + 0xe7,0xcb,0x08,0xc3,0x55,0x7d,0xab,0x3f,0xb1,0x6f,0x53,0xcb,0x9e,0x2c,0xb6,0x64,0xfb,0x2e,0xc2,0x21, + 0x6c,0x1d,0x93,0x49,0x95,0x72,0x90,0x98,0xf8,0xbf,0xaf,0xbc,0x71,0x5f,0xbe,0xec,0x3c,0x5d,0x5a,0x7d, + 0xf2,0xc4,0x7d,0xf9,0xb2,0x78,0xf1,0x82,0xfe,0xd7,0x79,0x3a,0xc5,0xdb,0x67,0xb5,0x97,0xcf,0xa6,0x0e, + 0x3d,0x2e,0x85,0xea,0x45,0x35,0x59,0xd4,0x98,0xb2,0x19,0x16,0x3b,0x37,0xad,0xe7,0x87,0x49,0xfb,0x46, + 0x52,0x25,0xb7,0x0b,0xb4,0x76,0xd6,0x39,0x39,0x69,0x7b,0x6d,0xc2,0x2f,0x73,0x25,0x10,0x51,0xd5,0x88, + 0xda,0x8c,0xaa,0xda,0x45,0x0f,0x40,0x3a,0xe1,0x49,0x84,0xdd,0xb3,0x11,0x18,0x55,0x60,0xa0,0x54,0x81, + 0xf4,0x97,0xb8,0x5d,0xf7,0x8e,0xb0,0x4f,0x7e,0xbe,0xe8,0xad,0x3e,0x79,0xaa,0xf0,0xef,0x76,0x0c,0x9e, + 0x1c,0xa7,0xff,0x9d,0x0d,0xe7,0xde,0xd7,0xeb,0xba,0x2d,0x1e,0x1d,0xe7,0x41,0xaf,0x43,0xc3,0x21,0x71, + 0x22,0x58,0xee,0xb0,0x24,0x97,0x9b,0xc4,0x96,0x59,0x2f,0x5a,0xee,0xd0,0xa1,0x5f,0xd0,0xbf,0x71,0xaf, + 0xed,0xf5,0x7b,0xed,0xda,0x6d,0x20,0x83,0x3f,0xed,0x85,0x2f,0x5e,0xf4,0xbd,0xfe,0x72,0x2f,0xdd,0xe8, + 0xbf,0xec,0x3d,0xdb,0x70,0x13,0x21,0xa5,0x98,0x2d,0xb0,0x22,0x2f,0xe9,0xa5,0xd7,0x6f,0xf5,0x9e,0xdd, + 0x6d,0x0c,0xe0,0x39,0x82,0x3e,0x26,0xec,0x56,0xb1,0x51,0x4d,0x55,0x67,0x23,0x79,0xa1,0x85,0x37,0x7b, + 0xd2,0x88,0x1d,0x3c,0x49,0x4e,0xa9,0x67,0x71,0x8c,0xa0,0x11,0x3e,0x9e,0x2c,0xc7,0xbc,0xe7,0xcc,0x61, + 0xdd,0x67,0xeb,0xff,0x81,0x33,0xa1,0x0d,0xfb,0x62,0xbd,0xfd,0xfc,0xa9,0x8b,0x76,0x59,0x6f,0xa1,0x3f, + 0xf0,0x32,0x6a,0x72,0x23,0x7b,0x49,0x43,0x4d,0x97,0x96,0xd2,0x17,0x9d,0xd5,0x0d,0x37,0x5d,0x5e,0xde, + 0x08,0xe3,0x3c,0x6c,0x00,0x2a,0x6f,0xe1,0xa8,0x37,0x26,0xbd,0xf8,0x8e,0xeb,0x4c,0x7a,0x7d,0x4d,0x66, + 0xb8,0x23,0x56,0xfb,0xf4,0x71,0x15,0x62,0x8f,0x35,0xa9,0xcd,0xf6,0x6e,0xd2,0x4f,0x07,0x0b,0x4c,0xdc, + 0x10,0xfe,0xa0,0x57,0x3c,0x0e,0x90,0x13,0x91,0xfe,0x4d,0x7b,0xac,0xef,0x31,0xed,0x90,0xa4,0xa6,0x71, + 0x0f,0xd7,0xb9,0x6a,0x9e,0x15,0x56,0xc0,0x51,0x27,0x74,0xb5,0x17,0x37,0x74,0xe1,0xd9,0x2b,0xea,0x64, + 0xab,0x70,0xda,0xb4,0xd3,0x37,0xe8,0x98,0x7a,0xf3,0xee,0xf5,0xb3,0xe7,0x01,0xe8,0x00,0xb4,0x20,0xa9, + 0x93,0x41,0xec,0xe2,0xea,0x9d,0xce,0xaa,0x47,0x88,0x67,0x9e,0xd7,0xd6,0x3c,0x18,0xae,0x75,0x3a,0xd4, + 0x8f,0xd3,0xfc,0xb0,0x7b,0x7c,0xf4,0x6a,0xeb,0x60,0x77,0xd5,0x87,0x94,0xaa,0xab,0x78,0x1d,0x7c,0x42, + 0x1f,0x99,0xb5,0x22,0x44,0xd8,0x88,0xab,0xb5,0x8a,0xab,0xb5,0x22,0x6e,0xf8,0x24,0x3e,0xf5,0x06,0xf8, + 0xb3,0xdc,0x21,0x46,0x71,0x4c,0xb2,0x7e,0xde,0x2d,0xef,0x7a,0xd6,0x16,0xe9,0xfb,0x93,0x2f,0x5e,0xf1, + 0x38,0x81,0x54,0x0d,0xe2,0x3b,0xd1,0xc9,0x3e,0x19,0x2f,0xc6,0x84,0x08,0xe8,0x68,0x83,0x16,0x6a,0xfc, + 0x62,0xc2,0x78,0xbd,0xe1,0x8e,0x69,0xa5,0x2c,0x98,0xd7,0x9f,0x7b,0xeb,0xde,0x3a,0xc6,0x66,0xdc,0x2a, + 0x56,0x9f,0x78,0xc6,0x1d,0x63,0xd5,0xb3,0x32,0xc9,0x39,0x83,0xcd,0x81,0x5f,0xb4,0xfa,0x7e,0x81,0xd0, + 0x40,0xee,0x4a,0xa7,0xcd,0xba,0x65,0xd5,0x9a,0x3d,0x1b,0xeb,0xdc,0x62,0xdb,0xfc,0x33,0x3b,0x79,0xab, + 0xcf,0xa6,0xe3,0x56,0xa7,0x9a,0x87,0x90,0xe6,0x21,0x7c,0x01,0x38,0x37,0x42,0x7b,0xdb,0xb6,0xa7,0x23, + 0x22,0xe3,0x1a,0xde,0x42,0x13,0x17,0xaf,0x50,0x8b,0x8a,0x39,0x5f,0x2a,0x34,0x55,0x1e,0x02,0x1b,0x2e, + 0xf0,0xcf,0x39,0x66,0xe9,0x0d,0x9c,0xe7,0x5d,0xef,0xba,0x17,0xb4,0xce,0x67,0x7a,0x4a,0xa4,0x9b,0x0b, + 0x35,0xf1,0xf0,0x97,0xb1,0x08,0x4d,0x42,0xd4,0xa3,0x46,0x6b,0x26,0xbc,0x5f,0x98,0x86,0x60,0xca,0x4f, + 0xc2,0xc7,0xc5,0x32,0x6d,0xa4,0xd2,0x9d,0x1d,0xc1,0x35,0xb7,0x7b,0x21,0xe0,0x06,0xb3,0xa5,0xe7,0x76, + 0x69,0xdb,0xbd,0x5b,0xf8,0x6d,0xed,0x9d,0x06,0x90,0x8b,0x86,0xf2,0xe1,0x05,0x7c,0x03,0x16,0xb7,0xfc, + 0xcd,0x6f,0xdb,0x7a,0xaa,0xae,0x7a,0xd6,0x12,0x8f,0x5d,0xef,0xa6,0xa7,0x28,0xda,0xd0,0xbb,0x72,0xf5, + 0x7c,0x5f,0xcd,0x76,0x73,0x53,0x35,0xd9,0xc3,0x96,0x32,0xeb,0x64,0xe1,0xce,0x13,0x4f,0xd7,0x6a,0x85, + 0xa6,0xa5,0xc2,0x5d,0x38,0xc1,0xaa,0xf4,0xe6,0x24,0xa4,0xe9,0x24,0xea,0x6b,0x80,0x34,0x9a,0x5c,0x7e, + 0xf1,0xe4,0xb9,0xcb,0x09,0x4c,0x3f,0x45,0x49,0xf1,0x4c,0x6e,0x5e,0x23,0xb7,0x3a,0x7d,0x68,0x9d,0xd9, + 0x1b,0xfd,0x65,0x67,0xd3,0x0c,0xaa,0x63,0xe3,0x6d,0xc8,0x98,0xda,0x6d,0x7b,0xef,0x5e,0x7d,0xfc,0x70, + 0xb6,0xbf,0xf5,0xc7,0xde,0xda,0xea,0x6c,0xe4,0x8c,0x68,0x3c,0x3c,0x4e,0xdf,0x10,0xe9,0x13,0x6d,0xbc, + 0x59,0xfa,0x26,0x35,0x10,0x5e,0x20,0x55,0x49,0xf3,0x91,0x56,0x1b,0xbf,0x1b,0x13,0x2f,0xbe,0x1d,0x15, + 0xc4,0x1a,0x2c,0x2d,0x81,0xf1,0x43,0x30,0xde,0xfe,0x4c,0xc9,0x66,0xd8,0x15,0x8e,0x5e,0x8e,0x5d,0xab, + 0xc4,0xe1,0x5b,0xbb,0x02,0xa7,0x0f,0x67,0x94,0x01,0xb9,0xc4,0x83,0xb8,0xd1,0xaa,0x1b,0xd1,0x7e,0x90, + 0x5c,0x05,0x74,0xe0,0xdf,0x72,0x15,0xe2,0xbb,0xa5,0x94,0xa4,0x49,0x17,0xc8,0xc8,0xce,0x0e,0x5f,0x88, + 0x55,0x59,0x85,0x4b,0x5a,0xe6,0x47,0x68,0xde,0x44,0x05,0x57,0x8e,0x99,0xbd,0xe8,0x11,0x71,0xa1,0xd2, + 0xc9,0x74,0x9a,0xf3,0x83,0xee,0xc4,0x1f,0x10,0xc7,0xc4,0x40,0x39,0x01,0x53,0x25,0xb6,0x54,0x0d,0xfc, + 0x7e,0x9c,0xe6,0x21,0x04,0x60,0xfe,0xe1,0xb8,0x16,0xf3,0x45,0xdd,0xf2,0x07,0x88,0x6e,0xeb,0xe8,0x4f, + 0x58,0xfd,0x41,0xa4,0xd5,0x8a,0xb1,0x21,0xb8,0x12,0x3d,0xce,0xeb,0x7b,0x39,0x3d,0x59,0x7f,0x1c,0x2e, + 0xaf,0x9d,0xae,0x10,0x8e,0x6c,0xc4,0xb2,0xb2,0xd6,0x22,0x71,0xf1,0xe9,0xe3,0xc2,0x65,0x96,0x61,0xb6, + 0x80,0x48,0x20,0x17,0x3d,0x9b,0x2f,0x59,0x45,0x89,0x41,0x19,0xe0,0xc9,0x76,0x9c,0x9e,0x3b,0x27,0xd5, + 0xa1,0x71,0x72,0x5b,0xd0,0xe2,0x4f,0xbe,0x74,0xe3,0xbb,0x53,0x56,0x91,0x74,0xdc,0x53,0xad,0xc0,0xe7, + 0x89,0x5b,0xa1,0xba,0x48,0x20,0x34,0x8b,0x13,0x04,0xfa,0x56,0xae,0x90,0x82,0xcf,0xc5,0x47,0x2b,0x7f, + 0xe6,0x0f,0x3e,0xaf,0x38,0x93,0x64,0x38,0xfd,0x79,0x12,0x0e,0xdd,0xdf,0xad,0xf8,0x45,0xc8,0x52,0x1a, + 0x5a,0x64,0xdb,0xe1,0xa5,0xa5,0x47,0x2b,0x9f,0x7d,0x5d,0x65,0x13,0x75,0x22,0xa9,0xa4,0x6c,0x8b,0x35, + 0xb0,0x3a,0x4b,0xb4,0x66,0x21,0x1e,0xc0,0x18,0x24,0x58,0x16,0x74,0x81,0xe3,0xa8,0x2c,0x63,0xc5,0xb5, + 0xa9,0x65,0x4b,0xf4,0xb2,0x79,0xc1,0x4b,0xb8,0x3a,0x46,0xf4,0xef,0x26,0x7a,0xe9,0xde,0x9e,0xd3,0xa4, + 0x28,0x8c,0xac,0x70,0x1d,0x3e,0x32,0x63,0x63,0x00,0x5b,0x58,0x97,0x8c,0x9f,0xfd,0x93,0x3f,0xfb,0xa7, + 0xcb,0xbf,0x63,0x1f,0xa9,0xe5,0xa6,0xcf,0x33,0x34,0x77,0xd5,0xc2,0xfe,0x3b,0xb3,0xd3,0x36,0xc8,0xd2, + 0xc9,0x51,0x11,0x68,0x83,0x74,0xd7,0x3a,0x72,0x03,0x1c,0xb9,0x46,0x5c,0xa0,0x42,0xbb,0x43,0xea,0x82, + 0xe6,0xc9,0x6b,0xfa,0x3f,0x4f,0x86,0x30,0xe9,0x75,0xc1,0x8d,0x21,0xf7,0xb0,0xe5,0x31,0x38,0x08,0xe3, + 0xd7,0x11,0x5a,0xe6,0x4c,0xa7,0x81,0x9d,0x18,0x7b,0xc6,0x7d,0x74,0xd1,0xfd,0x4d,0xd4,0x52,0xc7,0x42, + 0x04,0x99,0x00,0xda,0x6a,0xbe,0xb9,0xee,0x35,0xbf,0x23,0xb6,0xbd,0xe9,0xc9,0xab,0x43,0x58,0x43,0x03, + 0xbd,0x93,0xc7,0x24,0xed,0x3e,0x8e,0x2a,0xd2,0x95,0x11,0x62,0x67,0x2f,0x88,0xcd,0x58,0x5a,0xca,0x5e, + 0x68,0xd3,0xd4,0x8d,0xcc,0x3e,0x29,0x48,0x84,0x3c,0xad,0x37,0x9d,0x0d,0xcf,0x9d,0x26,0x9c,0x76,0x35, + 0x63,0xbc,0x4c,0xfc,0x34,0x3f,0x3f,0xb3,0x1e,0x71,0x8e,0x21,0x88,0x8b,0x5b,0x83,0x22,0xfb,0x3d,0x60, + 0x70,0xb2,0x95,0x64,0xda,0x76,0x1f,0x03,0x73,0x73,0x57,0xe7,0x50,0x2e,0x27,0x62,0x1e,0xc0,0x46,0xed, + 0x75,0x42,0x2c,0xc9,0xab,0xc3,0x95,0x67,0x4f,0xd7,0xe9,0x98,0xf6,0x92,0xda,0xdb,0xdf,0xf3,0xdb,0x95, + 0xb5,0xa7,0x54,0xa4,0xf0,0xc7,0x29,0x36,0x8b,0xe5,0xe6,0xa0,0xc1,0xa6,0x54,0xcb,0x0e,0x11,0xa3,0x62, + 0x33,0x59,0x6e,0x8e,0xd4,0x8b,0xda,0xd7,0xf8,0x8e,0x73,0x61,0x37,0xc7,0x4d,0x31,0x2b,0xfc,0x31,0xcd, + 0x98,0x83,0xa5,0x19,0x7f,0xd9,0x6b,0x3d,0x79,0xb2,0xd9,0x0c,0xbf,0xf4,0x39,0x98,0x3a,0xbc,0xbd,0xe8, + 0xd5,0x53,0x7a,0xc5,0xbe,0xb3,0xfc,0xf4,0x07,0x7a,0xba,0x08,0xa2,0x8c,0xda,0x46,0x8a,0x4d,0x62,0x8f, + 0x48,0xb4,0x19,0x4f,0x7a,0xe6,0x1a,0xd4,0xd0,0xf0,0xc2,0x33,0xc7,0x4a,0xc2,0xf7,0x28,0xc7,0x1f,0x3f, + 0xec,0xf6,0x6e,0xd3,0x4b,0xd8,0xf9,0x67,0x4e,0xab,0x95,0x5e,0xd2,0x74,0x5d,0x07,0x59,0xa2,0x5f,0xe0, + 0x37,0x66,0x30,0xcb,0xf4,0x1b,0xfa,0x49,0x2f,0x92,0xb0,0x2c,0xb2,0x20,0xd6,0x2f,0x83,0x7e,0xdf,0x6d, + 0x5a,0x77,0x54,0x57,0x11,0x61,0xeb,0x4e,0x78,0x91,0xdb,0x1e,0xea,0x27,0xec,0x7b,0xae,0xc3,0x5d,0x1c, + 0x48,0x6e,0x01,0x28,0x9c,0x43,0xdb,0x6b,0xba,0x5e,0xbc,0xa1,0x38,0xd8,0xdb,0xa8,0xdf,0xc5,0x97,0x4d, + 0xef,0x12,0x26,0x17,0xaa,0x12,0x0d,0xf5,0xaa,0x32,0x64,0xf7,0x4a,0x84,0x67,0xf7,0xa0,0xff,0xe3,0x09, + 0x60,0x32,0x0c,0xb6,0xca,0x43,0x84,0xe2,0x6e,0xf0,0xb2,0xb7,0xde,0xde,0x6c,0xa6,0x97,0x4d,0xfc,0x5c, + 0xa5,0x9f,0x18,0x1c,0xcc,0x4a,0x32,0x5c,0x4b,0x74,0x1d,0xd3,0xf7,0x0f,0x69,0x8c,0x9c,0x07,0x9b,0x9b, + 0x6d,0xd7,0x2f,0x52,0x8e,0xde,0xe2,0xac,0xe2,0xd2,0xfb,0x07,0x4e,0x1c,0x6f,0x40,0xe5,0xfc,0xa9,0x79, + 0x1e,0x61,0x58,0x36,0x9c,0x12,0xd9,0x8d,0x01,0xe5,0x9f,0x73,0x50,0xc2,0xe6,0xce,0x82,0x93,0x60,0x7c, + 0xec,0x90,0x7c,0x03,0x0e,0xf0,0x69,0x7b,0x16,0x68,0x5e,0x6d,0x05,0x35,0xaf,0x75,0x1d,0x6c,0x8d,0x30, + 0xb0,0xa6,0x77,0x95,0x87,0xd4,0x5e,0x78,0x15,0xc6,0x73,0x33,0x5b,0x15,0xd5,0x66,0x15,0x5e,0x51,0x02, + 0xac,0xf8,0xfe,0x58,0xd0,0x5a,0x27,0x43,0xe0,0x7e,0x6b,0x7e,0x9b,0x0a,0x27,0xd4,0x5c,0xc6,0x83,0xec, + 0x30,0xb8,0xc6,0x1c,0xd2,0xc4,0x41,0x97,0x70,0xa7,0x4f,0x14,0x3b,0x4a,0x09,0x03,0x69,0xe4,0x14,0x86, + 0x07,0xa5,0x0a,0x20,0xfe,0xb9,0x18,0x9e,0x4e,0xfb,0x31,0xbc,0xfa,0x4d,0x43,0xcc,0x3b,0x03,0xc2,0x7f, + 0xfe,0xa7,0xe6,0x0c,0x3c,0x98,0x16,0x1d,0x05,0x65,0x41,0x7f,0x23,0x18,0x06,0x71,0x77,0xf8,0xb5,0xb8, + 0xb7,0xd0,0xd7,0x0d,0x2c,0x98,0x86,0xaa,0x70,0xf1,0x7c,0xa0,0xff,0x8b,0x49,0xbe,0xa0,0x6b,0xbc,0xa5, + 0xae,0x9b,0xaf,0x0f,0x8e,0x9a,0x55,0xbf,0x44,0xae,0x26,0x39,0x77,0x33,0x8b,0x24,0x5c,0xb2,0xb2,0xbe, + 0x5a,0xeb,0x87,0x5f,0x56,0xb8,0xad,0x1e,0xe9,0x94,0x9a,0x41,0x94,0xe6,0x4a,0x63,0x7d,0x15,0xc0,0x58, + 0x62,0x20,0xef,0xd3,0x63,0x26,0xff,0xe6,0x04,0x9a,0xbb,0x92,0xb8,0x62,0x77,0x80,0xb9,0xd7,0x97,0x30, + 0x88,0x67,0x4d,0x8c,0x1f,0xf5,0xdd,0x79,0xeb,0xd3,0x4b,0x77,0xfe,0xf2,0xa2,0x79,0xc5,0xa6,0xa7,0x57, + 0x70,0xdc,0xe6,0xbb,0x8f,0xd2,0x54,0x2f,0xf5,0x85,0x87,0xf8,0xb8,0x60,0x33,0x66,0x72,0xd0,0xce,0x35, + 0x72,0xae,0x6d,0x8d,0x95,0x82,0xa6,0x2b,0x0a,0x9a,0x3b,0xe5,0x46,0xe7,0xdd,0xaa,0x3b,0x46,0x61,0xf4, + 0x9a,0xcb,0xdc,0x96,0xd9,0xc9,0x1d,0x42,0xc8,0xdf,0x6f,0x20,0x1f,0x82,0x24,0x90,0xa1,0x0a,0x20,0x83, + 0x27,0x84,0x4e,0x34,0x9d,0xa7,0xb8,0xbb,0x08,0xfd,0x05,0x37,0x33,0x39,0x83,0xae,0xef,0x65,0x14,0x19, + 0x18,0x87,0x45,0xf0,0x8e,0xd0,0xb0,0x22,0xb6,0xb3,0xf3,0x00,0x5b,0x19,0x73,0xbf,0xbd,0xa9,0x1a,0x4b, + 0xee,0xc4,0x7a,0xa4,0xba,0x7c,0x74,0x6d,0xe2,0x29,0x5e,0xea,0x36,0xed,0xac,0x31,0xb0,0x7c,0xc9,0x44, + 0x2c,0x0d,0x74,0x53,0x32,0xc6,0xb5,0xd5,0xb6,0x66,0x67,0x9f,0xb5,0x95,0x5d,0x30,0xf1,0x24,0xf3,0x36, + 0xd9,0x71,0x74,0x15,0x4e,0x68,0xdb,0xb9,0x77,0xc2,0xff,0xcc,0x31,0xbe,0xa2,0xef,0x59,0x5b,0x25,0x16, + 0xfa,0x59,0xcd,0x03,0xe8,0x5e,0x8f,0x33,0x93,0x24,0x49,0x19,0x6d,0xa8,0x80,0x00,0x9b,0xea,0xaf,0x5f, + 0xe5,0xd8,0xe9,0x76,0x08,0xcc,0x59,0x88,0xaa,0x62,0x06,0x2a,0xfd,0x96,0x0f,0xda,0xc3,0xcd,0xbb,0x0f, + 0xda,0xb9,0xb3,0xe3,0xcf,0x7c,0x20,0x09,0x65,0xf6,0xb2,0xd8,0xec,0x57,0x7d,0x3a,0x08,0xcf,0x39,0x11, + 0x2a,0xdf,0xdb,0x66,0xe1,0x2f,0x4e,0xf3,0x60,0xeb,0xf8,0xd5,0x5b,0x9a,0x61,0x63,0xde,0xaa,0xaf,0x13, + 0xbd,0x5b,0x0b,0xa6,0x19,0x2f,0x23,0x92,0x35,0x14,0x7f,0x45,0xc7,0xfb,0xfc,0x55,0x84,0xeb,0xad,0xb5, + 0xdb,0xae,0x15,0xe3,0xac,0x70,0x24,0xf4,0x97,0x0f,0x63,0xff,0x2a,0x11,0x91,0x0f,0x3d,0xb3,0xe5,0x8c, + 0xd8,0xb1,0xee,0x6c,0x06,0x24,0x51,0xd7,0xdd,0x44,0xac,0x2b,0x94,0x6f,0x41,0x5e,0xef,0xa6,0x3b,0xd3, + 0xd2,0xdd,0x37,0x2e,0x52,0x60,0x00,0xad,0xbe,0xb8,0xdf,0x3f,0xde,0x5c,0x4f,0x8a,0x96,0x6e,0xa6,0x0b, + 0x78,0xea,0x55,0xd7,0x31,0xe1,0xdd,0x46,0xdd,0x84,0x58,0x43,0xea,0xc2,0x05,0x35,0x71,0x1c,0x18,0x4b, + 0x06,0x30,0xc2,0xe9,0xbd,0x1c,0x38,0x8f,0x1e,0x85,0x33,0xf3,0xe4,0xea,0xe9,0x16,0xc3,0x2c,0xdd,0xf3, + 0xc4,0x9a,0x3a,0x85,0x47,0xd3,0xe9,0x23,0xfd,0x53,0x05,0xd9,0x3b,0x40,0x5e,0x33,0x6b,0x5e,0xbf,0x31, + 0x89,0x26,0x04,0xc3,0xed,0x04,0x1f,0x76,0x27,0xbf,0x79,0xea,0x26,0xdf,0x9c,0x3a,0x44,0x26,0x41,0xe3, + 0x95,0xc7,0x75,0x59,0x11,0x9e,0xea,0xa4,0x5f,0x60,0xc0,0x01,0x42,0x6d,0x0c,0x7c,0x67,0xf6,0xa0,0xe5, + 0x30,0x65,0x8c,0xc6,0x44,0xc3,0x0e,0xf1,0xf5,0xde,0x6b,0xb0,0x84,0x4a,0xef,0xbc,0x51,0x05,0x40,0xc9, + 0xf7,0x18,0x98,0xab,0x49,0x9a,0xb3,0x09,0xe8,0x83,0xa8,0xee,0x2a,0x95,0x9a,0x98,0xd1,0xf1,0x1f,0x35, + 0xa8,0x0b,0x0e,0xe7,0x59,0x59,0xe4,0x12,0x61,0x7e,0x77,0xf4,0x51,0xed,0x7f,0x4b,0xa2,0x3a,0x69,0x75, + 0x8f,0x4f,0x61,0xba,0x69,0x2c,0x3c,0xe9,0x5c,0x5c,0x77,0xbd,0xf3,0x5e,0x49,0xfb,0x76,0x3c,0xe1,0xd0, + 0x4c,0xb8,0x10,0x4c,0x02,0xb0,0x11,0xe2,0xc4,0x43,0x22,0xe7,0xb0,0x7e,0x0d,0x12,0x2e,0x52,0x0f,0xe0, + 0xb8,0x35,0x2a,0x02,0x3c,0xe4,0x58,0x21,0x11,0x83,0xe6,0xa8,0xa6,0x37,0x14,0x21,0x18,0x67,0x32,0x8e, + 0x11,0x16,0x97,0x43,0xd8,0x77,0x5c,0x27,0x7c,0xcb,0xd4,0x54,0x1e,0xf4,0xcd,0xe5,0x0b,0x07,0xb2,0xdf, + 0x04,0xc1,0xc6,0x42,0xbe,0x7c,0xbb,0x06,0xb0,0x59,0xd8,0x67,0x48,0xf1,0x57,0x00,0xbd,0x72,0x6a,0x47, + 0x82,0x65,0xbc,0x33,0xde,0x18,0xf7,0x42,0x39,0x19,0x8d,0xfb,0x4b,0xd2,0x2b,0x9c,0xf1,0x26,0x3e,0x47, + 0xf4,0x62,0xd8,0x05,0xa0,0xa1,0x8d,0xeb,0x05,0x26,0x16,0x03,0x50,0x6e,0x62,0x08,0x1e,0x3d,0x1a,0x53, + 0xe7,0x2a,0xc8,0x4a,0x42,0xbf,0xee,0x47,0x3b,0x5a,0xe9,0x10,0xf6,0xcc,0xda,0x73,0xe5,0xde,0x61,0x41, + 0xa4,0xf5,0x16,0xe9,0x0b,0xc4,0x8e,0x82,0xc8,0xf3,0x42,0x2d,0x81,0x7b,0x77,0xbf,0x91,0xc6,0x28,0xcc, + 0x52,0xe3,0x22,0x5f,0x2f,0x11,0xc3,0xd2,0x09,0xfb,0xd0,0x2d,0xb0,0x10,0x12,0x7b,0x33,0x6b,0xcb,0x3c, + 0x54,0xc7,0x3e,0x85,0x5c,0x18,0x7c,0x78,0xfd,0x87,0xdb,0x25,0x02,0x3c,0xa2,0xa6,0x61,0x56,0x5f,0xd1, + 0x00,0x04,0x93,0x59,0xd1,0xd9,0x7c,0x64,0xbb,0xd2,0x03,0xbd,0x45,0xa3,0x23,0x78,0x16,0x70,0xda,0xa5, + 0x5a,0x75,0x79,0x57,0x48,0xa1,0xaa,0x4a,0x18,0x41,0x13,0x2f,0x1b,0x9e,0xe8,0x0a,0xa2,0xa9,0xc2,0x5a, + 0xe0,0x3e,0x52,0xb4,0xb3,0xbb,0xb7,0x7b,0xbc,0x6b,0x35,0x5c,0xcb,0xe8,0xb3,0x12,0x10,0x0e,0xc1,0x6a, + 0xab,0xba,0x21,0x57,0x6d,0xf2,0x2d,0xf9,0xb7,0xc8,0x92,0x77,0xee,0x5d,0x43,0x27,0xad,0xa2,0x1e,0xcd, + 0xd8,0x06,0x68,0xfa,0xbb,0xc8,0xdf,0x43,0x51,0xc4,0x15,0xcd,0xaa,0xd4,0x83,0xde,0x7a,0x45,0x8f,0x91, + 0x6a,0xc2,0xb9,0x95,0xf9,0x96,0xb2,0xee,0x0a,0x52,0xb8,0xb3,0x91,0xc1,0x42,0xad,0x78,0x23,0xf6,0x04, + 0xc1,0x8a,0x55,0xae,0xe6,0xe9,0xb3,0x8d,0xac,0xd7,0x43,0xb4,0xb1,0x94,0xfe,0x10,0x25,0x77,0x94,0x5e, + 0xa7,0x47,0x42,0x42,0xe6,0x69,0xd5,0x0e,0x9e,0x52,0x7a,0x12,0xbb,0x8a,0x20,0x47,0x22,0x5a,0x0e,0xcc, + 0xd8,0xcb,0x58,0xf5,0x91,0x7a,0x51,0x2f,0x23,0xb6,0x27,0xa5,0xed,0xdc,0x2b,0xbc,0xf1,0xd2,0x92,0x33, + 0x56,0xbc,0x7a,0xd1,0xad,0xe2,0x27,0x41,0xeb,0x55,0x18,0x72,0x93,0x3d,0x4e,0xb1,0x89,0xc7,0xda,0xb0, + 0xaf,0x47,0xe7,0xf7,0xd2,0x12,0x36,0xaf,0x27,0xc4,0x22,0x20,0xe2,0x08,0x74,0x22,0xe9,0xe4,0x8e,0x37, + 0xf6,0x78,0x73,0xbd,0x4d,0xdc,0x92,0x09,0x64,0x7a,0xd3,0x5b,0xc4,0x70,0x23,0x9c,0x23,0xb5,0x7b,0x39, + 0x5f,0x08,0x8e,0x13,0x26,0x65,0x86,0x36,0x6c,0x61,0xed,0x6e,0x16,0x99,0xd8,0xdb,0x52,0x38,0xdf,0xba, + 0x1a,0x76,0xdf,0xad,0x2e,0x33,0xcb,0xc9,0x60,0x4b,0x07,0x4c,0x76,0xe8,0xe1,0x55,0x40,0x27,0xd6,0x00, + 0xd4,0xe7,0x72,0xae,0xcd,0x64,0x53,0xf3,0xbb,0xc0,0x22,0xc4,0x3e,0x84,0xd1,0x13,0x68,0x9e,0xfa,0x8d, + 0x10,0x4d,0xff,0xe1,0x3f,0xc2,0xbd,0xc1,0x7a,0xc3,0xce,0x0f,0x30,0x2b,0x40,0x37,0x54,0x5b,0xe4,0x12, + 0xb7,0xfb,0x8d,0xb6,0x68,0x56,0xad,0x0a,0x08,0x02,0xc5,0xa5,0x3a,0x1a,0xd4,0x74,0x6a,0xa2,0x47,0xd5, + 0x6b,0x72,0xa0,0x1a,0x92,0x49,0x26,0x5b,0x83,0x01,0x52,0x59,0xd5,0x4b,0x45,0xc9,0x43,0x35,0x8c,0xb6, + 0x87,0x30,0x5e,0xfd,0xe6,0x74,0xb3,0xc4,0x33,0xd4,0x3e,0xc8,0x02,0x08,0x85,0x17,0xe3,0x02,0xf9,0x88, + 0xe1,0x65,0x84,0x00,0xf5,0x6f,0xc3,0x60,0xc2,0xcf,0x2e,0x5f,0xc8,0x13,0x16,0xe7,0x54,0xef,0x38,0xa5, + 0xe9,0xe5,0xd7,0x9b,0x27,0x76,0x13,0x5c,0x58,0x6f,0x84,0x5f,0xbd,0xa6,0x96,0xa4,0x15,0x9a,0xa5,0x15, + 0x9a,0xa7,0xd9,0x0a,0x55,0x83,0xae,0x7b,0x4a,0x82,0x5c,0x3e,0x59,0x5b,0xcd,0xd7,0xc4,0xe9,0x2c,0x4f, + 0xfb,0x8b,0x7b,0xd1,0x3f,0xd9,0x02,0xc8,0xcc,0xf6,0x29,0xc2,0x9a,0xdb,0xd5,0xfb,0x65,0xc6,0xd4,0x86, + 0xa6,0x4a,0x45,0x01,0xda,0x9a,0x4c,0x6c,0x52,0x7c,0xe3,0x5d,0xba,0x9e,0x62,0x89,0x96,0x96,0xb6,0x34, + 0xe3,0xfd,0x2f,0xa2,0x04,0x0b,0xc3,0x5e,0x6f,0x58,0x61,0xc4,0xbc,0xc9,0x7c,0x08,0x8c,0x1a,0x1f,0x56, + 0x39,0x02,0x32,0x35,0x53,0x77,0xee,0x8f,0xc4,0x54,0xa4,0x72,0x41,0xac,0xe8,0xb8,0x97,0xde,0x1b,0x96, + 0xc2,0xaa,0x05,0xca,0xb6,0xc5,0xb6,0xb5,0xab,0xe1,0x9a,0xe5,0xaa,0xd9,0xbf,0x18,0xd2,0xc6,0xb1,0x8d, + 0x0c,0x10,0xaa,0xf3,0x3c,0x4d,0x63,0x15,0x34,0x85,0x0e,0xb1,0x4d,0x9d,0xd9,0xa0,0x2b,0xcf,0x1e,0x89, + 0xaa,0x3e,0x1f,0x99,0x88,0x86,0x7e,0x19,0xde,0x78,0xa3,0x2e,0x88,0x54,0x3c,0x81,0x8a,0xda,0x63,0xc3, + 0x69,0x64,0x5d,0xa7,0x7f,0x43,0x13,0x12,0x20,0xac,0x42,0x02,0x84,0x1c,0x12,0x40,0x92,0x47,0x84,0xec, + 0x6f,0xe0,0x0d,0x2e,0x62,0xfc,0x56,0x81,0x82,0xef,0x14,0x9f,0xa6,0x1d,0xbe,0x0c,0x24,0x34,0x05,0x05, + 0x07,0x9c,0x86,0xb7,0x8f,0x78,0x83,0x48,0xa8,0xed,0x5a,0x30,0x89,0xca,0xc0,0x00,0x28,0xb1,0x8d,0x68, + 0x7c,0x3d,0x65,0xd4,0x5e,0x17,0xaf,0x39,0x4e,0x1f,0x22,0xf4,0x55,0x1e,0x61,0x34,0x1f,0xc8,0x9b,0xc8, + 0x0e,0x61,0x30,0x84,0xc9,0xb2,0x63,0x3a,0xae,0x7a,0x1c,0x48,0xb0,0xf7,0xb2,0xb9,0x7b,0x78,0xd8,0xe5, + 0x4c,0x79,0x89,0x8f,0x24,0x7d,0xc8,0x94,0xc7,0xbb,0x9e,0x48,0x3f,0x9e,0xb5,0xcf,0x13,0x17,0x42,0x25, + 0xcb,0x5a,0x50,0x09,0x3b,0x91,0x98,0xf3,0x86,0x1a,0x15,0xa0,0x94,0xe9,0xc3,0x03,0x80,0xdd,0x69,0x08, + 0xb8,0xaa,0x6c,0xd8,0xed,0x08,0x51,0xe8,0x30,0x58,0x9a,0xaf,0xbc,0x3f,0x9d,0x2a,0xc5,0x02,0x49,0x04, + 0xa3,0x14,0x21,0x07,0x6f,0xe0,0xb4,0xa2,0x1e,0xbb,0xaa,0x50,0xd1,0x9a,0xcd,0xe6,0x15,0xca,0xd4,0x13, + 0x17,0x5a,0x81,0xd0,0x10,0xc4,0x6d,0xbb,0x48,0x66,0xe5,0xf1,0x07,0x79,0x6c,0x87,0x43,0xbf,0x89,0xeb, + 0xf3,0x3f,0xfe,0xd7,0xb6,0x39,0xc8,0xc3,0x76,0x65,0x34,0x63,0x07,0xb4,0xfb,0x10,0xf8,0xfe,0x96,0x6f, + 0x12,0xe8,0xd8,0x41,0x54,0xbc,0x90,0xf3,0x55,0x87,0x3e,0xff,0x95,0xb1,0xdd,0x79,0xb5,0x50,0x6c,0xbd, + 0xe6,0x77,0x2b,0x3a,0x7c,0x19,0x6b,0x79,0x66,0x2e,0x11,0xa0,0x03,0x27,0xae,0xf5,0x22,0x1a,0x72,0xe8, + 0x43,0x6d,0x62,0xc9,0x02,0xff,0x82,0xf0,0x8a,0xf3,0x07,0x8f,0x38,0xcc,0x08,0x32,0xec,0xa5,0x9c,0x95, + 0x94,0xfd,0x84,0xc1,0x8d,0x28,0x41,0x2c,0x5a,0xb8,0xfd,0x99,0xcf,0xa1,0xf9,0x65,0x5e,0xf0,0xd3,0xe1, + 0xbb,0x57,0x29,0xf1,0xe6,0x09,0x9c,0x8e,0x42,0xc2,0x82,0x95,0x3e,0x03,0x55,0x63,0x45,0xcc,0x64,0x7d, + 0x13,0xaa,0x1a,0x4e,0x68,0x54,0x22,0x8c,0x78,0xd4,0xb9,0x33,0x77,0x14,0x44,0xbd,0x6a,0x9c,0x05,0x42, + 0x2a,0xc0,0x72,0xc9,0xdd,0xd4,0xbf,0x40,0x1c,0xb3,0x45,0x15,0xb1,0x53,0x20,0x70,0xa2,0xaa,0xfe,0xdd, + 0x15,0x45,0xf6,0xa3,0xbc,0x6e,0x54,0xb5,0x00,0x5a,0x3a,0x1a,0xc4,0xc2,0xca,0x6c,0xb8,0x05,0x2a,0xb1, + 0xda,0xbc,0x7e,0x48,0x25,0xee,0xa4,0xf7,0xa8,0x6d,0x85,0x39,0x99,0x35,0xd2,0x62,0xe2,0x62,0x48,0x94, + 0xa7,0x02,0xa0,0x7a,0x23,0x57,0x7b,0xd8,0x7f,0xd3,0x7e,0xbf,0xff,0x2d,0xfb,0xfd,0xc1,0x8c,0xa3,0xa8, + 0x45,0x08,0x94,0xe7,0xb4,0xf2,0xeb,0xff,0x0f,0xff,0x27,0xd2,0x7a,0xf6,0x1e,0x5a,0x18,0x88,0xb6,0xda, + 0xf3,0x3b,0x80,0x31,0xf0,0x64,0x7e,0x5d,0xcd,0x76,0x0e,0x2c,0xd9,0x76,0xde,0xa3,0xe5,0x02,0x69,0x1a, + 0xe0,0xe4,0xf1,0x80,0x4b,0x40,0x1f,0x2a,0x06,0x83,0xf6,0x23,0x4b,0x74,0x4a,0x4d,0xd4,0x9c,0xca,0x64, + 0x73,0x23,0xb6,0xac,0x3f,0xc3,0x9a,0xed,0x69,0xa8,0xaf,0x40,0xe3,0x5f,0x6f,0x2b,0x1b,0xc0,0xfc,0x91, + 0xb0,0x23,0x9d,0x31,0x90,0x57,0xdd,0x11,0xa5,0x0e,0x8c,0x41,0xa1,0x32,0x79,0xbd,0x33,0x61,0xa2,0xb5, + 0x45,0xa4,0xc2,0xab,0xdb,0x78,0xce,0x10,0xd6,0x3a,0x6a,0xcd,0x5e,0x5b,0xa8,0x8e,0xf8,0x75,0x7b,0xce, + 0x0a,0x75,0xc4,0xc1,0x7a,0x15,0x75,0x31,0x82,0x02,0xcd,0xf7,0x91,0xb6,0xa6,0x65,0x83,0x26,0xe9,0x71, + 0x11,0x29,0xa9,0xbe,0xff,0x86,0x48,0x31,0x72,0x58,0xac,0xf8,0x86,0xcd,0xf9,0x6d,0x7a,0x9f,0x2d,0xed, + 0xe8,0x57,0xd9,0xe7,0xd6,0xe7,0x5f,0x8c,0xb1,0x38,0xc7,0x0a,0xdb,0x1c,0xd3,0xb1,0x0a,0xd9,0x43,0xbc, + 0x6b,0xcc,0x2b,0xb4,0x2b,0xad,0xff,0xba,0xad,0x4c,0xef,0x66,0xac,0x19,0x3d,0x3a,0xbe,0xb9,0x0d,0xda, + 0xbf,0xb3,0xf4,0x57,0x07,0x18,0x65,0x0f,0x9e,0xd0,0x98,0xb7,0xd1,0x3f,0xca,0xe6,0x8a,0x69,0x50,0xf3, + 0xe4,0xb4,0x49,0xc2,0x8d,0xa5,0x0d,0x89,0x8d,0xdb,0xb4,0xc4,0xbc,0x30,0x1e,0xf1,0x5a,0x89,0x36,0xbb, + 0x49,0x90,0x73,0x00,0x3e,0x6c,0x77,0x0b,0xf7,0xa5,0x55,0x5a,0x3e,0x58,0x3a,0x7a,0xb0,0x74,0xbc,0x60, + 0x73,0x22,0xa5,0x0a,0x09,0x5e,0x5a,0x13,0x6f,0x3c,0x1d,0xf8,0xc2,0x4e,0xab,0xdb,0x9b,0x8b,0xae,0x05, + 0xb4,0xd7,0x43,0xad,0xe6,0x5b,0x54,0x9d,0x40,0x1a,0xfb,0x4d,0x5d,0xe9,0x2d,0xc3,0x01,0x5e,0xbf,0xd1, + 0x99,0xae,0xcb,0x5d,0xd1,0xca,0x5d,0xfc,0xb6,0xae,0x24,0x9f,0xd9,0x37,0x7b,0x51,0xd5,0xb8,0x13,0xb8, + 0xfd,0xe3,0x52,0xe7,0xdc,0x78,0x28,0x5c,0x1b,0x0f,0x85,0x2b,0xf1,0x50,0xb8,0xb1,0x3c,0x14,0xbc,0x23, + 0xd6,0x85,0x9d,0x98,0x60,0xa1,0x12,0x35,0x88,0x38,0x02,0x46,0xbf,0x60,0xe6,0xdd,0x29,0x49,0x8c,0xa8, + 0x3f,0xe3,0x10,0x76,0x72,0x04,0xaf,0xe3,0xd9,0xba,0xc4,0xf9,0x2e,0x22,0xdb,0x09,0x42,0x3a,0xde,0xe3, + 0xa6,0xd5,0xfc,0xdb,0x7f,0xf3,0x7f,0xa8,0xeb,0x8c,0x45,0xb4,0x97,0x2d,0x7d,0x69,0xda,0xe1,0x2e,0x02, + 0xef,0x78,0x5b,0x85,0xb5,0x2b,0x41,0xa7,0xd9,0x6b,0xa2,0x66,0xad,0x61,0x2e,0xfa,0x89,0x79,0x54,0x81, + 0x38,0x40,0x77,0x8e,0x71,0xe2,0x34,0x99,0xe4,0xbf,0xc5,0xec,0x6b,0x97,0xb2,0xd9,0xa3,0x6d,0x7c,0x5e, + 0x88,0x5d,0x09,0x78,0x76,0x04,0x4b,0x5c,0xb6,0xda,0xa1,0xef,0x1b,0x38,0xfb,0x5c,0xc5,0x96,0x05,0x75, + 0xd5,0x67,0x30,0x17,0x2e,0x47,0x89,0x08,0x8f,0x74,0x13,0x7c,0xc4,0xfd,0x4f,0xff,0x63,0xf3,0x41,0xaf, + 0x5b,0x45,0x77,0x60,0x84,0x54,0x49,0x10,0xc7,0xd8,0xe7,0xe2,0x23,0x22,0xc4,0x76,0x3a,0xed,0xab,0x38, + 0x15,0x3c,0xfd,0x6a,0x0e,0x4e,0x18,0x97,0x84,0xe1,0xec,0xab,0xc0,0x15,0x5c,0xbe,0x21,0xc1,0x38,0x62, + 0x3e,0x24,0xf4,0xbb,0x62,0x3a,0x75,0x8a,0x85,0xfb,0x92,0x06,0xdf,0xf4,0x04,0x66,0x3b,0xad,0x47,0xcc, + 0x66,0xa6,0x8a,0x87,0x2c,0x4c,0xc4,0x91,0x93,0xd9,0x63,0x2b,0xe9,0xe9,0x60,0xd2,0x1b,0x85,0x39,0xab, + 0x13,0xef,0x1d,0xc2,0x39,0x2e,0x2d,0x3d,0xaa,0x7c,0xb2,0xa0,0xf7,0xe3,0xa4,0x27,0x8b,0x0f,0x02,0xdd, + 0x11,0x4b,0x24,0xf5,0x6f,0x7a,0xcd,0x0e,0x87,0x93,0x38,0xad,0xe6,0x68,0x8f,0xf3,0xbc,0x64,0x95,0x35, + 0x6d,0x33,0x4e,0xd3,0x09,0xe4,0x9a,0x4c,0x71,0x28,0xb3,0xc3,0x04,0x9a,0x2d,0x3b,0x1c,0x15,0xa9,0x27, + 0xa1,0xda,0xf1,0x93,0xc3,0xb2,0x83,0xda,0xc5,0x9b,0x8b,0x50,0x13,0x09,0x01,0x0c,0x03,0x33,0xc8,0x82, + 0x21,0x82,0x52,0xf1,0xca,0xfe,0xaf,0xff,0x4f,0x53,0x79,0x8b,0xc5,0xe0,0x4a,0xfe,0x45,0xf1,0x63,0xf8, + 0x5c,0x9e,0xb0,0xb3,0x9e,0x54,0x7e,0x15,0x4c,0x70,0x23,0x0d,0x21,0x5e,0x5e,0xbc,0x1b,0xd8,0x56,0x35, + 0xc4,0xd0,0xd1,0xe1,0x57,0x29,0x66,0xb1,0xe6,0xcd,0x01,0xf2,0x0e,0x1a,0x13,0xf3,0xa2,0xd7,0xf7,0xa9, + 0xc7,0x30,0xdb,0x51,0x52,0x2f,0xfc,0x2d,0x2d,0x16,0xa3,0xf0,0x43,0x91,0x7f,0x5f,0x67,0xe9,0x98,0x7b, + 0xa5,0xce,0x08,0x0b,0xe9,0xcd,0x1f,0x3d,0xfd,0xeb,0x27,0xec,0x98,0xc0,0x18,0x9e,0xe5,0xc5,0xa6,0xf9, + 0xe5,0x34,0x7d,0x35,0x97,0xae,0x4a,0x5b,0x86,0x54,0x45,0x08,0xc8,0x40,0xf2,0xb7,0x1c,0x78,0x08,0x43, + 0x36,0x08,0xbf,0x7c,0xbc,0x70,0x22,0xb7,0xdb,0xea,0x80,0xa5,0xc9,0x5f,0xb4,0x45,0xf0,0xe8,0xf5,0xd2, + 0xe9,0x34,0xa7,0xf9,0x4f,0xeb,0x3e,0x4f,0xd9,0x69,0x2f,0x61,0xf7,0xa6,0x7e,0xe8,0xa4,0x5e,0x07,0x2e, + 0x69,0xea,0x29,0xf7,0xda,0xb4,0xcc,0x1e,0x86,0xfe,0xce,0xa9,0xae,0xb7,0xaa,0xee,0x4e,0xf2,0x53,0x2c, + 0x41,0x7c,0xcf,0xbc,0xdc,0xd1,0x50,0x44,0xf3,0xf9,0x60,0xcc,0x25,0x94,0xb0,0xa7,0xf5,0xc3,0xd5,0x10, + 0x5c,0x22,0xfa,0x56,0xa5,0x3e,0x0c,0x10,0x63,0xae,0x28,0xc7,0x71,0x6d,0xd1,0xe4,0x4b,0x03,0x1f,0x46, + 0x75,0xb7,0xf1,0x40,0x94,0x22,0x0b,0xb2,0x7b,0xeb,0x18,0xb0,0xee,0xad,0x51,0xc1,0x74,0x57,0x31,0xc9, + 0x3a,0x81,0x1e,0x6b,0x03,0xd2,0x2c,0x1a,0x46,0x09,0x9d,0xdd,0x4d,0x68,0x2e,0x89,0xa2,0xd9,0x6f,0xc7, + 0xbd,0x72,0x3a,0x1d,0x79,0x27,0x43,0xef,0xe2,0xb4,0x57,0x6e,0x82,0x42,0x75,0x2d,0xfa,0xe3,0x9d,0xf7, + 0x08,0x25,0xf6,0xc3,0xa4,0x74,0x4e,0xe2,0xcd,0x13,0x48,0x0b,0x7c,0x47,0x56,0xa4,0x0f,0x29,0x9f,0x0f, + 0x38,0x55,0x71,0x8d,0xed,0x54,0x0a,0x67,0xcf,0x16,0x60,0xef,0x6c,0x07,0xad,0x11,0x47,0x91,0xf8,0x96, + 0xea,0xf9,0x54,0x70,0x53,0x40,0x19,0x94,0x13,0x51,0x57,0x31,0x0c,0x15,0x62,0x2d,0xc3,0x02,0x3c,0x94, + 0x05,0x50,0x1f,0x94,0xfc,0x81,0x88,0xdf,0xff,0xa6,0x42,0xf5,0xa9,0xd6,0x1a,0x40,0xdd,0x00,0x0f,0x25, + 0xfe,0xe1,0x73,0x00,0x78,0xd1,0xb7,0x08,0xe3,0x2e,0x73,0x47,0x5f,0x71,0x64,0x78,0x81,0xe1,0x0b,0x0d, + 0x53,0x7d,0x5f,0x51,0x2f,0xd4,0xe3,0xc9,0x0a,0x8a,0xd0,0x5c,0x50,0xd5,0x32,0x9a,0x41,0xc3,0xc5,0x12, + 0x1e,0xfc,0x48,0x89,0x87,0xc8,0x37,0x03,0xb6,0x4b,0x0f,0xbc,0xf0,0xb4,0x16,0xd9,0x48,0x46,0xf4,0xa2, + 0xe0,0x3f,0x9b,0xad,0x4e,0xb7,0x83,0xe0,0xa1,0xda,0x69,0x4c,0x66,0x87,0xe7,0x31,0x9c,0xeb,0xf0,0xc2, + 0x89,0x25,0x41,0x41,0xb5,0x5b,0x3b,0x60,0x81,0x59,0x56,0x62,0x47,0x5d,0xb4,0xc9,0x88,0x64,0x9f,0x5c, + 0x0d,0x66,0xaa,0xd1,0x32,0xbb,0x20,0x04,0xbd,0x60,0x0e,0x6e,0x6d,0xac,0xac,0x21,0xf0,0x46,0xd3,0xa9, + 0x4a,0x0c,0x30,0x41,0x4e,0xb8,0xa4,0x90,0xb5,0x0d,0xe3,0xdf,0x74,0xbd,0xf1,0x80,0x6c,0xa3,0x20,0xb4, + 0xae,0x3a,0x42,0x84,0xc7,0x63,0xae,0x33,0x21,0xea,0x34,0x37,0xb3,0x8b,0xc0,0xf6,0x16,0xae,0x01,0x46, + 0xf0,0x30,0xc2,0x12,0xd3,0x2f,0x4b,0x7c,0x8a,0x6b,0x3d,0xc1,0x0e,0xce,0xed,0x75,0xd5,0x3b,0xb9,0xf6, + 0x25,0xe7,0x81,0xfc,0x7d,0xa4,0x27,0x73,0x53,0xfe,0x08,0x62,0xd0,0xba,0x6a,0x45,0x96,0x73,0xed,0x9e, + 0x6a,0x10,0xb6,0xd3,0x34,0x0e,0x03,0xe3,0xe6,0x7e,0x32,0xf1,0x16,0x1d,0x73,0x93,0x34,0xaf,0x8c,0x24, + 0x68,0x5b,0xa8,0x08,0x08,0xf3,0x8c,0x29,0xed,0x71,0x0e,0xda,0x7e,0xb7,0x80,0x8d,0x4b,0xd8,0x04,0xd1, + 0x17,0xfd,0xba,0xda,0x24,0x57,0x1a,0xab,0xe7,0xab,0xe7,0x25,0xae,0xc2,0xae,0x54,0x54,0x1d,0x49,0xa8, + 0xa2,0xcd,0x78,0xc6,0x0b,0xea,0x13,0xb5,0x9f,0xd0,0xf1,0x5d,0xd2,0xb1,0x9d,0xcb,0xa1,0x4d,0x1c,0x23, + 0x3d,0xe1,0xbd,0x4a,0xfd,0x29,0x95,0x0e,0x84,0x78,0xe9,0x31,0xc4,0x10,0xd6,0x10,0x82,0x7e,0x12,0x0e, + 0xee,0x69,0xb6,0xc1,0x11,0xea,0x2d,0x85,0x25,0x9a,0xa4,0x57,0x3a,0x84,0x95,0x7e,0x36,0x6d,0xce,0xe0, + 0xe1,0xaf,0x6f,0xf5,0x0d,0xa1,0x9a,0xdd,0xea,0x1b,0x51,0xd9,0x68,0xda,0xc0,0xb4,0x64,0x53,0xeb,0x32, + 0x35,0x47,0xa4,0xde,0xeb,0xc9,0xd9,0x75,0x88,0x06,0xe3,0x6a,0xed,0xa2,0x9e,0x61,0x8e,0x10,0xa4,0x6f, + 0xae,0x42,0xd9,0x15,0x76,0x56,0x8a,0xfc,0x52,0x4f,0x21,0x27,0x94,0x68,0x96,0x10,0xa9,0x80,0x29,0xa2, + 0x45,0xa8,0x76,0x53,0x24,0x49,0x6c,0x65,0xa6,0x39,0x57,0x05,0x1c,0xb5,0xec,0xa2,0x70,0x80,0xd7,0xef, + 0x06,0xb9,0xf3,0x4d,0xea,0x6c,0x20,0x7a,0x35,0xab,0x17,0x5d,0xc4,0xb3,0xb1,0xb9,0x91,0xb5,0x23,0x48, + 0xe4,0x15,0xc1,0x48,0x5d,0xd3,0x8b,0x82,0x18,0xa6,0x64,0xfc,0xac,0x91,0xcf,0xad,0xed,0x89,0x60,0x7e, + 0x4f,0x78,0x27,0xc4,0x3f,0x9e,0xf6,0x70,0x94,0xe9,0xed,0xf1,0xdb,0x11,0x3e,0xa8,0x23,0xfc,0x7d,0x78, + 0x1e,0xd5,0xf1,0x7c,0xd1,0x7d,0xb2,0xe0,0x4c,0xd3,0xe0,0xc6,0x3e,0x4b,0x7e,0x2c,0x1f,0xfe,0x5a,0xc4, + 0x00,0x3f,0xec,0x99,0x73,0xf8,0x5f,0x7b,0xd6,0xfc,0xe7,0x3a,0x09,0xe1,0x7d,0x3a,0x87,0xba,0x49,0x0d, + 0x75,0x2d,0x33,0xc3,0x77,0xd0,0xc1,0x69,0xc5,0x85,0x37,0x78,0x20,0x15,0x86,0x1c,0x66,0x7b,0x6c,0x53, + 0x22,0xc2,0x00,0x26,0x3a,0x51,0x83,0x45,0xa4,0xb1,0xdf,0xa0,0xa7,0x4e,0x52,0xa5,0x03,0xc0,0xf5,0xd2, + 0x82,0x3e,0x8d,0xf4,0x8c,0xfe,0x90,0xa7,0xf3,0x9c,0x15,0xda,0x84,0x0f,0xba,0xbb,0xc9,0x6f,0xeb,0xae, + 0xa6,0xe5,0xc0,0xad,0xf0,0x8c,0x0f,0xbf,0x5e,0x33,0xe3,0xa0,0xef,0x95,0x8b,0xe0,0x8a,0x66,0xe1,0x52, + 0xc2,0xb4,0x37,0x9c,0x69,0x30,0x9a,0x6b,0xd0,0x98,0xb4,0xe4,0x35,0xff,0x74,0x2d,0x81,0x6a,0x6c,0xdb, + 0x18,0x2d,0xea,0x37,0xe4,0x7e,0x5f,0x51,0x47,0x17,0x33,0x1d,0x85,0xf3,0x90,0xdf,0x38,0x97,0x8e,0xcb, + 0xe9,0xb2,0x3a,0xdd,0xf6,0x9c,0xa3,0xc7,0x81,0xd6,0xba,0x3e,0x74,0x2d,0x28,0xab,0xa3,0x04,0xdd,0xd9, + 0xc8,0xc4,0x9b,0x61,0x65,0xde,0x92,0xaa,0xaf,0xed,0x64,0xbc,0x1b,0xc8,0x5b,0x5c,0x90,0x28,0x64,0x67, + 0x78,0x96,0x33,0xe4,0x51,0xc5,0xf3,0x2e,0x2d,0x29,0xed,0x8b,0xfd,0x12,0x77,0x7e,0x33,0x03,0x4c,0xad, + 0x91,0xe5,0xf5,0x46,0xd5,0xf7,0x16,0x23,0xed,0x7e,0x8b,0xf3,0xf2,0x8a,0x85,0x4d,0xd8,0x20,0x78,0x49, + 0xad,0x0a,0xa2,0xd7,0xed,0x11,0xba,0xf3,0x12,0x89,0xaf,0x11,0x89,0xdd,0x15,0xdb,0x07,0xf2,0x69,0xd7, + 0x7f,0xa4,0x3f,0x00,0xf1,0x37,0x1f,0x58,0xf5,0xbf,0x09,0x62,0x34,0xdb,0x9e,0x6a,0x05,0x6e,0xe5,0xb4, + 0xb2,0xcc,0xee,0x5c,0xff,0x1a,0xbd,0xf7,0xf5,0x3d,0xd1,0x1a,0xee,0x93,0x0e,0x52,0x49,0xac,0x78,0xcb, + 0x7f,0xbb,0xd0,0x4c,0xe9,0xef,0xbb,0xb3,0x2a,0x2a,0x5b,0x68,0xe0,0xea,0x47,0xf5,0xd0,0x0e,0x07,0xdf, + 0x62,0xc9,0x6c,0xd8,0x3a,0xd4,0xda,0xd5,0xc3,0x5a,0x63,0x6a,0xef,0x1b,0x36,0x6b,0x55,0x0c,0x87,0xad, + 0x87,0xa2,0xde,0x3d,0xa4,0x34,0x84,0x12,0x55,0x08,0xdb,0x83,0x4a,0x43,0x55,0x8d,0x95,0x86,0xb4,0x28, + 0x63,0x8f,0x38,0x06,0xef,0xdc,0xb6,0xe5,0xac,0x46,0x9f,0xb8,0x0b,0x02,0x1b,0x3d,0x08,0x94,0x84,0x39, + 0x85,0x65,0x38,0x87,0x2f,0x57,0x3e,0xf8,0xaf,0x0e,0xdf,0x1d,0x1c,0x9f,0x1d,0xef,0xee,0x1f,0xec,0x6d, + 0x1d,0xef,0xf6,0xfe,0xee,0xbb,0xc6,0xbf,0xc3,0x3a,0x34,0xf6,0x6f,0x1a,0x5b,0x93,0xc9,0xe7,0x84,0x9e, + 0x71,0xb5,0xda,0xf8,0x71,0x14,0x14,0x92,0x59,0x9b,0xa0,0x6c,0x40,0x9c,0xcb,0x3f,0x27,0x28,0xde,0xe2, + 0x8c,0xb7,0x0d,0x14,0x34,0xb8,0xd7,0x0d,0xce,0xf6,0x49,0xbf,0x48,0xdc,0x8f,0x92,0xb0,0x21,0x67,0x34, + 0x15,0x27,0xc6,0xc9,0xcf,0x6f,0xc0,0x71,0xce,0x71,0xf1,0x15,0xe1,0x4c,0x19,0x65,0xe1,0xc0,0x43,0x63, + 0xd0,0xf8,0xdf,0x34,0x52,0x6a,0x20,0x83,0x9d,0xf5,0x28,0x1d,0x34,0x9c,0x08,0xb7,0xe2,0x0d,0x4c,0x0c, + 0x52,0x89,0x9e,0x89,0x32,0xd0,0x43,0xec,0x98,0x72,0xc2,0x2d,0xc8,0xf5,0x77,0x10,0xfb,0x9f,0x13,0x06, + 0x80,0x60,0x67,0xd0,0x1b,0x8d,0xab,0x20,0x6b,0x24,0x00,0xb3,0xd1,0x18,0x84,0x17,0x0d,0xb4,0xe4,0xb8, + 0x78,0x6a,0x20,0xc1,0xec,0x85,0x9f,0x34,0x7a,0x8d,0x1c,0xd9,0x0f,0x58,0xe3,0xd6,0xec,0x13,0x19,0x2f, + 0x9a,0x5e,0xa3,0xcd,0x75,0x68,0x95,0xab,0x4f,0x15,0xbc,0xd5,0x7f,0x34,0xac,0x17,0x19,0x66,0xeb,0x9a, + 0x56,0x20,0x6c,0x5c,0x45,0x79,0x44,0x88,0x27,0x1d,0xf4,0x89,0x59,0xc9,0x74,0x6f,0xdf,0xf1,0x9c,0x88, + 0x71,0x03,0x40,0x5e,0x5b,0xfd,0xf2,0x6c,0xa3,0x71,0x83,0x9f,0x28,0x80,0x59,0x61,0x63,0x7b,0xeb,0x68, + 0x77,0xef,0xdd,0x87,0x5d,0xf9,0x82,0x2d,0x0d,0x3b,0x5e,0xe3,0xa9,0xd7,0x68,0x26,0xbd,0x66,0x63,0x99, + 0x00,0xcd,0x1c,0x81,0xda,0x25,0x10,0xbf,0xb4,0xdb,0x5b,0xed,0xd7,0xaf,0x2b,0x48,0x15,0xb8,0x4a,0x50, + 0xe3,0x29,0x40,0xef,0x7f,0xe7,0xed,0x7f,0xdc,0xf9,0xb4,0xb7,0x5b,0x2d,0x31,0xe1,0xf9,0xbf,0xa7,0x55, + 0x15,0x02,0x55,0x2d,0xf0,0xd1,0x28,0xa0,0x55,0x68,0x00,0x1b,0xc3,0x4c,0xad,0xed,0x47,0x5e,0x08,0x45, + 0x82,0x1b,0xd7,0x59,0x54,0x84,0x0d,0x65,0x65,0xd9,0xf8,0xdd,0x6d,0x78,0xd7,0xa4,0x45,0x1d,0x34,0xfa, + 0xc4,0x45,0xf2,0xa3,0x5f,0x5c,0x43,0x96,0x5c,0x75,0x69,0x25,0x30,0xf5,0x63,0x9a,0x5e,0xe9,0xc6,0x69, + 0x72,0x75,0x82,0x67,0x2c,0x95,0xa8,0x04,0xd3,0xea,0x5c,0xb9,0x0d,0x2d,0x5a,0x36,0x1e,0x37,0x56,0x65, + 0x28,0xea,0xcd,0xf8,0x73,0xf2,0xef,0x37,0x66,0xb2,0xb2,0xef,0x13,0x47,0x54,0x0f,0x18,0x20,0x71,0xb6, + 0x86,0xbb,0x5f,0x26,0x4e,0xf3,0xcf,0xdf,0x9d,0x34,0x3e,0x7f,0x2e,0x4e,0x1f,0xff,0xbb,0xe6,0x72,0xb1, + 0xdc,0x94,0x87,0x65,0xc7,0x5f,0x76,0x7f,0x87,0xd4,0x9c,0x4d,0xd7,0x0f,0xbf,0x84,0xfd,0x8a,0x71,0x44, + 0xbc,0xc5,0x93,0xce,0xa9,0x4f,0xcb,0x32,0x76,0x38,0x7b,0xa2,0xb4,0x0a,0x17,0xd7,0x23,0xed,0xe3,0x3a, + 0x03,0x81,0x30,0xd1,0x16,0x47,0xae,0x9c,0x36,0x15,0x3c,0xf0,0xcd,0xd3,0x46,0x27,0xec,0xa6,0xa8,0x82, + 0xff,0xac,0x7c,0xce,0x36,0x3f,0x27,0x2b,0x6e,0x75,0x33,0x99,0xa8,0x6e,0x37,0x44,0x3f,0x6e,0x42,0x9a, + 0xc0,0x61,0xea,0x3b,0x3e,0x38,0x90,0xdf,0xe3,0x3c,0x0b,0x83,0x4b,0xa3,0x30,0x5f,0xe1,0x11,0x62,0x80, + 0xcc,0xfc,0x7d,0x3e,0x97,0x27,0xc7,0x7f,0xcc,0xde,0x91,0x7a,0x74,0xf0,0xf9,0x73,0x67,0x92,0x69,0x06, + 0x18,0xa8,0x82,0xe5,0xc4,0xfb,0x9c,0x9f,0x2e,0x13,0x30,0x2b,0x7f,0x3e,0xd9,0x6a,0xfd,0x29,0x68,0x7d, + 0x6d,0xb7,0x9e,0x9f,0xb5,0x4e,0x6f,0x3b,0xde,0xda,0xea,0x9d,0xf1,0xc5,0x44,0x94,0x5f,0xa3,0x13,0x0c, + 0x5d,0x49,0x1d,0x2c,0x5c,0xc1,0x8b,0xb5,0x55,0xce,0x23,0xac,0x02,0xbe,0xea,0xb8,0xe1,0xfa,0x02,0x9e, + 0x67,0x8a,0x53,0x40,0xaa,0x9b,0x3c,0x6d,0xbe,0xfb,0x67,0xbb,0xbb,0x19,0x3b,0xde,0xb5,0x55,0xeb,0xee, + 0xc0,0x18,0x9c,0xce,0xb8,0x12,0x17,0xb6,0xa7,0x30,0x6c,0x4e,0x37,0x8b,0x6e,0x65,0x7e,0x5a,0x68,0x63, + 0x53,0x04,0x91,0xc1,0x16,0x5a,0x61,0x13,0x1c,0xc8,0x22,0x51,0xef,0xd3,0xe1,0x9e,0x0a,0xdf,0x21,0x77, + 0xaf,0xf4,0x2c,0x71,0x16,0x6a,0x49,0xd8,0x22,0x4f,0x77,0xcd,0x39,0x9f,0x16,0xc6,0x8d,0xcc,0x11,0x0b, + 0x96,0x0f,0x11,0x47,0x42,0xdd,0xb2,0x66,0x90,0xd3,0x31,0xe8,0xb0,0xd8,0x38,0x5b,0xd0,0x61,0x16,0x5e, + 0xa5,0x97,0x56,0x87,0x91,0xcb,0xf1,0xb2,0xd5,0x44,0xf5,0xb3,0xfe,0xda,0x6a,0xcf,0xa9,0x05,0x5e,0xd2, + 0x4e,0xda,0x6b,0xab,0xc2,0x17,0x21,0x86,0xc6,0x6c,0xa8,0xee,0x27,0x4f,0x39,0x36,0xb7,0xba,0x54,0x2c, + 0x66,0xbc,0x86,0x9f,0xb1,0xcf,0x70,0xd2,0xeb,0x2c,0x25,0x9b,0x6b,0xcf,0x9f,0x3d,0x5b,0x7d,0xbe,0xba, + 0xf6,0x6c,0xfd,0xcf,0xc9,0xcb,0x97,0x2f,0x3b,0x5d,0xfe,0x77,0x03,0x69,0x61,0x7b,0xf8,0xd9,0x36,0x6b, + 0x87,0xa0,0xab,0xdc,0xdc,0xfa,0xea,0xf3,0xf5,0xe7,0x4f,0xff,0xb0,0xfa,0xfc,0x89,0x69,0x17,0x39,0x2e, + 0x83,0xca,0x5b,0x33,0xe0,0xe6,0xc3,0x13,0x38,0x5c,0x3a,0xc9,0x9f,0x8b,0x93,0xe0,0xd4,0x3d,0xe5,0xf6, + 0x9f,0x69,0x6f,0xc8,0xaa,0x91,0x3f,0x27,0x2e,0xf7,0x73,0xe7,0xda,0xd1,0xb7,0xbe,0x92,0x6c,0x0e,0xca, + 0x6b,0xef,0x24,0x8c,0x1c,0x26,0x01,0x62,0x41,0x9c,0x79,0xe6,0xba,0x74,0x43,0x87,0x24,0x31,0x31,0x44, + 0x7b,0x2f,0x4f,0xea,0x91,0x29,0x4e,0x25,0x31,0xd1,0xcc,0x5b,0xcf,0x84,0x52,0xc1,0xaf,0x97,0xab,0xeb, + 0x52,0x35,0xad,0x22,0x54,0xc7,0x95,0x0f,0x7f,0xe7,0xf9,0xb3,0x76,0xe5,0x2d,0xb9,0xda,0x69,0xff,0xc1, + 0x4b,0x71,0x30,0xbc,0xa6,0x53,0xfc,0x27,0x26,0xe6,0x6c,0x45,0xc1,0xef,0xde,0xa6,0x65,0x46,0x12,0xf3, + 0x8b,0x17,0x9d,0xce,0x94,0x5f,0xec,0xd3,0xde,0x85,0x19,0x1f,0xbd,0x7a,0x22,0x6f,0x94,0x6d,0xa1,0x43, + 0xa3,0xef,0x78,0x83,0x5e,0xdc,0x42,0xfb,0x2f,0x5e,0x3c,0x57,0xf5,0x69,0xbb,0x8f,0x1c,0x77,0xb9,0x63, + 0xea,0x03,0x9c,0x5a,0x0e,0xdc,0x54,0x42,0x6b,0x54,0xd1,0xb2,0x7d,0x51,0x7f,0x39,0xa9,0x12,0x94,0x63, + 0x82,0x05,0xbc,0xb6,0xbd,0x25,0x2a,0xf7,0xfe,0x4d,0x29,0xec,0x9a,0xcf,0x14,0x59,0x4a,0x55,0xbc,0x75, + 0x6f,0xd2,0x63,0xf4,0x43,0x00,0xa3,0xb2,0x17,0x9b,0x50,0x27,0xb2,0xa9,0x67,0x42,0x05,0x40,0x01,0x99, + 0x39,0x4f,0xff,0xb0,0xb6,0xba,0xfe,0x87,0x27,0xab,0x2c,0xa3,0xe7,0xce,0x6a,0x5b,0xfd,0x98,0xfd,0xdb, + 0x57,0x7f,0x07,0xfc,0x37,0x43,0x78,0x12,0xfe,0x5b,0xd6,0xfe,0xe2,0x5e,0x4c,0xc7,0x59,0x53,0x9f,0x93, + 0x8c,0x19,0xc2,0xce,0x3a,0x78,0x00,0x88,0xb5,0xb5,0xa7,0x6b,0xcf,0x57,0xd7,0x9f,0xcd,0x02,0xf1,0x6f, + 0x0f,0xcd,0x43,0x7f,0x33,0xf3,0x37,0x62,0xa8,0x89,0xc0,0x2c,0xf7,0xd6,0xda,0xcb,0xba,0x91,0xe5,0xf2, + 0x4e,0xc2,0xca,0xb4,0x67,0xb3,0x1a,0x07,0xee,0x64,0xd9,0x48,0x57,0x46,0xa5,0xbf,0x70,0xa8,0x9d,0x36, + 0xfe,0x0b,0x02,0xb0,0x18,0x94,0x19,0x88,0x6b,0x8f,0xd5,0x38,0x23,0x6b,0x7a,0x37,0xe6,0x3c,0xfc,0x21, + 0x88,0xf3,0xbd,0xb2,0x57,0x1a,0x4b,0x7d,0xbe,0xf4,0x17,0x45,0xc0,0x0a,0x6d,0xd4,0xca,0x05,0x16,0x81, + 0xd7,0x34,0x59,0x37,0x59,0x92,0xec,0xa8,0xdb,0x93,0x94,0xb8,0x8e,0xd9,0xb0,0x10,0x7d,0x58,0x8f,0xf6, + 0x8b,0x6d,0x12,0x95,0xcb,0x49,0xdd,0x3d,0x58,0x5b,0x43,0xc8,0x17,0xd4,0xea,0xcc,0x3c,0x30,0xdb,0xeb, + 0xa8,0x9b,0xc7,0x50,0xd8,0x7e,0xd7,0x0f,0x50,0xb6,0x5d,0x5e,0x5c,0x20,0xdb,0x22,0x67,0x26,0xd6,0x9f, + 0xcf,0x55,0x65,0x3e,0x0a,0x02,0x8e,0xa9,0x32,0x1b,0xbc,0x46,0x75,0x31,0xd3,0x42,0x4d,0x6a,0x25,0xa1, + 0x29,0xcc,0x37,0x07,0x51,0xd6,0xbb,0xc7,0xbc,0xc6,0x75,0x4d,0xa6,0x82,0x50,0x74,0x35,0x78,0x69,0x0e, + 0x2d,0x3d,0x6d,0x4e,0xa1,0x2e,0x75,0xb5,0x47,0xa8,0xd2,0xc7,0xe8,0x58,0xe5,0xe2,0x8f,0xef,0xf1,0xb6, + 0x55,0x4a,0x3a,0xe5,0xa4,0xbf,0xa0,0xd7,0x80,0x43,0x63,0xde,0xa9,0x2c,0xc1,0x7c,0xa3,0x49,0xe7,0xbe, + 0x23,0x3e,0xca,0x10,0x2a,0xb5,0xe7,0x14,0x6e,0x66,0xd3,0x9e,0x73,0x6f,0x7a,0x86,0x4d,0x89,0xb6,0x96, + 0xf7,0x3a,0x4d,0x35,0x0e,0xc8,0x39,0x68,0x85,0x3e,0xac,0x41,0xda,0x14,0xa5,0x02,0xe7,0x73,0xf0,0x7f, + 0xce,0x71,0x27,0xcf,0xb0,0xce,0xd8,0x1e,0xdc,0xea,0x84,0xed,0xdd,0xd4,0xd7,0x3f,0xd9,0x1e,0x56,0x67, + 0x6f,0x57,0xef,0xf1,0x13,0xef,0xef,0xd8,0x35,0x51,0x3a,0x52,0xee,0xd3,0x12,0x5f,0x4c,0xc1,0x5f,0xc5, + 0x24,0x84,0xf9,0xcd,0xdd,0x86,0x28,0xf8,0x1b,0xa1,0x69,0xdc,0xab,0xbd,0x41,0xb3,0xde,0x42,0xb8,0x65, + 0xbc,0x0f,0x40,0x2e,0x5a,0xac,0x85,0x9f,0x2a,0x60,0x1e,0xf8,0x78,0xe1,0x0c,0x1b,0xef,0x35,0x35,0xb3, + 0xd6,0x48,0xab,0x32,0x84,0xcc,0x0a,0x45,0xd1,0xe7,0x6a,0x51,0x9a,0xda,0x60,0x36,0xb4,0xe9,0xce,0x5a, + 0x81,0x2d,0xd6,0xac,0xf0,0xd7,0x2b,0xa2,0x6a,0xc8,0x55,0xa2,0xf5,0xd9,0x44,0x1b,0xd2,0x83,0x5b,0x8c, + 0xb2,0xf4,0x9a,0x49,0xc0,0x2e,0x54,0x43,0x6c,0x41,0xdf,0x97,0x2f,0x2f,0xd8,0x5e,0x7f,0x06,0x41,0xf5, + 0x1c,0xe0,0xf3,0x96,0xea,0xe1,0x1b,0x93,0x58,0xc9,0xe8,0x04,0xc7,0x7a,0x7b,0xfd,0x51,0x95,0x55,0x44, + 0x75,0x1f,0xde,0xe9,0x79,0x50,0x7a,0x4c,0x99,0x84,0x71,0x18,0xa7,0x83,0x28,0xcc,0xed,0x80,0x17,0x20, + 0x9b,0x8b,0x26,0x97,0xf3,0xfa,0xae,0xe8,0x2f,0xf4,0x14,0x9b,0x26,0x78,0x1f,0xd6,0x07,0xb2,0xbf,0xbb, + 0xf7,0x71,0xe7,0xdd,0xee,0x11,0x76,0x94,0x2f,0x09,0xa6,0xfd,0x02,0xce,0x38,0x32,0xb1,0x7e,0x56,0x14, + 0x45,0x7c,0x87,0xe0,0x66,0x02,0x5a,0xd5,0xb6,0x40,0xa7,0x13,0x33,0xc3,0xa6,0xcf,0x2c,0xd3,0xc1,0xd6, + 0xde,0xee,0xf1,0xf1,0xee,0x51,0xb3,0x5a,0x5a,0x93,0xc0,0x99,0x11,0x79,0x3c,0x59,0xab,0x7d,0xb0,0x7f, + 0xb0,0x66,0xd5,0xa5,0x52,0x85,0xef,0x22,0x67,0xd5,0xaa,0x8a,0x7c,0x6e,0x37,0xad,0x15,0xb2,0x5a,0x31, + 0xc1,0x4a,0x12,0xd6,0xf8,0x27,0x26,0xf7,0x9f,0x1a,0xad,0xd2,0x27,0xd8,0x4b,0xa5,0x94,0x6a,0x3c,0x87, + 0x56,0xa1,0x8d,0x96,0xba,0xcd,0xa6,0x6d,0xc1,0x60,0xec,0x5d,0x67,0xba,0x18,0x07,0x49,0x74,0x41,0xc2, + 0xc2,0x43,0xd4,0x80,0x1a,0xec,0x36,0x4d,0x3e,0x59,0x38,0xb8,0xe3,0x1c,0x90,0x9c,0x06,0xdd,0x8e,0x27, + 0x2c,0xf9,0x60,0xab,0xe8,0xde,0xe7,0xfe,0xe7,0x89,0x33,0x41,0xf7,0x56,0x3b,0x82,0x74,0x8d,0x1f,0xc8, + 0x9d,0x47,0x30,0x86,0x43,0x42,0xca,0x30,0xef,0x06,0x77,0x33,0x4a,0xe8,0x2f,0xa3,0xec,0x00,0x7e,0x89, + 0x2a,0xd8,0x22,0x0c,0x4f,0x7a,0xed,0xca,0xd4,0xd8,0xca,0x69,0xe3,0x20,0xc3,0x94,0x61,0xc2,0x45,0x71, + 0x0d,0x08,0x11,0xa6,0x67,0xc3,0xdc,0xcf,0x48,0x24,0x14,0x63,0x86,0x87,0x4a,0x7f,0xdc,0xdf,0x7b,0x5b, + 0x14,0x93,0xc3,0xf0,0x97,0x92,0xa6,0x61,0x63,0xa0,0x72,0xeb,0x1e,0x7c,0x3c,0x3a,0x96,0x98,0xf4,0xbe, + 0x72,0x80,0xe8,0x65,0xf4,0x1b,0x32,0x9e,0x3c,0x71,0x90,0x5d,0xa7,0xb6,0x07,0x2b,0xed,0x0c,0xd5,0x2c, + 0x27,0x10,0x41,0xe8,0x83,0x49,0x96,0x0e,0xe1,0xd3,0xd2,0x13,0x53,0x14,0x39,0xe1,0x71,0x0a,0x94,0x05, + 0xb4,0x5c,0x4b,0x4b,0x84,0x30,0x7c,0xf4,0xb3,0xc5,0xcd,0x0a,0x7c,0x11,0x8b,0x20,0x46,0x2c,0x72,0xfa, + 0x18,0x2f,0xb9,0xab,0x14,0xdc,0x0f,0xde,0xb0,0x32,0xf8,0x9b,0xbd,0xe7,0x12,0xc5,0x77,0x3e,0x9a,0x0f, + 0x41,0x02,0xae,0x5d,0x1f,0xe5,0xb6,0x20,0x2e,0xa8,0xa5,0xa7,0xdc,0x6c,0x52,0xf5,0x05,0x72,0x69,0xd1, + 0xe1,0xd8,0x44,0xd8,0x6f,0x6d,0x31,0xb4,0x21,0xa2,0xc5,0xed,0x9d,0x68,0xb8,0x7a,0x56,0x5e,0x02,0x58, + 0x63,0xe6,0x74,0xd0,0xe5,0x21,0x04,0x02,0x1b,0x13,0xe5,0xd6,0x9a,0x29,0x09,0xbb,0x5e,0xcd,0x51,0xb3, + 0x40,0xdf,0x68,0x34,0xdf,0x1e,0x1f,0x1f,0xb0,0xbb,0x81,0x22,0x3c,0xc6,0xe7,0x95,0x59,0x33,0xeb,0x5e, + 0x44,0x0c,0x62,0xfa,0xd9,0x4e,0x16,0x5c,0x14,0x72,0x94,0xde,0x9b,0x8e,0xfa,0x1c,0xb9,0x92,0xc3,0x92, + 0xa7,0x56,0xec,0x83,0xf4,0x87,0xb4,0x0e,0xea,0x97,0x98,0xfe,0xb2,0xab,0xdb,0x8c,0xe5,0x90,0x31,0xe2, + 0xd8,0xde,0x3d,0x3c,0xfc,0xe9,0x6c,0xeb,0xe0,0x5d,0xef,0xa4,0x79,0x1e,0x64,0x67,0x88,0x9b,0x57,0x38, + 0x30,0xb5,0xf4,0x24,0xf4,0xce,0xa6,0xd7,0x80,0x63,0x73,0xde,0x27,0x52,0x42,0xbf,0xbf,0xb4,0x37,0x5d, + 0x9a,0xc3,0x7e,0x94,0xf5,0xe3,0xd0,0xe9,0x7f,0xf1,0x1a,0xfd,0x1b,0xaf,0x91,0x79,0x0d,0xce,0x62,0x5a, + 0x15,0x9d,0xb1,0x81,0xeb,0xc2,0x72,0x56,0x48,0xf1,0x23,0x37,0x35,0xa0,0x23,0x01,0x7f,0x43,0x62,0xa3, + 0xfa,0x85,0xc3,0x6b,0x62,0x22,0x32,0x73,0x8d,0x70,0x92,0xf6,0x47,0x67,0xe3,0x9c,0xab,0x5d,0xa4,0x89, + 0x54,0xc2,0x83,0xb8,0xd7,0xf1,0xfb,0x51,0x8a,0x44,0x5f,0xf8,0x91,0x5f,0x39,0x23,0x6a,0xc1,0x6b,0x5c, + 0xb9,0x1c,0x63,0x33,0x4d,0x54,0xa3,0x04,0xcc,0x8d,0xcb,0xa9,0x9c,0x93,0xd0,0xf9,0xd2,0xa6,0x27,0xfa, + 0xff,0x97,0x0e,0xfd,0xed,0x58,0xf0,0xa1,0xf4,0xd7,0x4e,0x43,0x9c,0x0e,0x1d,0xf1,0xae,0x87,0x5e,0x87, + 0x45,0x2f,0x86,0x61,0x2c,0x52,0x15,0x67,0xaa,0xbe,0xd6,0x90,0xc3,0x5e,0x27,0x46,0xda,0xc8,0xf9,0x11, + 0xb2,0x27,0xa2,0x03,0xf8,0x2c,0x40,0xf4,0x8e,0x73,0x26,0x7d,0x0b,0x8a,0xf3,0x61,0xd5,0x7d,0x16,0x8c, + 0x27,0x67,0xcc,0x59,0xca,0xa7,0x44,0xec,0x50,0x91,0x69,0x3e,0x3d,0x4d,0x82,0x64,0x13,0x7f,0xc2,0x70, + 0x20,0xd5,0x31,0xbf,0x52,0xf3,0xda,0x6b,0x8c,0xac,0xae,0x50,0x22,0x2b,0xb6,0xb8,0x78,0x78,0xee,0x50, + 0xcb,0x43,0xea,0x1d,0x8f,0x12,0x92,0x5b,0x3a,0xa6,0x53,0x4b,0x55,0xa4,0xae,0x52,0x3a,0x10,0xb8,0xa7, + 0x9c,0x65,0x4e,0x1e,0xb5,0x05,0x9e,0x55,0x57,0x97,0x9c,0x45,0xc9,0xe5,0x19,0x7b,0x4c,0xa2,0x25,0xf3, + 0xb6,0xf6,0x46,0xb9,0xc6,0x70,0x6b,0xd7,0x61,0x78,0xa9,0x11,0x46,0x2a,0xe1,0xd7,0x0d,0x4b,0xc5,0x8c, + 0x5b,0x88,0x57,0x72,0x05,0x35,0x2d,0x8d,0x20,0x62,0xf4,0x92,0x6b,0x16,0xe2,0x3e,0xce,0x54,0x1b,0xfa, + 0x0d,0x3b,0xe7,0x3a,0x69,0xc2,0x48,0x43,0xb4,0xd3,0x17,0xee,0xcd,0x29,0xb3,0x98,0xc0,0x3c,0xb7,0x86, + 0xc3,0xa5,0x50,0xcd,0xde,0x53,0xc4,0x59,0x6d,0xa4,0x10,0xea,0x99,0x85,0x55,0x40,0x8c,0x1e,0xae,0x51, + 0x7e,0xa3,0x42,0x26,0xb4,0xdd,0x11,0x85,0xb4,0xd7,0x98,0x07,0x06,0xda,0x83,0x40,0x2d,0x12,0x74,0x07, + 0xe6,0xf7,0x2f,0x05,0x74,0x64,0xe7,0x84,0xcf,0x34,0xab,0xe9,0x24,0xea,0x03,0x4d,0x6e,0x40,0x3a,0x4c, + 0x71,0x5e,0x9e,0xe3,0x48,0x3f,0x0f,0x75,0x85,0xbe,0x7c,0x5a,0xe6,0x51,0xdf,0x3f,0x0f,0xa0,0x41,0x00, + 0x36,0x21,0xab,0xb3,0xf5,0x3e,0x0c,0x64,0xf7,0xc9,0x63,0x8c,0x08,0x3f,0xd6,0x33,0xa6,0x99,0x4f,0x4e, + 0xde,0x08,0x48,0xcd,0xed,0xc0,0xf7,0x95,0x1f,0xcb,0x31,0xd6,0x09,0xb6,0xef,0x0a,0x37,0xe1,0x73,0x47, + 0xb3,0x38,0xe1,0x40,0x48,0x89,0xc7,0x9a,0x67,0xbb,0x24,0x20,0xec,0x5c,0x54,0x98,0xd3,0xe2,0x2f,0xfc, + 0x8e,0xce,0x1f,0xbe,0x42,0x4e,0x58,0xf4,0xb2,0xdf,0x4c,0x82,0x32,0x0f,0x67,0x5e,0x29,0xd7,0xe9,0xfa, + 0x5b,0xda,0x7e,0xe5,0x78,0xa6,0x26,0xee,0x1c,0xd4,0x1b,0xc4,0xe7,0xc1,0x20,0x88,0x13,0x35,0x88,0x9f, + 0xe4,0x69,0xa6,0xa3,0x39,0x39,0xf3,0xaf,0xce,0xae,0xd2,0xb8,0xc8,0xed,0x02,0x1d,0xc1,0xc7,0x7e,0x17, + 0x1b,0xb2,0xa6,0x5e,0xc0,0x56,0x24,0x87,0x65,0xa7,0xf5,0xce,0x0a,0x41,0xa4,0x5e,0x2b,0xd1,0x00,0x2c, + 0xd5,0xcd,0x59,0x1f,0xc1,0xc9,0x89,0x22,0xd4,0x8a,0x80,0xc4,0x97,0xe1,0x4d,0xed,0x5d,0x2e,0xef,0x88, + 0x5e,0x6a,0x4a,0x96,0xb3,0x0e,0xde,0x47,0x3c,0x41,0x5d,0x59,0xde,0x0c,0x75,0x55,0xb3,0x6e,0xaa,0x80, + 0xdd,0x47,0xd8,0x6e,0xd4,0x7e,0xbb,0xa0,0x65,0xcc,0x99,0x70,0xc6,0x37,0x86,0x8a,0xab,0x97,0x93,0xb5, + 0x99,0x37,0x13,0x4d,0x2d,0xeb,0xaf,0x34,0x46,0xc9,0x1b,0x66,0x95,0x1d,0x69,0xb1,0x7a,0x9b,0x13,0x5d, + 0xc9,0xad,0x5a,0x88,0x4d,0x60,0x3d,0x16,0x59,0x80,0x74,0xdb,0x1c,0x20,0x85,0xdf,0x9a,0xcb,0x97,0x4b, + 0x7b,0x6c,0xfc,0x36,0x97,0xb7,0x7c,0x98,0x80,0x6b,0xca,0x7c,0x3a,0x59,0x89,0x70,0x8c,0xe9,0x84,0xc1, + 0x95,0x03,0xd8,0xc8,0xaa,0x4c,0xec,0x24,0x9d,0x68,0x50,0xbd,0xe2,0x0b,0x9a,0xb9,0xea,0xe3,0x74,0x70, + 0x5e,0x42,0x67,0x1b,0x0c,0xde,0xa6,0x31,0x8e,0xff,0xc3,0x70,0x88,0xd3,0x3d,0xcb,0x1d,0xf0,0x97,0x74, + 0xde,0x88,0x13,0x31,0x48,0x66,0x99,0x14,0xd5,0xd7,0xf6,0x86,0xaf,0x1a,0x79,0x07,0x1f,0xd6,0x7f,0x5d, + 0x13,0xaf,0xd2,0x28,0xfe,0x97,0x7d,0xb9,0x13,0xc1,0xd3,0xbe,0x08,0x19,0x88,0xdf,0xde,0x04,0x9d,0x6c, + 0x9d,0xa7,0xd6,0x41,0x6a,0xde,0xae,0xad,0x3a,0x23,0xda,0x0a,0xa0,0xe7,0xd7,0x56,0xc9,0x05,0x51,0xae, + 0x99,0xb2,0x53,0x4f,0x38,0x99,0xfd,0x8f,0x3b,0x47,0xc4,0xca,0x98,0x90,0x28,0x4c,0x3a,0x15,0x8d,0xd3, + 0x74,0x89,0xe9,0x86,0xb5,0xa5,0xcd,0x96,0xb2,0x76,0x85,0x41,0x62,0x8d,0x33,0x1a,0x1f,0xf4,0xb2,0x9a, + 0x1e,0x5f,0x7d,0x3c,0xdc,0xa5,0x1e,0x91,0x39,0x18,0x41,0x3f,0xc4,0x53,0x97,0x8e,0xa2,0x20,0x8e,0xe5, + 0x44,0xca,0x73,0xe0,0xb0,0xfe,0x9d,0x22,0x04,0x37,0x72,0xe7,0x32,0x17,0xda,0x94,0xe4,0x7a,0xf4,0x63, + 0x08,0xb0,0x86,0x71,0x7a,0x8e,0x30,0x66,0x3a,0xf4,0x0f,0xfd,0xe5,0x7f,0x73,0xad,0x59,0xe5,0x07,0x22, + 0xd5,0x3a,0x82,0xb8,0x88,0x3b,0x44,0xf8,0x91,0x08,0x43,0x5f,0xf6,0x7b,0x26,0x07,0x38,0xbc,0xef,0xb8, + 0x05,0x5a,0x24,0x34,0x8b,0xa8,0xc1,0x3c,0x90,0x4c,0xfe,0x8d,0x90,0xbb,0x51,0x67,0xd2,0xa2,0x1f,0xe5, + 0x84,0xbf,0x82,0xf6,0xcd,0xcc,0xb6,0x19,0xe8,0xfb,0x1f,0xab,0xe0,0xf0,0x4d,0x84,0xdb,0x68,0x86,0xb1, + 0xfa,0x93,0xa3,0x3a,0x5f,0x3e,0xca,0x90,0x70,0xca,0x72,0xac,0xf1,0x90,0x27,0x4e,0x43,0xcb,0x97,0x48, + 0x3c,0x7c,0xb9,0x63,0x62,0xc0,0xd8,0xad,0x58,0x05,0x3a,0xd7,0x89,0x6e,0x69,0x04,0x11,0xe0,0xbd,0x0a, + 0xb8,0xa9,0x14,0xc3,0x56,0x41,0x55,0x9a,0x88,0x94,0x42,0xb5,0xb1,0xb6,0x88,0x4d,0x38,0xe1,0xe1,0x05, + 0x51,0x2e,0x03,0xa3,0x05,0xed,0xf3,0x32,0xc6,0x17,0xcd,0x53,0x57,0x23,0xc5,0xee,0xbe,0x01,0xdd,0x30, + 0xbc,0x33,0x26,0x10,0x3a,0x81,0x9f,0x0f,0xf9,0xdd,0xd8,0x02,0x28,0x95,0x22,0xbd,0xac,0xae,0xad,0x9a, + 0x0e,0x27,0x22,0x74,0x75,0xeb,0xaf,0x3f,0x3c,0xd8,0xf8,0xa3,0x6f,0xb6,0x3e,0xd3,0x1e,0x50,0x78,0xf7, + 0x78,0xa6,0x4d,0xbc,0x74,0x2d,0x8c,0x9b,0xaf,0x81,0xb7,0xba,0xc6,0xf1,0xc7,0xf7,0xbd,0x15,0xe7,0xbb, + 0xd6,0xc9,0xe7,0xfc,0xf3,0xd1,0xe9,0xe3,0x4d,0x67,0xb3,0xdb,0xfa,0x6e,0xfa,0x3b,0xd7,0x9d,0x3a,0xdf, + 0x9d,0xfc,0xf9,0x73,0x72,0xfa,0x98,0x7e,0xfd,0x1d,0xbd,0xfd,0xfc,0xd9,0x9f,0x9e,0xfc,0xf9,0xef,0x3e, + 0x7f,0x3e,0x75,0x1f,0xff,0xdd,0xe6,0xb4,0x69,0x5e,0x35,0xf9,0x55,0x73,0x93,0xea,0xb5,0x4f,0xbe,0xfc, + 0xf1,0xf4,0xa4,0xdd,0x7a,0x1e,0xb4,0x2e,0xb6,0x5a,0xaf,0x4f,0x97,0xa7,0x9f,0x07,0xcb,0xa8,0xe8,0xd3, + 0x5f,0x17,0x6d,0x9f,0x84,0xbb,0xa7,0x27,0xcb,0xad,0xd3,0x4d,0x7e,0x41,0x9f,0xa8,0xdb,0xbc,0xb3,0xd3, + 0xcf,0xd7,0xe8,0xe9,0xc4,0x21,0x81,0xe9,0xe4,0xf3,0xe9,0x29,0x7e,0xb7,0x96,0x1f,0xaf,0xfc,0xfe,0xc5, + 0xcb,0xff,0x8f,0xbb,0x77,0xeb,0x6d,0x5c,0xcb,0xd2,0x04,0xff,0x8a,0xcc,0x93,0xa9,0x43,0x1e,0x6d,0xcb, + 0xba,0x59,0xb6,0xa9,0x60,0xa8,0xec,0x08,0xc7,0x89,0xa8,0x8c,0x5b,0x86,0x1d,0x99,0x95,0xa9,0xd0,0x09, + 0x50,0x12,0x6d,0x33,0x2d,0x93,0x4a,0x92,0x0a,0x47,0x1c,0x5b,0x8d,0x7e,0xaa,0x97,0x06,0xba,0x30,0x5d, + 0x98,0x2e,0x60,0x50,0x40,0xf7,0xc3,0x00,0x33,0x0f,0x03,0xf4,0x5b,0x4f,0x3f,0x14,0xe6,0x61,0xea,0x9f, + 0x9c,0x3f,0x30,0xfd,0x13,0x66,0xad,0xb5,0xaf,0xbc,0x48,0x72,0x9c,0x93,0x55,0x0d,0x74,0x26,0x4e,0x58, + 0x24,0x37,0xf7,0xde,0xdc,0x97,0xb5,0xd7,0xf5,0x5b,0xde,0x4e,0xfd,0xfe,0x87,0x7f,0x33,0x74,0x9b,0x6c, + 0x30,0x6e,0x38,0x7b,0x97,0x46,0x96,0x31,0x3c,0xed,0x4f,0x90,0x42,0xf3,0x44,0xe0,0x5a,0xb4,0xb3,0xec, + 0xd1,0x1d,0x26,0xe1,0xb4,0x9c,0xf1,0xca,0x32,0xf4,0xd9,0x61,0x2d,0xbe,0x18,0x65,0x2c,0xdb,0x6d,0x8f, + 0x0d,0x0f,0xc5,0x51,0x38,0xce,0xa1,0xa1,0x67,0xda,0xb6,0xc9,0xd1,0xdc,0x5b,0x18,0xf4,0x66,0x71,0x08, + 0x45,0x9d,0x89,0xdc,0x71,0x52,0xaf,0x8d,0x8a,0xda,0x51,0xa4,0x8c,0x8e,0x99,0x33,0x26,0x44,0x74,0x8a, + 0xaa,0xf1,0x73,0x85,0x55,0x9d,0xa9,0xb7,0x8b,0xaf,0x45,0x23,0xdf,0x7c,0x6d,0xc5,0xd5,0xa2,0x26,0x26, + 0x75,0x38,0x88,0x1e,0x7b,0xad,0x7a,0x3d,0x87,0xeb,0xee,0xa5,0x88,0x90,0x8a,0x90,0xee,0xd4,0x53,0x05, + 0xc1,0xae,0x6f,0x26,0xf5,0xfa,0x4e,0x6d,0x77,0x57,0x06,0x3e,0xd4,0xd2,0xc7,0xad,0xe1,0x28,0x64,0xd1, + 0xd8,0x1d,0x45,0x2c,0x1c,0xaf,0x4c,0x14,0x57,0x23,0x63,0x1b,0x82,0xa0,0x9f,0x02,0x7f,0x11,0x17,0xb3, + 0x70,0xe5,0xbd,0x3f,0x96,0x14,0x5a,0x57,0x11,0xe0,0x73,0x35,0x5f,0x03,0x79,0x27,0x13,0x76,0x21,0xbf, + 0x05,0x84,0xd2,0x37,0xf2,0x2b,0xc2,0x6f,0xe0,0xf3,0xe6,0x73,0x42,0x54,0x90,0x79,0xc0,0x19,0xe6,0x22, + 0x17,0x59,0xc5,0x29,0x7f,0x38,0x08,0xe6,0x98,0xf2,0xee,0xc7,0xc0,0xbc,0x99,0xcf,0x3e,0xce,0x6f,0x25, + 0x28,0x9e,0x88,0x3b,0xb9,0x20,0x2a,0xeb,0x04,0x44,0xec,0x2f,0x35,0xa0,0xcf,0xc9,0x34,0x10,0x8e,0x9e, + 0xa5,0xa8,0x32,0x4c,0xe8,0x4d,0xb6,0x5b,0x56,0x91,0xa7,0x2e,0xa0,0xe0,0x6d,0xa6,0xcc,0xaf,0xa1,0xf1, + 0x28,0x49,0x8c,0xcc,0xe9,0x86,0x2f,0xcb,0x32,0xa1,0x0c,0xe1,0x7c,0x5e,0x05,0xfc,0x3f,0x4f,0x1f,0xc7, + 0xff,0x2c,0x94,0x81,0x70,0x49,0x0a,0x0e,0x82,0x6c,0x42,0x3d,0x49,0x30,0x23,0x18,0x59,0x9b,0x20,0xde, + 0x09,0x67,0xea,0xee,0xca,0x25,0x3d,0xc3,0x33,0x3c,0xd0,0xec,0xa5,0xed,0x10,0x4c,0x01,0xcf,0xad,0x85, + 0x0e,0x48,0x8b,0xe2,0xe3,0x05,0x1c,0xaa,0x40,0xab,0xcf,0xe3,0x85,0xc3,0xe6,0xc1,0x45,0xb6,0xe6,0xf9, + 0x4b,0x78,0xe4,0xac,0x24,0xcc,0x55,0xcb,0x48,0xc9,0x80,0xc9,0x86,0x54,0xff,0x10,0x86,0x8f,0xc7,0x6f, + 0x87,0x1e,0x46,0x8e,0x4e,0x3d,0xf2,0x69,0x65,0x4b,0xaf,0x1a,0xf3,0x82,0xf2,0xff,0xe4,0xb6,0xa7,0x8f, + 0xce,0xfa,0x04,0x09,0x81,0x29,0x91,0x30,0x03,0x93,0x0c,0x6a,0xe2,0x2d,0xb3,0x4b,0xd8,0x61,0xec,0x02, + 0xb7,0x99,0xa2,0x4c,0x4d,0xf4,0xc9,0x79,0x81,0x5b,0xc4,0xd8,0x16,0xc1,0x20,0xf0,0x74,0x09,0x72,0x20, + 0xf0,0x9d,0x01,0x3a,0x17,0xd1,0x66,0x7a,0x7c,0x83,0xee,0xc9,0x1c,0x89,0x5d,0x98,0x29,0x6e,0x98,0x78, + 0x86,0xee,0x8e,0x5e,0x45,0xed,0x03,0x4d,0x09,0x5a,0xdc,0x74,0x1b,0x61,0x3f,0x02,0xa0,0xe4,0xf7,0xf7, + 0xc1,0xa8,0x33,0x1e,0xc2,0xf5,0xd4,0x72,0x83,0x51,0x97,0x7e,0xa6,0xf8,0xb3,0x47,0x3f,0x23,0xfc,0xb9, + 0x3f,0x1e,0xca,0x83,0x4f,0xe4,0x98,0xc0,0x47,0xd7,0x96,0x6b,0x92,0x69,0x95,0x7d,0x02,0x48,0x3b,0x0c, + 0xcf,0x65,0xbd,0x5e,0x7a,0x7a,0xe1,0xa8,0x9b,0xa7,0xaf,0x54,0x79,0x79,0x76,0x18,0x55,0xfb,0xb2,0x6a, + 0x41,0xe0,0xc5,0x23,0xb4,0x7e,0x78,0xd6,0x04,0x03,0xa6,0xbc,0x9d,0x25,0x5a,0x54,0xe8,0xb3,0x77,0x3c, + 0x6f,0x09,0x1f,0x86,0xda,0x1d,0x7d,0xdd,0x1e,0x0f,0xad,0x18,0x36,0x46,0x5c,0xbb,0xb1,0x98,0x18,0xb0, + 0xa8,0xec,0x61,0x1e,0xc1,0x8e,0x70,0x5c,0x58,0x62,0x36,0x7e,0x26,0x8e,0x46,0x9f,0xfe,0x3d,0x18,0x63, + 0x6b,0x17,0xde,0x25,0xe2,0x10,0x39,0xab,0x9b,0x47,0xbe,0x42,0xde,0x2a,0x8e,0x3e,0xda,0xa0,0x85,0xa6, + 0xf6,0x43,0x64,0xf1,0x90,0xa6,0x72,0x4a,0x79,0xa9,0x66,0xba,0xf5,0x7c,0x79,0xda,0x61,0x69,0x51,0x2b, + 0xfb,0xe4,0xf9,0xca,0xed,0xa2,0xb4,0x90,0x2a,0x5e,0x18,0xdc,0xc2,0x57,0xce,0x31,0x81,0xbd,0x77,0xcb, + 0x82,0xaa,0x16,0xb9,0xa9,0xe1,0x22,0x89,0x6f,0xec,0x3b,0xfe,0x8e,0x7b,0x8b,0x69,0x7a,0x15,0xac,0x87, + 0xcc,0xf5,0x28,0xf1,0x2f,0x31,0x5c,0xc1,0x71,0x8a,0x9e,0x0d,0x81,0x0a,0x0f,0x93,0x2d,0x93,0x9f,0x83, + 0xbe,0x3d,0xca,0xc6,0x3c,0x26,0x8b,0xcc,0x90,0x50,0x0b,0xc6,0xa4,0x0d,0x89,0x68,0xb8,0xfc,0xea,0xd3, + 0x10,0x73,0xca,0xa1,0x33,0x4f,0x2a,0x3c,0x3e,0xa7,0x69,0x4a,0xd0,0x25,0x94,0x68,0xc3,0xbb,0x45,0x10, + 0x17,0x20,0x88,0x0d,0x3b,0x6c,0xc2,0x8f,0x86,0x1d,0xef,0xb6,0x9d,0xef,0xc2,0xe6,0x95,0x83,0x59,0xf5, + 0x06,0x02,0xff,0xcd,0x6a,0xc0,0x1d,0x4a,0xb3,0x57,0x88,0x88,0xc5,0x34,0xf6,0xb9,0x5a,0x3f,0xf1,0x1e, + 0xe4,0x0a,0xb9,0x85,0x26,0x3e,0x6d,0x6e,0x82,0x4d,0x50,0xc9,0x5d,0xaf,0xcf,0x6c,0x03,0x8f,0xe6,0x02, + 0x49,0xc6,0xfd,0xbd,0xbd,0xf0,0x84,0x02,0xe2,0x38,0x0a,0x6f,0x88,0x6f,0x7e,0x86,0x3e,0x67,0xf6,0xa5, + 0x63,0x14,0x86,0x0a,0xee,0x32,0x91,0xb3,0x0d,0x88,0x94,0x17,0x18,0xbf,0x23,0xfd,0x9b,0xc9,0x32,0x48, + 0xa8,0xd4,0x03,0xbc,0xd0,0x55,0x81,0x90,0x7d,0x87,0x04,0xf6,0xc2,0xa6,0x7c,0x22,0x53,0x5b,0xc3,0xc2, + 0xaf,0xc7,0xca,0xbc,0x45,0xb3,0x59,0xf9,0x29,0xaf,0x1f,0xbe,0xcf,0x61,0x23,0xe9,0x75,0x89,0x39,0x3d, + 0x31,0xee,0x4d,0x42,0xda,0xe4,0x7c,0xca,0x2b,0x2a,0x09,0xd8,0x85,0x53,0x5d,0xfb,0x64,0x0e,0x47,0x02, + 0x06,0x55,0xdc,0x21,0x6e,0x9b,0x1b,0xb2,0xcc,0x77,0x23,0x06,0x07,0x8f,0xeb,0x63,0x46,0x4f,0x2e,0xfd, + 0xda,0x06,0xb4,0x08,0x4f,0x69,0x8b,0x6e,0x3a,0xe2,0x59,0xe0,0xdc,0x45,0x2a,0x51,0x32,0x9e,0x28,0xe2, + 0xc3,0x57,0xec,0x02,0x08,0x31,0x08,0xb2,0xf0,0x58,0xfc,0x5a,0xb1,0x38,0xc2,0xf3,0x9c,0xec,0xd7,0x5e, + 0x80,0x97,0xaf,0xd0,0xeb,0x07,0x2e,0x11,0xb4,0x92,0xdd,0xf8,0xc9,0x35,0x57,0x40,0x73,0xa3,0x57,0xec, + 0x05,0xf7,0xf7,0x2d,0x9d,0x46,0x30,0x20,0x4a,0x8f,0x01,0x1c,0x7a,0xd1,0x05,0xcd,0xab,0x81,0x9d,0x3d, + 0x32,0x26,0xe8,0xfe,0x3e,0x7b,0x6c,0x5c,0x36,0x22,0x11,0xd9,0xc9,0x8f,0xa6,0x5d,0x78,0x81,0xc8,0x92, + 0x31,0xbb,0xca,0x7d,0xa5,0x05,0x7c,0x58,0xbe,0xf8,0x5e,0x07,0x97,0x08,0x76,0x7d,0x0a,0x8c,0x42,0x66, + 0x9b,0xbe,0x67,0x3c,0x37,0xe9,0x5a,0x1a,0x40,0x1d,0x55,0x14,0x1d,0x58,0x2a,0xa2,0x06,0x32,0xeb,0x26, + 0x1e,0x96,0x6e,0x50,0x45,0x58,0xa6,0x31,0x21,0x22,0xf1,0xd4,0x15,0xd9,0x4a,0xb4,0xfc,0x37,0x7f,0xb0, + 0x8b,0xc3,0x80,0xae,0xa4,0x4d,0xd1,0x2d,0xa9,0x97,0xbf,0xb9,0xbf,0x57,0xe9,0xd0,0x74,0xf9,0xa5,0x2d, + 0xf9,0x23,0x41,0x4a,0x45,0x9c,0xfa,0x22,0x4e,0x43,0x4a,0xa7,0xe6,0x4f,0xd2,0x78,0x0e,0xa7,0xfc,0x80, + 0xfc,0x2f,0x43,0xe8,0xd3,0x17,0x57,0x04,0x36,0x83,0x68,0x94,0x05,0xbb,0xf0,0xde,0x34,0x70,0x17,0x49, + 0x30,0x40,0x25,0xf6,0xee,0x85,0x7f,0x13,0xce,0xbf,0x10,0x48,0x30,0x5e,0x3f,0xa3,0xcb,0x86,0xc5,0x1f, + 0xa6,0xc4,0x17,0x89,0x47,0x67,0x70,0x41,0x49,0x52,0x91,0xe2,0xa1,0xca,0xad,0x87,0x48,0xad,0x0a,0x32, + 0x13,0x51,0xc8,0x78,0xe2,0xbb,0x13,0x94,0x54,0x81,0xac,0x3d,0xa1,0xd1,0x27,0xd8,0x79,0x87,0x03,0xd2, + 0xed,0xf5,0x5a,0x2a,0xea,0x14,0x66,0x02,0xbe,0xe5,0xee,0x33,0x8d,0xd0,0x45,0x86,0xd9,0xa6,0x61,0xbc, + 0x70,0x21,0xdc,0xec,0x9a,0x7b,0x91,0x7d,0x71,0xf9,0x2a,0xc9,0x88,0x2d,0xc1,0x65,0xb2,0x6b,0x4c,0x39, + 0x8c,0x2a,0x88,0xa5,0x20,0xf4,0xe6,0x92,0xc7,0x21,0x87,0xac,0xb8,0x07,0x3c,0xc7,0x81,0xf7,0xb9,0xf1, + 0xa3,0xd9,0xfd,0x7d,0xe5,0x6d,0xdc,0xb9,0x58,0xc7,0x39,0x61,0x11,0xee,0xb4,0x99,0xf6,0x57,0x20,0xc2, + 0x90,0x5b,0x0e,0x84,0x1b,0xac,0x6e,0x9d,0x46,0xb3,0x81,0xdc,0x35,0xc5,0x85,0x94,0x39,0x8d,0xa0,0x91, + 0xbf,0xe9,0x3b,0xa5,0xe5,0x55,0xa8,0x0d,0xc8,0xb8,0x5c,0x33,0xab,0x5b,0x5c,0xae,0x30,0xda,0x84,0xa4, + 0xe7,0xdc,0xcd,0xc5,0x7e,0x34,0x82,0x8f,0xae,0x96,0x13,0x1e,0xce,0xf4,0x86,0x2c,0xd1,0xa6,0x03,0xd9, + 0xde,0x0f,0xdf,0xd4,0xfe,0x0a,0x9e,0xd7,0x6c,0xed,0xd6,0x38,0xbe,0x6b,0x77,0x56,0x0e,0xdc,0x01,0x29, + 0x8a,0x2e,0xfb,0xbd,0x95,0xc3,0x9d,0x31,0x8b,0xde,0xa0,0xd9,0x10,0x71,0x96,0x33,0x38,0xcc,0x59,0x7a, + 0xe5,0x77,0xf6,0xfb,0xf0,0xbb,0x33,0x66,0xe8,0x79,0xa1,0x9c,0x34,0x32,0x38,0xfa,0xa5,0x9b,0x0d,0x47, + 0x74,0xae,0xe8,0xd9,0x73,0x01,0xe5,0x2c,0x01,0x04,0xa6,0x98,0xb6,0x12,0x2b,0xb4,0xed,0x82,0x8f,0x9b, + 0x23,0x9d,0xb3,0x02,0x93,0x9a,0xab,0x8a,0x5e,0x86,0xd1,0xb5,0x06,0x51,0x30,0xbd,0x35,0xe9,0xb3,0xb4, + 0xa7,0x66,0x95,0x4d,0x3f,0x5d,0x62,0x82,0xd6,0xcb,0x04,0x31,0xd0,0x15,0x0c,0x80,0x25,0x46,0x08,0xa1, + 0xbb,0x30,0xfe,0x2a,0xdf,0xe7,0x08,0x0e,0x28,0xd8,0xce,0x8d,0x12,0x92,0x94,0x2a,0xf6,0x0e,0xe6,0x0d, + 0x15,0x9c,0xd0,0x29,0xcf,0x4a,0xf8,0x85,0xb5,0xb5,0x7b,0xb0,0x08,0x47,0xaa,0x34,0x29,0x76,0x50,0x70, + 0x18,0x6b,0x81,0x2e,0x7a,0xc8,0x17,0x28,0xb8,0x9d,0xe3,0x29,0xea,0x1f,0x5c,0x55,0x23,0xf1,0xc7,0x39, + 0xaf,0x25,0xd2,0xcf,0xb8,0x39,0x17,0x50,0x72,0xac,0x15,0x2d,0x53,0xd2,0x4c,0x4d,0x91,0x96,0x93,0xf3, + 0xf8,0x1a,0xf8,0x18,0xe9,0x8b,0xcb,0xbb,0x02,0xb7,0x9f,0x0a,0x57,0x50,0xde,0x23,0x0b,0xee,0x1c,0x2f, + 0xb3,0xab,0x77,0xc2,0x65,0xdd,0x42,0x5a,0x70,0x4c,0xe0,0x62,0xe1,0x8f,0xd4,0xae,0x07,0x92,0x11,0xd0, + 0xb4,0x04,0x87,0x77,0xc5,0x61,0xb6,0xd0,0xb4,0x19,0x7a,0xa6,0x5b,0x12,0xa9,0xc6,0x52,0x77,0x6f,0x8f, + 0xdb,0xc4,0x9b,0xb3,0x40,0x79,0x8b,0x70,0xdb,0xfe,0x1e,0x4d,0x0e,0xfc,0x1b,0x01,0xdf,0x08,0xed,0xc0, + 0xd6,0x0d,0x41,0x94,0x03,0xee,0xf2,0x26,0x84,0xcd,0x0a,0x77,0x42,0x2e,0x99,0x91,0xa1,0x13,0xf8,0x4d, + 0xc4,0x6f,0xc4,0x50,0x96,0x5d,0xa1,0x29,0xe3,0x19,0x68,0x53,0xcc,0xb8,0x16,0x5e,0x46,0xfe,0xdc,0x3d, + 0x9e,0xc4,0x09,0x50,0x33,0xfc,0x2d,0xed,0xd1,0x76,0x7b,0x1f,0xfd,0x50,0xcd,0x68,0x8a,0xaa,0x09,0x78, + 0x73,0x71,0xc1,0xe1,0xdc,0xc8,0x03,0xa2,0xd7,0x42,0x0e,0x2b,0x14,0x06,0xd5,0xfb,0xfb,0x5e,0xab,0x6b, + 0x5c,0x6f,0x1f,0x37,0xf4,0x82,0xa5,0x71,0xe3,0xd9,0x1c,0xe3,0x6b,0x27,0xe7,0xf6,0x2a,0xdb,0xed,0xb5, + 0x7a,0x46,0xb5,0x43,0xe8,0xc6,0xab,0x30,0x4d,0x51,0x57,0xe6,0xe6,0xba,0x34,0x10,0xae,0x24,0xa2,0xa0, + 0x7a,0x83,0x05,0xab,0xe2,0x64,0x2b,0x2c,0x0f,0xee,0x10,0xa6,0x3c,0x49,0x85,0x9b,0x15,0xf9,0x2f,0xf0, + 0xf9,0x4f,0x9b,0xe1,0x0c,0xdd,0x55,0x60,0xcd,0x72,0x24,0xef,0x66,0x98,0x9e,0xf9,0x17,0x01,0x2d,0xc5, + 0x00,0xd3,0xb8,0xa1,0xc9,0x82,0xe0,0x2a,0xef,0xef,0xf5,0xc5,0xa3,0x36,0xbc,0x00,0x5b,0xc0,0x20,0x33, + 0x72,0xfd,0x03,0x1f,0x4a,0xbb,0x1f,0xa5,0x15,0xa1,0xf3,0x53,0x69,0x90,0xd2,0x66,0x14,0x23,0xd8,0xe3, + 0x43,0xf7,0x6f,0x2d,0x2d,0x6e,0xcd,0x05,0x52,0xcb,0x24,0x78,0x2e,0x77,0x28,0x4f,0xe1,0xc9,0x7d,0x1e, + 0xbc,0xe2,0xbe,0xd5,0x39,0xdf,0xca,0x64,0x94,0x4f,0xca,0xfd,0x7d,0xc8,0x07,0x20,0xc2,0xec,0xcb,0x95, + 0xdd,0x7a,0x72,0x85,0x80,0xc2,0x33,0xbd,0x25,0xe5,0x30,0xfa,0x36,0xbe,0xab,0xf6,0x37,0xd5,0x98,0x27, + 0x30,0xa9,0x43,0x35,0x8b,0xf1,0x78,0xe8,0x47,0xdf,0xf1,0x0a,0xdd,0x3c,0x5d,0xa4,0xb6,0x10,0xeb,0x33, + 0x9e,0x85,0x17,0x61,0x30,0x73,0xf3,0x4d,0x85,0x4d,0x24,0xac,0xd8,0x5e,0x28,0xda,0x5b,0x55,0xe1,0x33, + 0xf1,0x37,0x72,0x59,0x4b,0x2e,0x81,0x73,0x30,0x15,0x58,0x67,0xc2,0x35,0x07,0x26,0xce,0xa1,0x48,0x75, + 0x54,0xbd,0x1f,0xa3,0xf3,0xd1,0x13,0x7f,0x91,0x56,0xfa,0x7d,0x4d,0xfd,0x85,0x4f,0xac,0x88,0xe1,0x98, + 0x84,0x51,0xb0,0x98,0x2b,0xe8,0x93,0x19,0xc4,0x63,0x06,0xd6,0x3f,0x2c,0xb8,0x28,0x1f,0xc7,0x83,0x4a, + 0x34,0xf8,0x44,0xe8,0xb2,0x58,0xe2,0x78,0x67,0x07,0x04,0xd8,0x33,0xd9,0x65,0x3b,0x1f,0xbd,0xff,0xe0, + 0x46,0x2e,0x13,0x19,0xa0,0x0d,0x87,0x82,0x0b,0x14,0x6d,0x19,0xf9,0x12,0x35,0xf6,0x75,0x8c,0x06,0x77, + 0x83,0x24,0xe7,0xf5,0x5d,0x42,0xe3,0x93,0xcf,0x1f,0x90,0x11,0xa7,0x41,0x82,0xe3,0x55,0x3c,0xc7,0x40, + 0x30,0xfc,0x12,0x9f,0x90,0x59,0x81,0x7f,0x15,0x42,0xa3,0xd5,0xed,0x54,0x2a,0xb1,0x84,0x99,0xd1,0xb5, + 0x2a,0x02,0x16,0x50,0x5d,0x94,0x56,0xb4,0xc8,0x1d,0x4e,0x7c,0x71,0x58,0x34,0xfd,0xcf,0x5a,0xaf,0x44, + 0xac,0x64,0x2e,0xf5,0x80,0xc4,0xd1,0xcb,0x47,0xf7,0xa2,0x1e,0x7d,0xe5,0x54,0x21,0xd3,0x00,0x59,0x4e, + 0xd6,0x81,0x26,0x49,0x2c,0x3d,0x43,0x7b,0x45,0x1e,0x21,0x6b,0xf0,0xb9,0x82,0x19,0x22,0x78,0x13,0x3a, + 0x57,0x81,0x3d,0x20,0xed,0xc9,0x15,0x57,0x6f,0xdd,0x60,0xa6,0xe2,0x4b,0xa5,0x43,0xba,0x50,0xe9,0x21, + 0x27,0x15,0x69,0xe8,0x69,0xe2,0x76,0x61,0x43,0xec,0xf2,0xf4,0xef,0x12,0x27,0x68,0xa7,0x25,0xb4,0x53, + 0xb7,0x0a,0x54,0xcc,0x40,0x1c,0x97,0x9c,0x06,0x46,0xc9,0x2a,0x69,0x86,0x60,0xc0,0x11,0xe1,0x93,0xff, + 0x71,0x5b,0xa8,0x80,0x28,0xc4,0x8a,0x1a,0xa1,0x94,0x73,0x43,0x3c,0xe7,0x66,0x08,0x9d,0xc3,0x3a,0xb7, + 0x10,0xe7,0x25,0x35,0x82,0x3c,0x7e,0xd5,0x99,0xb0,0x63,0xee,0x3e,0x8c,0x01,0x1d,0x28,0x74,0xbe,0x52, + 0xe8,0xdb,0xd0,0xfa,0xe9,0x1f,0xfe,0x5d,0x4d,0x42,0x90,0x8a,0x84,0xd0,0xae,0xf5,0xd3,0x3f,0xfe,0xbd, + 0xba,0x19,0x5f,0x4b,0x50,0x3b,0xdb,0xec,0x25,0xbc,0x8a,0xfd,0xa4,0xc9,0xae,0x51,0x8e,0x25,0xe9,0xee, + 0x1c,0x7a,0x23,0x44,0x1f,0x8e,0xaf,0x87,0x22,0xe2,0x3a,0xc2,0x0b,0x11,0xb9,0xce,0x9f,0x34,0x2c,0xdb, + 0xb1,0x24,0x10,0x00,0x0d,0x53,0x09,0x03,0x55,0x8c,0x1b,0xa1,0x44,0x14,0x83,0xd9,0x73,0xf1,0xe5,0x83, + 0xf2,0x67,0x59,0x3f,0xfd,0x9f,0xff,0x85,0x47,0xc9,0x6f,0xac,0x1b,0xd1,0x58,0xf1,0xdb,0x8a,0x83,0xcf, + 0x21,0x5d,0xa7,0x95,0x81,0x82,0x52,0x21,0x13,0x95,0x12,0xb9,0xd8,0xe1,0x30,0xe4,0x50,0xad,0x04,0xda, + 0x6a,0x60,0x6c,0x6a,0x16,0xf5,0x8b,0x21,0xa1,0xf9,0x5a,0x90,0x2b,0xb5,0xb4,0xa6,0xc7,0x40,0x51,0xf0, + 0x27,0x88,0x3f,0x46,0x9d,0xd7,0x46,0x9d,0x66,0xb0,0x95,0x2f,0x32,0x69,0xe0,0xf2,0x38,0xd9,0x1e,0xa6, + 0xbc,0x13,0x54,0xa6,0x3e,0x8e,0xbc,0xc0,0xb4,0x0e,0xdd,0xaa,0x6c,0xc9,0x27,0x46,0xc4,0x68,0x94,0xf7, + 0xcb,0xc7,0x2c,0x71,0xa2,0xfe,0x5c,0xcc,0x7d,0x83,0xd0,0x6e,0xe5,0x33,0x82,0xb7,0x35,0x9e,0xe3,0x12, + 0x81,0x5a,0x39,0xce,0x7e,0xc8,0x4e,0x36,0xe0,0xec,0x87,0x0e,0x3c,0xae,0x50,0xa7,0x8d,0xc8,0x7d,0x8a, + 0x43,0xe6,0x5b,0x3a,0x1a,0xbe,0x0a,0xb3,0x22,0xca,0x34,0x08,0x88,0x2c,0x27,0xb0,0x29,0x4a,0xcb,0xcd, + 0x18,0xec,0x63,0x53,0xc4,0x96,0x52,0x88,0x1c,0x69,0x39,0x0a,0x30,0xcb,0x15,0xa0,0xca,0x28,0x39,0x9c, + 0x20,0x02,0x92,0x1e,0xb8,0x1b,0xf6,0xcc,0x18,0xc5,0x2b,0xcc,0xc4,0x48,0x35,0xc1,0xd1,0x74,0xd5,0x4c, + 0x93,0x29,0xe6,0xda,0xb8,0x42,0xc7,0x3c,0xa5,0x1c,0xae,0x2c,0x14,0x1a,0x37,0xf0,0x68,0x18,0x2c,0x2a, + 0xd2,0x19,0xc0,0x79,0x6f,0xb1,0xac,0x5e,0xdf,0xd9,0x91,0xdd,0x65,0x18,0x87,0x15,0x63,0x04,0xd6,0xe7, + 0x52,0xfc,0x3d,0x95,0x18,0x5a,0x42,0x2d,0x67,0x69,0x37,0x3f,0xee,0xc1,0x2a,0x5a,0x64,0xd0,0xbc,0x2b, + 0x0a,0x33,0xa2,0xd5,0x6e,0xc6,0xe2,0xe8,0x29,0x77,0x3c,0xbd,0x32,0xc4,0xcf,0x53,0x19,0x91,0x86,0x50, + 0xc8,0x3a,0x0a,0x62,0x38,0xc4,0x50,0x36,0x9d,0x88,0x2f,0xf9,0x10,0x0d,0x31,0xbe,0x0d,0x95,0x23,0x0e, + 0x6a,0x0a,0x42,0xa5,0x67,0x12,0xcd,0x78,0x19,0xbb,0xf2,0x34,0x6d,0x14,0x19,0x06,0x79,0x44,0x00,0x75, + 0x27,0xa3,0x1c,0x6c,0xd1,0x8a,0x7d,0xc2,0x6c,0x72,0xb4,0x33,0x8d,0xe2,0xfc,0xa7,0x1b,0x20,0x98,0xb5, + 0xc3,0x84,0xbb,0xa2,0xd4,0x11,0xd8,0x77,0xa8,0x7f,0x6c,0xb1,0x49,0x70,0xe5,0x7f,0x0a,0xe3,0x04,0x4e, + 0x04,0x4a,0x6b,0x89,0xae,0xf6,0x79,0xb8,0x3a,0x33,0xf6,0x0a,0x6d,0x9a,0x21,0x8c,0x62,0x21,0x24,0x9b, + 0x93,0xe5,0x4c,0xee,0x17,0x99,0x33,0xca,0xb0,0xac,0x75,0x78,0x5a,0x69,0xa3,0x58,0x23,0xd2,0x05,0x1b, + 0x51,0x0e,0xfe,0xcd,0xb9,0x5b,0xf2,0x94,0x3a,0xa6,0xf6,0x22,0x0a,0x4c,0xfc,0xcb,0x0c,0xd1,0x3d,0x86, + 0xd6,0xeb,0xe0,0x56,0xa0,0x69,0xb8,0xf8,0xfb,0x18,0xc1,0xa0,0x06,0xa7,0x36,0x8c,0xcb,0xb0,0x10,0xd4, + 0x0a,0x03,0xec,0x16,0x42,0x99,0xd1,0x6b,0x18,0x06,0xe6,0x09,0xe5,0x71,0x54,0x4a,0x3c,0x92,0xb3,0x79, + 0x23,0x9f,0x2b,0xcf,0xf4,0x9b,0x05,0x1e,0xd3,0x6c,0x1d,0xa2,0x2e,0xac,0x09,0x52,0x63,0xba,0x36,0x61, + 0x56,0x60,0xc0,0x39,0x67,0xc8,0x6e,0x61,0xe8,0xc9,0x79,0xf6,0xc9,0x3a,0xa0,0x68,0x03,0x53,0x46,0x22, + 0xa0,0x94,0x32,0x23,0xc9,0x07,0x22,0xcd,0x96,0xba,0x76,0x06,0x4f,0x36,0x87,0xb1,0xab,0x70,0x44,0x8c, + 0x47,0xac,0x28,0x79,0xc5,0x93,0x37,0x15,0x31,0x00,0x05,0x68,0x44,0x90,0xa2,0xa5,0x86,0x64,0x1f,0xbe, + 0x34,0x61,0x9f,0xc0,0xb9,0xbf,0x73,0xe3,0x94,0xf3,0x6a,0x06,0x52,0x82,0x82,0xe2,0x37,0x92,0xc2,0x9e, + 0xda,0x3a,0xe4,0xd3,0x36,0x22,0x75,0x23,0x26,0x38,0x3c,0x14,0x95,0x74,0x09,0xbe,0xb0,0xcc,0xb4,0x95, + 0xfe,0x67,0xca,0x5a,0x49,0x05,0xad,0x17,0xf4,0xd5,0xe8,0x02,0x12,0x49,0x34,0x00,0xe9,0xad,0xaf,0xce, + 0xf2,0x50,0x96,0x71,0x1e,0x90,0xa0,0x88,0x07,0xf5,0xae,0x83,0x49,0xae,0xe5,0x27,0x87,0xe3,0x25,0x97, + 0xa6,0x86,0xdf,0x96,0x13,0x23,0x40,0x95,0x07,0x15,0x18,0x18,0xc6,0xb8,0xec,0xb4,0x15,0x38,0x87,0xd8, + 0xfe,0x66,0xcc,0xef,0x96,0xe0,0x5b,0xb9,0x7f,0x34,0x86,0xda,0x34,0x81,0xe3,0x5c,0x70,0xcc,0xf0,0x69, + 0xf0,0xdf,0x80,0xdb,0xc5,0xcd,0xaa,0xab,0x5e,0xe3,0xab,0x5a,0xbd,0x24,0x27,0x14,0x48,0x72,0xbd,0x7e, + 0xa5,0xa0,0xbe,0x80,0x87,0x56,0xd7,0x28,0x00,0x0f,0xaf,0x34,0x50,0xd5,0xe0,0x45,0x09,0xf2,0x81,0xab, + 0x37,0x4c,0xf3,0x0d,0xd9,0x6a,0x1e,0x06,0x0d,0xce,0x17,0xc3,0x3a,0xb4,0x62,0x76,0xc7,0x7d,0x2d,0x5d, + 0x0e,0x26,0x21,0xd5,0x19,0x77,0x16,0xa5,0xe0,0x89,0xb2,0xdd,0x73,0x74,0x94,0xc9,0xab,0x77,0x18,0xba, + 0x6f,0x4a,0x12,0xbe,0x82,0xa9,0x21,0xa7,0x97,0x5c,0x1c,0x8a,0x95,0x06,0x09,0xd2,0xf3,0x93,0x65,0xfa, + 0x85,0x23,0x73,0x60,0xdb,0xa8,0x72,0xf7,0xba,0x32,0x2a,0x65,0xc0,0x7b,0x6c,0xc6,0x06,0x00,0x25,0x34, + 0x02,0x7b,0x03,0x76,0x84,0xf9,0xba,0x56,0x32,0x43,0x89,0x09,0xa2,0x2c,0x83,0xb0,0x52,0xe7,0xe7,0xe3, + 0x99,0xa5,0xdb,0x16,0xb4,0x98,0xdf,0x2b,0xcf,0x3c,0x2b,0xe4,0xd1,0x85,0x27,0x46,0x82,0x27,0x46,0x82, + 0xc1,0x07,0x11,0x1e,0x37,0x53,0xa4,0x80,0x72,0x35,0x24,0x43,0x5a,0x46,0x09,0xaa,0xbb,0x2c,0x37,0xc5, + 0xfc,0x41,0x58,0x0b,0x72,0xbf,0x82,0x65,0x66,0x3b,0x09,0x07,0x00,0x4d,0x10,0x9b,0xb1,0xcc,0x8f,0xfe, + 0xc3,0xdf,0xa9,0x3d,0x98,0x04,0xe4,0x04,0xef,0xf0,0x23,0x08,0x44,0x8b,0x87,0xf4,0x9b,0x8a,0xb6,0x57, + 0x2f,0xd6,0xd3,0xb3,0xb7,0x72,0xc7,0x3e,0x7b,0x00,0x29,0x85,0x6e,0x90,0x0b,0x69,0x70,0x5b,0xb5,0x67, + 0x8d,0x87,0x72,0xe7,0x06,0x5f,0x68,0xe3,0x3e,0x7b,0x08,0xce,0xc9,0xd7,0xe2,0x1e,0x5e,0x95,0x71,0x0f, + 0x55,0x0f,0xbe,0x86,0x54,0x9d,0xac,0xff,0xf0,0x6a,0x90,0xde,0x1c,0xb7,0x88,0xbc,0xe7,0x03,0x3e,0xee, + 0x64,0x0d,0x88,0x4b,0x05,0x64,0x58,0x15,0x33,0xce,0x6e,0xb7,0x7c,0x0d,0xd6,0x78,0xeb,0xad,0xc3,0x1a, + 0x33,0x22,0x3a,0xae,0x8d,0xb0,0x88,0x77,0x0f,0x98,0xf2,0xe0,0xf3,0x9a,0xd3,0x53,0x3e,0x50,0x53,0xfd, + 0x59,0x9e,0x9e,0xef,0xb6,0x40,0x87,0xe7,0x49,0xe8,0x50,0x81,0x0f,0xd8,0x79,0xb2,0x8d,0xfa,0x3b,0xa5, + 0x12,0x41,0x7d,0x82,0xe4,0xe5,0x1c,0x77,0x0d,0xb9,0x55,0x1f,0xf6,0xb4,0x02,0x27,0x6d,0xba,0x4e,0x7d, + 0x40,0x12,0xfa,0x2b,0x8c,0x8c,0x7d,0xae,0xe4,0xfd,0xd7,0x1c,0x0d,0xf5,0x69,0x81,0xc1,0x15,0x32,0x0f, + 0x16,0x36,0x92,0xf1,0xfe,0x68,0x30,0xf7,0x7b,0xca,0x29,0x6c,0xf4,0xe1,0xb6,0x39,0xfe,0xee,0x57,0xc2, + 0xee,0xe1,0x37,0x33,0xbf,0x60,0xbd,0xa1,0x5b,0x05,0x4b,0xa0,0x52,0x3c,0x06,0xc3,0x3b,0xa4,0xb7,0x2e, + 0x7a,0x75,0x30,0x1f,0x73,0x94,0x90,0xfb,0x43,0xd1,0x08,0xf2,0x1e,0x9a,0x7e,0x5a,0x25,0xd2,0xbc,0x32, + 0xe1,0xbe,0x34,0x7a,0x9c,0x72,0xda,0x42,0x77,0xbc,0xc1,0x9a,0x84,0xa4,0xe8,0x01,0xf3,0x5c,0xda,0xf5, + 0x81,0x07,0xbb,0x89,0x97,0x69,0x80,0xb3,0xe4,0x56,0x03,0xf4,0xc2,0xb8,0x65,0xec,0xf7,0x68,0x37,0x62, + 0xd1,0xa3,0xd6,0x50,0x9b,0x6f,0x5a,0xc8,0x52,0xe0,0x2d,0x95,0x66,0xb4,0x80,0x1c,0xcc,0x33,0x7e,0x52, + 0xd9,0x08,0xf5,0x6b,0xa6,0xc8,0xf4,0xc6,0x64,0x98,0x7f,0x14,0xa7,0x38,0x0a,0x22,0x0a,0xdd,0xfa,0x35, + 0xbf,0x49,0xf7,0x10,0x1f,0x03,0x07,0x4c,0x22,0x66,0x74,0xcc,0x42,0x0a,0x82,0x79,0x28,0x0a,0x65,0xf1, + 0x4b,0x0c,0x8b,0x78,0x82,0xb6,0x15,0x44,0x22,0xc1,0x6a,0x5e,0x79,0xda,0xaf,0x11,0x5e,0x80,0x1d,0x63, + 0x38,0x25,0x1a,0x3e,0x89,0x4e,0xce,0xa5,0x32,0x57,0x13,0x2a,0xc4,0x93,0x2c,0xfd,0x7d,0x98,0xa1,0xb6, + 0x51,0x63,0x6d,0xf4,0x5a,0xb0,0x3c,0x5f,0x29,0xd0,0x33,0xe8,0x30,0x2a,0xf6,0x5f,0x29,0xaf,0x93,0x57, + 0x68,0xe6,0xca,0xb9,0x49,0xa2,0x7b,0x1c,0x75,0xd5,0xfc,0x0c,0x58,0x9e,0xec,0xbd,0xfa,0x9c,0x50,0x6a, + 0x02,0xd0,0xde,0x3b,0x78,0x5a,0xf0,0x93,0xb0,0xc8,0x6f,0xca,0x6a,0x18,0x06,0xeb,0xb0,0xf9,0x79,0xb7, + 0xcf,0x7d,0x22,0x94,0xbf,0xc4,0x97,0x46,0x8f,0xee,0x58,0x7a,0xdc,0x7f,0x6f,0xac,0xe6,0x57,0xa3,0xe7, + 0xe3,0x41,0x0e,0x51,0x5c,0x0f,0x27,0x9f,0x94,0x0c,0x03,0x28,0xcb,0x0b,0x19,0x7a,0xef,0x67,0x85,0x15, + 0x4e,0xb6,0x47,0xb8,0xdd,0xc8,0xcd,0x94,0x33,0x30,0x17,0xa7,0xf4,0x20,0xb5,0x39,0x1c,0x39,0x48,0xca, + 0x33,0x3e,0x9c,0xa8,0xf8,0x41,0x03,0x10,0xb7,0xa3,0xda,0x05,0xaf,0xd2,0x86,0x1d,0x0d,0x49,0x35,0x64, + 0x11,0x0e,0x29,0x2c,0x88,0x70,0x4d,0xbf,0xca,0x5d,0x2a,0xdd,0xd9,0x05,0xbe,0xed,0xb5,0x2d,0x79,0x8e, + 0x8f,0x9e,0x55,0xab,0x59,0xec,0xcf,0xde,0xde,0x0f,0x1f,0xd2,0xef,0xec,0x59,0x70,0x71,0x1f,0x5e,0xdc, + 0xa3,0x4f,0xf0,0x3d,0xba,0x2e,0xde,0x93,0x3f,0xf0,0x3d,0x30,0x66,0xf7,0xb3,0xf8,0x9e,0xd6,0xf5,0x3d, + 0xd0,0xe2,0x7b,0xee,0xb4,0xeb,0x7c,0x98,0xd8,0xc3,0x9d,0xe6,0x77,0x1f,0x26,0x08,0xb5,0x33,0x71,0xf6, + 0x34,0xd1,0xf8,0x3e,0xa7,0xd2,0x91,0xc4,0xa1,0xd2,0x13,0xa0,0x8a,0x52,0x40,0x27,0x1b,0x6d,0xe1,0xee, + 0x65,0xec,0xea,0x72,0x69,0xf8,0x20,0x85,0xdc,0x98,0xf1,0xfd,0x29,0x46,0xde,0x8d,0x0c,0xa4,0xf0,0xdf, + 0xa8,0xdd,0x86,0xa5,0xc6,0xde,0xf7,0xa4,0x57,0x2e,0x51,0x2d,0x94,0xc5,0x73,0x9e,0x08,0x24,0xbc,0x4a, + 0xc5,0x1a,0x79,0x2d,0x54,0xae,0x86,0x8a,0xa5,0x10,0x31,0x35,0x9b,0xa1,0xc3,0x1e,0xfa,0x56,0xd6,0x90, + 0x98,0x7c,0x2b,0x7a,0x58,0x3e,0x69,0xae,0x83,0x2f,0x1a,0x4d,0x1c,0xf7,0xb5,0xca,0xf6,0x81,0x01,0xfb, + 0xd6,0x31,0x30,0x8f,0xb7,0x68,0x31,0xe3,0x80,0x73,0x50,0x1a,0xce,0x19,0xba,0xf9,0x7e,0xa1,0x6e,0x39, + 0x84,0x0d,0x47,0xb1,0xb7,0xbf,0x81,0xab,0x6a,0x9a,0x67,0x3f,0x6f,0x54,0x55,0x37,0x6c,0xbb,0xb2,0x49, + 0x98,0x24,0xe7,0xd7,0xf2,0xc2,0xd8,0xba,0x99,0xf7,0xb4,0xf9,0xe7,0x65,0x90,0x7c,0x39,0xa3,0x4f,0x43, + 0xa3,0x5d,0x33,0xd6,0x1e,0x1f,0xa4,0xb1,0x45,0xb2,0x26,0xfd,0x87,0x5e,0x44,0x59,0xfc,0x3b,0xe0,0x6a, + 0xec,0xbb,0xc9,0x3c,0x46,0x35,0x7d,0x84,0x76,0x4f,0xca,0x13,0x41,0x36,0x09,0xeb,0x14,0xc1,0xab,0xcd, + 0x0f,0x3a,0xf7,0x27,0xfa,0x63,0x24,0x99,0x2f,0x7f,0x04,0xa9,0x35,0x7e,0xcf,0xc9,0xa8,0x75,0x9a,0x4e, + 0xfd,0x45,0xf0,0xe0,0xd7,0xf4,0x16,0xa1,0xb4,0x58,0xd3,0x2c,0x99,0xff,0x06,0xdb,0xe6,0x40,0x9a,0xbf, + 0x91,0x83,0xe8,0xcf,0x71,0x08,0x05,0x9d,0xb6,0xb9,0xff,0xa0,0xec,0xe5,0xdb,0x20,0x09,0x63,0x01,0xa1, + 0x4d,0xe6,0xa3,0x6d,0x6d,0xbe,0xb1,0x77,0x5a,0x8e,0xaa,0x6b,0xcf,0xac,0xeb,0x1b,0xf3,0x02,0x23,0x66, + 0x53,0xd8,0x46,0x57,0xba,0x6e,0xb8,0x7b,0x96,0xbf,0x53,0xaf,0x5b,0xbb,0x5c,0x30,0xc1,0xaf,0xad,0x9a, + 0xe4,0xc1,0xcf,0xd8,0x10,0xb9,0xc3,0x81,0xcb,0x88,0x22,0x36,0x06,0x6e,0x11,0x0d,0xf9,0x46,0x0b,0x9d, + 0xe6,0x84,0xe3,0x16,0xf4,0x1e,0x87,0x43,0x43,0x52,0xff,0xc1,0x86,0xe2,0xce,0x37,0x1f,0xd2,0xe1,0x1e, + 0xb3,0x7e,0xd5,0xb6,0x1c,0x57,0x31,0x4d,0xa5,0x52,0x54,0xe2,0x9b,0x1a,0x96,0xe1,0x6b,0xe2,0x81,0x4b, + 0xa0,0x62,0xe3,0xc1,0x98,0x94,0x36,0x1e,0x41,0x5c,0x88,0xfd,0x30,0x14,0xdd,0xcd,0xc8,0xbb,0x5f,0xde, + 0xcc,0x8c,0x1e,0xd5,0x40,0xbc,0xee,0xac,0xf6,0x50,0xc5,0xe0,0x66,0xb2,0xcb,0x1f,0x1b,0x99,0x9b,0x39, + 0xae,0xda,0xf5,0x1f,0xc5,0xb2,0xcb,0xad,0x5d,0x7d,0xe4,0x1b,0x44,0x11,0xa1,0x1c,0x1f,0x4c,0x14,0x09, + 0x78,0x51,0xf0,0x14,0x95,0x3c,0x16,0x48,0xde,0x36,0x4d,0x84,0x60,0xcd,0x42,0xe0,0x34,0x47,0x96,0x35, + 0xc6,0x83,0x64,0xb0,0x65,0x01,0xaa,0xce,0x93,0xe3,0x46,0xda,0xb0,0xff,0xcc,0xe7,0x32,0x84,0xcf,0xa3, + 0xc3,0x07,0x33,0xef,0x68,0xb7,0xe2,0xf5,0xc4,0x49,0xe7,0x3e,0xb3,0x33,0xe7,0x2e,0x8f,0x7b,0x85,0xce, + 0xf6,0x20,0x65,0xa7,0x74,0x80,0x39,0xc3,0x9d,0x4c,0x6e,0x2e,0x4a,0x14,0x21,0x76,0x17,0xb0,0x11,0x62, + 0x6f,0xc1,0xca,0x86,0x7f,0xcf,0x70,0x29,0x67,0x72,0x61,0xa7,0xfc,0x0a,0x9a,0xcb,0x73,0x28,0x98,0xde, + 0xa2,0xfc,0x69,0x6f,0x61,0x91,0xba,0xaa,0x0f,0x95,0xa0,0xfd,0x9a,0xaa,0x4a,0x8f,0xeb,0xdf,0x79,0x3b, + 0x6d,0x20,0xf6,0xc2,0x4f,0x2f,0xa7,0xe6,0xca,0x9d,0x67,0x15,0x53,0x80,0x3e,0xf5,0xe5,0x09,0x15,0x67, + 0x1a,0xb2,0x1b,0xbf,0xab,0xd7,0x61,0x11,0x81,0xc0,0x3e,0x53,0x1a,0x1a,0x35,0xa5,0xc0,0x24,0x13,0x30, + 0xa9,0xa7,0xac,0x11,0x30,0x00,0x1f,0x38,0xfd,0x1d,0x65,0x63,0x45,0x43,0xa0,0x7f,0x95,0x3c,0xb6,0x17, + 0x55,0x1d,0x2b,0xcc,0x64,0x2d,0x54,0x4b,0xd5,0x4b,0x5a,0x58,0xb5,0x70,0x00,0x9c,0xc1,0x27,0x61,0xb9, + 0x16,0xda,0x62,0x2e,0x9d,0xbf,0x21,0x5d,0x25,0x6e,0x2e,0xe1,0xb7,0xf8,0x45,0x6c,0xb4,0x75,0x6e,0x95, + 0xa4,0x55,0xd4,0x6a,0x8f,0xd7,0x8c,0x52,0xad,0xb3,0x70,0xbd,0x0f,0xe8,0x31,0xd6,0x38,0x89,0x3f,0x4b, + 0x03,0xf3,0x67,0xf6,0x54,0x1e,0x2f,0x7f,0x28,0x4b,0x3f,0x17,0x99,0xcc,0x2b,0xf4,0xa7,0x4d,0x0f,0xff, + 0x58,0x61,0x94,0xbd,0xc8,0x38,0x52,0x23,0x3c,0xfe,0x9b,0xcd,0x8f,0x7f,0xb5,0xf9,0xf1,0x5f,0xaf,0xcd, + 0x9c,0xa6,0xa5,0x4d,0xa9,0xda,0x2d,0x49,0x9b,0xf2,0xc1,0x8a,0x59,0x0d,0x78,0xfc,0xdb,0x87,0xd5,0x85, + 0xc6,0x8b,0xca,0xba,0xe8,0x01,0xaf,0x8b,0x16,0x73,0x10,0xa0,0xfc,0x97,0xd1,0xbf,0x42,0x3b,0xce,0xfc, + 0xc0,0x53,0xea,0xbb,0x30,0x20,0x81,0x30,0x08,0xa4,0x68,0x90,0x05,0x08,0x40,0x47,0x37,0x4d,0xab,0x89, + 0xda,0xba,0x64,0x37,0x29,0x69,0x2c,0x31,0x86,0xd5,0x54,0x59,0x2a,0xde,0xb7,0xd1,0xb8,0x1c,0x70,0x39, + 0x53,0xea,0x08,0xd8,0x9c,0xeb,0x7e,0x85,0x12,0xce,0x13,0xbe,0x20,0xc1,0xf4,0x9a,0xd2,0x02,0x2a,0x5f, + 0x00,0x32,0x21,0xf0,0x15,0x8b,0x07,0x94,0x4c,0x65,0x55,0x68,0x18,0x9d,0x6b,0x51,0x79,0x38,0xd0,0xae, + 0xee,0x11,0x77,0xe4,0x07,0xe6,0x31,0x85,0x36,0x22,0xf2,0x15,0x1a,0x98,0x3c,0x29,0x87,0x1e,0x31,0x01, + 0x71,0x48,0x22,0xcd,0x7e,0xa6,0x9e,0x51,0x66,0x0e,0xf0,0x4b,0xce,0x30,0x19,0x97,0xed,0x7c,0xe8,0xa2, + 0x8c,0x4e,0x97,0xf9,0x78,0x64,0xdc,0xd1,0x2a,0x24,0x4b,0x87,0x8f,0x5e,0x32,0x68,0xb8,0xc2,0x70,0x55, + 0xbc,0x60,0x25,0x57,0x39,0x2a,0x52,0xf6,0x38,0xba,0x14,0x2f,0x50,0x53,0xe4,0xc3,0x21,0xa7,0xe0,0xc2, + 0xcc,0xe0,0x73,0x27,0x23,0xa4,0xdd,0x8c,0x09,0x7f,0x37,0x37,0x5d,0xe7,0xf3,0xe2,0x2b,0x9f,0x17,0x5f, + 0xf8,0xbc,0x30,0xf4,0x88,0x82,0x37,0xc4,0xa5,0xf1,0x04,0xdd,0xaa,0xde,0x05,0xfe,0xec,0x0b,0x39,0x55, + 0x3d,0xe1,0x09,0x61,0x2d,0xe5,0x10,0x06,0x67,0x80,0x98,0x8f,0x7c,0x77,0x78,0x7d,0xdc,0x43,0x2b,0xdb, + 0xe2,0xa1,0x85,0xf8,0x54,0x2b,0x81,0x5c,0xcb,0x95,0xa9,0x4d,0x8c,0x26,0x1f,0xa5,0x88,0x95,0x68,0x23, + 0x6e,0x5a,0xd5,0x94,0x63,0x98,0x81,0xb9,0xf0,0xda,0xeb,0x17,0x9e,0x25,0xac,0x3c,0x68,0xfb,0x33,0x04, + 0xf5,0x58,0x2c,0xea,0x89,0xca,0x6b,0x74,0xc5,0x76,0xae,0x8a,0x29,0xe0,0x2f,0x68,0x0a,0xae,0x04,0x98, + 0x5e,0x54,0x5a,0x04,0x64,0x93,0xa4,0xd9,0x99,0x18,0xf9,0x91,0x76,0xa4,0x17,0x03,0x7f,0x50,0x65,0x59, + 0xcf,0xd3,0x1b,0x8d,0xef,0xab,0x47,0x19,0x4f,0x86,0x21,0x0d,0x1e,0xb9,0x57,0xc8,0xd9,0xc4,0x71,0x7c, + 0x19,0x4f,0x7d,0x20,0x0a,0xf2,0x31,0xaa,0x9c,0x96,0xef,0xa3,0xeb,0x88,0xe7,0x4f,0x01,0xa9,0x1d,0x9e, + 0x88,0x75,0x90,0xff,0xa0,0xd4,0xd3,0x15,0x95,0x4c,0xab,0xbc,0xb3,0x86,0xe7,0x8f,0xc2,0xbb,0xac,0xf0, + 0x46,0xbc,0x98,0xc7,0xb7,0x84,0x90,0x24,0xda,0xc1,0x55,0x0d,0xe7,0x14,0x8c,0x96,0x6b,0x7d,0x9c,0xcc, + 0xfd,0xe8,0x1a,0x9d,0x10,0xe7,0x68,0x6f,0x47,0xb4,0x9b,0x20,0x91,0x9f,0xf7,0x4e,0xf8,0xc2,0x29,0x53, + 0xbf,0xac,0x40,0x79,0xcc,0x39,0x4c,0xad,0x3a,0x05,0x09,0xa5,0xbe,0x43,0x97,0x27,0x9f,0xb8,0x7a,0x3d, + 0xd7,0xe3,0x45,0x61,0x48,0xa5,0xee,0xac,0xe0,0xe3,0xbd,0x8b,0xe1,0x6e,0xa4,0xc5,0xc9,0x55,0x86,0x86, + 0xb1,0x2d,0x15,0x8a,0x8f,0x78,0x25,0xc6,0xd0,0xd2,0xfe,0x4d,0x89,0x30,0x47,0x0b,0x7f,0xa1,0x4a,0x22, + 0xaf,0x10,0xad,0x6f,0x72,0x36,0xc2,0xbb,0x1b,0x9d,0x5b,0x91,0xef,0x13,0x59,0x3d,0xed,0x3a,0x04,0xd6, + 0x4a,0x6e,0x48,0x57,0xc8,0x46,0x77,0x74,0x20,0xb8,0xa2,0xe0,0x93,0x78,0xc1,0xb7,0x26,0x77,0xe8,0xc3, + 0x94,0x9b,0x49,0xe8,0x02,0x19,0xbe,0x88,0xa8,0xe6,0x3c,0x3d,0x25,0x7f,0xbf,0x34,0x4f,0xca,0xd1,0xfb, + 0x6e,0xa8,0xcc,0x39,0xc6,0xdd,0x1d,0xc4,0x0c,0x0a,0x0a,0x8e,0x61,0xa6,0x06,0x73,0x19,0x29,0x6b,0x40, + 0x5b,0x0f,0x82,0xe4,0xa0,0x62,0x69,0xcd,0x1a,0xdc,0xe0,0xb1,0x70,0x6c,0x97,0x20,0xca,0xe6,0x95,0x14, + 0x39,0xef,0x14,0x47,0x1d,0x99,0x0f,0x85,0x77,0x0f,0xff,0xc8,0x35,0x7e,0x90,0xcf,0x60,0x8c,0x6e,0x41, + 0xbe,0x54,0x1e,0x87,0x9c,0xee,0x4f,0x7f,0xae,0x7d,0x89,0xda,0x9e,0x92,0x27,0xa2,0xa4,0xae,0x0f,0xf4, + 0x74,0x9c,0x89,0x16,0xd7,0x38,0x5d,0x4e,0x29,0x8d,0x24,0xdf,0x9c,0xd8,0xc6,0x4c,0xed,0x48,0x60,0x94, + 0x1f,0xda,0xc6,0xc2,0x4b,0x31,0x51,0x93,0xd2,0xd5,0x75,0xba,0xb0,0x9d,0xd0,0x97,0x0b,0x25,0xa9,0x22, + 0x9a,0xa4,0xa9,0x9a,0x9f,0x35,0xb9,0x9f,0xa4,0xe3,0x88,0x33,0x66,0x36,0x79,0xc1,0x15,0xef,0x76,0x20, + 0x07,0x8e,0xa6,0x67,0xb9,0x6d,0xe0,0x76,0x97,0xf4,0x3d,0xd5,0xe3,0xb7,0x78,0xb0,0x7d,0xae,0xe4,0x91, + 0x2d,0xac,0x74,0x45,0x84,0xb0,0xe0,0xf3,0x82,0x28,0xff,0x47,0xe1,0xe7,0x99,0x72,0xf5,0xec,0x94,0x89, + 0x6b,0xf9,0x61,0x88,0xef,0x85,0xc3,0xba,0x1c,0x8a,0xa4,0x06,0xc5,0x01,0x5d,0xf2,0xfb,0xd2,0x0e,0x01, + 0x5b,0xcf,0x36,0xec,0x5d,0xe8,0x30,0xac,0x16,0xf9,0xf2,0x29,0x4f,0xe2,0xc2,0xd2,0xfb,0x7b,0x63,0x97, + 0x80,0x38,0x22,0xfd,0x33,0x28,0xf4,0x37,0x54,0x17,0xf1,0xd0,0x46,0xdf,0x0f,0xd9,0x17,0xc6,0xb3,0x77, + 0xa0,0x89,0xcd,0x71,0xed,0xbc,0x35,0x4e,0x95,0x21,0x07,0x0e,0x4a,0xac,0x71,0x8c,0xee,0x92,0x9b,0x0c, + 0x26,0x4c,0x7a,0x49,0xa3,0xb7,0x37,0x1f,0x33,0xad,0x18,0x18,0x8e,0xa6,0xfc,0x74,0x84,0x05,0x77,0x2c, + 0x02,0x64,0xc6,0xae,0xe0,0xef,0x57,0x17,0x61,0x04,0x73,0xfc,0xe5,0x8e,0x3c,0x04,0xf9,0xc4,0x12,0xef, + 0x75,0x8c,0x0a,0x70,0xb4,0x04,0x02,0x61,0x58,0x31,0x45,0x5d,0x2c,0x91,0x53,0xcc,0x91,0x94,0xe4,0x6e, + 0xb5,0x1a,0xa3,0xaa,0x3c,0xb3,0x6f,0x90,0xf0,0x90,0x79,0xd4,0xad,0xa6,0x41,0xce,0x40,0x91,0xd0,0x58, + 0x2a,0x5b,0xe6,0x41,0x9e,0x2a,0x4a,0xf2,0x97,0x04,0xf2,0xd4,0xe3,0x47,0x75,0x19,0x17,0x14,0x8f,0xe9, + 0x07,0x81,0x1b,0xf2,0xb4,0x11,0x2c,0xf3,0x72,0xd9,0x0d,0x9a,0x98,0xad,0x64,0x1e,0xe0,0xca,0x84,0xbd, + 0x28,0xc1,0x35,0xe1,0x24,0xb7,0x2b,0x33,0x4b,0x38,0x15,0x79,0x23,0x8c,0x14,0x0f,0x70,0xd2,0x56,0xe5, + 0x7d,0x10,0xbe,0x30,0xf6,0xb6,0xdc,0x29,0x8c,0xbf,0xec,0x56,0x54,0x82,0xd6,0xe8,0x20,0xd0,0xa9,0xa8, + 0x38,0x38,0x01,0x2f,0x27,0xb2,0x36,0x60,0xc4,0x55,0xbe,0x44,0xa9,0x80,0x5e,0x3c,0x86,0x68,0xb0,0x22, + 0xf6,0x07,0x99,0x78,0x91,0xc5,0x80,0xcf,0xa7,0xc1,0x0b,0x61,0x81,0x3b,0x53,0x70,0x80,0xd9,0x52,0x20, + 0xb5,0x99,0x8a,0x84,0xff,0x63,0x8e,0xc3,0x0a,0x86,0x0a,0xdd,0x15,0x0d,0x2e,0x7f,0x93,0x7f,0xa8,0x7c, + 0xee,0x64,0x21,0xe5,0x70,0x87,0x85,0x7f,0x95,0xe7,0xd5,0x8a,0x85,0x33,0xb3,0xb0,0x92,0x36,0xce,0x03, + 0x2d,0xa8,0x54,0xc7,0x40,0xd3,0xc6,0xff,0x43,0x65,0x0e,0x13,0xd5,0x44,0xc0,0xd3,0x99,0xdc,0x60,0x92, + 0xbb,0xb2,0x73,0x8f,0x70,0xed,0xe1,0x24,0x21,0x8a,0x49,0xc2,0x74,0x90,0x09,0xfd,0x53,0x55,0xad,0xba, + 0xe3,0xd9,0x03,0x6b,0x85,0xf9,0x8a,0x38,0x4d,0x41,0xc6,0x56,0xcb,0x2d,0xf0,0x6d,0x45,0xd5,0xea,0x05, + 0x88,0x84,0xc1,0x0d,0x69,0x58,0xef,0xef,0xd7,0x3e,0x87,0x33,0x92,0xd8,0x43,0xe9,0xbc,0xc4,0x11,0x85, + 0x85,0xa7,0x94,0x9a,0x60,0x1e,0xc6,0x58,0x38,0xf7,0x77,0xcc,0xe3,0x1d,0x61,0xa5,0x17,0x50,0xd3,0x22, + 0x50,0x81,0x68,0x6a,0xe0,0x8b,0x06,0x4e,0x39,0x3a,0xf8,0x1d,0xf0,0x92,0xc7,0x09,0x55,0xc4,0x3d,0xc0, + 0xcb,0xcc,0x81,0xc1,0xb4,0x48,0xc7,0x19,0xcd,0xa5,0x68,0x5b,0xb3,0xca,0x5e,0x01,0x9f,0x43,0x56,0x39, + 0xfd,0x96,0x4a,0x40,0x8e,0x6f,0x04,0xdb,0xc9,0x94,0x0e,0x49,0xa2,0xef,0x46,0xca,0x1c,0x01,0xd5,0xf6, + 0xe1,0x3f,0xe1,0x57,0x56,0x64,0x8c,0x4c,0x1a,0xf3,0x8b,0xe4,0x45,0x27,0xef,0xf4,0xa4,0x86,0x10,0x77, + 0x1f,0xd0,0xe0,0x59,0x3e,0x73,0x1e,0xba,0xaa,0x91,0xab,0x20,0x66,0x49,0x32,0x08,0x85,0x70,0xcb,0x50, + 0xde,0x69,0x5b,0x7c,0x02,0xf2,0x91,0x61,0x37,0x41,0x2e,0xf5,0x96,0x6c,0x2c,0x0a,0xaa,0x20,0x18,0xc4, + 0x2a,0x22,0x53,0x54,0x8d,0xdb,0x4e,0x1d,0x74,0x25,0xe6,0x69,0xa9,0xac,0x1a,0x05,0x4d,0xc3,0x3d,0x96, + 0xc4,0x48,0xb8,0x24,0x01,0xcf,0x80,0x49,0x43,0x2d,0x98,0x6b,0xb5,0x24,0xee,0xc3,0x54,0xc8,0x2d,0x2e, + 0xd4,0x44,0x28,0x14,0xdc,0xe3,0x99,0x2b,0x36,0x54,0x85,0xa7,0xef,0xde,0xb9,0xdc,0x59,0xb9,0x70,0x0a, + 0x5b,0xa4,0x27,0x26,0xdf,0x08,0x61,0x9a,0x27,0xd7,0x7c,0x67,0x5d,0x76,0x2e,0xe5,0x78,0xe8,0x6f,0xb6, + 0xdb,0x5f,0x05,0x86,0x10,0xbf,0x49,0xb7,0x89,0xe0,0xf6,0xb8,0x42,0xb2,0x26,0x97,0x63,0x50,0x0c,0x86, + 0x93,0x5e,0x6b,0x7a,0x33,0xa1,0xa6,0xaf,0xa9,0x8b,0x61,0x95,0x5a,0xd2,0x68,0xd0,0x35,0x0c,0x2d,0x52, + 0xb3,0x59,0xaf,0x2b,0xbb,0xcd,0x8e,0xaa,0xb3,0xaa,0x1e,0x83,0x6b,0x37,0x60,0x56,0x10,0x8b,0xbb,0x48, + 0x0c,0x8e,0x81,0x79,0xd3,0xf4,0x60,0x4c,0x91,0x98,0x3a,0x25,0xc3,0xc0,0xa7,0x04,0xad,0x23,0xdb,0x6f, + 0x64,0xca,0x1d,0xd9,0xf9,0xb5,0xfc,0x35,0xd6,0x7e,0x8f,0x3e,0xcb,0x1b,0x86,0x32,0x61,0x18,0x42,0x83, + 0x90,0xf6,0x52,0x48,0xf3,0x27,0xb9,0x52,0x5c,0x71,0x2f,0xa1,0x0a,0xc5,0x95,0x7c,0x20,0xe7,0x75,0xc1, + 0xd9,0xac,0x74,0xf3,0xbc,0x99,0x42,0x0b,0x0f,0x38,0x80,0xb9,0x51,0xfb,0x0a,0x0f,0xab,0x96,0xc0,0x06, + 0x55,0xa7,0x56,0x3e,0xbe,0x43,0x2d,0x70,0x68,0x1f,0x66,0xd7,0x88,0x2f,0x21,0x6a,0x26,0x8f,0xe9,0xad, + 0x61,0x25,0x2b,0x44,0x3a,0x2e,0x12,0xff,0xdc,0x0a,0xa5,0x54,0x0f,0x62,0x14,0x59,0x2a,0x54,0xb4,0xf6, + 0x1a,0x2f,0x4b,0x91,0x14,0x9a,0x8c,0x10,0x59,0xbc,0x78,0x9b,0xc4,0x0b,0xff,0xd2,0xe7,0xec,0x9a,0x16, + 0xa3,0x38,0x45,0x44,0x46,0x13,0xa5,0xa7,0x19,0xa9,0x2e,0x8a,0xac,0x51,0xcc,0x15,0x18,0x7e,0x91,0xd6, + 0xa4,0x65,0x37,0x42,0xf4,0x0d,0xd6,0x99,0x3a,0x05,0xc9,0x4f,0xf8,0x43,0x6a,0x61,0xb3,0xa3,0x61,0xf4, + 0x00,0x47,0x43,0xec,0x23,0x56,0xc7,0x35,0x7b,0x98,0x23,0x54,0x79,0x07,0x53,0x58,0x47,0x55,0x0d,0x53, + 0x32,0x6d,0x19,0xef,0x17,0x88,0xb0,0xff,0xcb,0x94,0x76,0x83,0x9f,0xf3,0x72,0xf4,0x4b,0x3c,0x0b,0x57, + 0x32,0x05,0xd5,0xcf,0xce,0x50,0x1a,0xe9,0x8c,0xaa,0x18,0xc4,0x0f,0x07,0xb9,0xf2,0x0a,0x8f,0xd8,0x15, + 0xdc,0x12,0xbe,0x98,0x11,0xb1,0xee,0x86,0x17,0x99,0x74,0xd2,0x53,0x59,0xb0,0xa6,0xdb,0xce,0x0d,0x1a, + 0xf2,0xd5,0x2a,0xdd,0x66,0x8d,0x2e,0xd8,0xba,0x86,0x76,0x85,0x99,0x29,0x46,0x5b,0x4c,0xd1,0x16,0x4b, + 0xf9,0x09,0x4b,0x45,0x11,0x8e,0x7f,0x55,0xbd,0x39,0xb8,0x55,0x21,0x46,0x17,0x6c,0xe6,0x1b,0xbb,0xc1, + 0x4f,0x6e,0x50,0x6f,0x62,0x57,0x29,0x56,0x66,0x28,0x19,0x27,0x66,0x26,0x6f,0xe2,0x07,0x8a,0x44,0x88, + 0xee,0x4a,0x0a,0x94,0x25,0xb4,0xee,0xcc,0xe4,0xb2,0xb8,0x4b,0x6e,0x9c,0x7f,0xa9,0x14,0xb3,0xa5,0x49, + 0xc5,0x93,0xf1,0xd4,0x06,0x4e,0xd8,0xfa,0x8a,0x09,0x43,0x2b,0x5d,0x5c,0x65,0xad,0x40,0x14,0x25,0x4c, + 0x10,0x39,0x88,0x7f,0x2e,0xc5,0x99,0x0b,0x4d,0xa7,0xd4,0x60,0x8b,0x40,0x70,0xa9,0x87,0x83,0xee,0xcf, + 0x95,0x2e,0xd2,0x37,0x15,0x64,0xf9,0x9e,0x4c,0x30,0x87,0xa5,0xe9,0x79,0x29,0xde,0xa7,0xac,0xea,0x7f, + 0xfb,0xbf,0x58,0xfc,0x0c,0x96,0xb2,0x21,0xf3,0x85,0x74,0x78,0x59,0x81,0x7a,0x95,0x5e,0x09,0xf3,0x8e, + 0xe6,0x62,0x2f,0x72,0x99,0x60,0x4c,0xe6,0x4d,0x76,0x97,0x07,0xce,0xd2,0x60,0x23,0xc1,0x1f,0x16,0x51, + 0xe7,0xa5,0x27,0x1e,0x4f,0x57,0xee,0x05,0x2a,0xf2,0x03,0x3e,0xc2,0x95,0x92,0x8a,0x28,0xb4,0x32,0xa2, + 0xfe,0x2b,0x7a,0x87,0xe9,0x4b,0x15,0x73,0x43,0xe8,0x9a,0x0d,0xab,0x89,0xfa,0x4c,0x58,0xf8,0x0d,0xab, + 0xe6,0xd5,0x28,0xbd,0x54,0x0d,0x63,0x80,0x78,0x67,0x1a,0x16,0x43,0xc6,0x07,0x39,0x32,0x98,0xcf,0x57, + 0x29,0xb3,0xa3,0x47,0xed,0xa0,0x3b,0x34,0x7c,0x9d,0x30,0xb4,0xfe,0x26,0x05,0xc6,0xe9,0x51,0x3f,0xe8, + 0xf1,0x07,0x1c,0xc8,0x34,0xda,0xc3,0x84,0x40,0x0d,0x8b,0x9e,0x75,0xfb,0xc1,0x7e,0xfe,0x21,0x94,0xc6, + 0x37,0x2d,0x37,0x77,0x17,0xcb,0xc1,0xed,0x2b,0xd4,0xb4,0x3a,0x38,0x05,0x15,0x19,0x4c,0xaf,0xae,0x65, + 0x20,0x83,0x88,0xeb,0x12,0xdf,0x02,0x1b,0x48,0x7e,0x8c,0x53,0xf9,0xde,0x27,0xe2,0xe1,0xe8,0x43,0x1e, + 0x77,0xa1,0x3f,0x56,0x0d,0x95,0x48,0x81,0x4c,0xdf,0x0b,0x0b,0x8b,0x12,0xab,0x15,0xa3,0x69,0x27,0x42, + 0xeb,0xbe,0xf3,0x29,0xa8,0xb4,0x3f,0xc5,0x9c,0x39,0x30,0x4f,0xb4,0x4d,0x32,0xbf,0x0c,0x86,0x17,0x70, + 0x90,0x28,0xd7,0x57,0x27,0x8c,0xbc,0x0c,0xaa,0xb3,0x8b,0x0a,0xf1,0x8d,0xa7,0x19,0xbd,0xd8,0x2a,0x13, + 0x5e,0x29,0xe1,0x4d,0xac,0xdc,0xdb,0xa0,0x8a,0xa5,0xc6,0x23,0xc3,0xda,0xce,0x31,0x07,0x9f,0x61,0x50, + 0x67,0xa4,0xe6,0x15,0xac,0x86,0xca,0x0a,0xa8,0xd9,0xaa,0xf4,0x8a,0x14,0xcf,0x8e,0xe8,0x00,0x7e,0xe7, + 0xf3,0x80,0x7b,0x54,0x57,0x25,0x9a,0x0d,0x3e,0x29,0x57,0x5f,0xba,0x40,0x73,0xc0,0xa7,0xca,0xed,0xc5, + 0x83,0x3e,0x57,0xec,0x36,0x60,0x97,0x81,0xb1,0xcb,0xbe,0xd0,0x2e,0xcb,0xcd,0x8f,0x8c,0xaa,0xa2,0xd9, + 0x41,0xa7,0xf1,0xdb,0xa0,0x2a,0x5e,0x4d,0x7d,0x0f,0x0b,0xa4,0x08,0x20,0x3e,0x8c,0x9f,0xec,0xa4,0x8a, + 0xc1,0x8c,0x4e,0xb0,0x6c,0x9a,0xdc,0x94,0xc0,0x33,0xca,0x61,0x78,0x65,0xdb,0xc2,0x91,0x31,0x5c,0x7e, + 0x81,0xd2,0x4c,0xca,0x3a,0x0b,0x68,0x79,0x23,0xdb,0x08,0xbd,0xdf,0xb2,0xb6,0xa8,0xf7,0x0f,0x3b,0xf2, + 0x76,0xd4,0x41,0x06,0x4c,0xff,0x8e,0x72,0xd4,0xa9,0x3a,0xd5,0x6e,0x03,0x15,0x5d,0xb3,0xe2,0x5f,0x0b, + 0x5f,0x84,0x64,0x73,0xdd,0x37,0xd7,0xeb,0xd8,0xd5,0x96,0xe9,0xe4,0xfc,0xdb,0xcd,0x9f,0xf6,0x12,0x8b, + 0x3b,0xec,0xaf,0xb7,0x96,0x6a,0x2b,0xb2,0x7e,0x16,0x78,0x0f,0x5b,0x24,0xec,0xfa,0x97,0x2c,0xe4,0x9c, + 0x37,0x3d,0x6e,0x48,0xf4,0xe2,0x71,0xca,0x39,0x2e,0xcd,0xa7,0xec,0x8f,0x0e,0x3b,0xc3,0xc8,0xb4,0xca, + 0x86,0x71,0x71,0xca,0x86,0x31,0x75,0xee,0xe2,0x21,0x4d,0x15,0xea,0xb8,0x4c,0x16,0x4a,0x95,0xa3,0x9b, + 0xfd,0x1b,0xf6,0xd7,0x0e,0xfb,0x83,0xc3,0x4e,0xd7,0xb6,0x8b,0xf9,0x08,0xd3,0x2d,0x8d,0x73,0xbd,0x5b, + 0xba,0xa1,0x65,0x7d,0x08,0x8a,0xb2,0x32,0x39,0xb8,0x7a,0x95,0xfd,0x8a,0xfd,0xd6,0x61,0x7f,0x72,0xd8, + 0x79,0x55,0x57,0x40,0xb4,0x00,0xc9,0x05,0x69,0xc2,0x75,0xc0,0xe6,0x01,0x8c,0x13,0x74,0x19,0xb6,0xb2, + 0xb1,0x53,0x5f,0xd2,0x4e,0x45,0x2f,0x62,0xc2,0xfd,0x7b,0x15,0xcc,0x42,0xdf,0xb6,0x6c,0x38,0x4b,0x76, + 0x09,0x57,0xc8,0x3d,0xe8,0xb4,0x16,0x9f,0x1d,0xf2,0x77,0x84,0xe7,0x68,0x2d,0x1b,0xc9,0x6a,0xc6,0x06, + 0x8f,0xbe,0x4d,0xab,0xe6,0xd4,0xeb,0xd7,0x4a,0xc3,0xc4,0xce,0x37,0x52,0x86,0xeb,0x2d,0x94,0x41,0xe9, + 0x0c,0x9d,0xd5,0xb6,0xa2,0x8a,0x76,0x88,0x58,0x3c,0xee,0xb7,0x00,0x1f,0xbd,0x73,0xbe,0x71,0x83,0xb3, + 0x27,0xba,0x64,0xdb,0x19,0x5c,0x6f,0xa0,0x18,0x9f,0x79,0x8f,0xff,0xe2,0xd4,0xe0,0x73,0xc0,0x99,0xdc, + 0x85,0x64,0x76,0x42,0x36,0xab,0x20,0xd7,0x97,0x22,0x07,0x7a,0x99,0x3a,0x07,0x53,0x98,0xf8,0x27,0xec, + 0x1d,0x3b,0x61,0xcf,0x1c,0xf6,0x42,0xc5,0xa7,0x05,0x55,0x01,0x89,0xc2,0x9a,0xb9,0x60,0x13,0xcc,0x59, + 0x0e,0x9c,0x29,0xab,0x28,0x34,0xf1,0xd1,0x04,0x9b,0xb0,0xb8,0xa2,0x1f,0x88,0x10,0xae,0xb6,0x0a,0x5d, + 0x60,0x9c,0xb8,0xc3,0xa6,0x0e,0x7b,0x9b,0x57,0xdc,0x1b,0x3b,0x39,0xbe,0xb8,0xf8,0x3e,0x46,0x41,0xfe, + 0xed,0x16,0x92,0x7c,0x57,0x4c,0x18,0xce,0x53,0x2c,0x59,0x4a,0xa3,0xf0,0xac,0xe2,0xab,0x26,0x7e,0x84, + 0x46,0xe3,0x35,0xb1,0x2c,0xd6,0x4f,0x7f,0xf7,0xdf,0x6a,0xd6,0xda,0x11,0xd5,0x3d,0x3c,0xc7,0x4d,0x88, + 0x5f,0xf3,0x16,0x66,0xfa,0xa4,0x72,0xf4,0xa0,0xda,0x78,0x99,0x49,0x50,0x8b,0xf3,0x80,0xbd,0x80,0x3d, + 0x66,0xa6,0x94,0x6e,0xa2,0xbd,0x45,0x26,0x33,0xb7,0x9f,0x05,0xc5,0xe8,0x0a,0x0b,0x2a,0x36,0xd6,0x23, + 0x8c,0x85,0x8d,0x78,0xa8,0x48,0x6c,0x3e,0xd9,0x3c,0x7c,0x3e,0xa0,0xd5,0xa0,0x60,0x35,0x9e,0x05,0xc6, + 0xc5,0x09,0x9a,0x5e,0x60,0xe2,0x14,0xa0,0x95,0x0c,0x73,0xa1,0x00,0x77,0x8a,0x43,0x46,0xb9,0x1a,0x1d, + 0xb4,0xca,0x21,0x32,0xba,0x6f,0xb7,0x5e,0xc0,0x28,0x4a,0x26,0x7f,0x60,0x32,0x9d,0xc2,0x24,0x17,0x38, + 0x2f,0xee,0x0d,0x8a,0x19,0x4e,0x7e,0x9e,0xa4,0xcd,0xbb,0x61,0x4b,0xd5,0x29,0x36,0x7d,0x2a,0xbd,0x41, + 0x32,0x95,0xcc,0x9e,0x94,0x9a,0xfc,0x26,0x89,0x9e,0x5b,0xb2,0x2a,0xaf,0x08,0x64,0xf7,0x1d,0x0e,0xfa, + 0x95,0xf7,0x0e,0x18,0x53,0x11,0x6a,0x2d,0x6c,0x29,0x52,0x2c,0x7e,0x27,0xaa,0xf4,0xf5,0x75,0x9a,0x4c, + 0x49,0x3a,0x1e,0x90,0x89,0xab,0xcc,0x45,0xb0,0x05,0x66,0x9b,0x4b,0xec,0x49,0xc0,0xba,0x3a,0xd1,0xe6, + 0xeb,0xd3,0xb3,0xf3,0xd3,0xa7,0xde,0x48,0x21,0x12,0xca,0x8c,0x16,0x27,0xb0,0x75,0xc6,0x06,0x06,0x72, + 0x90,0x5c,0x06,0x4f,0xf9,0xec,0x63,0xee,0x9f,0xbc,0x82,0x0e,0xf3,0x8f,0x05,0x8c,0xf2,0x57,0xb8,0x3b, + 0x3b,0x19,0xcf,0x64,0xc1,0x44,0x7e,0x11,0x37,0x6b,0x8a,0x5f,0x94,0xeb,0x4c,0xfc,0x3e,0xc3,0x2c,0x20, + 0x26,0xef,0xde,0x6e,0xb5,0xbe,0xb3,0x6d,0x55,0xf6,0x4c,0xe0,0x9e,0x13,0x38,0x4c,0x93,0xe7,0x0c,0x19, + 0xe2,0x00,0x15,0x0d,0xbd,0xfc,0x0b,0x8c,0xb4,0x58,0xa3,0x8c,0xf9,0x63,0x78,0xc0,0x73,0x8b,0x36,0x61, + 0xca,0x30,0x09,0x92,0x1d,0x8d,0x82,0x31,0x55,0xe6,0xc0,0x2f,0x12,0x5b,0xb2,0xb1,0xe7,0xcb,0x9c,0x69, + 0xf8,0x74,0x65,0xd6,0x1c,0x46,0xb5,0xd7,0xef,0x5f,0xbe,0x3c,0x3e,0x79,0x79,0xea,0xd0,0x15,0xaa,0xab, + 0x49,0x82,0xc2,0xa2,0x28,0xd1,0xc2,0x1f,0x4f,0x16,0x81,0xdf,0x3a,0x85,0x60,0x15,0x9a,0x8e,0x18,0x3a, + 0x3c,0xbb,0x28,0x12,0x80,0xc3,0x5f,0x81,0x4c,0x70,0x86,0xd8,0xff,0x11,0x47,0xec,0x4b,0x95,0x97,0x24, + 0xdc,0xf6,0x97,0x33,0xbd,0x78,0xbf,0x06,0x4a,0x67,0x50,0x5d,0xa5,0x9d,0xbb,0x8d,0xc2,0xa2,0xbe,0xa2, + 0x8c,0x60,0x8c,0xda,0xbc,0xbf,0xcf,0x83,0xf8,0x80,0x4c,0x18,0x79,0xa5,0xd9,0x7f,0x48,0x4a,0x37,0x56, + 0x55,0x48,0xe2,0xe0,0xab,0xb4,0x6f,0x7f,0x31,0xc0,0x1f,0xe9,0x65,0x27,0xbb,0xf1,0x16,0xb3,0x45,0x04, + 0x4c,0xa7,0x37,0x94,0x32,0xf4,0xdd,0x0a,0x24,0xa6,0x3b,0x63,0x1d,0x8d,0x7c,0x16,0x56,0x2c,0x18,0xd8, + 0xe2,0xe8,0xf4,0x4c,0x6b,0x19,0xb9,0x5a,0xdf,0x11,0x0b,0xdb,0x0b,0x15,0x14,0xb6,0xcc,0xa1,0x23,0x9f, + 0x8b,0x4b,0xa0,0x8f,0x88,0xd3,0xc5,0xad,0xf5,0xe5,0xd2,0xb4,0xf6,0x0b,0xaf,0xc8,0xf5,0xee,0xdd,0xd1, + 0x5a,0x77,0xc3,0x3d,0xd8,0x10,0x2b,0x0e,0xf2,0x2d,0x57,0x01,0x5f,0xea,0xdc,0xa4,0x02,0x5f,0xe4,0x9b, + 0x41,0x4c,0xb4,0xa4,0xd1,0x9e,0x3a,0x14,0x2b,0x9d,0x2f,0x50,0x5c,0xef,0x23,0x89,0x69,0xab,0xcc,0x9b, + 0x6d,0x67,0xec,0x85,0x6e,0x34,0xf2,0x61,0x07,0x98,0x2b,0xbd,0x5e,0x0f,0xa1,0x57,0x6a,0x51,0xfb,0x63, + 0xf1,0x05,0x2b,0x31,0x34,0x94,0x55,0x23,0x72,0x94,0x63,0xa2,0x19,0x03,0x7a,0x7c,0xfe,0xe4,0xb9,0xa1, + 0x35,0xd2,0x79,0x0b,0x22,0x87,0x99,0xaf,0x67,0x0f,0x7a,0x5d,0xe5,0x4b,0xc8,0x80,0x81,0xd4,0x1a,0xab, + 0x15,0xee,0x32,0xe0,0x94,0x12,0x39,0x5c,0x18,0x6f,0x81,0xa0,0xcf,0xec,0xd9,0x8b,0xd3,0x97,0x4f,0xcf, + 0xd8,0xd9,0xe9,0xf9,0xc7,0xef,0xdf,0xbd,0x79,0xff,0xf6,0x0c,0x8e,0x97,0xd9,0x27,0xb4,0x94,0xcd,0xce, + 0xb8,0xf3,0x70,0xae,0xd8,0x9b,0xf7,0xaf,0x9f,0x7e,0xfc,0xcd,0xe9,0x1f,0xce,0x9c,0x4a,0xec,0x2b,0x3a, + 0xac,0xf3,0x9b,0x35,0xda,0x90,0x29,0x52,0x2e,0xe7,0xbf,0x28,0x7c,0xd5,0x8e,0x4a,0xe6,0x46,0x2a,0x3a, + 0x18,0xd0,0xb3,0xcc,0xcf,0xaa,0x61,0xb5,0x78,0x22,0x38,0x12,0xa1,0xc9,0x2d,0xd9,0xed,0x05,0xdd,0x55, + 0x61,0x8f,0x89,0x24,0x61,0x50,0xed,0xe5,0x22,0x8c,0x15,0x8d,0xf9,0x85,0xb8,0x5d,0xa5,0xca,0xfd,0x85, + 0x61,0x57,0x5c,0x43,0xba,0x8a,0xa4,0x62,0xa0,0xe7,0x43,0x81,0xde,0xa2,0x69,0x0a,0x03,0x64,0x6b,0xa4, + 0x3e,0xc4,0xb4,0xcc,0xe4,0x33,0x9e,0x6b,0x51,0x19,0xee,0x81,0xa3,0x1f,0x5a,0x69,0x34,0xbb,0xba,0x05, + 0x89,0x5a,0xe0,0xc2,0x0f,0xce,0xfe,0x70,0xf6,0xac,0x39,0x59,0xfe,0xf8,0x63,0x90,0xfc,0x2e,0x9e,0x03, + 0x93,0xdf,0xbc,0xf4,0x02,0x1b,0x21,0xc0,0x10,0x25,0xcd,0xe2,0x4f,0x90,0x4f,0xa2,0x82,0xb3,0x0b,0x5c, + 0x70,0xd5,0x45,0x29,0x3d,0x8b,0x2a,0x79,0xb3,0xe8,0x56,0x15,0x12,0xf9,0x0a,0xa9,0x48,0xe2,0xc3,0x60, + 0x56,0x15,0xa2,0x07,0xf9,0x62,0x08,0x08,0xb1,0xa9,0x10,0x65,0xfb,0x38,0x8d,0xc8,0x89,0xae,0xf2,0x0b, + 0x98,0xe8,0x1f,0x93,0x5d,0x28,0x56,0x84,0xc4,0xbf,0x54,0x13,0x30,0xa5,0xaf,0x7c,0xcc,0xcd,0x52,0x4b, + 0x6f,0x43,0x18,0xd0,0x1a,0x0c,0x7c,0x0d,0x38,0x9c,0xdd,0xf4,0x2a,0xce,0x6a,0x54,0x34,0x6d,0xde,0x3f, + 0xf7,0x97,0xc0,0x12,0x62,0xb2,0x23,0x2c,0x79,0xf1,0xcf,0xff,0x94,0xd4,0x4e,0xc3,0xe8,0xc7,0x60,0x7e, + 0x3d,0xff,0xe7,0xff,0x3d,0x02,0xf1,0x1e,0x04,0xbc,0x91,0x25,0xb3,0x8b,0x8a,0xbc,0x26,0xe2,0xa7,0xbf, + 0xcc,0xae,0xe8,0x67,0x0e,0xc9,0xf8,0x8e,0x9f,0xa6,0x92,0x40,0x59,0x94,0x63,0x91,0x77,0x4f,0x22,0xb3, + 0xe9,0x8f,0xcd,0xe3,0xb5,0x0d,0xa5,0x77,0x8a,0x9a,0x63,0x66,0xe3,0x82,0x1b,0x2e,0x92,0x98,0xfb,0x51, + 0x42,0x31,0xa4,0xfb,0x2e,0xdf,0x96,0xf8,0xd3,0x21,0x5b,0x1a,0x9e,0x6d,0x8b,0xfb,0xfb,0x7c,0x75,0x18, + 0x28,0xf3,0x17,0xc4,0x7c,0xd3,0xc6,0x68,0xde,0xfa,0x59,0xfe,0x20,0x32,0x72,0xb5,0xaf,0xf3,0x95,0xa4, + 0xa6,0x92,0x60,0x12,0xc7,0x59,0x04,0x2c,0xbd,0x23,0xf1,0xe2,0x8a,0x65,0x27,0x9f,0x0d,0x49,0x3b,0x99, + 0x4c,0xe7,0x71,0x5a,0x69,0x83,0x94,0x4f,0x50,0x76,0xf8,0xc7,0xff,0x15,0x3d,0x0b,0xb7,0x08,0x2d,0x69, + 0x65,0x10,0x75,0xc1,0x0a,0x5a,0x21,0xb2,0xd4,0x92,0x49,0x9a,0x51,0x35,0xeb,0x44,0x97,0xff,0xed,0x3f, + 0xff,0x7f,0xff,0xed,0xef,0xb6,0x48,0x2f,0xfc,0xcb,0xe1,0x38,0x20,0x95,0x39,0x26,0x94,0xdc,0x62,0xe6, + 0x9e,0xc5,0xef,0xe8,0x15,0x4c,0xf9,0xab,0x65,0x8b,0x54,0xdb,0x50,0xd0,0xa1,0x08,0x68,0x12,0x2c,0x2e, + 0x3a,0x12,0x75,0x32,0x1d,0x90,0x64,0xc5,0x5d,0x78,0x2b,0x24,0x0b,0x83,0xf7,0x98,0xa3,0x5a,0x12,0x2a, + 0x2b,0x37,0xb3,0xce,0xbd,0xd8,0x26,0x2f,0x05,0x52,0x1b,0xfe,0x1e,0xd5,0x0b,0xce,0x77,0xe6,0x2d,0x9d, + 0x3a,0xf1,0x2f,0xc9,0x75,0xd8,0x09,0x7c,0xd0,0x30,0x72,0x33,0x07,0x0f,0xe8,0x70,0xf0,0x2f,0x7f,0xf8, + 0xe6,0xf0,0x1b,0xc4,0x91,0xa6,0x4f,0xde,0xdc,0x77,0x98,0xb5,0x05,0xa6,0xe7,0xd8,0x0e,0x8e,0x1c,0xc6, + 0x0c,0xcc,0x87,0x31,0x65,0x84,0x95,0x43,0x36,0x1c,0x16,0x07,0x50,0x3c,0x4d,0xd5,0x93,0xd4,0x71,0x5b, + 0x03,0xe0,0xfd,0xa5,0x7a,0xe6,0xdd,0xe9,0xc9,0x9b,0x37,0xe7,0xfc,0x3c,0xe0,0xe8,0x4a,0x78,0x5c,0xf1, + 0x09,0x83,0x9f,0x3e,0xf4,0x1e,0x71,0xf7,0x31,0xba,0xa8,0xb4,0x64,0x31,0x25,0x2c,0x01,0xf2,0xfb,0xb0, + 0x23,0x74,0xbb,0x96,0x3c,0x49,0x8c,0xbe,0x78,0x66,0x37,0x65,0xe9,0xb4,0x50,0x32,0x95,0xa5,0x52,0xc7, + 0x74,0x1f,0x2b,0x92,0x1c,0xbe,0xc3,0xd7,0x13,0x14,0xb1,0x51,0x26,0xf3,0x25,0x6d,0x88,0xff,0xfe,0x9f, + 0xfe,0xfe,0xbf,0xc2,0x76,0xc8,0x30,0xad,0xac,0x10,0xfb,0x4d,0xd8,0xc8,0x35,0x14,0x64,0x1d,0xf3,0x83, + 0x43,0xc3,0x46,0x9c,0x0e,0x63,0xd6,0xa6,0x64,0xf1,0xfb,0xdc,0xaf,0xe7,0xd6,0x78,0x8c,0xe2,0x76,0x2a, + 0x38,0x21,0xeb,0xc6,0xa7,0x34,0x4c,0x99,0xfc,0xe5,0xf0,0x9e,0xd0,0xc5,0x73,0xb8,0x1a,0xf9,0x54,0xf0, + 0x5d,0x7c,0x6b,0xab,0x8d,0x89,0x96,0x06,0x94,0x41,0x47,0x55,0x96,0x49,0xa9,0x23,0x91,0x45,0x9d,0xfc, + 0x06,0x45,0xeb,0x01,0xf4,0x80,0x67,0xb8,0xd5,0xfc,0x18,0xda,0xf7,0x0a,0x54,0x53,0x8f,0xe5,0xf9,0x1f, + 0xdf,0xbd,0x7f,0x79,0x4a,0x16,0xba,0xa8,0x99,0xfd,0x88,0x00,0x49,0x1c,0x24,0x35,0xfb,0x91,0x66,0x87, + 0xdf,0xf2,0xce,0xff,0xf8,0xec,0xc5,0xbb,0xb3,0x73,0x55,0x0e,0xc1,0x28,0xde,0x9f,0x3f,0xb1,0xb6,0x0e, + 0x26,0x10,0xd7,0x9d,0x1c,0x37,0x84,0x3f,0x60,0x41,0x7f,0x0e,0x66,0x18,0x78,0x18,0x0e,0x61,0x54,0x05, + 0x2f,0x29,0x9d,0x1d,0x2d,0x2c,0xc2,0xc3,0xd7,0x5a,0xe3,0xe1,0x88,0x5f,0xd2,0x28,0x7f,0x9f,0xfb,0xf5, + 0x0c,0x2b,0x81,0x41,0x77,0xf9,0x92,0x92,0x6f,0xd4,0xeb,0xa2,0x11,0xba,0x0b,0xef,0x0b,0x0c,0x4a,0x7c, + 0xed,0x6d,0xe1,0xa7,0xaa,0x22,0x70,0x5c,0xdd,0x11,0x96,0x78,0x9b,0x96,0x00,0xd0,0xa3,0x2a,0xa6,0x17, + 0x9f,0x39,0x2c,0x69,0xca,0x34,0xc1,0xd8,0x0f,0xc1,0x5a,0xc2,0x48,0xea,0xfb,0x20,0x89,0xdf,0x16,0x5d, + 0xee,0xb8,0x67,0x89,0xd3,0x34,0xf0,0x49,0x3d,0xcd,0x98,0x42,0xa5,0x74,0xe0,0x27,0x01,0x8c,0x9b,0xa8, + 0xf6,0x7d,0x38,0xa3,0x5a,0xf5,0x83,0xaf,0xaa,0xf7,0x3d,0x46,0xfe,0xf0,0xa9,0x8b,0xbd,0xc4,0xa4,0x23, + 0x3e,0xbf,0x28,0xd6,0xf4,0x0d,0xac,0x6a,0x81,0xe6,0x29,0x72,0xbd,0x60,0x96,0x81,0x0d,0xb9,0x85,0xc8, + 0x60,0xcb,0x01,0x2d,0x57,0x68,0x3e,0x2e,0x3a,0x19,0x42,0x6f,0x53,0xec,0x19,0x62,0xdb,0xc3,0x56,0xce, + 0x6d,0x85,0x45,0x84,0xd8,0xf7,0x7c,0xbf,0xf0,0xdf,0xb4,0x5d,0x82,0xb1,0xc3,0x43,0x08,0xb9,0x3f,0x30, + 0xcf,0x43,0x42,0x11,0x67,0xb8,0xa3,0x68,0x42,0xb1,0x2c,0xa1,0x0f,0x61,0x41,0xee,0x46,0x6e,0x3b,0x2b, + 0x09,0xb1,0xad,0xa6,0x4b,0x1b,0xa7,0x37,0x7d,0x2e,0x65,0x8f,0x23,0xd7,0x93,0xf9,0xb6,0x0f,0x25,0xd8, + 0x94,0xaf,0xfa,0xc6,0x9b,0x3f,0x9f,0x51,0xf4,0x12,0xff,0x4a,0x79,0xa5,0xbf,0x93,0xbe,0xe9,0x15,0xf4, + 0x00,0xb6,0xd1,0x19,0x19,0xc8,0x53,0x9a,0x7a,0xfc,0x41,0xb3,0xae,0x74,0x4d,0x05,0x58,0x35,0x6e,0xd5, + 0xac,0xf6,0x32,0xac,0x96,0x60,0x06,0x4a,0xea,0xc9,0xf2,0xed,0x66,0xbc,0xa1,0x15,0xdb,0xd7,0xba,0xac, + 0xa9,0xc7,0xb7,0x57,0xbd,0x6e,0x05,0xe9,0xa2,0xdb,0xa1,0x53,0x9e,0x6f,0xb8,0x34,0x9e,0x72,0x51,0x76, + 0xd3,0xa0,0xd2,0x6e,0xe6,0x21,0x10,0x7a,0x50,0xef,0x96,0x73,0x3f,0xfa,0x31,0x74,0xef,0x16,0x61,0xf4, + 0xca,0x47,0x53,0x96,0xdb,0xed,0x30,0xb8,0x38,0xc9,0x22,0xcc,0x49,0xe0,0x76,0xfa,0xe2,0x8a,0xd7,0xe6, + 0x76,0x0e,0xc4,0xf5,0x3b,0x4a,0x66,0xd2,0xee,0xd1,0x25,0x4f,0xb6,0xe9,0x76,0xe9,0xea,0xe5,0x2c,0x71, + 0xbb,0xfb,0x74,0x9f,0x38,0x78,0xb7,0x4d,0x17,0x2f,0x3a,0xd3,0xb3,0x99,0xef,0x76,0xda,0xf2,0x62,0x3a, + 0x77,0x3b,0xd4,0xd6,0xd3,0x8b,0x77,0x9f,0xdd,0x4e,0x97,0xff,0x3c,0xff,0xec,0xb6,0x0f,0x99,0x14,0x57, + 0xdc,0x9d,0x36,0x1c,0xd3,0x64,0x63,0xeb,0x98,0x9d,0xe4,0xb5,0xac,0xeb,0x64,0xbb,0x9f,0xeb,0xe4,0xbe, + 0xd9,0xc7,0xdd,0xb6,0xea,0x63,0xdf,0xe8,0xe3,0x6e,0xdb,0xe8,0x63,0xfb,0xe0,0xeb,0xfa,0xd8,0x42,0xc0, + 0x19,0xcf,0x8e,0x80,0xa9,0x53,0xbc,0x44,0x5a,0x56,0xb2,0x47,0x9a,0x9f,0xda,0xc2,0xa9,0x16,0xb9,0xa6, + 0x51,0x88,0x6e,0xec,0x42,0xca,0xb0,0x47,0xb0,0x40,0xc6,0x58,0x2c,0x21,0x5d,0x1d,0xfe,0xdb,0xa4,0x6c, + 0xc2,0x19,0x0f,0xf5,0x95,0xdb,0x4f,0x3b,0xae,0x60,0x3e,0xd3,0x20,0x3b,0xc6,0xb8,0x0c,0x0e,0x48,0x05, + 0x47,0xc0,0x6a,0x30,0xfd,0x3a,0xda,0x40,0x75,0x08,0xda,0x40,0xbf,0x69,0xcf,0x44,0xfa,0xd9,0x7b,0x5a, + 0x4b,0xc8,0xaa,0x2f,0xe5,0x2f,0xe3,0xe9,0x31,0x9f,0x45,0xe2,0xe4,0xe5,0xcf,0xb1,0xd2,0x6c,0xcd,0xe0, + 0x44,0xda,0xb6,0x7a,0x6b,0xa2,0x7f,0x8a,0x0c,0x22,0x25,0x16,0x5b,0x00,0x9b,0x48,0x3e,0x61,0x08,0x1c, + 0x7a,0xfc,0x4b,0xa0,0x0d,0x13,0x65,0x1e,0x83,0x51,0x0b,0x85,0x4d,0x69,0x9c,0x67,0x1e,0xcd,0x9a,0xb7, + 0x57,0x5f,0x98,0xcd,0x93,0x93,0xd2,0x85,0xc3,0x6b,0x94,0xd1,0xb6,0xcd,0x79,0x4c,0x6e,0x94,0x57,0xe1, + 0x10,0x7f,0xbb,0xf8,0x4f,0xc3,0xfa,0xe9,0xdf,0xfe,0xbd,0xd5,0xc0,0x9b,0x3c,0x8f,0xba,0xe0,0x92,0xf2, + 0xc3,0x17,0x46,0xef,0x44,0xb3,0x38,0x6c,0xa8,0x52,0x1e,0x73,0x68,0x24,0x39,0x9d,0xd6,0xf7,0x6f,0x5f, + 0xbc,0x41,0x1f,0x13,0x01,0x62,0xc2,0x6a,0x52,0x1c,0x0b,0xf2,0x80,0xc1,0x6c,0x34,0xe6,0x3a,0x14,0xfe, + 0x39,0xce,0xdd,0x7a,0xd2,0x1c,0x46,0xef,0x53,0xa0,0xcb,0x8a,0xf7,0x0a,0xf0,0xcc,0x31,0xb6,0x0a,0x8e, + 0x62,0xa0,0x0e,0xee,0x24,0x9b,0x22,0x62,0x8d,0x91,0xd4,0xaf,0x94,0x9e,0x8e,0x22,0xe6,0x9c,0x41,0xe5, + 0x61,0xda,0x9c,0xa3,0x39,0xd6,0x48,0x93,0xb2,0xb6,0x5f,0xbf,0xf7,0xaf,0x03,0xe8,0x1b,0x1c,0x18,0x19, + 0x7c,0x89,0x71,0x60,0x10,0x8b,0x16,0x44,0x78,0xc6,0xeb,0x33,0xa3,0xcc,0x58,0xb5,0x4a,0x7a,0x2d,0xc5, + 0x8b,0xa1,0x73,0x38,0x79,0xa9,0x19,0x21,0xcc,0x8e,0x81,0x73,0xb6,0xc8,0xa5,0xa9,0xe7,0x74,0x79,0x4f, + 0xf2,0x75,0x3a,0x08,0x36,0xef,0xda,0x98,0xf3,0xb1,0xa3,0x98,0xfb,0x62,0x1b,0xa8,0xbb,0x37,0x1c,0xf7, + 0xb0,0x3a,0x0a,0x8f,0xc6,0xe0,0x6c,0x15,0x4d,0x8f,0xdf,0xaf,0x2c,0x67,0x1c,0x46,0x0f,0x76,0xe9,0x91, + 0xa6,0xf1,0xaf,0x7e,0x7b,0xfa,0xee,0x9d,0x77,0x17,0xc5,0xc8,0xd6,0xba,0x70,0x38,0x81,0xf8,0xcd,0x79, + 0x5d,0x64,0x62,0x40,0x14,0x7f,0x86,0x8a,0x0b,0x7a,0x80,0x0c,0x0a,0xc6,0x63,0x5e,0x20,0x24,0x16,0xdd, + 0x79,0xc7,0x7f,0x5b,0x30,0x5c,0xb3,0x27,0x66,0xfe,0x08,0x78,0x86,0x11,0x46,0x58,0x9a,0x67,0x62,0x10, + 0xc5,0x45,0x5a,0x06,0x26,0xcf,0x24,0xbc,0x2b,0xba,0x6a,0x31,0x90,0xad,0xf9,0x9d,0x97,0xd8,0xd0,0x8a, + 0xbd,0xfa,0xed,0xd9,0xf9,0xf1,0xf9,0xa9,0x77,0xa7,0x22,0x1e,0xe1,0x21,0xe5,0x08,0x8c,0x79,0xd8,0x2f, + 0x5e,0x73,0x03,0xab,0x08,0x5a,0x82,0xef,0xc7,0x7b,0x13,0x8c,0x2b,0x92,0xf7,0xf8,0x6b,0x4b,0x58,0x43, + 0xda,0xf8,0x62,0x1e,0x7c,0x22,0xe5,0x49,0xa4,0x71,0x42,0x4a,0x68,0xe1,0x62,0xfc,0x4d,0xc8,0x6b,0xce, + 0x09,0x68,0x96,0x78,0x94,0xd9,0xa2,0xbb,0xa3,0x88,0xbb,0xb8,0xa1,0x78,0x2c,0xba,0xe7,0x8c,0x07,0x96, + 0xea,0x0d,0x65,0x89,0x90,0x5e,0x70,0x11,0xa2,0x3c,0x2d,0x60,0xa3,0x65,0xe8,0x11,0xc7,0x93,0xb9,0xa9, + 0x5b,0x88,0xc6,0x4c,0x36,0x2f,0xf5,0x8c,0x26,0x6b,0x24,0xee,0x8e,0x87,0x59,0xe1,0x06,0x90,0x29,0x65, + 0x24,0x83,0xaf,0x80,0x15,0xf8,0x22,0x7a,0x95,0x3e,0x6e,0xa9,0xf7,0x89,0xfb,0x78,0x87,0x0f,0x44,0xe0, + 0x2c,0x99,0x8b,0xa6,0x41,0x38,0xb7,0x8d,0x17,0x84,0x9b,0x58,0x0d,0xf9,0x95,0x8a,0x8f,0x6e,0xd8,0x95, + 0x1f,0x33,0xb4,0x38,0x07,0x48,0x69,0x1c,0x29,0x28,0x3b,0xf7,0x0c,0xf1,0xc1,0x29,0x04,0xa0,0x3c,0xbe, + 0x7e,0x8e,0xd4,0xe4,0xb3,0xd3,0xe4,0x78,0x39,0x33,0x20,0xa1,0x84,0xc1,0xbf,0x80,0x6e,0xde,0xc6,0xc9, + 0xac,0x32,0xcd,0x64,0x05,0xce,0x3f,0xf7,0xdf,0xd6,0x19,0x59,0x4a,0xda,0x1e,0xf9,0xe8,0xe5,0x64,0x4e, + 0x2a,0x35,0xbf,0xd2,0x86,0x0d,0xa5,0x9e,0xcc,0x03,0x3f,0xd1,0xca,0x25,0x15,0xf0,0x8c,0x61,0x76,0x53, + 0x82,0x80,0x78,0x9f,0xcc,0xf1,0x6c,0xdc,0x1e,0xd9,0x0c,0xaf,0x7c,0x1f,0x90,0xb4,0x97,0x6e,0xe0,0x3e, + 0x35,0xa6,0x82,0x01,0xa4,0xb5,0xb3,0x63,0x64,0x97,0x49,0xab,0xa6,0xcd,0x98,0x22,0xf4,0x37,0xaf,0x40, + 0x50,0x87,0x12,0x50,0xc9,0x1b,0x0c,0xe0,0xc0,0xbf,0x30,0x72,0xc4,0x5c,0x6b,0x9a,0x13,0x18,0xa1,0xef, + 0x32,0xde,0x25,0x18,0x56,0xb8,0x27,0x3d,0x17,0x7d,0xf1,0x02,0x57,0x18,0x04,0x37,0x14,0xd2,0x0a,0xe8, + 0x7c,0x02,0x35,0x23,0x5f,0x8e,0x66,0x2c,0x30,0x78,0x9e,0xd7,0xf2,0xcc,0x0f,0xe7,0x0a,0x6b,0x76,0xa5, + 0xfd,0xd1,0x11,0x20,0x34,0xda,0x80,0x4d,0x9c,0xc3,0x6b,0x89,0xf2,0x7e,0xee,0x3a,0x49,0x1b,0x7e,0x5f, + 0xbd,0x2e,0x9b,0xe5,0x23,0x83,0x0d,0x93,0xa7,0x9d,0x9c,0x75,0xc9,0xda,0x44,0x5f,0xe9,0xfe,0x8c,0x3b, + 0x1f,0xfd,0x94,0x6d,0xce,0x3e,0x6d,0x66,0xcd,0x22,0x8d,0x95,0x1c,0xdb,0x30,0x75,0xba,0x57,0xa5,0x7e, + 0x24,0xb6,0x16,0x77,0x02,0xad,0x9d,0xc0,0x90,0x5e,0xb1,0xbc,0xc4,0x5e,0xe2,0x4c,0x95,0xbe,0x2e,0xeb, + 0x28,0x72,0xcb,0x9f,0x19,0x37,0xa8,0x68,0x8a,0x49,0x5f,0x50,0x05,0x52,0x78,0x05,0x56,0xaf,0xf9,0xc2, + 0xf7,0x82,0x65,0x0b,0x51,0x5b,0x31,0x20,0xe7,0x1f,0x8c,0x64,0x16,0xb2,0x36,0x66,0xa2,0x2c,0xdc,0xc2, + 0xc0,0xd2,0xea,0x2c,0x84,0xdc,0x09,0xa4,0x80,0x0a,0x36,0x6c,0xda,0x77,0x25,0xe8,0x71,0x26,0x90,0xc2, + 0xc8,0x98,0x47,0x69,0x6c,0x55,0x74,0x8a,0x49,0x5d,0x74,0xd7,0x29,0x78,0x8a,0xf9,0x6a,0xf9,0x95,0xfd, + 0xa8,0xb8,0x4a,0xb5,0x74,0x1f,0xb9,0x8f,0xaa,0xdb,0xed,0xa2,0x3f,0x2c,0x0c,0xd4,0xb0,0xd2,0x63,0x06, + 0x0a,0xfa,0x9c,0xbb,0x84,0x21,0x1b,0xae,0x61,0x7e,0x58,0x26,0x8b,0x94,0xd5,0xea,0x19,0x7a,0x5f,0xe6, + 0xf0,0xf6,0x17,0x49,0x7c,0x89,0x69,0xd9,0xf1,0xcb,0xf2,0xb2,0x6c,0xa8,0x73,0xda,0x71,0xd7,0xae,0xd6, + 0xaf,0xd7,0xe4,0x04,0xc6,0x0f,0x06,0x4e,0x07,0xfd,0x17,0xaa,0x15,0xd0,0x15,0xc4,0x09,0x49,0x98,0xc6, + 0xf5,0xba,0x83,0x1a,0xdc,0x8c,0xa5,0x57,0xd4,0x0b,0xe9,0xee,0x42,0xcd,0x7a,0x16,0xb4,0x8b,0x09,0x22, + 0x0b,0x7a,0xc6,0x15,0xe6,0x0e,0x09,0x78,0x7e,0xc9,0x2a,0xad,0x39,0x23,0x76,0xb9,0x58,0x19,0xf9,0x39, + 0x64,0x4e,0x33,0xe3,0x4a,0x22,0xbb,0x0d,0x47,0x17,0x7c,0xd6,0x4a,0xf0,0x37,0xef,0x4e,0x5f,0x9e,0x1e, + 0x9f,0x9d,0x9e,0x21,0xb6,0xa5,0xa7,0x21,0x28,0x16,0x61,0xf3,0x32,0xcc,0x60,0x85,0x02,0x9b,0x7d,0x03, + 0xcc,0x18,0xf0,0x68,0x7b,0x27,0xb0,0xc9,0x80,0x3d,0x9f,0x06,0x89,0x80,0xa8,0xd8,0x8d,0x2e,0xf7,0x44, + 0x90,0x7d,0xba,0x37,0x47,0xd4,0x00,0x38,0x6e,0xde,0x9c,0x1f,0x7f,0x3c,0x81,0x1a,0x75,0x65,0x13,0xf5, + 0x9e,0xac,0x33,0x8c,0x8d,0x1a,0x2e,0x04,0xa6,0xc0,0x5e,0x9c,0xf9,0x7b,0x16,0xe9,0xc1,0xe5,0x2d,0x0c, + 0x80,0xd6,0x91,0x47,0xef,0xdf,0x92,0xc5,0xce,0x13,0xc2,0x8a,0x88,0x84,0x66,0x78,0xfb,0xfc,0xfc,0xe5, + 0xc7,0x57,0x67,0x5e,0xa7,0xdd,0x0f,0xf6,0xd9,0xa7,0x20,0x79,0x8b,0x66,0x6a,0xcf,0xc8,0x0a,0x40,0xa1, + 0x6f,0x06,0x64,0xd3,0x27,0x42,0x6b,0x32,0xb2,0x9b,0x4b,0x8d,0x1b,0xa5,0x13,0x7e,0x81,0x5e,0x37,0xac, + 0xdd,0x42,0xc5,0xbc,0x71,0x9c,0x40,0xc5,0xaf,0x83,0x5b,0xca,0x84,0x69,0xf8,0xa2,0xc8,0xe6,0x10,0x2e, + 0xdb,0xd7,0x57,0x99,0xce,0xa8,0x1a,0x78,0xad,0x41,0xf0,0xa8,0x3b,0x08,0x38,0x34,0xbf,0xb0,0x97,0xb7, + 0x50,0xb9,0x68,0xfb,0xe2,0xb7,0x60,0xaf,0xd4,0xb3,0xc7,0xea,0xc9,0x40,0x42,0x98,0xeb,0x25,0x0c,0xcc, + 0xf9,0x13,0x4c,0x35,0x36,0xb3,0xf3,0xa6,0x4f,0xf2,0xc4,0xa7,0x2f,0xb0,0x73,0xc7,0x09,0x1c,0xab,0x2f, + 0xd0,0xbe,0x2c,0x46,0x10,0x35,0x96,0xb8,0x5f,0xb8,0xee,0x01,0xd8,0xac,0xa7,0x28,0x0f,0x44,0xb8,0x12, + 0x77,0xe1,0xec,0xc9,0x1e,0xe9,0x21,0x55,0x5c,0x9f,0x61,0x04,0x35,0xf3,0x6c,0x17,0x78,0x7e,0xec,0x18, + 0x72,0x11,0xc2,0xff,0x1c,0xa1,0x4c,0x23,0x20,0x3e,0x97,0x3e,0x74,0x04,0x24,0x8f,0x97,0xc0,0xf6,0x54, + 0x61,0x2f,0xc0,0x6b,0x17,0x74,0x58,0x69,0xa1,0xc8,0xcc,0xd3,0x66,0xae,0x51,0xe0,0x1d,0x64,0xa8,0x90, + 0x4c,0x3e,0x67,0x82,0x1b,0x7c,0x8a,0x66,0x62,0x91,0x35,0x04,0xce,0x41,0x29,0x27,0xdb,0xa6,0x4c,0x6c, + 0x41,0x4f,0x00,0x1b,0xec,0x04,0x98,0x13,0xad,0xdc,0x55,0x9e,0x67,0x4d,0xe6,0x39,0xab,0xd7,0xad,0x16, + 0x3f,0xb3,0x44,0xa7,0x86,0x24,0xa5,0x5a,0x9f,0x77,0x13,0x18,0xd1,0x79,0x78,0x13,0x66,0xbb,0x49,0x80, + 0x12,0x14,0x49,0x1e,0xf7,0xf7,0xbd,0xce,0x91,0xf1,0xfa,0x10,0x3f,0x1c,0x4b,0xc2,0x89,0x59,0x1a,0x02, + 0x0d,0xf3,0xcf,0x33,0xa2,0xc1,0xda,0xba,0x2b,0xf9,0x22,0xc1,0xb9,0x9a,0xc2,0xae,0xe7,0xfe,0x34,0x14, + 0xa2,0x2c,0xc2,0x5f,0x60,0xf1,0xd0,0xcf,0x31,0x34,0x36,0x41,0x19,0x3d,0x48,0x3e,0x4a,0x30,0xe5,0x8f, + 0xcb,0x64,0xae,0x91,0x62,0xef,0xfc,0xcc,0xd5,0xf3,0x8f,0x9b,0x07,0x8d,0x0c,0xae,0xca,0x63,0x92,0xf9, + 0x97,0x1f,0xb1,0xa6,0xea,0x1d,0xc4,0x96,0xc4,0xfa,0xb8,0x3b,0x51,0x73,0x86,0x4e,0x74,0x20,0xac,0x12, + 0x94,0x87,0x20,0x0b,0x6c,0xb1,0x9c,0xcc,0xc3,0x14,0x56,0xaa,0xae,0x50,0xdd,0xfa,0xe8,0x67,0xbc,0x52, + 0x89,0xaf,0x01,0x1b,0x8e,0x11,0x46,0x0c,0xf0,0xe9,0x57,0xd9,0xcd,0x1c,0x3b,0x4a,0x2e,0x5c,0xfc,0x23, + 0x5d,0x7f,0x55,0xf6,0x70,0x4f,0xf3,0x4b,0x9b,0x15,0x82,0x51,0x42,0x13,0xeb,0x41,0xae,0xdc,0x30,0xb7, + 0x93,0x8e,0xa5,0x5d,0xd5,0x8c,0x7b,0x29,0xa9,0x19,0xc5,0xb8,0xa8,0x58,0x15,0x1c,0x6b,0xfe,0xed,0xc0, + 0x6e,0xd4,0xeb,0x9a,0x34,0xc8,0x92,0x40,0x22,0x86,0x1c,0xb2,0x5f,0x50,0x5a,0x24,0x8c,0x2f,0x5e,0x1d, + 0x7f,0x7f,0x7a,0xe6,0x8d,0x2c,0x49,0xe1,0x76,0x15,0x1d,0x6c,0x4e,0xc2,0x08,0xdd,0x71,0x4b,0x0f,0x76, + 0xd3,0xee,0x6e,0x3c,0xcd,0x60,0x99,0x6e,0x2a,0xf1,0xe7,0xa5,0x3f,0xa3,0x02,0x63,0x26,0xe6,0x9b,0xd3, + 0x47,0x2f,0xc7,0xcd,0x95,0x3e,0x8b,0x8b,0xf9,0x2f,0x10,0xaf,0x5c,0xd2,0x19,0x98,0x69,0xdd,0x55,0x8d, + 0xbb,0x1b,0x94,0x63,0x23,0xe5,0x82,0x92,0xa8,0x30,0x79,0xa3,0xf3,0xc6,0xb6,0x70,0x8b,0x55,0xb5,0xe2, + 0x3b,0x6b,0xe8,0x43,0x84,0x86,0x5a,0x8a,0x72,0x32,0x96,0x6e,0x45,0x4e,0xc6,0xaf,0xda,0xee,0x1d,0xdc, + 0xef,0x2c,0xcd,0x11,0x1b,0x79,0x7e,0x35,0x2c,0x72,0xc0,0xa7,0xdd,0x87,0xe9,0x81,0x78,0x30,0x7f,0x35, + 0x55,0xa8,0xee,0x60,0x22,0xea,0x4d,0xe5,0x0e,0x46,0xf3,0x02,0x5f,0xca,0xf5,0xba,0xfc,0x35,0xf2,0x09, + 0x45,0x39,0x91,0xcb,0x06,0xce,0x04,0xeb,0x13,0x06,0x05,0x89,0x6b,0xca,0x65,0xf8,0xe9,0xc3,0xac,0xf1, + 0xa1,0x29,0xff,0x91,0x01,0xa3,0xea,0x1d,0x34,0x56,0xc6,0x0f,0xe8,0x16,0x7e,0x41,0x65,0x26,0xc5,0xb8, + 0x89,0xd9,0x76,0xa1,0x1a,0xfe,0xe3,0x51,0x67,0xbf,0x2f,0x7f,0x3f,0x6e,0xf7,0x0f,0x0e,0x0e,0xe0,0x60, + 0x5d,0x9b,0x54,0x31,0x96,0x49,0x04,0xd7,0xf4,0x00,0xc4,0x2b,0x1e,0xc2,0x6b,0x58,0x1a,0xaa,0xc6,0x5b, + 0x7d,0x0e,0x65,0xdc,0xf4,0xe5,0x90,0xcf,0xab,0x86,0xdc,0x7a,0x7e,0x7e,0xfe,0x16,0xe4,0xf3,0xb9,0x4c, + 0x78,0x39,0x90,0x1a,0xf9,0x39,0xc7,0xc9,0x04,0x32,0xfc,0x8e,0x48,0x32,0xe6,0xf3,0x26,0x65,0xe3,0xfb, + 0x30,0xca,0x0e,0x79,0xbc,0x92,0xf8,0x5c,0x62,0x35,0x16,0x1e,0x87,0xdc,0x27,0x04,0x3c,0x89,0x71,0x77, + 0x37,0x8b,0x31,0xaf,0xb2,0x90,0x81,0x55,0x80,0x2c,0xa6,0xef,0x42,0xfd,0x10,0x9d,0x9a,0x0e,0xa5,0xb5, + 0xc0,0x9f,0x8b,0x86,0x44,0xce,0x7b,0x3c,0x93,0x7a,0xce,0xad,0x43,0x31,0xe3,0x38,0x75,0x6c,0xe1,0xb0, + 0x45,0xc3,0x93,0x15,0xb0,0xc8,0x5e,0xec,0xa9,0x4a,0x56,0x0a,0x50,0x46,0xb6,0xcf,0x91,0x18,0x6c,0x52, + 0x35,0x2e,0x60,0xa9,0xf0,0x2f,0xb9,0xbf,0xef,0x74,0xbb,0x70,0x35,0x1b,0xb5,0x80,0x63,0x30,0x92,0xdc, + 0xce,0x1c,0x5e,0x66,0x6d,0x92,0xc7,0x7c,0x9f,0xe4,0xc1,0x0e,0x25,0x9e,0xc1,0x2d,0x7b,0x34,0x1b,0x33, + 0x5f,0xea,0x0f,0xcc,0x53,0x16,0xc8,0x51,0x90,0xc1,0x06,0x83,0x11,0xb8,0xc9,0x65,0x32,0xe2,0x5b,0x9c, + 0x64,0x06,0xe1,0xca,0x66,0x66,0x13,0xf2,0xab,0x63,0x4c,0xc3,0x19,0x1d,0x7f,0xbb,0xc2,0xf1,0xba,0x1c, + 0x07,0x02,0x0f,0xa7,0x57,0xd7,0x22,0xb2,0x43,0x5e,0x38,0x42,0xf8,0x1b,0x22,0x3e,0xbc,0x9b,0x50,0x94, + 0x0f,0xdd,0xda,0xd9,0x89,0x4c,0x55,0x83,0xac,0x9d,0x0e,0x16,0xc5,0xae,0x2f,0x40,0xa4,0x44,0x6d,0x58, + 0x6f,0xf1,0x79,0x80,0xca,0x98,0x5d,0x91,0x0a,0xbe,0x65,0x31,0x0e,0xc6,0xf6,0x8d,0xb5,0x45,0x1f,0xa1, + 0x1d,0x62,0xf8,0x2e,0xa3,0x60,0x93,0x8a,0x9e,0x8b,0x47,0x79,0xbc,0x85,0xbc,0xfe,0x42,0x76,0x91,0xaf, + 0x65,0xa0,0x61,0x39,0xe1,0xc6,0xaa,0xc0,0x8a,0x14,0x40,0x23,0x26,0x9f,0x2c,0xc3,0xf9,0x72,0x23,0x9e, + 0x78,0x06,0xab,0xc8,0xf3,0x0a,0x15,0xf0,0xfb,0xc4,0x9e,0x13,0xfa,0x2e,0x7b,0xdd,0xb9,0x47,0x07,0x35, + 0x83,0x95,0x96,0xa0,0x6e,0xdb,0xc4,0xa2,0x0c,0xc8,0x27,0xa2,0x50,0x2b,0x4d,0x92,0xc4,0xa3,0x34,0x22, + 0xce,0x6b,0xb1,0x97,0x3f,0x71,0x87,0x7c,0x65,0x6b,0xbe,0xd1,0x4d,0x30,0xff,0xe3,0xc6,0xb3,0x23,0x1e, + 0x56,0x36,0x18,0x61,0x72,0x11,0xc5,0xa0,0x58,0x77,0x9f,0x56,0x16,0x8b,0x15,0x89,0x6c,0xc0,0xae,0x57, + 0x9c,0xc7,0x90,0xb2,0xc6,0x19,0x37,0x28,0x71,0x1c,0x7e,0xe1,0xbc,0x5e,0x8f,0x25,0x65,0x9e,0xa3,0xd7, + 0x75,0xee,0x30,0xb5,0x9d,0xa1,0x1d,0x79,0x71,0x4e,0xe5,0xd3,0x76,0xdc,0x5c,0x6f,0x1a,0x9e,0x55,0xfb, + 0xe9,0xdf,0x52,0xae,0xc3,0x8c,0x72,0x7b,0xe3,0x9a,0xae,0x85,0x59,0x5a,0x6b,0x2e,0x2f,0x3a,0x35,0xf4, + 0xbe,0xad,0xbd,0x3f,0x3b,0x69,0xde,0xcf,0xc2,0x80,0xdf,0xfa,0xe7,0x7f,0x9a,0xf0,0x7b,0x32,0x3b,0x47, + 0x08,0xec,0x53,0xd4,0x24,0x8d,0x99,0xc2,0x3b,0x8c,0x39,0x7a,0x9e,0xba,0x73,0x7f,0x6f,0xc3,0x4f,0x58, + 0xaa,0x5e,0x2c,0x71,0xf5,0xdc,0xea,0x79,0x58,0x26,0xa5,0x61,0xd9,0x3c,0xcb,0xba,0x51,0x33,0x70,0xee, + 0x97,0xad,0x1c,0xa3,0x4e,0x56,0x08,0x43,0x40,0xe3,0x8d,0xad,0x38,0x61,0x84,0xaf,0x16,0x0f,0x5c,0x53, + 0x32,0x20,0xd7,0x0d,0xbf,0xd0,0x87,0x88,0x38,0x68,0x49,0x37,0x5c,0x45,0x1b,0xc8,0xf3,0x64,0x5d,0xa6, + 0xbf,0x5c,0x25,0x79,0xf5,0x5d,0x7b,0xa5,0x58,0x44,0xa3,0xbf,0x09,0x46,0x38,0xb1,0xbf,0xb8,0xd2,0x83, + 0x7f,0x1d,0x07,0xf3,0x22,0x78,0x8b,0x35,0xca,0x8b,0x51,0x88,0x9a,0x24,0x13,0x7a,0xa6,0x6c,0x91,0xd9, + 0xa8,0xf9,0x2d,0x64,0x5f,0x45,0x26,0x71,0xad,0xba,0x76,0x7a,0x15,0x93,0x07,0x1f,0x52,0xd0,0x9c,0xa2, + 0x64,0x9b,0x6b,0x5c,0xa4,0x22,0x33,0x2b,0x7c,0xf7,0x90,0xc0,0x5d,0xdc,0x56,0xd2,0x37,0x11,0x01,0x28, + 0x1e,0x7d,0x2d,0xb5,0x2b,0x00,0x26,0xe2,0x71,0x86,0xb6,0x0d,0x8e,0x96,0x98,0xd7,0x22,0xb4,0x58,0x9e, + 0x6e,0x61,0x2e,0x62,0xfa,0x30,0x35,0x70,0xd5,0x09,0x4c,0x50,0x1f,0x8f,0x4d,0xfd,0x4e,0xe8,0x18,0x57, + 0x03,0x91,0xe2,0xaf,0x02,0x59,0x01,0xd5,0x1c,0xc1,0x92,0x78,0x62,0xf4,0x84,0x53,0x44,0x58,0x85,0xfc, + 0xc1,0x79,0x22,0xe2,0xfd,0x4e,0xbe,0xbc,0x98,0xd9,0xb9,0x63,0x0f,0xce,0x5f,0x72,0x63,0x29,0x59,0xc9, + 0x38,0x00,0x4b,0x30,0x08,0x38,0x7d,0x80,0x69,0x07,0xc9,0x0f,0x0f,0x68,0xa0,0x01,0x55,0x3b,0x5e,0xb2, + 0xe5,0x44,0x7c,0x61,0x9e,0x39,0x89,0xad,0x60,0xd6,0x29,0x0b,0x02,0xc7,0x94,0x45,0x7d,0xf7,0x96,0x9a, + 0xb4,0x41,0x44,0xc7,0xcf,0x04,0x5c,0x99,0x44,0x94,0x0a,0xeb,0x69,0x55,0xd7,0xb3,0x5c,0xa8,0x5a,0x0a, + 0xbc,0xf1,0xe7,0xab,0xe4,0x2d,0x37,0xff,0x89,0xbd,0xa0,0xe5,0x1b,0x58,0xb2,0x18,0x69,0x47,0x28,0x6f, + 0xdb,0x3a,0x6a,0x34,0xb0,0xa1,0x9b,0x8c,0x18,0x7e,0x62,0xfb,0x62,0x1a,0xd9,0xd8,0xd4,0x98,0x60,0xca, + 0xd4,0x74,0x01,0xbd,0x0b,0x30,0x4b,0x4a,0xc1,0xcf,0x3c,0x11,0x8c,0xe6,0xa3,0x4e,0xab,0x05,0x87,0xa0, + 0xb8,0x7a,0xec,0x75,0xf1,0x72,0x07,0xdd,0xb9,0x5a,0xc4,0x6a,0x6d,0xe0,0x55,0xe5,0x4b,0x3c,0xa1,0x6b, + 0x23,0xdf,0x9c,0x92,0x81,0x0f,0x5b,0x84,0xda,0x53,0xf8,0x44,0xc3,0x7c,0xc9,0xaa,0x6d,0x9a,0x62,0x51, + 0x56,0x02,0xb4,0x17,0xd7,0xe5,0x76,0x03,0x28,0x0c,0x54,0x77,0x2d,0xed,0x07,0x81,0xbc,0x0a,0xe8,0x84, + 0x48,0x26,0xfa,0x38,0x14,0xb4,0x77,0x79,0x0a,0xcb,0x8a,0x8b,0xbc,0xfd,0x75,0x7d,0x5f,0x7d,0x8d,0xe9, + 0x42,0x65,0x54,0x04,0x26,0x05,0xa9,0xc8,0x1a,0x4b,0x44,0xb5,0x31,0x61,0xa5,0xbd,0xc2,0x7e,0x96,0x03, + 0x22,0xb0,0x31,0x0f,0x80,0x54,0x11,0x8e,0xc8,0xc8,0x70,0x70,0xc3,0x56,0x55,0xd2,0xb3,0xbc,0x85,0x5c, + 0x3a,0xdb,0xee,0x29,0xf7,0x0f,0x85,0xf6,0xc3,0xe1,0xe0,0xb6,0x03,0x9c,0x4c,0x1f,0x94,0x16,0x5c,0xb9, + 0xdd,0x55,0x98,0x0c,0x55,0x6a,0xed,0x4d,0xdf,0x15,0x24,0x7e,0x2a,0xa4,0x9d,0x07,0xe4,0x41,0x23,0xf7, + 0x09,0xe5,0x26,0x38,0x55,0x78,0x9f,0xda,0xfb,0xef,0x6e,0xb6,0x26,0x55,0x5a,0xa5,0x0b,0xc1,0x85,0x8f, + 0x4e,0x10,0x5f,0x76,0x4b,0xc3,0xf4,0x75,0xce,0x00,0x85,0xbd,0x50,0x89,0xf1,0x93,0xe7,0x21,0x28,0xfc, + 0x4a,0xb5,0x46,0x83,0xf0,0x3a,0x96,0x69,0xc8,0x58,0xb0,0xc5,0x2b,0x96,0x7e,0x72,0x38,0x0a,0x36,0xd2, + 0x02,0x15,0xf0,0xc5,0x45,0x5e,0x34,0x67,0x5c,0xba,0xb8,0x15,0x40,0x59,0xc2,0x67,0x96,0x45,0x63,0xc7, + 0x35,0x4a,0x40,0x11,0x81,0x41,0xab,0xd4,0xeb,0xf7,0xf2,0x2c,0xc8,0x31,0x9e,0xd8,0x0b,0x28,0x7c,0x7e, + 0x15,0xa6,0xb5,0x49,0x8c,0x61,0x09,0xbc,0x13,0xa9,0xe2,0x5d,0xdd,0x1a,0x2e,0x90,0x1a,0xba,0x4c,0x9f, + 0x9d,0xbe,0xac,0x51,0x9a,0xa3,0xda,0x62,0xbe,0xbc,0xbc,0x84,0x31,0xad,0x51,0x96,0x39,0x56,0xc3,0x60, + 0xd5,0xda,0x34,0x5e,0x7c,0xc1,0x5f,0x82,0xf7,0x8d,0xb2,0x98,0xae,0x66,0x49,0xf8,0x09,0x46,0xe8,0xca, + 0x47,0x9f,0xbc,0x45,0x00,0xe4,0xb7,0x79,0xff,0x34,0x84,0x69,0x4a,0x6b,0x27,0x31,0x0f,0x84,0x80,0x7f, + 0x34,0x5f,0xec,0x5f,0x67,0x4b,0x1f,0x38,0x75,0xe8,0x5f,0xe6,0xd6,0x26,0x41,0x78,0x83,0x41,0x21,0xb0, + 0x90,0xa6,0xd7,0xd0,0x88,0xec,0xc7,0x65,0x30,0x4b,0xfe,0xf9,0x9f,0xa6,0xd7,0x59,0x8d,0xa2,0x47,0xa0, + 0x0f,0xb0,0x16,0xa3,0x9a,0xe2,0xb3,0xfd,0xe5,0x05,0xdc,0x49,0x6b,0xc0,0x97,0x82,0x70,0x02,0x42,0x5f, + 0x34,0x0b,0x6a,0x2f,0xe1,0xee,0x6d,0x90,0x5c,0xd7,0xae,0xe3,0x85,0xe4,0xbb,0xd1,0x9b,0x87,0x21,0xab, + 0x0d,0xe3,0xcd,0x36,0x39,0x26,0xc7,0x45,0x0b,0x9f,0xde,0xc8,0xe6,0xb6,0x26,0x13,0xdf,0xbc,0x58,0x56, + 0x2c,0x4f,0x5e,0x54,0x5c,0x50,0xc9,0x29,0x9b,0x8d,0x35,0xf8,0xc9,0xc9,0x6f,0x3e,0x3e,0x39,0x3e,0x3f, + 0xf3,0xb4,0xb7,0xf5,0xe4,0x9a,0x1c,0x50,0xc6,0x6c,0xa4,0xe3,0x0b,0xf0,0xae,0xb4,0x11,0xd2,0x13,0x9e, + 0x1f,0x1b,0x6f,0x13,0x24,0x31,0xdd,0xbb,0x81,0x25,0x3d,0xc3,0x78,0x2a,0xbc,0xfd,0x4a,0x5e,0xe0,0x93, + 0x85,0x0f,0x3b,0x3b,0x13,0x4f,0xde,0xca,0x0b,0x7a,0x67,0xd1,0xe5,0xc5,0xe1,0x2f,0xb5,0xc8,0x63,0xb6, + 0x79,0x83,0xe2,0x37,0xde,0x87,0x79,0x8c,0x93,0x19,0x05,0x07,0x4d,0xae,0x8f,0xe5,0xc5,0xd8,0x88,0xe8, + 0xcd,0xbb,0x0c,0xe5,0x54,0x85,0x23,0xd2,0x81,0x19,0x48,0x9d,0x14,0xbc,0x20,0xbe,0x5c,0xba,0xfc,0xdb, + 0xe8,0x0c,0xea,0x3d,0xb6,0xf5,0x67,0x70,0x98,0xe0,0x72,0x7c,0x15,0x26,0x00,0xc2,0x7e,0x17,0x9e,0xf3, + 0x60,0x25,0xa9,0x1b,0xc8,0x13,0x3f,0x92,0x56,0x27,0xf1,0x67,0xa4,0x6b,0xa9,0xa9,0x33,0xcd,0x34,0x16, + 0xac,0x3d,0x22,0xa7,0x30,0x8c,0x0a,0x6b,0x52,0xf9,0x60,0xa6,0xf2,0x73,0x87,0xf2,0x8e,0x97,0x91,0x5b, + 0x87,0x50,0xe7,0x84,0x04,0x11,0x08,0x2f,0xdf,0x84,0x11,0x2a,0x63,0x33,0x74,0x36,0xc9,0x1e,0xc9,0xe7, + 0x2b,0x96,0x78,0x84,0x85,0x23,0x44,0x93,0xbb,0x82,0x31,0x31,0x8c,0x48,0x37,0x71,0x31,0x0f,0x3e,0x0f, + 0x60,0xfd,0x5f,0x46,0xbb,0x88,0x3e,0x98,0xba,0xd3,0x00,0xad,0xe5,0x83,0x4b,0x7f,0xe1,0x36,0xbb,0x70, + 0x6c,0x0e,0x6e,0xfc,0x04,0xf6,0xde,0x6e,0xc2,0x3d,0x40,0x13,0x8c,0xfb,0x67,0x21,0xae,0x2b,0x98,0x0b, + 0x64,0x2d,0x1d,0x46,0x40,0x3c,0xdc,0xb9,0x8d,0x2c,0xd3,0xea,0x03,0xb7,0x8c,0x86,0x52,0x78,0x8f,0xa2, + 0xb1,0x17,0x56,0x66,0x1d,0x91,0x87,0xaf,0x10,0x61,0xfe,0xa5,0xbe,0xc5,0x47,0x0b,0xfe,0x78,0x10,0x6e, + 0x3b,0xfe,0x23,0xc3,0x2d,0x93,0x3b,0x65,0x9a,0x33,0xe6,0xa9,0x99,0x5a,0x39,0xa5,0xe9,0x01,0xe2,0xad, + 0x0f,0xfd,0x8d,0x41,0x53,0x93,0xeb,0xa7,0x82,0x37,0xc6,0xe3,0x2d,0x7e,0xc8,0xf1,0x26,0x17,0xfb,0xdd, + 0x8a,0x38,0xd0,0xd0,0xe3,0x59,0x83,0xcb,0xdd,0xf5,0x65,0xec,0xa1,0xec,0x29,0xc3,0x3b,0xb0,0xa8,0x43, + 0x92,0xc8,0xa1,0xdb,0xce,0x5d,0x9c,0x93,0x65,0xe2,0x0a,0x5f,0x15,0x24,0x13,0x71,0x52,0xd6,0xc0,0x04, + 0xde,0x8f,0xe1,0x82,0x1c,0x35,0x44,0xa0,0xe4,0x14,0x5d,0xa7,0xa7,0xd9,0x09,0x6d,0x4f,0x1c,0xe5,0x81, + 0xca,0xba,0x29,0x2c,0xad,0xbb,0x7c,0xeb,0xee,0x72,0x29,0x9f,0x9f,0xc5,0x20,0xd6,0xf3,0x87,0xc8,0x71, + 0xe3,0x13,0x64,0x78,0xd1,0x8e,0x84,0x96,0xe6,0x17,0x67,0x6f,0x84,0xb9,0x27,0x67,0xdc,0x69,0x58,0x4d, + 0x68,0xdb,0x62,0x01,0xcb,0x69,0x13,0xf1,0x9e,0x71,0x3a,0xe3,0xd0,0x12,0xfe,0xd3,0x66,0x2e,0x26,0xce, + 0x71,0x95,0x6b,0x46,0xc0,0x98,0xa4,0xc2,0xa9,0x3c,0xb9,0x7e,0x4d,0xad,0x30,0x99,0x8d,0x87,0x1c,0xc0, + 0x36,0x18,0xfa,0x0d,0x91,0x9e,0x88,0x3f,0x6c,0xa8,0xc4,0x71,0xd4,0x9b,0x39,0xd2,0x3e,0xb9,0x16,0x90, + 0x18,0xf9,0xa5,0x42,0xd4,0x3d,0x46,0x59,0x3e,0xc2,0xbc,0x10,0xd5,0x2d,0x1a,0x71,0x3b,0xb5,0xa9,0xbf, + 0x40,0x88,0x98,0xdd,0x2b,0x64,0x0e,0x4c,0x68,0x31,0xc9,0x7c,0x4e,0xae,0x9f,0xf0,0x22,0xcf,0x89,0x7d, + 0xe0,0x1b,0x30,0x9f,0x51,0xc2,0xdd,0xdb,0x6b,0x1f,0x75,0x9a,0xed,0xfe,0x61,0xb3,0xd7,0x6c,0xef,0xa1, + 0x88,0x6d,0x5c,0x1b,0x41,0x40,0xe1,0x76,0xd5,0x01,0xcc,0x14,0x2b,0xce,0xdc,0x4a,0xea,0x32,0x8b,0x8c, + 0xf1,0xe4,0xfa,0x5d,0xc0,0x6d,0x30,0xd0,0xaf,0xa4,0xa0,0x4d,0xd8,0xe2,0x6e,0x1d,0xea,0x2c,0xea,0xdb, + 0x42,0x08,0x43,0x83,0x61,0xdf,0x48,0x9e,0xca,0x29,0xd7,0xc3,0x5c,0xca,0x75,0x92,0x73,0xcc,0x5d,0x95, + 0x48,0x0d,0x41,0x39,0xf7,0x7a,0xc2,0xbf,0x4c,0xec,0x19,0x12,0x50,0x13,0x21,0x9f,0x3a,0x84,0x0c,0xeb, + 0x73,0xc7,0x6e,0x8c,0x58,0xc6,0xcc,0x3b,0x4d,0xe0,0xb2,0x22,0x8e,0x2e,0x01,0x67,0x9d,0xb1,0x08,0xc5, + 0x10,0xcd,0x10,0x0f,0x58,0x66,0x2f,0x1c,0x72,0x01,0x51,0x5e,0xca,0x5c,0xeb,0xb0,0x9f,0x45,0x25,0x96, + 0xc3,0x93,0x59,0x86,0x6a,0x73,0xed,0x3b,0x66,0xc4,0xab,0xd8,0x2e,0x84,0xef,0xc1,0x6c,0xbf,0x89,0x7c, + 0x03,0x2e,0x38,0x1e,0x97,0x44,0xbf,0x14,0xd8,0x05,0x21,0x05,0xbe,0x8c,0xe3,0x85,0xe9,0x36,0x85,0xfd, + 0x42,0x46,0xe7,0xb7,0xb8,0x3f,0x5a,0x26,0xb4,0xb4,0x11,0x2c,0x5a,0xc8,0x82,0xa1,0x25,0x1f,0x04,0x87, + 0xde,0xb8,0x75,0xd3,0xbc,0x40,0x28,0xe4,0xc6,0xd5,0x6a,0xdd,0x66,0x12,0x83,0x74,0x8e,0x7c,0xd7,0xd0, + 0xbc,0xf3,0x5c,0x78,0x9e,0xa3,0xbf,0x55,0x38,0xd6,0x9b,0x31,0x41,0xce,0x2d,0xc7,0x69,0x73,0x0a,0x86, + 0xac,0x76,0x34,0x24,0x56,0x89,0x7b,0x79,0xb9,0xfa,0xf7,0x31,0x11,0xa1,0xdc,0xe3,0xe7,0xf9,0xe7,0xb8, + 0x7d,0x7d,0x33,0x7e,0x8c,0x9b,0xa0,0x9f,0x00,0xc3,0x9a,0xc7,0x82,0x46,0x9f,0xdf,0x93,0x2f,0xc0,0x41, + 0xdd,0xdf,0xb7,0x50,0xcf,0x06,0x14,0x11,0xb8,0x6b,0x71,0xa7,0xbd,0x16,0xee,0x90,0x42,0x80,0x45,0xa5, + 0x32,0x14,0xb8,0x04,0xee,0xc5,0x1f,0xcb,0xad,0x5e,0xe5,0x62,0x24,0x1c,0x99,0xf8,0xcd,0x68,0xcf,0x7f, + 0xdc,0x3c,0x1a,0x5a,0x57,0x71,0x46,0x19,0x7b,0x73,0xee,0x4d,0x48,0xb5,0xf7,0xfc,0xef,0xda,0xad,0x56, + 0xc9,0x3d,0xa8,0xaa,0xfe,0xf9,0x64,0x5e,0x26,0x42,0x17,0x37,0x19,0x7d,0x98,0x1d,0x39,0x72,0xa1,0xc6, + 0x17,0x42,0x0b,0xa3,0x9e,0xf9,0x39,0x1c,0xbd,0xfc,0x7b,0xfe,0xae,0x7e,0xf3,0x02,0xb1,0xb8,0x9c,0x5c, + 0x68,0x33,0xd7,0xec,0xfc,0x11,0x68,0x35,0x25,0x56,0xf1,0x81,0x15,0x48,0xe5,0x58,0x27,0xdb,0x28,0x56, + 0xc4,0x6e,0x96,0xf3,0x2c,0x5c,0xe0,0x27,0x5b,0x0a,0xd7,0x33,0xf7,0x51,0x50,0xbf,0x48,0x70,0x36,0x2f, + 0x3f,0x9c,0x25,0x31,0x5a,0x60,0x7c,0x16,0x97,0x53,0x26,0x20,0xbb,0xaa,0xbd,0x31,0x7c,0xf2,0xc6,0xc8, + 0x6b,0x61,0xf5,0x59,0xc1,0xd5,0x58,0xa4,0xf8,0x69,0xfd,0xda,0x22,0x7e,0x81,0x7b,0xe4,0x47,0x26,0x71, + 0x09,0xbd,0x54,0x98,0x43,0x90,0x79,0x3f,0x4e,0xbf,0x47,0xdc,0x60,0xf1,0xae,0x58,0xe7,0x89,0x17,0x0e, + 0x43,0xba,0xe1,0xf2,0xfb,0x03,0x69,0x3f,0xe1,0xaa,0xbd,0x79,0x60,0x63,0x81,0xc9,0x3c,0x9e,0xb8,0x3e, + 0x9c,0xb3,0x09,0x52,0xa6,0x32,0xb0,0x72,0x22,0x74,0x50,0x42,0x39,0xa6,0x26,0xbf,0x45,0x93,0x8f,0x94, + 0x45,0x86,0xeb,0xe2,0x08,0x9c,0x21,0xe6,0x24,0xc6,0x18,0x73,0x65,0x9c,0xf0,0x9e,0x2e,0xd7,0xf8,0xd3, + 0x3f,0xfe,0x3d,0x9f,0x46,0xde,0x9b,0x82,0x26,0x22,0xaa,0xf0,0x6b,0x16,0xa3,0xf2,0xd3,0x3f,0xfe,0x03, + 0x25,0x29,0x12,0x34,0x42,0xf2,0x02,0xf2,0xb9,0x6b,0x3e,0xe4,0x1a,0x8c,0x82,0xd0,0x1e,0x57,0xf8,0xa4, + 0xf7,0x40,0x6a,0x67,0xa1,0xad,0xd2,0xdd,0xcf,0x37,0x9f,0x23,0x89,0x3e,0x71,0xaa,0x4a,0xce,0x60,0xd7, + 0xa1,0xf8,0xcb,0xbd,0x55,0x2b,0xd4,0xc4,0xf3,0x12,0x38,0x15,0x96,0x46,0xd6,0x62,0x5d,0x75,0xf3,0x00, + 0x61,0xfa,0xa9,0x71,0xf3,0x65,0x91,0x18,0x40,0xbc,0xbf,0xee,0xf5,0x78,0xf1,0xa0,0x9e,0xe4,0x2b,0x63, + 0x53,0x0c,0x90,0xf0,0x33,0xff,0x1c,0x91,0x78,0x2e,0x82,0x84,0x9f,0x7f,0xe4,0x18,0xbb,0x55,0xa9,0x66, + 0xcb,0xd2,0x50,0xd6,0x38,0x71,0xf3,0x0b,0x1d,0x56,0xa8,0x43,0xc9,0x11,0xc8,0x84,0xf6,0x2e,0xf8,0xe4, + 0xb5,0x06,0x25,0x17,0x31,0xb5,0x54,0x95,0x5f,0xa9,0x5c,0xff,0x99,0x09,0x30,0xc3,0xd5,0x39,0x96,0x33, + 0x04,0xce,0x43,0x6a,0x76,0xa8,0x07,0xc3,0x59,0x98,0x78,0x95,0x48,0x59,0x94,0xc0,0x33,0xaf,0x58,0x0e, + 0x99,0x20,0x09,0x44,0x3d,0x84,0x0d,0xd4,0xd0,0xde,0xae,0x55,0xd7,0xa6,0xca,0xb5,0x40,0x7e,0x4b,0xa3, + 0x51,0x0a,0x71,0xc1,0xb0,0x59,0xee,0x38,0x54,0x11,0x61,0xc8,0x3b,0xbb,0xf0,0xd1,0xa3,0xb3,0x3a,0x8d, + 0x81,0x06,0xc1,0x16,0x20,0xc8,0x78,0x04,0xea,0xd6,0x72,0x10,0x31,0x3c,0xb3,0x50,0x50,0x41,0x62,0x34, + 0xb0,0x41,0x38,0xdb,0xe5,0x72,0xbf,0xb2,0xef,0xe4,0x01,0xef,0x88,0xce,0x85,0x95,0xdc,0x1a,0xbc,0x47, + 0x79,0xcd,0x58,0x5a,0x41,0x54,0xd3,0xc0,0x4f,0xa6,0x57,0x79,0xe5,0x20,0xbd,0x23,0x1e,0x94,0x0d,0xdf, + 0xfa,0x11,0x2e,0x2e,0x6f,0x4d,0x32,0xb6,0x82,0xf1,0x47,0xa8,0xe6,0x31,0xa7,0xca,0x1c,0x16,0x8e,0x74, + 0xe9,0xc8,0x23,0xe1,0x53,0x87,0xe4,0xa5,0x99,0xe0,0xeb,0xca,0x6e,0x53,0x18,0x12,0xff,0x1a,0x58,0xce, + 0xf8,0x35,0x33,0xcf,0x38,0x40,0xac,0xbd,0x17,0x4f,0xde,0xbc,0x3e,0xb3,0x98,0xd5,0x5c,0x44,0x97,0xac, + 0xf9,0xa7,0x05,0xfd,0x13,0xc0,0xbf,0x97,0xe1,0x85,0xc5,0x5f,0xa4,0xbd,0xe5,0xb0,0x4b,0xac,0x8b,0x2d, + 0xbc,0x59,0x29,0xa4,0x8a,0x17,0x18,0x2c,0x0a,0x26,0x46,0xfc,0x14,0x54,0x7e,0xf0,0x9e,0x21,0x2a,0x61, + 0xe6,0x4f,0x28,0x89,0xa9,0xd7,0x42,0x88,0xc2,0xbf,0x34,0xfa,0xe1,0xc2,0x84,0x42,0xe5,0x43,0xb5,0xf4, + 0x46,0xa3,0xb0,0xb0,0x23,0x4b,0x8b,0x80,0x16,0xc8,0x6e,0x16,0xc7,0x73,0xce,0x2f,0xa4,0x70,0x48,0x4c, + 0x31,0x4d,0xca,0x98,0x8d,0xaa,0x17,0x86,0x18,0x4a,0x5d,0x13,0x37,0x8d,0x2a,0x4c,0x94,0xd5,0xba,0x46, + 0xf0,0x45,0xc1,0x30,0x08,0x7e,0x4b,0xf7,0xe9,0xaa,0x6b,0x36,0xc1,0x27,0x49,0xb6,0x62,0xe4,0x83,0xbb, + 0xd4,0x09,0xe1,0x64,0x29,0xae,0x1a,0x85,0xa9,0x75,0xf2,0x55,0xab,0x95,0xb5,0x9c,0xec,0xf2,0xac,0x4f, + 0x92,0x7f,0xca,0x35,0x45,0xe9,0xbb,0x36,0xb7,0x03,0x45,0x64,0x23,0x52,0x9e,0x32,0x13,0xcc,0x91,0x6c, + 0x85,0x5f,0xf8,0x74,0xf2,0xe0,0xc0,0x15,0xaa,0x94,0x43,0x67,0xe2,0x81,0xf7,0xb7,0xff,0x41,0x41,0x0b, + 0x6f,0x19,0x99,0x69,0x12,0x70,0x13,0xf1,0xc6,0x1e,0xf3,0x52,0xc5,0x4e,0x0b,0x4f,0x96,0xbd,0x60,0x16, + 0xc2,0xd2,0x15,0x2a,0x79,0xfa,0x4d,0x28,0xad,0xaa,0x23,0x8e,0x63,0xea,0xe9,0xae,0x90,0x2e,0xa3,0x5d, + 0xe6,0x6e,0x69,0xaa,0x26,0x58,0x34,0x06,0xfa,0x89,0x66,0x89,0x2a,0x64,0x52,0x4c,0xba,0x4c,0xb9,0x56, + 0xd0,0x6f,0xbd,0x6c,0x7a,0xe7,0xd9,0x1a,0x0c,0x68,0x52,0x5e,0x18,0x4b,0xab,0x5d,0x42,0xb7,0x86,0x2d, + 0x8c,0xfb,0x8d,0xa4,0xf5,0x1d,0x51,0x37,0x02,0x74,0xc1,0xaf,0xd7,0x97,0xa3,0x60,0x0c,0x92,0x9a,0x0a, + 0x55,0xd0,0xe6,0x70,0xc3,0x8b,0x3f,0x9f,0x95,0x21,0x9f,0xdf,0x18,0x3a,0x18,0x4b,0x55,0x9e,0xca,0x0f, + 0x93,0x2f,0x62,0x7a,0x3b,0x3a,0x83,0xa4,0x90,0x89,0xc9,0x2f,0x08,0x64,0x8a,0xcf,0x8d,0x9b,0x32,0xb9, + 0x85,0x55,0xc1,0x1a,0x35,0x9b,0x4d,0xf9,0x26,0x54,0x41,0x10,0xd8,0x9b,0x11,0xb0,0x63,0x25,0x07,0x86, + 0xb3,0x09,0xb9,0xf6,0xe3,0x86,0xe2,0xa0,0xd8,0xec,0x81,0xc4,0xf0,0x4e,0x55,0x62,0xa7,0x3a,0x3c,0xe6, + 0xc6,0x36,0x92,0x68,0x38,0xae,0xa4,0x98,0x85,0x46,0xa7,0x53,0x0a,0xd8,0x72,0xd5,0xd6,0x47,0x65,0x74, + 0xe1,0xe4,0xbb,0x34,0x06,0xbd,0xd1,0x98,0x17,0xd3,0x0e,0x46,0x95,0x21,0xf7,0x5b,0x4e,0x6f,0x49,0x9e, + 0xe1,0x58,0x2c,0x7a,0x71,0x72,0xad,0xac,0x30,0xe8,0xf1,0xf0,0x5f,0x4a,0xc6,0xf5,0x80,0x2c,0x64,0xdc, + 0x5b,0x8f,0xd0,0x5b,0x84,0x87,0x54,0x0c,0xcb,0x44,0x25,0x13,0x23,0x20,0x49,0x9e,0x4a,0xd5,0x52,0x2e, + 0x4b,0x2b,0xc3,0x87,0x33,0xca,0x8b,0x73,0x53,0xc4,0x03,0xc9,0x89,0x73,0x7e,0x65,0xea,0xd1,0xad,0x92, + 0x59,0xb2,0x37,0xdd,0x28,0x99,0xc1,0xf3,0x4d,0x92,0x59,0x5e,0x0f,0x04,0xc7,0xad,0x14,0x0c,0x39,0xbf, + 0xac,0xc4,0xab,0x64,0x83,0x58,0x36,0x25,0x6d,0x78,0x95,0xe6,0x4c,0x70,0x03,0x0d,0xf2,0x93,0x4a,0xd5, + 0xba,0x77,0x60,0x6e,0x6e,0xec,0x62,0x0a,0x46,0x24,0x85,0x2f,0x22,0x3c,0x9d,0xe2,0xe4,0x0b,0xa2,0x21, + 0x95,0x07,0x7c,0x86,0xaf,0x6d,0xb1,0x4a,0xea,0x0c,0x04,0xe5,0xcc,0x4a,0xda,0xef,0xfc,0x43,0x73,0xf4, + 0x43,0x73,0xdc,0xf8,0x15,0xf7,0x3e,0xf7,0xbd,0x3b,0x95,0x80,0x17,0x3a,0x2d,0x7f,0x5b,0x4c,0x4e,0x25, + 0xde,0x55,0xd3,0xca,0x96,0x3c,0x7d,0x2b,0xde,0x14,0x3f,0xad,0xd5,0x28,0x50,0xf1,0xa8,0x1c,0xf1,0xb4, + 0x0a,0xb1,0xda,0x5a,0x55,0x67,0x48,0x52,0xb9,0x09,0x78,0x4a,0xa5,0xa8,0x12,0xc6,0xff,0x47,0x78,0x5b, + 0x8d,0x79,0xc0,0x7d,0x4f,0xab,0x03,0x9e,0x70,0x24,0x77,0x79,0xaa,0x3a,0x60,0x25,0x70,0x27,0x91,0xcf, + 0x0c,0x10,0x00,0xd1,0xc9,0x15,0xd7,0x83,0x8b,0x68,0xa7,0x8a,0x18,0xc8,0x85,0x74,0x49,0x0a,0x6f,0x2e, + 0x51,0x07,0x9f,0x4c,0x5d,0xb1,0xad,0x36,0x62,0xcb,0x36,0xac,0xe1,0x27,0xdc,0x94,0xd4,0x39,0xc2,0x2a, + 0x95,0x6c,0x28,0xf3,0xe7,0x99,0xcc,0xe2,0x23,0x7c,0x2c,0xd0,0xc5,0xe9,0xc7,0x2f,0xb8,0x27,0x29,0x70, + 0x4e,0x05,0x34,0x04,0xeb,0xbe,0x08,0x4f,0x64,0x91,0xb4,0x22,0xf7,0x51,0x22,0xee,0x4e,0xfa,0x51,0x86, + 0xd3,0x8b,0x24,0xbe,0xa1,0xf3,0x79,0xc5,0xac,0xe7,0x94,0x66,0x93,0x7f,0x68,0xb2,0x26,0x1b,0xd2,0x0d, + 0x69,0x17,0x2b,0x70,0xc3,0x13,0xb5,0x11,0x22,0xf1,0xf4,0xca,0x4f,0x17,0xf1,0x62,0xb9,0x80,0x56,0x6f, + 0x82,0x68,0xb9,0x21,0x3b,0x80,0xf5,0xd3,0xbf,0xfb,0x2f,0x16,0xea,0x0a,0x72,0xba,0xc2,0xb4,0xc4,0x07, + 0x66,0x54,0x8f,0xc8,0x0c,0x27,0xd3,0xb9,0xb1,0xe4,0x61,0x70,0xdb,0x2b,0xa1,0x6e,0x58,0x43,0xca,0xcd, + 0xd1,0x43,0x25,0xa4,0x55,0xc5,0x60,0xe3,0x7d,0xf9,0x95,0x82,0x0f,0xe0,0xf7,0x10,0x7f,0xe5,0x01,0x06, + 0x89,0xf9,0x83,0x8c,0xe9,0x51,0x9c,0xc1,0x9e,0xe2,0x0a,0xdf,0x14,0x7d,0xb9,0xa0,0x4f,0x6e,0xc4,0x08, + 0x84,0xd8,0xa2,0x01,0x9e,0x2d,0x13,0x7a,0xfa,0x2a,0x75,0xbb,0x41,0x17,0x89,0x29,0x1c,0x42,0x68,0x4a, + 0x31,0x1c,0x13,0xae,0xb8,0x74,0xb1,0x99,0x04,0x48,0x6f,0xe7,0x79,0xde,0x9c,0xbe,0x46,0x3a,0x35,0x75, + 0xc0,0x28,0xd4,0xad,0x99,0x1f,0xe9,0x29,0x16,0xdb,0x68,0xd8,0x10,0x7e,0x58,0x15,0x99,0xbd,0x38,0xcb, + 0xba,0x40,0xdd,0x9b,0x7c,0x35,0x87,0x22,0xa8,0x00,0x18,0x9a,0x04,0x72,0x87,0x43,0xd4,0xcc,0xc8,0xe2, + 0x5e,0x6c,0x79,0x94,0x9b,0xf3,0x31,0xe6,0x65,0xa8,0xd7,0xb3,0x87,0xad,0x0b,0xa6,0x97,0xd2,0x6a,0xfb, + 0x62,0xa2,0xf4,0x0f,0x3a,0xc8,0x9e,0x0b,0xd4,0xa6,0xad,0x29,0xc7,0xd0,0x0f,0x8b,0xd9,0x7c,0xb8,0xf4, + 0x85,0xdf,0x4a,0x49,0xcd,0x56,0xee,0x5d,0xf1,0x0e,0xd3,0xd9,0x59,0xa2,0xa1,0xf4,0x66,0xf1,0xf9,0xa0, + 0xc7,0xc8,0xf9,0x62,0x37,0xdd,0x6d,0x01,0xba,0xaa,0x24,0xf3,0x57,0x55,0x6a,0x36,0x3e,0xdc,0x46,0x77, + 0x50,0xe7,0x66,0x0b,0x66,0xd5,0x12,0x8e,0xde,0x0b,0x0e,0xa0,0x7d,0x0a,0xb7,0x50,0x14,0xf6,0x14,0x4d, + 0xca,0xc3,0x9e,0x2b,0x66,0xb7,0x9a,0x3a,0x29,0xb6,0x18,0xa7,0x9b,0xa7,0x17,0x07,0x42,0x63,0xcb,0x04, + 0xa1,0x4d,0x78,0xc5,0xa9,0xa6,0x93,0xa2,0x40,0x3a,0x5f,0x5e,0x6e,0xe3,0xf8,0x4b,0x03,0xcb,0x37,0x27, + 0x4a,0xf1,0x5c,0xfa,0x70,0xe9,0xeb,0xd4,0x69,0x65,0xf4,0x11,0x8b,0xe1,0x2c,0x63,0x8a,0x3f,0x12,0xa2, + 0xa3,0x99,0x18,0x00,0xca,0x4a,0xc2,0xa3,0x71,0x23,0x16,0xb2,0x4b,0x6e,0xd3,0x95,0xfd,0x1a,0x8e,0x7c, + 0x7e,0x6e,0x73,0xb7,0x15,0x39,0x68,0xca,0x6a,0x41,0x9b,0x1e,0xb3,0xb8,0xe5,0x1d,0x8b,0x78,0x69,0x18, + 0x01,0x1c,0x52,0xa8,0xf9,0x4e,0x9c,0xb3,0x94,0x64,0x4b,0xed,0x5e,0x59,0x2b,0xcf,0xb3,0x74,0x69,0x6f, + 0x49,0x9f,0x8b,0x43,0x8b,0xf9,0xb4,0x61,0x05,0x64,0x66,0xe6,0x5c,0x6d,0x45,0x80,0xa5,0x11,0x04,0x8b, + 0x5c,0x42,0x49,0x66,0x3e,0x15,0xbd,0xd0,0x05,0x22,0x72,0xef,0x1f,0xbb,0x3f,0x3f,0x35,0xef,0x6a,0x10, + 0xe1,0x0a,0x1c,0xbb,0xa3,0x71,0x41,0x3e,0x7a,0xc0,0xf1,0xc8,0xa4,0x45,0x54,0x9e,0x84,0xd5,0x13,0x3c, + 0xd3,0xd6,0x46,0xbe,0x7e,0x79,0x96,0xac,0x2a,0x8f,0x2e,0xa9,0x39,0x32,0x5a,0x17,0x4d,0x55,0xa5,0xb6, + 0xba,0xdc,0xca,0x3c,0x21,0x1f,0x4f,0x56,0x35,0xae,0x57,0x9e,0xa3,0x1a,0x30,0x4f,0x96,0xbe,0x1d,0x61, + 0xa7,0x3d,0xdd,0xe9,0xf1,0xb7,0xce,0x50,0x07,0x7e,0xe7,0xb4,0x2d,0xf9,0xdd,0x89,0x44,0x0e,0xf5,0x04, + 0x61,0xb5,0x9c,0xbf,0x8b,0x05,0x76,0xb9,0xc9,0x06,0x3d,0x78,0x2b,0x74,0x0e,0xf0,0x10,0x9f,0xa0,0xbd, + 0x54,0x92,0x93,0xe9,0x76,0x8d,0x48,0x31,0xcf,0xd9,0x5a,0x12,0x5f,0xaf,0xdb,0x31,0x1d,0xbd,0x52,0xb2, + 0x41,0x0f,0xb7,0xd5,0xb2,0x00,0xcf,0xc4,0x29,0x63,0xd0,0x0c,0x67,0x9e,0x54,0x82,0xf8,0x93,0x5d,0x3c, + 0xc0,0x82,0x6a,0x55,0x4e,0x46,0xa9,0x4c,0x2a,0xf3,0x67,0x60,0x3a,0x0c,0x28,0x85,0x6e,0x30,0xf2,0xdc, + 0x88,0x02,0xac,0x0b,0x25,0x5a,0xdd,0x80,0xbc,0x5b,0x12,0x8a,0x75,0x0b,0x02,0x47,0xae,0x5a,0x6c,0xa6, + 0x2d,0x01,0xc7,0xe0,0xe4,0x0b,0x8c,0x09,0xd4,0x4b,0xa0,0xa3,0x1b,0xf3,0x70,0x62,0x16,0x41,0xb6,0x35, + 0xd7,0x86,0x3c,0xcb,0x78,0x26,0x4a,0x82,0xe4,0x32,0x32,0xcf,0x45,0x8d,0xb6,0xf3,0xeb,0xa5,0x92,0x69, + 0xa9,0x0c,0x82,0x7a,0xe5,0x8a,0xc8,0xe7,0xbb,0xb9,0xb2,0xcf,0xe3,0x1b,0x3d,0x63,0x20,0xcb,0x5b,0xa7, + 0xd1,0x4c,0x5f,0xeb,0x77,0x38,0x5e,0x14,0xfe,0x83,0xe9,0x39,0xab,0x53,0xd8,0x5d,0xd9,0x19,0xad,0x6a, + 0xcc,0x35,0x0e,0x17,0xad,0xea,0x6c,0x76,0x42,0x51,0x89,0x1f,0x7f,0x63,0x9b,0xa8,0xac,0xeb,0x11,0x76, + 0x6b,0xfa,0xa8,0xaf,0xd4,0x5d,0x5d,0xcd,0x92,0x92,0xb5,0xbf,0x68,0x87,0xe3,0x6a,0xd6,0x2d,0x5a,0x99, + 0x10,0x17,0x09,0xb9,0x1c,0xf9,0x95,0xe9,0x47,0x2e,0x51,0x2e,0x14,0xb4,0x04,0x96,0x02,0x19,0xa2,0x2a, + 0x18,0x3d,0x6a,0x69,0x85,0xd4,0x7e,0x29,0xe5,0x56,0x04,0x77,0xe4,0x07,0x80,0x71,0xab,0x3d,0x76,0x04, + 0xad,0x30,0x14,0xd4,0x02,0xe3,0xf8,0x53,0x80,0x14,0x1e,0xf1,0x4e,0x34,0x8c,0xc8,0xde,0x87,0xc5,0xdd, + 0xcb,0xd5,0xde,0x92,0x87,0xf1,0xe5,0x23,0xe5,0xb9,0x02,0xc5,0x34,0x76,0x9a,0xc7,0x0f,0x06,0xe7,0x29, + 0x50,0xb5,0x11,0x29,0x38,0xa6,0x28,0x3d,0xbe,0x06,0xfa,0x99,0x8e,0x59,0xb2,0xd6,0xbb,0x94,0x07,0xd4, + 0x55,0xf5,0x2a,0x42,0x00,0x5a,0xab,0x42,0xc5,0xbc,0x58,0x4e,0x82,0xcf,0x3e,0xba,0x9e,0x56,0xaa,0x99, + 0xe1,0xb1,0xc8,0x8f,0x89,0xb0,0x18,0x61,0x02,0x82,0xe0,0x4e,0x4b,0x99,0xfa,0xd6,0xfa,0xef,0x84,0xb3, + 0x09,0x3f,0x5b,0x9d,0x12,0x23,0x2e,0x85,0x0b,0x95,0xf5,0xb8,0xd8,0xa8,0x7c,0x20,0x51,0x8e,0xd9,0x54, + 0x64,0x12,0xad,0x30,0xbc,0xd0,0xb0,0x59,0x22,0xf3,0x48,0x51,0x2d,0x94,0x3a,0xab,0x4d,0x9c,0xfa,0xb4, + 0x9a,0xf1,0xdd,0x98,0x36,0x32,0x96,0x5a,0xe1,0x8a,0x3c,0x91,0x53,0x62,0xc1,0xe2,0x07,0xba,0xe2,0xee, + 0x54,0xcd,0x92,0x30,0xfd,0x28,0xa6,0xba,0x92,0x41,0x0d,0x23,0x28,0x14,0x6a,0xfe,0x54,0x13,0x66,0x96, + 0x0f,0xd7,0x80,0x49,0x08,0x3e,0x1a,0xcd,0x60,0x13,0xef,0xc4,0x2c,0x8a,0x18,0x8e,0xb8,0x24,0xa3,0x14, + 0x1d,0x31,0x7c,0xca,0xd3,0x72,0x32,0x8f,0x27,0xea,0xb4,0xf6,0xbd,0xbd,0x0f,0xa8,0xd1,0xff,0xd5,0x5e, + 0xc8,0xd7,0xb6,0x78,0x00,0x2b,0x4c,0x68,0x2c,0x6e,0x2e,0xcf,0xe3,0xef,0xc9,0xe5,0x50,0x19,0x8c,0xa0, + 0x33,0x67,0xcb,0xc9,0x4d,0x88,0x41,0x99,0x49,0x4e,0x8d,0xc8,0x24,0x93,0x85,0x82,0x9e,0xe6,0x13,0x31, + 0xe1,0x02,0xda,0x69,0x17,0x21,0x69,0x81,0x87,0x39,0x16,0x91,0x0b,0xae,0x86,0x50,0x85,0xae,0xd9,0x2f, + 0x14,0xcf,0x29,0xd3,0xb6,0xa4,0x54,0x98,0x69,0x3d,0x0a,0x7e,0xc7,0x73,0x1f,0x61,0xae,0x1c,0x66,0xd6, + 0x5e,0x3a,0xff,0x39,0x65,0xa0,0xca,0x8c,0x00,0xa9,0xa9,0x89,0x04,0x14,0x7c,0x86,0x09,0x16,0xa9,0x1a, + 0x53,0x05,0x39,0x10,0x4e,0xe9,0x7e,0x8a,0xfc,0xe5,0x6c,0x32,0x13,0x4e,0x50,0x39,0x27,0x0f,0xb8,0xcf, + 0x55,0xd5,0x05,0x17,0x0f,0xe1,0xa7,0x8f,0xcf,0x40,0xde,0x5a,0x24,0x4c,0xf1,0xbf,0x9a,0xf7,0x75,0x72, + 0x89,0xc3,0x05,0x50,0xb8,0x99,0x37,0x1c,0x6d,0xcb,0xa1,0xc9,0xcf,0x20,0x78,0x6a,0xce,0x21,0x04,0x2a, + 0xcb,0x5e,0xc6,0x97,0x97,0xc1,0xec,0x85,0xc1,0xde,0x69,0x95,0x50,0x0e,0xc9,0x49,0x7e,0x6d,0x44,0xda, + 0x52,0x44,0x80,0xe7,0x48,0x5a,0xe2,0x42,0xe4,0x46,0xc7,0xe3,0x65,0x98,0xfb,0x40,0x0c,0x0b,0x0f,0xd5, + 0x27,0x46,0x55,0x9f,0x18,0xac,0xfd,0x44,0x6e,0x8c,0xd7,0xf5,0x21,0xcc,0x10,0xe7,0x3d,0x45,0x85,0x54, + 0xdf,0x65,0x7c,0x1e,0x1b,0xd0,0x3d,0x5b,0x06,0x46,0xaa,0xa6,0x4f,0x62,0x38,0x0f,0xfc,0x28,0xef,0xb0, + 0x16,0xd0,0x3a,0x19,0xf2,0xae,0xcf,0x96,0x0b,0xa1,0xc9,0xe3,0xb7,0xdd,0xa2,0x7b,0xbf,0xd2,0xcf,0x15, + 0xac,0x17,0xe4,0x46,0xc6,0x24,0xf6,0xd6,0x79,0x90,0xdc,0xa4,0x0f,0x37,0x60,0xcc,0x26,0xe8,0x27,0x89, + 0x67,0xde,0xc0,0x2f,0xda,0xba,0x25,0x95,0x4b,0x36,0x1f,0xd0,0x89,0x20,0x8b,0xeb,0x08,0x86,0x53,0x45, + 0x27,0x31,0x99,0xd6,0xbc,0x42,0xad,0x26,0x7c,0xe2,0xcc,0x43,0xc0,0xb0,0x0c,0x69,0x92,0x93,0xa8,0x54, + 0xd1,0x45,0x1d,0x36,0xf7,0xb2,0xa0,0x4d,0x9f,0xa6,0xb9,0x28,0xba,0x2c,0x17,0xa1,0xbe,0x59,0x42,0x10, + 0x71,0xf5,0xd9,0xa6,0xd0,0x9f,0xac,0x10,0xa6,0x2e,0xa9,0x57,0x46,0x9e,0x1a,0xb6,0x64,0x8a,0x8b,0x54, + 0x0b,0x09,0x96,0x41,0xaa,0x84,0x43,0x38,0x76,0xe6,0xe9,0xc9,0xc7,0xf7,0xef,0x5e,0x7e,0x7c,0x7a,0xfa, + 0xec,0xf8,0xfd,0xcb,0x73,0x03,0xb7,0x87,0x5c,0x32,0x9b,0xb3,0x60,0x8f,0xd8,0x86,0x3d,0x8b,0x61,0xe9, + 0xe3,0xb7,0x2f,0x1e,0x58,0x5c,0x5b,0x81,0xa6,0x17,0x97,0xb8,0x36,0x08,0xe9,0x86,0x07,0x72,0x67,0x22, + 0x2b,0x89,0x09,0xbf,0x41,0x10,0x35,0x59,0x05,0x36,0x0c,0x82,0xf4,0x49,0x33,0xbe,0x85,0xdf,0x41,0x51, + 0xfd,0xe2,0x0b,0x94,0xed,0x8c,0xce,0x4d,0xd1,0x92,0x70,0x27,0x7d,0x21,0x9f,0xf1,0xae,0xe7,0x3f,0xd4, + 0xa4,0x89,0x6b,0xde,0xe5,0x0f,0x2b,0xbf,0x9b,0xbf,0xad,0x84,0x7e,0x0c,0xf8,0x53,0x23,0x81,0xa8,0x44, + 0x17,0xf3,0xf8,0x36,0x6d,0x1a,0x68,0x45,0x7a,0x5c,0x90,0x0a,0x01,0xd9,0xd2,0x36,0x3f,0xb8,0x51,0xee, + 0xde,0xb0,0x7c,0xcb,0x0d,0xb8,0xb3,0xef,0x6c,0x42,0x51,0xd8,0x3c,0x36,0xbb,0xb8,0x0e,0x67,0x93,0x97, + 0x14,0x6a,0x42,0xc7,0xae,0x2c,0xaa,0xed,0x2b,0xe6,0x5a,0x34,0xba,0x90,0x07,0xa8,0x30,0x4c,0x26,0xf4, + 0xeb,0x17,0xe1,0xdc,0xc8,0x75,0x1b,0x14,0xd6,0x6d,0x56,0xc0,0xa4,0x19,0xa8,0xef,0xb2,0x33,0xae,0x40, + 0xe3,0xb6,0x19,0x65,0x5d,0xe1,0xe4,0x09,0x98,0x55,0x46,0x3e,0x4b,0xc8,0xa3,0xde,0xdf,0xd3,0xf5,0x2d, + 0x5c,0x74,0xc6,0xec,0x0a,0xfe,0x74,0xc7,0xec,0x02,0x21,0xcc,0x52,0xf8,0xdd,0x1b,0xb3,0x09,0xea,0xc9, + 0xe1,0xe7,0xfe,0x98,0x01,0xdb,0xe2,0xda,0x58,0x9c,0x87,0x18,0xf3,0xd7,0xd1,0xf5,0x31,0x6f,0xb6,0x43, + 0xd8,0x32,0x19,0xb7,0x2b,0x3a,0x24,0x57,0xda,0x6c,0x42,0x6a,0x77,0x5a,0x2f,0xdc,0x56,0x64,0x8e,0x60, + 0xe5,0x7e,0xe6,0xa9,0xba,0x06,0x26,0xca,0xa2,0x74,0xe0,0xe5,0xa3,0x63,0x1c,0x45,0x26,0x98,0x42,0x60, + 0x20,0x28,0xd0,0x89,0xe5,0x55,0x68,0x2b,0x58,0x29,0x59,0x97,0x51,0xbd,0xf4,0x25,0x31,0x6b,0x87,0xb5, + 0xc4,0x81,0xa5,0xe4,0x45,0x8e,0x2b,0xc0,0x29,0x14,0x6b,0xd8,0x22,0xa8,0xfa,0x45,0x12,0x63,0xa4,0xd6, + 0xfc,0xfe,0x3e,0x12,0xec,0x08,0xdc,0xf6,0xc5,0x4f,0xbc,0xb9,0x4c,0x83,0x84,0xc3,0xf9,0x60,0xba,0x01, + 0x0e,0x09,0x59,0x85,0x0c,0x01,0xdd,0xfa,0x7d,0x12,0x47,0x97,0x04,0x6a,0x6a,0xf8,0x08,0x1b,0x47,0x2f, + 0xad,0x56,0xf1,0x6e,0x69,0x90,0xe4,0xb7,0x6b,0x7e,0x8e,0x36,0x42,0x4a,0x44,0x24,0x8f,0xb8,0x12,0x51, + 0x1c,0xbb,0x09,0xec,0x04,0xef,0x41,0x8f,0x7f,0xa4,0x21,0x73,0xad,0x13,0x04,0xf0,0x4b,0xd0,0x23,0x76, + 0xc5,0x2a,0x10,0x5f,0xe0,0x0e,0x34,0x30,0x85,0xe3,0x8b,0xb0,0x3d,0xbf,0x12,0x02,0x86,0xe0,0xbc,0x4d, + 0xee,0xaa,0x3c,0x14,0xb0,0x88,0x04,0x34,0x13,0x46,0x82,0xf6,0x5a,0x6d,0x83,0x9f,0xba,0xbf,0xe7,0x88, + 0x50,0xca,0x5b,0x68,0xeb,0x70,0x08,0x88,0x57,0x0d,0x3c,0x4d,0xfe,0x52,0x15,0x38,0x7f,0x7a,0x05,0x16, + 0x18,0x09,0x1b,0x1d,0x0f,0x8b,0xc5,0x5b,0x0a,0x39,0xeb,0x57,0x02,0x9f,0x99,0x54,0x8d,0xb4,0x40,0x44, + 0x82,0x0d,0xe8,0xe6,0x74,0x99,0xc0,0x99,0x9a,0xbd,0x8b,0xf1,0xf0,0x75,0x80,0x9f,0x95,0x8c,0x7c,0x15, + 0xce,0x60,0xf0,0xb3,0xc0,0x04,0x45,0x06,0xaa,0x6a,0xf4,0x7d,0xa5,0x70,0x1a,0x94,0xf4,0xb6,0x32,0x5f, + 0xa5,0x3e,0x81,0x4a,0xda,0x3c,0x21,0xb7,0xae,0xe1,0xbb,0x2a,0x38,0xae,0x55,0x99,0xd2,0x3e,0x0b,0xc4, + 0x44,0xf3,0x43,0xad,0xd7,0xea,0x19,0x98,0x5a,0x59,0x2d,0xbe,0x18,0x59,0xe4,0x0b,0x64,0xfd,0x69,0x71, + 0x69,0x8d,0x75,0x88,0x12,0x5f,0xb0,0xc5,0xcd,0x6a,0xd0,0x17,0x22,0x2f,0x34,0xde,0x3e,0x92,0x54,0xd1, + 0x55,0xee,0x89,0xc9,0x4d,0xe1,0xe2,0xb0,0x67,0x3c,0x7d,0x23,0xc5,0x7e,0x78,0xbe,0x58,0x37,0x0c,0x3a, + 0x42,0x3b,0x55,0x2c,0x23,0x02,0x97,0x59,0x55,0xe1,0x8f,0xf5,0x30,0xbe,0x88,0xd0,0x36,0xf1,0xb8,0x7b, + 0xaf,0xd3,0x02,0x71,0x7b,0x9a,0xea,0x1e,0xdc,0xe5,0x1e,0x98,0x39,0x7e,0x47,0x00,0xc3,0x18,0x9c,0xce, + 0xa8,0xdd,0x6e,0xf7,0xbb,0xfb,0x9d,0x5e,0xeb,0x90,0xb5,0x0f,0x8f,0x8e,0x7a,0xbd,0x83,0x5e,0xaf,0xcd, + 0xba,0xad,0xde,0x51,0xb7,0xd3,0xed,0x1d,0xc0,0xcf,0xa3,0x4e,0xbb,0xd5,0x3a,0xda,0x3f,0xe8,0xb2,0xa3, + 0x7e,0xfb,0xe8,0xf0,0x00,0xca,0xb3,0xf6,0x7e,0xeb,0xf0,0xe8,0xa0,0x75,0x74,0xd4,0x65,0x9d,0xde,0x7e, + 0x17,0x6a,0x38,0xe8,0x1d,0xb2,0xce,0xe1,0x41,0xeb,0xa0,0xdf,0xed,0x74,0xe0,0xad,0x7e,0xa7,0xd7,0x3d, + 0x6c,0xb7,0x0e,0x5b,0xac,0xdb,0x6e,0xed,0x1f,0x1d,0xc2,0xc6,0x61,0xfd,0xd6,0x41,0xa7,0xb3,0xdf,0x39, + 0x80,0xa6,0x7a,0x9d,0xfe,0xe1,0x21,0xd6,0xc6,0xda,0x47,0x9d,0xfd,0xd6,0xc1,0x61,0xf7,0x10,0xde,0x6f, + 0xf7,0x3b,0xf0,0xb3,0xd3,0xea,0xb3,0x4e,0xbf,0xdd,0x3b,0x84,0x12,0xad,0x2e,0xeb,0x76,0x7a,0x87,0x1d, + 0x78,0x0f,0xab,0x3a,0xec,0xee,0x77,0x8f,0x5a,0x58,0x57,0xaf,0x05,0xf7,0x3a,0xbd,0x83,0x83,0x1e,0x94, + 0xed,0x41,0x4f,0xe1,0x45,0x68,0xa0,0x77,0x08,0x3d,0xe8,0x1c,0xb2,0x83,0x83,0x56,0x67,0x1f,0x9a,0x85, + 0xae,0x76,0x7a,0x47,0xd0,0xdd,0x76,0xa7,0x03,0xbd,0xde,0x87,0x7e,0xb7,0xfb,0x47,0xf0,0xf3,0xe8,0xa8, + 0xdf,0xea,0xf7,0x8e,0x0e,0xa1,0xa9,0xfd,0xfd,0x5e,0xa7,0xd3,0x3a,0x3c,0xec,0xc0,0x07,0x74,0xda,0x87, + 0x5d,0xa8,0xed,0x88,0x75,0x8e,0xf6,0x3b,0x50,0xe6,0x10,0xc6,0xa5,0x0b,0x03,0xd0,0x6d,0x77,0xfb,0x38, + 0x18,0xdd,0x6e,0x7f,0xff,0x00,0x06,0x0a,0x7e,0xee,0x1f,0xf6,0xf6,0xe1,0x8b,0xdb,0x6d,0xd6,0x6e,0xc3, + 0x20,0xf5,0x71,0x30,0xba,0xdd,0xc3,0x4e,0x0f,0x1e,0xef,0xb3,0x7e,0xbf,0xdf,0x85,0xcf,0x6d,0xed,0x43, + 0x57,0xba,0x58,0x55,0x1b,0x1a,0xed,0x1c,0xf5,0x0e,0x60,0x20,0x0f,0xe0,0x67,0x17,0x06,0x13,0x3e,0x0b, + 0x2a,0x82,0xfe,0xec,0x43,0xab,0x07,0xad,0x16,0xf4,0xea,0x10,0xde,0x83,0xf1,0x6a,0xc3,0x58,0xe0,0x27, + 0xc0,0xc0,0xb6,0x70,0x84,0xa1,0x48,0xbf,0xd5,0x3d,0x60,0x9d,0x03,0x98,0x99,0xc3,0x7d,0x98,0x12,0xec, + 0x6b,0xab,0xdb,0x82,0xd6,0xa0,0x2b,0x9d,0xfd,0x23,0x78,0x70,0x08,0x35,0x74,0xbb,0xbd,0xfd,0x83,0x3e, + 0x0c,0x0b,0x76,0xb0,0x0d,0x9f,0xb8,0x7f,0xd8,0x3e,0x80,0xd9,0x68,0xb5,0xa0,0x13,0x87,0xad,0x1e,0x8c, + 0xdb,0x11,0x94,0x68,0x1f,0xb5,0xe0,0x13,0x0f,0xe0,0xc3,0xe1,0x05,0xb8,0x09,0x15,0x75,0xa0,0x9f,0x3d, + 0xb6,0xdf,0xea,0x1f,0xf5,0x0e,0xfb,0xed,0x3e,0xeb,0xef,0x1f,0xb5,0xfa,0xad,0xfd,0xfd,0x3e,0x3b,0x3c, + 0xec,0x1e,0x1d,0x1d,0x1c,0x1e,0x1c,0xb0,0x23,0xa8,0xad,0x0b,0x4b,0x01,0x3a,0x0d,0xb3,0x8c,0xb3,0xd2, + 0x86,0xb9,0xdc,0xc7,0xbe,0xc3,0xa4,0xc1,0x58,0x1f,0xf4,0xa0,0x5c,0xf7,0xe0,0xe0,0x08,0x3e,0x05,0x06, + 0xbb,0x8f,0x73,0xc4,0x3a,0xd8,0x4b,0xe8,0x76,0x7b,0x9f,0x75,0xa8,0x99,0x16,0x0c,0x1c,0xeb,0x74,0x61, + 0x00,0x60,0xe1,0x75,0x60,0x02,0x7b,0x9d,0xc3,0x5e,0x17,0x7a,0xdd,0xc3,0x3e,0xf5,0xa1,0x1f,0x6d,0x58, + 0x18,0xdd,0x0e,0x4c,0x74,0xb7,0xdd,0x83,0xca,0xba,0xdd,0x0e,0x2c,0x47,0x18,0xc5,0x43,0x60,0x25,0x60, + 0xcd,0x42,0x03,0xad,0x2e,0xb4,0x0a,0x03,0xde,0x86,0xe5,0xda,0xed,0x41,0xad,0xac,0xdd,0x6a,0xe3,0xda, + 0x80,0xca,0x18,0x7d,0x0b,0xad,0x04,0xe8,0x28,0xac,0x82,0xa3,0x6e,0xbb,0x0d,0xdf,0x0b,0xa3,0x80,0x43, + 0x0e,0x2d,0xe2,0xc4,0x75,0x7b,0x30,0xba,0xd0,0xfb,0x5e,0xbb,0x07,0x03,0xda,0x01,0x86,0xc3,0x2f,0x42, + 0x45,0xf5,0x7b,0xdf,0x69,0x0c,0x68,0x9d,0xcf,0xf0,0xc8,0xd9,0xeb,0xf7,0x48,0x12,0x12,0xa0,0x04,0x88, + 0xb7,0xc7,0x9f,0x8d,0xbd,0x76,0xe7,0x50,0x1d,0x97,0x22,0x2a,0xca,0x47,0xfa,0x09,0x84,0x61,0xb2,0xbc, + 0xb8,0x08,0x12,0xcc,0x8b,0x85,0xe0,0xfc,0xd0,0x4c,0xb7,0x63,0x4b,0xe7,0xa0,0xdd,0x43,0x46,0x4d,0x01, + 0x1b,0x8a,0x4c,0x86,0xb8,0xbb,0x07,0x7b,0x0b,0x36,0x15,0x2c,0x1e,0x09,0xb2,0x50,0x7c,0xad,0xc7,0x0e, + 0xbf,0x93,0xa5,0x35,0xf8,0x86,0xfc,0x8e,0x6e,0x47,0x7e,0x08,0x9a,0xd1,0xa5,0xbf,0xcc,0xe3,0xc7,0x8f, + 0xb3,0xfb,0xe0,0xd1,0xa3,0x6e,0x67,0x37,0x2b,0xc0,0x54,0xca,0x7a,0x07,0x41,0xc3,0x83,0x97,0xee,0xe4, + 0xd3,0x0c,0x81,0xb2,0x1e,0xb5,0xfb,0x83,0xac,0xd1,0x70,0x52,0x0c,0x51,0x0b,0x11,0xce,0x42,0xf4,0x26, + 0x68,0xf4,0xbe,0xcb,0x21,0x5e,0x42,0xc1,0xe0,0x51,0xbf,0x47,0x98,0x97,0x8a,0xd6,0xa4,0xa3,0x60,0xb7, + 0xbd,0x8f,0x33,0x88,0xbf,0x3a,0xe3,0x41,0x8a,0x19,0xd9,0xe8,0x6e,0x7f,0xdc,0xb0,0x81,0xc0,0xb1,0x03, + 0xe7,0x07,0xfc,0xd3,0x3e,0x74,0x7e,0xc8,0xa0,0x97,0x5d,0xa7,0x81,0x8f,0x0f,0xe8,0x69,0x04,0xcb,0x0b, + 0x1f,0xc3,0xdf,0x23,0xe7,0x87,0x08,0x1e,0xb7,0x5b,0xe4,0x6e,0x3c,0xf2,0x49,0x48,0x9c,0xb2,0x19,0x5b, + 0xb0,0x25,0x83,0x39,0x88,0x0a,0x5f,0x95,0xef,0x49,0xe4,0x5d,0x61,0x7d,0x33,0xd6,0xc7,0xea,0x66,0xb0, + 0x7d,0xf9,0xdf,0xce,0xbe,0xe3,0x34,0xec,0x59,0x7d,0xf1,0xc3,0xbf,0x99,0xd5,0x97,0x4e,0x23,0x83,0xee, + 0x61,0xfb,0x63,0x68,0xaa,0xc5,0x42,0x0f,0x13,0x65,0xb1,0x0e,0x96,0xf5,0x61,0x59,0xf1,0xbf,0x9d,0x0e, + 0xbe,0xe3,0xd7,0xe3,0x1f,0xfc,0xfa,0xfc,0x87,0xb8,0x3e,0x77,0xb0,0xf0,0xe0,0xca,0x5b,0xb2,0xa5,0xb7, + 0x40,0x0f,0x52,0x36,0xf3,0xa6,0x8d,0x88,0xaa,0x98,0x7a,0x73,0x36,0xf7,0x62,0x16,0x7b,0x3e,0xae,0xb5, + 0x46,0x88,0x77,0x57,0xa5,0xee,0x6b,0xcb,0x05,0x9f,0x2f,0xca,0x46,0x88,0xff,0x34,0x70,0xe6,0x5a,0x8e, + 0x16,0xb3,0xa4,0xf2,0x17,0x18,0x62,0xa1,0xc0,0x6d,0xf7,0x1d,0x60,0xec,0x66,0x67,0x78,0x1e,0xdb,0x87, + 0xcc,0x6a,0x21,0xbb,0xcc,0x01,0xc4,0xad,0x4a,0x11,0x58,0xa9,0x9c,0x34,0xbe,0xb4,0x71,0x52,0xf0,0xb3, + 0x0b,0x57,0xd3,0xdb,0x04,0xf8,0x2d,0x60,0xb7,0xed,0x82,0x8d,0x59,0xc2,0x85,0x71,0xbc,0xb5,0x01,0x66, + 0x18,0xc0,0x03,0x88,0xe4,0xb3,0xcc,0x2e,0xec,0x27,0x94,0xef,0xd3,0xe5,0x3c,0x13,0xd9,0x6b,0x88,0x63, + 0xf3,0x22,0x12,0xfb,0xfd,0xd9,0x71,0x4a,0x85,0x4e,0x68,0x93,0x10,0x5c,0x83,0x71,0x7a,0x91,0x8a,0xc0, + 0xd4,0xa0,0x71,0x71,0x09,0xe1,0x4b,0xf7,0x7e,0x18,0xed,0x1e,0xef,0xfe,0xd1,0xdf,0xfd,0xb1,0xb5,0x7b, + 0xf4,0x71,0x7c,0x87,0xf4,0x70,0xf5,0xa1,0x69,0xc3,0x41,0x7e,0x0f,0xc7,0xb8,0x23,0x91,0xea,0x84,0x1a, + 0x90,0xbf,0x90,0x2f,0xad,0x8b,0x90,0x81,0x97,0x8a,0x54,0x60,0xdd,0x05,0x0a,0xeb,0xce,0x91,0xa8,0xac, + 0x86,0x52,0x32,0xd3,0x1c,0x3b,0x19,0x92,0x05,0x8b,0x27,0x19,0x74,0xca,0x52,0x21,0x19,0xf4,0x7a,0x7d, + 0x27,0x53,0xcc,0x38,0x5d,0x48,0x6e,0x9c,0x2e,0xb8,0xf7,0x34,0xfd,0x44,0x06,0x09,0xfd,0x07,0xd0,0x91, + 0x9c,0x7c,0xa1,0x72,0xa2,0x75,0x11,0x1b,0x1c,0x1d,0x26,0x0a,0x93,0x5c,0x54,0x3d,0x72,0x05,0xbe,0x67, + 0x08,0x42,0x5a,0x99,0x7f,0xc7,0xe5,0x34,0x06,0xdd,0x77,0x95,0xc4,0x61,0x18,0xd9,0x81,0x51,0x77,0x38, + 0xbb,0xce,0xb5,0x9c,0x8c,0x8f,0x07,0x42,0x73,0xe2,0x6c,0x14,0x27,0x29,0xad,0x04,0x05,0xcc,0x2b,0x2e, + 0x15,0x27,0xbc,0x36,0x41,0x1c,0x17,0xc2,0xf9,0x3b,0x29,0xc5,0x19,0xa7,0xc5,0x6f,0xcc,0xeb,0x81,0x7f, + 0x96,0x1e,0xa7,0xca,0xeb,0xf0,0x6b,0x54,0x3b,0x32,0x3f,0x85,0x60,0xf3,0x2a,0xe4,0x3c,0xec,0x20,0x26, + 0xdf,0x9c,0xf1,0x7c,0xd6,0x51,0x7e,0x0a,0x28,0x6c,0x82,0x6b,0x8c,0xf3,0xe2,0xd1,0x3a,0x31,0x75,0xef, + 0x46,0xd4,0xf5,0xf3,0x55,0x00,0x5f,0x21,0xf7,0xec,0xf8,0xeb,0x10,0x71,0x91,0x23,0xf5,0x95,0x7e,0xb9, + 0x92,0x31,0xd5,0x55,0xa9,0x93,0x51,0x32,0xc5,0x52,0x93,0x70,0x61,0x87,0xb4,0xf7,0x78,0xd0,0xfe,0x1a, + 0xac,0xc9,0x70,0x13,0xd6,0xa4,0xd1,0x88,0x02,0x7a,0xad,0xa0,0x77,0xda,0x55,0x51,0x90,0x90,0xc0,0xd9, + 0x9e,0x2d,0x4a,0xbb,0xae,0xfe,0xba,0xf3,0x4c,0x44,0x11,0x54,0xad,0x97,0x00,0xb6,0xb8,0x72,0x52,0x5d, + 0x71,0x19,0x63,0x84,0x7c,0x85,0x69,0xbd,0xe0,0x0d,0x05,0x95,0x0d,0x15,0xd6,0xfa,0xba,0x35,0x49,0x84, + 0xb2,0x19,0x72,0x82,0x09,0xe4,0x86,0x5e,0x7b,0xd0,0x66,0x43,0xcf,0x19,0x2a,0x2d,0x15,0xce,0x85,0x3d, + 0x6b,0xac,0x09,0xdf,0xe3,0x93,0x2b,0xd5,0x40,0x2b,0x93,0xab,0x79,0x05,0x27,0x8f,0x3a,0x7f,0x04,0xda, + 0x30,0xc3,0x74,0x5d,0x5c,0xce,0x17,0x98,0x0e,0x81,0x4a,0xb1,0xb8,0x13,0xf2,0xcc,0x8a,0xc2,0x2b,0x17, + 0x48,0x5b,0x7b,0xa7,0x0a,0x1d,0xda,0x50,0x0f,0x28,0xc5,0x58,0x29,0x03,0x6f,0x42,0x5d,0x00,0x39,0xcf, + 0x4e,0xf5,0x11,0x48,0x94,0x1b,0x2d,0x7f,0xd0,0x74,0x5e,0xa6,0xab,0x19,0xda,0x34,0xf4,0xf8,0xcd,0x84, + 0xc7,0xaf,0x3f,0xb4,0x48,0x9b,0x89,0xd0,0x71,0xc2,0x1f,0x94,0xf1,0xd1,0x72,0x43,0x91,0x6f,0x88,0x7a, + 0x2b,0x5c,0x43,0x05,0xad,0x23,0x4c,0x5f,0x99,0x4f,0x5d,0x9e,0x08,0x5e,0x85,0x0d,0xa7,0xc2,0x44,0x25, + 0x9d,0x92,0x95,0x4d,0xc9,0x11,0x9e,0x3f,0x9e,0xaa,0x08,0xc7,0x5b,0x5a,0x92,0xe8,0x0e,0xed,0x29,0xf4, + 0x5b,0x94,0xfe,0x42,0x66,0x92,0xee,0xc8,0xcb,0x36,0x79,0xc8,0x72,0x6c,0x59,0x1c,0xf8,0xc8,0xa1,0xb1, + 0xb5,0x95,0x20,0x9b,0xa3,0x46,0xf0,0xd4,0x6c,0x9f,0xff,0x24,0xbb,0x3c,0xef,0x8a,0x57,0x69,0xc5,0xe2, + 0x4d,0x33,0xf2,0xa0,0xe0,0xfb,0x92,0xc9,0xcf,0xb1,0xb8,0x1f,0xa7,0x9e,0xb8,0x95,0xce,0xe4,0xa3,0xca, + 0x28,0x27,0xdc,0x58,0x04,0xc3,0x2b,0xce,0x26,0xae,0x10,0xdd,0x05,0x7c,0x8d,0xe9,0xa6,0x14,0xa1,0x83, + 0x20,0xe6,0x1c,0x17,0x1b,0x4b,0x06,0x3e,0x82,0x84,0x1d,0xae,0xf4,0x2a,0x92,0x42,0xbf,0x36,0xf6,0xe5, + 0xa6,0x09,0x48,0x3f,0xed,0xc8,0xe4,0x97,0x6c,0x7d,0x74,0x18,0x4d,0x4c,0x07,0xf5,0x52,0xa8,0x41,0xf5, + 0x0c,0x51,0x20,0x84,0xc8,0xfe,0x8a,0x4a,0x9f,0x7c,0x48,0x69,0xac,0x63,0x5d,0x1f,0xb6,0xc0,0x7c,0xc3, + 0xeb,0x3d,0x81,0x0d,0x96,0x22,0x22,0x77,0xb5,0xc2,0x12,0x5d,0xa3,0xa5,0x9b,0x96,0xb0,0x27,0x39,0x03, + 0x41,0x41,0x84,0x02,0x33,0xe7,0xca,0x85,0xba,0x4b,0xaa,0x1d,0xbb,0x4c,0x5a,0xd2,0xb0,0x5e,0x4f,0x3c, + 0x6a,0xc3,0x9e,0x13,0x36,0xc5,0xfc,0xfe,0xbe,0x14,0x90,0xea,0x33,0x15,0x77,0x25,0xde,0x62,0xdc,0xab, + 0xb7,0x18,0x61,0x5a,0x28,0x66,0x93,0x22,0x86,0xd2,0xda,0x93,0x32,0xc6,0xa5,0x6b,0x47,0x56,0xb2,0xc9, + 0xb8,0x2a,0x9a,0x09,0x80,0x55,0x78,0x98,0xdd,0x74,0xdd,0x79,0xb1,0xd6,0x3f,0xae,0xb0,0xf0,0xd0,0xd5, + 0x52,0xec,0x94,0x4a,0x3e,0xc8,0xdf,0x76,0x60,0x49,0xca,0x9a,0x77,0x4b,0xf4,0x89,0x8d,0x54,0xab,0xb6, + 0xb8,0x69,0x7d,0x6e,0x3d,0x16,0x40,0xc9,0x58,0xf5,0xbb,0xe0,0xf2,0xf4,0xf3,0xc2,0xb6,0x7e,0xb0,0x1a, + 0xfc,0x61,0xc3,0xfa,0x60,0x32,0xc2,0xe8,0xd9,0x81,0xe7,0x28,0x11,0xff,0x40,0xc1,0xba,0x3f,0xa8,0x73, + 0xc9,0x3a,0x1d,0x58,0x15,0x7f,0xa2,0x1b,0x10,0xf6,0xb1,0x64,0x13,0xf7,0x90,0x6c,0xe6,0x1e,0xaa,0xd4, + 0x5a,0x1a,0x9b,0x8d,0xef,0x01,0xa9,0x5c,0x9b,0x57,0xed,0x93,0x98,0x67,0xae,0xdc,0x21,0x3d,0xed,0x5a, + 0x30,0xe4,0xd2,0x17,0x4f,0x1f,0xb8,0xe7,0x02,0x63,0xcf,0x4d,0xb9,0x16,0x4f,0xd0,0x4f,0xbc,0x9a,0x7f, + 0xd5,0x0e,0xe4,0x55,0x6d,0xd9,0x86,0xd2,0xbe,0xab,0x47,0xd9,0xcc,0x64,0xb1,0x88,0x17,0x18,0x1f,0xb8, + 0x39,0x74,0x82,0xb6,0xc8,0x4c,0x79,0xe3,0x79,0xd4,0xcf,0x05,0x11,0x7f,0xbe,0x2c,0x4a,0xfb,0x38,0xd6, + 0xfb,0x78,0xb1,0x6d,0x07,0x2f,0x2a,0x5b,0x15,0xfb,0x79,0x36,0xb4,0x9a,0x7c,0x43,0x37,0xf9,0x8e,0x5e, + 0xc8,0x9a,0x0a,0xfb,0x78,0xc1,0xc4,0x0a,0x9f,0xc3,0x1a,0x67,0x8b,0xd2,0x91,0xc0,0xcf,0x83,0x80,0x26, + 0xe2,0xc5,0x2c,0xb5,0x8b,0x26,0xb3,0x3c,0xb7,0x97,0xc3,0xb7,0x46,0xd6,0x21,0x30,0x92,0x49,0x17,0x7c, + 0x85,0xb9,0xad,0x6f,0x8d,0x7f,0xb0,0x70,0xfc,0x10,0x8c,0xbb,0xe1,0x14,0x82,0x7d,0x55,0x23,0xb8,0x66, + 0xdc,0x1d,0xcd,0xaf,0x98,0x1e,0xc5,0xce,0x9a,0x8f,0xe3,0x10,0x5b,0x22,0xf6,0x57,0xe6,0x62,0xd3,0x36, + 0x18,0x27,0x9f,0x14,0xaf,0xc2,0xea,0x42,0xee,0x0f,0x15,0x8e,0xb1,0x0e,0x6b,0xe9,0xe4,0x6c,0x63,0x10, + 0x07,0xab,0x98,0x26,0x4d,0x61,0x8d,0xe3,0x37,0x53,0x30,0x1b,0x26,0x48,0x66,0x28,0x6e,0x15,0xc2,0xf5, + 0x15,0x69,0xf5,0x55,0x1e,0x70,0x1d,0x14,0x00,0xdf,0x86,0xcd,0xc5,0xd7,0x32,0x8c,0xc1,0x37,0xf2,0x2c, + 0xa2,0xb6,0x6b,0xed,0x2b,0x41,0x92,0x88,0x0d,0x13,0x1a,0xaf,0xac,0xff,0x56,0xd9,0x7a,0x05,0x57,0x21, + 0x9c,0x7e,0xa4,0x54,0x4c,0x0b,0x7b,0xad,0xff,0x53,0xe4,0xc9,0x34,0x16,0x39,0x37,0xb9,0x7c,0x5a,0x4b, + 0x93,0xa0,0x6c,0xf0,0x6f,0x92,0x9b,0x3c,0x10,0x9b,0x7c,0x5d,0x41,0x26,0x8d,0x99,0x5c,0xa9,0xf7,0x2c, + 0x4e,0x6e,0x50,0xa3,0xa8,0x9d,0x7d,0x55,0x80,0x3b,0xd1,0x09,0xb1,0xa7,0xf4,0x53,0x72,0x8f,0x23,0xd4, + 0x4f,0x75,0x4b,0x84,0xc7,0x32,0xeb,0x36,0x98,0x2c,0xc3,0x5c,0x69,0xff,0x12,0x31,0x38,0x98,0xd5,0xce, + 0xdd,0x95,0x50,0xa5,0xf0,0x00,0x7e,0xc6,0xf3,0x4f,0x01,0xcf,0x7a,0xae,0x4b,0x4c,0xfc,0x34,0x98,0x7d, + 0xa4,0x38,0x50,0x72,0xf1,0xb1,0xf5,0x23,0x0e,0x1f,0xf8,0x11,0xd7,0xb9,0xc5,0x42,0xe1,0x41,0xaf,0x1f, + 0x07,0x9f,0x17,0x64,0x12,0xfb,0xc8,0x89,0x26,0x15,0x11,0x42,0x9e,0x3a,0x79,0x0c,0xab,0xa3,0x89,0xde, + 0x5a,0xb4,0x8c,0x4b,0xbb,0x68,0xc3,0x4a,0x69,0x56,0x2d,0x96,0x0c,0x55,0x88,0xfd,0xdb,0x37,0x67,0xe7, + 0x16,0xc3,0xec,0x00,0x6e,0xca,0xb6,0xda,0x1a,0x93,0xd5,0xca,0xad,0x7c,0xf5,0xe1,0x42,0x33,0xe7,0xe9, + 0xee,0x44,0xd2,0x12,0xd1,0xd9,0x58,0x08,0xbc,0x79,0x78,0x59,0x04,0x8e,0xad,0xd7,0xe7,0xda,0x70,0x94, + 0xf7,0x18,0x60,0x73,0x75,0x22,0xbd,0x68,0x1f,0xbe,0x6e,0x06,0xd1,0x88,0x2f,0x2e,0xcc,0x80,0xc0,0x73, + 0x1b,0x8a,0x2c,0x07,0xbc,0x1f,0xf6,0x74,0x28,0x97,0x9f,0x2a,0x41,0x98,0x41,0xf7,0xf7,0x73,0xb9,0x33, + 0xef,0xef,0x39,0xb9,0x78,0xcb,0x31,0xd0,0xf5,0xc1,0xca,0x3f,0x6a,0xc6,0x57,0xa5,0x78,0x99,0xb2,0xb0, + 0xcc,0x38,0x81,0x9b,0xd3,0x9f,0x7a,0xdd,0x42,0xd4,0x5d,0xb4,0x6b,0x93,0x8f,0xa1,0x28,0x38,0x9c,0x6b, + 0xf7,0x37,0x78,0x61,0x91,0xc0,0x83,0x85,0x78,0x5d,0x2c,0xe3,0xb7,0x2f,0xce,0x7e,0x73,0xfa,0x72,0x9b, + 0x43,0xca,0x22,0x4c,0xaf,0x83,0xf9,0x1e,0x77,0x71,0xc0,0x64,0x30,0xd6,0xa0,0x94,0xf7,0x50,0x64,0x3f, + 0x92,0x00,0x1f,0xeb,0x13,0xe8,0x61,0xfb,0x45,0x45,0x19,0xdc,0xc9,0x65,0x52,0x34,0x53,0x11,0x9a,0xd5, + 0x4a,0x2d,0x18,0xc8,0x03,0xbc,0xc4,0x9e,0x06,0x5d,0xcc,0xd9,0xe2,0x49,0x2d,0x56,0x4a,0xd5,0x67,0x16, + 0xc9,0x37,0xa8,0xfd,0xaf,0xaa,0x9b,0x23,0x77,0xab,0xdd,0xf8,0x62,0x17,0x53,0xd4,0x52,0xaa,0xea,0x9f, + 0xdf,0x1c,0xc8,0xb2,0x6f,0x69,0x40,0x4b,0xed,0x55,0x8c,0x9a,0x2a,0x79,0x7f,0x5f,0x9e,0xab,0x52,0x8b, + 0x15,0x45,0x8c,0x5c,0x6b,0x54,0x95,0x38,0xce,0x2b,0xbf,0x33,0xdf,0x33,0x47,0x1c,0x8a,0x1b,0x27,0x0b, + 0xe3,0xd3,0xce,0x63,0xfe,0x96,0xa9,0xeb,0x43,0xc3,0x37,0x6f,0x90,0x32,0xe2,0x21,0x5a,0x94,0x97,0xef, + 0x00,0x0f,0xc4,0x9a,0xf2,0x88,0xee,0xdf,0x93,0xab,0x5f,0xbd,0x1e,0x95,0xee,0x35,0xb1,0x85,0x57,0x7c, + 0x9b,0xd8,0x22,0xf1,0xb3,0x9f,0xa2,0x32,0xcd,0xbe,0x8b,0x30,0x9c,0x81,0x03,0xdf,0x61,0x74,0x14,0x22, + 0x12,0xab,0x8e,0x51,0xa8,0xdc,0x17,0xde,0xb1,0xf3,0xab,0xe0,0x06,0x73,0xb5,0xe5,0x3a,0x2b,0x7d,0xa1, + 0xf1,0x99,0xc5,0xe8,0x8f,0x6b,0xcd,0xa5,0xfb,0xbd,0x8a,0x4e,0x93,0x3f,0x04,0x54,0x38,0x41,0xb6,0xc0, + 0xa2,0x6b,0xd2,0x0b,0x43,0xf1,0x02,0x86,0x71,0x25,0xd7,0x98,0x7d,0x83,0xd2,0x98,0x14,0xa2,0xa3,0x68, + 0xff,0xf1,0x8f,0x47,0xbd,0x3c,0xe1,0x30,0xf3,0x4b,0x7c,0x8c,0x5a,0x15,0xee,0x8a,0x64,0x48,0x3a,0xa9, + 0x9c,0x09,0x59,0x02,0x7b,0x9f,0xbb,0x01,0xfc,0x2c,0x46,0x86,0x4b,0xe4,0x9d,0xfc,0x43,0xd2,0x2c,0x26, + 0x4e,0x55,0x2b,0x7a,0x84,0x26,0xfd,0xde,0x79,0xcc,0x79,0x66,0x33,0x85,0x9a,0x9f,0x91,0xd6,0x96,0x90, + 0xd3,0x24,0x72,0x66,0xd1,0x12,0xe7,0x17,0xf3,0xa9,0xf9,0x3c,0x9f,0x1a,0x5a,0x90,0x80,0x4f,0xbe,0xf2, + 0x93,0x27,0x40,0xb0,0x8e,0x51,0x35,0x6a,0x32,0x7a,0xd4,0xd8,0x28,0x1c,0x0b,0x3f,0x74,0xc2,0x2d,0x7c, + 0x48,0x26,0x13,0x14,0x27,0xa0,0xab,0xfd,0x9e,0x99,0x76,0xd3,0xb4,0x82,0x44,0x1c,0x0d,0xc1,0x54,0x89, + 0x19,0x56,0x90,0xd0,0xb4,0x82,0x44,0xd2,0xb9,0x3e,0x94,0xd6,0x0f,0xc9,0xae,0x33,0xcb,0x91,0x3e,0x4d, + 0x2c,0x54,0xf6,0x10,0x7c,0xc7,0xb7,0x73,0xc7,0x4a,0x84,0x28,0x95,0x89,0x25,0x03,0xb6,0xd1,0x56,0x82, + 0x4c,0x00,0xf7,0x0e,0x5a,0x15,0x8c,0xfc,0x2f,0x66,0xcf,0xa0,0x97,0x46,0xc7,0xd7,0x64,0xc1,0xcb,0x31, + 0xa6,0xfa,0xf6,0xe8,0x07,0x6d,0x4c,0xd9,0x1d,0xef,0x5d,0x32,0xeb,0xa3,0x91,0xa4,0xab,0xdb,0xc1,0xf4, + 0x71,0xd8,0x8c,0x55,0xe4,0xa6,0xf8,0xd4,0x9f,0xc1,0x52,0x44,0xf7,0x4f,0x33,0x37,0xdd,0x26,0x8d,0xe7, + 0x2f,0x41,0x05,0x18,0x54,0x6d,0x2f,0x8c,0xa3,0xd8,0xe5,0x03,0x6d,0x31,0xaa,0xdd,0x0d,0xb4,0x62,0x86, + 0xa9,0x70,0x7e,0xd7,0x40,0x6a,0x63,0x3a,0xa6,0xdf,0x35,0xf1,0xda,0xcc,0xd3,0xfe,0x81,0x6d,0x61,0x80, + 0x19,0x4e,0x9b,0x76,0xcb,0x85,0x4a,0xd6,0x0f,0x15,0xd7,0x2c,0x10,0xcb,0x99,0xdf,0x3a,0x32,0x7a,0x5e, + 0x6e,0x92,0x12,0x79,0x1b,0xe6,0xa9,0x96,0x80,0xd0,0x2d,0xec,0xbf,0x3b,0xe1,0xdb,0x1b,0xad,0x0c,0x43, + 0x95,0xff,0x17,0xb1,0x8b,0xf8,0x9b,0xec,0x22,0x7e,0xc1,0x75,0x50,0x2b,0xfc,0x85,0xcb,0x2b,0xd7,0x12, + 0x13,0x11,0x2a,0x2c,0x93,0xec,0x01,0x8a,0x71,0x67,0x90,0x16,0x7c,0x0e,0x2f,0x42,0xcc,0x70,0x2e,0x95, + 0x6d,0xdc,0x61,0xb3,0xa8,0x86,0xc9,0x1c,0xa1,0xca,0xcd,0x73,0x5f,0xe8,0x23,0xb7,0x6d,0x74,0xf3,0xb3, + 0x91,0x70,0x99,0x7c,0xd7,0x6a,0xe8,0xd4,0x79,0xda,0x04,0xdb,0xed,0x73,0x4c,0x54,0x9e,0x85,0xc0,0x87, + 0xd7,0x6f,0x0a,0x8f,0xc5,0x6e,0xea,0xa0,0xd6,0xb0,0x80,0x65,0x56,0x98,0xc0,0x61,0x53,0xa4,0x7b,0x7d, + 0x31,0x43,0x45,0x09,0x82,0xe7,0x57,0x51,0x6a,0x38,0xea,0xb6,0x7f,0x83,0x21,0x48,0x71,0xa1,0xf9,0x0d, + 0x1c,0x1b,0x34,0x6d,0x5c,0x0d,0xe6,0xac,0x18,0xf9,0xc3,0x0d,0x8a,0x6b,0x48,0x75,0xc1,0x4d,0x28,0x35, + 0x79,0xe2,0xc6,0x4c,0xad,0x2b,0x56,0xb9,0x2f,0xe0,0x3d,0xb5,0x2f,0xcc,0xd7,0x85,0x7d,0xf1,0x06,0x6a, + 0x71,0xc3,0x26,0x16,0x46,0x6a,0x82,0x79,0x7d,0xf6,0xc8,0xef,0x0a,0x57,0xc0,0x09,0x9c,0x76,0xfd,0x9e, + 0x70,0x9b,0xd2,0x84,0x38,0x74,0xa4,0x72,0x3e,0x65,0x52,0xdc,0x70,0x53,0x14,0x42,0x2a,0xa2,0x31,0x52, + 0xcd,0x87,0xae,0x72,0x46,0xd2,0xaa,0xc1,0xab,0x0c,0xa9,0x5c,0xb3,0x65,0xfd,0x4f,0x39,0x1f,0xcd,0x6d, + 0x63,0x0e,0x67,0x5a,0x9e,0x07,0x41,0x80,0x09,0x38,0x12,0x86,0x39,0x26,0xc3,0x64,0x2b,0x28,0xac,0x17, + 0xd3,0xde,0xb2,0xd4,0x33,0xa9,0xb9,0x08,0x6e,0x49,0xbc,0xb4,0xc1,0x15,0x27,0x02,0x2d,0xcb,0x38,0x53, + 0x9b,0x7a,0xf4,0x18,0x7c,0x4d,0x78,0x93,0x1f,0x5c,0x47,0x1a,0x2d,0xc4,0x3d,0x84,0xbe,0xe2,0x4a,0x0f, + 0x2c,0x8a,0x51,0x94,0x5e,0x21,0x3e,0x26,0x76,0xa4,0x6a,0xa6,0x5a,0x11,0x94,0x6c,0x53,0x04,0x61,0x5f, + 0x51,0xd7,0x83,0xa8,0x81,0x3a,0x8c,0xa6,0xb8,0x2f,0xef,0x8c,0x48,0x66,0xbe,0x42,0x92,0x95,0xe3,0xac, + 0xd5,0xef,0x26,0x2c,0xa7,0x3c,0x61,0x05,0x7b,0x09,0xcb,0x69,0x6b,0x1e,0xa6,0x00,0x0e,0xe5,0xc2,0xc5, + 0xa6,0xd4,0xc2,0x8d,0xaf,0x31,0xfa,0x45,0x76,0x48,0x2c,0x93,0x44,0x02,0xaa,0x54,0xc2,0x1c,0xae,0xaf, + 0xa8,0x2d,0x2a,0x2a,0x9f,0x0e,0xd5,0xeb,0x8f,0xaf,0xb0,0x97,0x2f,0x7e,0x77,0xfa,0xf1,0xf5,0xf1,0xab, + 0x53,0x0f,0x41,0x03,0x6f,0x77,0x31,0x4c,0x32,0x0c,0x6e,0xf9,0xe4,0xf3,0x95,0x25,0x24,0x38,0x20,0x2d, + 0x68,0x40,0xa8,0x5c,0xb5,0xa2,0xc8,0xbf,0xd2,0xc2,0x1d,0xa8,0xb3,0x4c,0x77,0xcd,0x51,0x03,0x23,0x92, + 0x6e,0x55,0x50,0x87,0x40,0xd3,0x3a,0x31,0x62,0x7c,0xa8,0x2c,0x4a,0xea,0xc3,0x8c,0xb4,0x50,0x5a,0x6e, + 0x25,0x7c,0x6b,0x34,0xbc,0xa2,0x49,0xac,0x3c,0x1e,0x2d,0xb9,0xe4,0x77,0x46,0x26,0x95,0x31,0x37,0xc0, + 0xd8,0x40,0x7d,0xa2,0x8d,0x80,0xfc,0x0d,0xcf,0x20,0x6a,0xed,0x78,0xd8,0x67,0xd4,0x85,0x19,0x5b,0xeb, + 0xfe,0xde,0xbc,0x92,0xa9,0xff,0x8e,0x82,0xde,0x83,0x94,0xca,0xd1,0xe6,0x0d,0xcb,0x0f,0x46,0x9f,0x1f, + 0x8c,0xb8,0x55,0x45,0x5e,0x1c,0xda,0xa6,0x3c,0xc8,0x9a,0xab,0xa7,0xb6,0xf9,0xb0,0x10,0xaf,0xb7,0xd6, + 0x90,0x1e,0x34,0x0b,0x6a,0x97,0x87,0xd8,0x01,0x7c,0x4f,0x38,0xf4,0xf3,0x6d,0x27,0xcc,0xa1,0xa5,0xaa, + 0x56,0x4a,0x5f,0x55,0x8c,0xac,0x8b,0x24,0xfc,0x97,0x54,0x32,0x23,0xdf,0xbb,0xe9,0x43,0x24,0x99,0xa7, + 0x92,0x43,0x7d,0xcd,0xf5,0x0b,0x3e,0x52,0xc3,0x3b,0x74,0x55,0x31,0x49,0x3f,0xf7,0x4c,0x49,0x73,0x7d, + 0xac,0x0c,0xb0,0x5b,0xc1,0xe1,0x5b,0x26,0xb0,0x92,0xb8,0x1a,0xba,0xcf,0x2d,0xea,0x7f,0x20,0x92,0xdc, + 0x86,0x21,0x94,0xfe,0x95,0x34,0x2b,0xc6,0x40,0x24,0xec,0x91,0x2c,0x87,0xb8,0xc7,0x39,0xf2,0xb4,0xfa, + 0x19,0x3b,0xa4,0x85,0x7b,0x2e,0x95,0xc7,0x62,0xa2,0x4e,0xba,0xcc,0x20,0x44,0x5f,0xbf,0xdf,0x32,0xd2, + 0xfd,0xc0,0x98,0x5f,0x70,0xa5,0x90,0xde,0x79,0x8a,0x42,0x2d,0xb0,0x94,0x50,0xec,0xd0,0x78,0x67,0x6a, + 0xd1,0xad,0x34,0x90,0x4b,0x05,0x7d,0x82,0x73,0x55,0x53,0xae,0x97,0xe1,0xa7,0xe0,0x0d,0x9a,0xd2,0xd8, + 0x1c,0x08,0x20,0x5e,0xc1,0xb2,0x43,0xa0,0x32,0xfd,0xf8,0x7b,0x8c,0x22,0x23,0x59,0x0d,0x61,0x14,0xd5, + 0xed,0xdf,0x2e,0x83,0x65,0xe0,0x09,0x61,0xac,0x29,0x74,0x92,0xb6,0x53,0x4d,0xfd,0xf0,0x05,0x62,0xe0, + 0x73,0x8d,0xb6,0x54,0x50,0x4b,0x55,0x6b,0xc0,0x50,0x59,0x93,0x30,0xbb,0xf1,0x17,0xe2,0x84,0x44,0x84, + 0x89,0x3b,0x0c,0x4c,0xc6,0x51,0x97,0x18,0x37,0x9c,0xa4,0x2b,0x1a,0x2d,0x50,0x71,0x80,0x8b,0x01,0x52, + 0xed,0x8e,0x46,0xb2,0x06,0xd6,0x82,0xff,0x07,0xcd,0x5b,0xf8,0xef,0x8a,0x99,0x9b,0x7e,0x3c,0x5e,0xb9, + 0x0f,0xae,0x94,0x90,0x77,0xcc,0xb7,0x57,0x52,0xd0,0x2d,0x8e,0x4b,0xe1,0xba,0xc9,0x17,0x05,0x8f,0x34, + 0x74,0x50,0x8d,0x10,0xd9,0xb9,0x58,0x5f,0x73,0x60,0x80,0x49,0x84,0x0f,0xae,0x1a,0x12,0xe7,0x81,0x10, + 0x41,0x91,0x53,0x98,0x4e,0xbd,0xc6,0xd5,0x11,0x87,0x76,0x31,0x5d,0x06,0xed,0xc7,0xc6,0x1b,0xfa,0x20, + 0xac,0x38,0x18,0x09,0x27,0xbc,0xf0,0x81,0xab,0xb5,0xd3,0xfe,0xe6,0xe2,0xc2,0x2e,0x4e,0x7c,0x7b,0xa0, + 0x91,0xeb,0xaa,0xbe,0x93,0x7c,0xf8,0xf9,0x67,0xe6,0x9b,0x61,0x3b,0xf9,0x81,0x0a,0xb6,0x0f,0x54,0x4e, + 0x84,0xc9,0x8d,0x13,0x88,0x5b,0x7a,0x8a,0xcb,0x38,0xb0,0xa6,0xe7,0x44,0x0e,0x07,0xf6,0x94,0xf0,0x6d, + 0x8a,0xcb,0xb9,0x5e,0x2f,0x7c,0x73,0x51,0xf9,0x53,0xc9,0xf8,0xaa,0x23,0x29,0xaf,0x85,0x83,0xa3,0xff, + 0x17,0x6a,0xa5,0x50,0x7d,0xd3,0xb0,0x23,0x7d,0xb2,0x5a,0x43,0xa0,0xdf,0x56,0x1d,0x9e,0x0f,0xd1,0x70, + 0x43,0xef,0x54,0xcb,0xfb,0x3e,0x3c,0xae,0x23,0x0c,0x59,0xea,0x1d,0x7e,0x46,0xd7,0xfb,0xcf,0x87,0xf5, + 0x2b,0x58,0x6e,0x1e,0xe7,0x32,0xc8,0x30,0x07,0xe3,0x59,0xfd,0x72,0x4e,0x43,0x0a,0xf5,0x20,0xa8,0x99, + 0x91,0xdc,0xbc,0x0a,0x30,0x8d,0x3e,0x9b,0x50,0x5b,0xaa,0x30,0xde,0xd2,0x05,0xcf,0x96,0x58,0x86,0xdc, + 0x0b,0x66,0x2f,0x65,0xca,0x39,0x47,0x22,0x94,0x85,0x14,0xc7,0x26,0x12,0x1e,0x9a,0xcc,0x15,0x43,0x20, + 0xb6,0x50,0x43,0x9d,0x19,0x28,0x9c,0x0c,0x28,0x65,0x7c,0xeb,0x62,0x0c,0xfe,0x82,0xd2,0x2d,0xed,0xe2, + 0xe1,0x32,0xa8,0xe9,0xeb,0xdb,0x24,0xcc,0xb8,0x73,0xd9,0x5a,0x6c,0x0b,0xde,0xd6,0x6d,0xe2,0x2f,0x24, + 0x70,0x7c,0x8a,0x68,0x2b,0xc5,0xe4,0x56,0x77,0x3b,0xc6,0xaa,0xa8,0xd7,0xd5,0xd4,0x22,0xe3,0xe7,0x83, + 0x58,0x6d,0xa7,0x0e,0x59,0x6e,0x0a,0xe1,0xbd,0xa4,0x79,0x62,0xe9,0x7a,0x9c,0x43,0x3d,0x26,0xef,0x23, + 0xe8,0xfd,0xf4,0x8a,0x0c,0xf7,0x04,0xe4,0xce,0xfa,0x18,0x60,0xb5,0x36,0x65,0xa2,0xd8,0xd8,0x26,0x2c, + 0x49,0x05,0x6b,0xca,0xfd,0x1b,0x90,0xef,0xe2,0x96,0x2b,0x0a,0x75,0xcb,0x71,0xab,0xf8,0x4c,0xc5,0xbb, + 0xe5,0xf9,0xd6,0xbc,0xe4,0x8e,0x8e,0x1a,0xb8,0x72,0x69,0x93,0xd7,0xeb,0x92,0x77,0x25,0x17,0xc6,0x28, + 0x75,0xb8,0x74,0x84,0xa2,0xbd,0x29,0xc1,0xd2,0x53,0x3c,0x4d,0xe5,0x36,0xab,0x96,0xce,0x7d,0x7d,0xa5, + 0x00,0x12,0x2a,0xe5,0x4d,0x8c,0x91,0xb2,0x77,0xda,0xf4,0x0a,0x1a,0x7e,0x24,0xde,0xb9,0x32,0xcd,0xf8, + 0xd2,0xec,0xb2,0x56,0x54,0x27,0xde,0x90,0x67,0xf6,0x56,0xbd,0x93,0x24,0x41,0x6c,0xfa,0x7c,0x48,0x58, + 0x6e,0x40,0x8d,0xb9,0x2f,0x62,0xea,0x18,0x1b,0x82,0x23,0x39,0xe6,0xe0,0xed,0x2a,0x54,0xdc,0x95,0xf2, + 0x3f,0xba,0x35,0x84,0x20,0xf6,0xe1,0xce,0xd5,0x02,0x02,0x6d,0x6b,0x77,0x64,0xc1,0xc6,0x06,0x1e,0x1c, + 0xb7,0xb6,0x35,0x66,0x82,0x3f,0xf9,0x5d,0xe8,0xbf,0xf5,0x31,0x38,0x8d,0xe3,0x77,0x14,0x14,0xda,0xda, + 0xc2,0x5a,0x78,0x30,0xd8,0xa0,0xf9,0x36,0xd4,0x6b,0x3c,0x29,0x1b,0x09,0x65,0x7a,0xbc,0x86,0x86,0x48, + 0xef,0x3b,0x8a,0x53,0x2a,0x15,0x90,0xd2,0x13,0x96,0x21,0x90,0x96,0x52,0x0d,0x4a,0xe5,0xc9,0x35,0x1f, + 0xe6,0x82,0xe1,0x2e,0x53,0xc3,0x42,0x8f,0x24,0xaa,0x3f,0xd4,0x57,0xd1,0x23,0x62,0x58,0x7c,0xf1,0x74, + 0x17,0xd3,0xed,0x95,0x56,0xa0,0x22,0xf4,0x78,0x1c,0xae,0xdd,0x5e,0xe8,0x3b,0x9e,0x83,0x71,0xcf,0x9f, + 0x19,0x82,0x0e,0x61,0xe8,0x68,0x31,0x32,0xb0,0xd8,0xca,0x86,0x46,0x10,0x48,0x07,0x53,0x78,0x68,0x30, + 0x3e,0xb3,0x15,0x3a,0x0c,0xa5,0xa2,0xf1,0xab,0x0f,0x42,0x86,0x40,0x61,0x3e,0x0e,0x03,0x2d,0x0b,0xf3, + 0x54,0x94,0xa7,0xd7,0xbb,0xf3,0xf3,0xf3,0x97,0x1f,0x9f,0xbd,0x3b,0xfd,0xad,0x37,0x6a,0xb1,0x4e,0x9f, + 0x82,0x7f,0x58,0xe7,0xa8,0xc7,0xba,0x18,0x19,0xd5,0x6d,0x31,0x8c,0xe6,0xea,0x1e,0xb4,0x30,0x90,0x8d, + 0xf5,0xda,0xfb,0xac,0xd7,0x6b,0xb1,0x5e,0xbf,0xcf,0x7a,0x47,0x18,0x07,0xd4,0x65,0xfb,0xfb,0xf0,0xf7, + 0xf0,0x80,0xf5,0x3b,0x1d,0x0c,0x7a,0x62,0xfd,0xa3,0x43,0x76,0x00,0x65,0x0e,0x0e,0x7b,0xec,0xb0,0xdb, + 0x66,0x87,0x87,0x2d,0x76,0xd4,0xed,0xb0,0xa3,0xc3,0x43,0xd6,0x6e,0xf5,0x0e,0x58,0xbb,0xdd,0x3a,0x82, + 0x7f,0x0e,0xf6,0x31,0xb6,0x0c,0xfe,0xe9,0xb6,0x8f,0x30,0x9e,0x0b,0x1e,0xf4,0xa0,0x68,0x7b,0xbf,0x0f, + 0xe5,0xfa,0xfd,0x36,0x6b,0x1f,0xf4,0xe1,0xf2,0xb0,0x0f,0x45,0x8e,0x0e,0xfa,0xac,0xd3,0xc2,0x68,0xb9, + 0x4e,0x1b,0x7a,0x47,0x01,0x66,0xbd,0x43,0x0c,0x49,0xa2,0xa0,0x2e,0xe8,0x49,0xe7,0xa8,0x8f,0xa1,0x72, + 0xdd,0x3e,0x06,0x3b,0x75,0x58,0x77,0xbf,0x03,0x97,0x07,0x1d,0xe8,0xfa,0xd1,0x7e,0x7b,0xcc,0xf8,0x67, + 0x9e,0x9d,0xbe,0x7a,0xe1,0xdd,0x4d,0xdd,0x36,0x9b,0xb9,0x5d,0x16,0xb8,0xfb,0xec,0xc2,0xed,0xb3,0x4b, + 0xf7,0x90,0xf9,0x6e,0xbb,0xc5,0x26,0x6e,0xbb,0xb3,0x12,0x45,0x5f,0x1d,0xff,0x8d,0xb7,0xdf,0xee,0x88, + 0xab,0xef,0x8f,0xdf,0x7a,0xcd,0x56,0xab,0x8f,0x3b,0x38,0x78,0x95,0xca,0x48,0x20,0x33,0xe2,0xe8,0xbb, + 0x6c,0xaf,0xe3,0x18,0x16,0xa1,0x2c,0xcb,0xe6,0x6f,0x29,0x35,0xaa,0x61,0x64,0x13,0xef,0xd9,0x77,0xa6, + 0xc0,0x10,0x30,0xb2,0xd3,0xba,0x19,0xd7,0x0c,0xcb,0x68,0xa4,0xc7,0xd0,0xbc,0xf2,0x50,0x11,0x79,0xdb, + 0xbe,0xd4,0xc2,0xb4,0x36,0x8f,0x11,0x80,0x10,0x13,0x00,0x46,0x35,0x28,0x53,0x43,0xeb,0x0d,0xc8,0xb6, + 0x41,0x02,0xdc,0x23,0xbe,0xa3,0x73,0xf2,0x52,0x82,0xae,0xcf,0x6f,0x80,0xd6,0xb9,0x9c,0x1c,0x45,0x8f, + 0x5a,0x66,0x95,0x88,0xdc,0x10,0x5d,0xd6,0xbe,0x75,0xbf,0xad,0xf9,0x17,0x19,0xd5,0x19,0xd4,0x44,0x43, + 0xdc,0xf1,0xa1,0x18,0x1a,0xe5,0xe7,0x2b,0x65,0x88,0x76,0x45,0x87,0xc1,0xda,0x8a,0x79,0x0a,0x52,0xaa, + 0x59,0x24,0x91,0x2f,0xd6,0x19,0xa2,0xdf,0x90,0xb0,0x8f,0x44,0xd2,0x2b,0x44,0xc4,0x47,0xeb,0x3a,0x0b, + 0x5d,0xc3,0x81,0xe0,0xa0,0xcf,0xac,0x25,0xfc,0xdf,0xc5,0xb0,0x75,0x7a,0x9b,0xdf,0x32,0x87,0xaf,0xd3, + 0xcb,0x8d,0x1e,0xbc,0xaa,0x42,0xc0,0xee,0x66,0x6e,0x8f,0xc5,0xb0,0x3c,0x26,0x6e,0xbf,0x8b,0xa9,0xe6, + 0xee,0x50,0xe2,0x95,0x3d,0x85,0xef,0x66,0xc2,0xa6,0x26,0x48,0x2b,0xf9,0x9b,0x1a,0x96,0x29,0xed,0xdb, + 0x08,0x65,0x1b,0xb1,0x1a,0xb5,0x40,0x22,0x07,0x08,0xef,0x17,0x3c,0x88,0xc3,0x68,0x19,0xa8,0xc1,0xd8, + 0xfb,0xe1,0x43,0xfa,0x9d,0x3d,0x9a,0xc5,0x93,0xa7,0x6f,0x4e,0xc6,0x0e,0x5c,0x78,0x78,0xe3,0xc3,0xac, + 0x81,0xbf,0x41,0xba,0x0f,0x3e,0x07,0x53,0x59,0x8d,0x39,0x42,0x52,0x91,0x50,0xfb,0x76,0xe6,0x7d,0xcb, + 0x6a,0xdf,0xc6,0xde,0xb7,0xb5,0x38,0xa9,0x7d,0x3b,0x81,0xbf,0x57,0x01,0xa5,0x04,0x96,0x9f,0x37,0xf7, + 0xc2,0x51,0x7b,0x5c,0x40,0xf8,0x9e,0x7a,0x8d,0x70,0xd4,0x21,0xc7,0xf3,0x04,0x13,0x2e,0xea,0x9a,0xbf, + 0xb5,0x1a,0xf3,0x86,0xf5,0x2d,0x8e,0x5e,0x8a,0xc1,0x6c,0xb7,0x64,0x50,0xe7,0xaa,0x2a,0x2c,0xea,0xb5, + 0x99,0x45,0x64,0x1b,0xbd,0xf5,0x46,0x6d,0x06,0x84,0x82,0xe1,0x26,0x06,0xfe,0xd3,0xd0,0x0f,0x4d,0x1d, + 0xb3,0xca,0xd9,0xb7,0xb5,0x9b,0x25,0x74,0x65,0x12,0xd4,0xda,0xac,0xd6,0x61,0xb5,0x1e,0xab,0x1d,0xb2, + 0x5a,0xbb,0x8f,0x7d,0xee,0x76,0x64,0xf5,0x56,0x2c,0xea,0xb5,0xa7,0x8f,0x7a,0xf7,0xf7,0xd3,0xc7,0x07, + 0xb9,0x5a,0x62,0x5d,0x0b,0xbc,0xbf,0xcf,0x6a,0xf4,0xfa,0x81,0x7a,0x7b,0xa2,0xdf,0x6e,0xb7,0xf0,0x75, + 0x4c,0x5a,0x61,0x56,0x30,0xd1,0x15,0x4c,0x82,0xec,0x36,0x08,0xa2,0x5a,0xbb,0x55,0xf3,0xa3,0x59,0x0d, + 0x4a,0x52,0x35,0x98,0xca,0xde,0x9b,0xae,0xe4,0xc0,0x19,0x7b,0xde,0xf8,0xd9,0xe9,0x05,0xbd,0xbd,0xb4, + 0x39,0x71,0xf6,0xba,0x1d,0x1c,0xc9,0xd1,0x98,0x34,0x51,0x33,0xcf,0x6f,0x48,0x81,0x69,0xa1,0x16,0x0f, + 0xdc,0x33,0x6d,0x98,0xc5,0x55,0xb4,0xd0,0x6a,0xc6,0xd9,0x60,0xd6,0xf0,0x54,0xdc,0x64,0x5b,0x6d,0x42, + 0xbe,0x46,0x70,0x49,0x0c,0xed,0x91,0xbf,0x7b,0xb9,0x38,0xde,0xfd,0xfe,0xed,0xd8,0xb1,0xbf,0x81,0xeb, + 0x0f,0x4d,0xfc,0x67,0x26,0x7e,0x95,0x97,0x8c,0xaf,0x3f,0x5f,0x2e,0xc2,0x21,0xce,0xb0,0xbc,0x10,0x13, + 0x0d,0x9b,0xb5,0xe6,0xd3,0x96,0xb5,0x04,0xbc,0x3a,0xbf,0xd0,0x99,0xb9,0x43,0x8f,0xc3,0x43,0xe2,0xe9, + 0x0a,0xab,0x69,0x98,0x36,0x67,0x6e,0x03,0x7f,0x51,0x33,0x6b,0x97,0x41,0x68,0x8e,0x3f,0x56,0x59,0xe3, + 0x9f,0xb7,0x65,0x39,0x18,0x09,0xc1,0x7d,0x58,0xa5,0x85,0xb5,0x1b,0x7b,0x16,0xa9,0x1a,0x12,0x22,0x46, + 0xa3,0xee,0xb8,0x5e,0x8f,0x8d,0x66,0x7c,0xca,0x39,0x56,0x9b,0xfa,0x11,0x7e,0x16,0xb4,0x81,0x98,0x3b, + 0x0b,0xaa,0x54,0x95,0x17,0x8b,0x05,0xb5,0x32,0xc4,0x53,0x24,0x4e,0x7e,0x07,0x24,0x0d,0xeb,0x9b,0xc2, + 0xc8,0x0c,0x6a,0xcb,0x54,0x90,0xb6,0xe0,0x33,0x2c,0x0e,0x4c,0xfc,0x99,0xe8,0x5a,0x7b,0x50,0xab,0x3f, + 0xea,0x8f,0x8b,0xdf,0x0b,0x75,0xcc,0xe2,0x0c,0x77,0xaa,0xd8,0x49,0x91,0xde,0x97,0xc6,0x90,0xee,0xe3, + 0x90,0xc6,0x38,0xa4,0xfb,0x34,0xa4,0x73,0xdc,0x00,0x73,0xd8,0x00,0xba,0xba,0x78,0x9a,0x01,0xfb,0xb5, + 0x66,0x0b,0x44,0x5c,0x1b,0xba,0xf0,0xfa,0xbd,0xbd,0x70,0x40,0xfd,0x01,0xde,0x18,0xfb,0x03,0x1f,0xbb, + 0x68,0x78,0x8b,0x3d,0x5c,0xaa,0xdc,0xf3,0xf0,0xee,0xc2,0x8d,0x87,0x2d,0x57,0x73,0x03,0xa3,0x76,0xe7, + 0x3b,0x7b,0xbe,0xdb,0x73,0x1a,0xfa,0xe8,0x1c,0x25,0xe3,0x06,0x0d,0xd6,0xb0,0xed,0xb6,0x9c,0x31,0x1c, + 0xa2,0x8b,0x15,0x8f,0x6e,0x9a,0x4a,0x92,0x5e,0x49,0x79,0x81,0x8f,0x82,0xe1,0x92,0xe4,0x1f,0x57,0xbf, + 0x4a,0xb9,0x31,0x05,0xe6,0x78,0xb6,0x84,0x3d,0x21,0x63,0x6b,0x1b,0xfc,0x84,0xb5,0x41,0x42,0x66,0x73, + 0x07,0x69,0xbb,0xc0,0x02,0xe0,0x0a,0x3b,0x2e,0x03,0x86,0x64,0x47,0x7b,0x1f,0x85,0x99,0x3b,0xa7,0x23, + 0x39,0x75,0xa7,0x26,0x90,0xf2,0x92,0xab,0xc9,0xfc,0xe5,0x2c,0x8c,0x9f,0x64,0x9f,0x39,0x57,0x4b,0x57, + 0x67,0x59,0xbc,0x30,0x2e,0xdf,0x72,0x7b,0xc0,0x49,0x26,0x38,0x5f,0x9e,0xfb,0xf8,0xed,0xdc,0xff,0x52, + 0x71,0x0b,0x65,0xc1,0xa4,0xe0,0xf8,0x81,0xc9,0x39,0xcf,0xd0,0xe7,0x95,0xbb,0x40,0x52,0xe2,0x07,0x95, + 0x8f,0xc7,0x8e,0x86,0xfe,0x90,0x0e,0xee,0x05,0xa5,0xbc,0xe3,0xf0,0xd9,0xf3,0x98,0xff,0xd4,0x8f,0xc4, + 0x6d,0xac,0xcb,0x22,0x31,0xbb,0xf9,0x91,0x7a,0xf7,0x9a,0x82,0x1b,0xcd,0x2b,0x1b,0xc5,0xd8,0x72,0x02, + 0x09,0x7c,0x93,0x20,0xda,0x23,0x0e,0x81,0x9c,0x17,0x34,0xa3,0xa1,0xf5,0xd3,0x7f,0xfc,0xcf,0xd4,0xe0, + 0x7f,0xff,0x4f,0xff,0xfe,0xff,0x80,0xd6,0x7e,0xfa,0x8f,0xff,0x95,0xb0,0x39,0x69,0x34,0xbd,0xb0,0x1a, + 0xa5,0x53,0x64,0x22,0x0d,0x1b,0x76,0x3a,0x24,0xff,0xd2,0x94,0xe7,0xcd,0xab,0x2c,0x8c,0x1f,0x98,0xa2, + 0xb2,0x13,0x1a,0x23,0xdc,0x3a,0x57,0x61,0x75,0xab,0xb1,0xe2,0x23,0x8e,0x63,0x4b,0x68,0x81,0x2a,0x51, + 0x86,0x99,0x92,0xa7,0x08,0x39,0x88,0xc2,0x24,0x82,0xd7,0x64,0x43,0x4b,0xd8,0x6e,0x76,0x69,0x98,0x5c, + 0x8b,0xcf,0x0b,0xbf,0x72,0x56,0x06,0x78,0x8c,0x1e,0x2d,0xcf,0x92,0x6d,0xc3,0x7e,0x96,0xa6,0x88,0x61, + 0x40,0xa0,0x61,0x01,0xd3,0x53,0x17,0xa1,0xeb,0x6b,0x06,0xe2,0x99,0xe1,0x25,0xc5,0x1b,0xc3,0xe5,0x62, + 0x3b,0x77,0x6a,0xe9,0xc0,0xc6,0x51,0xbf,0x51,0xd3,0x93,0x5b,0x52,0x4e,0x71,0x4d,0xe1,0x36,0x53,0x8d, + 0x14,0x9e,0x61,0x93,0x98,0x23,0xa7,0x6a,0x19,0x3a,0xa5,0x7e,0xe0,0xa8,0x71,0x0f,0xe6,0x5c,0xc7,0xb8, + 0x9a,0x5d,0xae,0x72,0xf9,0xe3,0xfe,0x3e,0x0a,0x6e,0x6d,0x21,0x70,0x1c,0xd3,0x4d,0x14,0xf6,0x3f,0x67, + 0xf7,0xf7,0xe2,0xe6,0x6d,0x30,0xb9,0x0e,0x33,0xf3,0x51,0x29,0x12,0xb6,0x96,0x07,0x1b,0x94,0x1e,0x34, + 0x64,0x5c,0xb3,0xd2,0x65,0x8a,0x82,0x23,0x07,0x5f,0x96,0xcd,0x4a,0xdf,0x6f,0x75,0x8d,0xe2,0x3f,0x2d, + 0x59,0xe5,0x36,0x21,0x9f,0xf0,0x84,0x2b,0x6f,0xd2,0x69,0x38,0x9f,0x63,0xf8,0x1a,0x99,0xc7,0x0a,0x4f, + 0xbf,0xf7,0xc9,0xe7,0x8c,0xcb,0x6d,0x9e,0x95,0xfe,0x79,0x89,0x28,0x69,0x8a,0x3d,0xd3,0xa5,0xb9,0xe8, + 0x85,0x9b,0xb3,0xd1,0x6c,0x75,0x88,0xe4,0x25,0x5e,0x3a,0x08,0x9b,0x97,0x3e,0x1a,0x35,0x83,0xec,0x77, + 0x88,0x46,0x78,0x4c,0x25,0x80,0xc3,0x4c,0x9d,0x92,0xa7,0x76,0x93,0x48,0x88,0x11,0x64,0xa0,0x49,0x50, + 0xd0,0x94,0x94,0xc6,0xd9,0x6b,0x07,0x5d,0x24,0xc3,0x59,0xf3,0x02,0x56,0x44,0xf3,0x82,0xb4,0x15,0xd1, + 0xf4,0x4b,0xb1,0x09,0x78,0xce,0x12,0x47,0x69,0x0f,0xa2,0xc7,0xcd,0x56,0xbb,0x33,0x44,0xe9,0xc1,0x6d, + 0xad,0xe9,0x55,0xb3,0xdd,0x45,0x13,0xef,0xba,0x2e,0x27,0x8d,0x68,0x37,0x10,0x88,0x76,0x6b,0xcb,0xc0, + 0x0e,0x68,0x78,0x18,0x63,0x24,0x5c,0xb8,0xd1,0xe0,0x1f,0xaa,0x0b,0x35,0x5c,0x70,0x02,0x67,0x98,0xae, + 0x17,0x15,0xad,0xcc,0xe7,0x19,0xc3,0xec,0x94,0xff,0x84,0x25,0x95,0xc0,0x18,0xee,0x9b,0x0b,0x5b,0x21, + 0x2f,0x8b,0x86,0x39,0x7c,0xe7,0xd9,0xf4,0x0a,0xc8,0xf6,0x3c,0x98,0x51,0x27,0x52,0xbb,0x6a,0x36,0xd6, + 0x7f,0x4f,0x75,0x69,0xd1,0x83,0x9c,0x94,0x5a,0xde,0x1e,0xf9,0x6d,0xdb,0xe2,0x7b,0x08,0x7d,0xbf,0x70, + 0x39,0x0a,0x24,0xd1,0xcd,0x84,0xde,0xf3,0xf2,0x1b,0x73,0xcb,0x56,0x2c,0x67,0x2d,0x53,0xe7,0x01,0xa7, + 0xbe,0x9c,0xf0,0xb7,0x34,0xdd,0xcf,0x1f,0x22,0x9e,0x17,0x14,0xb3,0x03,0x84,0x43,0x25,0xcb,0x53,0x9b, + 0x7b,0xe2,0x6c,0xc8,0xdf,0x24,0xca,0xc6,0xc2,0xe1,0xdd,0xca,0x85,0xa9,0xca,0x55,0x5a,0xaf,0xeb,0xee, + 0xe7,0x1e,0xe0,0xf6,0x64,0x39,0x37,0xc3,0xc2,0xf1,0xe5,0x54,0x9e,0x67,0x85,0x73,0x2f,0x1c,0xe2,0x4d, + 0x94,0x4b,0xef,0xef,0x6d,0xf3,0x84,0xc3,0x51,0x52,0x24,0x41,0x1e,0x3a,0x0e,0xf9,0xb2,0x17,0x1b,0x2a, + 0x39,0xe6,0x94,0x46,0x25,0x37,0x09,0x64,0x9c,0xa8,0x38,0x7e,0x1d,0x58,0x02,0x8d,0xce,0x7e,0xcb,0x71, + 0x1e,0x9c,0x00,0x45,0x26,0x38,0x97,0xb9,0xd2,0xb5,0xf2,0xab,0xa4,0xf8,0xc5,0xa2,0x22,0x81,0xe5,0x40, + 0x46,0x1b,0x17,0x8d,0x60,0x7e,0xd9,0x13,0xcf,0xaf,0x74,0xb1,0xe2,0xb3,0xa6,0xd2,0xab,0x53,0xce,0x1d, + 0x54,0x4a,0xf2,0xeb,0xaf,0x4d,0xbb,0x13,0x79,0x46,0x6c,0x2e,0xf7,0x5d,0x09,0x2a,0x51,0x70,0x65,0xa9, + 0x10,0x21,0xd4,0x50,0xcf,0xcc,0x39,0x31,0x54,0xe9,0x6e,0xcd,0xac,0xa3,0xb3,0x26,0xd1,0x50,0xf0,0x24, + 0x49,0x0f,0x1f,0xe9,0x50,0xab,0x36,0x42,0x6f,0x27,0x40,0x8f,0x9b,0xa1,0x65,0x29,0x94,0xf7,0xb5,0x38, + 0xc6,0x05,0x94,0x62,0x6a,0x9a,0xbb,0x1c,0xdf,0xf8,0x9f,0x25,0x18,0x76,0xa7,0x27,0x01,0x8f,0xd3,0x72, + 0x8a,0x12,0xf5,0x06,0x45,0x8e,0x52,0xab,0xca,0x36,0x4e,0x9a,0x17,0xee,0xab,0x29,0x64,0x2c,0x57,0x39, + 0x60,0xb6,0x25,0x98,0x07,0xdc,0x12,0xd0,0xc5,0x55,0x1d,0x14,0xc3,0x93,0x54,0xf7,0x95,0x1a,0x80,0xf7, + 0x79,0xef,0xe2,0x7c,0xef,0x2c,0x62,0x97,0xd1,0xe8,0x31,0xad,0x5a,0x6f,0x99,0x8f,0x8f,0x66,0xd5,0x4b, + 0x31,0x89,0x6f,0x81,0xd5,0x81,0xaf,0xa9,0xcd,0xc2,0x24,0x43,0x26,0x87,0x3e,0x90,0x13,0xe1,0x02,0xaa, + 0xee,0xd2,0x2b,0xb2,0x53,0x0b,0xda,0x9e,0x57,0xe5,0xfb,0x30,0xac,0xeb,0x79,0x2b,0xca,0xc9,0xa6,0x2c, + 0x2b,0xa4,0xe1,0x2d,0x63,0x36,0x8b,0xdb,0x12,0x66,0x16,0x95,0x89,0x0c,0x78,0xc9,0xff,0xf0,0xff,0x60, + 0xaa,0x3f,0x4f,0x66,0xb6,0xa8,0x6a,0x83,0x27,0xcb,0x20,0x27,0x00,0xa3,0x99,0x59,0x25,0x32,0xf4,0x8c, + 0xc3,0x42,0x63,0x59,0x10,0x1f,0x12,0x3f,0xbd,0x22,0xda,0x62,0x9a,0x5a,0x43,0x67,0xa6,0xb4,0xe9,0x03, + 0x8e,0xf0,0x5a,0x6d,0x2c,0xcc,0x6f,0xc6,0x6a,0xe7,0xcc,0xb4,0x32,0x83,0x64,0x55,0x06,0x01,0x7f,0x6b, + 0x06,0x01,0x87,0x5d,0xd0,0x2c,0xd9,0xf9,0x69,0x82,0x65,0x48,0x29,0xde,0x5d,0x0c,0x24,0xc9,0xcd,0xdf, + 0x84,0x8a,0x03,0x81,0xcd,0xbf,0x80,0x41,0x96,0x18,0x66,0x52,0xb8,0x17,0x6b,0x89,0xe3,0xd6,0x20,0x68, + 0x86,0x92,0xf1,0xc2,0xa6,0xdc,0xd9,0x7b,0x3f,0x8c,0x4c,0xf7,0xe3,0x3b,0x10,0xc2,0xb5,0xdb,0x4a,0xbe, + 0x29,0xe4,0xb9,0xca,0x8d,0xd7,0xeb,0x86,0xdd,0xb1,0xf0,0x82,0xe4,0xb1,0x67,0x15,0x22,0x08,0xe2,0x06, + 0x33,0x8e,0x87,0xc9,0xaa,0x9e,0xf3,0x15,0xcd,0x26,0x1c,0x65,0x3e,0xbe,0x1e,0x86,0xc3,0x69,0x55,0xee, + 0x2c,0x9c,0x32,0x01,0xb1,0xec,0x38,0xee,0x0e,0x9c,0x2c,0xf9,0x4e,0xac,0x7f,0x0b,0x7a,0xc0,0x69,0x82, + 0xe3,0x96,0xcb,0x08,0x1e,0xaf,0x90,0x83,0x8e,0x13,0x3d,0x94,0x4a,0x31,0x1c,0xee,0xff,0xfd,0xbf,0x09, + 0x26,0xb3,0xa9,0x05,0x49,0x64,0xf9,0xf2,0x29,0xc4,0x6a,0x98,0x3e,0xbc,0xaa,0x7a,0x1e,0x25,0xc4,0x6e, + 0x0c,0x2c,0x66,0x8c,0x7b,0xbc,0x06,0x7e,0xb8,0x5e,0xdf,0x09,0xeb,0x75,0xfa,0xf2,0xa5,0x7e,0x7c,0x65, + 0x94,0xc4,0x82,0x2c,0x58,0xcd,0x2b,0xcd,0x03,0x69,0x16,0xe4,0xf3,0x0e,0xd8,0x28,0x02,0x0a,0xf3,0x26, + 0xba,0xb1,0x2b,0xb6,0x3e,0x77,0xd7,0x41,0x08,0x06,0xfc,0x61,0x73,0xa2,0x26,0x15,0xab,0x06,0x51,0x1c, + 0x64,0x62,0x3c,0x1e,0x75,0xab,0xb3,0x64,0x16,0x17,0xb3,0x5c,0x10,0x5e,0x86,0xb9,0x04,0x45,0x7d,0x1b, + 0x3c,0xdf,0x0d,0xc7,0xf7,0x4e,0x8f,0xb2,0xf1,0x8a,0xd7,0xab,0xc8,0xf1,0xad,0x99,0x8c,0xf3,0x13,0x70, + 0x51,0x93,0x18,0xd6,0x7c,0x60,0xdf,0x22,0x5a,0x9e,0x5a,0x7b,0x1b,0x40,0x92,0x3f,0x55,0xa7,0xfb,0xd5, + 0x4f,0x97,0xdb,0x13,0x21,0x95,0x99,0xc5,0xa5,0xd4,0x69,0xe4,0x25,0x2f,0xb9,0x05,0x6f,0x49,0x24,0xc7, + 0x79,0xce,0x8b,0x6a,0x4b,0xca,0xbb,0xb0,0xa5,0xc1,0x72,0x25,0x25,0xee,0xf2,0x8a,0xdd,0xd1,0x2e,0x77, + 0xd1,0x8c,0xc4,0xcc,0xc5,0x89,0x0d,0xdc,0x3c,0x04,0x8e,0x5e,0x51,0x8b,0xdc,0x6c,0x0e,0x6e,0xd6,0x24, + 0xb0,0xaa,0x80,0x10,0x7a,0x08,0x35,0x45,0x57,0x77,0xde,0xd3,0x3c,0xf5,0xc2,0x9c,0xb9,0xc0,0x8c,0x78, + 0x44,0xd8,0xfe,0x65,0x28,0x35,0x1e,0x4f,0x0f,0xa2,0xd3,0xb9,0xed,0x49,0xb9,0xb1,0x66,0xd2,0x29,0x20, + 0xd9,0x90,0x79,0x65,0xc9,0xae,0xd8,0x0d,0xbb,0x74,0x30,0xa7,0x00,0xa2,0x4d,0xb5,0xc9,0xa7,0x89,0xdc, + 0x70,0x37,0x90,0xa3,0x04,0x63,0xe7,0x64,0x6c,0xae,0xa4,0x10,0xdc,0x51,0xd0,0x45,0x77,0x8a,0x99,0x72, + 0xf4,0x2b,0x25,0x8e,0xb5,0x1a,0x9c,0x3e,0x81,0x1c,0x8f,0x55,0x19,0x98,0x3c,0xe9,0x96,0x15,0x55,0x82, + 0x0e,0x6d,0x72,0x1e,0xcf,0xe1,0x76,0xe8,0x42,0x9a,0x6f,0xe5,0xc3,0x15,0xda,0x1c,0x71,0x5f,0xf9,0x48, + 0x64,0x98,0x53,0xa5,0x1a,0x85,0x54,0x67,0xbd,0xc1,0xf1,0x66,0xa3,0xa0,0x3c,0x6e,0xc8,0xc8,0xc8,0x94, + 0x8c,0x37,0x7e,0x82,0xde,0x75,0xed,0xd6,0xe2,0x73,0xad,0x55,0x6b,0xa1,0x73,0x85,0x33,0xd6,0x3c,0x64, + 0xe2,0xa3,0xb0,0x26,0x58,0xf5,0x8d,0xf9,0x99,0x79,0xce,0xe3,0x5c,0xad,0xbb,0xf3,0xe0,0x22,0x73,0xfd, + 0x65,0x16,0x73,0x26,0x96,0x2a,0x43,0x61,0x6a,0x21,0xd6,0xc3,0x76,0x96,0x9f,0x87,0x6e,0x2b,0xb0,0x2f, + 0x05,0x93,0xca,0xf3,0x72,0x54,0x64,0x3a,0x93,0x8c,0x1a,0x7c,0x44,0x11,0xee,0xc2,0x76,0xb6,0x6d,0x21, + 0x54,0x91,0x88,0x4c,0x70,0xf2,0xa7,0x0b,0x6d,0x6a,0xc8,0x67,0xee,0xe0,0x5f,0x9a,0xc4,0x04,0x16,0x52, + 0x81,0xff,0x4b,0xe6,0x55,0xe5,0x96,0x85,0x72,0x2b,0xc7,0x31,0xe2,0xf4,0x39,0x67,0x8e,0x4b,0x01,0x5e, + 0xcf,0x05,0x3e,0xc5,0xd0,0x77,0xec,0x88,0x91,0xb3,0x0d,0x4e,0x19,0x4c,0xfd,0x88,0xa5,0xe9,0x47,0x2e, + 0xa1,0xc9,0xdc,0x9c,0x2b,0x60,0xfd,0x7d,0x84,0x9d,0xe2,0xbd,0xb7,0x2c,0xea,0x9c,0x05,0x53,0x12,0x6e, + 0xe2,0x73,0xa3,0x22,0x9f,0x9b,0xe7,0xc7,0xe5,0x52,0x8a,0xa4,0x18,0xc0,0x8d,0xfe,0x45,0x86,0x9c,0xa6, + 0xbc,0x5a,0x7a,0x28,0xf2,0x97,0x46,0x51,0xc5,0x9e,0x17,0x5b,0x5b,0xea,0xd6,0xe0,0x23,0x2a,0x1b,0x83, + 0xfb,0x15,0xcc,0xab,0x7e,0x54,0xcd,0xdf,0x27,0x37,0x35,0xc9,0xfd,0x97,0x59,0x74,0x9e,0xc5,0x3e,0xcf, + 0x9c,0xfd,0x4f,0xc3,0xb3,0x47,0x2a,0x28,0x5b,0x3b,0xc2,0x90,0x72,0x11,0x73,0x0a,0xea,0x7b,0xe6,0x09, + 0x64,0x57,0xb3,0xe1,0x8b,0x6d,0xe4,0x7d,0x61,0x1b,0xac,0x78,0x54,0xc1,0x47,0xfb,0xc2,0x73,0x7a,0x5a, + 0x7e,0x00,0x73,0x07,0xbd,0xa1,0x95,0xee,0xc9,0x65,0x6e,0xb0,0xda,0x05,0xf6,0x3d,0xf2,0xf2,0x55,0xc0, + 0x06,0xc0,0xed,0x43,0x70,0x5d,0x18,0x46,0x05,0x55,0x86,0x18,0x19,0xbb,0x75,0x23,0x73,0x4d,0x88,0x70, + 0x5c,0x47,0x77,0x4f,0x49,0xe9,0x03,0x6d,0xcf,0x1e,0x26,0x9e,0x5c,0x61,0x68,0xbc,0xc6,0xc4,0x9e,0x70, + 0x0a,0xed,0xfd,0x40,0x71,0xdf,0x43,0xf7,0xc3,0xde,0x87,0x3d,0x99,0xf5,0x20,0x72,0x8c,0xc2,0xc0,0x11, + 0xd3,0x8a,0x74,0x51,0x3f,0xa3,0x6f,0xcf,0x96,0x8b,0x80,0x23,0x44,0xac,0x63,0xe3,0x77,0x92,0xea,0xa7, + 0x82,0x89,0x27,0x59,0x63,0x56,0xce,0x35,0x51,0x64,0x7f,0x29,0x3a,0x78,0x27,0xa9,0xd7,0xe9,0x85,0xab, + 0xaa,0x67,0x0e,0xdb,0x49,0x56,0x9b,0xf8,0xa4,0x32,0x1b,0x93,0x9f,0x89,0x81,0xcc,0x08,0x57,0xe2,0x9b, + 0xa0,0xd1,0xe1,0x1d,0x52,0xa2,0xfc,0x4c,0xad,0x5c,0x49,0x7a,0x5d,0x0c,0x1e,0x59,0xda,0x0f,0xe6,0xa3, + 0xd6,0x32,0x4c,0x76,0x15,0x2f,0xb2,0xf8,0x5a,0x5e,0x44,0x1c,0xc6,0x13,0xcd,0xf9,0x62,0xab,0x98,0x9a, + 0xcd,0xe0,0x7f,0x47,0x73,0x36,0x1d,0xe7,0xa9,0xf4,0x5a,0x8e,0x77,0x52,0x99,0x9f,0x18,0x91,0x52,0xd7, + 0x31,0x3a,0x82,0xcd,0x99,0xc1,0x7b,0x06,0x92,0x38,0x1e,0x6b,0x55,0xaa,0x27,0xe9,0x71,0x31,0x0c,0xe9, + 0xfc,0x9a,0x6f,0xce,0xcb,0x2d,0xc8,0x2f,0x57,0x31,0x8d,0x1d,0x16,0xdb,0xce,0xca,0xcc,0xb4,0x92,0x63, + 0x80,0x64,0x71,0x9e,0x41,0xbb,0xe4,0x97,0xfe,0xd0,0xe0,0x58,0xa2,0xb3,0xe8,0xf9,0x22,0x90,0x69,0x42, + 0x11,0xef,0xc8,0xa6,0x79,0x35,0x73,0xa1,0xfe,0x65,0xb9,0xfe,0x74,0x63,0xfd,0xe5,0xb4,0xe5,0x69,0x93, + 0xfa,0xdf,0x14,0x4a,0xd2,0xa1,0xfc,0x20,0xa5,0x34,0xe5,0x6c,0xa1,0x2c,0x26,0x3a,0xd7,0x50,0xef,0x11, + 0xd9,0x85,0x03,0x72,0xd7,0x28,0xc4,0x49,0x31,0x9c,0x95,0xae,0xbc,0xa3,0xdd,0x1c,0x8b,0x9c,0xcf,0x4e, + 0xa1,0x03,0xa6,0x64,0x41,0x0a,0x64,0x5f,0xbb,0xad,0xe6,0x9e,0x38,0x39,0xb5,0x6c,0x59,0xb9,0x5c,0x61, + 0x21,0xfd,0x7a,0x7d,0x33,0xaa,0xec,0x29,0xe5,0x99,0xf0,0x86,0x7e,0x82,0xc8,0x10,0x20,0x5e,0x86,0x22, + 0x13,0x80,0x39,0x4f,0xc4,0x72,0x07,0x76,0x9a,0x9b,0x30,0xa5,0x88,0xd8,0xcc,0x0d,0xfb,0xeb,0xb9,0x61, + 0x7f,0x2d,0x37,0x0c,0x14,0x46,0x70,0xc3,0xbe,0xe0,0x86,0xa9,0x08,0x0a,0x38,0x31,0xa5,0xb3,0xda,0xca, + 0x16,0x2f,0xc9,0xad,0x73,0x3e,0x87,0xee,0x2c,0x59,0x2f,0xe8,0x02,0x93,0xec,0x7f,0x2d,0x93,0x3c,0x63, + 0x91,0xc9,0x26,0xdf,0x2c,0xba,0xeb,0xf5,0xd9,0x78,0x1c,0x6d,0x65,0x74,0x7d,0x3c,0x5b,0xf2,0xaa,0x5b, + 0x62,0xda,0x2c,0x4b,0xf0,0xc1,0x3c,0xa9,0xe0,0x46,0x96,0xb7,0x22,0xa5,0x6f,0x24,0x3c,0x82,0xd1,0x97, + 0x1d,0x3a,0x89,0xf6,0xc0,0x7a,0xdd,0x42,0x9f,0x48,0xbf,0xd2,0x54,0x4d,0x5b,0x5c,0x7b,0x59,0x95,0x59, + 0x58,0xe2,0x92,0x60,0x4b,0x0d,0xcb,0x1e,0xd3,0x68,0xb7,0xe6,0x82,0x51,0x7e,0x2f,0xd1,0x86,0x28,0xce, + 0x26,0x43,0x2b,0x4f,0x58,0xd1,0x40,0xce,0x70,0x4c,0xe2,0x69,0x61,0x73,0xe0,0xd9,0x3d,0xb4,0xbf,0xc2, + 0xe0,0x52,0xb0,0x9e,0x18,0x26,0xaa,0x90,0x72,0x30,0xba,0x3b,0x61,0x69,0xff,0x45,0xff,0x43,0xf7,0x9f, + 0x91,0x99,0x70,0x73,0xba,0x78,0x98,0xd2,0x5f,0xed,0x85,0x22,0x5b,0x7c,0x91,0x6d,0x45,0x03,0x1c,0xed, + 0x92,0xaf,0xd7,0xaa,0xf8,0xd5,0x5a,0x95,0x2a,0x1d,0x0b,0xc7,0x85,0x26,0x63,0x35,0x50,0xde,0x57,0x6f, + 0xbb,0x3f,0x33,0x17,0x3b,0xf4,0xb4,0xd0,0x0d,0xdf,0x98,0x29,0x5f,0x19,0x13,0x73,0xa6,0x4f,0x04,0x8e, + 0x5e,0x92,0x87,0x51,0x56,0x61,0x64,0xcc,0x7f,0x92,0x52,0x01,0xf1,0xee,0xc3,0xa1,0x47,0xd4,0x17,0xd8, + 0x42,0x23,0x82,0xe8,0x01,0xef,0x69,0x2d,0x58,0x58,0x1e,0x72,0x64,0x99,0x37,0x8e,0x77,0x89,0x13,0x0a, + 0xd9,0x1d,0xcc,0xa2,0x1b,0xad,0x1c,0xbd,0xed,0xfe,0xb5,0xd8,0xff,0xcd,0xda,0xf9,0xc5,0x9a,0xa9,0x8c, + 0x1e,0xac,0x98,0x4f,0xb6,0x2b,0xe6,0x15,0x3f,0xbd,0x46,0x12,0x45,0xd2,0x0a,0xb2,0x22,0xd2,0xb0,0x5d, + 0xfc,0x89,0x31,0xf9,0xe5,0x48,0x96,0xe8,0x46,0x8e,0x05,0x5f,0x67,0x2b,0x72,0xb5,0x29,0x07,0xbc,0xfc, + 0x08,0xa4,0xfb,0xe2,0x26,0x23,0xf4,0x0b,0x9b,0x2f,0x42,0xc7,0x59,0xcb,0x6f,0xf9,0x2c,0x44,0x3c,0xee, + 0x75,0x76,0x22,0xa7,0x4a,0xc3,0x50,0x60,0x4c,0x92,0x4d,0xb6,0x48,0xfc,0xb2,0xaf,0x00,0x5b,0x05,0xaa, + 0xae,0xb6,0x7c,0x0e,0xf3,0xfd,0x6b,0x0c,0x97,0x65,0x35,0x53,0xca,0xf1,0x91,0x9e,0xf8,0xc9,0xcc,0xc6, + 0xb0,0x9a,0xa8,0x8a,0x99,0x8c,0x89,0x87,0x4c,0x11,0x81,0x58,0x59,0x30,0xa3,0xaf,0xb2,0x60,0x46,0x31, + 0x7d,0x11,0x47,0x79,0xb1,0xfd,0x6d,0x0b,0x23,0x51,0x90,0x86,0x77,0x11,0x26,0x5e,0x75,0x47,0x3c,0x22, + 0xfd,0x8f,0xb0,0x06,0x2b,0x07,0xd2,0xc2,0x91,0x61,0xf2,0x46,0x70,0x09,0x77,0x7e,0xfa,0xbf,0xfe,0xd6, + 0x0c,0x66,0x27,0x2b,0x82,0x8d,0xc5,0x1c,0x0c,0xee,0x47,0x72,0x1d,0x8d,0x19,0x9c,0xed,0xd7,0x2e,0xcc, + 0x33,0x8c,0xc2,0xd9,0x3c,0xce,0x80,0x55,0x2d,0x4e,0x2b,0xee,0x7d,0x4e,0xdf,0x0c,0x5a,0x7c,0x19,0x70, + 0x30,0xd4,0xb3,0x26,0x34,0x29,0xc1,0x9f,0xfc,0x19,0x77,0xda,0xf1,0x17,0xa9,0x6d,0x57,0xcc,0xfb,0xd4, + 0x5f,0xf8,0x93,0x70,0x1e,0x66,0x64,0x81,0x76,0xe8,0x64,0xbe,0xbf,0xbf,0x53,0xae,0xff,0x51,0xde,0xbd, + 0xe7,0x01,0xe9,0x7e,0xc5,0xd8,0x2a,0x00,0x1d,0x89,0xf8,0x01,0xdd,0x13,0x24,0x9c,0xc3,0x9b,0x47,0x5f, + 0x64,0xcf,0x34,0xae,0xe2,0xd7,0xb5,0x01,0x9f,0x29,0x0d,0xd0,0x9c,0x4e,0xdd,0xa5,0x9c,0xe3,0x71,0x81, + 0x4e,0x63,0x9e,0x67,0x04,0x25,0x16,0xb7,0xce,0xae,0x02,0x84,0x32,0xae,0x8c,0x49,0xcb,0x2b,0x0a,0x41, + 0xc6,0x42,0x22,0xec,0x62,0xd5,0x50,0x2d,0x6c,0x79,0xf7,0x93,0x9f,0xd8,0xbb,0xbb,0xb7,0x7e,0x12,0x39, + 0xda,0xf6,0x7d,0xb3,0xe4,0x24,0x05,0xc8,0x2b,0x50,0x63,0xea,0x70,0xaa,0x3d,0x4e,0x47,0x16,0x5f,0x02, + 0xc4,0x77,0x58,0x63,0x63,0xc3,0xec,0x5c,0xf9,0xe9,0x59,0x18,0x5d,0xf3,0x04,0x66,0x0a,0x73,0x51,0xd7, + 0xb2,0xa6,0x7f,0x2b,0x96,0x48,0xad,0x1f,0xd5,0x8d,0x7a,0x80,0xa1,0x05,0xa7,0x9b,0xd6,0x26,0x51,0x80, + 0x9b,0x63,0x20,0x34,0x72,0x99,0x61,0xa9,0xd1,0x5d,0x5f,0xc7,0x18,0x6e,0x62,0xc0,0xb9,0x02,0xcb,0xac, + 0x52,0xb5,0x89,0x1c,0x4d,0xc4,0xd6,0x49,0x0f,0xac,0x9b,0xeb,0x67,0x61,0x80,0xbc,0x2c,0x2b,0x00,0x73, + 0xad,0xd8,0xd9,0x1f,0xce,0x9e,0x8d,0x82,0x31,0xbb,0xbb,0x42,0xd5,0x9d,0xc3,0x5a,0xc2,0x44,0x61,0x32, + 0x17,0x11,0x72,0x9a,0x05,0xc7,0x0e,0xae,0xeb,0x3c,0x3e,0x7f,0xf2,0xdc,0xd0,0x76,0x6a,0x90,0xb7,0x3b, + 0xa8,0xd3,0xf5,0x09,0x0e,0x1c,0xce,0x35,0x71,0x12,0xc2,0x47,0x57,0xc5,0xa6,0x32,0x74,0xce,0xd6,0x14, + 0x5b,0xc0,0x5a,0x8f,0x02,0xe6,0x8f,0x91,0x85,0x6e,0x02,0xb5,0x1e,0x23,0xdb,0x04,0x95,0x20,0x7a,0xe6, + 0xc0,0xce,0x1f,0x34,0x5b,0xc5,0x41,0xd5,0x2b,0xcc,0xf5,0x4e,0xeb,0xa3,0x29,0x96,0x87,0x27,0x74,0xfa, + 0x29,0x08,0x22,0xb3,0xd3,0x88,0xa4,0x72,0x74,0x2a,0xb0,0x68,0x45,0x02,0x49,0xd2,0xc9,0xd0,0x33,0xd8, + 0xd3,0xd4,0x62,0x2d,0x84,0x43,0x05,0x19,0x39,0x4a,0x62,0x33,0xca,0xc6,0x4e,0x21,0xc2,0x46,0xc0,0xf4, + 0x88,0xfc,0xc6,0x2b,0x36,0x53,0xb0,0x04,0x72,0xcd,0xd0,0xcc,0x1b,0xf8,0x97,0x26,0x97,0x3f,0x98,0x62, + 0x24,0x2f,0xd0,0x0e,0xe6,0xf3,0x72,0xb4,0x52,0x17,0x5d,0xf4,0x2c,0x11,0xbf,0x78,0xc6,0x4e,0x36,0xa7, + 0xab,0xdf,0xc5,0xf3,0x25,0x8f,0xd8,0x20,0x72,0xe6,0xb0,0x36,0xe9,0x21,0x9b,0x92,0xee,0xac,0xcc,0x76, + 0xf9,0x3a,0x76,0x1c,0x5f,0xfe,0x64,0xb9,0x45,0xa7,0xae,0x9e,0xf3,0xea,0xe9,0xb7,0x6c,0x20,0xaf,0xb1, + 0xf7,0x1e,0x4f,0x71,0x16,0x17,0x5d,0x25,0xea,0xf2,0x2b,0xa1,0x0a,0x46,0x62,0xdc,0x16,0xa6,0xfa,0x0d, + 0x1f,0xfe,0x95,0x13,0x29,0xe5,0xee,0xcd,0x4d,0x9b,0x93,0x31,0x08,0xb4,0x4c,0x16,0x90,0x4c,0xb6,0x52, + 0x7d,0x99,0x2c,0x7f,0xfc,0x11,0x13,0xd3,0x82,0x50,0x28,0xc2,0x6c,0x90,0x7a,0x4a,0xc2,0x20,0x9c,0x79, + 0x8c,0x2b,0x3d,0xec,0xfc,0x4d,0x39,0x30,0x25,0xc7,0x23,0x3e,0x07,0x26,0x31,0x98,0x49,0x9d,0xc7,0xdb, + 0x63,0x1e,0x62,0xd4,0xee,0x33,0xfc,0x79,0xf2,0xfe,0xc5,0xcb,0xf3,0x17,0xaf,0xbd,0xd1,0xc8,0x7a,0x32, + 0x8f,0x97,0x98,0xfd,0xb9,0x05,0xff,0x7b,0xf6,0xac,0x86,0x7f,0x0e,0x4f,0xbe,0xf2,0x8f,0x7e,0xef,0xf0, + 0xe0,0xc9,0xe9,0xa9,0xfa,0x73,0xfc,0xf4,0xe9,0xe1,0x69,0xbf,0xf6,0x8c,0xfe,0x27,0xaf,0xf8,0x33,0x6b, + 0xcc,0x46,0xd6,0x4b,0xa0,0x2c,0xa2,0xe9,0x56,0xab,0x76,0xc8,0xff,0xe4,0xaf,0x0e,0x4f,0x72,0x7f,0x2a, + 0x6f,0xf2,0x3f,0xcf,0x9e,0x89,0x3f,0xc7,0xfb,0xf4,0x87,0xda,0x54,0x57,0x46,0x49,0x6a,0xfa,0xcd,0x34, + 0x40,0x46,0xca,0x6a,0x1f,0xb5,0x8f,0x0e,0x5a,0xb2,0xfb,0xe6,0x55,0xcb,0xfc,0xc2,0x27,0x4f,0x6b,0x9d, + 0xd3,0xc3,0x93,0xfd,0x83,0x1a,0x3e,0x81,0x67,0xfb,0xcf,0x8e,0x4e,0x8f,0x5b,0xfa,0xeb,0x0f,0x4f,0xa0, + 0x64,0xbf,0x77,0xb4,0x7f,0xfa,0xb4,0x76,0x00,0x2d,0x3f,0xed,0xe9,0x17,0xa8,0x27,0xf8,0xd9,0xcf,0x8e, + 0xa9,0xed,0x67,0x31,0xba,0x67,0xd3,0x87,0xf7,0x7b,0xf4,0xc5,0xf4,0x67,0x7f,0xbf,0x7f,0xd2,0x79,0x56, + 0x53,0x37,0xf1,0x63,0x6b,0x9d,0xce,0xe1,0x49,0xa7,0x53,0xeb,0x9f,0x1c,0x9e,0x76,0xba,0xea,0x26,0xaf, + 0xb9,0xdf,0x7f,0xf2,0xf4,0xf8,0xb8,0xd6,0xed,0x3c,0x79,0xda,0xed,0xd4,0x8e,0x8e,0xf9,0x9f,0xd6,0xe9, + 0xe9,0x51,0xab,0x76,0xf0,0xe4,0xd9,0x13,0x28,0x29,0x8a,0xf0,0x5a,0xa8,0x71,0xf4,0x5b,0x5a,0x20,0x34, + 0xac,0x18,0x13,0x31,0xdc,0xc7,0x27,0xfb,0xfb,0xe6,0xd5,0xf1,0x89,0xbe,0xc2,0x2f,0x30,0xaf,0xb0,0xac, + 0xbe,0x52,0xd3,0x4f,0x9f,0x80,0x4f,0x75,0x2d,0xad,0x96,0x2a,0x49,0x8d,0xbf,0xf5,0x49,0xa1,0x6b,0x89, + 0x72,0x87,0xf0,0xa1,0x07,0x4f,0x6a,0x27,0x70,0xd5,0x3b,0xa9,0x9d,0xc2,0x9f,0x36,0xfc,0x39,0x6c,0x1f, + 0xc0,0xcb,0x27,0x87,0xbd,0x03,0xaa,0xe3,0xe0,0x40,0x77,0x48,0xf4,0xf2,0xe9,0xd3,0x4e,0x07,0x67,0x15, + 0xfe,0x69,0x9d,0xd6,0x9e,0xc0,0x9f,0xee,0x69,0xed,0x10,0xfa,0x78,0xd0,0x86,0x89,0x81,0xaa,0xdb,0xb5, + 0x0e,0xfc,0x79,0x4a,0xdd,0x3b,0x78,0x76,0x44,0x6d,0x3f,0x0f,0xfc,0x4c,0x2f,0xb6,0x6e,0x97,0xfe,0xf4, + 0xfb,0xf4,0xe7,0xe8,0x88,0xfe,0x3c,0x79,0x92,0x5f,0x49,0x58,0x08,0xfe,0x60,0x21,0xf8,0x83,0x85,0xe0, + 0x0f,0x16,0xa2,0xe5,0x25,0xfe,0x74,0xbb,0xf4,0xa7,0xcf,0xd7,0xf9,0xd1,0x11,0xfd,0x79,0xf2,0x44,0xac, + 0x40,0x6a,0xfa,0x1d,0xc8,0xdd,0x13,0x54,0xbf,0xc8,0x41,0x7f,0xba,0xdf,0x39,0xd6,0x9f,0x03,0xdf,0xf8, + 0x4c,0x7f,0xe3,0x7e,0xff,0xe9,0xbe,0x39,0xe8,0x58,0x56,0x0f,0xfa,0x7e,0xff,0xf8,0x58,0x0e,0x3a,0xd6, + 0xf1,0x74,0x5f,0x0e,0x3a,0xd6,0x71,0xd8,0x96,0x83,0x8e,0x75,0x74,0x60,0x97,0x8d,0x81,0x97,0x99,0x3f, + 0x0b,0xa3,0x19,0xc2,0x01,0x19,0x5b,0x5f,0x23,0xb0,0x91,0x6b,0x85,0x19,0xdc,0x42,0x27,0x53,0xee,0x8e, + 0x83,0x95,0x9c,0x2c,0x81,0x09,0x09,0x23,0xcf,0x74,0x0d,0x11,0x75,0x6b,0x14,0xc7,0x3b,0xd4,0x09,0xa6, + 0xae,0x9d,0x0d,0x33,0x0c,0xf8,0x12,0xbe,0x1f,0xc0,0x4b,0xb8,0xb9,0x4c,0xb3,0x53,0xd7,0xfa,0x06,0x44, + 0x31,0xb6,0x70,0x5b,0x2b,0xac,0x1d,0x99,0xee,0x99,0x8b,0x6a,0x69,0x6c,0xe9,0x45,0xfa,0xa0,0xb6,0x6a, + 0xd8,0x48,0x6b,0x4c,0x96,0x3f,0x78,0xf8,0x3a,0xb8,0xe5,0x2e,0x51,0xa2,0x0f,0x23,0x6a,0x85,0x0f,0xb8, + 0x45,0x2d,0x31,0xba,0xc3,0x07,0x0f,0xef,0xb4,0x5b,0xad,0xd5,0xd8,0x68,0xdc,0x08,0xa7,0x84,0xfa,0x5e, + 0x06,0xc9,0x02,0x59,0x1b,0x16,0x19,0x79,0x25,0x0d,0x0c,0xc9,0xe0,0xf1,0x63,0xbf,0xde,0xd9,0xdf,0x47, + 0x37,0xc4,0x86,0x6d,0xdb,0x99,0xb8,0x76,0x76,0x43,0xe7,0xbb,0xe8,0x5e,0xbb,0x90,0xa4,0x8f,0x5a,0xc3, + 0x96,0x9b,0x3e,0x86,0x67,0x43,0xf8,0xcf,0x4d,0x15,0x12,0x88,0x8f,0xf9,0xbf,0x1e,0x3d,0x6a,0xf7,0xef, + 0x7d,0xfb,0x10,0x7e,0x1c,0xc2,0xdf,0x96,0xe9,0x8d,0xef,0xcf,0x4f,0x3f,0x03,0x2f,0x3a,0x33,0x63,0x3a, + 0x29,0x0a,0xec,0x86,0xb2,0xd2,0x0b,0xf4,0x4d,0x41,0xdc,0x91,0x59,0x22,0xd5,0x05,0x21,0x70,0x42,0xcd, + 0x3c,0x1f,0x92,0xa3,0x22,0x15,0x80,0x8b,0x9c,0x43,0xfd,0x46,0x68,0xa5,0xf4,0x96,0xc9,0xd4,0xdc,0x2c, + 0xd0,0xbb,0xeb,0x45,0xc4,0x71,0x89,0xb8,0xcf,0x0c,0x6b,0xf7,0x79,0x04,0x3b,0xf2,0x2c,0xc5,0xea,0x7c, + 0x98,0x81,0x22,0xd6,0x27,0x66,0x93,0xd3,0xe9,0xdb,0x60,0xa4,0xbe,0xb3,0xb3,0xdd,0xb6,0xb3,0xd7,0xc6, + 0xb1,0x32,0x82,0xd8,0x42,0x67,0x10,0x21,0x20,0xa8,0x1c,0x6c,0x7f,0x94,0x8e,0x99,0x3f,0x52,0x1f,0x98, + 0x36,0xda,0x0c,0x5f,0x1c,0xb3,0x70,0x37,0xd5,0x69,0xd4,0x2a,0xc6,0xe7,0x2d,0xcd,0xe1,0xbf,0xde,0x28, + 0xd9,0x77,0x9f,0x5c,0x63,0xa4,0xa6,0xb9,0xb1,0x82,0x95,0x15,0x34,0x17,0xab,0x92,0x14,0xbb,0xd8,0xcd, + 0x9a,0x8b,0x8d,0x03,0xd9,0xfc,0xb4,0x6d,0x28,0x61,0xc9,0x7e,0x17,0x50,0xf8,0xe9,0x23,0xaf,0xbd,0xff, + 0x1d,0xbd,0xb4,0x70,0xee,0x68,0x18,0x79,0x0d,0x03,0x19,0xe0,0xb9,0xe2,0x98,0x8d,0x2d,0xaa,0x71,0x00, + 0x63,0xf9,0x28,0xab,0xd7,0xe9,0x1d,0xf8,0x0d,0x6f,0x3d,0xf2,0xc2,0x81,0x93,0x36,0x1a,0x58,0x1b,0xdc, + 0x79,0x0c,0x3d,0x92,0xf5,0xc0,0xa0,0xe7,0x6a,0x92,0x62,0x09,0x7f,0x1b,0xde,0x05,0x89,0xde,0xa8,0xa9, + 0x3c,0x8b,0xcd,0x4f,0x4c,0x3c,0xfc,0xc4,0xe2,0xc7,0xc9,0xd0,0x0e,0x77,0x13,0x67,0xcf,0x8e,0xe1,0x5f, + 0xd7,0x48,0x88,0x27,0x2a,0x86,0x37,0xcf,0x91,0x05,0xf6,0xc8,0xbe,0xc4,0xf7,0xe3,0xb0,0x34,0xb7,0xe4, + 0xae,0x9f,0x3a,0xae,0xb1,0x29,0xf8,0x2d,0xed,0xb7,0x3c,0xe5,0x94,0x0a,0x95,0x55,0x52,0x2a,0xc9,0x1e, + 0xb7,0x87,0x34,0x68,0x7b,0xb4,0x06,0xdd,0x16,0x16,0x78,0x1b,0xa7,0x6f,0x2e,0x3c,0x3d,0x31,0xbc,0x45, + 0x51,0x1d,0x70,0xd6,0xcd,0x85,0x2b,0xaa,0xb1,0x33,0x26,0x5b,0x11,0x11,0x67,0x9c,0x9e,0xce,0x83,0xf3, + 0xe0,0x73,0xc6,0x3b,0xac,0x3b,0x41,0x80,0x96,0x7a,0x31,0x00,0x11,0x7d,0x0f,0xb2,0xa8,0x20,0xa2,0xe8, + 0x93,0x23,0x5a,0xb2,0xfe,0x0a,0x53,0x91,0x2d,0x88,0x5f,0x15,0xf2,0xd6,0x07,0x72,0xdd,0x81,0x7f,0x73, + 0x34,0x88,0x7c,0x2d,0xf3,0x89,0xa6,0x33,0x19,0xeb,0x19,0x89,0xa9,0x35,0xf2,0xcf,0xc8,0xc4,0x12,0x7b, + 0x1f,0x92,0xe1,0x87,0x68,0xcf,0x21,0x80,0x0c,0xe9,0x74,0xf7,0xd8,0x93,0x3b,0x80,0xd2,0xd5,0x0e,0xf8, + 0x22,0xf3,0x8d,0xf8,0xe7,0x80,0x87,0x67,0x88,0x74,0x75,0xdf,0x20,0x87,0x6a,0x07,0x9e,0x26,0x04,0x0e, + 0xdb,0x09,0xca,0xf1,0xc3,0x46,0x80,0xf6,0x5f,0x91,0x17,0x7a,0x08,0xf4,0x2e,0x70,0xf5,0xb6,0x11,0x19, + 0x4f,0xf6,0x7e,0x18,0xb5,0x76,0x8f,0x8e,0x77,0x9f,0xf9,0xbb,0x17,0xe3,0xbb,0xbe,0xf2,0x12,0x4d,0x95, + 0xfc,0x4e,0xe2,0x0a,0xb7,0x4b,0xb7,0x68,0x8d,0x3f,0xd6,0x61,0x0e,0x99,0xea,0x47,0x28,0x42,0xc0,0xa1, + 0xc2,0x0f,0x33,0x84,0x20,0x53,0x35,0x65,0xf9,0x9a,0x30,0x58,0xd8,0x53,0xbb,0x34,0x63,0xed,0x96,0xc3, + 0x92,0xc7,0xb0,0x18,0x72,0xa5,0xa2,0x46,0x63,0x95,0x89,0xa0,0x44,0x7e,0x2c,0xa5,0xf9,0x79,0x83,0xed, + 0x8c,0x50,0x5d,0x22,0x61,0x5f,0xa6,0xb5,0x45,0x20,0x8b,0xed,0x60,0x92,0x40,0x61,0x95,0xa4,0x18,0x06, + 0x9b,0xf0,0xa9,0xab,0xf6,0x3d,0x13,0xc7,0x52,0xa6,0x0e,0x9c,0x9d,0x68,0xe5,0xe8,0x1d,0x70,0x86,0xda, + 0xad,0x43,0xb5,0x28,0x81,0x64,0xc2,0x77,0x3e,0x7e,0x7c,0x98,0x5b,0x0f,0x67,0xfe,0xcd,0x82,0x42,0x40, + 0x72,0xa7,0x12,0x9c,0x3c,0x3d,0x06,0xb4,0x61,0xbf,0x9e,0xa1,0x82,0x62,0xe4,0x8f,0x65,0x54,0xd2,0xe3, + 0xc7,0xed,0x3e,0x9d,0x51,0x31,0xfe,0x3e,0xa4,0x9f,0x73,0x0f,0xfe,0xad,0xa7,0x34,0xc0,0xf0,0x09,0xc6, + 0x00,0x8f,0xda,0xfb,0xa8,0x1f,0x86,0xc3,0xca,0x87,0xad,0x8b,0x19,0xef,0x1e,0x3d,0xea,0x41,0x8d,0x50, + 0x7e,0x37,0x1a,0xe0,0x58,0x8a,0x5e,0xda,0x09,0x4b,0x9d,0x86,0xbe,0xcc,0x54,0x3b,0x11,0x2a,0xfb,0xf4, + 0x83,0xb8,0x54,0xee,0x50,0x16,0x9b,0x1b,0xc5,0xe6,0xf9,0x62,0xd8,0x3f,0xfc,0x40,0x31,0xe6,0x38,0x27, + 0xb6,0x9d,0xd0,0x39,0x19,0xe3,0x21,0xc9,0x93,0x76,0x3a,0x6b,0xb2,0x68,0xf6,0x29,0x8b,0xa6,0x1e,0xd8, + 0x37,0x13,0x9e,0x8a,0xe1,0x5d,0x80,0xda,0x51,0xb8,0x0a,0x92,0x4f,0xd2,0x3d,0xc9,0xb0,0x2f,0xd1,0x6e, + 0x0b,0x89,0x9c,0x73,0xb0,0x54,0xd4,0x73,0x98,0x63,0xff,0x0e,0xc6,0xde,0xdc,0x86,0xa8,0x68,0x99,0xfa, + 0xd1,0x27,0x3f,0x35,0x6c,0x6c,0x50,0x06,0x9d,0xef,0x86,0x94,0x1d,0x86,0xfb,0x19,0x29,0xd8,0x2f,0xea, + 0x4a,0x33,0xe6,0x1d,0x20,0x8f,0xb7,0xdc,0x49,0x46,0x49,0x4e,0xf8,0xc4,0x06,0xcd,0x8f,0x9f,0x3c,0xb9, + 0x5e,0xf2,0x44,0x0e,0x17,0x29,0x10,0x3a,0x75,0xc6,0xc8,0xd5,0x94,0x09,0xda,0x82,0x3e,0x9b,0x1f,0x27, + 0x73,0x0c,0x5c,0x52,0x1f,0x94,0xe7,0x28,0xe4,0x4d,0x63,0x63,0x4d,0xe7,0x21,0x61,0xf3,0xcc,0xe0,0x98, + 0x8c,0xd4,0xf5,0xf3,0x00,0x41,0xa2,0xf8,0xf1,0x78,0x7f,0x8f,0x88,0x3e,0x3b,0xd8,0xb1,0x22,0x42,0x8f, + 0x3a,0x69,0x85,0x57,0xb0,0x30,0x08,0x84,0x9f,0x03,0x18,0x32,0x68,0xf4,0xfe,0xbe,0xcd,0x3a,0xa8,0xa7, + 0xbd,0xc5,0xfa,0x45,0x71,0xff,0xb3,0xdd,0xe6,0x09,0x74,0x13,0x54,0x81,0xd8,0xd9,0x77,0x3e,0x39,0x6a, + 0x5f,0x51,0x9b,0x6b,0x0a,0x45,0x58,0x48,0xd1,0x1d,0x79,0x6a,0xd8,0xd4,0x29,0x0a,0x63,0x85,0x59,0x13, + 0xf1,0x85,0xb6,0xd5,0xc1,0x74,0x2a,0x88,0x4e,0x46,0xcd,0x0e,0xf2,0x89,0x71,0x13,0x9e,0x17,0x97,0x4e, + 0xde,0x33,0x54,0xcc,0x78,0x7a,0x73,0x85,0x66,0x93,0x9d,0x5e,0xeb,0x3b,0x1b,0x88,0xc6,0x30,0xdb,0xb3, + 0x13,0x3a,0x3f,0xa8,0x9b,0x30,0xc2,0x18,0xfa,0x82,0xaf,0xbf,0xc3,0x70,0xb7,0x8c,0xb5,0x58,0x5b,0x75, + 0xdf,0xc9,0x63,0x80,0xbd,0xf5,0x29,0x50,0x3b,0xd5,0x79,0xcc,0xef,0x56,0x8c,0x63,0x46,0xc2,0xae,0x45, + 0x48,0x3e,0x8f,0xb3,0xaf,0xe8,0x01,0xcd,0x6f,0xc7,0xde,0x4e,0x0b,0x76,0x08,0x3c,0x9b,0x6a,0x04,0x34, + 0x62,0xe1,0x8d,0x43,0x04,0xce,0x0f,0xd7,0x82,0x45,0xe6,0x34,0xca,0x07,0x61,0x03,0x8f,0x18,0x28,0xaa, + 0xd4,0x79,0x16,0xe5,0x18,0x2a,0x21,0x51,0xf9,0x73,0x61,0xb3,0x65,0x4b,0xaf,0x6c,0x5e,0xb8,0xc8,0x28, + 0x87,0x02,0x77,0x22,0xab,0x7a,0xf9,0x6a,0x66,0xb1,0x24,0x46,0xbd,0xa7,0xb4,0xea,0x64,0xfe,0x84,0xa3, + 0x8b,0xc0,0x26,0x14,0xe6,0x9b,0x80,0x4e,0xeb,0x60,0xa6,0x62,0x74,0xb9,0xc1,0xe3,0xaa,0xa3,0x9d,0x2f, + 0x16,0x62,0x88,0xd0,0xc6,0xb2,0xac,0xb0,0x73,0x4c,0xaf,0x82,0x4f,0x96,0xb4,0xfb,0xd0,0x85,0xc3,0x5d, + 0xd6,0x80,0x1f,0xbf,0x6a,0x2e,0x08,0x89,0xe8,0x75,0x3c,0xab,0x34,0x00,0x2f,0x02,0xa8,0x28,0x40,0x7f, + 0xa0,0x8a,0x38,0x62,0xd5,0x37,0x16,0x94,0x02,0x89,0x07,0x5b,0xdc,0xa9,0x6f,0xec,0x9d,0x35,0x6d,0x2b, + 0x53,0x2b,0x6f,0xdd,0x71,0xaa,0x5d,0xb3,0xaf,0x83,0x2f,0x33,0xca,0x62,0x88,0x9f,0x61,0x9d,0x46,0x18, + 0xcc,0x8f,0x09,0x35,0x9b,0xf0,0xa0,0x5e,0x07,0x12,0x22,0x2f,0xaa,0xbd,0xe5,0xbf,0xa6,0x7d,0x65,0xe2, + 0xbb,0x5c,0x1b,0x84,0x54,0xf0,0x66,0x2c,0xb8,0x22,0x2a,0x3f,0xc6,0x8b,0x8a,0x75,0x02,0xd3,0xa7,0x16, + 0xca,0xc4,0x93,0xb4,0xd2,0x9a,0x84,0x97,0xe8,0x67,0x5f,0xbd,0x72,0x60,0xd8,0xd1,0x7a,0x02,0x6f,0x7c, + 0xaa,0x2c,0x30,0xf1,0x13,0x98,0xf1,0x09,0xbb,0x75,0xd8,0x97,0xca,0x02,0x84,0x0e,0x01,0xaf,0x9f,0x79, + 0xa4,0x66,0x7f,0x0b,0xf3,0x62,0x6b,0x79,0x0f,0x27,0x48,0xb9,0xd5,0x61,0x94,0x71,0x73,0x4a,0x52,0xad, + 0x71,0xb0,0x2b,0x7b,0x6f,0x2a,0xb6,0x8f,0xe4,0x63,0x12,0x94,0x11,0xd0,0x21,0xf7,0x96,0x7b,0x8d,0xc0, + 0x08,0x8f,0x81,0x2b,0x1c,0xa0,0x85,0x1f,0xb9,0xf5,0x24,0xcd,0xc8,0x42,0x24,0x74,0xba,0x13,0x7f,0x7a, + 0x7d,0x49,0xe4,0xc2,0x83,0x56,0x9c,0xc1,0x19,0x69,0x68,0xf1,0x27,0x7b,0x63,0x3b,0x2b,0xfb,0x8c,0x6b, + 0xa3,0x1d,0x7c,0x42,0x03,0xbf,0x21,0xfa,0x9d,0xef,0x05,0xec,0x0e,0x7c,0x94,0x86,0xa1,0xbd,0xae,0x98, + 0xb5,0x68,0x79,0x33,0x41,0xf4,0x07,0x20,0xbd,0xb4,0xd9,0xfe,0xff,0xd6,0xae,0xb6,0xb7,0x6d,0x23,0x09, + 0xff,0x95,0x44,0xc0,0x19,0x62,0x44,0x5b,0x72,0xd2,0x3b,0x18,0x54,0x68,0xc1,0x49,0x9c,0xd4,0x88,0x9b, + 0x0b,0x12,0x17,0x3d,0x20,0x0d,0x0a,0xc6,0xa2,0x64,0x22,0x32,0xa9,0x88,0x8c,0x13,0xd7,0xd2,0xcf,0xb8, + 0x6f,0xf7,0xeb,0xee,0x97,0xdc,0x3c,0x33,0xfb,0x46,0x72,0x29,0x39,0x87,0xa2,0x1f,0x1a,0x8b,0xe4,0x72, + 0x39,0x3b,0xbb,0xf3,0xf6,0xcc,0x0c,0xad,0x5f,0xd4,0x3b,0xc4,0xb7,0x13,0x7f,0xd1,0xd9,0x70,0xd8,0x46, + 0xa4,0xaa,0xa1,0x97,0x45,0xc9,0x4b,0x79,0xd2,0x0d,0xf9,0x94,0xa0,0xac,0x13,0x8f,0xa5,0x47,0x57,0xd7, + 0x9c,0x37,0x1a,0xf8,0x86,0xd5,0xd7,0x36,0x61,0xef,0xbf,0xff,0xf9,0x37,0xdd,0x73,0xea,0x05,0x59,0x61, + 0x9f,0xdf,0x30,0x47,0x86,0x17,0xf1,0xf5,0xe7,0xf7,0xdf,0x32,0x78,0x4c,0x1f,0x2a,0xdf,0x7f,0x11,0x5f, + 0x28,0x02,0x31,0x2c,0x32,0x9d,0x32,0xfd,0x82,0xf0,0xbc,0x3d,0x96,0x9c,0x04,0xcb,0xc5,0x57,0xf8,0x4a, + 0x7b,0x06,0xbd,0x4e,0xe3,0x63,0xec,0xef,0xf7,0x7b,0x80,0xee,0x16,0xc0,0x57,0xf8,0xdc,0x3b,0xdb,0x6a, + 0x75,0x9b,0x55,0xb8,0x7c,0xe6,0x25,0x14,0x60,0xb1,0x1c,0xcf,0x11,0xe8,0xab,0xa3,0x2d,0xbc,0x15,0x41, + 0x1e,0x16,0x8c,0x79,0x99,0xdc,0x7d,0x26,0xce,0x8a,0x52,0xa9,0x14,0x5a,0x6d,0x22,0x75,0xf2,0xa7,0xf0, + 0xf8,0x43,0x63,0x53,0x92,0x3e,0xbf,0x9f,0xa4,0xcf,0x8d,0xa4,0x5f,0x69,0xce,0x25,0xc3,0x0f,0x8d,0xca, + 0x31,0x1e,0xc2,0x48,0xe1,0x1f,0x7d,0x47,0x04,0xbd,0x04,0xfb,0xe3,0x67,0x54,0xf1,0x9c,0xd8,0x74,0xda, + 0x64,0xf1,0x35,0x57,0xe8,0x41,0x6e,0xc5,0x75,0xc7,0x0b,0xca,0x51,0xf6,0xac,0x44,0xac,0x8c,0x7e,0x9f, + 0x01,0xb4,0x18,0xda,0x2b,0x0a,0xe4,0x4b,0x5f,0x8e,0xe2,0x18,0x74,0x15,0xeb,0xf6,0xa5,0xaf,0xaa,0x94, + 0x56,0xf0,0xa7,0x03,0x3c,0x85,0xc8,0xc4,0xc7,0x20,0x4a,0xdd,0x69,0x3c,0x23,0x9a,0x64,0x5c,0xe8,0xf0, + 0x4e,0x47,0x8f,0x7c,0xbb,0x5a,0xb0,0xda,0x09,0x00,0x53,0xa0,0x9a,0xc0,0x55,0x4d,0x23,0x4b,0xe4,0x2a, + 0xd2,0x12,0x40,0xb1,0xda,0x22,0x77,0x0c,0xb6,0xdb,0x13,0x03,0x67,0xd3,0xa1,0xac,0x63,0x9a,0x7c,0x3b, + 0xa0,0xce,0xfa,0xd3,0xaf,0x1d,0x7c,0xcf,0x17,0x8c,0x60,0x2a,0x96,0x80,0xf8,0x8c,0xd3,0xed,0x72,0xc3, + 0x1e,0x4b,0xe8,0xaa,0xf2,0x52,0x70,0x1a,0x02,0x99,0x7a,0x0c,0xb6,0x18,0x24,0x62,0xb2,0xe7,0x1f,0xb2, + 0xba,0x1b,0xee,0xe3,0x7a,0xed,0x7a,0xc7,0xe0,0x3f,0x09,0x70,0xff,0x83,0x01,0x3d,0xf2,0xb6,0x2f,0x6c, + 0x45,0x8c,0x07,0x58,0xc9,0x3b,0x11,0x10,0x87,0x58,0x8a,0x3e,0xa2,0xfe,0x9c,0xac,0xa4,0x22,0xa3,0x1c, + 0x55,0xed,0xa1,0x9f,0x39,0xc7,0x01,0xd7,0xeb,0x95,0x25,0x08,0x9d,0x5c,0x13,0x5e,0x08,0xd4,0x42,0xe4, + 0xba,0x17,0x0b,0xb6,0xea,0xb6,0x41,0x38,0x3c,0x47,0x46,0x5a,0xa7,0x56,0xba,0x05,0xb4,0x61,0x2a,0x17, + 0xb4,0xbe,0xd7,0x01,0xbd,0xd2,0x34,0xd8,0x0e,0xee,0x0d,0xc9,0x8a,0x3d,0xbd,0xb8,0x38,0xe5,0x0e,0x18, + 0x0c,0x2a,0xb0,0x50,0x0d,0x33,0x73,0x00,0x0f,0xa6,0x32,0x79,0x93,0x53,0xc9,0xc3,0xbc,0xee,0x73,0xf6, + 0xb8,0x65,0x28,0x20,0x95,0x27,0x6f,0xf1,0x49,0x4c,0xd3,0x1e,0x11,0xd0,0xfa,0x3a,0x51,0x3b,0x28,0x52, + 0x84,0x45,0x9d,0x63,0xa5,0xa5,0x05,0x4c,0xde,0x9d,0x40,0x10,0x43,0xef,0x52,0x5b,0x23,0x97,0x71,0x39, + 0xd1,0xd2,0x91,0xb6,0x87,0x57,0xea,0x4d,0xe5,0x4c,0x51,0xff,0x16,0xc7,0x5b,0xb9,0xb7,0xa7,0x0c,0x84, + 0x4b,0xda,0x41,0x58,0xde,0x62,0x37,0x54,0x61,0x71,0xd8,0xeb,0x40,0x96,0x6c,0xd0,0xa0,0x71,0x35,0x69, + 0x5f,0xab,0x92,0xb9,0x79,0x7b,0x71,0x23,0x11,0xf8,0x48,0x00,0x94,0x0b,0x24,0x23,0x95,0xd6,0x68,0xe0, + 0xbd,0xae,0x2c,0x25,0xd2,0x3c,0x8a,0x12,0x06,0xb8,0x66,0x8c,0x60,0xbd,0xf6,0x32,0xb9,0xa9,0x50,0xf6, + 0xa1,0x6a,0xae,0xb4,0x1c,0x99,0x66,0x19,0xa4,0xaf,0x38,0x52,0x19,0x13,0x92,0xaf,0xd3,0x49,0x42,0x8a, + 0xce,0x22,0x72,0x56,0xa6,0x0a,0x1a,0x3c,0x4e,0xa7,0x0b,0xa9,0x6c,0x45,0xf7,0xd6,0xab,0x40,0xb5,0xbf, + 0x5c,0x09,0x83,0x25,0x15,0x6c,0x9c,0x4e,0xc8,0xe6,0xc0,0x7b,0xe7,0x20,0x27,0xdb,0x40,0xe5,0xf9,0x6a, + 0x69,0x17,0x5a,0x7d,0x74,0x00,0x3a,0xb8,0x2e,0x7a,0x1b,0x04,0xfe,0xb8,0x83,0x7c,0xa9,0x78,0x30,0x9e, + 0x39,0x8c,0x5c,0x85,0x5b,0xc9,0x17,0x3e,0x7c,0x98,0x38,0x7a,0x61,0x12,0xab,0x08,0x3d,0x7d,0x29,0xda, + 0x4f,0xbb,0x90,0x83,0xda,0xa1,0x63,0xd0,0x39,0xc6,0x19,0x0a,0xef,0x5f,0xa0,0x67,0xb0,0xf5,0x43,0x6f, + 0x8b,0xaf,0x2b,0xc8,0xdf,0x36,0xe7,0x5d,0x17,0x39,0x72,0xaa,0x94,0x3d,0xaf,0x1b,0x40,0xa2,0x26,0x6d, + 0xa8,0x06,0xe6,0xfc,0x28,0xe5,0x6a,0x49,0xf4,0xab,0x9f,0xa9,0x53,0x2c,0xd4,0x1d,0xcd,0xf9,0x6b,0xa5, + 0x9a,0x04,0x3e,0x99,0xc3,0xfc,0xdb,0x61,0xe2,0xac,0x49,0x6a,0x90,0xf8,0xd2,0x07,0x15,0x4a,0x91,0xc9, + 0xd9,0xfc,0x5d,0xcd,0xd4,0x5d,0x2e,0x95,0xeb,0x6b,0x27,0x6f,0x79,0xe1,0x45,0x9f,0x5d,0x71,0xa5,0x12, + 0xdd,0x75,0x13,0x3a,0x35,0x0a,0xa8,0x3c,0x38,0xd6,0x7f,0x9a,0xf5,0x87,0x53,0x80,0xf7,0xdb,0x32,0x76, + 0x6c,0x53,0xed,0xa2,0xcc,0x43,0x66,0xc1,0x50,0x8f,0x0e,0xdb,0xf1,0xb4,0x06,0xf6,0x97,0xf7,0xfc,0x52, + 0x2b,0x23,0x09,0xeb,0x7a,0x14,0x1a,0xe3,0x9d,0x14,0x47,0xd7,0xee,0xed,0xa7,0xfb,0x70,0x6c,0xcd,0xaa, + 0x60,0xe8,0xd8,0xe2,0x95,0x18,0xd3,0xc1,0x23,0x38,0xd1,0x5c,0x85,0xe7,0x67,0x87,0xd7,0xdb,0xda,0xf4, + 0xb8,0xa1,0x4b,0x37,0x3f,0xac,0xea,0xc2,0xed,0x72,0xb7,0x6d,0x87,0x8c,0x6f,0x90,0x35,0x56,0xa7,0xd5, + 0x37,0x7f,0x91,0x0a,0xab,0x49,0x71,0x19,0x23,0x67,0xf3,0xd4,0xe4,0x97,0x68,0xd2,0xfa,0x4f,0xc7,0x3a, + 0x81,0x13,0x07,0x35,0xd9,0x1c,0x7d,0x43,0x01,0x7c,0x38,0x05,0xb0,0x37,0xd0,0x5e,0xe4,0x7e,0x49,0xc3, + 0x0f,0x7a,0x7f,0xab,0xeb,0x0b,0xa2,0x0c,0x73,0xda,0x37,0x4a,0x37,0x06,0x5d,0x9a,0xb8,0x7b,0xcf,0x00, + 0x98,0x9b,0x41,0x7d,0x7d,0xed,0x2b,0xf8,0x1d,0x72,0x9e,0x67,0x9c,0xcd,0xc7,0x93,0xb1,0xa6,0x47,0x04, + 0x69,0x78,0xb9,0xb1,0x99,0x9b,0x3e,0x98,0xec,0xb2,0xc8,0x70,0xbe,0xc9,0x79,0x57,0x09,0x56,0xb6,0x3a, + 0x90,0xcf,0xd7,0x3c,0x59,0x79,0xd2,0xb2,0xe3,0x34,0xa4,0x15,0x0e,0xff,0x74,0x6a,0x90,0xdf,0xc0,0xa8, + 0x79,0x86,0x37,0xd3,0x36,0x78,0xce,0xfe,0x22,0xf6,0x84,0x20,0xcb,0xdf,0x99,0x78,0x93,0x19,0x80,0x5a, + 0x92,0x46,0x38,0xc6,0xad,0xb1,0x60,0x59,0xa2,0x91,0xa2,0xbf,0xf4,0x2b,0xe5,0x7e,0xfa,0x17,0x70,0xdb, + 0xfd,0x62,0xbd,0x2e,0x01,0x90,0x0e,0xb8,0xe1,0xcd,0x25,0x78,0xfb,0x05,0xa3,0xe2,0x97,0x71,0xc9,0x25, + 0x7c,0x60,0x81,0x61,0x4d,0xd0,0x68,0x87,0x56,0x21,0x69,0x96,0xc3,0x9e,0xae,0x12,0x58,0xa1,0x9f,0x55, + 0x2a,0xb8,0xda,0xb7,0x25,0xdb,0x66,0x01,0x40,0x32,0x2c,0x99,0x94,0xef,0x4a,0x92,0xc3,0xfc,0x54,0xc3, + 0x95,0x1e,0x6a,0xc4,0xdd,0xe3,0x5e,0xd2,0x0a,0x91,0xd5,0x72,0x8f,0x3b,0xa5,0xbe,0x11,0xdf,0x5d,0x70, + 0x35,0x6f,0xa1,0x97,0xd7,0x83,0xfc,0x46,0xd6,0xa0,0x5d,0x28,0x1c,0x4e,0xa2,0x4d,0x38,0x22,0xf9,0xd7, + 0x5d,0xf6,0xd7,0xff,0x11,0x9d,0x37,0xd6,0xbf,0xa0,0xf3,0x36,0x3b,0x7d,0xa4,0xe7,0x6e,0x11,0xbe,0x7c, + 0x7c,0xe1,0xdb,0xde,0xae,0x8a,0x65,0x32,0x4f,0x04,0xb1,0x12,0xa2,0x38,0x38,0xb7,0xc9,0xb2,0x2c,0xd6, + 0x35,0x92,0x11,0xd4,0x95,0x93,0x0c,0xd0,0x3b,0x59,0x91,0xc5,0x70,0x4e,0xeb,0x0f,0x4d,0x96,0xa5,0xd7, + 0x64,0xff,0x30,0x92,0x9f,0xdf,0xe9,0xaa,0xf8,0xf2,0xfb,0x61,0x34,0x92,0xd2,0xe4,0x5b,0x58,0x5d,0xf3, + 0x56,0xd7,0x11,0x49,0xd7,0x06,0xf9,0x23,0xe2,0xd1,0xf2,0x2a,0x9b,0x55,0xaf,0x31,0xea,0x28,0x3a,0x94, + 0x42,0x38,0x5b,0x56,0x0e,0x9f,0xa7,0x56,0x0f,0x7c,0x67,0x7b,0x39,0x37,0x9c,0x0c,0xed,0xed,0xf2,0x71, + 0xcc,0xea,0xaa,0x93,0x03,0xbd,0x71,0x4f,0xc4,0x3f,0xb7,0x1f,0xbc,0x08,0xea,0xd8,0x4a,0xb9,0x35,0x7b, + 0x11,0x9b,0xd9,0xf1,0x54,0x34,0xf6,0x87,0xff,0x18,0xe2,0x8a,0x3f,0x27,0x56,0xb4,0xd4,0xcf,0xe2,0xa7, + 0x8f,0xed,0xbc,0x7e,0xa5,0x79,0xcd,0x3c,0x59,0x4a,0xee,0xfd,0x83,0x1e,0xa9,0xf0,0x2a,0x26,0x35,0xb0, + 0x26,0x39,0xdf,0x02,0x8d,0x7d,0xe6,0x11,0x0b,0xb4,0x24,0xbd,0xb0,0x3e,0x8c,0x8d,0x6b,0xd5,0xa4,0x9e, + 0x96,0x86,0x2e,0xdd,0xed,0xfc,0xfe,0x89,0x3e,0x13,0xa2,0x52,0x7f,0x22,0x95,0xba,0x70,0x2e,0xfd,0xe6, + 0x76,0x26,0x27,0x0d,0x50,0x2b,0x54,0x5c,0xd4,0x1b,0x36,0xe9,0xf8,0xac,0xad,0x7c,0x4f,0x1c,0xa5,0x19, + 0x08,0x53,0xce,0x81,0x9c,0xfb,0xd3,0x41,0xd5,0xbd,0xb0,0xa5,0x13,0x94,0xf7,0xb0,0x1e,0x04,0x3b,0x89, + 0x3f,0x76,0x4e,0x42,0x0d,0x1e,0x27,0x13,0x19,0x35,0xca,0xc2,0xb9,0xf3,0xf9,0x0f,0xd3,0xf0,0xb6,0x35, + 0x4d,0x28,0x84,0x66,0xaa,0xdf,0x72,0x01,0x96,0xb1,0x70,0xa3,0x8f,0x0e,0x69,0xcd,0x9a,0x48,0xe1,0x2f, + 0xce,0x34,0xea,0x5f,0xa3,0x43,0x7a,0xdd,0xd5,0x5f,0xd2,0x76,0xbf,0x73,0xe8,0x5a,0x92,0x3a,0x0d,0xac, + 0xb2,0x91,0x00,0x79,0xdc,0xd0,0x30,0x95,0x0c,0x43,0xc8,0xc1,0xfb,0xf1,0x93,0x57,0x68,0xe9,0x9d,0x92, + 0x6d,0xe2,0xf4,0xf8,0x84,0xfe,0x2e,0x6f,0xca,0x05,0xb8,0x2a,0x2f,0xfc,0x96,0x2d,0x78,0x59,0x5a,0x5e, + 0x0e,0x75,0x74,0x05,0xda,0x8d,0x91,0xb2,0x25,0xb1,0xcb,0xd9,0xf1,0x0a,0xba,0x31,0x7b,0x3b,0x52,0xf8, + 0x38,0x36,0x2d,0x92,0xbd,0x82,0x45,0x78,0xd6,0x4a,0xdd,0xd4,0x52,0xb9,0xd9,0x9e,0xcd,0x76,0x3d,0x75, + 0xe2,0xca,0x24,0x9e,0x3e,0xba,0xce,0x59,0xd4,0x66,0x93,0xce,0x16,0xd6,0xfc,0x25,0x9d,0x77,0xd0,0x3b, + 0xa8,0xe0,0xb9,0x55,0x29,0x6e,0xb1,0xf8,0x99,0x1a,0xb4,0x9c,0x18,0xf2,0x45,0x4a,0x57,0x96,0x9c,0xff, + 0x8d,0xc4,0x1e,0x16,0x31,0x7b,0x8c,0xdc,0x25,0xb2,0xe5,0x2d,0x8c,0xc9,0x4c,0xec,0x48,0x66,0x67,0xab, + 0x66,0xa3,0x2f,0xcd,0x94,0x24,0x91,0x6e,0x28,0x74,0x56,0xcf,0x38,0x6d,0x10,0xea,0xf5,0x5f,0xd6,0x72, + 0xd4,0x90,0x84,0xe6,0x5c,0xa1,0x85,0xb7,0x0c,0xa2,0xfb,0x0d,0xd1,0x5c,0xe8,0x40,0xee,0xcc,0x3f,0x20, + 0x12,0xb6,0xf3,0x0f,0xa0,0x39,0xca,0x7c,0xeb,0xa9,0x67,0xcd,0x7c,0x25,0x79,0x18,0xf9,0x4a,0x4e,0x5f, + 0x4c,0x6e,0x01,0xd4,0x28,0xda,0xe6,0x7a,0x2d,0x3a,0x93,0x89,0xbc,0xc9,0x13,0xa2,0x4f,0x19,0x20,0x40, + 0x42,0x6f,0xfa,0x90,0x37,0xec,0xbf,0x38,0x9b,0x48,0x31,0x84,0x9c,0xdb,0x9a,0xea,0x92,0x68,0x30,0xfa, + 0xb2,0x4d,0xe4,0xbb,0x44,0x76,0x12,0x52,0xf4,0x6b,0x00,0x62,0xb8,0xbd,0xab,0x7b,0xb8,0x36,0x6e,0xba, + 0xe5,0x7c,0x2a,0x4a,0xe5,0x25,0xca,0xc1,0x35,0x9d,0x03,0x07,0xac,0x58,0x9b,0x0e,0x1f,0x6c,0x0f,0xf9, + 0x0f,0x72,0x6f,0x49,0x50,0x7a,0x7a,0x46,0x8c,0x2e,0x87,0xc7,0x3d,0xf4,0xd0,0x84,0x74,0xc9,0xd4,0xd1, + 0x25,0x85,0x90,0x2a,0xc8,0x67,0x82,0x87,0xc4,0xfb,0x8e,0xac,0x4b,0x86,0xc0,0x8a,0x3c,0xfe,0x09,0x1e, + 0x96,0x06,0x7c,0x63,0xfc,0xa2,0x6f,0xab,0x26,0xdf,0xa1,0x3f,0xcc,0x92,0xd6,0xd8,0xd8,0x6a,0x6c,0xa3, + 0x2e,0x76,0xaa,0x01,0x0b,0x3e,0x65,0x21,0x6e,0x3b,0xd3,0xa8,0x6b,0x3e,0x31,0x03,0x5f,0x50,0xf2,0x19, + 0x20,0x86,0x71,0x56,0xbe,0xcc,0xf2,0x0c,0x55,0x0c,0xa1,0x15,0xbf,0xe0,0xc2,0x49,0x5b,0x54,0x96,0x5d, + 0xca,0xc9,0x9b,0xbe,0x52,0x86,0x21,0xdb,0x77,0xe6,0xd6,0x35,0x65,0x7e,0x97,0x2d,0xeb,0x68,0x21,0xe6, + 0xed,0x4b,0x06,0x70,0xa4,0x80,0x29,0x5b,0x5d,0xc4,0x22,0xb5,0x1a,0x82,0x9d,0x91,0x5f,0x42,0xae,0xd3, + 0x1d,0xf3,0xb2,0xa6,0xef,0x61,0xd8,0xb4,0x9e,0x53,0x2e,0x53,0xb3,0x8c,0xd1,0xa7,0x44,0x46,0xfb,0xfe, + 0xa3,0x5f,0x69,0x39,0xb3,0x83,0x1b,0xb9,0x9f,0xa1,0x6b,0xe0,0xdf,0x29,0x08,0x17,0x9d,0x47,0xfb,0x87, + 0x26,0xf8,0x0c,0xc8,0x0e,0x99,0x7a,0x4f,0x1b,0x36,0x6c,0x6e,0x11,0x5e,0x89,0x21,0x4b,0xce,0xd0,0xaa, + 0x7d,0xf3,0x27,0x70,0x56,0xc9,0x71,0x45,0x0b,0x5e,0xc5,0x09,0xed,0xb3,0x5c,0x3b,0x15,0x69,0xcf,0x1e, + 0x8f,0x26,0xae,0xed,0xae,0x9f,0x49,0xe9,0x99,0x81,0xf9,0x83,0xc7,0x0b,0x86,0x8f,0x83,0xa8,0xc6,0x1e, + 0xfa,0x7a,0x93,0xf6,0x78,0xf6,0x90,0xa5,0xca,0x65,0xb4,0x73,0xdf,0xe4,0xdd,0xfb,0x86,0xb6,0x49,0xde, + 0xd8,0x26,0xc9,0xce,0x6d,0x92,0x48,0xf1,0xd9,0xda,0x53,0x34,0x8f,0xee,0xb9,0x5e,0x0a,0x94,0xd4,0x61, + 0xab,0xd6,0x3d,0xe3,0x5f,0xa5,0x5a,0xc7,0xbc,0x7b,0xeb,0xfd,0x16,0x84,0xe7,0xdb,0x79,0x43,0x39,0x32, + 0x3d,0x3e,0x61,0xeb,0x8d,0xa4,0x37,0x18,0x75,0x3d,0x08,0x9f,0xff,0x48,0xad,0x09,0xcd,0x3f,0x93,0xb2, + 0x15,0x0b,0xe2,0x54,0x22,0x8e,0x07,0x15,0xa5,0x8a,0x08,0x45,0x65,0x1b,0x00,0x37,0xbe,0x67,0xdb,0xb7, + 0x3b,0xd3,0xfc,0xce,0x96,0x31,0xff,0x29,0x7d,0x12,0xa6,0xb3,0x19,0x1d,0x9f,0x51,0xef,0x2d,0xa9,0xde, + 0xd7,0x09,0x7f,0x1f,0x22,0xf3,0x51,0xaa,0xff,0xf5,0x8c,0x08,0x3a,0x8d,0x8a,0x5a,0x3d,0xac,0x2b,0xd8, + 0x65,0xc1,0xee,0x9a,0x85,0x67,0xdb,0x89,0xfb,0x45,0x8a,0xf5,0x75,0xb6,0xcd,0x4a,0xb8,0x67,0x96,0xf2, + 0x82,0xb4,0x53,0xbb,0x10,0x85,0x46,0xd8,0x0a,0x75,0x25,0xbc,0xbe,0xf5,0x62,0x7a,0xeb,0x7b,0x58,0x27, + 0x48,0xc9,0xae,0x16,0xa5,0x98,0xd8,0xd6,0x9f,0x41,0xbf,0x09,0xcf,0x03,0x5f,0x86,0xa5,0x7a,0xb3,0x0f, + 0xd8,0x30,0x95,0x20,0xa2,0x37,0x0a,0x9e,0xb2,0xbf,0x7f,0x1e,0xce,0x42,0x6f,0x54,0xfd,0xd3,0xa2,0xee, + 0x57,0xfa,0x04,0xe2,0x5f,0x21,0xe2,0xd4,0xe9,0x42,0x75,0x6e,0xe4,0x30,0x2b,0xa7,0xe7,0xd0,0x3f,0x6e, + 0xbc,0x13,0x28,0x49,0x03,0xde,0x84,0xef,0xf9,0xa6,0x8e,0x31,0x1f,0x2c,0x17,0x66,0x58,0x13,0x3d,0x26, + 0x09,0xe6,0xb9,0x7d,0xce,0x14,0xa2,0xe3,0x3a,0x3c,0x09,0xc2,0x5b,0x2f,0x01,0xb1,0x4a,0x2a,0x1b,0xf5, + 0xfb,0x96,0x11,0x9e,0x87,0x67,0xec,0xfc,0xf5,0x6d,0xb4,0xd7,0xfd,0x06,0xc0,0xe6,0xbc,0x98,0x6f,0x2d, + 0xe5,0x85,0x0b,0xc5,0x22,0xb5,0x95,0x09,0x46,0xa4,0x0b,0xa0,0x85,0x23,0xa0,0x94,0xb9,0x87,0x27,0xcb, + 0xcb,0x55,0x41,0x67,0xbb,0x92,0x06,0x71,0x7e,0x20,0x3f,0x5c,0x14,0x64,0xfc,0xd7,0xc0,0x51,0xc7,0xe6, + 0x9a,0xfc,0xbd,0x7f,0x14,0x2e,0xea,0x21,0xec,0x38,0xdb,0xd8,0xb4,0x3e,0x5f,0x90,0x99,0x13,0xde,0xb8, + 0xe2,0xda,0x2e,0x19,0x87,0x6c,0xbb,0x76,0x8a,0xaa,0x75,0xe1,0x17,0xfe,0xf1,0x55,0x50,0xb2,0xb8,0xcf, + 0x39,0x24,0x07,0x07,0x1e,0x11,0x33,0xc4,0x01,0xa7,0x3a,0xfb,0x9d,0xae,0x67,0xd2,0x48,0xd9,0x6a,0x44, + 0xad,0x60,0x7e,0x16,0x37,0x28,0xb1,0xb5,0x25,0x9e,0x9b,0x9b,0xd9,0xdc,0x43,0x8b,0x62,0xee,0xdd,0x3f, + 0xce,0xbe,0xa5,0x5b,0xf4,0xbe,0xed,0xd8,0xb5,0xab,0xb0,0xd8,0xc2,0x6e,0xdb,0x76,0x13,0xca,0xbd,0x29, + 0x86,0xe0,0x20,0x2a,0xef,0x27,0x78,0x64,0x75,0x7e,0x57,0xe3,0x18,0xdf,0x66,0xca,0xd0,0x3c,0xcb,0x09, + 0xb7,0x3e,0x22,0x5b,0x26,0xa1,0x43,0x58,0xbc,0x78,0x38,0x79,0x41,0x9e,0xbd,0x3d,0x46,0xa5,0x1f,0x64, + 0xa5,0xa0,0xd3,0xd3,0x83,0x45,0x96,0xa7,0xdc,0xe6,0x0f,0x38,0x74,0x34,0xfd,0x08,0xd5,0x6f,0x26,0xf3, + 0xb3,0x5f,0x9a,0xf8,0x88,0xbe,0xdd,0x14,0x65,0x3e,0x3e,0x1a,0x8d,0x26,0xfd,0x12,0x32,0x91,0x35,0xaf, + 0xfd,0x7f,0x8c,0x46,0xbe,0x7c,0xe8,0xda,0x3a,0x07,0x91,0x7e,0x85,0xa3,0x41,0xe5,0x66,0xe5,0x06,0x8a, + 0x1b,0x32,0x06,0xc3,0x98,0x8d,0xd1,0xd8,0x08,0xdc,0x4c,0x10,0xd5,0x4c,0xeb,0x3b,0xf5,0x25,0x2d,0x29, + 0xdd,0x96,0x82,0x6f,0xef,0x3a,0x7b,0x55,0x36,0x3c,0xb8,0x33,0x24,0x50,0xba,0xf1,0x7a,0x83,0xba,0x44, + 0xe3,0x46,0x19,0xae,0x17,0x72,0x64,0x22,0x7a,0xf2,0x78,0x14,0x0a,0x08,0x2f,0x3a,0x1a,0x29,0x88,0x40, + 0x76,0x3d,0x6f,0x43,0x61,0xd0,0xa4,0x0c,0xad,0x30,0xc0,0xc3,0x66,0x22,0x90,0x10,0x6d,0xdf,0x8e,0xdb, + 0xe0,0xaa,0x89,0x30,0x54,0x07,0xca,0x13,0x04,0xee,0x8f,0x4c,0xb9,0x03,0x47,0xa6,0xb7,0xb1,0x8c,0x4e, + 0x2f,0x1f,0xe8,0x60,0x59,0x4e,0x5b,0x91,0xa1,0x97,0xc3,0x24,0xe4,0x3f,0x84,0x82,0xc3,0x2c,0xb0,0xce, + 0x7c,0x0d,0x9e,0x8c,0xe3,0xe4,0x11,0x10,0x16,0x1a,0x27,0x19,0xc7,0xd9,0xa3,0x8a,0x03,0x93,0x72,0x9d, + 0xae,0x5a,0x10,0x25,0x5d,0x02,0xc6,0x74,0xdc,0xde,0xf7,0x2b,0x86,0xc2,0xca,0xb9,0x52,0xf6,0xff,0x2f, + 0x4e,0x56,0x89,0xac,0x43,0x4d,0xfe,0x3a,0x2b,0x93,0xda,0xcb,0x65,0xff,0x96,0x40,0x81,0x96,0xe3,0x3a, + 0x57,0x57,0x9a,0x9f,0x79,0xce,0xeb,0x35,0x13,0x4f,0xcf,0x7a,0xbd,0x3e,0xa2,0xa3,0x1e,0x08,0xd5,0x1c, + 0x11,0x4c,0x40,0x46,0xfa,0xcc,0x4c,0x28,0xca,0x0e,0xd8,0xc2,0xf0,0xf7,0xe1,0xcc,0x70,0xd1,0xef,0xc3, + 0x89,0x76,0x37,0xa1,0x3c,0x00,0xf8,0x8c,0xac,0xcc,0xea,0x4a,0xac,0xf8,0x26,0xc7,0x89,0x9a,0x8e,0xf6, + 0x8a,0x8b,0x24,0x9f,0x7f,0xaa,0x50,0x1b,0xad,0xb9,0xda,0xe7,0x27,0x6f,0x5e,0xd5,0x15,0xd8,0x40,0xe6, + 0xa3,0xfb,0x27,0xae,0x50,0x94,0x63,0xe5,0x54,0xef,0xa1,0xf1,0xe8,0x81,0x25,0xf0,0x6a,0xf8,0x6e,0xae, + 0x89,0xd1,0xc5,0xd9,0x12,0xae,0x40,0x93,0xc9,0x55,0x41,0x2f,0xa8,0x6e,0xfb,0xbd,0xfd,0xfd,0xcb,0xab, + 0x55,0x71,0x9d,0xee,0x5f,0x21,0x8a,0x59,0xcc,0x66,0x74,0x55,0x38,0x60,0xd0,0x5b,0x7e,0x87,0x5f,0x01, + 0xb5,0x65,0xda,0xf8,0xe5,0x2a,0x30,0x50,0x62,0x3a,0x8e,0x7e,0x34,0x35,0x59,0x40,0xba,0xce,0xb2,0xfd, + 0x9d,0x4f,0x20,0x7a,0x37,0xca,0x93,0x00,0xaa,0x4a,0x4a,0x41,0xb2,0x44,0xa9,0xe0,0x6c,0x79,0x32,0x9d, + 0xa2,0xdd,0xca,0x7a,0xdd,0x1b,0x1d,0xf0,0x7f,0xd2,0x64,0xd9,0x5c,0xe0,0x5b,0xf7,0xf6,0x34,0x65,0x1c, + 0x9f,0x82,0x99,0x0b,0xd1,0xe9,0x47,0xea,0x07,0x8c,0xdf,0x1f,0x54,0xab,0x24,0x2f,0x33,0xd6,0x56,0x0d, + 0xe4,0xbe,0x5f,0xfb,0x19,0x78,0x3e,0xfb,0x17,0x7b,0x76,0xc2,0x7a,0xc9,0x02,0x9c,0xd3,0xc9,0x4d,0xbf, + 0x99,0x26,0xbd,0x79,0x0a,0xb6,0xcd,0x96,0xd5,0xf1,0x83,0xa7,0x43,0xec,0x79,0xfc,0xff,0xaa,0xba,0x5e, + 0x1c,0x3f,0xf8,0x1f,0x4e,0x64,0x86,0x23,0x07,0xda,0x03,0x00, }; } // namespace awtrix diff --git a/src/transport/mqtt/HaAnnouncer.cpp b/src/transport/mqtt/HaAnnouncer.cpp index 33134488..611c253e 100644 --- a/src/transport/mqtt/HaAnnouncer.cpp +++ b/src/transport/mqtt/HaAnnouncer.cpp @@ -3,6 +3,7 @@ #include "AppConfig.h" #include "hal/IBoard.h" #include "system/Log.h" +#include "system/Watchdog.h" namespace awtrix { @@ -13,6 +14,7 @@ class PubSubSink : public ha::IByteSink { explicit PubSubSink(PubSubClient& client) : client_(client) {} void write(const char* data, std::size_t len) override { + watchdog::feed(); // discovery is streamed in many individually bounded TCP writes client_.write(reinterpret_cast(data), len); } diff --git a/src/transport/mqtt/MqttLink.cpp b/src/transport/mqtt/MqttLink.cpp index 6fb33d9f..879f95b3 100644 --- a/src/transport/mqtt/MqttLink.cpp +++ b/src/transport/mqtt/MqttLink.cpp @@ -3,6 +3,7 @@ #include #include "system/Log.h" +#include "system/Watchdog.h" namespace awtrix { @@ -44,6 +45,10 @@ void MqttLink::begin(const DeviceConfig& cfg, const std::string& clientId, if (!enabled_) return; +#if defined(AWTRIX_PLATFORM_RP2040) + // arduino-pico applies this millisecond timeout to TCP connect and write, not just reads. + wifi_.setTimeout(300); +#endif client_ = new PubSubClient(wifi_); if (!client_->setBufferSize(kMqttBufferBytes)) logf("mqtt: could not allocate a %u-byte packet buffer; large commands will be dropped", @@ -142,6 +147,7 @@ bool MqttLink::tick(uint32_t nowMs) { // Registers a retained "offline" will, so the broker publishes it for us if the device drops off // without saying goodbye. bool MqttLink::connectNow() { + watchdog::feed(); const std::string will = prefix_ + "/availability"; return (user_.empty() && pass_.empty()) ? client_->connect(clientId_.c_str(), will.c_str(), 0, true, "offline") diff --git a/src/transport/mqtt/MqttService.cpp b/src/transport/mqtt/MqttService.cpp index 90dd3a47..a1455ee8 100644 --- a/src/transport/mqtt/MqttService.cpp +++ b/src/transport/mqtt/MqttService.cpp @@ -2,8 +2,10 @@ #include "core/CoreEngine.h" #include "core/api/ApiRouter.h" +#include "platform/BuildFeatures.h" #include "system/Log.h" #include "system/MonotonicClock.h" +#include "system/Watchdog.h" #include "transport/DeviceStateJson.h" #include "transport/ScriptMqttBridge.h" @@ -74,6 +76,7 @@ void MqttService::tick() { // Publishes in streaming form so the payload is never copied into the packet buffer; that keeps // state documents larger than the buffer's spare room from failing. bool MqttService::send(const std::string& topic, const std::string& payload, bool retained) { + watchdog::feed(); PubSubClient* client = link_.client(); if (!client->beginPublish(topic.c_str(), static_cast(payload.size()), retained)) return false; @@ -124,7 +127,7 @@ void MqttService::handleMessage(char* topic, uint8_t* payload, unsigned int len) engine_->state().runtime().receivedMessages++; Command cmd; std::string result; - switch (api::routeMqtt(suffix, body, cmd, result)) { + switch (api::routeMqtt(suffix, body, cmd, result, platform::buildFeatures())) { case api::RouteOutcome::Routed: { const DispatchResult r = engine_->execute(cmd); logdbg("mqtt cmd %s -> %d", suffix.c_str(), static_cast(r)); diff --git a/src/transport/net/HostResolver.h b/src/transport/net/HostResolver.h index 78f5d5bd..0b6d3dcc 100644 --- a/src/transport/net/HostResolver.h +++ b/src/transport/net/HostResolver.h @@ -18,8 +18,8 @@ class IHostResolver { public: virtual ~IHostResolver() = default; - // Never blocks. Call it repeatedly with the same host until it returns Ready or Failed; a - // literal IPv4 address is answered on the spot. + // Poll until Ready or Failed. ESP32/simulator are asynchronous; Pico uses bounded calls + // (1 s per lookup, at most 2 s with the .local bare-label fallback). IPv4 is immediate. virtual ResolveState resolve(const std::string& host) = 0; virtual IPAddress address() const = 0; diff --git a/src/transport/net/NetworkService.cpp b/src/transport/net/NetworkService.cpp index a7d07e85..5d33146e 100644 --- a/src/transport/net/NetworkService.cpp +++ b/src/transport/net/NetworkService.cpp @@ -1,8 +1,15 @@ #include "transport/net/NetworkService.h" -#include #include +#if defined(AWTRIX_PLATFORM_RP2040) +#include +#include +#include "platform/rp2040/RadioStartup.h" +#include "platform/rp2040/WifiCompat.h" +#else +#include #include +#endif #include @@ -23,10 +30,86 @@ constexpr unsigned long kCheckMs = 5000; constexpr int kWeakChecksBeforeRoam = 6; constexpr unsigned long kRoamCooldownMs = 300000; -net::WifiAssoc assocNow(bool apMode) { - // In provisioning mode the station side is only ever mid-retry: a successful join restarts the - // device, so "connected" is not a state the AP branch ever has to report. - if (apMode) return net::WifiAssoc::Disconnected; +#if !defined(AWTRIX_PLATFORM_RP2040) +constexpr int kBootJoinAttempts = 1; // ESP32 keeps its station retrying alongside the AP +#endif + +unsigned long joinTimeoutMs(const DeviceConfig& cfg) { + return cfg.wifiConnectTimeout > 0 ? static_cast(cfg.wifiConnectTimeout) : 15000UL; +} + +#if defined(AWTRIX_PLATFORM_RP2040) +// Pico join bookkeeping: begin() does not block, so a join is only restarted once it timed out. +unsigned long lastJoinMs = 0; +bool joinedBefore = false; +// CYW43 has one radio: while the provisioning AP is up the station can only join on the AP's +// channel, so a join from AP_STA fails unless the router happens to use it. The Pico drops the AP +// for one join window instead, and less often than ESP32 retries. +constexpr unsigned long kPicoApRetryMs = 60000; +// After an unclean reset (BOOTSEL, a power blip) the AP may still hold the old association, and the +// first join can stall mid key exchange (driver join state AUTH, never KEYED) while a fresh join to +// the same AP keys in milliseconds. Falling back to the provisioning AP instead costs the Pico a +// minute offline and a reboot, so it joins again before giving up. +constexpr int kBootJoinAttempts = 3; +// CYW43 reports a join the AP broke off mid key exchange as BADAUTH, the same as a wrong password. +net::AuthFailureGate authGate; + +const char* cyw43LinkName(int link) { + switch (link) { + case CYW43_LINK_DOWN: return "down"; + case CYW43_LINK_JOIN: return "joining"; + case CYW43_LINK_NOIP: return "no IP"; + case CYW43_LINK_UP: return "up"; + case CYW43_LINK_FAIL: return "failed"; + case CYW43_LINK_NONET: return "network not found"; + case CYW43_LINK_BADAUTH: return "authentication rejected"; + default: return "unknown"; + } +} + +// The driver's view of every join, deauth and key exchange, so a dropped link says why. +void logRadioEvents() { + static uint32_t reportedDropped = 0; + platform::RadioEvent e; + uint32_t dropped = 0; + bool sawLinkUp = false; + uint8_t linkAp[6] = {}; + while (platform::takeRadioEvent(e, dropped)) { + if (e.type == CYW43_EV_LINK && e.status == 0 && (e.flags & 1) && e.itf == CYW43_ITF_STA) { + sawLinkUp = true; + memcpy(linkAp, e.addr, sizeof linkAp); + } + const char* name = platform::radioEventName(e.type); + char unknown[16]; + if (name == nullptr) { + snprintf(unknown, sizeof unknown, "type %lu", static_cast(e.type)); + name = unknown; + } + logdbg("wifi: cyw43 %s status %lu reason %lu from %02x:%02x:%02x:%02x:%02x:%02x " + "(itf %u, join state 0x%04lx, t=%lu ms)", name, static_cast(e.status), + static_cast(e.reason), e.addr[0], e.addr[1], e.addr[2], e.addr[3], + e.addr[4], e.addr[5], e.itf, static_cast(e.joinState), + static_cast(e.ms)); + } + // Which AP the link came up on. WiFi.BSSID()/RSSI() read nothing until lwIP has an address, so + // the AP comes from the event and the RSSI from the driver. + if (sawLinkUp) { + int32_t rssi = 0; + cyw43_wifi_get_rssi(&cyw43_state, &rssi); + logf("wifi: link up via %02x:%02x:%02x:%02x:%02x:%02x (%ld dBm, roam_off %d)", linkAp[0], + linkAp[1], linkAp[2], linkAp[3], linkAp[4], linkAp[5], static_cast(rssi), + platform::firmwareRoamOff()); + } + if (dropped != reportedDropped) { + logf("wifi: %lu cyw43 events not logged (buffer full)", + static_cast(dropped - reportedDropped)); + reportedDropped = dropped; + } +} + +#endif + +net::WifiAssoc radioAssoc() { switch (WiFi.status()) { case WL_CONNECTED: return net::WifiAssoc::Connected; case WL_NO_SSID_AVAIL: return net::WifiAssoc::NoSsidFound; @@ -36,6 +119,47 @@ net::WifiAssoc assocNow(bool apMode) { default: return net::WifiAssoc::Disconnected; } } + +void joinStation(const DeviceConfig& cfg, bool apMode) { +#if defined(AWTRIX_PLATFORM_RP2040) + // Before every join: begin() can bring the radio back up with firmware defaults. + static int loggedRoamOff = -2; + const int roamOff = platform::disableFirmwareRoaming(); + if (roamOff != loggedRoamOff) { + logf("wifi: firmware roaming %s (roam_off %d)", roamOff == 1 ? "off" : "NOT off", roamOff); + loggedRoamOff = roamOff; + } + authGate.noteJoin(radioAssoc()); + logf("wifi: joining \"%s\"", cfg.wifiSsid.c_str()); + platform::pico::join(WiFi, apMode ? WIFI_AP_STA : WIFI_STA, cfg.wifiSsid.c_str(), + cfg.wifiPass.c_str()); + lastJoinMs = millis(); + joinedBefore = true; +#else + WiFi.begin(cfg.wifiSsid.c_str(), cfg.wifiPass.c_str()); +#endif +} + +void reconnectStation(const DeviceConfig& cfg) { +#if defined(AWTRIX_PLATFORM_RP2040) + // A second begin() would abort a join that is still in progress. + if (!platform::pico::joinDue(millis(), lastJoinMs, joinedBefore, joinTimeoutMs(cfg))) return; + joinStation(cfg, false); +#else + WiFi.reconnect(); +#endif +} + +net::WifiAssoc assocNow(bool apMode) { + // In provisioning mode the station side is only ever mid-retry: a successful join restarts the + // device, so "connected" is not a state the AP branch ever has to report. + if (apMode) return net::WifiAssoc::Disconnected; +#if defined(AWTRIX_PLATFORM_RP2040) + return authGate.filter(radioAssoc()); +#else + return radioAssoc(); +#endif +} } void NetworkService::publishStatus() { @@ -52,6 +176,7 @@ void NetworkService::begin(const DeviceConfig& cfg, bool forceAp, WiFi.persistent(true); WiFi.setHostname(hostname_.c_str()); WiFi.mode(WIFI_STA); +#if !defined(AWTRIX_PLATFORM_RP2040) // Widest legal channel set (1-13) so an AP on 12 or 13 is visible; the regulatory domain is // corrected from the AP's country IE once we associate. wifi_country_t country = {}; @@ -65,43 +190,65 @@ void NetworkService::begin(const DeviceConfig& cfg, bool forceAp, esp_wifi_set_ps(WIFI_PS_NONE); WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); +#endif if (cfg.netStatic && !cfg.ip.empty()) { +#if defined(AWTRIX_PLATFORM_RP2040) + platform::pico::configureStatic(WiFi, parseIp(cfg.ip), parseIp(cfg.gateway), + parseIp(cfg.subnet), cfg.dns1.empty() ? parseIp(cfg.gateway) : parseIp(cfg.dns1), + cfg.dns2.empty() ? IPAddress(0, 0, 0, 0) : parseIp(cfg.dns2)); +#else WiFi.config(parseIp(cfg.ip), parseIp(cfg.gateway), parseIp(cfg.subnet), cfg.dns1.empty() ? parseIp(cfg.gateway) : parseIp(cfg.dns1), cfg.dns2.empty() ? IPAddress(0, 0, 0, 0) : parseIp(cfg.dns2)); +#endif } cfg_ = &cfg; - const unsigned long timeoutMs = - cfg.wifiConnectTimeout > 0 ? static_cast(cfg.wifiConnectTimeout) : 15000UL; + const unsigned long timeoutMs = joinTimeoutMs(cfg); if (!forceAp && !cfg.wifiSsid.empty()) { - WiFi.begin(cfg.wifiSsid.c_str(), cfg.wifiPass.c_str()); - if (status_) net::applyWifiAssoc(*status_, net::WifiAssoc::Joining, true, cfg.wifiSsid, ""); - const unsigned long start = millis(); - // Blocks boot until the join succeeds or times out; onWait keeps the boot animation moving so - // the matrix does not look frozen. - while (WiFi.status() != WL_CONNECTED && (millis() - start) < timeoutMs) { - if (onWait) onWait(); - delay(10); + for (int attempt = 1; attempt <= kBootJoinAttempts; ++attempt) { +#if defined(AWTRIX_PLATFORM_RP2040) + if (attempt > 1) { + const int link = cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA); + logf("wifi: join %d of %d did not finish in %lu ms (cyw43 link %d, %s), joining again", + attempt - 1, kBootJoinAttempts, timeoutMs, link, cyw43LinkName(link)); + } +#endif + joinStation(cfg, false); + if (status_) net::applyWifiAssoc(*status_, net::WifiAssoc::Joining, true, cfg.wifiSsid, ""); + const unsigned long start = millis(); + // Blocks boot until the join succeeds or times out; onWait keeps the boot animation moving so + // the matrix does not look frozen. + while (WiFi.status() != WL_CONNECTED && (millis() - start) < timeoutMs) { +#if defined(AWTRIX_PLATFORM_RP2040) + logRadioEvents(); +#endif + if (onWait) onWait(); + delay(10); + } + if (WiFi.status() == WL_CONNECTED) break; } } if (forceAp || WiFi.status() != WL_CONNECTED) { apMode_ = true; - WiFi.mode(WIFI_AP_STA); - WiFi.softAP(hostname_.c_str()); - dns_.setErrorReplyCode(DNSReplyCode::NoError); - dns_.start(53, "*", WiFi.softAPIP()); - logf("wifi: %s, provisioning AP \"%s\" at %s (captive portal)", - forceAp ? "forced by button" : "no connection", hostname_.c_str(), - WiFi.softAPIP().toString().c_str()); + startAp(forceAp ? "forced by button" : "no connection"); } else { apMode_ = false; logf("wifi: connected to \"%s\" (%d dBm) as %s", WiFi.SSID().c_str(), WiFi.RSSI(), WiFi.localIP().toString().c_str()); +#if defined(AWTRIX_PLATFORM_RP2040) + uint8_t b[6] = {}; + WiFi.BSSID(b); + logf("wifi: associated with %02x:%02x:%02x:%02x:%02x:%02x", b[0], b[1], b[2], b[3], b[4], b[5]); +#endif logf("heap: %u KB free with radio up", +#if defined(AWTRIX_PLATFORM_RP2040) + (unsigned)(rp2040.getFreeHeap() / 1024)); +#else (unsigned)(heap_caps_get_free_size(MALLOC_CAP_DEFAULT) / 1024)); +#endif if (MDNS.begin(hostname_.c_str())) { String mac = WiFi.macAddress(); mac.replace(":", ""); @@ -122,9 +269,31 @@ void NetworkService::begin(const DeviceConfig& cfg, bool forceAp, status_->setError(net::LinkError::Timeout); } +void NetworkService::startAp(const char* why) { +#if defined(AWTRIX_PLATFORM_RP2040) + if (!platform::pico::startAp(WiFi, WIFI_AP_STA, hostname_.c_str())) + logf("wifi: provisioning AP \"%s\" did not start", hostname_.c_str()); +#else + WiFi.mode(WIFI_AP_STA); + WiFi.softAP(hostname_.c_str()); +#endif + dns_.setErrorReplyCode(DNSReplyCode::NoError); + dns_.start(53, "*", WiFi.softAPIP()); + logf("wifi: %s, provisioning AP \"%s\" at %s (captive portal)", why, hostname_.c_str(), + ip().c_str()); +#if defined(AWTRIX_PLATFORM_RP2040) + // The first station-only retry is a full interval after the AP comes up, not after boot. + lastApRetryMs_ = millis(); +#endif +} + void NetworkService::tick() { +#if defined(AWTRIX_PLATFORM_RP2040) + logRadioEvents(); + if (!apMode_) MDNS.update(); +#endif if (apMode_) { - dns_.processNextRequest(); + if (!apPaused_) dns_.processNextRequest(); retryJoinFromAp(); return; } @@ -133,9 +302,18 @@ void NetworkService::tick() { lastCheckMs_ = nowMs; publishStatus(); if (WiFi.status() != WL_CONNECTED) { - logf("wifi: connection lost, reconnecting"); weakChecks_ = 0; - WiFi.reconnect(); +#if defined(AWTRIX_PLATFORM_RP2040) + // Only log when a new attempt starts; the raw CYW43 link state says why the link is down. + if (cfg_ && platform::pico::joinDue(nowMs, lastJoinMs, joinedBefore, joinTimeoutMs(*cfg_))) { + logf("wifi: connection lost (status %d, cyw43 link %d), rejoining", + static_cast(WiFi.status()), cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA)); + reconnectStation(*cfg_); + } +#else + logf("wifi: connection lost, reconnecting"); + if (cfg_) reconnectStation(*cfg_); +#endif if (status_) net::noteWifiRetry(*status_, kCheckMs); return; } @@ -157,7 +335,7 @@ void NetworkService::roamIfWeak(unsigned long nowMs) { lastRoamMs_ = nowMs; logf("wifi: %d dBm below the %d dBm roam threshold, looking for a stronger AP", static_cast(WiFi.RSSI()), cfg_->wifiRoamRssi); - WiFi.reconnect(); + reconnectStation(*cfg_); } // In provisioning mode, keep trying the stored credentials so the device recovers on its own once @@ -165,6 +343,37 @@ void NetworkService::roamIfWeak(unsigned long nowMs) { // disrupts the portal they are using. void NetworkService::retryJoinFromAp() { if (!cfg_ || cfg_->wifiSsid.empty()) return; +#if defined(AWTRIX_PLATFORM_RP2040) + const unsigned long nowMs = millis(); + if (restartPending_) return; + if (apPaused_) { + if (WiFi.status() == WL_CONNECTED) { + logf("wifi: joined \"%s\" from provisioning mode, restarting to leave the AP", + WiFi.SSID().c_str()); + // The reboot is scheduled, not immediate; ask once. + restartPending_ = true; + if (onJoinedFromAp_) onJoinedFromAp_(); + return; + } + if (nowMs - lastJoinMs < joinTimeoutMs(*cfg_)) return; + apPaused_ = false; + lastApRetryMs_ = nowMs; + const int link = cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA); + logf("wifi: rejoin failed (cyw43 link %d, %s)", link, cyw43LinkName(link)); + startAp("still no connection"); + return; + } + if (WiFi.softAPgetStationNum() > 0) return; + if (nowMs - lastApRetryMs_ < kPicoApRetryMs) return; + publishStatus(); + if (status_) net::noteWifiRetry(*status_, kPicoApRetryMs); + logf("wifi: pausing the provisioning AP for a station-only join"); + dns_.stop(); + apPaused_ = true; + // The core's station-only begin() leaves the AP up; stop it, so startAp() restarts it cleanly. + WiFi.disconnectAP(); + joinStation(*cfg_, false); +#else if (WiFi.softAPgetStationNum() > 0) return; const unsigned long now = millis(); if (now - lastApRetryMs_ < kApRetryMs) return; @@ -172,18 +381,23 @@ void NetworkService::retryJoinFromAp() { if (WiFi.status() != WL_CONNECTED) { publishStatus(); if (status_) net::noteWifiRetry(*status_, kApRetryMs); - WiFi.begin(cfg_->wifiSsid.c_str(), cfg_->wifiPass.c_str()); + joinStation(*cfg_, true); return; } logf("wifi: joined \"%s\" from provisioning mode, restarting to leave the AP", WiFi.SSID().c_str()); if (onJoinedFromAp_) onJoinedFromAp_(); +#endif } bool NetworkService::isConnected() const { return !apMode_ && WiFi.status() == WL_CONNECTED; } std::string NetworkService::ip() const { +#if defined(AWTRIX_PLATFORM_RP2040) + return platform::pico::addressText(apMode_ ? WiFi.softAPIP() : WiFi.localIP()); +#else return std::string((apMode_ ? WiFi.softAPIP() : WiFi.localIP()).toString().c_str()); +#endif } } diff --git a/src/transport/net/NetworkService.h b/src/transport/net/NetworkService.h index bb0fd246..f2a3150f 100644 --- a/src/transport/net/NetworkService.h +++ b/src/transport/net/NetworkService.h @@ -28,6 +28,7 @@ class NetworkService { private: void retryJoinFromAp(); + void startAp(const char* why); void roamIfWeak(unsigned long nowMs); void publishStatus(); @@ -38,6 +39,8 @@ class NetworkService { unsigned long lastApRetryMs_ = 0; unsigned long lastRoamMs_ = 0; int weakChecks_ = 0; + bool apPaused_ = false; // RP2040: provisioning AP down for a station-only join window + bool restartPending_ = false; // RP2040: the reboot after a join from the AP is deferred const DeviceConfig* cfg_ = nullptr; std::function onJoinedFromAp_; DNSServer dns_; diff --git a/src/transport/net/UdpSocket.cpp b/src/transport/net/UdpSocket.cpp index d49c21ae..8d6dc328 100644 --- a/src/transport/net/UdpSocket.cpp +++ b/src/transport/net/UdpSocket.cpp @@ -1,11 +1,40 @@ #include "transport/net/UdpSocket.h" +#if !defined(AWTRIX_PLATFORM_RP2040) #include +#endif #include namespace awtrix { +#if defined(AWTRIX_PLATFORM_RP2040) +bool UdpSocket::open(uint16_t port) { + close(); + fd_ = udp_.begin(port) ? 0 : -1; + return isOpen(); +} +void UdpSocket::close() { + udp_.stop(); + fd_ = -1; + havePeer_ = false; +} +int UdpSocket::receive(void* buf, std::size_t cap) { + if (!isOpen() || !cap) return -1; + if (udp_.parsePacket() <= 0) return 0; + peerAddr_ = static_cast(udp_.remoteIP()); + havePeer_ = true; + const int n = udp_.read(static_cast(buf), cap); + while (udp_.available()) udp_.read(); + return n; +} +bool UdpSocket::replyTo(uint16_t port, const void* data, std::size_t len) { + if (!isOpen() || !havePeer_ || !udp_.beginPacket(IPAddress(peerAddr_), port)) return false; + const auto n = udp_.write(static_cast(data), len); + return udp_.endPacket() && n == len; +} +#else + bool UdpSocket::open(uint16_t port) { close(); fd_ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -59,5 +88,6 @@ bool UdpSocket::replyTo(uint16_t port, const void* data, std::size_t len) { return ::sendto(fd_, data, len, 0, reinterpret_cast(&to), sizeof(to)) == static_cast(len); } +#endif } diff --git a/src/transport/net/UdpSocket.h b/src/transport/net/UdpSocket.h index 9791a721..0c6fa2e8 100644 --- a/src/transport/net/UdpSocket.h +++ b/src/transport/net/UdpSocket.h @@ -2,6 +2,9 @@ #include #include +#if defined(AWTRIX_PLATFORM_RP2040) +#include +#endif namespace awtrix { @@ -18,6 +21,9 @@ class UdpSocket { bool replyTo(uint16_t port, const void* data, std::size_t len); private: +#if defined(AWTRIX_PLATFORM_RP2040) + WiFiUDP udp_; +#endif int fd_ = -1; uint32_t peerAddr_ = 0; bool havePeer_ = false; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fa045912..1c1048a6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -41,6 +41,7 @@ file(GLOB_RECURSE CORE_SOURCES CONFIGURE_DEPENDS ) add_library(awtrix_core STATIC ${CORE_SOURCES} + "${AWTRIX_ROOT}/src/platform/SocProfile.cpp" "${AWTRIX_ROOT}/src/transport/ScriptMqttBridge.cpp" ) target_compile_options(awtrix_core PRIVATE -O2) @@ -77,6 +78,9 @@ foreach(TEST_DIR IN LISTS TEST_DIRS) target_compile_options("${TEST_NAME}" PRIVATE -O2) target_compile_definitions("${TEST_NAME}" PRIVATE PIO_UNIT_TESTING UNIT_TEST) target_link_libraries("${TEST_NAME}" PRIVATE awtrix_core unity) + if(EXISTS "${TEST_DIR}/compat") + target_include_directories("${TEST_NAME}" PRIVATE "${TEST_DIR}/compat") + endif() if(WIN32) target_link_libraries("${TEST_NAME}" PRIVATE ws2_32) diff --git a/test/integration/mosquitto.conf b/test/integration/mosquitto.conf new file mode 100644 index 00000000..194f4f0d --- /dev/null +++ b/test/integration/mosquitto.conf @@ -0,0 +1,4 @@ +# Disposable integration network only; do not expose this listener to the host/LAN. +listener 1883 +allow_anonymous true +persistence false diff --git a/test/integration/mqtt_smoke.py b/test/integration/mqtt_smoke.py new file mode 100644 index 00000000..978fa716 --- /dev/null +++ b/test/integration/mqtt_smoke.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 +"""Real-broker MQTT contract check; run only against a disposable broker and simulator. + +Requires paho-mqtt==2.1.0. Example inside the build container on a Podman network: + python test/integration/mqtt_smoke.py --broker mqtt-smoke-broker +The simulator uses a temporary data directory; all command writes are undone. +""" +import argparse +import json +from pathlib import Path +import subprocess +import tempfile +import threading +import time +import urllib.error +import urllib.request + +import paho.mqtt.client as mqtt + + +class Observer: + def __init__(self, broker): + self.messages = [] + self.condition = threading.Condition() + self.ready = threading.Event() + self.client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) + self.client.on_connect = self.on_connect + self.client.on_subscribe = lambda *args: self.ready.set() + self.client.on_message = self.on_message + self.client.connect(broker, 1883, 10) + self.client.loop_start() + assert self.ready.wait(10), "broker subscription timed out" + + def on_connect(self, client, userdata, flags, reason, properties): + assert reason == 0, reason + client.subscribe([("homeassistant/#", 0), ("mqttsmoke/#", 0)]) + + def on_message(self, client, userdata, message): + with self.condition: + self.messages.append({"topic": message.topic, + "payload": message.payload.decode(), + "retain": message.retain}) + self.condition.notify_all() + + def wait(self, topic, payload=None, start=0, timeout=15): + deadline = time.monotonic() + timeout + with self.condition: + while True: + for message in self.messages[start:]: + if message["topic"] == topic and (payload is None or message["payload"] == payload): + return message + remaining = deadline - time.monotonic() + assert remaining > 0, f"missing {topic}: {payload}" + self.condition.wait(remaining) + + def wait_retained(self, topic, timeout=15): + deadline = time.monotonic() + timeout + with self.condition: + while True: + for message in self.messages: + if message["topic"] == topic and message["retain"]: + return message + remaining = deadline - time.monotonic() + assert remaining > 0, f"no retained copy of {topic}" + self.condition.wait(remaining) + + def command(self, suffix, payload): + start = len(self.messages) + topic = "mqttsmoke/cmd/" + suffix + self.client.publish(topic, payload).wait_for_publish(5) + reply = self.wait(topic + "/result", start=start) + assert json.loads(reply["payload"]) == {"ok": True}, reply + assert not reply["retain"], reply + return reply + + def close(self): + self.client.disconnect() + self.client.loop_stop() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--broker", required=True) + parser.add_argument("--program", default=".pio/build/native_sim/program") + parser.add_argument("--report", default=".pio/mqtt-smoke-report.json") + args = parser.parse_args() + program = str(Path(args.program).resolve()) + port = 18087 + base = f"http://127.0.0.1:{port}" + report = {"commands": [], "checks": []} + observer = Observer(args.broker) + sim = None + + def http(path, body=None): + request = urllib.request.Request(base + path, + data=None if body is None else json.dumps(body).encode(), + headers={"Content-Type": "application/json"}) + with urllib.request.urlopen(request, timeout=2) as response: + return json.load(response) + + try: + with tempfile.TemporaryDirectory(prefix="awtrix-mqtt-") as data: + Path(data, "device.json").write_text(json.dumps({ + "mqttEnabled": True, "mqttHost": args.broker, "mqttPort": 1883, + "mqttPrefix": "mqttsmoke", "haDiscovery": True, "hostname": "mqtt-smoke-sim", + "statsInterval": 1, "panelWidth": 53, "panelHeight": 11, "panels": 1, + "scriptingEnabled": False})) + with tempfile.TemporaryFile(mode="w+") as log: + def start_sim(): + return subprocess.Popen([program, "--no-matrix", "--port", str(port), + "--data", data], stdout=log, stderr=subprocess.STDOUT) + sim = start_sim() + observer.wait("mqttsmoke/availability", "online", timeout=30) + deadline = time.monotonic() + 15 + while True: + try: + http("/api/v1/device") + break + except (urllib.error.URLError, TimeoutError): + assert time.monotonic() < deadline, "simulator HTTP not ready" + time.sleep(0.1) + + discovery = observer.wait("homeassistant/device/simulator/config") + report["discovery"] = json.loads(discovery["payload"]) + doc = report["discovery"] + assert doc["dev"]["mf"] == "Blueforcer" + assert doc["dev"]["mdl"] == "AWTRIX NG" + assert doc["cmps"]["prefix"]["name"] == "MQTT prefix" + assert doc["cmps"]["prefix"]["stat_t"] == "~/state/prefix" + for key, name in zip(("btnl", "btnm", "btnr"), ("left", "select", "right")): + comp = doc["cmps"][key] + assert comp["name"] == "Button " + name and comp["p"] == "binary_sensor" + assert comp["stat_t"] == "~/state/buttons/" + name + assert comp["pl_on"] == "1" and comp["pl_off"] == "0" + report["checks"].append("Blueforcer, MQTT prefix and stock button discovery") + + before = http("/api/v1/device")["messageCount"] + report["commands"].append(observer.command("notify", '{"name":"smoke-note","text":"MQTT smoke","hold":true}')) + report["commands"].append(observer.command("apps/pushed/test", '{"text":"Pico MQTT"}')) + assert http("/api/v1/device")["messageCount"] == before + 2 + screen_start = len(observer.messages) + observer.command("screen/get", "") + screen = observer.wait("mqttsmoke/state/screen", start=screen_start) + assert not screen["retain"] + report["checks"].append("notify/app results, inbound-only count and non-retained screen") + + report["button_edges"] = [] + for name in ("left", "select", "right"): + start = len(observer.messages) + http("/sim/button/" + name, {"durationMs": 200}) + topic = "mqttsmoke/state/buttons/" + name + press = observer.wait(topic, "1", start=start) + after = next(i for i, m in enumerate(observer.messages) if m is press) + 1 + report["button_edges"].append(press) + report["button_edges"].append(observer.wait(topic, "0", start=after)) + report["checks"].append("left/select/right press and release edges") + + # Retain is observed on a NEW subscription, not the live delivery. + fresh = Observer(args.broker) + try: + topics = ["availability", "state/capabilities", "state/prefix", "state/device", + "state/settings", "state/audio", "state/apps/active"] + topics += ["state/buttons/" + name for name in ("left", "select", "right")] + retained = [fresh.wait_retained("mqttsmoke/" + topic) for topic in topics] + retained.append(fresh.wait_retained("homeassistant/device/simulator/config")) + assert all(message["retain"] for message in retained), retained + time.sleep(0.3) + assert not any(m["topic"].endswith("/result") or m["topic"] == "mqttsmoke/state/screen" + for m in fresh.messages) + report["retained_topics"] = [m["topic"] for m in retained] + finally: + fresh.close() + report["checks"].append("state/discovery retained; replies and screen not retained") + + # Undo command writes even though the whole simulator store is disposable. + observer.command("apps/pushed/test", "") + observer.command("notify/dismiss", "") + report["checks"].append("test app and notification removed") + start = len(observer.messages) + sim.kill() # no MQTT DISCONNECT: the broker must deliver the will + sim.wait(timeout=5) + report["will"] = observer.wait("mqttsmoke/availability", "offline", start=start) + fresh = Observer(args.broker) + try: + assert fresh.wait("mqttsmoke/availability", "offline")["retain"] + finally: + fresh.close() + report["checks"].append("abrupt exit publishes retained offline LWT") + + start = len(observer.messages) + sim = start_sim() + observer.wait("mqttsmoke/availability", "online", start=start, timeout=30) + observer.wait("homeassistant/device/simulator/config", start=start) + observer.wait("mqttsmoke/state/prefix", "mqttsmoke", start=start) + report["checks"].append("restart reannounces online, discovery and prefix") + sim.terminate() + sim.wait(timeout=5) + sim = None + log.seek(0) + report["simulator_log"] = log.read() + Path(args.report).write_text(json.dumps(report, indent=2) + "\n") + print(json.dumps(report, indent=2)) + print(f"PASS MQTT integration: {len(report['checks'])} contract checks") + finally: + if sim is not None and sim.poll() is None: + sim.kill() + sim.wait(timeout=5) + observer.close() + + +if __name__ == "__main__": + main() diff --git a/test/integration/run_mqtt_smoke.sh b/test/integration/run_mqtt_smoke.sh new file mode 100755 index 00000000..15fb1215 --- /dev/null +++ b/test/integration/run_mqtt_smoke.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# Run from the playground checkout after building native_sim. No host ports exposed. +set -eu + +# Reuse this entry point inside the ephemeral build container, without inline shell code. +if [ "${1:-}" = "--inside-container" ]; then + python -m pip install --disable-pip-version-check paho-mqtt==2.1.0 + exec python test/integration/mqtt_smoke.py --broker mqtt-smoke-broker +fi + +cd "$(dirname "$0")/../.." +test -x .pio/build/native_sim/program +network_created=false +broker_started=false +cleanup() { + status=$? + trap - EXIT + if [ "$broker_started" = true ]; then + podman stop mqtt-smoke-broker || : + fi + if [ "$network_created" = true ]; then + podman network rm mqtt-smoke || : + fi + exit "$status" +} +trap cleanup EXIT +trap 'exit 130' INT +trap 'exit 143' TERM + +podman network create mqtt-smoke +network_created=true +podman run --detach --rm --name mqtt-smoke-broker --network mqtt-smoke \ + -v "$PWD/test/integration/mosquitto.conf:/mosquitto/config/mosquitto.conf:ro,Z" \ + docker.io/library/eclipse-mosquitto:2 +broker_started=true + +# Probe readiness instead of racing the listener startup. +attempt=0 +until podman exec mqtt-smoke-broker mosquitto_pub -h 127.0.0.1 -t smoke/ready -m ready; do + attempt=$((attempt + 1)) + if [ "$attempt" -ge 30 ]; then + podman logs mqtt-smoke-broker + exit 1 + fi + sleep 1 +done + +podman run --rm --network mqtt-smoke \ + -v pio-home:/root/.platformio -v "$PWD:/w:Z" -w /w \ + localhost/awtrix-build sh test/integration/run_mqtt_smoke.sh --inside-container diff --git a/test/test_builtin_catalog/test_main.cpp b/test/test_builtin_catalog/test_main.cpp new file mode 100644 index 00000000..486fb69b --- /dev/null +++ b/test/test_builtin_catalog/test_main.cpp @@ -0,0 +1,21 @@ +#include +#include +#include "core/BuiltinCatalog.h" +#include "core/api/CapabilitiesJson.h" +using namespace awtrix; +void setUp() {} void tearDown() {} +void builtin_catalog_parity() { + BuiltinCatalog esp, pico; AppRegistry ea, pa; EffectRegistry ef, pf, eo, po; + esp.addTo(ea,ef,eo); pico.addTo(pa,pf,po); + TEST_ASSERT_EQUAL(5,pa.size()); TEST_ASSERT_EQUAL(19,pf.size()); TEST_ASSERT_EQUAL(6,po.size()); + TEST_ASSERT_TRUE(ef.names() == pf.names()); TEST_ASSERT_TRUE(ef.paletteNames() == pf.paletteNames()); + TEST_ASSERT_TRUE(eo.names() == po.names()); + const std::vector expected = {"BrickBreaker","Checkerboard","ColorWaves","Fade", + "Fireworks","LookingEyes","Matrix","MovingLine","Pacifica","PingPong","Plasma","PlasmaCloud", + "Radar","Ripple","Snake","SwirlIn","SwirlOut","TheaterChase","TwinklingStars"}; + TEST_ASSERT_TRUE(expected == pf.names()); TEST_ASSERT_EQUAL(15,pf.paletteNames().size()); + const std::vector overlays = {"drizzle","frost","rain","snow","storm","thunder"}; + TEST_ASSERT_TRUE(overlays == po.names()); + std::cout << "ESP32/Pico built-ins equal: " << api::capabilitiesJson(pf.names(),pf.paletteNames(),po.names(), {}) << '\n'; +} +int main() { UNITY_BEGIN(); RUN_TEST(builtin_catalog_parity); return UNITY_END(); } diff --git a/test/test_buttonevent/test_buttonevent.cpp b/test/test_buttonevent/test_buttonevent.cpp new file mode 100644 index 00000000..a68996ae --- /dev/null +++ b/test/test_buttonevent/test_buttonevent.cpp @@ -0,0 +1,27 @@ +#include + +#include "core/api/ButtonEventJson.h" + +using awtrix::api::buttonEventJson; + +void setUp() {} +void tearDown() {} + +static void test_body_matches_the_documented_shape() { + TEST_ASSERT_EQUAL_STRING("{\"button\":\"left\",\"state\":true,\"uid\":\"dcda0c29dcb8\"}", + buttonEventJson("left", true, "dcda0c29dcb8").c_str()); + TEST_ASSERT_EQUAL_STRING("{\"button\":\"middle\",\"state\":false,\"uid\":\"\"}", + buttonEventJson("middle", false, "").c_str()); +} + +static void test_uid_is_escaped() { + TEST_ASSERT_EQUAL_STRING("{\"button\":\"right\",\"state\":true,\"uid\":\"a\\\"b\"}", + buttonEventJson("right", true, "a\"b").c_str()); +} + +int main() { + UNITY_BEGIN(); + RUN_TEST(test_body_matches_the_documented_shape); + RUN_TEST(test_uid_is_escaped); + return UNITY_END(); +} diff --git a/test/test_configrules/test_configrules.cpp b/test/test_configrules/test_configrules.cpp index 311341d7..12baef7b 100644 --- a/test/test_configrules/test_configrules.cpp +++ b/test/test_configrules/test_configrules.cpp @@ -355,6 +355,21 @@ void test_panel_width_product_must_fit_the_envelope() { void test_panel_fields_are_range_checked() { cfgrules::ConfigError e; + for (int height : {7, 17}) { + Body bad; + bad.set("panelHeight", height); + TEST_ASSERT_FALSE(ok(bad, e)); + TEST_ASSERT_EQUAL_STRING("panelHeight", e.field.c_str()); + } + for (int height : {8, 11, 16}) { + Body good; + good.set("panelHeight", height); + TEST_ASSERT_TRUE(ok(good, e)); + } + Body fractional; + fractional.set("panelHeight", 11.5); + TEST_ASSERT_FALSE(ok(fractional, e)); + TEST_ASSERT_EQUAL_STRING("panelHeight", e.field.c_str()); Body a; a.set("panelWidth", 129); TEST_ASSERT_FALSE(ok(a, e)); diff --git a/test/test_contentband/test_contentband.cpp b/test/test_contentband/test_contentband.cpp new file mode 100644 index 00000000..52c9f70f --- /dev/null +++ b/test/test_contentband/test_contentband.cpp @@ -0,0 +1,94 @@ +#include + +#include "core/apps/builtin/BatteryApp.h" +#include "core/apps/builtin/DateApp.h" +#include "core/apps/builtin/HumidityApp.h" +#include "core/apps/builtin/TempApp.h" +#include "core/apps/builtin/TimeApp.h" +#include "core/render/ContentBand.h" +#include "core/render/ProvisioningScreen.h" + +using namespace awtrix; + +void setUp() {} +void tearDown() {} + +static void test_band_view_bounds_and_placement() { + for (int h : {8, 9, 10, 11, 16}) { + const int top = (h - 8) / 2; + TEST_ASSERT_EQUAL_INT(top, render::contentBandTop(h)); + std::vector storage(53 * h + 2, 0xDEADBEEFu); + Canvas panel(53, h, storage.data() + 1); + panel.clear(); + Canvas band = render::contentBand(panel); + TEST_ASSERT_EQUAL_INT(53, band.width()); + TEST_ASSERT_EQUAL_INT(8, band.height()); + band.clear(0x123456u); + band.setPixel(-1, 0, 1); + band.setPixel(53, 7, 1); + band.setPixel(0, -1, 1); + band.setPixel(0, 8, 1); + for (int y = 0; y < h; ++y) + for (int x = 0; x < 53; ++x) + TEST_ASSERT_EQUAL_HEX32(y >= top && y < top + 8 ? 0x123456u : 0, panel.getPixel(x, y)); + TEST_ASSERT_EQUAL_HEX32(0xDEADBEEFu, storage.front()); + TEST_ASSERT_EQUAL_HEX32(0xDEADBEEFu, storage.back()); + } + Canvas empty(0, 0); + Canvas view = render::contentBand(empty); + TEST_ASSERT_EQUAL_INT(0, view.size()); +} + +static void assertShifted(const Canvas& shortPanel, const Canvas& tallPanel) { + const int top = render::contentBandTop(tallPanel.height()); + for (int y = 0; y < tallPanel.height(); ++y) + for (int x = 0; x < tallPanel.width(); ++x) + TEST_ASSERT_EQUAL_HEX32(shortPanel.getPixel(x, y - top), tallPanel.getPixel(x, y)); +} + +// Exercise actual bundled fonts, including descenders and their original clipping. +#include "media/AwtrixFontAdapter.h" + +static void test_builtin_modes_and_provisioning_use_band() { + Settings settings; + RuntimeState runtime; + RenderCtx ctx; + ctx.settings = &settings; + ctx.runtime = &runtime; + ctx.hour = 12; ctx.minute = 34; ctx.second = 56; + ctx.mday = 23; ctx.month = 9; ctx.year = 2026; ctx.weekday = 3; + TimeApp time; + DateApp date; + TempApp temp; + HumidityApp humidity; + BatteryApp battery; + for (int height : {11, 16}) { + for (int mode = 0; mode <= 6; ++mode) { + settings.timeMode = mode; + settings.weekdayBar.show = true; + for (IApp* app : {static_cast(&time), static_cast(&date), + static_cast(&temp), static_cast(&humidity), + static_cast(&battery)}) { + Canvas small(53, 8), tall(53, height); + for (FontId id : {FontId::Small, FontId::Large}) { + small.clear(); + tall.clear(); + ctx.font = &awtrixFont(id); + app->render(small, ctx); + app->render(tall, ctx); + assertShifted(small, tall); + render::drawProvisioningScreen(small, *ctx.font, 1000); + render::drawProvisioningScreen(tall, *ctx.font, 1000); + assertShifted(small, tall); + } + } + } + } +} + +int main(int, char**) { + UNITY_BEGIN(); + RUN_TEST(test_band_view_bounds_and_placement); + RUN_TEST(test_builtin_modes_and_provisioning_use_band); + return UNITY_END(); +} diff --git a/test/test_deviceconfigjson/test_deviceconfigjson.cpp b/test/test_deviceconfigjson/test_deviceconfigjson.cpp index 6838a5a1..f2322b0f 100644 --- a/test/test_deviceconfigjson/test_deviceconfigjson.cpp +++ b/test/test_deviceconfigjson/test_deviceconfigjson.cpp @@ -40,6 +40,7 @@ DeviceConfig seeded() { c.hostname = "awtrix"; c.pinMatrix = 21; c.panelWidth = 8; + c.panelHeight = 11; c.panels = 4; c.panelStart = PanelStart::BottomRight; c.panelWiring = Wiring::Columns; @@ -73,8 +74,8 @@ static int members(const std::string& json) { } static void test_the_reply_carries_every_field() { - TEST_ASSERT_EQUAL_INT(67, members(written(seeded(), false))); - TEST_ASSERT_EQUAL_INT(70, members(written(seeded(), true))); + TEST_ASSERT_EQUAL_INT(68, members(written(seeded(), false))); + TEST_ASSERT_EQUAL_INT(71, members(written(seeded(), true))); } static void test_secrets_are_omitted_unless_asked_for() { @@ -169,6 +170,12 @@ static void test_the_whole_table_round_trips() { DeviceConfig back; back.applyRead(api::JsonReader(written(src, true))); TEST_ASSERT_EQUAL_STRING(dump(src).c_str(), dump(back).c_str()); + TEST_ASSERT_EQUAL_INT(11, back.panelHeight); + TEST_ASSERT_EQUAL_INT(11, back.matrixLayout().height()); + DeviceConfig legacy; + legacy.applyRead(api::JsonReader(R"({"panelWidth":53})")); + TEST_ASSERT_EQUAL_INT(8, legacy.panelHeight); + TEST_ASSERT_EQUAL_INT(16, after(R"({"panelHeight":16})").panelHeight); } int main(int, char**) { diff --git a/test/test_features/test_main.cpp b/test/test_features/test_main.cpp new file mode 100644 index 00000000..e603712a --- /dev/null +++ b/test/test_features/test_main.cpp @@ -0,0 +1,132 @@ +#include +#include +#include "core/PinRules.h" +#include "core/SocProfileJson.h" +#include "core/api/ApiRouter.h" +#include "core/api/CapabilitiesJson.h" +#include "platform/BuildFeatures.h" +using namespace awtrix; +void setUp() {} +void tearDown() {} +static constexpr FeatureSet pico{false, false, false, false, false}; + +static void http_profiles() { + struct Request { const char* method; const char* path; const char* body; }; + const Request requests[] = { + {"GET", "/api/v1/scripts/shared", ""}, + {"GET", "/api/v1/apps/script/demo", ""}, + {"PUT", "/api/v1/apps/script/demo", "print(1)"}, + {"PUT", "/api/v1/apps/script-update/demo", "{}"}, + {"GET", "/api/v1/apps/demo/config", ""}, + {"PATCH", "/api/v1/apps/demo/config", "{}"}, + {"GET", "/api/v1/audio/mp3", ""}, + {"POST", "/api/v1/audio/mp3", "binary"}, + {"DELETE", "/api/v1/audio/mp3/demo.mp3", ""}, + {"GET", "/api/v1/audio/stations", ""}, + {"PUT", "/api/v1/audio/stations", "{\"stations\":[]}"}, + {"POST", "/api/v1/audio/play", "{\"mp3\":\"demo\"}"}, + {"POST", "/api/v1/audio/play", "{\"station\":\"demo\"}"}, + {"POST", "/api/v1/audio/play", "{\"url\":\"https://example.com/live\"}"}, + {"POST", "/api/v1/audio/play", "{\"index\":0}"}, + {"GET", "/update", ""}, {"POST", "/update", "binary"}, + }; + for (const auto& req : requests) { + Command cmd; + api::HttpResult result; + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::Respond), + static_cast(api::routeHttp(req.method, req.path, req.body, cmd, result, pico))); + TEST_ASSERT_EQUAL_INT(503, result.status); + TEST_ASSERT_TRUE(result.body.find("\"code\":\"unavailable\"") != std::string::npos); + api::HttpResult baseline, explicitEsp; + Command original; + const auto before = api::routeHttp(req.method, req.path, req.body, original, baseline); + const auto after = api::routeHttp(req.method, req.path, req.body, cmd, explicitEsp, FeatureSet{}); + TEST_ASSERT_EQUAL_INT(static_cast(before), static_cast(after)); + TEST_ASSERT_EQUAL_INT(baseline.status, explicitEsp.status); + TEST_ASSERT_EQUAL_STRING(baseline.body.c_str(), explicitEsp.body.c_str()); + TEST_ASSERT_EQUAL_INT(static_cast(original.type), static_cast(cmd.type)); + TEST_ASSERT_NOT_EQUAL(503, explicitEsp.status); + } + Command cmd; + api::HttpResult result; + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::Routed), + static_cast(api::routeHttp("POST", "/api/v1/device/reboot", "", cmd, result, pico))); +} + +static void mqtt_profiles() { + const char* payloads[] = {"{\"mp3\":\"demo\"}", "{\"station\":\"demo\"}", + "{\"index\":0}", "{\"url\":\"https://example.com/live\"}"}; + for (const auto payload : payloads) { + Command cmd; + std::string result; + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::Respond), + static_cast(api::routeMqtt("cmd/audio/play", payload, cmd, result, pico))); + TEST_ASSERT_EQUAL_STRING(api::mqttResult(DispatchResult::Unavailable, {}).c_str(), result.c_str()); + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::Routed), + static_cast(api::routeMqtt("cmd/audio/play", payload, cmd, result, FeatureSet{}))); + } + Command cmd; + std::string result; + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::Respond), + static_cast(api::routeMqtt("cmd/audio/stations", "{}", cmd, result, pico))); + TEST_ASSERT_EQUAL_STRING(api::mqttResult(DispatchResult::Unavailable, {}).c_str(), result.c_str()); + TEST_ASSERT_TRUE(api::isResultEcho("cmd/audio/stations/result")); + // No MQTT script command exists in the API; do not invent one for Pico. + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::NoMatch), + static_cast(api::routeMqtt("cmd/apps/script/demo", "x", cmd, result, pico))); + FeatureSet noTls; + noTls.outboundTls = false; + api::HttpResult response; + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::Respond), + static_cast(api::routeHttp("POST", "/api/v1/audio/play", + "{\"url\":\"https://example.com/live\"}", cmd, response, noTls))); + TEST_ASSERT_EQUAL_INT(503, response.status); + TEST_ASSERT_EQUAL_INT(static_cast(api::RouteOutcome::Routed), + static_cast(api::routeHttp("POST", "/api/v1/audio/play", + "{\"url\":\"http://example.com/live\"}", cmd, response, noTls))); +} + +static void fixed_pins() { + const auto& profile = pins::rp2040Profile(); + std::string error; + TEST_ASSERT_TRUE(pins::validate(profile.defaults, profile, error)); + int pins::PinSet::* const fields[] = {&pins::PinSet::matrix, &pins::PinSet::btnLeft, + &pins::PinSet::btnSelect, &pins::PinSet::btnRight, &pins::PinSet::battery, + &pins::PinSet::ldr, &pins::PinSet::buzzer, &pins::PinSet::i2cSda, + &pins::PinSet::i2cScl, &pins::PinSet::dfRx, &pins::PinSet::dfTx, + &pins::PinSet::i2sBclk, &pins::PinSet::i2sLrclk, &pins::PinSet::i2sDout, + &pins::PinSet::i2sMclk, &pins::PinSet::ampEnable}; + for (auto field : fields) { + auto changed = profile.defaults; + ++(changed.*field); + TEST_ASSERT_FALSE(pins::validate(changed, profile, error)); + } + auto changed = profile.defaults; + changed.dfplayerEnabled = true; + TEST_ASSERT_FALSE(pins::validate(changed, profile, error)); + TEST_ASSERT_TRUE(pins::validate(pins::esp32Profile().defaults, pins::esp32Profile(), error)); + TEST_ASSERT_TRUE(pins::validate(pins::esp32s3Profile().defaults, pins::esp32s3Profile(), error)); +} + +static void capabilities() { + sound::AudioRouter audio; + const auto json = api::capabilitiesJson({}, {}, {}, audio.caps(), pico, pins::rp2040Profile()); + TEST_ASSERT_TRUE(json.find("\"scripting\":false") != std::string::npos); + TEST_ASSERT_TRUE(json.find("\"scriptUpdates\":false") != std::string::npos); + TEST_ASSERT_TRUE(json.find("\"buzzer\":false,\"track\":false,\"mp3\":false,\"radio\":false") != std::string::npos); + TEST_ASSERT_TRUE(api::capabilitiesJson({}, {}, {}, audio.caps()).find("\"scripting\":true") != std::string::npos); + // The pins are the board's, and the web UI shows them rather than offering them. + TEST_ASSERT_TRUE(json.find("\"label\":\"Galactic Unicorn (Pico W / Pico 2 W)\",\"fixed\":true,") != + std::string::npos); + TEST_ASSERT_TRUE(json.find("\"pinI2cSda\":-1,\"pinI2cScl\":-1,") != std::string::npos); + TEST_ASSERT_TRUE(pins::toJson(pins::esp32Profile()).find("\"fixed\":false,") != std::string::npos); + std::printf("PICO_CAPABILITIES=%s\n", json.c_str()); +} +int main() { + UNITY_BEGIN(); + RUN_TEST(http_profiles); + RUN_TEST(mqtt_profiles); + RUN_TEST(fixed_pins); + RUN_TEST(capabilities); + return UNITY_END(); +} diff --git a/test/test_fullcanvas/test_fullcanvas.cpp b/test/test_fullcanvas/test_fullcanvas.cpp new file mode 100644 index 00000000..92be0831 --- /dev/null +++ b/test/test_fullcanvas/test_fullcanvas.cpp @@ -0,0 +1,141 @@ +#include +#include +#include "core/apps/IApp.h" +#include "core/apps/SpecRenderer.h" +#include "core/effects/effects/FadeEffect.h" +#include "core/effects/effects/MoreEffects.h" +#include "core/effects/overlays/WeatherOverlays.h" +#include "core/render/Gfx2d.h" +#include "core/render/TransitionComposer.h" +#include "core/script/BerryVM.h" +#include "core/script/ScriptBindings.h" + +using namespace awtrix; +using namespace awtrix::render; +void setUp() {} +void tearDown() {} +namespace { +constexpr uint32_t guard = 0xDEADBEEF; +struct Panel { + std::vector pixels = std::vector(53 * 11 + 2, guard); + Canvas c{53, 11, pixels.data() + 1}; + Panel() { c.clear(); } + void check() { + TEST_ASSERT_EQUAL_HEX32(guard, pixels.front()); + TEST_ASSERT_EQUAL_HEX32(guard, pixels.back()); + } + void everyRow() { + for (int y = 0; y < c.height(); ++y) { + bool lit = false; + for (int x = 0; x < c.width(); ++x) lit |= c.getPixel(x, y) != 0; + TEST_ASSERT_TRUE_MESSAGE(lit, "full canvas must reach every row"); + } + check(); + } +}; +const FontGlyph glyph[] = {{0, 1, 1, 1, 0, 0}}; +const uint8_t bits[] = {0x80}; +const GfxFont font{bits, glyph, 'A', 'A', 8}; +} +static void test_charts_and_progress() { + Panel p; + for (bool autoscale : {false, true}) { + p.c.clear(); + drawBars(p.c, {8}, 0xFFFFFFu, autoscale, 0); + for (std::size_t i = 0; i < p.c.size(); ++i) + TEST_ASSERT_EQUAL_HEX32(0xFFFFFFu, p.c.data()[i]); + p.everyRow(); + p.c.clear(); + drawLineChart(p.c, {0, 8}, 0xFFFFFFu, autoscale, 0); + TEST_ASSERT_EQUAL_HEX32(0xFFFFFFu, p.c.getPixel(0, 10)); + TEST_ASSERT_EQUAL_HEX32(0xFFFFFFu, p.c.getPixel(52, 0)); + p.everyRow(); + } + p.c.clear(); + drawProgress(p.c, 50, 0x00FF00u, 0xFFFFFFu, 0); + for (int y = 0; y < 11; ++y) + for (int x = 0; x < 53; ++x) + TEST_ASSERT_EQUAL_HEX32(y != 10 ? 0u : x < 26 ? 0x00FF00u : 0xFFFFFFu, + p.c.getPixel(x, y)); + p.check(); +} +static void test_effect_overlay_and_eyes() { + Panel p; + FadeEffect effect; + FrostOverlay overlay; + effect.render(p.c, 0); + const uint32_t background = p.c.getPixel(0, 5); + overlay.render(p.c, 0); + p.everyRow(); + for (int y : {0, 10}) { + bool changed = false; + for (int x = 0; x < 53; ++x) changed |= p.c.getPixel(x, y) != background; + TEST_ASSERT_TRUE(changed); + } + LookingEyesEffect eyes; + eyes.render(p.c, 0); // before the first blink: eyeballs span the canvas + p.everyRow(); +} +static void test_transition_full_height() { + Panel p; + Canvas from(53, 11), to(53, 11); + from.clear(0xFF0000u); + to.clear(0x0000FFu); + for (int t = 1; t < static_cast(Transition::Count); ++t) { + for (float progress : {0.0f, 0.25f, 0.5f, 0.75f, 1.0f}) { + composeTransition(p.c, from, to, static_cast(t), progress, 1); + p.check(); + if (progress == 0.0f || progress == 1.0f) { + const uint32_t expected = progress == 0.0f ? 0xFF0000u : 0x0000FFu; + for (std::size_t i = 0; i < p.c.size(); ++i) + TEST_ASSERT_EQUAL_HEX32(expected, p.c.data()[i]); + p.everyRow(); + } + } + } +} +static void test_spec_background_and_absolute_draw() { + Panel p; + AppSpec s; + s.hasBackgroundColor = true; + s.backgroundColor = 0x123456u; + renderSpec(p.c, s, font, SpecRender{}); + for (std::size_t i = 0; i < p.c.size(); ++i) + TEST_ASSERT_EQUAL_HEX32(0x123456u, p.c.data()[i]); + p.everyRow(); + DrawOp op; + op.kind = DrawKind::Pixel; + op.color = 0xFF0000u; + for (int y : {0, 10}) { + op.y = y; + s.extrasMut().draw.push_back(op); + } + renderSpec(p.c, s, font, SpecRender{}); + TEST_ASSERT_EQUAL_HEX32(0xFF0000u, p.c.getPixel(0, 0)); + TEST_ASSERT_EQUAL_HEX32(0xFF0000u, p.c.getPixel(0, 10)); + TEST_ASSERT_EQUAL_HEX32(0x123456u, p.c.getPixel(0, 1)); + p.check(); +} +static void test_script_absolute_canvas() { + Panel p; + script::BerryVM vm; + std::string error; + TEST_ASSERT_TRUE(script::installBindings(vm, error)); + TEST_ASSERT_TRUE(vm.load("def draw() assert(height() == 11) assert(width() == 53) pixel(0, 0, 0xFF0000) pixel(width()-1, height()-1, 0x00FF00) end")); + RenderCtx ctx; + ctx.font = &font; + script::BindingScope scope(&p.c, &ctx, "tall"); + TEST_ASSERT_TRUE(vm.call("draw")); + TEST_ASSERT_EQUAL_HEX32(0xFF0000u, p.c.getPixel(0, 0)); + TEST_ASSERT_EQUAL_HEX32(0x00FF00u, p.c.getPixel(52, 10)); + p.check(); +} +int main(int, char**) { + UNITY_BEGIN(); + RUN_TEST(test_charts_and_progress); + RUN_TEST(test_effect_overlay_and_eyes); + RUN_TEST(test_transition_full_height); + RUN_TEST(test_spec_background_and_absolute_draw); + RUN_TEST(test_script_absolute_canvas); + return UNITY_END(); +} diff --git a/test/test_galactic_board/test_main.cpp b/test/test_galactic_board/test_main.cpp new file mode 100644 index 00000000..69a995af --- /dev/null +++ b/test/test_galactic_board/test_main.cpp @@ -0,0 +1,57 @@ +#include +#include "hal/GalacticUnicornDefaults.h" +#include "hal/GalacticUnicornDisplay.h" +#include "core/ConfigRules.h" +#include "core/SocProfileJson.h" +using namespace awtrix; +void setUp() {} +void tearDown() {} +void geometry_and_defaults() { + const auto cfg = galacticUnicornDefaults(); + TEST_ASSERT_EQUAL(53,cfg.panelWidth); + TEST_ASSERT_EQUAL(11,cfg.panelHeight); + TEST_ASSERT_EQUAL(1,cfg.panels); + TEST_ASSERT_TRUE(cfg.scriptingEnabled); // the shared default: scripts run unless switched off + TEST_ASSERT_EQUAL(53,galactic::Width); + TEST_ASSERT_EQUAL(8,galactic::sanitizeHeight(8)); + TEST_ASSERT_EQUAL(11,galactic::sanitizeHeight(16)); +} +void input_pin_contract() { + TEST_ASSERT_EQUAL(28,galactic::LightSensor); + TEST_ASSERT_EQUAL(2,galactic::LightAdc); + TEST_ASSERT_EQUAL(0,galactic::ButtonA); + TEST_ASSERT_EQUAL(1,galactic::ButtonB); + TEST_ASSERT_EQUAL(3,galactic::ButtonC); + TEST_ASSERT_EQUAL(6,galactic::ButtonD); + TEST_ASSERT_EQUAL(27,galactic::Sleep); + TEST_ASSERT_EQUAL(7,galactic::VolumeUp); + TEST_ASSERT_EQUAL(8,galactic::VolumeDown); + TEST_ASSERT_EQUAL(21,galactic::BrightnessUp); + TEST_ASSERT_EQUAL(26,galactic::BrightnessDown); +} +// The API takes only the geometry the board draws, which is the geometry the driver uses. +void fixed_panel_rules() { + const auto& soc = pins::rp2040Profile(); + TEST_ASSERT_EQUAL(galactic::Width, soc.fixedPanelWidth); + for (int h : soc.fixedPanelHeights) TEST_ASSERT_EQUAL(h, galactic::sanitizeHeight(h)); + cfgrules::ConfigError err; + TEST_ASSERT_TRUE(cfgrules::validateFixedPanel(soc, 53, 1, 11, err)); + TEST_ASSERT_TRUE(cfgrules::validateFixedPanel(soc, 53, 1, 8, err)); + TEST_ASSERT_FALSE(cfgrules::validateFixedPanel(soc, 64, 1, 11, err)); + TEST_ASSERT_EQUAL_STRING("panelWidth", err.field.c_str()); + TEST_ASSERT_FALSE(cfgrules::validateFixedPanel(soc, 53, 2, 11, err)); + TEST_ASSERT_EQUAL_STRING("panels", err.field.c_str()); + TEST_ASSERT_FALSE(cfgrules::validateFixedPanel(soc, 53, 1, 14, err)); + TEST_ASSERT_EQUAL_STRING("panelHeight", err.field.c_str()); + TEST_ASSERT_TRUE(cfgrules::validateFixedPanel(pins::esp32Profile(), 64, 1, 14, err)); + TEST_ASSERT_TRUE(pins::toJson(soc).find(",\"panel\":{\"width\":53,\"heights\":[8,11]}}") != + std::string::npos); + TEST_ASSERT_TRUE(pins::toJson(pins::esp32Profile()).find("\"panel\"") == std::string::npos); +} +int main() { + UNITY_BEGIN(); + RUN_TEST(geometry_and_defaults); + RUN_TEST(input_pin_contract); + RUN_TEST(fixed_panel_rules); + return UNITY_END(); +} diff --git a/test/test_galactic_display/test_main.cpp b/test/test_galactic_display/test_main.cpp new file mode 100644 index 00000000..1398cb07 --- /dev/null +++ b/test/test_galactic_display/test_main.cpp @@ -0,0 +1,115 @@ +#include +#include "hal/GalacticUnicornDisplay.h" +using namespace awtrix; +using namespace awtrix::galactic; +void setUp() {} +void tearDown() {} +static uint16_t decode(const Stream& s, int x, int y, int bit) { + uint16_t value = 0; + for (int p = 0; p < Planes; ++p) + value |= ((s.bytes[(10-y)*RowBytes + p*PlaneBytes + 2 + 52-x] >> bit) & 1u) << p; + return value; +} +static void stream_format() { + Stream s; + clearStream(s); + TEST_ASSERT_EQUAL(9240, sizeof(s)); + for (int row = 0; row < 11; ++row) for (int p = 0; p < 14; ++p) { + auto* b = s.bytes.data() + row*RowBytes + p*PlaneBytes; + TEST_ASSERT_EQUAL(52, b[0]); + TEST_ASSERT_EQUAL(row, b[1]); + for (int i = 2; i < 56; ++i) TEST_ASSERT_EQUAL(0, b[i]); + const uint32_t ticks = b[56] | (b[57]<<8) | (b[58]<<16) | (b[59]<<24); + TEST_ASSERT_EQUAL_UINT32(1u << p, ticks); + } +} +static void bits_and_orientation() { + Stream s; clearStream(s); + packPixel(s, 0, 0, 0x1234, 0x2345, 0x3456); + TEST_ASSERT_EQUAL_HEX16(0x1234, decode(s,0,0,2)); + TEST_ASSERT_EQUAL_HEX16(0x2345, decode(s,0,0,1)); + TEST_ASSERT_EQUAL_HEX16(0x3456, decode(s,0,0,0)); + for (int p = 0; p < 14; ++p) { + packPixel(s,52,10,1u<= 9); + TEST_ASSERT_EQUAL(dark ? 0 : 16383,decode(s,x,y,2)); + } + for (int y = 0; y < h; ++y) TEST_ASSERT_EQUAL(y+(h==8?1:0),physicalRow(y,h)); + } + Canvas small(1,1); small.setPixel(0,0,0xffffff); + packCanvas(s,small,8,grade); + TEST_ASSERT_EQUAL(16383,decode(s,0,1,2)); + TEST_ASSERT_EQUAL(0,decode(s,1,1,2)); + TEST_ASSERT_EQUAL(0,decode(s,0,2,2)); +} +static void mirror_and_rotate() { + Stream s; Grade14 grade; + Canvas c(53,11); c.clear(0); c.setPixel(0,0,0xffffff); + const struct { Orientation o; int x, y; } cases[] = { + {{false,false},0,0}, {{true,false},52,0}, {{false,true},52,10}, {{true,true},0,10}}; + for (const auto& k : cases) { + packCanvas(s,c,11,grade,k.o); + TEST_ASSERT_EQUAL(16383,decode(s,k.x,k.y,2)); + if (k.x || k.y) TEST_ASSERT_EQUAL(0,decode(s,0,0,2)); + } + Canvas band(53,8); band.clear(0); band.setPixel(0,0,0xffffff); + packCanvas(s,band,8,grade,{false,true}); // Rotated inside the letterbox, rows 1-8. + TEST_ASSERT_EQUAL(16383,decode(s,52,8,2)); + TEST_ASSERT_EQUAL(0,decode(s,52,10,2)); +} +static void gamma_brightness_grade() { + Grade14 g; render::GradeParams p; p.gamma = 2.2f; g.setParams(p); + TEST_ASSERT_EQUAL(0,g.channel(0,0)); + TEST_ASSERT_EQUAL(16383,g.channel(0,255)); + TEST_ASSERT_EQUAL(3596,g.channel(0,128)); // Pimoroni v1.23.0 GAMMA_14BIT[128] + for(int i=1;i<256;++i) TEST_ASSERT_TRUE(g.channel(0,i) >= g.channel(0,i-1)); + p.brightness=128; g.setParams(p); + TEST_ASSERT_EQUAL(16383u*128u/255u,g.channel(0,255)); // linear light, not gamma twice + p.brightness=0; g.setParams(p); + TEST_ASSERT_EQUAL(0,g.channel(0,255)); + p.brightness=255; p.gamma=1; p.correction=0xff8000; p.tint=0x80ffff; g.setParams(p); + TEST_ASSERT_EQUAL(16383u*128u/255u,g.channel(0,255)); + TEST_ASSERT_EQUAL(16383u*128u/255u,g.channel(1,255)); + TEST_ASSERT_EQUAL(0,g.channel(2,255)); + p.correction=p.tint=0xffffff; p.saturation=0; g.setParams(p); + Stream s; clearStream(s); g.pack(s,0,0,0xff0000); + TEST_ASSERT_EQUAL(decode(s,0,0,2),decode(s,0,0,1)); + TEST_ASSERT_EQUAL(decode(s,0,0,2),decode(s,0,0,0)); + // Same NG curve at higher precision: rounded down to bytes within one level. + p.saturation=100; p.gamma=1.9f; p.brightness=120; g.setParams(p); + render::ColorGrade reference; reference.setParams(p); + for(int i=0;i<256;++i) { + const uint32_t rgb = i*0x010101u; + TEST_ASSERT_INT_WITHIN(1,color::red(reference.applyPixel(rgb)),g.channel(0,i)*255u/16383u); + } +} +int main() { + UNITY_BEGIN(); + RUN_TEST(stream_format); + RUN_TEST(bits_and_orientation); + RUN_TEST(heights_and_letterbox); + RUN_TEST(mirror_and_rotate); + RUN_TEST(gamma_brightness_grade); + return UNITY_END(); +} diff --git a/test/test_galactic_inputs/test_main.cpp b/test/test_galactic_inputs/test_main.cpp new file mode 100644 index 00000000..f2bfa3b9 --- /dev/null +++ b/test/test_galactic_inputs/test_main.cpp @@ -0,0 +1,136 @@ +#include +#include "system/GalacticUnicornControls.h" +#include "system/PeripheryService.cpp" +using namespace awtrix; +using namespace awtrix::galactic; +void setUp() {} +void tearDown() {} +struct Display : IDisplayService { void sendScreen() override {} }; +struct System : ISystemService { + void reboot() override {} void sleep(uint64_t) override {} + void factoryReset() override {} void resetSettings() override {} +}; +struct Board : IBoard, ISensorBus { + ButtonState buttons{}; int raw = 0; uint8_t brightness = 0; + const char* name() const override { return "test"; } + int matrixWidth() const override { return 53; } int matrixHeight() const override { return 11; } + void begin() override {} void show(const Canvas&) override {} + void setBrightness(uint8_t b) override { brightness = b; } + void setMatrixLayout(const MatrixLayout&) override {} void applyColorGrade(const render::GradeParams&) override {} + bool hasBattery() const override { return false; } bool hasLightSensor() const override { return true; } + int readBatteryMillivolts() override { return -1; } int readLdrRaw() override { return raw; } + void pollButtons(ButtonState& out) override { out = buttons; } + sound::IToneSink* toneSink() override { return nullptr; } sound::ITrackSink* trackSink() override { return nullptr; } + ISensorBus& sensors() override { return *this; } bool hasSensor() const override { return false; } + SensorReading read() override { return {}; } const char* sensorName() const override { return "none"; } +}; +struct Fixture { + sound::AudioRouter audio; Display display; System system; CoreEngine engine{audio, display, system}; + Board board; DeviceConfig cfg; PeripheryService periphery; GalacticUnicornControls controls; + std::array keys{}; int64_t now = 0; int settingsEvents = 0, powerEvents = 0, buttonEvents = 0; + Fixture() { + periphery.begin(engine, board, cfg); + engine.state().subscribe([this](StateEvent e) { + if (e == StateEvent::SettingsChanged) ++settingsEvents; + if (e == StateEvent::PowerChanged) ++powerEvents; + if (e == StateEvent::ButtonsChanged) ++buttonEvents; + }); + } + void sample() { controls.tick(engine, keys, now); periphery.tick(now); engine.tick(now); } + void press(size_t key) { + keys[key] = true; sample(); now += 35; sample(); + keys[key] = false; now += 1; sample(); now += 35; sample(); + } +}; +void debounce_press_hold_bounce() { + DebouncedButton b; + TEST_ASSERT_FALSE(b.update(true, 10)); TEST_ASSERT_FALSE(b.update(false, 20)); + TEST_ASSERT_FALSE(b.update(true, 30)); TEST_ASSERT_FALSE(b.update(true, 64)); + TEST_ASSERT_TRUE(b.update(true, 65)); TEST_ASSERT_TRUE(b.pressed()); + TEST_ASSERT_FALSE(b.update(true, 10000)); + TEST_ASSERT_FALSE(b.update(false, 10001)); TEST_ASSERT_FALSE(b.update(true, 10010)); + TEST_ASSERT_FALSE(b.update(true, 10050)); TEST_ASSERT_TRUE(b.pressed()); + b.update(false, 10060); b.update(false, 10095); TEST_ASSERT_FALSE(b.pressed()); + b.update(true, 10100); TEST_ASSERT_TRUE(b.update(true, 10135)); +} +void map_and_clamp() { + const int pins[] = {0,1,3,6,27,7,8,21,26}; + const InputAction actions[] = {InputAction::Left,InputAction::Select,InputAction::Right, + InputAction::None,InputAction::Power,InputAction::VolumeUp,InputAction::VolumeDown, + InputAction::BrightnessUp,InputAction::BrightnessDown}; + for (size_t i=0; i +#include "core/CoreEngine.h" +#include "core/api/StateJson.h" +#include "core/api/JsonReader.h" +#include "core/render/Canvas.h" +#include "core/script/ScriptInfo.h" +#include "platform/rp2040/WifiCompat.h" +#include "transport/http/BodyArena.h" +#include "transport/http/RequestHead.h" + +using namespace awtrix; +void setUp() {} +void tearDown() {} +struct Display : IDisplayService { void sendScreen() override {} }; +struct System : ISystemService { + void reboot() override {} void sleep(uint64_t) override {} + void factoryReset() override {} void resetSettings() override {} +}; +void state_without_script_host() { + sound::AudioRouter audio; + Display display; System system; + CoreEngine engine(audio, display, system); + TEST_ASSERT_TRUE(script::scriptInfo(nullptr).empty()); + const auto apps = buildAppsJson(engine); + TEST_ASSERT_TRUE(api::isWellFormed(apps)); + TEST_ASSERT_NOT_EQUAL(std::string::npos, apps.find("\"name\":\"Time\"")); + TEST_ASSERT_NOT_EQUAL(std::string::npos, apps.find("\"origin\":\"builtin\"")); + TEST_ASSERT_EQUAL(std::string::npos, apps.find("\"origin\":\"script\"")); + DeviceFacts facts; + facts.soc = "rp2040"; facts.freeHeapBytes = 12345; facts.resetReason = "software"; + const auto device = buildDeviceJson(engine, "test-id", facts); + TEST_ASSERT_TRUE(api::isWellFormed(device)); + TEST_ASSERT_NOT_EQUAL(std::string::npos, device.find("\"scriptingRunning\":false")); + TEST_ASSERT_NOT_EQUAL(std::string::npos, device.find("\"freeHeapBytes\":12345")); + TEST_ASSERT_EQUAL(std::string::npos, device.find("psramTotalBytes")); + Canvas screen(53, 11); + TEST_ASSERT_NOT_EQUAL(std::string::npos, buildScreenJson(screen).find("\"height\":11")); +} +void scan_starts_polls_and_restarts_after_empty_result() { + struct Wifi { + int starts = 0, result = 0; + void scanNetworks(bool async) { TEST_ASSERT_TRUE(async); ++starts; } + int scanComplete() { return result; } + } wifi; + platform::pico::WifiScan scan; + TEST_ASSERT_EQUAL(-1, scan.poll(wifi)); + TEST_ASSERT_EQUAL(1, wifi.starts); + wifi.result = -1; + TEST_ASSERT_EQUAL(-1, scan.poll(wifi)); + TEST_ASSERT_EQUAL(1, wifi.starts); + wifi.result = 0; + TEST_ASSERT_EQUAL(0, scan.poll(wifi)); + scan.consumed(); + TEST_ASSERT_EQUAL(-1, scan.poll(wifi)); + TEST_ASSERT_EQUAL(2, wifi.starts); + wifi.result = 3; + TEST_ASSERT_EQUAL(3, scan.poll(wifi)); +} +void raw_body_limit_is_eight_kib_and_recovers_after_overflow() { + BodyArena arena; + TEST_ASSERT_TRUE(arena.init(8192)); + std::string body(8192, ' '); + arena.open(8192); arena.append(body.data(), body.size()); arena.finish(); + TEST_ASSERT_EQUAL(8192, arena.view().size()); + arena.open(8192); arena.append(body.data(), body.size()); arena.append("x", 1); arena.finish(); + TEST_ASSERT_TRUE(arena.state() == BodyArena::State::Overflow); + TEST_ASSERT_TRUE(arena.view().empty()); + arena.reset(); arena.open(8192); arena.append("{}", 2); arena.finish(); + TEST_ASSERT_EQUAL(2, arena.view().size()); +} +void request_head_is_found_however_it_is_split() { + const std::string req = "PUT /api/v1/system HTTP/1.1\r\nHost: x\r\nContent-Length: 12\r\n\r\n{\"a\":true}"; + const std::size_t want = req.find("\r\n\r\n") + 4; + // Cut into two reads at every offset: the blank line is found whichever read it straddles. + for (std::size_t cut = 0; cut <= req.size(); ++cut) { + const std::size_t first = requesthead::end(req.data(), cut); + TEST_ASSERT_EQUAL(cut >= want ? want : 0, first); + if (!first) TEST_ASSERT_EQUAL(want, requesthead::end(req.data(), req.size(), cut)); + } + const std::string open = "GET / HTTP/1.1\r\nHost: x\r\n"; + TEST_ASSERT_EQUAL(0, requesthead::end(open.data(), open.size())); + TEST_ASSERT_EQUAL(12, requesthead::contentLength(req.data(), want)); + const std::string mixed = "PUT / HTTP/1.1\r\ncontent-LENGTH: 3000\r\n\r\n"; + TEST_ASSERT_EQUAL(3000, requesthead::contentLength(mixed.data(), mixed.size())); + const std::string inside = "GET / HTTP/1.1\r\nX-Content-Length: 5\r\n\r\n"; + TEST_ASSERT_EQUAL(0, requesthead::contentLength(inside.data(), inside.size())); +} +int main() { + UNITY_BEGIN(); + RUN_TEST(state_without_script_host); + RUN_TEST(scan_starts_polls_and_restarts_after_empty_result); + RUN_TEST(raw_body_limit_is_eight_kib_and_recovers_after_overflow); + RUN_TEST(request_head_is_found_however_it_is_split); + return UNITY_END(); +} diff --git a/test/test_kv_preferences/test_main.cpp b/test/test_kv_preferences/test_main.cpp new file mode 100644 index 00000000..fa9e0972 --- /dev/null +++ b/test/test_kv_preferences/test_main.cpp @@ -0,0 +1,100 @@ +#include +#include "persistence/KvPreferences.h" +using namespace awtrix::storage; + +class MemoryDisk : public KvBackend { + public: + std::map files; + bool fail = false; + int writes = 0; + Read read(const std::string& n, std::string& b) override { + if (!files.count(n)) return Read::Missing; + b = files[n]; return Read::Ok; + } + bool replace(const std::string& n, const std::string& b) override { + if (fail) return false; + files[n] = b; ++writes; return true; + } +}; +void setUp() {} +void tearDown() {} +void roundtrip() { + MemoryDisk disk; + { + KvPreferences p(disk); + TEST_ASSERT_TRUE(p.begin("awtrix-cfg")); + TEST_ASSERT_EQUAL(8, p.put("ssid", KvPreferences::String, "test-net")); + p.put("pass", KvPreferences::String, "test-only"); + p.putNumber("signed", KvPreferences::Int, uint32_t(-123), 4); + p.putNumber("uint", KvPreferences::UInt, 0xffffffffu, 4); + p.putNumber("bool", KvPreferences::Bool, 1, 1); + p.putNumber("uchar", KvPreferences::UChar, 255, 1); + p.putNumber("ushort", KvPreferences::UShort, 65535, 2); + p.putNumber("float", KvPreferences::Float, 0xc1100000u, 4); + p.put("empty", KvPreferences::String, ""); + TEST_ASSERT_EQUAL(0, disk.writes); + TEST_ASSERT_TRUE(p.end()); + } + KvPreferences rebooted(disk); + TEST_ASSERT_TRUE(rebooted.begin("awtrix-cfg", true)); + TEST_ASSERT_EQUAL_STRING("test-net", rebooted.get("ssid", KvPreferences::String).c_str()); + TEST_ASSERT_EQUAL_STRING("test-only", rebooted.get("pass", KvPreferences::String).c_str()); + TEST_ASSERT_EQUAL_UINT32(uint32_t(-123), rebooted.getNumber("signed", KvPreferences::Int, 0)); + TEST_ASSERT_EQUAL_UINT32(0xffffffffu, rebooted.getNumber("uint", KvPreferences::UInt, 0)); + TEST_ASSERT_EQUAL(1, rebooted.getNumber("bool", KvPreferences::Bool, 0)); + TEST_ASSERT_EQUAL(255, rebooted.getNumber("uchar", KvPreferences::UChar, 0)); + TEST_ASSERT_EQUAL(65535, rebooted.getNumber("ushort", KvPreferences::UShort, 0)); + TEST_ASSERT_EQUAL_HEX32(0xc1100000u, rebooted.getNumber("float", KvPreferences::Float, 0)); + TEST_ASSERT_TRUE(rebooted.isKey("empty")); + TEST_ASSERT_EQUAL_STRING("", rebooted.get("empty", KvPreferences::String, "fallback").c_str()); + TEST_ASSERT_EQUAL(77, rebooted.getNumber("signed", KvPreferences::UInt, 77)); + TEST_ASSERT_EQUAL(0, rebooted.put("ssid", KvPreferences::String, "no")); + TEST_ASSERT_FALSE(rebooted.clear()); + TEST_ASSERT_FALSE(rebooted.remove("ssid")); + TEST_ASSERT_TRUE(rebooted.end()); + TEST_ASSERT_EQUAL(1, disk.writes); +} +void corrupt_snapshots_are_rejected() { + MemoryDisk disk; KvPreferences p(disk); + p.begin("ns"); p.put("key", KvPreferences::String, "value"); p.end(); + const auto valid = disk.files["ns"]; + // Every truncation and every single-byte mutation, including type and checksum. + for (std::size_t n = 0; n < valid.size(); ++n) { + disk.files["ns"] = valid.substr(0, n); + TEST_ASSERT_FALSE(p.begin("ns")); + TEST_ASSERT_FALSE(p.isKey("key")); + disk.files["ns"] = valid; + disk.files["ns"][n] ^= 1; + TEST_ASSERT_FALSE(p.begin("ns")); + } + disk.files["ns"] = valid + "trailing"; + TEST_ASSERT_FALSE(p.begin("ns")); + disk.files["ns"] = std::string(KvPreferences::kMaxBytes + 1, 'x'); + TEST_ASSERT_FALSE(p.begin("ns")); +} +void atomic_failure_and_namespaces() { + MemoryDisk disk; KvPreferences p(disk); + TEST_ASSERT_FALSE(p.begin("missing", true)); + TEST_ASSERT_FALSE(p.begin("../bad")); + p.begin("one"); p.put("key", KvPreferences::String, "old"); p.end(); + p.begin("two"); p.put("key", KvPreferences::String, "other"); p.end(); + p.begin("one"); p.put("key", KvPreferences::String, "new"); + disk.fail = true; TEST_ASSERT_FALSE(p.end()); disk.fail = false; + p.begin("one"); TEST_ASSERT_EQUAL_STRING("old", p.get("key", KvPreferences::String).c_str()); + const auto writes = disk.writes; + p.put("key", KvPreferences::String, "old"); p.end(); TEST_ASSERT_EQUAL(writes, disk.writes); + p.begin("one"); + TEST_ASSERT_EQUAL(0, p.put("../bad", KvPreferences::String, "bad")); + TEST_ASSERT_EQUAL(0, p.put("large", KvPreferences::String, std::string(KvPreferences::kMaxBytes, 'x'))); + TEST_ASSERT_EQUAL(0, p.putNumber("bad", KvPreferences::Bool, 2, 1)); + TEST_ASSERT_TRUE(p.remove("key")); p.end(); + p.begin("one", true); TEST_ASSERT_FALSE(p.isKey("key")); p.end(); + p.begin("two", true); TEST_ASSERT_EQUAL_STRING("other", p.get("key", KvPreferences::String).c_str()); p.end(); +} +int main() { + UNITY_BEGIN(); + RUN_TEST(roundtrip); + RUN_TEST(corrupt_snapshots_are_rejected); + RUN_TEST(atomic_failure_and_namespaces); + return UNITY_END(); +} diff --git a/test/test_linkstatus/test_linkstatus.cpp b/test/test_linkstatus/test_linkstatus.cpp index 6123e564..cdbc64e5 100644 --- a/test/test_linkstatus/test_linkstatus.cpp +++ b/test/test_linkstatus/test_linkstatus.cpp @@ -212,6 +212,63 @@ static void test_wifi_renders_the_same_shape_as_mqtt() { render(joined()).c_str()); } +// The Pico's first join after an unclean reset: the AP breaks off the key exchange, CYW43 says +// BADAUTH, the retry joins. Right password, so no badCredentials - not now, not after the join. +static void test_one_auth_failure_that_a_retry_recovers_is_not_bad_credentials() { + LinkStatus s; + AuthFailureGate gate; + gate.noteJoin(WifiAssoc::Idle); + applyWifiAssoc(s, gate.filter(WifiAssoc::AuthFailed), true, "home", ""); + TEST_ASSERT_EQUAL(LinkPhase::Offline, s.phase); + TEST_ASSERT_EQUAL(LinkError::None, s.error); + gate.noteJoin(WifiAssoc::AuthFailed); + applyWifiAssoc(s, gate.filter(WifiAssoc::Joining), true, "home", ""); + applyWifiAssoc(s, gate.filter(WifiAssoc::Connected), true, "home", "192.168.1.7"); + TEST_ASSERT_EQUAL(LinkPhase::Connected, s.phase); + TEST_ASSERT_EQUAL(LinkError::None, s.lastError); +} + +static void test_auth_failures_on_two_joins_in_a_row_are_bad_credentials() { + LinkStatus s; + AuthFailureGate gate; + gate.noteJoin(WifiAssoc::Idle); + applyWifiAssoc(s, gate.filter(WifiAssoc::AuthFailed), true, "home", ""); + gate.noteJoin(WifiAssoc::AuthFailed); + applyWifiAssoc(s, gate.filter(WifiAssoc::AuthFailed), true, "home", ""); + TEST_ASSERT_EQUAL(LinkError::BadCredentials, s.error); + TEST_ASSERT_EQUAL(LinkError::BadCredentials, s.lastError); + // And it stays that way while the radio keeps refusing. + gate.noteJoin(WifiAssoc::AuthFailed); + applyWifiAssoc(s, gate.filter(WifiAssoc::AuthFailed), true, "home", ""); + TEST_ASSERT_EQUAL(LinkError::BadCredentials, s.error); +} + +// A link that dropped keeps "lost" as its last error when the rejoin needed a second try. +static void test_a_rejoin_that_needed_a_retry_keeps_lost_as_the_last_error() { + LinkStatus s = joined(); + AuthFailureGate gate; + applyWifiAssoc(s, gate.filter(WifiAssoc::Disconnected), true, "home", ""); + gate.noteJoin(WifiAssoc::Disconnected); + applyWifiAssoc(s, gate.filter(WifiAssoc::AuthFailed), true, "home", ""); + gate.noteJoin(WifiAssoc::AuthFailed); + applyWifiAssoc(s, gate.filter(WifiAssoc::Connected), true, "home", "192.168.1.7"); + TEST_ASSERT_EQUAL(LinkError::Lost, s.lastError); +} + +// Only failures on consecutive joins count: a join that got as far as connecting resets the run. +static void test_a_connection_between_two_auth_failures_resets_the_count() { + LinkStatus s; + AuthFailureGate gate; + gate.noteJoin(WifiAssoc::Idle); + applyWifiAssoc(s, gate.filter(WifiAssoc::AuthFailed), true, "home", ""); + gate.noteJoin(WifiAssoc::AuthFailed); + applyWifiAssoc(s, gate.filter(WifiAssoc::Connected), true, "home", "192.168.1.7"); + applyWifiAssoc(s, gate.filter(WifiAssoc::Disconnected), true, "home", ""); + gate.noteJoin(WifiAssoc::Disconnected); + applyWifiAssoc(s, gate.filter(WifiAssoc::AuthFailed), true, "home", ""); + TEST_ASSERT_EQUAL(LinkError::Lost, s.lastError); +} + int main(int, char**) { UNITY_BEGIN(); RUN_TEST(test_every_phase_has_a_stable_name); @@ -235,5 +292,9 @@ int main(int, char**) { RUN_TEST(test_the_reason_for_an_outage_survives_the_reconnect); RUN_TEST(test_a_link_that_never_failed_has_no_last_error); RUN_TEST(test_wifi_renders_the_same_shape_as_mqtt); + RUN_TEST(test_one_auth_failure_that_a_retry_recovers_is_not_bad_credentials); + RUN_TEST(test_auth_failures_on_two_joins_in_a_row_are_bad_credentials); + RUN_TEST(test_a_rejoin_that_needed_a_retry_keeps_lost_as_the_last_error); + RUN_TEST(test_a_connection_between_two_auth_failures_resets_the_count); return UNITY_END(); } diff --git a/test/test_matrixlayout/test_matrixlayout.cpp b/test/test_matrixlayout/test_matrixlayout.cpp index 9036ae1d..87fd6fb0 100644 --- a/test/test_matrixlayout/test_matrixlayout.cpp +++ b/test/test_matrixlayout/test_matrixlayout.cpp @@ -25,7 +25,7 @@ int refTileFromRight(int cx, int cy) { return cy * 8 + (7 - ((cy & 1) ? (7 - cx) : cx)); } -constexpr int kMaxLeds = kMatrixWidthMax * kMatrixHeight; +constexpr int kMaxLeds = kMatrixWidthMax * kMatrixHeightMax; struct Grid { int panelWidth; @@ -182,7 +182,7 @@ static void test_bijection_over_the_valid_config_space() { layout.panelStart = start; layout.panelWiring = wiring ? Wiring::Columns : Wiring::Rows; layout.panelSerpentine = panelSerp != 0; - TEST_ASSERT_EQUAL_INT(kMatrixHeight, layout.height()); + TEST_ASSERT_EQUAL_INT(kMatrixHeightMin, layout.height()); TEST_ASSERT_TRUE(layout.width() >= kMatrixWidthMin && layout.width() <= kMatrixWidthMax); assertBijection(layout); @@ -369,7 +369,15 @@ static void test_all_chain_combinations_are_bijections() { layout.panelSerpentine = panelSerp != 0; layout.panelChainReverse = reverse != 0; layout.panelChainSerpentine = chainSerp != 0; - assertBijection(layout); + for (int height : {8, 11, 16}) { + layout.panelHeight = height; + TEST_ASSERT_EQUAL_INT(layout.width() * height, layout.ledCount()); + for (int transform = 0; transform < 4; ++transform) { + layout.mirror = (transform & 1) != 0; + layout.rotate180 = (transform & 2) != 0; + assertBijection(layout); + } + } } } } @@ -388,7 +396,7 @@ static void test_sanitize_keeps_a_valid_layout() { TEST_ASSERT_FALSE(out.panelSerpentine); } -static void test_height_is_always_eight() { +static void test_default_height_is_eight() { MatrixLayout wide; wide.panelWidth = 64; TEST_ASSERT_EQUAL_INT(8, wide.height()); @@ -396,6 +404,31 @@ static void test_height_is_always_eight() { TEST_ASSERT_EQUAL_INT(8, tiles8x8().height()); } +static void test_runtime_height_mapping_and_sanitization() { + for (int h : {8, 11, 16}) { + MatrixLayout layout; + layout.panelWidth = 53; + layout.panelHeight = h; + bool changed = true; + TEST_ASSERT_EQUAL_INT(h, sanitizeMatrixLayout(layout, &changed).height()); + TEST_ASSERT_FALSE(changed); + for (int y = 0; y < h; ++y) + for (int x = 0; x < 53; ++x) + TEST_ASSERT_EQUAL_INT(refUlanzi(x, y, 53), layout.xyToIndex(x, y)); + layout.panelWiring = Wiring::Columns; + for (int y = 0; y < h; ++y) + for (int x = 0; x < 53; ++x) + TEST_ASSERT_EQUAL_INT(refColumns(x, y, h), layout.xyToIndex(x, y)); + } + for (int h : {-1, 7, 17, 100}) { + MatrixLayout layout; + layout.panelHeight = h; + bool changed = false; + TEST_ASSERT_EQUAL_INT(h < 8 ? 8 : 16, sanitizeMatrixLayout(layout, &changed).height()); + TEST_ASSERT_TRUE(changed); + } +} + static void test_sanitize_rejects_a_width_outside_the_envelope() { MatrixLayout wide; wide.panelWidth = 128; @@ -475,7 +508,8 @@ int main(int, char**) { RUN_TEST(test_chain_serpentine_parity_follows_the_cable); RUN_TEST(test_all_chain_combinations_are_bijections); RUN_TEST(test_sanitize_keeps_a_valid_layout); - RUN_TEST(test_height_is_always_eight); + RUN_TEST(test_default_height_is_eight); + RUN_TEST(test_runtime_height_mapping_and_sanitization); RUN_TEST(test_sanitize_rejects_a_width_outside_the_envelope); RUN_TEST(test_sanitize_clamps_nonsense_fields); RUN_TEST(test_sanitize_keeps_the_display_transforms); diff --git a/test/test_partition_reservations.py b/test/test_partition_reservations.py new file mode 100644 index 00000000..823219a7 --- /dev/null +++ b/test/test_partition_reservations.py @@ -0,0 +1,50 @@ +"""Offline regression tests for declared UF2 filesystem reservations.""" +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import unittest + +ROOT = Path(__file__).resolve().parents[1] + + +class Reservations(unittest.TestCase): + def check_config(self, text): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + for name in ('tools/check_partitions.py', 'scripts/gen_partitions.py'): + dest = root / name + dest.parent.mkdir(exist_ok=True) + shutil.copyfile(ROOT / name, dest) + (root / 'platformio.ini').write_text(text) + return subprocess.run([sys.executable, str(root / 'tools/check_partitions.py')], + capture_output=True, text=True) + + def test_inherited_reservation(self): + result = self.check_config('[env:base]\nboard_build.filesystem_size = 0.5m\n' + '[env:derived]\nextends = env:base\n') + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertIn('env:derived: filesystem reservation 524288', result.stdout) + + def test_undersized_override(self): + result = self.check_config('[env:base]\nboard_build.filesystem_size = 0.5m\n' + '[env:derived]\nextends = env:base\n' + 'board_build.filesystem_size = 0.25m\n') + self.assertNotEqual(result.returncode, 0) + self.assertIn('env:derived: filesystem reservation 0.25m is below', result.stdout) + + def test_invalid_reservations(self): + for size in ('garbage', 'NaNm', '0.5001m'): + with self.subTest(size=size): + result = self.check_config('[env:board]\nboard_build.filesystem_size = ' + size) + self.assertNotEqual(result.returncode, 0) + + def test_cycle(self): + result = self.check_config('[env:a]\nextends = env:b\n[env:b]\nextends = env:a\n') + self.assertNotEqual(result.returncode, 0) + self.assertIn('inheritance cycle', result.stdout) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_pico_persistence/compat/Arduino.h b/test/test_pico_persistence/compat/Arduino.h new file mode 100644 index 00000000..2b3c889d --- /dev/null +++ b/test/test_pico_persistence/compat/Arduino.h @@ -0,0 +1,12 @@ +#pragma once +#include +#include +class String { + public: + String(const char* s = "") : value_(s) {} + const char* c_str() const { return value_.c_str(); } + std::size_t length() const { return value_.size(); } + bool isEmpty() const { return value_.empty(); } + private: + std::string value_; +}; diff --git a/test/test_pico_persistence/compat/LittleFS.h b/test/test_pico_persistence/compat/LittleFS.h new file mode 100644 index 00000000..a1329aac --- /dev/null +++ b/test/test_pico_persistence/compat/LittleFS.h @@ -0,0 +1,62 @@ +#pragma once +// Deterministic filesystem test double, NOT a flash emulator. Used to exercise +// the production adapter, config and restore code with injected I/O failures. +#include +#include +#include +#include +#include +#include +inline std::map testFiles; +inline std::set testDirs; +inline bool failWrite = false, failRename = false; +class File { + public: + File() = default; + File(std::string path, bool write) : path_(std::move(path)), open_(true) { + if (write) testFiles[path_].clear(); + } + explicit operator bool() const { return open_; } + std::size_t size() const { return testFiles[path_].size(); } + bool isDirectory() const { return testDirs.count(path_); } + std::size_t write(const uint8_t* b, std::size_t n) { + if (!open_) return 0; + if (failWrite && n) --n; + testFiles[path_].append(reinterpret_cast(b), n); return n; + } + std::size_t print(const char* s) { return write(reinterpret_cast(s), std::strlen(s)); } + std::size_t read(uint8_t* b, std::size_t n) { + if (!open_) return 0; + auto& value = testFiles[path_]; + n = std::min(n, value.size() - at_); + if (n) std::memcpy(b, value.data() + at_, n); + at_ += n; return n; + } + int read() { uint8_t b; return read(&b, 1) ? b : -1; } + String readString() { return String(testFiles[path_].c_str()); } + void flush() {} + void close() { open_ = false; } + private: + std::string path_; + bool open_ = false; + std::size_t at_ = 0; +}; +class LittleFSConfig { public: void setAutoFormat(bool) {} }; +struct FSInfo { std::size_t totalBytes = 524288, usedBytes = 0; }; +class TestFS { + public: + void setConfig(const LittleFSConfig&) {} + bool begin() { return true; } + bool info(FSInfo& info) { for (const auto& f : testFiles) info.usedBytes += f.second.size(); return true; } + bool exists(const char* p) { return testFiles.count(p) || testDirs.count(p); } + bool mkdir(const char* p) { testDirs.insert(p); return true; } + File open(const char* p, const char* mode = "r") { + return mode[0] == 'w' || exists(p) ? File(p, mode[0] == 'w') : File(); + } + bool remove(const char* p) { return testFiles.erase(p); } + bool rename(const char* from, const char* to) { + if (failRename || !testFiles.count(from)) return false; + testFiles[to] = testFiles[from]; testFiles.erase(from); return true; + } +}; +inline TestFS LittleFS; diff --git a/test/test_pico_persistence/test_main.cpp b/test/test_pico_persistence/test_main.cpp new file mode 100644 index 00000000..166525a1 --- /dev/null +++ b/test/test_pico_persistence/test_main.cpp @@ -0,0 +1,204 @@ +#define AWTRIX_PLATFORM_RP2040 +#include +#include "../../src/platform/rp2040/LittleFsPreferences.cpp" +#include "../../src/platform/rp2040/FilesystemRp2040.cpp" +#include "../../src/platform/rp2040/DisabledStores.cpp" +#include "../../src/persistence/DeviceConfig.cpp" +#include "../../src/persistence/NvsSettings.cpp" +#include "../../src/persistence/AppOrderStore.cpp" +#include "../../src/persistence/IconOriginsStore.cpp" +#include "../../src/persistence/DeviceConfigJson.cpp" +#include "../../src/persistence/SystemConfigApply.cpp" +#include "../../src/persistence/FsRestoreSink.cpp" +#include "../../src/persistence/LittleFsRestoreSink.cpp" +#include "core/StateStore.h" +using namespace awtrix; +namespace awtrix { void logf(const char*, ...) {} } +void setUp() { testFiles.clear(); testDirs.clear(); failWrite = failRename = false; } +void tearDown() {} +void legacy_panel_height_is_ignored_and_removed() { + Preferences p; + TEST_ASSERT_TRUE(p.begin("awtrix-cfg", false)); + p.putInt("ph", 16); + p.end(); + DeviceConfig cfg; cfg.load(); + TEST_ASSERT_EQUAL(8, cfg.panelHeight); + cfg.save(); + TEST_ASSERT_TRUE(p.begin("awtrix-cfg", true)); + TEST_ASSERT_FALSE(p.isKey("ph")); + TEST_ASSERT_EQUAL(8, p.getInt("pheight", -1)); + p.end(); +} +void panel_height_uses_fresh_key() { + DeviceConfig cfg; cfg.panelHeight = 11; cfg.save(); + Preferences p; + TEST_ASSERT_TRUE(p.begin("awtrix-cfg", true)); + TEST_ASSERT_EQUAL(11, p.getInt("pheight", -1)); + TEST_ASSERT_FALSE(p.isKey("ph")); + p.end(); + // A stale legacy value must not override the fresh key either. + TEST_ASSERT_TRUE(p.begin("awtrix-cfg", false)); + p.putInt("ph", 16); + p.end(); + DeviceConfig loaded; loaded.load(); + TEST_ASSERT_EQUAL(11, loaded.panelHeight); + loaded.save(); + TEST_ASSERT_TRUE(p.begin("awtrix-cfg", true)); + TEST_ASSERT_FALSE(p.isKey("ph")); + TEST_ASSERT_EQUAL(11, p.getInt("pheight", -1)); + p.end(); +} +void config_and_settings_reboot_roundtrip() { + TEST_ASSERT_TRUE(fs::begin()); + TEST_ASSERT_TRUE(testDirs.count("/ICONS") && testDirs.count("/MELODIES") && testDirs.count("/PALETTES")); + DeviceConfig before; + before.wifiSsid = "test-ssid"; before.wifiPass = "test-pass"; + before.panelHeight = 11; before.mqttPort = 8883; + before.tempOffset = -7.5f; before.wifiConnectTimeout = 32100; + before.mqttEnabled = true; before.minBrightness = 22; + before.save(); + DeviceConfig after; after.load(); + TEST_ASSERT_EQUAL_STRING("test-ssid", after.wifiSsid.c_str()); + TEST_ASSERT_EQUAL_STRING("test-pass", after.wifiPass.c_str()); + TEST_ASSERT_EQUAL(11, after.panelHeight); TEST_ASSERT_EQUAL(8883, after.mqttPort); + TEST_ASSERT_EQUAL_FLOAT(-7.5f, after.tempOffset); + TEST_ASSERT_EQUAL(32100, after.wifiConnectTimeout); + TEST_ASSERT_TRUE(after.mqttEnabled); TEST_ASSERT_EQUAL(22, after.minBrightness); + Settings settings; + settings.applyRead(api::JsonReader("{\"brightness\":42}")); + TEST_ASSERT_EQUAL(42, settings.brightness); + nvs::saveSettings(settings); + Settings loaded; nvs::loadSettings(loaded); + TEST_ASSERT_EQUAL(42, loaded.brightness); + std::string a, b; + api::JsonWriter wa(a), wb(b); settings.writeMembers(wa); loaded.writeMembers(wb); + TEST_ASSERT_EQUAL_STRING(a.c_str(), b.c_str()); + testFiles["/NVS/awtrix-cfg.bin"][0] ^= 1; + DeviceConfig defaults; defaults.load(); + TEST_ASSERT_TRUE(defaults.wifiSsid.empty()); +} +void failed_writes_keep_last_config() { + DeviceConfig cfg; cfg.wifiSsid = "old"; cfg.save(); + cfg.wifiSsid = "new"; + failWrite = true; cfg.save(); failWrite = false; + DeviceConfig loaded; loaded.load(); TEST_ASSERT_EQUAL_STRING("old", loaded.wifiSsid.c_str()); + failRename = true; cfg.save(); failRename = false; + loaded.load(); TEST_ASSERT_EQUAL_STRING("old", loaded.wifiSsid.c_str()); + TEST_ASSERT_FALSE(testFiles.count("/NVS/awtrix-cfg.bin.tmp")); +} +// A Galactic Unicorn refuses panel edits it cannot draw, and a restore keeps its own pins and panel +// while taking the rest of a backup made on a board wired differently. +void fixed_board_system_config() { + const auto& soc = pins::rp2040Profile(); + DeviceConfig cfg; + cfg.setPinSet(soc.defaults); + cfg.panelWidth = 53; cfg.panelHeight = 11; + int applied = 0; sysconfig::ApplyError err; + auto put = [&](const char* json, sysconfig::Origin origin = sysconfig::Origin::Interactive) { + err = {}; + return sysconfig::apply(cfg, api::JsonReader(json), applied, err, origin, soc); + }; + TEST_ASSERT_FALSE(put(R"({"panelWidth":64})")); + TEST_ASSERT_EQUAL(422, err.status); TEST_ASSERT_EQUAL_STRING("panelWidth", err.field.c_str()); + TEST_ASSERT_FALSE(put(R"({"panelHeight":14})")); + TEST_ASSERT_EQUAL_STRING("panelHeight", err.field.c_str()); + TEST_ASSERT_FALSE(put(R"({"panelWiring":"columns"})")); + TEST_ASSERT_EQUAL_STRING("panelWiring", err.field.c_str()); + TEST_ASSERT_EQUAL(53, cfg.panelWidth); TEST_ASSERT_EQUAL(11, cfg.panelHeight); + TEST_ASSERT_TRUE(put(R"({"panelHeight":8,"mirror":true})")); + TEST_ASSERT_EQUAL(8, cfg.panelHeight); TEST_ASSERT_TRUE(cfg.mirror); + // An ESP32 backup: its own pins, width and wiring, and a height this panel cannot show. + TEST_ASSERT_TRUE(put(R"({"hostname":"from-esp32","panelWidth":32,"panelHeight":16,)" + R"("panelWiring":"columns","pinMatrix":32,"pinBtnLeft":26,"pinLdr":45})", + sysconfig::Origin::Restore)); + TEST_ASSERT_EQUAL_STRING("from-esp32", cfg.hostname.c_str()); + TEST_ASSERT_EQUAL(53, cfg.panelWidth); TEST_ASSERT_EQUAL(8, cfg.panelHeight); + TEST_ASSERT_TRUE(cfg.panelWiring == Wiring::Rows); + TEST_ASSERT_EQUAL(-1, cfg.pinMatrix); TEST_ASSERT_EQUAL(0, cfg.pinBtnLeft); + TEST_ASSERT_EQUAL(28, cfg.pinLdr); + // Edited by hand, a pin past this chip's GPIOs is still out of range. + TEST_ASSERT_FALSE(put(R"({"pinLdr":35})")); + TEST_ASSERT_EQUAL_STRING("pinLdr", err.field.c_str()); + TEST_ASSERT_TRUE(put(R"({"panelHeight":11})", sysconfig::Origin::Restore)); + TEST_ASSERT_EQUAL(11, cfg.panelHeight); + // Boards with configurable panels are unchanged. + DeviceConfig esp; + TEST_ASSERT_TRUE(sysconfig::apply(esp, api::JsonReader(R"({"panelWidth":64,"panelHeight":16})"), + applied, err, sysconfig::Origin::Interactive, + pins::esp32Profile())); + TEST_ASSERT_EQUAL(64, esp.panelWidth); TEST_ASSERT_EQUAL(16, esp.panelHeight); +} +void fixed_board_adopted_at_boot() { + const auto& soc = pins::rp2040Profile(); + // What an earlier build may have stored: another pin map (I2C on 4/5) and panel size. + DeviceConfig cfg; + cfg.setPinSet(pins::esp32Profile().defaults); + cfg.pinI2cSda = 4; cfg.pinI2cScl = 5; + cfg.panelWidth = 64; cfg.panels = 2; cfg.panelHeight = 16; + int applied = 0; sysconfig::ApplyError err; + TEST_ASSERT_FALSE(sysconfig::apply(cfg, api::JsonReader(R"({"debugMode":true})"), applied, err, + sysconfig::Origin::Interactive, soc)); + sysconfig::adoptFixedBoard(cfg, soc); + TEST_ASSERT_EQUAL(-1, cfg.pinI2cSda); TEST_ASSERT_EQUAL(-1, cfg.pinI2cScl); + TEST_ASSERT_EQUAL(28, cfg.pinLdr); TEST_ASSERT_EQUAL(-1, cfg.pinBuzzer); + TEST_ASSERT_EQUAL(53, cfg.panelWidth); TEST_ASSERT_EQUAL(1, cfg.panels); + TEST_ASSERT_EQUAL(11, cfg.panelHeight); + TEST_ASSERT_TRUE(sysconfig::apply(cfg, api::JsonReader(R"({"debugMode":true})"), applied, err, + sysconfig::Origin::Interactive, soc)); + cfg.panelHeight = 8; + sysconfig::adoptFixedBoard(cfg, soc); + TEST_ASSERT_EQUAL(8, cfg.panelHeight); + // A board whose pins and panel are the user's is left alone. + DeviceConfig esp; + esp.pinI2cSda = 17; esp.panelWidth = 64; esp.panelHeight = 16; + sysconfig::adoptFixedBoard(esp, pins::esp32Profile()); + TEST_ASSERT_EQUAL(17, esp.pinI2cSda); TEST_ASSERT_EQUAL(64, esp.panelWidth); + TEST_ASSERT_EQUAL(16, esp.panelHeight); +} +void restore_creates_nested_asset_directories() { + DeviceConfig cfg; StateStore state; std::string err; + backup::LittleFsRestoreSink sink(cfg, &state); + testDirs.clear(); + TEST_ASSERT_TRUE(sink.beginFile("/ICONS/sub/deeper/smile.gif", err)); + TEST_ASSERT_TRUE(sink.writeFile(reinterpret_cast("GIF8"), 4)); + TEST_ASSERT_TRUE(sink.endFile()); + TEST_ASSERT_EQUAL_STRING("GIF8", testFiles["/ICONS/sub/deeper/smile.gif"].c_str()); + TEST_ASSERT_TRUE(testDirs.count("/ICONS") && testDirs.count("/ICONS/sub") && + testDirs.count("/ICONS/sub/deeper")); + TEST_ASSERT_TRUE(sink.beginFile("/SCRIPTS/demo.be", err)); sink.abortFile(); + TEST_ASSERT_FALSE(sink.beginFile("/ICONS/sub/", err)); + TEST_ASSERT_FALSE(sink.beginFile("/ICONS//x.gif", err)); + TEST_ASSERT_FALSE(sink.beginFile("/apploop.json", err)); + TEST_ASSERT_FALSE(sink.beginFile("/ICONSX/x.gif", err)); +} +void restore_and_disabled_stores() { + DeviceConfig cfg; StateStore state; std::string err; + backup::LittleFsRestoreSink sink(cfg, &state); + TEST_ASSERT_TRUE(sink.applyWifi("restored", "test-pass", err)); + TEST_ASSERT_TRUE(cfg.wifiSsid.empty()); sink.commit(); + DeviceConfig rebooted; rebooted.load(); TEST_ASSERT_EQUAL_STRING("restored", rebooted.wifiSsid.c_str()); + testFiles["/ICONS/test.gif"] = "old"; + TEST_ASSERT_TRUE(sink.beginFile("/ICONS/test.gif", err)); + TEST_ASSERT_TRUE(sink.writeFile(reinterpret_cast("new"), 3)); + sink.abortFile(); TEST_ASSERT_EQUAL_STRING("old", testFiles["/ICONS/test.gif"].c_str()); + TEST_ASSERT_TRUE(sink.beginFile("/ICONS/test.gif", err)); + TEST_ASSERT_TRUE(sink.writeFile(reinterpret_cast("new"), 3)); + TEST_ASSERT_TRUE(sink.endFile()); TEST_ASSERT_EQUAL_STRING("new", testFiles["/ICONS/test.gif"].c_str()); + TEST_ASSERT_FALSE(sink.beginFile("/NVS/awtrix-cfg.bin", err)); + TEST_ASSERT_FALSE(sink.beginFile("/ICONS/../bad", err)); + // ScriptStore is the shared LittleFS one now that the Pico runs scripts; it needs directory + // listing this fake filesystem does not model, so it is exercised on the device (smoke.sh). + radiostore::save("[]"); TEST_ASSERT_FALSE(testFiles.count("/radio.json")); +} +int main() { + UNITY_BEGIN(); + RUN_TEST(legacy_panel_height_is_ignored_and_removed); + RUN_TEST(panel_height_uses_fresh_key); + RUN_TEST(config_and_settings_reboot_roundtrip); + RUN_TEST(failed_writes_keep_last_config); + RUN_TEST(restore_and_disabled_stores); + RUN_TEST(restore_creates_nested_asset_directories); + RUN_TEST(fixed_board_system_config); + RUN_TEST(fixed_board_adopted_at_boot); + return UNITY_END(); +} diff --git a/test/test_pico_system/test_main.cpp b/test/test_pico_system/test_main.cpp new file mode 100644 index 00000000..d0b114e0 --- /dev/null +++ b/test/test_pico_system/test_main.cpp @@ -0,0 +1,72 @@ +#include +#include +#include "system/TimeConfig.h" +#include "system/PicoSleep.h" +#include "system/PicoResetReason.h" +#include "system/DevicePageServices.h" + +void setUp() {} +void tearDown() {} +static void time_config() { + awtrix::TimeConfig c; + TEST_ASSERT_TRUE(c.update("UTC0", "pool.ntp.org")); + const char* owned = c.server().c_str(); + TEST_ASSERT_FALSE(c.update("UTC0", "pool.ntp.org")); + TEST_ASSERT_EQUAL_PTR(owned, c.server().c_str()); + TEST_ASSERT_TRUE(c.update("EST5EDT,M3.2.0,M11.1.0", "pool.ntp.org")); + TEST_ASSERT_TRUE(c.update("EST5EDT,M3.2.0,M11.1.0", "time.example")); + TEST_ASSERT_FALSE(c.needsUpdate(c.timezone(), c.server())); + TEST_ASSERT_TRUE(c.update(c.timezone(), c.server(), true)); + TEST_ASSERT_EQUAL_STRING("time.example", c.server().c_str()); +} +static void clock_state() { + awtrix::RenderCtx ctx; + awtrix::DevicePageClock::fillAt(ctx, 42, 0); + TEST_ASSERT_EQUAL_INT64(-1, ctx.epochMs); + TEST_ASSERT_EQUAL_INT64(42, ctx.nowMs); + std::tm local{}; + local.tm_year = 124; local.tm_mon = 6; local.tm_mday = 1; + local.tm_hour = 12; local.tm_min = 34; local.tm_isdst = -1; + const int64_t epochMs = static_cast(std::mktime(&local)) * 1000 + 321; + awtrix::DevicePageClock::fillAt(ctx, 45, epochMs); + TEST_ASSERT_EQUAL_INT64(epochMs, ctx.epochMs); + TEST_ASSERT_EQUAL_INT(2024, ctx.year); + TEST_ASSERT_EQUAL_INT(7, ctx.month); + TEST_ASSERT_EQUAL_INT(1, ctx.mday); + TEST_ASSERT_EQUAL_INT(12, ctx.hour); + TEST_ASSERT_EQUAL_INT(34, ctx.minute); +} +static void reset_mapping() { + enum class R { UNKNOWN_RESET, PWRON_RESET, RUN_PIN_RESET, SOFT_RESET, + WDT_RESET, DEBUG_RESET, GLITCH_RESET, BROWNOUT_RESET }; + using awtrix::platform::picoResetReasonName; + TEST_ASSERT_EQUAL_STRING("poweron", picoResetReasonName(R::PWRON_RESET)); + TEST_ASSERT_EQUAL_STRING("external", picoResetReasonName(R::RUN_PIN_RESET)); + TEST_ASSERT_EQUAL_STRING("software", picoResetReasonName(R::SOFT_RESET)); + TEST_ASSERT_EQUAL_STRING("watchdog", picoResetReasonName(R::WDT_RESET)); + TEST_ASSERT_EQUAL_STRING("external", picoResetReasonName(R::DEBUG_RESET)); + TEST_ASSERT_EQUAL_STRING("brownout", picoResetReasonName(R::BROWNOUT_RESET)); + TEST_ASSERT_EQUAL_STRING("unknown", picoResetReasonName(R::GLITCH_RESET)); + TEST_ASSERT_EQUAL_STRING("unknown", picoResetReasonName(R::UNKNOWN_RESET)); +} +static void sleep_wake() { + awtrix::PicoSleep timer(100, 1000, false); + TEST_ASSERT_FALSE(timer.wake(1099, false)); + TEST_ASSERT_TRUE(timer.wake(1100, false)); + awtrix::PicoSleep held(100, 1000, true); + TEST_ASSERT_FALSE(held.wake(110, true)); + TEST_ASSERT_FALSE(held.wake(120, false)); + TEST_ASSERT_TRUE(held.wake(130, true)); + awtrix::PicoSleep press(100, 1000, false); + TEST_ASSERT_TRUE(press.wake(101, true)); + awtrix::PicoSleep longSleep(100, std::numeric_limits::max(), false); + TEST_ASSERT_FALSE(longSleep.wake(1000, false)); +} +int main() { + UNITY_BEGIN(); + RUN_TEST(time_config); + RUN_TEST(clock_state); + RUN_TEST(reset_mapping); + RUN_TEST(sleep_wake); + return UNITY_END(); +} diff --git a/test/test_pico_udp/compat/WiFi.h b/test/test_pico_udp/compat/WiFi.h new file mode 100644 index 00000000..acc58ec8 --- /dev/null +++ b/test/test_pico_udp/compat/WiFi.h @@ -0,0 +1,7 @@ +#pragma once +#include "WiFiUdp.h" +struct TestWiFi { + IPAddress localIP() { return IPAddress(42); } + void macAddress(uint8_t* mac) { for (int i = 0; i < 6; ++i) mac[i] = i; } +}; +inline TestWiFi WiFi; diff --git a/test/test_pico_udp/compat/WiFiUdp.h b/test/test_pico_udp/compat/WiFiUdp.h new file mode 100644 index 00000000..a72f4454 --- /dev/null +++ b/test/test_pico_udp/compat/WiFiUdp.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include +#include +class IPAddress { + public: + explicit IPAddress(uint32_t ip = 0) : ip_(ip) {} + operator uint32_t() const { return ip_; } + uint8_t operator[](int i) const { return static_cast(ip_ >> (8 * i)); } + private: + uint32_t ip_; +}; +class WiFiUDP { + public: + inline static std::vector incoming, sent; + inline static size_t pos = 0; + inline static uint16_t listen = 0, destination = 0; + inline static uint32_t peer = 42, recipient = 0; + inline static bool consumed = false, bindOk = true, sendOk = true; + int begin(uint16_t p) { listen = p; return bindOk; } + void stop() { listen = 0; } + int parsePacket() { if (consumed) return 0; consumed = true; pos = 0; return incoming.size(); } + IPAddress remoteIP() { return IPAddress(peer); } + int read(unsigned char* out, size_t cap) { + const auto n = std::min(cap, incoming.size() - pos); + std::copy_n(incoming.data() + pos, n, out); pos += n; return n; + } + int read() { return pos < incoming.size() ? incoming[pos++] : -1; } + int available() { return incoming.size() - pos; } + int beginPacket(IPAddress ip, uint16_t p) { recipient = ip; destination = p; return sendOk; } + size_t write(const uint8_t* data, size_t len) { sent.assign(data, data + len); return len; } + int endPacket() { return sendOk; } +}; diff --git a/test/test_pico_udp/test_main.cpp b/test/test_pico_udp/test_main.cpp new file mode 100644 index 00000000..22c6a97d --- /dev/null +++ b/test/test_pico_udp/test_main.cpp @@ -0,0 +1,66 @@ +#include +#define AWTRIX_PLATFORM_RP2040 +#include "transport/net/UdpSocket.cpp" +#include "transport/net/DiscoveryService.cpp" +#include "transport/net/ArtnetService.cpp" +void setUp() { + WiFiUDP::incoming.clear(); WiFiUDP::sent.clear(); + WiFiUDP::consumed = false; WiFiUDP::bindOk = WiFiUDP::sendOk = true; +} +void tearDown() {} +static void socket_contract() { + awtrix::UdpSocket s; + char b[2]; + TEST_ASSERT_EQUAL_INT(-1, s.receive(b, 2)); + TEST_ASSERT_FALSE(s.replyTo(4211, "x", 1)); + TEST_ASSERT_TRUE(s.open(4210)); + WiFiUDP::incoming = {1,2,3,4}; + TEST_ASSERT_EQUAL_INT(2, s.receive(b, 2)); + TEST_ASSERT_EQUAL_INT(1, b[0]); + TEST_ASSERT_EQUAL_INT(2, b[1]); + TEST_ASSERT_EQUAL_INT(0, s.receive(b, 2)); + TEST_ASSERT_EQUAL_INT(4, WiFiUDP::pos); + TEST_ASSERT_TRUE(s.replyTo(4211, "x", 1)); + TEST_ASSERT_EQUAL_INT(4211, WiFiUDP::destination); + TEST_ASSERT_EQUAL_UINT32(WiFiUDP::peer, WiFiUDP::recipient); + s.close(); + TEST_ASSERT_FALSE(s.replyTo(4211, "x", 1)); + WiFiUDP::bindOk = false; + TEST_ASSERT_FALSE(s.open(4210)); +} +static void discovery() { + awtrix::DiscoveryService d; + d.begin("awtrix-test", 8080); + const char q[] = "FIND_AWTRIXNG"; + WiFiUDP::incoming.assign(q, q + sizeof(q)); + d.tick(); + const std::string reply(WiFiUDP::sent.begin(), WiFiUDP::sent.end()); + TEST_ASSERT_EQUAL_STRING("awtrix-test:8080", reply.c_str()); + TEST_ASSERT_EQUAL_INT(4211, WiFiUDP::destination); +} +static void artnet_frame_and_timeout() { + awtrix::ArtnetService a; + awtrix::Canvas c(53,11); + a.begin(); + TEST_ASSERT_EQUAL_INT(6454, WiFiUDP::listen); + WiFiUDP::incoming = {'A','r','t','-','N','e','t',0, 0,0x50, 0,14, 0,0, 0,0, 0,3, 255,0,0}; + TEST_ASSERT_TRUE(a.tick(c, 100)); + TEST_ASSERT_EQUAL_HEX32(0xFF0000, c.getPixel(0, 0)); + TEST_ASSERT_EQUAL_HEX32(0, c.getPixel(1, 0)); + WiFiUDP::incoming[14] = 1; // universe one starts at pixel 170, not 512 + WiFiUDP::incoming[18] = 0; WiFiUDP::incoming[19] = 255; + WiFiUDP::consumed = false; + TEST_ASSERT_TRUE(a.tick(c, 100)); + TEST_ASSERT_EQUAL_HEX32(0x00FF00, c.getPixel(170 % 53, 170 / 53)); + TEST_ASSERT_TRUE(a.tick(c, 5099)); + TEST_ASSERT_FALSE(a.tick(c, 5100)); + a.end(); + TEST_ASSERT_FALSE(a.tick(c, 5101)); +} +int main() { + UNITY_BEGIN(); + RUN_TEST(socket_contract); + RUN_TEST(discovery); + RUN_TEST(artnet_frame_and_timeout); + return UNITY_END(); +} diff --git a/test/test_pico_wifi/test_main.cpp b/test/test_pico_wifi/test_main.cpp new file mode 100644 index 00000000..95541281 --- /dev/null +++ b/test/test_pico_wifi/test_main.cpp @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include "platform/rp2040/WifiCompat.h" +#include "core/net/HostName.h" + +namespace { +struct Ap { std::string ssid; int rssi; uint8_t bssid[6]; }; +struct Wifi { + enum Mode { Sta, ApSta } current = Sta; + int ip = 0, dns = 0, gateway = 0, subnet = 0, dns2 = 0; + int joins = 0, apTearDowns = 0, scans = 0, scanDeletes = 0; + std::string ssid, password; + std::vector air; // what a scan finds + const uint8_t* pinned = nullptr; // BSSID passed to the last begin() + uint8_t pinnedCopy[6] = {}; + void config(int i, int d, int g, int s) { ip = i; dns = d; gateway = g; subnet = s; } + void setDNS(int d, int d2) { dns = d; dns2 = d2; } + void mode(Mode m) { current = m; } + int scanNetworks(bool async) { TEST_ASSERT_FALSE(async); ++scans; return static_cast(air.size()); } + const char* SSID(uint8_t i) { return air[i].ssid.c_str(); } + int RSSI(uint8_t i) { return air[i].rssi; } + uint8_t* BSSID(uint8_t i, uint8_t* out) { memcpy(out, air[i].bssid, 6); return out; } + void scanDelete() { ++scanDeletes; } + int powerSaveOffs = 0; + void noLowPowerMode() { ++powerSaveOffs; } + // Pinned core: softAP() on a running AP fails and rolls the AP back down. + bool apUp = false; int apStarts = 0; + bool disconnectAP() { const bool was = apUp; apUp = false; return was; } + bool softAP(const char*) { ++apStarts; apUp = !apUp; return apUp; } + struct Addr { bool set; explicit operator bool() const { return set; } }; + Addr softAPIP() const { return Addr{apUp}; } + void begin(const char* s, const char* p, const uint8_t* bssid = nullptr) { + // Pinned arduino-pico _beginInternal: end() unless AP_STA, then sets STA. + if (current != ApSta) ++apTearDowns; + ++joins; ssid = s; password = p; current = Sta; + pinned = bssid; + if (bssid) memcpy(pinnedCopy, bssid, 6); + } +}; +Ap ap(const char* ssid, int rssi, uint8_t last) { return Ap{ssid, rssi, {2, 0, 0, 0, 0, last}}; } +void static_ip_uses_pico_order_and_both_dns_servers() { + Wifi w; + awtrix::platform::pico::configureStatic(w, 10, 20, 30, 40, 50); + TEST_ASSERT_EQUAL(10, w.ip); TEST_ASSERT_EQUAL(20, w.gateway); + TEST_ASSERT_EQUAL(30, w.subnet); TEST_ASSERT_EQUAL(40, w.dns); + TEST_ASSERT_EQUAL(50, w.dns2); +} +void repeated_ap_retries_preserve_portal_mode_and_credentials() { + Wifi w; + for (int i = 0; i < 3; ++i) { + awtrix::platform::pico::join(w, Wifi::ApSta, "test-network", "test-password"); + TEST_ASSERT_EQUAL(Wifi::ApSta, w.current); + } + TEST_ASSERT_EQUAL(3, w.joins); TEST_ASSERT_EQUAL(0, w.apTearDowns); + TEST_ASSERT_EQUAL_STRING("test-network", w.ssid.c_str()); + TEST_ASSERT_EQUAL_STRING("test-password", w.password.c_str()); +} +void station_reconnect_uses_stored_credentials() { + Wifi w; + awtrix::platform::pico::join(w, Wifi::Sta, "saved", ""); + TEST_ASSERT_EQUAL(Wifi::Sta, w.current); + TEST_ASSERT_EQUAL_STRING("saved", w.ssid.c_str()); + TEST_ASSERT_TRUE(w.password.empty()); +} +void join_never_pins_a_bssid_or_scans() { + // Pinned joins ("join" iovar) were refused by an eero node that plain joins reached; no pinning. + Wifi w; + w.air = {ap("home", -86, 1), ap("home", -52, 3)}; + awtrix::platform::pico::join(w, Wifi::Sta, "home", "pw"); + TEST_ASSERT_NULL(w.pinned); + TEST_ASSERT_EQUAL(0, w.scans); + TEST_ASSERT_EQUAL(1, w.joins); + TEST_ASSERT_EQUAL(1, w.powerSaveOffs); // ESP32 parity: no Wi-Fi power save +} +void a_join_in_progress_is_not_restarted_before_its_timeout() { + using awtrix::platform::pico::joinDue; + TEST_ASSERT_TRUE(joinDue(0, 0, false, 15000)); // never joined: go + TEST_ASSERT_FALSE(joinDue(5000, 0, true, 15000)); // the old bug: every 5 s check restarted it + TEST_ASSERT_FALSE(joinDue(14999, 0, true, 15000)); + TEST_ASSERT_TRUE(joinDue(15000, 0, true, 15000)); + TEST_ASSERT_FALSE(joinDue(5000, 0xFFFFF000u, true, 15000)); // millis() wrapped: 9096 ms elapsed + TEST_ASSERT_TRUE(joinDue(12000, 0xFFFFF000u, true, 15000)); // 16096 ms elapsed +} +void ap_restarts_cleanly_after_a_paused_join() { + using awtrix::platform::pico::startAp; + Wifi w; + TEST_ASSERT_TRUE(startAp(w, Wifi::ApSta, "awtrixng-aabbcc")); // first start + TEST_ASSERT_EQUAL(Wifi::ApSta, w.current); + awtrix::platform::pico::join(w, Wifi::Sta, "saved", ""); // station-only join leaves the AP up + TEST_ASSERT_TRUE(w.apUp); + TEST_ASSERT_TRUE(startAp(w, Wifi::ApSta, "awtrixng-aabbcc")); // the bug: this second start failed + TEST_ASSERT_TRUE(w.apUp); + TEST_ASSERT_EQUAL(2, w.apStarts); +} +struct Ip { + bool set; const char* text; + explicit operator bool() const { return set; } + std::string toString() const { return text; } +}; +void unset_address_reads_as_zeros() { + using awtrix::platform::pico::addressText; + TEST_ASSERT_EQUAL_STRING("0.0.0.0", addressText(Ip{false, "(IP unset)"}).c_str()); + TEST_ASSERT_EQUAL_STRING("192.168.4.1", addressText(Ip{true, "192.168.4.1"}).c_str()); +} +void default_ap_and_mdns_share_mac_suffix() { + const auto name = awtrix::net::effectiveHostname("", "00:11:22:AA:BB:CC"); + TEST_ASSERT_EQUAL_STRING("awtrixng-aabbcc", name.c_str()); + TEST_ASSERT_EQUAL_STRING("kitchen", awtrix::net::effectiveHostname("kitchen", "00:11:22:AA:BB:CC").c_str()); +} +} +void setUp() {} +void tearDown() {} +int main() { + UNITY_BEGIN(); + RUN_TEST(static_ip_uses_pico_order_and_both_dns_servers); + RUN_TEST(repeated_ap_retries_preserve_portal_mode_and_credentials); + RUN_TEST(station_reconnect_uses_stored_credentials); + RUN_TEST(join_never_pins_a_bssid_or_scans); + RUN_TEST(a_join_in_progress_is_not_restarted_before_its_timeout); + RUN_TEST(ap_restarts_cleanly_after_a_paused_join); + RUN_TEST(unset_address_reads_as_zeros); + RUN_TEST(default_ap_and_mdns_share_mac_suffix); + return UNITY_END(); +} diff --git a/test/test_picohostlookup/test_picohostlookup.cpp b/test/test_picohostlookup/test_picohostlookup.cpp new file mode 100644 index 00000000..141ed945 --- /dev/null +++ b/test/test_picohostlookup/test_picohostlookup.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include "platform/rp2040/BoundedHostLookup.h" + +namespace { +struct Address { + uint32_t value = 0; + Address() = default; + Address(uint8_t a, uint8_t b, uint8_t c, uint8_t d) + : value((uint32_t(a) << 24) | (uint32_t(b) << 16) | (uint32_t(c) << 8) | d) {} + explicit operator uint32_t() const { return value; } +}; +struct Wifi { + bool connected = true; + std::string answer = "broker"; + std::vector queries; + std::vector timeouts; + bool isConnected() const { return connected; } + int hostByName(const char* host, Address& out, int timeout) { + queries.emplace_back(host); + timeouts.push_back(timeout); + if (answer != host) return 0; + out = Address(192, 0, 2, 4); + return 1; + } +}; +using Lookup = awtrix::platform::pico::BoundedHostLookup

; + +void literals_and_cache_are_keyed_by_host() { + Wifi wifi; + Lookup lookup; + TEST_ASSERT_TRUE(lookup.resolve(wifi, "192.0.2.1")); + TEST_ASSERT_EQUAL_UINT32(0xc0000201, uint32_t(lookup.address())); + TEST_ASSERT_TRUE(wifi.queries.empty()); + TEST_ASSERT_TRUE(lookup.resolve(wifi, "broker")); + TEST_ASSERT_TRUE(lookup.resolve(wifi, "broker")); + TEST_ASSERT_EQUAL_UINT(1, wifi.queries.size()); + TEST_ASSERT_EQUAL_INT(1000, wifi.timeouts[0]); + TEST_ASSERT_EQUAL_UINT32(0xc0000204, uint32_t(lookup.address())); + lookup.forget(); + TEST_ASSERT_TRUE(lookup.resolve(wifi, "broker")); + TEST_ASSERT_EQUAL_UINT(2, wifi.queries.size()); +} +void local_falls_back_once_with_bounded_calls() { + Wifi wifi; + Lookup lookup; + TEST_ASSERT_TRUE(lookup.resolve(wifi, "broker.local")); + TEST_ASSERT_EQUAL_UINT(2, wifi.queries.size()); + TEST_ASSERT_EQUAL_STRING("broker.local", wifi.queries[0].c_str()); + TEST_ASSERT_EQUAL_STRING("broker", wifi.queries[1].c_str()); + for (int timeout : wifi.timeouts) TEST_ASSERT_EQUAL_INT(1000, timeout); + lookup.forget(); + wifi.answer = "broker.local"; + wifi.queries.clear(); + TEST_ASSERT_TRUE(lookup.resolve(wifi, "broker.local")); + TEST_ASSERT_EQUAL_UINT(1, wifi.queries.size()); +} +void failure_and_wifi_loss_cannot_reuse_stale_address() { + Wifi wifi; + Lookup lookup; + TEST_ASSERT_TRUE(lookup.resolve(wifi, "broker")); + wifi.connected = false; + TEST_ASSERT_FALSE(lookup.resolve(wifi, "broker")); + TEST_ASSERT_EQUAL_INT(int(awtrix::net::LinkError::NoWifi), int(lookup.error())); + TEST_ASSERT_EQUAL_UINT32(0, uint32_t(lookup.address())); + wifi.connected = true; + TEST_ASSERT_FALSE(lookup.resolve(wifi, "missing.local")); + TEST_ASSERT_EQUAL_UINT(3, wifi.queries.size()); + TEST_ASSERT_EQUAL_INT(int(awtrix::net::LinkError::HostNotFound), int(lookup.error())); + TEST_ASSERT_FALSE(lookup.resolve(wifi, "")); + TEST_ASSERT_FALSE(lookup.resolve(wifi, "0.0.0.0")); + TEST_ASSERT_EQUAL_UINT(3, wifi.queries.size()); + TEST_ASSERT_TRUE(lookup.resolve(wifi, "broker")); + TEST_ASSERT_EQUAL_INT(int(awtrix::net::LinkError::None), int(lookup.error())); +} +} +void setUp() {} +void tearDown() {} +int main() { + UNITY_BEGIN(); + RUN_TEST(literals_and_cache_are_keyed_by_host); + RUN_TEST(local_falls_back_once_with_bounded_calls); + RUN_TEST(failure_and_wifi_loss_cannot_reuse_stale_address); + return UNITY_END(); +} diff --git a/test/test_pins/test_pins.cpp b/test/test_pins/test_pins.cpp index 38fb41c8..ebc1463e 100644 --- a/test/test_pins/test_pins.cpp +++ b/test/test_pins/test_pins.cpp @@ -3,6 +3,7 @@ #include #include "core/PinRules.h" +#include "platform/MatrixPins.h" using namespace awtrix; diff --git a/test/test_renderpipeline/test_renderpipeline.cpp b/test/test_renderpipeline/test_renderpipeline.cpp index b691b497..2e0913f2 100644 --- a/test/test_renderpipeline/test_renderpipeline.cpp +++ b/test/test_renderpipeline/test_renderpipeline.cpp @@ -76,6 +76,7 @@ struct FakeIcon : IPageIcon { for (int x = 0; x < w; ++x) dst.setPixel(x + xOffset, y + yOffset, color); } int width() const override { return w; } + int height() const override { return 8; } std::unique_ptr create() const override { if (!factoryOk || clears < factoryMinClears) return nullptr; auto child = std::make_unique(); @@ -1288,8 +1289,50 @@ static void test_a_pushed_icon_carries_the_whole_gap_off_the_panel() { TEST_ASSERT_EQUAL_INT(-11, furthest); } +// Compare every pixel with the same page on an eight-row panel. Guard words +// around the external canvas catch writes beyond the physical framebuffer. +static void checkTallPage(bool notification, const char* font) { + Rig shortRig(53, 8), tallRig(53, 11); + std::vector guarded(53 * 11 + 2, 0xDEADBEEFu); + Canvas tall(53, 11, guarded.data() + 1); + const std::string payload = std::string("{\"text\":\"") + + (notification ? "AAAAAAAAAAAAAAAAAAAAAAAAAAAA" : "A") + + "\",\"icon\":\"1\",\"font\":\"" + font + "\"}"; + for (Rig* r : {&shortRig, &tallRig}) { + r->engine.execute(cmd(notification ? CommandType::Notify : CommandType::SetPushedApp, + notification ? "" : "band", payload)); + if (!notification) r->engine.execute(switchFast("band")); + r->engine.tick(0); + } + float initial = 0; + for (int t : {0, 500, 2000}) { + shortRig.pipe->renderFrame(shortRig.canvas, t); + tallRig.pipe->renderFrame(tall, t); + if (t == 0) initial = tallRig.pipe->textX(); + for (int y = 0; y < 11; ++y) + for (int x = 0; x < 53; ++x) + TEST_ASSERT_EQUAL_HEX32(y >= 1 && y < 9 ? shortRig.canvas.getPixel(x, y - 1) : 0, + tall.getPixel(x, y)); + TEST_ASSERT_EQUAL_HEX32(0xDEADBEEFu, guarded.front()); + TEST_ASSERT_EQUAL_HEX32(0xDEADBEEFu, guarded.back()); + TEST_ASSERT_EQUAL_HEX32(0xABCDEFu, tall.getPixel(0, 1)); + } + if (notification) TEST_ASSERT_TRUE(tallRig.pipe->textX() < initial); +} + +static void test_tall_text_and_icon_band() { + checkTallPage(false, "small"); + checkTallPage(false, "large"); +} +static void test_tall_scrolling_notification_band() { + checkTallPage(true, "small"); + checkTallPage(true, "large"); +} + int main(int, char**) { UNITY_BEGIN(); + RUN_TEST(test_tall_text_and_icon_band); + RUN_TEST(test_tall_scrolling_notification_band); RUN_TEST(test_icon_gap_sets_where_static_text_starts); RUN_TEST(test_scrolling_text_never_enters_a_wider_icon_gap); RUN_TEST(test_a_wide_icon_reserves_its_own_width_plus_the_gap); diff --git a/test/test_settings/test_settings.cpp b/test/test_settings/test_settings.cpp index 567b3f32..9baa3f20 100644 --- a/test/test_settings/test_settings.cpp +++ b/test/test_settings/test_settings.cpp @@ -156,7 +156,7 @@ static void test_pure_black_and_white_are_representable() { static void test_panel_keys_do_not_live_on_settings() { const std::string o = reply(Settings{}); - for (const char* key : {"panelWidth", "panels", "panelStart", "panelWiring", + for (const char* key : {"panelWidth", "panelHeight", "panels", "panelStart", "panelWiring", "panelColorOrder", "panelSerpentine", "panelChainReverse", "panelChainSerpentine", "matrixWidth", "matrixLayout"}) TEST_ASSERT_FALSE_MESSAGE(hasKey(o, key), key); diff --git a/test/test_tall_effects/test_tall_effects.cpp b/test/test_tall_effects/test_tall_effects.cpp new file mode 100644 index 00000000..493c4f8d --- /dev/null +++ b/test/test_tall_effects/test_tall_effects.cpp @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +#include +#include "core/effects/effects/MoreEffects.h" + +using namespace awtrix; +void setUp() {} +void tearDown() {} + +#define FOR_EACH_SIZE for (int w : {32, 53}) for (int h = 8; h <= 16; ++h) + +static int findPixel(const Canvas& c, uint32_t colour, int& x, int& y) { + int n = 0; + for (int yy = 0; yy < c.height(); ++yy) for (int xx = 0; xx < c.width(); ++xx) + if (c.getPixel(xx, yy) == colour) { x = xx; y = yy; ++n; } + return n; +} + +static void test_brick_geometry() { + FOR_EACH_SIZE { + Canvas c(w, h); + BrickBreakerEffect e; + e.render(c, 0); + const int rows = h >= 11 ? 3 : 2; + for (int y = 0; y <= rows; ++y) { + std::vector runs; + int run = 0, first = -1, last = -1; + for (int x = 0; x <= w; ++x) { + const bool lit = x < w && c.getPixel(x, y) != 0; + if (lit) { run++; if (first < 0) first = x; last = x; } + else if (run) { runs.push_back(run); run = 0; } + } + if (y == rows) { TEST_ASSERT_EQUAL_INT(0, (int)runs.size()); continue; } + TEST_ASSERT_EQUAL_INT((w + 1) / 4, (int)runs.size()); + for (int r : runs) TEST_ASSERT_EQUAL_INT(3, r); // 3 lit ... + TEST_ASSERT_EQUAL_INT(4 * (int)runs.size() - 1, last - first + 1); // ... 1 dark per period + if (y) TEST_ASSERT_NOT_EQUAL(c.getPixel(first, y - 1), c.getPixel(first, y)); // own hue per row + } + } +} + +static void test_brick_play() { + FOR_EACH_SIZE { + Canvas c(w, h); + BrickBreakerEffect e; + fx::BrickGame g; + g.start(w, h, 0); + const int full = g.remaining; + std::vector rows(h, false); + std::set slopes; + int minBricks = full, px = -1, py = -1; + std::vector prev; + for (int f = 0; f < fx::kGameRound; ++f) { + e.render(c, f); + int bx = 0, by = 0; + TEST_ASSERT_EQUAL_INT(1, findPixel(c, fx::kBallColour, bx, by)); + TEST_ASSERT_EQUAL_INT(g.x, bx); + TEST_ASSERT_EQUAL_INT(g.y, by); + TEST_ASSERT_TRUE(g.brickAt(bx, by) < 0); // the ball never stands on a live brick + rows[by] = true; + if (f && std::abs(by - py) == 1) slopes.insert(std::abs(bx - px)); + if (!prev.empty()) { + // Brick pixels that vanished since the last frame form exactly one brick, or none. + std::vector gone; + for (int y = 0; y < g.rows; ++y) for (int x = 0; x < w; ++x) + if (prev[y * w + x] && prev[y * w + x] != fx::kBallColour && !c.getPixel(x, y)) gone.push_back(y * w + x); + TEST_ASSERT_TRUE(gone.empty() || gone.size() == 3); + if (gone.size() == 3) { + TEST_ASSERT_EQUAL_INT(gone[0] + 2, gone[2]); + TEST_ASSERT_EQUAL_INT(0, (gone[0] % w - g.left) % 4); + } + } + prev.assign(c.data(), c.data() + c.size()); + minBricks = std::min(minBricks, g.remaining); + px = bx; py = by; + const int before = g.remaining; + g.tick(); + TEST_ASSERT_TRUE(g.remaining == before || g.remaining == before - 1 || g.remaining == full); + } + TEST_ASSERT_TRUE(minBricks < full); + TEST_ASSERT_TRUE(std::count(rows.begin(), rows.end(), true) > h / 2); + TEST_ASSERT_TRUE(slopes.count(1) && slopes.count(2)); // 45 degrees and 2 across per 1 down + e.render(c, 0); + std::vector first(c.data(), c.data() + c.size()); + e.render(c, fx::kGameRound); // a new round starts with a full wall again + fx::BrickGame next; + next.start(w, h, 1); + TEST_ASSERT_EQUAL_INT(full, next.remaining); + for (int y = 0; y < g.rows; ++y) for (int x = 0; x < w; ++x) + TEST_ASSERT_EQUAL_HEX32(first[y * w + x], c.getPixel(x, y)); + } +} + +static void test_snake_game() { + FOR_EACH_SIZE { + Canvas c(w, h); + SnakeEffect e; + fx::SnakeGame g; + g.start(w, h, 0); + TEST_ASSERT_TRUE(g.len >= 3 && g.len <= 4); + std::vector rows(h, false); + int eats = 0, moves = 0, closer = 0; + for (int f = 0; f < fx::kGameRound; ++f) { + e.render(c, f); + int fx_ = 0, fy = 0; + TEST_ASSERT_EQUAL_INT(1, findPixel(c, fx::kSnakeFood, fx_, fy)); // food drawn, not covered + TEST_ASSERT_EQUAL_INT(g.ox + g.foodX, fx_); + TEST_ASSERT_EQUAL_INT(g.oy + g.foodY, fy); + int lit = 0; + for (int y = 0; y < h; ++y) for (int x = 0; x < w; ++x) lit += c.getPixel(x, y) != 0; + TEST_ASSERT_EQUAL_INT(g.len + 1, lit); // every segment on its own pixel, plus the food + for (int i = 0; i < g.len; ++i) { + TEST_ASSERT_FALSE(g.segX[i] == g.foodX && g.segY[i] == g.foodY); + for (int j = 0; j < i; ++j) TEST_ASSERT_FALSE(g.segX[i] == g.segX[j] && g.segY[i] == g.segY[j]); + if (i) TEST_ASSERT_EQUAL_INT(1, std::abs(g.segX[i] - g.segX[i - 1]) + std::abs(g.segY[i] - g.segY[i - 1])); + } + rows[g.oy + g.segY[0]] = true; + const int len = g.len, foodX = g.foodX, foodY = g.foodY; + const uint32_t games = g.games; + const int dist = std::abs(g.segX[0] - foodX) + std::abs(g.segY[0] - foodY); + g.tick(); + if (g.games != games) continue; // stuck or full: a fresh game + if (g.len != len) { + ++eats; + TEST_ASSERT_EQUAL_INT(len + 1, g.len); + TEST_ASSERT_TRUE(g.foodX != foodX || g.foodY != foodY); + } else { + ++moves; + closer += std::abs(g.segX[0] - foodX) + std::abs(g.segY[0] - foodY) < dist; + } + } + TEST_ASSERT_TRUE(eats > 3); + TEST_ASSERT_TRUE(closer * 10 > moves * 7); + TEST_ASSERT_EQUAL_INT(h, std::count(rows.begin(), rows.end(), true)); + } +} + +static void test_snake_body_gradient() { + Canvas c(32, 8); + SnakeEffect e; + e.render(c, 0); + fx::SnakeGame g; + g.start(32, 8, 0); + TEST_ASSERT_NOT_EQUAL(c.getPixel(g.segX[0], g.segY[0]), c.getPixel(g.segX[g.len - 1], g.segY[g.len - 1])); +} + +static void test_pingpong_paddles_and_ball() { + FOR_EACH_SIZE { + Canvas c(w, h); + PingPongEffect e; + fx::PongGame g; + g.start(w, h, 0); + const int paddle = h >= 11 ? 4 : 3; + std::vector ys; + int contacts = 0; + for (int f = 0; f < fx::kGameRound; ++f) { + e.render(c, f); + int bx = 0, by = 0; + TEST_ASSERT_EQUAL_INT(1, findPixel(c, fx::kPongBall, bx, by)); + TEST_ASSERT_TRUE(bx >= 1 && bx <= w - 2); + for (int side : {0, w - 1}) { + int n = 0, top = -1; + for (int y = 0; y < h; ++y) + if (c.getPixel(side, y) == fx::kPongPaddle) { if (top < 0) top = y; ++n; } + TEST_ASSERT_EQUAL_INT(paddle, n); + for (int y = top; y < top + paddle; ++y) TEST_ASSERT_EQUAL_HEX32(fx::kPongPaddle, c.getPixel(side, y)); + } + if (bx == 1) { TEST_ASSERT_EQUAL_HEX32(fx::kPongPaddle, c.getPixel(0, by)); ++contacts; } + if (bx == w - 2) { TEST_ASSERT_EQUAL_HEX32(fx::kPongPaddle, c.getPixel(w - 1, by)); ++contacts; } + ys.push_back(by); + } + TEST_ASSERT_TRUE(contacts >= 4); + // Two-tick windows away from the walls: 45 degrees moves 2 rows, the shallow angle 1. + std::set slopes; + for (size_t i = 2; i < ys.size(); ++i) + if (ys[i - 1] > 0 && ys[i - 1] < h - 1) slopes.insert(std::abs(ys[i] - ys[i - 2])); + TEST_ASSERT_TRUE(slopes.count(1) && slopes.count(2)); + } +} + +static double radius(Canvas& c) { + double sum = 0; int count = 0; + const double rx = (c.width() - 1) / 2.0, ry = (c.height() - 1) / 2.0; + for (int y = 0; y < c.height(); ++y) for (int x = 0; x < c.width(); ++x) { + if (!c.getPixel(x, y)) continue; + sum += std::hypot((x - rx) / rx, (y - ry) / ry); ++count; + } + TEST_ASSERT_TRUE(count > 0); + return sum / count; +} + +static void test_swirls_span_and_travel() { + for (int h : {8, 11, 16}) for (int w : {32, 53}) { + Canvas c(w, h); + SwirlInEffect in; SwirlOutEffect out; + for (IEffect* e : {static_cast(&in), static_cast(&out)}) { + e->render(c, 0); + int left = w, right = -1; + for (int y = 0; y < h; ++y) for (int x = 0; x < w; ++x) + if (c.getPixel(x, y)) { left = std::min(left, x); right = std::max(right, x); } + TEST_ASSERT_TRUE(right - left + 1 > w * .7); + const double before = radius(c); + e->render(c, 12); + const double after = radius(c); + TEST_ASSERT_TRUE(e == &in ? after < before : after > before); + } + } +} + +static void test_determinism_and_no_writes_outside_canvas() { + BrickBreakerEffect brick; SnakeEffect snake; PingPongEffect pong; SwirlInEffect in; SwirlOutEffect out; + for (int w : {4, 32, 53, 64, 80}) for (int h = 8; h <= 16; ++h) { + std::vector storage(w * h + 2, 0xDEADBEEFu); + Canvas c(w, h, storage.data() + 1), other(w, h); + for (IEffect* e : {static_cast(&brick), static_cast(&snake), static_cast(&pong), + static_cast(&in), static_cast(&out)}) { + for (int64_t f : {0LL, 1LL, 12LL, 127LL, 300LL, 511LL, 512LL, -5LL, 2147483648LL, 900000000000LL}) { + e->render(c, f); + e->render(other, f + 97); + e->render(other, f); + TEST_ASSERT_EQUAL_UINT32_ARRAY(c.data(), other.data(), c.size()); + TEST_ASSERT_EQUAL_HEX32(0xDEADBEEFu, storage.front()); + TEST_ASSERT_EQUAL_HEX32(0xDEADBEEFu, storage.back()); + } + } + } +} + +int main(int, char**) { + UNITY_BEGIN(); + RUN_TEST(test_brick_geometry); + RUN_TEST(test_brick_play); + RUN_TEST(test_snake_game); + RUN_TEST(test_snake_body_gradient); + RUN_TEST(test_pingpong_paddles_and_ball); + RUN_TEST(test_swirls_span_and_travel); + RUN_TEST(test_determinism_and_no_writes_outside_canvas); + return UNITY_END(); +} diff --git a/test/test_tone_samples/test_tone_samples.cpp b/test/test_tone_samples/test_tone_samples.cpp new file mode 100644 index 00000000..722fdb75 --- /dev/null +++ b/test/test_tone_samples/test_tone_samples.cpp @@ -0,0 +1,131 @@ +#include +#include "core/sound/ToneSamples.h" +#include "core/sound/AudioRouter.h" +#include "core/sound/NotificationSound.h" +#include "core/payload/PayloadParser.h" +#include "core/api/CapabilitiesJson.h" +#include +#include +using namespace awtrix; +void setUp() {} +void tearDown() {} + +static void waveform_and_volume() { + sound::ToneSamples full, half, silent, clamped; + full.setVolume(100); half.setVolume(50); silent.setVolume(0); clamped.setVolume(255); + for (auto* s : {&full, &half, &silent, &clamped}) TEST_ASSERT_TRUE(s->play("x:d=1,o=4,b=120:a")); + int positiveEdges = 0; + int16_t last = -1; + for (uint32_t i = 0; i < sound::ToneSamples::SampleRate; ++i) { + const auto a = full.next(); + TEST_ASSERT_EQUAL_INT(32767, std::abs(static_cast(a))); + TEST_ASSERT_EQUAL_INT(a > 0 ? 16383 : -16383, half.next()); + TEST_ASSERT_EQUAL_INT(0, silent.next()); + TEST_ASSERT_EQUAL_INT(a, clamped.next()); + if (a > 0 && last < 0) ++positiveEdges; + last = a; + } + TEST_ASSERT_EQUAL_INT(440, positiveEdges); + TEST_ASSERT_EQUAL_HEX32(0xffffFFFFu, sound::ToneSamples::stereo(-1)); + TEST_ASSERT_EQUAL_HEX32(0x12341234u, sound::ToneSamples::stereo(0x1234)); +} + +static void duration_rest_gap_and_completion() { + const std::string text = "s:d=4,o=6,b=125:c,p,c.,32g"; + const auto parsed = rtttl::parse(text); + sound::ToneSamples s; + s.setVolume(100); + TEST_ASSERT_TRUE(s.play(text)); + for (const auto& note : parsed.notes) { + const auto ms = rtttl::noteMs(note.duration, parsed.timeUnit); + const auto gap = note.frequency && ms > 12 ? 6u : 0u; + for (uint32_t i = 0; i < ms * 24; ++i) { + TEST_ASSERT_TRUE(s.playing()); + const auto sample = s.next(); + if (!note.frequency || i >= (ms - gap) * 24) TEST_ASSERT_EQUAL_INT(0, sample); + else TEST_ASSERT_NOT_EQUAL(0, sample); + } + } + TEST_ASSERT_FALSE(s.playing()); + TEST_ASSERT_EQUAL_INT(0, s.next()); +} + +static void replacement_stop_and_live_gain() { + sound::ToneSamples s; + s.setVolume(100); + TEST_ASSERT_FALSE(s.play("bad")); + TEST_ASSERT_FALSE(s.playing()); + TEST_ASSERT_TRUE(s.play("x::c")); + TEST_ASSERT_FALSE(s.play("bad")); + TEST_ASSERT_TRUE(s.playing()); + s.setVolume(0); + TEST_ASSERT_EQUAL_INT(0, s.next()); + s.setVolume(25); + TEST_ASSERT_EQUAL_INT(8191, std::abs(static_cast(s.next()))); + TEST_ASSERT_TRUE(s.play("s:d=4,o=6,b=125:c,e,g")); + TEST_ASSERT_EQUAL_INT(8191, s.next()); + s.stop(); + TEST_ASSERT_FALSE(s.playing()); + TEST_ASSERT_EQUAL_INT(0, s.next()); +} + +// Exercise the real payload selector/router with the real sample generator; +// only the device filesystem and I2S transport are replaced on the host. +class HostTone final : public sound::IToneSink { + public: + sound::ToneSamples samples; + bool fileRequested = false; + void begin() override {} + void setVolume(uint8_t value) override { samples.setVolume(value); } + bool playRtttl(const std::string& value) override { return samples.play(value); } + bool playMelodyFile(const std::string& name) override { + fileRequested = true; + return name == "alert" && samples.play("s:d=4,o=6,b=125:c,e,g"); + } + void stop() override { samples.stop(); } + void tick() override {} + bool isPlaying() const override { return samples.playing(); } +}; + +static void notification_routes_and_capabilities() { + HostTone sink; + sound::AudioRouter router; + router.setTone(&sink); + router.setVolumes(50, 100, 100, 100); + AppSpec spec; + DispatchDetail detail; + TEST_ASSERT_TRUE(payload::parse("{\"sound\":\"alert\"}", true, spec)); + auto request = sound::requestForSpec(spec); + TEST_ASSERT_TRUE(request.present); + TEST_ASSERT_TRUE(router.play(request.source, request.value, detail) == sound::PlayResult::Ok); + TEST_ASSERT_TRUE(sink.fileRequested); + TEST_ASSERT_EQUAL_INT(16383, sink.samples.next()); + sink.fileRequested = false; + TEST_ASSERT_TRUE(payload::parse( + "{\"sound\":\"missing\",\"soundRtttl\":\"s:d=4,o=6,b=125:c,e,g\"}", true, spec)); + request = sound::requestForSpec(spec); + TEST_ASSERT_TRUE(request.source == sound::Source::Rtttl); + TEST_ASSERT_TRUE(router.play(request.source, request.value, detail) == sound::PlayResult::Ok); + TEST_ASSERT_FALSE(sink.fileRequested); + TEST_ASSERT_EQUAL_INT(16383, sink.samples.next()); + router.setVolumes(0, 100, 100, 100); + TEST_ASSERT_EQUAL_INT(0, sink.samples.next()); + router.stop(sound::StopScope::All); + TEST_ASSERT_FALSE(router.isPlaying()); + router.setMuted(true); + TEST_ASSERT_TRUE(router.play(request.source, request.value, detail) == sound::PlayResult::Muted); + TEST_ASSERT_FALSE(router.isPlaying()); + const auto json = api::capabilitiesJson({}, {}, {}, router.caps()); + const std::string audio = "\"audio\":{\"buzzer\":true,\"track\":false,\"mp3\":false,\"radio\":false}"; + TEST_ASSERT_NOT_EQUAL(std::string::npos, json.find(audio)); + std::printf("tone-only capabilities: %s\n", audio.c_str()); +} + +int main() { + UNITY_BEGIN(); + RUN_TEST(notification_routes_and_capabilities); + RUN_TEST(waveform_and_volume); + RUN_TEST(duration_rest_gap_and_completion); + RUN_TEST(replacement_stop_and_live_gain); + return UNITY_END(); +} diff --git a/tools/check_builtin_registration.py b/tools/check_builtin_registration.py new file mode 100644 index 00000000..5cb58054 --- /dev/null +++ b/tools/check_builtin_registration.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +"""Verify both device entrypoints use the host-tested common built-in catalog.""" +import argparse +from pathlib import Path +import subprocess + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument('--revision', help='Check an older git revision (regression demonstration)') +args = parser.parse_args() +root = Path(__file__).resolve().parents[1] +for path, call in [('src/platform/rp2040/main_rp2040.cpp', 'builtins.addTo(apps, effects, overlays)'), + ('src/main.cpp', 'g_builtins.addTo(g_apps, g_effects, g_overlays)')]: + text = (subprocess.check_output(['git', 'show', f'{args.revision}:{path}'], cwd=root, text=True) + if args.revision else (root / path).read_text()) + assert 'capabilitiesJson({}, {}, {}' not in text, f'{path}: empty capabilities lists' + assert call in text, f'{path}: missing shared built-in registration' +print('PASS: ESP32/Pico entrypoints use identical host-tested built-in catalog') diff --git a/tools/check_partitions.py b/tools/check_partitions.py index 789298ae..ae322954 100644 --- a/tools/check_partitions.py +++ b/tools/check_partitions.py @@ -13,6 +13,8 @@ """ import glob +import configparser +from decimal import Decimal, InvalidOperation import os import subprocess import sys @@ -133,6 +135,46 @@ def find_idf_tool(): % (soc, flash_text) ) +# UF2 targets use framework linker layouts, not ESP-IDF partition tables. +# Check every inherited filesystem reservation, without environment-name exemptions. +config = configparser.ConfigParser(interpolation=None, inline_comment_prefixes=(';',)) +config.read(os.path.join(ROOT, "platformio.ini")) + + +def inherited_option(section, key, seen=()): + if section in seen: + raise ValueError("environment inheritance cycle: " + section) + if config.has_option(section, key): + return config.get(section, key).strip() + parents = config.get(section, "extends", fallback="").replace(',', ' ').split() + for parent in parents: + value = inherited_option(parent, key, seen + (section,)) + if value is not None: + return value + if section != "env" and config.has_option("env", key): + return config.get("env", key).strip() + return None + + +for section in config.sections(): + if not section.startswith("env:"): + continue + try: + size = inherited_option(section, "board_build.filesystem_size") + if size is None: + continue # ESP targets are checked through their generated tables above. + # arduino-pico sizes are MiB, e.g. 0.5m; unknown units fail, not skip. + if not size.lower().endswith('m'): + raise ValueError("filesystem size must use MiB (m)") + reserved = Decimal(size[:-1]) * 1024 * 1024 + check(reserved.is_finite() and reserved >= gp.MIN_SPIFFS, + "%s: filesystem reservation %s is below the 512 KiB floor" % (section, size)) + check(reserved.is_finite() and reserved % 4096 == 0, + "%s: filesystem reservation must be sector-aligned" % section) + print("%s: filesystem reservation %s bytes (framework linker layout)" % (section, reserved)) + except (ValueError, InvalidOperation, configparser.Error) as e: + failures.append("%s: %s" % (section, e)) + if failures: print("partition tables: %d problem(s)" % len(failures)) for f in failures: diff --git a/tools/container/Containerfile b/tools/container/Containerfile new file mode 100644 index 00000000..f41193aa --- /dev/null +++ b/tools/container/Containerfile @@ -0,0 +1,18 @@ +FROM docker.io/library/node:22-bookworm AS node +FROM docker.io/library/python:3.12 + +COPY --from=node /usr/local/bin/node /usr/local/bin/node +COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules +RUN ln -s ../lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \ + && ln -s ../lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx \ + && apt-get update \ + && apt-get install -y --no-install-recommends cmake ninja-build zip \ + && pip install --no-cache-dir platformio pyyaml + +# Mount the checkout at /w and persist downloaded toolchains in this volume. +# Docs dependencies are installed by ci-local.sh from the mounted checkout, +# keeping `podman build ... tools/container` independent of external files. +ENV PLATFORMIO_CORE_DIR=/root/.platformio +VOLUME /root/.platformio +WORKDIR /w +CMD ["bash"] diff --git a/tools/container/ci-local.sh b/tools/container/ci-local.sh new file mode 100755 index 00000000..db7f4027 --- /dev/null +++ b/tools/container/ci-local.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# Run from the repository root, inside the local CI image. +set -euo pipefail + +usage() { + printf 'Usage: %s {native|webui|docs|mkdocs|build ENV...|all}...\n' "$0" >&2 +} +if [[ ! -f platformio.ini || ! -f requirements-docs.txt ]]; then + printf 'Run this script from the repository root.\n' >&2 + exit 2 +fi +if (( $# == 0 )); then usage; exit 2; fi + +# Validate the entire request before doing any work. A build consumes environment +# names until the next subcommand, so groups can be freely combined. +steps=() +while (( $# )); do + case "$1" in + native|webui|docs|mkdocs) steps+=("$1"); shift ;; + all) + steps+=(native webui docs mkdocs build:awtrix build:awtrix_s3_octal build:native_sim build:galactic_unicorn build:galactic_unicorn_2w) + shift ;; + build) + shift + count=0 + while (( $# )); do + case "$1" in native|webui|docs|mkdocs|build|all) break ;; esac + if [[ ! "$1" =~ ^[A-Za-z0-9_][A-Za-z0-9_.-]*$ ]]; then + printf 'Invalid environment: %s\n' "$1" >&2; exit 2 + fi + steps+=("build:$1"); count=$((count + 1)); shift + done + if (( count == 0 )); then usage; exit 2; fi ;; + *) printf 'Unknown subcommand: %s\n' "$1" >&2; usage; exit 2 ;; + esac +done + +failed=0 +run_step() { + local label=$1 start=$SECONDS rc=0 + shift + printf '\n=== %s ===\n' "$label" + # Explicitly capture failures so later steps still run under errexit. + if "$@"; then + printf 'PASS %s (%ds)\n' "$label" "$((SECONDS - start))" + else + rc=$? + printf 'FAIL %s (%ds; exit %d)\n' "$label" "$((SECONDS - start))" "$rc" + failed=1 + fi +} +webui_tests() ( + cd webui/test && npm ci && npm test +) +# As in .github/workflows/docs.yml: mkdocs reports a link to a missing anchor only at INFO level, +# so --strict walks past it; fail on it the way the Docs workflow does. +mkdocs_build() { + pip install -q -r requirements-docs.txt || return + local log rc=0 + log=$(mktemp) + mkdocs build --strict 2>&1 | tee "$log" || rc=$? + if grep -q "does not contain an anchor" "$log"; then + grep "does not contain an anchor" "$log" + rc=1 + fi + rm -f "$log" + return "$rc" +} + +for step in "${steps[@]}"; do + case "$step" in + native) run_step native python scripts/test_native.py ;; + webui) + run_step webui webui_tests + run_step flowconv node --test "tools/flowconv/*.test.mjs" ;; + docs) + run_step partition-reservation-tests python test/test_partition_reservations.py + for check in check_docs_sync check_flow_converter gen_agent_skill \ + check_berry_api check_prelude_solidified check_font_sync check_partitions check_builtin_registration; do + if [[ "$check" == gen_agent_skill ]]; then + run_step "$check" python "tools/$check.py" --check + else + run_step "$check" python "tools/$check.py" + fi + done ;; + mkdocs) run_step mkdocs mkdocs_build ;; + build:*) run_step "$step" pio run -e "${step#build:}" ;; + esac +done +exit "$failed" diff --git a/tools/devicetest/run.py b/tools/devicetest/run.py index 725f5177..4f48f56e 100644 --- a/tools/devicetest/run.py +++ b/tools/devicetest/run.py @@ -392,8 +392,9 @@ def test_pixels(api): lit = [p for p in px if p] system_status, system = api.get("/api/v1/system") expected_width = system.get("panelWidth", 32) * system.get("panels", 1) + expected_height = system.get("panelHeight", 8) check("canvas size", system_status == 200 and - (fb.get("width"), fb.get("height")) == (expected_width, 8), + (fb.get("width"), fb.get("height")) == (expected_width, expected_height), "%sx%s" % (fb.get("width"), fb.get("height"))) check("pixel count matches", len(px) == fb.get("width", 0) * fb.get("height", 0), str(len(px))) check("app drew something", len(lit) > 0, "%d lit" % len(lit)) @@ -408,7 +409,7 @@ def test_pixels(api): st, edge = api.get("/api/v1/display/screen") pixels = edge.get("pixels", []) if isinstance(edge, dict) else [] check("last pixel matches the configured canvas", st == 200 and - len(pixels) == expected_width * 8 and pixels[-1] == 0x123456 and + len(pixels) == expected_width * expected_height and pixels[-1] == 0x123456 and all(p == 0 for p in pixels[:-1])) api.delete("/api/v1/apps/" + TEMP) diff --git a/tools/pico/burst.sh b/tools/pico/burst.sh new file mode 100755 index 00000000..6fa839b4 --- /dev/null +++ b/tools/pico/burst.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Loads the device the way a browser loads the web UI: eight GETs at once, every round. +# Prints one line per request and exits non-zero if any request is not a 200 or takes > 45 s. +# +# tools/pico/burst.sh http://awtrixng-xxxxxx.local [rounds] (default 10 rounds) +set -u + +base="${1:?usage: $0 [rounds]}" +base="${base%/}" +rounds="${2:-10}" +paths=(/ /api/v1/device /api/v1/settings /api/v1/apps /api/v1/display /api/v1/capabilities + /api/v1/logs /api/v1/system) +tmp="$(mktemp -d)" +trap 'rm -r "$tmp"' EXIT + +failed=0 +for ((round = 1; round <= rounds; round++)); do + for i in "${!paths[@]}"; do + # -w writes code and time even when curl fails; stderr carries the curl error text. + curl -sS -m 45 -o /dev/null -w '%{http_code} %{time_total}' "$base${paths[$i]}" \ + >"$tmp/$i.out" 2>"$tmp/$i.err" & + done + wait + for i in "${!paths[@]}"; do + read -r code secs <"$tmp/$i.out" + err="$(tr '\n' ' ' <"$tmp/$i.err")" + verdict=ok + if [[ "$code" != 200 ]] || awk -v t="$secs" 'BEGIN { exit !(t > 45) }'; then + verdict=FAIL + failed=$((failed + 1)) + fi + printf 'round %2d %-22s %s %7.3fs %-4s %s\n' "$round" "${paths[$i]}" "$code" "$secs" \ + "$verdict" "$err" + done +done + +total=$((rounds * ${#paths[@]})) +echo "burst: $((total - failed))/$total requests ok" +[[ "$failed" -eq 0 ]] diff --git a/tools/pico/smoke.sh b/tools/pico/smoke.sh new file mode 100755 index 00000000..2c5d1e0f --- /dev/null +++ b/tools/pico/smoke.sh @@ -0,0 +1,319 @@ +#!/usr/bin/env bash +# Proves the HTTP API behaves like an Ulanzi's: one call per line, PASS or FAIL, then a summary. +# Exits non-zero if any call fails. Every write is undone, so it can run against a live device +# again and again. Needs curl and jq. +# +# tools/pico/smoke.sh http://awtrixng-xxxxxx.local (a Galactic Unicorn) +# tools/pico/smoke.sh http://127.0.0.1:8080 (native_sim) +# +# Where the Pico and the simulator legitimately differ, the target is read from +# /api/v1/device (boardType) and /api/v1/capabilities, and the documented answer for it is +# expected: scripting, MP3 and radio routes answer 503 "unavailable" when the build leaves them +# out, /update is 503 on the Pico and 501 in the simulator, and the Pico has no sensors. +# Responses may contain configuration; this script prints only status codes and verdicts. +set -u + +base="${1:?usage: $0 }" +base="${base%/}" +here="$(cd "$(dirname "$0")" && pwd)" +tmp="$(mktemp -d)" +name=smoketest # every name this script creates; cleanup() removes all of them +json='Content-Type: application/json' +passed=0 +failed=0 + +verdict() { # verdict OK LABEL DETAIL + if [[ "$1" == 1 ]]; then + passed=$((passed + 1)) + printf 'PASS %-46s %s\n' "$2" "$3" + else + failed=$((failed + 1)) + printf 'FAIL %-46s %s\n' "$2" "$3" + fi +} + +# call LABEL EXPECT METHOD PATH [curl args...] +# EXPECT is a status regex such as 200 or '200|201'. The body lands in $tmp/body; every non-empty +# body must be valid JSON unless RAW=1 is set for the call. +call() { + local label=$1 expect=$2 method=$3 path=$4 out ok=1 note="" + shift 4 + out="$(curl -sS -m 45 -o "$tmp/body" -w '%{http_code} %{time_total}' -X "$method" "$@" \ + "$base$path" 2>"$tmp/err")" + read -r code secs <<<"$out" + [[ "$code" =~ ^($expect)$ ]] || { ok=0; note="want $expect $(tr '\n' ' ' <"$tmp/err")"; } + if [[ "${RAW:-0}" != 1 && -s "$tmp/body" ]] && ! jq -e . "$tmp/body" >/dev/null 2>&1; then + ok=0 + note="$note invalid JSON: $(head -c 120 "$tmp/body")" + fi + verdict "$ok" "$method $path ($label)" "$code ${secs}s $note" + [[ "$ok" == 1 ]] +} + +# check LABEL JQ-EXPR [jq args...]: evaluates JQ-EXPR against the last body. +check() { + local label=$1 expr=$2 + shift 2 + if jq -e "$@" "$expr" "$tmp/body" >/dev/null 2>&1; then + verdict 1 " $label" "" + else + verdict 0 " $label" "($expr)" + fi +} + +# get PATH: a silent read for undo bookkeeping, not counted. +get() { curl -sS -m 45 "$base$1"; } + +cleanup() { + # Best effort, so an interrupted run leaves nothing behind for the next one. + for p in "/api/v1/notifications/$name" "/api/v1/apps/$name" "/api/v1/audio/melodies/$name" \ + "/api/v1/files?path=/ICONS/$name.gif"; do + curl -s -m 45 -o /dev/null -X DELETE "$base$p" + done + rm -r "$tmp" +} +trap cleanup EXIT + +echo "smoke: $base" + +# --- what are we talking to ----------------------------------------------------------------- +call "capabilities" 200 GET /api/v1/capabilities +check "gpio.soc is named" '.gpio.soc | type == "string"' +cp "$tmp/body" "$tmp/caps" +scripting=$(jq -r '.scripting' "$tmp/caps") +mp3=$(jq -r '.audio.mp3' "$tmp/caps") +radio=$(jq -r '.audio.radio' "$tmp/caps") +soc=$(jq -r '.gpio.soc' "$tmp/caps") + +call "device" 200 GET /api/v1/device +cp "$tmp/body" "$tmp/device" +board=$(jq -r '.boardType' "$tmp/device") +if [[ "$soc" == rp2040 ]]; then target=pico +elif [[ "$board" == simulator ]]; then target=sim +else target=esp32 +fi +echo "smoke: target $target (soc $soc, boardType $board, scripting $scripting, mp3 $mp3, radio $radio)" +check "fps > 0" '.fps > 0' +if [[ "$target" == pico ]]; then + # The free block at the top of the heap, never more than the total free. + check "largestFreeBlockBytes in (0, freeHeapBytes]" \ + '.largestFreeBlockBytes > 0 and .largestFreeBlockBytes <= .freeHeapBytes' + check "no sensors on the Pico" \ + 'has("temperature") or has("humidity") or has("batteryPercent") | not' +else + check "largestFreeBlockBytes in [0, freeHeapBytes]" \ + '.largestFreeBlockBytes >= 0 and .largestFreeBlockBytes <= .freeHeapBytes' +fi +check "resetReason is a string" '.resetReason | type == "string"' +call "version" 200 GET /api/v1/version +call "system" 200 GET /api/v1/system +check "panel geometry is numeric" '(.panelWidth | type == "number") and (.panelHeight | type == "number")' +check "secrets are omitted" 'has("wifiPass") or has("mqttPass") or has("authPass") | not' +call "screen" 200 GET /api/v1/display/screen +check "pixels = width x height" '(.pixels | length) == .width * .height and .width > 0' + +# --- settings: change one, restore it, and the three refusals -------------------------------- +call "settings" 200 GET /api/v1/settings +orig=$(jq -r '.uppercase' "$tmp/body") +flip=$([[ "$orig" == true ]] && echo false || echo true) +call "change uppercase" 200 PATCH /api/v1/settings -H "$json" -d "{\"uppercase\":$flip}" +check "uppercase is now $flip" ".uppercase == $flip" +call "restore uppercase" 200 PATCH /api/v1/settings -H "$json" -d "{\"uppercase\":$orig}" +check "uppercase is back to $orig" ".uppercase == $orig" +call "invalid setting" 422 PATCH /api/v1/settings -H "$json" -d '{"brightness":999}' +check "validationFailed on brightness" '.error.code == "validationFailed" and .error.field == "brightness"' +call "unknown setting" 422 PATCH /api/v1/settings -H "$json" -d '{"noSuchSetting":1}' +check "validationFailed on noSuchSetting" '.error.field == "noSuchSetting"' +call "wrong content type" 415 PATCH /api/v1/settings -H 'Content-Type: text/plain' -d '{"uppercase":true}' +check "unsupportedMediaType" '.error.code == "unsupportedMediaType"' +printf '{"textColor":"%s"}' "$(head -c 9000 /dev/zero | tr '\0' a)" >"$tmp/big.json" +call "oversized body" 413 PATCH /api/v1/settings -H "$json" --data-binary "@$tmp/big.json" +check "payloadTooLarge" '.error.code == "payloadTooLarge"' +call "settings unchanged" 200 GET /api/v1/settings +check "uppercase still $orig" ".uppercase == $orig" + +# --- an icon, uploaded and then used ------------------------------------------------------- +# A 1x1 GIF; the upload checks the magic bytes. +printf 'GIF89a\x01\x00\x01\x00\x80\x00\x00\xff\x00\x00\x00\x00\x00!\xf9\x04\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;' \ + >"$tmp/$name.gif" +call "upload icon" 200 POST "/api/v1/files?dir=/ICONS" -F "file=@$tmp/$name.gif" +call "list icons" 200 GET "/api/v1/files?dir=/ICONS" +check "$name.gif is listed" '[.files[].name | ltrimstr("/ICONS/")] | index($n) != null' --arg n "$name.gif" +RAW=1 call "serve icon" 200 GET "/ICONS/$name.gif" +printf 'hello' >"$tmp/not-an-icon.gif" +call "icon that is not an image" 415 POST "/api/v1/files?dir=/ICONS" -F "file=@$tmp/not-an-icon.gif;filename=$name.gif" +RAW=1 call "icon kept after a refused replacement" 200 GET "/ICONS/$name.gif" +cmp -s "$tmp/body" "$tmp/$name.gif" && verdict 1 " same bytes as uploaded" "" \ + || verdict 0 " same bytes as uploaded" "(the refused upload replaced or removed it)" +# The same GIF in blue, uploaded over the first. +printf 'GIF89a\x01\x00\x01\x00\x80\x00\x00\x00\x00\xff\x00\x00\x00!\xf9\x04\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;' \ + >"$tmp/replacement.gif" +call "replace icon" 200 POST "/api/v1/files?dir=/ICONS" -F "file=@$tmp/replacement.gif;filename=$name.gif" +RAW=1 call "serve replaced icon" 200 GET "/ICONS/$name.gif" +cmp -s "$tmp/body" "$tmp/replacement.gif" && verdict 1 " new bytes served" "" \ + || verdict 0 " new bytes served" "(still the old icon)" +call "list icons" 200 GET "/api/v1/files?dir=/ICONS" +check "listed once, nothing left beside it" \ + '[.files[].name | ltrimstr("/ICONS/") | select(startswith($n))] == [$n]' --arg n "$name.gif" + +# --- notification: post, then dismiss -------------------------------------------------------- +call "notify" 200 POST /api/v1/notifications -H "$json" \ + -d "{\"name\":\"$name\",\"text\":\"smoke\",\"textColor\":\"#00FF00\",\"icon\":\"$name\",\"hold\":true}" +# 200 only when a notification of that name was queued (a second dismiss is a 404). +call "dismiss by name" 200 DELETE "/api/v1/notifications/$name" +call "notification with color" 422 POST /api/v1/notifications -H "$json" -d '{"text":"x","color":"#FF0000"}' +check "color is not a payload key" '.error.field == "color"' + +# --- a pushed app: put, then delete ----------------------------------------------------------- +call "push app" 200 PUT "/api/v1/apps/pushed/$name" -H "$json" \ + -d "{\"text\":\"smoke\",\"icon\":\"$name\",\"textColor\":\"#FF00FF\"}" +call "apps" 200 GET /api/v1/apps +check "$name is pushed, with its icon" \ + '.[] | select(.name == $n) | .origin == "pushed" and .present and .icon == $n' --arg n "$name" +call "empty push" 422 PUT "/api/v1/apps/pushed/$name" -H "$json" -d '{}' +call "delete app" 200 DELETE "/api/v1/apps/$name" +call "apps" 200 GET /api/v1/apps +check "$name is gone" '[.[] | select(.name == $n and .present)] | length == 0' --arg n "$name" + +# --- app switch, next, previous, order ------------------------------------------------------- +current=$(jq -r '.currentApp' "$tmp/device") +# Any other app in the loop: which built-ins are enabled is the user's choice (a device may have +# Date switched off), so the target is read, not assumed. +other=$(get /api/v1/apps | jq -r --arg c "$current" \ + '[.[] | select(.inLoop and .present != false and .name != $c) | .name][0] // empty') +if [[ -n "$other" ]]; then + call "switch to $other" 200 PUT /api/v1/apps/active -H "$json" -d "{\"name\":\"$other\",\"fast\":true}" + call "device" 200 GET /api/v1/device + check "currentApp is $other" '.currentApp == $o' --arg o "$other" +else + echo "skip PUT /api/v1/apps/active (no second app in the loop)" +fi +# An explicit empty body, as a browser sends: the simulator's HTTP library waits 5 s for the body +# of a POST that has no Content-Length at all, then answers 400 (a known simulator gap). +call "next" 200 POST /api/v1/apps/next --data '' +call "previous" 200 POST /api/v1/apps/previous --data '' +call "unknown app" 404 PUT /api/v1/apps/active -H "$json" -d "{\"name\":\"$name-none\"}" +call "switch back to $current" 200 PUT /api/v1/apps/active -H "$json" -d "{\"name\":\"$current\",\"fast\":true}" + +get /api/v1/apps >"$tmp/apps" +order=$(jq -c '[.[] | select(.slot != null)] | sort_by(.slot) | map(.name)' "$tmp/apps") +disabled=$(jq -c '[.[] | select(.enabled == false) | .name]' "$tmp/apps") +if [[ $(jq 'length' <<<"$order") -ge 2 ]]; then + swapped=$(jq -c '.[1:2] + .[0:1] + .[2:]' <<<"$order") + call "reorder" 200 PUT /api/v1/apps/order -H "$json" -d "{\"order\":$swapped,\"disabled\":$disabled}" + call "apps" 200 GET /api/v1/apps + check "order is swapped" '[.[] | select(.slot != null)] | sort_by(.slot) | map(.name) == $o' \ + --argjson o "$swapped" + call "restore order" 200 PUT /api/v1/apps/order -H "$json" -d "{\"order\":$order,\"disabled\":$disabled}" + call "apps" 200 GET /api/v1/apps + check "order is restored" '[.[] | select(.slot != null)] | sort_by(.slot) | map(.name) == $o' \ + --argjson o "$order" +else + # Nothing arranged yet: an order would create one that could not be taken back. + call "order, disabled only" 200 PUT /api/v1/apps/order -H "$json" -d "{\"disabled\":$disabled}" +fi +call "order without disabled" 400 PUT /api/v1/apps/order -H "$json" -d "$order" + +# --- indicators ------------------------------------------------------------------------------ +ind=$(jq -c '.indicators[0]' "$tmp/device") +call "indicator 1 on" 200 PUT /api/v1/indicators/1 -H "$json" -d '{"color":"#FF0000","blinkMs":500}' +call "device" 200 GET /api/v1/device +check "indicator 1 is on" '.indicators[0].on and .indicators[0].blinkMs == 500' +if [[ $(jq -r '.on' <<<"$ind") == true ]]; then + call "restore indicator 1" 200 PUT /api/v1/indicators/1 -H "$json" -d "$ind" +else + call "indicator 1 off" 200 DELETE /api/v1/indicators/1 +fi +call "device" 200 GET /api/v1/device +check "indicator 1 as it was" '.indicators[0] == $i' --argjson i "$ind" +call "indicator 4" 404 PUT /api/v1/indicators/4 -H "$json" -d '{"color":"#FF0000"}' + +# --- moodlight ------------------------------------------------------------------------------- +mood=$(get /api/v1/display | jq -c '.moodlight') +call "moodlight on" 200 PUT /api/v1/display/moodlight -H "$json" -d '{"kelvin":2700,"brightness":90}' +call "display" 200 GET /api/v1/display +check "moodlight is on" '.moodlight != null' +if [[ "$mood" == null ]]; then + call "moodlight off" 200 DELETE /api/v1/display/moodlight +else + call "restore moodlight" 200 PUT /api/v1/display/moodlight -H "$json" -d "$mood" +fi +call "display" 200 GET /api/v1/display +check "moodlight as it was" '.moodlight == $m' --argjson m "$mood" + +# --- a melody file --------------------------------------------------------------------------- +call "save melody" 201 PUT "/api/v1/audio/melodies/$name" -H "$json" -d '{"rtttl":"d=4,o=5,b=100:e,c"}' +call "melodies" 200 GET /api/v1/audio/melodies +check "$name parses, titled by its name" \ + '.melodies[] | select(.name == $n) | .valid and (.rtttl | startswith($n + ":"))' --arg n "$name" +RAW=1 call "serve melody" 200 GET "/MELODIES/$name.txt" +call "delete melody" 200 DELETE "/api/v1/audio/melodies/$name" +call "delete it again" 404 DELETE "/api/v1/audio/melodies/$name" + +# --- features this build leaves out: 503 "unavailable", as on a classic ESP32 ------------------ +unavailable() { check "unavailable" '.error.code == "unavailable"'; } +if [[ "$scripting" == false ]]; then + call "no scripting" 503 GET "/api/v1/apps/script/$name" && unavailable + call "no scripting" 503 PUT "/api/v1/apps/script/$name" -H 'Content-Type: text/plain' -d 'print(1)' && unavailable + call "no scripting" 503 GET /api/v1/scripts/shared && unavailable + call "no scripting" 503 GET "/api/v1/apps/$name/config" && unavailable +else + # Install, read back, list and delete a two-line app; cleanup() deletes it again if this stops. + call "scripting" 200 GET /api/v1/scripts/shared + printf 'class Smoke\n def draw()\n clear()\n end\nend\n\nreturn Smoke()\n' >"$tmp/script.ax" + call "install script" 200 PUT "/api/v1/apps/script/$name" -H 'Content-Type: text/plain' \ + --data-binary "@$tmp/script.ax" + check "compiles" '.ok == true and .error == null' + RAW=1 call "script source" 200 GET "/api/v1/apps/script/$name" + if cmp -s "$tmp/body" "$tmp/script.ax"; then verdict 1 " source round-trips" "" + else verdict 0 " source round-trips" "(bytes differ)"; fi + call "apps" 200 GET /api/v1/apps + check "$name listed as a script" 'any(.[]; .name == $n and .origin == "script")' --arg n "$name" + call "delete script" 200 DELETE "/api/v1/apps/$name" + call "script is gone" 404 GET "/api/v1/apps/script/$name" + # Script source is exempt from the 8 KB body cap, updates included: a big update of a missing + # script is a 404, not a 413. + printf '{"expected_source":"%s","source":"x"}' "$(head -c 9000 /dev/zero | tr '\0' a)" \ + >"$tmp/big-update.json" + call "big update of a missing script" 404 PUT "/api/v1/apps/script-update/$name" -H "$json" \ + --data-binary "@$tmp/big-update.json" +fi +if [[ "$mp3" == false ]]; then + call "no MP3" 503 GET /api/v1/audio/mp3 && unavailable + call "no MP3" 503 POST /api/v1/audio/play -H "$json" -d '{"mp3":"song"}' && unavailable + call "no MP3" 503 DELETE /api/v1/audio/mp3/song && unavailable +elif [[ "$target" == sim ]]; then + echo "skip GET /api/v1/audio/mp3 (known gap: the simulator has no such route)" +else + call "MP3 list" 200 GET /api/v1/audio/mp3 +fi +if [[ "$radio" == false ]]; then + call "no radio" 503 PUT /api/v1/audio/stations -H "$json" -d '[]' && unavailable + call "no radio" 503 POST /api/v1/audio/play -H "$json" -d '{"station":0}' && unavailable +fi +call "audio" 200 GET /api/v1/audio +# /update is only exercised where it cannot replace the firmware. +printf 'not firmware' >"$tmp/firmware.bin" +case "$target" in + pico) call "no browser update" 503 POST /update -F "firmware=@$tmp/firmware.bin" && unavailable ;; + sim) call "simulator has no firmware" 501 POST /update -F "firmware=@$tmp/firmware.bin" ;; + *) echo "skip POST /update (a real ESP32 would take it)" ;; +esac + +# --- the web UI's parallel load -------------------------------------------------------------- +if "$here/burst.sh" "$base" >"$tmp/burst" 2>&1; then + verdict 1 "burst.sh (8 parallel GETs x 10 rounds)" "$(tail -1 "$tmp/burst")" +else + grep -v ' ok ' "$tmp/burst" | sed 's/^/ /' + verdict 0 "burst.sh (8 parallel GETs x 10 rounds)" "$(tail -1 "$tmp/burst")" +fi + +# --- leave nothing behind -------------------------------------------------------------------- +call "delete icon" 200 DELETE "/api/v1/files?path=/ICONS/$name.gif" +call "list icons" 200 GET "/api/v1/files?dir=/ICONS" +check "$name.gif is gone" '[.files[].name | ltrimstr("/ICONS/")] | index($n) == null' --arg n "$name.gif" +call "apps" 200 GET /api/v1/apps +check "no $name app left" '[.[] | select(.name | startswith($n))] | length == 0' --arg n "$name" + +echo "smoke: $passed passed, $failed failed" +[[ "$failed" -eq 0 ]] diff --git a/tools/sim/README-effects.md b/tools/sim/README-effects.md new file mode 100644 index 00000000..7ab629f4 --- /dev/null +++ b/tools/sim/README-effects.md @@ -0,0 +1,84 @@ +# Native simulator effect survey + +Run in the build container from the repository root after building `native_sim`: + +```console +python tools/sim/effect_survey.py --size 32x8 --size 53x11 --out .pio/effect-survey +``` + +The tool starts an isolated simulator per size using a temporary `device.json`, enumerates +`/api/v1/capabilities`, holds an empty-text notification for each effect, and samples +`/api/v1/display/screen`. It writes one scaled PNG strip per effect, plus `summary.md` +and `summary.json`. PNG encoding uses only Python's standard library. The simulator is +terminated and temporary device data removed even on failure. + +Defaults: 12 frames, 250 ms interval, 500 ms settling time, 4x nearest-neighbour scaling. +`--frames`, `--interval`, `--settle`, `--scale`, `--port`, and `--program` are configurable. +Rows are zero-based; lit/changing rows are unions over the sampled frames. These are +wall-clock observations, not a whole-cycle guarantee or deterministic golden snapshots. +Sparse effects and periodic sampling can omit rows or repeat frames. Use host tests for +frame-exact coverage and determinism assertions. + +## Tall-panel effects + +- BrickBreaker, Snake and PingPong are mini-games on every panel size. Each replays a + round from a fixed start: at most 511 constant-cost ticks per frame, and the round + restarts every 512 effect frames (about 34 s at the steady rate). The bounded replay makes + seeking, dropped frames and repeated calls deterministic; state is fixed-size. +- BrickBreaker: bricks are 3 LEDs with a 1-LED gap, centred; 2 rows, 3 from 11 rows up, + one hue per row. The ball moves one LED at a time and stops on a hit, so a tick removes + exactly one brick and the ball never stands on one; it passes through the gap columns. The + 3-LED paddle tracks the ball with an aim offset: a centre contact returns at 45 degrees, + an edge contact shallow (2 across per 1 down). An empty wall refills at the paddle. +- Snake: greedy steering towards a food pixel (Manhattan distance, avoiding its body and + dead ends) on a field of up to 64x32 cells. Food rows walk a per-round permutation of the + rows, columns come from `noise::hash2`, and a raster probe skips the body. Length 4 grows + by one per food; a stuck or 24-long snake starts a new game at once. +- PingPong: paddles on columns 0 and w-1 (3 LEDs, 4 from 11 rows up) always cover the ball's + row; the receiving one steers to an aim point, the other lags. The paddle edge returns + 45 degrees, the middle (or a corner) shallow. +- SwirlIn/SwirlOut use two rotating elliptical spiral packets sized to the canvas. + Radial phase moves particles inward/outward; particles wrap at the centre/outer edge. + Contraction deliberately narrows the image during part of the cycle. This is not a + fixed-width guarantee at every frame. +- These renderers use no per-frame heap allocation and no platform-specific APIs. + +`test/test_tall_effects` checks brick geometry (3 lit, 1 dark), one brick per hit, a +ball never on a brick, ball coverage over more than half the rows and both slopes; food +never on the snake, growth by one with moving food, mostly-closing distance, no +overlapping segments and full-height snake coverage; both PingPong paddles covering the +ball at columns 1 and w-2 and both slopes; swirl width above 70% at the +reference frame and opposite mean-radius movement over a short window. Determinism +and framebuffer guard sentinels (including PingPong) cover widths 4/32/53/64/80 and every height 8 through 16. +Guard sentinels verify no out-of-buffer memory writes; Canvas itself drops out-of-range +coordinates. This does not instrument attempted clipped draws. + +## Visual review + +Before/after strips and complete survey tables were reviewed; they are not checked in +as generated assets. Reviewed all 19 effects at 53x11 and the four changed +effects at 32x8. BrickBreaker now visibly separates ball from paddle and removes bricks; +Snake traverses the height; swirls contract/expand over the panel width instead of +remaining a small clipped central cluster. + +The other 15 effects were left unchanged: + +| Effect | Reason | +| --- | --- | +| Checkerboard | Full-canvas alternating tiles; odd edge dimensions naturally crop a tile. | +| ColorWaves | Full-height colour bands, no blank band or misplaced centre. | +| Fade | Uniform whole-canvas fade; near-black frames are intentional. | +| Fireworks | Small expanding bursts at varying locations; edge cropping is natural. | +| LookingEyes | Recognisable centred pair with gaze/blink; explicitly excluded from changes. | +| Matrix | Falling heads/trails across the whole canvas. | +| MovingLine | Full-height line scanning horizontally. | +| Pacifica | Smooth full-canvas water pattern. | +| PingPong | Single point moving in both axes; sparse sampling is not unused height. PingPong has since become a paddle game (see above). | +| Plasma | Full-canvas multicolour field. | +| PlasmaCloud | Full-canvas smooth cloud field. | +| Radar | Centred rotating ray; circular sweep meets rectangular panel edges naturally. | +| Ripple | Centred expanding circular rings; top/bottom cropping is intentional expansion. | +| TheaterChase | Repeated full-height chase bars. | +| TwinklingStars | Sparse distributed twinkles; no requirement to populate every row in a short sample. | + +These are simulator observations, not a replacement for human inspection on the Unicorn. diff --git a/tools/sim/effect_survey.py b/tools/sim/effect_survey.py new file mode 100644 index 00000000..be9277fa --- /dev/null +++ b/tools/sim/effect_survey.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +"""Sample real native_sim effects; stdlib-only PNG strips and Markdown/JSON tables. + +Example: python tools/sim/effect_survey.py --size 32x8 --size 53x11 --out .pio/survey +Samples are wall-clock observations, not golden images or a complete animation cycle. +""" +import argparse +import json +from pathlib import Path +import re +import struct +import subprocess +import tempfile +import time +import urllib.error +import urllib.request +import zlib + + +def png(path, frames, width, height, scale): + def chunk(kind, data): + return struct.pack('!I', len(data)) + kind + data + struct.pack('!I', zlib.crc32(kind + data)) + rows = bytearray() + for y in range(height): + row = bytearray(b'\0') + for frame in frames: + for pixel in frame[y * width:(y + 1) * width]: + row.extend(bytes(((pixel >> 16) & 255, (pixel >> 8) & 255, pixel & 255)) * scale) + rows.extend(row * scale) + path.write_bytes(b'\x89PNG\r\n\x1a\n' + chunk(b'IHDR', struct.pack('!2I5B', width * len(frames) * scale, + height * scale, 8, 2, 0, 0, 0)) + chunk(b'IDAT', zlib.compress(rows)) + chunk(b'IEND', b'')) + + +def survey(args, width, height): + out = args.out / f'{width}x{height}' + out.mkdir(parents=True, exist_ok=True) + base = f'http://127.0.0.1:{args.port}' + + def http(path, body=None, method=None): + request = urllib.request.Request(base + '/api/v1/' + path, + data=None if body is None else json.dumps(body).encode(), + headers={'Content-Type': 'application/json'}, method=method) + with urllib.request.urlopen(request, timeout=3) as response: + return json.load(response) + + report = [] + with tempfile.TemporaryDirectory(prefix='awtrix-effects-') as data: + Path(data, 'device.json').write_text(json.dumps({'panelWidth': width, 'panelHeight': height, + 'panels': 1, 'mqttEnabled': False, 'scriptingEnabled': False})) + with (out / 'simulator.log').open('w') as log: + sim = subprocess.Popen([str(args.program.resolve()), '--no-matrix', '--port', str(args.port), + '--data', data], stdout=log, stderr=subprocess.STDOUT) + try: + deadline = time.monotonic() + 30 + while True: + if sim.poll() is not None: + raise RuntimeError(f'simulator exited: see {out}/simulator.log') + try: + effects = http('capabilities')['effects'] + break + except (urllib.error.URLError, TimeoutError): + if time.monotonic() >= deadline: + raise RuntimeError('simulator readiness timeout') + time.sleep(.1) + for effect in effects: + http('notifications/active', method='DELETE') + http('notifications', {'name': 'effect-survey', 'text': '', 'hold': True, + 'effect': effect}) + time.sleep(args.settle) + frames = [] + for _ in range(args.frames): + screen = http('display/screen') + assert (screen['width'], screen['height']) == (width, height), screen + assert len(screen['pixels']) == width * height + frames.append(tuple(screen['pixels'])) + time.sleep(args.interval) + lit = [y for y in range(height) if any(any(f[y*width:(y+1)*width]) for f in frames)] + changing = [y for y in range(height) if len({f[y*width:(y+1)*width] for f in frames}) > 1] + name = re.sub(r'[^A-Za-z0-9_-]', '_', effect) + png(out / (name + '.png'), frames, width, height, args.scale) + report.append({'effect': effect, 'distinct': len(set(frames)), 'lit': lit, 'changing': changing}) + finally: + sim.terminate() + try: + sim.wait(timeout=5) + except subprocess.TimeoutExpired: + sim.kill() + sim.wait() + table = '| Effect | Distinct | Lit rows (0-based) | Changing rows |\n|---|---:|---|---|\n' + for row in report: + table += f"| {row['effect']} | {row['distinct']} | {row['lit']} | {row['changing']} |\n" + (out / 'summary.md').write_text(table) + (out / 'summary.json').write_text(json.dumps({'size': [width, height], 'frames': args.frames, + 'interval': args.interval, 'settle': args.settle, 'effects': report}, indent=2) + '\n') + print(f'\n{width}x{height}\n{table}', flush=True) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--program', type=Path, default=Path('.pio/build/native_sim/program')) + parser.add_argument('--out', type=Path, default=Path('.pio/effect-survey')) + parser.add_argument('--size', action='append', default=[]) + parser.add_argument('--frames', type=int, default=12) + parser.add_argument('--interval', type=float, default=.25) + parser.add_argument('--settle', type=float, default=.5) + parser.add_argument('--scale', type=int, default=4) + parser.add_argument('--port', type=int, default=18091) + args = parser.parse_args() + if args.frames < 2 or args.scale < 1 or args.interval <= 0 or args.settle < 0: + parser.error('frames >= 2, scale >= 1, interval > 0 and settle >= 0 required') + for size in args.size or ['32x8', '53x11']: + if not re.fullmatch(r'[1-9][0-9]*x[1-9][0-9]*', size): + parser.error('size must be WIDTHxHEIGHT') + survey(args, *map(int, size.split('x'))) + + +if __name__ == '__main__': + main() diff --git a/tools/test_panel_geometry.py b/tools/test_panel_geometry.py new file mode 100644 index 00000000..5e1d5bb8 --- /dev/null +++ b/tools/test_panel_geometry.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Smoke-test native_sim panel sizing and reboot-only geometry changes. + +Run after building native_sim, in the build container: + python tools/test_panel_geometry.py +Uses only an isolated temporary data directory and a loopback HTTP port. +""" +import contextlib +import json +from pathlib import Path +import socket +import subprocess +import tempfile +import time +import urllib.error +import urllib.request + + +@contextlib.contextmanager +def simulator(data): + with socket.socket() as sock: + sock.bind(("127.0.0.1", 0)) + port = sock.getsockname()[1] + with tempfile.TemporaryFile() as log: + proc = subprocess.Popen( + [".pio/build/native_sim/program", "--no-matrix", "--port", str(port), + "--data", str(data)], stdout=log, stderr=log) + base = f"http://127.0.0.1:{port}" + try: + deadline = time.monotonic() + 15 + while True: + try: + request(base, "/api/v1/system") + break + except (OSError, urllib.error.URLError): + if proc.poll() is not None or time.monotonic() >= deadline: + log.seek(0) + raise RuntimeError(log.read().decode(errors="replace")) + time.sleep(0.05) + yield base + finally: + proc.terminate() + try: + proc.wait(timeout=5) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait() + + +def request(base, path, body=None): + req = urllib.request.Request( + base + path, method="GET" if body is None else "PUT", + data=None if body is None else json.dumps(body).encode(), + headers={"Content-Type": "application/json"}) + with urllib.request.urlopen(req, timeout=3) as response: + return json.load(response) + + +def screen(base, width, height): + frame = request(base, "/api/v1/display/screen") + assert (frame["width"], frame["height"]) == (width, height), frame.keys() + assert len(frame["pixels"]) == width * height + print(f"PASS screen {width}x{height}: {len(frame['pixels'])} pixels") + + +def main(): + with tempfile.TemporaryDirectory(prefix="awtrix-geometry-") as directory: + data = Path(directory) + with simulator(data) as base: + assert request(base, "/api/v1/system")["panelHeight"] == 8 + screen(base, 32, 8) + for height in (7, 17, 11.5): + try: + request(base, "/api/v1/system", {"panelHeight": height}) + except urllib.error.HTTPError as error: + assert error.code == 422 + else: + raise AssertionError(f"accepted invalid height {height}") + request(base, "/api/v1/system", {"panelWidth": 53, "panelHeight": 11}) + assert request(base, "/api/v1/system")["panelHeight"] == 11 + screen(base, 32, 8) + print("PASS validation and deferred geometry") + with simulator(data) as base: + screen(base, 53, 11) + request(base, "/api/v1/system", {"panelHeight": 16}) + screen(base, 53, 11) + with simulator(data) as base: + screen(base, 53, 16) + print("PASS persisted height and restart geometry (8, 11, 16)") + + +if __name__ == "__main__": + main() diff --git a/tools/test_tall_notification.py b/tools/test_tall_notification.py new file mode 100644 index 00000000..a337d1b6 --- /dev/null +++ b/tools/test_tall_notification.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Render a real icon/text notification at 53x11 and print the screen as ASCII. + +Run in the build container after native_sim is built. No network assets or +third-party Python packages are needed; the GIF comes from the test fixtures. +""" +import base64 +import json +from pathlib import Path +import re +import tempfile +import time +import urllib.request + +from test_panel_geometry import request, simulator + + +def main(): + fixture = Path("test/test_gifplayer/gif_fixtures.h").read_text() + source = fixture.split("kGif8x8TwoFrames[] = {", 1)[1].split("};", 1)[0] + icon = base64.b64encode(bytes(int(x, 16) for x in re.findall(r"0x([0-9a-fA-F]{2})", source))).decode() + with tempfile.TemporaryDirectory(prefix="awtrix-tall-notification-") as directory: + data = Path(directory) + with simulator(data) as base: + request(base, "/api/v1/system", {"panelWidth": 53, "panelHeight": 11}) + with simulator(data) as base: + payload = {"text": "HELLO", "icon": icon, "hold": True, + "textColor": "#FFFFFF", "backgroundColor": "#000000"} + req = urllib.request.Request(base + "/api/v1/notifications", method="POST", + data=json.dumps(payload).encode(), + headers={"Content-Type": "application/json"}) + with urllib.request.urlopen(req, timeout=3) as response: + assert response.status == 200 + deadline = time.monotonic() + 20 + while time.monotonic() < deadline: + frame = request(base, "/api/v1/display/screen") + assert (frame["width"], frame["height"]) == (53, 11) + pixels = frame["pixels"] + assert len(pixels) == 53 * 11 + # Screen API publishes packed RGB integers. Wait out boot/transition. + rows = [pixels[y * 53:(y + 1) * 53] for y in range(11)] + if (not any(rows[0] + rows[9] + rows[10]) + and all(all(row[:8]) for row in rows[1:9]) + and any(any(row[9:]) for row in rows[1:9])): + print("PASS notification screen 53x11: icon/text in rows 1-8") + for row in rows: + print("".join("#" if pixel else "." for pixel in row)) + return + time.sleep(0.1) + raise AssertionError("notification did not settle into the eight-row band") + + +if __name__ == "__main__": + main() diff --git a/webui/index.html b/webui/index.html index a9cf165e..18362703 100644 --- a/webui/index.html +++ b/webui/index.html @@ -1076,6 +1076,9 @@

AWTRIX NG

pnBadWidth:'The total width must be between 32 and 128.', grpHw:'Brightness & sensors',grpHwH:'Auto-brightness limits and sensor calibration.', grpGpio:'GPIO',grpGpioH:'Which pin does what. Applies after a reboot.', + grpGpioFixedH:'Wired on the board, so they cannot be changed.', + grpPanelFixedH:'Built into the board: only the height and the orientation can change.', + pinReserved:'Reserved', preset:'Preset wiring',presetH:'Fills the fields with a known board’s wiring.', presetUlanzi:'Ulanzi TC001',presetAwtrix2:'AWTRIX 2 mainboard', presetApplied:'Preset filled in - check the fields and save', @@ -1264,6 +1267,9 @@

AWTRIX NG

pnBadWidth:'Die Gesamtbreite muss zwischen 32 und 128 liegen.', grpHw:'Helligkeit & Sensoren',grpHwH:'Grenzen der Auto-Helligkeit und Sensor-Kalibrierung.', grpGpio:'GPIO',grpGpioH:'Welcher Pin was macht. Wirkt nach einem Neustart.', + grpGpioFixedH:'Auf dem Board verdrahtet, daher nicht änderbar.', + grpPanelFixedH:'Fest im Board verbaut: nur Höhe und Ausrichtung lassen sich ändern.', + pinReserved:'Reserviert', preset:'Vorlage',presetH:'Füllt die Felder mit der Belegung eines bekannten Boards.', presetUlanzi:'Ulanzi TC001',presetAwtrix2:'AWTRIX-2-Mainboard', presetApplied:'Vorlage eingetragen - Felder prüfen und speichern', @@ -1526,6 +1532,7 @@

AWTRIX NG

{derive:v=>({tz:TZRULE.get(v)||'UTC0'})}), tz:F('hidden','text','Timezone rule|Zeitzonen-Regel',''), panelWidth:F('panel','number','Panel width|Panel-Breite','Pixels across one panel.|Pixel in der Breite eines Panels.',{min:1,max:128,unit:'px'}), + panelHeight:F('panel','number','Panel height|Panel-Höhe','Pixels high; requires a reboot.|Pixel in der Höhe; Neustart erforderlich.',{min:8,max:16,unit:'px'}), panels:F('panel','number','Panels|Panels','How many panels are chained.|Wie viele Panels verkettet sind.',{min:1,max:128}), panelStart:F('panel','select','First LED|Erste LED','Corner the data cable arrives at.|Ecke, an der das Datenkabel ankommt.',{opt:[ ['topLeft','Top left|Oben links'],['topRight','Top right|Oben rechts'], @@ -1588,12 +1595,16 @@

AWTRIX NG

const S={transitions:[],stats:null,ap:false,sysHost:'',sysUid:'',gpio:null,aud:null, scriptsOff:null}; function readAudioCaps(caps){ + S.scripting=caps.scripting!==false; const a=caps.audio||{}; S.aud={buzzer:a.buzzer===true,track:a.track===true,mp3:a.mp3===true,radio:a.radio===true}; + if(caps.gpio){S.gpio=caps.gpio;applyGpioCaps(S.gpio);} } // Unknown counts as present, so nothing is hidden before the capabilities have arrived. const hasSink=(...k)=>!S.aud||k.some(x=>S.aud[x]); const anyAudioCap=()=>hasSink('buzzer','track','mp3','radio'); +const hasScripting=()=>S.scripting!==false; +const unavailableNote=()=>tt('Not available on this board.|Auf diesem Board nicht verfügbar.'); async function scriptsOff(){ if(S.scriptsOff===null){ try{S.scriptsOff=(await api('/api/v1/device',{timeout:4000})).data.scriptingRunning===false;} @@ -1622,11 +1633,34 @@

AWTRIX NG

opts('pinDfRx',usable,true); const i2s=dflt.pinI2sBclk>=0?'gpio':'hidden'; ['pinI2sBclk','pinI2sLrclk','pinI2sDout','pinI2sMclk','pinAmpEnable'].forEach(k=>{SYSF[k].g=i2s;}); + if(c.fixed)applyFixedBoard(c); +} +// A board with fixed wiring shows its pins instead of offering them, and drops the settings of +// hardware it does not have: nothing can be wired to it later. +function applyFixedBoard(c){ + const dflt=c.defaults||{}; + const hide=keys=>keys.forEach(k=>{(SYSF[k]||FIELDS[k]).g='hidden';}); + PINKEYS.forEach(k=>{SYSF[k].w='fixed';SYSF[k].g=dflt[k]>=0?'gpio':'hidden';}); + SYSF.pinI2sBclk.h='The built-in speaker amplifier, bit clock.|Verstärker des eingebauten Lautsprechers, Bittakt.'; + SYSF.pinI2sLrclk.h='Same amplifier, word select.|Selber Verstärker, Wortauswahl.'; + SYSF.pinI2sDout.h='Same amplifier, data.|Selber Verstärker, Daten.'; + hide(['ldrOnGround']); + if(dflt.pinDfRx<0)hide(['dfplayer']); + if(dflt.pinBattery<0)hide(['batteryDividerRatio','lowBatteryThreshold','batteryColor']); + if(dflt.pinI2cSda<0)hide(['tempOffset','humOffset','tempDecimals','temperatureColor','humidityColor']); + if(dflt.pinBuzzer<0&&dflt.pinI2sDout>=0){ + SYSF.buzzerVolume.l='Melody volume|Melodie-Lautstärke'; + SYSF.buzzerVolume.h='RTTTL melodies, on the built-in speaker.|RTTTL-Melodien über den eingebauten Lautsprecher.'; + } + if(!c.panel)return; + SYSF.panelWidth.w=SYSF.panels.w='fixed'; + hide(['panelStart','panelWiring','panelColorOrder','panelSerpentine','panelChainReverse','panelChainSerpentine']); + Object.assign(SYSF.panelHeight,{w:'select',opt:c.panel.heights.map(h=>[h,h+' px'])}); } const PINKEYS=['pinMatrix','pinBtnLeft','pinBtnSelect','pinBtnRight','pinBattery','pinLdr', 'pinBuzzer','pinI2cSda','pinI2cScl','pinDfRx','pinDfTx','pinI2sBclk','pinI2sLrclk','pinI2sDout', 'pinI2sMclk','pinAmpEnable']; -const REBOOT_KEYS=new Set(['wifiSsid','wifiPass','netStatic','ip','gateway','subnet','dns1','dns2', +const REBOOT_KEYS=new Set(['panelHeight','wifiSsid','wifiPass','netStatic','ip','gateway','subnet','dns1','dns2', 'wifiConnectTimeout','hostname','webPort','mqttEnabled','mqttHost','mqttPort','mqttUser', 'mqttPass','mqttPrefix','statsInterval','dfplayer','scriptingEnabled'].concat(PINKEYS)); function paintPinUse(fields){ @@ -1655,8 +1689,9 @@

AWTRIX NG

const pw=Number(fields.panelWidth.get()),n=Number(fields.panels.get()),w=pw*n; const bad=(w<32||w>128)?t('pnBadWidth'):''; out.className='badge '+(bad?'bad':'good'); - out.replaceChildren(bad||w+' × 8 = '+(w*8)+' '+t('pnLeds')+' · '+ - (n>1?n+' '+t('pnPanelsOf')+' '+pw+' × 8':t('pnOne'))); + const h=Number(fields.panelHeight.get()); + out.replaceChildren(bad||w+' × '+h+' = '+(w*h)+' '+t('pnLeds')+' · '+ + (n>1?n+' '+t('pnPanelsOf')+' '+pw+' × '+h:t('pnOne'))); } let gen=0; function poller(fn,ms){ @@ -1691,7 +1726,7 @@

AWTRIX NG

function nav(){ const cur=currentRoute(); const tabs=S.ap?TABS.filter(([r])=>r==='system') - :TABS.filter(([r])=>r!=='audio'||anyAudioCap()); + :TABS.filter(([r])=>(r!=='audio'||anyAudioCap())&&(r!=='scripts'||hasScripting())); $('#nav').setAttribute('aria-label',t('mainnav')); $('#nav').replaceChildren(...tabs.map(([r,k])=>el('a',{href:'#/'+r,class:cur===r?'on':'','aria-current':cur===r?'page':null},t(k)))); } @@ -1861,6 +1896,11 @@

AWTRIX NG

return{input:sel,get:()=>cur, set:v=>{cur=TZRULE.has(v)?v:'UTC';sel.value=cur;preview();}}; }, + // Shown, never edited: get() hands back the value it was given, so the field is never dirty. + fixed(ctl,def,value){ + ctl.append(el('span',{class:'mono'},(def.fmt?def.fmt(value):String(value))+(def.unit?' '+def.unit:''))); + return{input:null,get:()=>value,set:()=>{}}; + }, raw(ctl,def,value,onInput){ const input=el('input',{type:'text',value:typeof value==='string'?value:JSON.stringify(value)}); input.addEventListener('input',onInput); @@ -2846,7 +2886,16 @@

AWTRIX NG

} // HUB SCRIPT UPDATES END -function viewScripts(view){ +async function viewScripts(view){ + const generation=gen; + if(S.scripting===undefined){ + try{readAudioCaps((await api('/api/v1/capabilities')).data||{});nav();} + catch(e){view.append(el('div',{class:'card wide'},t('neterr')));return;} + if(generation!==gen)return; + } + if(!hasScripting()){ + view.append(el('div',{class:'card wide'},t('grpScript')+': '+unavailableNote()));return; + } const ed=mkCodeEditor(); const nameIn=el('input',{type:'text',placeholder:t('name'),maxlength:'32',spellcheck:'false', pattern:'[A-Za-z0-9_-]{1,32}'}); @@ -3467,12 +3516,7 @@

AWTRIX NG

catch(e){view.append(el('div',{class:'card wide'},t('neterr')));return;} if(!S.sysHost){try{setStats((await api('/api/v1/device',{timeout:4000})).data);}catch(e){}} if(!S.gpio||!S.aud){ - try{ - const caps=(await api('/api/v1/capabilities')).data||{}; - readAudioCaps(caps); - S.gpio=caps.gpio||null; - }catch(e){} - if(S.gpio)applyGpioCaps(S.gpio); + try{readAudioCaps((await api('/api/v1/capabilities')).data||{});}catch(e){} } if(!S.ap){ try{ @@ -3487,9 +3531,12 @@

AWTRIX NG

SYSF.radioVolume.g=g(hasSink('radio')); SYSF.radioMeta.g=g(hasSink('radio')); SYSF.soundEnabled.g=g(hasSink('buzzer','track','mp3')); + if(!hasSink('radio'))SYSF.soundEnabled.h='Master switch for one-shot sounds.|Hauptschalter für Einzelklänge.'; } ['wifiPass','mqttPass','authPass'].forEach(k=>{if(!(k in data))data[k]='';}); + SYSF.scriptingEnabled.g=hasScripting()?'script':'hidden'; (S.ap?provisioningPage:systemPage)(view,data); + if(!S.ap&&!hasScripting())view.append(el('div',{class:'card wide'},t('grpScript')+': '+unavailableNote())); } function systemSettingsPage(view,data){ const rbBtn=el('button',{class:'pri'},t('rebootnow')); @@ -3527,7 +3574,10 @@

AWTRIX NG

if(TZRULE.get(data.tzName)!==data.tz) data.tzName=TZFIRST.get(data.tz)||'UTC'; const page=systemSettingsPage(view,data); - const sysFields=renderSettingsInto(page,data,SYSF,SYS_GROUPS); + const fixed=!!(S.gpio&&S.gpio.fixed); + const groups=!fixed?SYS_GROUPS:SYS_GROUPS.map(g=>g[0]==='gpio'?['gpio','grpGpio','grpGpioFixedH'] + :g[0]==='panel'&&S.gpio.panel?['panel','grpPanel','grpPanelFixedH']:g); + const sysFields=renderSettingsInto(page,data,SYSF,groups); advancedSection(page,data,SYSF); if(sysFields.hostname&&S.sysHost) sysFields.hostname.row.querySelector('input').placeholder=S.sysHost; @@ -3569,10 +3619,16 @@

AWTRIX NG

gpioSec.querySelector('.rows').prepend( actionRow(t('preset'),t('presetH'),[presetBtn(t('presetUlanzi'),'ulanzi'),presetBtn(t('presetAwtrix2'),'awtrix2')])); } + const fixedRows=fixed?page.panel.querySelector('#sec-gpio .rows'):null; + if(fixedRows&&(S.gpio.reserved||[]).length){ + const why=new Map(); + S.gpio.reserved.forEach(r=>why.set(r.why,(why.get(r.why)||[]).concat(r.lo===r.hi?r.lo:r.lo+'–'+r.hi))); + fixedRows.append(actionRow(t('pinReserved'),[...why].map(([w,p])=>'GPIO '+p.join(', ')+': '+w).join(' · '),[])); + } if(S.gpio){ page.onUpdate.push(()=>paintPinUse(sysFields)); const sel=sysFields.pinBtnSelect; - if(sel&&S.gpio.rtc){ + if(sel&&S.gpio.rtc&&!fixed){ const note=el('div',{class:'help'}); sel.row.querySelector('.lab').append(note); page.onUpdate.push(()=>paintWakePin(sysFields,note)); @@ -3682,9 +3738,14 @@

AWTRIX NG

const run=S.stats&&S.stats.version; return c&&c.usable&&run&&verNewer(c.version,run)?c:null; } +// Only the ESP32 images install from the browser. A board that reports another image (a Pico's +// .uf2) is flashed over USB, so it gets neither the install action nor the upload control. +const OTA_IMAGES=['firmware-awtrix-ng.bin','firmware-awtrix-ng-s3-octal.bin','firmware-awtrix-ng-s3-quad.bin']; +// Unknown (no device facts yet, or the simulator's empty name) counts as capable, as with the capabilities. +const browserUpdate=()=>{const img=S.stats&&S.stats.updateImage;return !img||OTA_IMAGES.includes(img);}; async function downloadFirmware(release,onProgress){ const image=S.stats&&S.stats.updateImage; - if(!['firmware-awtrix-ng.bin','firmware-awtrix-ng-s3-octal.bin','firmware-awtrix-ng-s3-quad.bin'].includes(image))throw new Error(t('updnotready')); + if(!OTA_IMAGES.includes(image))throw new Error(t('updnotready')); const options={credentials:'omit',cache:'no-store',signal:AbortSignal.timeout(120000)}; const response=await fetch(OTA_BASE+'index.json',options); if(!response.ok)throw new Error(t('updnotready')); @@ -3727,7 +3788,10 @@

AWTRIX NG

const img=S.stats&&S.stats.updateImage; if(avail){ status.textContent=t('updnew').replace('{v}',avail.version)+(avail.published?' ('+avail.published+')':''); - if(img&&avail.assets[img]){available=avail;installBtn.disabled=false;} + if(img&&avail.assets[img]){ + if(browserUpdate()){available=avail;installBtn.disabled=false;} + else status.textContent+=' – '+tt('install its .uf2 over USB.|die .uf2 über USB installieren.'); + } notes.hidden=!avail.notes; if(!notes.hidden)notes.href=avail.notes; }else{ @@ -3793,7 +3857,8 @@

AWTRIX NG

}); page.section('maint',t('maint'),t('mainthelp'),[ updateRow(installFirmware), - actionRow(t('fwfile'),null,[fwBtn,fwIn]), + browserUpdate()?actionRow(t('fwfile'),null,[fwBtn,fwIn]) + :actionRow(tt('Install firmware|Firmware installieren'),tt('This board updates over USB: hold BOOTSEL while plugging it in, then copy the .uf2 onto the drive that appears.|Dieses Board wird über USB aktualisiert: beim Einstecken BOOTSEL gedrückt halten, dann die .uf2 auf das erscheinende Laufwerk kopieren.'),[]), fwStatus,fw.row, actionRow(t('reboot'),null,[rebootBtn]), actionRow(t('resetset'),t('resetsetH'),[resetBtn]), @@ -4861,6 +4926,9 @@

AWTRIX NG

const{section,panel}=sectionShell(view); const muted=el('div',{class:'ghelp',style:'display:none;color:var(--warn)'},t('melomuted')); panel.prepend(muted); + const missing=['mp3','radio'].filter(k=>!hasSink(k)); + if(missing.length)panel.prepend(el('div',{class:'ghelp'}, + missing.map(k=>k==='mp3'?'MP3':t('radioTab')).join(', ')+': '+unavailableNote())); // Each section carries the volume of the output it belongs to, so a level is set where the // sound is, not two tabs away. No help line here - the section heading already says which @@ -5462,7 +5530,7 @@

AWTRIX NG

const caps=(await api('/api/v1/capabilities')).data||{}; if(!S.transitions.length)S.transitions=caps.transitions||[]; readAudioCaps(caps); - if(!anyAudioCap())nav(); + nav(); }catch(e){} })(); } diff --git a/webui/test/capabilities.test.js b/webui/test/capabilities.test.js new file mode 100644 index 00000000..ace91b85 --- /dev/null +++ b/webui/test/capabilities.test.js @@ -0,0 +1,100 @@ +// Capability policy, not chip names, controls optional features. +const assert = require('node:assert/strict'); +const { boot, goto, flush } = require('./harness'); +(async () => { + for (const enabled of [false, true]) { + const { dom, window, store, netlog } = await boot({ caps: { + scripting: enabled, transitions: [], + audio: { buzzer: true, track: false, mp3: enabled, radio: enabled } + }}); + try { + + const nav = () => window.document.querySelector('#nav a[href="#/scripts"]'); + assert.equal(!!nav(), enabled, 'script navigation follows capability'); + await goto(window, '#/system'); + const view = () => window.document.querySelector('#view'); + assert.equal(view().textContent.includes('Run scripts'), enabled, 'script toggle follows capability'); + if (!enabled) assert.match(view().textContent, /not available on this board/i); + await goto(window, '#/scripts'); + if (!enabled) { + assert.match(view().textContent, /not available on this board/i); + assert.equal(view().querySelector('textarea'), null, 'direct route cannot expose editor'); + assert(!netlog.some(s => s.includes('/api/v1/scripts/shared')), 'no script polling'); + } else assert(view().querySelector('textarea'), 'enabled editor remains available'); + await goto(window, '#/audio'); + assert.equal(!!view().querySelector('#sec-mp3'), enabled); + assert.equal(!!view().querySelector('#sec-radio'), enabled); + assert(view().querySelector('#sec-melodies'), 'RTTTL remains available'); + if (!enabled) assert.match(view().textContent, /not available on this board/i); + console.log(`PASS capabilities scripting/mp3/radio=${enabled}`); + } finally { dom.window.close(); } + } + // A page opened straight on a gated route is drawn before /device and /capabilities answer. + // Each gated view waits for them itself, so a Pico never ends up showing what it lacks. + const pico = { scripting: false, transitions: [], + audio: { buzzer: true, track: false, mp3: false, radio: false } }; + for (const [route, device, capabilities] of [['#/audio', 300, 600], ['#/audio', 600, 300], + ['#/system', 300, 600], ['#/system', 600, 300]]) { + const { dom, window } = await boot({ caps: pico, url: 'http://localhost/' + route, + device: { soc: 'rp2040', updateImage: 'firmware-galactic-unicorn.uf2' }, + delays: { '/api/v1/device': device, '/api/v1/capabilities': capabilities } }); + try { + await flush(1000); + const view = window.document.querySelector('#view'); + assert.equal(view.querySelector('#sec-mp3, #sec-radio'), null, route + ': no MP3 or radio'); + assert.equal(view.textContent.includes('Run scripts'), false, route + ': no script toggle'); + assert.equal(view.querySelector('input[type=file][accept=".bin"]'), null, + route + ': no .bin upload'); + if (route === '#/audio') assert(view.querySelector('#sec-melodies'), 'RTTTL remains available'); + } finally { dom.window.close(); } + } + console.log('PASS capabilities on a route opened before the board answers'); + // A board with fixed wiring shows its pins rather than offering them, and drops the settings of + // hardware it lacks. The same board reported as configurable keeps the full page. + const unicorn = { soc: 'rp2040', label: 'Galactic Unicorn (Pico W / Pico 2 W)', fixed: true, + max: 29, missing: [], inputOnly: [], adc1: [[26, 28]], strapping: [], rtc: [], matrix: [], + reserved: [{ lo: 13, hi: 20, why: 'the fixed panel interface' }, + { lo: 23, hi: 25, why: 'the Pico wireless interface' }, + { lo: 29, hi: 29, why: 'the Pico wireless interface' }], + defaults: { pinMatrix: -1, pinBtnLeft: 0, pinBtnSelect: 1, pinBtnRight: 3, pinBattery: -1, + pinLdr: 28, pinBuzzer: -1, pinI2cSda: -1, pinI2cScl: -1, pinDfRx: -1, pinDfTx: -1, + pinI2sBclk: 10, pinI2sLrclk: 11, pinI2sDout: 9, pinI2sMclk: -1, pinAmpEnable: 22 }, + panel: { width: 53, heights: [8, 11] } }; + const system = { ...unicorn.defaults, panelWidth: 53, panelHeight: 11, panels: 1, + panelStart: 'topLeft', panelWiring: 'rows', panelColorOrder: 'GRB', panelSerpentine: true, + panelChainReverse: false, panelChainSerpentine: false, ldrOnGround: false, + batteryDividerRatio: 1.79, lowBatteryThreshold: 0, tempOffset: -9, humOffset: 0, + tempDecimals: 0, dfplayer: false }; + const settings = { useCelsius: true, temperatureColor: 0, humidityColor: 0, batteryColor: 0 }; + for (const fixed of [true, false]) { + const gpio = fixed ? unicorn : { ...unicorn, fixed: false, panel: undefined }; + const { dom, window } = await boot({ caps: { ...pico, gpio }, system, settings, + device: { soc: 'rp2040', updateImage: 'firmware-galactic-unicorn.uf2' } }); + try { + const view = () => window.document.querySelector('#view'); + const text = () => view().textContent; + await goto(window, '#/system'); + await flush(200); + const gpioSec = view().querySelector('#sec-gpio'); + assert.equal(gpioSec.querySelectorAll('select').length === 0, fixed, 'pins offered: ' + !fixed); + assert(gpioSec.textContent.includes('GPIO 28'), 'the light sensor pin is shown'); + for (const absent of ['Buzzer', 'I2C SDA', 'DFPlayer RX', 'Battery']) + assert.equal(gpioSec.textContent.includes(absent), !fixed, absent + ' row: ' + !fixed); + assert.equal(gpioSec.textContent.includes('GPIO 23–25, 29: the Pico wireless interface'), fixed); + assert.equal(text().includes('Cannot wake AWTRIX'), !fixed, 'wake note'); + for (const absent of ['LDR on GND', 'Battery divider', 'Temperature offset', 'Wiring direction']) + assert.equal(text().includes(absent), !fixed, absent + ': ' + !fixed); + assert.equal(view().querySelector('#sec-sndhw').textContent.includes('DFPlayer'), !fixed); + assert.equal(text().includes('Melody volume'), fixed); + const heights = [...view().querySelectorAll('#sec-panel select option')].map(o => o.value); + if (fixed) assert.deepEqual(heights, ['8', '11'], 'the panel heights this board runs at'); + assert.equal(window.document.querySelector('#savebar').style.display, 'none', 'nothing dirty'); + await goto(window, '#/display'); + await flush(200); + assert(text().includes('Celsius'), 'scripts read useCelsius, so it stays'); + for (const absent of ['Temperature colour', 'Battery colour']) + assert.equal(text().includes(absent), !fixed, absent + ': ' + !fixed); + console.log(`PASS capabilities fixed wiring=${fixed}`); + } finally { dom.window.close(); } + } +})().then(() => process.exit(0)).catch(e => { console.error(e); process.exit(1); }); diff --git a/webui/test/harness.js b/webui/test/harness.js index 9de337fe..d941136d 100644 --- a/webui/test/harness.js +++ b/webui/test/harness.js @@ -61,6 +61,9 @@ function makeStore() { audio: { buzzer: true, track: false, mp3: true, radio: true } }, settings: { soundEnabled: true, buzzerVolume: 80, dfplayerVolume: 80, mp3Volume: 70, radioVolume: 60, radioMeta: true }, + // What GET /api/v1/system and GET /api/v1/display answer. + system: { hostname: 'awtrix-ng', scriptingEnabled: true }, + display: { power: true }, // dir -> Map(name -> size), the file API's flash view. files: { '/ICONS': new Map(), '/MP3': new Map() }, melodies: [], // [{name, rtttl, valid, notes, durationMs, bytes}] @@ -162,7 +165,8 @@ function mockFetch(store, netlog, win) { if (p === '/api/v1/device') return resp(store.device); if (p === '/api/v1/capabilities') return store.caps ? resp(store.caps) : resp({ error: { message: 'offline' } }, false, 503); - if (p === '/api/v1/system') return resp({ hostname: 'awtrix-ng' }); + if (p === '/api/v1/system') return resp(store.system); + if (p === '/api/v1/display' && method === 'GET') return resp(store.display); if (p === '/api/v1/settings' && method === 'GET') return resp(store.settings); if (p === '/api/v1/settings' && method === 'PATCH') { store.settingsPatch = JSON.parse(opts.body || '{}'); @@ -295,18 +299,33 @@ function mockFetch(store, netlog, win) { }; } +// Holds the chosen API answers back by `delays[path]` ms, so a test can watch a +// page that is already drawn when its data arrives. +const delayed = (fetchImpl, delays) => window => { + const fetch = fetchImpl(window); + if (!delays) return fetch; + return (url, opts) => { + const ms = delays[new URL(url, 'http://localhost').pathname]; + return ms ? new Promise(r => setTimeout(() => r(fetch(url, opts)), ms)) : fetch(url, opts); + }; +}; + async function boot(opts) { const store = makeStore(); // The boot IIFE fetches capabilities immediately, so a test that wants // different caps has to hand them in before the page comes up. if (opts && 'caps' in opts) store.caps = opts.caps; + if (opts && opts.device) Object.assign(store.device, opts.device); + if (opts && opts.system) Object.assign(store.system, opts.system); + if (opts && opts.settings) Object.assign(store.settings, opts.settings); const netlog = []; const dom = new JSDOM(loadHtml(), { runScripts: 'dangerously', pretendToBeVisual: true, - url: 'http://localhost/', + // opts.url opens the page straight on a route, the way a bookmark does. + url: (opts && opts.url) || 'http://localhost/', virtualConsole: makeVirtualConsole(), - beforeParse: installGlobals(window => mockFetch(store, netlog, window)), + beforeParse: installGlobals(delayed(window => mockFetch(store, netlog, window), opts && opts.delays)), }); await flush(60); // boot render() + device/capabilities/system fetches return { dom, window: dom.window, store, netlog }; diff --git a/webui/test/package.json b/webui/test/package.json index deaa5964..94414870 100644 --- a/webui/test/package.json +++ b/webui/test/package.json @@ -4,7 +4,7 @@ "private": true, "description": "jsdom-based tests for the awtrix-ng web UI (webui/index.html)", "scripts": { - "test": "node scripts-editor.test.js && node dashboard.test.js && node backup-restore.test.js && node apps-tab.test.js && node audio-tab.test.js && node gif.test.js && node icons-db.test.js && node icons-auth.test.js && node update-check.test.js && node hub-script-updates.test.js", + "test": "node capabilities.test.js && node scripts-editor.test.js && node dashboard.test.js && node backup-restore.test.js && node apps-tab.test.js && node audio-tab.test.js && node gif.test.js && node icons-db.test.js && node icons-auth.test.js && node update-check.test.js && node hub-script-updates.test.js", "test:sim": "node scripts-editor.test.js --sim && node dashboard.test.js && node backup-restore.test.js --sim && node apps-tab.test.js && node audio-tab.test.js && node gif.test.js && node icons-db.test.js && node icons-auth.test.js && node update-check.test.js" }, "devDependencies": { diff --git a/webui/test/update-check.test.js b/webui/test/update-check.test.js index 43015ffb..e35a8ac8 100644 --- a/webui/test/update-check.test.js +++ b/webui/test/update-check.test.js @@ -10,7 +10,8 @@ function assert(cond, msg) { const release = (tag, extra = {}) => ({ tag_name: tag, draft: false, prerelease: false, published_at: '2026-09-01T10:00:00Z', html_url: 'https://github.com/Blueforcer/awtrix-ng/releases/tag/' + tag, - assets: ['firmware-awtrix-ng.bin', 'firmware-awtrix-ng-s3-octal.bin', 'firmware-awtrix-ng-s3-quad.bin'] + assets: ['firmware-awtrix-ng.bin', 'firmware-awtrix-ng-s3-octal.bin', 'firmware-awtrix-ng-s3-quad.bin', + 'firmware-galactic-unicorn.uf2', 'firmware-galactic-unicorn-2w.uf2'] .map(name => ({ name, browser_download_url: 'https://github.com/Blueforcer/awtrix-ng/releases/download/' + tag + '/' + name })), ...extra, }); @@ -18,6 +19,7 @@ const release = (tag, extra = {}) => ({ const githubCalls = netlog => netlog.filter(l => l.includes('api.github.com')).length; const status = window => window.document.getElementById('upd-status'); const install = window => window.document.getElementById('upd-install'); +const binUpload = window => window.document.querySelector('input[type=file][accept=".bin"]'); async function openSystem(opts) { const ctx = await boot(); @@ -42,6 +44,7 @@ async function testNewerReleaseOffersTheMatchingFile() { assert(notes.querySelector('svg use')?.getAttribute('href')==='#i-file' && notes.getAttribute('aria-label')==='Release notes', 'release notes use the existing accessible document icon'); assert(notes.href.endsWith('/v1.1.2'),'document icon links to the matching release'); assert(notes.nextElementSibling===install(window),'release notes sit directly left of the install button'); + assert(binUpload(window),'an ESP32 keeps the manual .bin upload'); await goto(window, '#/'); await flush(60); const meta = window.document.querySelector('.meta'); @@ -49,6 +52,19 @@ async function testNewerReleaseOffersTheMatchingFile() { window.close(); } +async function testUsbOnlyBoardIsNotOfferedABrowserInstall() { + for (const image of ['firmware-galactic-unicorn.uf2', 'firmware-galactic-unicorn-2w.uf2']) { + const { window } = await openSystem({ latest: release('v1.1.2'), device: { updateImage: image } }); + assert(/1\.1\.2/.test(status(window).textContent) && /USB/.test(status(window).textContent), + image + ': the newer release is named, with how to install it'); + assert(install(window).textContent === 'Check for updates', image + ': no Download & install, which would always fail'); + assert(!window.document.getElementById('upd-notes').hidden, image + ': the release notes link, where the .uf2 is, stays'); + assert(!binUpload(window), image + ': no .bin upload, which /update refuses'); + assert(/BOOTSEL/.test(window.document.body.textContent), image + ': the USB route is explained instead'); + window.close(); + } +} + async function testSameVersionIsUpToDate() { const { window } = await openSystem({ latest: release('v1.1.1') }); assert(status(window) && /1\.1\.1/.test(status(window).textContent) && !/1\.1\.2/.test(status(window).textContent), @@ -197,6 +213,7 @@ async function main() { await testBadFirmwareNeverUploads(); await testRejectedFirmwareAllowsRetry(); await testNewerReleaseOffersTheMatchingFile(); + await testUsbOnlyBoardIsNotOfferedABrowserInstall(); await testSameVersionIsUpToDate(); await testPrereleaseDoesNotCount(); await testCheckIsCachedAcrossVisits();