ota deployment script, lots of other fun goodies too

This commit is contained in:
Thaddeus Hughes
2026-04-27 11:14:03 -05:00
parent 3774cde506
commit 9f4362b5fd
261 changed files with 2153 additions and 206003 deletions

View File

@@ -1,6 +1,7 @@
# See the build system documentation in IDF programming guide
# for more information about component CMakeLists.txt files.
# Seed version.h at configure time so it exists for the first build.
include(${CMAKE_CURRENT_LIST_DIR}/version.cmake)
idf_component_register(
@@ -27,4 +28,18 @@ if(NOT CMAKE_BUILD_EARLY_EXPANSION)
add_custom_target(generate_webpage_h DEPENDS ${COMPONENT_DIR}/webpage.h)
add_dependencies(${COMPONENT_LIB} generate_webpage_h)
# Regenerate version.h on every build so git SHA / dirty flag stay
# current as commits land between builds. configure_file inside
# version.cmake is a no-op when the content matches, so rebuilds only
# cascade when something actually changed.
add_custom_target(update_version ALL
COMMAND ${CMAKE_COMMAND}
-DSRC_DIR=${COMPONENT_DIR}
-DBIN_DIR=${CMAKE_BINARY_DIR}
-P ${COMPONENT_DIR}/version.cmake
BYPRODUCTS ${CMAKE_BINARY_DIR}/version.h
COMMENT "Refreshing version.h from git"
)
add_dependencies(${COMPONENT_LIB} update_version)
endif()

View File

@@ -225,17 +225,84 @@ static void cmd_led(char *args)
OK("led mask=%u", mask);
}
/* BU.LED.WATCH
* LEDs solid (all on) while the physical button is released.
* LEDs waterfall at ~83 ms/step while the button is held.
* Runs indefinitely; any UART byte aborts.
*/
static void cmd_led_watch(char *args)
{
(void)args;
static const uint8_t waterfall[] = {
0b001, 0b011, 0b111, 0b110, 0b100, 0b000
};
const size_t N_WF = sizeof(waterfall) / sizeof(waterfall[0]);
const int64_t step_us = 83000; /* ~83 ms — 3× the 250 ms host-side rate */
int64_t next_step_us = esp_timer_get_time();
size_t wf_i = 0;
int last_pressed = -1; /* force initial emit */
uint8_t last_mask = 0xFF;
while (1) {
/* Abort on any UART input. */
size_t available = 0;
if (uart_get_buffered_data_len(UART_NUM_0, &available) == ESP_OK
&& available > 0) {
uint8_t drain[64];
while (available > 0) {
int n = uart_read_bytes(UART_NUM_0, drain, sizeof(drain), 0);
if (n <= 0) break;
available = (size_t)n < available ? available - (size_t)n : 0;
}
break;
}
i2c_poll_buttons();
bool pressed = i2c_get_button_state(0);
int64_t now_us = esp_timer_get_time();
uint8_t mask;
if (pressed) {
if (now_us >= next_step_us) {
wf_i = (wf_i + 1) % N_WF;
next_step_us = now_us + step_us;
}
mask = waterfall[wf_i];
} else {
wf_i = 0;
next_step_us = now_us; /* so the first press starts from step 0 */
mask = 0b111;
}
if (mask != last_mask) {
i2c_set_led1(mask);
last_mask = mask;
}
if ((int)pressed != last_pressed) {
EVT("led t=%.2f pressed=%d", elapsed_s(), pressed ? 1 : 0);
last_pressed = pressed;
}
esp_task_wdt_reset();
vTaskDelay(pdMS_TO_TICKS(20));
}
i2c_set_led1(0);
OK("led.watch done");
}
static void cmd_adc_once(void)
{
int bat_mv = get_bat_raw_mv();
float bat_V = get_battery_V();
#ifdef BOARD_V5
/* VOC and FAULT pins are unusable on V5 (input-only ESP32 GPIOs
* without external pulls — see README "V5 hardware caveats"); skip. */
int isens_mv = get_isens_raw_mv();
float isens_A = -(isens_mv - 1650.0f) / 13.2f;
int voc_mv = get_voc_raw_mv();
int fault = get_hw_overcurrent_fault() ? 1 : 0;
OK("adc bat_mv=%d bat_V=%.3f isens_mv=%d isens_A=%+.2f voc_mv=%d fault=%d",
bat_mv, bat_V, isens_mv, isens_A, voc_mv, fault);
OK("adc bat_mv=%d bat_V=%.3f isens_mv=%d isens_A=%+.2f",
bat_mv, bat_V, isens_mv, isens_A);
#else
OK("adc bat_mv=%d bat_V=%.3f", bat_mv, bat_V);
#endif
@@ -629,6 +696,7 @@ static const struct cmd_entry CMDS[] = {
{ "FLASH", cmd_flash },
{ "I2C", cmd_i2c },
{ "LED", cmd_led },
{ "LED.WATCH", cmd_led_watch },
{ "ADC", cmd_adc },
{ "ADC.STREAM", cmd_adc_stream },
{ "SENSORS.WATCH", cmd_sensors_watch},

View File

@@ -112,6 +112,7 @@ int8_t fsm_get_current_progress(int8_t denominator) {
case STATE_JACK_DOWN:
case STATE_MOVE_START_DELAY:
case STATE_DRIVE_START_DELAY:
case STATE_DRIVE_FLUFF_START:
case STATE_DRIVE_END_DELAY:
if (timer_end != timer_start)
x = (fsm_now-timer_start)*denominator/(timer_end-timer_start);
@@ -407,12 +408,35 @@ void control_task(void *param) {
break;
case STATE_DRIVE_START_DELAY:
// 1s pause between jack-up and drive — mechanical settling
// 1s quiet pause between jack-up and fluffer spin-up.
// All motors off here so the jack-up current fully settles
// before we energize the fluffer.
if (!get_is_safe()) {
fsm_error = SC_ERR_SAFETY_TRIP;
current_state = STATE_UNDO_JACK_START;
set_timer(JACK_DOWN_TIME);
log = true;
} else if (timer_done()) {
current_state = STATE_DRIVE_FLUFF_START;
log = true;
set_timer((uint64_t)get_param_value_t(PARAM_FLUFF_PREDRIVE_MS).u32 * 1000);
}
break;
case STATE_DRIVE_FLUFF_START:
// Fluffer alone for 1s, then drive+fluffer. Splits the old
// "jack-up+fluff concurrent" sequence so aux never overlaps
// with jack on V5's shared current sensor.
if (!get_is_safe()) {
fsm_error = SC_ERR_SAFETY_TRIP;
current_state = STATE_UNDO_JACK_START;
set_timer(JACK_DOWN_TIME);
log = true;
} else if (efuse_get(BRIDGE_AUX)) {
fsm_error = SC_ERR_EFUSE_TRIP_3;
current_state = STATE_UNDO_JACK_START;
set_timer(JACK_DOWN_TIME);
log = true;
} else if (timer_done()) {
current_state = STATE_DRIVE;
log = true;
@@ -632,11 +656,12 @@ void control_task(void *param) {
case STATE_CALIBRATE_JACK_MOVE:
case STATE_JACK_UP_START:
case STATE_JACK_UP:
// jack up and fluff
// jack up only — fluffer is deferred to STATE_DRIVE_FLUFF_START
// so aux and jack never energize together.
drive_relays((relay_port_t){.bridges = {
.DRIVE=BRIDGE_OFF,
.JACK=BRIDGE_FWD,
.AUX=BRIDGE_FWD
.AUX=BRIDGE_OFF
}});
rtc_reset_shutdown_timer();
log = true;
@@ -661,8 +686,19 @@ void control_task(void *param) {
rtc_reset_shutdown_timer();
log = true;
break;
case STATE_UNDO_JACK_START:
case STATE_DRIVE_START_DELAY:
case STATE_DRIVE_START_DELAY:
// Quiet 1s after jack-up — all motors off so jack current
// settles before the fluffer starts.
drive_relays((relay_port_t){.bridges = {
.DRIVE=BRIDGE_OFF,
.JACK=BRIDGE_OFF,
.AUX=BRIDGE_OFF
}});
rtc_reset_shutdown_timer();
log = true;
break;
case STATE_DRIVE_FLUFF_START:
case STATE_UNDO_JACK_START:
case STATE_DRIVE_END_DELAY:
// only fluffer
drive_relays((relay_port_t){.bridges = {

View File

@@ -33,12 +33,18 @@ typedef enum {
STATE_DRIVE_END_DELAY,
STATE_JACK_DOWN,
STATE_UNDO_JACK_START,
STATE_CALIBRATE_JACK_DELAY,
STATE_CALIBRATE_JACK_MOVE,
STATE_CALIBRATE_DRIVE_DELAY,
STATE_CALIBRATE_DRIVE_MOVE
STATE_CALIBRATE_DRIVE_MOVE,
/* New — appended here to avoid renumbering existing log entries.
* Runs the fluffer alone for ~1 s between DRIVE_START_DELAY and DRIVE
* so the aux motor never overlaps with the jack (which caused the aux
* e-fuse to spuriously trip on V5's shared current sensor). */
STATE_DRIVE_FLUFF_START
} fsm_state_t;
#define LOG_TYPE_BAT 100
#define LOG_TYPE_CRASH 101

View File

@@ -142,9 +142,18 @@ esp_err_t drive_relays(relay_port_t relay_state) {
BRIDGE_TRANSITION_LOGIC(DRIVE)
BRIDGE_TRANSITION_LOGIC(JACK)
BRIDGE_TRANSITION_LOGIC(AUX)
relay_state.bridges.SENSORS = 1;
/* Sensor rail (P10) powered only when FSM is actively doing something.
* In STATE_IDLE we cut it to save power. Overrides energize a motor
* while FSM is technically IDLE — keep the rail up in that case too
* so overrides that consult sensor state (e.g. JACK_DOWN, which checks
* SENSOR_JACK) still work. */
bool motor_requested = (relay_state.bridges.DRIVE != BRIDGE_OFF ||
relay_state.bridges.JACK != BRIDGE_OFF ||
relay_state.bridges.AUX != BRIDGE_OFF);
relay_state.bridges.SENSORS =
(fsm_get_state() != STATE_IDLE || motor_requested) ? 1 : 0;
if (!get_is_safe())
relay_state.bridges.DRIVE = 0;

View File

@@ -64,7 +64,7 @@ typedef struct {
PARAM_DEF(DRIVE_DIST, f32, 10, "ft", 0.0, 100.0) \
PARAM_DEF(JACK_DIST, f32, 5, "in", 0.0, 10.0) \
PARAM_DEF(DRIVE_KE, f32, 29.2, "n/ft", 1.0, 1e9) \
PARAM_DEF(DRIVE_KT, f32, 2880000, "us/ft", 1.0, 1e9) /* div-critical */ \
PARAM_DEF(DRIVE_KT, f32, 1440000, "us/ft", 1.0, 1e9) /* div-critical */ \
PARAM_DEF(JACK_KT, f32, 1428571, "ms/in", 1.0, 1e9) /* div-critical */ \
PARAM_DEF(KEYCODE_0, u32, 0, "", 0, 0) /* skip */ \
PARAM_DEF(KEYCODE_1, u32, 0, "", 0, 0) \
@@ -104,7 +104,8 @@ typedef struct {
PARAM_DEF(BUILD_VERSION, str, "undefined", "", "", "") \
PARAM_DEF(SAFETY_BREAK_US, u32, 300000, "", 0, 10000000) \
PARAM_DEF(SAFETY_MAKE_US, u32, 1000000, "", 0, 10000000) \
PARAM_DEF(JACK_IS_DOWN, f32, 8.0, "A", 0.0, 200.0) /* deprecated: may duplicate JACK_I_DOWN */
PARAM_DEF(JACK_IS_DOWN, f32, 8.0, "A", 0.0, 200.0) /* deprecated: may duplicate JACK_I_DOWN */ \
PARAM_DEF(FLUFF_PREDRIVE_MS, u32, 2000, "ms", 0, 60000)
// Generate enum for parameter indices
#define PARAM_DEF(name, type, default_val, unit, min, max) PARAM_##name,

View File

@@ -1,7 +1,25 @@
# version.cmake
#
# Dual-mode. When included from CMakeLists.txt it runs once at configure
# time (seeding ${CMAKE_BINARY_DIR}/version.h so the first build has the
# file). When invoked as a standalone script via `cmake -P` with SRC_DIR
# and BIN_DIR set, it re-runs at build time so the SHA / dirty flag stay
# current as commits happen between builds.
if(NOT DEFINED SRC_DIR)
set(SRC_DIR ${CMAKE_CURRENT_LIST_DIR})
endif()
if(NOT DEFINED BIN_DIR)
set(BIN_DIR ${CMAKE_BINARY_DIR})
endif()
# Parent dir of the main/ component is the firmware project root, which
# is inside the outer git repo.
get_filename_component(_GIT_WORK_DIR ${SRC_DIR} DIRECTORY)
execute_process(
COMMAND git describe --tags --always --dirty
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/..
WORKING_DIRECTORY ${_GIT_WORK_DIR}
OUTPUT_VARIABLE GIT_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
@@ -9,29 +27,44 @@ execute_process(
execute_process(
COMMAND git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/..
WORKING_DIRECTORY ${_GIT_WORK_DIR}
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${_GIT_WORK_DIR}
OUTPUT_VARIABLE GIT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S" UTC)
# Fallback if not in a git repo
if(NOT GIT_VERSION)
set(GIT_VERSION "unknown")
endif()
if(NOT GIT_BRANCH)
set(GIT_BRANCH "unknown")
endif()
if(NOT GIT_SHA)
set(GIT_SHA "0000000")
endif()
message(STATUS "Firmware Version: ${GIT_VERSION}")
message(STATUS "Git Branch: ${GIT_BRANCH}")
message(STATUS "Build Date: ${BUILD_DATE}")
# configure_file only touches the output file when content actually changes
# — ninja / make won't needlessly re-compile translation units that include
# version.h if nothing is different.
configure_file(
${CMAKE_CURRENT_LIST_DIR}/version.h.in
${CMAKE_BINARY_DIR}/version.h
${SRC_DIR}/version.h.in
${BIN_DIR}/version.h
@ONLY
)
)
if(CMAKE_SCRIPT_MODE_FILE)
# Standalone -P invocation: quiet success.
else()
message(STATUS "Firmware Version: ${GIT_VERSION} Branch: ${GIT_BRANCH} SHA: ${GIT_SHA}")
message(STATUS "Build Date: ${BUILD_DATE}")
endif()

View File

@@ -3,8 +3,9 @@
#define VERSION_H
#define FIRMWARE_VERSION "@GIT_VERSION@"
#define FIRMWARE_BRANCH "@GIT_BRANCH@"
#define BUILD_DATE "@BUILD_DATE@"
#define FIRMWARE_STRING "V_" FIRMWARE_VERSION " (" BUILD_DATE ")"
#define FIRMWARE_BRANCH "@GIT_BRANCH@"
#define FIRMWARE_SHA "@GIT_SHA@"
#define BUILD_DATE "@BUILD_DATE@"
#define FIRMWARE_STRING "V_" FIRMWARE_VERSION " (" BUILD_DATE ")"
#endif

File diff suppressed because one or more lines are too long

View File

@@ -8,6 +8,7 @@ green: #2a493d
black: #2f2f2f
-->
<head>
<meta charset="utf-8">
<title>Control Panel</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@@ -37,11 +38,32 @@ black: #2f2f2f
#commit_btn[disabled], #cancel_btn[disabled] { background-color: #444 !important; color: #888; cursor: not-allowed; }
table { width: 100%; border-collapse: collapse; text-align: left; }
td { padding: 8px; border-bottom: 1px solid #efede9; }
#log_viewer_table td { padding: 2px 6px; font-size: 0.65rem; }
#log_viewer_table td:first-child { white-space: nowrap; }
summary { border-radius: 5px; font-weight: bold; text-align: left; color: #fff; background-color: #723; padding: 0.3rem;}
.cmd { font-size: 1.5rem; border: none;}
#msg {text-align: center;}
/* Status box: state label plus a flex row of per-error pills. */
#status_box { text-align: center; padding: 6px 0; }
#status_state { font-weight: bold; font-size: 1.3rem; padding: 4px 0; color: #2a493d; }
#status_state.error { color: #c33; }
#status_indicators { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-top: 4px; }
#status_indicators:empty { display: none; }
.status_pill {
padding: 3px 10px;
border-radius: 12px;
font-size: 0.85rem;
font-weight: bold;
color: #ffffff;
background-color: #888;
white-space: nowrap;
}
.status_pill.error { background-color: #c33; }
.status_pill.warn { background-color: #c90; }
.status_pill.info { background-color: #479; }
h1 {
font-size: 2.5rem;
@@ -85,8 +107,11 @@ black: #2f2f2f
@media screen and (max-width: 350px) {
#content { max-width: 100%; padding: 0 5px; }
table tr td { display: block; width: 100%; box-sizing: border-box; } /* Stack table cells vertically on mobile for better usability */
table tr { display: block; margin-bottom: 10px; }
/* Stack table cells vertically on mobile for better usability,
* but exempt the log viewer — it stays as a wide table with
* horizontal scroll provided by its wrapping div. */
table:not(#log_viewer_table) tr td { display: block; width: 100%; box-sizing: border-box; }
table:not(#log_viewer_table) tr { display: block; margin-bottom: 10px; }
}
#popup-buttons {
@@ -168,7 +193,12 @@ black: #2f2f2f
<table>
<tr>
<td colspan="3"><input readonly="" id="msg"/></td>
<td colspan="3">
<div id="status_box">
<div id="status_state">&mdash;</div>
<div id="status_indicators"></div>
</div>
</td>
</tr>
<tr>
<td colspan="3"><input type="datetime-local" id="UX_TIME" step="1" readonly=""/>
@@ -191,15 +221,15 @@ black: #2f2f2f
<td><input type="datetime-local" id="UX_NEXT_ALARM" readonly=""/></td>
</tr>
<tr>
<td>Remain. Distance (ft)</td>
<td>Leash (ft)</td>
<td><input type="number" id="UX_REM_DIST" onchange="handleRemainingDistChange(this)"/></td>
</tr>
<tr>
<td>Move Distance (ft)</td>
<td>Move Dist. (ft)</td>
<td><input type="number" min="0" id="UX_DRIVE_DIST" onchange="changeSchedule(this)"/></td>
</tr>
<tr>
<td>Jack Height (in)</td>
<td>Jack Ht. (in)</td>
<td><input type="number" min="0" id="UX_JACK_DIST" onchange="changeSchedule(this)"/></td>
</tr>
<tr>
@@ -294,6 +324,20 @@ black: #2f2f2f
</details>
<br/>
<details id="log_viewer_details">
<summary style="background-color:#2a493d;">EVENT LOG</summary>
<!-- Body breaks out of the 500px #content column so the table has
room to breathe. The summary above stays inside the column. -->
<div id="log_viewer_body" style="position:relative;width:100vw;left:50%;margin-left:-50vw;padding:0 8px;box-sizing:border-box;">
<button onclick="loadLogViewer()" style="width:auto;padding:4px 12px;">Refresh</button>
<div id="log_viewer_msg" style="padding:8px;font-size:0.75rem;"></div>
<div style="overflow-x:auto;">
<table id="log_viewer_table" style="font-family:monospace;font-size:0.65rem;white-space:nowrap;"></table>
</div>
</div>
</details>
<br/>
<details>
<summary>DANGER ZONE</summary>
<table>
@@ -583,7 +627,14 @@ black: #2f2f2f
let intervalId = null;
function remote(command) {
sendCommand(command);
// Fire-and-forget POST. Held-button jog sends this every 150 ms —
// transient NetworkErrors must not pop a modal (would spam the UI
// and race with subsequent sends). Any error is swallowed.
fetch('./post', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({cmd: command})
}).catch(() => {});
try {
navigator.vibrate(200);
} catch (error) {}
@@ -833,6 +884,16 @@ black: #2f2f2f
}
}
// Shared guard: skip writes into fields the user is currently editing
// (focused OR marked .changed). Applies uniformly across the front
// page AND the DANGER ZONE param table.
function _safeSet(el, value) {
if (!el) return;
if (document.activeElement === el) return;
if (el.classList && el.classList.contains('changed')) return;
el.value = value;
}
function updateUI() {
if (!data.rtc_set) {
showRTCSyncModal();
@@ -847,43 +908,51 @@ black: #2f2f2f
if (driftS > 300) showDesyncModal(Math.round(driftS / 60));
}
// Update message + error flags in single msg field
// Status box: state label + per-error pills.
{
const state = Array.isArray(data.msg) ? data.msg[0] || '' : (data.msg || '');
const flags = [];
if (data.errors) {
const e = data.errors;
if (e.efuse_drive) flags.push('DRIVE EFUSE');
if (e.efuse_jack) flags.push('JACK EFUSE');
if (e.efuse_aux) flags.push('AUX EFUSE');
if (e.low_battery) flags.push('LOW BATTERY');
if (e.rtc_not_set) flags.push('CLOCK NOT SET');
if (e.safety_trip) flags.push('SAFETY BREAK');
if (e.leash_hit) flags.push('LEASH LIMIT');
}
const msgEl = ge('msg');
if (flags.length > 0) {
const bin = (data.errors.led_code >>> 0).toString(2).padStart(3,'0');
msgEl.value = state + ' [' + bin + '] ' + flags.join(' | ');
msgEl.style.color = '#c33';
} else {
msgEl.value = state;
msgEl.style.color = '';
// Pills rendered in priority order: hardware errors first,
// then config / housekeeping warnings. Each entry:
// [errorKey, pill text, 'error' | 'warn']
const INDICATORS = [
['safety_trip', 'SAFETY BREAK', 'error'],
['efuse_drive', 'DRIVE EFUSE', 'error'],
['efuse_jack', 'JACK EFUSE', 'error'],
['efuse_aux', 'AUX EFUSE', 'error'],
['low_battery', 'LOW BATTERY', 'warn'],
['leash_hit', 'LEASH LIMIT', 'warn'],
['rtc_not_set', 'CLOCK NOT SET', 'warn'],
];
const errs = data.errors || {};
const activePills = INDICATORS.filter(([k]) => errs[k]);
const stateEl = ge('status_state');
stateEl.textContent = state || '—';
stateEl.classList.toggle('error', activePills.length > 0);
const box = ge('status_indicators');
box.innerHTML = '';
for (const [, label, kind] of activePills) {
const pill = document.createElement('span');
pill.className = 'status_pill ' + kind;
pill.textContent = label;
box.appendChild(pill);
}
}
// Update voltage (read-only)
// Update voltage (read-only — but still skip while focused so a
// user copying the value doesn't lose their selection)
if (data.voltage !== undefined) {
ge('voltage').value = data.voltage.toFixed(2);
_safeSet(ge('voltage'), data.voltage.toFixed(2));
}
if (data.build_version || data.build_date) {
ge('version').value = data.build_version + ' ('+data.build_date+')';
_safeSet(ge('version'), data.build_version + ' ('+data.build_date+')');
}
// Update time (skip if changed or focused)
// Update time
const timeInput = ge('UX_TIME');
if (data.time !== undefined && !timeInput.classList.contains('changed') && document.activeElement !== timeInput) {
if (data.time !== undefined) {
// Treat incoming timestamp as local time (no timezone conversion)
const dt = new Date(data.time * 1000);
const year = dt.getUTCFullYear();
@@ -892,65 +961,81 @@ black: #2f2f2f
const hours = String(dt.getUTCHours()).padStart(2, '0');
const minutes = String(dt.getUTCMinutes()).padStart(2, '0');
const seconds = String(dt.getUTCSeconds()).padStart(2, '0');
timeInput.value = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
_safeSet(timeInput, `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`);
}
const timeOutput = ge('UX_NEXT_ALARM');
if (data.next_alarm !== undefined) {
// Treat incoming timestamp as local time (no timezone conversion)
const dt = new Date(data.next_alarm * 1000);
const year = dt.getUTCFullYear();
const month = String(dt.getUTCMonth() + 1).padStart(2, '0');
const day = String(dt.getUTCDate()).padStart(2, '0');
const hours = String(dt.getUTCHours()).padStart(2, '0');
const minutes = String(dt.getUTCMinutes()).padStart(2, '0');
const seconds = String(dt.getUTCSeconds()).padStart(2, '0');
timeOutput.value = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
if (data.next_alarm !== undefined && document.activeElement !== timeOutput) {
if (data.next_alarm > 0) {
// Flip the element back to a datetime-local input so
// the value parses — the "disabled" branch swaps it to
// a plain text input to display a message.
if (timeOutput.type !== 'datetime-local') timeOutput.type = 'datetime-local';
// Treat incoming timestamp as local time (no timezone conversion)
const dt = new Date(data.next_alarm * 1000);
const year = dt.getUTCFullYear();
const month = String(dt.getUTCMonth() + 1).padStart(2, '0');
const day = String(dt.getUTCDate()).padStart(2, '0');
const hours = String(dt.getUTCHours()).padStart(2, '0');
const minutes = String(dt.getUTCMinutes()).padStart(2, '0');
const seconds = String(dt.getUTCSeconds()).padStart(2, '0');
timeOutput.value = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
} else {
// <=0 means firmware has no alarm scheduled (e.g. NUM_MOVES=0).
if (timeOutput.type !== 'text') timeOutput.type = 'text';
timeOutput.value = 'DISABLED';
}
}
// Update parameters
if (data.parameters) {
updateParamTable();
updateScheduleInputs();
}
// Update remaining distance (special parameter) - skip if changed or focused
const remainingDistInput = ge('UX_REM_DIST');
if (data.remaining_dist !== undefined && !remainingDistInput.classList.contains('changed') && document.activeElement !== remainingDistInput) {
remainingDistInput.value = data.remaining_dist.toFixed(1);
// Update remaining distance (special parameter)
if (data.remaining_dist !== undefined) {
_safeSet(ge('UX_REM_DIST'), data.remaining_dist.toFixed(1));
}
}
// Keys whose inputs live OUTSIDE the auto-generated DANGER ZONE
// table (in the dedicated WiFi section, or commented out entirely).
// Must be filtered in BOTH the build and update paths — otherwise a
// poll sees "no input for NET_SSID" and force-rebuilds the whole
// table every tick, wiping every in-progress edit.
const PARAM_TABLE_SKIP = new Set(['NET_SSID', 'NET_PASS', 'WIFI_SSID', 'WIFI_PASS']);
function updateParamTable() {
const table = ge('table');
// Sort parameters alphabetically by key
const sortedParams = Object.entries(data.parameters).sort((a, b) => a[0].localeCompare(b[0]));
// Sort parameters alphabetically, pre-filtering keys that don't
// belong in the auto-generated DANGER ZONE table.
const sortedParams = Object.entries(data.parameters)
.filter(([k]) => !PARAM_TABLE_SKIP.has(k))
.sort((a, b) => a[0].localeCompare(b[0]));
if (!paramTableCreated) {
// Create table for the first time
table.innerHTML = '';
const WIFI_PARAM_KEYS = new Set(['NET_SSID', 'NET_PASS', 'WIFI_SSID', 'WIFI_PASS']);
for (const [key, value] of sortedParams) {
if (WIFI_PARAM_KEYS.has(key)) continue; // shown in dedicated WiFi section
const row = table.insertRow();
const cell1 = row.insertCell(0);
const cell2 = row.insertCell(1);
cell1.textContent = key;
const input = document.createElement('input');
input.type = typeof value === 'string' ? 'text':'number';
input.id = `PARAM_${key}`;
input.value = value;
input.onchange = function() { markChanged(this); };
cell2.appendChild(input);
}
// add listener so anytime you click anything you select the box
// duh
document.querySelectorAll('input').forEach(input => {
@@ -959,19 +1044,17 @@ black: #2f2f2f
this.select();
});
});
paramTableCreated = true;
} else {
// Update existing table
for (const [key, value] of sortedParams) {
const input = ge(`PARAM_${key}`);
if (input) {
// Only update if not changed and not focused
if (!input.classList.contains('changed') && document.activeElement !== input) {
input.value = value;
}
// _safeSet skips changed/focused inputs so in-progress edits survive.
_safeSet(input, value);
} else {
// New parameter - need to rebuild table
// Genuinely new param (unknown key AND not in skip list) → rebuild.
paramTableCreated = false;
updateParamTable();
return;
@@ -1408,6 +1491,260 @@ black: #2f2f2f
}
}
// ---- Log viewer ------------------------------------------------
// Parses the /log endpoint binary blob:
// [4B BE json_len][json_len bytes JSON][4B BE tail][4B BE head][log data...]
// Log data entries (current FW): [len u8][payload (len-1 bytes)][type u8]
// Total per entry = len+1. 0xFF / 0x00 bytes → skip to next 4096 sector.
const LOG_FSM_NAMES = [
'IDLE','MOVE_START_DELAY','JACK_UP_START','JACK_UP',
'DRIVE_START_DELAY','DRIVE','DRIVE_END_DELAY','JACK_DOWN',
'UNDO_JACK_START','CAL_JACK_DELAY','CAL_JACK_MOVE',
'CAL_DRIVE_DELAY','CAL_DRIVE_MOVE','DRIVE_FLUFF_START',
];
const LOG_TYPE_BAT = 100, LOG_TYPE_CRASH = 101, LOG_TYPE_BOOT = 102, LOG_TYPE_TIME_SET = 103;
const LOG_RESET_REASONS = {
0:'UNKNOWN',1:'POWERON',2:'EXT',3:'SW',4:'PANIC',
5:'INT_WDT',6:'TASK_WDT',7:'WDT',8:'DEEPSLEEP',9:'BROWNOUT',10:'SDIO',
};
let logViewerLoaded = false;
const LOG_MONTHS = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
function _logFormatTs(tsMs) {
// Device stores "local time as UTC ms" — display via getUTC* to avoid
// the browser re-applying its own timezone offset.
// Format: 2026APR08 14:23:45.123
if (!tsMs || tsMs <= 0) return '-';
const d = new Date(tsMs);
const pad = (n, w=2) => String(n).padStart(w, '0');
return `${d.getUTCFullYear()}${LOG_MONTHS[d.getUTCMonth()]}${pad(d.getUTCDate())} `
+ `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`
+ `.${pad(d.getUTCMilliseconds(), 3)}`;
}
// Decode the sensors byte: low nibble = debounced stable state,
// high nibble = raw level. Bit order SAFETY / DRIVE / JACK / AUX.
const LOG_SENSOR_NAMES = ['SAFETY', 'DRIVE', 'JACK', 'AUX'];
function _decodeSensors(b) {
const stable = b & 0x0F, raw = (b >> 4) & 0x0F;
const parts = [];
for (let i = 0; i < 4; i++) {
const s = (stable >> i) & 1;
const r = (raw >> i) & 1;
parts.push(`${LOG_SENSOR_NAMES[i]}=${s}${s !== r ? ` (raw ${r})` : ''}`);
}
return parts.join(', ');
}
function _parseLogEntries(bytes) {
const entries = [];
const n = bytes.length;
const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
let i = 0;
while (i < n) {
const b = bytes[i];
if (b === 0xFF || b === 0x00) {
// Skip to next 4096-aligned sector.
i = (Math.floor(i / 4096) + 1) * 4096;
continue;
}
const entryLen = b; // stored len = payload_size + 1
const payloadSize = entryLen - 1;
const endOffset = i + entryLen;
if (endOffset >= n) break; // truncated
const type = bytes[endOffset];
const payloadStart = i + 1;
const entry = { type };
try {
if (type >= 0 && type <= 13 && payloadSize >= 27) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart + 0, true));
entry.bat_V = dv.getFloat32(payloadStart + 8, true);
entry.drive_A = dv.getFloat32(payloadStart + 12, true);
entry.jack_A = dv.getFloat32(payloadStart + 16, true);
entry.aux_A = dv.getFloat32(payloadStart + 20, true);
entry.counter = dv.getInt16(payloadStart + 24, true);
entry.sensors = bytes[payloadStart + 26];
entry.name = LOG_FSM_NAMES[type] || `STATE_${type}`;
} else if (type === LOG_TYPE_BAT && payloadSize >= 12) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart, true));
entry.bat_V = dv.getFloat32(payloadStart + 8, true);
entry.name = 'BAT';
} else if ((type === LOG_TYPE_CRASH || type === LOG_TYPE_BOOT) && payloadSize >= 9) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart, true));
const info = bytes[payloadStart + 8];
entry.reason = LOG_RESET_REASONS[info & 0x0F] || `UNKNOWN(${info & 0x0F})`;
entry.name = type === LOG_TYPE_BOOT ? 'BOOT' : 'CRASH';
} else if (type === LOG_TYPE_TIME_SET && payloadSize >= 8) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart, true));
entry.name = 'TIME_SET';
} else {
entry.name = `UNK(0x${type.toString(16).padStart(2,'0')})`;
}
} catch (e) {
entry.name = 'PARSE_ERR';
}
entries.push(entry);
i = endOffset + 1;
}
return entries;
}
function _entryCells(e) {
// Returns an array of {text, title?} describing each column for
// a single entry. `title` becomes the tooltip (title attribute).
const sensorHex = e.sensors !== undefined
? '0x' + e.sensors.toString(16).padStart(2,'0')
: '';
return [
{ text: _logFormatTs(e.ts_ms) },
{ text: e.name || '' },
{ text: e.bat_V !== undefined ? e.bat_V.toFixed(2) : '' },
{ text: e.drive_A !== undefined ? e.drive_A.toFixed(2) : '' },
{ text: e.jack_A !== undefined ? e.jack_A.toFixed(2) : '' },
{ text: e.aux_A !== undefined ? e.aux_A.toFixed(2) : '' },
{ text: e.counter !== undefined ? String(e.counter) : '' },
{ text: sensorHex,
title: e.sensors !== undefined ? _decodeSensors(e.sensors) : undefined },
{ text: e.reason || '' },
];
}
function _appendRow(table, cells, opts = {}) {
const row = table.insertRow();
if (opts.className) row.className = opts.className;
if (opts.hidden) row.style.display = 'none';
if (opts.onclick) row.addEventListener('click', opts.onclick);
if (opts.style) Object.assign(row.style, opts.style);
cells.forEach(c => {
const td = document.createElement('td');
if (typeof c === 'string') {
td.textContent = c;
} else {
td.textContent = c.text ?? '';
if (c.title) td.title = c.title;
if (c.colSpan) td.colSpan = c.colSpan;
if (c.style) Object.assign(td.style, c.style);
if (c.bold) td.style.fontWeight = 'bold';
}
row.appendChild(td);
});
return row;
}
function _renderLogEntries(entries) {
const table = ge('log_viewer_table');
table.innerHTML = '';
const cols = ['Time','Type','Battery V','Drive A','Jack A','Aux A','Counter','Sensors','Extra'];
_appendRow(table, cols.map(h => ({ text: h, bold: true })));
// Walk newest-first, group contiguous entries sharing the same
// state name. Groups with ≥2 members render as a single clickable
// header row (default collapsed) followed by their entry rows.
let groupId = 0;
let i = entries.length - 1;
while (i >= 0) {
const name = entries[i].name || '';
let j = i;
while (j >= 0 && (entries[j].name || '') === name) j--;
const group = entries.slice(j + 1, i + 1).reverse(); // newest-first
i = j;
if (group.length === 1) {
_appendRow(table, _entryCells(group[0]));
continue;
}
groupId++;
const rowClass = `log-group-${groupId}`;
let collapsed = true;
const firstTs = _logFormatTs(group[group.length - 1].ts_ms);
const lastTs = _logFormatTs(group[0].ts_ms);
const header = _appendRow(table, [{
text: `[+] ${name} × ${group.length} ${firstTs}${lastTs}`,
colSpan: cols.length,
style: { cursor: 'pointer', background: '#efede9',
fontWeight: 'bold', fontSize: '0.7rem' },
}], {
style: { background: '#efede9' },
});
// Defer wiring the onclick until we've appended the child rows.
const childRows = group.map(e =>
_appendRow(table, _entryCells(e), {
className: rowClass,
hidden: true,
}));
header.addEventListener('click', () => {
collapsed = !collapsed;
childRows.forEach(r => r.style.display = collapsed ? 'none' : '');
const cell = header.cells[0];
cell.textContent = `[${collapsed ? '+' : '-'}] ${name} × ${group.length} ${firstTs}${lastTs}`;
});
}
}
async function loadLogViewer() {
const msg = ge('log_viewer_msg');
msg.textContent = 'Connecting...';
try {
const resp = await fetch('./log');
if (!resp.ok) { msg.textContent = `Failed: ${resp.status} ${resp.statusText}`; return; }
// Stream the body so we can report progress as bytes arrive.
// /log sets Content-Length, so we know the total ahead of time.
const total = parseInt(resp.headers.get('Content-Length') || '0', 10);
const reader = resp.body.getReader();
const chunks = [];
let received = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
received += value.length;
const kb = (received / 1024).toFixed(1);
if (total) {
const totalKb = (total / 1024).toFixed(1);
const pct = Math.round((received / total) * 100);
msg.textContent = `Downloading... ${kb} / ${totalKb} KB (${pct}%)`;
} else {
msg.textContent = `Downloading... ${kb} KB`;
}
}
// Concatenate chunks into a single Uint8Array.
const buf = new Uint8Array(received);
{
let off = 0;
for (const c of chunks) { buf.set(c, off); off += c.length; }
}
if (buf.length < 12) { msg.textContent = 'Log response too short.'; return; }
msg.textContent = `Parsing ${received} bytes...`;
const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
const jsonLen = dv.getUint32(0, false);
if (jsonLen > 65536 || 4 + jsonLen + 8 > buf.length) {
msg.textContent = 'Log response malformed.'; return;
}
const binStart = 4 + jsonLen + 8;
const logBytes = buf.subarray(binStart);
const entries = _parseLogEntries(logBytes);
_renderLogEntries(entries);
msg.textContent = `${entries.length} entries (${logBytes.length} bytes)`;
logViewerLoaded = true;
} catch (err) {
msg.textContent = `Error: ${err.message}`;
}
}
// Populate the first time the details section is opened.
function _attachLogViewerToggle() {
const d = ge('log_viewer_details');
if (!d) return;
d.addEventListener('toggle', () => {
if (d.open && !logViewerLoaded) loadLogViewer();
});
}
// Start automatic polling
function startPolling() {
// Initial fetch
@@ -1440,6 +1777,7 @@ black: #2f2f2f
window.onload = function() {
ge('commit_btn').disabled = true;
ge('cancel_btn').disabled = true;
_attachLogViewerToggle();
startPolling();
}
</script>

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -829,10 +829,7 @@ bool server_running = false;
static bool s_wifi_running = false;
static esp_netif_t *s_ap_netif = NULL;
static esp_netif_t *s_sta_netif = NULL;
static bool s_wifi_initted = false;
static SemaphoreHandle_t s_sta_sem = NULL;
static bool s_sta_connected = false;
static esp_err_t start_http_server(void) {
if (server_running) return ESP_OK;
@@ -908,15 +905,7 @@ static void wifi_event_handler(void* arg, esp_event_base_t event_base,
ESP_LOGI(TAG, "Station disconnected, AID=%d", event->aid);
n_connected--;
if (n_connected <= 0) stop_http_server();
} else if (event_id == WIFI_EVENT_STA_DISCONNECTED) {
s_sta_connected = false;
if (s_sta_sem) xSemaphoreGive(s_sta_sem);
}
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t *e = (ip_event_got_ip_t *)event_data;
ESP_LOGI(TAG, "STA connected, IP: " IPSTR, IP2STR(&e->ip_info.ip));
s_sta_connected = true;
if (s_sta_sem) xSemaphoreGive(s_sta_sem);
}
}
@@ -950,83 +939,10 @@ static esp_err_t wifi_common_init(void) {
return err;
}
err = esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
&wifi_event_handler, NULL, NULL);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to register IP_EVENT handler: %s", esp_err_to_name(err));
return err;
}
s_wifi_initted = true;
return ESP_OK;
}
/* Attempt STA connection; blocks up to 10 s. Returns ESP_OK on GOT_IP. */
static esp_err_t try_connect_sta(const char *ssid, const char *pass, bool reset_wdt) {
if (s_sta_netif == NULL) {
s_sta_netif = esp_netif_create_default_wifi_sta();
if (s_sta_netif == NULL) {
ESP_LOGE(TAG, "Failed to create STA netif");
return ESP_FAIL;
}
esp_netif_set_hostname(s_sta_netif, HOSTNAME);
}
esp_err_t err = wifi_common_init();
if (err != ESP_OK) return err;
wifi_config_t sta_cfg = {};
strlcpy((char *)sta_cfg.sta.ssid, ssid, sizeof(sta_cfg.sta.ssid));
strlcpy((char *)sta_cfg.sta.password, pass ? pass : "", sizeof(sta_cfg.sta.password));
err = esp_wifi_set_mode(WIFI_MODE_STA);
if (err != ESP_OK) { ESP_LOGE(TAG, "set_mode STA: %s", esp_err_to_name(err)); return err; }
err = esp_wifi_set_config(WIFI_IF_STA, &sta_cfg);
if (err != ESP_OK) { ESP_LOGE(TAG, "set_config STA: %s", esp_err_to_name(err)); return err; }
s_sta_connected = false;
if (s_sta_sem == NULL) {
s_sta_sem = xSemaphoreCreateBinary();
} else {
xSemaphoreTake(s_sta_sem, 0); // drain any stale token
}
err = esp_wifi_start();
if (err != ESP_OK) { ESP_LOGE(TAG, "wifi_start: %s", esp_err_to_name(err)); return err; }
/* Yield so the event loop (priority 20) can process WIFI_EVENT_STA_START
* and esp_netif can finish initialising the STA interface before we call
* esp_wifi_connect(). The esp_timer task runs at priority 22, so without
* this yield it would call connect before STA_START is handled — the
* driver accepts the call (returns ESP_OK) but silently discards it when
* it finishes its own internal start sequence. */
vTaskDelay(pdMS_TO_TICKS(10));
err = esp_wifi_connect();
if (err != ESP_OK) {
ESP_LOGE(TAG, "wifi_connect: %s", esp_err_to_name(err));
esp_wifi_stop();
return err;
}
/* Poll in 100 ms slices so the WDT gets reset when needed (init path). */
for (int i = 0; i < 100 && !s_sta_connected; i++) {
xSemaphoreTake(s_sta_sem, pdMS_TO_TICKS(100));
if (reset_wdt) esp_task_wdt_reset();
}
if (!s_sta_connected) {
ESP_LOGW(TAG, "STA connection timed out or rejected");
esp_wifi_stop();
return ESP_FAIL;
}
s_wifi_running = true;
if (comms_event_group) xEventGroupSetBits(comms_event_group, WIFI_READY_BIT);
return ESP_OK;
}
static esp_err_t launch_soft_ap(void) {
ESP_LOGI(TAG, "AP LAUNCHING");
@@ -1110,20 +1026,11 @@ static esp_err_t launch_soft_ap(void) {
return ESP_OK;
}
/* STA-first startup: try NET_SSID, fall back to softAP on failure/empty. */
/* TODO: STA mode disabled pending network stack fixes */
/* SoftAP-only startup. STA mode was removed along with try_connect_sta()
* — revisit if/when STA is reinstated (see git history for the previous
* implementation). */
static esp_err_t start_wifi(bool reset_wdt) {
// char *net_ssid = get_param_string(PARAM_NET_SSID);
// if (net_ssid && strlen(net_ssid) > 0) {
// char *net_pass = get_param_string(PARAM_NET_PASS);
// ESP_LOGI(TAG, "Trying STA connection to '%s'...", net_ssid);
// if (try_connect_sta(net_ssid, net_pass, reset_wdt) == ESP_OK) {
// ESP_LOGI(TAG, "STA connected — HTTP server running");
// return ESP_OK;
// }
// ESP_LOGW(TAG, "STA failed — falling back to softAP");
// /* try_connect_sta already called esp_wifi_stop() on failure */
// }
(void)reset_wdt;
return launch_soft_ap();
}
@@ -1144,17 +1051,14 @@ esp_err_t webserver_restart_wifi(void) {
if (s_wifi_running) {
esp_wifi_stop();
s_wifi_running = false;
/* Allow the event loop to drain the WIFI_EVENT_STA_DISCONNECTED (or
* AP stop) event that esp_wifi_stop() queues asynchronously. Without
* this delay, the stale disconnect event is processed after the new
* esp_wifi_connect() call, which resets the driver's internal
* connection state machine and silently kills the new attempt. */
/* Allow the event loop to drain the AP-stop event that
* esp_wifi_stop() queues asynchronously before we relaunch. */
vTaskDelay(pdMS_TO_TICKS(200));
}
esp_err_t err = start_wifi(false); // called from esp_timer task, not subscribed to WDT
if (err != ESP_OK) return err;
start_http_server(); // no-op if STA path already started it
start_http_server(); // no-op if already running
return ESP_OK;
}
@@ -1167,7 +1071,7 @@ esp_err_t webserver_init(void) {
return err;
}
start_http_server(); // no-op if STA path already started it
start_http_server(); // no-op if already running
ESP_LOGI(TAG, "Webserver initialization complete");
return ESP_OK;