esp网页监控面板框架已成,通讯解决

This commit is contained in:
2025-10-29 00:05:05 +08:00
parent c1436f00f0
commit 3db2af8d2f
22 changed files with 13811 additions and 12266 deletions

View File

@@ -23,6 +23,8 @@
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.infineon.aurix.buildsystem.managed.c.compiler.tasking.include.1255529901" name="Include paths (-I)" superClass="com.infineon.aurix.buildsystem.managed.c.compiler.tasking.include" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/code}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/esp8266}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/esp8266/esp8266}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/libraries}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/libraries/infineon_libraries}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/libraries/infineon_libraries/Configurations}&quot;"/>

View File

@@ -88,7 +88,7 @@ void ESP8266_Into_Download_Mode(void)
gpio_set_level(ESP8266_IO2, 1);
gpio_set_level(ESP8266_IO15, 0);
gpio_set_level(ESP8266_EN, 0);
system_delay_ms(1);
system_delay_ms(10);
gpio_set_level(ESP8266_EN, 1);
}
@@ -150,6 +150,7 @@ void ESP8266_Uart_Callback(void)
}
else
{
esp8266_get_config_pkt_index = 0;
}
}

View File

@@ -17,7 +17,7 @@
#define ESP8266_EN P20_6
#define ESP8266_UART_CHANNEL UART_2
#define ESP8266_UART_BAUDRATE 115200
#define ESP8266_UART_BAUDRATE 1152000
#define ESP8266_UART_TX_PIN UART2_TX_P33_9
#define ESP8266_UART_RX_PIN UART2_RX_P33_8
@@ -56,6 +56,7 @@ void ESP8266_Uart_Callback(void);
void ESP8266_send_data(uint8 *data, uint32 len);
void ESP8266_Set_Config(uint8 *ssid, uint8 *password, uint8 *target_ip, uint16 target_port);
void ESP8266_Into_Change_Config_Mode(uint8 on);
void ESP8266_Into_Download_Mode(void);
// void ESP8266_Auto_Download_Uart_Hook(void);
// void ESP8266_Uart_Callback(void);
// void ESP8266_Main_Loop_Change_Mode(void);

View File

