From a29e312133857a22defc735d105d7cd6277d00db Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 07:51:06 +0000 Subject: [PATCH 1/5] Plan dual-channel serial passthrough work Agent-Logs-Url: https://github.com/bring42/tbx/sessions/2816ed76-19fb-4145-812b-d366a6770f48 Co-authored-by: bring42 <63049750+bring42@users.noreply.github.com> --- tools/userial/dist/index.html | 1421 ++++++++++++++++++++++++++++++++ tools/wifiscan/dist/index.html | 1121 +++++++++++++++++++++++++ 2 files changed, 2542 insertions(+) create mode 100644 tools/userial/dist/index.html create mode 100644 tools/wifiscan/dist/index.html diff --git a/tools/userial/dist/index.html b/tools/userial/dist/index.html new file mode 100644 index 0000000..1decc69 --- /dev/null +++ b/tools/userial/dist/index.html @@ -0,0 +1,1421 @@ + + + + + + RS-232 Serial Tool + + + + +
+
+

RS-232 Serial Tool

+
+ + Connecting... +
+ +
+ +
+ + + +
+ + + +
+
+

Statistics

+
+
+
0
+
RX Bytes
+
+
+
0
+
TX Bytes
+
+
+
0s
+
Uptime
+
+
+
9600
+
Baud
+
+
+
+
+

Serial Data

+
+
Waiting for data...
+
+
+ + + +
+
+
+ +
+
+

Serial Console

+
+
--- Serial Console Ready --- +
+
+ > + +
+
+
+
+ Local Echo +
+
+
+ Add CR+LF +
+
+
+ +
+
+
+ + + + +
+
+
+ +
+
+

Send ASCII

+
+ + +
+
+ Append CR+LF +
+
+ +
+ + + + +
+
+
+

Send Hex

+
+ + +
+ +
+ + + + +
+
+
+ + + + + +
+ +
+ + + + + diff --git a/tools/wifiscan/dist/index.html b/tools/wifiscan/dist/index.html new file mode 100644 index 0000000..27247e4 --- /dev/null +++ b/tools/wifiscan/dist/index.html @@ -0,0 +1,1121 @@ + + + + + + WiFi Scanner + + + + +
+
+

WiFi Scanner

+
+ + Connecting... +
+ +
+ + + + +
+
+
+
+ 0 networks found + Last scan: --:--:-- +
+ +
+
+
+
+ Waiting for scan results... +
+
+
+ + + + + +
+ +
+ + + + + From 1845cc099526d40ae2b0afb0a7c879349805e39f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 07:55:29 +0000 Subject: [PATCH 2/5] Implement dual-channel userial firmware Agent-Logs-Url: https://github.com/bring42/tbx/sessions/2816ed76-19fb-4145-812b-d366a6770f48 Co-authored-by: bring42 <63049750+bring42@users.noreply.github.com> --- tools/userial/src/main.cpp | 557 ++++++++++++++++++++++++++++++++----- 1 file changed, 482 insertions(+), 75 deletions(-) diff --git a/tools/userial/src/main.cpp b/tools/userial/src/main.cpp index 903866d..e8b7865 100644 --- a/tools/userial/src/main.cpp +++ b/tools/userial/src/main.cpp @@ -1,12 +1,13 @@ /* - * RS-232 Serial Tool — Example main.cpp - * Demonstrates using toolbox_wifi.h + toolbox_web.h shared headers - * - * This is a simplified skeleton. Copy and expand for your actual tool. + * RS-232 Serial Tool + * Dual-channel serial monitor, injector, and passthrough bridge. */ #include #include +#include +#include +#include #include "toolbox_common.h" #include "toolbox_wifi.h" #include "toolbox_web.h" @@ -14,53 +15,489 @@ #include "web_ui_gz.h" // Generated by build_web.py // ============ CONFIGURATION ============ -#define SERIAL_TX_PIN 4 -#define SERIAL_RX_PIN 5 -#define DEFAULT_BAUD 9600 -#define PREFS_NS "serial" +#ifndef SERIAL_A_TX_PIN +#define SERIAL_A_TX_PIN 5 +#endif +#ifndef SERIAL_A_RX_PIN +#define SERIAL_A_RX_PIN 4 +#endif +#ifndef SERIAL_B_TX_PIN +#define SERIAL_B_TX_PIN 7 +#endif +#ifndef SERIAL_B_RX_PIN +#define SERIAL_B_RX_PIN 6 +#endif +#define DEFAULT_BAUD 9600 +#define DEFAULT_DATABITS 8 +#define DEFAULT_PARITY 'N' +#define DEFAULT_STOPBITS 1 +#define PREFS_NS "serial" +#define PREVIEW_BYTES 32 +#define HISTORY_SIZE 80 + +enum PassthroughMode : uint8_t { + PASSTHROUGH_OFF = 0, + PASSTHROUGH_A_TO_B = 1, + PASSTHROUGH_B_TO_A = 2, + PASSTHROUGH_BIDIR = 3, +}; + +struct ChannelState { + const char* id; + const char* label; + uint8_t rxPin; + uint8_t txPin; + HardwareSerial* uart; + uint32_t rxBytes; + uint32_t txBytes; +}; + +struct HistoryEntry { + uint32_t ts; + uint16_t len; + char port; + char dir; + char forwardedTo; + char hex[(PREVIEW_BYTES * 3) + 1]; + char ascii[(PREVIEW_BYTES * 4) + 1]; +}; // ============ STATE ============ -HardwareSerial SerialRS232(1); +HardwareSerial SerialChannelA(1); +HardwareSerial SerialChannelB(0); +ChannelState channels[] = { + {"A", "Channel A", SERIAL_A_RX_PIN, SERIAL_A_TX_PIN, &SerialChannelA, 0, 0}, + {"B", "Channel B", SERIAL_B_RX_PIN, SERIAL_B_TX_PIN, &SerialChannelB, 0, 0}, +}; +HistoryEntry history[HISTORY_SIZE]; +size_t historyHead = 0; +size_t historyCount = 0; uint32_t currentBaud = DEFAULT_BAUD; -unsigned long bytesRx = 0; -unsigned long bytesTx = 0; +uint8_t currentDataBits = DEFAULT_DATABITS; +char currentParity = DEFAULT_PARITY; +uint8_t currentStopBits = DEFAULT_STOPBITS; +uint32_t currentSerialConfig = SERIAL_8N1; +PassthroughMode currentPassthroughMode = PASSTHROUGH_BIDIR; + +// ============ HELPERS ============ +size_t totalRxBytes() { + return channels[0].rxBytes + channels[1].rxBytes; +} + +size_t totalTxBytes() { + return channels[0].txBytes + channels[1].txBytes; +} + +const char* configToString() { + static char config[5]; + snprintf(config, sizeof(config), "%u%c%u", currentDataBits, currentParity, currentStopBits); + return config; +} + +const char* passthroughModeToString(PassthroughMode mode) { + switch (mode) { + case PASSTHROUGH_A_TO_B: return "a_to_b"; + case PASSTHROUGH_B_TO_A: return "b_to_a"; + case PASSTHROUGH_BIDIR: return "both"; + case PASSTHROUGH_OFF: + default: return "off"; + } +} + +bool resolveSerialConfig(uint8_t dataBits, char parity, uint8_t stopBits, uint32_t& config) { + parity = toupper((unsigned char)parity); + if (dataBits == 7 && parity == 'N' && stopBits == 1) config = SERIAL_7N1; + else if (dataBits == 7 && parity == 'N' && stopBits == 2) config = SERIAL_7N2; + else if (dataBits == 7 && parity == 'E' && stopBits == 1) config = SERIAL_7E1; + else if (dataBits == 7 && parity == 'E' && stopBits == 2) config = SERIAL_7E2; + else if (dataBits == 7 && parity == 'O' && stopBits == 1) config = SERIAL_7O1; + else if (dataBits == 7 && parity == 'O' && stopBits == 2) config = SERIAL_7O2; + else if (dataBits == 8 && parity == 'N' && stopBits == 1) config = SERIAL_8N1; + else if (dataBits == 8 && parity == 'N' && stopBits == 2) config = SERIAL_8N2; + else if (dataBits == 8 && parity == 'E' && stopBits == 1) config = SERIAL_8E1; + else if (dataBits == 8 && parity == 'E' && stopBits == 2) config = SERIAL_8E2; + else if (dataBits == 8 && parity == 'O' && stopBits == 1) config = SERIAL_8O1; + else if (dataBits == 8 && parity == 'O' && stopBits == 2) config = SERIAL_8O2; + else return false; + return true; +} + +PassthroughMode parsePassthroughMode(const char* raw) { + if (!raw || !raw[0]) return PASSTHROUGH_BIDIR; + if (strcmp(raw, "off") == 0) return PASSTHROUGH_OFF; + if (strcmp(raw, "a_to_b") == 0) return PASSTHROUGH_A_TO_B; + if (strcmp(raw, "b_to_a") == 0) return PASSTHROUGH_B_TO_A; + if (strcmp(raw, "both") == 0 || strcmp(raw, "bidirectional") == 0) return PASSTHROUGH_BIDIR; + return PASSTHROUGH_BIDIR; +} + +int channelIndexFromId(const char* raw) { + if (!raw || !raw[0]) return 0; + char id = toupper((unsigned char)raw[0]); + if (id == 'B' || id == '1') return 1; + return 0; +} + +bool passthroughEnabledFor(int sourceIndex) { + if (sourceIndex == 0) { + return currentPassthroughMode == PASSTHROUGH_A_TO_B || currentPassthroughMode == PASSTHROUGH_BIDIR; + } + return currentPassthroughMode == PASSTHROUGH_B_TO_A || currentPassthroughMode == PASSTHROUGH_BIDIR; +} + +void appendAsciiPreview(char* out, size_t outSize, size_t& pos, const char* text) { + while (*text && pos + 1 < outSize) { + out[pos++] = *text++; + } +} + +void makeHexPreview(const uint8_t* data, size_t len, char* out, size_t outSize) { + size_t pos = 0; + size_t limit = len < PREVIEW_BYTES ? len : PREVIEW_BYTES; + for (size_t i = 0; i < limit && pos + 3 < outSize; i++) { + if (i > 0) out[pos++] = ' '; + snprintf(out + pos, outSize - pos, "%02X", data[i]); + pos += 2; + } + out[pos] = '\0'; +} + +void makeAsciiPreview(const uint8_t* data, size_t len, char* out, size_t outSize) { + size_t pos = 0; + size_t limit = len < PREVIEW_BYTES ? len : PREVIEW_BYTES; + for (size_t i = 0; i < limit && pos + 1 < outSize; i++) { + uint8_t value = data[i]; + if (value >= 32 && value < 127) { + out[pos++] = (char)value; + } else if (value == '\r') { + appendAsciiPreview(out, outSize, pos, "\\r"); + } else if (value == '\n') { + appendAsciiPreview(out, outSize, pos, "\\n"); + } else if (value == '\t') { + appendAsciiPreview(out, outSize, pos, "\\t"); + } else { + out[pos++] = '.'; + } + } + out[pos] = '\0'; +} + +void storeHistory(char port, char dir, char forwardedTo, const uint8_t* data, size_t len, uint32_t ts) { + HistoryEntry& entry = history[historyHead]; + entry.ts = ts; + entry.len = len > 0xFFFF ? 0xFFFF : (uint16_t)len; + entry.port = port; + entry.dir = dir; + entry.forwardedTo = forwardedTo; + makeHexPreview(data, len, entry.hex, sizeof(entry.hex)); + makeAsciiPreview(data, len, entry.ascii, sizeof(entry.ascii)); + + historyHead = (historyHead + 1) % HISTORY_SIZE; + if (historyCount < HISTORY_SIZE) historyCount++; +} + +void addPayloadPreview(JsonDocument& doc, const uint8_t* data, size_t len) { + char hex[(PREVIEW_BYTES * 3) + 1]; + char ascii[(PREVIEW_BYTES * 4) + 1]; + makeHexPreview(data, len, hex, sizeof(hex)); + makeAsciiPreview(data, len, ascii, sizeof(ascii)); + doc["hex"] = hex; + doc["ascii"] = ascii; +} + +void populatePorts(JsonDocument& doc) { + JsonArray ports = doc["ports"].to(); + for (size_t i = 0; i < 2; i++) { + JsonObject port = ports.add(); + port["id"] = channels[i].id; + port["label"] = channels[i].label; + port["rxPin"] = channels[i].rxPin; + port["txPin"] = channels[i].txPin; + port["rxBytes"] = channels[i].rxBytes; + port["txBytes"] = channels[i].txBytes; + } +} + +void populateStatus(JsonDocument& doc) { + doc["type"] = "status"; + doc["rxBytes"] = totalRxBytes(); + doc["txBytes"] = totalTxBytes(); + doc["uptime"] = millis() / 1000; + doc["heap"] = ESP.getFreeHeap(); + doc["baud"] = currentBaud; + doc["databits"] = currentDataBits; + doc["parity"] = String(currentParity); + doc["stopbits"] = currentStopBits; + doc["config"] = configToString(); + doc["passthroughMode"] = passthroughModeToString(currentPassthroughMode); + populatePorts(doc); + tbWifiStatusJson(doc); +} + +void populateSettings(JsonDocument& doc) { + doc["type"] = "settings"; + doc["baud"] = currentBaud; + doc["databits"] = currentDataBits; + doc["parity"] = String(currentParity); + doc["stopbits"] = currentStopBits; + doc["config"] = configToString(); + doc["passthroughMode"] = passthroughModeToString(currentPassthroughMode); + populatePorts(doc); + tbWifiSettingsJson(doc); +} + +void broadcastStatus() { + JsonDocument doc; + populateStatus(doc); + tbWsBroadcast(doc); +} + +void saveToolPreferences() { + Preferences prefs; + prefs.begin(PREFS_NS, false); + prefs.putUInt("baud", currentBaud); + prefs.putUChar("dbits", currentDataBits); + prefs.putUChar("parity", (uint8_t)currentParity); + prefs.putUChar("sbits", currentStopBits); + prefs.putUChar("ptmode", (uint8_t)currentPassthroughMode); + prefs.end(); +} + +void loadToolPreferences() { + Preferences prefs; + prefs.begin(PREFS_NS, true); + currentBaud = prefs.getUInt("baud", DEFAULT_BAUD); + currentDataBits = prefs.getUChar("dbits", DEFAULT_DATABITS); + currentParity = (char)prefs.getUChar("parity", (uint8_t)DEFAULT_PARITY); + currentStopBits = prefs.getUChar("sbits", DEFAULT_STOPBITS); + currentPassthroughMode = (PassthroughMode)prefs.getUChar("ptmode", (uint8_t)PASSTHROUGH_BIDIR); + prefs.end(); + + if (!resolveSerialConfig(currentDataBits, currentParity, currentStopBits, currentSerialConfig)) { + currentBaud = DEFAULT_BAUD; + currentDataBits = DEFAULT_DATABITS; + currentParity = DEFAULT_PARITY; + currentStopBits = DEFAULT_STOPBITS; + currentSerialConfig = SERIAL_8N1; + } + if (currentBaud == 0) currentBaud = DEFAULT_BAUD; + if (currentPassthroughMode > PASSTHROUGH_BIDIR) currentPassthroughMode = PASSTHROUGH_BIDIR; +} + +void beginChannel(ChannelState& channel) { + channel.uart->begin(currentBaud, currentSerialConfig, channel.rxPin, channel.txPin); +} + +void reconfigureChannels() { + for (size_t i = 0; i < 2; i++) { + channels[i].uart->end(); + beginChannel(channels[i]); + } +} + +void clearStatsAndHistory() { + for (size_t i = 0; i < 2; i++) { + channels[i].rxBytes = 0; + channels[i].txBytes = 0; + } + historyHead = 0; + historyCount = 0; +} + +void sendHistory(AsyncWebSocketClient* client) { + JsonDocument resp; + resp["type"] = "history"; + JsonArray items = resp["items"].to(); + + size_t start = (historyHead + HISTORY_SIZE - historyCount) % HISTORY_SIZE; + for (size_t i = 0; i < historyCount; i++) { + const HistoryEntry& entry = history[(start + i) % HISTORY_SIZE]; + JsonObject item = items.add(); + item["ts"] = entry.ts; + item["len"] = entry.len; + item["port"] = String(entry.port); + item["dir"] = (entry.dir == 'R') ? "RX" : "TX"; + item["rx"] = (entry.dir == 'R'); + item["hex"] = entry.hex; + item["ascii"] = entry.ascii; + if (entry.forwardedTo) item["forwardedTo"] = String(entry.forwardedTo); + } + + tbWsReply(client, resp); +} + +void sendError(AsyncWebSocketClient* client, const char* msg) { + JsonDocument resp; + resp["type"] = "error"; + resp["msg"] = msg; + tbWsReply(client, resp); +} + +int parseHexPayload(const char* input, uint8_t* out, size_t maxLen) { + if (!input) return 0; + + size_t count = 0; + const char* p = input; + while (*p) { + while (*p == ' ' || *p == ',' || *p == '\t' || *p == '\r' || *p == '\n') p++; + if (!*p) break; + if (!isxdigit((unsigned char)*p)) return -1; + + char token[3] = {0, 0, 0}; + token[0] = *p++; + if (*p && isxdigit((unsigned char)*p)) { + token[1] = *p++; + } + if (count >= maxLen) return -1; + out[count++] = (uint8_t)strtoul(token, NULL, 16); + + if (*p && *p != ' ' && *p != ',' && *p != '\t' && *p != '\r' && *p != '\n') { + return -1; + } + } + + return (int)count; +} + +void broadcastSentEvent(int channelIndex, const uint8_t* data, size_t len, uint32_t ts) { + JsonDocument resp; + resp["type"] = "sent"; + resp["port"] = channels[channelIndex].id; + resp["len"] = len; + resp["total"] = totalTxBytes(); + resp["portTxBytes"] = channels[channelIndex].txBytes; + resp["ts"] = ts; + addPayloadPreview(resp, data, len); + tbWsBroadcast(resp); +} + +void sendToChannel(int channelIndex, const uint8_t* data, size_t len, bool recordHistoryEntry = true) { + if (len == 0) return; + channels[channelIndex].uart->write(data, len); + channels[channelIndex].txBytes += len; + tbLedFlash(); + + uint32_t ts = millis(); + if (recordHistoryEntry) { + storeHistory(channels[channelIndex].id[0], 'T', 0, data, len, ts); + } + broadcastSentEvent(channelIndex, data, len, ts); +} + +void handleIncomingChannel(int channelIndex) { + ChannelState& channel = channels[channelIndex]; + int peerIndex = channelIndex == 0 ? 1 : 0; + + while (channel.uart->available()) { + uint8_t buffer[128]; + size_t count = 0; + while (channel.uart->available() && count < sizeof(buffer)) { + int value = channel.uart->read(); + if (value < 0) break; + buffer[count++] = (uint8_t)value; + } + if (count == 0) break; + + uint32_t ts = millis(); + channel.rxBytes += count; + bool forwarded = passthroughEnabledFor(channelIndex); + if (forwarded) { + channels[peerIndex].uart->write(buffer, count); + channels[peerIndex].txBytes += count; + } + tbLedFlash(); + storeHistory(channel.id[0], 'R', forwarded ? channels[peerIndex].id[0] : 0, buffer, count, ts); + + JsonDocument resp; + resp["type"] = "rx"; + resp["port"] = channel.id; + resp["len"] = count; + resp["total"] = totalRxBytes(); + resp["portRxBytes"] = channel.rxBytes; + resp["ts"] = ts; + if (forwarded) { + resp["forwardedTo"] = channels[peerIndex].id; + resp["peerTxBytes"] = channels[peerIndex].txBytes; + } + addPayloadPreview(resp, buffer, count); + tbWsBroadcast(resp); + } +} // ============ WEBSOCKET HANDLER ============ void handleToolWS(AsyncWebSocketClient* client, JsonDocument& doc) { const char* cmd = doc["cmd"]; + if (!cmd) return; if (strcmp(cmd, "status") == 0) { JsonDocument resp; - resp["type"] = "status"; - resp["rxBytes"] = bytesRx; - resp["txBytes"] = bytesTx; - resp["uptime"] = millis() / 1000; - resp["heap"] = ESP.getFreeHeap(); - resp["baud"] = currentBaud; - tbWifiStatusJson(resp); // adds mac, wifiMode, staConnected, etc. + populateStatus(resp); tbWsReply(client, resp); } else if (strcmp(cmd, "settings") == 0) { JsonDocument resp; - resp["type"] = "settings"; - resp["baud"] = currentBaud; - tbWifiSettingsJson(resp); // adds ssid, wifiMode, staSSID, etc. + populateSettings(resp); tbWsReply(client, resp); } + else if (strcmp(cmd, "getHistory") == 0) { + sendHistory(client); + } else if (strcmp(cmd, "sendAscii") == 0) { - const char* data = doc["data"]; - if (data) { - size_t len = strlen(data); - SerialRS232.write((const uint8_t*)data, len); - bytesTx += len; - tbLedFlash(); - - JsonDocument resp; - resp["type"] = "sent"; - resp["len"] = len; - resp["total"] = bytesTx; - tbWsBroadcast(resp); + String payload = doc["data"] | ""; + if (doc["crlf"] | false) payload += "\r\n"; + int channelIndex = channelIndexFromId(doc["port"] | "A"); + sendToChannel(channelIndex, (const uint8_t*)payload.c_str(), payload.length()); + } + else if (strcmp(cmd, "sendHex") == 0) { + const char* raw = doc["data"] | ""; + uint8_t buffer[128]; + int len = parseHexPayload(raw, buffer, sizeof(buffer)); + if (len < 0) { + sendError(client, "Invalid hex payload"); + return; } + int channelIndex = channelIndexFromId(doc["port"] | "A"); + sendToChannel(channelIndex, buffer, (size_t)len); + } + else if (strcmp(cmd, "setSerial") == 0) { + uint32_t baud = doc["baud"] | DEFAULT_BAUD; + uint8_t dataBits = doc["databits"] | DEFAULT_DATABITS; + const char* parityValue = doc["parity"] | "N"; + uint8_t stopBits = doc["stopbits"] | DEFAULT_STOPBITS; + uint32_t serialConfig = SERIAL_8N1; + + if (baud == 0 || baud > 2000000UL || !resolveSerialConfig(dataBits, parityValue[0], stopBits, serialConfig)) { + sendError(client, "Invalid serial settings"); + return; + } + + currentBaud = baud; + currentDataBits = dataBits; + currentParity = toupper((unsigned char)parityValue[0]); + currentStopBits = stopBits; + currentSerialConfig = serialConfig; + reconfigureChannels(); + saveToolPreferences(); + + JsonDocument resp; + resp["type"] = "serialConfig"; + resp["baud"] = currentBaud; + resp["databits"] = currentDataBits; + resp["parity"] = String(currentParity); + resp["stopbits"] = currentStopBits; + resp["config"] = configToString(); + tbWsBroadcast(resp); + broadcastStatus(); + } + else if (strcmp(cmd, "setPassthrough") == 0) { + currentPassthroughMode = parsePassthroughMode(doc["mode"] | "both"); + saveToolPreferences(); + + JsonDocument resp; + resp["type"] = "passthroughConfig"; + resp["mode"] = passthroughModeToString(currentPassthroughMode); + tbWsBroadcast(resp); + broadcastStatus(); } else if (strcmp(cmd, "savewifi") == 0) { const char* ssid = doc["ssid"]; @@ -70,9 +507,7 @@ void handleToolWS(AsyncWebSocketClient* client, JsonDocument& doc) { const char* staSSID = doc["staSSID"] | (const char*)NULL; const char* staPass = doc["staPass"] | (const char*)NULL; const char* mdnsHost = doc["mdnsHost"] | (const char*)NULL; - tbWifiSave(PREFS_NS, ssid, pass ? pass : "", - wifiMode, staSSID, staPass, mdnsHost); - // ^^ saves and restarts + tbWifiSave(PREFS_NS, ssid, pass ? pass : "", wifiMode, staSSID, staPass, mdnsHost); } } else if (strcmp(cmd, "wifiscan") == 0) { @@ -81,11 +516,11 @@ void handleToolWS(AsyncWebSocketClient* client, JsonDocument& doc) { tbWsReply(client, resp); } else if (strcmp(cmd, "clearHistory") == 0) { - bytesRx = 0; - bytesTx = 0; + clearStatsAndHistory(); JsonDocument resp; resp["type"] = "cleared"; tbWsBroadcast(resp); + broadcastStatus(); } } @@ -96,52 +531,24 @@ void setup() { tbLedBegin(); tbWifiBegin("SerialTool", "serial1234", PREFS_NS, "serialtool"); + loadToolPreferences(); tbWebBegin(INDEX_HTML_GZ, INDEX_HTML_GZ_LEN, handleToolWS); tbOtaBegin(); - SerialRS232.begin(currentBaud, SERIAL_8N1, SERIAL_RX_PIN, SERIAL_TX_PIN); + beginChannel(channels[0]); + beginChannel(channels[1]); Serial.println("\n RS-232 Serial Tool ready."); - Serial.println(" Waiting for serial data...\n"); + Serial.printf(" Channel A RX/TX: GPIO%u/GPIO%u\n", channels[0].rxPin, channels[0].txPin); + Serial.printf(" Channel B RX/TX: GPIO%u/GPIO%u\n", channels[1].rxPin, channels[1].txPin); + Serial.printf(" Serial config: %lu %s\n", (unsigned long)currentBaud, configToString()); + Serial.printf(" Passthrough: %s\n\n", passthroughModeToString(currentPassthroughMode)); } // ============ LOOP ============ void loop() { - // Read RS-232 data and forward to WebSocket - if (SerialRS232.available()) { - uint8_t buf[256]; - int n = 0; - while (SerialRS232.available() && n < (int)sizeof(buf)) { - buf[n++] = SerialRS232.read(); - } - bytesRx += n; - tbLedFlash(); - - JsonDocument doc; - doc["type"] = "rx"; - doc["len"] = n; - doc["total"] = bytesRx; - // Convert to hex string - String hex; - for (int i = 0; i < n && i < 32; i++) { - if (i > 0) hex += ' '; - char h[3]; - snprintf(h, sizeof(h), "%02X", buf[i]); - hex += h; - } - doc["hex"] = hex; - // Convert to ASCII - String ascii; - for (int i = 0; i < n && i < 32; i++) { - if (buf[i] >= 32 && buf[i] < 127) ascii += (char)buf[i]; - else if (buf[i] == '\r') ascii += "\\r"; - else if (buf[i] == '\n') ascii += "\\n"; - else ascii += '.'; - } - doc["ascii"] = ascii; - doc["ts"] = millis(); - tbWsBroadcast(doc); - } + handleIncomingChannel(0); + handleIncomingChannel(1); tbWifiLoop(); tbWebLoop(); From 2ac0b1541cf793e46247c16934c67fa7adb41bdd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 07:59:24 +0000 Subject: [PATCH 3/5] Update userial web UI for dual-channel bridge Agent-Logs-Url: https://github.com/bring42/tbx/sessions/2816ed76-19fb-4145-812b-d366a6770f48 Co-authored-by: bring42 <63049750+bring42@users.noreply.github.com> --- README.md | 2 +- build/dev_server.py | 169 +++++++++++++++++- tools/userial/web/app.css | 94 +++++++++- tools/userial/web/app.html | 188 +++++++++++++++----- tools/userial/web/app.js | 286 +++++++++++++++++-------------- tools/userial/web/config.json | 2 +- tools/userial/web/mock_data.json | 42 +++-- 7 files changed, 582 insertions(+), 201 deletions(-) diff --git a/README.md b/README.md index 1465a79..8438379 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ build/ build_web.py ← assembles template + tool files → gzip C header dev_server.py ← HTTP + mock WebSocket dev server, auto-reload tools/ - userial/ ← RS-232 serial monitor/sender + userial/ ← Dual-UART serial monitor/injector/passthrough bridge wifiscan/ ← WiFi network scanner ``` diff --git a/build/dev_server.py b/build/dev_server.py index 89baf3b..d10339f 100644 --- a/build/dev_server.py +++ b/build/dev_server.py @@ -25,6 +25,7 @@ import argparse import sys import os +import re from pathlib import Path from http.server import HTTPServer, SimpleHTTPRequestHandler import threading @@ -43,6 +44,98 @@ _last_hash = "" _mock_data = {} + +def _preview_ascii(data: bytes) -> str: + out = [] + for value in data[:32]: + if 32 <= value < 127: + out.append(chr(value)) + elif value == 13: + out.append("\\r") + elif value == 10: + out.append("\\n") + elif value == 9: + out.append("\\t") + else: + out.append(".") + return "".join(out) + + +def _preview_hex(data: bytes) -> str: + return " ".join(f"{value:02X}" for value in data[:32]) + + +def _parse_hex_bytes(raw: str) -> bytes: + tokens = re.findall(r"[0-9A-Fa-f]{1,2}", raw or "") + if not tokens: + return b"" + return bytes(int(token, 16) for token in tokens) + + +def _normalize_mock_state(): + status = _mock_data.setdefault("status", {"type": "status"}) + settings = _mock_data.setdefault("settings", {"type": "settings"}) + history = _mock_data.setdefault("history", {"type": "history", "items": []}) + + status.setdefault("rxBytes", 0) + status.setdefault("txBytes", 0) + status.setdefault("uptime", 0) + status.setdefault("heap", 180000) + status.setdefault("baud", 9600) + status.setdefault("databits", 8) + status.setdefault("parity", "N") + status.setdefault("stopbits", 1) + status.setdefault("config", "8N1") + status.setdefault("passthroughMode", "both") + status.setdefault("wifiMode", 0) + status.setdefault("mdnsHost", "tool") + status.setdefault("mdnsActive", True) + status.setdefault("apIP", "192.168.4.1") + + ports = status.setdefault("ports", [ + {"id": "A", "label": "Channel A", "rxPin": 4, "txPin": 5, "rxBytes": 0, "txBytes": 0}, + {"id": "B", "label": "Channel B", "rxPin": 6, "txPin": 7, "rxBytes": 0, "txBytes": 0}, + ]) + for port in ports: + port.setdefault("label", f"Channel {port.get('id', 'A')}") + port.setdefault("rxPin", 4 if port.get("id") == "A" else 6) + port.setdefault("txPin", 5 if port.get("id") == "A" else 7) + port.setdefault("rxBytes", 0) + port.setdefault("txBytes", 0) + + settings.update({ + "type": "settings", + "ssid": settings.get("ssid", "ToolAP"), + "apHasPass": settings.get("apHasPass", True), + "wifiMode": settings.get("wifiMode", status["wifiMode"]), + "staSSID": settings.get("staSSID", ""), + "staHasPass": settings.get("staHasPass", False), + "mdnsHost": settings.get("mdnsHost", status["mdnsHost"]), + "baud": settings.get("baud", status["baud"]), + "databits": settings.get("databits", status["databits"]), + "parity": settings.get("parity", status["parity"]), + "stopbits": settings.get("stopbits", status["stopbits"]), + "config": settings.get("config", status["config"]), + "passthroughMode": settings.get("passthroughMode", status["passthroughMode"]), + "ports": ports, + }) + history.setdefault("type", "history") + history.setdefault("items", []) + + +def _port_state(port_id: str): + port_id = (port_id or "A").upper() + for port in _mock_data["status"]["ports"]: + if port["id"] == port_id: + return port + return _mock_data["status"]["ports"][0] + + +def _append_history(entry): + items = _mock_data.setdefault("history", {"type": "history", "items": []})["items"] + items.append(entry) + del items[:-80] + # --------------------------------------------------------------------------- # File watching # --------------------------------------------------------------------------- @@ -182,6 +275,7 @@ def _load_mock_data(): "items": [] } } + _normalize_mock_state() async def _mock_ws_handler(websocket): @@ -211,24 +305,83 @@ async def _mock_ws_handler(websocket): })) elif cmd in ("send", "sendAscii"): data = msg.get("data", "") + port = _port_state(msg.get("port", "A")) + payload = data.encode("utf-8", "ignore") + port["txBytes"] += len(payload) + _mock_data["status"]["txBytes"] = sum(item["txBytes"] for item in _mock_data["status"]["ports"]) + _append_history({ + "ts": int(time.time() * 1000), + "port": port["id"], + "dir": "TX", + "hex": _preview_hex(payload), + "ascii": _preview_ascii(payload), + }) await websocket.send(json.dumps({ "type": "sent", - "len": len(data), - "hex": " ".join(f"{ord(c):02X}" for c in data[:32]), - "ascii": data[:32], - "total": 256 + len(data) + "port": port["id"], + "len": len(payload), + "hex": _preview_hex(payload), + "ascii": _preview_ascii(payload), + "total": _mock_data["status"]["txBytes"], + "portTxBytes": port["txBytes"], + "ts": int(time.time() * 1000) })) elif cmd == "sendHex": + port = _port_state(msg.get("port", "A")) + payload = _parse_hex_bytes(msg.get("data", "")) + port["txBytes"] += len(payload) + _mock_data["status"]["txBytes"] = sum(item["txBytes"] for item in _mock_data["status"]["ports"]) + _append_history({ + "ts": int(time.time() * 1000), + "port": port["id"], + "dir": "TX", + "hex": _preview_hex(payload), + "ascii": _preview_ascii(payload), + }) await websocket.send(json.dumps({ "type": "sent", - "len": 4, - "hex": msg.get("data", "00"), - "ascii": "....", - "total": 260 + "port": port["id"], + "len": len(payload), + "hex": _preview_hex(payload), + "ascii": _preview_ascii(payload), + "total": _mock_data["status"]["txBytes"], + "portTxBytes": port["txBytes"], + "ts": int(time.time() * 1000) + })) + elif cmd == "setSerial": + baud = int(msg.get("baud", _mock_data["status"]["baud"])) + databits = int(msg.get("databits", _mock_data["status"]["databits"])) + parity = str(msg.get("parity", _mock_data["status"]["parity"])) + stopbits = int(msg.get("stopbits", _mock_data["status"]["stopbits"])) + config = f"{databits}{parity}{stopbits}" + for section in ("status", "settings"): + _mock_data[section]["baud"] = baud + _mock_data[section]["databits"] = databits + _mock_data[section]["parity"] = parity + _mock_data[section]["stopbits"] = stopbits + _mock_data[section]["config"] = config + await websocket.send(json.dumps({ + "type": "serialConfig", + "baud": baud, + "databits": databits, + "parity": parity, + "stopbits": stopbits, + "config": config })) + elif cmd == "setPassthrough": + mode = msg.get("mode", "both") + _mock_data["status"]["passthroughMode"] = mode + _mock_data["settings"]["passthroughMode"] = mode + await websocket.send(json.dumps({"type": "passthroughConfig", "mode": mode})) elif cmd == "savesettings" or cmd == "savewifi": await websocket.send(json.dumps({"type": "saved"})) elif cmd == "clearHistory": + for port in _mock_data["status"]["ports"]: + port["rxBytes"] = 0 + port["txBytes"] = 0 + _mock_data["status"]["rxBytes"] = 0 + _mock_data["status"]["txBytes"] = 0 + _mock_data.setdefault("history", {"type": "history", "items": []})["items"] = [] await websocket.send(json.dumps({"type": "cleared"})) else: print(f"[dev] Unhandled WS command: {cmd}") diff --git a/tools/userial/web/app.css b/tools/userial/web/app.css index 012ec22..1736300 100644 --- a/tools/userial/web/app.css +++ b/tools/userial/web/app.css @@ -1,19 +1,101 @@ /* RS-232 Serial Tool — specific styles */ .stat-rx .stat-value { color: var(--success); } .stat-tx .stat-value { color: var(--warning); } -.log-rx { color: var(--success); } -.log-tx { color: var(--warning); } .log-hex { color: var(--primary); } .log-ascii { color: var(--text-muted); } +.log-line { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 6px; +} +.log-time { color: var(--text-muted); } .log-dir { - display: inline-block; - width: 24px; - font-weight: 600; + font-weight: 700; + min-width: 24px; } .log-dir.rx { color: var(--success); } .log-dir.tx { color: var(--warning); } +.port-badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 24px; + height: 24px; + padding: 0 8px; + border-radius: 999px; + font-size: 0.75rem; + font-weight: 700; + color: white; +} +.port-a { background: var(--primary); } +.port-b { background: var(--warning); } +.passthrough { background: var(--success); } +.forward-badge { + color: var(--text-muted); + font-size: 0.75rem; + font-weight: 600; +} .btn-tx { background: var(--warning); } .btn-tx:hover { background: #d97706; } +.port-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 12px; +} +.port-card { + display: flex; + flex-direction: column; + gap: 10px; +} +.port-card-head, +.section-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; +} +.port-meta { + color: var(--text-muted); + font-size: 0.85rem; +} +.port-stats { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 12px; +} +.port-stats div { + background: rgba(255, 255, 255, 0.03); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 10px 12px; +} +.port-stats span { + display: block; + color: var(--text-muted); + font-size: 0.75rem; +} +.port-stats strong { + display: block; + margin-top: 4px; + font-size: 1.1rem; +} +.inline-controls { + display: flex; + gap: 8px; + flex-wrap: wrap; +} +.inline-controls label { + display: flex; + align-items: center; + gap: 6px; + font-size: 0.8rem; + color: var(--text-muted); +} +.inline-controls select { + min-width: 120px; +} /* Terminal */ .terminal { @@ -32,7 +114,7 @@ font-size: 0.8rem; line-height: 1.5; white-space: pre-wrap; - word-break: break-all; + word-break: break-word; } .terminal-output .tx-line { color: var(--warning); } .terminal-output .rx-line { color: var(--success); } diff --git a/tools/userial/web/app.html b/tools/userial/web/app.html index 8fddb94..1436ae2 100644 --- a/tools/userial/web/app.html +++ b/tools/userial/web/app.html @@ -8,7 +8,7 @@
-

Statistics

+

Bridge Status

0
@@ -23,33 +23,94 @@

Statistics

Uptime
-
9600
-
Baud
+
9600 8N1
+
Serial Config
+
+
+
+ Passthrough: both + Traffic is monitored on both UARTs while injections can target either channel. +
+
+ +
+
+
+

Channel A

+ A +
+
RX GPIO4 · TX GPIO5
+
+
RX0
+
TX0
+
+
+
+
+

Channel B

+ B +
+
RX GPIO6 · TX GPIO7
+
+
RX0
+
TX0
+
-

Serial Data

-
-
Waiting for data...
+
+

Traffic Monitor

+
+ + +
+
+
+
Waiting for traffic...
-
- - - +
+ + +
-

Serial Console

+
+

Injection Terminal

+
+ +
+
-
--- Serial Console Ready --- +
--- Dual-channel terminal ready ---
> - +
@@ -61,7 +122,7 @@

Serial Console

Add CR+LF
-
+
+ + + + +
+
- +
Append CR+LF @@ -92,14 +164,25 @@

Send ASCII

- - - - + + + +
-

Send Hex

+
+

Send Hex

+
+ +
+
@@ -107,9 +190,9 @@

Send Hex

- + - +
@@ -118,20 +201,15 @@

Send Hex

Display

-
- - -
-
+
+ +
@@ -210,17 +292,37 @@

Serial Port

+
+

Passthrough

+
+
+ + +
+

+ When passthrough is enabled, bytes received on one UART are forwarded to the other UART while still being visible in the monitor. +

+ +
+
+

Pin Configuration

-ESP32-C3 (XIAO)     MAX3232          DB9
-────────────────────────────────────────
-GPIO5 (D3/TX) ────> T1IN
-                    T1OUT ─────────> Pin 3 (TX)
-GPIO4 (D2/RX) <──── R1OUT
-                    R1IN <───────── Pin 2 (RX)
-GND ───────────────> GND ──────────> Pin 5 (GND)
-3.3V ──────────────> VCC
+Channel A (default) Channel B (default) +────────────────────── ────────────────────── +RX GPIO4 (D2) RX GPIO6 (D4) +TX GPIO5 (D3) TX GPIO7 (D5) + +Override with: +- `SERIAL_A_RX_PIN` / `SERIAL_A_TX_PIN` +- `SERIAL_B_RX_PIN` / `SERIAL_B_TX_PIN` +
diff --git a/tools/userial/web/app.js b/tools/userial/web/app.js index bd6a0c1..41feae5 100644 --- a/tools/userial/web/app.js +++ b/tools/userial/web/app.js @@ -1,19 +1,11 @@ -/* ============================================================ - RS-232 Serial Tool — App JS - Tool-specific WebSocket handlers, UI logic - ============================================================ */ - const log = document.getElementById('log'); let logEntries = []; let appendCrlf = true; let localEcho = true; -let termAddCrlf = true; let termHistory = []; let termHistoryIdx = -1; let termCurrentInput = ''; -// --- base.js hooks ------------------------------------------------------- - function onConnected() { wsSend({ cmd: 'status' }); wsSend({ cmd: 'settings' }); @@ -26,120 +18,169 @@ function onSettingsOpen() { function onMessage(data) { if (data.type === 'status') { - document.getElementById('rxBytes').textContent = data.rxBytes || 0; - document.getElementById('txBytes').textContent = data.txBytes || 0; - document.getElementById('uptime').textContent = formatUptime(data.uptime); - document.getElementById('baudRate').textContent = data.baud || 9600; + renderStatus(data); + } else if (data.type === 'settings') { + populateToolSettings(data); } else if (data.type === 'rx') { - addLogEntry({ ...data, dir: 'RX' }); - document.getElementById('rxBytes').textContent = data.total || 0; - terminalAppend(data.ascii || '', 'rx-line'); + const entry = normalizeEntry({ ...data, dir: 'RX' }); + addLogEntry(entry); + updateTrafficStats(data, true); + terminalAppend('[' + entry.port + '] ' + decodeDisplayText(entry.ascii) + '\n', 'rx-line'); } else if (data.type === 'sent') { - addLogEntry({ ...data, dir: 'TX' }); - document.getElementById('txBytes').textContent = data.total || 0; - // Terminal TX shown via local echo, skip here + const entry = normalizeEntry({ ...data, dir: 'TX' }); + addLogEntry(entry); + updateTrafficStats(data, false); } else if (data.type === 'history') { loadHistory(data); - } else if (data.type === 'settings') { - document.getElementById('baudSelect').value = data.baud || 9600; - document.getElementById('databitsSelect').value = data.databits || 8; - document.getElementById('paritySelect').value = data.parity || 'N'; - document.getElementById('stopbitsSelect').value = data.stopbits || 1; } else if (data.type === 'serialConfig') { - document.getElementById('baudRate').textContent = data.baud; + document.getElementById('serialConfigValue').textContent = data.baud + ' ' + data.config; + populateToolSettings(data); showToast('Serial configured: ' + data.baud + ' ' + data.config, 'success'); + } else if (data.type === 'passthroughConfig') { + updatePassthroughBadge(data.mode || 'off'); + document.getElementById('passthroughModeSelect').value = data.mode || 'off'; + showToast('Passthrough updated: ' + (data.mode || 'off'), 'success'); } else if (data.type === 'cleared') { - log.innerHTML = '
Waiting for data...
'; - logEntries = []; + clearLog(); document.getElementById('rxBytes').textContent = '0'; document.getElementById('txBytes').textContent = '0'; + setPortValue('A', 'Rx', 0); + setPortValue('A', 'Tx', 0); + setPortValue('B', 'Rx', 0); + setPortValue('B', 'Tx', 0); + termClear('--- Cleared ---\n'); } else if (data.type === 'error') { showToast(data.msg || 'Error', 'error'); } } -// --- Log ----------------------------------------------------------------- +function normalizeEntry(data) { + const port = (data.port || 'A').toUpperCase(); + const dir = data.dir || (data.rx ? 'RX' : 'TX'); + return { + port, + dir, + ts: data.ts, + len: data.len || 0, + hex: data.hex || '', + ascii: data.ascii || '', + forwardedTo: data.forwardedTo || '', + timeStr: data.timeStr || formatTimestamp(data.ts) + }; +} -function addLogEntry(data, prepend) { - if (prepend === undefined) prepend = true; - if (logEntries.length === 0) log.innerHTML = ''; +function renderStatus(data) { + document.getElementById('rxBytes').textContent = data.rxBytes || 0; + document.getElementById('txBytes').textContent = data.txBytes || 0; + document.getElementById('uptime').textContent = formatUptime(data.uptime || 0); + document.getElementById('serialConfigValue').textContent = (data.baud || 9600) + ' ' + (data.config || '8N1'); + updatePassthroughBadge(data.passthroughMode || 'off'); + (data.ports || []).forEach(port => { + document.getElementById('port' + port.id + 'Pins').textContent = 'RX GPIO' + port.rxPin + ' · TX GPIO' + port.txPin; + setPortValue(port.id, 'Rx', port.rxBytes || 0); + setPortValue(port.id, 'Tx', port.txBytes || 0); + }); +} - const time = data.timeStr || formatTimestamp(data.ts); - const isRx = data.dir === 'RX'; - const showTime = document.getElementById('showTimestamp').checked; - const showDir = document.getElementById('showDirection').checked; - const showCtrl = document.getElementById('showControlChars').checked; - const mode = document.getElementById('displayMode').value; +function populateToolSettings(data) { + if (data.baud) document.getElementById('baudSelect').value = data.baud; + if (data.databits) document.getElementById('databitsSelect').value = data.databits; + if (data.parity) document.getElementById('paritySelect').value = data.parity; + if (data.stopbits) document.getElementById('stopbitsSelect').value = data.stopbits; + if (data.passthroughMode) document.getElementById('passthroughModeSelect').value = data.passthroughMode; +} - let ascii = data.ascii || ''; - if (!showCtrl) ascii = ascii.replace(/\\r/g, '').replace(/\\n/g, '').replace(/\\t/g, ''); +function updatePassthroughBadge(mode) { + document.getElementById('passthroughBadge').textContent = 'Passthrough: ' + mode; +} - let html = ''; - if (showTime) html += '' + time + ''; - if (showDir) html += '' + data.dir + ' '; - if (mode === 'both' || mode === 'hex') { - html += '' + (data.hex || '') + ''; - } - if (mode === 'both') { - html += ' [' + ascii + ']'; - } else if (mode === 'ascii') { - html += '' + ascii + ''; +function setPortValue(port, kind, value) { + const el = document.getElementById('port' + port + kind); + if (el) el.textContent = value; +} + +function updateTrafficStats(data, isRx) { + if (isRx) { + document.getElementById('rxBytes').textContent = data.total || 0; + if (data.port) setPortValue(data.port, 'Rx', data.portRxBytes || 0); + if (data.forwardedTo) setPortValue(data.forwardedTo, 'Tx', data.peerTxBytes || 0); + } else { + document.getElementById('txBytes').textContent = data.total || 0; + if (data.port) setPortValue(data.port, 'Tx', data.portTxBytes || 0); } +} - const entry = document.createElement('div'); - entry.className = 'log-entry'; - entry.innerHTML = html; +function addLogEntry(data, prepend = true) { + const entryData = normalizeEntry(data); + if (logEntries.length === 0) log.innerHTML = ''; if (prepend) { - log.insertBefore(entry, log.firstChild); - logEntries.unshift(data); - if (logEntries.length > 200) { - logEntries.pop(); - if (log.lastChild) log.removeChild(log.lastChild); - } + logEntries.unshift(entryData); + if (logEntries.length > 200) logEntries.pop(); } else { - log.appendChild(entry); - logEntries.push(data); + logEntries.push(entryData); } + refreshLogDisplay(); +} + +function entryMatchesFilter(entry) { + const filter = document.getElementById('monitorFilter').value; + return filter === 'all' || entry.port === filter; +} + +function renderLogEntry(entry) { + const showTime = document.getElementById('showTimestamp').checked; + const showDir = document.getElementById('showDirection').checked; + const showPort = document.getElementById('showPort').checked; + const showCtrl = document.getElementById('showControlChars').checked; + const mode = document.getElementById('displayMode').value; + let ascii = entry.ascii || ''; + if (!showCtrl) ascii = ascii.replace(/\\r/g, '').replace(/\\n/g, '').replace(/\\t/g, ''); + + const parts = []; + if (showTime) parts.push('' + entry.timeStr + ''); + if (showPort) parts.push('' + entry.port + ''); + if (showDir) parts.push('' + entry.dir + ''); + if (entry.forwardedTo) parts.push('→ ' + entry.forwardedTo + ''); + if (mode === 'both' || mode === 'hex') parts.push('' + escapeHtml(entry.hex || '') + ''); + if (mode === 'both') parts.push('[' + escapeHtml(ascii) + ']'); + else if (mode === 'ascii') parts.push('' + escapeHtml(ascii) + ''); + return '
' + parts.join(' ') + '
'; } function loadHistory(data) { logEntries = []; - log.innerHTML = ''; if (!data.items || data.items.length === 0) { - log.innerHTML = '
Waiting for data...
'; + clearLog(); return; } - data.items.forEach(item => { - item.dir = item.rx ? 'RX' : 'TX'; - item.timeStr = formatTimestamp(item.ts); - addLogEntry(item, false); - }); + data.items.forEach(item => logEntries.push(normalizeEntry(item))); + refreshLogDisplay(); } function clearLog() { logEntries = []; - log.innerHTML = '
Waiting for data...
'; + log.innerHTML = '
Waiting for traffic...
'; } function refreshLogDisplay() { - const entries = [...logEntries]; - logEntries = []; - log.innerHTML = ''; - if (entries.length === 0) { - log.innerHTML = '
Waiting for data...
'; - } else { - entries.forEach(e => addLogEntry(e, false)); + const filtered = logEntries.filter(entryMatchesFilter); + if (filtered.length === 0) { + log.innerHTML = '
Waiting for traffic...
'; + return; } + log.innerHTML = filtered.map(renderLogEntry).join(''); } function clearHistory() { - if (confirm('Clear all history and statistics?')) { + if (confirm('Clear captured history and counters on the device?')) { wsSend({ cmd: 'clearHistory' }); } } -// --- Download / Export --------------------------------------------------- +function decodeDisplayText(text) { + return String(text || '').replace(/\\r/g, '\r').replace(/\\n/g, '\n').replace(/\\t/g, '\t'); +} function downloadLog() { if (logEntries.length === 0) { @@ -149,35 +190,42 @@ function downloadLog() { const fmt = document.getElementById('exportFormat').value; const incTime = document.getElementById('exportTimestamp').checked; const incDir = document.getElementById('exportDirection').checked; + const incPort = document.getElementById('exportPort').checked; const incCtrl = document.getElementById('exportControlChars').checked; - let text = 'RS-232 Serial Log - ' + new Date().toISOString() + '\n'; + let text = 'Dual UART Serial Log - ' + new Date().toISOString() + '\n'; text += '='.repeat(60) + '\n\n'; logEntries.forEach(entry => { - const time = entry.timeStr || formatTimestamp(entry.ts); - const dir = entry.dir || (entry.rx ? 'RX' : 'TX'); let ascii = entry.ascii || ''; if (!incCtrl) ascii = ascii.replace(/\\r/g, '').replace(/\\n/g, '').replace(/\\t/g, ''); - let line = ''; - if (incTime) line += '[' + time + '] '; - if (incDir) line += dir + ' '; - if (fmt === 'hex') { - line += (entry.hex || ''); - } else if (fmt === 'ascii') { - line += ascii; - } else { - line += 'HEX: ' + (entry.hex || '') + ' ASCII: ' + ascii; - } - text += line + '\n'; + const line = []; + if (incTime) line.push('[' + entry.timeStr + ']'); + if (incPort) line.push(entry.port); + if (incDir) line.push(entry.dir); + if (entry.forwardedTo) line.push('→ ' + entry.forwardedTo); + if (fmt === 'hex') line.push(entry.hex || ''); + else if (fmt === 'ascii') line.push(ascii); + else line.push('HEX: ' + (entry.hex || '') + ' ASCII: ' + ascii); + text += line.join(' ') + '\n'; }); const blob = new Blob([text], { type: 'text/plain' }); - downloadBlob(blob, 'serial_log_' + new Date().toISOString().replace(/[:.]/g, '-') + '.txt'); + downloadBlob(blob, 'dual_uart_log_' + new Date().toISOString().replace(/[:.]/g, '-') + '.txt'); showToast('Log downloaded', 'success'); } -// --- Send ---------------------------------------------------------------- +function selectedPort(selectId) { + return document.getElementById(selectId).value || 'A'; +} + +function processEscapes(text) { + return text + .replace(/\\r/g, '\r') + .replace(/\\n/g, '\n') + .replace(/\\t/g, '\t') + .replace(/\\x([0-9A-Fa-f]{2})/g, (_, h) => String.fromCharCode(parseInt(h, 16))); +} function toggleCRLF() { toggleSwitch('crlfToggle', (active) => { appendCrlf = active; }); @@ -186,37 +234,30 @@ function toggleCRLF() { function sendAscii() { const data = document.getElementById('asciiData').value; if (!data) { showToast('Enter text to send', 'error'); return; } - wsSend({ cmd: 'sendAscii', data: data, crlf: appendCrlf }); + wsSend({ cmd: 'sendAscii', port: selectedPort('asciiPortSelect'), data: processEscapes(data), crlf: appendCrlf }); } function sendQuickAscii(text) { - const processed = text - .replace(/\\r/g, '\r') - .replace(/\\n/g, '\n') - .replace(/\\x([0-9A-Fa-f]{2})/g, (m, h) => String.fromCharCode(parseInt(h, 16))); - wsSend({ cmd: 'sendAscii', data: processed, crlf: false }); + wsSend({ cmd: 'sendAscii', port: selectedPort('asciiPortSelect'), data: processEscapes(text), crlf: appendCrlf }); } function sendHex() { const data = document.getElementById('hexData').value.trim(); if (!data) { showToast('Enter hex bytes to send', 'error'); return; } if (!/^[0-9a-fA-F\s,]+$/.test(data)) { showToast('Invalid hex format', 'error'); return; } - wsSend({ cmd: 'sendHex', data: data }); + wsSend({ cmd: 'sendHex', port: selectedPort('hexPortSelect'), data }); } function sendQuickHex(hex) { - wsSend({ cmd: 'sendHex', data: hex }); + wsSend({ cmd: 'sendHex', port: selectedPort('hexPortSelect'), data: hex }); } -// --- Terminal ------------------------------------------------------------ - function toggleLocalEcho() { toggleSwitch('localEchoToggle', (active) => { localEcho = active; }); } function toggleTermCrlf() { toggleSwitch('termCrlfToggle', (active) => { - termAddCrlf = active; document.getElementById('termLineEnding').value = active ? 'crlf' : 'none'; }); } @@ -235,8 +276,7 @@ function terminalAppend(text, className) { const output = document.getElementById('termOutput'); const span = document.createElement('span'); span.className = className || 'rx-line'; - // Clean control chars for display, keep newlines - span.textContent = text.replace(/\r/g, '').replace(/\\r/g, ''); + span.textContent = text; output.appendChild(span); output.scrollTop = output.scrollHeight; } @@ -246,22 +286,16 @@ function termSend(text) { showToast('Not connected', 'error'); return; } - const lineEnding = getLineEnding(); - const fullText = text + lineEnding; - - // Local echo - if (localEcho) { - terminalAppend(text + '\n', 'tx-line'); - } - // Command history + const fullText = text + getLineEnding(); + if (localEcho) terminalAppend('[' + selectedPort('termPortSelect') + '] ' + text + '\n', 'tx-line'); if (text && (termHistory.length === 0 || termHistory[termHistory.length - 1] !== text)) { termHistory.push(text); if (termHistory.length > 50) termHistory.shift(); } termHistoryIdx = -1; - wsSend({ cmd: 'sendAscii', data: fullText, crlf: false }); + wsSend({ cmd: 'sendAscii', port: selectedPort('termPortSelect'), data: fullText, crlf: false }); } function termSendQuick(text) { @@ -272,12 +306,10 @@ function termSendQuick(text) { input.focus(); } -function termClear() { - document.getElementById('termOutput').innerHTML = '--- Cleared ---\n'; +function termClear(message) { + document.getElementById('termOutput').innerHTML = '' + (message || '--- Cleared ---\n') + ''; } -// --- Terminal input key handling ----------------------------------------- - document.getElementById('termInput').addEventListener('keydown', (e) => { const input = e.target; if (e.key === 'Enter') { @@ -312,20 +344,22 @@ document.getElementById('termInput').addEventListener('keydown', (e) => { }); document.getElementById('termLineEnding').addEventListener('change', (e) => { - termAddCrlf = e.target.value !== 'none'; - document.getElementById('termCrlfToggle').classList.toggle('active', termAddCrlf); + document.getElementById('termCrlfToggle').classList.toggle('active', e.target.value !== 'none'); }); -// --- Settings ------------------------------------------------------------ - function saveSerialConfig() { wsSend({ cmd: 'setSerial', - baud: parseInt(document.getElementById('baudSelect').value), - databits: parseInt(document.getElementById('databitsSelect').value), + baud: parseInt(document.getElementById('baudSelect').value, 10), + databits: parseInt(document.getElementById('databitsSelect').value, 10), parity: document.getElementById('paritySelect').value, - stopbits: parseInt(document.getElementById('stopbitsSelect').value) + stopbits: parseInt(document.getElementById('stopbitsSelect').value, 10) }); } - +function savePassthroughMode() { + wsSend({ + cmd: 'setPassthrough', + mode: document.getElementById('passthroughModeSelect').value + }); +} diff --git a/tools/userial/web/config.json b/tools/userial/web/config.json index b326c48..91f0aaa 100644 --- a/tools/userial/web/config.json +++ b/tools/userial/web/config.json @@ -1,3 +1,3 @@ { - "title": "RS-232 Serial Tool" + "title": "Dual UART Serial Tool" } diff --git a/tools/userial/web/mock_data.json b/tools/userial/web/mock_data.json index 1418792..5896cbb 100644 --- a/tools/userial/web/mock_data.json +++ b/tools/userial/web/mock_data.json @@ -1,16 +1,24 @@ { "status": { "type": "status", - "rxBytes": 1247, - "txBytes": 384, + "rxBytes": 2741, + "txBytes": 2998, "uptime": 4520, "baud": 9600, + "databits": 8, + "parity": "N", + "stopbits": 1, "config": "8N1", + "passthroughMode": "both", "heap": 142800, "mac": "AA:BB:CC:DD:EE:FF", "wifiMode": 0, "staConnected": false, - "apIP": "192.168.4.1" + "apIP": "192.168.4.1", + "ports": [ + { "id": "A", "label": "Channel A", "rxPin": 4, "txPin": 5, "rxBytes": 1247, "txBytes": 1536 }, + { "id": "B", "label": "Channel B", "rxPin": 6, "txPin": 7, "rxBytes": 1494, "txBytes": 1462 } + ] }, "settings": { "type": "settings", @@ -23,15 +31,12 @@ "baud": 9600, "databits": 8, "parity": "N", - "stopbits": 1 - }, - "wifiscan": { - "type": "wifiscan", - "networks": [ - { "ssid": "HomeNetwork", "rssi": -42, "enc": true }, - { "ssid": "Office-5G", "rssi": -58, "enc": true }, - { "ssid": "Guest-WiFi", "rssi": -71, "enc": false }, - { "ssid": "Neighbor", "rssi": -82, "enc": true } + "stopbits": 1, + "config": "8N1", + "passthroughMode": "both", + "ports": [ + { "id": "A", "label": "Channel A", "rxPin": 4, "txPin": 5, "rxBytes": 1247, "txBytes": 1536 }, + { "id": "B", "label": "Channel B", "rxPin": 6, "txPin": 7, "rxBytes": 1494, "txBytes": 1462 } ] }, "history": { @@ -39,19 +44,24 @@ "items": [ { "ts": 4510000, - "rx": true, + "port": "A", + "dir": "RX", + "forwardedTo": "B", "hex": "41 54 49 0D 0A", "ascii": "ATI\\r\\n" }, { - "ts": 4511000, - "rx": false, + "ts": 4510500, + "port": "B", + "dir": "RX", + "forwardedTo": "A", "hex": "4F 4B 0D 0A", "ascii": "OK\\r\\n" }, { "ts": 4515000, - "rx": true, + "port": "A", + "dir": "TX", "hex": "48 65 6C 6C 6F", "ascii": "Hello" } From 89aa4f03185746d04490522988b4398f6ca4444c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 08:12:08 +0000 Subject: [PATCH 4/5] Polish dual-channel passthrough validation fixes Agent-Logs-Url: https://github.com/bring42/tbx/sessions/2816ed76-19fb-4145-812b-d366a6770f48 Co-authored-by: bring42 <63049750+bring42@users.noreply.github.com> --- build/dev_server.py | 53 +- tools/userial/dist/index.html | 572 ++++++--- tools/userial/src/_assembled.html | 572 ++++++--- tools/userial/src/web_ui_gz.h | 1987 +++++++++++++++-------------- tools/userial/web/app.js | 2 +- 5 files changed, 1876 insertions(+), 1310 deletions(-) diff --git a/build/dev_server.py b/build/dev_server.py index d10339f..83d3a14 100644 --- a/build/dev_server.py +++ b/build/dev_server.py @@ -25,7 +25,6 @@ import argparse import sys import os -import re from pathlib import Path from http.server import HTTPServer, SimpleHTTPRequestHandler import threading @@ -43,6 +42,7 @@ _assembled_html = "" _last_hash = "" _mock_data = {} +_ws_url_rewrite = None def _preview_ascii(data: bytes) -> str: @@ -65,11 +65,26 @@ def _preview_hex(data: bytes) -> str: return " ".join(f"{value:02X}" for value in data[:32]) -def _parse_hex_bytes(raw: str) -> bytes: - tokens = re.findall(r"[0-9A-Fa-f]{1,2}", raw or "") - if not tokens: - return b"" - return bytes(int(token, 16) for token in tokens) +def _parse_hex_bytes(raw: str): + raw = raw or "" + out = bytearray() + i = 0 + while i < len(raw): + ch = raw[i] + if ch in " ,\t\r\n": + i += 1 + continue + if ch not in "0123456789abcdefABCDEF": + return None + token = ch + i += 1 + if i < len(raw) and raw[i] in "0123456789abcdefABCDEF": + token += raw[i] + i += 1 + if i < len(raw) and raw[i] not in " ,\t\r\n": + return None + out.append(int(token, 16)) + return bytes(out) def _normalize_mock_state(): @@ -167,6 +182,11 @@ def _rebuild_if_needed(): if current != _last_hash: _last_hash = current _assembled_html = assemble(_base_dir, _tool_dir) + if _ws_url_rewrite: + _assembled_html = _assembled_html.replace( + "ws://' + location.host + '/ws", + _ws_url_rewrite + ) # Inject auto-reload snippet reload_script = """ diff --git a/tools/userial/src/_assembled.html b/tools/userial/src/_assembled.html index 1decc69..25fe58c 100644 --- a/tools/userial/src/_assembled.html +++ b/tools/userial/src/_assembled.html @@ -3,7 +3,7 @@ - RS-232 Serial Tool + Dual UART Serial Tool - - - -
-
-

Dual UART Serial Tool

-
- - Connecting... -
- -
- -
- - - -
- - - -
-
-

Bridge Status

-
-
-
0
-
RX Bytes
-
-
-
0
-
TX Bytes
-
-
-
0s
-
Uptime
-
-
-
9600 8N1
-
Serial Config
-
-
-
- Passthrough: both - Traffic is monitored on both UARTs while injections can target either channel. -
-
- -
-
-
-

Channel A

- A -
-
RX GPIO4 · TX GPIO5
-
-
RX0
-
TX0
-
-
-
-
-

Channel B

- B -
-
RX GPIO6 · TX GPIO7
-
-
RX0
-
TX0
-
-
-
- -
-
-

Traffic Monitor

-
- - -
-
-
-
Waiting for traffic...
-
-
- - - -
-
-
- -
-
-
-

Injection Terminal

-
- -
-
-
-
--- Dual-channel terminal ready --- -
-
- > - -
-
-
-
- Local Echo -
-
-
- Add CR+LF -
-
-
- -
-
-
- - - - -
-
-
- -
-
-
-

Send ASCII

-
- -
-
-
- - -
-
- Append CR+LF -
-
- -
- - - - -
-
-
-
-

Send Hex

-
- -
-
-
- - -
- -
- - - - -
-
-
- - - - - -
- -
- - - - - diff --git a/tools/userial/src/_assembled.html b/tools/userial/src/_assembled.html index 25fe58c..18078f9 100644 --- a/tools/userial/src/_assembled.html +++ b/tools/userial/src/_assembled.html @@ -718,9 +718,9 @@

Send ASCII

- - - + + +
@@ -1508,7 +1508,7 @@

