Move most of settings to new page in /ui to save memory (#1028)
This commit is contained in:
parent
cb710a4c69
commit
41403b4b07
|
@ -18,7 +18,7 @@ check_skip_packages = yes
|
||||||
extends = env
|
extends = env
|
||||||
platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
|
platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
|
||||||
platform_packages =
|
platform_packages =
|
||||||
debug_build_flags = -O0 -ggdb3 -g3 -DDEBUG_TLS_MEM
|
debug_build_flags = -Og -ggdb3 -g3 -DDEBUG_TLS_MEM
|
||||||
build_flags =
|
build_flags =
|
||||||
-free
|
-free
|
||||||
-fipa-pta
|
-fipa-pta
|
||||||
|
|
|
@ -41,7 +41,6 @@ namespace AHTX0
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "AHTX0 - Temperature + Humidity Sensor:");
|
|
||||||
AHTX0_I2c_Bus = AsyncWiFiSettings.integer("AHTX0_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
AHTX0_I2c_Bus = AsyncWiFiSettings.integer("AHTX0_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
AHTX0_I2c = AsyncWiFiSettings.string("AHTX0_I2c", "", "I2C address (0x38 or 0x39)");
|
AHTX0_I2c = AsyncWiFiSettings.string("AHTX0_I2c", "", "I2C address (0x38 or 0x39)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,6 @@ namespace BH1750
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "BH1750 - Ambient Light Sensor:");
|
|
||||||
BH1750_I2c_Bus = AsyncWiFiSettings.integer("BH1750_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
BH1750_I2c_Bus = AsyncWiFiSettings.integer("BH1750_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
BH1750_I2c = AsyncWiFiSettings.string("BH1750_I2c", "", "I2C address (0x23 or 0x5C)");
|
BH1750_I2c = AsyncWiFiSettings.string("BH1750_I2c", "", "I2C address (0x23 or 0x5C)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,6 @@ namespace BME280
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "BME280 - Humidity + Temp + Pressure Sensor:");
|
|
||||||
BME280_I2c_Bus = AsyncWiFiSettings.integer("BME280_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
BME280_I2c_Bus = AsyncWiFiSettings.integer("BME280_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
BME280_I2c = AsyncWiFiSettings.string("BME280_I2c", "", "I2C address (0x76 or 0x77)");
|
BME280_I2c = AsyncWiFiSettings.string("BME280_I2c", "", "I2C address (0x76 or 0x77)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,6 @@ namespace BMP180
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "BMP085/BMP180 - Barometric Pressure + Temperature:");
|
|
||||||
BMP180_I2c_Bus = AsyncWiFiSettings.integer("BMP180_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
BMP180_I2c_Bus = AsyncWiFiSettings.integer("BMP180_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
BMP180_I2c = AsyncWiFiSettings.string("BMP180_I2c", "", "I2C address (0x77)");
|
BMP180_I2c = AsyncWiFiSettings.string("BMP180_I2c", "", "I2C address (0x77)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,6 @@ namespace BMP280
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "BMP280 - Barometric Pressure + Temperature Sensor:");
|
|
||||||
BMP280_I2c_Bus = AsyncWiFiSettings.integer("BMP280_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
BMP280_I2c_Bus = AsyncWiFiSettings.integer("BMP280_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
BMP280_I2c = AsyncWiFiSettings.string("BMP280_I2c", "", "I2C address (0x76 or 0x77)");
|
BMP280_I2c = AsyncWiFiSettings.string("BMP280_I2c", "", "I2C address (0x76 or 0x77)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,14 +30,12 @@ void Setup() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectToWifi() {
|
void ConnectToWifi() {
|
||||||
AsyncWiFiSettings.html("h4", "Button One:");
|
|
||||||
std::vector<String> pinTypes = {"Pullup", "Pullup Inverted", "Pulldown", "Pulldown Inverted", "Floating", "Floating Inverted"};
|
std::vector<String> pinTypes = {"Pullup", "Pullup Inverted", "Pulldown", "Pulldown Inverted", "Floating", "Floating Inverted"};
|
||||||
button_1Type = AsyncWiFiSettings.dropdown("button_1_type", pinTypes, 0, "Button One pin type");
|
button_1Type = AsyncWiFiSettings.dropdown("button_1_type", pinTypes, 0, "Button One pin type");
|
||||||
button_1Pin = AsyncWiFiSettings.integer("button_1_pin", -1, "Button One pin (-1 for disable)");
|
button_1Pin = AsyncWiFiSettings.integer("button_1_pin", -1, "Button One pin (-1 for disable)");
|
||||||
button_1Timeout = AsyncWiFiSettings.floating("button_1_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Button One timeout (in seconds)");
|
button_1Timeout = AsyncWiFiSettings.floating("button_1_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Button One timeout (in seconds)");
|
||||||
button_1Detected = button_1Type & 0x01 ? LOW : HIGH;
|
button_1Detected = button_1Type & 0x01 ? LOW : HIGH;
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "Button Two:");
|
|
||||||
button_2Type = AsyncWiFiSettings.dropdown("button_2_type", pinTypes, 0, "Button Two pin type");
|
button_2Type = AsyncWiFiSettings.dropdown("button_2_type", pinTypes, 0, "Button Two pin type");
|
||||||
button_2Pin = AsyncWiFiSettings.integer("button_2_pin", -1, "Button Two pin (-1 for disable)");
|
button_2Pin = AsyncWiFiSettings.integer("button_2_pin", -1, "Button Two pin (-1 for disable)");
|
||||||
button_2Timeout = AsyncWiFiSettings.floating("button_2_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Button Two timeout (in seconds)");
|
button_2Timeout = AsyncWiFiSettings.floating("button_2_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Button Two timeout (in seconds)");
|
||||||
|
|
|
@ -106,7 +106,6 @@ namespace DHT
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "DHT:");
|
|
||||||
dht11Pin = AsyncWiFiSettings.integer("dht11_pin", -1, "DHT11 sensor pin (-1 for disable)");
|
dht11Pin = AsyncWiFiSettings.integer("dht11_pin", -1, "DHT11 sensor pin (-1 for disable)");
|
||||||
dht22Pin = AsyncWiFiSettings.integer("dht22_pin", -1, "DHT22 sensor pin (-1 for disable)");
|
dht22Pin = AsyncWiFiSettings.integer("dht22_pin", -1, "DHT22 sensor pin (-1 for disable)");
|
||||||
dhtTempOffset = AsyncWiFiSettings.floating("dhtTemp_offset", -40, 125, 0.0, "DHT temperature offset");
|
dhtTempOffset = AsyncWiFiSettings.floating("dhtTemp_offset", -40, 125, 0.0, "DHT temperature offset");
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <Ticker.h>
|
#include <Ticker.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DS18B20
|
namespace DS18B20
|
||||||
{
|
{
|
||||||
int ds18b20Pin = -1;
|
int ds18b20Pin = -1;
|
||||||
float dsTempOffset;
|
float dsTempOffset;
|
||||||
|
@ -108,7 +108,6 @@ namespace DS18B20
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "DS18B20:");
|
|
||||||
ds18b20Pin = AsyncWiFiSettings.integer("ds18b20_pin", -1, "DS18B20 sensor pin (-1 for disable)");
|
ds18b20Pin = AsyncWiFiSettings.integer("ds18b20_pin", -1, "DS18B20 sensor pin (-1 for disable)");
|
||||||
dsTempOffset = AsyncWiFiSettings.floating("dsTemp_offset", -40, 125, 0.0, "DS18B20 temperature offset");
|
dsTempOffset = AsyncWiFiSettings.floating("dsTemp_offset", -40, 125, 0.0, "DS18B20 temperature offset");
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ namespace HX711
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "HX711 - Weight Sensor:");
|
|
||||||
sckPin = AsyncWiFiSettings.integer("HX711_sckPin", 0, "HX711 SCK (Clock) pin");
|
sckPin = AsyncWiFiSettings.integer("HX711_sckPin", 0, "HX711 SCK (Clock) pin");
|
||||||
doutPin = AsyncWiFiSettings.integer("HX711_doutPin", 0, "HX711 DOUT (Data) pin");
|
doutPin = AsyncWiFiSettings.integer("HX711_doutPin", 0, "HX711 DOUT (Data) pin");
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,13 +20,9 @@ int I2C_Bus_2_SCL = 0;
|
||||||
void ConnectToWifi() {
|
void ConnectToWifi() {
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#i2c-settings' target='_blank'>I2C Settings</a>", false);
|
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#i2c-settings' target='_blank'>I2C Settings</a>", false);
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "Bus 1:");
|
|
||||||
|
|
||||||
I2C_Bus_1_SDA = AsyncWiFiSettings.integer("I2C_Bus_1_SDA", -1, 39, DEFAULT_I2C_BUS_1_SDA, "SDA pin (-1 to disable)");
|
I2C_Bus_1_SDA = AsyncWiFiSettings.integer("I2C_Bus_1_SDA", -1, 39, DEFAULT_I2C_BUS_1_SDA, "SDA pin (-1 to disable)");
|
||||||
I2C_Bus_1_SCL = AsyncWiFiSettings.integer("I2C_Bus_1_SCL", -1, 39, DEFAULT_I2C_BUS_1_SCL, "SCL pin (-1 to disable)");
|
I2C_Bus_1_SCL = AsyncWiFiSettings.integer("I2C_Bus_1_SCL", -1, 39, DEFAULT_I2C_BUS_1_SCL, "SCL pin (-1 to disable)");
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "Bus 2:");
|
|
||||||
|
|
||||||
I2C_Bus_2_SDA = AsyncWiFiSettings.integer("I2C_Bus_2_SDA", -1, 39, DEFAULT_I2C_BUS_2_SDA, "SDA pin (-1 to disable)");
|
I2C_Bus_2_SDA = AsyncWiFiSettings.integer("I2C_Bus_2_SDA", -1, 39, DEFAULT_I2C_BUS_2_SDA, "SDA pin (-1 to disable)");
|
||||||
I2C_Bus_2_SCL = AsyncWiFiSettings.integer("I2C_Bus_2_SCL", -1, 39, DEFAULT_I2C_BUS_2_SCL, "SCL pin (-1 to disable)");
|
I2C_Bus_2_SCL = AsyncWiFiSettings.integer("I2C_Bus_2_SCL", -1, 39, DEFAULT_I2C_BUS_2_SCL, "SCL pin (-1 to disable)");
|
||||||
|
|
||||||
|
|
|
@ -36,22 +36,16 @@ void ConnectToWifi() {
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#leds' target='_blank'>LEDs</a>", false);
|
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#leds' target='_blank'>LEDs</a>", false);
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "LED 1:");
|
|
||||||
|
|
||||||
led_1_type = AsyncWiFiSettings.dropdown("led_1_type", ledTypes, DEFAULT_LED1_TYPE, "LED Type");
|
led_1_type = AsyncWiFiSettings.dropdown("led_1_type", ledTypes, DEFAULT_LED1_TYPE, "LED Type");
|
||||||
led_1_pin = AsyncWiFiSettings.integer("led_1_pin", -1, 39, DEFAULT_LED1_PIN, "Pin (-1 to disable)");
|
led_1_pin = AsyncWiFiSettings.integer("led_1_pin", -1, 39, DEFAULT_LED1_PIN, "Pin (-1 to disable)");
|
||||||
led_1_cnt = AsyncWiFiSettings.integer("led_1_cnt", -1, 39, DEFAULT_LED1_CNT, "Count (only applies to Addressable LEDs)");
|
led_1_cnt = AsyncWiFiSettings.integer("led_1_cnt", -1, 39, DEFAULT_LED1_CNT, "Count (only applies to Addressable LEDs)");
|
||||||
led_1_cntrl = (ControlType)AsyncWiFiSettings.dropdown("led_1_cntrl", ledControlTypes, DEFAULT_LED1_CNTRL, "LED Control");
|
led_1_cntrl = (ControlType)AsyncWiFiSettings.dropdown("led_1_cntrl", ledControlTypes, DEFAULT_LED1_CNTRL, "LED Control");
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "LED 2:");
|
|
||||||
|
|
||||||
led_2_type = AsyncWiFiSettings.dropdown("led_2_type", ledTypes, 0, "LED Type");
|
led_2_type = AsyncWiFiSettings.dropdown("led_2_type", ledTypes, 0, "LED Type");
|
||||||
led_2_pin = AsyncWiFiSettings.integer("led_2_pin", -1, 39, -1, "Pin (-1 to disable)");
|
led_2_pin = AsyncWiFiSettings.integer("led_2_pin", -1, 39, -1, "Pin (-1 to disable)");
|
||||||
led_2_cnt = AsyncWiFiSettings.integer("led_2_cnt", -1, 39, 1, "Count (only applies to Addressable LEDs)");
|
led_2_cnt = AsyncWiFiSettings.integer("led_2_cnt", -1, 39, 1, "Count (only applies to Addressable LEDs)");
|
||||||
led_2_cntrl = (ControlType)AsyncWiFiSettings.dropdown("led_2_cntrl", ledControlTypes, 0, "LED Control");
|
led_2_cntrl = (ControlType)AsyncWiFiSettings.dropdown("led_2_cntrl", ledControlTypes, 0, "LED Control");
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "LED 3:");
|
|
||||||
|
|
||||||
led_3_type = AsyncWiFiSettings.dropdown("led_3_type", ledTypes, 0, "LED Type");
|
led_3_type = AsyncWiFiSettings.dropdown("led_3_type", ledTypes, 0, "LED Type");
|
||||||
led_3_pin = AsyncWiFiSettings.integer("led_3_pin", -1, 39, -1, "Pin (-1 to disable)");
|
led_3_pin = AsyncWiFiSettings.integer("led_3_pin", -1, 39, -1, "Pin (-1 to disable)");
|
||||||
led_3_cnt = AsyncWiFiSettings.integer("led_3_cnt", -1, 39, 1, "Count (only applies to Addressable LEDs)");
|
led_3_cnt = AsyncWiFiSettings.integer("led_3_cnt", -1, 39, 1, "Count (only applies to Addressable LEDs)");
|
||||||
|
|
|
@ -30,14 +30,12 @@ void Setup() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectToWifi() {
|
void ConnectToWifi() {
|
||||||
AsyncWiFiSettings.html("h4", "PIR:");
|
|
||||||
std::vector<String> pinTypes = {"Pullup", "Pullup Inverted", "Pulldown", "Pulldown Inverted", "Floating", "Floating Inverted"};
|
std::vector<String> pinTypes = {"Pullup", "Pullup Inverted", "Pulldown", "Pulldown Inverted", "Floating", "Floating Inverted"};
|
||||||
pirType = AsyncWiFiSettings.dropdown("pir_type", pinTypes, 0, "PIR motion pin type");
|
pirType = AsyncWiFiSettings.dropdown("pir_type", pinTypes, 0, "PIR motion pin type");
|
||||||
pirPin = AsyncWiFiSettings.integer("pir_pin", -1, "PIR motion pin (-1 for disable)");
|
pirPin = AsyncWiFiSettings.integer("pir_pin", -1, "PIR motion pin (-1 for disable)");
|
||||||
pirTimeout = AsyncWiFiSettings.floating("pir_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "PIR motion timeout (in seconds)");
|
pirTimeout = AsyncWiFiSettings.floating("pir_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "PIR motion timeout (in seconds)");
|
||||||
pirDetected = pirType & 0x01 ? LOW : HIGH;
|
pirDetected = pirType & 0x01 ? LOW : HIGH;
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "Radar:");
|
|
||||||
radarType = AsyncWiFiSettings.dropdown("radar_type", pinTypes, 0, "Radar motion pin type");
|
radarType = AsyncWiFiSettings.dropdown("radar_type", pinTypes, 0, "Radar motion pin type");
|
||||||
radarPin = AsyncWiFiSettings.integer("radar_pin", -1, "Radar motion pin (-1 for disable)");
|
radarPin = AsyncWiFiSettings.integer("radar_pin", -1, "Radar motion pin (-1 for disable)");
|
||||||
radarTimeout = AsyncWiFiSettings.floating("radar_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Radar motion timeout (in seconds)");
|
radarTimeout = AsyncWiFiSettings.floating("radar_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Radar motion timeout (in seconds)");
|
||||||
|
|
|
@ -30,7 +30,6 @@ void Setup() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectToWifi() {
|
void ConnectToWifi() {
|
||||||
AsyncWiFiSettings.html("h4", "SHTC1/3, SHTW1/2, SHT3x/4x, SHT85 - Temperature and Humidity Sensor:");
|
|
||||||
bus = AsyncWiFiSettings.integer("SHT_I2c_Bus", 1, 2, -1, "I2C Bus (-1 to disable)");
|
bus = AsyncWiFiSettings.integer("SHT_I2c_Bus", 1, 2, -1, "I2C Bus (-1 to disable)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ void Setup() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectToWifi() {
|
void ConnectToWifi() {
|
||||||
AsyncWiFiSettings.html("h4", "SGP30 - Air Quality Sensor:");
|
|
||||||
SGP30_I2c_Bus = AsyncWiFiSettings.integer("SGP30_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
SGP30_I2c_Bus = AsyncWiFiSettings.integer("SGP30_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
SGP30_I2c = AsyncWiFiSettings.string("SGP30_I2c", "", "I2C address (0x58)");
|
SGP30_I2c = AsyncWiFiSettings.string("SGP30_I2c", "", "I2C address (0x58)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,14 +30,12 @@ void Setup() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectToWifi() {
|
void ConnectToWifi() {
|
||||||
AsyncWiFiSettings.html("h4", "Switch One:");
|
|
||||||
std::vector<String> pinTypes = {"Pullup", "Pullup Inverted", "Pulldown", "Pulldown Inverted", "Floating", "Floating Inverted"};
|
std::vector<String> pinTypes = {"Pullup", "Pullup Inverted", "Pulldown", "Pulldown Inverted", "Floating", "Floating Inverted"};
|
||||||
switch_1Type = AsyncWiFiSettings.dropdown("switch_1_type", pinTypes, 0, "Switch One pin type");
|
switch_1Type = AsyncWiFiSettings.dropdown("switch_1_type", pinTypes, 0, "Switch One pin type");
|
||||||
switch_1Pin = AsyncWiFiSettings.integer("switch_1_pin", -1, "Switch One pin (-1 for disable)");
|
switch_1Pin = AsyncWiFiSettings.integer("switch_1_pin", -1, "Switch One pin (-1 for disable)");
|
||||||
switch_1Timeout = AsyncWiFiSettings.floating("switch_1_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Switch One timeout (in seconds)");
|
switch_1Timeout = AsyncWiFiSettings.floating("switch_1_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Switch One timeout (in seconds)");
|
||||||
switch_1Detected = switch_1Type & 0x01 ? LOW : HIGH;
|
switch_1Detected = switch_1Type & 0x01 ? LOW : HIGH;
|
||||||
|
|
||||||
AsyncWiFiSettings.html("h4", "Switch Two:");
|
|
||||||
switch_2Type = AsyncWiFiSettings.dropdown("switch_2_type", pinTypes, 0, "Switch Two pin type");
|
switch_2Type = AsyncWiFiSettings.dropdown("switch_2_type", pinTypes, 0, "Switch Two pin type");
|
||||||
switch_2Pin = AsyncWiFiSettings.integer("switch_2_pin", -1, "Switch Two pin (-1 for disable)");
|
switch_2Pin = AsyncWiFiSettings.integer("switch_2_pin", -1, "Switch Two pin (-1 for disable)");
|
||||||
switch_2Timeout = AsyncWiFiSettings.floating("switch_2_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Switch Two timeout (in seconds)");
|
switch_2Timeout = AsyncWiFiSettings.floating("switch_2_timeout", 0, 300, DEFAULT_DEBOUNCE_TIMEOUT, "Switch Two timeout (in seconds)");
|
||||||
|
|
|
@ -23,7 +23,6 @@ namespace TSL2561
|
||||||
|
|
||||||
void ConnectToWifi()
|
void ConnectToWifi()
|
||||||
{
|
{
|
||||||
AsyncWiFiSettings.html("h4", "TSL2561 - Ambient Light Sensor:");
|
|
||||||
TSL2561_I2c_Bus = AsyncWiFiSettings.integer("TSL2561_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
TSL2561_I2c_Bus = AsyncWiFiSettings.integer("TSL2561_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
TSL2561_I2c = AsyncWiFiSettings.string("TSL2561_I2c", "", "I2C address (0x39, 0x49 or 0x29)");
|
TSL2561_I2c = AsyncWiFiSettings.string("TSL2561_I2c", "", "I2C address (0x39, 0x49 or 0x29)");
|
||||||
TSL2561_I2c_Gain = AsyncWiFiSettings.string("TSL2561_I2c_Gain", DEFAULT_TSL2561_I2C_GAIN, "Gain (auto, 1x or 16x)");
|
TSL2561_I2c_Gain = AsyncWiFiSettings.string("TSL2561_I2c_Gain", DEFAULT_TSL2561_I2C_GAIN, "Gain (auto, 1x or 16x)");
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
// Number of seconds to wait for a Station Wifi connection to be established
|
// Number of seconds to wait for a Station Wifi connection to be established
|
||||||
#ifndef DEFAULT_WIFI_TIMEOUT
|
#ifndef DEFAULT_WIFI_TIMEOUT
|
||||||
#define DEFAULT_WIFI_TIMEOUT 120
|
#define DEFAULT_WIFI_TIMEOUT 60
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Number of seconds to keep up captive portal (SoftAP) before rebooting
|
// Number of seconds to keep up captive portal (SoftAP) before rebooting
|
||||||
|
|
16
src/main.cpp
16
src/main.cpp
|
@ -146,34 +146,33 @@ void setupNetwork() {
|
||||||
discovery = AsyncWiFiSettings.checkbox("discovery", true, "Send to discovery topic");
|
discovery = AsyncWiFiSettings.checkbox("discovery", true, "Send to discovery topic");
|
||||||
homeAssistantDiscoveryPrefix = AsyncWiFiSettings.string("discovery_prefix", DEFAULT_HA_DISCOVERY_PREFIX, "Home Assistant discovery topic prefix");
|
homeAssistantDiscoveryPrefix = AsyncWiFiSettings.string("discovery_prefix", DEFAULT_HA_DISCOVERY_PREFIX, "Home Assistant discovery topic prefix");
|
||||||
publishTele = AsyncWiFiSettings.checkbox("pub_tele", true, "Send to telemetry topic");
|
publishTele = AsyncWiFiSettings.checkbox("pub_tele", true, "Send to telemetry topic");
|
||||||
publishRooms = AsyncWiFiSettings.checkbox("pub_rooms", true, "Send to rooms topic");
|
publishRooms = AsyncWiFiSettings.checkbox("pub_rooms_dep", true, "Send to rooms topic (deprecated in v4)");
|
||||||
publishDevices = AsyncWiFiSettings.checkbox("pub_devices", true, "Send to devices topic");
|
publishDevices = AsyncWiFiSettings.checkbox("pub_devices", true, "Send to devices topic");
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#updating' target='_blank'>Updating</a>", false);
|
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#updating' target='_blank'>Updating</a>", false);
|
||||||
Updater::ConnectToWifi();
|
Updater::ConnectToWifi();
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#scanning' target='_blank'>Scanning</a>", false);
|
AsyncWiFiSettings.info("<a href='ui/#settings' target='_blank'>Click here to edit other settings!</a>", false);
|
||||||
|
|
||||||
|
AsyncWiFiSettings.markExtra();
|
||||||
|
|
||||||
BleFingerprintCollection::knownMacs = AsyncWiFiSettings.string("known_macs", "", "Known BLE mac addresses (no colons, space seperated)");
|
BleFingerprintCollection::knownMacs = AsyncWiFiSettings.string("known_macs", "", "Known BLE mac addresses (no colons, space seperated)");
|
||||||
BleFingerprintCollection::knownIrks = AsyncWiFiSettings.string("known_irks", "", "Known BLE identity resolving keys, should be 32 hex chars space seperated");
|
BleFingerprintCollection::knownIrks = AsyncWiFiSettings.string("known_irks", "", "Known BLE identity resolving keys, should be 32 hex chars space seperated");
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#querying' target='_blank'>Querying</a>", false);
|
|
||||||
BleFingerprintCollection::query = AsyncWiFiSettings.string("query", DEFAULT_QUERY, "Query device ids for characteristics (eg. flora:)");
|
BleFingerprintCollection::query = AsyncWiFiSettings.string("query", DEFAULT_QUERY, "Query device ids for characteristics (eg. flora:)");
|
||||||
BleFingerprintCollection::requeryMs = AsyncWiFiSettings.integer("requery_ms", 30, 3600, 300, "Requery interval in seconds") * 1000;
|
BleFingerprintCollection::requeryMs = AsyncWiFiSettings.integer("requery_ms", 30, 3600, 300, "Requery interval in seconds") * 1000;
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#counting' target='_blank'>Counting</a>", false);
|
|
||||||
BleFingerprintCollection::countIds = AsyncWiFiSettings.string("count_ids", "", "Include id prefixes (space seperated)");
|
BleFingerprintCollection::countIds = AsyncWiFiSettings.string("count_ids", "", "Include id prefixes (space seperated)");
|
||||||
BleFingerprintCollection::countEnter = AsyncWiFiSettings.floating("count_enter", 0, 100, 2, "Start counting devices less than distance (in meters)");
|
BleFingerprintCollection::countEnter = AsyncWiFiSettings.floating("count_enter", 0, 100, 2, "Start counting devices less than distance (in meters)");
|
||||||
BleFingerprintCollection::countExit = AsyncWiFiSettings.floating("count_exit", 0, 100, 4, "Stop counting devices greater than distance (in meters)");
|
BleFingerprintCollection::countExit = AsyncWiFiSettings.floating("count_exit", 0, 100, 4, "Stop counting devices greater than distance (in meters)");
|
||||||
BleFingerprintCollection::countMs = AsyncWiFiSettings.integer("count_ms", 0, 3000000, 30000, "Include devices with age less than (in ms)");
|
BleFingerprintCollection::countMs = AsyncWiFiSettings.integer("count_ms", 0, 3000000, 30000, "Include devices with age less than (in ms)");
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#filtering' target='_blank'>Filtering</a>", false);
|
|
||||||
BleFingerprintCollection::include = AsyncWiFiSettings.string("include", DEFAULT_INCLUDE, "Include only sending these ids to mqtt (eg. apple:iphone10-6 apple:iphone13-2)");
|
BleFingerprintCollection::include = AsyncWiFiSettings.string("include", DEFAULT_INCLUDE, "Include only sending these ids to mqtt (eg. apple:iphone10-6 apple:iphone13-2)");
|
||||||
BleFingerprintCollection::exclude = AsyncWiFiSettings.string("exclude", DEFAULT_EXCLUDE, "Exclude sending these ids to mqtt (eg. exp:20 apple:iphone10-6)");
|
BleFingerprintCollection::exclude = AsyncWiFiSettings.string("exclude", DEFAULT_EXCLUDE, "Exclude sending these ids to mqtt (eg. exp:20 apple:iphone10-6)");
|
||||||
BleFingerprintCollection::maxDistance = AsyncWiFiSettings.floating("max_dist", 0, 100, DEFAULT_MAX_DISTANCE, "Maximum distance to report (in meters)");
|
BleFingerprintCollection::maxDistance = AsyncWiFiSettings.floating("max_dist", 0, 100, DEFAULT_MAX_DISTANCE, "Maximum distance to report (in meters)");
|
||||||
BleFingerprintCollection::skipDistance = AsyncWiFiSettings.floating("skip_dist", 0, 10, DEFAULT_SKIP_DISTANCE, "Report early if beacon has moved more than this distance (in meters)");
|
BleFingerprintCollection::skipDistance = AsyncWiFiSettings.floating("skip_dist", 0, 10, DEFAULT_SKIP_DISTANCE, "Report early if beacon has moved more than this distance (in meters)");
|
||||||
BleFingerprintCollection::skipMs = AsyncWiFiSettings.integer("skip_ms", 0, 3000000, DEFAULT_SKIP_MS, "Skip reporting if message age is less that this (in milliseconds)");
|
BleFingerprintCollection::skipMs = AsyncWiFiSettings.integer("skip_ms", 0, 3000000, DEFAULT_SKIP_MS, "Skip reporting if message age is less that this (in milliseconds)");
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#calibration' target='_blank'>Calibration</a>", false);
|
|
||||||
BleFingerprintCollection::rxRefRssi = AsyncWiFiSettings.integer("ref_rssi", -100, 100, DEFAULT_RX_REF_RSSI, "Rssi expected from a 0dBm transmitter at 1 meter (NOT used for iBeacons or Eddystone)");
|
BleFingerprintCollection::rxRefRssi = AsyncWiFiSettings.integer("ref_rssi", -100, 100, DEFAULT_RX_REF_RSSI, "Rssi expected from a 0dBm transmitter at 1 meter (NOT used for iBeacons or Eddystone)");
|
||||||
BleFingerprintCollection::rxAdjRssi = AsyncWiFiSettings.integer("rx_adj_rssi", -100, 100, 0, "Rssi adjustment for receiver (use only if you know this device has a weak antenna)");
|
BleFingerprintCollection::rxAdjRssi = AsyncWiFiSettings.integer("rx_adj_rssi", -100, 100, 0, "Rssi adjustment for receiver (use only if you know this device has a weak antenna)");
|
||||||
BleFingerprintCollection::absorption = AsyncWiFiSettings.floating("absorption", -100, 100, DEFAULT_ABSORPTION, "Factor used to account for absorption, reflection, or diffraction");
|
BleFingerprintCollection::absorption = AsyncWiFiSettings.floating("absorption", -100, 100, DEFAULT_ABSORPTION, "Factor used to account for absorption, reflection, or diffraction");
|
||||||
|
@ -182,8 +181,6 @@ void setupNetwork() {
|
||||||
|
|
||||||
GUI::ConnectToWifi();
|
GUI::ConnectToWifi();
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#gpio-sensors' target='_blank'>GPIO Sensors</a>", false);
|
|
||||||
|
|
||||||
BleFingerprintCollection::ConnectToWifi();
|
BleFingerprintCollection::ConnectToWifi();
|
||||||
Motion::ConnectToWifi();
|
Motion::ConnectToWifi();
|
||||||
Switch::ConnectToWifi();
|
Switch::ConnectToWifi();
|
||||||
|
@ -193,8 +190,6 @@ void setupNetwork() {
|
||||||
DHT::ConnectToWifi();
|
DHT::ConnectToWifi();
|
||||||
I2C::ConnectToWifi();
|
I2C::ConnectToWifi();
|
||||||
|
|
||||||
AsyncWiFiSettings.heading("<a href='https://espresense.com/configuration/settings#i2c-sensors' target='_blank'>I2C Sensors</a>", false);
|
|
||||||
|
|
||||||
AHTX0::ConnectToWifi();
|
AHTX0::ConnectToWifi();
|
||||||
BH1750::ConnectToWifi();
|
BH1750::ConnectToWifi();
|
||||||
BME280::ConnectToWifi();
|
BME280::ConnectToWifi();
|
||||||
|
@ -205,7 +200,6 @@ void setupNetwork() {
|
||||||
SensirionSGP30::ConnectToWifi();
|
SensirionSGP30::ConnectToWifi();
|
||||||
HX711::ConnectToWifi();
|
HX711::ConnectToWifi();
|
||||||
DS18B20::ConnectToWifi();
|
DS18B20::ConnectToWifi();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned int connectProgress = 0;
|
unsigned int connectProgress = 0;
|
||||||
|
|
|
@ -4,196 +4,207 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Autogenerated do not edit!!
|
// Autogenerated do not edit!!
|
||||||
const uint16_t BUNDLE_CSS_L = 2994;
|
const uint16_t BUNDLE_CSS_L = 3180;
|
||||||
const uint8_t BUNDLE_CSS[] PROGMEM = {
|
const uint8_t BUNDLE_CSS[] PROGMEM = {
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xed, 0x1a, 0x5d, 0x8f, 0xdb, 0xb8,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xed, 0x1a, 0x5d, 0x8f, 0xe3, 0xb6,
|
||||||
0xf1, 0xb9, 0xf7, 0x2b, 0xd4, 0x3b, 0x04, 0xd8, 0x0d, 0x44, 0x47, 0x92, 0x2d, 0x7b, 0x57, 0x46,
|
0xf1, 0xb9, 0xf7, 0x2b, 0x94, 0x1c, 0x02, 0xec, 0x1e, 0x24, 0x9d, 0x24, 0xdb, 0xeb, 0x5d, 0x19,
|
||||||
0x8b, 0xb6, 0x87, 0x1e, 0x7a, 0xc0, 0xe5, 0x1e, 0x2e, 0xed, 0x53, 0x92, 0x07, 0x5a, 0xa2, 0x2d,
|
0x29, 0x9a, 0x06, 0x0d, 0x1a, 0x20, 0x97, 0x87, 0x5c, 0xfb, 0x74, 0x77, 0x05, 0x68, 0x89, 0xb6,
|
||||||
0xde, 0x4a, 0xa2, 0x4a, 0x49, 0x6b, 0x7b, 0x55, 0xf7, 0xb7, 0x77, 0x48, 0x8a, 0x14, 0xf5, 0xe1,
|
0x78, 0x2b, 0x89, 0xaa, 0x44, 0xad, 0xed, 0x55, 0xd5, 0xdf, 0xde, 0xe1, 0xa7, 0x28, 0xc9, 0xde,
|
||||||
0xfd, 0x40, 0xd1, 0xa7, 0x5e, 0x92, 0xcd, 0x9a, 0xf3, 0xc5, 0xe1, 0x70, 0x38, 0x33, 0x1c, 0xfa,
|
0x0f, 0x14, 0x7d, 0x6a, 0x2e, 0x39, 0x9c, 0x39, 0x33, 0x1c, 0x0e, 0x87, 0x33, 0xc3, 0x99, 0xa1,
|
||||||
0x77, 0x1f, 0xde, 0xff, 0xde, 0xa9, 0x31, 0xcd, 0x8e, 0xb4, 0x48, 0xe2, 0xaa, 0x72, 0x1e, 0x97,
|
0xfe, 0xf0, 0xfe, 0xdd, 0x37, 0x0e, 0x43, 0x24, 0x3f, 0x90, 0x32, 0x4d, 0x9a, 0xc6, 0x79, 0x58,
|
||||||
0x0b, 0xf8, 0xeb, 0xfc, 0xcb, 0xf9, 0xf8, 0xe3, 0xdf, 0x9d, 0x9f, 0x68, 0x4c, 0x8a, 0x8a, 0xc0,
|
0xf8, 0xf0, 0x9f, 0xf3, 0x2f, 0xe7, 0xc3, 0xcf, 0x7f, 0x73, 0x7e, 0x21, 0x09, 0x2e, 0x1b, 0x0c,
|
||||||
0x28, 0xad, 0xeb, 0xb2, 0x8a, 0x3e, 0x7c, 0xb0, 0x48, 0x17, 0x31, 0xcb, 0xdf, 0x7f, 0x78, 0xef,
|
0xa3, 0x8c, 0xb1, 0xaa, 0x89, 0xdf, 0xbf, 0xb7, 0x48, 0xfd, 0x84, 0x16, 0xef, 0xde, 0xbf, 0x73,
|
||||||
0x46, 0x78, 0x5f, 0x13, 0xee, 0x46, 0x3b, 0xb2, 0x67, 0x9c, 0xb4, 0x3b, 0xc6, 0x13, 0xc2, 0x23,
|
0x63, 0xb4, 0x63, 0xb8, 0x76, 0xe3, 0x2d, 0xde, 0xd1, 0x1a, 0x77, 0x5b, 0x5a, 0xa7, 0xb8, 0x8e,
|
||||||
0xcf, 0xa9, 0x58, 0x46, 0x13, 0xe7, 0x3b, 0x12, 0x92, 0x0d, 0xd9, 0x6d, 0x77, 0xec, 0x84, 0x2a,
|
0x03, 0xa7, 0xa1, 0x39, 0x49, 0x9d, 0xb7, 0x78, 0x85, 0xd7, 0x78, 0xbb, 0xd9, 0xd2, 0xa3, 0xd7,
|
||||||
0xfa, 0x44, 0x8b, 0x43, 0xa4, 0x28, 0x10, 0x40, 0x2e, 0x23, 0x5e, 0x84, 0xea, 0x23, 0x8a, 0x59,
|
0x90, 0x47, 0x52, 0xee, 0x63, 0x49, 0xe1, 0x01, 0xa4, 0x9f, 0xcc, 0xf5, 0x3c, 0x76, 0xf0, 0x12,
|
||||||
0x51, 0x93, 0xa2, 0x8e, 0xbe, 0xfd, 0xf6, 0x92, 0xd6, 0x79, 0xd6, 0xa2, 0x23, 0xd9, 0x3d, 0xd0,
|
0x5a, 0x32, 0x5c, 0xb2, 0xf8, 0xdb, 0x6f, 0xfb, 0x8c, 0x15, 0x79, 0xe7, 0x1d, 0xf0, 0xf6, 0x9e,
|
||||||
0x1a, 0xd5, 0xe4, 0x54, 0x0b, 0x11, 0x04, 0xe1, 0xe4, 0xd7, 0xa6, 0xaa, 0x23, 0xdf, 0xf3, 0xde,
|
0x30, 0x8f, 0xe1, 0x23, 0xe3, 0x2c, 0xb0, 0x87, 0xd2, 0xaf, 0x6d, 0xc3, 0xe2, 0x30, 0x08, 0xbe,
|
||||||
0x6d, 0xf7, 0x40, 0x8d, 0xf6, 0x04, 0xd7, 0x0d, 0x27, 0xa8, 0x22, 0x75, 0x0d, 0x33, 0x54, 0x51,
|
0xdb, 0xec, 0x80, 0xda, 0xdb, 0x61, 0xc4, 0xda, 0x1a, 0x7b, 0x0d, 0x66, 0x0c, 0x56, 0x68, 0xe2,
|
||||||
0xc1, 0x78, 0x8e, 0xb3, 0x0e, 0x89, 0x73, 0x9a, 0x9d, 0xa3, 0x86, 0xa2, 0x0a, 0x17, 0x15, 0xd0,
|
0x92, 0xd6, 0x05, 0xca, 0x15, 0x12, 0x15, 0x24, 0x3f, 0xc5, 0x2d, 0xf1, 0x1a, 0x54, 0x36, 0x40,
|
||||||
0x70, 0xba, 0x77, 0xab, 0x73, 0x55, 0x93, 0x1c, 0x35, 0xd4, 0x45, 0xb8, 0x2c, 0x33, 0x60, 0x95,
|
0x53, 0x93, 0x9d, 0xdb, 0x9c, 0x1a, 0x86, 0x0b, 0xaf, 0x25, 0xae, 0x87, 0xaa, 0x2a, 0x87, 0xa9,
|
||||||
0x00, 0xf7, 0x2f, 0x19, 0x2d, 0x1e, 0x3e, 0xe2, 0xf8, 0x93, 0x1c, 0xfe, 0x00, 0xfc, 0xee, 0x27,
|
0x02, 0xe0, 0xfe, 0x39, 0x27, 0xe5, 0xfd, 0x07, 0x94, 0x7c, 0x14, 0xc3, 0x9f, 0x60, 0xbe, 0xfb,
|
||||||
0x72, 0x60, 0xc4, 0xf9, 0xc7, 0x8f, 0xee, 0x2f, 0x6c, 0xc7, 0x6a, 0xe6, 0xfe, 0x8d, 0x64, 0x8f,
|
0x11, 0xef, 0x29, 0x76, 0xfe, 0xfe, 0xb3, 0xfb, 0x1b, 0xdd, 0x52, 0x46, 0xdd, 0xbf, 0xe2, 0xfc,
|
||||||
0xa4, 0xa6, 0x31, 0x76, 0x7e, 0x26, 0x0d, 0x71, 0xff, 0xcc, 0x29, 0xce, 0xdc, 0x9f, 0x01, 0xe3,
|
0x01, 0x33, 0x92, 0x20, 0xe7, 0x57, 0xdc, 0x62, 0xf7, 0x87, 0x9a, 0xa0, 0xdc, 0xfd, 0x15, 0x30,
|
||||||
0x7c, 0x02, 0xf9, 0xae, 0x35, 0xc9, 0x9f, 0x85, 0x64, 0xe7, 0x7b, 0x96, 0x31, 0xee, 0xfc, 0x35,
|
0xce, 0x47, 0xe0, 0xef, 0x5a, 0x8b, 0xfc, 0xc0, 0x39, 0x3b, 0x3f, 0xd2, 0x9c, 0xd6, 0xce, 0x5f,
|
||||||
0x67, 0xbf, 0x52, 0x23, 0x6b, 0x3c, 0xfc, 0x74, 0xce, 0x77, 0xac, 0x93, 0x62, 0xd1, 0xab, 0x05,
|
0x0a, 0xfa, 0x95, 0x18, 0x5e, 0xd3, 0xe1, 0xc7, 0x53, 0xb1, 0xa5, 0x8a, 0x8b, 0x45, 0x2f, 0x37,
|
||||||
0x3c, 0x62, 0x98, 0xa2, 0xa6, 0xac, 0x98, 0xac, 0x0f, 0x94, 0x25, 0x28, 0x25, 0xf4, 0x90, 0x82,
|
0xf0, 0x80, 0x60, 0x09, 0x46, 0x68, 0x39, 0xdb, 0x1f, 0x08, 0x8b, 0xbd, 0x0c, 0x93, 0x7d, 0x06,
|
||||||
0x35, 0x16, 0xe1, 0x16, 0xe5, 0xec, 0x09, 0xd5, 0x78, 0x27, 0xcd, 0x14, 0xad, 0xb6, 0x88, 0xd9,
|
0xda, 0xf0, 0x57, 0x1b, 0xaf, 0xa0, 0x8f, 0x1e, 0x43, 0x5b, 0xa1, 0xa6, 0x78, 0xb9, 0xf1, 0xa8,
|
||||||
0xa3, 0xfe, 0xe3, 0x65, 0xc7, 0x92, 0x73, 0x6b, 0x73, 0xd3, 0x22, 0x05, 0x95, 0xeb, 0x6d, 0x8e,
|
0x3d, 0x1a, 0x7e, 0xf6, 0x5b, 0x9a, 0x9e, 0x3a, 0x7b, 0x36, 0x29, 0x33, 0x10, 0x99, 0x6d, 0x0a,
|
||||||
0xf9, 0x81, 0x16, 0x91, 0x77, 0x49, 0x79, 0xb7, 0x93, 0xa8, 0x66, 0x25, 0x3a, 0xd2, 0xa4, 0x4e,
|
0x54, 0xef, 0x49, 0x19, 0x07, 0x7d, 0x56, 0xab, 0x93, 0xf4, 0x18, 0xad, 0xbc, 0x03, 0x49, 0x59,
|
||||||
0x23, 0xbf, 0x3c, 0x6d, 0x63, 0xa1, 0x9d, 0x21, 0xef, 0xb8, 0xbd, 0x0b, 0xde, 0xed, 0x78, 0x74,
|
0x16, 0x87, 0xd5, 0x71, 0x93, 0x70, 0xe9, 0x0c, 0xb9, 0x9a, 0x1d, 0xf4, 0x68, 0xbb, 0xad, 0xe3,
|
||||||
0x04, 0x20, 0xb9, 0xf9, 0x5c, 0xd3, 0x3a, 0x23, 0x5f, 0x6f, 0x87, 0x1b, 0x97, 0x90, 0x98, 0x71,
|
0x03, 0x00, 0xf1, 0xd5, 0x27, 0x46, 0x58, 0x8e, 0xbf, 0x5c, 0x8f, 0x0f, 0x2e, 0xc5, 0x09, 0xad,
|
||||||
0xb9, 0x8a, 0xa8, 0x29, 0x40, 0xac, 0x98, 0xdc, 0x49, 0x58, 0x5d, 0x93, 0x64, 0xfb, 0x12, 0xc1,
|
0xc5, 0x2e, 0xe2, 0xb6, 0x04, 0xb6, 0x7c, 0x71, 0x27, 0xa5, 0x8c, 0xe1, 0x74, 0xf3, 0x1c, 0x41,
|
||||||
0x25, 0xf5, 0xdd, 0x34, 0x70, 0xd3, 0xa5, 0x9b, 0xae, 0xdc, 0x34, 0x74, 0xd3, 0x75, 0x2b, 0x0d,
|
0x9f, 0x85, 0x6e, 0x16, 0xb9, 0xd9, 0xc2, 0xcd, 0x96, 0x6e, 0xb6, 0x72, 0xb3, 0x9b, 0x4e, 0x28,
|
||||||
0x23, 0x17, 0xa3, 0x55, 0x91, 0x90, 0xe3, 0x60, 0x35, 0x17, 0xdc, 0x0e, 0xd5, 0x1d, 0x4f, 0xa4,
|
0x46, 0x6c, 0x46, 0x8b, 0x22, 0x20, 0x87, 0xd1, 0x6e, 0x7a, 0xd4, 0x8d, 0xc5, 0x9d, 0x2e, 0xa4,
|
||||||
0xe9, 0x76, 0x6e, 0x55, 0x73, 0x56, 0x1c, 0x5a, 0x5b, 0x08, 0x6c, 0x08, 0xa8, 0x71, 0x89, 0x59,
|
0xe9, 0xb6, 0x6e, 0xc3, 0x6a, 0x5a, 0xee, 0x3b, 0x9b, 0x09, 0x1c, 0x08, 0x88, 0xd1, 0x27, 0x34,
|
||||||
0x42, 0xdc, 0x87, 0x5d, 0xe2, 0x96, 0x9c, 0xc0, 0xe6, 0xe6, 0x65, 0x3b, 0xf2, 0xaa, 0x9c, 0x15,
|
0xc5, 0xee, 0xfd, 0x36, 0x75, 0xab, 0x1a, 0xc3, 0xe1, 0x16, 0x55, 0x37, 0xb1, 0xaa, 0x82, 0x96,
|
||||||
0xac, 0x2a, 0x71, 0x4c, 0xdc, 0x4f, 0x3f, 0x7c, 0x84, 0xcf, 0xe8, 0x17, 0x72, 0x68, 0x32, 0xcc,
|
0xb4, 0xa9, 0x50, 0x82, 0xdd, 0x8f, 0x3f, 0x7d, 0x80, 0xdf, 0xde, 0x6f, 0x78, 0xdf, 0xe6, 0xa8,
|
||||||
0xdd, 0x8f, 0xa4, 0xc8, 0x98, 0x0b, 0x20, 0x1c, 0x33, 0xf7, 0x7b, 0x56, 0xc0, 0x81, 0xc0, 0x95,
|
0x76, 0x3f, 0xe0, 0x32, 0xa7, 0x2e, 0x80, 0x50, 0x42, 0xdd, 0x1f, 0x69, 0x09, 0x0e, 0x81, 0x1a,
|
||||||
0xfb, 0x13, 0xdd, 0x11, 0x35, 0xbd, 0x23, 0xa8, 0x01, 0xd1, 0x70, 0x4a, 0x38, 0x38, 0xd3, 0xd1,
|
0xf7, 0x17, 0xb2, 0xc5, 0x72, 0x79, 0x87, 0x53, 0x03, 0xa2, 0xad, 0x09, 0xae, 0xc1, 0x98, 0x0e,
|
||||||
0x35, 0xa2, 0xb6, 0xfd, 0xfa, 0x7c, 0x92, 0x5f, 0x2a, 0xd8, 0xec, 0xcc, 0x5a, 0xf3, 0x9d, 0xf7,
|
0xae, 0x61, 0xb5, 0x19, 0xf6, 0x17, 0xe2, 0xa2, 0x6f, 0xe0, 0xb0, 0x73, 0x6b, 0xcf, 0xb7, 0xc1,
|
||||||
0xee, 0x52, 0x35, 0xa0, 0x75, 0x53, 0x5a, 0xd0, 0x4d, 0xf8, 0x6e, 0xe0, 0x11, 0xde, 0xb6, 0x64,
|
0x77, 0x7d, 0xd3, 0x82, 0xd4, 0x6d, 0x65, 0x41, 0xd7, 0xab, 0xef, 0x46, 0x16, 0x11, 0x6c, 0x2a,
|
||||||
0x15, 0x95, 0x0b, 0xe5, 0x24, 0x83, 0x29, 0x1f, 0xc9, 0xf6, 0x91, 0x70, 0xe1, 0xba, 0x19, 0xc2,
|
0xda, 0x10, 0xb1, 0xd1, 0x1a, 0xe7, 0xb0, 0xe4, 0x03, 0xde, 0x3c, 0xe0, 0x9a, 0x9b, 0x6e, 0xee,
|
||||||
0x19, 0x3d, 0x14, 0xd1, 0x0e, 0x57, 0x44, 0xb0, 0x08, 0x69, 0xb0, 0xdf, 0x75, 0xcd, 0xf2, 0x08,
|
0xa1, 0x9c, 0xec, 0xcb, 0x78, 0x8b, 0x1a, 0xcc, 0xa7, 0x70, 0x6e, 0x70, 0xde, 0x8c, 0xd1, 0x22,
|
||||||
0x2d, 0x82, 0x50, 0xcc, 0x09, 0xb2, 0x61, 0xeb, 0x61, 0x28, 0x46, 0xe0, 0x3b, 0x99, 0x3e, 0xdb,
|
0xf6, 0xfc, 0x68, 0xc5, 0xd7, 0x04, 0xde, 0x70, 0xf4, 0x30, 0xe4, 0x23, 0xb0, 0x9d, 0x5c, 0xfb,
|
||||||
0x70, 0x42, 0xb3, 0x0c, 0x97, 0x15, 0x89, 0xf4, 0x87, 0x6d, 0x8f, 0x18, 0x5b, 0x1b, 0x62, 0x85,
|
0x36, 0x78, 0x68, 0x9e, 0xa3, 0xaa, 0xc1, 0xb1, 0xfe, 0xb1, 0x19, 0x10, 0x53, 0x6d, 0x43, 0xac,
|
||||||
0x38, 0xcc, 0xde, 0x65, 0xd7, 0x80, 0xf4, 0xc2, 0xa5, 0x45, 0xd9, 0xd4, 0x2e, 0x2b, 0xeb, 0x03,
|
0xe0, 0xce, 0x1c, 0xf4, 0xdb, 0x16, 0xb8, 0x97, 0x2e, 0x29, 0xab, 0x96, 0xb9, 0xb4, 0x62, 0xfb,
|
||||||
0x67, 0x4d, 0xe9, 0xc2, 0xf4, 0x24, 0xae, 0x5d, 0x41, 0x8a, 0x39, 0xc1, 0xed, 0xfc, 0x71, 0xd6,
|
0x9a, 0xb6, 0x95, 0x0b, 0xcb, 0xe3, 0x84, 0xb9, 0x9c, 0x14, 0xd5, 0x18, 0x75, 0xe7, 0xdd, 0x59,
|
||||||
0x12, 0x87, 0xf2, 0xed, 0x7d, 0x18, 0xc0, 0x94, 0xdd, 0x4c, 0x74, 0x98, 0x39, 0x3f, 0xcf, 0x38,
|
0x73, 0x1c, 0xf3, 0xb7, 0xcf, 0x61, 0x04, 0x93, 0x7a, 0x33, 0xd1, 0xe1, 0x8c, 0xff, 0x3c, 0x61,
|
||||||
0xcd, 0xf6, 0xb9, 0x63, 0xb1, 0x2d, 0x71, 0x92, 0x88, 0x18, 0x66, 0xd6, 0xa3, 0x16, 0xd0, 0xca,
|
0x34, 0x9b, 0xa7, 0xdc, 0x62, 0x53, 0xa1, 0x34, 0xe5, 0x31, 0xcc, 0xec, 0x47, 0x6e, 0xa0, 0x13,
|
||||||
0xb5, 0xd6, 0x1c, 0xce, 0x3e, 0x04, 0xb2, 0x1c, 0xce, 0x27, 0xd8, 0xf4, 0x73, 0x7d, 0x2e, 0xc9,
|
0x7b, 0x65, 0x35, 0xf8, 0x3e, 0x04, 0xb2, 0x02, 0xfc, 0x13, 0x74, 0xfa, 0x89, 0x9d, 0x2a, 0xfc,
|
||||||
0x1f, 0x14, 0xdd, 0x57, 0x57, 0x8d, 0x38, 0x01, 0x1d, 0xf4, 0x00, 0x8c, 0x9e, 0x53, 0x18, 0x29,
|
0xbd, 0xa4, 0xfb, 0xe2, 0xca, 0x51, 0x8d, 0x41, 0x06, 0x3d, 0x00, 0xa5, 0x17, 0x04, 0x46, 0x92,
|
||||||
0x12, 0x73, 0x5e, 0x20, 0x20, 0x11, 0x0c, 0xa2, 0x62, 0x12, 0x29, 0xcc, 0x76, 0x87, 0xe3, 0x07,
|
0xc4, 0xf8, 0x0b, 0x04, 0x24, 0x8c, 0x80, 0x55, 0x82, 0x63, 0x89, 0xd9, 0x6c, 0x51, 0x72, 0xcf,
|
||||||
0x61, 0xaf, 0x22, 0xe9, 0x4c, 0x2c, 0x67, 0x2a, 0xc1, 0x62, 0x45, 0x6d, 0x23, 0x69, 0x8e, 0x0f,
|
0xf5, 0x55, 0xa6, 0x4a, 0xc5, 0x62, 0xa5, 0x0a, 0x34, 0x56, 0x32, 0x1b, 0x49, 0x0a, 0xb4, 0xc7,
|
||||||
0x44, 0x4d, 0x1e, 0xc9, 0x58, 0xb0, 0x67, 0x71, 0x53, 0x71, 0x50, 0xb8, 0x65, 0x4d, 0x2d, 0x16,
|
0x72, 0xf1, 0x58, 0xc4, 0x82, 0x1d, 0x4d, 0xda, 0xa6, 0x06, 0x81, 0x3b, 0xda, 0x32, 0xbe, 0xb1,
|
||||||
0x16, 0xe1, 0xa6, 0x66, 0x1d, 0x12, 0x7c, 0x97, 0x16, 0x8f, 0xe0, 0x08, 0x49, 0x2b, 0xa3, 0x73,
|
0x18, 0xb5, 0x8c, 0x2a, 0x24, 0xd8, 0x2e, 0x29, 0x1f, 0xc0, 0x10, 0xd2, 0x4e, 0x44, 0xe7, 0x0c,
|
||||||
0x8a, 0x13, 0x76, 0x54, 0xdc, 0x25, 0x67, 0x07, 0x50, 0xb5, 0x6a, 0xaf, 0xf9, 0x4b, 0x14, 0x69,
|
0xa5, 0xf4, 0x20, 0x67, 0x57, 0x35, 0xdd, 0x83, 0xa8, 0x4d, 0x77, 0xc9, 0x5e, 0xe2, 0x58, 0x4b,
|
||||||
0x6d, 0x69, 0x51, 0xc0, 0xce, 0x57, 0x25, 0x2d, 0x50, 0x67, 0x92, 0x1e, 0x07, 0x93, 0x0e, 0x71,
|
0x4b, 0xca, 0x12, 0x4e, 0xbe, 0xa9, 0x48, 0xe9, 0x29, 0x95, 0x0c, 0x38, 0x58, 0x74, 0x8c, 0xeb,
|
||||||
0x6d, 0x67, 0x57, 0xa9, 0x45, 0x67, 0x04, 0x58, 0x6b, 0x9c, 0x7e, 0x9d, 0x5b, 0xbd, 0x30, 0xea,
|
0x94, 0x5e, 0x85, 0x14, 0x4a, 0x09, 0xb0, 0xd7, 0x24, 0xfb, 0x72, 0x6e, 0xf7, 0x5c, 0xa9, 0x3b,
|
||||||
0x9e, 0x92, 0x2c, 0xd9, 0x76, 0xda, 0x23, 0xb6, 0xdf, 0x83, 0xfd, 0x22, 0x14, 0x94, 0x27, 0x4b,
|
0x82, 0xf3, 0x74, 0xa3, 0xa4, 0xf7, 0xe8, 0x6e, 0x07, 0xfa, 0x8b, 0xbd, 0xa8, 0x3a, 0x5a, 0x22,
|
||||||
0x05, 0x25, 0xc2, 0x3a, 0xd8, 0x73, 0xc2, 0x94, 0x55, 0x0c, 0xcf, 0x9e, 0x42, 0xd0, 0x6f, 0xca,
|
0x48, 0x16, 0x96, 0x63, 0x9f, 0x63, 0x26, 0xb5, 0x62, 0xe6, 0xec, 0x08, 0x04, 0xfd, 0xb6, 0xca,
|
||||||
0x8c, 0xe1, 0x04, 0xbd, 0x68, 0x7f, 0xe1, 0x26, 0x26, 0x58, 0x54, 0x4d, 0x0e, 0xee, 0x70, 0x6e,
|
0x29, 0x4a, 0xbd, 0x67, 0xf5, 0xcf, 0xcd, 0xc4, 0x04, 0x8b, 0xa6, 0x2d, 0xc0, 0x1c, 0x4e, 0x5d,
|
||||||
0x13, 0x5a, 0x95, 0x19, 0x3e, 0x47, 0x19, 0xad, 0xc0, 0x0a, 0x90, 0x2d, 0x2e, 0xbb, 0x8c, 0xc5,
|
0x4a, 0x9a, 0x2a, 0x47, 0xa7, 0x38, 0x27, 0x0d, 0x68, 0x01, 0x6e, 0x8b, 0x7e, 0x9b, 0xd3, 0xe4,
|
||||||
0x0f, 0xff, 0x6c, 0x58, 0x4d, 0xdc, 0x24, 0x71, 0x93, 0xcc, 0xdd, 0xd3, 0x03, 0xf8, 0xb1, 0x3b,
|
0xfe, 0x9f, 0x2d, 0x65, 0xd8, 0x4d, 0x53, 0x37, 0xcd, 0xdd, 0x1d, 0xd9, 0x83, 0x1d, 0xbb, 0xb3,
|
||||||
0x09, 0x5f, 0x6e, 0xca, 0xdd, 0x52, 0x04, 0x94, 0xd6, 0xc4, 0x5b, 0xb9, 0x4e, 0x58, 0xdb, 0x14,
|
0xf0, 0xe5, 0x66, 0xb5, 0x5b, 0xf1, 0x80, 0xd2, 0x99, 0x78, 0x2b, 0xf6, 0x09, 0x7b, 0x9b, 0x43,
|
||||||
0xe2, 0x66, 0xe4, 0x40, 0x8a, 0xa4, 0xed, 0x5d, 0x2f, 0x27, 0x45, 0xe3, 0x42, 0xba, 0x68, 0xb2,
|
0xdc, 0x1c, 0xef, 0x71, 0x99, 0x76, 0x83, 0xe9, 0x15, 0xb8, 0x6c, 0x5d, 0xb8, 0x2e, 0xda, 0xbc,
|
||||||
0x56, 0x4e, 0x5e, 0xd5, 0xe7, 0x4c, 0x2d, 0x70, 0xce, 0x51, 0x13, 0xc8, 0x4f, 0xec, 0x60, 0xb1,
|
0x13, 0x8b, 0x37, 0xec, 0x94, 0xcb, 0x0d, 0x9e, 0x33, 0xd4, 0x14, 0xee, 0x27, 0xba, 0xb7, 0xa6,
|
||||||
0x9b, 0xc3, 0x06, 0x3b, 0x2c, 0x4e, 0x8a, 0xde, 0xe3, 0x8b, 0x3c, 0x9b, 0x91, 0x72, 0x0e, 0x58,
|
0x1b, 0x67, 0x83, 0x13, 0xe6, 0x9e, 0xa2, 0xcf, 0xb8, 0x17, 0xbe, 0x19, 0x4b, 0xe3, 0x80, 0xad,
|
||||||
0x5a, 0x4c, 0x52, 0x19, 0x02, 0xcd, 0xe9, 0x9c, 0xa2, 0xba, 0xf8, 0xfa, 0xdd, 0x7d, 0x8c, 0x97,
|
0x25, 0x38, 0x13, 0x21, 0xd0, 0x78, 0xe7, 0x1c, 0xa5, 0xe2, 0xeb, 0xdb, 0xbb, 0x04, 0x2d, 0xd0,
|
||||||
0x78, 0xbf, 0x65, 0x10, 0xbb, 0x68, 0x7d, 0x8e, 0x7c, 0x2d, 0x6a, 0x5e, 0xca, 0x6b, 0x04, 0x7c,
|
0x6e, 0x43, 0x21, 0x76, 0x11, 0x76, 0x8a, 0x43, 0xcd, 0xea, 0x3c, 0x97, 0x97, 0x30, 0xf8, 0x54,
|
||||||
0xe6, 0x2c, 0xeb, 0x0f, 0x4f, 0xb7, 0x43, 0x71, 0xc3, 0x2b, 0xa0, 0x2e, 0x19, 0x85, 0x12, 0x81,
|
0xd3, 0x7c, 0x70, 0x1e, 0x75, 0x42, 0x49, 0x5b, 0x37, 0x40, 0x5d, 0x51, 0x02, 0x29, 0x42, 0xdd,
|
||||||
0x5f, 0x22, 0xd8, 0x02, 0x11, 0x97, 0x12, 0x8d, 0x48, 0xc8, 0x1e, 0x37, 0x19, 0xc4, 0xfd, 0x26,
|
0xc7, 0x70, 0x04, 0x3c, 0x2e, 0xa5, 0x1a, 0x91, 0xe2, 0x1d, 0x6a, 0x73, 0x88, 0xfb, 0x6d, 0x4a,
|
||||||
0xa1, 0xcc, 0x8d, 0x31, 0x78, 0x77, 0xe5, 0x92, 0x7c, 0x47, 0x12, 0x97, 0xee, 0x39, 0xce, 0x89,
|
0xa8, 0x9b, 0x20, 0xb0, 0xee, 0xc6, 0xc5, 0xc5, 0x16, 0xa7, 0x2e, 0xd9, 0xd5, 0xa8, 0xc0, 0x2e,
|
||||||
0x4b, 0xf3, 0x83, 0xcb, 0x76, 0xbf, 0x8a, 0x98, 0x53, 0x3d, 0x1e, 0xdc, 0x47, 0x9a, 0x10, 0x66,
|
0x29, 0xf6, 0x2e, 0xdd, 0x7e, 0xe5, 0x31, 0xa7, 0x79, 0xd8, 0xbb, 0x0f, 0x24, 0xc5, 0xd4, 0x9c,
|
||||||
0x76, 0x52, 0xee, 0xdf, 0x38, 0x44, 0xe6, 0x34, 0x49, 0x32, 0x72, 0x11, 0x8c, 0x8a, 0xda, 0x72,
|
0xa4, 0x38, 0xbf, 0x69, 0x88, 0x2c, 0x48, 0x9a, 0xe6, 0xb8, 0xe7, 0x13, 0x25, 0xb5, 0x65, 0xc2,
|
||||||
0x61, 0x30, 0xf7, 0x49, 0xe7, 0x46, 0x08, 0x37, 0x97, 0xcf, 0x29, 0x10, 0x93, 0xe2, 0xab, 0x91,
|
0xa0, 0xee, 0xa3, 0xbe, 0x1b, 0x21, 0xdc, 0xf4, 0x9f, 0x32, 0x20, 0xc6, 0xe5, 0x17, 0xc3, 0x51,
|
||||||
0x28, 0x9d, 0x6e, 0x52, 0x22, 0xc9, 0x32, 0xa7, 0x0b, 0x99, 0x22, 0xdc, 0xc3, 0xb6, 0xa0, 0x13,
|
0x18, 0xdd, 0x2c, 0x45, 0x12, 0x69, 0x8e, 0x0a, 0x99, 0x3c, 0xdc, 0xc3, 0xb1, 0x78, 0x47, 0x38,
|
||||||
0xec, 0xd9, 0x1c, 0xfc, 0xac, 0xe1, 0xf2, 0xc8, 0x43, 0x14, 0x27, 0x3d, 0x69, 0x0f, 0x32, 0x54,
|
0xb3, 0x73, 0xf0, 0x93, 0x86, 0x0b, 0x97, 0x87, 0x28, 0x8e, 0x07, 0xd2, 0x01, 0x64, 0xa8, 0x6a,
|
||||||
0x9c, 0xd5, 0x30, 0xd6, 0xa3, 0xea, 0x81, 0x1c, 0x7b, 0x72, 0x39, 0x32, 0x94, 0x15, 0x2c, 0x51,
|
0xca, 0x60, 0xac, 0x47, 0xcd, 0x3d, 0x3e, 0x0c, 0xe4, 0x62, 0x64, 0x28, 0x1b, 0xd8, 0x22, 0xe7,
|
||||||
0xc8, 0xf2, 0xed, 0xe1, 0x59, 0x0f, 0x4b, 0x5c, 0x00, 0xce, 0xe9, 0x07, 0x67, 0x33, 0xa0, 0x05,
|
0x15, 0xda, 0xc3, 0x93, 0x1e, 0x56, 0xa8, 0x04, 0x9c, 0x33, 0x0c, 0x4e, 0x66, 0x40, 0x4a, 0xf0,
|
||||||
0x9c, 0xb5, 0x27, 0x06, 0x99, 0xc2, 0xd1, 0xac, 0xb0, 0x57, 0x19, 0xaa, 0x0a, 0x5c, 0x82, 0x2b,
|
0xb5, 0x47, 0x0a, 0x37, 0x85, 0xa3, 0xa7, 0xc2, 0x59, 0xe5, 0x5e, 0x53, 0xa2, 0x0a, 0x4c, 0xb1,
|
||||||
0x72, 0x1a, 0xd7, 0x05, 0x84, 0x8e, 0x08, 0x62, 0xc8, 0x89, 0x42, 0x7c, 0x3b, 0x2b, 0xaa, 0x03,
|
0x26, 0x09, 0x2b, 0x21, 0x74, 0xc4, 0x10, 0x43, 0x8e, 0x04, 0xe2, 0xdb, 0x49, 0x52, 0xed, 0x6b,
|
||||||
0xc7, 0x09, 0x25, 0x22, 0x62, 0x73, 0x96, 0x23, 0x93, 0x99, 0x9c, 0x11, 0xf6, 0x91, 0xe2, 0xeb,
|
0x94, 0x12, 0xcc, 0x23, 0x76, 0x4d, 0x0b, 0xcf, 0xdc, 0x4c, 0xce, 0x04, 0xfb, 0x40, 0xd0, 0x65,
|
||||||
0xc8, 0x9a, 0x4d, 0x70, 0x60, 0x2d, 0x5a, 0xe0, 0xcc, 0xe8, 0x02, 0x29, 0x36, 0x25, 0x09, 0x7a,
|
0x24, 0xa3, 0x33, 0x1c, 0x68, 0x8b, 0x94, 0x28, 0x37, 0xb2, 0xc0, 0x15, 0x9b, 0xe1, 0xd4, 0x7b,
|
||||||
0x22, 0x9c, 0x69, 0x58, 0xd1, 0xe4, 0x70, 0x70, 0x63, 0xa4, 0x4e, 0xe3, 0x18, 0xda, 0x19, 0x7a,
|
0xc4, 0x35, 0xd5, 0xb0, 0xb2, 0x2d, 0xc0, 0x71, 0x13, 0x4f, 0x7a, 0xe3, 0x14, 0xaa, 0x14, 0x3d,
|
||||||
0x42, 0xcc, 0x71, 0x6c, 0xcf, 0x23, 0x82, 0x28, 0xc4, 0x3a, 0x11, 0x7d, 0x6c, 0x88, 0x0a, 0x48,
|
0x23, 0xae, 0x51, 0x62, 0xaf, 0xc3, 0x83, 0x28, 0xc4, 0x3a, 0x1e, 0x7d, 0x6c, 0x88, 0x0c, 0x48,
|
||||||
0x9d, 0x0f, 0x78, 0x50, 0x1f, 0x4d, 0x50, 0x9d, 0x83, 0xef, 0xf7, 0x7b, 0x0b, 0xa7, 0x80, 0xfc,
|
0xca, 0x06, 0x02, 0xc8, 0x8f, 0x66, 0x28, 0x65, 0xe0, 0xbb, 0xdd, 0xce, 0xc2, 0x49, 0x60, 0xbd,
|
||||||
0xb0, 0xc3, 0x37, 0xe1, 0xbd, 0xeb, 0x2f, 0x3d, 0x37, 0x58, 0xad, 0xdd, 0x45, 0x78, 0x3b, 0xe5,
|
0xdf, 0xa2, 0xab, 0xd5, 0x9d, 0x1b, 0x2e, 0x02, 0x37, 0x5a, 0xde, 0xb8, 0xfe, 0xea, 0x7a, 0x3e,
|
||||||
0xef, 0xc2, 0xb2, 0xe7, 0x78, 0xce, 0x77, 0x1e, 0xfc, 0xb1, 0x28, 0xe6, 0x51, 0xcf, 0x41, 0xd5,
|
0x5f, 0x85, 0xe5, 0xc0, 0x09, 0x9c, 0xb7, 0x01, 0xfc, 0xb1, 0x28, 0xce, 0xa3, 0x9e, 0x82, 0xca,
|
||||||
0xc4, 0x24, 0x19, 0x63, 0x77, 0x59, 0xc3, 0xf5, 0xba, 0x76, 0x5c, 0xf8, 0xb7, 0xdc, 0xc2, 0x0e,
|
0x85, 0x71, 0x3a, 0xc5, 0x6e, 0xf3, 0xb6, 0xd6, 0xfb, 0xda, 0xd6, 0xdc, 0xbe, 0xc5, 0x11, 0x2a,
|
||||||
0x22, 0x2a, 0x72, 0x8e, 0xab, 0xda, 0xda, 0x8f, 0xb3, 0xf4, 0x17, 0x0d, 0x48, 0x1b, 0xa2, 0x3d,
|
0x08, 0xcf, 0xc8, 0x6b, 0xd4, 0x30, 0xeb, 0x3c, 0x4e, 0xc2, 0x5e, 0x34, 0x20, 0x6b, 0xb1, 0xb6,
|
||||||
0xaf, 0x83, 0x40, 0x62, 0x81, 0x63, 0x64, 0x76, 0x45, 0xe4, 0x73, 0x0b, 0x5b, 0x91, 0x92, 0x62,
|
0x3c, 0x05, 0x81, 0x8b, 0x05, 0xdc, 0xc8, 0x9c, 0x0a, 0xbf, 0xcf, 0x2d, 0x6c, 0x83, 0x2b, 0x82,
|
||||||
0x3d, 0x48, 0x38, 0x14, 0x98, 0x9d, 0xd2, 0x5a, 0x05, 0x48, 0x69, 0x12, 0x3c, 0xd0, 0xcb, 0x00,
|
0xf4, 0x20, 0xad, 0x21, 0xc1, 0x54, 0x42, 0x6b, 0x11, 0xe0, 0x4a, 0x13, 0xe0, 0x91, 0x5c, 0x06,
|
||||||
0x27, 0x0a, 0x1a, 0xd4, 0x58, 0x53, 0x83, 0x98, 0xa8, 0x6c, 0x30, 0x53, 0xdd, 0x0d, 0x6a, 0xb8,
|
0x38, 0x13, 0xd0, 0xa0, 0xa6, 0x92, 0x1a, 0xc4, 0x4c, 0x64, 0x83, 0x99, 0xcb, 0x6e, 0x50, 0xe3,
|
||||||
0x08, 0x03, 0xd6, 0x41, 0x6a, 0x0c, 0x1f, 0xaf, 0xb2, 0x47, 0xa8, 0xe5, 0x42, 0xf6, 0xd1, 0xa0,
|
0x4d, 0x18, 0xb0, 0x0e, 0x52, 0x53, 0xf8, 0x74, 0x97, 0x03, 0x42, 0x6e, 0x17, 0x6e, 0x1f, 0x0d,
|
||||||
0xdf, 0x42, 0xc0, 0x6f, 0x21, 0xe0, 0xb7, 0x10, 0xf0, 0x7f, 0x18, 0x02, 0x16, 0x42, 0x3d, 0x0c,
|
0xfa, 0x3d, 0x04, 0xfc, 0x1e, 0x02, 0x7e, 0x0f, 0x01, 0xff, 0x87, 0x21, 0xc0, 0xd7, 0x95, 0x58,
|
||||||
0xa5, 0x2c, 0x6f, 0xad, 0xba, 0xe1, 0x4f, 0x39, 0x81, 0x2a, 0xcd, 0xb9, 0xc9, 0xa1, 0x50, 0x56,
|
0x37, 0xab, 0xcd, 0x7a, 0xbf, 0x81, 0xbc, 0xe3, 0xfe, 0x34, 0x60, 0xe4, 0xb8, 0xf7, 0x0b, 0x8f,
|
||||||
0xe0, 0xf5, 0x0a, 0x3c, 0xe9, 0xb6, 0xb5, 0xc8, 0xfb, 0x52, 0x43, 0xe2, 0x2e, 0x33, 0x4c, 0x9b,
|
0x27, 0x1b, 0x3a, 0x33, 0x14, 0xb9, 0xb3, 0x5f, 0x1c, 0xbd, 0xa5, 0x82, 0x78, 0x39, 0xde, 0x41,
|
||||||
0xf5, 0xdd, 0x55, 0x26, 0x89, 0x9b, 0x63, 0xf2, 0xbd, 0x60, 0x75, 0x95, 0x4b, 0x21, 0x67, 0xd9,
|
0xfd, 0x5f, 0xe3, 0x42, 0xa5, 0x7f, 0x5e, 0x2d, 0x3b, 0x02, 0x00, 0x11, 0x84, 0x37, 0x63, 0x42,
|
||||||
0x82, 0xbb, 0xeb, 0x1a, 0x2a, 0xe4, 0x2c, 0x5b, 0xb8, 0x5c, 0x5f, 0x67, 0x93, 0xc8, 0xcb, 0x65,
|
0x7f, 0x35, 0x27, 0x15, 0x30, 0x41, 0x6c, 0x2d, 0x25, 0xe9, 0x55, 0xa2, 0x63, 0x51, 0x2b, 0x09,
|
||||||
0xa1, 0xaf, 0xab, 0xed, 0xe4, 0x02, 0x7b, 0x59, 0xa0, 0x1c, 0xad, 0x74, 0x91, 0x8c, 0x7c, 0x0e,
|
0x4e, 0x03, 0x63, 0x55, 0x3a, 0x8e, 0x59, 0xf3, 0xea, 0xd1, 0x30, 0xce, 0xbd, 0x68, 0xc4, 0x55,
|
||||||
0x65, 0xf7, 0x22, 0x47, 0xa2, 0x18, 0xd3, 0x40, 0x79, 0xb7, 0x58, 0xe4, 0x27, 0x43, 0x86, 0x32,
|
0xc3, 0x99, 0x17, 0x06, 0x9d, 0x35, 0x21, 0x52, 0x08, 0x91, 0x8b, 0x8d, 0x33, 0xb3, 0xde, 0xdf,
|
||||||
0xb2, 0xaf, 0x23, 0x41, 0xda, 0x95, 0xc7, 0x88, 0xab, 0x8e, 0x89, 0x62, 0x3e, 0xa1, 0xf5, 0x90,
|
0xe5, 0xf8, 0x68, 0x60, 0x7c, 0xd0, 0xfb, 0x32, 0xe3, 0x1a, 0x27, 0x5c, 0x7e, 0xe6, 0x85, 0x91,
|
||||||
0x70, 0x11, 0x4e, 0x49, 0x25, 0x4c, 0x12, 0x5b, 0x53, 0x29, 0xfa, 0xae, 0x10, 0xb4, 0xa8, 0x3b,
|
0xce, 0xd3, 0x16, 0x82, 0x5d, 0x06, 0xb2, 0x0e, 0x8d, 0x12, 0x05, 0x82, 0xa8, 0x85, 0xb1, 0xa9,
|
||||||
0x0d, 0xce, 0xbd, 0xe0, 0xee, 0x6a, 0x3d, 0x14, 0x2d, 0x6e, 0xd7, 0x46, 0x70, 0x86, 0x82, 0x81,
|
0x49, 0x20, 0x83, 0x7b, 0xc8, 0x7a, 0xff, 0x00, 0x94, 0x2a, 0xa5, 0x53, 0x84, 0x07, 0x6f, 0x1d,
|
||||||
0x54, 0x0d, 0xaf, 0x91, 0xef, 0xb5, 0x16, 0x43, 0xd0, 0x21, 0xf6, 0x19, 0x39, 0x99, 0x32, 0x53,
|
0x69, 0xd0, 0xad, 0x94, 0x1a, 0x84, 0x3d, 0x78, 0xbb, 0x16, 0x8a, 0x72, 0xf1, 0x73, 0xc8, 0x00,
|
||||||
0x0c, 0x2e, 0x8b, 0x14, 0xf9, 0x81, 0xae, 0x4e, 0x97, 0x92, 0x28, 0x05, 0x0d, 0xfa, 0xf6, 0x50,
|
0x7d, 0x91, 0x11, 0x7a, 0xeb, 0x23, 0x60, 0x4c, 0x6e, 0x78, 0x1b, 0x88, 0x59, 0x5c, 0x60, 0xb0,
|
||||||
0x07, 0x82, 0x58, 0x4d, 0x88, 0xb9, 0x89, 0x81, 0xff, 0x3d, 0xa6, 0x97, 0xc5, 0x11, 0xf9, 0x5f,
|
0x42, 0x7a, 0xe8, 0xcc, 0x2f, 0x48, 0x74, 0x7d, 0x51, 0x5a, 0x4b, 0xb5, 0xcb, 0x9f, 0xb0, 0x0f,
|
||||||
0x3e, 0x04, 0x9d, 0x4f, 0x86, 0xe0, 0x92, 0x00, 0x59, 0x6b, 0x17, 0xed, 0x58, 0x8f, 0x68, 0xa3,
|
0xa8, 0x77, 0x94, 0x96, 0x05, 0x29, 0xb8, 0xac, 0x9c, 0x93, 0x92, 0x1a, 0xcb, 0x98, 0x04, 0xa0,
|
||||||
0x29, 0xfc, 0x3b, 0xa5, 0x9d, 0xd8, 0x57, 0xb4, 0x6f, 0xb2, 0xac, 0xb5, 0x1d, 0x4a, 0xb0, 0xcb,
|
0xb6, 0x28, 0x7b, 0x9f, 0x17, 0x1e, 0x8d, 0x97, 0x60, 0x9e, 0x10, 0x77, 0x22, 0x63, 0x15, 0xb5,
|
||||||
0x5d, 0x45, 0x9b, 0x53, 0x66, 0xed, 0xef, 0x9d, 0x67, 0x54, 0x87, 0xd3, 0xc8, 0x8e, 0xad, 0xf9,
|
0x48, 0x13, 0x4b, 0x50, 0xef, 0xf3, 0x56, 0x19, 0xd9, 0x9d, 0x20, 0x2c, 0xa3, 0x9a, 0x75, 0x7a,
|
||||||
0x04, 0x05, 0xff, 0x42, 0xb6, 0x18, 0x94, 0x79, 0xd5, 0x47, 0x58, 0x19, 0xdc, 0xfb, 0x3a, 0x6b,
|
0xa4, 0x9b, 0x6c, 0x82, 0xab, 0x40, 0xf5, 0x7e, 0x4a, 0x78, 0x82, 0xeb, 0x9d, 0xfe, 0x08, 0x5a,
|
||||||
0x4a, 0x52, 0x08, 0x5d, 0x8a, 0x27, 0xa1, 0x9c, 0xa8, 0xd8, 0x0c, 0xa0, 0x26, 0x2f, 0x3a, 0xfc,
|
0x64, 0x57, 0x3a, 0x97, 0xbd, 0xfe, 0xf7, 0x78, 0x28, 0xaf, 0x2e, 0x4d, 0xeb, 0xd5, 0x18, 0x1c,
|
||||||
0x91, 0xe3, 0xb2, 0x35, 0x9f, 0x22, 0xf1, 0xdf, 0x65, 0x21, 0xae, 0x66, 0x15, 0x8a, 0x89, 0xb8,
|
0xa4, 0xe1, 0xd7, 0x8d, 0x69, 0xeb, 0x71, 0x53, 0x50, 0x3b, 0x07, 0x77, 0x4b, 0xae, 0xc2, 0xea,
|
||||||
0x32, 0xb4, 0xb2, 0xa6, 0x97, 0xb7, 0xb5, 0x2a, 0x52, 0xa0, 0xcb, 0x42, 0x34, 0x13, 0xe9, 0xfe,
|
0xf8, 0x0e, 0x6a, 0xf0, 0xab, 0xb3, 0x13, 0xaf, 0xaf, 0x37, 0xb3, 0x3e, 0x93, 0x99, 0x75, 0x15,
|
||||||
0x0c, 0x89, 0x0b, 0xf3, 0xba, 0xd5, 0x23, 0xdd, 0x86, 0x94, 0xe2, 0x24, 0xea, 0xb2, 0x48, 0xa8,
|
0x3a, 0x9e, 0xf3, 0xc4, 0xd4, 0x6b, 0x23, 0x34, 0x77, 0x6e, 0x2f, 0x0a, 0x82, 0x57, 0xc8, 0x6e,
|
||||||
0xb8, 0x02, 0xa0, 0xf3, 0x1f, 0xa1, 0xb0, 0xaf, 0x6f, 0x74, 0xb5, 0x7f, 0xfb, 0xef, 0xe1, 0x50,
|
0x6a, 0x8d, 0x71, 0xf7, 0x02, 0x22, 0xf2, 0x55, 0x14, 0xdd, 0x39, 0xd1, 0x22, 0x84, 0xbf, 0xab,
|
||||||
0x25, 0x77, 0x4d, 0x8b, 0x38, 0x81, 0x10, 0x52, 0x89, 0x84, 0x6c, 0x1a, 0x9f, 0xc2, 0x19, 0x3a,
|
0xf7, 0xd3, 0xe5, 0xd5, 0x34, 0xbe, 0xf6, 0x21, 0x03, 0x55, 0x8b, 0x7e, 0x8d, 0x57, 0xd2, 0x43,
|
||||||
0x9b, 0x40, 0x40, 0x8a, 0x6f, 0xfc, 0xf2, 0xf4, 0xfe, 0x11, 0xf3, 0x9b, 0x59, 0xc6, 0xdb, 0xdb,
|
0x8d, 0xaa, 0x4e, 0x40, 0xc4, 0x7d, 0xc2, 0xeb, 0x31, 0x0e, 0x02, 0x8f, 0xe7, 0xa5, 0x39, 0x4e,
|
||||||
0xed, 0xa4, 0x13, 0x67, 0xb8, 0x6e, 0x7c, 0x07, 0x39, 0xcf, 0xb0, 0xde, 0x1a, 0xa5, 0x45, 0xf8,
|
0x75, 0xf3, 0x84, 0x5f, 0x64, 0x6d, 0x13, 0xfb, 0x91, 0x34, 0x2e, 0x85, 0x95, 0xc6, 0x34, 0x26,
|
||||||
0x43, 0x81, 0xe7, 0xbd, 0x41, 0x77, 0x73, 0x1b, 0x1b, 0xf6, 0x77, 0x20, 0x67, 0xdd, 0x04, 0xc1,
|
0xb9, 0x83, 0x3f, 0x50, 0xe7, 0x1a, 0x92, 0x7c, 0x3f, 0xe5, 0x31, 0x66, 0x51, 0xcc, 0xd6, 0x58,
|
||||||
0xbd, 0x13, 0x2c, 0x7d, 0xf8, 0x09, 0x3f, 0x8c, 0xa7, 0xef, 0xd8, 0xc4, 0xdc, 0xc7, 0x14, 0x4c,
|
0xac, 0x95, 0x33, 0x09, 0xb0, 0xc6, 0x9a, 0x66, 0x1e, 0x20, 0xf6, 0x3c, 0xbe, 0x62, 0xf0, 0xc1,
|
||||||
0x2d, 0x3b, 0x5a, 0xa8, 0x60, 0x72, 0x77, 0x24, 0x44, 0x66, 0x5c, 0x71, 0x63, 0x55, 0x3b, 0x24,
|
0x40, 0xa5, 0x24, 0x7b, 0x5b, 0x2f, 0xd3, 0xb6, 0x83, 0xd0, 0x4d, 0xc8, 0x75, 0xb3, 0x74, 0xa2,
|
||||||
0x9b, 0x17, 0x24, 0xd1, 0xed, 0x25, 0x91, 0xea, 0x9b, 0x2a, 0x5a, 0x04, 0xca, 0xed, 0x3a, 0xac,
|
0xd5, 0x72, 0xd0, 0xcd, 0x30, 0x8d, 0xeb, 0x45, 0x73, 0x5d, 0xbd, 0x9c, 0xeb, 0xea, 0xce, 0x81,
|
||||||
0x72, 0xb3, 0x21, 0xc9, 0x3d, 0xfc, 0x81, 0x80, 0x61, 0x48, 0xb2, 0xc3, 0x58, 0xc6, 0x50, 0x44,
|
0x2b, 0xd0, 0x81, 0x2b, 0xf0, 0x09, 0xa6, 0xe2, 0x90, 0x5f, 0x23, 0xea, 0x72, 0x01, 0x1c, 0x97,
|
||||||
0x3e, 0x99, 0x63, 0xb9, 0x51, 0x14, 0x0a, 0xac, 0xb1, 0xa6, 0xdd, 0x09, 0x88, 0x83, 0xc8, 0x40,
|
0x2f, 0xe1, 0x1a, 0xbd, 0x82, 0xeb, 0x39, 0xe3, 0x98, 0x71, 0x85, 0x1b, 0xf6, 0x35, 0xfb, 0x8f,
|
||||||
0x04, 0x4e, 0xa1, 0xd7, 0x15, 0x6d, 0x07, 0xdb, 0x2e, 0xe3, 0xc6, 0x8c, 0xb4, 0x8d, 0x2f, 0x6c,
|
0x16, 0x77, 0xce, 0xcd, 0x2d, 0xfc, 0xff, 0x04, 0x4b, 0x61, 0x5c, 0x2f, 0x66, 0xb8, 0x5a, 0x39,
|
||||||
0xb3, 0x72, 0x82, 0x70, 0xd5, 0xdb, 0xa6, 0x67, 0x13, 0x76, 0xd1, 0x52, 0xc3, 0xd7, 0x4b, 0x0d,
|
0xea, 0xef, 0x13, 0x2c, 0x4f, 0x38, 0xcf, 0x21, 0x25, 0x78, 0x8d, 0x4e, 0x57, 0x5c, 0x9f, 0x70,
|
||||||
0xef, 0x1d, 0x28, 0x12, 0x1c, 0x28, 0x12, 0x9e, 0x11, 0x2a, 0x37, 0xf9, 0x2d, 0xaa, 0xae, 0x96,
|
0x5a, 0x77, 0x17, 0xf9, 0x56, 0x5e, 0x68, 0xba, 0x0d, 0xda, 0xcc, 0x2b, 0x08, 0xff, 0x06, 0xa6,
|
||||||
0x20, 0x71, 0xf5, 0x1a, 0xa9, 0xc1, 0x1b, 0xa4, 0xce, 0x39, 0xc7, 0x44, 0x2a, 0xd4, 0x20, 0x6f,
|
0x40, 0x47, 0x2f, 0xd0, 0x30, 0x79, 0x27, 0x98, 0xae, 0x85, 0xba, 0x67, 0x02, 0x41, 0x14, 0x8e,
|
||||||
0x59, 0x7f, 0xb0, 0xbc, 0x77, 0xd6, 0x77, 0xf0, 0xef, 0x19, 0x91, 0xd2, 0xb9, 0x5e, 0x2d, 0x30,
|
0x89, 0x24, 0xc7, 0x09, 0xa5, 0x59, 0xe6, 0xe8, 0x2d, 0x26, 0xe4, 0xeb, 0x73, 0xe4, 0x6b, 0x43,
|
||||||
0x0c, 0x9d, 0xee, 0xe7, 0x19, 0x91, 0x67, 0x92, 0x65, 0x50, 0x34, 0xbd, 0xc5, 0xa6, 0xa1, 0xb0,
|
0xbe, 0x1c, 0x93, 0x87, 0x73, 0xe2, 0x50, 0x93, 0xde, 0x4c, 0x48, 0xfd, 0x33, 0x9c, 0xf5, 0x9d,
|
||||||
0x27, 0xec, 0xd6, 0xfd, 0x55, 0xb9, 0x25, 0xf2, 0x4d, 0x3f, 0x46, 0xbb, 0x79, 0x09, 0x09, 0xc0,
|
0x51, 0x9d, 0xac, 0xcd, 0xa9, 0xdb, 0x71, 0xd8, 0x1e, 0xbf, 0xe8, 0x02, 0x41, 0x14, 0x4e, 0x89,
|
||||||
0xc0, 0x34, 0x68, 0x65, 0x40, 0x2a, 0x59, 0x95, 0x27, 0xe4, 0x69, 0x90, 0xca, 0x13, 0xa6, 0xd3,
|
0x26, 0xdb, 0xe3, 0x94, 0x66, 0x73, 0xa7, 0x41, 0x89, 0x86, 0x7c, 0x4e, 0x6d, 0x88, 0x17, 0x33,
|
||||||
0xd3, 0xe5, 0x1e, 0x4f, 0x12, 0xf9, 0x43, 0x22, 0x35, 0xc7, 0x88, 0xd2, 0x4c, 0x7c, 0x42, 0xcb,
|
0xe2, 0xf5, 0x9c, 0x7a, 0x6d, 0xc8, 0x6f, 0xa7, 0xe4, 0xd1, 0x94, 0x38, 0x12, 0xa4, 0xa2, 0xd5,
|
||||||
0x11, 0xf9, 0x66, 0x8e, 0x7c, 0x63, 0xc8, 0x57, 0x43, 0x72, 0x7f, 0x4a, 0x6c, 0xb4, 0x0d, 0x47,
|
0xc9, 0x35, 0x20, 0x9b, 0x9e, 0xb2, 0x4b, 0xc2, 0xc7, 0x0a, 0x25, 0x14, 0x61, 0xe3, 0x04, 0x40,
|
||||||
0xa4, 0xb3, 0x9a, 0xf8, 0x96, 0x2a, 0xeb, 0x31, 0xc3, 0x2c, 0x7d, 0x47, 0x7e, 0xb6, 0xac, 0xd1,
|
0x21, 0x17, 0x47, 0xbb, 0x8f, 0x1d, 0xfa, 0xb7, 0x52, 0x24, 0xbb, 0xe7, 0x1a, 0xe9, 0xfd, 0xca,
|
||||||
0xa5, 0xd8, 0xde, 0x1e, 0x22, 0x5b, 0x7a, 0x92, 0xc8, 0x1f, 0x13, 0x8d, 0xb4, 0x10, 0x94, 0x46,
|
0x85, 0xf6, 0x23, 0xfa, 0x30, 0x9a, 0xd1, 0x87, 0x7a, 0x0f, 0xf2, 0x81, 0xa8, 0xb0, 0xe8, 0xcf,
|
||||||
0x85, 0x73, 0xbf, 0x0f, 0x86, 0x7c, 0x4a, 0xdd, 0x13, 0xaf, 0xc6, 0xd4, 0xeb, 0x31, 0xf1, 0x5a,
|
0xb1, 0x0f, 0x47, 0xec, 0x8f, 0x8d, 0x4d, 0x7e, 0x86, 0x5a, 0xde, 0xdc, 0x9c, 0x84, 0xbf, 0x07,
|
||||||
0xd3, 0x2e, 0x27, 0x82, 0x37, 0x53, 0xc9, 0x1b, 0x23, 0xfa, 0x6e, 0x4c, 0x1e, 0x8c, 0x89, 0x03,
|
0x8c, 0x1e, 0x08, 0xd6, 0x41, 0xa0, 0x50, 0xb9, 0xd8, 0xb2, 0x8d, 0x5b, 0x18, 0x5c, 0x81, 0x21,
|
||||||
0x49, 0x2a, 0x7b, 0xcf, 0xc2, 0x5a, 0xaa, 0x0b, 0xad, 0xda, 0x56, 0x62, 0xdc, 0xa1, 0xba, 0xd4,
|
0x16, 0x17, 0x23, 0xe4, 0xca, 0x20, 0xe5, 0x3b, 0xce, 0x08, 0xb9, 0x34, 0x48, 0x96, 0x91, 0x72,
|
||||||
0x67, 0x21, 0x75, 0xe6, 0x93, 0x20, 0x69, 0x53, 0x1b, 0x2b, 0x01, 0x1d, 0x72, 0x79, 0xb2, 0xdf,
|
0x84, 0x0a, 0x39, 0xaa, 0xad, 0x2a, 0x5c, 0x27, 0xa8, 0xc1, 0xd3, 0x9e, 0xb3, 0x41, 0xf4, 0x7e,
|
||||||
0x1d, 0xfc, 0xc5, 0x9d, 0xd2, 0xd8, 0xee, 0x91, 0x07, 0xda, 0x74, 0x4a, 0x8f, 0xc3, 0x80, 0xde,
|
0x8e, 0x91, 0x38, 0xb4, 0x55, 0x77, 0x79, 0xe7, 0x22, 0xec, 0x99, 0x08, 0x25, 0x40, 0x83, 0xeb,
|
||||||
0x0f, 0x26, 0xf4, 0xbe, 0x5e, 0xa2, 0x7a, 0xd0, 0xcb, 0x2d, 0xfa, 0x39, 0xf1, 0xfe, 0x40, 0xfc,
|
0x0f, 0xfe, 0x1e, 0x06, 0x6b, 0x27, 0x0c, 0x97, 0x4e, 0x18, 0x59, 0xa1, 0xc9, 0xa6, 0xe6, 0x1e,
|
||||||
0xa9, 0xb2, 0xc9, 0x67, 0xa8, 0x55, 0x85, 0x21, 0x48, 0xc4, 0xfb, 0xcd, 0xe0, 0x41, 0x67, 0xe3,
|
0x3f, 0x30, 0xbc, 0x79, 0x96, 0xe1, 0x7a, 0xe5, 0xdc, 0xae, 0x9c, 0xbb, 0xbb, 0x97, 0x70, 0xbb,
|
||||||
0x79, 0x1d, 0x2a, 0x93, 0x4b, 0xb6, 0x71, 0x4b, 0x83, 0x13, 0x25, 0x6b, 0x93, 0x0f, 0x90, 0xa1,
|
0x7d, 0x96, 0x1b, 0xc4, 0xe1, 0x65, 0xe8, 0xd8, 0x31, 0xee, 0x32, 0xb7, 0xbb, 0xe7, 0x37, 0xbb,
|
||||||
0x41, 0xaa, 0x77, 0xb7, 0x01, 0x72, 0x65, 0x90, 0x75, 0x4a, 0x8b, 0x01, 0xca, 0x17, 0xa8, 0xa6,
|
0x86, 0xd8, 0xe6, 0x2c, 0x9e, 0x93, 0xcd, 0x0a, 0xc4, 0x17, 0x59, 0x9d, 0x8d, 0xbf, 0x53, 0x6e,
|
||||||
0x2c, 0x09, 0x8f, 0x71, 0x45, 0xc6, 0x6f, 0x04, 0x06, 0x71, 0x59, 0x64, 0x04, 0xcb, 0x3d, 0x0d,
|
0x56, 0x23, 0xd4, 0x9c, 0xc7, 0x99, 0x26, 0xab, 0x2c, 0xba, 0x2d, 0xda, 0x17, 0x1f, 0xd4, 0x99,
|
||||||
0xdb, 0xd9, 0x95, 0x6b, 0xb4, 0x28, 0x82, 0x4f, 0x90, 0x27, 0x87, 0x44, 0xeb, 0x20, 0xec, 0x8c,
|
0x49, 0x97, 0xd7, 0xfd, 0x9f, 0x2e, 0xa9, 0x3a, 0xf8, 0xfa, 0x1d, 0x42, 0xf5, 0xac, 0xc5, 0x1b,
|
||||||
0x23, 0xe3, 0xb4, 0x09, 0xa9, 0x12, 0xd4, 0xc7, 0xaa, 0x3e, 0x40, 0xf9, 0xde, 0xc6, 0xf1, 0xfd,
|
0x31, 0x98, 0x3b, 0xc9, 0x79, 0xfa, 0x2a, 0xff, 0x89, 0x87, 0x6b, 0x05, 0x4a, 0xbf, 0xeb, 0x21,
|
||||||
0x95, 0x03, 0x55, 0x7a, 0x1f, 0xa0, 0x6c, 0x6a, 0x11, 0xa2, 0x7a, 0x81, 0xeb, 0x17, 0x05, 0x6e,
|
0xff, 0x1b, 0x8a, 0x3e, 0x0b, 0xa8, 0xcb, 0x3d, 0x0b, 0x64, 0x0a, 0x3d, 0x0b, 0x36, 0x94, 0x78,
|
||||||
0x42, 0xe7, 0x2e, 0x74, 0xee, 0xef, 0x5f, 0x23, 0xed, 0xee, 0x45, 0x69, 0x90, 0x38, 0x56, 0xbe,
|
0x16, 0x50, 0x16, 0x77, 0x16, 0x40, 0x97, 0x6f, 0x36, 0x88, 0x17, 0x6e, 0xd6, 0xd8, 0x2a, 0x55,
|
||||||
0x63, 0x07, 0xe5, 0xeb, 0xd2, 0xee, 0x5f, 0x5e, 0xec, 0x06, 0x82, 0xb1, 0xb3, 0x7c, 0x49, 0x37,
|
0xb9, 0x39, 0x70, 0xef, 0x13, 0xc5, 0x9a, 0xbc, 0x22, 0x9b, 0xce, 0x82, 0xa4, 0xad, 0x7a, 0x66,
|
||||||
0x2b, 0x73, 0x5c, 0x15, 0x35, 0x9b, 0x30, 0xc6, 0xd2, 0xac, 0xde, 0xb6, 0xd9, 0x8f, 0x99, 0xbe,
|
0xf4, 0xc3, 0x55, 0xb3, 0xb1, 0x10, 0x15, 0xf0, 0x80, 0x85, 0x4f, 0xb1, 0x98, 0xe3, 0x4e, 0xef,
|
||||||
0xb9, 0xea, 0xa3, 0x58, 0xb4, 0xaf, 0xde, 0xa8, 0x19, 0xa6, 0xeb, 0xf3, 0xfe, 0x4f, 0xa7, 0xdc,
|
0x59, 0xd7, 0xce, 0x47, 0xdd, 0xc9, 0x9b, 0xa5, 0x82, 0x82, 0xaa, 0x72, 0xf1, 0x68, 0x79, 0x8f,
|
||||||
0xd3, 0x4c, 0xc4, 0x15, 0xf5, 0x2b, 0xea, 0x53, 0x1d, 0x5c, 0xd8, 0x6f, 0xfb, 0x9a, 0xb4, 0xbf,
|
0x6d, 0xce, 0x8c, 0x14, 0xdc, 0xef, 0x77, 0x6d, 0xa9, 0xaa, 0x84, 0x76, 0x4b, 0x12, 0x6f, 0x8b,
|
||||||
0xaa, 0x5b, 0x40, 0x7d, 0x49, 0xb7, 0x40, 0xe6, 0x7a, 0x6e, 0xc1, 0xfa, 0x8b, 0xb9, 0x05, 0x54,
|
0x1f, 0x09, 0xae, 0xaf, 0xfc, 0xa5, 0x1b, 0xb8, 0x7e, 0xe4, 0x86, 0x3c, 0x6d, 0x56, 0xb2, 0x89,
|
||||||
0x57, 0x72, 0x0b, 0xa0, 0x2f, 0xdd, 0x36, 0x48, 0x5c, 0xb7, 0xad, 0xb1, 0xd5, 0x60, 0x10, 0x3b,
|
0xc4, 0xe7, 0xac, 0xcc, 0x51, 0x03, 0x25, 0x12, 0x05, 0x05, 0x7d, 0x8e, 0x75, 0x3e, 0x07, 0x01,
|
||||||
0x2e, 0xce, 0xa0, 0xbc, 0x57, 0xaa, 0xb4, 0x5d, 0xb5, 0x16, 0x24, 0x69, 0xba, 0xc7, 0xe1, 0x85,
|
0x2f, 0x16, 0xa0, 0x17, 0x27, 0x0b, 0x77, 0xce, 0xfa, 0xd6, 0x89, 0xc2, 0x8b, 0xe9, 0xd7, 0xb0,
|
||||||
0x1f, 0x56, 0x5b, 0x0b, 0x51, 0x82, 0x0c, 0x98, 0xf8, 0x1c, 0x49, 0x1e, 0x77, 0x9c, 0xfb, 0x5d,
|
0x80, 0xce, 0xed, 0x5e, 0xb9, 0xc0, 0xf3, 0x19, 0x9e, 0x5a, 0x62, 0x14, 0x54, 0xec, 0x45, 0xfe,
|
||||||
0xbb, 0x46, 0x76, 0x47, 0x2f, 0xcd, 0x1d, 0x14, 0x4c, 0x95, 0xc9, 0xa7, 0xe6, 0x07, 0x62, 0x4b,
|
0x8b, 0xd0, 0x22, 0x5e, 0xd7, 0x3e, 0xc7, 0x8f, 0x20, 0x77, 0x2c, 0x7e, 0x77, 0x8f, 0xe2, 0xbd,
|
||||||
0xae, 0x69, 0x2e, 0x8e, 0xf7, 0xbe, 0x29, 0xba, 0x3b, 0x4d, 0xb3, 0xa3, 0x31, 0xda, 0x91, 0x27,
|
0xf3, 0x08, 0x91, 0xda, 0x60, 0x75, 0x59, 0xc4, 0x15, 0x08, 0xb7, 0x82, 0x22, 0xb4, 0xfb, 0x7c,
|
||||||
0x4a, 0xf8, 0xcd, 0x62, 0xe5, 0x7a, 0xee, 0x22, 0x70, 0x7d, 0x51, 0xca, 0x77, 0xba, 0xc9, 0x62,
|
0x4f, 0x14, 0x22, 0xe1, 0x12, 0x3c, 0xec, 0x0e, 0xa2, 0xd2, 0x6a, 0x61, 0xed, 0x6f, 0x34, 0xcd,
|
||||||
0x6c, 0x56, 0xe7, 0xa0, 0x82, 0x2b, 0x1e, 0x03, 0x03, 0x7d, 0x89, 0x74, 0x8d, 0x09, 0x61, 0x2f,
|
0x12, 0x44, 0xfb, 0x16, 0x2f, 0x82, 0xd5, 0x3a, 0xfa, 0xd9, 0x2f, 0xaa, 0x8e, 0xea, 0x83, 0x0c,
|
||||||
0x92, 0xa0, 0x57, 0x17, 0x30, 0xf7, 0xce, 0xe6, 0xce, 0x09, 0xfc, 0xab, 0x25, 0x61, 0x3f, 0x81,
|
0xfb, 0xe9, 0x70, 0xf2, 0xac, 0xc6, 0x5f, 0xd5, 0x7c, 0xfd, 0xa6, 0xf2, 0x39, 0x96, 0x8f, 0x2a,
|
||||||
0xae, 0x37, 0xdf, 0x38, 0xc1, 0xcb, 0x55, 0x67, 0x37, 0xc5, 0x20, 0x6e, 0xd8, 0x93, 0xfc, 0x17,
|
0xc0, 0x8d, 0x5f, 0xe4, 0x90, 0x26, 0xe2, 0x74, 0xf6, 0xe0, 0x62, 0xe1, 0xec, 0x99, 0x4a, 0x34,
|
||||||
0xd1, 0x43, 0xbe, 0x89, 0x7e, 0x89, 0x9e, 0x40, 0xef, 0x48, 0x7e, 0x6e, 0x9f, 0xe4, 0x2b, 0xf5,
|
0x08, 0x2b, 0xc3, 0x0c, 0xbd, 0x4b, 0x7f, 0xd5, 0xff, 0x89, 0xdf, 0x89, 0xc8, 0xb9, 0xaa, 0x6a,
|
||||||
0x09, 0xe2, 0xb5, 0xc1, 0xea, 0xab, 0x9a, 0x30, 0x20, 0xe4, 0x86, 0x8e, 0xd0, 0xee, 0xce, 0x3e,
|
0xbc, 0x83, 0x42, 0x4e, 0xee, 0x17, 0xaa, 0xf1, 0x0c, 0x17, 0x38, 0x4e, 0x51, 0x7d, 0x7f, 0xdd,
|
||||||
0x73, 0x39, 0xf2, 0x57, 0x70, 0x88, 0xee, 0x21, 0xf0, 0x84, 0x4b, 0x6b, 0x7d, 0x03, 0x36, 0x4b,
|
0xf9, 0xfc, 0x9f, 0xc1, 0x30, 0x6e, 0x5e, 0x9e, 0xa0, 0xce, 0xef, 0x97, 0xb1, 0x3d, 0x8c, 0x19,
|
||||||
0x11, 0xfd, 0xb6, 0x29, 0xde, 0x8a, 0xba, 0x79, 0xf4, 0x63, 0x6d, 0x50, 0x9e, 0xba, 0xaf, 0xd1,
|
0xdf, 0xbe, 0x9c, 0xf1, 0xdc, 0x1e, 0xce, 0x31, 0x1e, 0xec, 0x2c, 0x7c, 0xf6, 0xba, 0x39, 0x6b,
|
||||||
0xd8, 0x0f, 0xbe, 0xa3, 0xc7, 0x50, 0xf1, 0x16, 0xba, 0xd0, 0x2f, 0x61, 0x5f, 0x22, 0xf5, 0x14,
|
0xbd, 0x53, 0x23, 0x9b, 0xb2, 0x5d, 0x3e, 0x7f, 0x8b, 0xad, 0x6e, 0x9c, 0xf0, 0x66, 0xe1, 0x84,
|
||||||
0x06, 0xd2, 0x44, 0x3a, 0x87, 0xd2, 0x95, 0x24, 0x93, 0x67, 0x32, 0x0b, 0x67, 0x73, 0x76, 0xaa,
|
0xeb, 0xd5, 0x73, 0x6c, 0x27, 0xfe, 0x77, 0xf3, 0x5a, 0xff, 0x7b, 0x99, 0xb2, 0x6d, 0x17, 0x14,
|
||||||
0x41, 0xe4, 0xe8, 0x39, 0xf4, 0x2a, 0x17, 0xa1, 0x69, 0xe6, 0x94, 0x9c, 0xec, 0xe1, 0x72, 0xa9,
|
0x77, 0xe7, 0x8b, 0xfc, 0xef, 0x25, 0x37, 0xa8, 0x31, 0xa5, 0xa1, 0x0d, 0x73, 0xb3, 0x0c, 0xaa,
|
||||||
0xd6, 0x8b, 0xaa, 0x38, 0x25, 0x39, 0x89, 0x12, 0xcc, 0x1f, 0x6e, 0xdb, 0x85, 0xf8, 0xd5, 0x3b,
|
0x23, 0x18, 0x50, 0x53, 0x7c, 0x96, 0xdd, 0x0d, 0xd3, 0x70, 0x19, 0x9a, 0x27, 0x00, 0xea, 0x05,
|
||||||
0xc6, 0xfa, 0xf5, 0x45, 0xf3, 0x34, 0x85, 0x0c, 0xfd, 0x61, 0x28, 0xf8, 0xee, 0xf5, 0x82, 0xa7,
|
0x81, 0x6e, 0x87, 0x20, 0xb1, 0xb1, 0x59, 0x77, 0x44, 0xd6, 0xf6, 0x12, 0x29, 0x27, 0xf0, 0x7a,
|
||||||
0xfe, 0x30, 0x27, 0xb8, 0xf7, 0x33, 0xff, 0xc5, 0x8c, 0x32, 0xeb, 0xbd, 0x63, 0x27, 0x1b, 0x8b,
|
0x64, 0x52, 0xb5, 0x44, 0xe7, 0xea, 0x00, 0xdd, 0xc6, 0x12, 0x73, 0x4e, 0xf6, 0x1c, 0x9d, 0x5c,
|
||||||
0x5d, 0xbd, 0x9c, 0xa8, 0xc2, 0xb5, 0xe3, 0xaf, 0x97, 0x8e, 0xbf, 0x09, 0x5f, 0x12, 0x3b, 0x3a,
|
0xcf, 0x33, 0x77, 0x7b, 0xce, 0xc5, 0x5c, 0x56, 0xa2, 0x4d, 0x82, 0xe7, 0x8e, 0xa8, 0xcf, 0x65,
|
||||||
0x7f, 0xeb, 0xb7, 0x9e, 0xbf, 0xd7, 0x19, 0xdb, 0x3e, 0x82, 0x32, 0x3d, 0xbe, 0xea, 0xfc, 0xbd,
|
0x7b, 0x67, 0x54, 0xb4, 0xbe, 0xb9, 0x15, 0x2a, 0x2a, 0x52, 0x29, 0xdc, 0xac, 0xaa, 0x58, 0x4c,
|
||||||
0x26, 0x49, 0x3e, 0xd3, 0xef, 0xac, 0xf2, 0x2f, 0x91, 0xec, 0x45, 0xad, 0xba, 0x4e, 0x53, 0x10,
|
0x45, 0x5b, 0x5c, 0xe0, 0x14, 0x06, 0xd1, 0x52, 0xb0, 0xca, 0xf7, 0x52, 0x37, 0xd1, 0x58, 0x37,
|
||||||
0xbe, 0xbb, 0x48, 0xa8, 0xec, 0xc3, 0x98, 0xa6, 0x51, 0xdf, 0x00, 0x02, 0x90, 0x22, 0xd0, 0x8d,
|
0x8b, 0xb9, 0x66, 0x24, 0xab, 0x37, 0xa2, 0xd5, 0xe5, 0x37, 0x0f, 0x18, 0xae, 0x7c, 0x2f, 0x6d,
|
||||||
0x1b, 0x2c, 0x97, 0x3b, 0xe9, 0xe3, 0xa8, 0x2e, 0x84, 0x42, 0x2a, 0x06, 0x71, 0x4f, 0x1a, 0xdd,
|
0xd0, 0x6e, 0xcd, 0xc6, 0xa3, 0xce, 0xee, 0xaa, 0x91, 0xe6, 0xc7, 0x9c, 0x24, 0xf7, 0xcf, 0xcd,
|
||||||
0xa6, 0x82, 0xb9, 0xeb, 0x86, 0x6e, 0xb9, 0x49, 0x9e, 0xb3, 0xcd, 0xa3, 0xeb, 0xf2, 0xe9, 0x05,
|
0x71, 0x81, 0xf0, 0x23, 0xad, 0x9f, 0xe7, 0x3d, 0x79, 0x48, 0x66, 0xf5, 0x18, 0xef, 0xb0, 0xcc,
|
||||||
0xc1, 0xe6, 0x91, 0xab, 0x5f, 0x0d, 0x0a, 0xe9, 0xae, 0x66, 0x1e, 0xd5, 0xd1, 0x23, 0x96, 0xb9,
|
0x91, 0x1f, 0x76, 0x5c, 0x96, 0xe9, 0x4d, 0x81, 0x48, 0xa9, 0xd1, 0xd9, 0x3e, 0xa0, 0xbb, 0xb5,
|
||||||
0xd2, 0x58, 0xa1, 0x4d, 0xbd, 0xe8, 0x0e, 0xa8, 0xe7, 0x8a, 0xc7, 0x67, 0xda, 0xc4, 0x79, 0xa2,
|
0xa9, 0x70, 0x45, 0xd5, 0x90, 0x85, 0x13, 0xac, 0x55, 0x12, 0xa9, 0xe6, 0xdc, 0x1b, 0x9f, 0x67,
|
||||||
0xd6, 0x33, 0xb9, 0xef, 0x2c, 0xc7, 0xab, 0x59, 0x5e, 0x91, 0x64, 0x7a, 0xc7, 0xd9, 0x41, 0x99,
|
0xee, 0x9a, 0x2c, 0xbc, 0xf9, 0xba, 0x5d, 0xb7, 0x51, 0x37, 0x78, 0x5a, 0xfc, 0x36, 0x49, 0x92,
|
||||||
0x33, 0x18, 0x9a, 0x73, 0x39, 0x35, 0xa6, 0x12, 0xf5, 0x8d, 0xec, 0xf0, 0x2d, 0xaa, 0x47, 0x02,
|
0xe1, 0x4d, 0x7f, 0xe8, 0x28, 0x2e, 0x83, 0x41, 0xaf, 0xfc, 0x0b, 0xa1, 0xcd, 0xb9, 0x6e, 0xf2,
|
||||||
0xb5, 0x03, 0x4a, 0x2a, 0xbc, 0xdf, 0xd4, 0xc3, 0x91, 0xdd, 0x1e, 0x5f, 0xd0, 0xea, 0xfb, 0x8c,
|
0x84, 0xeb, 0xd9, 0x0f, 0xf0, 0xb2, 0x68, 0x4a, 0x27, 0xbe, 0x75, 0x08, 0xf9, 0x47, 0x3f, 0xce,
|
||||||
0xc6, 0x0f, 0x2f, 0xf1, 0xb8, 0x40, 0xf8, 0x89, 0xf1, 0x97, 0x65, 0x8f, 0xbe, 0x47, 0x50, 0xf3,
|
0xf0, 0x29, 0xdb, 0x66, 0xd2, 0xe7, 0x9d, 0x34, 0x79, 0xf9, 0x6e, 0x97, 0x17, 0x18, 0x45, 0xaf,
|
||||||
0x21, 0xde, 0xa9, 0x53, 0x47, 0x7d, 0xaf, 0xe7, 0xba, 0x4e, 0xdf, 0xe4, 0x98, 0x16, 0x1a, 0x9d,
|
0xe5, 0x84, 0x26, 0x8c, 0x62, 0xfe, 0x49, 0x9e, 0xfe, 0x4e, 0x80, 0x3f, 0x57, 0x4c, 0xbf, 0xe2,
|
||||||
0x1e, 0x3c, 0xb6, 0xdf, 0x0c, 0xef, 0xea, 0xa9, 0x3f, 0xc2, 0x4e, 0xef, 0x5f, 0xdf, 0xf4, 0x34,
|
0x12, 0x3d, 0xdf, 0x1c, 0x6d, 0x71, 0x3e, 0x15, 0x21, 0x01, 0x3f, 0xa9, 0x61, 0xbb, 0x2c, 0x93,
|
||||||
0x3e, 0x5e, 0xc6, 0x31, 0x3f, 0xb7, 0xe6, 0xa9, 0xc8, 0xf3, 0x56, 0x9e, 0xf5, 0x6d, 0xa6, 0x15,
|
0x1f, 0x24, 0x4c, 0x39, 0x8b, 0xe6, 0x20, 0xff, 0x0a, 0xe5, 0x1f, 0xdf, 0x27, 0x5f, 0xae, 0xdd,
|
||||||
0x18, 0x72, 0x74, 0xb5, 0xd8, 0x5e, 0xbd, 0x4f, 0xfc, 0x07, 0x19, 0x67, 0x64, 0xb5, 0xd5, 0x29,
|
0xf1, 0x91, 0x0f, 0x8a, 0x13, 0x1f, 0x34, 0x86, 0xe6, 0x06, 0x7d, 0xbb, 0x5c, 0x2e, 0x37, 0xe3,
|
||||||
0x00, 0x00
|
0x6f, 0x06, 0x4c, 0x6b, 0x63, 0x81, 0x8f, 0x1b, 0xcb, 0x48, 0xc4, 0xaa, 0x66, 0x85, 0x99, 0x86,
|
||||||
|
0x72, 0x8a, 0x98, 0x28, 0x9d, 0x37, 0x76, 0x6b, 0xdc, 0x13, 0xda, 0xb7, 0xd5, 0x22, 0x3e, 0xc1,
|
||||||
|
0x7a, 0x42, 0xf8, 0xe6, 0xcb, 0xf5, 0xc5, 0xfb, 0xfe, 0x6d, 0x8a, 0xc3, 0xbe, 0x9a, 0x4e, 0x56,
|
||||||
|
0x5f, 0x22, 0x5c, 0x92, 0x20, 0x9a, 0xf8, 0x7f, 0xc8, 0x5b, 0xed, 0xc9, 0x54, 0xfe, 0xb3, 0x3a,
|
||||||
|
0x50, 0x41, 0x51, 0xb4, 0x1d, 0x93, 0xb9, 0x2e, 0x55, 0x27, 0xc4, 0x6e, 0xe2, 0x6f, 0xce, 0x87,
|
||||||
|
0xdd, 0x2d, 0x66, 0x07, 0x8c, 0xcb, 0x89, 0x79, 0x6c, 0x26, 0xaf, 0x23, 0xb6, 0xb6, 0xfd, 0x2d,
|
||||||
|
0x2b, 0x9f, 0x72, 0x26, 0xd0, 0xc4, 0x66, 0x7e, 0x9a, 0xdc, 0xa4, 0xc6, 0x7d, 0x53, 0xd8, 0xad,
|
||||||
|
0xfd, 0x21, 0x99, 0x38, 0x8d, 0xa7, 0x65, 0x1c, 0x5a, 0x5b, 0xb8, 0xf8, 0x86, 0x14, 0x15, 0x8f,
|
||||||
|
0x41, 0x90, 0x5f, 0xa9, 0xf6, 0xbf, 0x0d, 0xe3, 0xc5, 0xf9, 0x6e, 0x66, 0x63, 0xb2, 0xfd, 0xd5,
|
||||||
|
0xfb, 0x22, 0x44, 0x4e, 0x91, 0xba, 0x19, 0xf6, 0x66, 0x88, 0x28, 0x21, 0x5a, 0x24, 0x49, 0x7d,
|
||||||
|
0xea, 0xcc, 0xcb, 0x62, 0x10, 0x2c, 0x03, 0x4b, 0xe6, 0x25, 0x48, 0x3c, 0xe9, 0x1c, 0x6c, 0x2e,
|
||||||
|
0xb6, 0x0b, 0xfe, 0x03, 0x57, 0xef, 0xbc, 0xb8, 0x04, 0x2c, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
void serveBundleCss(AsyncWebServerRequest* request) {
|
void serveBundleCss(AsyncWebServerRequest* request) {
|
||||||
|
|
|
@ -4,24 +4,24 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Autogenerated do not edit!!
|
// Autogenerated do not edit!!
|
||||||
const uint16_t INDEX_HTML_L = 247;
|
const uint16_t INDEX_HTML_L = 242;
|
||||||
const uint8_t INDEX_HTML[] PROGMEM = {
|
const uint8_t INDEX_HTML[] PROGMEM = {
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x4d, 0x50, 0x3d, 0x53, 0xc3, 0x30,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x4d, 0x50, 0x31, 0x52, 0xc4, 0x30,
|
||||||
0x0c, 0xdd, 0xfb, 0x2b, 0x84, 0x66, 0xd2, 0xc0, 0xc6, 0x71, 0x76, 0x16, 0x5a, 0x56, 0x7a, 0x47,
|
0x0c, 0xec, 0xef, 0x15, 0x42, 0x35, 0x49, 0xa0, 0xa3, 0xb0, 0xd3, 0xc0, 0xd1, 0x72, 0x33, 0x1c,
|
||||||
0x19, 0x18, 0x5d, 0x5b, 0x60, 0x81, 0xe3, 0xe4, 0x6c, 0x91, 0x36, 0xff, 0x1e, 0x3b, 0x81, 0x83,
|
0x05, 0xa5, 0xcf, 0x16, 0x58, 0xe0, 0x38, 0x19, 0x5b, 0xe4, 0x2e, 0xbf, 0xc7, 0x4e, 0x60, 0xa0,
|
||||||
0x49, 0x1f, 0xef, 0xe9, 0x3d, 0x49, 0xea, 0x6a, 0xf7, 0xf4, 0x70, 0x7c, 0x3d, 0xec, 0xc1, 0x4b,
|
0xd2, 0x6a, 0xb5, 0xb3, 0x2b, 0x49, 0x5d, 0x3d, 0x3c, 0xdd, 0x1f, 0x5f, 0x0f, 0x7b, 0xf0, 0x32,
|
||||||
0x1f, 0xba, 0x8d, 0xaa, 0x01, 0x82, 0x89, 0xef, 0x1a, 0x29, 0x62, 0xb7, 0x01, 0x50, 0x9e, 0x8c,
|
0x84, 0x7e, 0xa7, 0x6a, 0x81, 0x60, 0xe2, 0xbb, 0x46, 0x8a, 0xd8, 0xef, 0x00, 0x94, 0x27, 0xe3,
|
||||||
0xab, 0x49, 0x49, 0x7b, 0x12, 0x03, 0xd6, 0x9b, 0x94, 0x49, 0x34, 0xbe, 0x1c, 0x1f, 0x9b, 0x3b,
|
0x2a, 0x28, 0x70, 0x20, 0x31, 0x60, 0xbd, 0x49, 0x99, 0x44, 0xe3, 0xcb, 0xf1, 0xb1, 0xb9, 0x43,
|
||||||
0x84, 0xf6, 0x3f, 0x18, 0x4d, 0x4f, 0x1a, 0x27, 0xa6, 0xf3, 0x38, 0x24, 0x41, 0xb0, 0x43, 0x14,
|
0xe8, 0xfe, 0x0f, 0xa3, 0x19, 0x48, 0xe3, 0xcc, 0x74, 0x9e, 0xc6, 0x24, 0x08, 0x76, 0x8c, 0x42,
|
||||||
0x8a, 0x85, 0x7c, 0x66, 0x27, 0x5e, 0x3b, 0x9a, 0xd8, 0x52, 0xb3, 0x14, 0xd7, 0xc0, 0x91, 0x85,
|
0xb1, 0x88, 0xcf, 0xec, 0xc4, 0x6b, 0x47, 0x33, 0x5b, 0x6a, 0xd6, 0xe6, 0x1a, 0x38, 0xb2, 0xb0,
|
||||||
0x4d, 0x68, 0xb2, 0x35, 0x81, 0xf4, 0xed, 0xf6, 0xe6, 0x4f, 0x4c, 0x58, 0x02, 0x75, 0xfb, 0xe7,
|
0x09, 0x4d, 0xb6, 0x26, 0x90, 0xbe, 0x6d, 0x6f, 0xfe, 0xcc, 0x84, 0x25, 0x50, 0xbf, 0x7f, 0x3e,
|
||||||
0x43, 0xa2, 0x4c, 0x31, 0xd3, 0x3d, 0xec, 0x96, 0xd1, 0xac, 0xda, 0x15, 0xaa, 0x9b, 0x05, 0x8e,
|
0x24, 0xca, 0x14, 0x33, 0xa9, 0x6e, 0x63, 0xea, 0x42, 0x81, 0xe3, 0x27, 0x24, 0x0a, 0x1a, 0xb3,
|
||||||
0x9f, 0x90, 0x28, 0x68, 0xcc, 0x32, 0x07, 0xca, 0x9e, 0xa8, 0x58, 0xca, 0x3c, 0x96, 0x15, 0x84,
|
0x2c, 0x81, 0xb2, 0x27, 0x2a, 0x49, 0xb2, 0x4c, 0x25, 0x59, 0xe8, 0x22, 0x9d, 0xcd, 0x19, 0xc1,
|
||||||
0x2e, 0xd2, 0xda, 0x9c, 0x11, 0x7c, 0xa2, 0x37, 0x8d, 0xa7, 0xaf, 0xe8, 0x02, 0x6d, 0x6b, 0xa7,
|
0x27, 0x7a, 0xd3, 0x78, 0xfa, 0x8a, 0x2e, 0x50, 0x5b, 0x99, 0x72, 0x5d, 0xf7, 0x7b, 0x8b, 0x3a,
|
||||||
0x9c, 0xd9, 0xfe, 0x1e, 0xa5, 0x4e, 0x83, 0x9b, 0x7f, 0x3c, 0x1d, 0x4f, 0xc0, 0x4e, 0xa3, 0x19,
|
0x8d, 0x6e, 0xf9, 0x89, 0x72, 0x3c, 0x03, 0x3b, 0x8d, 0x66, 0x9a, 0xb0, 0x57, 0x5d, 0x69, 0x57,
|
||||||
0x47, 0xec, 0x54, 0x5b, 0xca, 0x85, 0x91, 0x6d, 0xe2, 0x51, 0x00, 0x72, 0xb2, 0x1a, 0x39, 0x3a,
|
0x45, 0xb6, 0x89, 0x27, 0x01, 0xc8, 0xc9, 0x6a, 0xe4, 0xe8, 0xe8, 0xd2, 0x7e, 0xe4, 0x2a, 0xd8,
|
||||||
0xba, 0x6c, 0x3f, 0x72, 0x25, 0xac, 0x40, 0x55, 0x5b, 0x45, 0x8a, 0xea, 0xf2, 0xc4, 0x6f, 0xaf,
|
0x06, 0xd5, 0x6d, 0x33, 0x29, 0xae, 0xeb, 0xef, 0xbe, 0x01, 0xc3, 0xc9, 0x3d, 0xf3, 0x4c, 0x01,
|
||||||
0xf4, 0x09, 0x10, 0x55, 0x01, 0x00, 0x00
|
0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
void serveIndexHtml(AsyncWebServerRequest* request) {
|
void serveIndexHtml(AsyncWebServerRequest* request) {
|
||||||
|
|
2807
src/ui_index_js.h
2807
src/ui_index_js.h
File diff suppressed because it is too large
Load Diff
|
@ -2,6 +2,7 @@
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>ESPresense</title>
|
<title>ESPresense</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -1,16 +1,20 @@
|
||||||
<script>
|
<script>
|
||||||
import Router from "svelte-spa-router";
|
import Router, { push } from "svelte-spa-router";
|
||||||
import Sidebar from "./components/Sidebar.svelte";
|
import Sidebar from "./components/Sidebar.svelte";
|
||||||
import routes from "./routes";
|
import routes from "./routes";
|
||||||
|
|
||||||
|
function routeLoaded(event) {
|
||||||
|
if (event.detail.route == "/") push("/settings");
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<nav>
|
<nav>
|
||||||
<Sidebar />
|
<Sidebar />
|
||||||
</nav>
|
</nav>
|
||||||
<main class="max-w-7xl mx-auto py-8 sm:py-10 md:py-12 sm:px-10 lg:px-12">
|
<main class="max-w-7xl mx-auto py-8 sm:py-10 md:py-12 sm:px-10 lg:px-12">
|
||||||
<Router {routes} />
|
<Router {routes} on:routeLoaded={routeLoaded} />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -15,11 +15,11 @@
|
||||||
<path d="M116.3 165.3a62.5 62.5 0 0 0 35.2-102l-13.4 13.1a43.8 43.8 0 0 1 6.4 44.6 13 13 0 0 1-16.6 19.7 43.7 43.7 0 1 1 4.2-70.4l13.1-13.4a62.4 62.4 0 0 0-82.7.6 13 13 0 0 1 1.4 6 13.1 13.1 0 0 1-13 13 13.4 13.4 0 0 1-2.7-.2 62.5 62.5 0 0 0 43.5 89 13 13 0 0 1 24.6 0z"/>
|
<path d="M116.3 165.3a62.5 62.5 0 0 0 35.2-102l-13.4 13.1a43.8 43.8 0 0 1 6.4 44.6 13 13 0 0 1-16.6 19.7 43.7 43.7 0 1 1 4.2-70.4l13.1-13.4a62.4 62.4 0 0 0-82.7.6 13 13 0 0 1 1.4 6 13.1 13.1 0 0 1-13 13 13.4 13.4 0 0 1-2.7-.2 62.5 62.5 0 0 0 43.5 89 13 13 0 0 1 24.6 0z"/>
|
||||||
<path d="M112.2 101.9a7.9 7.9 0 0 1 .3 2.1 8.3 8.3 0 1 1-8.3-8.3 8.5 8.5 0 0 1 2.5.4l19.4-19.6a35.1 35.1 0 1 0-3.7 57.6 13 13 0 0 1 12.2-17.7 12.8 12.8 0 0 1 2.5.2 35.1 35.1 0 0 0-5-34.1z"/>
|
<path d="M112.2 101.9a7.9 7.9 0 0 1 .3 2.1 8.3 8.3 0 1 1-8.3-8.3 8.5 8.5 0 0 1 2.5.4l19.4-19.6a35.1 35.1 0 1 0-3.7 57.6 13 13 0 0 1 12.2-17.7 12.8 12.8 0 0 1 2.5.2 35.1 35.1 0 0 0-5-34.1z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
<span class="text-gray-900 dark:text-gray-100 ml-2 text-3xl font-thin">ESPresense</span>
|
||||||
<span class="text-gray-900 dark:text-gray-100 ml-2 text-3xl font-thin"> ESPresense </span>
|
|
||||||
</div>
|
</div>
|
||||||
<nav class="mt-10 px-6 ">
|
<nav class="mt-10 px-6 ">
|
||||||
<SidebarItem icon="device" title="Devices" href="/" />
|
<SidebarItem icon="contact" title="Settings" href="/settings" />
|
||||||
|
<SidebarItem icon="device" title="Devices" href="/devices" />
|
||||||
<SidebarItem icon="fingerprint" title="Fingerprints" href="/fingerprints" />
|
<SidebarItem icon="fingerprint" title="Fingerprints" href="/fingerprints" />
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,22 +1,2 @@
|
||||||
<section class="text-gray-600 body-font">
|
<section class="text-gray-600 body-font">
|
||||||
<!--div class="container px-5 py-24 mx-auto">
|
|
||||||
<div class="flex flex-wrap -m-4 text-center">
|
|
||||||
<div class="p-4 sm:w-1/4 w-1/2">
|
|
||||||
<h2 class="title-font font-medium sm:text-4xl text-3xl text-gray-900">2.7K</h2>
|
|
||||||
<p class="leading-relaxed">Users</p>
|
|
||||||
</div>
|
|
||||||
<div class="p-4 sm:w-1/4 w-1/2">
|
|
||||||
<h2 class="title-font font-medium sm:text-4xl text-3xl text-gray-900">1.8K</h2>
|
|
||||||
<p class="leading-relaxed">Subscribes</p>
|
|
||||||
</div>
|
|
||||||
<div class="p-4 sm:w-1/4 w-1/2">
|
|
||||||
<h2 class="title-font font-medium sm:text-4xl text-3xl text-gray-900">35</h2>
|
|
||||||
<p class="leading-relaxed">Downloads</p>
|
|
||||||
</div>
|
|
||||||
<div class="p-4 sm:w-1/4 w-1/2">
|
|
||||||
<h2 class="title-font font-medium sm:text-4xl text-3xl text-gray-900">4</h2>
|
|
||||||
<p class="leading-relaxed">Products</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div-->
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
import Home from './routes/Home.svelte';
|
import Fingerprints from './routes/Fingerprints.svelte';
|
||||||
import Devices from './routes/Devices.svelte';
|
import Devices from './routes/Devices.svelte';
|
||||||
|
import Settings from './routes/Settings.svelte';
|
||||||
import NotFound from './routes/NotFound.svelte';
|
import NotFound from './routes/NotFound.svelte';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
'/': Home,
|
'/': Settings,
|
||||||
'/fingerprints': Devices,
|
'/settings': Settings,
|
||||||
|
'/devices': Devices,
|
||||||
|
'/fingerprints': Fingerprints,
|
||||||
// The catch-all route must always be last
|
// The catch-all route must always be last
|
||||||
'*': NotFound
|
'*': NotFound
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,144 +1,28 @@
|
||||||
<script>
|
<script>
|
||||||
import { devices } from '../stores';
|
import { devices, events, enroll } from "../stores";
|
||||||
import SvelteTable from "svelte-table";
|
let name;
|
||||||
|
|
||||||
var filterSelections = { };
|
function slugify(name) {
|
||||||
var sortBy = "distance"
|
return name
|
||||||
var sortOrder = 1;
|
.toString()
|
||||||
var selectedRowIds = []
|
.normalize("NFD") // split an accented letter in the base letter and the acent
|
||||||
const columns = [
|
.replace(/[\u0300-\u036f]/g, "") // remove all previously split accents
|
||||||
{
|
.toLowerCase()
|
||||||
key: "distance",
|
.trim()
|
||||||
title: "Dist",
|
.replace(/[^a-z0-9 ]/g, "") // remove all chars not letters, numbers and spaces (to be replaced)
|
||||||
value: v => v.distance,
|
.replace(/\s+/g, "-"); // separator
|
||||||
renderValue: v => `${v.distance.toLocaleString(undefined, { minimumFractionDigits: 2 })}m`,
|
}
|
||||||
sortable: true,
|
|
||||||
class:"px-0 py-0 whitespace-nowrap"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "id",
|
|
||||||
title: "ID",
|
|
||||||
value: v => v.id,
|
|
||||||
sortable: true,
|
|
||||||
filterOptions: rows => {
|
|
||||||
const prefixes = new Set()
|
|
||||||
rows.forEach(row => {
|
|
||||||
var prefix = row.id.substring(0, row.id.indexOf(":")+1);
|
|
||||||
if (prefix.length > 0) {
|
|
||||||
prefixes.add(prefix);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return Array.from(prefixes).sort().map(a=>({"name": a, "value": a}));
|
|
||||||
},
|
|
||||||
filterValue: v => v.id.substring(0, v.id.indexOf(":")+1),
|
|
||||||
headerClass: "text-left px-6 py-3",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "name",
|
|
||||||
title: "Name",
|
|
||||||
value: v => v.name ?? "",
|
|
||||||
sortable: true,
|
|
||||||
filterOptions: rows => {
|
|
||||||
let letrs = {};
|
|
||||||
rows.forEach(row => {
|
|
||||||
let letr = row.name?.charAt(0);
|
|
||||||
if (letr && letrs[letr] === undefined)
|
|
||||||
letrs[letr] = {
|
|
||||||
name: `${letr.toUpperCase()}`,
|
|
||||||
value: letr.toLowerCase(),
|
|
||||||
};
|
|
||||||
});
|
|
||||||
// fix order
|
|
||||||
letrs = Object.entries(letrs)
|
|
||||||
.sort()
|
|
||||||
.reduce((o, [k, v]) => ((o[k] = v), o), {});
|
|
||||||
return Object.values(letrs);
|
|
||||||
},
|
|
||||||
filterValue: v => v.name?.charAt(0).toLowerCase(),
|
|
||||||
headerClass: "text-left px-6 py-3",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "mac",
|
|
||||||
title: "MAC",
|
|
||||||
value: v => v.mac,
|
|
||||||
sortable: true,
|
|
||||||
filterOptions: rows => {
|
|
||||||
// use first letter of last_name to generate filter
|
|
||||||
let letrs = {};
|
|
||||||
rows.forEach(row => {
|
|
||||||
let letr = row.mac.charAt(0);
|
|
||||||
if (letrs[letr] === undefined)
|
|
||||||
letrs[letr] = {
|
|
||||||
name: `${letr.toUpperCase()}`,
|
|
||||||
value: letr.toLowerCase(),
|
|
||||||
};
|
|
||||||
});
|
|
||||||
// fix order
|
|
||||||
letrs = Object.entries(letrs)
|
|
||||||
.sort()
|
|
||||||
.reduce((o, [k, v]) => ((o[k] = v), o), {});
|
|
||||||
return Object.values(letrs);
|
|
||||||
},
|
|
||||||
filterValue: v => v.mac.charAt(0).toLowerCase(),
|
|
||||||
headerClass: "text-left px-6 py-3",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "rssi",
|
|
||||||
title: "Rssi",
|
|
||||||
value: v => v.rssi,
|
|
||||||
renderValue: v => v.rssi + "dBm",
|
|
||||||
sortable: true,
|
|
||||||
headerClass: "text-left px-6 py-3",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "rssi@1m",
|
|
||||||
title: "Rssi@1m",
|
|
||||||
value: v => v["rssi@1m"],
|
|
||||||
renderValue: v => v["rssi@1m"] + "dBm",
|
|
||||||
sortable: true,
|
|
||||||
headerClass: "text-left px-6 py-3",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "interval",
|
|
||||||
title: "Interval",
|
|
||||||
value: v => v.interval,
|
|
||||||
renderValue: v => v.interval + "ms",
|
|
||||||
sortable: true,
|
|
||||||
headerClass: "text-left px-6 py-3",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
function classNameRow(event) { event.close ? "bg-yellow-100 row" : "row"; }
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<main>
|
{#if $events?.state != null}
|
||||||
|
<label for="name">Name</label>
|
||||||
|
<input id="name" type="text" class="bg-gray-200 relative" placeholder="Name" bind:value={name} />
|
||||||
|
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded disabled:opacity-50 disabled:cursor-not-allowed" disabled={$events.state.enrolling} on:click={() => enroll(name)}> Enroll </button>
|
||||||
|
|
||||||
{#if $devices?.devices != null }
|
{#if $events?.state?.enrolling}
|
||||||
<SvelteTable columns="{columns}" rows="{$devices.devices}" rowKey="mac"
|
<p>
|
||||||
bind:filterSelections="{filterSelections}"
|
You can now use the Bluetooth settings on your device and pair it with the ESPresense device. Once paired your device will be shown with the name: <span class="bg-gray-200 relative whitespace-nowrap">{slugify(name)}</span>
|
||||||
bind:sortBy="{sortBy}"
|
in the fingerprint page as well as on mqtt.
|
||||||
bind:sortOrder="{sortOrder}"
|
</p>
|
||||||
selectSingle="{true}"
|
{/if}
|
||||||
selectOnClick="{true}"
|
|
||||||
selected={selectedRowIds}
|
|
||||||
classNameTable="min-w-full divide-y divide-gray-200 table-auto"
|
|
||||||
classNameThead="whitespace-nowrap text-left text-xs font-medium text-gray-500 uppercase"
|
|
||||||
classNameTbody="bg-white divide-y divide-gray-200"
|
|
||||||
classNameRow="{classNameRow}"
|
|
||||||
classNameRowSelected="bg-blue-100"
|
|
||||||
classNameCell="px-3 py-1 whitespace-no-wrap text-sm leading-5 font-light text-gray-900"
|
|
||||||
classNameInput="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5"
|
|
||||||
classNameSelect="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5"
|
|
||||||
></SvelteTable>
|
|
||||||
{:else}
|
|
||||||
<h1>Loading fingerprints...</h1>
|
|
||||||
{/if}
|
{/if}
|
||||||
</main>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
main {
|
|
||||||
padding: 1rem;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -0,0 +1,144 @@
|
||||||
|
<script>
|
||||||
|
import { devices } from '../stores';
|
||||||
|
import SvelteTable from "svelte-table";
|
||||||
|
|
||||||
|
var filterSelections = { };
|
||||||
|
var sortBy = "distance"
|
||||||
|
var sortOrder = 1;
|
||||||
|
var selectedRowIds = []
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
key: "distance",
|
||||||
|
title: "Dist",
|
||||||
|
value: v => v.distance,
|
||||||
|
renderValue: v => `${v.distance.toLocaleString(undefined, { minimumFractionDigits: 2 })}m`,
|
||||||
|
sortable: true,
|
||||||
|
class:"px-0 py-0 whitespace-nowrap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "id",
|
||||||
|
title: "ID",
|
||||||
|
value: v => v.id,
|
||||||
|
sortable: true,
|
||||||
|
filterOptions: rows => {
|
||||||
|
const prefixes = new Set()
|
||||||
|
rows.forEach(row => {
|
||||||
|
var prefix = row.id.substring(0, row.id.indexOf(":")+1);
|
||||||
|
if (prefix.length > 0) {
|
||||||
|
prefixes.add(prefix);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return Array.from(prefixes).sort().map(a=>({"name": a, "value": a}));
|
||||||
|
},
|
||||||
|
filterValue: v => v.id.substring(0, v.id.indexOf(":")+1),
|
||||||
|
headerClass: "text-left px-6 py-3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "name",
|
||||||
|
title: "Name",
|
||||||
|
value: v => v.name ?? "",
|
||||||
|
sortable: true,
|
||||||
|
filterOptions: rows => {
|
||||||
|
let letrs = {};
|
||||||
|
rows.forEach(row => {
|
||||||
|
let letr = row.name?.charAt(0);
|
||||||
|
if (letr && letrs[letr] === undefined)
|
||||||
|
letrs[letr] = {
|
||||||
|
name: `${letr.toUpperCase()}`,
|
||||||
|
value: letr.toLowerCase(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
// fix order
|
||||||
|
letrs = Object.entries(letrs)
|
||||||
|
.sort()
|
||||||
|
.reduce((o, [k, v]) => ((o[k] = v), o), {});
|
||||||
|
return Object.values(letrs);
|
||||||
|
},
|
||||||
|
filterValue: v => v.name?.charAt(0).toLowerCase(),
|
||||||
|
headerClass: "text-left px-6 py-3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "mac",
|
||||||
|
title: "MAC",
|
||||||
|
value: v => v.mac,
|
||||||
|
sortable: true,
|
||||||
|
filterOptions: rows => {
|
||||||
|
// use first letter of last_name to generate filter
|
||||||
|
let letrs = {};
|
||||||
|
rows.forEach(row => {
|
||||||
|
let letr = row.mac.charAt(0);
|
||||||
|
if (letrs[letr] === undefined)
|
||||||
|
letrs[letr] = {
|
||||||
|
name: `${letr.toUpperCase()}`,
|
||||||
|
value: letr.toLowerCase(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
// fix order
|
||||||
|
letrs = Object.entries(letrs)
|
||||||
|
.sort()
|
||||||
|
.reduce((o, [k, v]) => ((o[k] = v), o), {});
|
||||||
|
return Object.values(letrs);
|
||||||
|
},
|
||||||
|
filterValue: v => v.mac.charAt(0).toLowerCase(),
|
||||||
|
headerClass: "text-left px-6 py-3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "rssi",
|
||||||
|
title: "Rssi",
|
||||||
|
value: v => v.rssi,
|
||||||
|
renderValue: v => v.rssi + "dBm",
|
||||||
|
sortable: true,
|
||||||
|
headerClass: "text-left px-6 py-3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "rssi@1m",
|
||||||
|
title: "Rssi@1m",
|
||||||
|
value: v => v["rssi@1m"],
|
||||||
|
renderValue: v => v["rssi@1m"] + "dBm",
|
||||||
|
sortable: true,
|
||||||
|
headerClass: "text-left px-6 py-3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "interval",
|
||||||
|
title: "Interval",
|
||||||
|
value: v => v.interval,
|
||||||
|
renderValue: v => v.interval + "ms",
|
||||||
|
sortable: true,
|
||||||
|
headerClass: "text-left px-6 py-3",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
function classNameRow(event) { event.close ? "bg-yellow-100 row" : "row"; }
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
|
||||||
|
{#if $devices?.devices != null }
|
||||||
|
<SvelteTable columns="{columns}" rows="{$devices.devices}" rowKey="mac"
|
||||||
|
bind:filterSelections="{filterSelections}"
|
||||||
|
bind:sortBy="{sortBy}"
|
||||||
|
bind:sortOrder="{sortOrder}"
|
||||||
|
selectSingle="{true}"
|
||||||
|
selectOnClick="{true}"
|
||||||
|
selected={selectedRowIds}
|
||||||
|
classNameTable="min-w-full divide-y divide-gray-200 table-auto"
|
||||||
|
classNameThead="whitespace-nowrap text-left text-xs font-medium text-gray-500 uppercase"
|
||||||
|
classNameTbody="bg-white divide-y divide-gray-200"
|
||||||
|
classNameRow="{classNameRow}"
|
||||||
|
classNameRowSelected="bg-blue-100"
|
||||||
|
classNameCell="px-3 py-1 whitespace-no-wrap text-sm leading-5 font-light text-gray-900"
|
||||||
|
classNameInput="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5"
|
||||||
|
classNameSelect="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5"
|
||||||
|
></SvelteTable>
|
||||||
|
{:else}
|
||||||
|
<h1>Loading fingerprints...</h1>
|
||||||
|
{/if}
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
main {
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,30 +0,0 @@
|
||||||
<script>
|
|
||||||
import { devices, events, enroll } from "../stores";
|
|
||||||
import Stats from "../components/Stats.svelte";
|
|
||||||
let name;
|
|
||||||
|
|
||||||
function slugify(name) {
|
|
||||||
return name
|
|
||||||
.toString()
|
|
||||||
.normalize("NFD") // split an accented letter in the base letter and the acent
|
|
||||||
.replace(/[\u0300-\u036f]/g, "") // remove all previously split accents
|
|
||||||
.toLowerCase()
|
|
||||||
.trim()
|
|
||||||
.replace(/[^a-z0-9 ]/g, "") // remove all chars not letters, numbers and spaces (to be replaced)
|
|
||||||
.replace(/\s+/g, "-"); // separator
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<Stats />
|
|
||||||
{#if $events?.state != null}
|
|
||||||
<label for="name">Name</label>
|
|
||||||
<input id="name" type="text" class="bg-gray-200 relative" placeholder="Name" bind:value={name} />
|
|
||||||
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded disabled:opacity-50 disabled:cursor-not-allowed" disabled={$events.state.enrolling} on:click={() => enroll(name)}> Enroll </button>
|
|
||||||
|
|
||||||
{#if $events?.state?.enrolling}
|
|
||||||
<p>
|
|
||||||
You can now use the Bluetooth settings on your device and pair it with the ESPresense device. Once paired your device will be shown with the name: <span class="bg-gray-200 relative whitespace-nowrap">{slugify(name)}</span>
|
|
||||||
in the fingerprint page as well as on mqtt.
|
|
||||||
</p>
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
|
@ -0,0 +1,218 @@
|
||||||
|
<script>
|
||||||
|
import { extras } from "../stores";
|
||||||
|
|
||||||
|
let r = false;
|
||||||
|
async function restart() {
|
||||||
|
r = true;
|
||||||
|
await fetch("/restart", { method: "POST" });
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
const res = await fetch("/");
|
||||||
|
if (res.ok) break;
|
||||||
|
} catch (err) {}
|
||||||
|
await new Promise((r) => setTimeout(r, 1000));
|
||||||
|
}
|
||||||
|
r = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let s = false;
|
||||||
|
async function save(event) {
|
||||||
|
s = true;
|
||||||
|
const formData = new FormData(event.target);
|
||||||
|
await fetch("/extras", { method: "POST", body: new URLSearchParams(formData), redirect: 'manual' });
|
||||||
|
s = false;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="form">
|
||||||
|
{#if $extras != null }
|
||||||
|
<form action="/extras" method="post" id="extras" on:submit|preventDefault={save}>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#scanning" target="_blank">Scanning</a></h2>
|
||||||
|
<p><label>Known BLE mac addresses (no colons, space seperated):<br /><input name="known_macs" bind:value={$extras.known_macs}/></label></p>
|
||||||
|
<p><label>Known BLE identity resolving keys, should be 32 hex chars space seperated:<br /><input name="known_irks" bind:value={$extras.known_irks}/></label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#querying" target="_blank">Querying</a></h2>
|
||||||
|
<p><label>Query device ids for characteristics (eg. flora:):<br /><input name="query" bind:value={$extras.query}/></label></p>
|
||||||
|
<p><label>Requery interval in seconds:<br /><input type="number" step="1" min="30" max="3600" name="requery_ms" placeholder="300" bind:value={$extras.requery_ms}/></label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#counting" target="_blank">Counting</a></h2>
|
||||||
|
<p><label>Include id prefixes (space seperated):<br /><input name="count_ids" bind:value={$extras.count_ids}/></label></p>
|
||||||
|
<p><label>Start counting devices less than distance (in meters):<br /><input type="number" step="0.01" min="0" max="100" name="count_enter" placeholder="2.00" bind:value={$extras.count_enter}/></label></p>
|
||||||
|
<p><label>Stop counting devices greater than distance (in meters):<br /><input type="number" step="0.01" min="0" max="100" name="count_exit" placeholder="4.00" bind:value={$extras.count_exit}/></label></p>
|
||||||
|
<p><label>Include devices with age less than (in ms):<br /><input type="number" step="1" min="0" max="3000000" name="count_ms" placeholder="30000" bind:value={$extras.count_ms}/></label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#filtering" target="_blank">Filtering</a></h2>
|
||||||
|
<p><label>Include only sending these ids to mqtt (eg. apple:iphone10-6 apple:iphone13-2):<br /><input name="include" bind:value={$extras.include}/></label></p>
|
||||||
|
<p><label>Exclude sending these ids to mqtt (eg. exp:20 apple:iphone10-6):<br /><input name="exclude" bind:value={$extras.exclude}/></label></p>
|
||||||
|
<p><label>Maximum distance to report (in meters):<br /><input type="number" step="0.01" min="0" max="100" name="max_dist" placeholder="16.00" bind:value={$extras.max_dist}/></label></p>
|
||||||
|
<p><label>Report early if beacon has moved more than this distance (in meters):<br /><input type="number" step="0.01" min="0" max="10" name="skip_dist" placeholder="0.50" bind:value={$extras.skip_dist}/></label></p>
|
||||||
|
<p><label>Skip reporting if message age is less that this (in milliseconds):<br /><input type="number" step="1" min="0" max="3000000" name="skip_ms" placeholder="5000" bind:value={$extras.skip_ms}/></label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#calibration" target="_blank">Calibration</a></h2>
|
||||||
|
<p><label>Rssi expected from a 0dBm transmitter at 1 meter (NOT used for iBeacons or Eddystone):<br /><input type="number" step="1" min="-100" max="100" name="ref_rssi" placeholder="-65" bind:value={$extras.ref_rssi}/></label></p>
|
||||||
|
<p><label>Rssi adjustment for receiver (use only if you know this device has a weak antenna):<br /><input type="number" step="1" min="-100" max="100" name="rx_adj_rssi" placeholder="0" bind:value={$extras.rx_adj_rssi}/></label></p>
|
||||||
|
<p><label>Factor used to account for absorption, reflection, or diffraction:<br /><input type="number" step="0.01" min="-100" max="100" name="absorption" placeholder="3.50" bind:value={$extras.absorption}/></label></p>
|
||||||
|
<p><label>Forget beacon if not seen for (in milliseconds):<br /><input type="number" step="1" min="0" max="3000000" name="forget_ms" placeholder="150000" bind:value={$extras.forget_ms}/></label></p>
|
||||||
|
<p><label>Rssi expected from this tx power at 1m (used for node iBeacon):<br /><input type="number" step="1" min="-100" max="100" name="tx_ref_rssi" placeholder="-59" bind:value={$extras.tx_ref_rssi}/></label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#leds" target="_blank">LEDs</a></h2>
|
||||||
|
<h4>LED 1:</h4>
|
||||||
|
<p><label>LED Type:<br /><select name="led_1_type" bind:value={$extras.led_1_type}><option disabled selected hidden>PWM</option><option value="0">PWM</option><option value="1">PWM Inverted</option><option value="2">Addressable GRB</option><option value="3">Addressable GRBW</option><option value="4">Addressable RGB</option><option value="5">Addressable RGBW</option></select></label></p>
|
||||||
|
<p><label>Pin (-1 to disable):<br /><input type="number" step="1" min="-1" max="39" name="led_1_pin" placeholder="2" bind:value={$extras.led_1_pin}/></label></p>
|
||||||
|
<p><label>Count (only applies to Addressable LEDs):<br /><input type="number" step="1" min="-1" max="39" name="led_1_cnt" placeholder="1" bind:value={$extras.led_1_cnt}/></label></p>
|
||||||
|
<p><label>LED Control:<br /><select name="led_1_cntrl" bind:value={$extras.led_1_cntrl}><option disabled selected hidden>Status</option><option value="0">MQTT</option><option value="1">Status</option><option value="2">Motion</option><option value="3">Count</option></select></label></p>
|
||||||
|
<h4>LED 2:</h4>
|
||||||
|
<p><label>LED Type:<br /><select name="led_2_type" bind:value={$extras.led_2_type}><option disabled selected hidden>PWM</option><option value="0">PWM</option><option value="1">PWM Inverted</option><option value="2">Addressable GRB</option><option value="3">Addressable GRBW</option><option value="4">Addressable RGB</option><option value="5">Addressable RGBW</option></select></label></p>
|
||||||
|
<p><label>Pin (-1 to disable):<br /><input type="number" step="1" min="-1" max="39" name="led_2_pin" placeholder="-1" bind:value={$extras.led_2_pin}/></label></p>
|
||||||
|
<p><label>Count (only applies to Addressable LEDs):<br /><input type="number" step="1" min="-1" max="39" name="led_2_cnt" placeholder="1" bind:value={$extras.led_2_cnt}/></label></p>
|
||||||
|
<p><label>LED Control:<br /><select name="led_2_cntrl" bind:value={$extras.led_2_cntrl}><option disabled selected hidden>MQTT</option><option value="0">MQTT</option><option value="1">Status</option><option value="2">Motion</option><option value="3">Count</option></select></label></p>
|
||||||
|
<h4>LED 3:</h4>
|
||||||
|
<p><label>LED Type:<br /><select name="led_3_type" bind:value={$extras.led_3_type}><option disabled selected hidden>PWM</option><option value="0">PWM</option><option value="1">PWM Inverted</option><option value="2">Addressable GRB</option><option value="3">Addressable GRBW</option><option value="4">Addressable RGB</option><option value="5">Addressable RGBW</option></select></label></p>
|
||||||
|
<p><label>Pin (-1 to disable):<br /><input type="number" step="1" min="-1" max="39" name="led_3_pin" placeholder="-1" bind:value={$extras.led_3_pin}/></label></p>
|
||||||
|
<p><label>Count (only applies to Addressable LEDs):<br /><input type="number" step="1" min="-1" max="39" name="led_3_cnt" placeholder="1" bind:value={$extras.led_3_cnt}/></label></p>
|
||||||
|
<p><label>LED Control:<br /><select name="led_3_cntrl" bind:value={$extras.led_3_cntrl}><option disabled selected hidden>MQTT</option><option value="0">MQTT</option><option value="1">Status</option><option value="2">Motion</option><option value="3">Count</option></select></label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#gpio-sensors" target="_blank">GPIO Sensors</a></h2>
|
||||||
|
<h4>PIR:</h4>
|
||||||
|
<p><label>PIR motion pin type:<br /><select name="pir_type" bind:value={$extras.pir_type}><option disabled selected hidden>Pullup</option><option value="0">Pullup</option><option value="1">Pullup Inverted</option><option value="2">Pulldown</option><option value="3">Pulldown Inverted</option><option value="4">Floating</option><option value="5">Floating Inverted</option></select></label></p>
|
||||||
|
<p><label>PIR motion pin (-1 for disable):<br /><input type="number" step="1" name="pir_pin" placeholder="-1" bind:value={$extras.pir_pin}/></label></p>
|
||||||
|
<p><label>PIR motion timeout (in seconds):<br /><input type="number" step="0.01" min="0" max="300" name="pir_timeout" placeholder="0.50" bind:value={$extras.pir_timeout}/></label></p>
|
||||||
|
<h4>Radar:</h4>
|
||||||
|
<p><label>Radar motion pin type:<br /><select name="radar_type" bind:value={$extras.radar_type}><option disabled selected hidden>Pullup</option><option value="0">Pullup</option><option value="1">Pullup Inverted</option><option value="2">Pulldown</option><option value="3">Pulldown Inverted</option><option value="4">Floating</option><option value="5">Floating Inverted</option></select></label></p>
|
||||||
|
<p><label>Radar motion pin (-1 for disable):<br /><input type="number" step="1" name="radar_pin" placeholder="-1" bind:value={$extras.radar_pin}/></label></p>
|
||||||
|
<p><label>Radar motion timeout (in seconds):<br /><input type="number" step="0.01" min="0" max="300" name="radar_timeout" placeholder="0.50" bind:value={$extras.radar_timeout}/></label></p>
|
||||||
|
<h4>Switch One:</h4>
|
||||||
|
<p><label>Switch One pin type:<br /><select name="switch_1_type" bind:value={$extras.switch_1_type}><option disabled selected hidden>Pullup</option><option value="0">Pullup</option><option value="1">Pullup Inverted</option><option value="2">Pulldown</option><option value="3">Pulldown Inverted</option><option value="4">Floating</option><option value="5">Floating Inverted</option></select></label></p>
|
||||||
|
<p><label>Switch One pin (-1 for disable):<br /><input type="number" step="1" name="switch_1_pin" placeholder="-1" bind:value={$extras.switch_1_pin}/></label></p>
|
||||||
|
<p><label>Switch One timeout (in seconds):<br /><input type="number" step="0.01" min="0" max="300" name="switch_1_timeout" placeholder="0.50" bind:value={$extras.switch_1_timeout}/></label></p>
|
||||||
|
<h4>Switch Two:</h4>
|
||||||
|
<p><label>Switch Two pin type:<br /><select name="switch_2_type" bind:value={$extras.switch_2_type}><option disabled selected hidden>Pullup</option><option value="0">Pullup</option><option value="1">Pullup Inverted</option><option value="2">Pulldown</option><option value="3">Pulldown Inverted</option><option value="4">Floating</option><option value="5">Floating Inverted</option></select></label></p>
|
||||||
|
<p><label>Switch Two pin (-1 for disable):<br /><input type="number" step="1" name="switch_2_pin" placeholder="-1" bind:value={$extras.switch_2_pin}/></label></p>
|
||||||
|
<p><label>Switch Two timeout (in seconds):<br /><input type="number" step="0.01" min="0" max="300" name="switch_2_timeout" placeholder="0.50" bind:value={$extras.switch_2_timeout}/></label></p>
|
||||||
|
<h4>Button One:</h4>
|
||||||
|
<p><label>Button One pin type:<br /><select name="button_1_type" bind:value={$extras.button_1_type}><option disabled selected hidden>Pullup</option><option value="0">Pullup</option><option value="1">Pullup Inverted</option><option value="2">Pulldown</option><option value="3">Pulldown Inverted</option><option value="4">Floating</option><option value="5">Floating Inverted</option></select></label></p>
|
||||||
|
<p><label>Button One pin (-1 for disable):<br /><input type="number" step="1" name="button_1_pin" placeholder="-1" bind:value={$extras.button_1_pin}/></label></p>
|
||||||
|
<p><label>Button One timeout (in seconds):<br /><input type="number" step="0.01" min="0" max="300" name="button_1_timeout" placeholder="0.50" bind:value={$extras.button_1_timeout}/></label></p>
|
||||||
|
<h4>Button Two:</h4>
|
||||||
|
<p><label>Button Two pin type:<br /><select name="button_2_type" bind:value={$extras.button_2_type}><option disabled selected hidden>Pullup</option><option value="0">Pullup</option><option value="1">Pullup Inverted</option><option value="2">Pulldown</option><option value="3">Pulldown Inverted</option><option value="4">Floating</option><option value="5">Floating Inverted</option></select></label></p>
|
||||||
|
<p><label>Button Two pin (-1 for disable):<br /><input type="number" step="1" name="button_2_pin" placeholder="-1" bind:value={$extras.button_2_pin}/></label></p>
|
||||||
|
<p><label>Button Two timeout (in seconds):<br /><input type="number" step="0.01" min="0" max="300" name="button_2_timeout" placeholder="0.50" bind:value={$extras.button_2_timeout}/></label></p>
|
||||||
|
<h4>DHT:</h4>
|
||||||
|
<p><label>DHT11 sensor pin (-1 for disable):<br /><input type="number" step="1" name="dht11_pin" placeholder="-1" bind:value={$extras.dht11_pin}/></label></p>
|
||||||
|
<p><label>DHT22 sensor pin (-1 for disable):<br /><input type="number" step="1" name="dht22_pin" placeholder="-1" bind:value={$extras.dht22_pin}/></label></p>
|
||||||
|
<p><label>DHT temperature offset:<br /><input type="number" step="0.01" min="-40" max="125" name="dhtTemp_offset" placeholder="0.00" bind:value={$extras.dhtTemp_offset}/></label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#i2c-settings" target="_blank">I2C Settings</a></h2>
|
||||||
|
<h4>Bus 1:</h4>
|
||||||
|
<p><label>SDA pin (-1 to disable):<br /><input type="number" step="1" min="-1" max="39" name="I2C_Bus_1_SDA" placeholder="21" bind:value={$extras.I2C_Bus_1_SDA}/></label></p>
|
||||||
|
<p><label>SCL pin (-1 to disable):<br /><input type="number" step="1" min="-1" max="39" name="I2C_Bus_1_SCL" placeholder="22" bind:value={$extras.I2C_Bus_1_SCL}/></label></p>
|
||||||
|
<h4>Bus 2:</h4>
|
||||||
|
<p><label>SDA pin (-1 to disable):<br /><input type="number" step="1" min="-1" max="39" name="I2C_Bus_2_SDA" placeholder="-1" bind:value={$extras.I2C_Bus_2_SDA}/></label></p>
|
||||||
|
<p><label>SCL pin (-1 to disable):<br /><input type="number" step="1" min="-1" max="39" name="I2C_Bus_2_SCL" placeholder="-1" bind:value={$extras.I2C_Bus_2_SCL}/></label></p>
|
||||||
|
<p><label class="c"><input type="checkbox" name="I2CDebug" bind:value={$extras.I2CDebug}/> Debug I2C addreses. Look at the serial log to get the correct address (default: ☐)</label></p>
|
||||||
|
<h2><a href="https://espresense.com/configuration/settings#i2c-sensors" target="_blank">I2C Sensors</a></h2>
|
||||||
|
<h4>AHTX0 - Temperature + Humidity Sensor:</h4>
|
||||||
|
<p><label>I2C Bus:<br /><input type="number" step="1" min="1" max="2" name="AHTX0_I2c_Bus" placeholder="1" bind:value={$extras.AHTX0_I2c_Bus}/></label></p>
|
||||||
|
<p><label>I2C address (0x38 or 0x39):<br /><input name="AHTX0_I2c" bind:value={$extras.AHTX0_I2c}/></label></p>
|
||||||
|
<h4>BH1750 - Ambient Light Sensor:</h4>
|
||||||
|
<p><label>I2C Bus:<br /><input type="number" step="1" min="1" max="2" name="BH1750_I2c_Bus" placeholder="1" bind:value={$extras.BH1750_I2c_Bus}/></label></p>
|
||||||
|
<p><label>I2C address (0x23 or 0x5C):<br /><input name="BH1750_I2c" bind:value={$extras.BH1750_I2c}/></label></p>
|
||||||
|
<h4>BME280 - Humidity + Temp + Pressure Sensor:</h4>
|
||||||
|
<p><label>I2C Bus:<br /><input type="number" step="1" min="1" max="2" name="BME280_I2c_Bus" placeholder="1" bind:value={$extras.BME280_I2c_Bus}/></label></p>
|
||||||
|
<p><label>I2C address (0x76 or 0x77):<br /><input name="BME280_I2c" bind:value={$extras.BME280_I2c}/></label></p>
|
||||||
|
<h4>BMP085/BMP180 - Barometric Pressure + Temperature:</h4>
|
||||||
|
<p><label>I2C Bus:<br /><input type="number" step="1" min="1" max="2" name="BMP180_I2c_Bus" placeholder="1" bind:value={$extras.BMP180_I2c_Bus}/></label></p>
|
||||||
|
<p><label>I2C address (0x77):<br /><input name="BMP180_I2c" bind:value={$extras.BMP180_I2c}/></label></p>
|
||||||
|
<h4>BMP280 - Barometric Pressure + Temperature Sensor:</h4>
|
||||||
|
<p><label>I2C Bus:<br /><input type="number" step="1" min="1" max="2" name="BMP280_I2c_Bus" placeholder="1" bind:value={$extras.BMP280_I2c_Bus}/></label></p>
|
||||||
|
<p><label>I2C address (0x76 or 0x77):<br /><input name="BMP280_I2c" bind:value={$extras.BMP280_I2c}/></label></p>
|
||||||
|
<h4>SHTC1/3, SHTW1/2, SHT3x/4x, SHT85 - Temperature and Humidity Sensor:</h4>
|
||||||
|
<p><label>I2C Bus (-1 to disable):<br /><input type="number" step="1" min="1" max="2" name="SHT_I2c_Bus" placeholder="-1" bind:value={$extras.SHT_I2c_Bus}/></label></p>
|
||||||
|
<h4>TSL2561 - Ambient Light Sensor:</h4>
|
||||||
|
<p><label>I2C Bus:<br /><input type="number" step="1" min="1" max="2" name="TSL2561_I2c_Bus" placeholder="1" bind:value={$extras.TSL2561_I2c_Bus}/></label></p>
|
||||||
|
<p><label>I2C address (0x39, 0x49 or 0x29):<br /><input name="TSL2561_I2c" bind:value={$extras.TSL2561_I2c}/></label></p>
|
||||||
|
<p><label>Gain (auto, 1x or 16x):<br /><input name="TSL2561_I2c_Gain" placeholder="auto" bind:value={$extras.TSL2561_I2c_Gain}/></label></p>
|
||||||
|
<h4>SGP30 - Air Quality Sensor:</h4>
|
||||||
|
<p><label>I2C Bus:<br /><input type="number" step="1" min="1" max="2" name="SGP30_I2c_Bus" placeholder="1" bind:value={$extras.SGP30_I2c_Bus}/></label></p>
|
||||||
|
<p><label>I2C address (0x58):<br /><input name="SGP30_I2c" bind:value={$extras.SGP30_I2c}/></label></p>
|
||||||
|
<h4>HX711 - Weight Sensor:</h4>
|
||||||
|
<p><label>HX711 SCK (Clock) pin:<br /><input type="number" step="1" name="HX711_sckPin" placeholder="0" bind:value={$extras.HX711_sckPin}/></label></p>
|
||||||
|
<p><label>HX711 DOUT (Data) pin:<br /><input type="number" step="1" name="HX711_doutPin" placeholder="0" bind:value={$extras.HX711_doutPin}/></label></p>
|
||||||
|
<h4>DS18B20:</h4>
|
||||||
|
<p><label>DS18B20 sensor pin (-1 for disable):<br /><input type="number" step="1" name="ds18b20_pin" placeholder="-1" bind:value={$extras.ds18b20_pin}/></label></p>
|
||||||
|
<p><label>DS18B20 temperature offset:<br /><input type="number" step="0.01" min="-40" max="125" name="dsTemp_offset" placeholder="0.00" bind:value={$extras.dsTemp_offset}/></label></p>
|
||||||
|
<div class="bc"><button class="btn left" on:click|preventDefault={restart}>{r ? "Restarting..." : "Restart"}</button><input class="btn right" type="submit" value={s ? "Saving..." : "Save"} /></div>
|
||||||
|
</form>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.form {
|
||||||
|
padding: 1em;
|
||||||
|
background: #ccc;
|
||||||
|
max-width: 40em;
|
||||||
|
margin: 0;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
font: 1.5em sans-serif;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
font: 1.25em sans-serif;
|
||||||
|
}
|
||||||
|
a:link {
|
||||||
|
color: #000;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
label {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
select,
|
||||||
|
input:not([type^="c"]) {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid #444;
|
||||||
|
padding: 0.3ex;
|
||||||
|
}
|
||||||
|
input[type^="c"] {
|
||||||
|
float: left;
|
||||||
|
margin-top: 0.5em;
|
||||||
|
margin-left: -1.5em;
|
||||||
|
}
|
||||||
|
:not([type^="s"]):focus {
|
||||||
|
outline: 2px solid #de1;
|
||||||
|
}
|
||||||
|
p::before {
|
||||||
|
margin-left: -2em;
|
||||||
|
float: left;
|
||||||
|
padding-top: 1ex;
|
||||||
|
}
|
||||||
|
.c {
|
||||||
|
display: block;
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
.bc {
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
background: #de1;
|
||||||
|
font-size: 1.5em;
|
||||||
|
width: 8em !important;
|
||||||
|
padding: 0.5em !important;
|
||||||
|
border: 1px solid #000;
|
||||||
|
border-radius: 1ex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.left {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.right {
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,6 +1,18 @@
|
||||||
import { readable } from 'svelte/store';
|
import { readable } from 'svelte/store';
|
||||||
import { writable } from 'svelte/store';
|
import { writable } from 'svelte/store';
|
||||||
|
|
||||||
|
export const extras = writable([], function start(set) {
|
||||||
|
fetch(`/extras`)
|
||||||
|
.then(d => d.json())
|
||||||
|
.then(r => {
|
||||||
|
set(r);
|
||||||
|
})
|
||||||
|
.catch((ex) => {
|
||||||
|
set(null);
|
||||||
|
console.log(ex);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
export const devices = readable([], function start(set) {
|
export const devices = readable([], function start(set) {
|
||||||
var errors = 0;
|
var errors = 0;
|
||||||
var outstanding = false;
|
var outstanding = false;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>ESPresense: Devices</title>
|
<title>ESPresense</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
|
|
@ -6,13 +6,13 @@ export default defineConfig({
|
||||||
plugins: [svelte()],
|
plugins: [svelte()],
|
||||||
server: {
|
server: {
|
||||||
proxy: {
|
proxy: {
|
||||||
'^/json': {
|
'^/(json|extras|restart)': {
|
||||||
target: 'http://192.168.128.186/',
|
target: 'http://192.168.128.134/',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (path) => path
|
rewrite: (path) => path
|
||||||
},
|
},
|
||||||
'^/ws': {
|
'^/ws': {
|
||||||
target: 'ws://192.168.128.186/',
|
target: 'ws://192.168.128.134/',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (path) => path
|
rewrite: (path) => path
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue