validity: Iteration 7 — Device Pairing & Hardware Abstraction Layer

Add HAL (validity_hal.h/c) with per-device lookup table for 4 PIDs
(0090, 0097, 009a, 009d). Each entry holds init_hardcoded, clean_slate,
reset_blob, db_write_enable blobs and a flash layout with partition
table + RSA signature.

Add device pairing SSM (validity_pair.h/c) — a 30-state machine that
runs as a child of the open SSM when the sensor has no TLS partitions.
Phases: raw USB keygen + partition flash, TLS handshake, erase 5
partitions, write 4096-byte TLS flash image, reboot.

Integration:
- OPEN_PAIR state in open SSM (between FWEXT and TLS_READ_FLASH)
- Skipped in emulation, no-fwext, or already-paired cases
- Post-reboot returns FP_DEVICE_ERROR_REMOVED for fprintd retry

Migration:
- validity_db.c and validity_fwext.c now use HAL lookups
- Removed hardcoded validity_blob_dbe_009a.inc

Tests: 24 new test cases (10 HAL + 14 pairing), 0 regressions.
Result: 40 OK, 0 Fail, 2 Skipped.
This commit is contained in:
Leonardo Francisco 2026-04-06 14:57:50 -04:00 committed by Leonardo
parent c120ef0797
commit a0872b3b65
22 changed files with 7081 additions and 255 deletions

View file

@ -0,0 +1,217 @@
# Iteration 7: Device Pairing & Hardware Abstraction Layer (HAL)
## Overview
Iteration 7 introduces two major subsystems:
1. **Hardware Abstraction Layer (HAL)** — A lookup table that maps device PIDs to
their per-device blobs (init_hardcoded, clean_slate, reset_blob, db_write_enable)
and flash layout (partition table + RSA signature).
2. **Device Pairing** — A 30-state SSM that performs first-time pairing when the
sensor has no TLS flash partitions. This involves ECDH key exchange, certificate
generation, partition table flashing, TLS handshake, erase cycles, and writing
the TLS flash image.
## Supported Devices
| VID | PID | Dev Type | Clean Slate | Notes |
|--------|--------|--------------------|-------------|------------------|
| 0x138a | 0x0090 | VALIDITY_DEV_90 | No | Smaller blobs |
| 0x138a | 0x0097 | VALIDITY_DEV_97 | Yes | |
| 0x06cb | 0x009a | VALIDITY_DEV_9A | Yes | |
| 0x138a | 0x009d | VALIDITY_DEV_9D | Yes | |
## Architecture
### HAL (`validity_hal.h`, `validity_hal.c`)
```
ValidityDeviceDesc (per-PID)
├── vid, pid, dev_type
├── init_hardcoded / init_hardcoded_len
├── init_clean_slate / init_clean_slate_len (NULL for 0090)
├── reset_blob / reset_blob_len
├── db_write_enable / db_write_enable_len
└── flash_layout → ValidityFlashLayout
├── partitions[] → ValidityPartition { id, type, access_lvl, offset, size }
├── num_partitions
├── partition_sig / partition_sig_len (256 bytes RSA-2048)
```
Lookup functions:
- `validity_hal_device_lookup(ValidityHalDeviceType)` — by enum type
- `validity_hal_device_lookup_by_pid(guint16 pid)` — by USB PID
### Pairing SSM (`validity_pair.h`, `validity_pair.c`)
The pairing SSM runs as a child of the open SSM (`OPEN_PAIR` state). It is
skipped when: (a) emulation mode, (b) no firmware extension loaded, or
(c) `num_partitions > 0` (already paired).
#### SSM Phases
**Phase 1 — Raw USB (pre-TLS):**
- `GET_FLASH_INFO` → parse flash IC params + partition count
- Check if pairing needed (0 partitions)
- Send reset blob
- Generate ECDH key pair (P-256)
- Build & send partition flash command (0x4f)
- CMD 0x50 (get ECDH server response)
- Extract server cert, ECDH blob, derive keys, encrypt private key
- Cleanup commands (0x1a series)
**Phase 2 — TLS Handshake:**
- Start TLS handshake child SSM
**Phase 3 — TLS Erase Loop:**
- Erase 5 partitions in order: {1, 2, 5, 6, 4}
- Each: DB write enable → erase → cleanup
**Phase 4 — TLS Write Flash:**
- DB write enable → write 4096-byte TLS flash image → cleanup
**Phase 5 — Reboot:**
- Send reboot command (0x05 0x02 0x00)
- Returns `FP_DEVICE_ERROR_REMOVED` so fprintd re-opens device
### TLS Flash Image Format
```
Offset Content
0x000 Block 0: [id:2LE=0][size:2LE=1][SHA256:32][body:1=0x01]
0x025 Block 4: [id:2LE=4][size:2LE][SHA256:32][priv_blob]
Block 3: [id:2LE=3][size:2LE][SHA256:32][server_cert]
Block 5: [id:2LE=5][size:2LE][SHA256:32][ecdh_blob]
Block 1: [id:2LE=1][size:2LE][SHA256:32][ca_cert(420B)]
Block 2: [id:2LE=2][size:2LE][SHA256:32][client_cert(444B)]
Block 6: [id:2LE=6][size:2LE][SHA256:32][16 zero bytes]
Padding: 0xff to 4096 bytes total
```
## Files
| File | Purpose |
|----------------------------|--------------------------------------|
| `validity_hal.h` | HAL types, lookup function decls |
| `validity_hal.c` | HAL device table, blob includes |
| `validity_pair.h` | Pair state, SSM enum, helper decls |
| `validity_pair.c` | Pair SSM runner + all helpers |
| `validity_pair_constants.inc` | CA cert, partition signatures |
| `validity_blobs_0090.inc` | Blobs for PID 0090 |
| `validity_blobs_0097.inc` | Blobs for PID 0097 |
| `validity_blobs_009a.inc` | Blobs for PID 009a |
| `validity_blobs_009d.inc` | Blobs for PID 009d |
## Build & Test Runbook
### Build
```
cd /home/lewohart/src/libfprint
meson setup builddir # first time only
ninja -C builddir
```
### Run All Tests
```
meson test -C builddir --print-errorlogs
```
Expected output:
```
Ok: 40
Fail: 0
Skipped: 2
```
The 2 skipped tests are `virtual-image` and `virtual-device` (require
`FPRINT_VIRTUAL_IMAGE` / `FPRINT_VIRTUAL_DEVICE` environment variables).
### Run Only Unit Tests
```
meson test -C builddir --suite unit-tests --print-errorlogs
```
Expected output (8 unit test suites):
```
unit-tests - libfprint:validity-tls OK
unit-tests - libfprint:validity-fwext OK
unit-tests - libfprint:validity-sensor OK
unit-tests - libfprint:validity-capture OK
unit-tests - libfprint:validity-db OK
unit-tests - libfprint:validity-verify OK
unit-tests - libfprint:validity-hal OK
unit-tests - libfprint:validity-pair OK
unit-tests - libfprint:fpi-assembling OK
unit-tests - libfprint:fpi-ssm OK
unit-tests - libfprint:fpi-device OK
```
### Run Individual Tests
```
# HAL tests (10 test cases)
meson test -C builddir validity-hal --print-errorlogs
# Pairing tests (14 test cases)
meson test -C builddir validity-pair --print-errorlogs
```
### Verbose Single Test
```
./builddir/tests/test-validity-hal --verbose
./builddir/tests/test-validity-pair --verbose
```
## Test Coverage
### HAL Tests (`test-validity-hal.c`) — 10 cases
| Test | Validates |
|------------------------------------|----------------------------------------|
| `lookup-by-type` | All 4 device types resolve |
| `lookup-by-pid` | All 4 PIDs resolve |
| `lookup-invalid-type` | Invalid type returns NULL |
| `lookup-invalid-pid` | Invalid PID returns NULL |
| `blobs-present` | Non-null blobs with non-zero sizes |
| `pid-0090-specifics` | 0090 has no clean_slate blob |
| `clean-slate-presence` | 0097/009a/009d have clean_slate |
| `flash-layout-valid` | Partition count, sig, offsets ordering |
| `blob-sizes` | Known blob sizes per device |
| `lookup-consistency` | by_type and by_pid return same pointer |
### Pairing Tests (`test-validity-pair.c`) — 14 cases
| Test | Validates |
|------------------------------------|----------------------------------------|
| `parse-flash-info-valid` | Correct parsing of flash IC params |
| `parse-flash-info-needs-pairing` | 0 partitions = needs pairing |
| `parse-flash-info-too-short` | Short buffer returns FALSE |
| `serialize-partition` | Output format + embedded SHA-256 |
| `make-cert-size` | Certificate is exactly 444 bytes |
| `make-cert-deterministic` | Same inputs → same header bytes |
| `encrypt-key-structure` | Output is 161 bytes, prefix 0x02 |
| `encrypt-key-hmac-valid` | HMAC over iv+ct matches stored HMAC |
| `build-partition-flash-cmd` | 0x4f prefix, header structure |
| `build-tls-flash-size` | Exactly 4096 bytes, 0xff padding |
| `build-tls-flash-blocks` | Block 0 and block 4 in correct order |
| `state-lifecycle` | Init zeroes all fields, free is safe |
| `state-free-with-resources` | Free releases EVP_PKEY + g_malloc'd |
| `encrypt-key-different-inputs` | Different keys → different ciphertext |
## Integration Points
- **Open SSM**: `OPEN_PAIR` state between `OPEN_UPLOAD_FWEXT` and `OPEN_TLS_READ_FLASH`
- **Close**: `validity_pair_state_free()` called in `dev_close`
- **DB operations**: `validity_db_get_write_enable_blob()` now takes `guint dev_type`
and uses HAL lookup (replaces hardcoded blob include)
- **FWExt operations**: `validity_fwext_get_db_write_enable()` uses HAL lookup by PID
## Migration Notes
- Deleted `validity_blob_dbe_009a.inc` — replaced by per-device blobs in HAL
- `validity_db.c` and `validity_fwext.c` now depend on `validity_hal.h`

View file

@ -24,6 +24,7 @@
#include "fpi-byte-reader.h"
#include "validity.h"
#include "validity_fwext.h"
#include "validity_pair.h"
#include "validity_tls.h"
#include "vcsfw_protocol.h"
@ -176,6 +177,7 @@ typedef enum {
OPEN_SEND_GET_FW_INFO,
OPEN_RECV_GET_FW_INFO,
OPEN_UPLOAD_FWEXT,
OPEN_PAIR,
OPEN_TLS_READ_FLASH,
OPEN_TLS_DERIVE_PSK,
OPEN_TLS_HANDSHAKE,
@ -280,6 +282,47 @@ fwext_upload_ssm_done (FpiSsm *ssm,
"Device rebooting after firmware upload"));
}
/* Callback for pairing child SSM */
static void
pair_ssm_done (FpiSsm *ssm,
FpDevice *dev,
GError *error)
{
FpiDeviceValidity *self = FPI_DEVICE_VALIDITY (dev);
if (error)
{
/* Check if the pairing caused a reboot — same pattern as fwext upload */
if (g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_REMOVED))
{
fp_info ("Device rebooting after pairing");
fpi_ssm_mark_failed (self->open_ssm, error);
return;
}
fp_warn ("Pairing failed: %s — continuing (device may not work)",
error->message);
g_clear_error (&error);
}
/* Check if pairing caused a reboot (PAIR_REBOOT_RECV was reached) */
if (self->pair_state.priv_blob != NULL)
{
/* Pairing was performed and device is rebooting.
* Signal to fprintd to retry the open. */
fp_info ("Pairing complete — device rebooting, signalling removal");
validity_pair_state_free (&self->pair_state);
fpi_ssm_mark_failed (self->open_ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_REMOVED,
"Device rebooting after pairing"));
return;
}
/* Pairing was not needed (num_partitions > 0) — continue */
validity_pair_state_free (&self->pair_state);
fpi_ssm_next_state (self->open_ssm);
}
/* Callback for optional TLS handshake child SSM */
static void
tls_handshake_ssm_done (FpiSsm *ssm,
@ -396,6 +439,34 @@ open_run_state (FpiSsm *ssm,
}
break;
case OPEN_PAIR:
{
FpiDeviceValidity *self = FPI_DEVICE_VALIDITY (dev);
/* In emulation mode, skip pairing */
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
{
fp_dbg ("Emulation mode — skipping pairing check");
fpi_ssm_next_state (ssm);
return;
}
/* Without fwext, no flash commands work */
if (!self->fwext_loaded)
{
fp_info ("No firmware extension — skipping pairing check");
fpi_ssm_next_state (ssm);
return;
}
fp_info ("Starting pairing check…");
validity_pair_state_init (&self->pair_state);
self->open_ssm = ssm;
FpiSsm *pair_ssm = validity_pair_ssm_new (dev);
fpi_ssm_start (pair_ssm, pair_ssm_done);
}
break;
case OPEN_TLS_READ_FLASH:
{
FpiDeviceValidity *self = FPI_DEVICE_VALIDITY (dev);
@ -737,6 +808,7 @@ dev_close (FpDevice *device)
validity_capture_state_clear (&self->capture);
validity_sensor_state_clear (&self->sensor);
validity_pair_state_free (&self->pair_state);
validity_tls_free (&self->tls);
g_clear_object (&self->interrupt_cancellable);

View file

@ -24,6 +24,7 @@
#include "fpi-ssm.h"
#include "validity_capture.h"
#include "validity_db.h"
#include "validity_pair.h"
#include "validity_sensor.h"
#include "validity_tls.h"
@ -218,6 +219,9 @@ struct _FpiDeviceValidity
/* Firmware extension status */
gboolean fwext_loaded;
/* Pairing state (for uninitialized devices) */
ValidityPairState pair_state;
/* Calibration state */
gboolean calibrated;
guint calib_iteration;

View file

@ -1,230 +0,0 @@
/* db_write_enable blob for 06cb:009a (3621 bytes) */
static const guint8 db_write_enable_009a[] = {
0x06, 0x02, 0x00, 0x00, 0x01, 0xf4, 0x80, 0x01, 0x07, 0x48, 0x92, 0xb6, 0xc5, 0x7d, 0xeb, 0x78,
0x89, 0xb5, 0xeb, 0xf8, 0x6b, 0xc3, 0x04, 0x0f, 0x6d, 0x91, 0xff, 0x1f, 0x68, 0x76, 0x5f, 0x04,
0x65, 0x91, 0x18, 0x4b, 0xe0, 0x8c, 0xf3, 0x6c, 0x15, 0x4b, 0x7e, 0xc5, 0x36, 0x81, 0x39, 0xd0,
0xf9, 0x53, 0x23, 0x82, 0x21, 0x43, 0x79, 0xaf, 0xf3, 0xff, 0xbf, 0xe4, 0x65, 0x9e, 0x2f, 0x27,
0x4e, 0x86, 0x4b, 0xd0, 0xad, 0x66, 0x0f, 0x99, 0xe2, 0x1d, 0xa2, 0xba, 0xb6, 0x77, 0xdb, 0xfa,
0x90, 0x7a, 0x66, 0xce, 0x11, 0x0c, 0x18, 0x0d, 0x2d, 0xdc, 0x5d, 0xfe, 0x40, 0xb8, 0xed, 0x97,
0x5c, 0xbe, 0xdf, 0xfc, 0x11, 0x63, 0x1f, 0x12, 0xf8, 0xbd, 0x64, 0x6a, 0x0e, 0xe8, 0x2d, 0x44,
0xd2, 0xa6, 0xc1, 0xec, 0x9c, 0xfb, 0xd4, 0x0f, 0x48, 0x5c, 0xb3, 0xd9, 0x12, 0x43, 0x76, 0xb9,
0x7b, 0x4a, 0x33, 0x49, 0xb0, 0xa7, 0x30, 0xad, 0xda, 0x62, 0x6d, 0x8a, 0xc2, 0x8e, 0xc2, 0x0e,
0x88, 0x6a, 0xab, 0x1b, 0x88, 0x51, 0xde, 0xee, 0x34, 0x31, 0xc4, 0xd8, 0x9c, 0x8b, 0xb3, 0xe7,
0x87, 0xea, 0xa9, 0xc0, 0x32, 0x3d, 0xfe, 0x58, 0x3d, 0x54, 0x24, 0xd3, 0x64, 0x36, 0xe4, 0x43,
0x50, 0x43, 0xe0, 0x4f, 0xd4, 0xea, 0x46, 0xb1, 0xfb, 0x25, 0x07, 0xca, 0x6f, 0x0e, 0xb0, 0x3b,
0xaf, 0x27, 0xc8, 0x4b, 0x81, 0x9c, 0xbc, 0x96, 0xce, 0xc3, 0x1a, 0x78, 0x04, 0x5e, 0xb6, 0x48,
0x33, 0x9e, 0x2a, 0xa4, 0x78, 0x9e, 0x76, 0x72, 0xd9, 0x33, 0x93, 0x60, 0x05, 0xf4, 0x72, 0x0c,
0x8f, 0xfd, 0xc1, 0xea, 0x23, 0xa4, 0xf3, 0x0a, 0x1c, 0xdc, 0x8f, 0x6e, 0x87, 0x77, 0x5c, 0x24,
0x1b, 0x9a, 0xb1, 0x56, 0x6f, 0x77, 0x71, 0x85, 0x7c, 0xc4, 0x70, 0x3d, 0x57, 0x1f, 0x11, 0x06,
0xc5, 0x26, 0xf9, 0x52, 0x32, 0x92, 0x5a, 0x6a, 0x93, 0xec, 0x8e, 0x91, 0x90, 0x22, 0xfb, 0xe3,
0x03, 0xa5, 0x15, 0xf9, 0xaa, 0xa8, 0xca, 0x21, 0x50, 0x72, 0x06, 0x93, 0x11, 0xdd, 0x3f, 0x97,
0xd9, 0xa4, 0xf5, 0x62, 0x59, 0xba, 0xb3, 0xa1, 0xb7, 0xa8, 0x58, 0x2d, 0x6d, 0xc2, 0xf9, 0x2d,
0x49, 0xf0, 0x23, 0xd6, 0xf2, 0x5a, 0x05, 0x83, 0x7e, 0x15, 0x36, 0xa6, 0x33, 0xe2, 0x52, 0xef,
0x64, 0x52, 0x25, 0xf4, 0x29, 0x39, 0x55, 0x04, 0x1a, 0x0d, 0x54, 0xdc, 0xb1, 0xd1, 0xdd, 0x7e,
0x09, 0x7b, 0x78, 0x39, 0xde, 0x5f, 0xde, 0x2a, 0x6c, 0xe9, 0x99, 0x96, 0x6d, 0x71, 0x2b, 0x4c,
0xb2, 0xfd, 0x9d, 0x78, 0x30, 0x03, 0x1d, 0xa5, 0x5d, 0x9f, 0xaa, 0x99, 0xf8, 0x66, 0xfb, 0xb7,
0xe5, 0x20, 0x56, 0x6e, 0xfb, 0xa4, 0x3c, 0x25, 0x09, 0x28, 0x6b, 0xf2, 0x8e, 0x1a, 0x20, 0xc6,
0xa8, 0x36, 0xdb, 0x8a, 0x1f, 0xa4, 0xcb, 0x9b, 0x8d, 0x19, 0x37, 0x80, 0xaa, 0xb5, 0x92, 0xd4,
0x16, 0x53, 0x83, 0x96, 0x70, 0x12, 0x90, 0x66, 0xac, 0x56, 0xf1, 0x26, 0x8e, 0x6f, 0x76, 0x13,
0x37, 0xf7, 0x68, 0x55, 0x5e, 0x13, 0xc5, 0xd6, 0x81, 0x37, 0xc6, 0x0f, 0x83, 0xdb, 0xa8, 0xdc,
0x38, 0x63, 0xe0, 0x0e, 0x73, 0xfd, 0x3a, 0xf2, 0x1e, 0x23, 0xa5, 0x66, 0xda, 0xa6, 0x7f, 0x3f,
0x14, 0xdd, 0x93, 0x4e, 0x32, 0x36, 0x51, 0x16, 0x70, 0x21, 0xca, 0x6b, 0x82, 0xa6, 0x10, 0x3c,
0xb3, 0x0b, 0xe8, 0x49, 0x44, 0x6e, 0x2f, 0x54, 0xdd, 0xe6, 0x4a, 0x05, 0x37, 0x70, 0x52, 0xb5,
0x73, 0x32, 0xe9, 0xbf, 0x08, 0xa1, 0x8c, 0xf5, 0x2d, 0xa2, 0xa1, 0x3e, 0xbb, 0xd5, 0x5e, 0x60,
0x33, 0x3f, 0x8b, 0xc3, 0x19, 0xe1, 0x45, 0x7f, 0x38, 0xec, 0x5d, 0x48, 0x39, 0xec, 0x0e, 0xcd,
0x03, 0x48, 0x25, 0xbd, 0xea, 0xf6, 0x49, 0x26, 0x85, 0x8c, 0x6e, 0x8c, 0x2d, 0xf4, 0x18, 0x71,
0x7b, 0x5f, 0x67, 0x13, 0x5a, 0xbc, 0x03, 0x88, 0x35, 0xd3, 0xe4, 0xe1, 0xaa, 0x80, 0x95, 0x46,
0xfd, 0x0d, 0x7f, 0x01, 0x06, 0x6a, 0x71, 0x53, 0x7f, 0x96, 0xbd, 0x1e, 0xce, 0xc3, 0x68, 0x75,
0x83, 0xe1, 0xb5, 0x11, 0xbf, 0x48, 0xc2, 0x77, 0x6f, 0x46, 0x70, 0x15, 0x8e, 0x56, 0x16, 0x4c,
0x62, 0xda, 0x20, 0xf6, 0x71, 0x76, 0x4c, 0x78, 0x5c, 0x35, 0x2f, 0xc3, 0xcc, 0xe2, 0x2c, 0xef,
0xa2, 0x07, 0x60, 0xac, 0xff, 0x8f, 0x45, 0xef, 0xb5, 0x4a, 0x93, 0x4f, 0x98, 0x34, 0xd5, 0x4f,
0x97, 0x01, 0xde, 0xda, 0xcd, 0x4d, 0x38, 0x3a, 0xc0, 0x1f, 0x8c, 0xca, 0x92, 0x56, 0x2e, 0xec,
0x77, 0x4a, 0x58, 0xda, 0x6f, 0x55, 0xda, 0x25, 0x2c, 0x49, 0x1e, 0xe2, 0xab, 0x58, 0xff, 0x76,
0x9f, 0x89, 0xa9, 0x64, 0x9d, 0x39, 0x56, 0x68, 0x2c, 0xa7, 0xd0, 0x6b, 0xbf, 0x33, 0xf9, 0xa9,
0x35, 0xb7, 0x81, 0xdf, 0xc2, 0x1b, 0x12, 0x3b, 0x16, 0x69, 0x44, 0x24, 0xe7, 0x2d, 0x6a, 0x3e,
0x67, 0x81, 0xdc, 0xf1, 0x95, 0xef, 0xfd, 0x36, 0x47, 0x0a, 0x4e, 0xab, 0x0f, 0xdc, 0x74, 0xe8,
0x71, 0x02, 0x87, 0x9e, 0xc8, 0x1f, 0xea, 0x65, 0x49, 0x92, 0x0c, 0xce, 0x45, 0x4a, 0xc7, 0x81,
0x39, 0x97, 0xb8, 0x2d, 0x51, 0xe7, 0xb8, 0xc1, 0xee, 0x24, 0xfa, 0xd3, 0x89, 0x90, 0x44, 0x78,
0xf8, 0x47, 0x65, 0x4e, 0xc3, 0xa6, 0x3b, 0xc5, 0x95, 0xb9, 0xa7, 0xdd, 0xe7, 0x98, 0xdb, 0x5c,
0x0b, 0x6f, 0x24, 0x49, 0x01, 0xf2, 0x39, 0xe7, 0x67, 0x4c, 0x98, 0xee, 0xbb, 0x42, 0xb6, 0x6e,
0x89, 0x56, 0xa7, 0x33, 0xc3, 0x79, 0x65, 0x86, 0x28, 0x0a, 0x19, 0xa1, 0xdf, 0x8a, 0x69, 0x22,
0x4a, 0xcd, 0x25, 0x56, 0xf7, 0xec, 0x2e, 0x27, 0xca, 0xe3, 0x7c, 0x69, 0xb3, 0x32, 0xb2, 0xc0,
0xec, 0x85, 0x99, 0x1a, 0xe4, 0x87, 0x22, 0xf9, 0x88, 0x93, 0x5f, 0x65, 0x8b, 0x9c, 0xf3, 0x2f,
0x46, 0xdf, 0xc6, 0xd9, 0x6a, 0x5a, 0x36, 0xf1, 0x8b, 0x6b, 0xf9, 0xf6, 0x57, 0xb5, 0x9b, 0x3d,
0xa4, 0x24, 0x14, 0xe4, 0xd5, 0x6c, 0x0a, 0x24, 0x48, 0x5a, 0xa2, 0x98, 0xd2, 0xd0, 0xd1, 0xb1,
0x77, 0xe7, 0xd0, 0xda, 0xfe, 0x60, 0x2a, 0x4f, 0xb4, 0xf4, 0x23, 0xde, 0xf4, 0xbd, 0xb0, 0x10,
0xfd, 0xc6, 0x26, 0xc9, 0x47, 0x58, 0x7e, 0x19, 0xe7, 0xe4, 0xb0, 0xe6, 0xf9, 0xf2, 0xda, 0x41,
0xc2, 0x9a, 0x8f, 0x19, 0x03, 0xd0, 0xd2, 0x80, 0x33, 0x65, 0xfe, 0x0a, 0x11, 0x3a, 0xbb, 0xa1,
0x92, 0x20, 0x14, 0x1d, 0x1a, 0xc7, 0xce, 0xc6, 0x83, 0x96, 0x20, 0x30, 0xd3, 0xf6, 0x59, 0x1f,
0x98, 0xea, 0x3d, 0xd0, 0x91, 0x62, 0x71, 0x5e, 0x5c, 0x12, 0xf4, 0x03, 0x32, 0xb4, 0x7c, 0x53,
0x16, 0x45, 0x32, 0x82, 0x7e, 0x55, 0x96, 0xfb, 0x2c, 0xc0, 0xaa, 0x8f, 0x31, 0x68, 0x3c, 0xc6,
0x3e, 0xc1, 0x4c, 0x03, 0x4c, 0x6f, 0x3d, 0x2c, 0x70, 0xb8, 0xc4, 0x76, 0x11, 0xb4, 0xc5, 0xcb,
0x53, 0x48, 0xa2, 0x55, 0x9f, 0xb1, 0x62, 0xa7, 0x80, 0xa2, 0xb4, 0x03, 0xb0, 0x12, 0x0a, 0x68,
0x46, 0xe2, 0x7d, 0x60, 0x57, 0xa3, 0xab, 0x9e, 0x1b, 0x18, 0x91, 0x5a, 0xe2, 0x03, 0x9e, 0x81,
0xcc, 0x6c, 0x50, 0xd2, 0xa1, 0x4d, 0x59, 0x13, 0x61, 0x7b, 0xac, 0xae, 0x78, 0xfe, 0x9b, 0x91,
0xe9, 0xe4, 0x9d, 0x2e, 0x82, 0xde, 0xf4, 0x75, 0x65, 0xc1, 0x2f, 0xf9, 0x38, 0xb1, 0x82, 0xf8,
0xce, 0x94, 0x1d, 0x27, 0x81, 0xb7, 0x73, 0x47, 0x95, 0x38, 0xc7, 0x6e, 0xd9, 0xf7, 0xd4, 0x46,
0x9f, 0x6f, 0xe5, 0xba, 0x7f, 0x6e, 0x3a, 0xd9, 0x88, 0x71, 0xb2, 0x86, 0x6f, 0x0e, 0xf4, 0xf3,
0x62, 0x77, 0xda, 0xa7, 0x6c, 0x10, 0x42, 0xc8, 0x3f, 0x77, 0xdf, 0x0f, 0xf2, 0xe2, 0x63, 0x95,
0x40, 0xbb, 0x35, 0x5e, 0xa8, 0x42, 0x73, 0x41, 0x1c, 0x45, 0x30, 0x81, 0xbd, 0x1e, 0x10, 0x35,
0xc4, 0x02, 0xc5, 0x31, 0x90, 0xd0, 0xbd, 0x90, 0x5e, 0x8d, 0x01, 0xfc, 0x37, 0x87, 0xc6, 0x5b,
0x69, 0x17, 0x2c, 0xca, 0x5b, 0x23, 0x4e, 0x92, 0xe3, 0x58, 0x46, 0x3b, 0xbb, 0x8d, 0x23, 0xe3,
0x8c, 0x74, 0xa3, 0xa8, 0xe2, 0x73, 0x55, 0x42, 0xb9, 0x96, 0xba, 0x5e, 0xc2, 0x2c, 0x50, 0x95,
0xa7, 0x77, 0xb6, 0x77, 0x5a, 0x72, 0x8d, 0xf5, 0x9c, 0x35, 0x60, 0xc7, 0xf3, 0x6b, 0x83, 0xd5,
0x5f, 0x81, 0x9f, 0x19, 0x65, 0x73, 0xf8, 0xfd, 0x35, 0x63, 0x79, 0xfe, 0x9a, 0x5e, 0x7c, 0xec,
0xb3, 0x76, 0x39, 0x5e, 0x01, 0x30, 0x9e, 0x20, 0x05, 0xb2, 0x9e, 0x3b, 0x16, 0x0c, 0xb7, 0x4c,
0x6a, 0x58, 0x56, 0x09, 0x34, 0x80, 0xdd, 0x06, 0xae, 0xa5, 0xfb, 0x3f, 0xbe, 0x23, 0xe0, 0x04,
0xf8, 0xd7, 0xa3, 0x8f, 0xd0, 0x78, 0x66, 0xcd, 0xf2, 0x41, 0x61, 0x39, 0x1c, 0xc7, 0x56, 0xf6,
0xff, 0x71, 0xff, 0x07, 0x2e, 0x30, 0x8b, 0x35, 0xe2, 0x59, 0x43, 0x51, 0x11, 0xbe, 0xe0, 0x9d,
0xdf, 0x2b, 0x8d, 0xf9, 0x9d, 0x0f, 0x2c, 0x2e, 0x8e, 0xda, 0xa4, 0xec, 0xaa, 0xbc, 0x69, 0x75,
0xa5, 0x8f, 0x23, 0xbb, 0x6b, 0xfc, 0x94, 0xeb, 0xcb, 0xbb, 0xa0, 0xd5, 0x81, 0xf1, 0x6b, 0xe9,
0xd0, 0x43, 0xc4, 0xe4, 0x10, 0xb3, 0x21, 0xc6, 0xdf, 0x42, 0x4e, 0xca, 0xee, 0xa9, 0x4e, 0xdb,
0xe5, 0x80, 0x1e, 0xb7, 0x86, 0x19, 0x91, 0x24, 0x22, 0x2b, 0x09, 0x1e, 0x5b, 0x33, 0xba, 0xd6,
0x76, 0x14, 0x45, 0xa8, 0xa6, 0x60, 0x6d, 0x0e, 0x78, 0x1c, 0x07, 0xa6, 0xf9, 0x1c, 0xd5, 0xfe,
0x18, 0x8d, 0xdb, 0x9f, 0x9e, 0x17, 0xf5, 0xe0, 0x7b, 0x0c, 0xba, 0x31, 0x9c, 0x52, 0xe5, 0xfb,
0x03, 0xf5, 0x3d, 0xf5, 0x70, 0xf8, 0x2d, 0xdb, 0x60, 0x3d, 0x30, 0x5b, 0x72, 0xa2, 0x40, 0x6b,
0xc7, 0xc1, 0xa3, 0x7f, 0x92, 0x04, 0x05, 0xf8, 0xf1, 0x4d, 0x3d, 0xdf, 0x5d, 0x83, 0x6b, 0xa6,
0x8d, 0x83, 0xc1, 0xa8, 0xd7, 0xf1, 0xa4, 0x1d, 0x14, 0x8c, 0xc3, 0x4b, 0x1e, 0xf9, 0x96, 0xdd,
0xfb, 0x43, 0xef, 0x19, 0xd2, 0xfb, 0xf0, 0xad, 0xca, 0xd3, 0x01, 0xa4, 0x73, 0x49, 0x77, 0x39,
0xea, 0xa1, 0x0b, 0xbc, 0xe8, 0x5e, 0x15, 0xc3, 0x2f, 0x1d, 0x90, 0xc8, 0xab, 0x86, 0x05, 0xd0,
0xae, 0x94, 0x1e, 0xb9, 0x14, 0x08, 0x65, 0x92, 0xd0, 0x87, 0xa5, 0x21, 0xfd, 0xe3, 0x3a, 0x67,
0x6c, 0xdf, 0xb9, 0x4a, 0x42, 0x47, 0xf6, 0x0f, 0x51, 0xed, 0xd3, 0x72, 0x94, 0x51, 0x1e, 0x92,
0xec, 0x71, 0xa9, 0xa5, 0x4b, 0xab, 0x68, 0xa0, 0xed, 0xaa, 0xbd, 0xcb, 0x2c, 0x1a, 0x3a, 0xde,
0xa7, 0x78, 0xf4, 0x16, 0xe3, 0x92, 0x00, 0xaf, 0x4c, 0x51, 0x7d, 0xd7, 0x15, 0x2b, 0xb7, 0x24,
0x76, 0xc5, 0xd1, 0x41, 0x3f, 0x04, 0x70, 0x46, 0x15, 0xd7, 0x95, 0x30, 0x0f, 0x3a, 0x09, 0x12,
0x14, 0xf4, 0xe4, 0xac, 0x2e, 0xf4, 0x19, 0x69, 0xc8, 0x1f, 0x8f, 0xc0, 0x86, 0x10, 0x86, 0x49,
0x07, 0xb2, 0xe6, 0xed, 0xfa, 0x5f, 0xdb, 0x09, 0x26, 0xb6, 0xf0, 0x64, 0xb2, 0xa1, 0xc3, 0xb8,
0xc7, 0xb6, 0x31, 0xcc, 0x75, 0x66, 0x3c, 0xed, 0xad, 0x5e, 0x71, 0x86, 0x8a, 0xbc, 0x9b, 0xac,
0x67, 0x8e, 0x43, 0x01, 0x44, 0x61, 0x3c, 0xb0, 0xe5, 0x19, 0x82, 0xb9, 0xe0, 0x19, 0x09, 0x90,
0x26, 0xb0, 0x69, 0xbb, 0x7a, 0x4d, 0xc3, 0x76, 0xcd, 0xd6, 0xa3, 0xc5, 0x95, 0x66, 0x31, 0x79,
0x76, 0x21, 0x36, 0x72, 0x75, 0x4f, 0xac, 0x87, 0xdf, 0x85, 0x95, 0x3c, 0xdc, 0x0d, 0xe2, 0x76,
0xfb, 0x87, 0x42, 0xf4, 0x8b, 0xa2, 0x18, 0xd4, 0x20, 0x2f, 0xe6, 0xf8, 0x65, 0x83, 0x41, 0x52,
0x97, 0x9d, 0x6d, 0xa9, 0xb4, 0x73, 0xe5, 0xd4, 0x76, 0xc0, 0xaa, 0xa6, 0x84, 0x91, 0xf5, 0x45,
0x09, 0x1b, 0x87, 0x9c, 0x01, 0x98, 0x60, 0x78, 0xd6, 0x4f, 0xa5, 0xf4, 0x9f, 0x60, 0xe6, 0x15,
0xcb, 0x86, 0x5f, 0x15, 0x4f, 0x48, 0xb4, 0x51, 0x73, 0xa1, 0xdc, 0x85, 0xf2, 0xeb, 0x11, 0x28,
0x65, 0x22, 0x90, 0xbd, 0x38, 0x3c, 0xde, 0xdc, 0xd8, 0xf2, 0x80, 0x11, 0x7e, 0x60, 0xbe, 0x03,
0x4c, 0xe2, 0x24, 0xf9, 0x26, 0x73, 0x93, 0x4e, 0xd9, 0xe0, 0x07, 0x7d, 0x5f, 0x78, 0x99, 0xf4,
0xe0, 0xee, 0xe0, 0x97, 0x93, 0x3a, 0x35, 0xe4, 0x0f, 0x20, 0x5d, 0x84, 0xa1, 0x07, 0x33, 0xf4,
0x92, 0xda, 0x61, 0x98, 0x02, 0xff, 0x70, 0xd9, 0xb9, 0x49, 0xca, 0x0c, 0x2b, 0xcb, 0x9b, 0xa6,
0x8c, 0x29, 0x0f, 0x2e, 0xf9, 0xa2, 0x0a, 0x3b, 0xf4, 0x96, 0x83, 0x4c, 0x66, 0x95, 0x6a, 0x8e,
0xc4, 0x17, 0x92, 0x66, 0x99, 0x9d, 0x9f, 0x87, 0xbd, 0xfc, 0x14, 0xae, 0xa8, 0x65, 0xf0, 0x48,
0x7e, 0x2b, 0xe1, 0x0a, 0x64, 0xbe, 0xcb, 0xa6, 0x95, 0x47, 0xd0, 0x16, 0x58, 0x93, 0x5e, 0x63,
0x70, 0x39, 0x86, 0xa5, 0x6d, 0x6c, 0xe3, 0x8f, 0xe6, 0x6d, 0xbf, 0x61, 0xd7, 0x54, 0xba, 0x9a,
0x1a, 0x27, 0x83, 0x53, 0x91, 0x34, 0x22, 0xe4, 0xf2, 0xe4, 0x10, 0x0c, 0x59, 0x62, 0x99, 0x9a,
0x3e, 0xaa, 0x3e, 0x16, 0x72, 0xbc, 0x73, 0xed, 0xcf, 0xcc, 0x75, 0x25, 0xa2, 0xd3, 0xdb, 0xe9,
0x56, 0x83, 0xb4, 0xbf, 0x38, 0xf7, 0x44, 0x4a, 0xc0, 0xf4, 0x70, 0xf0, 0xe9, 0x80, 0x79, 0x91,
0x6e, 0x4e, 0x1f, 0xba, 0x3f, 0xcd, 0x5b, 0x08, 0x2f, 0xc2, 0x77, 0x2e, 0x63, 0xb5, 0xe0, 0x66,
0x3f, 0x87, 0x63, 0x8a, 0x16, 0x38, 0x58, 0xf5, 0x90, 0x84, 0x52, 0x40, 0xa8, 0xc2, 0x2d, 0xac,
0xf6, 0xf7, 0x99, 0x9c, 0x43, 0x1a, 0x2a, 0xb5, 0x20, 0x4a, 0x7d, 0xa7, 0x83, 0x9c, 0x9a, 0x93,
0x26, 0x08, 0xc7, 0xf8, 0x3a, 0x87, 0xd1, 0xd7, 0x3d, 0x7d, 0x8b, 0x2f, 0xec, 0x65, 0xab, 0xb9,
0x52, 0x21, 0xfa, 0xda, 0x44, 0x36, 0x5f, 0xe2, 0x10, 0x61, 0xdb, 0xcd, 0xe5, 0x2c, 0xb8, 0x4c,
0xbf, 0xe9, 0xf0, 0x61, 0xc4, 0xda, 0xb3, 0xbe, 0x86, 0x00, 0x2e, 0x76, 0x83, 0xee, 0xd1, 0x6c,
0x23, 0xc6, 0x87, 0xce, 0x61, 0xc5, 0xd9, 0x23, 0xff, 0xba, 0xb4, 0x0b, 0xee, 0x6a, 0xe9, 0x3e,
0xd7, 0xf8, 0x57, 0xf3, 0x04, 0xe5, 0xeb, 0x16, 0xec, 0x6d, 0x08, 0x85, 0x63, 0x52, 0x4e, 0x90,
0xd9, 0x16, 0xe4, 0x1a, 0x3a, 0x8c, 0x77, 0x77, 0xe2, 0x97, 0x31, 0xf0, 0xf4, 0x5c, 0x12, 0x50,
0x82, 0xc4, 0x23, 0xa5, 0xc0, 0x27, 0x04, 0xc0, 0x7c, 0x6f, 0xc1, 0x9b, 0x1c, 0x48, 0x38, 0xee,
0x3e, 0xab, 0xe1, 0x25, 0x62, 0x82, 0x9e, 0x67, 0x58, 0x1d, 0x31, 0x2c, 0x72, 0x0b, 0x79, 0x2a,
0x41, 0x74, 0x4d, 0xec, 0x1e, 0x15, 0x74, 0x26, 0xab, 0x75, 0x13, 0x6d, 0x31, 0xee, 0x2f, 0x20,
0x81, 0x47, 0x03, 0x90, 0x91, 0x45, 0x3c, 0x0b, 0x0e, 0x39, 0x70, 0xc5, 0x62, 0x4d, 0x7a, 0x53,
0xdf, 0x80, 0x76, 0xe9, 0xd1, 0x62, 0x5d, 0x2c, 0x8e, 0x69, 0x3e, 0x0e, 0x9a, 0x81, 0xe2, 0x38,
0x62, 0xdc, 0xa7, 0x89, 0x21, 0xb6, 0x6c, 0xa4, 0xc3, 0xc5, 0xed, 0x35, 0xb0, 0xb5, 0xed, 0x2e,
0x24, 0x62, 0x2e, 0xb2, 0x16, 0xba, 0x0b, 0xa6, 0xe0, 0xc0, 0xea, 0xf9, 0x7c, 0x75, 0x4e, 0xeb,
0x3d, 0xb4, 0xa5, 0x06, 0xd5, 0x85, 0x4a, 0x3e, 0xdc, 0x92, 0xd0, 0x11, 0x1a, 0xf3, 0xd2, 0x13,
0x5a, 0x99, 0x87, 0x29, 0x12, 0x3f, 0x03, 0xd0, 0xf9, 0x36, 0x6b, 0xb0, 0xd2, 0xc6, 0x81, 0xcf,
0xc6, 0x2c, 0x59, 0xbc, 0xd7, 0x5c, 0x6b, 0x41, 0x0d, 0x8e, 0x69, 0x97, 0xcc, 0xa5, 0x5c, 0x98,
0x9f, 0x01, 0x03, 0x93, 0xd6, 0xc2, 0x42, 0xf7, 0xce, 0x1e, 0xa7, 0x1c, 0x6f, 0x26, 0x2e, 0x49,
0x88, 0x55, 0x58, 0x43, 0x47, 0xb0, 0x4c, 0xe2, 0x6c, 0xce, 0x2e, 0x82, 0x2b, 0x8c, 0x6b, 0x7b,
0x49, 0x37, 0x14, 0x8a, 0x45, 0xc9, 0x47, 0x07, 0x3b, 0x30, 0x0f, 0x7c, 0x72, 0xb6, 0xe7, 0x8c,
0x42, 0x31, 0x07, 0x8d, 0x80, 0x53, 0x1b, 0x7f, 0x93, 0x17, 0xc1, 0xbb, 0x4d, 0x60, 0x70, 0xf2,
0x99, 0xe9, 0xa9, 0x77, 0x31, 0xb1, 0xbe, 0xfe, 0xee, 0xc2, 0xda, 0xe0, 0xa1, 0xa0, 0x36, 0x45,
0x68, 0xac, 0xbe, 0xba, 0xb0, 0x69, 0xa4, 0xb9, 0x01, 0x47, 0x77, 0x6f, 0xf7, 0xe7, 0xf7, 0x9c,
0x1c, 0xc9, 0x8b, 0x2f, 0xe6, 0x21, 0x47, 0x92, 0x50, 0x15, 0x54, 0xf4, 0x19, 0x57, 0x83, 0xb0,
0xf9, 0x18, 0x8c, 0xcf, 0xe9, 0x6a, 0xd8, 0xcd, 0x29, 0xf5, 0x46, 0x34, 0x09, 0xc2, 0x05, 0x4e,
0x4a, 0x24, 0x96, 0xee, 0x65, 0xea, 0xa1, 0xfc, 0xda, 0x3d, 0x77, 0x64, 0xcd, 0x3e, 0x84, 0x31,
0xe4, 0x4a, 0x2b, 0x05, 0xe6, 0x4a, 0xa2, 0xf9, 0xfb, 0x0d, 0x13, 0x45, 0x6b, 0xfe, 0xa9, 0xc9,
0x1e, 0xc2, 0xd9, 0x0d, 0x00, 0x99, 0xe7, 0xe3, 0x95, 0xdc, 0xe8, 0x18, 0x65, 0x0d, 0xca, 0xf8,
0xbd, 0xfe, 0x23, 0xb4, 0xc6, 0x44, 0x3f, 0x5c, 0x69, 0x0b, 0x18, 0xea, 0xd2, 0x21, 0xa6, 0xc2,
0xbc, 0xd3, 0x45, 0x72, 0xff, 0xb8, 0x3b, 0x33, 0x32, 0xea, 0xfd, 0xe6, 0xe2, 0x5b, 0x37, 0xff,
0x3a, 0xc6, 0xda, 0x0c, 0x3c, 0xc6, 0x97, 0xb9, 0x96, 0x26, 0x5c, 0xaa, 0x5a, 0x53, 0xce, 0x44,
0x57, 0x03, 0x03, 0xd7, 0xd1, 0x11, 0xf4, 0x4c, 0x63, 0x51, 0x19, 0x59, 0x5c, 0x24, 0x7e, 0x86,
0xa3, 0x20, 0x83, 0xf2, 0x86, 0x55, 0x01, 0x75, 0x2f, 0x93, 0xe3, 0x02, 0x4b, 0x2e, 0x2b, 0x6d,
0x82, 0xd0, 0xc0, 0x3b, 0x74, 0x5b, 0xfd, 0x80, 0x9a, 0xf7, 0xe8, 0xe1, 0x34, 0x9d, 0x1a, 0x79,
0xbe, 0xd5, 0x1b, 0xba, 0x41, 0x50, 0x64, 0x70, 0x1a, 0x2a, 0x78, 0x90, 0xe8, 0xf3, 0x99, 0x37,
0xc6, 0xd2, 0xf5, 0x63, 0xb0, 0x74, 0x7b, 0xd9, 0x4f, 0x1b, 0x69, 0x86, 0x24, 0xb4, 0xfd, 0x17,
0xdf, 0xdf, 0x68, 0xff, 0xdc, 0x04, 0x50, 0xc2, 0x6d, 0x77, 0x1f, 0x8f, 0xf4, 0xfb, 0x01, 0xa2,
0x6f, 0xf8, 0xf6, 0x4e, 0xb5, 0xb6, 0xd9, 0x15, 0x3f, 0x5c, 0xe2, 0x9d, 0x9d, 0xfc, 0xf8, 0x4c,
0xa2, 0x30, 0xa4, 0xc2, 0x12, 0x40, 0x1b, 0x43, 0x7d, 0x11, 0x37, 0xf8, 0x3a, 0x44, 0xf7, 0xa9,
0x8a, 0x9f, 0xd1, 0xbc, 0x3d, 0x88, 0x3e, 0x62, 0x27, 0xce, 0x36, 0x9e, 0xd3, 0x2a, 0x96, 0x05,
0x50, 0xaa, 0x86, 0x3f, 0x3d, 0x01, 0x4d, 0xe7, 0x49, 0x4d, 0xea, 0xd3, 0x4f, 0xce, 0xd1, 0xd7,
0xb4, 0xea, 0xb6, 0x51, 0xd4, 0x99, 0x03, 0x35, 0x89, 0x44, 0x6f, 0xb5, 0xa1, 0x56, 0x45, 0x57,
0xd6, 0x3e, 0x72, 0x49, 0x41, 0xe7, 0x7a, 0xe3, 0xf4, 0x6b, 0x79, 0x70, 0x3d, 0x06, 0x27, 0x7d,
0x87, 0x35, 0x69, 0x99, 0xb5, 0x1f, 0x61, 0x89, 0x3d, 0x31, 0xc7, 0x23, 0x1b, 0x0c, 0x63, 0x5f,
0x1d, 0x83, 0xab, 0x38, 0xa0, 0xdc, 0xe5, 0x44, 0xf5, 0xf6, 0x80, 0x38, 0x61, 0xd6, 0xe3, 0xd7,
0xe7, 0x0d, 0x61, 0x7e, 0xcc, 0x59, 0x39, 0x20, 0xb1, 0xab, 0x90, 0x06, 0xbd, 0xc7, 0xbf, 0xf3,
0x4a, 0x8b, 0x36, 0xa7, 0x60, 0x1e, 0xb1, 0x70, 0xa0, 0x40, 0x15, 0x6b, 0x45, 0x67, 0xab, 0x37,
0xf5, 0x5f, 0xdf, 0x2d, 0x46, 0x6f, 0xca, 0x93, 0x74, 0x27, 0x73, 0x22, 0xf2, 0x18, 0x11, 0xd0,
0x2c, 0x7b, 0xc5, 0x99, 0xc9, 0xed, 0x5c, 0x2b, 0x1f, 0xe7, 0xb6, 0xba, 0xa1, 0x9b, 0x1b, 0x0a,
0x30, 0xf7, 0x9f, 0x86, 0x41, 0xb9, 0x7b, 0xf6, 0x64, 0x91, 0xdc, 0xa0, 0xb4, 0xc0, 0x34, 0x13,
0x67, 0xaa, 0x5a, 0xce, 0xc1, 0x39, 0x8b, 0xb3, 0x7c, 0x03, 0x7d, 0x81, 0xac, 0x23, 0x68, 0xdb,
0x49, 0xc5, 0xd5, 0x72, 0x0b, 0xbf, 0xb7, 0x46, 0x6b, 0xa6, 0x16, 0xc7, 0x0c, 0x7d, 0x83, 0x42,
0x86, 0x30, 0x30, 0x47, 0x35, 0x7d, 0xa0, 0xe9, 0xa3, 0x4f, 0xc1, 0x4b, 0x00, 0xc1, 0x7a, 0x0a,
0x02, 0xf6, 0xa6, 0x2a, 0x5b, 0x52, 0x97, 0x6b, 0x00, 0xed, 0x67, 0xbb, 0x2d, 0x0a, 0xa1, 0xb4,
0xa8, 0xa9, 0x31, 0x00, 0xb7, 0x99, 0xe1, 0x83, 0x96, 0x95, 0xbd, 0xae, 0x9b, 0x98, 0xe7, 0x5c,
0x8d, 0xf5, 0xd8, 0x34, 0x0d, 0x15, 0x8b, 0xe6, 0x03, 0x79, 0xa6, 0xf6, 0x26, 0xaf, 0x05, 0x2a,
0xd5, 0x5c, 0x5c, 0xea, 0x01, 0xf8, 0x06, 0x04, 0x8e, 0x93, 0x7f, 0x87, 0xe0, 0x1e, 0x72, 0x5e,
0x67, 0x62, 0x03, 0x64, 0xe5, 0x11, 0xaf, 0xd2, 0x88, 0xb2, 0x59, 0x53, 0xe9, 0xad, 0xe3, 0x43,
0xb5, 0x96, 0x06, 0x86, 0x08, 0x19, 0x0f, 0xa5, 0xc4, 0xdf, 0x11, 0x4c, 0x93, 0xd3, 0xc8, 0xde,
0xca, 0x92, 0x9c, 0x06, 0x6d, 0x8b, 0xae, 0x5a, 0xc2, 0xd6, 0x07, 0xe3, 0xf9, 0x4d, 0x68, 0xa5,
0xd3, 0x55, 0x48, 0x27, 0xa6, 0x47, 0x35, 0xa4, 0x3c, 0x46, 0x2b, 0xc3, 0x68, 0x2c, 0xc1, 0x66,
0x44, 0x11, 0xf5, 0x92, 0xc9, 0x45, 0x6f, 0x53, 0xda, 0x10, 0x26, 0xf5, 0x14, 0x59, 0xa0, 0xcf,
0x20, 0xcc, 0x17, 0x1b, 0x9b, 0x6b, 0xed, 0xe4, 0x7c, 0xe5, 0x7d, 0x84, 0x5d, 0xff, 0xe1, 0x02,
0x5c, 0x6e, 0xb2, 0x40, 0x61, 0x5d, 0xa1, 0x51, 0x10, 0x6a, 0x56, 0x01, 0xb7, 0x5c, 0x24, 0xc6,
0x73, 0xd6, 0xea, 0x81, 0x8d, 0x60, 0xc3, 0x1f, 0x41, 0x4a, 0xea, 0xa5, 0x55, 0x97, 0xb4, 0x0c,
0xc4, 0xf2, 0xed, 0x2b, 0x38, 0x50, 0xd3, 0x66, 0x08, 0x4a, 0x52, 0x51, 0x34, 0x20, 0xb0, 0x13,
0x69, 0x5e, 0x2b, 0xfc, 0xb0, 0xdb, 0xfa, 0xd0, 0x01, 0x49, 0x75, 0xc6, 0x74, 0x71, 0xa3, 0x80,
0x75, 0x28, 0xd1, 0x57, 0x30, 0x80, 0x2a, 0x44, 0x28, 0x84, 0x2c, 0x63, 0x68, 0xc7, 0x26, 0x50,
0xb3, 0x16, 0x12, 0x65, 0xd6, 0xb8, 0x60, 0x07, 0x26, 0x4c, 0xf0, 0x93, 0xa3, 0x17, 0xfe, 0xe4,
0xee, 0x38, 0x8e, 0x77, 0x21, 0xa0, 0x24, 0x34, 0xc5, 0x14, 0x32, 0x4c, 0xbf, 0x85, 0xcb, 0x57,
0xf7, 0x09, 0xb5, 0x3f, 0xdf, 0x69, 0x62, 0x4a, 0xdc, 0x29, 0xb8, 0x55, 0x18, 0xf1, 0xa0, 0x51,
0xf2, 0x47, 0x3a, 0xd9, 0x38, 0x4d, 0x7a, 0xc5, 0x7c, 0x2a, 0x78, 0x0a, 0xb7, 0x25, 0x06, 0xba,
0x92, 0x5f, 0xa3, 0x99, 0x92, 0xdd, 0x2d, 0x0b, 0x00, 0xff, 0xd8, 0xc3, 0x86, 0x45, 0xd5, 0x5c,
0x2c, 0xa2, 0xae, 0x94, 0xcf, 0x4f, 0xfa, 0x37, 0x22, 0x84, 0xa2, 0x8a, 0x13, 0x79, 0x7e, 0x25,
0xeb, 0x0d, 0x95, 0x0c, 0x08, 0x37, 0x16, 0x56, 0xa8, 0x89, 0xe6, 0x18, 0x9f, 0x83, 0xb9, 0xc0,
0xc8, 0xe0, 0x69, 0x52, 0xb3, 0x4f, 0xe1, 0x3c, 0xcb, 0x5c, 0x3b, 0x2c, 0x82, 0xf2, 0xd9, 0x88,
0xf6, 0xd9, 0xa2, 0x33, 0xf1, 0xa9, 0xe6, 0x4d, 0xe9, 0x72, 0x18, 0xbe, 0x12, 0xee, 0x7a, 0x8e,
0x84, 0x63, 0xd8, 0x21, 0x31, 0x62, 0x4c, 0xe1, 0x67, 0xe7, 0x44, 0xa3, 0xca, 0x39, 0x15, 0xc7,
0x8e, 0x6e, 0x76, 0x36, 0x2d, 0x06, 0x09, 0x0e, 0x2a, 0x7e, 0xd6, 0x0e, 0xa7, 0x43, 0x7c, 0x84,
0x83, 0x8d, 0x8a, 0xa7, 0x5f, 0x09, 0x6c, 0x9a, 0x92, 0x8e, 0x40, 0x3e, 0x24, 0x28, 0x55, 0x0c,
0x98, 0xde, 0x8c, 0x43, 0xbd, 0x25, 0xe2, 0x45, 0x20, 0xae, 0xf6, 0xee, 0x53, 0x4e, 0xe1, 0xd4,
0x70, 0x21, 0x75, 0xe6, 0xb2, 0x5d, 0x03, 0x0b, 0x87, 0x94, 0x18, 0x45, 0xce, 0xfc, 0x1d, 0xc2,
0x89, 0xce, 0xe3, 0x3c, 0x72, 0x13, 0x9f, 0x29, 0x83, 0x9a, 0xf8, 0x1c, 0xb6, 0xa0, 0x97, 0xd1,
0x14, 0x31, 0x1a, 0x01, 0x73, 0x6f, 0x47, 0x9b, 0xda, 0xe3, 0x2a, 0x59, 0x39, 0x8f, 0xc4, 0xa7,
0x49, 0x4d, 0x03, 0x4f, 0xc8, 0xdc, 0x5f, 0x2b, 0xa8, 0xaf, 0x93, 0xfc, 0x4c, 0x57, 0x6b, 0x70,
0x39, 0x67, 0xae, 0x59, 0x37, 0x80, 0x41, 0x3b, 0x44, 0xb9, 0x8f, 0x4b, 0xab, 0xa9, 0xd3, 0xfd,
0x7b, 0x55, 0x71, 0x5a, 0xd5, 0xe5, 0xc4, 0x1f, 0x93, 0x61, 0xa4, 0x2a, 0x75, 0x7d, 0x9a, 0x6d,
0x72, 0x20, 0xa9, 0x46, 0x7e, 0x19, 0xf7, 0x39, 0x87, 0x70, 0x76, 0x16, 0x4c, 0x14, 0x2d, 0x40,
0xbb, 0xae, 0x95, 0x01, 0x31, 0x2c, 0x39, 0x4d, 0xc0, 0x23, 0x3d, 0xc5, 0x86, 0x88, 0x14, 0x16,
0x2b, 0xfc, 0x1f, 0x10, 0xbd, 0x46, 0x63, 0xb2, 0x85, 0xdd, 0x2d, 0x00, 0x5f, 0x3b, 0xc3, 0xda,
0xd2, 0xff, 0x02, 0x3f, 0x7e, 0x81, 0xb7, 0x99, 0xb1, 0xb3, 0x23, 0xb3, 0x7e, 0x82, 0xfc, 0x99,
0xdc, 0x81, 0x29, 0x1c, 0xf9, 0x3c, 0xc0, 0x4a, 0x0e, 0x05, 0xaa, 0x67, 0x4b, 0xcf, 0xd3, 0xbc,
0x0d, 0x93, 0x0a, 0x10, 0xd0, 0x95, 0x7e, 0xc7, 0x71, 0x2b, 0x8c, 0xc7, 0x83, 0x75, 0xdd, 0x90,
0x4e, 0xb5, 0xa4, 0x68, 0x29, 0x60, 0x15, 0xda, 0xb1, 0xba, 0xbb, 0x07, 0x67, 0x86, 0xf3, 0x05,
0xc8, 0xad, 0x90, 0xca, 0x39, 0x47, 0xb1, 0x50, 0xda, 0x79, 0xcb, 0x94, 0x03, 0x7e, 0x97, 0x0e,
0x91, 0x80, 0x43, 0x7e, 0xa3, 0x4c, 0x72, 0x77, 0x1d, 0x67, 0x30, 0x00, 0x82, 0x67, 0x41, 0xfe,
0x75, 0x9f, 0xcd, 0xc2, 0xb0, 0x35, 0x58, 0x33, 0x1f, 0xdf, 0x5b, 0x89, 0xd6, 0xe3, 0xf2, 0x5a,
0x05, 0x24, 0x1f, 0x32, 0xf1, 0x39, 0xe8, 0x98, 0x12, 0x6a, 0xec, 0x8b, 0x17, 0x15, 0xca, 0xc0,
0x20, 0x88, 0x31, 0xfb, 0x12, 0x05, 0xf9, 0xef, 0xb7, 0x55, 0x38, 0x75, 0x5b, 0x2d, 0x83, 0x93,
0x1c, 0x7a, 0xd9, 0xe2, 0x52, 0xc8, 0x8c, 0x8a, 0xf3, 0xc5, 0xdf, 0x62, 0xfb, 0x99, 0x65, 0x3a,
0xff, 0x99, 0xe6, 0xc6, 0xc0, 0x51, 0xa9, 0xa1, 0x24, 0x13, 0x81, 0xcd, 0x5c, 0xe1, 0x30, 0x72,
0x61, 0xf8, 0x66, 0x57, 0x5c, 0xae, 0xa0, 0xa3, 0xe8, 0x47, 0x28, 0x6e, 0xcc, 0x67, 0xd7, 0xd9,
0xaa, 0x18, 0xf4, 0x8e, 0xf2, 0xa5, 0xe5, 0xf1, 0x83, 0x28, 0x61, 0x27, 0xf8, 0xb9, 0xaa, 0x2c,
0xaa, 0x08, 0x69, 0xec, 0x5e, 0x47, 0x4a, 0x70, 0xe5, 0x42, 0x7d, 0xc2, 0xf0, 0x48, 0x8b, 0x13,
0x4d, 0x20, 0x12, 0x41, 0xda, 0xe6, 0x8e, 0xd3, 0x99, 0x68, 0x69, 0x45, 0x32, 0x47, 0xbb, 0x50,
0xd8, 0xbc, 0x3d, 0x3c, 0x90, 0x99, 0x51, 0xe5, 0xa4, 0x7b, 0x1e, 0x89, 0x96, 0x10, 0x34, 0x7e,
0xa8, 0xd7, 0x19, 0x33, 0x46, 0xbf, 0xe7, 0x54, 0xc2, 0x89, 0xad, 0x1c, 0xa4, 0x54, 0xb9, 0xc9,
0x2a, 0x07, 0x52, 0x7b, 0x95, 0xa1, 0xfe, 0x50, 0x8d, 0x0b, 0x7c, 0x8d, 0xa5, 0xb9, 0x04, 0x7d,
0x27, 0x75, 0x08, 0xff, 0x61, 0x5c, 0x9d, 0xc9, 0xab, 0x11, 0x59, 0x6a, 0xa8, 0x8d, 0x0c, 0x97,
0x34, 0xa4, 0x5d, 0x81, 0xf0, 0x39, 0x32, 0x19, 0xbe, 0xad, 0x58, 0x7d, 0x3a, 0x6f, 0x9d, 0x07,
0xc4, 0x70, 0xf2, 0xab, 0xf8, 0xd7, 0xc6, 0x99, 0x22, 0x28, 0xbf, 0x0a, 0xb6, 0xef, 0x79, 0xe4,
0x65, 0x99, 0xbb, 0x0a, 0x60,
};

View file

@ -0,0 +1,879 @@
/* Encrypted blobs for 0x138a:0x0090
* Auto-generated from python-validity blobs_90.py
* DO NOT EDIT regenerate with scripts/blob_extract/convert_blobs.py
*/
/* init_hardcoded: 485 bytes */
static const guint8 init_hardcoded_0090[] = {
0x06, 0x02, 0x00, 0x00, 0x01, 0x39, 0x17, 0xb3, 0xdd, 0xa9, 0x13, 0x83, 0xb5, 0xbc, 0xac, 0x64,
0xfa, 0x4a, 0xd3, 0x5d, 0xce, 0x96, 0x57, 0x0a, 0x9d, 0x2d, 0x97, 0x4b, 0x80, 0x92, 0x6a, 0x43,
0x1f, 0x9c, 0xd4, 0x62, 0x48, 0x98, 0x0a, 0x26, 0x3c, 0x6f, 0xce, 0xf6, 0xa8, 0x28, 0x39, 0xa9,
0x0b, 0x59, 0xac, 0x59, 0x08, 0x48, 0x85, 0x9a, 0xfa, 0xc8, 0x17, 0xb7, 0xd5, 0x3b, 0xf5, 0x1c,
0xd3, 0x20, 0x5c, 0x1b, 0x8f, 0x43, 0x04, 0x8b, 0xe8, 0x25, 0x3c, 0x3b, 0xd2, 0x47, 0x93, 0x7c,
0x83, 0x7a, 0xca, 0x8b, 0x18, 0xd3, 0xcc, 0x8e, 0xe8, 0xc8, 0x97, 0x1a, 0xc4, 0xf6, 0x88, 0x81,
0x3c, 0xf3, 0xd8, 0x55, 0x0d, 0x71, 0x49, 0x69, 0x85, 0xb7, 0xec, 0x07, 0xff, 0x2d, 0xc7, 0x89,
0x6d, 0x33, 0x0f, 0xda, 0xb2, 0x63, 0xa0, 0xee, 0x43, 0x3a, 0x5c, 0x4b, 0xc9, 0x10, 0x43, 0x9d,
0x1c, 0x61, 0x61, 0x85, 0x3f, 0xeb, 0x03, 0xf5, 0x50, 0x22, 0x09, 0x50, 0x2e, 0x73, 0x08, 0xbe,
0xb7, 0x91, 0x94, 0x73, 0xcf, 0xe6, 0x9f, 0x42, 0x2c, 0x30, 0x50, 0x2d, 0x22, 0x6a, 0x4d, 0x0a,
0x34, 0xd9, 0x6c, 0x8c, 0x77, 0x95, 0x6c, 0xf6, 0x9d, 0xb8, 0xef, 0x6c, 0xf9, 0x27, 0xa3, 0xb5,
0x78, 0x49, 0xd4, 0xaa, 0x8a, 0xd4, 0xb4, 0x42, 0x66, 0x92, 0x3e, 0x34, 0xb8, 0x2a, 0x39, 0xc8,
0x14, 0x6b, 0xa3, 0xcd, 0x70, 0x8c, 0x70, 0xdf, 0xed, 0xb5, 0x0c, 0x2d, 0xe6, 0x1f, 0xeb, 0x45,
0xb1, 0xd4, 0xf1, 0x95, 0x84, 0x29, 0x72, 0x03, 0xf5, 0xfd, 0xc8, 0x65, 0x79, 0x5f, 0xec, 0x9d,
0x64, 0x49, 0xf3, 0xba, 0x9b, 0x6f, 0x1e, 0x4b, 0xed, 0x69, 0x8e, 0xe1, 0x51, 0xe8, 0x3d, 0x4d,
0x87, 0x02, 0xf7, 0x6a, 0x40, 0x06, 0xcf, 0xa2, 0x4d, 0x9b, 0x79, 0x78, 0x88, 0x20, 0x3b, 0x22,
0x69, 0xf8, 0xa7, 0x7d, 0x52, 0x40, 0x34, 0xac, 0x32, 0xe4, 0xaf, 0x58, 0xb8, 0x6e, 0xbc, 0x63,
0x55, 0x2c, 0xb3, 0x5b, 0x12, 0xb2, 0x85, 0x25, 0x5d, 0xea, 0xf3, 0xa3, 0x2b, 0xf4, 0x6c, 0xdc,
0x5a, 0xd3, 0xbc, 0x1c, 0x9e, 0xd1, 0xbc, 0xc1, 0x12, 0xc7, 0x21, 0x43, 0xf9, 0xae, 0xc5, 0x68,
0xe2, 0xca, 0xcf, 0xa8, 0x9b, 0xa0, 0xc7, 0xbb, 0x65, 0x59, 0x0d, 0x8b, 0x93, 0xe6, 0x87, 0x1a,
0x33, 0xc6, 0xc6, 0x98, 0x3c, 0x0a, 0xcd, 0x04, 0xe7, 0x37, 0xff, 0x55, 0xee, 0xe0, 0x24, 0xca,
0x6b, 0x9a, 0x48, 0x33, 0x2c, 0x1a, 0x69, 0xa5, 0xa3, 0xfd, 0xd2, 0x4b, 0x96, 0x4c, 0xf7, 0xe7,
0xc5, 0x52, 0x29, 0xbb, 0x0b, 0x48, 0xa6, 0xe3, 0x39, 0xeb, 0x2c, 0x42, 0xd0, 0x7e, 0xc8, 0x50,
0xa4, 0xee, 0x78, 0x06, 0x60, 0xad, 0x6c, 0x77, 0xff, 0xa3, 0x02, 0xa6, 0x3b, 0xd1, 0x94, 0x26,
0x13, 0x4c, 0x45, 0x33, 0xd6, 0xf9, 0x67, 0x44, 0x11, 0x63, 0xfb, 0x78, 0xb7, 0x35, 0x47, 0xc6,
0x8a, 0x49, 0x3b, 0x2f, 0x80, 0x0d, 0x3c, 0xda, 0xb8, 0x27, 0xb1, 0x16, 0x76, 0x27, 0x89, 0x99,
0x2a, 0xae, 0x3c, 0x8a, 0xb3, 0x45, 0xa4, 0x9e, 0xdd, 0x31, 0x2d, 0xfd, 0x2a, 0x27, 0xbc, 0x50,
0x14, 0x27, 0xdc, 0x7f, 0xa0, 0x0a, 0xc3, 0xc5, 0xc3, 0x65, 0x51, 0xdb, 0xb3, 0xd5, 0xca, 0xd8,
0xd5, 0xbd, 0x7c, 0xea, 0x37, 0xe5, 0x8a, 0x31, 0x30, 0x7a, 0x6d, 0x50, 0xe6, 0xae, 0x37, 0x9a,
0x53, 0xf1, 0x36, 0x66, 0x78, 0xc0, 0x74, 0x1a, 0x3d, 0x87, 0x2b, 0x8d, 0xcf, 0xef, 0xa7, 0xf6,
0x31, 0x28, 0xdc, 0x82, 0x45,
};
/* init_hardcoded_clean_slate: not available for this PID */
/* reset_blob: 11493 bytes */
static const guint8 reset_blob_0090[] = {
0x06, 0x02, 0x00, 0x00, 0x01, 0xd6, 0x12, 0x32, 0x41, 0x37, 0x6f, 0x11, 0x09, 0x35, 0xa7, 0xae,
0x38, 0xb6, 0x14, 0xce, 0xd9, 0x95, 0x2e, 0xaa, 0x38, 0xe2, 0x98, 0x48, 0x42, 0xd0, 0x55, 0x2d,
0x98, 0x4b, 0x69, 0xab, 0x5c, 0x1a, 0x70, 0x17, 0x55, 0x13, 0x31, 0x99, 0x70, 0x22, 0x5d, 0x9c,
0xa2, 0x5b, 0xe0, 0x63, 0xa7, 0xd7, 0x0a, 0x29, 0xdf, 0xf8, 0x03, 0x24, 0x0c, 0x09, 0x9b, 0xa5,
0x38, 0x69, 0x10, 0xb6, 0x9c, 0x3b, 0x7c, 0xa8, 0xd0, 0xb2, 0x6e, 0xc9, 0xa5, 0x68, 0x4f, 0xe9,
0x2a, 0xf9, 0xc6, 0xd8, 0x06, 0x8a, 0xce, 0x09, 0x54, 0xeb, 0x85, 0x82, 0xad, 0xc6, 0x20, 0x8a,
0xa6, 0xc1, 0x16, 0xb1, 0x77, 0x8f, 0xf5, 0x31, 0xdd, 0x2b, 0x68, 0x17, 0xa1, 0x0d, 0x66, 0x7e,
0x03, 0x85, 0xd1, 0x8a, 0xc7, 0xcc, 0xb4, 0x7e, 0xb6, 0x7f, 0x1f, 0x54, 0xb5, 0xb9, 0x4c, 0x84,
0xd6, 0x55, 0x29, 0xc6, 0xe9, 0xfe, 0x90, 0x39, 0x21, 0x8a, 0xe9, 0xcd, 0xe1, 0x23, 0xf3, 0x8f,
0xfa, 0x52, 0xa9, 0x53, 0xed, 0x58, 0x9d, 0x0d, 0x8b, 0xb4, 0x86, 0x80, 0xae, 0xea, 0x65, 0x44,
0xb7, 0xce, 0xed, 0xbe, 0xa3, 0x21, 0x66, 0x15, 0x40, 0x49, 0x21, 0xb4, 0x38, 0x59, 0xfa, 0xcf,
0x8e, 0xd4, 0x44, 0x8e, 0x58, 0x53, 0x54, 0xc5, 0x68, 0xfe, 0x8d, 0x95, 0x61, 0xef, 0xb3, 0xfc,
0x9b, 0x88, 0xaf, 0x8e, 0x6c, 0x3c, 0x7c, 0x02, 0xac, 0x9b, 0x44, 0xad, 0xbf, 0x78, 0x0d, 0x23,
0x73, 0x01, 0x35, 0xc1, 0xf9, 0x84, 0x0b, 0x67, 0xb3, 0x02, 0xb6, 0xef, 0xe9, 0xdb, 0x19, 0xee,
0x1f, 0x59, 0x18, 0x74, 0x0d, 0xc0, 0x25, 0x9b, 0x3c, 0xbd, 0xd4, 0xf1, 0x0e, 0x59, 0xd1, 0xa5,
0x17, 0xf5, 0x4e, 0x93, 0x2b, 0xf0, 0x1d, 0x2b, 0x1e, 0x5a, 0xd5, 0xc4, 0xf7, 0x1a, 0xf2, 0x33,
0x73, 0x63, 0x2e, 0x06, 0x16, 0x0f, 0x83, 0x79, 0x9a, 0x0a, 0x1b, 0x24, 0x79, 0xd9, 0xba, 0xd0,
0x18, 0x92, 0x66, 0x7d, 0x13, 0x6e, 0x27, 0x46, 0x3a, 0x0e, 0xac, 0x48, 0x55, 0x41, 0xf2, 0x40,
0x18, 0xbd, 0x80, 0x46, 0x3c, 0xea, 0x17, 0xad, 0xa2, 0x64, 0xcc, 0x76, 0x0b, 0x38, 0xa0, 0xac,
0x87, 0xb2, 0x75, 0x39, 0xb7, 0x2e, 0x1c, 0x4f, 0x05, 0xd7, 0x3f, 0x6c, 0x9c, 0x77, 0x7b, 0x2e,
0x70, 0xc3, 0x66, 0xf1, 0xb7, 0x9d, 0x31, 0xae, 0x2d, 0xd1, 0xee, 0xbb, 0xda, 0x99, 0x23, 0x90,
0xc6, 0x4c, 0x98, 0x8c, 0x5e, 0x04, 0xe3, 0xb4, 0xab, 0xab, 0xa8, 0xc0, 0xfb, 0xaa, 0x33, 0xda,
0x18, 0xa0, 0x97, 0xb6, 0x09, 0x56, 0x2f, 0x60, 0x9e, 0xcd, 0xe2, 0x44, 0x3f, 0xa9, 0xb3, 0x15,
0x66, 0x7c, 0x95, 0xfb, 0x62, 0xab, 0xed, 0xbb, 0x88, 0x87, 0xdb, 0xcd, 0x96, 0x5a, 0x1c, 0xf3,
0x51, 0xc7, 0x95, 0xca, 0x4f, 0x5c, 0xc6, 0xe2, 0x2e, 0x84, 0x4c, 0xc8, 0x13, 0xfc, 0xce, 0xb3,
0x47, 0x41, 0xf5, 0xc9, 0x88, 0xdd, 0x38, 0xd3, 0x1e, 0xa3, 0xbd, 0x3c, 0xb3, 0x73, 0x16, 0x2e,
0xfd, 0x3d, 0x57, 0x44, 0x26, 0x8c, 0x1c, 0x9a, 0x5b, 0x67, 0x9c, 0x97, 0xe2, 0x35, 0x6c, 0x7b,
0x1d, 0xe1, 0x46, 0xeb, 0x67, 0x55, 0x97, 0x88, 0x4f, 0xda, 0x01, 0xe6, 0x63, 0x60, 0xb8, 0x07,
0xe0, 0x4c, 0x4e, 0x55, 0x7c, 0xcd, 0xe2, 0xa2, 0x9d, 0xf1, 0x03, 0x0c, 0x0d, 0xa4, 0x75, 0x0c,
0x93, 0x14, 0xc5, 0x51, 0xb6, 0xa5, 0x06, 0x17, 0x11, 0xc6, 0xaa, 0x1a, 0x01, 0x56, 0x49, 0x33,
0x21, 0x8e, 0x2a, 0x99, 0x38, 0xd8, 0xa1, 0x58, 0xa1, 0x7d, 0xa1, 0x54, 0x96, 0x9d, 0xcb, 0x3a,
0xed, 0xfb, 0x8b, 0xce, 0x12, 0x02, 0x4b, 0x90, 0x8e, 0x7e, 0x75, 0xb9, 0xa8, 0xf4, 0x43, 0x83,
0xa4, 0xa7, 0xc3, 0xa3, 0x56, 0x32, 0x05, 0x4e, 0xf1, 0xbf, 0xfa, 0x41, 0x37, 0xe0, 0xf4, 0xd7,
0x24, 0xc3, 0xa0, 0x6a, 0x96, 0xfe, 0x98, 0x6a, 0x33, 0x9c, 0xa4, 0xf2, 0x77, 0x44, 0x70, 0x8f,
0xeb, 0x65, 0x23, 0xa3, 0x1a, 0xa4, 0xe2, 0xa1, 0x9d, 0x15, 0x67, 0x96, 0x4d, 0x52, 0xb5, 0x68,
0x25, 0x9c, 0xdc, 0xc6, 0x02, 0xc7, 0xeb, 0xb4, 0x68, 0xbc, 0x58, 0x46, 0xa9, 0x18, 0x3a, 0x56,
0x91, 0x7e, 0x3f, 0x44, 0x0e, 0x52, 0x22, 0x06, 0xe7, 0xe0, 0xe0, 0x6a, 0x07, 0xae, 0xd6, 0xb6,
0x80, 0xe0, 0xbc, 0x81, 0x82, 0x17, 0xbb, 0x4d, 0xfb, 0x20, 0x10, 0xff, 0x50, 0x3b, 0xe6, 0xd3,
0xe5, 0x55, 0xee, 0x1a, 0xf3, 0x2e, 0xdb, 0x3f, 0x02, 0xf6, 0x90, 0x6c, 0xdc, 0xef, 0x60, 0x53,
0xa8, 0x51, 0xe7, 0x99, 0x91, 0x31, 0x57, 0x22, 0x0c, 0x56, 0x3d, 0xdc, 0xc4, 0x7c, 0xf7, 0x66,
0x5f, 0xed, 0xe1, 0x33, 0x6f, 0x15, 0x2d, 0xf1, 0xd1, 0xc6, 0xd1, 0x45, 0xa5, 0x35, 0xe5, 0x9d,
0xc4, 0x1b, 0x79, 0x63, 0xbb, 0x52, 0x0e, 0x66, 0xdc, 0x12, 0xa2, 0x1e, 0xb5, 0xa9, 0x00, 0xf9,
0x39, 0xb7, 0x83, 0x8f, 0x27, 0x4d, 0x9e, 0xbb, 0x7c, 0xd0, 0xc2, 0x95, 0x1f, 0x2b, 0x93, 0x79,
0xb5, 0x4f, 0x20, 0xbc, 0x50, 0xee, 0x6e, 0xc2, 0xdd, 0x09, 0xd7, 0xaf, 0x7b, 0x9f, 0x02, 0x72,
0x61, 0xc3, 0x8f, 0x05, 0x6f, 0x3f, 0x1b, 0x95, 0x3c, 0xf2, 0x1b, 0xda, 0x1f, 0x5a, 0x9c, 0xaf,
0x3b, 0x07, 0xd1, 0x60, 0xf8, 0x0c, 0x18, 0x6f, 0xc5, 0xea, 0xa4, 0x20, 0x74, 0xd0, 0x41, 0xea,
0xee, 0x81, 0x51, 0x8f, 0xd2, 0xb4, 0x63, 0x11, 0x2a, 0xe6, 0xa6, 0xc0, 0x7a, 0x18, 0x5e, 0x8c,
0x24, 0x10, 0x1e, 0xe1, 0x4d, 0xdd, 0xc4, 0x40, 0x9c, 0xe7, 0xfc, 0xf9, 0xa1, 0x89, 0x55, 0xbb,
0xeb, 0x8c, 0x71, 0x46, 0xdc, 0xd9, 0x2a, 0xb1, 0x65, 0xe2, 0x04, 0x84, 0xc2, 0xb3, 0x16, 0xac,
0xb3, 0xd9, 0xdd, 0x22, 0x15, 0xc5, 0xb7, 0xf4, 0xeb, 0x89, 0x54, 0x20, 0x26, 0x28, 0x63, 0x5a,
0x46, 0xb4, 0x63, 0xe1, 0xb2, 0xd3, 0x5c, 0x46, 0x6e, 0xed, 0xc3, 0xc4, 0x99, 0x51, 0x22, 0x28,
0x40, 0x95, 0x9d, 0xb8, 0xeb, 0x11, 0x12, 0xf3, 0x2f, 0xa9, 0x52, 0xd7, 0x2f, 0x2c, 0xe2, 0xf6,
0x29, 0x76, 0x46, 0xeb, 0xaf, 0x53, 0xdc, 0x1c, 0x0e, 0xc4, 0x84, 0xfb, 0x70, 0x39, 0x38, 0xf4,
0x34, 0x1f, 0x21, 0xc1, 0x57, 0xfb, 0x58, 0xdc, 0x10, 0x1e, 0x39, 0x18, 0x05, 0x3d, 0x8a, 0xba,
0xb7, 0x5c, 0x93, 0x00, 0xb2, 0x91, 0x2f, 0x84, 0x0b, 0xac, 0xdf, 0xb4, 0xe2, 0x74, 0x16, 0xbf,
0xa3, 0xa9, 0x45, 0xde, 0x6c, 0xea, 0x14, 0xa6, 0x0f, 0x09, 0xd5, 0x7e, 0x6e, 0xc7, 0xee, 0x83,
0xf5, 0x61, 0x6a, 0x9f, 0xbf, 0x09, 0x52, 0x01, 0x74, 0x20, 0xf8, 0x57, 0xb3, 0x5f, 0xca, 0xaf,
0xdf, 0x7a, 0xf5, 0x04, 0x46, 0xc1, 0xe7, 0xd2, 0x62, 0x4f, 0x9c, 0xc4, 0xa1, 0x87, 0xaf, 0x0c,
0x6c, 0xe6, 0xc1, 0x18, 0xcc, 0xd4, 0x23, 0x4d, 0x99, 0x14, 0x02, 0xc0, 0xb8, 0x1d, 0xd3, 0x8b,
0xb5, 0x23, 0xa2, 0xec, 0xfc, 0xb1, 0x68, 0x96, 0xfe, 0x16, 0xae, 0xfe, 0x7b, 0xab, 0x3d, 0xed,
0x4f, 0x74, 0x60, 0x49, 0xe1, 0xd3, 0x8e, 0x6f, 0x8d, 0x71, 0x30, 0xbc, 0xcb, 0xac, 0x4b, 0x33,
0xbf, 0x54, 0x3d, 0x9c, 0x49, 0x29, 0xb7, 0xa6, 0x24, 0x7d, 0x1d, 0x4f, 0x9d, 0x57, 0x24, 0xe6,
0x04, 0x0f, 0x5d, 0x4a, 0x35, 0x70, 0x41, 0xfa, 0x07, 0xa8, 0xad, 0x99, 0x81, 0x10, 0xca, 0x30,
0xa3, 0xce, 0x6a, 0xc9, 0xfe, 0xd5, 0x80, 0x03, 0x4a, 0xdb, 0x66, 0xdf, 0x8f, 0xa8, 0x64, 0x3a,
0xd3, 0xec, 0xcf, 0xcf, 0xf6, 0xcc, 0xb8, 0xdf, 0x07, 0x56, 0xff, 0x42, 0x6a, 0xa9, 0xde, 0xe0,
0x1d, 0x65, 0x6f, 0xe6, 0x99, 0xf0, 0x91, 0x61, 0x1c, 0x5d, 0x68, 0x68, 0x8b, 0x3e, 0xe2, 0x8e,
0x32, 0x0d, 0x9e, 0xe2, 0x96, 0x6a, 0x5c, 0xf1, 0x46, 0xc1, 0x30, 0x13, 0xfc, 0x4c, 0xe3, 0x53,
0xc2, 0x03, 0x68, 0x9a, 0x38, 0xe0, 0x43, 0x78, 0x05, 0x71, 0x11, 0x41, 0x90, 0x0d, 0xdf, 0xa1,
0x3c, 0x54, 0x25, 0xe5, 0xc6, 0xaa, 0x54, 0x47, 0xc1, 0x3a, 0x35, 0x89, 0x36, 0x96, 0xae, 0x04,
0x58, 0x79, 0x01, 0x99, 0x20, 0x71, 0xde, 0xdc, 0xe8, 0x15, 0x5f, 0x27, 0x35, 0x81, 0xf0, 0xba,
0x35, 0xb7, 0xb2, 0x3c, 0x7b, 0x86, 0x51, 0x49, 0x94, 0x5b, 0xe1, 0xbd, 0xa2, 0x23, 0x3a, 0x7b,
0x5b, 0x4e, 0x2f, 0x55, 0x30, 0x17, 0x0d, 0xdd, 0x8f, 0xee, 0x44, 0x22, 0x9a, 0x2b, 0xbc, 0xa2,
0x62, 0x21, 0x72, 0xb3, 0x68, 0x31, 0x44, 0x5d, 0x4c, 0x9e, 0xc9, 0xbe, 0x1d, 0xdb, 0x14, 0xde,
0x7e, 0xab, 0x85, 0x93, 0xa6, 0xe5, 0x38, 0x9c, 0xc2, 0x60, 0xfb, 0x45, 0x3e, 0x30, 0x62, 0xb5,
0x86, 0x2c, 0xeb, 0xa8, 0x3d, 0xd3, 0x55, 0xab, 0x50, 0xd8, 0x59, 0xbd, 0x47, 0x21, 0x5c, 0x84,
0x40, 0x86, 0xef, 0x0f, 0x8d, 0x07, 0x44, 0x12, 0x59, 0x0e, 0xb8, 0xd1, 0x63, 0x3b, 0xc2, 0x13,
0x45, 0xdc, 0x1a, 0xac, 0xa9, 0x42, 0x0f, 0xcf, 0x35, 0x4a, 0xe4, 0x3e, 0xfc, 0xdb, 0x9a, 0x0b,
0x3c, 0x94, 0x22, 0xc6, 0x63, 0x4c, 0x6e, 0x15, 0xa0, 0x1d, 0x21, 0xd1, 0xcc, 0x64, 0x5b, 0xb6,
0xf3, 0xe5, 0x56, 0xde, 0x2c, 0x17, 0x47, 0x1d, 0x4c, 0x68, 0xac, 0xa8, 0x6e, 0xbc, 0x70, 0x0e,
0xfd, 0x31, 0xfe, 0x9e, 0xba, 0x3c, 0x31, 0xd1, 0x8c, 0x33, 0xd4, 0xb9, 0x48, 0x44, 0x1b, 0xc6,
0xf6, 0x68, 0x29, 0x62, 0x01, 0x8d, 0xd0, 0x70, 0x4b, 0xde, 0xb7, 0x8f, 0xdf, 0xb4, 0x57, 0xc7,
0x00, 0x75, 0xa4, 0x53, 0x97, 0x66, 0x8c, 0x85, 0xac, 0x26, 0xe1, 0x3c, 0x89, 0x0d, 0x1c, 0x98,
0x0c, 0x2b, 0x85, 0x60, 0x2f, 0x99, 0x53, 0x8c, 0x64, 0x9f, 0xe9, 0x7a, 0x01, 0x54, 0x2f, 0x11,
0x29, 0x18, 0xb6, 0x8c, 0xdc, 0x0b, 0x9e, 0x59, 0xf8, 0x14, 0xe2, 0x5e, 0x3d, 0xbe, 0xa2, 0x4c,
0x8a, 0x36, 0xb0, 0x64, 0xed, 0x7f, 0x2c, 0x92, 0x4c, 0x0c, 0x45, 0xe7, 0x12, 0xa9, 0xec, 0x93,
0x39, 0xee, 0xbb, 0xe4, 0x27, 0x8b, 0x1e, 0xd7, 0xfe, 0xfc, 0xd7, 0xd6, 0x0c, 0x27, 0xad, 0x80,
0xa9, 0x78, 0x16, 0x1e, 0x36, 0xf7, 0x18, 0xf3, 0xb5, 0x2f, 0xd7, 0x83, 0x74, 0x54, 0xf0, 0x4b,
0x43, 0x43, 0x8e, 0xa7, 0x8d, 0xbe, 0x7b, 0xad, 0xf3, 0x56, 0xce, 0x99, 0xe4, 0xdc, 0x3c, 0x97,
0x49, 0xd9, 0x0d, 0xe6, 0xd6, 0x30, 0xc8, 0x8e, 0x58, 0xd8, 0xf6, 0xf8, 0x28, 0x75, 0x9d, 0xc1,
0x4d, 0x74, 0x2e, 0xa4, 0xb6, 0x23, 0x2e, 0xfd, 0x05, 0xda, 0x4c, 0xc2, 0x00, 0x73, 0x2a, 0x4f,
0xab, 0x8b, 0x9b, 0xc8, 0x89, 0x62, 0x33, 0x43, 0x23, 0x33, 0xd3, 0x44, 0xac, 0xbd, 0xeb, 0xa7,
0xeb, 0x64, 0x63, 0x4e, 0x8a, 0x91, 0x91, 0x9e, 0xfd, 0x81, 0xf4, 0xb8, 0x48, 0x51, 0x1c, 0x18,
0x1f, 0x3f, 0x45, 0xba, 0x45, 0x84, 0x1c, 0xb2, 0x35, 0xb4, 0x77, 0x45, 0x88, 0x2c, 0xdd, 0x44,
0xba, 0xa4, 0x4e, 0xc8, 0xf7, 0x24, 0x7c, 0x47, 0x0f, 0x41, 0x23, 0x1b, 0x2c, 0x66, 0x32, 0x43,
0x06, 0x8c, 0xc3, 0x09, 0xaa, 0x89, 0x0e, 0xf1, 0xb7, 0x9f, 0x8f, 0xc4, 0x38, 0xa5, 0x17, 0xb9,
0x03, 0xd4, 0xe3, 0x5a, 0x1d, 0xbe, 0x1e, 0xcb, 0xaa, 0x2d, 0xf8, 0x87, 0xa1, 0xfa, 0x18, 0xaf,
0x39, 0xc4, 0xcf, 0xe9, 0x01, 0x04, 0xd3, 0x30, 0xfa, 0x1b, 0x99, 0xef, 0x3f, 0x1e, 0xe8, 0x27,
0x6c, 0xad, 0x45, 0x07, 0x4b, 0xfb, 0x5e, 0xc5, 0xfd, 0x72, 0xcf, 0x5b, 0x99, 0x69, 0xcb, 0xc4,
0x79, 0x37, 0x5b, 0xd2, 0xbe, 0x27, 0x1d, 0x0a, 0x83, 0x22, 0xe5, 0x0f, 0x1b, 0x0c, 0x3b, 0x2c,
0x66, 0xcc, 0x00, 0x88, 0xa3, 0xe4, 0xca, 0x6d, 0x72, 0x76, 0x79, 0x83, 0x32, 0x43, 0x38, 0x6c,
0x44, 0x1e, 0x46, 0xc2, 0x50, 0x84, 0xe3, 0x76, 0x21, 0xc4, 0xa3, 0xa6, 0x77, 0x45, 0x68, 0xf6,
0x5b, 0x9d, 0x2f, 0x50, 0x6f, 0xe6, 0x98, 0x32, 0x29, 0x73, 0xdd, 0xcb, 0x94, 0x88, 0x61, 0x59,
0xf5, 0x5a, 0x96, 0x78, 0x80, 0xf5, 0x69, 0x33, 0xb0, 0x66, 0xad, 0xa7, 0xfd, 0xeb, 0x86, 0x1e,
0xe4, 0x31, 0x36, 0x9c, 0xd9, 0x26, 0xee, 0x3b, 0x08, 0x8f, 0x9c, 0x5e, 0x85, 0x2a, 0xed, 0x06,
0x4f, 0xa4, 0x00, 0x4f, 0xc6, 0x58, 0xef, 0xac, 0xc3, 0xfe, 0xc6, 0xcd, 0xc1, 0x15, 0x0b, 0xd1,
0xb3, 0x18, 0x3f, 0xf5, 0x2c, 0xb6, 0x2d, 0x59, 0x8b, 0xaf, 0x17, 0x21, 0x26, 0xaf, 0xb3, 0xd8,
0xb3, 0xeb, 0xa6, 0x5d, 0xb8, 0x80, 0xf3, 0x30, 0x70, 0x78, 0xd9, 0xf2, 0x63, 0xbf, 0x26, 0x1b,
0xec, 0x79, 0x7d, 0xb7, 0x05, 0x30, 0x0f, 0x63, 0x57, 0x96, 0x77, 0x5d, 0x0e, 0x8d, 0x2a, 0x96,
0x4f, 0x2b, 0x51, 0xad, 0x76, 0x95, 0x61, 0xb2, 0x24, 0x4a, 0x48, 0xb5, 0xf9, 0x76, 0x7f, 0x71,
0xda, 0x48, 0x56, 0xc3, 0x29, 0xeb, 0x5a, 0x8a, 0x58, 0xcc, 0xab, 0x19, 0x93, 0xfc, 0x0f, 0x93,
0xf3, 0x49, 0x19, 0x91, 0x31, 0x24, 0x06, 0xc2, 0x79, 0x7e, 0x5b, 0x08, 0xa0, 0xef, 0x71, 0x72,
0x8e, 0x8c, 0xc3, 0xad, 0xcd, 0x23, 0xd2, 0x9b, 0x72, 0x48, 0xc3, 0x28, 0xb1, 0x92, 0x48, 0x9b,
0xec, 0x81, 0xc5, 0x6b, 0xe0, 0x08, 0x7c, 0xf3, 0x86, 0x53, 0xe4, 0x14, 0x8a, 0x80, 0x65, 0x12,
0x1f, 0xf7, 0xc6, 0xad, 0x4f, 0x8a, 0xa4, 0xbc, 0xaa, 0x37, 0x5f, 0x56, 0x6a, 0x8c, 0x61, 0x7d,
0x59, 0xab, 0xcd, 0x6c, 0x3b, 0x0a, 0xa1, 0x3e, 0xa4, 0x59, 0x0e, 0x5e, 0x37, 0xf4, 0x7b, 0xc2,
0x76, 0xf0, 0xf3, 0xcb, 0xfb, 0xcc, 0x0f, 0x15, 0x9e, 0x4e, 0x41, 0x1e, 0x3b, 0x42, 0xa5, 0xfd,
0x2c, 0x44, 0x0b, 0xab, 0x91, 0x61, 0x17, 0x71, 0x02, 0x08, 0xef, 0x6f, 0x11, 0x3e, 0xa8, 0x27,
0x09, 0xd5, 0xe0, 0xf5, 0xcd, 0xb6, 0x8f, 0xc3, 0x76, 0xfe, 0x70, 0x7f, 0x26, 0x00, 0xdb, 0x2f,
0x5b, 0xbe, 0xf6, 0x56, 0x9f, 0xbd, 0x6c, 0xec, 0x36, 0x46, 0x21, 0xf3, 0x04, 0x45, 0xb1, 0x61,
0xd3, 0xfa, 0xef, 0x69, 0xfa, 0x84, 0x0c, 0x87, 0xa3, 0x01, 0x60, 0x4e, 0x35, 0x1b, 0x6b, 0x25,
0xdb, 0x6a, 0x7d, 0x20, 0xc8, 0x6c, 0x1d, 0x3d, 0x4d, 0x28, 0xeb, 0xf8, 0x88, 0x50, 0xf6, 0x0d,
0x7a, 0xc0, 0xc1, 0xe3, 0x6e, 0x1d, 0x62, 0x9f, 0x76, 0xf0, 0x7a, 0xa6, 0x5d, 0xe7, 0x8b, 0xc9,
0xb3, 0x33, 0x24, 0xae, 0x53, 0x31, 0x2c, 0xd1, 0x5d, 0x5c, 0xf5, 0x41, 0x75, 0xdd, 0x0d, 0xc9,
0xb2, 0xb9, 0x05, 0x83, 0xd2, 0x92, 0x90, 0xa7, 0x25, 0x69, 0xa5, 0xe3, 0xf1, 0xd7, 0xed, 0xec,
0x31, 0x95, 0xda, 0x0d, 0xdc, 0x54, 0x75, 0x67, 0xc9, 0x48, 0xb1, 0xb8, 0xbe, 0xd5, 0xdf, 0x3f,
0xcd, 0xb5, 0x6f, 0x9b, 0x0c, 0x62, 0x5a, 0xa2, 0x88, 0xfd, 0x57, 0x81, 0x59, 0x61, 0x01, 0x42,
0x98, 0xda, 0x72, 0xd5, 0x16, 0xce, 0x02, 0x0d, 0xc7, 0x35, 0x63, 0xc0, 0xd3, 0x4a, 0x74, 0x63,
0xfa, 0x86, 0x9a, 0xdb, 0xe2, 0x49, 0x63, 0xd8, 0xf1, 0x2c, 0x80, 0xd7, 0x08, 0xb8, 0xf8, 0x51,
0x0a, 0xbd, 0x66, 0xd9, 0x04, 0x7b, 0xd6, 0xd1, 0x4d, 0xb5, 0x81, 0x59, 0x48, 0xfe, 0x27, 0x08,
0xac, 0x58, 0x4a, 0x6e, 0x0a, 0x6a, 0x0b, 0xe6, 0x6b, 0xd3, 0x15, 0xae, 0x1f, 0xb7, 0xda, 0xc0,
0xbe, 0x36, 0x59, 0x10, 0xab, 0x0e, 0xee, 0xc7, 0x8c, 0x9f, 0x4b, 0x42, 0x09, 0x41, 0x59, 0x43,
0xff, 0x05, 0x5b, 0xce, 0x11, 0xc6, 0x21, 0x62, 0x8c, 0x59, 0x32, 0x06, 0x0e, 0xb5, 0x16, 0xc2,
0x60, 0xd4, 0xc3, 0xda, 0x41, 0xb0, 0x46, 0xa2, 0x87, 0x6c, 0xc1, 0x1e, 0xb5, 0x90, 0x78, 0xd5,
0x50, 0xbc, 0x88, 0x3a, 0xa5, 0x72, 0x21, 0x39, 0xa0, 0x76, 0x12, 0x3c, 0x4d, 0xd2, 0xde, 0xbb,
0x7d, 0xa7, 0x92, 0xbc, 0xda, 0xa5, 0xac, 0xe3, 0x68, 0xf8, 0xf7, 0xd5, 0xc9, 0x5b, 0xa0, 0xe7,
0x39, 0x73, 0x93, 0xaf, 0xe1, 0xd0, 0x05, 0xcb, 0x89, 0xbb, 0xa2, 0x87, 0xb6, 0xca, 0x24, 0x40,
0x29, 0x5b, 0xd9, 0xc3, 0xe8, 0x3a, 0x19, 0x5f, 0xfc, 0xd3, 0xa8, 0x53, 0x61, 0x7b, 0x1d, 0x4c,
0x8b, 0x9f, 0xe1, 0xa7, 0xf5, 0xe4, 0xd4, 0x81, 0x7e, 0x7e, 0x22, 0xd0, 0xd4, 0x12, 0x55, 0xd0,
0x44, 0xb2, 0x71, 0xa6, 0x53, 0xde, 0x5c, 0x6a, 0xb3, 0x1b, 0x17, 0xd6, 0x79, 0xc5, 0x22, 0x7d,
0x1f, 0xba, 0x14, 0xf5, 0xde, 0x53, 0x12, 0x54, 0x24, 0xa5, 0xfa, 0xfc, 0x7c, 0xed, 0xbd, 0xf5,
0x60, 0x37, 0x4c, 0x7d, 0x4e, 0x52, 0xd0, 0x4b, 0x6f, 0xcb, 0xb7, 0x25, 0x10, 0x8d, 0xdc, 0x8e,
0x08, 0xe5, 0xb4, 0xfe, 0xfe, 0x9e, 0xf5, 0x65, 0xfb, 0x02, 0xcf, 0xaa, 0x3e, 0x56, 0xde, 0x43,
0x77, 0xc6, 0xcb, 0x83, 0x6c, 0xd0, 0x20, 0x7b, 0xfd, 0x00, 0x25, 0x22, 0xcc, 0x85, 0x03, 0x80,
0xc3, 0x9f, 0xb6, 0x6b, 0xb9, 0x2e, 0x30, 0x9c, 0x26, 0xcd, 0x05, 0xc9, 0x7d, 0x54, 0xba, 0x05,
0x5a, 0xd5, 0x00, 0xf2, 0x3c, 0x2c, 0xac, 0x8c, 0xe1, 0xfc, 0xe2, 0x9b, 0x4c, 0x62, 0x36, 0x57,
0xa4, 0x20, 0x58, 0x19, 0x6c, 0x3f, 0xe6, 0x35, 0xec, 0xdb, 0x7e, 0x77, 0xa0, 0x1a, 0x21, 0x14,
0xad, 0xac, 0x63, 0xf1, 0x41, 0x16, 0x9d, 0xf1, 0xf3, 0xcd, 0xf1, 0xc8, 0x6f, 0xb6, 0xe3, 0x4f,
0xc4, 0x19, 0xd6, 0x86, 0xe6, 0x20, 0xa4, 0x27, 0xdf, 0x4d, 0x90, 0x34, 0x97, 0x0d, 0x66, 0x18,
0x89, 0x64, 0x73, 0xb2, 0x13, 0xf1, 0x93, 0x3c, 0x53, 0x39, 0x85, 0xf4, 0x5c, 0x91, 0x97, 0x67,
0x9c, 0xa0, 0x3a, 0x6c, 0x6b, 0x9b, 0x98, 0x93, 0x49, 0x2e, 0xf8, 0xa7, 0x12, 0xb3, 0x8d, 0x31,
0x76, 0x18, 0xb6, 0xca, 0x00, 0x0b, 0xf0, 0xb5, 0x13, 0x48, 0x45, 0xd6, 0xda, 0x83, 0xc9, 0xd9,
0x3c, 0x37, 0x85, 0xb3, 0x6a, 0xd9, 0x15, 0x5c, 0xce, 0x63, 0xf7, 0x4f, 0xde, 0xc8, 0x8e, 0x03,
0xb6, 0x9b, 0x6d, 0xb3, 0x22, 0x65, 0xcb, 0xf5, 0x73, 0x44, 0xcd, 0xa5, 0x7e, 0x5f, 0x55, 0xd2,
0x6e, 0x26, 0x57, 0x61, 0x25, 0xfe, 0xdd, 0xae, 0xac, 0x01, 0x41, 0xcd, 0x43, 0xdc, 0x5e, 0x90,
0x6b, 0xab, 0xc5, 0x16, 0x2a, 0xd9, 0xc9, 0x0b, 0xf6, 0x23, 0x81, 0x6e, 0xe2, 0x1d, 0xe2, 0x91,
0x4c, 0x91, 0x42, 0xf3, 0x2e, 0x28, 0xf4, 0x89, 0x85, 0x8c, 0xf9, 0x31, 0xed, 0xae, 0x30, 0xe5,
0xb5, 0x3a, 0x5e, 0x6a, 0xd8, 0xc6, 0xd7, 0x4f, 0xcd, 0x0f, 0x49, 0x0c, 0xd8, 0xd0, 0x19, 0x04,
0xd0, 0x7a, 0x8d, 0xf3, 0x1c, 0x69, 0x38, 0xf7, 0x92, 0x31, 0x9b, 0xf7, 0xd0, 0x3a, 0x04, 0xb6,
0x9c, 0x58, 0xb9, 0x6b, 0x23, 0xd4, 0x99, 0x3d, 0x10, 0x84, 0x6d, 0x43, 0x6c, 0x61, 0x84, 0x01,
0xff, 0x97, 0x55, 0x88, 0x41, 0x48, 0x9c, 0x0b, 0x7b, 0x1b, 0xe5, 0xa8, 0xd4, 0x52, 0xd4, 0x07,
0x00, 0x26, 0xd4, 0xe2, 0x40, 0xa9, 0xad, 0x74, 0x9b, 0x44, 0xcf, 0x80, 0x11, 0xb1, 0xae, 0xf3,
0x7b, 0x78, 0x97, 0x82, 0xb0, 0xf8, 0xe1, 0x74, 0x60, 0xd3, 0xc4, 0x3e, 0x92, 0x55, 0x5c, 0x41,
0x34, 0x89, 0xba, 0xf2, 0xba, 0x1e, 0x01, 0xca, 0x64, 0xeb, 0x58, 0xf3, 0xdb, 0x61, 0xb3, 0x92,
0x19, 0x81, 0xbd, 0xc7, 0xf0, 0x05, 0x85, 0x80, 0x15, 0xa9, 0x87, 0xc4, 0x57, 0xa9, 0xdf, 0x8a,
0x35, 0xcf, 0xb7, 0x0b, 0x27, 0x77, 0x7e, 0x70, 0x43, 0xeb, 0x0c, 0xa0, 0x6a, 0x65, 0x47, 0x3a,
0xb3, 0xc5, 0x03, 0x95, 0x5b, 0x5a, 0x74, 0x3c, 0x89, 0xd3, 0x41, 0xc0, 0xa3, 0x2e, 0x69, 0x04,
0x7e, 0x5d, 0x9c, 0xda, 0xca, 0x90, 0x1e, 0x06, 0xc1, 0xb2, 0xd1, 0x1f, 0xe1, 0xeb, 0x27, 0x5b,
0x8d, 0x29, 0x2a, 0x99, 0x2a, 0x5b, 0xdf, 0xbe, 0x29, 0xd4, 0x36, 0xc0, 0x3f, 0xc0, 0xc8, 0x5f,
0x2e, 0x5c, 0x5d, 0xa3, 0xba, 0x8a, 0x18, 0xa8, 0xb3, 0x95, 0xae, 0xf8, 0x69, 0xcc, 0x21, 0x7a,
0xfd, 0x64, 0xdd, 0x2a, 0x74, 0x8d, 0x21, 0x53, 0x5d, 0x89, 0xa9, 0x4f, 0x64, 0xd3, 0x70, 0x45,
0xf0, 0xb2, 0x8f, 0x73, 0x31, 0x5f, 0x3d, 0x8f, 0x42, 0x0d, 0x30, 0x82, 0xbc, 0x3c, 0x33, 0xa9,
0x61, 0x51, 0x81, 0x2a, 0xe6, 0x83, 0xfc, 0xde, 0x4c, 0x9b, 0x64, 0xe9, 0x6c, 0xe5, 0xc4, 0x63,
0xc9, 0x3c, 0x15, 0xaf, 0x02, 0x64, 0x9c, 0x7c, 0x56, 0xed, 0x30, 0x8c, 0x9d, 0x38, 0x62, 0x16,
0xc8, 0x8b, 0x1e, 0xaa, 0x87, 0x71, 0x7c, 0x96, 0x85, 0x2e, 0x80, 0xe6, 0xe5, 0x44, 0xd4, 0xc3,
0x73, 0x1e, 0xc3, 0x4a, 0xff, 0xe4, 0x3b, 0xd5, 0x9d, 0x1e, 0x5a, 0x3e, 0x28, 0x6f, 0x23, 0xac,
0x59, 0x6c, 0x30, 0x1d, 0x13, 0x11, 0xe9, 0x86, 0x16, 0xb6, 0x87, 0x0a, 0xe4, 0x1d, 0xc3, 0xf4,
0xb6, 0x2c, 0x1e, 0x80, 0x19, 0xc7, 0xd9, 0x4b, 0xfb, 0xca, 0xc8, 0x12, 0xa7, 0x4d, 0xad, 0x0e,
0x12, 0xef, 0xdd, 0x08, 0x42, 0xa7, 0x50, 0xc4, 0xe6, 0x5e, 0x31, 0x1c, 0x0b, 0x76, 0x87, 0xc1,
0x80, 0x47, 0x5a, 0xcc, 0xa5, 0x70, 0x98, 0x8f, 0x13, 0x99, 0xf8, 0x5d, 0xec, 0x16, 0x9f, 0x46,
0x74, 0x89, 0x5f, 0x9b, 0xa2, 0x17, 0x19, 0xb7, 0x52, 0xf4, 0xb5, 0x13, 0x4f, 0x03, 0x6a, 0xf8,
0xa6, 0x25, 0x0c, 0xaf, 0x06, 0x92, 0x8c, 0x5d, 0x4c, 0x63, 0xba, 0xb2, 0x5a, 0x9f, 0x53, 0x0f,
0x6f, 0x6b, 0x3b, 0x8c, 0xc4, 0xbe, 0xfa, 0xef, 0xac, 0x68, 0xa2, 0xb1, 0x00, 0xd6, 0x4a, 0x9f,
0xc9, 0x00, 0x04, 0xdc, 0x2c, 0x7f, 0xfe, 0x32, 0xeb, 0xaa, 0x31, 0xca, 0x37, 0x14, 0xa4, 0x7d,
0x32, 0xb2, 0x3c, 0xcd, 0x34, 0x63, 0x19, 0x43, 0x87, 0x0c, 0xca, 0x98, 0x9a, 0x11, 0xe3, 0x98,
0x8a, 0xd9, 0xa8, 0x84, 0x49, 0x1f, 0xda, 0xec, 0xea, 0xdd, 0x08, 0xe6, 0xea, 0xb8, 0x76, 0x1d,
0x6e, 0x40, 0xb5, 0xc6, 0xbb, 0x5c, 0x6b, 0xe5, 0x7d, 0x87, 0x96, 0x35, 0xc7, 0x89, 0x9a, 0xff,
0x67, 0xd3, 0xe0, 0xce, 0x02, 0xfc, 0xea, 0x2b, 0xcf, 0xfd, 0x43, 0x74, 0x34, 0xe9, 0x84, 0x80,
0xa7, 0x38, 0x8e, 0x86, 0xbe, 0x96, 0xc0, 0x8b, 0xe0, 0x1d, 0x38, 0x15, 0x7a, 0x20, 0x21, 0xe6,
0xb6, 0xe7, 0x76, 0x7b, 0x25, 0x3e, 0x5e, 0x49, 0x0d, 0x19, 0xc0, 0x07, 0xd3, 0xa5, 0x5f, 0x54,
0xd4, 0x2d, 0x50, 0x68, 0xd5, 0x74, 0xe9, 0x4c, 0x25, 0x22, 0x41, 0xdd, 0x0b, 0xa6, 0x37, 0xe8,
0x1b, 0x35, 0x25, 0x5d, 0x26, 0xc4, 0x01, 0x15, 0x64, 0xdc, 0x04, 0xb8, 0xe8, 0x24, 0xc5, 0x1c,
0x06, 0x35, 0xc4, 0x5b, 0xe6, 0x56, 0x8c, 0xa3, 0xe4, 0xb8, 0xfe, 0x4b, 0x18, 0xef, 0x25, 0x9f,
0xdf, 0x05, 0x98, 0x00, 0x5f, 0x15, 0x3d, 0x7c, 0x88, 0x02, 0x94, 0x44, 0x56, 0x47, 0xc2, 0x93,
0xa7, 0x91, 0xae, 0x63, 0xfa, 0x0b, 0xc7, 0x18, 0x85, 0x88, 0xa4, 0xa8, 0x0a, 0xcf, 0x08, 0xa8,
0xd2, 0x5e, 0xb3, 0x76, 0x04, 0x3a, 0x59, 0x1c, 0x6d, 0xbd, 0x91, 0xe3, 0xed, 0xe1, 0x55, 0xbb,
0xba, 0x2d, 0xad, 0x76, 0x4a, 0xc4, 0x78, 0x08, 0x7e, 0x0b, 0xf5, 0xdb, 0x54, 0xc1, 0xe3, 0x6a,
0x75, 0x1d, 0x4d, 0x1f, 0xbe, 0x04, 0xff, 0xd5, 0xdf, 0xa6, 0x0d, 0xad, 0xf6, 0xd5, 0xd4, 0xcb,
0xe1, 0x72, 0x4a, 0x6b, 0xcc, 0x63, 0x76, 0xb7, 0x2c, 0x0e, 0xe9, 0x01, 0xd2, 0x44, 0x48, 0x19,
0xd4, 0xd6, 0xd3, 0x68, 0xa7, 0xec, 0x53, 0x92, 0x00, 0xa6, 0x6a, 0x2a, 0x85, 0x42, 0x0a, 0x23,
0xcc, 0x40, 0xcd, 0xd5, 0xb6, 0xb7, 0xab, 0xce, 0xc5, 0x43, 0xf0, 0xe7, 0x7a, 0x2c, 0xac, 0x8f,
0x91, 0x65, 0xf1, 0x7d, 0x0b, 0xcb, 0x8d, 0x64, 0xc8, 0xd1, 0x79, 0x51, 0xae, 0x64, 0xd3, 0xe3,
0xcc, 0x40, 0x54, 0xeb, 0x2b, 0x56, 0x26, 0x51, 0x64, 0xce, 0x17, 0xf7, 0x81, 0x0f, 0x67, 0x36,
0x83, 0x5e, 0x7a, 0xd6, 0x65, 0x3d, 0xcb, 0x48, 0x26, 0x12, 0x1a, 0xb3, 0xc3, 0x48, 0x2c, 0x9c,
0x47, 0xae, 0xcd, 0x70, 0x8a, 0x96, 0x87, 0x5e, 0xfc, 0xd7, 0x44, 0xe6, 0x1f, 0xd8, 0x84, 0x54,
0x9e, 0x09, 0xc9, 0x69, 0xf7, 0x8d, 0x74, 0xbe, 0x12, 0x33, 0x6f, 0x7c, 0x0a, 0x38, 0x61, 0x71,
0x0d, 0xde, 0x88, 0x78, 0x3a, 0xed, 0xb9, 0x97, 0x5c, 0xe0, 0xea, 0x97, 0xdf, 0x46, 0x60, 0x0a,
0x24, 0xdb, 0xd1, 0x58, 0x0a, 0xa3, 0x3d, 0xdf, 0x6c, 0xfc, 0xf8, 0x45, 0x01, 0x3d, 0x2b, 0x1d,
0x8f, 0x27, 0x12, 0x87, 0x81, 0x3c, 0x4e, 0xf5, 0x6d, 0x35, 0x8e, 0x6d, 0x9c, 0xe5, 0x31, 0x1b,
0xea, 0xbb, 0x9f, 0x97, 0x81, 0x15, 0xec, 0xe8, 0x02, 0x10, 0xc3, 0x97, 0xb9, 0xbd, 0xdd, 0xb0,
0xaa, 0x06, 0x0c, 0x18, 0x45, 0xa8, 0xef, 0xb7, 0xb4, 0x67, 0x2c, 0x8f, 0xbe, 0xcc, 0xbb, 0x99,
0x2f, 0x8b, 0x5a, 0x1d, 0x8c, 0xd4, 0xba, 0x9d, 0xb5, 0x9f, 0x7a, 0x51, 0x33, 0x68, 0xef, 0x6e,
0xad, 0x10, 0x4e, 0x3c, 0xde, 0x8a, 0x0d, 0xf7, 0x89, 0x86, 0x47, 0xb8, 0x9f, 0x4f, 0x7a, 0x7d,
0x9a, 0x3a, 0x8a, 0x49, 0xe5, 0xb3, 0x46, 0x7e, 0x99, 0x59, 0xe6, 0x3f, 0x6e, 0xcc, 0x18, 0xfe,
0x8d, 0xb3, 0x7e, 0x0e, 0x3f, 0xff, 0x24, 0x68, 0x5b, 0xe4, 0x31, 0x74, 0xa6, 0x24, 0x57, 0xca,
0xc8, 0x76, 0xc1, 0xbd, 0x76, 0x67, 0x67, 0x15, 0x62, 0xf5, 0x98, 0x91, 0x11, 0x56, 0x1e, 0x76,
0xc0, 0x16, 0x6b, 0xd5, 0x0b, 0x80, 0x76, 0x48, 0x61, 0xf2, 0xe8, 0x93, 0xdd, 0x3c, 0x18, 0x3e,
0x85, 0xf5, 0x38, 0xbe, 0x50, 0x4e, 0x24, 0x46, 0x7c, 0x63, 0x3e, 0xe6, 0x30, 0xaa, 0xa1, 0x16,
0x2b, 0xb7, 0x7b, 0xed, 0xa7, 0x8d, 0x8f, 0xe8, 0x12, 0xcb, 0x50, 0x3a, 0x3c, 0x5b, 0x9b, 0x2a,
0xe1, 0xd8, 0xd0, 0x8b, 0xd8, 0xb5, 0x51, 0xa9, 0x3d, 0x1c, 0x11, 0xf9, 0xe0, 0xda, 0xdc, 0xb2,
0x30, 0x32, 0xe9, 0xdd, 0xb5, 0x16, 0x4a, 0x9f, 0x7f, 0x7f, 0x40, 0x5b, 0x13, 0xd4, 0xc6, 0xb4,
0x34, 0x8c, 0xd1, 0xaa, 0xb2, 0x36, 0xd2, 0x46, 0x1e, 0x62, 0xc1, 0x6c, 0x4b, 0xe9, 0xcb, 0x7b,
0x13, 0xf2, 0x27, 0xf9, 0x4e, 0x58, 0x8f, 0xa1, 0xb4, 0x69, 0xe3, 0xf8, 0x81, 0x3e, 0xf4, 0x88,
0xb1, 0x81, 0x3f, 0x99, 0xb4, 0xee, 0xa2, 0xa4, 0xbc, 0x4a, 0x01, 0xba, 0x6a, 0x8d, 0x91, 0xef,
0xc7, 0xd4, 0x9e, 0xc6, 0x14, 0x14, 0xb4, 0x15, 0x91, 0x55, 0x15, 0x34, 0x4d, 0x08, 0x53, 0x69,
0x91, 0x8e, 0x28, 0x32, 0x0b, 0xf0, 0x82, 0x70, 0x01, 0xdd, 0x04, 0x4f, 0x5d, 0x2b, 0x36, 0x23,
0x26, 0xee, 0xdc, 0xd1, 0xec, 0x30, 0x89, 0x3f, 0xcc, 0xb0, 0xe7, 0xea, 0x4d, 0x06, 0x4e, 0xab,
0x96, 0xd4, 0xd9, 0x48, 0x42, 0x4c, 0x73, 0x8a, 0xf4, 0x94, 0xb9, 0x5c, 0xa6, 0xb5, 0x81, 0x12,
0x7b, 0x09, 0xc7, 0x91, 0x17, 0xb4, 0xeb, 0x1f, 0xb0, 0x08, 0x40, 0x84, 0xad, 0x95, 0x4b, 0x99,
0x66, 0x0e, 0xb0, 0xbb, 0x1e, 0x4d, 0xfb, 0x8b, 0x39, 0x16, 0x45, 0x7e, 0xcf, 0x7b, 0x00, 0xae,
0x37, 0xb4, 0x6e, 0x14, 0x68, 0xfe, 0x4c, 0x27, 0x36, 0x83, 0x34, 0xad, 0xa4, 0x86, 0x47, 0xad,
0x51, 0x15, 0x39, 0xd9, 0xa4, 0xe0, 0x44, 0xcf, 0x78, 0x08, 0xbc, 0x3d, 0x9c, 0xc5, 0xcd, 0x3a,
0x66, 0x09, 0xd3, 0xf0, 0xb7, 0xc2, 0x47, 0x05, 0xe6, 0xcd, 0x95, 0x58, 0xd2, 0xfc, 0x8d, 0x05,
0x41, 0x02, 0xaa, 0x13, 0xc8, 0xba, 0xe4, 0xfe, 0xb6, 0xf9, 0x98, 0x54, 0xf5, 0xd5, 0x1a, 0x55,
0x6a, 0xfa, 0xa7, 0x54, 0xa4, 0xeb, 0x28, 0x25, 0xbd, 0x0b, 0x18, 0x8f, 0x22, 0xda, 0xcb, 0x19,
0x21, 0x52, 0x93, 0x53, 0x35, 0x4f, 0xbc, 0x76, 0xe3, 0x4e, 0x50, 0x48, 0x15, 0xf8, 0x6f, 0xa3,
0xec, 0x7f, 0xec, 0x2f, 0xf8, 0xbc, 0xac, 0x70, 0xfe, 0xd8, 0xdd, 0x8b, 0x4d, 0x35, 0xc5, 0xd4,
0xc4, 0x0b, 0x2b, 0xbe, 0x8f, 0xb0, 0xf6, 0x6a, 0x01, 0xd8, 0x25, 0x0e, 0x24, 0x8f, 0x91, 0xec,
0x93, 0x8f, 0xa3, 0x43, 0x6d, 0x40, 0xe9, 0xbc, 0x42, 0xb5, 0xc1, 0x0a, 0xaf, 0x00, 0xcd, 0xa1,
0x66, 0xd0, 0x84, 0x21, 0x02, 0x22, 0xf0, 0x3c, 0x59, 0x4b, 0x28, 0xc6, 0xc3, 0x81, 0x43, 0x1e,
0xb5, 0x62, 0xdf, 0xdc, 0xd0, 0x64, 0xa0, 0x03, 0xc2, 0x30, 0x57, 0x1d, 0xf8, 0xd5, 0x81, 0x70,
0x47, 0xd7, 0x9c, 0x64, 0xa1, 0x0c, 0x71, 0xb4, 0x5c, 0xc3, 0x54, 0x62, 0x79, 0x4b, 0x43, 0x74,
0xb4, 0xf3, 0x35, 0x66, 0xb0, 0xdd, 0x35, 0xab, 0xa9, 0x14, 0x2c, 0x16, 0xd8, 0xb4, 0x49, 0xa4,
0x84, 0x5c, 0x11, 0xcc, 0xac, 0x5a, 0xce, 0x61, 0x37, 0x64, 0xa2, 0xd3, 0x67, 0x65, 0x5f, 0xa0,
0xc3, 0xf6, 0x18, 0x51, 0xbd, 0x78, 0xf3, 0xc1, 0xec, 0x9b, 0xe3, 0x36, 0x3b, 0x55, 0x05, 0x2d,
0x99, 0x72, 0x86, 0xb9, 0x3d, 0xe7, 0x29, 0x9f, 0xec, 0x72, 0x92, 0x59, 0x25, 0x10, 0xac, 0xb1,
0x21, 0x64, 0x53, 0x89, 0x59, 0xfe, 0x09, 0x85, 0xde, 0xd8, 0xe9, 0xb3, 0xe8, 0xad, 0x35, 0x73,
0x09, 0x1f, 0x64, 0xf2, 0xab, 0xa3, 0xd2, 0x66, 0xe4, 0x00, 0x36, 0x0d, 0x95, 0x59, 0x59, 0x29,
0x65, 0xe2, 0xbb, 0x09, 0x0f, 0x15, 0xa7, 0x9b, 0x0e, 0x18, 0xe2, 0x5d, 0x5e, 0x53, 0x13, 0x6c,
0xbf, 0x46, 0xf8, 0xd5, 0xc9, 0x2f, 0x96, 0x3b, 0x03, 0x45, 0xe4, 0xb4, 0xa9, 0x53, 0xdf, 0xe6,
0x2d, 0x87, 0xc8, 0xd1, 0x9b, 0xf1, 0x20, 0x78, 0x89, 0x3f, 0x3f, 0xf7, 0x50, 0x4b, 0x7d, 0x87,
0xe1, 0xcb, 0x22, 0x98, 0x8e, 0x50, 0xbc, 0xda, 0x33, 0x09, 0x44, 0xd6, 0xe2, 0x1b, 0x31, 0x33,
0x9c, 0x54, 0xa9, 0xf1, 0xf6, 0x2f, 0x74, 0xd6, 0x4e, 0x42, 0xc4, 0xce, 0x9e, 0xa1, 0x1c, 0xb2,
0x83, 0x70, 0x62, 0x0d, 0xdd, 0x01, 0x9d, 0x72, 0xcf, 0x86, 0xf2, 0x3f, 0x8d, 0x63, 0x92, 0xfe,
0xba, 0x71, 0x04, 0x0e, 0x67, 0x11, 0xf6, 0xb8, 0x7d, 0x45, 0x74, 0xb3, 0x53, 0x12, 0x30, 0xc2,
0xcd, 0x42, 0x81, 0x1b, 0xeb, 0xd4, 0x27, 0x31, 0xda, 0xa3, 0xfb, 0xc2, 0x24, 0x37, 0xfc, 0xbc,
0xd4, 0x53, 0xd5, 0x49, 0x62, 0x45, 0xd8, 0xe1, 0xd8, 0xd4, 0x1a, 0x44, 0xd3, 0x38, 0x8f, 0xdc,
0x5f, 0x44, 0xd5, 0xa6, 0xc2, 0xef, 0xd5, 0x0a, 0xce, 0xd0, 0xc3, 0x91, 0x82, 0xb9, 0xe1, 0x3c,
0xee, 0x5a, 0xfd, 0x25, 0x72, 0x69, 0xa7, 0x52, 0x15, 0x2d, 0x2c, 0x1a, 0xd3, 0x22, 0x76, 0xae,
0xdd, 0x10, 0x54, 0x3d, 0x4a, 0x43, 0xc9, 0x36, 0xa8, 0x17, 0xf9, 0x7e, 0x85, 0x04, 0xc9, 0x82,
0x9a, 0x5e, 0xe7, 0x19, 0x1e, 0xfc, 0x65, 0x88, 0xe0, 0xfc, 0x51, 0xb6, 0x8b, 0xed, 0xbc, 0x57,
0x1d, 0x02, 0x6e, 0x88, 0xe5, 0x6d, 0xf0, 0xcf, 0x58, 0x07, 0x9e, 0xcc, 0x9f, 0x79, 0xe1, 0xda,
0x38, 0x62, 0xe1, 0x97, 0xf6, 0x51, 0x29, 0xcb, 0xb8, 0x8c, 0xd3, 0x28, 0xda, 0xa3, 0x3c, 0xbd,
0xc8, 0x4a, 0x10, 0xe7, 0x9e, 0xc5, 0x4d, 0xfb, 0x16, 0xd0, 0x95, 0xd6, 0xa1, 0x76, 0x61, 0x78,
0x8a, 0x5b, 0x11, 0xc9, 0xb3, 0x3b, 0x60, 0x18, 0x01, 0x55, 0xa2, 0x8d, 0x58, 0xe5, 0x1c, 0x1b,
0xab, 0x32, 0x5e, 0xc7, 0x36, 0x92, 0x3a, 0x5c, 0x5e, 0x68, 0xa3, 0x32, 0xfc, 0xce, 0xfc, 0x15,
0xe8, 0x04, 0x26, 0x0e, 0x0e, 0x28, 0xd2, 0xbb, 0xca, 0x5d, 0xee, 0x30, 0x84, 0x29, 0xb2, 0x62,
0xa1, 0xaf, 0xcf, 0xf5, 0x74, 0x94, 0x70, 0x6d, 0x7b, 0x6a, 0xf5, 0x5f, 0x9d, 0x1d, 0x29, 0x71,
0x48, 0xb9, 0xcb, 0x0d, 0xa0, 0x19, 0x1f, 0x71, 0xa6, 0x39, 0x90, 0xa6, 0x9d, 0x74, 0x2b, 0xcd,
0xac, 0xcc, 0xa4, 0x5e, 0x3b, 0x87, 0x06, 0x18, 0xb8, 0x7a, 0x34, 0xab, 0x54, 0x5c, 0x9f, 0xe5,
0x6d, 0x8a, 0xbf, 0x05, 0x95, 0x05, 0x3e, 0xb3, 0x4d, 0xaa, 0x9d, 0x80, 0x5c, 0x94, 0xcd, 0xbd,
0x76, 0x64, 0xd4, 0xb6, 0xde, 0xef, 0xac, 0xd6, 0x1f, 0x30, 0x5c, 0x6d, 0x34, 0x51, 0x4d, 0x8a,
0xf7, 0xe4, 0x9c, 0x1f, 0xee, 0x3e, 0x61, 0xb2, 0xd5, 0x65, 0x5f, 0xe1, 0xda, 0x9c, 0xd0, 0x2b,
0xe1, 0x0a, 0x56, 0x09, 0x0e, 0xcb, 0x65, 0x63, 0x30, 0xf1, 0xdc, 0xc9, 0x9c, 0x9d, 0xac, 0xf9,
0x2d, 0xb2, 0x17, 0x97, 0xf8, 0xc6, 0x83, 0xea, 0x72, 0xa8, 0x23, 0xf3, 0xf4, 0x91, 0x6d, 0x1c,
0xf4, 0x3a, 0x5f, 0x55, 0x0e, 0x41, 0x67, 0xa6, 0xb2, 0xfa, 0xad, 0xc4, 0xc7, 0x6b, 0x39, 0x96,
0xe7, 0xc3, 0x88, 0xe9, 0xe2, 0x13, 0x35, 0x6f, 0x3f, 0x55, 0xd1, 0x1b, 0x65, 0x45, 0x1c, 0xe8,
0x22, 0x75, 0xba, 0x73, 0xbe, 0xc5, 0x12, 0x20, 0x10, 0x7c, 0x3a, 0xef, 0x6c, 0x16, 0xa5, 0x9a,
0x8b, 0xc4, 0x5c, 0x1c, 0xd1, 0x8d, 0xad, 0x20, 0x1e, 0x96, 0x7e, 0x95, 0xa0, 0xb5, 0xa1, 0xd5,
0xe7, 0x9a, 0x65, 0x4b, 0x8c, 0x8e, 0x8d, 0xd4, 0x90, 0xd7, 0x44, 0x3a, 0x3f, 0xdc, 0x3c, 0x5c,
0xc2, 0x96, 0xcf, 0x16, 0x1b, 0xcf, 0x7f, 0x5f, 0x11, 0xae, 0x5e, 0x6e, 0x28, 0x3b, 0x0a, 0xaa,
0xcf, 0xc4, 0x7e, 0x34, 0x00, 0x2a, 0xb4, 0x74, 0xfa, 0xbd, 0x90, 0x7b, 0x3b, 0x7d, 0x3f, 0xde,
0x6e, 0x0d, 0x70, 0x57, 0x2c, 0x72, 0xe6, 0x12, 0x06, 0x88, 0xd4, 0xd2, 0xd6, 0xb5, 0x27, 0xe3,
0xf2, 0xef, 0xba, 0xf4, 0x3b, 0x2c, 0x8b, 0x98, 0xac, 0xba, 0x51, 0x34, 0x2d, 0x13, 0x43, 0xc2,
0x35, 0x9e, 0x7e, 0x99, 0x77, 0x84, 0x79, 0x41, 0xbf, 0xe4, 0xec, 0x45, 0x96, 0x0a, 0x73, 0xac,
0x7e, 0x27, 0xf1, 0x1b, 0xdd, 0x9d, 0x03, 0x14, 0xc4, 0x60, 0x75, 0x10, 0xd9, 0xa3, 0x98, 0x85,
0x04, 0x98, 0x07, 0x28, 0xd9, 0x46, 0x72, 0xef, 0x5d, 0x0c, 0xed, 0x3b, 0x26, 0x31, 0x8a, 0xa0,
0xd6, 0x50, 0x5d, 0x27, 0xd6, 0x85, 0x3c, 0x13, 0x51, 0x19, 0x4b, 0x16, 0x26, 0x16, 0x49, 0x7a,
0x90, 0xa4, 0x81, 0x11, 0x58, 0xe8, 0x87, 0xf8, 0x5e, 0x43, 0xc1, 0x44, 0x7c, 0xd7, 0xb1, 0x5f,
0x1c, 0xb9, 0x14, 0xef, 0x5f, 0x00, 0x75, 0x69, 0x33, 0xf2, 0x17, 0x81, 0xf6, 0xd5, 0x05, 0x28,
0xf2, 0x7e, 0x65, 0xe7, 0x30, 0x63, 0xf2, 0xc9, 0xcb, 0xc3, 0x1c, 0xdf, 0xfd, 0x07, 0x72, 0x92,
0x76, 0xef, 0x30, 0x71, 0x5c, 0x07, 0xb7, 0x02, 0x03, 0x34, 0x8f, 0x16, 0xfc, 0x79, 0x45, 0x7f,
0x83, 0x13, 0xb4, 0x1b, 0xb4, 0xbc, 0xc2, 0x29, 0x7c, 0xe9, 0x07, 0x2d, 0xd3, 0x9d, 0x9c, 0xf5,
0x72, 0xd7, 0x7b, 0x63, 0x39, 0x0d, 0xf5, 0xcd, 0xc7, 0x1a, 0x53, 0x14, 0x70, 0xb0, 0xa0, 0x31,
0x14, 0x42, 0x20, 0x91, 0xbd, 0xbb, 0x92, 0x87, 0x03, 0x5b, 0xc7, 0xe8, 0x88, 0x3b, 0xc0, 0x65,
0x15, 0xfd, 0x85, 0xd5, 0xf6, 0xa4, 0xff, 0x6c, 0x28, 0xc0, 0xfc, 0x17, 0x4b, 0xbf, 0x2a, 0x6d,
0xeb, 0x39, 0x26, 0x4e, 0x9d, 0x4d, 0x0a, 0x15, 0x7f, 0x7a, 0x82, 0x16, 0x0d, 0x19, 0xca, 0x3d,
0x33, 0x20, 0xe2, 0x77, 0xc6, 0x7a, 0x14, 0x50, 0x59, 0x7e, 0xe4, 0xef, 0x17, 0x13, 0x69, 0x08,
0x65, 0x72, 0x92, 0xfb, 0x15, 0x35, 0xc5, 0x4e, 0x0f, 0x33, 0xa7, 0x4c, 0x2d, 0xf9, 0x88, 0x08,
0xdc, 0x5f, 0x05, 0x72, 0xa2, 0xc8, 0x72, 0xf2, 0xab, 0xe3, 0xc2, 0x6b, 0x61, 0xea, 0xa5, 0x1a,
0x1f, 0x43, 0x1f, 0x38, 0xc1, 0x73, 0x14, 0x77, 0xe5, 0x6d, 0x0b, 0x72, 0x94, 0xf8, 0x24, 0x50,
0xf8, 0x1d, 0x3b, 0x4e, 0x24, 0xac, 0x3b, 0x91, 0x8c, 0xda, 0xfd, 0x65, 0x70, 0x76, 0xdc, 0x04,
0xd0, 0xd2, 0x47, 0x8c, 0x66, 0x17, 0x7c, 0x52, 0xf3, 0x2e, 0x63, 0x57, 0x8f, 0xf9, 0x1c, 0xf4,
0xb9, 0xc3, 0x47, 0x9f, 0xf9, 0xe5, 0x0d, 0x01, 0x13, 0x25, 0x67, 0x5b, 0x0f, 0x06, 0x1f, 0x9f,
0x39, 0xa0, 0x66, 0x70, 0x9e, 0xc2, 0xe0, 0x47, 0x99, 0xd8, 0xc6, 0xb7, 0xf5, 0xc0, 0xe6, 0xcb,
0x0f, 0x47, 0x36, 0xa9, 0xc3, 0x0c, 0x29, 0x65, 0xdd, 0x1b, 0x6d, 0x13, 0x0c, 0x46, 0x19, 0xc0,
0x64, 0x2b, 0xf4, 0x64, 0x77, 0x91, 0x47, 0x52, 0x40, 0x55, 0x00, 0x3d, 0x7d, 0x10, 0x6e, 0x33,
0xb8, 0xd4, 0xf2, 0x87, 0x8c, 0xa1, 0x03, 0x6d, 0xc2, 0x6b, 0xa7, 0xc0, 0x43, 0xfe, 0xec, 0x62,
0xf2, 0x3e, 0x5e, 0x61, 0x4e, 0xd2, 0x16, 0xa7, 0x68, 0x8f, 0xd4, 0x91, 0x14, 0x1f, 0x2f, 0x0f,
0xf0, 0x39, 0x01, 0xe2, 0x71, 0x88, 0xc4, 0xc1, 0x0c, 0xa6, 0x3c, 0x9b, 0x16, 0xc6, 0x81, 0x81,
0x19, 0x46, 0xb7, 0x09, 0x44, 0x3f, 0xec, 0x71, 0x7c, 0x02, 0x93, 0xcf, 0x95, 0x6f, 0xe1, 0x0f,
0x1c, 0xbc, 0x49, 0x49, 0xe9, 0x0d, 0x60, 0x22, 0xe1, 0xdf, 0x51, 0x87, 0xa4, 0xa9, 0xf3, 0x37,
0x57, 0xb5, 0x32, 0xe7, 0xaf, 0xd7, 0x08, 0xcd, 0x92, 0x0c, 0x8c, 0xd3, 0xfb, 0x97, 0x06, 0x97,
0x6e, 0xf9, 0x25, 0x30, 0x99, 0xae, 0xa2, 0x57, 0xba, 0x89, 0xa2, 0x7d, 0x01, 0x5f, 0x2f, 0xad,
0x5e, 0x41, 0x3f, 0xc9, 0x0b, 0x15, 0x01, 0xd0, 0xbf, 0x33, 0x2a, 0xe7, 0x29, 0x75, 0xac, 0xb6,
0x94, 0x65, 0x79, 0x58, 0xac, 0x58, 0x06, 0x3b, 0x95, 0x03, 0x94, 0x0b, 0xd0, 0xb5, 0xda, 0x86,
0x67, 0xd1, 0x4a, 0x6f, 0x14, 0x77, 0x8d, 0xe4, 0x2f, 0xc5, 0xb4, 0x9a, 0xa2, 0xf3, 0x1d, 0x63,
0x82, 0x3b, 0x45, 0x8d, 0x9d, 0x30, 0xc9, 0xca, 0xc2, 0xde, 0x64, 0x37, 0xba, 0x07, 0xa4, 0xdc,
0x7f, 0x64, 0xc5, 0x85, 0x05, 0xf8, 0x49, 0x00, 0x66, 0xb8, 0xa3, 0x08, 0x27, 0x2a, 0xfd, 0xc5,
0xf5, 0x2f, 0x9d, 0x38, 0x47, 0xd4, 0x5a, 0xdc, 0xb4, 0x98, 0x7a, 0x57, 0xe5, 0x1e, 0x7f, 0x87,
0xe7, 0xb9, 0x7b, 0xe0, 0x86, 0x4c, 0xad, 0x5c, 0x32, 0xfd, 0x7d, 0x7a, 0x52, 0x3b, 0x70, 0x7d,
0x62, 0xfe, 0x42, 0x71, 0xb6, 0x99, 0xcc, 0xa4, 0x23, 0xd8, 0x8a, 0x7b, 0x03, 0x20, 0x86, 0x15,
0x46, 0x6b, 0x37, 0xe9, 0x14, 0xd1, 0x1b, 0xf0, 0xac, 0x09, 0xaf, 0x27, 0xbd, 0xaf, 0xdb, 0x88,
0x81, 0xf5, 0x94, 0xaf, 0xac, 0xa9, 0xaf, 0x80, 0x4f, 0xb3, 0x99, 0x35, 0x7f, 0x78, 0x42, 0x8a,
0x61, 0x46, 0xf4, 0x17, 0x70, 0x29, 0x43, 0x0a, 0xe8, 0x14, 0x4e, 0xfa, 0xac, 0xe1, 0x39, 0x6a,
0x67, 0x55, 0x35, 0x01, 0x15, 0x9c, 0x6b, 0x28, 0xf5, 0x19, 0xfa, 0x2b, 0x6c, 0x52, 0x6d, 0x05,
0x92, 0xbd, 0x76, 0x9e, 0xbb, 0x8e, 0xf8, 0xd4, 0xa9, 0xcb, 0x06, 0x01, 0x5a, 0x3c, 0xbb, 0xe4,
0x90, 0x23, 0x8e, 0xd5, 0x40, 0x9c, 0x5c, 0x6d, 0x5c, 0x76, 0xd0, 0x50, 0xaf, 0xb8, 0x1e, 0x79,
0x4e, 0xdb, 0x0c, 0xae, 0x2b, 0x5b, 0x32, 0xde, 0x79, 0x36, 0xa6, 0xdf, 0xc5, 0x5b, 0xdf, 0x96,
0x29, 0xc7, 0x43, 0x9c, 0xa6, 0xe0, 0xab, 0xc5, 0xa7, 0x26, 0x39, 0xde, 0x5e, 0x49, 0x98, 0x84,
0xf0, 0x0d, 0x38, 0x93, 0x21, 0x6f, 0x3b, 0x7a, 0xf5, 0x30, 0x6e, 0xa1, 0xe1, 0xc6, 0x52, 0x8f,
0xfb, 0x6d, 0x21, 0x67, 0x48, 0xc4, 0x8e, 0x66, 0xe3, 0x81, 0x95, 0xba, 0xe1, 0x2b, 0x18, 0xe1,
0xdf, 0xeb, 0xcd, 0xb9, 0x4a, 0x76, 0x97, 0x86, 0xc0, 0xd5, 0xf1, 0x17, 0x69, 0x27, 0x18, 0xb2,
0xe4, 0x21, 0xcb, 0x6c, 0xec, 0xc3, 0x1a, 0xe3, 0x03, 0xa3, 0xcb, 0xf0, 0xd0, 0x91, 0xaa, 0x66,
0xe0, 0x86, 0x85, 0x31, 0xa2, 0x06, 0xed, 0xc8, 0x0b, 0x6b, 0x82, 0xcb, 0xde, 0xc4, 0x68, 0xee,
0x5f, 0x69, 0x95, 0xe1, 0x78, 0x1f, 0xdf, 0xaf, 0xee, 0xbf, 0x6e, 0x9d, 0xc2, 0x9b, 0xed, 0xb8,
0x52, 0xd3, 0x1a, 0xb2, 0x50, 0xb6, 0x11, 0x4e, 0xa7, 0x91, 0x4d, 0xb5, 0x7f, 0x2a, 0x29, 0x00,
0x5c, 0x75, 0xd6, 0x99, 0xf9, 0x6c, 0xf6, 0x73, 0xc0, 0x8f, 0xc8, 0x18, 0x4a, 0xfa, 0x71, 0xa1,
0xd1, 0xd5, 0x74, 0xfd, 0xb4, 0x79, 0x0b, 0xa1, 0xb9, 0x03, 0xe4, 0xbe, 0x7d, 0xab, 0x67, 0x59,
0x41, 0x9d, 0xd5, 0xe2, 0x67, 0x6e, 0x36, 0x74, 0x67, 0x35, 0x17, 0x66, 0x6f, 0xc2, 0xa6, 0xdf,
0xf1, 0x5c, 0xeb, 0x63, 0xb6, 0x88, 0x98, 0xc2, 0xc0, 0x41, 0x05, 0xa6, 0x54, 0xcc, 0xdd, 0xa3,
0x00, 0x49, 0x61, 0xe2, 0xfa, 0x04, 0xbb, 0xd6, 0x4b, 0xe6, 0xd1, 0x7e, 0x07, 0x20, 0x33, 0x13,
0x7e, 0x91, 0x39, 0xb4, 0x08, 0xe5, 0x62, 0x7a, 0xfc, 0xe4, 0x08, 0x6e, 0xf3, 0xb6, 0x2e, 0xbc,
0x10, 0xd7, 0x93, 0xdd, 0xae, 0x62, 0x3c, 0xa6, 0x85, 0x57, 0x13, 0x84, 0xb7, 0x20, 0x20, 0xc3,
0x61, 0xa3, 0xc6, 0x57, 0x37, 0xad, 0xa0, 0xa9, 0x96, 0x26, 0xe1, 0xcc, 0x4e, 0xdb, 0xf3, 0xa2,
0xd5, 0xea, 0x7b, 0x79, 0xee, 0x52, 0xa2, 0x93, 0x99, 0xc8, 0x3e, 0x33, 0x37, 0x50, 0x1f, 0x11,
0xeb, 0xe1, 0x96, 0x77, 0x88, 0x4f, 0xc5, 0x47, 0xd4, 0x85, 0x6e, 0x0c, 0x05, 0x6b, 0x30, 0x9c,
0x9c, 0x06, 0x93, 0x6b, 0x76, 0xe5, 0x91, 0x79, 0xb6, 0x23, 0x4d, 0xd2, 0x97, 0xad, 0x20, 0x6a,
0x44, 0xe3, 0x67, 0x93, 0x88, 0x74, 0xc6, 0x20, 0xd3, 0x04, 0x46, 0x50, 0x08, 0xcd, 0xe3, 0xb9,
0xcd, 0x96, 0x1f, 0xe0, 0xa2, 0x19, 0x46, 0x33, 0xb6, 0x0d, 0xa9, 0xff, 0xa3, 0xac, 0xdc, 0xde,
0x56, 0xdd, 0xd2, 0xe9, 0xd5, 0x31, 0xc8, 0x82, 0x54, 0xc1, 0xab, 0xfc, 0x82, 0xeb, 0x32, 0xd1,
0x76, 0xfd, 0x6e, 0xe7, 0xef, 0x48, 0x8e, 0x55, 0xff, 0x91, 0x46, 0xe3, 0x51, 0xd3, 0xf8, 0x8f,
0x86, 0x45, 0x8b, 0x7d, 0x1c, 0x01, 0x5c, 0xbe, 0xb9, 0xa2, 0x83, 0x0c, 0x94, 0xc1, 0x39, 0xb8,
0x8d, 0xd3, 0x72, 0x2f, 0x21, 0xff, 0xa0, 0xed, 0x5f, 0x0f, 0xe2, 0xf5, 0x22, 0x92, 0xd6, 0x3e,
0x7a, 0x4e, 0x82, 0x96, 0xaa, 0xf6, 0xe7, 0xc6, 0x76, 0xd5, 0x0f, 0xae, 0x02, 0x74, 0x63, 0x3b,
0x32, 0x2b, 0x11, 0x7a, 0x25, 0xb4, 0xef, 0x14, 0xde, 0x3e, 0xba, 0x71, 0xc8, 0xf7, 0x1c, 0x3f,
0x1d, 0x7b, 0x2b, 0x6e, 0x0a, 0x72, 0x87, 0x21, 0x68, 0xd9, 0xfb, 0x4d, 0xc7, 0x73, 0x6f, 0x07,
0xf7, 0x4f, 0x06, 0x1e, 0x97, 0x93, 0xdc, 0x11, 0xb9, 0x28, 0xfb, 0xcf, 0x06, 0x40, 0xf5, 0x07,
0xf2, 0x58, 0x41, 0x5e, 0x27, 0x04, 0xe5, 0x90, 0xd8, 0xd8, 0xa7, 0xa3, 0xc3, 0x01, 0x50, 0x9a,
0x94, 0x80, 0x38, 0x6e, 0x9c, 0x0d, 0xbe, 0xda, 0x03, 0xaa, 0x6e, 0xe6, 0x39, 0xd3, 0x21, 0xa0,
0x68, 0xf1, 0xff, 0x46, 0x4d, 0xe5, 0xcb, 0x8c, 0x9e, 0x1d, 0x8a, 0x18, 0x54, 0x44, 0x89, 0xeb,
0xe4, 0xa1, 0x0b, 0xf2, 0xa3, 0x8d, 0x6b, 0x67, 0x58, 0xda, 0x97, 0x9d, 0xd9, 0xd5, 0x7c, 0xb3,
0x4b, 0xf0, 0x6a, 0xa0, 0x39, 0xf8, 0xc2, 0x8f, 0xf4, 0x82, 0xf7, 0x77, 0xfd, 0xf4, 0x9b, 0xb0,
0xe2, 0x3f, 0xd5, 0xa1, 0x39, 0x97, 0xe7, 0x42, 0x68, 0xbd, 0x34, 0x15, 0x7b, 0x8e, 0x97, 0x59,
0x74, 0x54, 0x46, 0x62, 0x0b, 0x67, 0xc0, 0x7a, 0x63, 0x1e, 0xde, 0xd4, 0xda, 0x64, 0xfd, 0x52,
0xa8, 0x43, 0x25, 0x22, 0xa8, 0xcb, 0xef, 0x46, 0x3c, 0xf3, 0x42, 0xc2, 0x9d, 0x82, 0x4e, 0xab,
0x6d, 0xda, 0x3b, 0xea, 0xe4, 0xfa, 0x86, 0x5a, 0x91, 0xbb, 0x93, 0xbc, 0xf1, 0x9d, 0xcb, 0xf8,
0x3c, 0x30, 0xa4, 0x63, 0xf2, 0x72, 0x22, 0x37, 0xec, 0x6c, 0x32, 0x19, 0xe4, 0xea, 0x1a, 0x5c,
0x83, 0x32, 0xcd, 0x31, 0xa6, 0x72, 0x81, 0x6c, 0x6d, 0x6a, 0x3a, 0x02, 0x5a, 0x2d, 0x4f, 0xe2,
0x46, 0x5a, 0x70, 0xfe, 0x31, 0xe4, 0x08, 0x17, 0x49, 0x14, 0x90, 0x1f, 0x9c, 0xd2, 0x55, 0x55,
0xad, 0x35, 0xee, 0x44, 0x7b, 0xed, 0xb4, 0x60, 0x79, 0xa1, 0x0e, 0x28, 0xd4, 0x5d, 0xc1, 0xdd,
0xc0, 0x89, 0x50, 0x1c, 0xf6, 0xd2, 0x89, 0x7e, 0xf5, 0x60, 0x4c, 0xfb, 0x92, 0x6b, 0x1f, 0x91,
0xee, 0xa8, 0x7b, 0x3b, 0x4b, 0x5c, 0xf1, 0xde, 0x1f, 0x19, 0xde, 0x0c, 0xac, 0x59, 0x0e, 0xe3,
0x22, 0xb9, 0x01, 0x01, 0x99, 0x35, 0x65, 0x0d, 0x74, 0x01, 0xf8, 0x59, 0x4f, 0x07, 0xd0, 0xc5,
0xb4, 0x5f, 0xf2, 0xa0, 0x70, 0xc2, 0xaa, 0x99, 0xce, 0xb5, 0x79, 0xf9, 0x23, 0x4d, 0x40, 0xa0,
0x84, 0xba, 0xc2, 0xd3, 0x27, 0xe3, 0x9e, 0x46, 0x96, 0xc5, 0x70, 0x9e, 0x81, 0x43, 0x31, 0x1f,
0x8c, 0xbb, 0x1b, 0x9a, 0x9e, 0x90, 0x54, 0x2f, 0x2a, 0x5c, 0x7b, 0xc3, 0x1b, 0xa5, 0x5f, 0xc7,
0x50, 0x40, 0xcc, 0xdb, 0xb0, 0x19, 0xdf, 0x60, 0xf9, 0xf5, 0xbe, 0x34, 0x62, 0x95, 0x2c, 0x53,
0xed, 0x5a, 0xe5, 0xd2, 0xb9, 0x63, 0xe2, 0x09, 0xae, 0xec, 0x91, 0x52, 0x28, 0x5b, 0x57, 0x45,
0x9d, 0x9c, 0x30, 0xf1, 0x3f, 0x08, 0x24, 0xd4, 0xdf, 0x73, 0x91, 0xcd, 0x37, 0xf4, 0xc0, 0x1b,
0xac, 0xca, 0x23, 0xbe, 0x86, 0x52, 0x2d, 0x89, 0xa3, 0xce, 0xa3, 0x0d, 0x53, 0x08, 0x70, 0x19,
0x4c, 0x5b, 0x9f, 0x3e, 0x26, 0x85, 0x4f, 0xd5, 0xc5, 0x60, 0xed, 0x8c, 0x12, 0x78, 0x72, 0x7d,
0xe1, 0x9e, 0xcb, 0xcc, 0x98, 0xe7, 0x06, 0x81, 0xf7, 0xf5, 0x02, 0x30, 0x01, 0x77, 0xbe, 0xc5,
0x6c, 0x75, 0x92, 0xdc, 0xae, 0xa9, 0xde, 0x7d, 0xc8, 0x4e, 0x3a, 0x5b, 0xfe, 0x84, 0x51, 0x8a,
0xad, 0xee, 0x91, 0x24, 0x41, 0xf3, 0x6a, 0x21, 0xea, 0x72, 0xd0, 0x2a, 0xd6, 0x46, 0xb5, 0x62,
0x7a, 0x57, 0xfa, 0x2a, 0x93, 0x6f, 0x35, 0x4a, 0x83, 0xde, 0x8c, 0x72, 0x0b, 0xfb, 0x77, 0x50,
0x07, 0x56, 0x52, 0x16, 0x28, 0x15, 0x24, 0x1d, 0xe1, 0xec, 0xa2, 0xb8, 0x2b, 0x26, 0x69, 0x5a,
0x5b, 0xe5, 0x46, 0x81, 0xa3, 0x52, 0x72, 0x6c, 0x05, 0xf9, 0x21, 0x19, 0x2e, 0x26, 0x17, 0xc1,
0x52, 0xba, 0x1b, 0x3e, 0xa9, 0x88, 0x6d, 0x21, 0xbd, 0xd9, 0xfa, 0x1a, 0xf5, 0xca, 0x71, 0x6d,
0xb2, 0x53, 0x33, 0x75, 0x49, 0x49, 0x75, 0x52, 0xfa, 0x8a, 0x88, 0xd9, 0x0b, 0x3a, 0xa2, 0x9c,
0xc8, 0x83, 0xbd, 0x6b, 0x70, 0xc3, 0xb4, 0x84, 0xd6, 0x1c, 0xb1, 0x3a, 0x48, 0xa1, 0x98, 0xd6,
0x6f, 0xde, 0x54, 0x4d, 0x22, 0x20, 0x85, 0x30, 0x23, 0x42, 0x8a, 0x47, 0x2b, 0x39, 0x50, 0xa7,
0xe2, 0x45, 0x4a, 0x96, 0x42, 0x45, 0xe9, 0x41, 0xd3, 0xaf, 0xd1, 0x79, 0x61, 0xe7, 0x71, 0x5a,
0x8f, 0xcb, 0x57, 0x3d, 0xaf, 0x5a, 0xab, 0xad, 0x00, 0xc0, 0x4f, 0x20, 0x63, 0x76, 0x2b, 0x04,
0x2c, 0xbd, 0xdb, 0xf7, 0x0e, 0x24, 0x72, 0x05, 0x80, 0x0c, 0xc3, 0xf6, 0x83, 0x74, 0x43, 0x28,
0xd3, 0x6f, 0xb0, 0x99, 0xde, 0x9a, 0x55, 0xf1, 0x60, 0x11, 0x30, 0x34, 0xf2, 0xf0, 0x7d, 0x6b,
0x17, 0xbd, 0xbf, 0xca, 0x8c, 0x90, 0x0d, 0x8f, 0xf4, 0x65, 0x42, 0x83, 0x6f, 0xec, 0xe8, 0x14,
0xf2, 0x3d, 0xe9, 0xc0, 0xeb, 0x1f, 0xf4, 0xd7, 0xb2, 0xac, 0x19, 0x40, 0x4a, 0xee, 0xe4, 0xcc,
0xd7, 0x30, 0x47, 0x97, 0x15, 0xeb, 0x68, 0xeb, 0xa2, 0x90, 0xf1, 0x4d, 0x4e, 0x59, 0xbf, 0xff,
0xef, 0x6b, 0x32, 0xcf, 0xdc, 0xcd, 0xb1, 0x88, 0x7e, 0x5a, 0xc5, 0x27, 0x5e, 0xde, 0xe5, 0x10,
0xd8, 0xf1, 0x5c, 0x40, 0x19, 0xf8, 0xd8, 0x1b, 0x50, 0x67, 0xee, 0xf8, 0x6d, 0x7e, 0x0e, 0x5a,
0x22, 0xa5, 0xd9, 0xc3, 0xf9, 0xf0, 0x2a, 0x3f, 0x12, 0x7b, 0x79, 0x07, 0x34, 0x22, 0x2b, 0x35,
0xc6, 0xb5, 0x85, 0x00, 0xd9, 0xe7, 0x1c, 0x52, 0xaf, 0x72, 0xcc, 0x85, 0x7e, 0x81, 0xd6, 0x74,
0xac, 0xb5, 0xa2, 0x0f, 0x88, 0x99, 0x37, 0xb1, 0x1f, 0xcd, 0x1a, 0xfe, 0xf3, 0x57, 0x19, 0x95,
0x93, 0xd4, 0xdc, 0x1e, 0xd3, 0xbd, 0x33, 0x0a, 0x98, 0x84, 0xdc, 0x2e, 0xc6, 0x32, 0x89, 0xaa,
0x46, 0xbc, 0x78, 0xc3, 0xec, 0xc8, 0xbc, 0xe6, 0xb2, 0x33, 0x07, 0x3f, 0x19, 0x83, 0x8d, 0x53,
0x3d, 0xae, 0xcc, 0x39, 0x6e, 0x4d, 0xed, 0xea, 0xad, 0x64, 0xfe, 0x2d, 0xf5, 0xb1, 0x8e, 0xc9,
0xe5, 0xd6, 0xff, 0xb9, 0x86, 0xc2, 0xec, 0x99, 0x5e, 0x39, 0x6c, 0xe4, 0xea, 0xea, 0x86, 0x7d,
0x1a, 0x37, 0xa0, 0xe3, 0x7b, 0x05, 0xd6, 0x2d, 0xa3, 0xe3, 0x3f, 0x18, 0x86, 0xfe, 0x49, 0x44,
0x07, 0xc2, 0x81, 0xa5, 0x76, 0x65, 0x6d, 0x9e, 0x87, 0x74, 0x75, 0xcd, 0xde, 0x83, 0x72, 0x4a,
0x74, 0x13, 0x9a, 0x1a, 0x0d, 0x7f, 0x46, 0xc2, 0xbf, 0xe5, 0x0b, 0xdf, 0x54, 0xee, 0xfc, 0x37,
0x8f, 0xc5, 0x98, 0x9b, 0xf3, 0xcf, 0xb8, 0xa5, 0x0c, 0x76, 0x7e, 0x9f, 0x38, 0x73, 0x19, 0xc6,
0x3a, 0xe3, 0xa1, 0x9b, 0xaa, 0x1f, 0x9b, 0x2e, 0xcd, 0xcd, 0x1c, 0x52, 0x0c, 0xf8, 0x98, 0x12,
0xf5, 0xaf, 0xb7, 0xb9, 0xe1, 0xf8, 0xc4, 0x43, 0x0d, 0x30, 0xef, 0x2a, 0xd9, 0xab, 0x44, 0xec,
0x90, 0x40, 0xe0, 0x04, 0xc3, 0x4a, 0x98, 0xaa, 0x53, 0x65, 0xaa, 0x2c, 0x47, 0xfe, 0xf4, 0xd6,
0x1a, 0xe4, 0x46, 0x03, 0x15, 0x69, 0x5d, 0xb1, 0xd9, 0xb5, 0xc2, 0x09, 0xed, 0xb3, 0xbb, 0x2a,
0x19, 0xc0, 0xd3, 0x93, 0x6d, 0x92, 0x6d, 0xe4, 0x9e, 0xb3, 0x88, 0x71, 0xab, 0x49, 0x16, 0x88,
0x76, 0xdf, 0x13, 0xe1, 0x22, 0x97, 0xa0, 0xba, 0x47, 0x35, 0x94, 0x5c, 0xdf, 0xbd, 0x8e, 0x7f,
0x92, 0x13, 0x53, 0x8f, 0x27, 0x9f, 0x1e, 0x73, 0x96, 0x2c, 0x1d, 0x93, 0xcf, 0x09, 0x3c, 0x64,
0x1a, 0x5e, 0x89, 0x2f, 0xea, 0x0b, 0xee, 0x34, 0x98, 0x17, 0x95, 0x43, 0x1e, 0xc5, 0x88, 0x74,
0xca, 0x33, 0x24, 0x68, 0x2e, 0x29, 0x4c, 0x59, 0x19, 0xae, 0x54, 0x2c, 0x9a, 0x24, 0xc5, 0x51,
0x76, 0x53, 0xda, 0x87, 0x3a, 0x6c, 0x80, 0x8f, 0x6e, 0x2e, 0xe1, 0x7b, 0xf9, 0x7f, 0xb0, 0x96,
0xaf, 0x30, 0x27, 0xba, 0x73, 0xff, 0x3b, 0xbe, 0x73, 0xb6, 0x66, 0x6b, 0xcb, 0xf5, 0xfb, 0x34,
0x3d, 0xed, 0xcc, 0xa6, 0x08, 0xd7, 0x54, 0x25, 0x30, 0x24, 0xfc, 0x1c, 0xbf, 0x74, 0x5b, 0xe3,
0x0b, 0x9e, 0x19, 0x26, 0x08, 0x37, 0xe7, 0xdf, 0xc0, 0x18, 0x73, 0x51, 0x24, 0xe3, 0x21, 0xb4,
0x93, 0xae, 0x35, 0x6e, 0xa6, 0x82, 0xed, 0x8b, 0x3e, 0x54, 0x3f, 0x8e, 0xa7, 0x8e, 0xfa, 0x6f,
0xcc, 0x67, 0x0a, 0x6f, 0x08, 0xb7, 0x69, 0x0e, 0xf6, 0x40, 0x35, 0x85, 0x63, 0xdc, 0xa8, 0x43,
0x7c, 0x81, 0x24, 0xb5, 0x4e, 0xc5, 0xc8, 0x18, 0xc4, 0x0f, 0xd0, 0xe9, 0x00, 0x1e, 0xf5, 0x79,
0xc8, 0xce, 0xe7, 0xde, 0xd9, 0x0a, 0x0e, 0xb5, 0x7f, 0x0b, 0xe6, 0xa7, 0x7a, 0x8b, 0xf4, 0x60,
0x13, 0x1b, 0xa7, 0x00, 0x29, 0x91, 0x88, 0xd6, 0x85, 0x0e, 0x0b, 0x6b, 0xfe, 0x61, 0xac, 0x50,
0x88, 0xcc, 0x42, 0x5f, 0xe4, 0xb4, 0x9d, 0xe0, 0x58, 0xf7, 0xb7, 0x71, 0xe9, 0x7f, 0x10, 0x85,
0x1f, 0x3e, 0xf4, 0xd7, 0x3f, 0x18, 0x36, 0x8f, 0x20, 0x6d, 0x66, 0xc4, 0x6c, 0xf1, 0x4d, 0x53,
0x50, 0x9e, 0xeb, 0x2b, 0x0e, 0x0f, 0x79, 0x17, 0xe0, 0x42, 0x47, 0x21, 0x72, 0x9a, 0x62, 0x4f,
0x49, 0x79, 0xf9, 0x9a, 0xd0, 0x6a, 0x6e, 0xbc, 0x5b, 0xff, 0xf8, 0x8d, 0xf8, 0x67, 0x31, 0x39,
0x5e, 0xe8, 0xff, 0xdf, 0xa2, 0xf6, 0xf8, 0x90, 0x45, 0x04, 0xff, 0xca, 0xc2, 0xca, 0x83, 0x3d,
0xb9, 0x5a, 0xbe, 0xd6, 0x1d, 0x36, 0xa6, 0x11, 0xa0, 0xf2, 0xd8, 0xe9, 0x11, 0xfa, 0x31, 0xe9,
0xb3, 0xd7, 0xc3, 0xb9, 0x3e, 0x81, 0x02, 0x98, 0xe6, 0x74, 0xe1, 0x27, 0x5c, 0x34, 0x78, 0x9c,
0xbb, 0x4d, 0xb0, 0xad, 0x81, 0x45, 0x3f, 0x79, 0x80, 0x69, 0x00, 0xc7, 0xa6, 0xcf, 0x4d, 0x2b,
0xc3, 0xb3, 0x76, 0xc3, 0xb3, 0xa8, 0x5b, 0x87, 0xa9, 0x6d, 0x0f, 0x39, 0x11, 0x32, 0xe6, 0x7b,
0xea, 0xf0, 0xef, 0xc2, 0xef, 0xe6, 0x79, 0x7c, 0x8c, 0x96, 0x67, 0xb0, 0xb8, 0xa9, 0xe3, 0x66,
0x74, 0x7a, 0xb4, 0x33, 0x05, 0x6e, 0x68, 0xce, 0xb4, 0x42, 0x3b, 0x12, 0xc0, 0xe9, 0x54, 0x7d,
0xd7, 0x99, 0x3b, 0xb4, 0x57, 0x94, 0xb3, 0xe3, 0xfe, 0x3e, 0xa8, 0x26, 0x3a, 0xf9, 0x67, 0xa3,
0x19, 0x49, 0x67, 0x55, 0xb6, 0xdc, 0xba, 0xba, 0x88, 0x9f, 0xf3, 0xa8, 0xa6, 0x3c, 0x19, 0xde,
0x97, 0x60, 0x7f, 0xb0, 0xa4, 0x90, 0x7f, 0x05, 0xe6, 0xc1, 0xb8, 0x75, 0x1d, 0x17, 0x0d, 0x5e,
0x47, 0x9e, 0x22, 0xee, 0x9a, 0xca, 0x00, 0x2e, 0x3a, 0xfe, 0x56, 0x41, 0x29, 0xe2, 0x0a, 0x35,
0xc6, 0xde, 0x77, 0x25, 0xd4, 0x56, 0x5e, 0x35, 0x4c, 0x00, 0xc0, 0xdd, 0x46, 0xa7, 0x8d, 0x3b,
0xf6, 0x4b, 0xee, 0x37, 0x66, 0xab, 0x1e, 0x97, 0x13, 0x30, 0x78, 0x16, 0xdc, 0xa4, 0x44, 0x73,
0xcf, 0x08, 0xa4, 0x1d, 0xb6, 0x14, 0xdf, 0xe2, 0x4a, 0x1f, 0x85, 0x82, 0x9e, 0xc3, 0xb3, 0x2d,
0x8a, 0xc2, 0x99, 0x36, 0x29, 0x96, 0xd8, 0x96, 0x3d, 0x06, 0x21, 0x32, 0x19, 0xdc, 0xc7, 0x70,
0x57, 0xec, 0xce, 0xb8, 0xb8, 0x72, 0x38, 0x90, 0x04, 0x62, 0xfa, 0xa1, 0x6d, 0x24, 0x13, 0x8c,
0x24, 0xe9, 0xf0, 0x00, 0xe4, 0x0e, 0x6c, 0x29, 0x86, 0xd0, 0x0d, 0x4c, 0x9e, 0x2d, 0xaa, 0x5f,
0x88, 0x22, 0x89, 0x21, 0xd4, 0x00, 0x55, 0xc3, 0x4b, 0x12, 0xa4, 0xc0, 0xa9, 0x5e, 0x12, 0xf4,
0x26, 0x1d, 0xac, 0x02, 0x4a, 0x80, 0x57, 0xcf, 0xa0, 0x0c, 0xc7, 0x51, 0x3f, 0x7a, 0x6f, 0x7f,
0x8e, 0xec, 0x56, 0x38, 0xf5, 0x61, 0xff, 0x4e, 0xf2, 0x4d, 0x7f, 0xf8, 0xe8, 0xcc, 0xac, 0xd8,
0x33, 0xfd, 0x64, 0x1d, 0x7d, 0xe4, 0x2c, 0xee, 0x3d, 0x88, 0xe9, 0x2d, 0xde, 0xd6, 0xdb, 0x82,
0xc9, 0x47, 0xb2, 0x0d, 0x0e, 0x99, 0xdd, 0x91, 0xa4, 0xf4, 0x64, 0xa3, 0xe8, 0x49, 0x20, 0xa4,
0xe7, 0x9b, 0x2f, 0x4b, 0xc5, 0x36, 0x8c, 0x13, 0x1a, 0xd2, 0xd1, 0xd3, 0x6a, 0x44, 0x8d, 0xd1,
0xc3, 0x5e, 0x3a, 0x76, 0x3a, 0x9e, 0xa7, 0x7c, 0xe1, 0xae, 0x50, 0x1e, 0x5c, 0x3a, 0x3f, 0xf6,
0x54, 0xd7, 0xb7, 0xf3, 0x57, 0x20, 0x03, 0xae, 0xb1, 0xeb, 0x3b, 0x9c, 0x76, 0x15, 0xdd, 0x1f,
0xce, 0xab, 0x65, 0x20, 0x52, 0x78, 0xc4, 0x3a, 0x93, 0x7f, 0xe4, 0x5d, 0x8a, 0xe4, 0x4d, 0xe6,
0x7b, 0xfd, 0x69, 0xf4, 0x06, 0xb5, 0x5e, 0xb9, 0x2f, 0x1b, 0x22, 0xbd, 0xaf, 0x71, 0xbe, 0x9c,
0x40, 0xb1, 0xce, 0x2e, 0x49, 0x0e, 0xe7, 0xa3, 0xd0, 0xef, 0xe2, 0xeb, 0x8d, 0xb0, 0x94, 0x5c,
0x4d, 0x9f, 0x98, 0x79, 0x59, 0x4c, 0xf1, 0x5b, 0x2d, 0x2a, 0xd0, 0xe6, 0x08, 0x23, 0x79, 0x77,
0xa3, 0xb8, 0x10, 0x9a, 0xf5, 0x99, 0x5a, 0x4d, 0x04, 0xa7, 0x82, 0xe7, 0x4a, 0xca, 0xa5, 0x12,
0xc6, 0xf4, 0x12, 0x47, 0x58, 0xfa, 0xcb, 0x7f, 0xe8, 0x2b, 0x4f, 0x11, 0xed, 0x4e, 0x1d, 0x00,
0x9d, 0x4f, 0xd7, 0x2c, 0x10, 0x4c, 0x1f, 0x8a, 0xf4, 0x3b, 0xc6, 0xee, 0x8e, 0x72, 0xbe, 0xdb,
0xdd, 0x80, 0x60, 0x66, 0x40, 0x46, 0x56, 0xff, 0x66, 0x57, 0xf6, 0xa8, 0x96, 0x14, 0x1e, 0x8e,
0x3c, 0x64, 0xd2, 0x94, 0x62, 0xf7, 0xd9, 0xa5, 0xa8, 0x54, 0x7f, 0x8e, 0x70, 0xee, 0xcd, 0x87,
0x9a, 0xb3, 0xce, 0x3a, 0x83, 0x85, 0x3f, 0x68, 0x6f, 0x30, 0x57, 0x79, 0x6a, 0x65, 0xdd, 0xc9,
0x52, 0x8e, 0x77, 0x4e, 0x8d, 0xa5, 0xa5, 0x8e, 0x5b, 0x95, 0xca, 0xb5, 0x1d, 0x16, 0x30, 0xc1,
0x10, 0x76, 0x80, 0x0c, 0x10, 0x2e, 0x3a, 0x9a, 0xed, 0xdb, 0xc6, 0x39, 0x3f, 0xcb, 0xf4, 0x53,
0x36, 0xe3, 0x80, 0xb2, 0xc2, 0x43, 0xb2, 0x65, 0x4a, 0xbe, 0x2c, 0x60, 0xf1, 0x49, 0x82, 0x17,
0x4d, 0xc4, 0x51, 0xe0, 0xd2, 0xcc, 0xa2, 0xc2, 0x87, 0x5f, 0x28, 0xde, 0x5d, 0xd3, 0x30, 0x15,
0xd3, 0x00, 0x83, 0xe4, 0xe7, 0x57, 0x33, 0x9e, 0xe4, 0xe8, 0xa8, 0xbe, 0xea, 0x16, 0x70, 0x6e,
0x0f, 0xa4, 0x05, 0x05, 0x79, 0x4c, 0xb6, 0xad, 0xd9, 0x9d, 0x4c, 0x47, 0xd3, 0xfd, 0x47, 0x4c,
0x6d, 0xc6, 0xb7, 0xc1, 0x2b, 0xe0, 0x76, 0x35, 0xf8, 0x85, 0x20, 0xa3, 0x96, 0xd6, 0x8c, 0x1e,
0xd4, 0x6c, 0xf5, 0x8d, 0x12, 0xc5, 0xcb, 0xd7, 0x1e, 0x8f, 0xd6, 0x11, 0xb1, 0x81, 0x4c, 0x9b,
0x65, 0x70, 0xf8, 0x62, 0x37, 0x6e, 0x10, 0x80, 0x1b, 0x09, 0xf2, 0xa9, 0x6f, 0x9f, 0xe2, 0xfb,
0x30, 0x70, 0x45, 0x73, 0x55, 0x2b, 0x6d, 0xaf, 0x5f, 0xe2, 0x25, 0x95, 0x6e, 0xeb, 0xf6, 0x67,
0x0d, 0xfe, 0xc5, 0x98, 0x88, 0x17, 0x74, 0x88, 0x3f, 0xb7, 0x1f, 0x10, 0x79, 0xca, 0xa7, 0x61,
0x0a, 0xb3, 0x16, 0xb4, 0x90, 0x45, 0x28, 0x2b, 0xcb, 0x95, 0xd6, 0x74, 0xcb, 0x97, 0xf7, 0x55,
0xdb, 0x08, 0xad, 0xfb, 0x3d, 0xd4, 0x8c, 0x75, 0x9c, 0x1f, 0x3b, 0x84, 0x66, 0x45, 0xf6, 0xe5,
0x98, 0xd4, 0x0d, 0x78, 0x1c, 0xf9, 0x0f, 0x9f, 0x6b, 0x4b, 0x68, 0xc6, 0xe4, 0xea, 0xfb, 0x04,
0xca, 0x12, 0x10, 0xc3, 0xe3, 0x2c, 0x9b, 0xdb, 0xbc, 0x5c, 0xc0, 0x0e, 0x5c, 0xb7, 0x3f, 0x6f,
0x7a, 0x89, 0x89, 0xb9, 0xf7, 0x71, 0x73, 0xcf, 0x9c, 0x48, 0xe5, 0x63, 0xd2, 0x5c, 0x08, 0xe6,
0x42, 0x19, 0x02, 0xbb, 0xf6, 0xed, 0xa1, 0x78, 0xeb, 0xa0, 0x38, 0xa5, 0x8b, 0x63, 0x14, 0xb9,
0x92, 0x8e, 0x05, 0xb4, 0x15, 0x27, 0x40, 0x65, 0xa2, 0x94, 0xe7, 0x97, 0xd6, 0x9a, 0xe0, 0x30,
0xcc, 0xaf, 0x35, 0x27, 0xe5, 0xbe, 0x9e, 0x77, 0x93, 0x15, 0x2e, 0x34, 0x17, 0x95, 0x24, 0x19,
0x1d, 0x8f, 0xb0, 0x34, 0xf6, 0x58, 0x94, 0xc8, 0x62, 0xaf, 0xb9, 0xf5, 0x27, 0x73, 0x55, 0x58,
0x89, 0x30, 0xd0, 0x6f, 0x5e, 0x1e, 0xcd, 0xd1, 0x61, 0x24, 0x4c, 0x56, 0x20, 0xc7, 0x92, 0x7e,
0x55, 0x87, 0xfe, 0x78, 0x59, 0xa3, 0xc9, 0xf5, 0x53, 0xa6, 0x0c, 0x61, 0xdb, 0xdb, 0xb5, 0x07,
0x00, 0xe9, 0x4f, 0xac, 0x29, 0x96, 0x88, 0xc8, 0x25, 0x69, 0x87, 0x38, 0xfc, 0x90, 0x57, 0xa0,
0x34, 0x27, 0x49, 0x1a, 0xb3, 0xcf, 0x23, 0x06, 0x0d, 0x1d, 0x9e, 0x65, 0x18, 0x48, 0xcf, 0x33,
0x46, 0x67, 0x3b, 0xa6, 0x4e, 0x25, 0x20, 0x13, 0xa5, 0xe9, 0x1f, 0xa1, 0xf2, 0x08, 0x44, 0x6d,
0x65, 0x12, 0x0e, 0x98, 0x58, 0x6e, 0x07, 0xa3, 0xf6, 0xc6, 0xb7, 0x0b, 0xc1, 0x0c, 0x4f, 0xdc,
0x8a, 0xab, 0xa1, 0x69, 0xeb, 0x6e, 0x46, 0x7d, 0x2c, 0xc1, 0x2c, 0x3d, 0x5f, 0xe1, 0x6b, 0x27,
0x30, 0xd1, 0x2d, 0xa8, 0xb3, 0x0d, 0xd1, 0x68, 0xf3, 0xf9, 0x17, 0x4e, 0x1d, 0xc9, 0x40, 0x89,
0x03, 0xf9, 0xb8, 0xd7, 0xdf, 0xa0, 0x2c, 0xb5, 0xf5, 0xdd, 0xb0, 0x14, 0xf0, 0xe4, 0x60, 0x4c,
0x49, 0x20, 0x05, 0x72, 0x61, 0xa4, 0xd3, 0x8b, 0x62, 0xb9, 0xc0, 0xb3, 0x65, 0xc6, 0xb0, 0x67,
0xd1, 0x0e, 0x6b, 0x71, 0xbc, 0xca, 0xe6, 0x52, 0x84, 0x80, 0x2f, 0x3a, 0x40, 0x2a, 0x0e, 0x41,
0x06, 0xba, 0xb6, 0xa2, 0xf1, 0xd3, 0x90, 0x8c, 0xa8, 0x7e, 0x80, 0x01, 0x15, 0x09, 0x49, 0xe8,
0x6c, 0x18, 0xd7, 0x16, 0x9d, 0x0e, 0x2f, 0x96, 0xe4, 0x6e, 0xca, 0x56, 0x05, 0x9d, 0xfa, 0x54,
0x3f, 0x12, 0x19, 0x99, 0xb7, 0x34, 0x56, 0x1c, 0x48, 0x13, 0xe6, 0x89, 0x3b, 0xcf, 0x18, 0x0a,
0x0e, 0xd9, 0x7d, 0xcf, 0x51, 0xc2, 0x54, 0x17, 0x0d, 0x99, 0x1a, 0x8d, 0xa7, 0x92, 0xa2, 0x5e,
0x2b, 0xb4, 0x0f, 0x6e, 0x58, 0x19, 0x35, 0x0c, 0xd5, 0xf1, 0x9b, 0xa4, 0x66, 0x34, 0xb8, 0xc7,
0xe7, 0x34, 0xb6, 0x63, 0x1a, 0x90, 0xf0, 0xbf, 0x7b, 0xe8, 0xac, 0x65, 0x8a, 0x6a, 0xb7, 0x41,
0x19, 0xc2, 0x4c, 0xcc, 0x80, 0x8a, 0x2a, 0xe0, 0x90, 0x87, 0x22, 0xbc, 0x71, 0xa5, 0x14, 0x95,
0xb2, 0x32, 0x69, 0x80, 0x14, 0xd9, 0xcc, 0x86, 0x65, 0x8b, 0x7d, 0x01, 0xb5, 0xf2, 0xd3, 0xdb,
0xc4, 0x02, 0x71, 0x9a, 0x75, 0x0c, 0x67, 0x37, 0xd0, 0xab, 0x4d, 0x38, 0x89, 0x0f, 0x36, 0x12,
0x36, 0xc1, 0x7d, 0x8d, 0x42, 0xa9, 0x93, 0x92, 0x20, 0x63, 0xa1, 0x9c, 0x59, 0xa1, 0x99, 0xc9,
0x23, 0x10, 0xd4, 0x72, 0x74, 0x3f, 0x23, 0x17, 0x92, 0x12, 0x46, 0xa0, 0x09, 0xd6, 0xb8, 0xb3,
0x38, 0x56, 0x58, 0x3d, 0x98, 0xbc, 0xf0, 0x28, 0xfe, 0xd0, 0xc9, 0x06, 0xe0, 0x54, 0xa0, 0xfd,
0x83, 0xd3, 0x72, 0x4d, 0x53, 0x5f, 0x1f, 0xc7, 0xc0, 0x6e, 0x03, 0xc5, 0x04, 0xaa, 0x1d, 0x52,
0x54, 0xea, 0x9d, 0x10, 0x06, 0x58, 0xba, 0x42, 0x77, 0x1a, 0xa4, 0x17, 0x17, 0xa7, 0x66, 0x6c,
0x11, 0xb7, 0xcf, 0xcc, 0x21, 0xdb, 0x52, 0xb5, 0x98, 0xf9, 0x75, 0x46, 0x21, 0x37, 0x21, 0x07,
0xf0, 0x6f, 0x43, 0x5d, 0x01, 0xf6, 0x24, 0xb2, 0x58, 0xf9, 0xd9, 0x87, 0xa8, 0xe3, 0xc4, 0x69,
0x9f, 0xc1, 0xc8, 0xea, 0xef, 0xbb, 0xb2, 0xc6, 0xbf, 0xa5, 0x2c, 0x24, 0xf2, 0xe7, 0xfa, 0x61,
0xa8, 0x89, 0x4a, 0x59, 0x8c, 0x6e, 0xca, 0x12, 0x49, 0x78, 0xb5, 0x66, 0x13, 0x1c, 0xb2, 0x3a,
0x1e, 0xa2, 0x9d, 0x5a, 0x87, 0x71, 0x56, 0x72, 0x69, 0x54, 0xb4, 0xe0, 0x25, 0xe9, 0xcd, 0xc6,
0x61, 0x5b, 0xaf, 0x34, 0xaf, 0x61, 0x92, 0xc5, 0xee, 0x9f, 0x23, 0xfc, 0x48, 0xc8, 0xca, 0x9c,
0xbf, 0x66, 0x29, 0x0e, 0x52, 0xc9, 0x35, 0x03, 0x92, 0x5b, 0x8d, 0xf6, 0x71, 0x8f, 0xc9, 0x82,
0x0c, 0x84, 0x48, 0x0b, 0xf1, 0x50, 0xcd, 0x06, 0x79, 0xc0, 0x04, 0x2b, 0x52, 0xad, 0x5d, 0xd9,
0x7d, 0x3c, 0xbf, 0x59, 0xcc, 0xce, 0x7f, 0xfc, 0x16, 0x8b, 0xfd, 0x49, 0xde, 0x2f, 0x00, 0x03,
0x4f, 0x9c, 0x2d, 0x16, 0xf6, 0xc4, 0x38, 0xe6, 0xc1, 0xd1, 0x56, 0x18, 0x6f, 0xf1, 0x59, 0x50,
0xa1, 0xb8, 0x29, 0xab, 0xcb, 0xb6, 0xc3, 0x39, 0xf4, 0x43, 0xcd, 0x23, 0xe6, 0xd0, 0xbe, 0x60,
0xe8, 0x18, 0xfa, 0x05, 0x71, 0xc1, 0xcf, 0xc2, 0x2d, 0x11, 0xf6, 0x04, 0x23, 0xf5, 0x4f, 0x88,
0x4e, 0x49, 0x39, 0xd7, 0xb7, 0x42, 0xa0, 0xaf, 0x3a, 0x14, 0x53, 0x1d, 0x93, 0x41, 0xe4, 0xe8,
0x8c, 0x98, 0xf8, 0x00, 0xee, 0x5d, 0x05, 0xc9, 0xff, 0x29, 0xda, 0xae, 0x16, 0x5d, 0xb0, 0xaa,
0x48, 0xe4, 0xad, 0x79, 0x25, 0xe2, 0x5e, 0xe0, 0xac, 0xf0, 0x3b, 0xf0, 0x93, 0x93, 0xc5, 0xcc,
0xbb, 0xd6, 0x23, 0x43, 0x65, 0x6b, 0xed, 0xb3, 0xa6, 0x8d, 0x78, 0x26, 0xb0, 0x1b, 0xf9, 0xde,
0xee, 0xbe, 0xb3, 0x2e, 0x32, 0x05, 0x88, 0x53, 0x92, 0x3f, 0x23, 0x50, 0x95, 0xcb, 0xf5, 0xfe,
0x90, 0x99, 0x18, 0x5e, 0xf9, 0x60, 0x1b, 0x1e, 0x59, 0xe9, 0x6c, 0xbe, 0x81, 0x2a, 0x8e, 0xe8,
0x18, 0xa5, 0xae, 0x11, 0x35, 0xde, 0x86, 0x3f, 0x52, 0x41, 0xfb, 0xcc, 0xd6, 0x27, 0x7c, 0xe0,
0x26, 0x14, 0x87, 0xac, 0x59, 0x25, 0xc8, 0xa6, 0xd3, 0x03, 0x66, 0x6a, 0x04, 0x56, 0x65, 0x38,
0x5b, 0x31, 0x77, 0xe4, 0xf4, 0x94, 0x5b, 0xac, 0x6f, 0xe4, 0xba, 0x1e, 0x3b, 0xfa, 0x40, 0x7b,
0x96, 0x4b, 0x8d, 0x02, 0xf5, 0xdd, 0x12, 0x2e, 0x18, 0x06, 0xeb, 0xd8, 0xc5, 0xf9, 0x2a, 0x26,
0x0b, 0x63, 0x52, 0x48, 0xd6, 0xfb, 0xd9, 0x93, 0xc0, 0x3a, 0xe9, 0x2f, 0x75, 0xc1, 0x6a, 0x14,
0xce, 0x24, 0x0b, 0x17, 0x42, 0xea, 0x5d, 0x0c, 0x25, 0xef, 0x16, 0x29, 0xab, 0x0c, 0x6b, 0xb5,
0x9b, 0xa8, 0x49, 0xcd, 0x7a, 0x0c, 0x15, 0x28, 0x4a, 0x78, 0x00, 0xae, 0x3b, 0x61, 0xb1, 0x3b,
0xec, 0xbe, 0xd1, 0x33, 0x7d, 0x37, 0x98, 0x7e, 0x36, 0xeb, 0xd9, 0xb7, 0x5a, 0x8e, 0x64, 0x75,
0x4a, 0x81, 0x09, 0xb5, 0xef, 0xce, 0x08, 0x30, 0x62, 0x44, 0xaa, 0x62, 0xcf, 0x7d, 0x0f, 0xf7,
0x3b, 0x73, 0xf2, 0xea, 0xa3, 0x63, 0xd6, 0xcf, 0xb9, 0x93, 0xbe, 0x11, 0x96, 0xec, 0xb4, 0x3e,
0xdf, 0x51, 0xe7, 0x02, 0xe7, 0x57, 0x5f, 0xc3, 0x94, 0x0a, 0x36, 0xc2, 0x07, 0x52, 0x23, 0xa7,
0xea, 0x6c, 0x06, 0x46, 0x6f, 0x8d, 0x68, 0x9d, 0x6a, 0x8f, 0x9b, 0x23, 0x09, 0xd8, 0x93, 0x07,
0x3a, 0xd6, 0xad, 0x0b, 0xb4, 0x40, 0x44, 0xb1, 0xbc, 0x7d, 0x0c, 0x09, 0x3b, 0x04, 0x9c, 0x07,
0x77, 0x2e, 0x39, 0xd9, 0xe4, 0x71, 0x77, 0x33, 0x88, 0x71, 0x57, 0x46, 0x03, 0x32, 0x24, 0x1e,
0x80, 0x7e, 0x07, 0xb0, 0xa8, 0x48, 0x71, 0x5a, 0xe8, 0xeb, 0x08, 0x5e, 0xb9, 0x61, 0x16, 0xd1,
0xe5, 0xe3, 0xe9, 0x8b, 0x70, 0x32, 0x1a, 0xf0, 0x69, 0xc5, 0x2d, 0x34, 0xf5, 0xe8, 0xf9, 0x91,
0x98, 0xd1, 0x8c, 0x0a, 0x7e, 0x0e, 0x70, 0x2f, 0xe4, 0xa1, 0x24, 0x19, 0x56, 0xb0, 0x9a, 0xb6,
0xb9, 0xe5, 0x04, 0x0b, 0xa2, 0xa9, 0xf0, 0xd9, 0xc5, 0xfe, 0x87, 0xea, 0xe9, 0x88, 0x91, 0x3c,
0x5e, 0x08, 0x55, 0x4d, 0x32, 0xfe, 0xeb, 0x3e, 0x60, 0x14, 0x8b, 0x1f, 0xb1, 0xea, 0x67, 0xb2,
0xff, 0x55, 0x28, 0x5e, 0x92, 0x8e, 0xfe, 0x90, 0x39, 0x19, 0x7f, 0xe9, 0x78, 0x3e, 0xb0, 0xec,
0x13, 0xd2, 0x8a, 0xa7, 0x4f, 0xcf, 0x9e, 0x55, 0x49, 0xb4, 0x8a, 0xb7, 0x09, 0x89, 0x27, 0xdf,
0x50, 0xa6, 0xcb, 0x1b, 0xad, 0x0d, 0xed, 0xf8, 0x23, 0x6c, 0xb0, 0x99, 0xc1, 0x74, 0x68, 0x55,
0xb1, 0x80, 0xbe, 0x40, 0x15, 0x4a, 0xca, 0x88, 0xb4, 0xe9, 0x66, 0xcb, 0x89, 0xca, 0x28, 0x13,
0xe5, 0x7d, 0xcb, 0x0f, 0xb7, 0xd3, 0x6f, 0x4f, 0xba, 0xb5, 0xad, 0x82, 0xa9, 0x85, 0x22, 0xdf,
0xdd, 0xd9, 0xe5, 0x0b, 0x9f, 0x63, 0x35, 0xc9, 0x7b, 0x7d, 0x36, 0xcf, 0x8f, 0x08, 0x2d, 0x4e,
0xfd, 0xf8, 0x87, 0xcf, 0x09, 0xdf, 0xa4, 0x2a, 0x49, 0x26, 0xbb, 0xb1, 0xb5, 0x8d, 0x03, 0x3c,
0x6a, 0xd3, 0x43, 0x73, 0x04, 0x5e, 0x0e, 0x2c, 0x9e, 0xa8, 0x3a, 0x53, 0x71, 0x27, 0xc3, 0xc7,
0xb2, 0xc9, 0x9b, 0x53, 0x18, 0x76, 0x23, 0xaa, 0x5b, 0x42, 0x9c, 0x6c, 0xe4, 0x74, 0x99, 0xad,
0xec, 0xde, 0xb5, 0x36, 0xeb, 0xe3, 0xd8, 0x84, 0xd4, 0x10, 0x9b, 0xc0, 0x6d, 0xe2, 0xf5, 0x4c,
0x22, 0x12, 0x58, 0xc1, 0x5d, 0x65, 0x8e, 0xa5, 0xdd, 0x02, 0x03, 0x9d, 0x44, 0xaf, 0x44, 0xca,
0x65, 0x41, 0xe6, 0xf4, 0xeb, 0x72, 0x42, 0xed, 0x19, 0x73, 0xdd, 0xb5, 0xcb, 0x0d, 0x08, 0xaa,
0x78, 0xdb, 0x6a, 0xc1, 0x4d, 0x7e, 0xfd, 0x2b, 0x20, 0xdb, 0x29, 0x8a, 0xd9, 0xbc, 0x1c, 0xd6,
0xc8, 0xb3, 0x62, 0x0c, 0x8f, 0x03, 0x54, 0x96, 0xca, 0x38, 0x64, 0x50, 0xa8, 0x1b, 0x73, 0x02,
0x2b, 0xb9, 0xd6, 0xbd, 0xf7, 0xb5, 0x14, 0x2e, 0xa8, 0xe4, 0x9e, 0x92, 0x3a, 0x65, 0x15, 0x40,
0x4f, 0x16, 0x6c, 0x24, 0xd1, 0xe0, 0x13, 0xb1, 0xb0, 0x40, 0x75, 0x9e, 0x08, 0x32, 0x12, 0xdd,
0x9f, 0x2d, 0xd0, 0xb9, 0xbc, 0xd7, 0xd6, 0x6f, 0x2e, 0xaa, 0xe7, 0x1b, 0x4d, 0xa5, 0x33, 0xdb,
0xaa, 0xd1, 0x8f, 0x34, 0xc8, 0x6e, 0x72, 0xd0, 0xb8, 0x36, 0xd8, 0xa7, 0x8c, 0x0a, 0xb0, 0xe9,
0xfe, 0x65, 0x76, 0x16, 0xc6, 0x7c, 0x02, 0x1b, 0x99, 0x31, 0x3f, 0x06, 0x61, 0xff, 0xe4, 0x62,
0x8a, 0x9d, 0x3c, 0xaf, 0x75, 0xc5, 0x47, 0x27, 0xc1, 0x72, 0x0a, 0xc7, 0x1b, 0xb4, 0x84, 0xfa,
0xe1, 0x67, 0xb2, 0x4d, 0x2c, 0x19, 0x7a, 0x07, 0xcf, 0xa1, 0x03, 0x43, 0xdb, 0xeb, 0xb0, 0x2a,
0x23, 0xe4, 0x5c, 0x7e, 0x6c, 0xea, 0x8f, 0x8f, 0xe2, 0x42, 0xa3, 0xd7, 0x40, 0x7c, 0xbc, 0xb1,
0x55, 0x3d, 0x05, 0xa6, 0x43, 0xc6, 0x09, 0xc9, 0x78, 0x3b, 0x43, 0x58, 0x1b, 0x95, 0x7e, 0x47,
0x35, 0x69, 0xc3, 0xb2, 0xcf, 0x88, 0xc1, 0xef, 0x91, 0xeb, 0x4a, 0x62, 0x39, 0x2b, 0x20, 0xa1,
0x52, 0x97, 0xf8, 0xc8, 0x5c, 0xd7, 0xa1, 0xcc, 0x20, 0xb7, 0x94, 0xab, 0xae, 0x30, 0x2e, 0x3c,
0xd3, 0xca, 0x86, 0x9b, 0x4d, 0xc2, 0x25, 0x8c, 0x57, 0xea, 0x28, 0x49, 0xe8, 0x1f, 0x31, 0xff,
0x29, 0x61, 0xef, 0x1f, 0x02, 0xbd, 0x71, 0x70, 0x67, 0x78, 0x48, 0xc1, 0xd2, 0xaa, 0x5f, 0x4b,
0x85, 0x46, 0x82, 0x14, 0x8e, 0x65, 0x1f, 0x34, 0xbb, 0x90, 0xfb, 0xad, 0x96, 0x06, 0xbf, 0x1b,
0x09, 0x6f, 0x47, 0xc0, 0xa6, 0x62, 0xd0, 0x38, 0x69, 0xab, 0x96, 0x33, 0x08, 0xb7, 0x45, 0x4d,
0x92, 0x1b, 0xcf, 0x04, 0xc3, 0x52, 0x72, 0xd5, 0x68, 0x4b, 0x31, 0xc6, 0x18, 0x2a, 0x4b, 0x44,
0x6e, 0xb9, 0x91, 0xa9, 0x2f, 0xfe, 0x78, 0x3b, 0x49, 0x7a, 0xa0, 0x9b, 0xc9, 0x69, 0x16, 0x9a,
0x84, 0x3e, 0x79, 0x5c, 0x57, 0x7c, 0x94, 0xdd, 0xfb, 0x27, 0x81, 0xbd, 0xea, 0x0f, 0x23, 0xbc,
0xb5, 0xb9, 0x8c, 0x12, 0xca, 0xc3, 0x76, 0x08, 0x52, 0x19, 0xec, 0x53, 0x54, 0xbf, 0xb1, 0x98,
0x6b, 0xf9, 0xe8, 0xe2, 0x36, 0x9f, 0x4d, 0xc1, 0xcc, 0x59, 0xf0, 0xe4, 0x97, 0x1d, 0x27, 0x10,
0x03, 0x7e, 0x35, 0xcf, 0xa2, 0x28, 0x48, 0x2f, 0xbc, 0x8f, 0xc1, 0x97, 0xfc, 0x8a, 0x48, 0x39,
0x37, 0xe7, 0x2c, 0x54, 0x72, 0x8e, 0xfb, 0xb7, 0xe2, 0x6b, 0x3b, 0x71, 0x22, 0x14, 0x3e, 0x62,
0xe0, 0xf9, 0x6c, 0x6b, 0xf7, 0xa5, 0x67, 0x34, 0x44, 0xf5, 0x5a, 0xf3, 0xa2, 0x24, 0xf9, 0x80,
0xec, 0xe9, 0x7c, 0xb3, 0x15, 0x2e, 0xa3, 0xa3, 0x6a, 0x45, 0xa4, 0x7a, 0x81, 0x90, 0xd2, 0x55,
0xe8, 0xf8, 0x98, 0x3a, 0xa3, 0x53, 0xb9, 0x9d, 0x84, 0x41, 0x96, 0x9b, 0x5b, 0xa7, 0xf8, 0xc2,
0x13, 0x07, 0x66, 0x05, 0x2b, 0x7d, 0x9a, 0xa4, 0x96, 0x2d, 0x73, 0x2d, 0x61, 0x8b, 0x56, 0x1b,
0x38, 0xba, 0x4a, 0x7d, 0x58, 0x51, 0xcb, 0x1b, 0xaa, 0x6d, 0x03, 0x2d, 0x40, 0x78, 0x11, 0x4f,
0x5e, 0x94, 0x3b, 0xc5, 0x3a, 0xf0, 0xeb, 0x52, 0xe4, 0x22, 0x36, 0x1a, 0xcd, 0x6e, 0x08, 0x8c,
0x98, 0xa4, 0x77, 0x00, 0x0a, 0xe9, 0x1b, 0x11, 0x24, 0x2f, 0x08, 0x35, 0x54, 0xa9, 0x21, 0x83,
0x7b, 0x69, 0xfb, 0xe5, 0x71, 0xee, 0x74, 0x60, 0xe8, 0x87, 0x7a, 0x74, 0xd5, 0x0f, 0x02, 0xd3,
0xc8, 0x06, 0x15, 0x91, 0xc7, 0x35, 0x91, 0xcc, 0x67, 0xf1, 0x3a, 0x4c, 0x5e, 0xe8, 0xee, 0x00,
0x21, 0x1a, 0x41, 0x42, 0x40, 0x8a, 0x75, 0x30, 0xc0, 0xde, 0x5c, 0x60, 0x6d, 0x7d, 0x76, 0x47,
0x9b, 0xec, 0x4d, 0x9c, 0x0e, 0xd8, 0xd9, 0x6a, 0x12, 0x74, 0xb5, 0x89, 0x48, 0x8f, 0xe0, 0xe7,
0x3c, 0x8b, 0xe1, 0xf6, 0x9b, 0x1a, 0x56, 0x50, 0xff, 0xda, 0x22, 0x4c, 0x26, 0x35, 0x44, 0x35,
0x7b, 0x22, 0x56, 0x1f, 0x64, 0xec, 0x9e, 0x3b, 0x82, 0x52, 0x50, 0x22, 0xaf, 0x20, 0x76, 0x10,
0x07, 0x3d, 0x6b, 0x26, 0xec, 0xb3, 0xa3, 0xf5, 0x34, 0xc9, 0x5c, 0x5b, 0xb0, 0x53, 0x6e, 0xec,
0xaf, 0xaf, 0x7d, 0x83, 0x58, 0x6e, 0x88, 0xe7, 0x17, 0x4b, 0xec, 0xc8, 0x2e, 0xee, 0xc7, 0xd8,
0xab, 0x52, 0xf8, 0x6c, 0xaf, 0x55, 0xfb, 0x12, 0xd6, 0xe0, 0x8d, 0x29, 0x24, 0x2a, 0x38, 0xcc,
0x7b, 0x4b, 0x94, 0xa6, 0x21, 0x9e, 0x46, 0x34, 0x26, 0xe5, 0xa4, 0xb3, 0x8a, 0x9f, 0x33, 0x93,
0x2c, 0x1d, 0xa2, 0xde, 0x02, 0xac, 0x96, 0xa5, 0xfb, 0xa2, 0x50, 0x02, 0x79, 0x0a, 0xb9, 0x5c,
0xfe, 0x61, 0xd7, 0x20, 0xdc, 0x29, 0xcb, 0xac, 0x8a, 0xdc, 0xa4, 0x8d, 0xa5, 0x1b, 0xbd, 0x22,
0xcb, 0x79, 0xa8, 0x1f, 0xec, 0x9e, 0x9a, 0x3a, 0xf2, 0x1e, 0x7d, 0x22, 0x58, 0x1c, 0x4f, 0xfb,
0x73, 0x75, 0x92, 0x0b, 0xa7, 0x98, 0x87, 0x1a, 0x0c, 0xb6, 0x9c, 0xe6, 0xc9, 0x8f, 0xce, 0xc0,
0x9b, 0x45, 0x20, 0xd2, 0x7d, 0x4d, 0x06, 0x2c, 0x15, 0x18, 0x65, 0x70, 0x4c, 0xa6, 0x3d, 0xe9,
0x0b, 0x73, 0x3c, 0x7b, 0x49, 0xb6, 0xa9, 0x4b, 0xa5, 0x47, 0x7e, 0x2c, 0x58, 0x5a, 0x1e, 0x81,
0xff, 0xfc, 0x5d, 0x49, 0x1d, 0x85, 0x02, 0x7a, 0x9c, 0xb7, 0x73, 0x34, 0x98, 0x8a, 0x91, 0x5e,
0x5a, 0x79, 0x91, 0x76, 0x07, 0xa0, 0x03, 0x54, 0xf1, 0xec, 0xe6, 0x33, 0x4d, 0x9f, 0x3e, 0xcf,
0xfb, 0x5b, 0x8c, 0x10, 0xf1, 0xd0, 0x59, 0xc2, 0xf6, 0x3b, 0xaa, 0xd9, 0x5c, 0x23, 0x9a, 0x95,
0x46, 0x55, 0x30, 0x45, 0xcf, 0x3c, 0x9f, 0x31, 0x8d, 0x71, 0x69, 0xd2, 0x4d, 0xb3, 0x6c, 0xe3,
0xb0, 0x88, 0x60, 0x9e, 0x76, 0x68, 0x82, 0x04, 0x00, 0x11, 0xb7, 0xbc, 0x05, 0xbd, 0x27, 0x1b,
0x67, 0xbf, 0x8b, 0x37, 0x2f, 0xbc, 0x75, 0x0b, 0xc3, 0xed, 0xd1, 0x34, 0xd3, 0xc5, 0x9e, 0x87,
0xee, 0x13, 0xab, 0xb4, 0xc2, 0xae, 0x32, 0xf6, 0x6b, 0x42, 0xc5, 0xb4, 0x8a, 0xc3, 0x82, 0x10,
0x2c, 0x70, 0x39, 0x61, 0x9a, 0x94, 0xf8, 0xba, 0xb8, 0xff, 0x56, 0xed, 0x5f, 0xec, 0x6b, 0x44,
0xce, 0xc3, 0xeb, 0xdf, 0x74, 0xc7, 0xc1, 0x86, 0x2b, 0x33, 0x4c, 0xab, 0x34, 0x02, 0x02, 0xd1,
0xa8, 0x6b, 0x56, 0xb4, 0x98, 0x1e, 0x25, 0xd8, 0x3a, 0x33, 0xf5, 0xbc, 0xbc, 0x48, 0xb2, 0x60,
0xc0, 0xb0, 0xf0, 0x92, 0xf1, 0x33, 0xc6, 0x5d, 0xd1, 0xdd, 0x64, 0x50, 0xc0, 0xae, 0x5c, 0x04,
0xd4, 0xed, 0x44, 0xb1, 0x62, 0x37, 0xf0, 0x61, 0x8e, 0x4d, 0x81, 0x0d, 0xfc, 0xca, 0xb1, 0xe8,
0x84, 0x69, 0x3e, 0x68, 0x3a, 0x46, 0xc7, 0x9b, 0x76, 0xe7, 0x02, 0x8f, 0x0a, 0x12, 0xff, 0xca,
0x91, 0x15, 0xdf, 0x65, 0xe7, 0xe7, 0xd5, 0x24, 0x9c, 0xc8, 0x5e, 0xeb, 0x1d, 0x5b, 0x5a, 0x73,
0x6f, 0x47, 0x22, 0x68, 0x95, 0xc0, 0x44, 0x5d, 0xdd, 0x71, 0x4e, 0xaa, 0x63, 0x6e, 0xf4, 0xd8,
0x66, 0xb5, 0x4b, 0x7f, 0x71, 0x87, 0x38, 0xf5, 0x39, 0xc0, 0x63, 0xf6, 0xe8, 0x4e, 0xd8, 0x25,
0x53, 0x90, 0xe4, 0x10, 0xb2, 0x40, 0x0a, 0xe3, 0x90, 0xa9, 0x07, 0xb2, 0xd4, 0x28, 0xde, 0x5c,
0x10, 0xf7, 0x8e, 0x49, 0x9d, 0x8f, 0x43, 0x3f, 0x1d, 0x3e, 0xad, 0x08, 0x72, 0xf6, 0xf8, 0x46,
0x9b, 0x35, 0xba, 0xa4, 0xc7, 0x02, 0xa7, 0xb6, 0x9e, 0xa9, 0xa6, 0xe6, 0x57, 0xd6, 0x42, 0x2c,
0x00, 0xf3, 0x00, 0xbc, 0x15, 0xcd, 0xfa, 0x9a, 0x41, 0xea, 0xb5, 0x30, 0x96, 0xbd, 0xf3, 0xdc,
0xfb, 0x2d, 0x80, 0xed, 0x70, 0x21, 0x98, 0x18, 0xcd, 0x69, 0x7b, 0xf0, 0x37, 0x59, 0xaa, 0x88,
0x8b, 0xce, 0xe8, 0x6a, 0x01, 0x74, 0x1e, 0x31, 0x6c, 0xd2, 0x84, 0x41, 0x20, 0x7c, 0x12, 0xfc,
0x9b, 0x36, 0xee, 0x8c, 0xbd, 0xc2, 0xd7, 0x74, 0x65, 0x6b, 0x58, 0x44, 0x17, 0x99, 0xfa, 0x05,
0x15, 0x5c, 0x16, 0x14, 0xc4, 0xb7, 0x35, 0xc0, 0x81, 0xc5, 0xaf, 0x2e, 0x18, 0xd9, 0xad, 0x8a,
0xbc, 0x73, 0x3d, 0x29, 0x24, 0xfb, 0x8d, 0x6c, 0xe8, 0xb7, 0x33, 0xd5, 0x6d, 0x67, 0xd9, 0x48,
0x2a, 0xa4, 0x9b, 0xac, 0x97, 0x4e, 0x7d, 0xe1, 0x09, 0xbf, 0x6d, 0x32, 0xc9, 0x24, 0xe9, 0x61,
0x72, 0x45, 0x5c, 0x4b, 0xcb, 0x0a, 0xa8, 0x5b, 0x68, 0x12, 0xc7, 0x04, 0xa2, 0xaf, 0x87, 0xc6,
0x83, 0xa1, 0xf2, 0xa9, 0xa9, 0x10, 0x1d, 0x0f, 0xe0, 0xca, 0x70, 0xa6, 0xa6, 0xd5, 0xca, 0x1f,
0xff, 0x04, 0x5b, 0x82, 0x32, 0x35, 0xc3, 0x34, 0x53, 0x6b, 0x9c, 0x42, 0x9d, 0xa3, 0x27, 0x23,
0x27, 0xbe, 0x74, 0x5e, 0xfd, 0x91, 0x20, 0x40, 0xa6, 0x44, 0x5c, 0x24, 0x5f, 0x5a, 0xfa, 0x14,
0x63, 0x50, 0xf9, 0xf1, 0x93, 0x65, 0x1f, 0x8d, 0xb4, 0x1a, 0xe4, 0xd4, 0xaf, 0xa7, 0xab, 0x81,
0x19, 0x80, 0x43, 0xbe, 0x7c, 0xf5, 0x9d, 0xc6, 0xde, 0x02, 0x83, 0xf2, 0x7f, 0xe8, 0x48, 0xcb,
0xdb, 0x29, 0x62, 0xca, 0xcf, 0xb9, 0x68, 0x03, 0xd9, 0xe7, 0xeb, 0xb4, 0x97, 0xab, 0x1b, 0x0e,
0x65, 0xf8, 0x02, 0xbd, 0xd2, 0x7b, 0x9a, 0x36, 0x33, 0x3e, 0xe2, 0x4a, 0xe7, 0xf5, 0xe9, 0x4a,
0x8c, 0xfa, 0xdd, 0xe4, 0x0e, 0x17, 0xb0, 0x1d, 0x6c, 0x72, 0xd1, 0x46, 0x3f, 0x68, 0xef, 0x98,
0x16, 0x9e, 0xec, 0x31, 0x3f, 0x97, 0xa0, 0x2e, 0x06, 0x34, 0xcb, 0xe8, 0x9e, 0x2d, 0xd4, 0xc4,
0xd5, 0x32, 0x17, 0xfa, 0xb8, 0xbb, 0xec, 0xe8, 0x2b, 0x1c, 0xe9, 0xdf, 0xf2, 0x5c, 0xcc, 0x6f,
0x7c, 0x86, 0xf8, 0xe7, 0x43, 0xe2, 0x69, 0x49, 0x2a, 0xa5, 0xcd, 0x7f, 0xae, 0x7b, 0x0e, 0xc5,
0xff, 0x32, 0x3b, 0x53, 0xd7, 0x0e, 0xcf, 0x0b, 0xd8, 0x52, 0x98, 0x98, 0x53, 0x1c, 0x6b, 0x85,
0xf4, 0x2a, 0x30, 0x4b, 0x15, 0x2b, 0xcc, 0xfa, 0xe9, 0x2b, 0xae, 0xd9, 0x73, 0x2d, 0x68, 0x58,
0x4c, 0x50, 0x7b, 0x51, 0x0c, 0xb2, 0x7c, 0x73, 0x27, 0x73, 0x88, 0xee, 0xa9, 0x56, 0x7b, 0x7c,
0x3b, 0x1f, 0x76, 0x11, 0xd2, 0xe2, 0x56, 0x2a, 0x86, 0x93, 0x02, 0x81, 0xe8, 0x15, 0xc0, 0x91,
0x9e, 0x87, 0xc9, 0xab, 0x92, 0x3c, 0xd8, 0xbe, 0x71, 0x75, 0xb7, 0xdb, 0xe8, 0x41, 0x3e, 0x37,
0xfc, 0x51, 0x2e, 0x0d, 0x4a, 0x0a, 0x8d, 0x47, 0xac, 0x53, 0xdf, 0x1e, 0x19, 0x57, 0x63, 0x69,
0x53, 0x9f, 0x7b, 0x5d, 0x74, 0xbe, 0x7f, 0x93, 0xa2, 0xa8, 0x66, 0xa0, 0x41, 0xfe, 0x3a, 0x8d,
0x23, 0x19, 0x60, 0x57, 0x09, 0x9a, 0xfd, 0xcb, 0x41, 0x35, 0x3c, 0x6e, 0xba, 0x76, 0x9e, 0xda,
0xe1, 0x3e, 0x50, 0x2c, 0x8a, 0x33, 0x31, 0x0f, 0x70, 0x09, 0xfa, 0xf5, 0xb8, 0x58, 0xb9, 0xfd,
0xa9, 0x82, 0xc3, 0xcc, 0xd2, 0x8d, 0xb2, 0xc9, 0xce, 0xcb, 0x70, 0x22, 0xd9, 0x81, 0xc4, 0x79,
0x67, 0xba, 0xfb, 0x8c, 0xb4, 0xbe, 0x54, 0xf0, 0xd4, 0x26, 0xd5, 0xec, 0x7e, 0x41, 0x4e, 0x3e,
0xa0, 0xeb, 0x9a, 0x0e, 0x42, 0x18, 0xce, 0xd0, 0x0c, 0xeb, 0x39, 0x3f, 0x4e, 0xbe, 0xad, 0xe2,
0x24, 0xdf, 0x16, 0xaf, 0x55, 0x30, 0x51, 0x55, 0xab, 0x2a, 0xf8, 0xfc, 0x8a, 0x98, 0x3b, 0xa6,
0x4f, 0xae, 0xe5, 0x3a, 0xaf, 0x1c, 0xb6, 0xe5, 0xa1, 0x79, 0x4d, 0x3f, 0xd0, 0x50, 0x6e, 0x06,
0x85, 0xe4, 0xb0, 0x02, 0xd6, 0x91, 0x48, 0xaa, 0xa7, 0x95, 0xa2, 0x8d, 0x31, 0x06, 0xed, 0xd9,
0xa6, 0xa0, 0x01, 0xea, 0xd8, 0x8c, 0x22, 0x1a, 0xc5, 0x39, 0xcc, 0x44, 0xa8, 0xa2, 0x82, 0x45,
0x5c, 0x25, 0x80, 0x4a, 0x6c, 0x26, 0xdd, 0xab, 0xbe, 0xb0, 0xc9, 0x17, 0xe8, 0x35, 0xa1, 0xf7,
0x1a, 0xcf, 0x69, 0x20, 0xa3, 0x3c, 0x27, 0x32, 0xd7, 0x54, 0x65, 0x07, 0x7c, 0xda, 0x20, 0x5a,
0xe8, 0x7c, 0x9d, 0x23, 0xd8, 0xb8, 0xf6, 0x7d, 0x56, 0x58, 0x81, 0xce, 0x3b, 0x4c, 0x48, 0xb6,
0xe0, 0x6d, 0x93, 0xe3, 0x10, 0xfb, 0x1f, 0x2f, 0xa0, 0x08, 0x54, 0x93, 0x68, 0x2e, 0xe1, 0x24,
0xd5, 0x82, 0xd8, 0x53, 0x61, 0xe2, 0x9c, 0x0c, 0xdc, 0x2f, 0x68, 0xe9, 0x3a, 0x12, 0x46, 0x71,
0xd9, 0xe7, 0x0c, 0x43, 0x28, 0x79, 0x34, 0x06, 0xc5, 0x62, 0x28, 0x64, 0xdd, 0x90, 0x3c, 0x7a,
0x5a, 0x02, 0x44, 0xcd, 0x24, 0xd4, 0xa8, 0xb6, 0x1f, 0x4d, 0x16, 0x47, 0xd5, 0x24, 0xe5, 0xde,
0x8a, 0xcd, 0x57, 0x12, 0x19, 0x45, 0x5d, 0x57, 0x43, 0x8b, 0x09, 0x07, 0xa2, 0x30, 0xed, 0x3e,
0x47, 0xa9, 0xbd, 0x3f, 0x29, 0x15, 0x48, 0xaa, 0x15, 0xa8, 0x00, 0x63, 0x08, 0xe7, 0xf1, 0xa8,
0x59, 0x3e, 0x27, 0xf9, 0xfa, 0x55, 0xef, 0x28, 0x02, 0x66, 0xa3, 0xf1, 0x01, 0x62, 0x12, 0xdb,
0x29, 0x21, 0xe8, 0x0a, 0xe9, 0xc5, 0xd8, 0x38, 0xa2, 0x40, 0x71, 0xac, 0x87, 0x3f, 0xe8, 0x24,
0x5e, 0x2e, 0x87, 0x7d, 0x46, 0x6f, 0x69, 0xeb, 0x7c, 0x87, 0xdd, 0x91, 0x76, 0xf3, 0x1d, 0x38,
0x47, 0x6e, 0xbf, 0xa9, 0xf2, 0x87, 0xa6, 0x99, 0xb7, 0xd4, 0x63, 0x49, 0x02, 0xd2, 0x2b, 0x84,
0x3c, 0x57, 0x57, 0x14, 0xc8, 0x4a, 0xbf, 0x02, 0xf0, 0x4e, 0xdf, 0x7f, 0x56, 0xd7, 0x64, 0x6d,
0xf6, 0x5c, 0x15, 0x59, 0x33, 0xb6, 0x43, 0xdc, 0xa2, 0xa2, 0xe7, 0x62, 0x16, 0x60, 0x63, 0x5e,
0x21, 0x54, 0x01, 0xee, 0x70, 0x04, 0xde, 0xd4, 0xaa, 0x9e, 0x02, 0x3b, 0x13, 0xbf, 0x1c, 0xdf,
0x44, 0x72, 0x02, 0x18, 0xa0, 0x29, 0x75, 0xb9, 0xc1, 0x47, 0x07, 0xa5, 0xba, 0xf2, 0x25, 0xbf,
0xc4, 0x93, 0x7e, 0xad, 0x51, 0x93, 0xd5, 0x33, 0xec, 0x78, 0x24, 0x6d, 0xe1, 0xdd, 0x94, 0xa2,
0x3f, 0x56, 0xad, 0x47, 0xde, 0x9d, 0x5b, 0x6a, 0x47, 0xce, 0x60, 0xaf, 0x33, 0x32, 0x4f, 0x5a,
0xfd, 0xf1, 0x98, 0x1c, 0x2b, 0x46, 0x0d, 0xa8, 0x84, 0xec, 0xbe, 0x4a, 0x7f, 0x08, 0x25, 0x27,
0xfc, 0xeb, 0xa6, 0xdf, 0xbd, 0xfa, 0x5d, 0xd3, 0x2d, 0x7c, 0xbc, 0x08, 0xa0, 0xf4, 0xf2, 0x4b,
0x84, 0x11, 0x82, 0x1c, 0x0b, 0x22, 0xe1, 0x05, 0x30, 0x29, 0xdf, 0xb9, 0xb0, 0xd0, 0xe6, 0x1c,
0x99, 0x7f, 0x9b, 0x4e, 0xfd, 0x97, 0x83, 0xc8, 0xc3, 0x84, 0xcb, 0x72, 0xa0, 0x42, 0xc1, 0xff,
0x23, 0xd3, 0xeb, 0x80, 0x2a, 0x36, 0x75, 0x02, 0xff, 0x73, 0xe9, 0x52, 0xec, 0xcf, 0xd9, 0xb6,
0xfa, 0x42, 0x21, 0x93, 0xde, 0xfc, 0x9f, 0x04, 0x0d, 0xf2, 0x91, 0xee, 0x19, 0x8b, 0x93, 0x1f,
0xe3, 0x76, 0xb5, 0xa4, 0xac, 0xc5, 0x6c, 0xae, 0x47, 0x2c, 0x73, 0x4b, 0x08, 0xa4, 0xeb, 0xa2,
0x93, 0x50, 0x3b, 0xd5, 0x34, 0xa1, 0x4e, 0x93, 0x5b, 0x92, 0x53, 0x22, 0xd5, 0xbb, 0x08, 0x3c,
0xfd, 0x2e, 0xc1, 0x60, 0x08, 0x93, 0xac, 0xe9, 0xe0, 0x77, 0x23, 0x39, 0xd1, 0x7f, 0x72, 0x4f,
0x4e, 0x54, 0xf1, 0xd9, 0xa9, 0x98, 0xfa, 0x93, 0xdc, 0xef, 0x40, 0x7a, 0xe4, 0xbf, 0xc1, 0x44,
0x93, 0x8a, 0x7c, 0xac, 0xbb, 0xf5, 0x06, 0x32, 0x7b, 0x6e, 0xf7, 0x61, 0xf6, 0xb8, 0xbc, 0xda,
0x13, 0x9b, 0x28, 0x52, 0xb5, 0xd1, 0x0f, 0x32, 0x5e, 0xff, 0xb7, 0x1c, 0xbb, 0x19, 0x42, 0x5c,
0x6a, 0x21, 0x22, 0x61, 0x60, 0x4b, 0x3a, 0xb2, 0x29, 0xfa, 0x99, 0x1d, 0x8c, 0x00, 0x11, 0xfc,
0x3b, 0xc3, 0x59, 0x2d, 0x0b, 0xee, 0x22, 0x43, 0xdb, 0x74, 0x85, 0xab, 0x0f, 0xba, 0x35, 0x20,
0x53, 0x8a, 0xb9, 0xf5, 0x27, 0xcd, 0x5a, 0x1d, 0xab, 0x52, 0x05, 0xde, 0x32, 0x61, 0xc8, 0x28,
0x3c, 0x93, 0xa9, 0xb6, 0xaa, 0xf1, 0xe6, 0x6c, 0x32, 0xb7, 0xa4, 0x45, 0x52, 0x6c, 0xff, 0xc1,
0x42, 0xdd, 0xef, 0xf1, 0xc1, 0x72, 0xc5, 0x83, 0xde, 0xf9, 0xbd, 0xc2, 0xd9, 0xf7, 0x38, 0x82,
0xe6, 0x5b, 0x9c, 0xc7, 0x49, 0x07, 0x39, 0xa0, 0x64, 0xc6, 0x2e, 0x04, 0xf4, 0xdd, 0xba, 0x49,
0x57, 0xba, 0xdd, 0x6b, 0x50, 0xc6, 0x4a, 0x13, 0xd8, 0x79, 0x0e, 0x28, 0x20, 0xdd, 0x20, 0xd6,
0xc1, 0x21, 0x84, 0x62, 0xaf, 0x6a, 0x07, 0x0c, 0x76, 0x8e, 0x8c, 0x95, 0x3b, 0x77, 0x9c, 0x73,
0x2d, 0xe4, 0xff, 0x75, 0x6f, 0x87, 0xec, 0xf2, 0x69, 0x5c, 0xae, 0xd4, 0x94, 0x61, 0x21, 0x68,
0x83, 0xbf, 0x55, 0x39, 0x41, 0x53, 0x59, 0x69, 0x1a, 0x57, 0xe6, 0x9b, 0x08, 0xc0, 0x63, 0x0f,
0xb2, 0x73, 0x2e, 0xee, 0xe2, 0xd6, 0xe6, 0xd9, 0x9d, 0xf1, 0xcb, 0xff, 0xc2, 0x21, 0x2e, 0x79,
0xc8, 0xcd, 0x2a, 0xb4, 0xf8, 0x05, 0x2a, 0xcf, 0x0b, 0xd2, 0xbd, 0xea, 0x1d, 0x33, 0x37, 0xcf,
0x5b, 0x17, 0x73, 0xf5, 0xa1, 0xa0, 0x95, 0xe4, 0x31, 0xed, 0x7e, 0x46, 0x7f, 0xb3, 0x86, 0xdb,
0xab, 0x83, 0xd3, 0x0b, 0x49, 0x24, 0xf6, 0xbb, 0x4d, 0x9e, 0xf0, 0x85, 0x1f, 0x3c, 0xd2, 0x18,
0xc4, 0x84, 0x41, 0xaf, 0x95, 0x20, 0xe2, 0xbd, 0xc1, 0x2d, 0xb9, 0xe4, 0xd3, 0xb2, 0x2c, 0xa6,
0x85, 0xe9, 0x54, 0x7d, 0x2a, 0x24, 0xa5, 0xb9, 0xae, 0xf0, 0x6e, 0xdb, 0x49, 0x44, 0xfd, 0xe8,
0x79, 0xa8, 0xca, 0x7f, 0xd2, 0x52, 0x2f, 0xca, 0x75, 0x91, 0x01, 0x7e, 0x16, 0x88, 0x16, 0x37,
0xd1, 0x20, 0x1f, 0x13, 0x54, 0x7b, 0x77, 0x7f, 0xee, 0x84, 0x9e, 0xec, 0x6c, 0xd9, 0x5d, 0x2b,
0xb1, 0x88, 0x59, 0xb5, 0x36, 0x7e, 0x1e, 0xa7, 0x87, 0x28, 0xbc, 0x7a, 0x7c, 0xdc, 0x8d, 0xeb,
0x7b, 0x92, 0x10, 0x3f, 0x65, 0xfd, 0x79, 0x9d, 0x23, 0xdc, 0x7e, 0x31, 0xad, 0xbe, 0x62, 0xb7,
0x29, 0xdd, 0x22, 0x2f, 0xbf, 0x3e, 0x15, 0xa9, 0x7e, 0xf7, 0x2a, 0xea, 0x07, 0xe1, 0x83, 0x57,
0x7f, 0x59, 0x1a, 0x08, 0x18, 0x45, 0xea, 0x34, 0x07, 0x97, 0xb7, 0x9c, 0x6c, 0x87, 0x42, 0xe8,
0x82, 0x6a, 0x6d, 0x7d, 0xf7, 0x73, 0xec, 0x85, 0x64, 0x02, 0x5f, 0xbb, 0x57, 0x0b, 0xfb, 0xc0,
0x01, 0x74, 0x0e, 0x34, 0x37, 0x38, 0x4d, 0xf6, 0x32, 0x4c, 0x76, 0x05, 0x52, 0x6d, 0x9a, 0x63,
0x0a, 0x5d, 0x44, 0x83, 0xf1,
};
/* db_write_enable: 1765 bytes */
static const guint8 db_write_enable_0090[] = {
0x06, 0x02, 0x00, 0x00, 0x01, 0x5d, 0xdf, 0x5d, 0x76, 0xa8, 0xe3, 0xba, 0xb8, 0xb1, 0x0d, 0x9f,
0x82, 0xf0, 0xb3, 0x16, 0x52, 0xd5, 0xb2, 0x08, 0xdf, 0xf1, 0xd2, 0x07, 0x45, 0xb7, 0xc5, 0x44,
0x2e, 0x09, 0xdb, 0x88, 0x0c, 0x80, 0xca, 0x10, 0x3d, 0x5b, 0x20, 0x71, 0xd8, 0xbd, 0xca, 0xab,
0x45, 0x2b, 0x90, 0x0d, 0x17, 0x85, 0xbe, 0x2d, 0xe4, 0x78, 0x66, 0x9e, 0x72, 0xa9, 0xd0, 0x82,
0x27, 0x3f, 0x0f, 0x61, 0x76, 0xb7, 0x00, 0xff, 0xb6, 0x5a, 0x02, 0x6a, 0xf0, 0x52, 0xe7, 0x6d,
0xe5, 0xf9, 0xe2, 0x47, 0xe9, 0x94, 0xbe, 0xd7, 0xc7, 0x9e, 0x34, 0x81, 0x5b, 0x46, 0x5a, 0x80,
0x70, 0xa7, 0x6d, 0xa7, 0xd3, 0x65, 0x52, 0x5d, 0x72, 0x85, 0xdf, 0xb1, 0x52, 0xd2, 0x4c, 0x73,
0x2a, 0x47, 0x1f, 0x03, 0x1d, 0x22, 0xeb, 0xb6, 0x7d, 0x6e, 0x27, 0xbf, 0xff, 0x74, 0xb3, 0xab,
0x1c, 0x47, 0x80, 0x46, 0x1a, 0x46, 0x0c, 0x0e, 0xa5, 0x71, 0x0f, 0xbd, 0x32, 0xab, 0x59, 0xa6,
0xca, 0x9c, 0xa3, 0xe3, 0xe2, 0x42, 0x64, 0x64, 0x0b, 0x15, 0x24, 0x5a, 0x6c, 0x48, 0xb6, 0xbd,
0x20, 0xc6, 0x84, 0x8c, 0x23, 0x07, 0xe8, 0x54, 0xaf, 0x75, 0xb0, 0x59, 0xe8, 0x67, 0x93, 0xdc,
0x7a, 0x30, 0x47, 0x4a, 0x1b, 0x1b, 0x54, 0x84, 0xc5, 0x8d, 0xc5, 0xa4, 0x53, 0x5e, 0xb7, 0x19,
0x11, 0xbf, 0x9b, 0x10, 0xf8, 0x2c, 0x27, 0x36, 0x2d, 0x68, 0xb4, 0xba, 0xa1, 0xac, 0xe6, 0x3a,
0x33, 0xb7, 0xcf, 0x3d, 0xe6, 0x16, 0x81, 0x0e, 0xe5, 0x03, 0x36, 0x01, 0xfe, 0xbb, 0xcc, 0x08,
0xb0, 0xf5, 0x51, 0x66, 0xf4, 0xca, 0x08, 0xd4, 0x2d, 0x33, 0x61, 0x42, 0x67, 0x12, 0xf7, 0xe5,
0xa4, 0x84, 0x2e, 0x9d, 0x2e, 0x90, 0x6c, 0x87, 0xe4, 0xc5, 0xc6, 0x69, 0x4e, 0xec, 0x44, 0x8c,
0x10, 0x9a, 0xbe, 0x32, 0x38, 0x12, 0x8f, 0xbb, 0xb8, 0xb8, 0xf3, 0x83, 0xe3, 0xb6, 0x61, 0x33,
0xf0, 0xc9, 0xd3, 0x8c, 0xa5, 0x35, 0xd4, 0x7e, 0xe9, 0xdd, 0x88, 0x41, 0xfc, 0xb2, 0x05, 0x51,
0x04, 0x52, 0xbd, 0x0f, 0x73, 0x3d, 0x41, 0x6b, 0x6c, 0x76, 0x3f, 0x0b, 0x7a, 0x64, 0x7e, 0x19,
0x92, 0xed, 0xe7, 0x14, 0xb6, 0xc4, 0x56, 0x9d, 0xe3, 0x29, 0x44, 0x05, 0x49, 0xa5, 0xa1, 0xf6,
0x64, 0x6d, 0xc8, 0x8b, 0x08, 0x28, 0x8f, 0xc6, 0xf9, 0xc4, 0xf5, 0x5d, 0x90, 0xcc, 0xc8, 0x64,
0x87, 0xaf, 0x19, 0x5e, 0xd6, 0x35, 0xe4, 0xc9, 0xa5, 0xa2, 0xdf, 0x5d, 0xf3, 0xbc, 0x4e, 0x39,
0xff, 0x0a, 0xd6, 0xbc, 0x70, 0xa5, 0x4d, 0x14, 0x2a, 0x01, 0xba, 0x9e, 0xf2, 0x28, 0x39, 0x85,
0x9e, 0xa1, 0xcb, 0x9b, 0x22, 0x7c, 0xf9, 0x40, 0x7a, 0x9f, 0x61, 0xb3, 0xcf, 0x82, 0x73, 0x54,
0x9d, 0x75, 0x9c, 0x3f, 0xfb, 0x6d, 0xb4, 0xb3, 0x3b, 0xf9, 0xa4, 0x0f, 0x6d, 0xe2, 0x68, 0x0c,
0xde, 0x8a, 0xd0, 0x11, 0x58, 0xed, 0x1c, 0x67, 0x71, 0xbb, 0xa9, 0xfb, 0xe2, 0x30, 0xc9, 0xe9,
0xb8, 0xa4, 0xed, 0xff, 0x94, 0x1f, 0x43, 0xc4, 0xe6, 0x29, 0x09, 0x7c, 0x61, 0x49, 0xa5, 0xac,
0x13, 0xeb, 0xe7, 0x57, 0xb4, 0x3a, 0x52, 0xaf, 0x3f, 0x26, 0x3f, 0x8a, 0xa3, 0x6e, 0xc6, 0x99,
0x89, 0xc6, 0x25, 0x39, 0xb6, 0x56, 0xa4, 0x9d, 0xfd, 0xb1, 0x4e, 0xa0, 0x66, 0xff, 0xec, 0x20,
0x3c, 0x41, 0x41, 0x1d, 0xe2, 0x92, 0x51, 0xbc, 0x40, 0xf7, 0x58, 0x60, 0x97, 0x68, 0x34, 0xac,
0xf3, 0x68, 0xdb, 0x99, 0x1d, 0x0c, 0x88, 0xcc, 0x5d, 0x9f, 0x82, 0x29, 0xbe, 0x69, 0x1f, 0x55,
0xc1, 0xdc, 0x29, 0x8d, 0xd0, 0x69, 0x0a, 0xa0, 0x9f, 0x46, 0xa7, 0xa0, 0xdc, 0xb9, 0x29, 0x09,
0xa6, 0x54, 0xa5, 0x4c, 0xb5, 0x84, 0xed, 0x65, 0x28, 0x02, 0x36, 0xbf, 0x36, 0x8a, 0xb2, 0xae,
0x90, 0x90, 0x86, 0xdc, 0xba, 0xfa, 0x6f, 0xbe, 0x26, 0x55, 0x6c, 0xd7, 0x24, 0xee, 0x9e, 0x6b,
0x7b, 0x3c, 0xe2, 0x29, 0x0c, 0x5c, 0xb8, 0x32, 0xbd, 0x43, 0x01, 0x66, 0x04, 0x7a, 0xb2, 0x28,
0x1c, 0x55, 0xe7, 0xd9, 0xd2, 0x96, 0x37, 0xbb, 0xad, 0xfa, 0x40, 0xb4, 0xb9, 0xa5, 0x00, 0x8e,
0x86, 0x23, 0x9a, 0x59, 0x98, 0xd3, 0x9a, 0x5d, 0xda, 0x6c, 0xfe, 0xb7, 0xd0, 0xbf, 0xf1, 0x0b,
0xf5, 0x6c, 0x52, 0x38, 0x78, 0xdb, 0x6d, 0xe8, 0x1b, 0x7e, 0xd8, 0x24, 0xfd, 0xfd, 0xd9, 0x51,
0x5f, 0x5d, 0x49, 0x03, 0x45, 0xb4, 0x71, 0x72, 0xbd, 0xc9, 0xdb, 0x6b, 0xbb, 0x10, 0xf1, 0x9d,
0x39, 0xf0, 0x61, 0xfb, 0xe5, 0x3c, 0x33, 0x97, 0xdc, 0xb8, 0xfe, 0x30, 0xd5, 0xca, 0x03, 0x2c,
0xcf, 0x2d, 0x26, 0x18, 0x46, 0x35, 0xb6, 0x91, 0x70, 0x5b, 0x47, 0x1d, 0x81, 0xdc, 0x86, 0xee,
0x31, 0xf1, 0x44, 0x51, 0x20, 0x72, 0xd9, 0xef, 0x75, 0x59, 0xe9, 0xef, 0x9d, 0xb8, 0xa0, 0x8f,
0xea, 0x98, 0xab, 0xb6, 0x70, 0x68, 0x33, 0xa9, 0x68, 0x48, 0x55, 0x57, 0x8e, 0xc0, 0x4b, 0x72,
0xae, 0x1b, 0xc4, 0xe5, 0x59, 0xc8, 0x7d, 0xc1, 0xdc, 0xba, 0xc3, 0x11, 0x5c, 0x2c, 0x66, 0x97,
0xcd, 0xb4, 0x57, 0x62, 0x40, 0x28, 0x36, 0x58, 0x0f, 0x29, 0x33, 0x0c, 0xb0, 0xfe, 0x8e, 0x41,
0x16, 0xbd, 0xcd, 0x4d, 0xa6, 0x03, 0x08, 0x2c, 0xa4, 0x20, 0xf5, 0xde, 0x71, 0xb9, 0x26, 0x57,
0xc5, 0xa6, 0xca, 0x96, 0xf5, 0x1e, 0x6e, 0xd9, 0x94, 0x5f, 0xfd, 0x39, 0xe9, 0xc7, 0x94, 0x41,
0xba, 0x5c, 0xba, 0x40, 0xb2, 0xc0, 0x9a, 0xf4, 0xd1, 0x6c, 0x3d, 0x79, 0x57, 0xa2, 0xd8, 0xab,
0x74, 0x69, 0x81, 0x9c, 0x0c, 0x6d, 0xd1, 0x77, 0xe3, 0xe7, 0xde, 0xa2, 0x24, 0x0a, 0x1d, 0x96,
0x75, 0x6b, 0x5f, 0xde, 0x20, 0x75, 0x43, 0x16, 0x74, 0x17, 0xa7, 0x4e, 0x70, 0x2d, 0xf1, 0x78,
0x1f, 0x65, 0x16, 0x5c, 0x4e, 0xd7, 0xbc, 0x99, 0x3e, 0x72, 0x78, 0x9a, 0xf0, 0x3c, 0x2c, 0xdc,
0xda, 0xa7, 0xb5, 0x58, 0x42, 0x3f, 0xd0, 0x64, 0x32, 0x8d, 0x57, 0xf2, 0xec, 0x9a, 0x8a, 0xb2,
0xbc, 0xa9, 0xbd, 0xa6, 0xf6, 0x25, 0xe1, 0x03, 0xa7, 0x9a, 0x12, 0x56, 0x16, 0x75, 0xe0, 0x5b,
0x44, 0x8f, 0x5d, 0xec, 0x75, 0x54, 0x64, 0x9f, 0xb1, 0x0e, 0xe3, 0xd2, 0x85, 0x99, 0x30, 0x6d,
0xe1, 0x9f, 0x63, 0xce, 0x50, 0xe4, 0xc3, 0x46, 0xca, 0xbf, 0xf9, 0xf5, 0xcc, 0xd3, 0x60, 0x72,
0x83, 0x16, 0x64, 0xc3, 0x08, 0xe6, 0x31, 0x84, 0xcb, 0xf3, 0x1e, 0x55, 0x41, 0xf4, 0x6e, 0x01,
0x50, 0x0d, 0x6e, 0xd0, 0x45, 0xd7, 0xd4, 0x4e, 0xb8, 0x08, 0x73, 0x55, 0xc5, 0xbd, 0x5a, 0x65,
0xc5, 0x8c, 0x70, 0x5b, 0x52, 0x99, 0xe5, 0x2c, 0xeb, 0xcb, 0xc7, 0x92, 0x54, 0xd2, 0x0b, 0x68,
0x35, 0xc7, 0x6c, 0xfd, 0x47, 0xd9, 0x9f, 0x9b, 0x1f, 0x4a, 0x96, 0x16, 0x92, 0x49, 0xa5, 0xe2,
0x8d, 0x6c, 0xa7, 0x53, 0xef, 0xdb, 0x8a, 0x00, 0x8e, 0xdf, 0xfe, 0x2a, 0x7f, 0x68, 0xae, 0x23,
0xbb, 0x7d, 0x6f, 0x84, 0xf4, 0x07, 0x51, 0xf0, 0x23, 0x22, 0x51, 0xd4, 0xad, 0x4d, 0xed, 0xf0,
0xfb, 0x4b, 0x8b, 0x5f, 0x8f, 0xc4, 0x70, 0x1b, 0xc4, 0x57, 0x8c, 0xd8, 0xe1, 0xc4, 0xbb, 0x49,
0x1d, 0x16, 0x19, 0x6e, 0x95, 0x2e, 0x0c, 0xe6, 0x84, 0xe6, 0x3c, 0xe9, 0xb6, 0x08, 0xef, 0x61,
0x55, 0x10, 0x11, 0x32, 0x88, 0x66, 0x54, 0x5a, 0x69, 0x99, 0xe0, 0x88, 0x1f, 0xfc, 0x75, 0x8e,
0x41, 0xb4, 0x51, 0xe1, 0xc2, 0xc8, 0xf5, 0x71, 0x29, 0x4e, 0xb1, 0xd5, 0x82, 0x81, 0x31, 0xaf,
0x97, 0x35, 0x00, 0x3d, 0x00, 0x48, 0x82, 0x00, 0xdc, 0x3b, 0x9f, 0x6c, 0xb6, 0xa7, 0xd2, 0xbc,
0x12, 0x39, 0x36, 0x7b, 0x37, 0x29, 0x14, 0xd4, 0xa3, 0xa3, 0xec, 0xaf, 0xc8, 0x93, 0x72, 0x49,
0x7d, 0x96, 0x21, 0xc1, 0x62, 0x9c, 0x1a, 0xeb, 0x40, 0xd9, 0xb6, 0xf1, 0x7e, 0xfe, 0x1f, 0xdf,
0x19, 0x58, 0x3a, 0xe2, 0x86, 0x7e, 0xfa, 0xf0, 0xc6, 0x82, 0xd5, 0x9e, 0xf7, 0x23, 0x97, 0xc7,
0xd7, 0x09, 0xda, 0x80, 0x42, 0x5c, 0x30, 0xb9, 0x1b, 0x17, 0x16, 0x89, 0x30, 0x39, 0x20, 0x5b,
0x9d, 0xc4, 0x6e, 0xf8, 0x97, 0x9a, 0xa5, 0xf8, 0x00, 0x4c, 0x6b, 0xb6, 0x98, 0xb3, 0x5c, 0x4b,
0x60, 0x0b, 0x45, 0xcd, 0x9d, 0xfc, 0x2a, 0x92, 0x9f, 0xec, 0x37, 0xd3, 0x92, 0xce, 0x9e, 0x3b,
0x83, 0x24, 0x07, 0x07, 0x22, 0x64, 0x02, 0xd8, 0x9b, 0xb0, 0x34, 0xc3, 0xa2, 0x30, 0x74, 0x13,
0xba, 0x39, 0xeb, 0x1a, 0xfd, 0xca, 0xbb, 0xab, 0xe9, 0x74, 0x2f, 0xe2, 0xc6, 0x2a, 0xcb, 0x67,
0x9a, 0x57, 0xee, 0x90, 0x3d, 0xe0, 0xa7, 0x88, 0xfe, 0xe1, 0x9d, 0x55, 0x0b, 0x78, 0xc4, 0xf2,
0x09, 0x5e, 0x38, 0x87, 0x66, 0x72, 0x40, 0x61, 0xb3, 0x9a, 0x1e, 0x54, 0xc5, 0x85, 0xdd, 0xbc,
0xe2, 0x38, 0xa3, 0x85, 0xe5, 0x0c, 0x4b, 0xa9, 0x86, 0x6c, 0x16, 0xea, 0x8f, 0x43, 0x8c, 0xc5,
0x8a, 0xed, 0xac, 0xd6, 0xc2, 0x65, 0x2b, 0x0a, 0xb0, 0x84, 0x77, 0x94, 0xf8, 0x09, 0x68, 0xda,
0xaf, 0x8a, 0x70, 0x42, 0x2c, 0x28, 0x54, 0x5c, 0xaf, 0x3e, 0x95, 0xc3, 0x8c, 0x54, 0xe1, 0x42,
0xc8, 0xeb, 0xf2, 0x6d, 0x5b, 0x5a, 0xdc, 0xf9, 0x05, 0xd8, 0xf1, 0x05, 0xde, 0xf1, 0xdf, 0x70,
0x99, 0x7c, 0xca, 0xf5, 0x9e, 0x25, 0x6e, 0x7b, 0x17, 0x8e, 0x4b, 0xc9, 0xee, 0x8d, 0x64, 0x37,
0xf2, 0x3f, 0x59, 0xe7, 0xdc, 0xc8, 0xfb, 0x3f, 0x18, 0x76, 0x9f, 0xa6, 0x7b, 0xba, 0x0b, 0x47,
0x91, 0xcf, 0x8c, 0x0a, 0x4e, 0x33, 0x07, 0x51, 0xe6, 0x71, 0xbe, 0x32, 0x35, 0xa9, 0xff, 0xd8,
0x32, 0x72, 0xec, 0xeb, 0xaf, 0x2d, 0x3b, 0x91, 0xa9, 0x15, 0x99, 0xb1, 0xd4, 0xf8, 0x4a, 0xca,
0x56, 0x60, 0xdc, 0xa2, 0x4a, 0xcf, 0xe5, 0xfa, 0x78, 0xe9, 0x5f, 0x94, 0x4b, 0x49, 0x30, 0xdb,
0x9e, 0x81, 0xa6, 0xf3, 0xed, 0x23, 0xc9, 0x0b, 0x2a, 0x44, 0x6a, 0xd7, 0x83, 0x2b, 0x6f, 0x4b,
0xd8, 0xe6, 0xb9, 0x32, 0x11, 0x6f, 0x4a, 0xed, 0xab, 0x50, 0x0a, 0x4d, 0xfe, 0x31, 0x1d, 0x54,
0xb3, 0xff, 0x9d, 0xdd, 0x3c, 0x73, 0x81, 0x9b, 0x5c, 0x88, 0xa4, 0x7c, 0x87, 0xa1, 0x17, 0xc3,
0xa0, 0x08, 0xe4, 0x93, 0x61, 0xba, 0x1a, 0xd4, 0x63, 0x2d, 0x38, 0xee, 0x4f, 0x2f, 0xd8, 0x82,
0x2c, 0x07, 0x9a, 0x27, 0x8b, 0x49, 0x1e, 0xd5, 0xb9, 0x48, 0x8c, 0xdf, 0xff, 0x5e, 0xa4, 0x8d,
0xbf, 0x8a, 0xee, 0x79, 0x3a, 0x2d, 0x2e, 0x83, 0x7a, 0x9f, 0x5f, 0xd1, 0x95, 0x83, 0x3c, 0x10,
0x4d, 0xa3, 0x2c, 0x3a, 0x13, 0x63, 0xac, 0x84, 0x6d, 0x2a, 0x59, 0xff, 0xca, 0x0c, 0x3b, 0x12,
0x93, 0x41, 0x50, 0x69, 0xdb, 0x5e, 0x45, 0x9e, 0xdf, 0x60, 0xd7, 0x04, 0xde, 0x47, 0x13, 0x8c,
0x31, 0x5d, 0xf3, 0xa8, 0x44, 0x0b, 0x37, 0x8e, 0xe8, 0x8e, 0x1c, 0xdb, 0x88, 0x89, 0xb0, 0x8e,
0x0c, 0xbe, 0xb4, 0xed, 0x98, 0x31, 0x1e, 0x52, 0x18, 0x36, 0x95, 0x35, 0xe0, 0x30, 0x62, 0x50,
0x7d, 0x7c, 0x1d, 0x13, 0xb5, 0x22, 0xe3, 0xee, 0xc0, 0x20, 0xff, 0xd4, 0xcb, 0x1b, 0x22, 0x97,
0x76, 0x0a, 0xdb, 0x4e, 0xf7, 0xc7, 0x6a, 0x5f, 0xd2, 0xe7, 0x8a, 0x60, 0xbe, 0xe3, 0xcf, 0x24,
0x6f, 0x24, 0x8f, 0xad, 0x7f, 0xe6, 0xfa, 0x8e, 0x9c, 0x65, 0xb5, 0x25, 0x15, 0xa7, 0xce, 0x73,
0xc4, 0x7c, 0x20, 0xc0, 0x4c, 0x32, 0xf3, 0x77, 0xe1, 0xd0, 0xdd, 0xc2, 0x0e, 0x7e, 0x96, 0xf7,
0xfe, 0xa5, 0x5f, 0xd8, 0x5d, 0x84, 0x56, 0x84, 0x9f, 0xfe, 0x4c, 0xc3, 0xc6, 0xa0, 0x3c, 0x5b,
0x9f, 0x21, 0xd0, 0x55, 0xe4, 0xd4, 0x98, 0x93, 0x4b, 0xef, 0xf1, 0x4d, 0xee, 0xc1, 0xe7, 0x7f,
0x85, 0x70, 0x04, 0xd9, 0x29, 0x40, 0x9e, 0x23, 0xe5, 0x4e, 0xb1, 0x9e, 0x72, 0xa7, 0x33, 0xa3,
0xfb, 0x3a, 0xbd, 0x03, 0x5b, 0x72, 0xa4, 0xa4, 0xc2, 0x07, 0x68, 0x74, 0x06, 0x1b, 0xaa, 0x55,
0x26, 0xe8, 0x55, 0xbe, 0x24, 0xb4, 0x13, 0x75, 0x8c, 0xdc, 0xbe, 0x11, 0x50, 0xbc, 0x91, 0x65,
0x14, 0x25, 0x4e, 0xcb, 0x95, 0x84, 0x8f, 0xc7, 0x17, 0x71, 0x82, 0x65, 0xa6, 0x90, 0x19, 0x66,
0xf2, 0x2c, 0x33, 0xdd, 0x6a, 0xe4, 0x8f, 0xf9, 0xcb, 0x57, 0x31, 0x44, 0x6a, 0xdd, 0xb3, 0xff,
0x2e, 0xa1, 0x7b, 0x1c, 0x35, 0x86, 0xe5, 0x2a, 0xfa, 0x23, 0xbb, 0x44, 0xea, 0x6c, 0x2b, 0xec,
0x06, 0x2c, 0x59, 0xad, 0xcb, 0x79, 0x17, 0x36, 0xaa, 0x2d, 0xa9, 0x5e, 0xb8, 0x44, 0x5a, 0x63,
0x81, 0xf3, 0x94, 0x19, 0x17, 0xbe, 0xd7, 0xfc, 0xf0, 0x1a, 0xb1, 0x99, 0x22, 0x8e, 0xad, 0xd1,
0x96, 0x88, 0x47, 0xe4, 0xb9, 0xa4, 0x00, 0x22, 0xd2, 0xb0, 0xec, 0x68, 0x31, 0x8a, 0xbf, 0x97,
0xc6, 0xd4, 0x62, 0x86, 0xa5,
};

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -29,11 +29,9 @@
#include "fpi-byte-reader.h"
#include "fpi-byte-utils.h"
#include "validity_db.h"
#include "validity_hal.h"
#include "vcsfw_protocol.h"
/* Include the db_write_enable blob for 009a */
#include "validity_blob_dbe_009a.inc"
/* ================================================================
* Structure cleanup helpers
* ================================================================ */
@ -780,8 +778,16 @@ validity_db_build_finger_data (guint16 subtype,
* ================================================================ */
const guint8 *
validity_db_get_write_enable_blob (gsize *out_len)
validity_db_get_write_enable_blob (guint dev_type, gsize *out_len)
{
*out_len = sizeof (db_write_enable_009a);
return db_write_enable_009a;
const ValidityDeviceDesc *desc = validity_hal_device_lookup (dev_type);
if (!desc || !desc->db_write_enable || desc->db_write_enable_len == 0)
{
*out_len = 0;
return NULL;
}
*out_len = desc->db_write_enable_len;
return desc->db_write_enable;
}

View file

@ -300,4 +300,4 @@ guint8 *validity_db_build_cmd_match_cleanup (gsize *out_len);
* db_write_enable blob access
* ================================================================ */
const guint8 *validity_db_get_write_enable_blob (gsize *out_len);
const guint8 *validity_db_get_write_enable_blob (guint dev_type, gsize *out_len);

View file

@ -354,7 +354,7 @@ enroll_run_state (FpiSsm *ssm,
{
/* Send db_write_enable blob before enrollment_update */
gsize blob_len;
const guint8 *blob = validity_db_get_write_enable_blob (&blob_len);
const guint8 *blob = validity_db_get_write_enable_blob (self->dev_type, &blob_len);
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
}
break;
@ -504,7 +504,7 @@ enroll_run_state (FpiSsm *ssm,
{
/* Enable DB writes for storing the finger record */
gsize blob_len;
const guint8 *blob = validity_db_get_write_enable_blob (&blob_len);
const guint8 *blob = validity_db_get_write_enable_blob (self->dev_type, &blob_len);
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
}
break;

View file

@ -24,6 +24,7 @@
#include "fpi-byte-utils.h"
#include "validity.h"
#include "validity_fwext.h"
#include "validity_hal.h"
#include "vcsfw_protocol.h"
#include <gio/gio.h>
@ -59,12 +60,7 @@ static const gchar *firmware_search_paths[] = {
NULL,
};
/* ---- db_write_enable blob for 06cb:009a (3621 bytes) ----
* Opaque encrypted blob sent before each flash write.
* The sensor firmware decrypts this internally.
* Extracted from python-validity blobs_9a.py.
* TODO: Iteration 6 (HAL) will consolidate blobs for all PIDs. */
#include "validity_blob_dbe_009a.inc"
/* db_write_enable blobs now live in HAL (validity_hal.c) */
/* ================================================================
* Firmware info parsing
@ -336,16 +332,16 @@ validity_fwext_get_db_write_enable (guint16 vid,
guint16 pid,
gsize *len)
{
/* Currently only 06cb:009a is supported.
* Iteration 6 (HAL) will add blobs for all PIDs. */
if (vid == 0x06cb && pid == 0x009a)
const ValidityDeviceDesc *desc = validity_hal_device_lookup_by_pid (vid, pid);
if (!desc || !desc->db_write_enable || desc->db_write_enable_len == 0)
{
*len = sizeof (db_write_enable_009a);
return db_write_enable_009a;
*len = 0;
return NULL;
}
*len = 0;
return NULL;
*len = desc->db_write_enable_len;
return desc->db_write_enable;
}
/* ================================================================

View file

@ -0,0 +1,171 @@
/*
* Hardware Abstraction Layer for Validity/Synaptics VCSFW fingerprint sensors
*
* Per-device blob data, flash partition layouts, and pairing constants.
*
* Copyright (C) 2024 libfprint contributors
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define FP_COMPONENT "validity"
#include "validity_hal.h"
#include "fpi-log.h"
/* ================================================================
* Include auto-generated blob data for each PID
* ================================================================ */
#include "validity_blobs_0090.inc"
#include "validity_blobs_0097.inc"
#include "validity_blobs_009a.inc"
#include "validity_blobs_009d.inc"
/* ================================================================
* Include pairing constants (partition signatures, CA cert, keys)
* ================================================================ */
#include "validity_pair_constants.inc"
/* ================================================================
* Flash partition layouts
*
* Standard layout: used by PID 0097, 009a, 009d
* Partition 4 (template DB) = 0x80000 bytes
*
* PID 0090 layout: smaller DB partition
* Partition 4 (template DB) = 0x30000 bytes
* ================================================================ */
/* Standard partition table (0097, 009a, 009d) */
static const ValidityPartition flash_partitions_standard[] = {
{ .id = 1, .type = 4, .access_lvl = 7, .offset = 0x00001000, .size = 0x00001000 }, /* cert store */
{ .id = 2, .type = 1, .access_lvl = 2, .offset = 0x00002000, .size = 0x0003e000 }, /* xpfwext */
{ .id = 5, .type = 5, .access_lvl = 3, .offset = 0x00040000, .size = 0x00008000 }, /* reserved */
{ .id = 6, .type = 6, .access_lvl = 3, .offset = 0x00048000, .size = 0x00008000 }, /* calibration */
{ .id = 4, .type = 3, .access_lvl = 5, .offset = 0x00050000, .size = 0x00080000 }, /* template DB */
};
/* PID 0090 partition table (smaller DB) */
static const ValidityPartition flash_partitions_0090[] = {
{ .id = 1, .type = 4, .access_lvl = 7, .offset = 0x00001000, .size = 0x00001000 }, /* cert store */
{ .id = 2, .type = 1, .access_lvl = 2, .offset = 0x00002000, .size = 0x0003e000 }, /* xpfwext */
{ .id = 5, .type = 5, .access_lvl = 3, .offset = 0x00040000, .size = 0x00008000 }, /* reserved */
{ .id = 6, .type = 6, .access_lvl = 3, .offset = 0x00048000, .size = 0x00008000 }, /* calibration */
{ .id = 4, .type = 3, .access_lvl = 5, .offset = 0x00050000, .size = 0x00030000 }, /* template DB */
};
/* Layout descriptors */
static const ValidityFlashLayout flash_layout_standard = {
.partitions = flash_partitions_standard,
.num_partitions = G_N_ELEMENTS (flash_partitions_standard),
.partition_sig = partition_sig_standard,
.partition_sig_len = sizeof (partition_sig_standard),
};
static const ValidityFlashLayout flash_layout_0090 = {
.partitions = flash_partitions_0090,
.num_partitions = G_N_ELEMENTS (flash_partitions_0090),
.partition_sig = partition_sig_0090,
.partition_sig_len = sizeof (partition_sig_0090),
};
/* ================================================================
* Per-device descriptors
* ================================================================ */
static const ValidityDeviceDesc device_table[] = {
[VALIDITY_HAL_DEV_90] = {
.vid = 0x138a,
.pid = 0x0090,
.init_hardcoded = init_hardcoded_0090,
.init_hardcoded_len = sizeof (init_hardcoded_0090),
.init_clean_slate = NULL, /* not available for this PID */
.init_clean_slate_len = 0,
.reset_blob = reset_blob_0090,
.reset_blob_len = sizeof (reset_blob_0090),
.db_write_enable = db_write_enable_0090,
.db_write_enable_len = sizeof (db_write_enable_0090),
.flash_layout = &flash_layout_0090,
},
[VALIDITY_HAL_DEV_97] = {
.vid = 0x138a,
.pid = 0x0097,
.init_hardcoded = init_hardcoded_0097,
.init_hardcoded_len = sizeof (init_hardcoded_0097),
.init_clean_slate = init_hardcoded_clean_slate_0097,
.init_clean_slate_len = sizeof (init_hardcoded_clean_slate_0097),
.reset_blob = reset_blob_0097,
.reset_blob_len = sizeof (reset_blob_0097),
.db_write_enable = db_write_enable_0097,
.db_write_enable_len = sizeof (db_write_enable_0097),
.flash_layout = &flash_layout_standard,
},
[VALIDITY_HAL_DEV_9A] = {
.vid = 0x06cb,
.pid = 0x009a,
.init_hardcoded = init_hardcoded_009a,
.init_hardcoded_len = sizeof (init_hardcoded_009a),
.init_clean_slate = init_hardcoded_clean_slate_009a,
.init_clean_slate_len = sizeof (init_hardcoded_clean_slate_009a),
.reset_blob = reset_blob_009a,
.reset_blob_len = sizeof (reset_blob_009a),
.db_write_enable = db_write_enable_009a,
.db_write_enable_len = sizeof (db_write_enable_009a),
.flash_layout = &flash_layout_standard,
},
[VALIDITY_HAL_DEV_9D] = {
.vid = 0x138a,
.pid = 0x009d,
.init_hardcoded = init_hardcoded_009d,
.init_hardcoded_len = sizeof (init_hardcoded_009d),
.init_clean_slate = init_hardcoded_clean_slate_009d,
.init_clean_slate_len = sizeof (init_hardcoded_clean_slate_009d),
.reset_blob = reset_blob_009d,
.reset_blob_len = sizeof (reset_blob_009d),
.db_write_enable = db_write_enable_009d,
.db_write_enable_len = sizeof (db_write_enable_009d),
.flash_layout = &flash_layout_standard,
},
};
/* ================================================================
* Lookup functions
* ================================================================ */
const ValidityDeviceDesc *
validity_hal_device_lookup (guint dev_type)
{
if (dev_type >= G_N_ELEMENTS (device_table))
return NULL;
return &device_table[dev_type];
}
const ValidityDeviceDesc *
validity_hal_device_lookup_by_pid (guint16 vid, guint16 pid)
{
for (gsize i = 0; i < G_N_ELEMENTS (device_table); i++)
{
if (device_table[i].vid == vid && device_table[i].pid == pid)
return &device_table[i];
}
return NULL;
}

View file

@ -0,0 +1,95 @@
/*
* Hardware Abstraction Layer for Validity/Synaptics VCSFW fingerprint sensors
*
* Per-device blob data, flash partition layouts, and pairing constants.
*
* Copyright (C) 2024 libfprint contributors
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include <glib.h>
/* Forward declaration from validity.h */
typedef enum {
VALIDITY_HAL_DEV_90 = 0,
VALIDITY_HAL_DEV_97,
VALIDITY_HAL_DEV_9A,
VALIDITY_HAL_DEV_9D,
} ValidityHalDeviceType;
/* Flash partition entry — matches python-validity PartitionInfo:
* id, type, access_lvl, offset, size */
typedef struct
{
guint8 id;
guint8 type;
guint16 access_lvl;
guint32 offset;
guint32 size;
} ValidityPartition;
/* Per-device flash layout with partition table and RSA signature */
typedef struct
{
const ValidityPartition *partitions;
gsize num_partitions;
const guint8 *partition_sig;
gsize partition_sig_len;
} ValidityFlashLayout;
/* Per-device encrypted blobs and flash layout.
* Some blobs may be NULL/0 if not available for the device. */
typedef struct
{
guint16 vid;
guint16 pid;
/* init_hardcoded — sent during USB init (cmd prefix) */
const guint8 *init_hardcoded;
gsize init_hardcoded_len;
/* init_hardcoded_clean_slate — clean calibration variant */
const guint8 *init_clean_slate;
gsize init_clean_slate_len;
/* reset_blob — sent before pairing to reset device state */
const guint8 *reset_blob;
gsize reset_blob_len;
/* db_write_enable — sent before database writes */
const guint8 *db_write_enable;
gsize db_write_enable_len;
/* Flash partition layout for this device variant */
const ValidityFlashLayout *flash_layout;
} ValidityDeviceDesc;
/* Number of flash partition entries in the standard layout */
#define VALIDITY_FLASH_NUM_PARTITIONS 5
/* Partition signature size (RSA-2048) */
#define VALIDITY_PARTITION_SIG_SIZE 256
/* Look up device descriptor by ValidityDeviceType enum.
* Returns NULL if dev_type is out of range. */
const ValidityDeviceDesc *validity_hal_device_lookup (guint dev_type);
/* Look up device descriptor by USB VID/PID.
* Returns NULL if no matching entry. */
const ValidityDeviceDesc *validity_hal_device_lookup_by_pid (guint16 vid,
guint16 pid);

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,314 @@
/*
* Device pairing for Validity/Synaptics VCSFW fingerprint sensors
*
* Handles pairing of uninitialized devices: flash partitioning,
* ECDH key exchange, certificate creation, and TLS flash persistence.
*
* Copyright (C) 2024 libfprint contributors
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include <glib.h>
#include <openssl/evp.h>
#include "validity_hal.h"
/* Forward declaration */
typedef struct _FpiDeviceValidity FpiDeviceValidity;
typedef struct _FpiSsm FpiSsm;
/* Flash IC parameters — returned by CMD 0x3e (GET_FLASH_INFO) */
typedef struct
{
guint32 size;
guint32 sector_size;
guint8 sector_erase_cmd;
} ValidityFlashIcParams;
/* Pairing state kept across SSM states */
typedef struct
{
/* Flash IC params from CMD 0x3e */
ValidityFlashIcParams flash_ic;
guint16 num_partitions; /* 0 = needs pairing */
/* ECDH client key pair (generated during pairing) */
EVP_PKEY *client_key;
/* Server certificate returned by partition_flash (CMD 0x4f) */
guint8 *server_cert;
gsize server_cert_len;
/* ECDH blob from CMD 0x50 (server's DH params) */
guint8 *ecdh_blob;
gsize ecdh_blob_len;
/* Encrypted private key blob (client → flash) */
guint8 *priv_blob;
gsize priv_blob_len;
/* Device descriptor for this PID */
const ValidityDeviceDesc *dev_desc;
/* Flash erase progress counter */
guint erase_step;
} ValidityPairState;
/* Partition entry serialized format: 12 bytes data + 4 zero + 32 SHA-256 = 48 */
#define VALIDITY_PARTITION_ENTRY_SIZE 48
/* Client certificate size */
#define VALIDITY_CLIENT_CERT_SIZE 444
/* CMD 0x4f header IDs */
#define VALIDITY_HDR_FLASH_IC 0
#define VALIDITY_HDR_PARTITION_TABLE 1
#define VALIDITY_HDR_CA_CERT 3
#define VALIDITY_HDR_CLIENT_CERT 5
/* Encrypted private key format: 0x02 prefix + IV(16) + ciphertext(112) + HMAC(32) = 161 */
#define VALIDITY_ENCRYPTED_KEY_PREFIX 0x02
#define VALIDITY_ENCRYPTED_KEY_IV_SIZE 16
#define VALIDITY_EC_COORD_SIZE 32
/* Flash partition IDs for erase during pairing */
static const guint8 pair_erase_partition_ids[] = { 1, 2, 5, 6, 4 };
#define VALIDITY_PAIR_NUM_ERASE_STEPS G_N_ELEMENTS (pair_erase_partition_ids)
/* ---- Helper functions (testable independently) ---- */
/**
* validity_pair_serialize_partition:
* @part: partition entry to serialize
* @out: output buffer (must be at least VALIDITY_PARTITION_ENTRY_SIZE bytes)
*
* Serialize a partition entry to binary format:
* [id:1][type:1][access_lvl:2LE][offset:4LE][size:4LE][zeros:4][SHA256:32]
*/
void validity_pair_serialize_partition (const ValidityPartition *part,
guint8 *out);
/**
* validity_pair_build_partition_flash_cmd:
* @flash_ic: flash IC parameters from CMD 0x3e
* @layout: flash layout for this device
* @client_public_x: ECDH client public key X coordinate (32 bytes, little-endian)
* @client_public_y: ECDH client public key Y coordinate (32 bytes, little-endian)
* @out_len: output command length
*
* Build the CMD 0x4f (PARTITION_FLASH) payload:
* [4f 0000 0000]
* [hdr0: flash IC params]
* [hdr1: partition table + RSA signature]
* [hdr5: client certificate (444 bytes)]
* [hdr3: CA certificate]
*
* Returns: newly allocated command buffer, free with g_free().
*/
guint8 *validity_pair_build_partition_flash_cmd (const ValidityFlashIcParams *flash_ic,
const ValidityFlashLayout *layout,
const guint8 *client_public_x,
const guint8 *client_public_y,
gsize *out_len);
/**
* validity_pair_make_cert:
* @client_public_x: ECDH client public key X (32 bytes, little-endian)
* @client_public_y: ECDH client public key Y (32 bytes, little-endian)
* @out_len: set to VALIDITY_CLIENT_CERT_SIZE on success
*
* Build a 444-byte client certificate with ECDSA signature.
* The HS key is derived from the hardcoded password.
*
* Returns: newly allocated cert buffer, or NULL on error. Free with g_free().
*/
guint8 *validity_pair_make_cert (const guint8 *client_public_x,
const guint8 *client_public_y,
gsize *out_len);
/**
* validity_pair_encrypt_key:
* @client_private: ECDH client private key scalar (32 bytes, little-endian)
* @client_public_x: ECDH client public key X (32 bytes, little-endian)
* @client_public_y: ECDH client public key Y (32 bytes, little-endian)
* @psk_encryption_key: PSK encryption key (32 bytes)
* @psk_validation_key: PSK validation key (32 bytes)
* @out_len: output blob length
*
* Encrypt the ECDH private key for flash storage:
* plaintext = x(32) + y(32) + d(32) + PKCS7 padding
* ciphertext = AES-256-CBC(psk_encryption_key, random_iv, plaintext)
* blob = 0x02 + iv(16) + ciphertext + HMAC-SHA256(psk_validation_key, iv+ciphertext)
*
* Returns: newly allocated blob, or NULL on error. Free with g_free().
*/
guint8 *validity_pair_encrypt_key (const guint8 *client_private,
const guint8 *client_public_x,
const guint8 *client_public_y,
const guint8 *psk_encryption_key,
const guint8 *psk_validation_key,
gsize *out_len);
/**
* validity_pair_parse_flash_info:
* @data: response payload from CMD 0x3e (after 2-byte status)
* @data_len: length of payload
* @ic_out: output flash IC params
* @num_partitions_out: output number of existing partitions
*
* Parse GET_FLASH_INFO (CMD 0x3e) response.
* If num_partitions_out is 0, device needs pairing.
*
* Returns: TRUE on success, FALSE on parse error.
*/
gboolean validity_pair_parse_flash_info (const guint8 *data,
gsize data_len,
ValidityFlashIcParams *ic_out,
guint16 *num_partitions_out);
/**
* validity_pair_state_init:
* @state: pairing state to initialize
*
* Zero-initialize the pairing state.
*/
void validity_pair_state_init (ValidityPairState *state);
/**
* validity_pair_state_free:
* @state: pairing state to free
*
* Free any allocated resources in the pairing state.
*/
void validity_pair_state_free (ValidityPairState *state);
/* ================================================================
* Pairing SSM
*
* The pairing SSM runs when an uninitialized device is detected
* (CMD 0x3e returns 0 partitions). It formats the flash, exchanges
* ECDH keys, establishes a TLS session, persists the TLS keys to
* flash, and reboots the device.
*
* Phase 1 (pre-TLS, raw USB):
* - GET_FLASH_INFO check if pairing needed
* - SEND_RESET_BLOB reset device state
* - GENERATE_KEYS ECDH key generation
* - PARTITION_FLASH format flash + write certs (CMD 0x4f)
* - RECV_PARTITION parse server cert from response
* - CMD50_SEND request ECDH server params
* - CMD50_RECV parse ECDH blob + encrypt private key
* - CLEANUPS_SEND call cleanups (0x1a) after CMD 0x50
* - CLEANUPS_RECV receive cleanups response
*
* Phase 2 (TLS):
* - TLS_HANDSHAKE establish TLS session
* - ERASE_DBE_SEND send db_write_enable before erase
* - ERASE_DBE_RECV receive dbe response
* - ERASE_SEND erase partition (CMD 0x3f)
* - ERASE_RECV receive erase response
* - ERASE_CLEAN_SEND call cleanups after erase
* - ERASE_CLEAN_RECV receive cleanups response
* - ERASE_LOOP loop over 5 partitions
* - WRITE_DBE_SEND send db_write_enable before write
* - WRITE_DBE_RECV receive dbe response
* - WRITE_FLASH_SEND write TLS flash (CMD 0x41)
* - WRITE_FLASH_RECV receive write response
* - WRITE_CLEAN_SEND call cleanups after write
* - WRITE_CLEAN_RECV receive cleanups response
* - REBOOT_SEND reboot device (0x05 0x02 0x00)
* - REBOOT_RECV receive reboot response
* - DONE pairing complete
* ================================================================ */
typedef enum {
PAIR_GET_FLASH_INFO = 0,
PAIR_GET_FLASH_INFO_RECV,
PAIR_CHECK_NEEDED,
PAIR_SEND_RESET_BLOB,
PAIR_SEND_RESET_BLOB_RECV,
PAIR_GENERATE_KEYS,
PAIR_PARTITION_FLASH_SEND,
PAIR_PARTITION_FLASH_RECV,
PAIR_CMD50_SEND,
PAIR_CMD50_RECV,
PAIR_CMD50_PROCESS,
PAIR_CLEANUPS_SEND,
PAIR_CLEANUPS_RECV,
PAIR_TLS_HANDSHAKE,
PAIR_ERASE_DBE_SEND,
PAIR_ERASE_DBE_RECV,
PAIR_ERASE_SEND,
PAIR_ERASE_RECV,
PAIR_ERASE_CLEAN_SEND,
PAIR_ERASE_CLEAN_RECV,
PAIR_ERASE_LOOP,
PAIR_WRITE_DBE_SEND,
PAIR_WRITE_DBE_RECV,
PAIR_WRITE_FLASH_SEND,
PAIR_WRITE_FLASH_RECV,
PAIR_WRITE_CLEAN_SEND,
PAIR_WRITE_CLEAN_RECV,
PAIR_REBOOT_SEND,
PAIR_REBOOT_RECV,
PAIR_DONE,
PAIR_NUM_STATES,
} ValidityPairSsmState;
/* CMD 0x1a (cleanups/commit) */
#define VCSFW_CMD_CLEANUPS 0x1a
/* CMD 0x50 (get ECDH server params after partition_flash) */
#define VCSFW_CMD_GET_ECDH 0x50
/* Reboot: 0x05 0x02 0x00 */
#define VCSFW_CMD_REBOOT 0x05
/**
* validity_pair_ssm_new:
* @dev: the FpDevice
*
* Create a new pairing SSM. The caller must set up
* self->pair_state.dev_desc before starting the SSM.
*
* Returns: a new FpiSsm.
*/
FpiSsm *validity_pair_ssm_new (FpDevice *dev);
/**
* validity_pair_run_state:
* @ssm: the pairing SSM
* @dev: the FpDevice
*
* State machine runner for the pairing SSM.
*/
void validity_pair_run_state (FpiSsm *ssm,
FpDevice *dev);
/**
* validity_pair_build_tls_flash:
* @state: pairing state (must have priv_blob, server_cert, ecdh_blob set)
* @out_len: output data length (always 0x1000 = 4096)
*
* Build the TLS flash image for persistence. Format matches
* python-validity make_tls_flash(): a sequence of flash blocks
* zero-padded to 4096 bytes.
*
* Returns: newly allocated 4096-byte buffer. Free with g_free().
*/
guint8 *validity_pair_build_tls_flash (const ValidityPairState *state,
gsize *out_len);

View file

@ -0,0 +1,75 @@
/* Hardcoded pairing constants from python-validity
* Auto-generated from init_flash.py and tls.py
* DO NOT EDIT regenerate with scripts/blob_extract/extract_constants.py
*/
/* partition_signature: 256 bytes */
static const guint8 partition_sig_standard[] = {
0x1d, 0xb0, 0x2a, 0x88, 0x6b, 0x00, 0x7e, 0x2b, 0x47, 0x26, 0x3b, 0xb8, 0xfe, 0x30, 0xbd, 0x64,
0xa1, 0xf5, 0x8b, 0xea, 0x7b, 0x25, 0xf1, 0xe1, 0xba, 0x9a, 0xe0, 0x9a, 0xdd, 0x7e, 0xcf, 0xf3,
0x63, 0x33, 0xf8, 0x19, 0x83, 0x39, 0xcd, 0xd7, 0x13, 0xf0, 0x43, 0x63, 0x37, 0x10, 0xa1, 0x7b,
0xc7, 0xb3, 0xf4, 0x18, 0xf1, 0xd8, 0xff, 0x43, 0x5a, 0x1b, 0xf4, 0x7f, 0x06, 0x5d, 0xff, 0xca,
0x72, 0x71, 0x09, 0x15, 0x22, 0x17, 0xfc, 0xe7, 0x3b, 0xf2, 0xbf, 0x8e, 0x01, 0xa1, 0x64, 0x1f,
0x6a, 0x24, 0xb0, 0xc4, 0x92, 0xa6, 0xa3, 0xf1, 0x01, 0x14, 0x05, 0x72, 0x75, 0x84, 0x68, 0x42,
0xb1, 0xc8, 0xb6, 0x6b, 0xd6, 0x70, 0x07, 0x38, 0x52, 0x4d, 0x44, 0x71, 0xbc, 0xa3, 0x31, 0x5b,
0xa2, 0x3b, 0xb8, 0x32, 0x74, 0x32, 0x20, 0xad, 0x19, 0x5b, 0x60, 0x55, 0x8a, 0xa7, 0x9a, 0x3e,
0xde, 0xb2, 0x60, 0x48, 0x34, 0xe2, 0xbb, 0x62, 0xe8, 0x90, 0xb0, 0xce, 0x40, 0x5b, 0x3b, 0x8e,
0xf2, 0xfe, 0xc2, 0xaa, 0xb3, 0xe2, 0x2b, 0xff, 0x23, 0xf8, 0x9a, 0x58, 0xff, 0x0d, 0xc0, 0x15,
0xfe, 0xce, 0x5d, 0x3e, 0xd3, 0xf5, 0x49, 0x6a, 0xce, 0x87, 0x9a, 0x92, 0x98, 0x0a, 0xec, 0x9d,
0x85, 0xeb, 0x7e, 0x9d, 0xf2, 0x45, 0xea, 0xe0, 0x3a, 0x41, 0xac, 0xfd, 0x4e, 0x7d, 0x1c, 0xb1,
0xdb, 0xd0, 0xdf, 0x42, 0xd5, 0x34, 0x90, 0x4d, 0xe0, 0x0b, 0x63, 0x89, 0xf6, 0x88, 0x67, 0x64,
0x6e, 0x9d, 0x7c, 0x3d, 0x0b, 0x1d, 0xff, 0xd7, 0x40, 0x70, 0xb2, 0xd0, 0xf2, 0x04, 0x9b, 0x9f,
0x1d, 0xc7, 0xb0, 0xc9, 0x65, 0x1c, 0x59, 0xbe, 0x3e, 0xa8, 0x91, 0x67, 0x47, 0x25, 0xe1, 0xf2,
0xf7, 0xa4, 0x84, 0xa9, 0x41, 0x61, 0x5b, 0x80, 0x21, 0x11, 0x05, 0x97, 0x83, 0x69, 0xcf, 0x71,
};
/* partition_signature_0090: 256 bytes */
static const guint8 partition_sig_0090[] = {
0xe4, 0x4f, 0x7a, 0x80, 0xd6, 0x13, 0x77, 0x94, 0xd3, 0x30, 0xb5, 0xd0, 0x26, 0xc3, 0x28, 0xa7,
0x3c, 0x90, 0x7f, 0x3f, 0x65, 0x3d, 0x41, 0x12, 0x55, 0xb7, 0xc2, 0xf8, 0xb4, 0x25, 0xd8, 0x70,
0xa8, 0xa5, 0x3c, 0x66, 0x30, 0xca, 0x86, 0x4b, 0x84, 0x59, 0x0e, 0x3c, 0x67, 0x86, 0xf0, 0xd6,
0x9b, 0xe4, 0xbb, 0xab, 0x57, 0x36, 0x38, 0x8f, 0x85, 0x27, 0x23, 0x7a, 0x0a, 0x86, 0xbb, 0xce,
0x7c, 0xed, 0x94, 0x50, 0xc4, 0x96, 0x47, 0x09, 0xe8, 0x9a, 0xc5, 0x35, 0xaa, 0x00, 0x78, 0x71,
0x58, 0xe0, 0xa8, 0xd9, 0xb1, 0xfb, 0x75, 0xf0, 0xf7, 0xae, 0x53, 0xd4, 0xbd, 0x11, 0xab, 0xfc,
0xf5, 0xee, 0x67, 0xa5, 0xa7, 0x1e, 0x24, 0x8a, 0x42, 0x6b, 0x3a, 0xff, 0x45, 0x67, 0x04, 0x8f,
0xa9, 0x3d, 0xe6, 0x59, 0x39, 0xcc, 0xfb, 0xe3, 0xf3, 0x11, 0x49, 0xa8, 0x2c, 0x64, 0xfb, 0xfd,
0x6a, 0x2a, 0x6c, 0xf7, 0x48, 0xe1, 0xd9, 0xbd, 0x85, 0x62, 0xcf, 0x39, 0xb1, 0xa4, 0xb3, 0x07,
0xb3, 0x7b, 0xe2, 0x23, 0x31, 0x7b, 0x1b, 0x81, 0x7e, 0x36, 0x4f, 0x28, 0x77, 0xd2, 0x9d, 0x12,
0x37, 0x31, 0x31, 0x4a, 0xa6, 0x27, 0xcb, 0xf2, 0x34, 0xe0, 0xea, 0x69, 0xa4, 0x06, 0xa4, 0x73,
0x5a, 0x03, 0xa4, 0x54, 0x95, 0x02, 0x3e, 0xf7, 0x06, 0xbd, 0xb5, 0x42, 0xc9, 0x49, 0xd2, 0x43,
0xac, 0x2c, 0x08, 0xc0, 0x0a, 0xbf, 0x43, 0xfa, 0xa5, 0x52, 0x8a, 0x0a, 0x8e, 0x49, 0xb0, 0x2c,
0x50, 0x7b, 0x01, 0xb6, 0xf1, 0xc9, 0xab, 0xff, 0xc6, 0x69, 0xd8, 0xc8, 0x4d, 0x7e, 0x4a, 0x71,
0x4d, 0xa3, 0x2a, 0xad, 0xe7, 0x92, 0x8e, 0xca, 0x96, 0x98, 0xb8, 0x2b, 0xee, 0x6b, 0x72, 0xc6,
0x42, 0xc9, 0xad, 0xd8, 0x0b, 0xbd, 0x7c, 0xcc, 0x41, 0x21, 0xb8, 0x02, 0x20, 0xd5, 0x2b, 0x8a,
};
/* CA certificate: 420 bytes */
static const guint8 ca_cert_hardcoded[] = {
0x17, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4b, 0x60, 0xd2, 0x27, 0x3e, 0x3c, 0xce, 0x3b, 0xf6, 0xb0, 0x53, 0xcc, 0xb0, 0x06, 0x1d, 0x65,
0xbc, 0x86, 0x98, 0x76, 0x55, 0xbd, 0xeb, 0xb3, 0xe7, 0x93, 0x3a, 0xaa, 0xd8, 0x35, 0xc6, 0x5a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x96, 0xc2, 0x98, 0xd8, 0x45, 0x39, 0xa1, 0xf4, 0xa0, 0x33, 0xeb, 0x2d,
0x81, 0x7d, 0x03, 0x77, 0xf2, 0x40, 0xa4, 0x63, 0xe5, 0xe6, 0xbc, 0xf8, 0x47, 0x42, 0x2c, 0xe1,
0xf2, 0xd1, 0x17, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x51, 0xbf, 0x37, 0x68, 0x40, 0xb6, 0xcb,
0xce, 0x5e, 0x31, 0x6b, 0x57, 0x33, 0xce, 0x2b, 0x16, 0x9e, 0x0f, 0x7c, 0x4a, 0xeb, 0xe7, 0x8e,
0x9b, 0x7f, 0x1a, 0xfe, 0xe2, 0x42, 0xe3, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x25, 0x63, 0xfc,
0xc2, 0xca, 0xb9, 0xf3, 0x84, 0x9e, 0x17, 0xa7, 0xad, 0xfa, 0xe6, 0xbc, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
};

View file

@ -162,7 +162,9 @@ driver_sources = {
'drivers/validity/validity_capture.c',
'drivers/validity/validity_db.c',
'drivers/validity/validity_enroll.c',
'drivers/validity/validity_verify.c' ],
'drivers/validity/validity_verify.c',
'drivers/validity/validity_hal.c',
'drivers/validity/validity_pair.c' ],
}
helper_sources = {

View file

@ -412,6 +412,36 @@ if 'validity' in supported_drivers
suite: ['unit-tests'],
env: envs,
)
# Validity HAL unit tests
validity_hal_test = executable('test-validity-hal',
sources: 'test-validity-hal.c',
dependencies: [ libfprint_private_dep ],
c_args: common_cflags,
link_with: libfprint_drivers,
install: false,
)
test('validity-hal',
validity_hal_test,
suite: ['unit-tests'],
env: envs,
)
# Validity pairing unit tests
if openssl_dep.found()
validity_pair_test = executable('test-validity-pair',
sources: 'test-validity-pair.c',
dependencies: [ libfprint_private_dep, openssl_dep ],
c_args: common_cflags,
link_with: libfprint_drivers,
install: false,
)
test('validity-pair',
validity_pair_test,
suite: ['unit-tests'],
env: envs,
)
endif
endif
# Run udev rule generator with fatal warnings

View file

@ -15,6 +15,7 @@
#include "fpi-byte-utils.h"
#include "drivers/validity/validity_db.h"
#include "drivers/validity/validity.h"
#include "drivers/validity/vcsfw_protocol.h"
/* ================================================================
@ -567,12 +568,24 @@ static void
test_db_write_enable_blob (void)
{
gsize len;
const guint8 *blob = validity_db_get_write_enable_blob (&len);
/* Test with 009a device type (known to have a 3621-byte blob) */
const guint8 *blob = validity_db_get_write_enable_blob (VALIDITY_DEV_9A, &len);
g_assert_nonnull (blob);
g_assert_cmpuint (len, >, 0);
/* The 009a blob is 3621 bytes */
g_assert_cmpuint (len, ==, 3621);
/* Test all supported device types return valid blobs */
const guint dev_types[] = { VALIDITY_DEV_90, VALIDITY_DEV_97,
VALIDITY_DEV_9A, VALIDITY_DEV_9D };
for (guint i = 0; i < G_N_ELEMENTS (dev_types); i++)
{
gsize dbe_len;
const guint8 *dbe = validity_db_get_write_enable_blob (dev_types[i], &dbe_len);
g_assert_nonnull (dbe);
g_assert_cmpuint (dbe_len, >, 0);
}
}
/* ================================================================

251
tests/test-validity-hal.c Normal file
View file

@ -0,0 +1,251 @@
/*
* Unit tests for validity HAL (device descriptor lookup and flash layout)
*
* Copyright (C) 2024 libfprint contributors
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*/
#include <glib.h>
#include <string.h>
#include "drivers/validity/validity.h"
#include "drivers/validity/validity_hal.h"
/* ================================================================
* T7.1: HAL lookup by device type all valid types return non-NULL
* ================================================================ */
static void
test_hal_lookup_all_types (void)
{
const guint types[] = { VALIDITY_DEV_90, VALIDITY_DEV_97,
VALIDITY_DEV_9A, VALIDITY_DEV_9D };
for (guint i = 0; i < G_N_ELEMENTS (types); i++)
{
const ValidityDeviceDesc *desc = validity_hal_device_lookup (types[i]);
g_assert_nonnull (desc);
g_assert_cmpuint (desc->vid, >, 0);
g_assert_cmpuint (desc->pid, >, 0);
}
}
/* ================================================================
* T7.2: HAL lookup by PID all supported VID/PID combos
* ================================================================ */
static void
test_hal_lookup_by_pid (void)
{
/* All 4 supported devices */
struct { guint16 vid; guint16 pid; } devices[] = {
{ 0x138a, 0x0090 },
{ 0x138a, 0x0097 },
{ 0x06cb, 0x009a },
{ 0x138a, 0x009d },
};
for (guint i = 0; i < G_N_ELEMENTS (devices); i++)
{
const ValidityDeviceDesc *desc =
validity_hal_device_lookup_by_pid (devices[i].vid, devices[i].pid);
g_assert_nonnull (desc);
g_assert_cmpuint (desc->vid, ==, devices[i].vid);
g_assert_cmpuint (desc->pid, ==, devices[i].pid);
}
}
/* ================================================================
* T7.3: HAL lookup invalid type returns NULL
* ================================================================ */
static void
test_hal_lookup_invalid (void)
{
const ValidityDeviceDesc *desc = validity_hal_device_lookup (99);
g_assert_null (desc);
}
/* ================================================================
* T7.4: HAL lookup by PID unknown PID returns NULL
* ================================================================ */
static void
test_hal_lookup_by_pid_invalid (void)
{
const ValidityDeviceDesc *desc =
validity_hal_device_lookup_by_pid (0x1234, 0x5678);
g_assert_null (desc);
}
/* ================================================================
* T7.5: All devices have non-empty blobs
* ================================================================ */
static void
test_hal_blobs_present (void)
{
const guint types[] = { VALIDITY_DEV_90, VALIDITY_DEV_97,
VALIDITY_DEV_9A, VALIDITY_DEV_9D };
for (guint i = 0; i < G_N_ELEMENTS (types); i++)
{
const ValidityDeviceDesc *desc = validity_hal_device_lookup (types[i]);
g_assert_nonnull (desc);
/* init_hardcoded must be present for all */
g_assert_nonnull (desc->init_hardcoded);
g_assert_cmpuint (desc->init_hardcoded_len, >, 0);
/* reset_blob must be present for all */
g_assert_nonnull (desc->reset_blob);
g_assert_cmpuint (desc->reset_blob_len, >, 0);
/* db_write_enable must be present for all */
g_assert_nonnull (desc->db_write_enable);
g_assert_cmpuint (desc->db_write_enable_len, >, 0);
}
}
/* ================================================================
* T7.6: PID 0090 has smaller db partition and no clean_slate blob
* ================================================================ */
static void
test_hal_pid_0090_specifics (void)
{
const ValidityDeviceDesc *desc = validity_hal_device_lookup (VALIDITY_DEV_90);
g_assert_nonnull (desc);
/* 0090 has no init_hardcoded_clean_slate */
g_assert_null (desc->init_clean_slate);
g_assert_cmpuint (desc->init_clean_slate_len, ==, 0);
/* Flash layout should exist */
g_assert_nonnull (desc->flash_layout);
g_assert_cmpuint (desc->flash_layout->num_partitions, ==,
VALIDITY_FLASH_NUM_PARTITIONS);
}
/* ================================================================
* T7.7: Non-0090 devices have init_hardcoded_clean_slate
* ================================================================ */
static void
test_hal_clean_slate_present (void)
{
const guint types[] = { VALIDITY_DEV_97, VALIDITY_DEV_9A, VALIDITY_DEV_9D };
for (guint i = 0; i < G_N_ELEMENTS (types); i++)
{
const ValidityDeviceDesc *desc = validity_hal_device_lookup (types[i]);
g_assert_nonnull (desc);
g_assert_nonnull (desc->init_clean_slate);
g_assert_cmpuint (desc->init_clean_slate_len, >, 0);
}
}
/* ================================================================
* T7.8: Flash layout has valid partition table
* ================================================================ */
static void
test_hal_flash_layout (void)
{
const guint types[] = { VALIDITY_DEV_90, VALIDITY_DEV_97,
VALIDITY_DEV_9A, VALIDITY_DEV_9D };
for (guint i = 0; i < G_N_ELEMENTS (types); i++)
{
const ValidityDeviceDesc *desc = validity_hal_device_lookup (types[i]);
g_assert_nonnull (desc);
g_assert_nonnull (desc->flash_layout);
const ValidityFlashLayout *layout = desc->flash_layout;
g_assert_cmpuint (layout->num_partitions, ==,
VALIDITY_FLASH_NUM_PARTITIONS);
/* Signature must be 256 bytes */
g_assert_nonnull (layout->partition_sig);
g_assert_cmpuint (layout->partition_sig_len, ==,
VALIDITY_PARTITION_SIG_SIZE);
/* Verify partitions are ordered and non-overlapping */
for (guint p = 0; p < layout->num_partitions; p++)
{
const ValidityPartition *part = &layout->partitions[p];
g_assert_cmpuint (part->size, >, 0);
if (p > 0)
{
const ValidityPartition *prev = &layout->partitions[p - 1];
g_assert_cmpuint (part->offset, >=,
prev->offset + prev->size);
}
}
}
}
/* ================================================================
* T7.9: Blob sizes match expected values from python-validity
* ================================================================ */
static void
test_hal_blob_sizes (void)
{
const ValidityDeviceDesc *desc_9a =
validity_hal_device_lookup (VALIDITY_DEV_9A);
g_assert_nonnull (desc_9a);
/* 009a blobs: init=581, clean_slate=741, reset=12037, dbe=3621 */
g_assert_cmpuint (desc_9a->init_hardcoded_len, ==, 581);
g_assert_cmpuint (desc_9a->init_clean_slate_len, ==, 741);
g_assert_cmpuint (desc_9a->reset_blob_len, ==, 12037);
g_assert_cmpuint (desc_9a->db_write_enable_len, ==, 3621);
const ValidityDeviceDesc *desc_90 =
validity_hal_device_lookup (VALIDITY_DEV_90);
g_assert_nonnull (desc_90);
/* 0090 blobs: init=485, no clean_slate, reset=11493, dbe=1765 */
g_assert_cmpuint (desc_90->init_hardcoded_len, ==, 485);
g_assert_cmpuint (desc_90->reset_blob_len, ==, 11493);
g_assert_cmpuint (desc_90->db_write_enable_len, ==, 1765);
}
/* ================================================================
* T7.10: Lookup consistency by-type and by-PID return same pointer
* ================================================================ */
static void
test_hal_lookup_consistency (void)
{
const ValidityDeviceDesc *by_type =
validity_hal_device_lookup (VALIDITY_DEV_9A);
const ValidityDeviceDesc *by_pid =
validity_hal_device_lookup_by_pid (0x06cb, 0x009a);
g_assert_true (by_type == by_pid);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/validity/hal/lookup-all-types",
test_hal_lookup_all_types);
g_test_add_func ("/validity/hal/lookup-by-pid",
test_hal_lookup_by_pid);
g_test_add_func ("/validity/hal/lookup-invalid",
test_hal_lookup_invalid);
g_test_add_func ("/validity/hal/lookup-by-pid-invalid",
test_hal_lookup_by_pid_invalid);
g_test_add_func ("/validity/hal/blobs-present",
test_hal_blobs_present);
g_test_add_func ("/validity/hal/pid-0090-specifics",
test_hal_pid_0090_specifics);
g_test_add_func ("/validity/hal/clean-slate-present",
test_hal_clean_slate_present);
g_test_add_func ("/validity/hal/flash-layout",
test_hal_flash_layout);
g_test_add_func ("/validity/hal/blob-sizes",
test_hal_blob_sizes);
g_test_add_func ("/validity/hal/lookup-consistency",
test_hal_lookup_consistency);
return g_test_run ();
}