Device Info

} function sendQuickAscii(text) { - wsSend({ cmd: 'sendAscii', port: selectedPort('asciiPortSelect'), data: processEscapes(text), crlf: appendCrlf }); + wsSend({ cmd: 'sendAscii', port: selectedPort('asciiPortSelect'), data: processEscapes(text), crlf: false }); } function sendHex() { diff --git a/tools/userial/src/main.cpp b/tools/userial/src/main.cpp index e8b7865..51751a4 100644 --- a/tools/userial/src/main.cpp +++ b/tools/userial/src/main.cpp @@ -333,6 +333,9 @@ void sendError(AsyncWebSocketClient* client, const char* msg) { tbWsReply(client, resp); } +// Parse a hex payload made of 1-2 digit hex bytes separated by spaces/commas. +// Returns the parsed byte count on success, or -1 if the payload is malformed +// or exceeds the output buffer. int parseHexPayload(const char* input, uint8_t* out, size_t maxLen) { if (!input) return 0; diff --git a/tools/userial/src/web_ui_gz.h b/tools/userial/src/web_ui_gz.h index f9beac7..f712328 100644 --- a/tools/userial/src/web_ui_gz.h +++ b/tools/userial/src/web_ui_gz.h @@ -418,643 +418,643 @@ const uint8_t INDEX_HTML_GZ[] PROGMEM = { 0xef, 0xe4, 0xdd, 0xf9, 0x2b, 0xcb, 0xaa, 0x67, 0xfe, 0xcc, 0x4f, 0xf5, 0xe4, 0x4e, 0x81, 0x85, 0x93, 0xf3, 0x08, 0xc9, 0x87, 0xa0, 0xd4, 0xe9, 0x92, 0x9b, 0xe8, 0x76, 0x89, 0xfb, 0x20, 0xc1, 0x12, 0x4b, 0x51, 0xc5, - 0x5b, 0x7e, 0x2a, 0xc9, 0x9a, 0x07, 0xfb, 0x04, 0xa2, 0xd5, 0x04, 0xfa, - 0x13, 0xa8, 0xb1, 0x21, 0x9b, 0x80, 0xca, 0xcd, 0xae, 0x8e, 0x7f, 0xc1, - 0x06, 0x28, 0xe5, 0x49, 0xdb, 0xf8, 0xf8, 0xf1, 0xae, 0x7b, 0xfc, 0xa1, - 0xf7, 0x47, 0x84, 0xfe, 0xf2, 0xf2, 0x84, 0x55, 0x96, 0xbd, 0xbf, 0x8a, - 0x3c, 0xfd, 0xc9, 0xbb, 0xfb, 0x7b, 0x91, 0xa6, 0x53, 0xef, 0xee, 0xff, - 0xcb, 0xd2, 0x02, 0x59, 0x0a, 0xb4, 0xe1, 0x92, 0x14, 0x3d, 0x8b, 0xb4, - 0xef, 0xcc, 0x1a, 0x14, 0xce, 0xc6, 0x62, 0x6f, 0xe1, 0x46, 0x2e, 0xba, - 0xd7, 0xec, 0x78, 0xe4, 0x4d, 0x45, 0x41, 0x6b, 0x8b, 0x88, 0xdd, 0xee, - 0xb3, 0xdd, 0x1d, 0xb6, 0x7b, 0x42, 0xff, 0x7b, 0x55, 0x5b, 0x29, 0x87, - 0x34, 0x9e, 0x07, 0xcc, 0x52, 0xb1, 0x43, 0x5c, 0xf5, 0xab, 0x08, 0x1d, - 0x6c, 0xb5, 0xde, 0xe9, 0xb1, 0x4e, 0x87, 0x75, 0xba, 0xac, 0xb3, 0x85, - 0xb3, 0xec, 0xf2, 0xea, 0x17, 0x06, 0x2b, 0x03, 0x7b, 0x89, 0x7b, 0x1c, - 0x4f, 0x31, 0x93, 0xa9, 0x91, 0xee, 0x31, 0xdb, 0x39, 0x66, 0x5b, 0x3d, - 0xb6, 0x7d, 0x24, 0xa6, 0x32, 0x4c, 0xea, 0x27, 0x84, 0xdf, 0x39, 0x65, - 0x1d, 0x82, 0x0c, 0x2a, 0x3d, 0x2e, 0x2f, 0x4f, 0x07, 0xb8, 0xc3, 0x5e, - 0xbd, 0x42, 0xc0, 0x6f, 0xde, 0x9f, 0xb3, 0x67, 0xf0, 0x7d, 0x1d, 0xc5, - 0x4f, 0x89, 0x5e, 0xf9, 0x01, 0x2f, 0x47, 0x14, 0x61, 0x76, 0x8c, 0xdf, - 0x10, 0x80, 0xc7, 0xb6, 0xe8, 0x02, 0xe5, 0x45, 0x14, 0xde, 0xf8, 0x63, - 0xe0, 0xca, 0x64, 0xea, 0x31, 0x3a, 0x31, 0x2d, 0xe3, 0x59, 0x1c, 0xc7, - 0xce, 0x01, 0xda, 0x55, 0x04, 0x32, 0x82, 0x80, 0x03, 0xa7, 0x2b, 0x18, - 0x4a, 0x2c, 0xfc, 0x99, 0x25, 0xdf, 0x0e, 0xde, 0x1a, 0x50, 0xa9, 0x88, - 0xc5, 0x81, 0xec, 0x8f, 0x7d, 0xdb, 0xd0, 0x42, 0x72, 0xe5, 0x5c, 0xb9, - 0xe6, 0x92, 0x85, 0xdf, 0x4a, 0x54, 0xe2, 0xe0, 0x47, 0x0c, 0xbb, 0x88, - 0x0f, 0xec, 0xa3, 0x58, 0x60, 0xcb, 0xda, 0xbb, 0x80, 0xc4, 0x2c, 0xea, - 0x80, 0xb6, 0x02, 0xe8, 0xe7, 0xc0, 0xa5, 0x3e, 0x3e, 0xdd, 0x2a, 0x2a, - 0x21, 0x97, 0x81, 0xd4, 0x25, 0x3d, 0xdd, 0xca, 0xaf, 0x39, 0xea, 0xe9, - 0xe0, 0x9a, 0xdd, 0x83, 0xa3, 0x39, 0x6c, 0x8c, 0xe8, 0x76, 0x11, 0xdc, - 0x2e, 0xbd, 0x38, 0x76, 0x01, 0x67, 0x83, 0x53, 0x16, 0x9b, 0xa1, 0xda, - 0xda, 0x3c, 0x72, 0x57, 0x1c, 0xf5, 0x94, 0x27, 0x3d, 0x6b, 0x2b, 0x3c, - 0x66, 0xe4, 0xb8, 0x1a, 0x86, 0x77, 0x82, 0xeb, 0xa6, 0xe1, 0xed, 0x15, - 0x8e, 0x56, 0xe2, 0xce, 0x16, 0x60, 0xda, 0x60, 0x26, 0x85, 0x4d, 0x94, - 0xee, 0x2c, 0xb1, 0x4b, 0xbc, 0x3c, 0x23, 0xad, 0xb7, 0xb1, 0x7a, 0x41, - 0xf8, 0xbb, 0xe9, 0xec, 0xa9, 0x1c, 0x9e, 0x35, 0x3b, 0xfb, 0xee, 0x97, - 0x4d, 0x10, 0xac, 0x69, 0xed, 0x7f, 0xa4, 0x2e, 0x5f, 0xf0, 0xab, 0xed, - 0xd7, 0xe9, 0x6d, 0xaa, 0x16, 0x60, 0xa0, 0xc0, 0x3f, 0x52, 0x5f, 0x4f, - 0xb8, 0xa6, 0x76, 0x82, 0x57, 0xfe, 0xaf, 0xdb, 0x67, 0x5e, 0x95, 0x51, - 0x5d, 0xe1, 0x91, 0x2a, 0xef, 0xfa, 0x0a, 0x8f, 0xc1, 0xa3, 0x85, 0xd3, - 0xcb, 0x3b, 0x0c, 0x49, 0x58, 0x5f, 0x36, 0x55, 0xd3, 0xad, 0x06, 0x7c, - 0xcb, 0xd9, 0x3e, 0xa0, 0x8a, 0x66, 0xea, 0x11, 0x16, 0xbc, 0xb0, 0x6d, - 0x40, 0x6c, 0x7b, 0xb8, 0xd9, 0x6e, 0x72, 0x95, 0xcd, 0xdc, 0x87, 0x6d, - 0x22, 0xdb, 0x76, 0xb1, 0x57, 0x6f, 0x5e, 0xe7, 0x35, 0xd9, 0x12, 0xff, - 0xfc, 0x1a, 0xd2, 0x7d, 0x95, 0x9f, 0xee, 0xef, 0x62, 0x86, 0xf0, 0xa1, - 0xcc, 0xe4, 0xfd, 0x80, 0x9d, 0xc1, 0x22, 0xbe, 0x1c, 0x7b, 0xff, 0x78, - 0xb2, 0x9c, 0x77, 0x25, 0x2f, 0xcd, 0xb3, 0x2e, 0xfd, 0x83, 0x4a, 0x6c, - 0xde, 0x31, 0x4d, 0x66, 0x67, 0x7d, 0x12, 0x72, 0xf9, 0x1f, 0xab, 0x2f, - 0x9a, 0x4c, 0x56, 0xfa, 0xa2, 0xca, 0xdb, 0xdf, 0x56, 0xd0, 0x8a, 0x98, - 0xdb, 0x8b, 0xef, 0x29, 0x6d, 0x8f, 0xdd, 0xe5, 0x98, 0xbd, 0x03, 0x5b, - 0x75, 0xa5, 0xc0, 0x1d, 0x42, 0xc9, 0x42, 0x3f, 0x80, 0x21, 0xf5, 0xb6, - 0x3a, 0x9d, 0xda, 0x00, 0x3e, 0x2a, 0x8b, 0xc9, 0x6e, 0x0f, 0x6b, 0xe0, - 0x67, 0xe5, 0x2a, 0xbd, 0x6d, 0xac, 0x82, 0x9f, 0x95, 0xab, 0x6c, 0xf7, - 0xb1, 0x0a, 0x7e, 0x56, 0xae, 0x82, 0xe1, 0xd2, 0xca, 0xba, 0x81, 0x3f, - 0xab, 0x77, 0x6a, 0x8f, 0xf7, 0x6a, 0x6f, 0x9d, 0x6e, 0x6d, 0xf5, 0xa9, - 0x5f, 0xf4, 0xa7, 0x72, 0xa5, 0x9d, 0xe7, 0x88, 0xe6, 0x80, 0xfe, 0x54, - 0x47, 0xaf, 0xbb, 0xc3, 0xf1, 0xa3, 0xbf, 0xd5, 0xe9, 0xbe, 0xd5, 0xe1, - 0x94, 0xa7, 0xbf, 0x8f, 0x59, 0xce, 0x54, 0x16, 0xb5, 0xb8, 0x7e, 0x0b, - 0x17, 0xad, 0x2a, 0xec, 0xad, 0xb0, 0x38, 0x3a, 0x55, 0xd8, 0xb1, 0x9f, - 0xc4, 0xc5, 0x11, 0x70, 0x6a, 0x28, 0x1b, 0x94, 0x1e, 0x42, 0xe1, 0x52, - 0x97, 0x97, 0x41, 0x92, 0xe7, 0xb5, 0xc1, 0xf3, 0xb5, 0x76, 0xed, 0xfa, - 0x0a, 0x4b, 0xf5, 0x1f, 0xb9, 0x71, 0xf7, 0x10, 0x92, 0x5c, 0xb8, 0x91, - 0x9f, 0xdc, 0x57, 0xa2, 0xc7, 0x82, 0x8a, 0xae, 0x43, 0x8d, 0x37, 0x4a, - 0xe7, 0xca, 0x37, 0x26, 0x2d, 0x95, 0x5f, 0x82, 0x7e, 0x79, 0xe3, 0xcd, - 0xd7, 0xaa, 0xf3, 0xb6, 0x36, 0x78, 0x3b, 0x1e, 0xff, 0x06, 0x64, 0xbc, - 0x04, 0x16, 0xad, 0xce, 0x59, 0x31, 0x94, 0x5e, 0x97, 0xb3, 0xba, 0x0a, - 0x2d, 0xbb, 0x6b, 0x11, 0xa5, 0x07, 0x33, 0xf4, 0x89, 0xb7, 0x84, 0x73, - 0x1e, 0x46, 0xf7, 0xc6, 0xbb, 0x54, 0x4e, 0x98, 0x28, 0x81, 0x67, 0xf9, - 0x29, 0x7c, 0xb4, 0x58, 0x04, 0xf7, 0xe2, 0xfc, 0xc8, 0x32, 0xa2, 0x4b, - 0x5e, 0x8d, 0xd3, 0x5c, 0xdf, 0x63, 0x09, 0x55, 0xce, 0x76, 0x7c, 0xb7, - 0x25, 0x14, 0xa3, 0x5e, 0x57, 0xae, 0x9e, 0xca, 0xb1, 0x13, 0x2c, 0x5f, - 0x75, 0x21, 0xc5, 0xc8, 0x1e, 0xf4, 0x06, 0xd1, 0xad, 0xe5, 0x95, 0x45, - 0xb4, 0xfb, 0x39, 0x09, 0x3f, 0x0f, 0x81, 0xe6, 0xec, 0x6f, 0xff, 0xeb, - 0x7f, 0xb3, 0x63, 0x18, 0xb1, 0x75, 0x2c, 0x16, 0xac, 0xec, 0xd6, 0x06, - 0xc7, 0x54, 0xf9, 0x68, 0xcd, 0xca, 0x7a, 0xd0, 0xee, 0xb1, 0x9f, 0x5a, - 0x26, 0x6e, 0xf0, 0xd0, 0xa5, 0x62, 0xa1, 0x33, 0xd5, 0x3e, 0xbf, 0xae, - 0x90, 0x75, 0x0e, 0xd6, 0x39, 0x86, 0xa3, 0xb5, 0xf9, 0xf3, 0xd4, 0x9b, - 0xab, 0x27, 0x83, 0xf0, 0x70, 0x8e, 0x37, 0x27, 0x1a, 0xb7, 0xd8, 0x90, - 0x3c, 0xf9, 0x80, 0xb5, 0xe7, 0xdf, 0xf0, 0xa3, 0x3a, 0x20, 0xc3, 0xf8, - 0x41, 0x6f, 0x37, 0xa2, 0xe7, 0xea, 0xf0, 0x46, 0x1f, 0x7a, 0xa5, 0x8e, - 0x3c, 0xab, 0x21, 0x1d, 0xd0, 0xa1, 0x7c, 0x7e, 0x90, 0x27, 0x4e, 0xfc, - 0x20, 0x60, 0x43, 0x0f, 0xc3, 0x65, 0x6f, 0xfc, 0xd8, 0x1f, 0xd2, 0xe1, - 0x1e, 0x2a, 0x2b, 0x62, 0xd2, 0xdb, 0x4a, 0x5f, 0x17, 0x2b, 0x26, 0xd8, - 0x85, 0xce, 0x38, 0x15, 0xe6, 0x98, 0x52, 0x83, 0x71, 0xde, 0xfc, 0xfe, - 0xd3, 0x0c, 0xfa, 0x67, 0x4c, 0xed, 0x75, 0x26, 0xdb, 0x22, 0xf2, 0x8c, - 0x31, 0xd6, 0x07, 0xf7, 0x79, 0xe9, 0xe0, 0xa6, 0xf7, 0x6f, 0xdc, 0xed, - 0xd3, 0xf5, 0x1b, 0x00, 0x39, 0xdd, 0x7c, 0x62, 0x8d, 0xb1, 0x37, 0x71, - 0x97, 0x41, 0xd2, 0x54, 0x86, 0x3f, 0x75, 0x23, 0x65, 0xb9, 0x1b, 0x7f, - 0xfb, 0xcf, 0xff, 0x78, 0xe4, 0xff, 0x24, 0xf4, 0xc7, 0x43, 0xda, 0x48, - 0x0f, 0x29, 0x35, 0x4e, 0x7b, 0x4d, 0x73, 0xc6, 0xa5, 0x27, 0x59, 0x1a, - 0xa7, 0xdb, 0xcd, 0x0d, 0x79, 0x86, 0x09, 0x7e, 0x6d, 0xe5, 0x8a, 0xca, - 0x83, 0x2e, 0x90, 0xb9, 0xd3, 0xdc, 0xd8, 0x78, 0x0b, 0x84, 0x8a, 0x7c, - 0xb0, 0x71, 0x6e, 0xfd, 0x64, 0xba, 0xbf, 0xe1, 0xb0, 0x7f, 0xbb, 0x7c, - 0xf9, 0xee, 0xec, 0xe8, 0xfc, 0xf3, 0xd1, 0xe7, 0x77, 0xbf, 0x7c, 0xbe, - 0x38, 0x7b, 0xf3, 0x6f, 0x6c, 0x53, 0x49, 0xbb, 0xe2, 0x69, 0x4a, 0xb9, - 0x63, 0x4b, 0xb9, 0xe3, 0xb4, 0x9c, 0xc2, 0xd3, 0x91, 0x67, 0xdf, 0xb8, - 0xb0, 0xae, 0x5b, 0xb4, 0x87, 0xc1, 0xdf, 0x89, 0xe4, 0x97, 0x29, 0xca, - 0xfd, 0x8c, 0x06, 0xde, 0x68, 0x8d, 0x5b, 0x19, 0x74, 0xe3, 0xf3, 0x83, - 0xfd, 0xed, 0xf6, 0x7d, 0x86, 0x95, 0x3c, 0x8d, 0xb8, 0x64, 0x6c, 0x5c, - 0xb1, 0x6d, 0x93, 0xb5, 0x57, 0x55, 0x2b, 0xd5, 0x32, 0x0a, 0xb4, 0x8e, - 0xc2, 0xf5, 0x66, 0xd5, 0x66, 0xee, 0xad, 0x3f, 0xf1, 0xcd, 0x23, 0x1a, - 0xc9, 0xf0, 0xfd, 0x02, 0x54, 0x5e, 0xef, 0x67, 0x91, 0xf7, 0xfe, 0xac, - 0xf4, 0x8c, 0x46, 0x89, 0xe8, 0x07, 0x93, 0xe0, 0x88, 0x5f, 0x03, 0x7e, - 0x81, 0x56, 0x79, 0xc5, 0xb3, 0x16, 0xa5, 0xba, 0xcf, 0xe0, 0xe8, 0x82, - 0x3d, 0x63, 0x27, 0x81, 0xef, 0xcd, 0x93, 0x47, 0x81, 0xea, 0x61, 0x78, - 0x15, 0x42, 0x59, 0x13, 0xab, 0xe2, 0x0d, 0xe6, 0x2a, 0xbc, 0x80, 0x37, - 0xaf, 0xd6, 0x34, 0xca, 0x9f, 0x7a, 0xf1, 0x08, 0xd6, 0x73, 0x1e, 0xf6, - 0x3f, 0x8a, 0x3c, 0x17, 0x97, 0x1a, 0x50, 0x09, 0x59, 0x78, 0x3b, 0xe7, - 0xcc, 0x3f, 0xf7, 0x92, 0xdb, 0x30, 0xfa, 0xd2, 0x2e, 0xd8, 0x8b, 0xaa, - 0xb0, 0x5d, 0x55, 0x35, 0xbb, 0x88, 0x79, 0x79, 0xc0, 0xcf, 0xe2, 0x24, - 0x7f, 0x28, 0xf0, 0x89, 0x19, 0x99, 0xef, 0xa2, 0x23, 0x69, 0x8e, 0x16, - 0x97, 0x97, 0x67, 0xa7, 0x34, 0xdc, 0x6f, 0x78, 0xff, 0xd9, 0x1b, 0x77, - 0xe6, 0xb1, 0x06, 0x26, 0x37, 0xab, 0xf3, 0xba, 0x7d, 0x5f, 0x5d, 0x69, - 0x41, 0xdf, 0x5a, 0x7f, 0x7d, 0x8f, 0x57, 0xb6, 0xd4, 0xf0, 0xe2, 0xd4, - 0xc0, 0x9b, 0x5f, 0x27, 0x53, 0xb0, 0xbe, 0x7b, 0xb5, 0x47, 0x11, 0xfd, - 0x89, 0xc9, 0x82, 0x4b, 0x39, 0x91, 0xe5, 0x42, 0xbc, 0x4d, 0xc5, 0x1a, - 0x33, 0x58, 0x6a, 0xfb, 0xfc, 0xf1, 0xe0, 0x07, 0x52, 0x26, 0x7d, 0xe7, - 0x4a, 0xa1, 0x0e, 0x35, 0xa4, 0x53, 0xe7, 0xdc, 0x03, 0xed, 0x83, 0x0d, - 0x03, 0x77, 0xfe, 0x05, 0x55, 0x9d, 0x2f, 0x9e, 0xb7, 0xc0, 0xfb, 0x5b, - 0xf1, 0x52, 0x20, 0x8d, 0x64, 0xbb, 0x5b, 0x66, 0x38, 0xfa, 0xdc, 0xbb, - 0x75, 0xd2, 0x46, 0x7e, 0x3b, 0x1e, 0x8e, 0x13, 0x97, 0x98, 0xd8, 0x74, - 0x37, 0xd2, 0x35, 0x41, 0xbf, 0x16, 0x6b, 0x5f, 0x26, 0x2e, 0xe7, 0x6d, - 0x9a, 0xdd, 0x82, 0xbb, 0xab, 0x8f, 0x5b, 0x91, 0xd7, 0xbf, 0x60, 0xf7, - 0xf6, 0x01, 0x33, 0x43, 0x22, 0xa8, 0x0f, 0xbe, 0x9c, 0x86, 0xf8, 0x12, - 0xb5, 0x19, 0xb9, 0x5d, 0xb5, 0xcd, 0xd2, 0xb8, 0x08, 0x1a, 0xa0, 0x91, - 0x3b, 0x3f, 0xd6, 0x2e, 0x12, 0x4a, 0x86, 0x97, 0x90, 0x86, 0x6b, 0x91, - 0xa2, 0xe7, 0xf2, 0x20, 0x71, 0x52, 0xed, 0x64, 0x8c, 0x77, 0xf6, 0x08, - 0x56, 0x6d, 0x80, 0x35, 0x8a, 0xf7, 0xf4, 0x1f, 0x30, 0x7f, 0xb5, 0x6b, - 0x41, 0x10, 0xc7, 0x77, 0xfc, 0x0a, 0xe7, 0x34, 0xc4, 0x56, 0xbd, 0xd7, - 0xb9, 0x88, 0xbb, 0x1e, 0x2f, 0xbf, 0x9f, 0x9a, 0x0d, 0xb9, 0x2c, 0x21, - 0x36, 0x94, 0xd2, 0xe4, 0xa9, 0xe4, 0x87, 0x84, 0x5e, 0x2c, 0x40, 0xf0, - 0xd8, 0x20, 0xde, 0x12, 0x25, 0xd7, 0xb7, 0xbf, 0x3f, 0x91, 0xf1, 0x2b, - 0x0d, 0xc4, 0xeb, 0x31, 0x86, 0x57, 0xcd, 0x4e, 0xdf, 0x5c, 0xb2, 0x9f, - 0xc2, 0x38, 0xc1, 0xf9, 0xf5, 0x14, 0xeb, 0x1b, 0x81, 0xd5, 0xc9, 0xef, - 0xb5, 0xaf, 0xdb, 0x6c, 0x76, 0x8f, 0xfa, 0x73, 0xed, 0x11, 0xfa, 0x8b, - 0x54, 0xea, 0x6e, 0x7c, 0x57, 0xb9, 0x57, 0x6c, 0x06, 0xed, 0x5d, 0x44, - 0x1e, 0xde, 0xe0, 0x55, 0x1b, 0x4c, 0xd3, 0x8e, 0x50, 0xf8, 0x6d, 0x9b, - 0x8e, 0xd3, 0xb0, 0x46, 0xa0, 0x2f, 0x20, 0xe2, 0xed, 0xb5, 0xe6, 0xf7, - 0xd7, 0x6c, 0x4c, 0x33, 0x1a, 0xa4, 0x0a, 0x60, 0x62, 0x48, 0x15, 0xc5, - 0x7a, 0xde, 0xe6, 0x72, 0x04, 0xb1, 0xfd, 0xd1, 0x9d, 0x2d, 0x0e, 0xf0, - 0x0a, 0xef, 0xc4, 0xc5, 0x4d, 0x97, 0x32, 0xa9, 0x62, 0xde, 0x92, 0xf4, - 0xeb, 0x58, 0x25, 0x42, 0x77, 0x3c, 0x9b, 0x4f, 0xc2, 0xef, 0x63, 0x9c, - 0x2c, 0x4a, 0x2d, 0xf1, 0xfe, 0xf3, 0x75, 0xfc, 0x2c, 0xb6, 0x7f, 0x67, - 0x17, 0xfb, 0x0a, 0x1f, 0x8d, 0xa9, 0x3b, 0x67, 0x30, 0x93, 0x1c, 0x79, - 0x8a, 0x6f, 0x18, 0xad, 0x06, 0xf2, 0xfa, 0xe8, 0x24, 0x0f, 0xe5, 0xb5, - 0x3b, 0x5a, 0x13, 0xcc, 0xab, 0xc8, 0xf3, 0xf0, 0xa1, 0xf6, 0x85, 0x0a, - 0x6c, 0x02, 0x89, 0x98, 0x96, 0xc1, 0x5a, 0xc1, 0xab, 0x8b, 0x07, 0x71, - 0x6a, 0x51, 0xb0, 0xd9, 0x53, 0x5c, 0xed, 0x40, 0x8f, 0x2c, 0x89, 0xd3, - 0x5d, 0xf4, 0x75, 0xa0, 0x95, 0x8c, 0x47, 0x91, 0xbf, 0x48, 0xe8, 0xda, - 0xf7, 0xc3, 0x47, 0xfc, 0x43, 0x60, 0xa8, 0x40, 0x0f, 0xc3, 0x3b, 0x76, - 0xec, 0xc6, 0x1e, 0x45, 0x1e, 0x0a, 0x43, 0xfe, 0x8f, 0xee, 0x8d, 0x7b, - 0x49, 0xcd, 0x60, 0xa9, 0x9f, 0xbd, 0xe1, 0x65, 0x38, 0xfa, 0xe2, 0x25, - 0x2d, 0x7c, 0xeb, 0x18, 0x5f, 0xdf, 0x44, 0xac, 0x5a, 0x8c, 0xdf, 0x4e, - 0xd8, 0x62, 0xcb, 0xc4, 0x0f, 0xfc, 0xe4, 0x9e, 0x4d, 0x96, 0x73, 0x7e, - 0x03, 0x0e, 0x56, 0x7a, 0x0c, 0x6a, 0x78, 0xcf, 0xec, 0x06, 0xac, 0x2c, - 0xec, 0x36, 0x3e, 0xa0, 0xbf, 0x9f, 0x23, 0x54, 0x3d, 0xf0, 0xfa, 0x43, - 0x0c, 0x29, 0x88, 0x0e, 0x36, 0xe0, 0x57, 0x0c, 0xc9, 0x1c, 0x83, 0x8b, - 0x30, 0x08, 0xce, 0x70, 0x23, 0x19, 0xcc, 0x45, 0x76, 0x88, 0x77, 0xf3, - 0x77, 0x0e, 0x36, 0x36, 0x36, 0x37, 0x19, 0x3d, 0xf0, 0x20, 0x91, 0xa7, - 0xeb, 0xfc, 0x1f, 0xf8, 0x6f, 0x63, 0x43, 0xf6, 0x8d, 0x25, 0x43, 0x71, - 0x11, 0x63, 0x43, 0x5e, 0xff, 0x7f, 0x1b, 0x43, 0xa3, 0xb0, 0x02, 0x66, - 0x4d, 0x35, 0xea, 0xb7, 0xf1, 0xfe, 0xe6, 0x66, 0x1d, 0xac, 0x5f, 0x14, - 0xa6, 0x58, 0xaf, 0x8d, 0x52, 0x16, 0x7e, 0xd7, 0x37, 0x6f, 0xe3, 0xba, - 0xb8, 0x6c, 0xf3, 0x36, 0x6e, 0x87, 0x73, 0x5a, 0x56, 0x0f, 0x19, 0x40, - 0x3b, 0x1c, 0x08, 0x80, 0xf8, 0x6f, 0x1c, 0x8e, 0x96, 0x33, 0x7c, 0x15, - 0xf8, 0xda, 0x4b, 0x5e, 0x06, 0x1e, 0x7e, 0x3d, 0xbe, 0x3f, 0x1b, 0x37, - 0xea, 0xe9, 0xfd, 0x91, 0xf5, 0x66, 0x9b, 0xf8, 0xe5, 0xdc, 0x8f, 0x93, - 0x36, 0xcc, 0xea, 0xf0, 0xc6, 0x6b, 0xd4, 0xc5, 0x55, 0x93, 0xb2, 0x85, - 0x0a, 0x90, 0xf0, 0x1c, 0x09, 0x80, 0x42, 0x31, 0x70, 0x22, 0xe2, 0x4b, - 0x0f, 0xe9, 0x9a, 0xcf, 0x39, 0xf9, 0x80, 0xeb, 0x19, 0x20, 0x3a, 0x24, - 0x2f, 0xe9, 0xdc, 0x30, 0x86, 0x44, 0x69, 0x10, 0x08, 0x7f, 0x22, 0x5d, - 0x3f, 0x4e, 0xfa, 0x02, 0xc1, 0x34, 0x0c, 0xbf, 0x30, 0x7f, 0xc2, 0xc6, - 0xde, 0x04, 0x10, 0x1c, 0xa7, 0xa5, 0x21, 0xa9, 0x81, 0x4b, 0x62, 0x38, - 0x01, 0x89, 0x9f, 0x36, 0x8b, 0xec, 0xc3, 0xea, 0x92, 0xe8, 0xf5, 0xa6, - 0x9a, 0xd7, 0x10, 0x6d, 0x7d, 0x53, 0xa8, 0xc8, 0xdf, 0x65, 0x7a, 0x34, - 0x19, 0x41, 0x3f, 0x7d, 0x3a, 0x1a, 0x9e, 0xfa, 0xf1, 0xc8, 0x42, 0x46, - 0x83, 0x70, 0x50, 0x12, 0xe4, 0x7b, 0x4a, 0x56, 0xb3, 0x03, 0x92, 0x44, - 0x3f, 0x00, 0x97, 0xfd, 0xfb, 0xbf, 0x63, 0x67, 0xe9, 0xe0, 0x34, 0x5e, - 0x46, 0xe7, 0x11, 0x91, 0x52, 0xa6, 0x6b, 0x9f, 0x9c, 0xbf, 0xbd, 0x7c, - 0x79, 0xda, 0x54, 0x39, 0x34, 0x6b, 0xf5, 0x5b, 0x8b, 0x6d, 0xc1, 0xbc, - 0xb0, 0x90, 0x6e, 0x06, 0xea, 0x81, 0x7b, 0x4d, 0xc4, 0xf3, 0x8c, 0xc6, - 0xe9, 0x69, 0x4c, 0x0d, 0x15, 0x3e, 0xef, 0xe8, 0x84, 0xf3, 0x21, 0xfb, - 0xe3, 0xe5, 0xdb, 0x37, 0xed, 0x05, 0x58, 0xb2, 0x5e, 0xc3, 0x6b, 0x63, - 0x9a, 0xd2, 0x1e, 0xf5, 0x34, 0x19, 0xfe, 0xe4, 0xce, 0xc7, 0x81, 0xf7, - 0x9a, 0x37, 0xd1, 0xb0, 0x94, 0x59, 0x8f, 0x59, 0x72, 0x0c, 0xf3, 0x5a, - 0x22, 0x9f, 0x63, 0x97, 0x82, 0x36, 0xbf, 0x31, 0x98, 0x8f, 0xa3, 0x29, - 0xf4, 0x35, 0x8a, 0x9a, 0x96, 0xce, 0x85, 0x81, 0xc7, 0x9f, 0xb7, 0x6b, - 0xd4, 0x7f, 0xbe, 0x64, 0xd4, 0x39, 0x46, 0xbf, 0xf7, 0xeb, 0x2d, 0xfc, - 0xa2, 0x82, 0x92, 0xa4, 0xfc, 0xa6, 0x88, 0x87, 0xdb, 0x18, 0xa3, 0xf5, - 0x1b, 0xe1, 0xf0, 0xcf, 0x12, 0x3a, 0xe2, 0x0b, 0x83, 0xf7, 0xe3, 0x8f, - 0xa5, 0x83, 0xf7, 0xf6, 0xe2, 0xe5, 0x1b, 0x15, 0x1f, 0x28, 0x8b, 0x21, - 0xe7, 0x0d, 0xa2, 0x71, 0x9c, 0x44, 0xb0, 0xfe, 0xfb, 0x93, 0x7b, 0x82, - 0x2b, 0xc7, 0x90, 0x2e, 0xe7, 0xe6, 0x42, 0x2e, 0x7d, 0x2b, 0xde, 0x79, - 0x1a, 0x21, 0xe7, 0xcf, 0xfd, 0x04, 0x61, 0xa6, 0x32, 0x2e, 0x9d, 0x00, - 0x7f, 0x59, 0x7a, 0x91, 0xd8, 0x4e, 0x0e, 0xa3, 0xa3, 0x20, 0x68, 0xd4, - 0xf1, 0x0d, 0x73, 0x60, 0x7e, 0x50, 0x91, 0x5f, 0xba, 0xa3, 0x69, 0x03, - 0xef, 0x91, 0xd4, 0x99, 0x08, 0x9f, 0x52, 0x1f, 0x8f, 0x71, 0x5b, 0x38, - 0xc1, 0x49, 0xe6, 0xcd, 0x3d, 0x20, 0x2e, 0xe9, 0x76, 0x40, 0x52, 0x1b, - 0xbf, 0xaf, 0xd1, 0x18, 0x56, 0x4e, 0x2c, 0x72, 0x90, 0x9f, 0x11, 0xab, - 0x37, 0x0d, 0x6e, 0x5b, 0x01, 0x59, 0x9e, 0xbc, 0x54, 0x5a, 0x18, 0x61, - 0x0b, 0xa3, 0xea, 0x2d, 0x60, 0x6f, 0x0d, 0x79, 0x22, 0x4b, 0x1e, 0x58, - 0x66, 0x92, 0xb8, 0x26, 0xee, 0xb0, 0x50, 0xc2, 0x20, 0x3c, 0x64, 0x61, - 0x90, 0x11, 0x88, 0xa1, 0x01, 0x84, 0xe6, 0x02, 0x81, 0x68, 0x0a, 0x50, - 0xab, 0x1b, 0xff, 0x26, 0xf9, 0xa7, 0x79, 0xa0, 0x72, 0x10, 0x3d, 0xd3, - 0xf9, 0x74, 0x1c, 0x44, 0x21, 0xe0, 0x08, 0xb3, 0x31, 0x8b, 0xaf, 0x5b, - 0x64, 0xf4, 0x34, 0xb3, 0x47, 0x52, 0xb1, 0xe7, 0xd4, 0x60, 0x71, 0xc7, - 0xeb, 0x54, 0x40, 0x22, 0x4e, 0x22, 0x90, 0x52, 0x9a, 0x2c, 0xf2, 0x92, - 0x65, 0x34, 0x97, 0xef, 0x42, 0xe2, 0x7b, 0x94, 0xba, 0xe0, 0x85, 0x06, - 0xd5, 0x4c, 0x22, 0x08, 0xf9, 0x23, 0x41, 0x44, 0xf0, 0x56, 0xe9, 0x95, - 0x46, 0x5c, 0x9d, 0x49, 0x90, 0xa0, 0x5c, 0xad, 0xcb, 0x86, 0x80, 0xce, - 0x28, 0x96, 0xc3, 0x65, 0x22, 0x44, 0xb1, 0x02, 0x44, 0x1b, 0x7f, 0x84, - 0x51, 0x6f, 0xa6, 0x52, 0x35, 0xa3, 0xa4, 0x71, 0x9e, 0xe3, 0xd1, 0x94, - 0xd4, 0x6f, 0x67, 0xd6, 0x68, 0x38, 0x2b, 0xa3, 0x9f, 0x76, 0xf4, 0x43, - 0xa5, 0xe3, 0xac, 0xc9, 0x66, 0x26, 0x9b, 0xf0, 0xde, 0x64, 0x65, 0x52, - 0x01, 0x2b, 0x5b, 0x7e, 0x4b, 0x6a, 0x4a, 0x4e, 0xca, 0xaa, 0xd9, 0x8d, - 0xa6, 0x2e, 0x0a, 0x8d, 0x13, 0x1c, 0x4f, 0x8f, 0xb9, 0x3e, 0x14, 0x7a, - 0xe3, 0x9f, 0x51, 0x84, 0x5d, 0xaa, 0x80, 0x0c, 0x0c, 0xe4, 0xa3, 0xa3, - 0x0f, 0xc1, 0x43, 0xd4, 0x55, 0xe5, 0xb5, 0x7c, 0x00, 0xb4, 0x44, 0xd2, - 0x89, 0xd5, 0x95, 0x20, 0x78, 0x6d, 0x39, 0xf3, 0x81, 0xa4, 0x29, 0x38, - 0x83, 0x62, 0x07, 0xd9, 0x5c, 0xd5, 0x85, 0x70, 0xbe, 0x91, 0x2f, 0xde, - 0x3d, 0x5e, 0x21, 0x94, 0x6f, 0x06, 0x32, 0xf8, 0xb0, 0xbd, 0x8c, 0x47, - 0xee, 0x02, 0x04, 0x81, 0xbd, 0x91, 0x8c, 0x7d, 0xdf, 0x93, 0x32, 0xef, - 0x7b, 0xf1, 0x13, 0xe9, 0xcb, 0x13, 0x0a, 0xf1, 0xe6, 0x97, 0xa6, 0x36, - 0x62, 0x75, 0x51, 0x8c, 0xd9, 0x0b, 0xb6, 0xdb, 0x91, 0xf3, 0x99, 0xc5, - 0xa8, 0x1d, 0xc7, 0xf5, 0x03, 0x2d, 0x7f, 0x6b, 0xb7, 0x93, 0x95, 0x78, - 0xed, 0x26, 0xd3, 0xf6, 0x24, 0x08, 0x61, 0x71, 0x8e, 0xd9, 0x26, 0xd5, - 0x85, 0x2a, 0x33, 0x51, 0xc5, 0x5e, 0x88, 0x03, 0x80, 0x62, 0x53, 0x9a, - 0xf0, 0x4a, 0x2e, 0x64, 0xff, 0x93, 0xc8, 0xd6, 0x60, 0x7d, 0xcb, 0x21, - 0x9f, 0x86, 0x31, 0x37, 0x92, 0xb4, 0x03, 0x40, 0x2d, 0x61, 0xcb, 0x27, - 0x32, 0x37, 0xa6, 0x00, 0x03, 0x7f, 0xce, 0x66, 0x7e, 0x10, 0xf8, 0xc8, - 0xf1, 0xfc, 0x8e, 0xd9, 0x16, 0x3e, 0x8d, 0xcc, 0xde, 0xcf, 0xfd, 0x3b, - 0xe6, 0x2d, 0xc2, 0xd1, 0x34, 0x9b, 0x64, 0x31, 0x0d, 0xcd, 0x72, 0x2e, - 0xd4, 0x1c, 0x14, 0x44, 0x22, 0x6d, 0xbe, 0x0c, 0x02, 0x95, 0xbd, 0x44, - 0xe7, 0xd0, 0xca, 0x38, 0x05, 0xe5, 0xa1, 0x01, 0xca, 0x66, 0x48, 0xd7, - 0x9a, 0x78, 0x88, 0xdc, 0x25, 0xe9, 0x07, 0x8d, 0xba, 0x37, 0x77, 0xfe, - 0xf9, 0x18, 0x78, 0xe0, 0x2b, 0x28, 0x50, 0xcb, 0x68, 0x9f, 0xd5, 0x7b, - 0xce, 0xd8, 0xbf, 0xf6, 0x93, 0x3a, 0x3d, 0xe8, 0x03, 0x36, 0xbe, 0x96, - 0xc4, 0xdd, 0xb9, 0x4a, 0x92, 0xc1, 0x6e, 0x02, 0xc5, 0x17, 0xf4, 0x4e, - 0x6e, 0xfa, 0x4f, 0xc5, 0x4a, 0x4a, 0xf2, 0x84, 0xec, 0x2e, 0x85, 0xb6, - 0x09, 0x92, 0xbe, 0x9b, 0xe9, 0x9b, 0x59, 0xe1, 0xa9, 0x51, 0x90, 0xea, - 0x8a, 0x61, 0x32, 0xcb, 0xce, 0xf4, 0xb2, 0xa2, 0xb0, 0x36, 0x68, 0x66, - 0x15, 0x34, 0xc5, 0x64, 0xb1, 0xdd, 0xce, 0x81, 0x49, 0x3f, 0x41, 0xa8, - 0x69, 0x13, 0xd4, 0xd6, 0xf1, 0x25, 0x3a, 0x89, 0xf0, 0x51, 0x9d, 0x7a, - 0xa7, 0x4e, 0xa3, 0xbf, 0x8f, 0x1c, 0x22, 0x8a, 0xcc, 0x56, 0x17, 0x89, - 0xf3, 0x45, 0x54, 0xf2, 0x99, 0x43, 0x06, 0xbc, 0xf3, 0xdd, 0x06, 0x4d, - 0x59, 0x7d, 0xc8, 0x20, 0x61, 0x0b, 0x30, 0x89, 0xd9, 0x53, 0x4c, 0xdf, - 0xcf, 0xe4, 0x4a, 0xbb, 0x4c, 0xed, 0xec, 0x54, 0x8a, 0x96, 0x19, 0x2d, - 0x42, 0x09, 0xfe, 0xca, 0x46, 0x33, 0x44, 0x95, 0x1b, 0x49, 0x0a, 0x7b, - 0xb5, 0x6c, 0x96, 0xbb, 0xa1, 0x8e, 0xd0, 0x51, 0xff, 0xa9, 0x17, 0x2c, - 0xc0, 0x44, 0x7a, 0x02, 0xab, 0x9d, 0xe0, 0x5d, 0xde, 0xfa, 0xa0, 0xfb, - 0x37, 0xfc, 0x71, 0x0b, 0xdf, 0x43, 0x0e, 0xf0, 0xcd, 0x0c, 0x7d, 0x51, - 0xf0, 0x82, 0x92, 0xf5, 0xc0, 0x1f, 0xab, 0xca, 0x88, 0x17, 0xe8, 0x9a, - 0x08, 0x07, 0x20, 0x1e, 0x8f, 0x3f, 0x04, 0x48, 0xca, 0x42, 0xc5, 0x5b, - 0x37, 0x95, 0x31, 0x65, 0x9d, 0x95, 0xd8, 0xe4, 0x56, 0x58, 0x99, 0xd1, - 0xe0, 0x55, 0x35, 0x1a, 0x71, 0x89, 0x2e, 0x68, 0xf4, 0x40, 0x71, 0xad, - 0x90, 0xc8, 0x23, 0x70, 0x3f, 0x25, 0xb3, 0xa0, 0x01, 0xf6, 0x86, 0xa4, - 0x8b, 0x3e, 0x71, 0x30, 0x03, 0x96, 0x5d, 0x72, 0x54, 0x37, 0x36, 0x7f, - 0xdc, 0x04, 0xcd, 0xae, 0x4e, 0x3e, 0xd7, 0xba, 0x92, 0xfc, 0x82, 0x27, - 0x07, 0x89, 0x96, 0x3a, 0xe0, 0xa9, 0xd7, 0x7a, 0x6a, 0x8d, 0xa7, 0xfe, - 0x65, 0x19, 0x62, 0xba, 0xda, 0x3b, 0x79, 0xc5, 0xdd, 0xa3, 0x78, 0x40, - 0xe9, 0x9e, 0xbc, 0x61, 0xef, 0x38, 0x08, 0x87, 0x8d, 0x21, 0x7c, 0xb4, - 0xd8, 0xc4, 0x0f, 0x3c, 0x74, 0x7c, 0xeb, 0x3c, 0xb0, 0x8c, 0x90, 0x09, - 0xde, 0xbf, 0x3b, 0x6f, 0xf3, 0x1d, 0xfe, 0xb7, 0x43, 0xbc, 0x16, 0x03, - 0x7e, 0x53, 0xad, 0xa6, 0x36, 0xda, 0x2a, 0xb7, 0xf0, 0xd2, 0x82, 0x61, - 0x60, 0xac, 0xe5, 0x30, 0xbb, 0xed, 0x69, 0xe4, 0x4d, 0xa0, 0x24, 0x00, - 0x96, 0x29, 0x12, 0x19, 0x48, 0x95, 0x48, 0x1c, 0xe8, 0x4b, 0x3c, 0x9e, - 0x51, 0x6d, 0xbb, 0x74, 0x39, 0xc6, 0x09, 0xbe, 0x75, 0xd9, 0x70, 0x53, - 0x70, 0xa4, 0x50, 0x48, 0xdb, 0x5e, 0xaf, 0xc0, 0x35, 0x22, 0xbd, 0x02, - 0xf6, 0x24, 0xf2, 0x6e, 0xc2, 0x2f, 0x4a, 0x4f, 0x00, 0x15, 0x5d, 0x6a, - 0x70, 0xb7, 0x9f, 0x74, 0x05, 0x4c, 0xd1, 0x6a, 0xc7, 0xf8, 0xb7, 0x07, - 0x4b, 0x0d, 0xab, 0xe5, 0xaf, 0xac, 0xfd, 0xf8, 0xbb, 0x4d, 0xca, 0x37, - 0x71, 0xbc, 0xd4, 0xb4, 0xea, 0xea, 0xea, 0x02, 0x40, 0x2e, 0xc2, 0xc5, - 0x32, 0x10, 0xe1, 0x2d, 0xa9, 0xca, 0xa2, 0x58, 0xf4, 0xdf, 0x60, 0x9e, - 0x81, 0x81, 0x6e, 0x81, 0x88, 0xbb, 0x2a, 0xb8, 0xd1, 0x67, 0x42, 0x7c, - 0x07, 0x04, 0xf5, 0xa2, 0xcb, 0x6c, 0x5b, 0x90, 0x57, 0x14, 0xfb, 0x5a, - 0xf1, 0x4a, 0xb8, 0x42, 0x96, 0x15, 0xe0, 0xc9, 0x55, 0x02, 0xf4, 0xee, - 0x6b, 0x58, 0x2a, 0x94, 0xd6, 0x43, 0xa4, 0x9e, 0x40, 0x3e, 0x97, 0x11, - 0x29, 0x2f, 0xdb, 0x50, 0x88, 0xa1, 0xac, 0xae, 0x24, 0xe3, 0x3c, 0x30, - 0x8b, 0x65, 0xe8, 0x0b, 0x18, 0xba, 0x98, 0xac, 0x27, 0xb5, 0xf9, 0x6b, - 0xa0, 0x87, 0xe4, 0x10, 0x6a, 0xcb, 0x74, 0xf6, 0x87, 0x3f, 0xc8, 0xb7, - 0x7d, 0x54, 0x28, 0x3c, 0x86, 0x83, 0xe0, 0x98, 0x49, 0x3a, 0x9c, 0x38, - 0xf6, 0xc7, 0xdc, 0x26, 0xb3, 0x01, 0xc1, 0x9d, 0x4a, 0x03, 0x08, 0x4f, - 0x4a, 0x81, 0xd8, 0xea, 0x89, 0x6d, 0x72, 0xac, 0x98, 0x4b, 0x32, 0x5a, - 0xe7, 0xc9, 0x45, 0x08, 0x88, 0xbd, 0x52, 0x03, 0x50, 0x05, 0x0c, 0x70, - 0x8b, 0xcf, 0x24, 0x22, 0x25, 0xe9, 0xcd, 0xe3, 0xce, 0x1c, 0xee, 0x2c, - 0xaa, 0xed, 0xdb, 0x82, 0xbc, 0x0c, 0x6b, 0xa7, 0x98, 0x05, 0x1f, 0xc9, - 0x03, 0x1c, 0x29, 0x77, 0x84, 0xfe, 0x2b, 0xc4, 0x3b, 0xdd, 0xab, 0xe1, - 0x7d, 0x31, 0x92, 0x0c, 0x4b, 0x5c, 0x56, 0x36, 0xc0, 0x4d, 0x3d, 0x77, - 0x21, 0xe1, 0xc9, 0xed, 0x9a, 0x0c, 0x5c, 0x96, 0x62, 0x83, 0x46, 0x75, - 0x41, 0x11, 0xe3, 0x71, 0xbe, 0x82, 0x40, 0x30, 0xb7, 0xe8, 0xb0, 0xed, - 0xd0, 0x43, 0xa1, 0x7c, 0xe3, 0xfa, 0x01, 0x6e, 0x55, 0xb2, 0xb3, 0x0b, - 0xa5, 0xeb, 0xfe, 0x42, 0x19, 0xe1, 0xb3, 0x0b, 0xa4, 0x2f, 0xfd, 0x72, - 0x17, 0xfc, 0x87, 0x3a, 0x66, 0xfe, 0x42, 0xef, 0xee, 0xd9, 0x42, 0x8e, - 0x77, 0xf6, 0xdb, 0x40, 0xce, 0x5f, 0xe8, 0x23, 0x62, 0x1b, 0x33, 0xdd, - 0x02, 0xc6, 0x99, 0x72, 0xc8, 0x3d, 0x8c, 0xa0, 0x02, 0x35, 0x0a, 0xad, - 0x50, 0x73, 0xba, 0xe9, 0x2b, 0x10, 0x05, 0x7a, 0x95, 0x19, 0xb1, 0xbc, - 0x44, 0x5d, 0xab, 0x25, 0x42, 0x6b, 0x4a, 0x6d, 0x5f, 0x5e, 0x44, 0xaf, - 0x37, 0x06, 0x1d, 0xa1, 0xac, 0x92, 0x1a, 0x27, 0x87, 0x35, 0x53, 0x82, - 0x72, 0x24, 0x9a, 0x02, 0xdd, 0x36, 0x6d, 0x51, 0xb6, 0x45, 0xc8, 0x05, - 0x72, 0x24, 0x27, 0x06, 0xc8, 0xd7, 0x5e, 0x93, 0xfd, 0x81, 0xd5, 0x31, - 0x08, 0xa3, 0xce, 0xf6, 0xb5, 0x31, 0x11, 0x08, 0x35, 0x25, 0xf2, 0x25, - 0x40, 0x3a, 0x39, 0x20, 0x19, 0xff, 0x01, 0x66, 0xaa, 0xec, 0x26, 0xaf, - 0x82, 0x52, 0x0f, 0xf3, 0x73, 0x7e, 0xfc, 0x0a, 0xf1, 0x7e, 0x8a, 0x7f, - 0x3f, 0x5d, 0x39, 0x52, 0xb8, 0x5d, 0x3b, 0xdc, 0x13, 0x01, 0xf0, 0xe8, - 0x82, 0xee, 0x08, 0x15, 0x9b, 0x02, 0x31, 0x6e, 0xb6, 0x7b, 0x77, 0xa0, - 0x36, 0xe2, 0x02, 0x8c, 0x8d, 0xb4, 0xb1, 0x04, 0x6a, 0x61, 0x31, 0xbe, - 0x24, 0xc6, 0x6e, 0x31, 0xfa, 0x3d, 0xdd, 0x58, 0xc8, 0xb5, 0x6c, 0x6d, - 0xa9, 0x08, 0x34, 0x9d, 0x0e, 0x68, 0xb3, 0x57, 0xa0, 0x65, 0xc6, 0xf4, - 0x84, 0x1c, 0x96, 0x80, 0xd6, 0x00, 0x7d, 0xd1, 0x02, 0x59, 0xc1, 0x30, - 0xa1, 0x62, 0xd9, 0x90, 0x78, 0x9f, 0x0d, 0xa6, 0x1c, 0x67, 0x70, 0x46, - 0xc1, 0x10, 0x0b, 0x1e, 0x4c, 0xa0, 0xf2, 0x37, 0x08, 0x32, 0xba, 0x22, - 0x75, 0x25, 0xc3, 0x90, 0x14, 0x54, 0xd9, 0x4c, 0x00, 0x2b, 0xab, 0xa8, - 0x04, 0x30, 0x68, 0x0e, 0xa2, 0xb4, 0x51, 0x98, 0xbf, 0x02, 0x4c, 0x53, - 0x7e, 0x31, 0xdd, 0x84, 0xb2, 0xac, 0x10, 0xc0, 0x28, 0x03, 0x64, 0x28, - 0x44, 0xdd, 0x9c, 0xcc, 0x59, 0x5c, 0x93, 0x36, 0x89, 0x87, 0xc9, 0xbc, - 0x74, 0x12, 0xf1, 0x08, 0x29, 0x15, 0x43, 0xa8, 0xd1, 0xc4, 0x27, 0x7c, - 0x93, 0x79, 0x5b, 0x44, 0x54, 0xe0, 0x34, 0x4c, 0xa2, 0xa5, 0x77, 0x40, - 0x89, 0xc6, 0xc8, 0xb5, 0xdb, 0x40, 0x77, 0xd3, 0xfd, 0x63, 0x6b, 0x46, - 0x68, 0x33, 0x20, 0x24, 0xcc, 0x79, 0xc1, 0x27, 0x82, 0xdc, 0xf0, 0xd1, - 0x0c, 0xb3, 0x54, 0x49, 0x4a, 0x4d, 0xb3, 0x9c, 0xfb, 0xf3, 0x6b, 0x09, - 0xd6, 0x74, 0x4d, 0xad, 0x15, 0x6d, 0x24, 0x17, 0xe2, 0x8d, 0xa6, 0x1e, - 0x79, 0x0f, 0xf2, 0xeb, 0x55, 0x5e, 0x11, 0x4b, 0x75, 0xb0, 0xef, 0x42, - 0xe2, 0xd5, 0xc8, 0x56, 0xb5, 0x03, 0x75, 0x7a, 0x17, 0x98, 0x84, 0x59, - 0xaa, 0xec, 0x16, 0x32, 0x98, 0xfc, 0xde, 0xe6, 0xd1, 0x97, 0x52, 0xea, - 0x7c, 0x55, 0xa6, 0x70, 0xdb, 0x87, 0x79, 0x17, 0xfd, 0x74, 0xf5, 0xfa, - 0x1c, 0x71, 0x53, 0x23, 0x08, 0x73, 0x37, 0xa2, 0x16, 0x85, 0x71, 0xc8, - 0x30, 0x3b, 0x1e, 0x61, 0xf8, 0x26, 0x4c, 0x9b, 0x65, 0x13, 0x7c, 0x20, - 0x92, 0x07, 0x13, 0x68, 0x72, 0x23, 0xcf, 0x34, 0xf4, 0x64, 0x6e, 0xdd, - 0x74, 0xa0, 0xa8, 0xfe, 0x0d, 0x5c, 0x74, 0xc3, 0x08, 0x06, 0xe8, 0x9e, - 0xc5, 0xfe, 0x35, 0x5e, 0xe9, 0x0c, 0xd6, 0x21, 0x75, 0xab, 0x05, 0x42, - 0x68, 0xbc, 0x5c, 0x80, 0x99, 0x02, 0xf2, 0x81, 0xca, 0xa6, 0xfd, 0x8e, - 0xa1, 0x46, 0xa3, 0xe1, 0xb6, 0xd8, 0x90, 0xb8, 0x6b, 0xd8, 0x8e, 0x40, - 0xdb, 0x63, 0x0e, 0x58, 0x35, 0xf8, 0x45, 0x5f, 0xa4, 0x3c, 0xda, 0x18, - 0x47, 0xff, 0x09, 0x68, 0xb5, 0x0d, 0x2d, 0x6f, 0x39, 0xf7, 0xff, 0x42, - 0x3a, 0x53, 0x0a, 0x78, 0x42, 0xef, 0x44, 0x34, 0xe6, 0xba, 0x23, 0x82, - 0x0f, 0x40, 0xaa, 0x51, 0x22, 0xc8, 0xf6, 0xd4, 0x05, 0x56, 0xa3, 0xa4, - 0x66, 0xea, 0x59, 0xe4, 0xcc, 0x91, 0x56, 0xa3, 0x72, 0xe8, 0x17, 0x17, - 0xe5, 0x72, 0x7e, 0x24, 0x9a, 0xaf, 0x1b, 0xea, 0x6e, 0x8a, 0x31, 0x70, - 0x1c, 0x41, 0xd0, 0x7d, 0x16, 0x26, 0x4a, 0x82, 0xab, 0xf1, 0x36, 0x10, - 0x40, 0x9f, 0xf7, 0x7f, 0xc0, 0x9c, 0x9d, 0x0e, 0xae, 0x59, 0x1f, 0x97, - 0xbd, 0x9d, 0x7e, 0x8f, 0x3e, 0xb7, 0xe9, 0x73, 0x97, 0x3e, 0xfb, 0xb8, - 0x8e, 0x65, 0x65, 0x77, 0x77, 0xec, 0x65, 0xf5, 0x52, 0xcf, 0x73, 0xa5, - 0x68, 0x35, 0xe4, 0x09, 0x75, 0xd3, 0x71, 0x86, 0xc3, 0x4d, 0x08, 0x79, - 0xf3, 0x11, 0xd6, 0x63, 0x1f, 0x97, 0xa7, 0xfd, 0xad, 0x53, 0xf8, 0x3c, - 0xed, 0xf6, 0xd4, 0xb5, 0x58, 0xa1, 0x42, 0x5d, 0x0b, 0x52, 0xc2, 0xa8, - 0x4a, 0x1e, 0xbd, 0xab, 0x46, 0x6e, 0xd1, 0x16, 0x9b, 0x08, 0x47, 0x6d, - 0x7c, 0xac, 0xa3, 0xfb, 0x4c, 0x71, 0x34, 0x08, 0xfa, 0x66, 0xfe, 0x80, - 0x3a, 0xfa, 0x03, 0x6a, 0x1f, 0x3f, 0xd6, 0x6b, 0xe4, 0x6e, 0xfb, 0x88, - 0x77, 0x6c, 0x41, 0x1d, 0x6d, 0xd3, 0xab, 0xce, 0x6f, 0x8e, 0xb4, 0x83, - 0xe2, 0x21, 0x17, 0x5f, 0xb0, 0xb2, 0x08, 0xff, 0xb1, 0x57, 0xd7, 0x1f, - 0x56, 0xc8, 0xcf, 0xa1, 0xfc, 0xf9, 0x25, 0x42, 0x84, 0x0f, 0x1c, 0xea, - 0x9f, 0xf8, 0x43, 0x10, 0x1b, 0x7e, 0x8e, 0x8f, 0x67, 0xda, 0x35, 0xe6, - 0x72, 0xb1, 0x6c, 0xb6, 0xff, 0x1c, 0xfa, 0xf3, 0x46, 0xba, 0xbd, 0x54, - 0x36, 0xd5, 0x8c, 0x15, 0x47, 0xa3, 0x1c, 0xef, 0xdb, 0xd7, 0xf2, 0x75, - 0xc0, 0x6e, 0xd5, 0x60, 0xd5, 0x83, 0xa7, 0x5a, 0x40, 0x56, 0xb5, 0x2d, - 0x0c, 0xa1, 0x09, 0x14, 0x8b, 0x4d, 0x23, 0x45, 0x8d, 0xe3, 0xfb, 0x0e, - 0xaa, 0x30, 0x4d, 0xf2, 0x15, 0xba, 0x86, 0x6e, 0x70, 0xb6, 0x93, 0xc8, - 0x9f, 0xe9, 0x82, 0x05, 0x83, 0x58, 0x57, 0x03, 0x51, 0xcd, 0x3d, 0x43, - 0xaf, 0x26, 0xdb, 0xf1, 0x70, 0xad, 0x31, 0xb2, 0xa0, 0x11, 0x73, 0x4a, - 0x56, 0x00, 0x54, 0x84, 0x0a, 0x6a, 0x37, 0xd5, 0x34, 0x2f, 0x03, 0x09, - 0x4d, 0x97, 0x92, 0xeb, 0xd4, 0x80, 0x75, 0x50, 0xa3, 0xfa, 0x61, 0xf3, - 0x5f, 0x3f, 0xb8, 0xce, 0x5f, 0x8f, 0x9c, 0xff, 0xd9, 0x71, 0xf6, 0x9c, - 0x4f, 0x5f, 0xbb, 0xad, 0xdd, 0xad, 0x6f, 0xff, 0x6d, 0x13, 0x16, 0x54, - 0xdc, 0xe7, 0x85, 0xf2, 0x4d, 0x75, 0x2d, 0xcb, 0xb6, 0x80, 0xeb, 0xa4, - 0x23, 0xa2, 0x62, 0xb5, 0x8f, 0x0f, 0x1c, 0x93, 0xd6, 0xc9, 0x00, 0x50, - 0x8b, 0x01, 0x9c, 0x16, 0x69, 0xbf, 0x4e, 0xbd, 0xc5, 0xea, 0x14, 0x68, - 0x51, 0x6f, 0xae, 0x58, 0x75, 0xfe, 0xe4, 0x06, 0x3e, 0x69, 0x9e, 0xa0, - 0xa8, 0xa6, 0x9e, 0x14, 0xc0, 0x18, 0xf5, 0xd6, 0xf4, 0x20, 0xe8, 0x86, - 0xa6, 0xdd, 0xff, 0xc0, 0x4d, 0x0b, 0x7d, 0x61, 0x40, 0x86, 0x91, 0x1d, - 0x7c, 0xc1, 0xba, 0xb4, 0x40, 0x28, 0x49, 0x03, 0xb6, 0x85, 0x55, 0xd4, - 0x6e, 0x40, 0x0b, 0x34, 0xbe, 0xb3, 0x25, 0x8a, 0x70, 0x8f, 0x75, 0x9d, - 0xad, 0x1e, 0x3f, 0xcb, 0xa1, 0x62, 0x2f, 0xb1, 0x16, 0x18, 0xcb, 0xe6, - 0x90, 0xb5, 0x0c, 0x7a, 0xaa, 0x49, 0x2f, 0x58, 0x3f, 0xdf, 0x9a, 0x8c, - 0xa9, 0x4e, 0x5b, 0xec, 0x3f, 0x5b, 0xd9, 0x5e, 0x9e, 0x4e, 0x97, 0x57, - 0x47, 0x1a, 0xa1, 0x46, 0xfc, 0x2c, 0x55, 0x19, 0xb1, 0x3a, 0x39, 0x62, - 0x71, 0x9e, 0x55, 0xe8, 0x65, 0x60, 0xcb, 0xef, 0x12, 0x76, 0x35, 0xb3, - 0x88, 0x86, 0xbc, 0x14, 0x55, 0x4d, 0x2b, 0xcd, 0x96, 0x24, 0xbe, 0x6d, - 0x00, 0xd2, 0x02, 0xd9, 0xb4, 0xde, 0xca, 0x58, 0x0a, 0xc6, 0x67, 0x9f, - 0x3e, 0xb3, 0x34, 0xa4, 0xd1, 0x3e, 0x7d, 0x66, 0x69, 0x52, 0x50, 0xec, - 0x93, 0x6c, 0x51, 0xea, 0xf3, 0x5e, 0xec, 0xcb, 0x2f, 0x5a, 0xce, 0x05, - 0x01, 0x12, 0x5f, 0xb2, 0x1c, 0xe9, 0x91, 0xd9, 0xa7, 0x6f, 0xda, 0xa2, - 0xaf, 0x74, 0x3f, 0xdd, 0xf5, 0x47, 0xac, 0xc7, 0x3f, 0xc8, 0x18, 0x64, - 0xfe, 0x5a, 0x33, 0x92, 0x40, 0x3c, 0xa1, 0x5e, 0x18, 0x67, 0x90, 0x06, - 0x0a, 0x46, 0x1e, 0x7a, 0x86, 0x1b, 0xcd, 0x16, 0x05, 0x32, 0x6a, 0x6e, - 0xda, 0xe3, 0x30, 0x4c, 0x9e, 0x32, 0xcc, 0x27, 0x19, 0x9e, 0xcd, 0xfd, - 0x2c, 0x90, 0x31, 0x8b, 0xfa, 0xe1, 0x38, 0xda, 0xf6, 0xd0, 0x95, 0x1c, - 0x94, 0xe4, 0x72, 0x07, 0x3a, 0xad, 0x93, 0x0b, 0x3e, 0xcb, 0x6f, 0x20, - 0x59, 0x36, 0xea, 0x0d, 0x50, 0xfa, 0xea, 0xf0, 0x10, 0x43, 0x52, 0x33, - 0x06, 0x55, 0x5e, 0xce, 0xac, 0xbe, 0xfc, 0x26, 0x3a, 0xc5, 0xe7, 0x17, - 0xc4, 0x24, 0x3d, 0xc6, 0x32, 0xd5, 0xa4, 0xc0, 0xa3, 0x8c, 0xd2, 0x5c, - 0x0c, 0x8f, 0x60, 0x8e, 0xa3, 0x65, 0x12, 0x3a, 0x48, 0x48, 0xee, 0x1d, - 0x38, 0x7d, 0xfb, 0x1a, 0x67, 0x37, 0x05, 0x9b, 0x6d, 0x90, 0xdb, 0x43, - 0x62, 0x6b, 0xc4, 0x9f, 0xd5, 0x91, 0xd5, 0x60, 0x74, 0xeb, 0x39, 0xdd, - 0x22, 0x4f, 0x1d, 0x00, 0x2a, 0xf0, 0x3c, 0x87, 0x4a, 0xde, 0x18, 0x08, - 0xc5, 0xf9, 0x07, 0x07, 0x94, 0xfb, 0x1e, 0xbe, 0x0a, 0x16, 0xe0, 0x5c, - 0xa5, 0xbe, 0xe5, 0x2e, 0x42, 0x96, 0xb5, 0xf8, 0x65, 0xa9, 0x78, 0x5e, - 0x97, 0x91, 0x13, 0xb2, 0x91, 0x8c, 0x18, 0x04, 0x0c, 0x5f, 0x41, 0xc8, - 0x44, 0x18, 0x9a, 0x70, 0xc8, 0x3e, 0x7c, 0xe2, 0x89, 0x62, 0x8b, 0x24, - 0x0a, 0x26, 0xd2, 0x8c, 0x16, 0x65, 0xc5, 0x93, 0x1f, 0x5a, 0x2a, 0x5e, - 0xd8, 0x2f, 0x5e, 0x6b, 0x52, 0x40, 0x28, 0xa9, 0x67, 0xe3, 0x3b, 0xc8, - 0x70, 0xba, 0x59, 0xc6, 0x09, 0x3f, 0x32, 0x27, 0x19, 0x90, 0x9c, 0x49, - 0x59, 0x68, 0x8e, 0x1a, 0x94, 0x9a, 0x46, 0x03, 0x97, 0xee, 0x7d, 0x9a, - 0xd9, 0x72, 0xe3, 0xa3, 0xa8, 0x00, 0xd0, 0x43, 0xe0, 0x96, 0xee, 0xf4, - 0x2a, 0xcd, 0xeb, 0xe1, 0x37, 0x05, 0x18, 0x68, 0x4d, 0xe8, 0xf5, 0xab, - 0x6e, 0xcf, 0xe4, 0x37, 0x3d, 0x22, 0x6e, 0xbe, 0x53, 0x46, 0xb5, 0x1d, - 0x19, 0xeb, 0x1e, 0xcf, 0x42, 0x78, 0xad, 0x31, 0x10, 0x7d, 0xbd, 0x0d, - 0x9e, 0xe8, 0xae, 0x9e, 0x0f, 0x45, 0x80, 0x91, 0xa2, 0xa1, 0x9d, 0x63, - 0xdc, 0x46, 0x00, 0xda, 0x3b, 0x32, 0xcc, 0x3d, 0x90, 0x02, 0x84, 0x30, - 0xd6, 0x07, 0xcb, 0xd4, 0xc7, 0x2d, 0xf6, 0x77, 0xbf, 0x64, 0x04, 0xa7, - 0x4d, 0xb5, 0x31, 0xbe, 0xbc, 0xc5, 0x0b, 0x13, 0x0c, 0x25, 0x6f, 0x49, - 0x6e, 0x2e, 0xf1, 0x3c, 0x22, 0x76, 0x98, 0x23, 0xd8, 0x22, 0xbe, 0x52, - 0xca, 0xc9, 0x77, 0x82, 0xf8, 0x8d, 0xf6, 0x8d, 0xfa, 0x07, 0x32, 0x50, - 0x10, 0x58, 0x1b, 0xef, 0x2b, 0x43, 0x2b, 0xe1, 0x13, 0x59, 0x0d, 0x63, - 0x6f, 0x84, 0x3e, 0x52, 0xae, 0x5f, 0x63, 0xe8, 0x30, 0x6f, 0xb2, 0x4d, - 0x97, 0x1c, 0x72, 0xb3, 0x07, 0x03, 0x79, 0xa0, 0x87, 0x8e, 0x1a, 0x87, - 0x5c, 0x46, 0x59, 0x0c, 0x59, 0x7c, 0x30, 0x31, 0xae, 0x9e, 0x82, 0x18, - 0x64, 0x41, 0xaf, 0xc4, 0x74, 0x2a, 0x58, 0x59, 0x45, 0x16, 0x45, 0x90, - 0x7c, 0x7a, 0xad, 0x22, 0x23, 0x65, 0x77, 0xd6, 0x68, 0x90, 0x4a, 0x02, - 0xb9, 0x8c, 0x77, 0x94, 0xed, 0x7b, 0x0b, 0x78, 0x45, 0x5a, 0x6a, 0xdb, - 0x51, 0xca, 0x88, 0xaa, 0x1c, 0x54, 0x66, 0xd7, 0x9c, 0x52, 0x40, 0x37, - 0xc0, 0x8d, 0xc4, 0xd5, 0x1a, 0x1e, 0x4e, 0x47, 0x09, 0xba, 0xa8, 0xb1, - 0xbc, 0xaa, 0x50, 0x4c, 0x09, 0xe5, 0x0e, 0x14, 0x0b, 0x39, 0xf8, 0x58, - 0x5d, 0x18, 0x0f, 0x26, 0x8b, 0x1d, 0x1d, 0x54, 0xf4, 0x70, 0x71, 0x09, - 0x27, 0x93, 0x4a, 0x81, 0xee, 0xd6, 0x0b, 0x70, 0x72, 0x9b, 0x57, 0x2a, - 0x54, 0x2b, 0x45, 0xd4, 0xcb, 0x4d, 0x38, 0x7e, 0x82, 0x26, 0x36, 0xb4, - 0xd6, 0x21, 0x05, 0x1d, 0x4e, 0x80, 0x45, 0x49, 0x9b, 0x06, 0xe9, 0x5b, - 0x82, 0x15, 0x3a, 0x28, 0xde, 0x58, 0xcf, 0x87, 0xf1, 0x77, 0xea, 0x15, - 0x6a, 0x27, 0x55, 0x6a, 0x83, 0x04, 0xc4, 0xcb, 0x00, 0x89, 0x03, 0x41, - 0xbd, 0xc7, 0x39, 0xfe, 0xee, 0x0e, 0x3e, 0xd5, 0x30, 0x26, 0x4b, 0x99, - 0xab, 0xf2, 0x32, 0xc7, 0x15, 0xe0, 0x1c, 0x5b, 0xe1, 0x64, 0xef, 0xd7, - 0xd4, 0x51, 0xbb, 0x3c, 0xe1, 0x24, 0x44, 0x05, 0xf3, 0xe3, 0x7c, 0x35, - 0xc5, 0x85, 0x4e, 0x6f, 0x35, 0xf8, 0xf8, 0x60, 0xc6, 0xd7, 0x34, 0x96, - 0x2f, 0xa9, 0xa0, 0x69, 0xde, 0x7d, 0xd3, 0x96, 0x22, 0x43, 0x46, 0xe5, - 0x77, 0x2e, 0x49, 0x84, 0x1e, 0x0a, 0x24, 0xe8, 0x07, 0x82, 0x3e, 0x42, - 0x82, 0x87, 0xef, 0x41, 0xe2, 0x46, 0x27, 0x6e, 0xec, 0xe9, 0x46, 0x34, - 0x48, 0x37, 0xc9, 0x98, 0xf8, 0x15, 0xca, 0xf3, 0xda, 0xd1, 0x1d, 0x3a, - 0xb8, 0x70, 0x09, 0xe0, 0xc2, 0xaf, 0xa9, 0xc5, 0x0f, 0xaa, 0x6b, 0x53, - 0x94, 0x64, 0x66, 0x00, 0x80, 0xc8, 0x7e, 0x24, 0x60, 0x28, 0x70, 0x72, - 0x28, 0x86, 0x02, 0x98, 0x46, 0x22, 0x15, 0xbe, 0x61, 0x73, 0x9d, 0x2c, - 0x6f, 0xea, 0xdd, 0xed, 0xcb, 0x0d, 0xcc, 0x3b, 0xbe, 0xdd, 0x98, 0x65, - 0x92, 0xe0, 0x17, 0xd9, 0xf4, 0xdd, 0x2c, 0x90, 0x5e, 0x5a, 0x74, 0x15, - 0x8a, 0x62, 0x4a, 0x8a, 0x59, 0x38, 0xe1, 0xb1, 0x65, 0x12, 0x41, 0xfe, - 0x0b, 0x0b, 0x99, 0xc1, 0x8c, 0xa2, 0x03, 0x4d, 0xdb, 0x31, 0x86, 0xfc, - 0xf2, 0xbe, 0xca, 0xf9, 0x54, 0x34, 0x7f, 0x04, 0xc9, 0xf9, 0x03, 0x0b, - 0x48, 0x94, 0x15, 0x8e, 0xa4, 0xa4, 0x0c, 0x4e, 0x52, 0x1d, 0x0e, 0x8f, - 0xbd, 0xcc, 0x81, 0xd1, 0xc2, 0x51, 0x09, 0x26, 0x2f, 0x48, 0x20, 0x9b, - 0xab, 0xfc, 0x64, 0x2b, 0xd7, 0x91, 0x46, 0x26, 0xdb, 0x01, 0xe0, 0x9e, - 0x0c, 0x3e, 0x55, 0x44, 0x1c, 0x97, 0xf2, 0x34, 0x68, 0xfd, 0x37, 0x5d, - 0xc9, 0x7c, 0x65, 0xb2, 0xda, 0x10, 0xbd, 0xa6, 0xd8, 0xce, 0xa6, 0x04, - 0xd1, 0xe5, 0xc3, 0xa7, 0xec, 0xf0, 0x02, 0x9f, 0x34, 0x95, 0xce, 0x43, - 0x61, 0x51, 0x44, 0x12, 0xff, 0xb6, 0x7d, 0x5a, 0x99, 0xf0, 0xe5, 0xed, - 0xbc, 0x40, 0x13, 0xf7, 0x17, 0xa5, 0x65, 0xa3, 0x3b, 0xbc, 0x3d, 0x0a, - 0xfb, 0x98, 0x3d, 0xcd, 0x9d, 0x66, 0x26, 0x98, 0x59, 0x20, 0x94, 0x44, - 0x4b, 0x52, 0x78, 0x09, 0x60, 0xd9, 0xf8, 0x36, 0x57, 0xd6, 0xbb, 0x4a, - 0xeb, 0x25, 0xf9, 0x7a, 0xa6, 0xb2, 0x5b, 0xbc, 0x74, 0x9b, 0x7a, 0x2f, - 0x8e, 0x5e, 0xb3, 0x98, 0x52, 0xd9, 0x45, 0xaa, 0xe6, 0xf2, 0x87, 0x39, - 0x46, 0xa8, 0x83, 0xbc, 0x8e, 0xb2, 0x04, 0x9e, 0x7e, 0x63, 0xa5, 0x09, - 0x53, 0xe6, 0x1a, 0x70, 0xf9, 0xb5, 0x8e, 0xcd, 0xb2, 0xf5, 0x3a, 0xbb, - 0xf7, 0xd1, 0x84, 0xc9, 0xf3, 0x0c, 0x88, 0xf2, 0x7a, 0xc3, 0x66, 0x59, - 0x4c, 0x80, 0x7a, 0x03, 0x62, 0x3e, 0x70, 0x86, 0xe7, 0xe6, 0x30, 0xd5, - 0xb8, 0xb7, 0xf9, 0x48, 0x15, 0xc3, 0x28, 0xa4, 0x8f, 0x71, 0xc1, 0x2c, - 0x9a, 0x51, 0xbb, 0x2b, 0xe4, 0xd7, 0xc2, 0xa8, 0x95, 0xe7, 0x7c, 0x05, - 0x2e, 0xd7, 0x59, 0x66, 0x39, 0x04, 0x72, 0x8c, 0xda, 0x62, 0x5f, 0xfc, - 0x39, 0xf0, 0x2a, 0x77, 0x57, 0x57, 0x8f, 0x35, 0xd5, 0xe6, 0x23, 0xfc, - 0x41, 0x28, 0x5a, 0x64, 0x16, 0x86, 0xa3, 0x18, 0x08, 0x0a, 0x1f, 0x70, - 0x9e, 0x20, 0x16, 0x75, 0xdd, 0x8f, 0xdf, 0xdd, 0xa9, 0x8c, 0xaf, 0xfe, - 0x7e, 0xb8, 0x98, 0xe7, 0x91, 0xd7, 0x99, 0x70, 0xd6, 0x19, 0x01, 0x7a, - 0xd2, 0xd4, 0x29, 0x94, 0xa6, 0x4b, 0x21, 0x90, 0x26, 0xbc, 0xb3, 0x0b, - 0x82, 0x14, 0x98, 0xb2, 0xfe, 0xd9, 0x60, 0x2a, 0xd9, 0x52, 0x4e, 0x70, - 0xd0, 0x9e, 0x17, 0x5d, 0x59, 0x64, 0x85, 0xea, 0xbe, 0x78, 0xc4, 0xea, - 0xf4, 0x88, 0xee, 0x5f, 0x69, 0xdd, 0xb7, 0xe1, 0xa8, 0x0d, 0xac, 0x6a, - 0xa3, 0xf1, 0x11, 0x5d, 0x44, 0x1e, 0xbd, 0xa4, 0xc6, 0xfd, 0x1d, 0x06, - 0xab, 0x61, 0xb9, 0x53, 0x7e, 0x68, 0xd3, 0xa6, 0x69, 0x65, 0x8c, 0x95, - 0xf9, 0x58, 0x8c, 0x2d, 0x6a, 0xc8, 0xd0, 0x77, 0xa6, 0xd5, 0xa8, 0x1a, - 0xd1, 0xb6, 0x6e, 0xd5, 0xa5, 0x80, 0x96, 0xf3, 0x78, 0xea, 0x4f, 0x84, - 0x95, 0x7b, 0xaa, 0x1b, 0x4b, 0xf6, 0x36, 0x07, 0xac, 0xd7, 0xe1, 0x6d, - 0xca, 0x0c, 0x90, 0xde, 0x8d, 0xa2, 0xc1, 0x52, 0x8b, 0x2d, 0xe3, 0x69, - 0xae, 0x1d, 0x19, 0x8e, 0x9f, 0x7b, 0xa3, 0x41, 0x9f, 0x2b, 0x54, 0xed, - 0x35, 0x1e, 0x0e, 0xf5, 0xe2, 0x57, 0x7c, 0x37, 0x99, 0x5b, 0xbf, 0x1a, - 0x29, 0xf9, 0x3e, 0x73, 0xa9, 0x03, 0x90, 0x5f, 0x12, 0xc9, 0x41, 0xe8, - 0x5b, 0x33, 0x72, 0xb7, 0x59, 0xc0, 0x40, 0x2d, 0xda, 0x0d, 0x82, 0x3a, - 0x0e, 0xb3, 0xe2, 0x28, 0xc0, 0x74, 0x5e, 0xc4, 0xa6, 0x93, 0x19, 0xa6, - 0xb9, 0x86, 0x9c, 0x7c, 0x77, 0xa5, 0x34, 0x78, 0x41, 0x7d, 0x9b, 0x05, - 0x0f, 0x3f, 0xf3, 0xdb, 0xe0, 0x0f, 0x0c, 0x30, 0xa7, 0x7e, 0xb4, 0x0a, - 0x4a, 0x7a, 0x09, 0x7e, 0x31, 0x94, 0x0b, 0xae, 0xb5, 0x97, 0x82, 0xc1, - 0x32, 0xc5, 0x10, 0x4e, 0x92, 0x28, 0x58, 0x05, 0x41, 0xbd, 0x0a, 0xde, - 0x0e, 0x49, 0xec, 0x30, 0x16, 0xaf, 0xc1, 0x9c, 0x25, 0xd4, 0xbd, 0x45, - 0x5e, 0x9d, 0x5c, 0x8c, 0xa4, 0x92, 0x1f, 0x32, 0xc5, 0x4b, 0x63, 0x06, - 0x0c, 0xfe, 0x20, 0x51, 0x6d, 0xa6, 0xa5, 0xe9, 0x6f, 0xb6, 0xb1, 0xfd, - 0xf1, 0x63, 0x44, 0xa1, 0xee, 0x6a, 0xf0, 0xfb, 0xc7, 0x8f, 0x73, 0x4b, - 0x5a, 0x22, 0xd2, 0xc4, 0xfc, 0x92, 0xfb, 0x92, 0xa8, 0xde, 0x71, 0x9f, - 0x65, 0xba, 0x25, 0x23, 0x46, 0xb2, 0xc9, 0x73, 0x39, 0xf3, 0xd7, 0xb5, - 0x27, 0xb0, 0x61, 0x6a, 0x38, 0xa8, 0xdd, 0xf2, 0xbd, 0x6b, 0xde, 0x01, - 0x69, 0x11, 0x28, 0x3b, 0xe4, 0x4d, 0x1d, 0xe8, 0x05, 0x89, 0xaa, 0x42, - 0xa0, 0xc8, 0xa4, 0xce, 0x10, 0xd7, 0x48, 0x5a, 0x9d, 0x1c, 0xdd, 0xcf, - 0x45, 0x67, 0x5c, 0x6e, 0xa5, 0x3d, 0x86, 0xad, 0xa8, 0x8d, 0x4b, 0x4f, - 0x58, 0x41, 0xcb, 0xc0, 0x52, 0x2b, 0x7a, 0x83, 0x96, 0x5c, 0x06, 0x0e, - 0x7e, 0x95, 0xb7, 0x87, 0xc5, 0xed, 0xcd, 0xf1, 0x7c, 0x6d, 0x1d, 0x29, - 0x6c, 0x58, 0x94, 0xe2, 0x9d, 0xae, 0x0d, 0xf0, 0x62, 0xdd, 0xac, 0x09, - 0xd5, 0x14, 0xb3, 0x37, 0x95, 0x06, 0x02, 0xd6, 0xf1, 0x7e, 0x5d, 0x9a, - 0xee, 0x59, 0x12, 0xd8, 0x83, 0xf5, 0x15, 0x7d, 0xa6, 0xa7, 0x4b, 0x8c, - 0x70, 0x07, 0xde, 0x76, 0x6a, 0x4c, 0x36, 0xab, 0x35, 0xbd, 0xa2, 0x21, - 0xfe, 0xcc, 0xca, 0xe0, 0x83, 0xd1, 0x56, 0xe6, 0x98, 0xfc, 0x64, 0x34, - 0x91, 0x8f, 0x75, 0xac, 0x53, 0xe1, 0x8a, 0x0d, 0x15, 0xb6, 0x63, 0x34, - 0x63, 0x8b, 0x37, 0x41, 0x30, 0x44, 0x84, 0xda, 0xc0, 0x4c, 0xe6, 0x4f, - 0xcf, 0x93, 0xf6, 0x44, 0x48, 0xf0, 0x10, 0x0c, 0x26, 0x89, 0x84, 0xf1, - 0x19, 0x69, 0x94, 0x86, 0x2a, 0x60, 0x73, 0x9e, 0x48, 0x21, 0x5c, 0x73, - 0x1b, 0x0f, 0xe9, 0xb4, 0xa7, 0x05, 0x9b, 0x1e, 0xbd, 0x48, 0xe3, 0x89, - 0xe9, 0x57, 0x61, 0x7c, 0x97, 0xcd, 0x25, 0x95, 0xdf, 0xe4, 0x56, 0x00, - 0xc5, 0x81, 0x3f, 0xc2, 0xe3, 0x7e, 0x91, 0x77, 0xe3, 0xe1, 0x45, 0x0b, - 0x99, 0x71, 0x87, 0xf9, 0x7c, 0xe3, 0x50, 0x5f, 0xfe, 0x8c, 0x05, 0x1e, - 0x8b, 0x35, 0x9b, 0x29, 0x21, 0x57, 0x2c, 0x82, 0x19, 0x7e, 0x65, 0x7d, - 0xcf, 0x29, 0x03, 0x6a, 0x98, 0x1a, 0x8f, 0xa8, 0x61, 0xf9, 0x90, 0x1a, - 0x7a, 0x68, 0xd6, 0xa1, 0x87, 0x42, 0xf6, 0x99, 0x78, 0x23, 0x84, 0xc9, - 0x58, 0x35, 0x86, 0x8f, 0x88, 0x33, 0x7c, 0x3c, 0xfc, 0x67, 0xd7, 0xa7, - 0xf8, 0x54, 0xbc, 0x73, 0x2c, 0xe1, 0x9a, 0x6b, 0xbb, 0xdd, 0xb6, 0x0e, - 0x98, 0xa5, 0x3b, 0x96, 0xc5, 0x9a, 0xc2, 0xff, 0x14, 0x2a, 0x4d, 0x94, - 0xc5, 0x5d, 0x5b, 0xef, 0x95, 0x79, 0x23, 0x6b, 0x16, 0x0e, 0xe4, 0x6f, - 0x49, 0x82, 0x62, 0xc6, 0x31, 0xb1, 0x4a, 0xbb, 0x81, 0x81, 0x68, 0xba, - 0xfe, 0xa0, 0x46, 0x26, 0xe5, 0x38, 0x40, 0xce, 0x02, 0xd5, 0x44, 0x20, - 0xc7, 0x45, 0x34, 0x6b, 0xd4, 0xc9, 0x4f, 0xc8, 0x60, 0xd6, 0x26, 0xe8, - 0xd2, 0x66, 0xc2, 0xa7, 0x2f, 0x62, 0x98, 0x97, 0xd8, 0xa7, 0x18, 0xaf, - 0xdd, 0xc6, 0x0b, 0xb3, 0x79, 0xb8, 0xfc, 0x1f, 0xea, 0xcd, 0x66, 0xf1, - 0xe9, 0x40, 0xb5, 0xc1, 0xba, 0xbe, 0xb3, 0x99, 0x1d, 0xde, 0xca, 0x6d, - 0x99, 0x20, 0x21, 0xed, 0x67, 0xd4, 0xe8, 0x39, 0x63, 0x2e, 0x14, 0xf3, - 0xcb, 0xef, 0xc7, 0xc8, 0xb6, 0x00, 0xa3, 0xbb, 0x33, 0xbf, 0x04, 0x7f, - 0x4c, 0x4c, 0xda, 0xc8, 0x63, 0x5b, 0xea, 0x04, 0x29, 0xd5, 0x9a, 0xad, - 0xc1, 0x30, 0x6f, 0x42, 0x7e, 0x81, 0x0a, 0x5e, 0xaa, 0x26, 0x00, 0x56, - 0x0c, 0x7e, 0x11, 0x5c, 0x3d, 0x2b, 0xd5, 0xa9, 0xd4, 0x97, 0xb5, 0x6c, - 0x91, 0x41, 0xfe, 0x7c, 0xb4, 0x4a, 0x47, 0x34, 0x5e, 0x74, 0xb2, 0xeb, - 0x54, 0x00, 0x67, 0x85, 0x92, 0x68, 0xbc, 0xa6, 0x54, 0x08, 0x66, 0x95, - 0x96, 0x98, 0x3d, 0x5e, 0x54, 0x08, 0x62, 0x95, 0x9a, 0x98, 0x7f, 0x33, - 0x48, 0x05, 0x95, 0xaa, 0x7a, 0xc4, 0x3b, 0x18, 0xf2, 0xbf, 0x04, 0x43, - 0x8e, 0xee, 0x84, 0x17, 0x5b, 0x38, 0x30, 0xe2, 0xcc, 0xe1, 0x31, 0x7f, - 0xea, 0x11, 0xec, 0xb3, 0xcb, 0xb7, 0x82, 0xeb, 0xe4, 0xbe, 0x9d, 0x88, - 0x82, 0x40, 0x38, 0xcf, 0x00, 0xd0, 0x61, 0x1d, 0xf9, 0xca, 0x73, 0x93, - 0x86, 0x38, 0x61, 0xfe, 0x71, 0x4e, 0x85, 0x0c, 0xd9, 0x9a, 0x0a, 0x75, - 0xb1, 0x67, 0xa7, 0xba, 0xec, 0x2a, 0xa8, 0xa0, 0xe9, 0x7a, 0x24, 0x28, - 0xf1, 0xa4, 0x5a, 0xa8, 0x11, 0x27, 0x0a, 0x6b, 0xab, 0xb2, 0x12, 0xa4, - 0xfe, 0x03, 0xce, 0x54, 0x4d, 0xca, 0x17, 0xab, 0xfe, 0x07, 0xab, 0xce, - 0xf9, 0xa9, 0xde, 0xcc, 0x55, 0xe5, 0x0a, 0x67, 0x56, 0x35, 0xd3, 0x15, - 0xf3, 0x65, 0x49, 0x45, 0x34, 0x8b, 0x82, 0x9a, 0x67, 0x94, 0xb4, 0xa8, - 0x77, 0x0a, 0x6a, 0x85, 0x1a, 0x9c, 0x01, 0x85, 0xa6, 0x5a, 0xa6, 0xa5, - 0x99, 0xcd, 0x66, 0xea, 0x97, 0xe5, 0xf8, 0x47, 0x5a, 0x57, 0x6a, 0x44, - 0x59, 0x6d, 0xae, 0xe8, 0x18, 0x75, 0x14, 0xf4, 0x7e, 0x7a, 0xf9, 0x8b, - 0xd8, 0x15, 0xb3, 0xa9, 0x79, 0xfc, 0x21, 0x3a, 0x5e, 0xc0, 0x84, 0x24, - 0x19, 0x8f, 0x80, 0x69, 0x7a, 0x4f, 0xca, 0x9b, 0xdf, 0x74, 0xcb, 0x02, - 0x0f, 0xb5, 0x8a, 0x30, 0x6b, 0x3a, 0x1a, 0xfb, 0x01, 0x41, 0x7c, 0xc2, - 0xe3, 0xe8, 0xb8, 0xd5, 0x03, 0xad, 0xe0, 0xef, 0x4d, 0xe0, 0x0b, 0x5f, - 0x39, 0x26, 0x60, 0x39, 0x4c, 0x5b, 0x1f, 0xc3, 0x9c, 0xf9, 0xbc, 0x04, - 0x85, 0xeb, 0x33, 0xf0, 0xf5, 0xe7, 0xb2, 0xa9, 0x92, 0xf1, 0xd9, 0x87, - 0xfd, 0xf6, 0x27, 0x62, 0x34, 0x87, 0x23, 0xd9, 0x4e, 0xee, 0xd2, 0x2b, - 0x5f, 0x14, 0x89, 0x89, 0xb3, 0x4f, 0x36, 0x49, 0x81, 0x27, 0xea, 0xbe, - 0xa0, 0xee, 0x7f, 0xe3, 0x2f, 0x57, 0x20, 0x43, 0x35, 0xf8, 0x8f, 0xb3, - 0xb1, 0xb1, 0x4c, 0x14, 0xc9, 0x88, 0xb4, 0xb8, 0x12, 0x7a, 0x73, 0x64, - 0x28, 0x1c, 0x8b, 0x28, 0xc4, 0x66, 0xf9, 0xc9, 0xeb, 0xd8, 0xb6, 0x08, - 0x61, 0x52, 0x3a, 0x1a, 0xf6, 0xf5, 0xc7, 0x9a, 0x9d, 0x2d, 0x44, 0xd6, - 0xec, 0x6c, 0x45, 0xb2, 0x66, 0xdf, 0x35, 0x3e, 0x74, 0x9c, 0xbd, 0x23, - 0xe7, 0x95, 0xeb, 0x4c, 0x3e, 0x7d, 0xed, 0x7d, 0x6b, 0x62, 0xf1, 0xc6, - 0xe7, 0x16, 0x9b, 0x52, 0x28, 0x13, 0x27, 0x7c, 0x1b, 0x1f, 0x65, 0x47, - 0xd9, 0x77, 0x82, 0x0f, 0x51, 0xa4, 0xd1, 0xb6, 0xd3, 0x16, 0xeb, 0xee, - 0x92, 0x86, 0xf8, 0x2d, 0x77, 0x60, 0xfe, 0xe4, 0xdd, 0xf9, 0xab, 0x74, - 0xa5, 0xd3, 0xce, 0xd0, 0xd7, 0x47, 0x51, 0x30, 0xe1, 0xa7, 0xf4, 0x31, - 0x62, 0x4a, 0x1c, 0x4f, 0xe7, 0x27, 0x46, 0xb4, 0x98, 0x1c, 0x9e, 0x73, - 0x90, 0xf3, 0xc7, 0xe3, 0xed, 0x56, 0xfc, 0x39, 0x77, 0x5d, 0x67, 0x13, - 0x77, 0x8b, 0x15, 0x9f, 0x67, 0xc3, 0x3a, 0xe8, 0xdd, 0xd1, 0xd7, 0xb6, - 0x54, 0x1d, 0xb7, 0x86, 0x25, 0xd2, 0xb4, 0x80, 0xf5, 0x16, 0x1b, 0x2d, - 0x89, 0x47, 0xcc, 0x45, 0xce, 0x08, 0x14, 0xc5, 0x36, 0xc3, 0xbe, 0xce, - 0x5f, 0x1c, 0x95, 0xec, 0x7d, 0x75, 0xdc, 0xb0, 0x46, 0x0c, 0xf6, 0x4d, - 0x36, 0x21, 0xb4, 0x5a, 0x0c, 0x29, 0xb6, 0xaf, 0x12, 0xc7, 0x46, 0x12, - 0xe5, 0x99, 0x7b, 0x95, 0xbb, 0xbe, 0x13, 0x66, 0xd4, 0x44, 0x45, 0xcc, - 0xe8, 0x31, 0xf2, 0xb5, 0x86, 0x4a, 0xbc, 0x88, 0x6e, 0x8d, 0x73, 0x2e, - 0x1f, 0x2f, 0x14, 0x78, 0xfc, 0x21, 0x97, 0xd5, 0x83, 0x46, 0x90, 0x36, - 0xff, 0x15, 0x27, 0x00, 0x70, 0x3f, 0xcc, 0x81, 0x8f, 0x71, 0xeb, 0xd3, - 0x33, 0x19, 0x95, 0x4c, 0x4d, 0x18, 0x6d, 0x9c, 0xcd, 0x6f, 0x30, 0x34, - 0x96, 0x5a, 0xe1, 0xfb, 0x81, 0xeb, 0xf1, 0x04, 0x50, 0xa2, 0x80, 0xee, - 0x00, 0x31, 0x4f, 0xf5, 0xe2, 0x71, 0x46, 0x92, 0x42, 0x95, 0x92, 0x41, - 0x5e, 0xb3, 0xa9, 0x7d, 0xea, 0xd3, 0x37, 0xeb, 0x5c, 0x3e, 0x97, 0x21, - 0x71, 0x05, 0x13, 0x3a, 0x0d, 0x99, 0x2b, 0x98, 0xd5, 0x6a, 0x48, 0x5d, - 0xd1, 0xa4, 0xe6, 0x10, 0xaf, 0x30, 0xae, 0x00, 0xd8, 0xa8, 0xa0, 0xa1, - 0x44, 0x64, 0xdb, 0xdb, 0xa9, 0xe0, 0x83, 0x87, 0xfa, 0xe7, 0xb0, 0xbe, - 0xbd, 0x9c, 0xf3, 0xd0, 0xc5, 0x74, 0x83, 0x48, 0x5c, 0xbe, 0xf1, 0x07, - 0x46, 0xc2, 0x89, 0xb6, 0xf7, 0x95, 0xa3, 0x0b, 0x26, 0xae, 0x00, 0x36, - 0x83, 0x62, 0x70, 0x76, 0x5c, 0xbe, 0x39, 0x63, 0xc7, 0x40, 0x2c, 0x5b, - 0xd4, 0x4b, 0x86, 0xcb, 0x89, 0x66, 0xf8, 0xe3, 0x0d, 0xab, 0x1c, 0xaf, - 0xfd, 0xd4, 0x9f, 0x81, 0xaf, 0x01, 0xab, 0x27, 0x71, 0x44, 0x19, 0xad, - 0x44, 0x2e, 0x5f, 0x87, 0xa0, 0xd6, 0x17, 0xaf, 0xe1, 0x64, 0xb9, 0x75, - 0x9b, 0x2d, 0x65, 0xc4, 0xa9, 0xa1, 0x08, 0x68, 0xb1, 0xf4, 0x92, 0x34, - 0xe3, 0x92, 0xac, 0x65, 0xb2, 0x22, 0xf0, 0x16, 0xa1, 0xbd, 0xa5, 0x52, - 0xc6, 0x11, 0x63, 0xf4, 0xf8, 0x14, 0xdf, 0x8e, 0x81, 0xd9, 0xe9, 0x42, - 0x0f, 0xdf, 0xb5, 0x5b, 0xda, 0xb2, 0xef, 0xb8, 0x06, 0xcb, 0x30, 0x38, - 0xa5, 0xb0, 0xbe, 0xf7, 0x82, 0xbf, 0x78, 0x26, 0x47, 0x57, 0xbb, 0x36, - 0x03, 0xcb, 0x37, 0xb5, 0xdc, 0x78, 0x04, 0x26, 0x40, 0x70, 0x15, 0xe2, - 0x79, 0x70, 0x2d, 0xe9, 0x27, 0xcf, 0xbf, 0x9e, 0x26, 0x07, 0x39, 0x62, - 0x5d, 0x4a, 0x32, 0xa9, 0x26, 0x9f, 0xf5, 0x3e, 0xce, 0x1f, 0x4a, 0xaf, - 0x74, 0xd4, 0x4c, 0xc0, 0x24, 0x3b, 0xc2, 0x5b, 0xc1, 0xf8, 0x53, 0xad, - 0xbf, 0x25, 0x20, 0xcf, 0xcd, 0x14, 0xae, 0xec, 0x99, 0x8c, 0xac, 0x6e, - 0xe6, 0x88, 0x19, 0xdb, 0xb4, 0x07, 0x27, 0xea, 0x02, 0x05, 0x8b, 0xa8, - 0x12, 0x25, 0x0b, 0x58, 0x14, 0xed, 0x88, 0xb0, 0xc4, 0x44, 0x0f, 0x4b, - 0xa4, 0x5b, 0x6c, 0xb0, 0xc0, 0x8f, 0x3f, 0xe2, 0x97, 0x34, 0x94, 0x56, - 0xb3, 0x84, 0xe9, 0x66, 0xab, 0x2c, 0xef, 0x83, 0xa5, 0x9c, 0xc3, 0xba, - 0x9f, 0x88, 0x80, 0x44, 0x69, 0x95, 0x6e, 0x6a, 0x61, 0xd2, 0x8f, 0xa9, - 0x84, 0xae, 0xa8, 0x5b, 0x00, 0x0e, 0xd8, 0x4e, 0xa7, 0xa9, 0x55, 0xe6, - 0xdb, 0x50, 0xda, 0xae, 0x90, 0x35, 0xf6, 0xf7, 0x21, 0x2b, 0xae, 0x49, - 0x3d, 0x29, 0x8f, 0xe5, 0x70, 0xc9, 0x45, 0x96, 0xe2, 0x24, 0xf3, 0x72, - 0x53, 0xb0, 0x19, 0xad, 0x0a, 0x1a, 0xaf, 0x49, 0x0b, 0xb7, 0xc2, 0x34, - 0xa4, 0x18, 0xe5, 0x74, 0x58, 0x94, 0x20, 0x72, 0x75, 0x8a, 0xe8, 0x0c, - 0x6d, 0x2b, 0x9b, 0xee, 0x6b, 0x50, 0xaa, 0xfd, 0x24, 0x57, 0x1a, 0x38, - 0x26, 0x6e, 0x8c, 0x59, 0xb9, 0xbb, 0xae, 0x8a, 0x09, 0xc3, 0x6f, 0xa6, - 0xfa, 0x86, 0xe3, 0xfb, 0x58, 0xf1, 0xde, 0x4a, 0xe8, 0x24, 0x06, 0x2c, - 0x11, 0x6a, 0xaa, 0xa7, 0x98, 0x10, 0xac, 0x42, 0x9e, 0x4a, 0x97, 0xe7, - 0x59, 0x48, 0x2f, 0x6f, 0xec, 0x53, 0x76, 0x10, 0x94, 0xcb, 0xf5, 0xe6, - 0xb4, 0xd7, 0x67, 0x30, 0x2d, 0xd1, 0x59, 0x21, 0xae, 0xca, 0xb3, 0x56, - 0x92, 0x93, 0x2d, 0xd8, 0xc6, 0x93, 0x01, 0x80, 0xdf, 0x29, 0x97, 0xe6, - 0x8d, 0x7c, 0x20, 0x9e, 0xd2, 0xf0, 0x11, 0xc8, 0x8d, 0xdb, 0xf7, 0x8b, - 0xba, 0x79, 0x5c, 0xc7, 0x3a, 0x1f, 0x3a, 0x4d, 0xcb, 0xc5, 0xc2, 0xe6, - 0x0c, 0x38, 0xc4, 0x39, 0x60, 0x16, 0x4c, 0xa3, 0x05, 0xf5, 0x68, 0x78, - 0xa5, 0x17, 0x07, 0xd6, 0xf2, 0xda, 0xd4, 0xb2, 0x4f, 0x7a, 0xbd, 0xa2, - 0xd2, 0x4b, 0xa3, 0xbe, 0x05, 0xfd, 0x7c, 0x2b, 0x8e, 0x63, 0x80, 0xd3, - 0xbb, 0x6b, 0xcc, 0x09, 0xab, 0x3c, 0x02, 0x28, 0x9f, 0x74, 0x20, 0xb9, - 0xa3, 0x3a, 0x1c, 0x0e, 0x9f, 0xff, 0x30, 0x1d, 0xe8, 0x06, 0xb8, 0x94, - 0x1a, 0x69, 0xf2, 0x4b, 0xda, 0x8c, 0x57, 0xda, 0x14, 0x9d, 0xd6, 0x63, - 0x30, 0xbf, 0x3d, 0x66, 0xe0, 0xf1, 0x8e, 0xac, 0xb2, 0xa1, 0x47, 0xba, - 0xfd, 0x60, 0x1d, 0x50, 0x4b, 0xc1, 0x17, 0x05, 0x03, 0xb4, 0x9a, 0xea, - 0xcf, 0x9e, 0xe5, 0x47, 0xff, 0x81, 0xb4, 0xce, 0x6d, 0xee, 0x17, 0x72, - 0x93, 0xd3, 0xad, 0xd2, 0xa8, 0xca, 0xb0, 0x65, 0xac, 0xf1, 0x5b, 0x8f, - 0xf1, 0x06, 0x79, 0x65, 0xaa, 0x2b, 0x9c, 0x96, 0x6b, 0x46, 0xe9, 0x45, - 0x38, 0x53, 0x86, 0x95, 0x42, 0x54, 0x94, 0xf0, 0x66, 0xf1, 0x6d, 0x75, - 0xad, 0x54, 0xf4, 0x09, 0xca, 0x22, 0x47, 0x71, 0xc5, 0x1a, 0x97, 0x85, - 0xa6, 0x7a, 0x20, 0x26, 0xff, 0xa4, 0xac, 0x61, 0xda, 0x98, 0x47, 0xfc, - 0xbc, 0x84, 0x17, 0x57, 0xe2, 0x57, 0x31, 0x8a, 0x6e, 0xbf, 0xc2, 0x61, - 0xe0, 0x7c, 0x1c, 0x1e, 0xde, 0x35, 0xd1, 0x54, 0x22, 0x76, 0x45, 0xe8, - 0x5c, 0x15, 0x60, 0xf6, 0x20, 0x3c, 0x03, 0x20, 0x8f, 0x9b, 0xdb, 0x5f, - 0x2f, 0xe8, 0x4e, 0x3d, 0x62, 0xc8, 0x03, 0xe4, 0xaa, 0xe0, 0x63, 0x0f, - 0xb5, 0x23, 0x7c, 0xac, 0xc6, 0x8c, 0xf5, 0xa9, 0xd1, 0x95, 0xb4, 0x57, - 0x6a, 0x28, 0x03, 0x30, 0xa3, 0x83, 0x93, 0x0f, 0x0b, 0xd3, 0x53, 0x91, - 0xd3, 0x8f, 0x7e, 0xbd, 0xd8, 0xc4, 0x1b, 0xea, 0xf0, 0xef, 0x34, 0x99, - 0x05, 0x83, 0x8d, 0xff, 0x07, 0x4f, 0xf4, 0x9a, 0xc4, 0x72, 0xe5, 0x00, - 0x00 + 0x5b, 0x46, 0xc9, 0xfa, 0x11, 0xd6, 0xb2, 0x8f, 0xf3, 0xa7, 0x90, 0xaf, + 0x79, 0xe0, 0x2a, 0xec, 0x27, 0x05, 0xfd, 0x13, 0xa8, 0xb4, 0x21, 0x9b, + 0x80, 0xfa, 0xcd, 0xae, 0x8e, 0x7f, 0xc9, 0x9a, 0xa1, 0xf4, 0x27, 0x6d, + 0xe9, 0xe3, 0xc7, 0xbb, 0xee, 0xf1, 0x87, 0xde, 0x1f, 0x11, 0xfa, 0xcb, + 0xcb, 0x13, 0x56, 0x59, 0x1a, 0xff, 0x2a, 0x12, 0xf6, 0x27, 0xef, 0xee, + 0xef, 0x45, 0xbe, 0x4e, 0xbd, 0xbb, 0xff, 0x2f, 0x5d, 0x0b, 0xa4, 0x2b, + 0xd0, 0x86, 0xcb, 0x56, 0xf4, 0x35, 0xd2, 0x4e, 0x34, 0x6b, 0x50, 0x80, + 0x1b, 0x8b, 0xbd, 0x85, 0x1b, 0xb9, 0xe8, 0x70, 0xb3, 0xe3, 0x91, 0x37, + 0x1e, 0x05, 0xad, 0x2d, 0x42, 0x77, 0xbb, 0xcf, 0x76, 0x77, 0xd8, 0xee, + 0x09, 0xfd, 0xef, 0x55, 0x6d, 0xa5, 0x64, 0xd2, 0x78, 0x1e, 0x30, 0x4b, + 0x05, 0x11, 0x71, 0xd5, 0xaf, 0x22, 0x86, 0xb0, 0xd5, 0x7a, 0xa7, 0xc7, + 0x3a, 0x1d, 0xd6, 0xe9, 0xb2, 0xce, 0x16, 0xce, 0xb2, 0xcb, 0xab, 0x5f, + 0x18, 0xac, 0x15, 0xec, 0x25, 0xee, 0x7a, 0x3c, 0xc5, 0x4c, 0xa6, 0x46, + 0xba, 0xc7, 0x6c, 0xe7, 0x98, 0x6d, 0xf5, 0xd8, 0xf6, 0x91, 0x98, 0xca, + 0x30, 0xa9, 0x9f, 0x10, 0x7e, 0xe7, 0x94, 0x75, 0x08, 0x32, 0x28, 0xf9, + 0xb8, 0xe0, 0x3c, 0x1d, 0xe0, 0x0e, 0x7b, 0xf5, 0x0a, 0x01, 0xbf, 0x79, + 0x7f, 0xce, 0x9e, 0xc1, 0xf7, 0x75, 0x54, 0x41, 0x25, 0x9e, 0xe5, 0x07, + 0xbc, 0x2e, 0x51, 0x04, 0xde, 0x31, 0x7e, 0x67, 0x00, 0x1e, 0xe4, 0xa2, + 0x2b, 0x95, 0x17, 0x51, 0x78, 0xe3, 0x8f, 0x81, 0x2b, 0x93, 0xa9, 0xc7, + 0xe8, 0x0c, 0xb5, 0x8c, 0x70, 0x71, 0x1c, 0x3b, 0x07, 0x68, 0x97, 0x13, + 0xc8, 0x98, 0x02, 0x0e, 0x9c, 0x2e, 0x65, 0x28, 0xb1, 0xf9, 0x67, 0x96, + 0x7c, 0x3b, 0x78, 0x6b, 0x88, 0xa5, 0x22, 0x16, 0x07, 0xb2, 0x3f, 0xf6, + 0x8d, 0x44, 0x0b, 0xc9, 0x95, 0x93, 0xe6, 0x9a, 0x93, 0x16, 0x7e, 0x2b, + 0x71, 0x8a, 0x83, 0x1f, 0x31, 0x10, 0x23, 0x3e, 0xb0, 0x8f, 0x62, 0x81, + 0x75, 0x6b, 0xef, 0x02, 0x12, 0xb3, 0xa8, 0x03, 0xda, 0x0a, 0xa0, 0x9f, + 0x0c, 0x97, 0x1a, 0xfa, 0x74, 0xab, 0xa8, 0x84, 0x5c, 0x06, 0x52, 0x27, + 0xf5, 0x74, 0x2b, 0xbf, 0xe6, 0xa8, 0xe7, 0x85, 0x6b, 0x76, 0x9f, 0x8e, + 0xe6, 0xc2, 0x31, 0xe2, 0xdd, 0x45, 0xb8, 0xbb, 0xf4, 0xeb, 0xd8, 0x05, + 0x9c, 0x0d, 0x4e, 0x59, 0xb4, 0x86, 0x6a, 0x7d, 0xf3, 0x58, 0x5e, 0x71, + 0xf8, 0x53, 0x9e, 0xfd, 0xac, 0xad, 0xf0, 0xa1, 0x91, 0x2b, 0x6b, 0x18, + 0xde, 0x09, 0xae, 0x9b, 0x86, 0xb7, 0x57, 0x38, 0x5a, 0x89, 0x3b, 0x5b, + 0x80, 0xb1, 0x83, 0x99, 0x14, 0x48, 0x51, 0xba, 0xd7, 0xc4, 0x2e, 0xf1, + 0x3a, 0x8d, 0xb4, 0xde, 0xc6, 0xea, 0x05, 0xe1, 0xef, 0xa6, 0xb3, 0xa7, + 0x72, 0x78, 0xd6, 0xec, 0xec, 0xbb, 0x5f, 0x36, 0x41, 0xb0, 0xa6, 0xb5, + 0xff, 0x91, 0xba, 0x7c, 0xc1, 0x2f, 0xbb, 0x5f, 0xa7, 0xb7, 0xa9, 0x5a, + 0x80, 0xa1, 0x03, 0xff, 0x48, 0x7d, 0x3d, 0xe1, 0x9a, 0xda, 0x09, 0x3e, + 0x02, 0xb0, 0x6e, 0x9f, 0x79, 0x55, 0x46, 0x75, 0x85, 0x8f, 0xaa, 0xbc, + 0xeb, 0x2b, 0x7c, 0x08, 0x8f, 0x16, 0x4e, 0x2f, 0xef, 0x30, 0x48, 0x61, + 0x7d, 0xd9, 0x54, 0x4d, 0xb7, 0x1a, 0xf0, 0x4d, 0x68, 0xfb, 0x80, 0x2a, + 0x9a, 0xa9, 0x47, 0x58, 0xf0, 0xc2, 0xb6, 0x01, 0xb1, 0xed, 0xea, 0x66, + 0xfb, 0xcb, 0x55, 0xb6, 0x77, 0x1f, 0xb6, 0xad, 0x6c, 0xdb, 0xd7, 0x5e, + 0xbd, 0x9d, 0x9d, 0xd7, 0x64, 0x4b, 0x3c, 0xf6, 0x6b, 0x48, 0xf7, 0x55, + 0x9e, 0xbb, 0xbf, 0x8b, 0x19, 0xc2, 0x87, 0x32, 0x93, 0xf7, 0x03, 0x76, + 0x06, 0x8b, 0xf8, 0x72, 0xec, 0xfd, 0xe3, 0xc9, 0x72, 0xde, 0x95, 0xbc, + 0x34, 0xcf, 0xba, 0xf4, 0x0f, 0x2a, 0xb1, 0x79, 0xc7, 0x34, 0x99, 0x9d, + 0xf5, 0x49, 0xc8, 0xe5, 0x7f, 0xac, 0xbe, 0x68, 0x32, 0x59, 0xe9, 0x8b, + 0x2a, 0x6f, 0x7f, 0x5b, 0x41, 0x2b, 0xa2, 0x70, 0x2f, 0xbe, 0xa7, 0xb4, + 0x3d, 0x76, 0x97, 0x63, 0xf6, 0x0e, 0x6c, 0xd5, 0x95, 0x02, 0x77, 0x08, + 0x25, 0x0b, 0xfd, 0x00, 0x86, 0xd4, 0xdb, 0xea, 0x74, 0x6a, 0x03, 0xf8, + 0xa8, 0x2c, 0x26, 0xbb, 0x3d, 0xac, 0x81, 0x9f, 0x95, 0xab, 0xf4, 0xb6, + 0xb1, 0x0a, 0x7e, 0x56, 0xae, 0xb2, 0xdd, 0xc7, 0x2a, 0xf8, 0x59, 0xb9, + 0x0a, 0x06, 0x50, 0x2b, 0xeb, 0x06, 0xfe, 0xac, 0xde, 0xa9, 0x3d, 0xde, + 0xab, 0xbd, 0x75, 0xba, 0xb5, 0xd5, 0xa7, 0x7e, 0xd1, 0x9f, 0xca, 0x95, + 0x76, 0x9e, 0x23, 0x9a, 0x03, 0xfa, 0x53, 0x1d, 0xbd, 0xee, 0x0e, 0xc7, + 0x8f, 0xfe, 0x56, 0xa7, 0xfb, 0x56, 0x87, 0x53, 0x9e, 0xfe, 0x3e, 0x66, + 0x39, 0x53, 0x59, 0xd4, 0xe2, 0x0c, 0x2e, 0x5c, 0xb4, 0xaa, 0xb0, 0xb7, + 0xc2, 0xe2, 0xe8, 0x54, 0x61, 0xc7, 0x7e, 0x12, 0x17, 0xc7, 0xc4, 0xa9, + 0xc1, 0x6d, 0x50, 0x7a, 0x08, 0x85, 0x4b, 0x5d, 0x5e, 0x06, 0x49, 0x9e, + 0xd7, 0x06, 0xcf, 0xd7, 0xda, 0xc7, 0xeb, 0x2b, 0x2c, 0xd5, 0x7f, 0xe4, + 0x56, 0xde, 0x43, 0x48, 0x72, 0xe1, 0x46, 0x7e, 0x72, 0x5f, 0x89, 0x1e, + 0x0b, 0x2a, 0xba, 0x0e, 0x35, 0xde, 0x28, 0x9d, 0x2b, 0xdf, 0xaa, 0xb4, + 0x54, 0x7e, 0x09, 0xfa, 0xe5, 0x8d, 0x37, 0x5f, 0xab, 0xce, 0xdb, 0xda, + 0xe0, 0xed, 0x78, 0xfc, 0x1b, 0x90, 0xf1, 0x12, 0x58, 0xb4, 0x3a, 0x67, + 0xc5, 0x50, 0x7a, 0x5d, 0xce, 0xea, 0x2a, 0xb4, 0xec, 0xae, 0x45, 0x94, + 0x1e, 0xcc, 0xd0, 0x27, 0xde, 0x24, 0xce, 0x79, 0x18, 0xdd, 0x1b, 0xef, + 0x52, 0x39, 0x73, 0xa2, 0x84, 0xa2, 0xe5, 0xa7, 0xf0, 0xd1, 0x62, 0x11, + 0xdc, 0x8b, 0x13, 0x25, 0xcb, 0x88, 0xae, 0x7d, 0x35, 0xce, 0x77, 0x7d, + 0x8f, 0x25, 0x54, 0x39, 0xed, 0xf1, 0xdd, 0x96, 0x50, 0x8c, 0x83, 0x5d, + 0xb9, 0x7a, 0x2a, 0x07, 0x51, 0xb0, 0x7c, 0xd5, 0x85, 0x14, 0x63, 0x7d, + 0xd0, 0x1b, 0x44, 0xf7, 0x98, 0x57, 0x16, 0xd1, 0xee, 0xe7, 0x24, 0xfc, + 0x3c, 0x04, 0x9a, 0xb3, 0xbf, 0xfd, 0xaf, 0xff, 0xcd, 0x8e, 0x61, 0xc4, + 0xd6, 0xb1, 0x58, 0xb0, 0xb2, 0x5b, 0x1b, 0x1c, 0x53, 0xe5, 0xa3, 0x35, + 0x2b, 0xeb, 0x61, 0xbc, 0xc7, 0x7e, 0x6a, 0x99, 0xb8, 0xc1, 0x43, 0x97, + 0x8a, 0x85, 0xce, 0x54, 0xfb, 0xfc, 0x02, 0x43, 0xd6, 0x39, 0x58, 0xe7, + 0x60, 0x8e, 0xd6, 0xe6, 0xcf, 0x53, 0x6f, 0xae, 0x9e, 0x15, 0xc2, 0xe3, + 0x3a, 0xde, 0x9c, 0x68, 0xdc, 0x62, 0x43, 0xf2, 0xe4, 0x03, 0xd6, 0x9e, + 0x7f, 0xc3, 0x0f, 0xef, 0x80, 0x0c, 0xe3, 0x47, 0xbf, 0xdd, 0x88, 0x1e, + 0xb0, 0xc3, 0x3b, 0x7e, 0xe8, 0xdd, 0x3a, 0xf2, 0xac, 0x86, 0x74, 0x64, + 0x87, 0xf2, 0xf9, 0xd1, 0x9e, 0x38, 0xf1, 0x83, 0x80, 0x0d, 0x3d, 0x0c, + 0xa0, 0xbd, 0xf1, 0x63, 0x7f, 0x48, 0xc7, 0x7d, 0xa8, 0xac, 0x88, 0x52, + 0x6f, 0x2b, 0x7d, 0x5d, 0xac, 0x98, 0x60, 0x17, 0x3a, 0xe3, 0x54, 0x98, + 0x63, 0x4a, 0x0d, 0xc6, 0x79, 0xf3, 0xfb, 0x4f, 0x33, 0xe8, 0x9f, 0x31, + 0xb5, 0xd7, 0x99, 0x6c, 0x8b, 0xc8, 0x33, 0xc6, 0x58, 0x1f, 0xdc, 0xe7, + 0xa5, 0x83, 0x9b, 0xde, 0xc8, 0x71, 0xb7, 0x4f, 0x17, 0x72, 0x00, 0xe4, + 0x74, 0xf3, 0x89, 0x35, 0xc6, 0xde, 0xc4, 0x5d, 0x06, 0x49, 0x53, 0x19, + 0xfe, 0xd4, 0x8d, 0x94, 0xe5, 0x6e, 0xfc, 0xed, 0x3f, 0xff, 0xe3, 0x91, + 0xff, 0x93, 0xd0, 0x1f, 0x0f, 0x69, 0x23, 0x3d, 0xb6, 0xd4, 0x38, 0xed, + 0x35, 0xcd, 0x19, 0x97, 0x9e, 0x6d, 0x69, 0x9c, 0x6e, 0x37, 0x37, 0xe4, + 0xa9, 0x26, 0xf8, 0xb5, 0x95, 0x2b, 0x2a, 0x8f, 0xbe, 0x40, 0xe6, 0x4e, + 0x73, 0x63, 0xe3, 0x2d, 0x10, 0x2a, 0xf2, 0xc1, 0xc6, 0xb9, 0xf5, 0x93, + 0xe9, 0xfe, 0x86, 0xc3, 0xfe, 0xed, 0xf2, 0xe5, 0xbb, 0xb3, 0xa3, 0xf3, + 0xcf, 0x47, 0x9f, 0xdf, 0xfd, 0xf2, 0xf9, 0xe2, 0xec, 0xcd, 0xbf, 0xb1, + 0x4d, 0x25, 0xed, 0x8a, 0xa7, 0x29, 0xe5, 0x8e, 0x2d, 0xe5, 0x8e, 0xd3, + 0x72, 0x0a, 0x4f, 0x47, 0x9e, 0x7d, 0xe3, 0xc2, 0xba, 0x6e, 0xd1, 0x1e, + 0x06, 0x7f, 0x39, 0x92, 0x5f, 0xaf, 0x28, 0xf7, 0x33, 0x1a, 0x78, 0xc7, + 0x35, 0x6e, 0x65, 0xd0, 0x1d, 0xd0, 0x0f, 0xf6, 0xb7, 0xdb, 0xf7, 0x19, + 0x56, 0xf2, 0x34, 0xe2, 0x92, 0xb1, 0x71, 0xc5, 0xb6, 0x4d, 0xd6, 0x5e, + 0x55, 0xad, 0x54, 0xcb, 0x28, 0xd0, 0x3a, 0x0a, 0xd7, 0x9b, 0x55, 0x9b, + 0xb9, 0xb7, 0xfe, 0xc4, 0x37, 0x0f, 0x6d, 0x24, 0xc3, 0xf7, 0x0b, 0x50, + 0x79, 0xbd, 0x9f, 0x45, 0xde, 0xfb, 0xb3, 0xd2, 0x53, 0x1b, 0x25, 0xa2, + 0x1f, 0x4c, 0x82, 0x23, 0x7e, 0x31, 0xf8, 0x05, 0x5a, 0xe5, 0x15, 0x4f, + 0x5f, 0x94, 0xea, 0x3e, 0x83, 0xa3, 0x0b, 0xf6, 0x8c, 0x9d, 0x04, 0xbe, + 0x37, 0x4f, 0x1e, 0x05, 0xaa, 0x87, 0x01, 0x57, 0x08, 0x65, 0x4d, 0xac, + 0x8a, 0x37, 0x98, 0xab, 0xf0, 0x02, 0xde, 0xc5, 0x5a, 0xd3, 0x28, 0x7f, + 0xea, 0xc5, 0x23, 0x58, 0xcf, 0xf9, 0x41, 0x80, 0x51, 0xe4, 0xb9, 0xb8, + 0xd4, 0x80, 0x4a, 0xc8, 0xc2, 0xdb, 0x39, 0x67, 0xfe, 0xb9, 0x97, 0xdc, + 0x86, 0xd1, 0x97, 0x76, 0xc1, 0x5e, 0x54, 0x85, 0xed, 0xaa, 0xaa, 0xd9, + 0x45, 0xcc, 0xcb, 0x43, 0x80, 0x16, 0x27, 0xf9, 0x63, 0x82, 0x4f, 0xcc, + 0xc8, 0x7c, 0x17, 0x1d, 0x49, 0x73, 0xb4, 0xb8, 0xbc, 0x3c, 0x3b, 0xa5, + 0xe1, 0x7e, 0xc3, 0xfb, 0xcf, 0xde, 0xb8, 0x33, 0x8f, 0x35, 0x30, 0xb9, + 0x59, 0x9d, 0xd7, 0xed, 0xfb, 0xea, 0x4a, 0x0b, 0xfa, 0xd6, 0xfa, 0xeb, + 0x7b, 0xbc, 0xc4, 0xa5, 0x86, 0x57, 0xa9, 0x06, 0xde, 0xfc, 0x3a, 0x99, + 0x82, 0xf5, 0xdd, 0xab, 0x3d, 0x8a, 0xe8, 0x4f, 0x4c, 0x16, 0x5c, 0xca, + 0x89, 0x2c, 0x17, 0xe2, 0xb5, 0x2a, 0xd6, 0x98, 0xc1, 0x52, 0xdb, 0xe7, + 0xcf, 0x09, 0x3f, 0x90, 0x32, 0xe9, 0xcb, 0x57, 0x0a, 0x75, 0xa8, 0x21, + 0x9d, 0x3a, 0xe7, 0x1e, 0x68, 0x1f, 0x6c, 0x18, 0xb8, 0xf3, 0x2f, 0xa8, + 0xea, 0x7c, 0xf1, 0xbc, 0x05, 0xde, 0xe8, 0x8a, 0xd7, 0x04, 0x69, 0x24, + 0xdb, 0xdd, 0x32, 0x03, 0xd4, 0xe7, 0xde, 0xad, 0x93, 0x36, 0xf2, 0xdb, + 0xf1, 0x70, 0x9c, 0xb8, 0xc4, 0xc4, 0xa6, 0xbb, 0x91, 0x2e, 0x0e, 0xfa, + 0xb5, 0x58, 0xfb, 0x32, 0x71, 0x39, 0x6f, 0xd3, 0xec, 0x16, 0xdc, 0x5d, + 0x7d, 0xdc, 0x8a, 0xbc, 0xfe, 0x05, 0xbb, 0xb7, 0x0f, 0x98, 0x19, 0x12, + 0x41, 0x7d, 0xf0, 0xe5, 0x34, 0xc4, 0xb7, 0xa9, 0xcd, 0x58, 0xee, 0xaa, + 0x6d, 0x96, 0xc6, 0x45, 0xd0, 0x00, 0x8d, 0xdc, 0xf9, 0xb1, 0x76, 0xb5, + 0x50, 0x32, 0xbc, 0x84, 0x34, 0x5c, 0x8b, 0x14, 0x3d, 0x97, 0x87, 0x8d, + 0x93, 0x6a, 0x27, 0xa3, 0xbe, 0xb3, 0x67, 0xb1, 0x6a, 0x03, 0xac, 0x51, + 0xbc, 0xa7, 0xff, 0x80, 0xf9, 0xab, 0x5d, 0x14, 0x82, 0x38, 0xbe, 0xe3, + 0x97, 0x3a, 0xa7, 0x41, 0xb7, 0xea, 0x4d, 0xcf, 0x45, 0xdc, 0xf5, 0x78, + 0xf9, 0xfd, 0xd4, 0x6c, 0xc8, 0x65, 0x09, 0xb1, 0xa1, 0x94, 0x26, 0x4f, + 0x25, 0x3f, 0x24, 0xf4, 0x62, 0x01, 0x82, 0x07, 0x09, 0xf1, 0xde, 0x28, + 0xb9, 0xbe, 0xfd, 0xfd, 0x89, 0x8c, 0x5f, 0x69, 0x20, 0x5e, 0x8f, 0x31, + 0xbc, 0x6a, 0x76, 0xfa, 0xe6, 0x92, 0xfd, 0x14, 0xc6, 0x09, 0xce, 0xaf, + 0xa7, 0x58, 0xdf, 0x08, 0xac, 0x4e, 0x7e, 0xaf, 0x7d, 0xdd, 0x66, 0xb3, + 0x7b, 0xd4, 0x9f, 0x6b, 0x8f, 0xd0, 0x5f, 0xa4, 0x52, 0x77, 0xe3, 0xbb, + 0xca, 0x4d, 0x63, 0x33, 0x68, 0xef, 0x22, 0xf2, 0xf0, 0x4e, 0xaf, 0xda, + 0x60, 0x9a, 0x76, 0x84, 0x02, 0x72, 0xdb, 0x74, 0xc0, 0x86, 0x35, 0x02, + 0x7d, 0x01, 0x11, 0xaf, 0xb1, 0x35, 0xbf, 0xbf, 0x66, 0x63, 0x9a, 0xd1, + 0x20, 0x55, 0x00, 0x13, 0x43, 0xaa, 0x28, 0xd6, 0xf3, 0x36, 0x97, 0x23, + 0x88, 0xed, 0x8f, 0xee, 0x6c, 0x71, 0x80, 0x97, 0x7a, 0x27, 0x2e, 0x6e, + 0xba, 0x94, 0x49, 0x15, 0xf3, 0xde, 0xa4, 0x5f, 0xc7, 0x2a, 0x11, 0xba, + 0xe3, 0xd9, 0x7c, 0x12, 0x7e, 0x1f, 0xe3, 0x64, 0x51, 0x6a, 0x89, 0xf7, + 0x9f, 0xaf, 0xe3, 0x67, 0xb1, 0xfd, 0x3b, 0xbb, 0xd8, 0x57, 0xf8, 0x68, + 0x4c, 0xdd, 0x39, 0x83, 0x99, 0xe4, 0xc8, 0x73, 0x7d, 0xc3, 0x68, 0x35, + 0x90, 0xd7, 0x47, 0x27, 0x79, 0x28, 0xaf, 0xdd, 0xd1, 0x9a, 0x60, 0x5e, + 0x45, 0x9e, 0x87, 0x4f, 0xb7, 0x2f, 0x54, 0x60, 0x13, 0x48, 0xc4, 0xb4, + 0x0c, 0xd6, 0x0a, 0x5e, 0x5d, 0x3c, 0x88, 0x53, 0x8b, 0x82, 0xcd, 0x9e, + 0xe2, 0xb2, 0x07, 0x7a, 0x76, 0x49, 0x9c, 0xf7, 0xa2, 0xaf, 0x03, 0xad, + 0x64, 0x3c, 0x8a, 0xfc, 0x45, 0x42, 0x17, 0xc1, 0x1f, 0x3e, 0xe2, 0x1f, + 0x02, 0x43, 0x05, 0x7a, 0x18, 0xde, 0xb1, 0x63, 0x37, 0xf6, 0x28, 0xf2, + 0x50, 0x18, 0xf2, 0x7f, 0x74, 0x6f, 0xdc, 0x4b, 0x6a, 0x06, 0x4b, 0xfd, + 0xec, 0x0d, 0x2f, 0xc3, 0xd1, 0x17, 0x2f, 0x69, 0xe1, 0xeb, 0xc7, 0xf8, + 0x1e, 0x27, 0x62, 0xd5, 0x62, 0xfc, 0xbe, 0xc2, 0x16, 0x5b, 0x26, 0x7e, + 0xe0, 0x27, 0xf7, 0x6c, 0xb2, 0x9c, 0xf3, 0x3b, 0x71, 0xb0, 0xd2, 0x63, + 0x50, 0xc3, 0x9b, 0x67, 0x37, 0x60, 0x65, 0x61, 0xb7, 0xf1, 0x01, 0xfd, + 0xfd, 0x1c, 0xa1, 0xea, 0x81, 0x17, 0x22, 0x62, 0x48, 0x41, 0x74, 0xb0, + 0x01, 0xbf, 0x62, 0x48, 0xe6, 0x18, 0x5c, 0x84, 0x41, 0x70, 0x86, 0x1b, + 0xc9, 0x60, 0x2e, 0xb2, 0x43, 0xbc, 0xad, 0xbf, 0x73, 0xb0, 0xb1, 0xb1, + 0xb9, 0xc9, 0xe8, 0xc9, 0x07, 0x89, 0x3c, 0x5d, 0xf0, 0xff, 0xc0, 0x7f, + 0x1b, 0x1b, 0xb2, 0x6f, 0x2c, 0x19, 0x8a, 0xab, 0x19, 0x1b, 0xf2, 0x41, + 0x80, 0xdb, 0x18, 0x1a, 0x85, 0x15, 0x30, 0x6b, 0xaa, 0x51, 0xbf, 0x8d, + 0xf7, 0x37, 0x37, 0xeb, 0x60, 0xfd, 0xa2, 0x30, 0xc5, 0x7a, 0x6d, 0x94, + 0xb2, 0xf0, 0xbb, 0xbe, 0x79, 0x1b, 0xd7, 0xc5, 0xf5, 0x9b, 0xb7, 0x71, + 0x3b, 0x9c, 0xd3, 0xb2, 0x7a, 0xc8, 0x00, 0xda, 0xe1, 0x40, 0x00, 0xc4, + 0x7f, 0xe3, 0x70, 0xb4, 0x9c, 0xe1, 0x3b, 0xc1, 0xd7, 0x5e, 0xf2, 0x32, + 0xf0, 0xf0, 0xeb, 0xf1, 0xfd, 0xd9, 0xb8, 0x51, 0x4f, 0x6f, 0x94, 0xac, + 0x37, 0xdb, 0xc4, 0x2f, 0xe7, 0x7e, 0x9c, 0xb4, 0x61, 0x56, 0x87, 0x37, + 0x5e, 0xa3, 0x2e, 0x2e, 0x9f, 0x94, 0x2d, 0x54, 0x80, 0x84, 0x27, 0x4b, + 0x00, 0x14, 0x8a, 0x81, 0x13, 0x11, 0x5f, 0x7a, 0x48, 0x17, 0x7f, 0xce, + 0xc9, 0x07, 0x5c, 0xcf, 0x00, 0xd1, 0xb1, 0x79, 0x49, 0xe7, 0x86, 0x31, + 0x24, 0x4a, 0x83, 0x40, 0xf8, 0x13, 0xe9, 0xfa, 0x71, 0xd2, 0x37, 0x09, + 0xa6, 0x61, 0xf8, 0x85, 0xf9, 0x13, 0x36, 0xf6, 0x26, 0x80, 0xe0, 0x38, + 0x2d, 0x0d, 0x49, 0x0d, 0x5c, 0x12, 0xc3, 0x09, 0x48, 0xfc, 0xb4, 0x59, + 0x64, 0x1f, 0x56, 0x97, 0x44, 0xaf, 0x37, 0xd5, 0xbc, 0x86, 0x68, 0xeb, + 0x9b, 0x42, 0x45, 0xfe, 0x52, 0xd3, 0xa3, 0xc9, 0x08, 0xfa, 0xe9, 0xd3, + 0xd1, 0xf0, 0xd4, 0x8f, 0x47, 0x16, 0x32, 0x1a, 0x84, 0x83, 0x92, 0x20, + 0xdf, 0x53, 0xb2, 0x9a, 0x1d, 0x90, 0x24, 0xfa, 0x01, 0xb8, 0xec, 0xdf, + 0xff, 0x1d, 0x3b, 0x4b, 0x47, 0xa9, 0xf1, 0x7a, 0x3a, 0x8f, 0x88, 0x94, + 0x32, 0x5d, 0xfb, 0xe4, 0xfc, 0xed, 0xe5, 0xcb, 0xd3, 0xa6, 0xca, 0xa1, + 0x59, 0xab, 0xdf, 0x5a, 0x6c, 0x0b, 0xe6, 0x85, 0x85, 0x74, 0x33, 0x50, + 0x0f, 0xdc, 0x6b, 0x22, 0x9e, 0x67, 0x34, 0x4e, 0x8f, 0x65, 0x6a, 0xa8, + 0xf0, 0x79, 0x47, 0x67, 0x9e, 0x0f, 0xd9, 0x1f, 0x2f, 0xdf, 0xbe, 0x69, + 0x2f, 0xc0, 0x92, 0xf5, 0x1a, 0x5e, 0x1b, 0xd3, 0x94, 0xf6, 0xa8, 0xa7, + 0xc9, 0xf0, 0x27, 0x77, 0x3e, 0x0e, 0xbc, 0xd7, 0xbc, 0x89, 0x86, 0xa5, + 0xcc, 0x7a, 0xcc, 0x92, 0x63, 0x98, 0xd7, 0x12, 0xf9, 0x1c, 0xbb, 0x14, + 0xb4, 0xf9, 0x8d, 0xc1, 0x7c, 0x1c, 0x4d, 0xa1, 0xaf, 0x51, 0xd4, 0xb4, + 0x74, 0x2e, 0x0c, 0x3c, 0xfe, 0xe0, 0x5d, 0xa3, 0xfe, 0xf3, 0x25, 0xa3, + 0xce, 0x31, 0xfa, 0xbd, 0x5f, 0x6f, 0xe1, 0x17, 0x15, 0x94, 0x24, 0xe5, + 0x37, 0x45, 0x3c, 0xdc, 0xc6, 0x18, 0xad, 0xdf, 0x08, 0x87, 0x7f, 0x96, + 0xd0, 0x11, 0x5f, 0x18, 0xbc, 0x1f, 0x7f, 0x2c, 0x1d, 0xbc, 0xb7, 0x17, + 0x2f, 0xdf, 0xa8, 0xf8, 0x40, 0x59, 0x0c, 0x39, 0x6f, 0x10, 0x8d, 0xe3, + 0x24, 0x82, 0xf5, 0xdf, 0x9f, 0xdc, 0x13, 0x5c, 0x39, 0x86, 0x74, 0x5d, + 0x37, 0x17, 0x72, 0xe9, 0xeb, 0xf1, 0xce, 0xd3, 0x08, 0x39, 0x7f, 0xee, + 0x27, 0x08, 0x33, 0x95, 0x71, 0xe9, 0x04, 0xf8, 0xcb, 0xd2, 0x8b, 0xc4, + 0x76, 0x72, 0x18, 0x1d, 0x05, 0x41, 0xa3, 0x8e, 0xaf, 0x9a, 0x03, 0xf3, + 0x83, 0x8a, 0xfc, 0xd2, 0x1d, 0x4d, 0x1b, 0x78, 0xb3, 0xa4, 0xce, 0x44, + 0xf8, 0xb8, 0xfa, 0x78, 0x8c, 0xdb, 0xc2, 0x09, 0x4e, 0x32, 0x6f, 0xee, + 0x01, 0x71, 0x49, 0xb7, 0x03, 0x92, 0xda, 0xf8, 0x7d, 0x8d, 0xc6, 0xb0, + 0x72, 0x62, 0x91, 0x83, 0xfc, 0xd4, 0x58, 0xbd, 0x69, 0x70, 0xdb, 0x0a, + 0xc8, 0xf2, 0x2c, 0xa6, 0xd2, 0xc2, 0x08, 0x5b, 0x18, 0x55, 0x6f, 0x01, + 0x7b, 0x6b, 0xc8, 0x13, 0x59, 0xf2, 0xc0, 0x32, 0x93, 0xc4, 0xc5, 0x71, + 0x87, 0x85, 0x12, 0x06, 0xe1, 0x21, 0x0b, 0x83, 0x8c, 0x40, 0x0c, 0x0d, + 0x20, 0x34, 0x17, 0x08, 0x44, 0x53, 0x80, 0x5a, 0xdd, 0xf8, 0x37, 0xc9, + 0x3f, 0xcd, 0x03, 0x95, 0x83, 0xe8, 0xe1, 0xce, 0xa7, 0xe3, 0x20, 0x0a, + 0x01, 0x47, 0x98, 0x8d, 0x59, 0x7c, 0xdd, 0x22, 0xa3, 0xa7, 0x99, 0x3d, + 0x9b, 0x8a, 0x3d, 0xa7, 0x06, 0x8b, 0x3b, 0x5e, 0xa7, 0x02, 0x12, 0x71, + 0x12, 0x81, 0x94, 0xd2, 0x64, 0x91, 0x97, 0x2c, 0xa3, 0xb9, 0x7c, 0x29, + 0x12, 0x5f, 0xa8, 0xd4, 0x05, 0x2f, 0x34, 0xa8, 0x66, 0x12, 0x41, 0xc8, + 0x1f, 0x09, 0x22, 0x82, 0xb7, 0x4a, 0xef, 0x36, 0xe2, 0xea, 0x4c, 0x82, + 0x04, 0xe5, 0x6a, 0x5d, 0x36, 0x04, 0x74, 0x46, 0xb1, 0x1c, 0x2e, 0x13, + 0x21, 0x8a, 0x15, 0x20, 0xda, 0xf8, 0x23, 0x8c, 0x7a, 0x33, 0x95, 0xaa, + 0x19, 0x25, 0x8d, 0xf3, 0x1c, 0x8f, 0xa6, 0xa4, 0x7e, 0x5f, 0xb3, 0x46, + 0xc3, 0x59, 0x19, 0xfd, 0xb4, 0xa3, 0x1f, 0x2a, 0x1d, 0x67, 0x4d, 0x36, + 0x33, 0xd9, 0x84, 0xf7, 0x26, 0x2b, 0x93, 0x0a, 0x58, 0xd9, 0xf2, 0x5b, + 0x52, 0x53, 0x72, 0x52, 0x56, 0xcd, 0x6e, 0x34, 0x75, 0x51, 0x68, 0x9c, + 0xe0, 0x78, 0x7a, 0xcc, 0xf5, 0xa1, 0xd0, 0x1b, 0xff, 0x8c, 0x22, 0xec, + 0x52, 0x05, 0x64, 0x60, 0x20, 0x9f, 0x21, 0x7d, 0x08, 0x1e, 0xa2, 0xae, + 0x2a, 0xaf, 0xe5, 0x93, 0xa0, 0x25, 0x92, 0x4e, 0xac, 0xae, 0x04, 0xc1, + 0x6b, 0xcb, 0x99, 0x0f, 0x24, 0x4d, 0xc1, 0x19, 0x14, 0x3b, 0xc8, 0xe6, + 0xaa, 0x2e, 0x84, 0xf3, 0x8d, 0x7c, 0xf1, 0xee, 0xf1, 0x52, 0xa1, 0x7c, + 0x33, 0x90, 0xc1, 0x87, 0xed, 0x65, 0x3c, 0x72, 0x17, 0x20, 0x08, 0xec, + 0x8d, 0x64, 0xec, 0xfb, 0x9e, 0x94, 0x79, 0xdf, 0x8b, 0x9f, 0x48, 0x5f, + 0x9e, 0x50, 0x88, 0x37, 0xbf, 0x46, 0xb5, 0x11, 0xab, 0x8b, 0x62, 0xcc, + 0x5e, 0xb0, 0xdd, 0x8e, 0x9c, 0xcf, 0x2c, 0x46, 0xed, 0x38, 0xae, 0x1f, + 0x68, 0xf9, 0x5b, 0xbb, 0x9d, 0xac, 0xc4, 0x6b, 0x37, 0x99, 0xb6, 0x27, + 0x41, 0x08, 0x8b, 0x73, 0xcc, 0x36, 0xa9, 0x2e, 0x54, 0x99, 0x89, 0x2a, + 0xf6, 0x42, 0x1c, 0x00, 0x14, 0x9b, 0xd2, 0x84, 0x57, 0x72, 0x21, 0xfb, + 0x9f, 0x44, 0xb6, 0x06, 0xeb, 0x5b, 0x0e, 0xf9, 0x34, 0x8c, 0xb9, 0x91, + 0xa4, 0x1d, 0x00, 0x6a, 0x09, 0x5b, 0x3e, 0x91, 0xb9, 0x31, 0x05, 0x18, + 0xf8, 0x73, 0x36, 0xf3, 0x83, 0xc0, 0x47, 0x8e, 0xe7, 0xb7, 0xce, 0xb6, + 0xf0, 0xb1, 0x64, 0xf6, 0x7e, 0xee, 0xdf, 0x31, 0x6f, 0x11, 0x8e, 0xa6, + 0xd9, 0x24, 0x8b, 0x69, 0x68, 0x96, 0x73, 0xa1, 0xe6, 0xa0, 0x20, 0x12, + 0x69, 0xf3, 0x65, 0x10, 0xa8, 0xec, 0x25, 0x3a, 0x87, 0x56, 0xc6, 0x29, + 0x28, 0x0f, 0x0d, 0x50, 0x36, 0x43, 0xba, 0xe8, 0xc4, 0x43, 0xe4, 0x2e, + 0x49, 0x3f, 0x68, 0xd4, 0xbd, 0xb9, 0xf3, 0xcf, 0xc7, 0xc0, 0x03, 0x5f, + 0x41, 0x81, 0x5a, 0x46, 0xfb, 0xac, 0xde, 0x73, 0xc6, 0xfe, 0xb5, 0x9f, + 0xd4, 0xe9, 0x89, 0x1f, 0xb0, 0xf1, 0xb5, 0x24, 0xee, 0xce, 0x55, 0x92, + 0x0c, 0x76, 0x13, 0x28, 0xbe, 0xa0, 0x97, 0x73, 0xd3, 0x7f, 0x2a, 0x56, + 0x52, 0x92, 0x27, 0x64, 0x77, 0x29, 0xb4, 0x4d, 0x90, 0xf4, 0xdd, 0x4c, + 0xdf, 0xcc, 0x0a, 0x4f, 0x8d, 0x82, 0x54, 0x57, 0x0c, 0x93, 0x59, 0x76, + 0xa6, 0x97, 0x15, 0x85, 0xb5, 0x41, 0x33, 0xab, 0xa0, 0x29, 0x26, 0x8b, + 0xed, 0x76, 0x0e, 0x4c, 0xfa, 0x09, 0x42, 0x4d, 0x9b, 0xa0, 0xb6, 0x8e, + 0x2f, 0xd1, 0x49, 0x84, 0xcf, 0xec, 0xd4, 0x3b, 0x75, 0x1a, 0xfd, 0x7d, + 0xe4, 0x10, 0x51, 0x64, 0xb6, 0xba, 0x48, 0x9c, 0x2f, 0xa2, 0x92, 0xcf, + 0x1c, 0x32, 0xe0, 0x9d, 0xef, 0x36, 0x68, 0xca, 0xea, 0x43, 0x06, 0x09, + 0x5b, 0x80, 0x49, 0xcc, 0x9e, 0x62, 0xfa, 0x7e, 0x26, 0x57, 0xda, 0x65, + 0x6a, 0x67, 0xa7, 0x52, 0xb4, 0xcc, 0x68, 0x11, 0x4a, 0xf0, 0x57, 0x36, + 0x9a, 0x21, 0xaa, 0xdc, 0x48, 0x52, 0xd8, 0xab, 0x65, 0xb3, 0xdc, 0x0d, + 0x75, 0x84, 0x0e, 0xff, 0x4f, 0xbd, 0x60, 0x01, 0x26, 0xd2, 0x13, 0x58, + 0xed, 0x04, 0xef, 0xf2, 0xd6, 0x07, 0xdd, 0xbf, 0xe1, 0x8f, 0x5b, 0xf8, + 0x42, 0x72, 0x80, 0xaf, 0x68, 0xe8, 0x8b, 0x82, 0x17, 0x94, 0xac, 0x07, + 0xfe, 0x58, 0x55, 0x46, 0xbc, 0x40, 0xd7, 0x44, 0x38, 0x00, 0xf1, 0x9c, + 0xfc, 0x21, 0x40, 0x52, 0x16, 0x2a, 0xde, 0xba, 0xa9, 0x8c, 0x29, 0xeb, + 0xac, 0xc4, 0x26, 0xb7, 0xc2, 0xca, 0x8c, 0x06, 0xaf, 0xaa, 0xd1, 0x88, + 0x4b, 0x74, 0x41, 0xa3, 0x07, 0x8a, 0x6b, 0x85, 0x44, 0x1e, 0x81, 0xfb, + 0x29, 0x99, 0x05, 0x0d, 0xb0, 0x37, 0x24, 0x5d, 0xf4, 0x89, 0x83, 0x19, + 0xb0, 0xec, 0x92, 0xa3, 0xba, 0xb1, 0xf9, 0xe3, 0x26, 0x68, 0x76, 0x75, + 0xf2, 0xb9, 0xd6, 0x95, 0xe4, 0x17, 0x3c, 0x39, 0x48, 0xb4, 0xd4, 0x01, + 0x4f, 0xbd, 0xd6, 0x53, 0x6b, 0x3c, 0xf5, 0x2f, 0xcb, 0x10, 0xd3, 0xd5, + 0xde, 0xc9, 0x4b, 0xef, 0x1e, 0xc5, 0x03, 0x4a, 0xf7, 0xe4, 0x9d, 0x7b, + 0xc7, 0x41, 0x38, 0x6c, 0x0c, 0xe1, 0xa3, 0xc5, 0x26, 0x7e, 0xe0, 0xa1, + 0xe3, 0x5b, 0xe7, 0x81, 0x65, 0x84, 0x4c, 0xf0, 0xfe, 0xdd, 0x79, 0x9b, + 0xef, 0xf0, 0xbf, 0x1d, 0xe2, 0x45, 0x19, 0xf0, 0x9b, 0x6a, 0x35, 0xb5, + 0xd1, 0x56, 0xb9, 0x85, 0x97, 0x16, 0x0c, 0x03, 0x63, 0x2d, 0x87, 0xd9, + 0x6d, 0x4f, 0x23, 0x6f, 0x02, 0x25, 0x01, 0xb0, 0x4c, 0x91, 0xc8, 0x40, + 0xaa, 0x44, 0xe2, 0x40, 0x5f, 0xe2, 0xf1, 0x8c, 0x6a, 0xdb, 0xa5, 0xeb, + 0x32, 0x4e, 0xf0, 0xf5, 0xcb, 0x86, 0x9b, 0x82, 0x23, 0x85, 0x42, 0xda, + 0xf6, 0x7a, 0x05, 0xae, 0x11, 0xe9, 0x15, 0xb0, 0x27, 0x91, 0x77, 0x13, + 0x7e, 0x51, 0x7a, 0x02, 0xa8, 0xe8, 0x52, 0x83, 0xbb, 0xfd, 0xa4, 0x2b, + 0x60, 0x8a, 0x56, 0x3b, 0xc6, 0xbf, 0x3d, 0x58, 0x6a, 0x58, 0x2d, 0x7f, + 0x65, 0xed, 0xc7, 0xdf, 0x6d, 0x52, 0xbe, 0x89, 0xe3, 0xa5, 0xa6, 0x55, + 0x57, 0x57, 0x17, 0x00, 0x72, 0x11, 0x2e, 0x96, 0x81, 0x08, 0x6f, 0x49, + 0x55, 0x16, 0xc5, 0xa2, 0xff, 0x06, 0xf3, 0x0c, 0x0c, 0x74, 0x0b, 0x44, + 0xdc, 0x55, 0xc1, 0x8d, 0x3e, 0x13, 0xe2, 0x3b, 0x20, 0xa8, 0x17, 0x5d, + 0x66, 0xdb, 0x82, 0xbc, 0xa2, 0xd8, 0xd7, 0x8a, 0x57, 0xc2, 0x15, 0xb2, + 0xac, 0x00, 0x4f, 0xae, 0x12, 0xa0, 0x77, 0x5f, 0xc3, 0x52, 0xa1, 0xb4, + 0x1e, 0x22, 0xf5, 0x04, 0xf2, 0xb9, 0x8c, 0x48, 0x79, 0xd9, 0x86, 0x42, + 0x0c, 0x65, 0x75, 0x25, 0x19, 0xe7, 0x81, 0x59, 0x2c, 0x43, 0x5f, 0xc0, + 0xd0, 0xc5, 0x64, 0x3d, 0xa9, 0xcd, 0xdf, 0x07, 0x3d, 0x24, 0x87, 0x50, + 0x5b, 0xa6, 0xb3, 0x3f, 0xfc, 0x41, 0xbe, 0xf6, 0xa3, 0x42, 0xe1, 0x31, + 0x1c, 0x04, 0xc7, 0x4c, 0xd2, 0xe1, 0xc4, 0xb1, 0x3f, 0xe6, 0x36, 0x99, + 0x0d, 0x08, 0xee, 0x54, 0x1a, 0x40, 0x78, 0x52, 0x0a, 0xc4, 0x56, 0x4f, + 0x6c, 0x93, 0x63, 0xc5, 0x5c, 0x92, 0xd1, 0x3a, 0x4f, 0x2e, 0x42, 0x40, + 0xec, 0x95, 0x1a, 0x80, 0x2a, 0x60, 0x80, 0x5b, 0x7c, 0x26, 0x11, 0x29, + 0x49, 0x6f, 0x1e, 0x77, 0xe6, 0x70, 0x67, 0x51, 0x6d, 0xdf, 0x16, 0xe4, + 0x65, 0x58, 0x3b, 0xc5, 0x2c, 0xf8, 0x48, 0x1e, 0xe0, 0x48, 0xb9, 0x23, + 0xf4, 0x5f, 0x21, 0xde, 0xe9, 0x5e, 0x0d, 0xef, 0x8b, 0x91, 0x64, 0x58, + 0xe2, 0xb2, 0xb2, 0x01, 0x6e, 0xea, 0xb9, 0x0b, 0x09, 0x4f, 0x6e, 0xd7, + 0x64, 0xe0, 0xb2, 0x14, 0x1b, 0x34, 0xaa, 0x0b, 0x8a, 0x18, 0x8f, 0xf3, + 0x15, 0x04, 0x82, 0xb9, 0x45, 0x87, 0x6d, 0x87, 0x1e, 0x0a, 0xe5, 0x1b, + 0xd7, 0x0f, 0x70, 0xab, 0x92, 0x9d, 0x5d, 0x28, 0x5d, 0xf7, 0x17, 0xca, + 0x08, 0x9f, 0x5d, 0x20, 0x7d, 0xe9, 0x97, 0xbb, 0xe0, 0x3f, 0xd4, 0x31, + 0xf3, 0x17, 0x7a, 0x77, 0xcf, 0x16, 0x72, 0xbc, 0xb3, 0xdf, 0x06, 0x72, + 0xfe, 0x42, 0x1f, 0x11, 0xdb, 0x98, 0xe9, 0x16, 0x30, 0xce, 0x94, 0x43, + 0xee, 0x61, 0x04, 0x15, 0xa8, 0x51, 0x68, 0x85, 0x9a, 0xd3, 0x4d, 0x5f, + 0x81, 0x28, 0xd0, 0xab, 0xcc, 0x88, 0xe5, 0x25, 0xea, 0x5a, 0x2d, 0x11, + 0x5a, 0x53, 0x6a, 0xfb, 0xf2, 0x22, 0x7a, 0xbd, 0x31, 0xe8, 0x08, 0x65, + 0x95, 0xd4, 0x38, 0x39, 0xac, 0x99, 0x12, 0x94, 0x23, 0xd1, 0x14, 0xe8, + 0xb6, 0x69, 0x8b, 0xb2, 0x2d, 0x42, 0x2e, 0x90, 0x23, 0x39, 0x31, 0x40, + 0xbe, 0xf6, 0x9a, 0xec, 0x0f, 0xac, 0x8e, 0x41, 0x18, 0x75, 0xb6, 0xaf, + 0x8d, 0x89, 0x40, 0xa8, 0x29, 0x91, 0x2f, 0x01, 0xd2, 0xc9, 0x01, 0xc9, + 0xf8, 0x0f, 0x30, 0x53, 0x65, 0x37, 0x79, 0x15, 0x94, 0x7a, 0x98, 0x9f, + 0xf3, 0xe3, 0x57, 0x88, 0xf7, 0x53, 0xfc, 0xfb, 0xe9, 0xca, 0x91, 0xc2, + 0xed, 0xda, 0xe1, 0x9e, 0x08, 0x80, 0x47, 0x17, 0x74, 0x6b, 0xa8, 0xd8, + 0x14, 0x88, 0x71, 0xb3, 0xdd, 0xbb, 0x03, 0xb5, 0x11, 0x17, 0x60, 0x6c, + 0xa4, 0x8d, 0x25, 0x50, 0x0b, 0x8b, 0xf1, 0x6d, 0x31, 0x76, 0x8b, 0xd1, + 0xef, 0xe9, 0xc6, 0x42, 0xae, 0x65, 0x6b, 0x4b, 0x45, 0xa0, 0xe9, 0x74, + 0x40, 0x9b, 0xbd, 0x02, 0x2d, 0x33, 0xa6, 0x47, 0xe5, 0xb0, 0x04, 0xb4, + 0x06, 0xe8, 0x8b, 0x16, 0xc8, 0x0a, 0x86, 0x09, 0x15, 0xcb, 0x86, 0xc4, + 0x8b, 0x6d, 0x30, 0xe5, 0x38, 0x83, 0x33, 0x0a, 0x86, 0x58, 0xf0, 0x60, + 0x02, 0x95, 0xbf, 0x41, 0x90, 0xd1, 0xa5, 0xa9, 0x2b, 0x19, 0x86, 0xa4, + 0xa0, 0xca, 0x66, 0x02, 0x58, 0x59, 0x45, 0x25, 0x80, 0x41, 0x73, 0x10, + 0xa5, 0x8d, 0xc2, 0xfc, 0x15, 0x60, 0x9a, 0xf2, 0x8b, 0xe9, 0x26, 0x94, + 0x65, 0x85, 0x00, 0x46, 0x19, 0x20, 0x43, 0x21, 0xea, 0xe6, 0x64, 0xce, + 0xe2, 0x9a, 0xb4, 0x49, 0x3c, 0x4c, 0xe6, 0xa5, 0x93, 0x88, 0x47, 0x48, + 0xa9, 0x18, 0x42, 0x8d, 0x26, 0x3e, 0xea, 0x9b, 0xcc, 0xdb, 0x22, 0xa2, + 0x02, 0xa7, 0x61, 0x12, 0x2d, 0xbd, 0x03, 0x4a, 0x34, 0x46, 0xae, 0xdd, + 0x06, 0xba, 0x9b, 0xee, 0x1f, 0x5b, 0x33, 0x42, 0x9b, 0x01, 0x21, 0x61, + 0xce, 0x0b, 0x3e, 0x11, 0xe4, 0x86, 0x8f, 0x66, 0x98, 0xa5, 0x4a, 0x52, + 0x6a, 0x9a, 0xe5, 0xdc, 0x9f, 0x5f, 0x4b, 0xb0, 0xa6, 0x8b, 0x6b, 0xad, + 0x68, 0x23, 0xb9, 0x10, 0x6f, 0x34, 0xf5, 0xc8, 0x7b, 0x90, 0x5f, 0xaf, + 0xf2, 0x8a, 0x58, 0xaa, 0x83, 0x7d, 0x17, 0x12, 0xaf, 0x46, 0xb6, 0xaa, + 0x1d, 0xa8, 0xd3, 0xbb, 0xc0, 0x24, 0xcc, 0x52, 0x65, 0xb7, 0x90, 0xc1, + 0xe4, 0xf7, 0x36, 0x8f, 0xbe, 0x94, 0x52, 0xe7, 0xab, 0x32, 0x85, 0xdb, + 0x3e, 0xcc, 0xbb, 0xe8, 0xa7, 0xab, 0xd7, 0xe7, 0x88, 0x9b, 0x1a, 0x41, + 0x98, 0xbb, 0x23, 0xb5, 0x28, 0x8c, 0x43, 0x86, 0xd9, 0xf1, 0x08, 0xc3, + 0x37, 0x61, 0xda, 0x2c, 0x9b, 0xe0, 0x93, 0x91, 0x3c, 0x98, 0x40, 0x93, + 0x1b, 0x79, 0xa6, 0xa1, 0x47, 0x74, 0xeb, 0xa6, 0x03, 0x45, 0xf5, 0x6f, + 0xe0, 0xa2, 0x1b, 0x46, 0x30, 0x40, 0xf7, 0x2c, 0xf6, 0xaf, 0xf1, 0x92, + 0x67, 0xb0, 0x0e, 0xa9, 0x5b, 0x2d, 0x10, 0x42, 0xe3, 0xe5, 0x02, 0xcc, + 0x14, 0x90, 0x0f, 0x54, 0x36, 0xed, 0x77, 0x0c, 0x35, 0x1a, 0x0d, 0xb7, + 0xc5, 0x86, 0xc4, 0x5d, 0xc3, 0x76, 0x04, 0xda, 0x1e, 0x73, 0xc0, 0xaa, + 0xc1, 0x2f, 0xfa, 0x22, 0xe5, 0xd1, 0xc6, 0x38, 0xfa, 0x4f, 0x40, 0xab, + 0x6d, 0x68, 0x79, 0xcb, 0xb9, 0xff, 0x17, 0xd2, 0x99, 0x52, 0xc0, 0x13, + 0x7a, 0x39, 0xa2, 0x31, 0xd7, 0x1d, 0x11, 0x7c, 0x00, 0x52, 0x8d, 0x12, + 0x41, 0xb6, 0xa7, 0x2e, 0xb0, 0x1a, 0x25, 0x35, 0x53, 0xcf, 0x22, 0x67, + 0x8e, 0xb4, 0x1a, 0x95, 0x43, 0xbf, 0xb8, 0x28, 0x97, 0xf3, 0x23, 0xd1, + 0x7c, 0xdd, 0x50, 0x77, 0x53, 0x8c, 0x81, 0xe3, 0x08, 0x82, 0xee, 0xb3, + 0x30, 0x51, 0x12, 0x5c, 0x8d, 0xb7, 0x81, 0x00, 0xfa, 0xbc, 0xff, 0x03, + 0xe6, 0xec, 0x74, 0x70, 0xcd, 0xfa, 0xb8, 0xec, 0xed, 0xf4, 0x7b, 0xf4, + 0xb9, 0x4d, 0x9f, 0xbb, 0xf4, 0xd9, 0xc7, 0x75, 0x2c, 0x2b, 0xbb, 0xbb, + 0x63, 0x2f, 0xab, 0x97, 0x7a, 0x9e, 0x2b, 0x45, 0xab, 0x21, 0x4f, 0xa8, + 0x9b, 0x8e, 0x33, 0x1c, 0x6e, 0x42, 0xc8, 0x9b, 0x8f, 0xb0, 0x1e, 0xfb, + 0xb8, 0x3c, 0xed, 0x6f, 0x9d, 0xc2, 0xe7, 0x69, 0xb7, 0xa7, 0xae, 0xc5, + 0x0a, 0x15, 0xea, 0x5a, 0x90, 0x12, 0x46, 0x55, 0xf2, 0xe8, 0x5d, 0x35, + 0x72, 0x8b, 0xb6, 0xd8, 0x44, 0x38, 0x6a, 0xe3, 0x63, 0x1d, 0xdd, 0x67, + 0x8a, 0xa3, 0x41, 0xd0, 0x37, 0xf3, 0x07, 0xd4, 0xd1, 0x1f, 0x50, 0xfb, + 0xf8, 0xb1, 0x5e, 0x23, 0x77, 0xdb, 0x47, 0xbc, 0x63, 0x0b, 0xea, 0x68, + 0x9b, 0x5e, 0x75, 0x7e, 0x97, 0xa4, 0x1d, 0x14, 0x0f, 0xb9, 0xf8, 0x82, + 0x95, 0x45, 0xf8, 0x8f, 0xbd, 0xba, 0xfe, 0xd4, 0x42, 0x7e, 0x0e, 0xe5, + 0xcf, 0x2f, 0x11, 0x22, 0x7c, 0xe0, 0x50, 0xff, 0xc4, 0x1f, 0x82, 0xd8, + 0xf0, 0x73, 0x7c, 0x3c, 0xd3, 0x2e, 0x36, 0x97, 0x8b, 0x65, 0xb3, 0xfd, + 0xe7, 0xd0, 0x9f, 0x37, 0xd2, 0xed, 0xa5, 0xb2, 0xa9, 0x66, 0xac, 0x38, + 0x1a, 0xe5, 0x78, 0xdf, 0xbe, 0x96, 0xaf, 0x03, 0x76, 0xab, 0x06, 0xab, + 0x1e, 0x3c, 0xd5, 0x02, 0xb2, 0xaa, 0x6d, 0x61, 0x08, 0x4d, 0xa0, 0x58, + 0x6c, 0x1a, 0x29, 0x6a, 0x1c, 0xdf, 0x77, 0x50, 0x85, 0x69, 0x92, 0xaf, + 0xd0, 0x35, 0x74, 0x83, 0xb3, 0x9d, 0x44, 0xfe, 0x4c, 0x17, 0x2c, 0x18, + 0xc4, 0xba, 0x1a, 0x88, 0x6a, 0xee, 0x19, 0x7a, 0x35, 0xd9, 0x8e, 0x87, + 0x6b, 0x8d, 0x91, 0x05, 0x8d, 0x98, 0x53, 0xb2, 0x02, 0xa0, 0x22, 0x54, + 0x50, 0xbb, 0xa9, 0xa6, 0x79, 0x19, 0x48, 0x68, 0xba, 0x94, 0x5c, 0xa7, + 0x06, 0xac, 0x83, 0x1a, 0xd5, 0x0f, 0x9b, 0xff, 0xfa, 0xc1, 0x75, 0xfe, + 0x7a, 0xe4, 0xfc, 0xcf, 0x8e, 0xb3, 0xe7, 0x7c, 0xfa, 0xda, 0x6d, 0xed, + 0x6e, 0x7d, 0xfb, 0x6f, 0x9b, 0xb0, 0xa0, 0xe2, 0x3e, 0x2f, 0x94, 0x6f, + 0xaa, 0x6b, 0x59, 0xb6, 0x05, 0x5c, 0x27, 0x1d, 0x11, 0x15, 0xab, 0x7d, + 0x7c, 0xf2, 0x98, 0xb4, 0x4e, 0x06, 0x80, 0x5a, 0x0c, 0xe0, 0xb4, 0x48, + 0xfb, 0x75, 0xea, 0x2d, 0x56, 0xa7, 0x40, 0x8b, 0x7a, 0x73, 0xc5, 0xaa, + 0xf3, 0x27, 0x37, 0xf0, 0x49, 0xf3, 0x04, 0x45, 0x35, 0xf5, 0xa4, 0x00, + 0xc6, 0xa8, 0xb7, 0xa6, 0x07, 0x41, 0x37, 0x34, 0xed, 0xfe, 0x07, 0x6e, + 0x5a, 0xe8, 0x0b, 0x03, 0x32, 0x8c, 0xec, 0xe0, 0x0b, 0xd6, 0xa5, 0x05, + 0x42, 0x49, 0x1a, 0xb0, 0x2d, 0xac, 0xa2, 0x76, 0x03, 0x5a, 0xa0, 0xf1, + 0x9d, 0x2d, 0x51, 0x84, 0x7b, 0xac, 0xeb, 0x6c, 0xf5, 0xf8, 0x59, 0x0e, + 0x15, 0x7b, 0x89, 0xb5, 0xc0, 0x58, 0x36, 0x87, 0xac, 0x65, 0xd0, 0x53, + 0x4d, 0x7a, 0xc1, 0xfa, 0xf9, 0xd6, 0x64, 0x4c, 0x75, 0xda, 0x62, 0xff, + 0xd9, 0xca, 0xf6, 0xf2, 0x74, 0xba, 0xbc, 0x3a, 0xd2, 0x08, 0x35, 0xe2, + 0x67, 0xa9, 0xca, 0x88, 0xd5, 0xc9, 0x11, 0x8b, 0xf3, 0xac, 0x42, 0x2f, + 0x03, 0x5b, 0x7e, 0xbb, 0xb0, 0xab, 0x99, 0x45, 0x34, 0xe4, 0xa5, 0xa8, + 0x6a, 0x5a, 0x69, 0xb6, 0x24, 0xf1, 0x6d, 0x03, 0x90, 0x16, 0xc8, 0xa6, + 0xf5, 0x56, 0xc6, 0x52, 0x30, 0x3e, 0xfb, 0xf4, 0x99, 0xa5, 0x21, 0x8d, + 0xf6, 0xe9, 0x33, 0x4b, 0x93, 0x82, 0x62, 0x9f, 0x64, 0x8b, 0x52, 0x9f, + 0xf7, 0x62, 0x5f, 0x7e, 0xd1, 0x72, 0x2e, 0x08, 0x90, 0xf8, 0x92, 0xe5, + 0x48, 0x8f, 0xcc, 0x3e, 0x7d, 0xd3, 0x16, 0x7d, 0xa5, 0xfb, 0xe9, 0xae, + 0x3f, 0x62, 0x3d, 0xfe, 0x41, 0xc6, 0x20, 0xf3, 0xf7, 0x9b, 0x91, 0x04, + 0xe2, 0x51, 0xf5, 0xc2, 0x38, 0x83, 0x34, 0x50, 0x30, 0xf2, 0xd0, 0x33, + 0xdc, 0x68, 0xb6, 0x28, 0x90, 0x51, 0x73, 0xd3, 0x1e, 0x87, 0x61, 0xf2, + 0x94, 0x61, 0x3e, 0xc9, 0xf0, 0x6c, 0xee, 0x67, 0x81, 0x8c, 0x59, 0xd4, + 0x0f, 0xc7, 0xd1, 0xb6, 0x87, 0xae, 0xe4, 0xa0, 0x24, 0x97, 0x3b, 0xd0, + 0x69, 0x9d, 0x5c, 0xf0, 0x59, 0x7e, 0x03, 0xc9, 0xb2, 0x51, 0x6f, 0x80, + 0xd2, 0x57, 0x87, 0x87, 0x18, 0x92, 0x9a, 0x31, 0xa8, 0xf2, 0x72, 0x66, + 0xf5, 0xe5, 0x37, 0xd1, 0x29, 0x3e, 0xbf, 0x20, 0x26, 0xe9, 0x31, 0x96, + 0xa9, 0x26, 0x05, 0x1e, 0x65, 0x94, 0xe6, 0x62, 0x78, 0x04, 0x73, 0x1c, + 0x2d, 0x93, 0xd0, 0x41, 0x42, 0x72, 0xef, 0xc0, 0xe9, 0xdb, 0xd7, 0x38, + 0xbb, 0x29, 0xd8, 0x6c, 0x83, 0xdc, 0x1e, 0x12, 0x5b, 0x23, 0xfe, 0xac, + 0x8e, 0xac, 0x06, 0xa3, 0x5b, 0xcf, 0xe9, 0x16, 0x79, 0xea, 0x00, 0x50, + 0x81, 0xe7, 0x39, 0x54, 0xf2, 0xc6, 0x40, 0x28, 0xce, 0x3f, 0x38, 0xa0, + 0xdc, 0xf7, 0xf0, 0x55, 0xb0, 0x00, 0xe7, 0x2a, 0xf5, 0x75, 0x77, 0x11, + 0xb2, 0xac, 0xc5, 0x2f, 0x4b, 0xc5, 0xf3, 0xba, 0x8c, 0x9c, 0x90, 0x8d, + 0x64, 0xc4, 0x20, 0x60, 0xf8, 0x0a, 0x42, 0x26, 0xc2, 0xd0, 0x84, 0x43, + 0xf6, 0xe1, 0x13, 0x4f, 0x14, 0x5b, 0x24, 0x51, 0x30, 0x91, 0x66, 0xb4, + 0x28, 0x2b, 0x1e, 0x01, 0xd1, 0x52, 0xf1, 0x0a, 0x7f, 0xf1, 0x7e, 0x93, + 0x02, 0x42, 0x49, 0x3d, 0x1b, 0xdf, 0x41, 0x86, 0xd3, 0xcd, 0x32, 0x4e, + 0xf8, 0x91, 0x39, 0xc9, 0x80, 0xe4, 0x4c, 0xca, 0x42, 0x73, 0xd4, 0xa0, + 0xd4, 0x34, 0x1a, 0xb8, 0x74, 0xef, 0xd3, 0xcc, 0x96, 0x1b, 0x1f, 0x45, + 0x05, 0x80, 0x1e, 0x02, 0xb7, 0x74, 0xa7, 0x57, 0x69, 0x5e, 0x0f, 0xbf, + 0x29, 0xc0, 0x40, 0x6b, 0x42, 0xaf, 0x5f, 0x75, 0x7b, 0x26, 0xbf, 0xe9, + 0x11, 0x71, 0xf3, 0x9d, 0x32, 0xaa, 0xed, 0xc8, 0x58, 0xf7, 0x78, 0x16, + 0xc2, 0x6b, 0x8d, 0x81, 0xe8, 0xeb, 0x6d, 0xf0, 0x44, 0x77, 0xf5, 0x7c, + 0x28, 0x02, 0x8c, 0x14, 0x0d, 0xed, 0x1c, 0xe3, 0x36, 0x02, 0xd0, 0xde, + 0x91, 0x61, 0xee, 0x81, 0x14, 0x20, 0x84, 0xb1, 0x3e, 0x58, 0xa6, 0x3e, + 0x6e, 0xb1, 0xbf, 0xfb, 0x25, 0x23, 0x38, 0x6d, 0xaa, 0x8d, 0xf1, 0x2d, + 0x2e, 0x5e, 0x98, 0x60, 0x28, 0x79, 0x4b, 0x72, 0x73, 0x89, 0x07, 0x13, + 0xb1, 0xc3, 0x1c, 0xc1, 0x16, 0xf1, 0x95, 0x52, 0x4e, 0xbe, 0x1c, 0xc4, + 0xef, 0xb8, 0x6f, 0xd4, 0x3f, 0x90, 0x81, 0x82, 0xc0, 0xda, 0x78, 0x5f, + 0x19, 0x5a, 0x09, 0x9f, 0xc8, 0x6a, 0x18, 0x7b, 0x23, 0xf4, 0x91, 0x72, + 0xfd, 0x1a, 0x43, 0x87, 0x79, 0x93, 0x6d, 0xba, 0xe4, 0x90, 0x9b, 0x3d, + 0x18, 0xc8, 0x03, 0x3d, 0x74, 0xd4, 0x38, 0xe4, 0x32, 0xca, 0x62, 0xc8, + 0xe2, 0x83, 0x89, 0x71, 0xf5, 0x14, 0xc4, 0x20, 0x0b, 0x7a, 0x25, 0xa6, + 0x53, 0xc1, 0xca, 0x2a, 0xb2, 0x28, 0x82, 0xe4, 0x63, 0x6c, 0x15, 0x19, + 0x29, 0xbb, 0xb3, 0x46, 0x83, 0x54, 0x12, 0xc8, 0x65, 0xbc, 0xac, 0x6c, + 0xdf, 0x5b, 0xc0, 0x2b, 0xd2, 0x52, 0xdb, 0x8e, 0x52, 0x46, 0x54, 0xe5, + 0xa0, 0x32, 0xbb, 0xe6, 0x94, 0x02, 0xba, 0x01, 0x6e, 0x24, 0xae, 0xd6, + 0xf0, 0x70, 0x3a, 0x4a, 0xd0, 0x45, 0x8d, 0xe5, 0x55, 0x85, 0x62, 0x4a, + 0x28, 0x77, 0xa0, 0x58, 0xc8, 0xc1, 0xc7, 0xea, 0xc2, 0x78, 0x42, 0x59, + 0xec, 0xe8, 0xa0, 0xa2, 0x87, 0x8b, 0x4b, 0x38, 0x99, 0x54, 0x0a, 0x74, + 0xb7, 0x5e, 0x80, 0x93, 0xdb, 0xbc, 0x52, 0xa1, 0x5a, 0x29, 0xa2, 0x5e, + 0x6e, 0xc2, 0xf1, 0x13, 0x34, 0xb1, 0xa1, 0xb5, 0x0e, 0x29, 0xe8, 0x70, + 0x02, 0x2c, 0x4a, 0xda, 0x34, 0x48, 0x5f, 0x17, 0xac, 0xd0, 0x41, 0xf1, + 0xea, 0x7a, 0x3e, 0x8c, 0xbf, 0x53, 0xaf, 0x50, 0x3b, 0xa9, 0x52, 0x1b, + 0x24, 0x20, 0x5e, 0x06, 0x48, 0x1c, 0x08, 0xea, 0x3d, 0xce, 0xf1, 0x77, + 0x77, 0xf0, 0xa9, 0x86, 0x31, 0x59, 0xca, 0x5c, 0x95, 0x97, 0x39, 0xae, + 0x00, 0xe7, 0xd8, 0x0a, 0x27, 0x7b, 0xd1, 0xa6, 0x8e, 0xda, 0xe5, 0x09, + 0x27, 0x21, 0x2a, 0x98, 0x1f, 0xe7, 0xab, 0x29, 0x2e, 0x74, 0x7a, 0xab, + 0xc1, 0xc7, 0x07, 0x33, 0xbe, 0xa6, 0xb1, 0x7c, 0x49, 0x05, 0x4d, 0xf3, + 0xee, 0x9b, 0xb6, 0x14, 0x19, 0x32, 0x2a, 0xbf, 0x73, 0x49, 0x22, 0xf4, + 0x50, 0x20, 0x41, 0x3f, 0x10, 0xf4, 0x11, 0x12, 0x3c, 0x7c, 0x0f, 0x12, + 0x37, 0x3a, 0x71, 0x63, 0x4f, 0x37, 0xa2, 0x41, 0xba, 0x49, 0xc6, 0xc4, + 0xaf, 0x50, 0x9e, 0xd7, 0x8e, 0xee, 0xd0, 0xc1, 0x85, 0x4b, 0x00, 0x17, + 0x7e, 0x4d, 0x2d, 0x7e, 0x50, 0x5d, 0x9b, 0xa2, 0x24, 0x33, 0x03, 0x00, + 0x44, 0xf6, 0x23, 0x01, 0x43, 0x81, 0x93, 0x43, 0x31, 0x14, 0xc0, 0x34, + 0x12, 0xa9, 0xf0, 0x0d, 0x9b, 0xeb, 0x64, 0x79, 0x53, 0xef, 0x6e, 0x5f, + 0x6e, 0x60, 0xde, 0xf1, 0xed, 0xc6, 0x2c, 0x93, 0x04, 0xbf, 0xc8, 0xa6, + 0xef, 0x66, 0x81, 0xf4, 0xd2, 0xa2, 0xab, 0x50, 0x14, 0x53, 0x52, 0xcc, + 0xc2, 0x09, 0x8f, 0x2d, 0x93, 0x08, 0xf2, 0x5f, 0x58, 0xc8, 0x0c, 0x66, + 0x14, 0x1d, 0x68, 0xda, 0x8e, 0x31, 0xe4, 0x97, 0xf7, 0x55, 0xce, 0xa7, + 0xa2, 0xf9, 0x23, 0x48, 0xce, 0x1f, 0x58, 0x40, 0xa2, 0xac, 0x70, 0x24, + 0x25, 0x65, 0x70, 0x92, 0xea, 0x70, 0x78, 0xec, 0x65, 0x0e, 0x8c, 0x16, + 0x8e, 0x4a, 0x30, 0x79, 0x41, 0x02, 0xd9, 0x5c, 0xe5, 0x27, 0x5b, 0xb9, + 0x8e, 0x34, 0x32, 0xd9, 0x0e, 0x00, 0xf7, 0x64, 0xf0, 0xa9, 0x22, 0xe2, + 0xb8, 0x94, 0xa7, 0x41, 0xeb, 0xbf, 0xe9, 0x4a, 0xe6, 0x2b, 0x93, 0xd5, + 0x86, 0xe8, 0x35, 0xc5, 0x76, 0x36, 0x25, 0x88, 0x2e, 0x1f, 0x3e, 0x65, + 0x87, 0x17, 0xf8, 0xa4, 0xa9, 0x74, 0x1e, 0x0a, 0x8b, 0x22, 0x92, 0xf8, + 0xb7, 0xed, 0xd3, 0xca, 0x84, 0x6f, 0x71, 0xe7, 0x05, 0x9a, 0xb8, 0xbf, + 0x28, 0x2d, 0x1b, 0xdd, 0xe1, 0xed, 0x51, 0xd8, 0xc7, 0xec, 0xb1, 0xee, + 0x34, 0x33, 0xc1, 0xcc, 0x02, 0xa1, 0x24, 0x5a, 0x92, 0xc2, 0x4b, 0x00, + 0xcb, 0xc6, 0xb7, 0xb9, 0xb2, 0xde, 0x55, 0x5a, 0x2f, 0xc9, 0xd7, 0x33, + 0x95, 0xdd, 0xe2, 0xa5, 0xdb, 0xd4, 0x7b, 0x71, 0xf4, 0x9a, 0xc5, 0x94, + 0xca, 0x2e, 0x52, 0x35, 0x97, 0x3f, 0xcc, 0x31, 0x42, 0x1d, 0xe4, 0x75, + 0x94, 0x25, 0xf0, 0xf4, 0x1b, 0x2b, 0x4d, 0x98, 0x32, 0xd7, 0x80, 0xcb, + 0xaf, 0x75, 0x6c, 0x96, 0xad, 0xd7, 0xd9, 0xbd, 0x8f, 0x26, 0x4c, 0x9e, + 0x67, 0x40, 0x94, 0xd7, 0x1b, 0x36, 0xcb, 0x62, 0x02, 0xd4, 0x1b, 0x10, + 0xf3, 0x81, 0x33, 0x3c, 0x37, 0x87, 0xa9, 0xc6, 0xbd, 0xcd, 0x47, 0xaa, + 0x18, 0x46, 0x21, 0x7d, 0x8c, 0x0b, 0x66, 0xd1, 0x8c, 0xda, 0x5d, 0x21, + 0xbf, 0x16, 0x46, 0xad, 0x3c, 0xe7, 0x2b, 0x70, 0xb9, 0xce, 0x32, 0xcb, + 0x21, 0x90, 0x63, 0xd4, 0x16, 0xfb, 0xe2, 0xcf, 0x81, 0x57, 0xb9, 0xbb, + 0xba, 0x7a, 0xac, 0xa9, 0x36, 0x1f, 0xe1, 0x0f, 0x42, 0xd1, 0x22, 0xb3, + 0x30, 0x1c, 0xc5, 0x40, 0x50, 0xf8, 0x80, 0xf3, 0x04, 0xb1, 0xa8, 0xeb, + 0x7e, 0xfc, 0xee, 0x4e, 0x65, 0x7c, 0xf5, 0xf7, 0xc3, 0xc5, 0x3c, 0x8f, + 0xbc, 0xce, 0x84, 0xb3, 0xce, 0x08, 0xd0, 0x93, 0xa6, 0x4e, 0xa1, 0x34, + 0x5d, 0x0a, 0x81, 0x34, 0xe1, 0x9d, 0x5d, 0x10, 0xa4, 0xc0, 0x94, 0xf5, + 0xcf, 0x06, 0x53, 0xc9, 0x96, 0x72, 0x82, 0x83, 0xf6, 0xbc, 0xe8, 0xca, + 0x22, 0x2b, 0x54, 0xf7, 0xc5, 0x23, 0x56, 0xa7, 0x47, 0x74, 0xff, 0x4a, + 0xeb, 0xbe, 0x0d, 0x47, 0x6d, 0x60, 0x55, 0x1b, 0x8d, 0x8f, 0xe8, 0x22, + 0xf2, 0xe8, 0x6d, 0x35, 0xee, 0xef, 0x30, 0x58, 0x0d, 0xcb, 0x9d, 0xf2, + 0x43, 0x9b, 0x36, 0x4d, 0x2b, 0x63, 0xac, 0xcc, 0xc7, 0x62, 0x6c, 0x51, + 0x43, 0x86, 0xbe, 0x33, 0xad, 0x46, 0xd5, 0x88, 0xb6, 0x75, 0xab, 0x2e, + 0x05, 0xb4, 0x9c, 0xc7, 0x53, 0x7f, 0x22, 0xac, 0xdc, 0x53, 0xdd, 0x58, + 0xb2, 0xb7, 0x39, 0x60, 0xbd, 0x0e, 0x6f, 0x53, 0x66, 0x80, 0xf4, 0x6e, + 0x14, 0x0d, 0x96, 0x5a, 0x6c, 0x19, 0x4f, 0x73, 0xed, 0xc8, 0x70, 0xfc, + 0xdc, 0x1b, 0x0d, 0xfa, 0x5c, 0xa1, 0x6a, 0xaf, 0xf1, 0x70, 0xa8, 0x17, + 0xbf, 0xe2, 0xbb, 0xc9, 0xdc, 0xfa, 0xd5, 0x48, 0xc9, 0xf7, 0x99, 0x4b, + 0x1d, 0x80, 0xfc, 0x92, 0x48, 0x0e, 0x42, 0xdf, 0x9a, 0x91, 0xbb, 0xcd, + 0x02, 0x06, 0x6a, 0xd1, 0x6e, 0x10, 0xd4, 0x71, 0x98, 0x15, 0x47, 0x01, + 0xa6, 0xf3, 0x22, 0x36, 0x9d, 0xcc, 0x30, 0xcd, 0x35, 0xe4, 0xe4, 0xbb, + 0x2b, 0xa5, 0xc1, 0x0b, 0xea, 0xdb, 0x2c, 0x78, 0xf8, 0x99, 0xdf, 0x06, + 0x7f, 0x60, 0x80, 0x39, 0xf5, 0xa3, 0x55, 0x50, 0xd2, 0x4b, 0xf0, 0x8b, + 0xa1, 0x5c, 0x70, 0xad, 0xbd, 0x14, 0x0c, 0x96, 0x29, 0x86, 0x70, 0x92, + 0x44, 0xc1, 0x2a, 0x08, 0xea, 0x55, 0xf0, 0x76, 0x48, 0x62, 0x87, 0xb1, + 0x78, 0x0d, 0xe6, 0x2c, 0xa1, 0xee, 0x2d, 0xf2, 0xea, 0xe4, 0x62, 0x24, + 0x95, 0xfc, 0x90, 0x29, 0x5e, 0x1a, 0x33, 0x60, 0xf0, 0x07, 0x89, 0x6a, + 0x33, 0x2d, 0x4d, 0x7f, 0xb3, 0x8d, 0xed, 0x8f, 0x1f, 0x23, 0x0a, 0x75, + 0x57, 0x83, 0xdf, 0x3f, 0x7e, 0x9c, 0x5b, 0xd2, 0x12, 0x91, 0x26, 0xe6, + 0x97, 0xdc, 0x97, 0x44, 0xf5, 0x8e, 0xfb, 0x2c, 0xd3, 0x2d, 0x19, 0x31, + 0x92, 0x4d, 0x9e, 0xcb, 0x99, 0xbf, 0xae, 0x3d, 0x8a, 0x0d, 0x53, 0xc3, + 0x41, 0xed, 0x96, 0xef, 0x5d, 0xf3, 0x0e, 0x48, 0x8b, 0x40, 0xd9, 0x21, + 0x6f, 0xea, 0x40, 0x2f, 0x48, 0x54, 0x15, 0x02, 0x45, 0x26, 0x75, 0x86, + 0xb8, 0x46, 0xd2, 0xea, 0xe4, 0xe8, 0x7e, 0x2e, 0x3a, 0xe3, 0x72, 0x2b, + 0xed, 0x31, 0x6c, 0x45, 0x6d, 0x5c, 0x7a, 0xc2, 0x0a, 0x5a, 0x06, 0x96, + 0x5a, 0xd1, 0x1b, 0xb4, 0xe4, 0x32, 0x70, 0xf0, 0xab, 0xbc, 0x3d, 0x2c, + 0x6e, 0x6f, 0x8e, 0xe7, 0x6b, 0xeb, 0x48, 0x61, 0xc3, 0xa2, 0x14, 0xef, + 0x74, 0x6d, 0x80, 0x17, 0xeb, 0x66, 0x4d, 0xa8, 0xa6, 0x98, 0xbd, 0xa9, + 0x34, 0x10, 0xb0, 0x8e, 0xf7, 0xeb, 0xd2, 0x74, 0xcf, 0x92, 0xc0, 0x1e, + 0xac, 0xaf, 0xe8, 0x33, 0x3d, 0x5d, 0x62, 0x84, 0x3b, 0xf0, 0xb6, 0x53, + 0x63, 0xb2, 0x59, 0xad, 0xe9, 0x15, 0x0d, 0xf1, 0x67, 0x56, 0x06, 0x1f, + 0x8c, 0xb6, 0x32, 0xc7, 0xe4, 0x27, 0xa3, 0x89, 0x7c, 0xac, 0x63, 0x9d, + 0x0a, 0x57, 0x6c, 0xa8, 0xb0, 0x1d, 0xa3, 0x19, 0x5b, 0xbc, 0x09, 0x82, + 0x21, 0x22, 0xd4, 0x06, 0x66, 0x32, 0x7f, 0x8c, 0x9e, 0xb4, 0x27, 0x42, + 0x82, 0x87, 0x60, 0x30, 0x49, 0x24, 0x8c, 0xcf, 0x48, 0xa3, 0x34, 0x54, + 0x01, 0x9b, 0xf3, 0x44, 0x0a, 0xe1, 0x9a, 0xdb, 0x78, 0x48, 0xa7, 0x3d, + 0x2d, 0xd8, 0xf4, 0xe8, 0x45, 0x1a, 0x4f, 0x4c, 0xbf, 0x0a, 0xe3, 0xbb, + 0x6c, 0x2e, 0xa9, 0xfc, 0x26, 0xb7, 0x02, 0x28, 0x0e, 0xfc, 0x11, 0x1e, + 0xf7, 0x8b, 0xbc, 0x1b, 0x0f, 0x2f, 0x5a, 0xc8, 0x8c, 0x3b, 0xcc, 0xe7, + 0x1b, 0x87, 0xfa, 0xf2, 0x67, 0x2c, 0xf0, 0x58, 0xac, 0xd9, 0x4c, 0x09, + 0xb9, 0x62, 0x11, 0xcc, 0xf0, 0x2b, 0xeb, 0x7b, 0x4e, 0x19, 0x50, 0xc3, + 0xd4, 0x78, 0x44, 0x0d, 0xcb, 0x87, 0xd4, 0xd0, 0xd3, 0xb3, 0x0e, 0x3d, + 0x14, 0xb2, 0xcf, 0xc4, 0x1b, 0x21, 0x4c, 0xc6, 0xaa, 0x31, 0x7c, 0x56, + 0x9c, 0xe1, 0x73, 0xe2, 0x3f, 0xbb, 0x3e, 0xc5, 0xa7, 0xe2, 0x9d, 0x63, + 0x09, 0xd7, 0x5c, 0xdb, 0xed, 0xb6, 0x75, 0xc0, 0x2c, 0xdd, 0xb1, 0x2c, + 0xd6, 0x14, 0xfe, 0xa7, 0x50, 0x69, 0xa2, 0x2c, 0xee, 0xda, 0x7a, 0xaf, + 0xcc, 0x1b, 0x59, 0xb3, 0x70, 0x20, 0x7f, 0x4b, 0x12, 0x14, 0x33, 0x8e, + 0x89, 0x55, 0xda, 0x0d, 0x0c, 0x44, 0xd3, 0xf5, 0x07, 0x35, 0x32, 0x29, + 0xc7, 0x01, 0x72, 0x16, 0xa8, 0x26, 0x02, 0x39, 0x2e, 0xa2, 0x59, 0xa3, + 0x4e, 0x7e, 0x42, 0x06, 0xb3, 0x36, 0x41, 0x97, 0x36, 0x13, 0x3e, 0x7d, + 0x11, 0xc3, 0xbc, 0xc4, 0x3e, 0xc5, 0x78, 0xed, 0x36, 0x5e, 0x98, 0xcd, + 0xc3, 0xe5, 0xff, 0x50, 0x6f, 0x36, 0x8b, 0x4f, 0x07, 0xaa, 0x0d, 0xd6, + 0xf5, 0x9d, 0xcd, 0xec, 0xf0, 0x56, 0x6e, 0xcb, 0x04, 0x09, 0x69, 0x3f, + 0xa3, 0x46, 0x0f, 0x1c, 0x73, 0xa1, 0x98, 0x5f, 0x7e, 0x3f, 0x46, 0xb6, + 0x05, 0x18, 0xdd, 0x9d, 0xf9, 0x25, 0xf8, 0x63, 0x62, 0xd2, 0x46, 0x1e, + 0xdb, 0x52, 0x27, 0x48, 0xa9, 0xd6, 0x6c, 0x0d, 0x86, 0x79, 0x13, 0xf2, + 0x0b, 0x54, 0xf0, 0x52, 0x35, 0x01, 0xb0, 0x62, 0xf0, 0x8b, 0xe0, 0xea, + 0x59, 0xa9, 0x4e, 0xa5, 0xbe, 0xac, 0x65, 0x8b, 0x0c, 0xf2, 0xe7, 0xa3, + 0x55, 0x3a, 0xa2, 0xf1, 0xa2, 0x93, 0x5d, 0xa7, 0x02, 0x38, 0x2b, 0x94, + 0x44, 0xe3, 0x35, 0xa5, 0x42, 0x30, 0xab, 0xb4, 0xc4, 0xec, 0xf1, 0xa2, + 0x42, 0x10, 0xab, 0xd4, 0xc4, 0xfc, 0x9b, 0x41, 0x2a, 0xa8, 0x54, 0xd5, + 0x23, 0xde, 0xc1, 0x90, 0xff, 0x25, 0x18, 0x72, 0x74, 0x27, 0xbc, 0xd8, + 0xc2, 0x81, 0x11, 0x67, 0x0e, 0x8f, 0xf9, 0x53, 0x8f, 0x60, 0x9f, 0x5d, + 0xbe, 0x15, 0x5c, 0x27, 0xf7, 0xed, 0x44, 0x14, 0x04, 0xc2, 0x79, 0x06, + 0x80, 0x0e, 0xeb, 0xc8, 0x57, 0x9e, 0x9b, 0x34, 0xc4, 0x09, 0xf3, 0x8f, + 0x73, 0x2a, 0x64, 0xc8, 0xd6, 0x54, 0xa8, 0x8b, 0x3d, 0x3b, 0xd5, 0x65, + 0x57, 0x41, 0x05, 0x4d, 0xd7, 0x23, 0x41, 0x89, 0x27, 0xd5, 0x42, 0x8d, + 0x38, 0x51, 0x58, 0x5b, 0x95, 0x95, 0x20, 0xf5, 0x1f, 0x70, 0xa6, 0x6a, + 0x52, 0xbe, 0x58, 0xf5, 0x3f, 0x58, 0x75, 0xce, 0x4f, 0xf5, 0x66, 0xae, + 0x2a, 0x57, 0x38, 0xb3, 0xaa, 0x99, 0xae, 0x98, 0x2f, 0x4b, 0x2a, 0xa2, + 0x59, 0x14, 0xd4, 0x3c, 0xa3, 0xa4, 0x45, 0xbd, 0x53, 0x50, 0x2b, 0xd4, + 0xe0, 0x0c, 0x28, 0x34, 0xd5, 0x32, 0x2d, 0xcd, 0x6c, 0x36, 0x53, 0xbf, + 0x2c, 0xc7, 0x3f, 0xd2, 0xba, 0x52, 0x23, 0xca, 0x6a, 0x73, 0x45, 0xc7, + 0xa8, 0xa3, 0xa0, 0xf7, 0xd3, 0xcb, 0x5f, 0xc4, 0xae, 0x98, 0x4d, 0xcd, + 0xe3, 0x0f, 0xd1, 0xf1, 0x02, 0x26, 0x24, 0xc9, 0x78, 0x04, 0x4c, 0xd3, + 0x7b, 0x52, 0xde, 0xfc, 0xa6, 0x5b, 0x16, 0x78, 0xa8, 0x55, 0x84, 0x59, + 0xd3, 0xd1, 0xd8, 0x0f, 0x08, 0xe2, 0x13, 0x1e, 0x47, 0xc7, 0xad, 0x1e, + 0x68, 0x05, 0x7f, 0x6f, 0x02, 0x5f, 0xf8, 0xca, 0x31, 0x01, 0xcb, 0x61, + 0xda, 0xfa, 0x18, 0xe6, 0xcc, 0xe7, 0x25, 0x28, 0x5c, 0x9f, 0x81, 0xaf, + 0x3f, 0x97, 0x4d, 0x95, 0x8c, 0xcf, 0x3e, 0xec, 0xb7, 0x3f, 0x11, 0xa3, + 0x39, 0x1c, 0xc9, 0x76, 0x72, 0x97, 0x5e, 0xf9, 0xa2, 0x48, 0x4c, 0x9c, + 0x7d, 0xb2, 0x49, 0x0a, 0x3c, 0x51, 0xf7, 0x05, 0x75, 0xff, 0x1b, 0x7f, + 0xb9, 0x02, 0x19, 0xaa, 0xc1, 0x7f, 0x9c, 0x8d, 0x8d, 0x65, 0xa2, 0x48, + 0x46, 0xa4, 0xc5, 0x95, 0xd0, 0x9b, 0x23, 0x43, 0xe1, 0x58, 0x44, 0x21, + 0x36, 0xcb, 0x4f, 0x5e, 0xc7, 0xb6, 0x45, 0x08, 0x93, 0xd2, 0xd1, 0xb0, + 0xaf, 0x3f, 0xd6, 0xec, 0x6c, 0x21, 0xb2, 0x66, 0x67, 0x2b, 0x92, 0x35, + 0xfb, 0xae, 0xf1, 0xa1, 0xe3, 0xec, 0x1d, 0x39, 0xaf, 0x5c, 0x67, 0xf2, + 0xe9, 0x6b, 0xef, 0x5b, 0x13, 0x8b, 0x37, 0x3e, 0xb7, 0xd8, 0x94, 0x42, + 0x99, 0x38, 0xe1, 0xdb, 0xf8, 0x34, 0x3b, 0xca, 0xbe, 0x13, 0x7c, 0x88, + 0x22, 0x8d, 0xb6, 0x9d, 0xb6, 0x58, 0x77, 0x97, 0x34, 0xc4, 0x6f, 0xb9, + 0x03, 0xf3, 0x27, 0xef, 0xce, 0x5f, 0xa5, 0x2b, 0x9d, 0x76, 0x86, 0xbe, + 0x3e, 0x8a, 0x82, 0x09, 0x3f, 0xa5, 0x8f, 0x11, 0x53, 0xe2, 0x78, 0x3a, + 0x3f, 0x31, 0xa2, 0xc5, 0xe4, 0xf0, 0x9c, 0x83, 0x9c, 0x3f, 0x1e, 0x6f, + 0xb7, 0xe2, 0xcf, 0xb9, 0xeb, 0x3a, 0x9b, 0xb8, 0x5b, 0xac, 0xf8, 0x3c, + 0x1b, 0xd6, 0x41, 0xef, 0x8e, 0xbe, 0xb6, 0xa5, 0xea, 0xb8, 0x35, 0x2c, + 0x91, 0xa6, 0x05, 0xac, 0xb7, 0xd8, 0x68, 0x49, 0x3c, 0x62, 0x2e, 0x72, + 0x46, 0xa0, 0x28, 0xb6, 0x19, 0xf6, 0x75, 0xfe, 0xe2, 0xa8, 0x64, 0xef, + 0xab, 0xe3, 0x86, 0x35, 0x62, 0xb0, 0x6f, 0xb2, 0x09, 0xa1, 0xd5, 0x62, + 0x48, 0xb1, 0x7d, 0x95, 0x38, 0x36, 0x92, 0x28, 0xcf, 0xdc, 0xab, 0xdc, + 0xf5, 0x9d, 0x30, 0xa3, 0x26, 0x24, 0x66, 0x14, 0xc2, 0x61, 0x45, 0x8a, + 0xde, 0x21, 0x5f, 0x6b, 0x94, 0xc4, 0x63, 0xe8, 0xd6, 0x10, 0xe7, 0xf2, + 0xa1, 0x42, 0x59, 0xc7, 0xdf, 0x70, 0x59, 0x3d, 0x5e, 0x04, 0x69, 0xf3, + 0x5f, 0x91, 0xf7, 0x81, 0xf1, 0x81, 0xfd, 0x3f, 0xc6, 0xad, 0x4f, 0xcf, + 0x64, 0x40, 0x32, 0x35, 0x61, 0xb4, 0x71, 0x36, 0xbf, 0xc1, 0xa8, 0x58, + 0x6a, 0x85, 0x6f, 0x05, 0xae, 0xc7, 0x0e, 0x40, 0x89, 0x02, 0x92, 0x03, + 0xc4, 0x3c, 0xc1, 0x8b, 0x87, 0x18, 0x49, 0x0a, 0x55, 0x4a, 0xc6, 0x77, + 0xcd, 0xa6, 0xf6, 0xa9, 0x4f, 0xdf, 0xac, 0xd3, 0xf8, 0x5c, 0x46, 0xc3, + 0x15, 0xcc, 0xe5, 0x34, 0x5a, 0xae, 0x60, 0x42, 0xab, 0xd1, 0x74, 0x45, + 0xf3, 0x99, 0x43, 0xbc, 0xc2, 0x90, 0x02, 0xe0, 0xa6, 0x82, 0x86, 0x12, + 0x91, 0x6d, 0x6f, 0xa7, 0x82, 0xfb, 0x1d, 0xea, 0x9f, 0xc3, 0xd2, 0xf6, + 0x72, 0xce, 0xa3, 0x16, 0xd3, 0xbd, 0x21, 0x71, 0xef, 0xc6, 0x1f, 0x18, + 0xc9, 0x25, 0xda, 0xd9, 0x57, 0x4e, 0x2d, 0x98, 0xb8, 0x02, 0xd8, 0x0c, + 0x8a, 0xc1, 0xd9, 0x71, 0xf9, 0xbe, 0x8c, 0x1d, 0x03, 0xb1, 0x62, 0x51, + 0x2f, 0x19, 0xae, 0x24, 0x9a, 0xcd, 0x8f, 0x97, 0xab, 0x72, 0xbc, 0xf6, + 0x53, 0x57, 0x06, 0x3e, 0x04, 0xac, 0x1e, 0xc2, 0x11, 0x65, 0xb4, 0x12, + 0xb9, 0x7c, 0x1d, 0x82, 0x5a, 0x5f, 0x3c, 0x84, 0x93, 0xe5, 0xd6, 0x6d, + 0x66, 0x94, 0x11, 0xa2, 0x86, 0xb3, 0xbf, 0xc5, 0xd2, 0xfb, 0xd1, 0x8c, + 0xfb, 0xb1, 0x96, 0xc9, 0x8a, 0x98, 0x5b, 0x84, 0xf6, 0x96, 0x4a, 0x19, + 0xa7, 0x8b, 0xd1, 0xd9, 0x53, 0x7c, 0x31, 0x06, 0x66, 0xa7, 0x6b, 0x3c, + 0x7c, 0xd7, 0x2e, 0x68, 0xcb, 0xbe, 0xe3, 0xf2, 0x2b, 0x23, 0xe0, 0x94, + 0xc2, 0xfa, 0xb6, 0x0b, 0xfe, 0xe2, 0x99, 0x1c, 0x5d, 0xed, 0xc6, 0x0c, + 0x2c, 0xdf, 0xd4, 0x72, 0xe3, 0x11, 0x68, 0xff, 0xc1, 0x55, 0x88, 0x47, + 0xc1, 0xb5, 0xa4, 0x9f, 0x3c, 0xff, 0x7a, 0x9a, 0x1c, 0xe4, 0x88, 0x75, + 0x29, 0xc9, 0xa4, 0x5a, 0x7b, 0xd6, 0xab, 0x38, 0x7f, 0x28, 0xbd, 0xcd, + 0x51, 0xb3, 0xfe, 0x92, 0xec, 0xf4, 0x6e, 0x05, 0xbb, 0x4f, 0x35, 0xfc, + 0x96, 0x80, 0x3c, 0xb7, 0x50, 0xb8, 0x9e, 0x67, 0x32, 0xb2, 0xba, 0x8f, + 0x23, 0x66, 0x6c, 0xd3, 0x1e, 0x97, 0xa8, 0x0b, 0x14, 0x2c, 0xa2, 0x4a, + 0x94, 0x2c, 0x56, 0x51, 0xb4, 0x23, 0x22, 0x12, 0x13, 0x3d, 0x22, 0x91, + 0x2e, 0xb0, 0xc1, 0x02, 0x3f, 0xfe, 0x88, 0x5f, 0xd2, 0x28, 0x5a, 0xcd, + 0x08, 0xa6, 0x4b, 0xad, 0xb2, 0xbc, 0x0f, 0x96, 0x72, 0x0e, 0xeb, 0x7e, + 0x22, 0x02, 0x12, 0xa5, 0x55, 0xba, 0xa9, 0x85, 0x49, 0x35, 0xa6, 0x12, + 0xba, 0x8e, 0x6e, 0x01, 0x38, 0x60, 0x3b, 0x9d, 0xa6, 0x56, 0x99, 0xef, + 0x40, 0x69, 0x1b, 0x42, 0xd6, 0xb0, 0xdf, 0x87, 0x2c, 0xb6, 0x26, 0xf5, + 0xa4, 0x3c, 0x96, 0xc3, 0x55, 0xbe, 0xbe, 0x4a, 0x36, 0xa3, 0x55, 0x41, + 0xe3, 0x35, 0x69, 0xdc, 0x56, 0x98, 0x86, 0x14, 0x9e, 0x9c, 0x0e, 0x8b, + 0x12, 0x3f, 0xae, 0x4e, 0x11, 0x9d, 0xa1, 0x6d, 0x65, 0xd3, 0x2d, 0x0d, + 0x4a, 0xb5, 0x1f, 0xe2, 0x4a, 0x63, 0xc6, 0xc4, 0x65, 0x31, 0x2b, 0x37, + 0xd6, 0x55, 0x31, 0x61, 0xb8, 0xcc, 0x54, 0xb7, 0x70, 0x7c, 0x1f, 0x2b, + 0x8e, 0x5b, 0x09, 0x9d, 0xc4, 0x80, 0x25, 0x38, 0x4d, 0x75, 0x12, 0x13, + 0x82, 0x55, 0xc8, 0x53, 0xe9, 0xde, 0x3c, 0x0b, 0xe9, 0xe5, 0x65, 0x7d, + 0xca, 0xe6, 0x81, 0x72, 0xaf, 0xde, 0x9c, 0xb6, 0xf9, 0x0c, 0xa6, 0x25, + 0x3a, 0x2b, 0xc4, 0x55, 0x79, 0xd6, 0x4a, 0x72, 0x32, 0x03, 0xdb, 0x78, + 0x28, 0x00, 0xf0, 0x3b, 0xe5, 0xd2, 0xbc, 0x91, 0x8f, 0xc1, 0x53, 0x1a, + 0x3e, 0x02, 0xb9, 0x71, 0xfb, 0x7e, 0x51, 0x37, 0x4f, 0xea, 0x58, 0xe7, + 0x43, 0xa7, 0x69, 0xb9, 0x53, 0xd8, 0x9c, 0x01, 0x87, 0x38, 0x07, 0xcc, + 0x82, 0x69, 0xa0, 0xa0, 0x1e, 0x08, 0xaf, 0xf4, 0xe2, 0xc0, 0x5a, 0x5e, + 0x9b, 0x5a, 0xf6, 0x49, 0xaf, 0x57, 0x54, 0x7a, 0x69, 0xd4, 0xb7, 0xa0, + 0x9f, 0x6f, 0xc5, 0x71, 0x0c, 0x70, 0x7a, 0x77, 0x8d, 0x39, 0x61, 0x95, + 0x47, 0x00, 0xe5, 0x93, 0x0e, 0x24, 0x77, 0x4a, 0x87, 0xc3, 0xe1, 0xf3, + 0x1f, 0xa6, 0x03, 0x5d, 0xfe, 0x96, 0x52, 0x23, 0x4d, 0x7e, 0x49, 0xfb, + 0xf0, 0x4a, 0x9b, 0xa2, 0xd3, 0x7a, 0xf8, 0xe5, 0xb7, 0xc7, 0x0c, 0x3c, + 0x5e, 0x8f, 0x55, 0x36, 0xf4, 0x48, 0xb7, 0x1f, 0xac, 0x03, 0x6a, 0x29, + 0xf8, 0xa2, 0x60, 0x80, 0x56, 0x53, 0xfd, 0xd9, 0xb3, 0xfc, 0xe8, 0x3f, + 0x90, 0xd6, 0xb9, 0x7d, 0xfd, 0x42, 0x6e, 0x72, 0xba, 0x55, 0x1a, 0x55, + 0x19, 0xb6, 0x8c, 0x35, 0x7e, 0xeb, 0x31, 0xde, 0x20, 0x87, 0x4c, 0x75, + 0x85, 0xd3, 0x72, 0xc3, 0x28, 0x3d, 0x06, 0x67, 0xca, 0xb0, 0x52, 0x88, + 0x8a, 0x12, 0xde, 0x2c, 0xbe, 0xa8, 0xae, 0x95, 0x8a, 0x3e, 0x41, 0x59, + 0xe4, 0x28, 0xae, 0x58, 0xe3, 0xb2, 0xd0, 0x54, 0xcf, 0xc2, 0xe4, 0x5f, + 0x93, 0x35, 0x4c, 0x1b, 0xf3, 0x74, 0x9f, 0x97, 0xf0, 0xe2, 0x4a, 0xe8, + 0x2a, 0x06, 0xd0, 0xed, 0x57, 0x38, 0x07, 0x9c, 0x0f, 0xc1, 0xc3, 0x6b, + 0x26, 0x9a, 0x4a, 0xb0, 0xae, 0x88, 0x9a, 0xab, 0x02, 0xcc, 0x1e, 0x7f, + 0x67, 0x00, 0xe4, 0x21, 0x73, 0xfb, 0xeb, 0xc5, 0xdb, 0xa9, 0xa7, 0x0b, + 0x79, 0x6c, 0x5c, 0x15, 0x7c, 0xec, 0x51, 0x76, 0x84, 0x8f, 0xd5, 0x98, + 0xb1, 0xbe, 0x32, 0xba, 0x92, 0xf6, 0x4a, 0x0d, 0x65, 0x00, 0x66, 0x74, + 0x66, 0xf2, 0x61, 0x11, 0x7a, 0x2a, 0x72, 0xfa, 0xa9, 0xaf, 0x17, 0x9b, + 0x78, 0x39, 0x1d, 0xfe, 0x9d, 0x26, 0xb3, 0x60, 0xb0, 0xf1, 0xff, 0x00, + 0x58, 0x89, 0x3b, 0x38, 0x7f, 0xe5, 0x00, 0x00 }; -const size_t INDEX_HTML_GZ_LEN = 12589; +const size_t INDEX_HTML_GZ_LEN = 12596; #endif diff --git a/tools/userial/web/app.html b/tools/userial/web/app.html index 1436ae2..2b8a7e6 100644 --- a/tools/userial/web/app.html +++ b/tools/userial/web/app.html @@ -164,9 +164,9 @@

Send ASCII

- - - + + +
diff --git a/tools/userial/web/app.js b/tools/userial/web/app.js index 68b838e..3331a30 100644 --- a/tools/userial/web/app.js +++ b/tools/userial/web/app.js @@ -238,7 +238,7 @@ function sendAscii() { } function sendQuickAscii(text) { - wsSend({ cmd: 'sendAscii', port: selectedPort('asciiPortSelect'), data: processEscapes(text), crlf: appendCrlf }); + wsSend({ cmd: 'sendAscii', port: selectedPort('asciiPortSelect'), data: processEscapes(text), crlf: false }); } function sendHex() { diff --git a/tools/wifiscan/dist/index.html b/tools/wifiscan/dist/index.html deleted file mode 100644 index 27247e4..0000000 --- a/tools/wifiscan/dist/index.html +++ /dev/null @@ -1,1121 +0,0 @@ - - - - - - WiFi Scanner - - - - -
-
-

WiFi Scanner

-
- - Connecting... -
- -
- - - - -
-
-
-
- 0 networks found - Last scan: --:--:-- -
- -
-
-
-
- Waiting for scan results... -
-
-
- - - - - -
- -
- - - - -