@@ -129,10 +129,37 @@ void Power_Ctrl_Loop_1ms(void)
timer_counter_1ms %= (1 * 500);
}
typedef union
{
uint8 send[4];
float data;
}tmp_float_data;
float Power_Vot_Protect_Send_Parser(void)
{
tmp_float_data protect_status;
for(uint8 i = 0; i < POWER_OUT_NUM; i++)
{
protect_status.send[0] |= (power_outs[i].status.voltage_protect_triggered >= power_outs[i].config.protect_trigger_cycles) << i;
}
for(uint8 i = 0; i < POWER_OUT_NUM; i++)
{
protect_status.send[1] |= (power_outs[i].status.current_protect_triggered >= power_outs[i].config.protect_trigger_cycles) << i;
}
for(uint8 i = 0; i < POWER_OUT_NUM; i++)
{
protect_status.send[2] |= (power_outs[i].status.power_protect_triggered >= power_outs[i].config.protect_trigger_cycles) << i;
}
for(uint8 i = 0; i < INA226_NUM; i++)
{
protect_status.send[3] |= (ina226[i].result.alert_flag) << i;
}
return protect_status.data;
}
void Power_Status_Upload(void)
{
VOFA_Set_JustFloat_Data(0, power_outs[0].status.voltage_V);
VOFA_Set_JustFloat_Data(1, power_outs[0].status.current_A);
VOFA_Set_JustFloat_Data(2, power_outs[1].status.voltage_V);
@@ -154,8 +181,42 @@ void Power_Status_Upload(void)
VOFA_Set_JustFloat_Data(18,ina226[1].result.voltage_V);
VOFA_Set_JustFloat_Data(19,ina226[1].result.current_A);
VOFA_Set_JustFloat_Data(22,vofa_last_data);
VOFA_Send_Datas(27);
VOFA_Set_JustFloat_Data(20,power_outs[0].status.power_W);
VOFA_Set_JustFloat_Data(21,power_outs[0].status.energy_J);
VOFA_Set_JustFloat_Data(22,power_outs[0].status.quantity_C);
VOFA_Set_JustFloat_Data(23,power_outs[1].status.power_W);
VOFA_Set_JustFloat_Data(24,power_outs[1].status.energy_J);
VOFA_Set_JustFloat_Data(25,power_outs[1].status.quantity_C);
VOFA_Set_JustFloat_Data(26,power_outs[2].status.power_W);
VOFA_Set_JustFloat_Data(27,power_outs[2].status.energy_J);
VOFA_Set_JustFloat_Data(28,power_outs[2].status.quantity_C);
VOFA_Set_JustFloat_Data(29,power_outs[3].status.power_W);
VOFA_Set_JustFloat_Data(30,power_outs[3].status.energy_J);
VOFA_Set_JustFloat_Data(31,power_outs[3].status.quantity_C);
VOFA_Set_JustFloat_Data(32,power_outs[4].status.power_W);
VOFA_Set_JustFloat_Data(33,power_outs[4].status.energy_J);
VOFA_Set_JustFloat_Data(34,power_outs[4].status.quantity_C);
VOFA_Set_JustFloat_Data(35,power_outs[5].status.power_W);
VOFA_Set_JustFloat_Data(36,power_outs[5].status.energy_J);
VOFA_Set_JustFloat_Data(37,power_outs[5].status.quantity_C);
VOFA_Set_JustFloat_Data(38,power_outs[6].status.power_W);
VOFA_Set_JustFloat_Data(39,power_outs[6].status.energy_J);
VOFA_Set_JustFloat_Data(40,power_outs[6].status.quantity_C);
VOFA_Set_JustFloat_Data(41,power_outs[7].status.power_W);
VOFA_Set_JustFloat_Data(42,power_outs[7].status.energy_J);
VOFA_Set_JustFloat_Data(43,power_outs[7].status.quantity_C);
VOFA_Set_JustFloat_Data(44,ina226[0].result.power_W);
VOFA_Set_JustFloat_Data(45,ina226[0].result.energy_J);
VOFA_Set_JustFloat_Data(46,ina226[0].result.quantity_C);
VOFA_Set_JustFloat_Data(47,ina226[1].result.power_W);
VOFA_Set_JustFloat_Data(48,ina226[1].result.energy_J);
VOFA_Set_JustFloat_Data(49,ina226[1].result.quantity_C);
float protect_status = Power_Vot_Protect_Send_Parser();
VOFA_Set_JustFloat_Data(50,protect_status);
VOFA_Set_JustFloat_Data(51,vofa_last_data);
VOFA_Send_Datas(52);
}

View File