497
tests/test-validity-pair.c Normal file
View file

@ -0,0 +1,497 @@
/*
* Unit tests for validity pairing helper functions
*
* Copyright (C) 2024 libfprint contributors
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*/
#include <glib.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/hmac.h>
#include <openssl/rand.h>
#include <openssl/core_names.h>
#include <openssl/param_build.h>
#include <openssl/ec.h>
#include "fpi-byte-utils.h"
#include "drivers/validity/validity.h"
#include "drivers/validity/validity_pair.h"
#include "drivers/validity/validity_hal.h"
/* ================================================================
* T7.11: parse_flash_info valid response
* ================================================================ */
static void
test_parse_flash_info_valid (void)
{
/* CMD 0x3e response format (after 2-byte status, already stripped):
* [jid0:2LE][jid1:2LE][blocks:2LE][unknown0:2LE][blocksize:2LE]
* [unknown1:2LE][pcnt:2LE] = 14 bytes minimum */
guint8 data[14];
memset (data, 0, sizeof (data));
/* jid0=0x01, jid1=0x02, blocks=0x1000, unknown0=0, blocksize=0x100,
* unknown1=0, pcnt=5 (5 partitions = device already paired) */
FP_WRITE_UINT16_LE (data + 0, 0x0001); /* jid0 */
FP_WRITE_UINT16_LE (data + 2, 0x0002); /* jid1 */
FP_WRITE_UINT16_LE (data + 4, 0x1000); /* blocks */
FP_WRITE_UINT16_LE (data + 6, 0x0000); /* unknown0 */
FP_WRITE_UINT16_LE (data + 8, 0x0100); /* blocksize */
FP_WRITE_UINT16_LE (data + 10, 0x0000); /* unknown1 */
FP_WRITE_UINT16_LE (data + 12, 5); /* pcnt = 5 */
ValidityFlashIcParams ic;
guint16 num_partitions;
gboolean ok = validity_pair_parse_flash_info (data, sizeof (data),
&ic, &num_partitions);
g_assert_true (ok);
g_assert_cmpuint (num_partitions, ==, 5);
g_assert_cmpuint (ic.size, ==, 0x1000 * 0x0100);
g_assert_cmpuint (ic.sector_size, ==, 0x1000);
g_assert_cmpuint (ic.sector_erase_cmd, ==, 0x20);
}
/* ================================================================
* T7.12: parse_flash_info zero partitions means needs pairing
* ================================================================ */
static void
test_parse_flash_info_needs_pairing (void)
{
guint8 data[14];
memset (data, 0, sizeof (data));
FP_WRITE_UINT16_LE (data + 0, 0x0001);
FP_WRITE_UINT16_LE (data + 2, 0x0002);
FP_WRITE_UINT16_LE (data + 4, 0x0800);
FP_WRITE_UINT16_LE (data + 8, 0x0200);
FP_WRITE_UINT16_LE (data + 12, 0); /* 0 partitions */
ValidityFlashIcParams ic;
guint16 num_partitions;
gboolean ok = validity_pair_parse_flash_info (data, sizeof (data),
&ic, &num_partitions);
g_assert_true (ok);
g_assert_cmpuint (num_partitions, ==, 0);
}
/* ================================================================
* T7.13: parse_flash_info too short data fails
* ================================================================ */
static void
test_parse_flash_info_too_short (void)
{
guint8 data[10]; /* less than 14 bytes */
memset (data, 0, sizeof (data));
ValidityFlashIcParams ic;
guint16 num_partitions;
gboolean ok = validity_pair_parse_flash_info (data, sizeof (data),
&ic, &num_partitions);
g_assert_false (ok);
}
/* ================================================================
* T7.14: serialize_partition known output format
* ================================================================ */
static void
test_serialize_partition (void)
{
ValidityPartition part = {
.id = 1,
.type = 3,
.access_lvl = 0x0002,
.offset = 0x1000,
.size = 0x8000,
};
guint8 out[VALIDITY_PARTITION_ENTRY_SIZE];
validity_pair_serialize_partition (&part, out);
/* Check first 12 bytes: id(1) type(1) access_lvl(2LE) offset(4LE) size(4LE) */
g_assert_cmpuint (out[0], ==, 1);
g_assert_cmpuint (out[1], ==, 3);
g_assert_cmpuint (FP_READ_UINT16_LE (out + 2), ==, 0x0002);
g_assert_cmpuint (FP_READ_UINT32_LE (out + 4), ==, 0x1000);
g_assert_cmpuint (FP_READ_UINT32_LE (out + 8), ==, 0x8000);
/* Bytes 12-15 should be zero */
for (int i = 12; i < 16; i++)
g_assert_cmpuint (out[i], ==, 0);
/* Bytes 16-47 = SHA-256 of the 12-byte entry */
g_autoptr(GChecksum) checksum = g_checksum_new (G_CHECKSUM_SHA256);
g_checksum_update (checksum, out, 12);
guint8 expected_hash[32];
gsize hash_len = 32;
g_checksum_get_digest (checksum, expected_hash, &hash_len);
g_assert_cmpmem (out + 16, 32, expected_hash, 32);
/* Total size must be VALIDITY_PARTITION_ENTRY_SIZE */
g_assert_cmpuint (sizeof (out), ==, VALIDITY_PARTITION_ENTRY_SIZE);
}
/* ================================================================
* T7.15: make_cert produces 444-byte certificate
* ================================================================ */
static void
test_make_cert_size (void)
{
guint8 pub_x[32], pub_y[32];
RAND_bytes (pub_x, 32);
RAND_bytes (pub_y, 32);
gsize cert_len;
g_autofree guint8 *cert = validity_pair_make_cert (pub_x, pub_y, &cert_len);
g_assert_nonnull (cert);
g_assert_cmpuint (cert_len, ==, VALIDITY_CLIENT_CERT_SIZE);
/* First 4 bytes should be 0x17 in LE */
g_assert_cmpuint (FP_READ_UINT32_LE (cert), ==, 0x17);
/* Bytes 4-7 should be 0x20 in LE */
g_assert_cmpuint (FP_READ_UINT32_LE (cert + 4), ==, 0x20);
}
/* ================================================================
* T7.16: make_cert deterministic for same input
* ================================================================ */
static void
test_make_cert_deterministic (void)
{
/* Using fixed keys so signature is reproducible.
* Note: ECDSA uses random k, so signatures differ but the
* structure should be consistent. Actually ECDSA is NOT deterministic
* without RFC 6979, so we can only verify structure matches. */
guint8 pub_x[32] = { 0x01 };
guint8 pub_y[32] = { 0x02 };
gsize len1, len2;
g_autofree guint8 *cert1 = validity_pair_make_cert (pub_x, pub_y, &len1);
g_autofree guint8 *cert2 = validity_pair_make_cert (pub_x, pub_y, &len2);
g_assert_nonnull (cert1);
g_assert_nonnull (cert2);
g_assert_cmpuint (len1, ==, len2);
g_assert_cmpuint (len1, ==, VALIDITY_CLIENT_CERT_SIZE);
/* Header and public key portion should be identical (first 184 bytes = cert body) */
g_assert_cmpmem (cert1, 184, cert2, 184);
}
/* ================================================================
* T7.17: encrypt_key output blob has correct structure
* ================================================================ */
static void
test_encrypt_key_structure (void)
{
guint8 priv[32], pub_x[32], pub_y[32];
guint8 enc_key[32], val_key[32];
RAND_bytes (priv, 32);
RAND_bytes (pub_x, 32);
RAND_bytes (pub_y, 32);
RAND_bytes (enc_key, 32);
RAND_bytes (val_key, 32);
gsize blob_len;
g_autofree guint8 *blob = validity_pair_encrypt_key (priv, pub_x, pub_y,
enc_key, val_key,
&blob_len);
g_assert_nonnull (blob);
/* Blob format: 0x02(1) + IV(16) + ciphertext(112) + HMAC(32) = 161 */
g_assert_cmpuint (blob_len, ==, 161);
g_assert_cmpuint (blob[0], ==, VALIDITY_ENCRYPTED_KEY_PREFIX);
}
/* ================================================================
* T7.18: encrypt_key HMAC verification
* ================================================================ */
static void
test_encrypt_key_hmac_valid (void)
{
guint8 priv[32], pub_x[32], pub_y[32];
guint8 enc_key[32], val_key[32];
RAND_bytes (priv, 32);
RAND_bytes (pub_x, 32);
RAND_bytes (pub_y, 32);
RAND_bytes (enc_key, 32);
RAND_bytes (val_key, 32);
gsize blob_len;
g_autofree guint8 *blob = validity_pair_encrypt_key (priv, pub_x, pub_y,
enc_key, val_key,
&blob_len);
g_assert_nonnull (blob);
g_assert_cmpuint (blob_len, ==, 161);
/* Blob: [0x02][iv:16][ct:112][hmac:32]
* HMAC is over iv+ct (bytes 1..128) */
const guint8 *iv_ct = blob + 1;
gsize iv_ct_len = 16 + 112;
const guint8 *stored_hmac = blob + 1 + iv_ct_len;
guint8 computed_hmac[32];
guint hmac_len = 32;
HMAC (EVP_sha256 (), val_key, 32, iv_ct, iv_ct_len,
computed_hmac, &hmac_len);
g_assert_cmpmem (stored_hmac, 32, computed_hmac, 32);
}
/* ================================================================
* T7.19: build_partition_flash_cmd valid output structure
* ================================================================ */
static void
test_build_partition_flash_cmd (void)
{
/* Use a real device descriptor for the flash layout */
const ValidityDeviceDesc *desc =
validity_hal_device_lookup (VALIDITY_DEV_9A);
g_assert_nonnull (desc);
ValidityFlashIcParams flash_ic = {
.size = 0x200000,
.sector_size = 0x1000,
.sector_erase_cmd = 0x20,
};
guint8 pub_x[32], pub_y[32];
RAND_bytes (pub_x, 32);
RAND_bytes (pub_y, 32);
gsize cmd_len;
g_autofree guint8 *cmd =
validity_pair_build_partition_flash_cmd (&flash_ic, desc->flash_layout,
pub_x, pub_y, &cmd_len);
g_assert_nonnull (cmd);
g_assert_cmpuint (cmd_len, >, 5);
/* Command prefix: 0x4f followed by 4 zero bytes */
g_assert_cmpuint (cmd[0], ==, 0x4f);
g_assert_cmpuint (cmd[1], ==, 0);
g_assert_cmpuint (cmd[2], ==, 0);
g_assert_cmpuint (cmd[3], ==, 0);
g_assert_cmpuint (cmd[4], ==, 0);
}
/* ================================================================
* T7.20: build_tls_flash produces exactly 4096 bytes
* ================================================================ */
static void
test_build_tls_flash_size (void)
{
ValidityPairState state;
validity_pair_state_init (&state);
/* Set up minimal test data */
guint8 priv_blob[100];
guint8 server_cert[200];
guint8 ecdh_blob[400];
RAND_bytes (priv_blob, sizeof (priv_blob));
RAND_bytes (server_cert, sizeof (server_cert));
RAND_bytes (ecdh_blob, sizeof (ecdh_blob));
state.priv_blob = priv_blob;
state.priv_blob_len = sizeof (priv_blob);
state.server_cert = server_cert;
state.server_cert_len = sizeof (server_cert);
state.ecdh_blob = ecdh_blob;
state.ecdh_blob_len = sizeof (ecdh_blob);
gsize flash_len;
g_autofree guint8 *flash = validity_pair_build_tls_flash (&state, &flash_len);
g_assert_nonnull (flash);
g_assert_cmpuint (flash_len, ==, 0x1000);
/* Verify padding bytes at end are 0xff */
gboolean has_ff_padding = FALSE;
for (gsize i = flash_len - 1; i > 0; i--)
{
if (flash[i] == 0xff)
{
has_ff_padding = TRUE;
break;
}
}
g_assert_true (has_ff_padding);
/* Don't free embedded pointers since they're stack-allocated */
state.priv_blob = NULL;
state.server_cert = NULL;
state.ecdh_blob = NULL;
validity_pair_state_free (&state);
}
/* ================================================================
* T7.21: build_tls_flash block structure
* ================================================================ */
static void
test_build_tls_flash_blocks (void)
{
ValidityPairState state;
validity_pair_state_init (&state);
guint8 priv_blob[50];
guint8 server_cert[100];
guint8 ecdh_blob[400];
memset (priv_blob, 0xAA, sizeof (priv_blob));
memset (server_cert, 0xBB, sizeof (server_cert));
memset (ecdh_blob, 0xCC, sizeof (ecdh_blob));
state.priv_blob = priv_blob;
state.priv_blob_len = sizeof (priv_blob);
state.server_cert = server_cert;
state.server_cert_len = sizeof (server_cert);
state.ecdh_blob = ecdh_blob;
state.ecdh_blob_len = sizeof (ecdh_blob);
gsize flash_len;
g_autofree guint8 *flash = validity_pair_build_tls_flash (&state, &flash_len);
g_assert_nonnull (flash);
/* Block 0 should be first: id=0, size=1 */
g_assert_cmpuint (FP_READ_UINT16_LE (flash), ==, 0); /* block id */
g_assert_cmpuint (FP_READ_UINT16_LE (flash + 2), ==, 1); /* size = 1 */
/* Skip 32-byte hash at flash+4 and 1-byte body at flash+36 */
/* Next block should be block 4 (priv_blob) at offset 37 */
gsize offset = 4 + 32 + 1; /* header(4) + hash(32) + body(1) */
g_assert_cmpuint (FP_READ_UINT16_LE (flash + offset), ==, 4); /* block id */
g_assert_cmpuint (FP_READ_UINT16_LE (flash + offset + 2), ==,
sizeof (priv_blob));
state.priv_blob = NULL;
state.server_cert = NULL;
state.ecdh_blob = NULL;
validity_pair_state_free (&state);
}
/* ================================================================
* T7.22: pair state init and free
* ================================================================ */
static void
test_pair_state_lifecycle (void)
{
ValidityPairState state;
validity_pair_state_init (&state);
g_assert_null (state.client_key);
g_assert_null (state.server_cert);
g_assert_null (state.ecdh_blob);
g_assert_null (state.priv_blob);
g_assert_cmpuint (state.num_partitions, ==, 0);
g_assert_cmpuint (state.erase_step, ==, 0);
/* Free should be safe on empty state */
validity_pair_state_free (&state);
}
/* ================================================================
* T7.23: pair state free with allocated resources
* ================================================================ */
static void
test_pair_state_free_with_resources (void)
{
ValidityPairState state;
validity_pair_state_init (&state);
state.server_cert = g_malloc (100);
state.server_cert_len = 100;
state.ecdh_blob = g_malloc (400);
state.ecdh_blob_len = 400;
state.priv_blob = g_malloc (161);
state.priv_blob_len = 161;
/* Generate a key to test EVP_PKEY_free path */
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id (EVP_PKEY_EC, NULL);
EVP_PKEY_keygen_init (pctx);
EVP_PKEY_CTX_set_ec_paramgen_curve_nid (pctx, NID_X9_62_prime256v1);
EVP_PKEY_keygen (pctx, &state.client_key);
EVP_PKEY_CTX_free (pctx);
g_assert_nonnull (state.client_key);
/* Free should release all resources without leak */
validity_pair_state_free (&state);
}
/* ================================================================
* T7.24: encrypt_key different inputs produce different blobs
* ================================================================ */
static void
test_encrypt_key_different_inputs (void)
{
guint8 priv1[32], priv2[32], pub_x[32], pub_y[32];
guint8 enc_key[32], val_key[32];
RAND_bytes (priv1, 32);
RAND_bytes (priv2, 32);
RAND_bytes (pub_x, 32);
RAND_bytes (pub_y, 32);
RAND_bytes (enc_key, 32);
RAND_bytes (val_key, 32);
gsize len1, len2;
g_autofree guint8 *blob1 = validity_pair_encrypt_key (priv1, pub_x, pub_y,
enc_key, val_key, &len1);
g_autofree guint8 *blob2 = validity_pair_encrypt_key (priv2, pub_x, pub_y,
enc_key, val_key, &len2);
g_assert_nonnull (blob1);
g_assert_nonnull (blob2);
g_assert_cmpuint (len1, ==, len2);
/* Different private keys should produce different ciphertexts */
g_assert_true (memcmp (blob1, blob2, len1) != 0);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/validity/pair/parse-flash-info-valid",
test_parse_flash_info_valid);
g_test_add_func ("/validity/pair/parse-flash-info-needs-pairing",
test_parse_flash_info_needs_pairing);
g_test_add_func ("/validity/pair/parse-flash-info-too-short",
test_parse_flash_info_too_short);
g_test_add_func ("/validity/pair/serialize-partition",
test_serialize_partition);
g_test_add_func ("/validity/pair/make-cert-size",
test_make_cert_size);
g_test_add_func ("/validity/pair/make-cert-deterministic",
test_make_cert_deterministic);
g_test_add_func ("/validity/pair/encrypt-key-structure",
test_encrypt_key_structure);
g_test_add_func ("/validity/pair/encrypt-key-hmac-valid",
test_encrypt_key_hmac_valid);
g_test_add_func ("/validity/pair/build-partition-flash-cmd",
test_build_partition_flash_cmd);
g_test_add_func ("/validity/pair/build-tls-flash-size",
test_build_tls_flash_size);
g_test_add_func ("/validity/pair/build-tls-flash-blocks",
test_build_tls_flash_blocks);
g_test_add_func ("/validity/pair/state-lifecycle",
test_pair_state_lifecycle);
g_test_add_func ("/validity/pair/state-free-with-resources",
test_pair_state_free_with_resources);
g_test_add_func ("/validity/pair/encrypt-key-different-inputs",
test_encrypt_key_different_inputs);
return g_test_run ();
}