@@ -26,10 +26,12 @@ void Power_Out_Single_Init(Power_Out_t *power_out, int16 vot_channel, int16 amp_
Init_lowPass_alpha(&power_out->config.vot_filter, POWER_OUT_READ_TIME_MS / 1000.0f, 10.0f);
Init_lowPass_alpha(&power_out->config.amp_filter, POWER_OUT_READ_TIME_MS / 1000.0f, 10.0f);
Init_lowPass_alpha(&power_out->config.vot_adc_filter, POWER_OUT_READ_TIME_MS / 1000.0f, 100.0f);
power_out->config.votK[0] = votK[0];
power_out->config.votK[1] = votK[1];
power_out->config.ampK[0] = ampK[0];
power_out->config.ampK[1] = ampK[1];
memcpy(&power_out->config.votK, votK, sizeof(votK));
memcpy(&power_out->config.ampK, ampK, sizeof(ampK));
power_out->config.protect_trigger_cycles = 5;
float vot_protect_k[2] = VOT_PROTECT_K;
memcpy(&power_out->config.vot_protect_k, vot_protect_k, sizeof(vot_protect_k));
power_out->config.amp_protect_k = AMP_PROTECT_K;
power_out->config.enable_pin = enable_pin;
power_out->config.can_adjust = can_adjust;
power_out->config.vot_pwm_channel = vot_pwm_channel;
@@ -39,6 +41,8 @@ void Power_Out_Single_Init(Power_Out_t *power_out, int16 vot_channel, int16 amp_
power_out->status.power_W = 0.0f;
power_out->status.energy_J = 0.0f;
power_out->status.quantity_C = 0.0f;
power_out->status.voltage_protect_triggered = 0;
power_out->status.current_protect_triggered = 0;
memset(power_out->status.past_voltage_V, 0, sizeof(power_out->status.past_voltage_V));
memset(power_out->status.past_current_A, 0, sizeof(power_out->status.past_current_A));
@@ -75,6 +79,7 @@ void Power_Out_Init()
{
uint8 can_adjust = vot_pwm_channel_list[counter] != -1 ? 1 : 0;
Power_Out_Single_Init(&power_outs[counter], vot_channel_list[counter], amp_channel_list[counter], votK[counter], ampK[counter], enable_pin_list[counter], can_adjust, vot_pwm_channel_list[counter]);
}
}
@@ -87,6 +92,13 @@ void Power_Out_Enable(Power_Out_t *power_out, uint8 enable)
power_out->enabled = enable;
}
void Power_Out_Clear_Error_Status(Power_Out_t *power_out)
{
power_out->status.voltage_protect_triggered = 0;
power_out->status.current_protect_triggered = 0;
power_out->status.power_protect_triggered = 0;
}
void Power_Out_Set_PWM(Power_Out_t *power_out, uint32 duty_cycle)
{
if(power_out->config.can_adjust && power_out->config.vot_pwm_channel != POWER_OUT_FUNCTION_DISABLE)
@@ -123,6 +135,42 @@ void Power_Out_Single_Read(Power_Out_t *power_out)
}
power_out->status.power_W = power_out->status.voltage_V * power_out->status.current_A;
if(power_out->enabled)
{
if(power_out->status.voltage_V < power_out->config.vot_protect_k[0] * power_out->set_voltage_V || power_out->status.voltage_V > power_out->config.vot_protect_k[1] * power_out->set_voltage_V)
{
power_out->status.voltage_protect_triggered++;
}
else
{
power_out->status.voltage_protect_triggered = 0;
}
if(power_out->status.current_A > power_out->config.amp_protect_k * power_out->set_current_A)
{
power_out->status.current_protect_triggered++;
}
else
{
power_out->status.current_protect_triggered = 0;
}
if(power_out->status.power_W > power_out->max_power_W)
{
power_out->status.power_protect_triggered++;
}
else
{
power_out->status.power_protect_triggered = 0;
}
if(power_out->status.voltage_protect_triggered >= power_out->config.protect_trigger_cycles || power_out->status.current_protect_triggered >= power_out->config.protect_trigger_cycles || power_out->status.power_protect_triggered >= power_out->config.protect_trigger_cycles)
{
Power_Out_Enable(power_out, 0);
}
}
uint8 counter;
for(counter = 0; counter < 9; counter++)
{

View File

@@ -31,11 +31,11 @@
#define VOT_ADJUST_MIN 3.0f
#define AMP_ADJUST_MAX 15.0f
#define VOT_ADJUST_DEF 5.0f
#define AMP_ADJUST_DEF 1.0f
#define VOT_ADJUST_DEF 20.0f
#define AMP_ADJUST_DEF 15.0f
#define POW_ADJUST_DEF 300.0f
#define VOT_PROTECT_K {0.9f,1.1f} // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
#define VOT_PROTECT_K {0.0f,10.0f} // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
#define AMP_PROTECT_K 1.1f // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
typedef struct
@@ -47,6 +47,9 @@ typedef struct
float quantity_C;
float past_voltage_V[10];
float past_current_A[10];
uint16 voltage_protect_triggered;
uint16 current_protect_triggered;
uint16 power_protect_triggered;
} Power_Out_Status_t;
typedef struct
@@ -55,6 +58,9 @@ typedef struct
int16 current_read_channel;
float votK[2]; // <20><>ѹУ׼ϵ<D7BC><CFB5>
float ampK[2]; // <20><><EFBFBD><EFBFBD>У׼ϵ<D7BC><CFB5>
float vot_protect_k[2];
float amp_protect_k;
uint16 protect_trigger_cycles;
low_pass_filter_t vot_filter;
low_pass_filter_t amp_filter;
low_pass_filter_t vot_adc_filter;

View File

@@ -13,12 +13,12 @@
#define VOFA_CLIENT_COM_INTERFACE (0) // 0:<3A><><EFBFBD><EFBFBD> 1:WIFI<46><49><EFBFBD><EFBFBD>SPI 2:<3A>Զ<EFBFBD><D4B6><EFBFBD>
#define VOFA_RECEIVE_CH (64) // <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>256<35><36>ͨ<EFBFBD><CDA8>
#define VOFA_SEND_CH (32) // <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
#define VOFA_SEND_CH (64) // <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
#if VOFA_CLIENT_COM_INTERFACE == 0
#define VOFA_CLIENT_UART_PORT UART_0 // <20><><EFBFBD>ں<EFBFBD>
#define VOFA_CLIENT_UART_BAUDRATE 115200 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define VOFA_CLIENT_UART_BAUDRATE 1152000 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define VOFA_CLIENT_UART_RX UART0_RX_P14_1 // <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define VOFA_CLIENT_UART_TX UART0_TX_P14_0 // <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -0,0 +1,46 @@
import gzip
import os
# 定义文件路径
web_folder = "web"
output_header = "esp8266/web.h"
files_to_compress = ["index.html", "styles.css", "script.js"]
# 压缩文件并生成 C 常量
def compress_file(input_path, output_path):
with open(input_path, 'rb') as f_in:
with gzip.open(output_path, 'wb') as f_out:
f_out.writelines(f_in)
with open(output_path, 'rb') as f: # 修复 os.open 为 open
compressed_data = f.read()
return compressed_data
# 生成 web.h 文件
def generate_header():
with open(output_header, 'w', encoding='utf-8') as header_file:
header_file.write("#ifndef WEB_H\n#define WEB_H\n\n")
for file_name in files_to_compress:
input_path = os.path.join(web_folder, file_name)
output_path = input_path + ".gz"
if os.path.exists(input_path):
compressed_data = compress_file(input_path, output_path)
constant_name = file_name.replace('.', '_').upper()
header_file.write(f"const char {constant_name}[] = {{\n")
header_file.write(",\n".join(
[
", ".join(f"0x{byte:02x}" for byte in compressed_data[i:i+16])
for i in range(0, len(compressed_data), 16)
]
))
header_file.write("\n};\n\n")
header_file.write("#endif // WEB_H\n")
if __name__ == "__main__":
generate_header()
print(f"Header file '{output_header}' generated successfully.")

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,8 @@
#include <LittleFS.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <string.h>
#include "web.h"
#define CONFIG_PIN 0
@@ -16,7 +17,24 @@ typedef struct {
char is_info_valid;
} Config;
uint8_t uart_rx_buffer[512];
typedef union
{
uint8_t send[4];
float data;
} float_data;
bool first_find_tail = false;
uint8_t float_parser_tail[4] = {0x00, 0x00, 0x80, 0x7f};
size_t float_parser_tail_index = 0;
float_data float_parser[101];
size_t float_parser_get_counter = 0;
float_data float_parser_tmp[101];
size_t float_parser_tmp_index = 0;
size_t float_parser_tmp_get_counter = 0;
uint8_t uart_rx_buffer[1024];
size_t uart_rx_buffer_index = 0;
uint8_t uart_tx_buffer[512];
@@ -27,6 +45,8 @@ uint8_t config_mode_counter = 0;
uint8_t config_buffer[1024];
size_t config_buffer_index = 0;
size_t counter_test = 0;
// static uint8_t test_buff[40960] = {0};
@@ -37,7 +57,6 @@ const char* host = "300w-esp";
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";
void connectToServer(Config *config) {
if (!client.connect(config->ip, config->port)) {
return;
@@ -124,16 +143,56 @@ void setUpWebServer(){
MDNS.begin(host);
server.on("/", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/html", serverIndex);
server.sendHeader("Content-Encoding", "gzip");
server.send(200, "text/html", INDEX_HTML, sizeof(INDEX_HTML));
});
server.on("/styles.css", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.sendHeader("Content-Encoding", "gzip");
server.send(200, "text/css", STYLES_CSS, sizeof(STYLES_CSS));
});
server.on("/script.js", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.sendHeader("Content-Encoding", "gzip");
server.send(200, "application/javascript", SCRIPT_JS, sizeof(SCRIPT_JS));
});
server.onNotFound([]() {
server.sendHeader("Connection", "close");
server.send(404, "text/html", "Page Not Found");
});
server.on("/status", HTTP_GET, []() {
server.sendHeader("Connection", "close");
String tmp = "{\"data\":[";
for(size_t i=0;i<float_parser_get_counter-1;i++){
// tmp += String(float_parser[i].send[0],10) + ",";
// tmp += String(float_parser[i].send[1],10) + ",";
// tmp += String(float_parser[i].send[2],10) + ",";
// tmp += String(float_parser[i].send[3],10) + ",";
tmp += String(float_parser[i].data,10) + ",";
}
// for(size_t i=0;i<uart_rx_buffer_index;i++){
// tmp += String(uart_rx_buffer[i]) + ",";
// }
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-4]) + ",";
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-3]) + ",";
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-2]) + ",";
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-1]) + ",";
tmp += String(float_parser_get_counter) + ",";
tmp += String(first_find_tail ? 1 : 0) + ",";
tmp += String(float_parser_tail_index) + ",";
tmp += String(1.234567,10);
// tmp.remove(tmp.length()-1);
tmp += "]}";
server.send(200, "application/json", tmp);
});
server.on(
"/update", HTTP_POST, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
server.send(200, "text/html", "finish");
// server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
delay(5000);
ESP.restart();
},
[]() {
@@ -172,9 +231,9 @@ void setUpWebServer(){
void setup() {
LittleFS.begin();
Serial.begin(115200);
Serial.begin(1152000);
Serial.setTimeout(1);
Serial.setRxBufferSize(512);
Serial.setRxBufferSize(1024);
loadConfig(&config);
while (!config.is_info_valid) {
@@ -193,12 +252,9 @@ void setup() {
}
void loop() {
server.handleClient();
MDNS.update();
uart_rx_buffer_index = Serial.readBytes(uart_rx_buffer,64);
// counter_test = 0;
uart_rx_buffer_index = Serial.readBytes(uart_rx_buffer,1024);
if (client.connected()) {
client.write(uart_rx_buffer,uart_rx_buffer_index);
}
@@ -206,11 +262,32 @@ void loop() {
connectToServer(&config);
}
for (size_t i = 0; i < uart_rx_buffer_index; i++) {
if(float_parser_tmp_index < 400 && first_find_tail) {
float_parser_tmp[float_parser_tmp_index/4].send[float_parser_tmp_index%4] = uart_rx_buffer[i];
float_parser_tmp_index++;
if(float_parser_tmp_index % 4 == 0) float_parser_tmp_get_counter++;
}
if(float_parser_tail[0] == uart_rx_buffer[i-3] &&
float_parser_tail[1] == uart_rx_buffer[i-2] &&
float_parser_tail[2] == uart_rx_buffer[i-1] &&
float_parser_tail[3] == uart_rx_buffer[i] && i > 2) {
float_parser_tmp_index = 0;
memcpy(float_parser, float_parser_tmp, sizeof(float_parser_tmp));
float_parser_get_counter = float_parser_tmp_get_counter;
float_parser_tmp_get_counter = 0;
// float_parser_tail_index = 0;
first_find_tail = true;
}
}
while (client.available()) {
uart_tx_buffer_index = client.read(uart_tx_buffer,32);
uart_tx_buffer_index = client.read(uart_tx_buffer,128);
Serial.write(uart_tx_buffer,uart_tx_buffer_index);
}
server.handleClient();
MDNS.update();
config_mode_counter++;
if (config_mode_counter >= 100) {

418
esp8266/esp8266/web.h Normal file
View File

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

BIN
esp8266/ico.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
esp8266/ico.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

157
esp8266/web/index.html Normal file

File diff suppressed because one or more lines are too long

BIN
esp8266/web/index.html.gz Normal file

Binary file not shown.

267
esp8266/web/script.js Normal file
View File

@@ -0,0 +1,267 @@
// JavaScript for page navigation
const page1Link = document.getElementById('page1-link');
const page2Link = document.getElementById('page2-link');
const page1 = document.getElementById('page1');
const page2 = document.getElementById('page2');
page1Link.addEventListener('click', () => {
page1.classList.add('active');
page2.classList.remove('active');
});
page2Link.addEventListener('click', () => {
page2.classList.add('active');
page1.classList.remove('active');
});
const uploadButton = document.getElementById('upload-button');
const firmwareFile = document.getElementById('firmware-file');
const uploadForm = document.getElementById('upload-form');
const dropZone = document.getElementById('drop-zone');
const progressBar = document.getElementById('upload-progress');
// 点击拖放区域触发文件选择
dropZone.addEventListener('click', () => {
firmwareFile.click();
});
// 文件拖入拖放区域
['dragenter', 'dragover'].forEach(eventName => {
dropZone.addEventListener(eventName, (e) => {
e.preventDefault();
e.stopPropagation();
dropZone.classList.add('highlight');
});
});
// 文件拖离拖放区域
['dragleave', 'drop'].forEach(eventName => {
dropZone.addEventListener(eventName, (e) => {
e.preventDefault();
e.stopPropagation();
dropZone.classList.remove('highlight');
});
});
// 文件放入拖放区域
dropZone.addEventListener('drop', (e) => {
const files = e.dataTransfer.files;
if (files.length) {
firmwareFile.files = files;
dropZone.textContent = files[0].name; // 更新文本内容为文件名
}
});
// 更新文本内容为文件名
firmwareFile.addEventListener('change', () => {
if (firmwareFile.files.length) {
dropZone.textContent = firmwareFile.files[0].name;
}
});
// 上传文件并显示进度
uploadButton.addEventListener('click', () => {
const file = firmwareFile.files[0];
if (!file) {
alert('请选择一个文件!');
return;
}
const formData = new FormData();
formData.append('update', file);
const xhr = new XMLHttpRequest();
xhr.open('POST', '/update', true);
xhr.upload.onprogress = function (e) {
if (e.lengthComputable) {
const percentComplete = (e.loaded / e.total) * 100;
progressBar.value = percentComplete;
}
};
xhr.onload = function () {
if (xhr.status === 200) {
alert('上传成功!');
} else {
alert('上传失败,请重试。');
}
progressBar.value = 0;
};
xhr.onerror = function () {
alert('上传过程中发生错误。错误码:' + xhr.status);
progressBar.value = 0;
};
xhr.timeout = 100000; // 设置超时时间为100秒
xhr.ontimeout = function () {
alert('服务器无响应,页面将刷新。');
location.reload();
};
xhr.send(formData);
});
var history_data = [
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []}
];
function addToHistory(index, voltage, current, power) {
history_data[index].voltageHistory.push(voltage);
history_data[index].currentHistory.push(current);
history_data[index].powerHistory.push(power);
history_data[index].voltageHistory = history_data[index].voltageHistory.slice(-500);
history_data[index].currentHistory = history_data[index].currentHistory.slice(-500);
history_data[index].powerHistory = history_data[index].powerHistory.slice(-500);
}
function updateStatus() {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/status', true);
xhr.onload = function () {
const cards = document.querySelectorAll('.status-card');
if (xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
data = data.data;
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setFloat32(0, data[50], true);
var alert_tmp = new Uint8Array(buffer);
var index_convert = [8,9,0,1,2,3,4,5,6,7];
cards.forEach((card, index) => {
const voltage = card.querySelector('.voltage');
const current = card.querySelector('.current');
const power = card.querySelector('.power');
const alert = card.querySelector('.alert');
const canvas = card.querySelector('.chart');
// Update text content
voltage.textContent = data[index_convert[index]*2].toFixed(2);
current.textContent = data[index_convert[index]*2+1].toFixed(2);
power.textContent = data[index_convert[index]*3+20].toFixed(2);
// alert.textContent = data[index*2].alert;
addToHistory(index_convert[index], data[index_convert[index]*2], data[index_convert[index]*2+1], data[index_convert[index]*3+20]);
// Draw chart
drawChart(canvas, history_data[index_convert[index]]);
});
} else {
console.error('Failed to fetch status data');
cards.forEach((card) => {
const voltage = card.querySelector('.voltage');
const current = card.querySelector('.current');
const power = card.querySelector('.power');
const canvas = card.querySelector('.chart');
// Display NaN for text content
voltage.textContent = 'NaN';
current.textContent = 'NaN';
power.textContent = 'NaN';
addToHistory(index, 0, 0, 0);
// Draw chart with 0 values
drawChart(canvas, history_data[index]);
});
}
};
xhr.onerror = function () {
console.error('Error during status update request');
const cards = document.querySelectorAll('.status-card');
cards.forEach((card) => {
const voltage = card.querySelector('.voltage');
const current = card.querySelector('.current');
const power = card.querySelector('.power');
const canvas = card.querySelector('.chart');
// Display NaN for text content
voltage.textContent = 'NaN';
current.textContent = 'NaN';
power.textContent = 'NaN';
addToHistory(index, 0, 0, 0);
// Draw chart with 0 values
drawChart(canvas, history_data[index]);
});
};
xhr.send();
}
function drawChart(canvas, data) {
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 获取历史数据
const voltageData = data.voltageHistory || [0, 0, 0, 0, 0];
const currentData = data.currentHistory || [0, 0, 0, 0, 0];
const powerData = data.powerHistory || [0, 0, 0, 0, 0];
const allData = [...voltageData, ...currentData, ...powerData];
const maxValue = Math.max(...allData);
const minValue = Math.min(...allData);
const colors = {
voltage: 'blue',
current: 'green',
power: 'orange'
};
const maxPoints = voltageData.length;
const width = canvas.width;
const height = canvas.height;
const stepX = width / (maxPoints - 1);
function drawLine(data, color) {
ctx.beginPath();
ctx.strokeStyle = color;
ctx.lineWidth = 2;
data.forEach((value, index) => {
const x = index * stepX;
const y = height - ((value - minValue) / (maxValue - minValue)) * height; // 自动缩放
if (index === 0) {
ctx.moveTo(x, y);
} else {
ctx.lineTo(x, y);
}
});
ctx.stroke();
}
drawLine(voltageData, colors.voltage);
drawLine(currentData, colors.current);
drawLine(powerData, colors.power);
}
setInterval(updateStatus, 500);
const toggleSidebarButton = document.getElementById('toggle-sidebar');
const sidebar = document.querySelectorAll('.sidebar');
const sideButtonContainer = document.getElementById('side-button');
toggleSidebarButton.addEventListener('click', () => {
for(let i = 0; i < sidebar.length; i++) {
sidebar[i].classList.toggle('hidden');
}
sideButtonContainer.classList.toggle('hide-arrow');
sideButtonContainer.classList.toggle('show-arrow');
});

BIN
esp8266/web/script.js.gz Normal file

Binary file not shown.

304
esp8266/web/styles.css Normal file
View File

@@ -0,0 +1,304 @@
/* General styles */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
display: flex;
height: 100vh;
}
.container {
display: flex;
width: 100%;
}
/* Sidebar styles */
.sidebar {
position: fixed; /* 固定在页面左侧 */
top: 0;
left: 0;
height: 100%; /* 占满页面高度 */
overflow-y: auto; /* 如果内容过多,允许滚动 */
width: 200px;
background-color: #333;
color: white;
padding: 15px;
transition: width 0.3s, padding 0.3s;
z-index: 1; /* 设置侧边栏层级为 1 */
}
.sidebar nav ul {
list-style: none;
padding: 0;
}
.sidebar nav ul li {
margin: 10px 0;
}
.sidebar nav ul li a {
color: white;
text-decoration: none;
width: 170px;
}
/* .sidebar nav ul li a:hover {
text-decoration: underline;
} */
.sidebar a {
display: block; /* 整行可点击 */
padding: 10px 15px;
text-decoration: none; /* 去掉下划线 */
color: #ecf0f1; /* 默认文字颜色 */
background-color: #34495e; /* 默认背景颜色 */
border-radius: 5px;
transition: background-color 0.3s, color 0.3s; /* 添加过渡效果 */
}
.sidebar a:hover {
background-color: #1abc9c; /* 悬停时背景颜色 */
color: #ffffff; /* 悬停时文字颜色 */
text-decoration: none; /* 确保悬停时无下划线 */
cursor: pointer; /* 光标变为手型 */
}
.sidebar.hidden {
width: 0px; /* 保留切换按钮的宽度 */
padding-left: 0px; /* 去掉内边距 */
padding-right: 0px; /* 去掉内边距 */
overflow: hidden; /* 隐藏其他内容 */
/* display: none; */
}
/* Content styles */
.content {
flex-grow: 1;
padding: 20px;
}
.page {
display: none;
}
.page.active {
display: block;
}
/* Page 2 styles */
#drop-zone {
border: 2px dashed #ccc;
border-radius: 10px;
padding: 20px;
text-align: center;
color: #666;
margin-bottom: 15px;
cursor: pointer;
transition: background-color 0.3s;
}
#drop-zone:hover {
background-color: #f9f9f9;
}
#upload-progress {
width: 100%;
height: 20px;
margin: 10px 0;
}
#upload-button {
display: block;
width: 100%;
padding: 10px;
background-color: #007BFF;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
}
#upload-button:hover {
background-color: #0056b3;
}
/* Status grid styles */
.status-grid {
display: grid;
grid-template-columns: repeat(4, 1fr); /* 默认每排 4 个卡片 */
gap: 20px;
padding: 20px;
}
@media screen and (max-width: 1650px) {
.status-grid {
grid-template-columns: repeat(2, 1fr); /* 宽度小于 1650px 时每排 2 个卡片 */
}
}
@media screen and (max-width: 1000px) {
.status-grid {
grid-template-columns: repeat(1, 1fr); /* 宽度小于 1000px 时每排 1 个卡片 */
}
}
.status-item {
display: flex;
align-items: center;
justify-content: center;
background-color: #f0f0f0;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 16px;
text-align: center;
padding: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* Responsive design */
@media (max-width: 768px) {
#drop-zone {
font-size: 14px;
}
#upload-button {
font-size: 14px;
}
.status-item {
font-size: 14px;
}
}
body {
background-color: #3d3d3d; /* 深色背景 */
color: #ecf0f1; /* 浅色文字 */
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
.status-card {
background-color: #e5e5e5; /* 深色卡片背景 */
border: 2px solid #1abc9c; /* 突出的边框颜色 */
min-width: 250px;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* 阴影效果 */
padding: 5px;
color: #ecf0f1;
transition: transform 0.2s, box-shadow 0.2s;
}
.status-card:hover {
transform: translateY(-5px); /* 悬停时上移效果 */
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4); /* 悬停时更深的阴影 */
}
.status-card h2 {
margin-top: 0;
color: #1abc9c; /* 标题颜色 */
}
.settings-icon {
text-align: right;
font-size: 1.5em;
cursor: pointer;
}
.status-grid .status-card .status-card-info {
display: grid;
align-items: center;
text-align: center;
grid-template-columns: repeat(2, 1fr); /* 每行 2 个 */
}
.top-grid {
display: grid;
grid-template-columns: repeat(2, 1fr); /* 默认每排 2 个卡片 */
gap: 20px;
padding: 5px 20px 5px 20px;
}
@media screen and (max-width: 1000px) {
.top-grid {
grid-template-columns: repeat(1, 1fr); /* 宽度小于 1000px 时每排 1 个卡片 */
}
}
.top-grid .status-card .status-card-info{
display: grid;
grid-template-rows: auto;
grid-template-columns: repeat(4, 1fr); /* 电压、电流、功率、警报在同一行 */
align-items: center;
text-align: center;
}
@media screen and (max-width: 1650px) {
.top-grid .status-card .status-card-info{
grid-template-rows: auto auto auto; /* 默认布局 */
grid-template-columns: repeat(2, 1fr); /* 每行 2 个 */
}
}
.status-card canvas {
width: 90%; /* 根据卡片宽度的 90% 自动调整 */
display: block;
margin: 0 auto; /* 居中对齐 */
}
.top-grid canvas {
height: 140px; /* 固定高度 */
}
.status-grid canvas {
height: 130px; /* 固定高度 */
}
#toggle-sidebar {
width: 30px;
height: 30px;
background-color: #1abc9c;
color: #ffffff;
border: none;
border-radius: 50%;
cursor: pointer;
font-size: 16px;
display: block;
align-items: center;
justify-content: center;
transition: background-color 0.3s, transform 0.3s;
/* position: fixed; */
/* top: 50%;
left: 0;
transform: translateY(-50%); */
}
#toggle-sidebar:hover {
background-color: #16a085;
}
#side-button{
position: fixed; /* 悬浮于页面 */
top: 50%; /* 垂直居中 */
left: 5px; /* 固定在页面左侧 */
transform: translateY(-50%); /* 调整垂直居中位置 */
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
z-index: 2; /* 设置按钮层级为 2确保在侧边栏之上 */
}
.hide-arrow #toggle-sidebar {
transform: rotate(180deg); /* 收起时箭头旋转 */
}
.show-arrow #toggle-sidebar {
transform: rotate(0deg); /* 展开时箭头恢复 */
}

BIN
esp8266/web/styles.css.gz Normal file

Binary file not shown.

View File

@@ -50,7 +50,7 @@ int core0_main(void)
ESP8266_Init();
Status_LED_Init();
oled_init();
oled_show_string(0, 0, "ESP8266 Test");
// oled_show_string(0, 0, "ESP8266 Test");
// ON_LED(STATUS_LED_7);
// ON_LED(STATUS_LED_8);
@@ -82,6 +82,8 @@ int core0_main(void)
Power_Ctrl_Enable_Output(6, 1);
Power_Ctrl_Enable_Output(7, 1);
// ESP8266_Into_Download_Mode();
cpu_wait_event_ready();
while (TRUE)
{