Remove CS from global interface pins.

Fixes.
This commit is contained in:
Blaz Kristan 2022-08-17 19:44:32 +02:00
parent 0f78bd3785
commit 2149bbb8ea
9 changed files with 223 additions and 227 deletions

View File

@ -312,19 +312,30 @@ class FourLineDisplayUsermod : public Usermod {
bool isHW, isSPI = (type == SSD1306_SPI || type == SSD1306_SPI64);
PinOwner po = PinOwner::UM_FourLineDisplay;
if (isSPI) {
PinManagerPinType cspins[2] = { { ioPin[3], true }, { ioPin[4], true } };
if (!pinManager.allocateMultiplePins(cspins, 2, PinOwner::UM_FourLineDisplay)) { type=NONE; return; }
isHW = (ioPin[0]==spi_sclk && ioPin[1]==spi_mosi && ioPin[2]==spi_cs);
uint8_t hw_sclk = spi_sclk<0 ? HW_PIN_CLOCKSPI : spi_sclk;
uint8_t hw_mosi = spi_mosi<0 ? HW_PIN_DATASPI : spi_mosi;
if (ioPin[0] < 0 || ioPin[1] < 0) {
ioPin[0] = hw_sclk;
ioPin[1] = hw_mosi;
}
isHW = (ioPin[0]==hw_sclk && ioPin[1]==hw_mosi);
PinManagerPinType cspins[3] = { { ioPin[2], true }, { ioPin[3], true }, { ioPin[4], true } };
if (!pinManager.allocateMultiplePins(cspins, 3, PinOwner::UM_FourLineDisplay)) { type=NONE; return; }
if (isHW) po = PinOwner::HW_SPI; // allow multiple allocations of HW I2C bus pins
PinManagerPinType pins[3] = { { ioPin[0], true }, { ioPin[1], true }, { ioPin[2], true } };
if (!pinManager.allocateMultiplePins(pins, 5, po)) {
pinManager.deallocatePin(ioPin[3], PinOwner::UM_FourLineDisplay);
pinManager.deallocatePin(ioPin[4], PinOwner::UM_FourLineDisplay);
PinManagerPinType pins[2] = { { ioPin[0], true }, { ioPin[1], true } };
if (!pinManager.allocateMultiplePins(pins, 2, po)) {
pinManager.deallocateMultiplePins(cspins, 3, PinOwner::UM_FourLineDisplay);
type = NONE;
return;
}
} else {
isHW = (ioPin[0]==i2c_scl && ioPin[1]==i2c_sda);
uint8_t hw_scl = i2c_scl<0 ? HW_PIN_SCL : i2c_scl;
uint8_t hw_sda = i2c_sda<0 ? HW_PIN_SDA : i2c_sda;
if (ioPin[0] < 0 || ioPin[1] < 0) {
ioPin[0] = hw_scl;
ioPin[1] = hw_sda;
}
isHW = (ioPin[0]==hw_scl && ioPin[1]==hw_sda);
if (isHW) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins
PinManagerPinType pins[2] = { {ioPin[0], true }, { ioPin[1], true } };
if (!pinManager.allocateMultiplePins(pins, 2, po)) { type=NONE; return; }
@ -1019,8 +1030,8 @@ class FourLineDisplayUsermod : public Usermod {
oappend(SET_F("addOption(dd,'SSD1305 128x64',5);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI',6);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',7);"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'I2C/SPI CLK');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'I2C/SPI DTA');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'I2C/SPI CLK (-1 use global)');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'I2C/SPI DTA (-1 use global)');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',2,'SPI CS');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',3,'SPI DC');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',4,'SPI RST');"));
@ -1071,7 +1082,7 @@ class FourLineDisplayUsermod : public Usermod {
bool readFromConfig(JsonObject& root) {
bool needsRedraw = false;
DisplayType newType = type;
int8_t newPin[5]; for (byte i=0; i<5; i++) newPin[i] = ioPin[i];
int8_t oldPin[5]; for (byte i=0; i<5; i++) oldPin[i] = ioPin[i];
JsonObject top = root[FPSTR(_name)];
if (top.isNull()) {
@ -1082,7 +1093,7 @@ class FourLineDisplayUsermod : public Usermod {
enabled = top[FPSTR(_enabled)] | enabled;
newType = top["type"] | newType;
for (byte i=0; i<5; i++) newPin[i] = top["pin"][i] | ioPin[i];
for (byte i=0; i<5; i++) ioPin[i] = top["pin"][i] | ioPin[i];
flip = top[FPSTR(_flip)] | flip;
contrast = top[FPSTR(_contrast)] | contrast;
#ifndef ARDUINO_ARCH_ESP32
@ -1102,26 +1113,31 @@ class FourLineDisplayUsermod : public Usermod {
DEBUG_PRINT(FPSTR(_name));
if (!initDone) {
// first run: reading from cfg.json
for (byte i=0; i<5; i++) ioPin[i] = newPin[i];
type = newType;
DEBUG_PRINTLN(F(" config loaded."));
} else {
DEBUG_PRINTLN(F(" config (re)loaded."));
// changing parameters from settings page
bool pinsChanged = false;
for (byte i=0; i<5; i++) if (ioPin[i] != newPin[i]) { pinsChanged = true; break; }
for (byte i=0; i<5; i++) if (ioPin[i] != oldPin[i]) { pinsChanged = true; break; }
if (pinsChanged || type!=newType) {
if (type != NONE) delete u8x8;
PinOwner po = PinOwner::UM_FourLineDisplay;
bool isSPI = (type == SSD1306_SPI || type == SSD1306_SPI64);
if (!isSPI && ioPin[0]==i2c_scl && ioPin[1]==i2c_sda) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins
if (isSPI && ioPin[0]==spi_sclk && ioPin[1]==spi_mosi && ioPin[2]==spi_cs) po = PinOwner::HW_SPI; // allow multiple allocations of HW SPI bus pins
pinManager.deallocateMultiplePins((const uint8_t *)ioPin, isSPI ? 5 : 2, po);
for (byte i=0; i<5; i++) ioPin[i] = newPin[i];
if (ioPin[0]<0 || ioPin[1]<0) { // data & clock must be > -1
type = NONE;
return true;
} else type = newType;
if (isSPI) {
pinManager.deallocateMultiplePins((const uint8_t *)(&oldPin[2]), 3, po);
uint8_t hw_sclk = spi_sclk<0 ? HW_PIN_CLOCKSPI : spi_sclk;
uint8_t hw_mosi = spi_mosi<0 ? HW_PIN_DATASPI : spi_mosi;
bool isHW = (oldPin[0]==hw_sclk && oldPin[1]==hw_mosi);
if (isHW) po = PinOwner::HW_SPI;
} else {
uint8_t hw_scl = i2c_scl<0 ? HW_PIN_SCL : i2c_scl;
uint8_t hw_sda = i2c_sda<0 ? HW_PIN_SDA : i2c_sda;
bool isHW = (oldPin[0]==hw_scl && oldPin[1]==hw_sda);
if (isHW) po = PinOwner::HW_I2C;
}
pinManager.deallocateMultiplePins((const uint8_t *)oldPin, 2, po);
type = newType;
setup();
needsRedraw |= true;
} else {

View File

@ -283,18 +283,12 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
JsonArray hw_if_spi = hw[F("if")][F("spi-pin")];
CJSON(spi_mosi, hw_if_spi[0]);
CJSON(spi_sclk, hw_if_spi[1]);
CJSON(spi_cs, hw_if_spi[2]);
PinManagerPinType spi[3] = { { spi_mosi, true }, { spi_sclk, true }, { spi_cs, true } };
if (spi_mosi >= 0 && spi_sclk >= 0 && spi_cs >= 0 && pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) {
#ifdef ESP8266
SPI.begin();
#else
SPI.begin(spi_sclk, (int8_t)-1, spi_mosi, spi_cs);
#endif
PinManagerPinType spi[3] = { { spi_mosi, true }, { spi_sclk, true } };
if (spi_mosi >= 0 && spi_sclk >= 0 && pinManager.allocateMultiplePins(spi, 2, PinOwner::HW_SPI)) {
// do not initialise bus here
} else {
spi_mosi = -1;
spi_sclk = -1;
spi_cs = -1;
}
//int hw_status_pin = hw[F("status")]["pin"]; // -1
@ -752,7 +746,6 @@ void serializeConfig() {
JsonArray hw_if_spi = hw_if.createNestedArray("spi-pin");
hw_if_spi.add(spi_mosi);
hw_if_spi.add(spi_sclk);
hw_if_spi.add(spi_cs);
//JsonObject hw_status = hw.createNestedObject("status");
//hw_status["pin"] = -1;

View File

@ -387,6 +387,7 @@
#if defined(ESP8266) && defined(HW_PIN_CSSPI)
#undef HW_PIN_CSSPI
#endif
// defaults for VSPI
#ifndef HW_PIN_CLOCKSPI
#define HW_PIN_CLOCKSPI SCK
#endif

View File

@ -231,7 +231,6 @@
<i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br>
MOSI:<input type="number" min="-1" max="33" name="MOSI" onchange="check(this,'if')" class="s" placeholder="MOSI">
SCLK:<input type="number" min="-1" max="33" name="SCLK" onchange="check(this,'if')" class="s" placeholder="SCLK">
CS:<input type="number" min="-1" max="33" name="CS" onchange="check(this,'if')" class="s" placeholder="CS">
<div id="um">Loading settings...</div>
<hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button>
</form>

View File

@ -8,7 +8,7 @@
// Autogenerated from wled00/data/style.css, do not edit!!
const uint16_t PAGE_settingsCss_length = 824;
const uint8_t PAGE_settingsCss[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x55, 0x5d, 0x8b, 0x9c, 0x30,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x55, 0x5d, 0x8b, 0x9c, 0x30,
0x14, 0xfd, 0x2b, 0x96, 0x61, 0x61, 0x0b, 0xa3, 0xa8, 0xa3, 0xb3, 0xd3, 0x48, 0xa1, 0xf4, 0xbd,
0x6f, 0xa5, 0x14, 0xca, 0x3e, 0x44, 0x73, 0x1d, 0xc3, 0xe4, 0x43, 0x92, 0xd8, 0x75, 0x2a, 0xfe,
0xf7, 0x26, 0x7e, 0xac, 0xce, 0xac, 0x6c, 0x5f, 0xca, 0xe0, 0xa0, 0xde, 0x98, 0x7b, 0xee, 0xb9,
@ -66,7 +66,7 @@ const uint8_t PAGE_settingsCss[] PROGMEM = {
// Autogenerated from wled00/data/settings.htm, do not edit!!
const uint16_t PAGE_settings_length = 985;
const uint8_t PAGE_settings[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36,
0x10, 0xfe, 0xee, 0x5f, 0xc1, 0xb0, 0x58, 0x23, 0xa1, 0xb2, 0xec, 0x38, 0xc3, 0xb0, 0xc9, 0x96,
0x8b, 0x35, 0x2f, 0x9d, 0x87, 0x04, 0x0d, 0x90, 0xa4, 0xdd, 0x80, 0x7d, 0xa1, 0xc9, 0x93, 0xcc,
0x46, 0x22, 0x05, 0xf2, 0xe4, 0xc4, 0x73, 0xf3, 0xdf, 0x77, 0x94, 0x9d, 0xb7, 0x36, 0xd8, 0x8a,
@ -134,7 +134,7 @@ const uint8_t PAGE_settings[] PROGMEM = {
// Autogenerated from wled00/data/settings_wifi.htm, do not edit!!
const uint16_t PAGE_settings_wifi_length = 1557;
const uint8_t PAGE_settings_wifi[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x57, 0xff, 0x4f, 0xdb, 0x38,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x57, 0xff, 0x4f, 0xdb, 0x38,
0x14, 0xff, 0x3d, 0x7f, 0x85, 0xf1, 0x49, 0x53, 0xa3, 0x85, 0x94, 0xb6, 0xc7, 0x6e, 0x62, 0x49,
0x76, 0x5d, 0xdb, 0x0d, 0xee, 0x18, 0xeb, 0x29, 0x68, 0xe8, 0xa4, 0x93, 0x26, 0x37, 0x79, 0x6d,
0x3d, 0x9c, 0x38, 0x17, 0x3b, 0x2d, 0x88, 0xf1, 0xbf, 0xdf, 0xb3, 0x93, 0x96, 0x16, 0xe8, 0x36,
@ -238,7 +238,7 @@ const uint8_t PAGE_settings_wifi[] PROGMEM = {
// Autogenerated from wled00/data/settings_leds.htm, do not edit!!
const uint16_t PAGE_settings_leds_length = 7355;
const uint8_t PAGE_settings_leds[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3c, 0xed, 0x76, 0xe2, 0xc6,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xed, 0x76, 0xe2, 0xc6,
0x92, 0xff, 0x79, 0x8a, 0x76, 0x27, 0x71, 0xa4, 0x8b, 0x0c, 0x12, 0x1f, 0x8e, 0x07, 0x10, 0xac,
0xb1, 0x3d, 0x13, 0xdf, 0x6b, 0xc7, 0x3e, 0xc6, 0xc9, 0xdc, 0x3d, 0x93, 0x39, 0x19, 0x21, 0x1a,
0xd0, 0x58, 0x48, 0xba, 0x92, 0xb0, 0x87, 0xb5, 0xd9, 0x67, 0xda, 0x67, 0xd8, 0x27, 0xdb, 0xaa,
@ -704,7 +704,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = {
// Autogenerated from wled00/data/settings_dmx.htm, do not edit!!
const uint16_t PAGE_settings_dmx_length = 1612;
const uint8_t PAGE_settings_dmx[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36,
0x10, 0x7d, 0xd7, 0x57, 0x20, 0x78, 0x88, 0xc9, 0x31, 0x43, 0x4a, 0x4e, 0x95, 0x36, 0x32, 0x49,
0x37, 0x56, 0x5c, 0xdb, 0x1d, 0xdb, 0xf5, 0x44, 0x49, 0xd3, 0x4e, 0xd3, 0xe9, 0x40, 0xe4, 0x4a,
0x44, 0x4c, 0x02, 0x2c, 0x00, 0x4a, 0x76, 0x2e, 0xff, 0xde, 0x05, 0x48, 0x5d, 0xec, 0xd8, 0x69,
@ -811,7 +811,7 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = {
// Autogenerated from wled00/data/settings_ui.htm, do not edit!!
const uint16_t PAGE_settings_ui_length = 3090;
const uint8_t PAGE_settings_ui[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48,
0x16, 0xfd, 0xce, 0xaf, 0xe8, 0x74, 0x52, 0x1e, 0x54, 0x56, 0x04, 0x4e, 0x66, 0x6b, 0x13, 0x40,
0x78, 0x63, 0xc7, 0x93, 0x78, 0xca, 0xd9, 0x64, 0x83, 0xbd, 0x99, 0xad, 0xac, 0xcb, 0x23, 0xa4,
0x06, 0x3a, 0x16, 0x92, 0x46, 0xdd, 0x32, 0x66, 0x09, 0xff, 0x7d, 0xcf, 0xed, 0x96, 0x40, 0x60,
@ -1011,7 +1011,7 @@ const uint8_t PAGE_settings_ui[] PROGMEM = {
// Autogenerated from wled00/data/settings_sync.htm, do not edit!!
const uint16_t PAGE_settings_sync_length = 3153;
const uint8_t PAGE_settings_sync[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x5a, 0x6d, 0x77, 0xda, 0xb8,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x5a, 0x6d, 0x77, 0xda, 0xb8,
0x12, 0xfe, 0xee, 0x5f, 0xa1, 0xf8, 0xc3, 0x2e, 0x6c, 0x08, 0x18, 0x12, 0xd2, 0x94, 0x62, 0xf7,
0x86, 0x90, 0x26, 0xec, 0x36, 0x0d, 0x85, 0x64, 0x5f, 0xce, 0xb9, 0xe7, 0xec, 0x11, 0xb6, 0x00,
0x25, 0xb6, 0xe5, 0xb5, 0xe5, 0xbc, 0x9c, 0x6e, 0xff, 0xfb, 0x9d, 0x91, 0x6c, 0x03, 0x06, 0x02,
@ -1215,7 +1215,7 @@ const uint8_t PAGE_settings_sync[] PROGMEM = {
// Autogenerated from wled00/data/settings_time.htm, do not edit!!
const uint16_t PAGE_settings_time_length = 3302;
const uint8_t PAGE_settings_time[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x3a,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x3a,
0xf2, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0xb8, 0xf1, 0xc5, 0x79, 0x42, 0x5a, 0x48, 0x62, 0x77, 0x43,
0x48, 0x0b, 0x2d, 0x09, 0x9c, 0x26, 0xbd, 0xec, 0xf6, 0x71, 0x6e, 0x15, 0x5b, 0x49, 0x0c, 0x8e,
0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x3b, 0x92, 0x1c, 0xe7, 0x85, 0x81, 0xf6, 0xde, 0xfd,
@ -1428,7 +1428,7 @@ const uint8_t PAGE_settings_time[] PROGMEM = {
// Autogenerated from wled00/data/settings_sec.htm, do not edit!!
const uint16_t PAGE_settings_sec_length = 2406;
const uint8_t PAGE_settings_sec[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48,
0x12, 0xfe, 0xee, 0x5f, 0x31, 0x4c, 0xaa, 0x58, 0xeb, 0x22, 0x2c, 0x43, 0x72, 0x5b, 0x09, 0x20,
0xe7, 0x20, 0x90, 0x0d, 0x57, 0x10, 0x28, 0x6c, 0x36, 0x77, 0x95, 0x4b, 0xa5, 0xc6, 0xd2, 0xd8,
0x9a, 0x58, 0xd6, 0x68, 0x67, 0x46, 0x38, 0xbe, 0xec, 0xfe, 0xf7, 0x7b, 0x7a, 0x24, 0xd9, 0x86,
@ -1583,173 +1583,173 @@ const uint8_t PAGE_settings_sec[] PROGMEM = {
// Autogenerated from wled00/data/settings_um.htm, do not edit!!
const uint16_t PAGE_settings_um_length = 2522;
const uint16_t PAGE_settings_um_length = 2514;
const uint8_t PAGE_settings_um[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x58, 0x5b, 0x73, 0xdb, 0xb8,
0x15, 0x7e, 0xf7, 0xaf, 0xa0, 0x11, 0x8f, 0x4d, 0x8e, 0x68, 0x4a, 0x8e, 0xbb, 0xdb, 0x44, 0x12,
0xe4, 0x26, 0x4e, 0x76, 0xa3, 0xe6, 0x62, 0xcf, 0x68, 0x2f, 0xd3, 0x71, 0x3d, 0x6b, 0x9a, 0x84,
0x24, 0xc4, 0x14, 0xc8, 0x02, 0xa0, 0x2f, 0x95, 0xf5, 0xdf, 0xfb, 0x1d, 0x90, 0xd4, 0xc5, 0xb1,
0xd3, 0xcd, 0x76, 0xf6, 0xa5, 0x2f, 0x12, 0x09, 0x1c, 0x1c, 0x9c, 0xf3, 0x9d, 0x3b, 0xfb, 0xdb,
0x6f, 0x4e, 0x8e, 0x7f, 0xfa, 0xc7, 0xe9, 0x5b, 0x6f, 0x6a, 0x67, 0xd9, 0xa0, 0x5f, 0xff, 0x8a,
0x38, 0xf5, 0xb2, 0x58, 0x4d, 0x38, 0x13, 0x8a, 0x0d, 0xfa, 0x33, 0x61, 0x63, 0x2f, 0x99, 0xc6,
0xda, 0x08, 0xcb, 0x59, 0x69, 0xc7, 0xfb, 0x2f, 0x9a, 0xd5, 0x2d, 0x15, 0xcf, 0x04, 0x67, 0xd7,
0x52, 0xdc, 0x14, 0xb9, 0xb6, 0xcc, 0x4b, 0x72, 0x65, 0x85, 0x02, 0xd9, 0x8d, 0x4c, 0xed, 0x94,
0x7f, 0xd7, 0xe9, 0x2c, 0x49, 0x1f, 0x6c, 0xa5, 0xe2, 0x5a, 0x26, 0x62, 0xdf, 0xbd, 0x84, 0x52,
0x49, 0x2b, 0xe3, 0x6c, 0xdf, 0x24, 0x71, 0x26, 0xf8, 0x41, 0x38, 0x8b, 0x6f, 0xe5, 0xac, 0x9c,
0x2d, 0xdf, 0x4b, 0x23, 0xb4, 0x7b, 0x89, 0x2f, 0xf1, 0xae, 0x72, 0xf6, 0xc5, 0xcd, 0x83, 0xbe,
0x95, 0x36, 0x13, 0x83, 0x9f, 0x41, 0x39, 0xcb, 0x53, 0x6f, 0x24, 0xac, 0x95, 0x6a, 0x62, 0xfa,
0xed, 0x6a, 0xbd, 0x6f, 0x12, 0x2d, 0x0b, 0x3b, 0xd8, 0xba, 0x8e, 0xb5, 0x97, 0xdf, 0x28, 0xa1,
0xc3, 0x2c, 0x4f, 0x64, 0x11, 0x96, 0x3a, 0xbf, 0x31, 0x61, 0xca, 0xd3, 0x3c, 0x29, 0x67, 0x90,
0x2f, 0x2c, 0x67, 0xc7, 0xe3, 0x09, 0x9f, 0x2f, 0xc2, 0x42, 0x2a, 0xc3, 0xcf, 0xbe, 0x0f, 0xff,
0x1a, 0xbe, 0x08, 0x5f, 0x86, 0x07, 0x9d, 0xf0, 0xe0, 0xe0, 0x9c, 0x16, 0x4f, 0xf8, 0x19, 0xd3,
0xe6, 0x3a, 0x65, 0xe1, 0x7f, 0xff, 0x3b, 0xa7, 0x5b, 0xf8, 0xf6, 0x41, 0xa8, 0xca, 0xd9, 0x47,
0xde, 0xe9, 0x8d, 0x4b, 0x95, 0x58, 0x99, 0x2b, 0x6f, 0x32, 0x4c, 0x7d, 0x11, 0xcc, 0xb5, 0xb0,
0xa5, 0x56, 0x5e, 0x1a, 0x4d, 0x84, 0x7d, 0x9b, 0x09, 0x12, 0xe0, 0xf5, 0x9d, 0xdb, 0x5a, 0x2c,
0x49, 0xa5, 0x39, 0x59, 0x23, 0x15, 0xbb, 0xbb, 0x2c, 0xbf, 0xfc, 0x2c, 0x12, 0xcb, 0x38, 0xb7,
0x77, 0x85, 0xc8, 0xc7, 0xb4, 0xb6, 0xfd, 0x4a, 0xeb, 0xf8, 0x2e, 0x92, 0xc6, 0xfd, 0x6f, 0x9c,
0x7f, 0xe7, 0x07, 0xf3, 0x1b, 0xa9, 0xd2, 0xfc, 0x26, 0xca, 0x0b, 0xa1, 0x7c, 0x36, 0xb5, 0xb6,
0x30, 0xdd, 0x76, 0x7b, 0x22, 0xed, 0xb4, 0xbc, 0x8c, 0x92, 0x7c, 0xd6, 0x7e, 0x25, 0x75, 0x92,
0xe7, 0xf9, 0x95, 0x14, 0xed, 0x5f, 0x3f, 0xbc, 0x7d, 0xd3, 0xbe, 0x91, 0x57, 0xb2, 0xdd, 0x60,
0xf8, 0xac, 0xac, 0x40, 0xdd, 0x37, 0xf5, 0x02, 0x5b, 0xe3, 0xfe, 0xfa, 0x21, 0xf7, 0xf6, 0x92,
0x2a, 0x64, 0xbf, 0x19, 0x91, 0x8d, 0xd7, 0xa9, 0xb3, 0x3c, 0x4e, 0xff, 0x3e, 0xf2, 0x45, 0x68,
0xf9, 0x76, 0x27, 0x98, 0x67, 0xc2, 0x7a, 0x8a, 0xa7, 0x51, 0xa2, 0x45, 0x6c, 0x45, 0x0d, 0x80,
0xcf, 0x2a, 0x5b, 0xb1, 0xa0, 0xa7, 0x22, 0x30, 0x7b, 0x65, 0xad, 0x96, 0x97, 0xa5, 0x15, 0xd8,
0xd0, 0x09, 0x0b, 0x45, 0x10, 0x3e, 0x5c, 0x27, 0x1c, 0x70, 0x9d, 0x15, 0xb7, 0xb6, 0xfd, 0x39,
0xbe, 0x8e, 0x1b, 0x06, 0x5f, 0x10, 0xc6, 0xe6, 0x4e, 0x81, 0x85, 0x0d, 0xc2, 0x34, 0xba, 0xcc,
0xd3, 0xbb, 0x28, 0x2e, 0x20, 0x74, 0x7a, 0x3c, 0x95, 0x59, 0xea, 0x2b, 0xa2, 0x8f, 0xd3, 0xf4,
0xed, 0x35, 0xa4, 0xf8, 0x20, 0x0d, 0xdc, 0x55, 0x68, 0x9f, 0x91, 0xcc, 0x2c, 0xf4, 0x03, 0x3e,
0x98, 0xff, 0x28, 0xec, 0x2f, 0x7e, 0xb0, 0x78, 0x9c, 0x4e, 0x68, 0x9d, 0x6b, 0x88, 0x07, 0x3a,
0xf8, 0xba, 0xc9, 0x33, 0x11, 0x65, 0xf9, 0xc4, 0x67, 0x6f, 0x69, 0xdd, 0xab, 0x95, 0x07, 0x30,
0xde, 0x58, 0x66, 0xc2, 0xa9, 0x01, 0xe7, 0xd6, 0x50, 0xf7, 0x43, 0xbd, 0x0e, 0x4b, 0xe2, 0xe0,
0x58, 0x4e, 0x4a, 0x1d, 0x3b, 0xb4, 0x2a, 0x35, 0xbc, 0x71, 0x8c, 0x03, 0x69, 0xf4, 0x4f, 0x35,
0x54, 0xb0, 0x55, 0x01, 0xd0, 0x84, 0x57, 0xc4, 0x13, 0xe1, 0xa5, 0xb1, 0x8d, 0xb7, 0x01, 0xef,
0x1a, 0xc0, 0x23, 0x98, 0x83, 0xd1, 0x05, 0x5d, 0xb8, 0x47, 0x6d, 0x17, 0xb8, 0xa0, 0xe3, 0x17,
0x15, 0x3a, 0xb7, 0x79, 0x92, 0x67, 0xbb, 0xbb, 0xbe, 0x73, 0xcb, 0x4e, 0xe8, 0xbb, 0x20, 0xe0,
0x44, 0x91, 0x8d, 0x6c, 0xae, 0xc1, 0x95, 0x5c, 0x71, 0x68, 0xc5, 0x8c, 0x14, 0x4f, 0x86, 0x05,
0x0b, 0x82, 0xfb, 0xfb, 0x9a, 0x0c, 0xe7, 0x67, 0x05, 0x04, 0xfe, 0x01, 0xfc, 0xbd, 0x8f, 0x79,
0x2a, 0x22, 0xef, 0x34, 0x13, 0xb1, 0x11, 0x1e, 0x80, 0x10, 0xda, 0x23, 0xd7, 0xf1, 0x86, 0xa7,
0x10, 0x29, 0xdc, 0xe0, 0x68, 0x36, 0x39, 0x56, 0x91, 0x17, 0x04, 0xa0, 0x4a, 0x21, 0xaf, 0x8b,
0x0d, 0xdc, 0x41, 0x21, 0xc1, 0xca, 0x19, 0x0b, 0x22, 0xa9, 0x00, 0xe8, 0xbb, 0x9f, 0x3e, 0x7e,
0xe0, 0xec, 0x53, 0xee, 0xd5, 0x21, 0x6d, 0x3c, 0xc4, 0xa3, 0x8d, 0x33, 0x82, 0x82, 0x6d, 0x84,
0xc7, 0x0f, 0xeb, 0xe1, 0xc1, 0x39, 0x6f, 0x21, 0x1e, 0xc4, 0x36, 0xe7, 0x7e, 0xe7, 0x7e, 0x33,
0x8e, 0x86, 0x8f, 0x11, 0xf2, 0x2f, 0x08, 0x93, 0xa9, 0x48, 0xae, 0xc8, 0x47, 0x83, 0x39, 0x65,
0x0b, 0xc5, 0x45, 0x44, 0xd9, 0x26, 0xd2, 0xa2, 0xc8, 0xe2, 0x04, 0x5e, 0x74, 0x76, 0x0e, 0x67,
0x83, 0x9c, 0xa6, 0xbc, 0x34, 0x56, 0xfb, 0xfb, 0x87, 0x41, 0x4f, 0x8e, 0x7d, 0x06, 0x3d, 0x2e,
0x85, 0x06, 0xee, 0x22, 0x22, 0x87, 0x44, 0xa0, 0x22, 0x5b, 0xe0, 0x55, 0x35, 0x84, 0x9d, 0xf0,
0x30, 0x08, 0xe6, 0xe3, 0x5c, 0xfb, 0xc4, 0x57, 0x22, 0x1f, 0xc8, 0x3e, 0x65, 0x99, 0x28, 0x13,
0x6a, 0x62, 0xa7, 0x3d, 0xd9, 0x6a, 0x05, 0x60, 0x64, 0xb7, 0x39, 0xa5, 0x99, 0x33, 0x79, 0x1e,
0xcc, 0xf1, 0x2a, 0xa2, 0xeb, 0x38, 0x2b, 0x21, 0x27, 0x91, 0x62, 0x11, 0x7c, 0xe5, 0x18, 0x6c,
0x57, 0x44, 0x40, 0xd8, 0xde, 0xc1, 0xdd, 0x60, 0xda, 0x5c, 0x73, 0x96, 0xc9, 0x99, 0x60, 0xbd,
0x4b, 0xc4, 0xd4, 0xd5, 0xe2, 0x91, 0xf3, 0xf7, 0xf7, 0xf5, 0x4a, 0x7f, 0xff, 0x60, 0xf9, 0x3c,
0x38, 0x7c, 0xf9, 0x05, 0x1f, 0x2d, 0xd2, 0x86, 0xcd, 0xe6, 0xce, 0xf2, 0xcc, 0xe1, 0x11, 0x83,
0x85, 0xd5, 0x44, 0xb0, 0x2e, 0x7b, 0x36, 0x1e, 0x8f, 0xd9, 0x62, 0x21, 0x32, 0x23, 0xe6, 0xe6,
0x46, 0xda, 0x64, 0xea, 0x57, 0xb8, 0x05, 0xf3, 0x04, 0x2e, 0xc2, 0x46, 0x6f, 0x5e, 0xb1, 0x6e,
0xf5, 0x74, 0xfc, 0xa1, 0x7e, 0xfa, 0x78, 0x32, 0x1a, 0xae, 0x16, 0xdf, 0xd7, 0x8f, 0xc7, 0x23,
0xd6, 0x75, 0xd7, 0xf6, 0x52, 0x31, 0x8e, 0xcb, 0xcc, 0x76, 0x2b, 0x9b, 0x2d, 0x08, 0xb9, 0xff,
0x4f, 0xd4, 0x56, 0xce, 0x87, 0xe8, 0x3b, 0xc5, 0x8d, 0xe4, 0xa9, 0x90, 0xa2, 0xca, 0xfd, 0x01,
0x29, 0x4e, 0x39, 0xc5, 0x9e, 0xa9, 0x50, 0x9e, 0x23, 0x4f, 0x9c, 0xb8, 0x0a, 0x10, 0x21, 0xec,
0xb4, 0x14, 0x44, 0x1c, 0xd4, 0xc4, 0x32, 0x08, 0x5c, 0x75, 0xe3, 0x2a, 0x6c, 0x38, 0xc9, 0xa0,
0x47, 0x46, 0xf1, 0xc8, 0x45, 0x1b, 0x87, 0xfc, 0x8a, 0x2b, 0x13, 0xa7, 0xcd, 0x62, 0x22, 0x2b,
0x01, 0xc8, 0x67, 0x2d, 0xd0, 0xb7, 0x7d, 0xd9, 0x40, 0x6f, 0x09, 0xfa, 0x33, 0x7b, 0x3e, 0xe0,
0x1d, 0xe4, 0x14, 0x67, 0x94, 0xa2, 0x34, 0x53, 0x9f, 0xd6, 0x02, 0x57, 0x2b, 0xab, 0x77, 0x27,
0x52, 0xd0, 0xc8, 0xf1, 0x05, 0xf5, 0xd3, 0xa4, 0x4f, 0x88, 0xf2, 0x88, 0x18, 0x4b, 0x6d, 0xe9,
0xea, 0x15, 0x9c, 0x48, 0xd3, 0x3f, 0x48, 0x81, 0xe4, 0x8e, 0x70, 0x0e, 0x01, 0x1e, 0x6a, 0xf1,
0x12, 0x58, 0x85, 0x60, 0x74, 0xe5, 0xbf, 0xc5, 0xf7, 0xfa, 0x53, 0xed, 0x39, 0x63, 0xd5, 0xfd,
0x49, 0xf7, 0xf9, 0xf7, 0x9d, 0xe2, 0x96, 0x0d, 0xf6, 0x7a, 0x2b, 0xec, 0x65, 0xa8, 0x1f, 0xc1,
0x1e, 0x5c, 0x58, 0xa9, 0xae, 0x14, 0x04, 0x27, 0xf7, 0xb2, 0xe4, 0x1c, 0x52, 0x25, 0x59, 0x99,
0x62, 0x13, 0x16, 0x0e, 0x8e, 0xd6, 0x64, 0x00, 0x8b, 0xa0, 0xbb, 0x7a, 0x6f, 0x61, 0xbf, 0x65,
0xdd, 0xea, 0xe2, 0x71, 0x85, 0xd5, 0x0a, 0x7b, 0x0d, 0xa5, 0x75, 0x5f, 0x35, 0x4a, 0x6b, 0x28,
0xbd, 0xa9, 0xdd, 0x99, 0x3e, 0x0f, 0x51, 0x55, 0x1d, 0x74, 0x2e, 0x73, 0x99, 0x30, 0x6b, 0x5a,
0x04, 0xd5, 0xab, 0x63, 0x32, 0xab, 0xc3, 0xf1, 0x32, 0x47, 0x81, 0x8a, 0x15, 0xeb, 0x66, 0x9c,
0xb9, 0x84, 0x77, 0x99, 0xdf, 0xb2, 0xd0, 0xf0, 0xbd, 0xca, 0xed, 0x99, 0xd5, 0xa5, 0x60, 0x7b,
0x2d, 0x5f, 0x1d, 0xb1, 0x2a, 0x21, 0xc2, 0xad, 0xbb, 0xf0, 0x94, 0xca, 0xb5, 0x7b, 0x8e, 0x47,
0x9d, 0xf0, 0xba, 0x86, 0x5f, 0xd4, 0xa7, 0x76, 0xe6, 0x6a, 0xc1, 0x2e, 0xc2, 0xda, 0xcf, 0xb8,
0x5d, 0xf3, 0xab, 0x23, 0x9f, 0x70, 0xf6, 0xd0, 0xda, 0x71, 0x76, 0xf8, 0x92, 0x79, 0x33, 0xa9,
0x38, 0xdb, 0x3f, 0x00, 0xf7, 0x2c, 0x36, 0x86, 0x33, 0xc3, 0xf6, 0x20, 0x2e, 0x93, 0x0a, 0x75,
0xbb, 0xeb, 0x48, 0x51, 0x58, 0x0b, 0xce, 0x62, 0x75, 0xb7, 0xa4, 0xb9, 0xbd, 0xcd, 0xd8, 0x5e,
0x6f, 0x33, 0x37, 0xe0, 0x0c, 0xd5, 0x7d, 0x92, 0x7d, 0x43, 0x8a, 0x07, 0xe6, 0xfc, 0x0e, 0xe6,
0xec, 0xb1, 0x8b, 0xc5, 0x03, 0xe3, 0xc0, 0x11, 0x6b, 0x17, 0x10, 0x8d, 0xac, 0x44, 0x91, 0x8a,
0xdb, 0x93, 0xb1, 0x23, 0x68, 0x1d, 0xa0, 0x4e, 0xd5, 0x24, 0x17, 0xde, 0xce, 0xdc, 0x2e, 0xba,
0x1e, 0x14, 0x5c, 0x42, 0xc6, 0x79, 0x76, 0xd4, 0x6c, 0xf7, 0xa5, 0x2a, 0x4a, 0xeb, 0x11, 0xe4,
0x9c, 0x4d, 0x65, 0x9a, 0xa2, 0x7f, 0xf6, 0xaa, 0x46, 0x75, 0x67, 0x2e, 0x16, 0x5d, 0x3a, 0xbd,
0x33, 0x97, 0x47, 0x14, 0x75, 0xc0, 0x12, 0x32, 0xd6, 0x02, 0x8f, 0x63, 0x98, 0x8c, 0x0d, 0x2e,
0xba, 0x12, 0x75, 0xf0, 0x7f, 0xe6, 0xb6, 0x33, 0xcf, 0x16, 0x60, 0xb6, 0x12, 0x7b, 0x83, 0xd3,
0xce, 0xdc, 0x61, 0xcc, 0x49, 0xf0, 0xa5, 0x05, 0x71, 0xe0, 0xeb, 0xac, 0x77, 0xe6, 0x66, 0x81,
0x1e, 0xc6, 0x31, 0xaa, 0x1d, 0xc6, 0xb7, 0x53, 0x69, 0xc2, 0xbd, 0x9d, 0xf9, 0xd3, 0xc8, 0x2d,
0xf6, 0x02, 0x74, 0xe6, 0x97, 0x7a, 0x70, 0xb1, 0xd8, 0x08, 0xc9, 0x37, 0x3a, 0x2f, 0xd0, 0x99,
0xa8, 0xaa, 0xc8, 0x3e, 0xd5, 0x05, 0x8a, 0x8c, 0xba, 0xdc, 0x00, 0x41, 0xbb, 0xde, 0x1f, 0x9b,
0xd7, 0x77, 0x9f, 0x20, 0x69, 0x13, 0x3c, 0xc1, 0xd9, 0xc1, 0x39, 0x55, 0x5f, 0x89, 0x04, 0x3f,
0xfc, 0x74, 0xfa, 0xf3, 0x4f, 0xa4, 0x99, 0x8c, 0x6c, 0x3c, 0x21, 0x2a, 0x98, 0xb7, 0xf2, 0x8e,
0x6a, 0x11, 0x00, 0xdc, 0xdf, 0xaf, 0xea, 0x74, 0xbd, 0x14, 0x54, 0x22, 0x08, 0xbc, 0x3a, 0x04,
0x7b, 0xd2, 0xd5, 0xad, 0xde, 0x66, 0xe0, 0xc9, 0x28, 0x6e, 0xfa, 0xc8, 0x65, 0xe9, 0x69, 0xb5,
0x74, 0xd5, 0x23, 0x18, 0xbe, 0xbe, 0x8d, 0x40, 0xec, 0x55, 0x3d, 0xe9, 0x36, 0x37, 0x8e, 0x17,
0x84, 0x73, 0xac, 0xd7, 0x17, 0x9c, 0x4f, 0xaf, 0x2f, 0x38, 0x87, 0x5d, 0x5b, 0x78, 0xd0, 0xbc,
0x56, 0xcb, 0xa1, 0xa9, 0x84, 0x0c, 0x16, 0x75, 0x23, 0xf3, 0xb0, 0xc5, 0xa5, 0xa6, 0x70, 0x1f,
0x24, 0xae, 0xc3, 0x94, 0x51, 0x11, 0x6b, 0x80, 0x56, 0x63, 0xd7, 0xe4, 0xfd, 0xba, 0xdf, 0x0d,
0x91, 0x79, 0xd5, 0x92, 0x4f, 0x99, 0x65, 0x1b, 0x46, 0x3a, 0x29, 0xe8, 0xa9, 0x4a, 0x2d, 0x2e,
0x67, 0x12, 0x05, 0x40, 0x13, 0x41, 0x75, 0xa2, 0x47, 0xa0, 0xc9, 0x2f, 0xed, 0x96, 0xbb, 0x73,
0xc8, 0x14, 0x35, 0x9c, 0x28, 0x45, 0xc0, 0x19, 0x46, 0xe0, 0x36, 0x14, 0x1b, 0x0d, 0x37, 0x2a,
0x13, 0x61, 0x4c, 0x7c, 0xaa, 0x8c, 0x8e, 0x52, 0x49, 0x1b, 0x9f, 0xd0, 0x5a, 0x9a, 0xf5, 0xe4,
0x3e, 0x5f, 0xdf, 0x40, 0x82, 0x6f, 0x6a, 0xb3, 0x88, 0x48, 0x5b, 0xe8, 0x4f, 0x0b, 0xb0, 0x35,
0xb5, 0x9a, 0xe4, 0x34, 0x22, 0x1d, 0x92, 0x23, 0x72, 0x1b, 0x6c, 0xfa, 0xdd, 0x50, 0x8d, 0xf3,
0x46, 0xa1, 0x46, 0xfa, 0x47, 0x3c, 0x8b, 0x44, 0xaf, 0x6e, 0x27, 0xff, 0x81, 0x67, 0xa3, 0x3b,
0x5f, 0x4d, 0x5b, 0x76, 0x77, 0x57, 0x9e, 0x75, 0xce, 0x8f, 0xe8, 0x27, 0x72, 0x70, 0x4e, 0xf3,
0x2c, 0x45, 0xc9, 0xb5, 0x5d, 0x2a, 0x3e, 0xb4, 0x0b, 0x09, 0x51, 0x8b, 0xd0, 0xdc, 0xbf, 0x4a,
0x3f, 0x63, 0x5f, 0x59, 0x6a, 0x66, 0x31, 0x7d, 0x8c, 0xd1, 0x25, 0x43, 0x7b, 0x94, 0xdc, 0x5d,
0x75, 0x69, 0x8a, 0x1e, 0x6b, 0x21, 0xbf, 0xaf, 0x4d, 0x47, 0xd4, 0x0e, 0xcf, 0xc7, 0x82, 0xf2,
0x34, 0xb5, 0xdc, 0x47, 0x6e, 0x54, 0xc3, 0xa4, 0xc6, 0x5a, 0xae, 0x65, 0xa6, 0xfc, 0xdb, 0x62,
0xed, 0x64, 0x3c, 0x89, 0x3e, 0x1b, 0x40, 0x1c, 0xce, 0x31, 0x5a, 0x4f, 0xf3, 0xb4, 0xcb, 0xa0,
0x04, 0x5b, 0x04, 0x91, 0x9d, 0x62, 0x02, 0xc3, 0x00, 0x02, 0x20, 0xf2, 0xab, 0xa6, 0xa5, 0x46,
0x6a, 0xd1, 0x9a, 0x4a, 0xbc, 0xeb, 0x45, 0x52, 0x69, 0x20, 0xf3, 0x1d, 0x25, 0xda, 0x4c, 0x2a,
0x81, 0xf0, 0x12, 0x8e, 0x99, 0x8f, 0x7e, 0x7c, 0x79, 0x9e, 0xac, 0x5d, 0xcd, 0xc1, 0x22, 0x2a,
0x67, 0xe1, 0xaa, 0x27, 0xa9, 0x52, 0x0a, 0x67, 0x2c, 0xa4, 0x02, 0xea, 0x48, 0xd6, 0xbb, 0x13,
0x40, 0xfb, 0x48, 0x85, 0xac, 0xc9, 0x96, 0xd9, 0x68, 0xaa, 0x07, 0xfd, 0xe9, 0xe1, 0x80, 0x32,
0x4d, 0xbf, 0x8d, 0x87, 0x8b, 0x70, 0xad, 0x8e, 0x2d, 0x6b, 0x29, 0x32, 0x43, 0x8f, 0x51, 0x90,
0xba, 0x73, 0x4d, 0x9e, 0xe6, 0x6c, 0x39, 0x0e, 0x6c, 0xce, 0x4a, 0x2a, 0xc7, 0xa0, 0x94, 0x97,
0x2a, 0x8d, 0x28, 0xdf, 0x9c, 0x6a, 0x61, 0x8c, 0xd7, 0x97, 0x83, 0x51, 0x7c, 0x2d, 0xfa, 0x6d,
0x39, 0xf0, 0x6c, 0xee, 0xd5, 0x5f, 0x19, 0xe4, 0xbf, 0x31, 0x39, 0x55, 0xc5, 0xc3, 0x60, 0x92,
0x08, 0x1f, 0x9b, 0x3b, 0xaa, 0xaf, 0x02, 0xf5, 0xb4, 0xfa, 0x15, 0x53, 0x34, 0xb3, 0x6e, 0xdb,
0x00, 0xc4, 0xa3, 0x82, 0xbf, 0x60, 0x21, 0x1a, 0x0c, 0x58, 0x02, 0x13, 0x17, 0x35, 0xc0, 0x80,
0xf2, 0x77, 0xd8, 0x20, 0x5c, 0x9f, 0x17, 0xc5, 0xc6, 0x3c, 0x67, 0xae, 0x47, 0xd4, 0x0a, 0x0a,
0xcc, 0x6e, 0x82, 0xc6, 0xcd, 0x37, 0x95, 0xe0, 0x3e, 0x0d, 0xb0, 0xa3, 0x71, 0xe4, 0x12, 0xf1,
0x2f, 0xd0, 0x29, 0x95, 0xf6, 0xce, 0x47, 0x35, 0x73, 0xab, 0x48, 0xc7, 0x33, 0x09, 0x9a, 0xc5,
0x56, 0xbf, 0x5d, 0x7f, 0xf7, 0xe8, 0xbb, 0x9b, 0x07, 0x7f, 0x93, 0x33, 0xfa, 0x5c, 0xe2, 0x95,
0x3a, 0xf3, 0x59, 0xdd, 0x9c, 0x22, 0x09, 0x05, 0x3d, 0x10, 0x3a, 0x02, 0x18, 0x44, 0xc4, 0x29,
0x72, 0x36, 0x86, 0x63, 0xe4, 0x7b, 0x42, 0x80, 0x33, 0x78, 0x25, 0xd2, 0x38, 0xcc, 0x3c, 0xdb,
0xf2, 0x24, 0xde, 0xe9, 0xe9, 0x37, 0xd3, 0x54, 0x8c, 0xd1, 0x18, 0xc5, 0xdc, 0xf9, 0x21, 0x67,
0x45, 0x6e, 0x2c, 0xc3, 0xb9, 0x4a, 0x02, 0x14, 0x75, 0x12, 0x9f, 0xe4, 0x26, 0x06, 0xa9, 0xbc,
0x6e, 0x0a, 0xb9, 0xcd, 0x31, 0x4b, 0xde, 0xb0, 0xc1, 0xd6, 0xfa, 0xe2, 0x54, 0x64, 0xc5, 0x6b,
0xaa, 0x17, 0xa5, 0xb5, 0x50, 0xbd, 0x2a, 0x57, 0xd5, 0x0b, 0xf1, 0x4c, 0x32, 0x99, 0x5c, 0x71,
0xf6, 0x8e, 0x84, 0x39, 0xea, 0xb7, 0xab, 0x0d, 0x08, 0x0c, 0x0e, 0xcb, 0x33, 0x5b, 0x4f, 0x1c,
0x7a, 0x4d, 0x87, 0x5e, 0xc7, 0xc9, 0xd5, 0xea, 0xdc, 0xc6, 0x2d, 0x95, 0xbc, 0xac, 0x76, 0x97,
0x25, 0x89, 0x86, 0x80, 0xa6, 0x88, 0x95, 0xd3, 0x3a, 0x33, 0xa6, 0x4c, 0x96, 0x6d, 0x85, 0xeb,
0xe9, 0xbb, 0x13, 0x2d, 0x84, 0xea, 0xd5, 0xf6, 0xec, 0xaa, 0x1c, 0xc6, 0x1c, 0xec, 0x3e, 0x3b,
0xe8, 0x74, 0x3a, 0x7f, 0xe9, 0x79, 0xc7, 0x9b, 0xc3, 0x3c, 0x58, 0xa7, 0xdb, 0x64, 0x11, 0x30,
0x1c, 0x78, 0xeb, 0x7c, 0xc9, 0x37, 0x36, 0xf9, 0x62, 0x88, 0x78, 0xc0, 0x75, 0x6b, 0xf7, 0xd9,
0xcb, 0x17, 0x2f, 0x5e, 0x10, 0xd7, 0x32, 0x4b, 0x9d, 0xbb, 0x93, 0x71, 0x36, 0xa3, 0x20, 0xaa,
0xb9, 0xbb, 0x10, 0xab, 0x80, 0x99, 0x3e, 0x5f, 0xff, 0x26, 0x56, 0x16, 0x30, 0xf0, 0xf3, 0xc1,
0xd6, 0x8f, 0x59, 0x7e, 0x19, 0x67, 0xde, 0xb0, 0x6f, 0xca, 0x62, 0xf0, 0x1c, 0xa7, 0xf0, 0x77,
0xec, 0xfd, 0x78, 0x3a, 0x3c, 0x31, 0x9e, 0xff, 0xee, 0xd7, 0x80, 0x54, 0xef, 0xcb, 0x4d, 0x99,
0xea, 0x99, 0x65, 0xb0, 0xe5, 0xc3, 0x2f, 0xee, 0xe8, 0x8b, 0xa0, 0x9a, 0xd0, 0xf7, 0x38, 0xfa,
0xb4, 0xf1, 0x76, 0x74, 0x7a, 0xf8, 0x3c, 0xac, 0xd6, 0x84, 0xa7, 0xc5, 0xbf, 0x4a, 0x89, 0x08,
0xc4, 0x03, 0xda, 0x4c, 0xbb, 0x1d, 0x50, 0x04, 0x12, 0x4b, 0xcc, 0x80, 0xdd, 0xba, 0x19, 0xa9,
0x2d, 0x55, 0xd7, 0xe2, 0x55, 0x37, 0x58, 0xf5, 0x87, 0x87, 0x4b, 0xe7, 0xc2, 0xd4, 0x48, 0x66,
0x74, 0x8c, 0xf9, 0xde, 0x5a, 0xe3, 0x41, 0xe3, 0x5c, 0xb0, 0xe7, 0x6d, 0x2d, 0xdb, 0x47, 0x6f,
0x3d, 0x17, 0xbb, 0x83, 0x03, 0x0f, 0x53, 0x65, 0x77, 0xa3, 0xfb, 0x79, 0xfa, 0xbe, 0xfa, 0x8b,
0x22, 0x0d, 0xa7, 0x5f, 0xbd, 0xf0, 0xa9, 0xfb, 0x70, 0x8e, 0x70, 0xf7, 0xb6, 0x1e, 0x1b, 0x23,
0x6a, 0xbc, 0x47, 0xa7, 0xc3, 0x3f, 0x1f, 0x64, 0x1a, 0xaa, 0xbf, 0x11, 0x65, 0x37, 0x87, 0xff,
0x21, 0x98, 0xdd, 0x49, 0x87, 0xf3, 0xfb, 0x6f, 0x07, 0xfa, 0xfd, 0x1f, 0x45, 0xfa, 0x3d, 0xae,
0x3c, 0x1e, 0x7d, 0xa3, 0x92, 0xc7, 0xa3, 0xdf, 0x7b, 0xdd, 0xd6, 0xc6, 0x7d, 0x38, 0x57, 0xe5,
0x2e, 0x0a, 0x56, 0xd4, 0x89, 0x41, 0xf3, 0xbd, 0xae, 0x49, 0xfe, 0x51, 0x14, 0x35, 0xc1, 0xa6,
0xff, 0x9c, 0x4c, 0x84, 0xac, 0x41, 0x39, 0x17, 0x31, 0x4d, 0x79, 0x99, 0x92, 0x34, 0x7d, 0xa9,
0xff, 0x0f, 0x76, 0xa1, 0x03, 0xfa, 0xbf, 0x17, 0x00, 0x00
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x58, 0xdb, 0x72, 0xdb, 0x38,
0x12, 0x7d, 0xd7, 0x57, 0xd0, 0x88, 0xcb, 0x26, 0x4b, 0x34, 0x25, 0xc7, 0x3b, 0xb3, 0x89, 0x24,
0xc8, 0x93, 0x38, 0xc9, 0x44, 0x9b, 0x8b, 0x5d, 0xa5, 0xb9, 0xd4, 0x96, 0xd7, 0x35, 0xa6, 0x44,
0x48, 0x42, 0x4c, 0x81, 0x5c, 0x00, 0xf4, 0x65, 0x65, 0xfd, 0xfb, 0x9e, 0x06, 0x49, 0x5d, 0x1c,
0x3b, 0xb3, 0x33, 0x5b, 0xfb, 0xb2, 0x2f, 0x12, 0x09, 0x36, 0x9a, 0x8d, 0xd3, 0xdd, 0xa7, 0xbb,
0xd9, 0xdb, 0x79, 0x73, 0x7a, 0xf2, 0xd3, 0xdf, 0xcf, 0xde, 0x7a, 0x33, 0x3b, 0x4f, 0xfb, 0xbd,
0xea, 0x57, 0xc4, 0x89, 0x97, 0xc6, 0x6a, 0xca, 0x99, 0x50, 0xac, 0xdf, 0x9b, 0x0b, 0x1b, 0x7b,
0xe3, 0x59, 0xac, 0x8d, 0xb0, 0x9c, 0x15, 0x76, 0x72, 0xf0, 0xa2, 0x5e, 0x6d, 0xa8, 0x78, 0x2e,
0x38, 0xbb, 0x96, 0xe2, 0x26, 0xcf, 0xb4, 0x65, 0xde, 0x38, 0x53, 0x56, 0x28, 0x88, 0xdd, 0xc8,
0xc4, 0xce, 0xf8, 0x77, 0xed, 0xf6, 0x4a, 0xf4, 0xc1, 0xa3, 0x44, 0x5c, 0xcb, 0xb1, 0x38, 0x70,
0x37, 0xa1, 0x54, 0xd2, 0xca, 0x38, 0x3d, 0x30, 0xe3, 0x38, 0x15, 0xfc, 0x30, 0x9c, 0xc7, 0xb7,
0x72, 0x5e, 0xcc, 0x57, 0xf7, 0x85, 0x11, 0xda, 0xdd, 0xc4, 0x23, 0xdc, 0xab, 0x8c, 0x7d, 0xf5,
0xe6, 0x7e, 0xcf, 0x4a, 0x9b, 0x8a, 0xfe, 0xcf, 0x90, 0x9c, 0x67, 0x89, 0x37, 0x14, 0xd6, 0x4a,
0x35, 0x35, 0xbd, 0x56, 0xb9, 0xde, 0x33, 0x63, 0x2d, 0x73, 0xdb, 0x6f, 0x5c, 0xc7, 0xda, 0xcb,
0x6e, 0x94, 0xd0, 0x61, 0x9a, 0x8d, 0x65, 0x1e, 0x16, 0x3a, 0xbb, 0x31, 0x61, 0xc2, 0x93, 0x6c,
0x5c, 0xcc, 0x61, 0x5f, 0x58, 0xcc, 0x4f, 0x26, 0x53, 0xbe, 0x58, 0x86, 0xb9, 0x54, 0x86, 0x9f,
0x7f, 0x1f, 0xfe, 0x35, 0x7c, 0x11, 0xbe, 0x0c, 0x0f, 0xdb, 0xe1, 0xe1, 0xe1, 0x05, 0x2d, 0x9e,
0xf2, 0x73, 0xa6, 0xcd, 0x75, 0xc2, 0xc2, 0xdf, 0xff, 0xbb, 0xa0, 0xb7, 0xf0, 0x9d, 0xc3, 0x50,
0x15, 0xf3, 0x4f, 0xbc, 0xdd, 0x9d, 0x14, 0x6a, 0x6c, 0x65, 0xa6, 0xbc, 0xe9, 0x20, 0xf1, 0x45,
0xb0, 0xd0, 0xc2, 0x16, 0x5a, 0x79, 0x49, 0x34, 0x15, 0xf6, 0x6d, 0x2a, 0xc8, 0x80, 0xd7, 0x77,
0xee, 0xd1, 0x72, 0x25, 0x2a, 0xcd, 0xe9, 0x86, 0xa8, 0xd8, 0xdb, 0x63, 0xd9, 0xe8, 0x8b, 0x18,
0x5b, 0xc6, 0xb9, 0xbd, 0xcb, 0x45, 0x36, 0xa1, 0xb5, 0x9d, 0x57, 0x5a, 0xc7, 0x77, 0x91, 0x34,
0xee, 0x7f, 0x6b, 0xff, 0x7b, 0x3f, 0x58, 0xdc, 0x48, 0x95, 0x64, 0x37, 0x51, 0x96, 0x0b, 0xe5,
0xb3, 0x99, 0xb5, 0xb9, 0xe9, 0xb4, 0x5a, 0x53, 0x69, 0x67, 0xc5, 0x28, 0x1a, 0x67, 0xf3, 0xd6,
0x2b, 0xa9, 0xc7, 0x59, 0x96, 0x5d, 0x49, 0xd1, 0xfa, 0xf5, 0xe3, 0xdb, 0x37, 0xad, 0x1b, 0x79,
0x25, 0x5b, 0x35, 0x86, 0xcf, 0x8a, 0x12, 0xd4, 0x03, 0x53, 0x2d, 0xb0, 0x0d, 0xed, 0xaf, 0x1f,
0x6a, 0x6f, 0xad, 0xa4, 0x42, 0xf6, 0x9b, 0x11, 0xe9, 0x64, 0x53, 0x3a, 0xcd, 0xe2, 0xe4, 0x6f,
0x43, 0x5f, 0x84, 0x96, 0xef, 0xb4, 0x83, 0x45, 0x2a, 0xac, 0xa7, 0x78, 0x12, 0x8d, 0xb5, 0x88,
0xad, 0xa8, 0x00, 0xf0, 0x59, 0xe9, 0x2b, 0x16, 0x74, 0x55, 0x04, 0x65, 0xaf, 0xac, 0xd5, 0x72,
0x54, 0x58, 0x81, 0x07, 0x7a, 0xcc, 0x42, 0x11, 0x84, 0x0f, 0xd7, 0x09, 0x07, 0xbc, 0xce, 0x8a,
0x5b, 0xdb, 0xfa, 0x12, 0x5f, 0xc7, 0xb5, 0x82, 0xaf, 0x04, 0x63, 0x73, 0xa7, 0xa0, 0xc2, 0x06,
0x61, 0x12, 0x8d, 0xb2, 0xe4, 0x2e, 0x8a, 0x73, 0x18, 0x9d, 0x9c, 0xcc, 0x64, 0x9a, 0xf8, 0x8a,
0xe4, 0xe3, 0x24, 0x79, 0x7b, 0x0d, 0x2b, 0x3e, 0x4a, 0x83, 0x70, 0x15, 0xda, 0x67, 0x64, 0x33,
0x0b, 0xfd, 0x80, 0xf7, 0x17, 0x3f, 0x0a, 0xfb, 0x8b, 0x1f, 0x2c, 0x1f, 0x97, 0x13, 0x5a, 0x67,
0x1a, 0xe6, 0x41, 0x0e, 0xb1, 0x6e, 0xb2, 0x54, 0x44, 0x69, 0x36, 0xf5, 0xd9, 0x5b, 0x5a, 0xf7,
0xaa, 0xc3, 0x03, 0x18, 0x6f, 0x22, 0x53, 0xe1, 0x8e, 0x81, 0xe0, 0xd6, 0x38, 0xee, 0xc7, 0x6a,
0x1d, 0x9e, 0xc4, 0xc6, 0x89, 0x9c, 0x16, 0x3a, 0x76, 0x68, 0x95, 0xc7, 0xf0, 0x26, 0x31, 0x36,
0x24, 0xd1, 0x3f, 0xd4, 0x40, 0xc1, 0x57, 0x39, 0x40, 0x13, 0x5e, 0x1e, 0x4f, 0x85, 0x97, 0xc4,
0x36, 0xde, 0x01, 0xbc, 0x1b, 0x00, 0x0f, 0xe1, 0x0e, 0x46, 0x2f, 0xe8, 0x20, 0x3c, 0x2a, 0xbf,
0x20, 0x04, 0x9d, 0xbe, 0x28, 0xd7, 0x99, 0xcd, 0xc6, 0x59, 0xba, 0xb7, 0xe7, 0xbb, 0xb0, 0x6c,
0x87, 0xbe, 0x4b, 0x02, 0x4e, 0x12, 0xe9, 0xd0, 0x66, 0x1a, 0x5a, 0x29, 0x14, 0x07, 0x56, 0xcc,
0xe9, 0xe0, 0xe3, 0x41, 0xce, 0x82, 0xe0, 0xfe, 0xbe, 0x12, 0xc3, 0xfe, 0x79, 0x0e, 0x83, 0xdf,
0x41, 0xbf, 0xf7, 0x29, 0x4b, 0x44, 0xe4, 0x9d, 0xa5, 0x22, 0x36, 0xc2, 0x03, 0x10, 0x42, 0x7b,
0x14, 0x3a, 0xde, 0xe0, 0x0c, 0x26, 0x85, 0x5b, 0x1a, 0xcd, 0xb6, 0xc6, 0x32, 0xf3, 0x82, 0x00,
0x52, 0x09, 0xec, 0x75, 0xb9, 0x81, 0x77, 0x50, 0x4a, 0xb0, 0x62, 0xce, 0x82, 0x48, 0x2a, 0x00,
0xfa, 0xfe, 0xa7, 0x4f, 0x1f, 0x39, 0xfb, 0x9c, 0x79, 0x55, 0x4a, 0x1b, 0x0f, 0xf9, 0x68, 0xe3,
0x94, 0xa0, 0x60, 0x5b, 0xe9, 0xf1, 0x6e, 0x33, 0x3d, 0x38, 0xe7, 0x4d, 0xe4, 0x83, 0xd8, 0xe1,
0xdc, 0x6f, 0xdf, 0x6f, 0xe7, 0xd1, 0xe0, 0x31, 0x41, 0xfe, 0x95, 0xe0, 0x78, 0x26, 0xc6, 0x57,
0x14, 0xa3, 0xc1, 0x82, 0xd8, 0x42, 0x71, 0x11, 0x11, 0xdb, 0x44, 0x5a, 0xe4, 0x69, 0x3c, 0x46,
0x14, 0x9d, 0x5f, 0x20, 0xd8, 0x60, 0xa7, 0x29, 0x46, 0xc6, 0x6a, 0xff, 0xe0, 0x28, 0xe8, 0xca,
0x89, 0xcf, 0x70, 0x8e, 0x91, 0xd0, 0xc0, 0x5d, 0x44, 0x14, 0x90, 0x48, 0x54, 0xb0, 0x05, 0x6e,
0x55, 0x2d, 0xd8, 0x0e, 0x8f, 0x82, 0x60, 0x31, 0xc9, 0xb4, 0x4f, 0x7a, 0x25, 0xf8, 0x40, 0xf6,
0x88, 0x65, 0xa2, 0x54, 0xa8, 0xa9, 0x9d, 0x75, 0x65, 0xb3, 0x19, 0x40, 0x91, 0xdd, 0xe1, 0x44,
0x33, 0xe7, 0xf2, 0x22, 0x58, 0xe0, 0x56, 0x44, 0xd7, 0x71, 0x5a, 0xc0, 0x4e, 0x12, 0xc5, 0x22,
0xf4, 0xca, 0x09, 0xd4, 0xae, 0x85, 0x80, 0xb0, 0xbd, 0x43, 0xb8, 0xc1, 0xb5, 0x99, 0xe6, 0x2c,
0x95, 0x73, 0xc1, 0xba, 0x23, 0xe4, 0xd4, 0xd5, 0xf2, 0x91, 0xfd, 0xf7, 0xf7, 0xd5, 0x4a, 0xef,
0xe0, 0x70, 0x75, 0xdd, 0x3f, 0x7a, 0xf9, 0x95, 0x1e, 0x2d, 0x92, 0x5a, 0xcd, 0xf6, 0x93, 0xd5,
0x9e, 0xa3, 0x63, 0x06, 0x0f, 0xab, 0xa9, 0x60, 0x1d, 0xf6, 0x6c, 0x32, 0x99, 0xb0, 0xe5, 0x52,
0xa4, 0x46, 0x2c, 0xcc, 0x8d, 0xb4, 0xe3, 0x99, 0x5f, 0xe2, 0x16, 0x2c, 0xc6, 0x08, 0x11, 0x36,
0x7c, 0xf3, 0x8a, 0x75, 0xca, 0xab, 0x93, 0x8f, 0xd5, 0xd5, 0xa7, 0xd3, 0xe1, 0x60, 0xbd, 0xf8,
0xa1, 0xba, 0x3c, 0x19, 0xb2, 0x8e, 0x7b, 0x6d, 0x37, 0x11, 0x93, 0xb8, 0x48, 0x6d, 0xa7, 0xf4,
0xd9, 0x92, 0x90, 0xfb, 0xff, 0x44, 0x6d, 0x1d, 0x7c, 0xc8, 0xbe, 0x33, 0xbc, 0x91, 0x22, 0x15,
0x56, 0x94, 0xdc, 0x1f, 0xd0, 0xc1, 0x89, 0x53, 0xec, 0xb9, 0x0a, 0xe5, 0x05, 0x78, 0xe2, 0xd4,
0x55, 0x80, 0x08, 0x69, 0xa7, 0xa5, 0x20, 0xe1, 0xa0, 0x12, 0x96, 0x41, 0xe0, 0xaa, 0x1b, 0x57,
0x61, 0xad, 0x49, 0x06, 0x5d, 0x72, 0x8a, 0x47, 0x21, 0x5a, 0x07, 0xe4, 0x37, 0x42, 0x99, 0x34,
0x6d, 0x17, 0x13, 0x59, 0x1a, 0x40, 0x31, 0x6b, 0x81, 0xbe, 0xed, 0xc9, 0x1a, 0x7a, 0x4b, 0xd0,
0x9f, 0xdb, 0x8b, 0x3e, 0x6f, 0x83, 0x53, 0x9c, 0x53, 0xf2, 0xc2, 0xcc, 0x7c, 0x5a, 0x0b, 0x5c,
0xad, 0x2c, 0xef, 0x9d, 0x49, 0x41, 0x6d, 0xc7, 0x57, 0xd2, 0x4f, 0x8b, 0x3e, 0x61, 0xca, 0x23,
0x66, 0xac, 0x4e, 0x4b, 0xaf, 0x5e, 0xc3, 0x09, 0x9a, 0x7e, 0x27, 0x05, 0xc8, 0x1d, 0xe9, 0x1c,
0x02, 0x3c, 0xd4, 0xe2, 0x15, 0xb0, 0x0a, 0xc9, 0xe8, 0xca, 0x7f, 0x93, 0xef, 0xf7, 0x66, 0xda,
0x73, 0xce, 0xaa, 0xfa, 0x93, 0xce, 0xf3, 0xef, 0xdb, 0xf9, 0x2d, 0xeb, 0xef, 0x77, 0xd7, 0xd8,
0xcb, 0x50, 0x3f, 0x82, 0x3d, 0xb4, 0xb0, 0x42, 0x5d, 0x29, 0x18, 0x4e, 0xe1, 0x65, 0x29, 0x38,
0xa4, 0x1a, 0xa7, 0x45, 0x82, 0x87, 0xf0, 0x70, 0x70, 0xbc, 0x61, 0x03, 0x54, 0x04, 0x9d, 0xf5,
0x7d, 0x13, 0xcf, 0x9b, 0xd6, 0xad, 0x2e, 0x1f, 0x3f, 0xb0, 0x5a, 0x63, 0xaf, 0x71, 0x68, 0xdd,
0x53, 0xf5, 0xa1, 0x35, 0x0e, 0xbd, 0x7d, 0xba, 0x73, 0x7d, 0x11, 0xa2, 0xaa, 0x3a, 0xe8, 0x1c,
0x73, 0x99, 0x30, 0xad, 0x5b, 0x04, 0xd5, 0xad, 0x72, 0x32, 0xad, 0xd2, 0x71, 0x94, 0xa1, 0x40,
0xc5, 0x8a, 0x75, 0x52, 0xce, 0x1c, 0xe1, 0x8d, 0xb2, 0x5b, 0x16, 0x1a, 0xbe, 0x5f, 0x86, 0x3d,
0xb3, 0xba, 0x10, 0x6c, 0xbf, 0xe9, 0xab, 0x63, 0x56, 0x12, 0x22, 0xc2, 0xba, 0x83, 0x48, 0x29,
0x43, 0xbb, 0xeb, 0x74, 0x54, 0x84, 0xd7, 0x31, 0xfc, 0xb2, 0xda, 0xb5, 0xbb, 0x50, 0x4b, 0x76,
0x19, 0x56, 0x71, 0xc6, 0xed, 0x46, 0x5c, 0x1d, 0xfb, 0x84, 0xb3, 0x87, 0xd6, 0x8e, 0xb3, 0xa3,
0x97, 0xcc, 0x9b, 0x4b, 0xc5, 0xd9, 0xc1, 0x21, 0xb4, 0xa7, 0xb1, 0x31, 0x9c, 0x19, 0xb6, 0x0f,
0x73, 0x99, 0x54, 0xa8, 0xdb, 0x1d, 0x27, 0x8a, 0xc2, 0x9a, 0x73, 0x16, 0xab, 0xbb, 0x95, 0xcc,
0xed, 0x6d, 0xca, 0xf6, 0xbb, 0xdb, 0xdc, 0x80, 0x3d, 0x54, 0xf7, 0xc9, 0xf6, 0x2d, 0x2b, 0x1e,
0xb8, 0xf3, 0x3b, 0xb8, 0xb3, 0xcb, 0x2e, 0x97, 0x0f, 0x9c, 0x83, 0x40, 0xac, 0x42, 0x40, 0xd4,
0xb6, 0x92, 0x44, 0x22, 0x6e, 0x4f, 0x27, 0x4e, 0xa0, 0x79, 0x88, 0x3a, 0x55, 0x89, 0x5c, 0x7a,
0xbb, 0x0b, 0xbb, 0xec, 0x78, 0x38, 0xe0, 0x0a, 0x32, 0xce, 0xd3, 0xe3, 0xfa, 0x71, 0x4f, 0xaa,
0xbc, 0xb0, 0x1e, 0x41, 0xce, 0xd9, 0x4c, 0x26, 0x09, 0xfa, 0x67, 0xaf, 0x6c, 0x54, 0x77, 0x17,
0x62, 0xd9, 0xa1, 0xdd, 0xbb, 0x0b, 0x79, 0x4c, 0x59, 0x07, 0x2c, 0x61, 0x63, 0x65, 0xf0, 0x24,
0x86, 0xcb, 0x58, 0xff, 0xb2, 0x23, 0x51, 0x07, 0xff, 0x6b, 0x6d, 0xbb, 0x8b, 0x74, 0x09, 0x65,
0x6b, 0xb3, 0xb7, 0x34, 0xed, 0x2e, 0x1c, 0xc6, 0x9c, 0x0c, 0x5f, 0x79, 0x10, 0x1b, 0xbe, 0xad,
0x7a, 0x77, 0x61, 0x96, 0xe8, 0x61, 0x9c, 0xa2, 0x2a, 0x60, 0x7c, 0x3b, 0x93, 0x26, 0xdc, 0xdf,
0x5d, 0x3c, 0x8d, 0xdc, 0x72, 0x3f, 0x40, 0x67, 0x3e, 0xd2, 0xfd, 0xcb, 0xe5, 0x56, 0x4a, 0xbe,
0xd1, 0x59, 0x8e, 0xce, 0x44, 0x95, 0x45, 0xf6, 0xa9, 0x2e, 0x50, 0xa4, 0xd4, 0xe5, 0x06, 0x48,
0xda, 0xcd, 0xfe, 0xd8, 0xbc, 0xbe, 0xfb, 0x0c, 0x4b, 0xeb, 0xe4, 0x09, 0xce, 0x0f, 0x2f, 0xa8,
0xfa, 0x4a, 0x10, 0xfc, 0xe0, 0xf3, 0xd9, 0xcf, 0x3f, 0xd1, 0xc9, 0x64, 0x64, 0xe3, 0x29, 0x49,
0xc1, 0xbd, 0x65, 0x74, 0x94, 0x8b, 0x00, 0xe0, 0xfe, 0x7e, 0x5d, 0xa7, 0xab, 0xa5, 0xa0, 0x34,
0x41, 0xe0, 0xd6, 0x21, 0xd8, 0x95, 0xae, 0x6e, 0x75, 0xb7, 0x13, 0x4f, 0x46, 0x71, 0xdd, 0x47,
0xae, 0x4a, 0x4f, 0xb3, 0xa9, 0xcb, 0x1e, 0xc1, 0xf0, 0xcd, 0xc7, 0x48, 0xc4, 0x6e, 0xd9, 0x93,
0xee, 0x70, 0xe3, 0x74, 0xc1, 0x38, 0xa7, 0x7a, 0x73, 0xc1, 0xc5, 0xf4, 0xe6, 0x82, 0x0b, 0xd8,
0x8d, 0x85, 0x07, 0xcd, 0x6b, 0xb9, 0x1c, 0x9a, 0xd2, 0xc8, 0x60, 0x59, 0x35, 0x32, 0x0f, 0x5b,
0x5c, 0x6a, 0x0a, 0x0f, 0x20, 0xe2, 0x3a, 0x4c, 0x19, 0xe5, 0xb1, 0x06, 0x68, 0x15, 0x76, 0x35,
0xef, 0x57, 0xfd, 0x6e, 0x08, 0xe6, 0x55, 0x2b, 0x3d, 0x45, 0x9a, 0x6e, 0x39, 0xe9, 0x34, 0xa7,
0xab, 0x92, 0x5a, 0x1c, 0x67, 0x92, 0x04, 0x40, 0x13, 0x41, 0xb9, 0xa3, 0x4b, 0xa0, 0xc9, 0xaf,
0xfd, 0x96, 0xb9, 0x7d, 0x60, 0x8a, 0x0a, 0x4e, 0x94, 0x22, 0xe0, 0x0c, 0x27, 0x70, 0x1b, 0x8a,
0xad, 0x86, 0x1b, 0x95, 0x89, 0x30, 0x26, 0x3d, 0x25, 0xa3, 0xa3, 0x54, 0xd2, 0x83, 0xcf, 0x68,
0x2d, 0xcd, 0x26, 0xb9, 0x2f, 0x36, 0x1f, 0x80, 0xe0, 0xeb, 0xda, 0x2c, 0x22, 0x3a, 0x2d, 0xce,
0x4f, 0x0b, 0xf0, 0x35, 0xb5, 0x9a, 0x14, 0x34, 0x22, 0x19, 0x50, 0x20, 0x72, 0x1b, 0x6c, 0xc7,
0xdd, 0x40, 0x4d, 0xb2, 0xfa, 0x40, 0xb5, 0xf5, 0x8f, 0x44, 0x16, 0x99, 0x5e, 0xbe, 0x9d, 0xe2,
0x07, 0x91, 0x8d, 0xee, 0x7c, 0x3d, 0x6d, 0xd9, 0xbd, 0x3d, 0x79, 0xde, 0xbe, 0x38, 0xa6, 0x9f,
0xc8, 0xc1, 0x39, 0xcb, 0xd2, 0x04, 0x25, 0xd7, 0x76, 0xa8, 0xf8, 0xd0, 0x53, 0x58, 0x88, 0x5a,
0x84, 0xe6, 0xfe, 0x55, 0xf2, 0x05, 0xcf, 0x95, 0xa5, 0x66, 0x16, 0xd3, 0xc7, 0x04, 0x5d, 0x32,
0x4e, 0x8f, 0x92, 0xbb, 0xa7, 0x46, 0x26, 0xef, 0xb2, 0x26, 0xf8, 0x7d, 0x63, 0x3a, 0xa2, 0x76,
0x78, 0x31, 0x11, 0xc4, 0xd3, 0xd4, 0x72, 0x1f, 0xbb, 0x51, 0x0d, 0x93, 0x1a, 0x6b, 0xba, 0x96,
0x99, 0xf8, 0xb7, 0xc9, 0x5a, 0xe3, 0xc9, 0x34, 0xfa, 0x62, 0x00, 0x71, 0xb8, 0xc0, 0x68, 0x3d,
0xcb, 0x92, 0x0e, 0xc3, 0x21, 0xd8, 0x32, 0x88, 0xec, 0x0c, 0x13, 0x18, 0x06, 0x10, 0x00, 0x91,
0x5d, 0xd5, 0x2d, 0x35, 0xa8, 0x45, 0x6b, 0x2a, 0xf1, 0xae, 0x17, 0x49, 0xa4, 0x81, 0xcd, 0x77,
0x44, 0xb4, 0xa9, 0x54, 0x02, 0xe9, 0x25, 0x9c, 0x32, 0x1f, 0xfd, 0xf8, 0x6a, 0x3f, 0x79, 0xbb,
0x9c, 0x83, 0x45, 0x54, 0xcc, 0xc3, 0x75, 0x4f, 0x52, 0x52, 0x0a, 0x67, 0x2c, 0xa4, 0x02, 0xea,
0x44, 0x36, 0xbb, 0x13, 0x40, 0xfb, 0x48, 0x85, 0xac, 0xc4, 0x56, 0x6c, 0x34, 0xd3, 0xfd, 0xde,
0xec, 0xa8, 0x4f, 0x4c, 0xd3, 0x6b, 0xe1, 0xe2, 0x32, 0xdc, 0xa8, 0x63, 0xab, 0x5a, 0x0a, 0x66,
0xe8, 0x32, 0x4a, 0x52, 0xb7, 0xaf, 0xe6, 0x69, 0xce, 0x56, 0xe3, 0xc0, 0xf6, 0xac, 0xa4, 0x32,
0x0c, 0x4a, 0x59, 0xa1, 0x92, 0x88, 0xf8, 0xe6, 0x4c, 0x0b, 0x63, 0xbc, 0x9e, 0xec, 0x0f, 0xe3,
0x6b, 0xd1, 0x6b, 0xc9, 0xbe, 0x67, 0x33, 0xaf, 0xfa, 0xca, 0x20, 0xff, 0x85, 0xc9, 0xa9, 0x2c,
0x1e, 0x06, 0x93, 0x44, 0xf8, 0xd8, 0xdc, 0x51, 0x7e, 0x15, 0xa8, 0xa6, 0xd5, 0x6f, 0xb8, 0xa2,
0x9e, 0x75, 0x5b, 0x06, 0x20, 0x1e, 0xe7, 0xfc, 0x05, 0x0b, 0xd1, 0x60, 0xc0, 0x13, 0x98, 0xb8,
0xa8, 0x01, 0x06, 0x94, 0xff, 0x81, 0x0f, 0xc2, 0xcd, 0x79, 0x51, 0x6c, 0xcd, 0x73, 0xe6, 0x7a,
0x48, 0xad, 0xa0, 0xc0, 0xec, 0x26, 0x68, 0xdc, 0x7c, 0x53, 0x1a, 0xee, 0xd3, 0x00, 0x3b, 0x9c,
0x44, 0x8e, 0x88, 0x7f, 0xc1, 0x99, 0x12, 0x69, 0xef, 0x7c, 0x54, 0x33, 0xb7, 0x0a, 0x3a, 0x9e,
0x4b, 0xc8, 0x2c, 0x1b, 0xbd, 0x56, 0xf5, 0xdd, 0xa3, 0xe7, 0xde, 0xdc, 0xff, 0x41, 0xce, 0xe9,
0x73, 0x89, 0x57, 0xe8, 0xd4, 0x67, 0x55, 0x73, 0x0a, 0x12, 0x0a, 0xba, 0x10, 0x74, 0x02, 0x70,
0x88, 0x88, 0x13, 0x70, 0x36, 0x86, 0x63, 0xf0, 0x3d, 0x21, 0xc0, 0x19, 0xa2, 0x12, 0x34, 0x0e,
0x37, 0xcf, 0x1b, 0x9e, 0xc4, 0x3d, 0x5d, 0xfd, 0x66, 0xea, 0x8a, 0x31, 0x9c, 0xa0, 0x98, 0xbb,
0x38, 0xe4, 0x2c, 0xcf, 0x8c, 0x65, 0xd8, 0x57, 0x5a, 0x80, 0xa2, 0x4e, 0xe6, 0x93, 0xdd, 0xa4,
0x20, 0x91, 0xd7, 0x75, 0x21, 0xb7, 0x19, 0x66, 0xc9, 0x1b, 0xd6, 0x6f, 0x6c, 0x2e, 0xce, 0x44,
0x9a, 0xbf, 0xa6, 0x7a, 0x51, 0x58, 0x8b, 0xa3, 0x97, 0xe5, 0xaa, 0xbc, 0x21, 0x9d, 0xe3, 0x54,
0x8e, 0xaf, 0x38, 0x7b, 0x4f, 0xc6, 0x1c, 0xf7, 0x5a, 0xe5, 0x03, 0x18, 0x0c, 0x0d, 0xab, 0x3d,
0x8d, 0x27, 0x36, 0xbd, 0xa6, 0x4d, 0xaf, 0xe3, 0xf1, 0xd5, 0x7a, 0xdf, 0xd6, 0x5b, 0x4a, 0x7b,
0x59, 0x15, 0x2e, 0x2b, 0x11, 0x0d, 0x03, 0x4d, 0x1e, 0x2b, 0x77, 0xea, 0xd4, 0x98, 0x62, 0xbc,
0x6a, 0x2b, 0x5c, 0x4f, 0xdf, 0x99, 0x6a, 0x21, 0x54, 0xb7, 0xf2, 0x67, 0x47, 0x65, 0x70, 0x66,
0x7f, 0xef, 0xd9, 0x61, 0xbb, 0xdd, 0xfe, 0x4b, 0xd7, 0x3b, 0xd9, 0x1e, 0xe6, 0xa1, 0x3a, 0xd9,
0x21, 0x8f, 0x40, 0x61, 0xdf, 0xdb, 0xd4, 0x4b, 0xb1, 0xb1, 0xad, 0x17, 0x43, 0xc4, 0x03, 0xad,
0x8d, 0xbd, 0x67, 0x2f, 0x5f, 0xbc, 0x78, 0x41, 0x5a, 0x8b, 0x34, 0x71, 0xe1, 0x4e, 0xce, 0xd9,
0xce, 0x82, 0xa8, 0xd2, 0xee, 0x52, 0xac, 0x04, 0x66, 0xf6, 0x7c, 0xf3, 0x9b, 0x58, 0x91, 0xc3,
0xc1, 0xcf, 0xfb, 0x8d, 0x1f, 0xd3, 0x6c, 0x14, 0xa7, 0xde, 0xa0, 0x67, 0x8a, 0xbc, 0xff, 0x1c,
0xbb, 0xf0, 0x77, 0xe2, 0xfd, 0x78, 0x36, 0x38, 0x35, 0x9e, 0xff, 0xfe, 0xd7, 0x80, 0x8e, 0xde,
0x93, 0xdb, 0x36, 0x55, 0x33, 0x4b, 0xbf, 0xe1, 0x23, 0x2e, 0xee, 0xe8, 0x8b, 0xa0, 0x9a, 0xd2,
0xf7, 0x38, 0xfa, 0xb4, 0xf1, 0x76, 0x78, 0x76, 0xf4, 0x3c, 0x2c, 0xd7, 0x84, 0xa7, 0xc5, 0x3f,
0x0b, 0x89, 0x0c, 0xc4, 0x05, 0xda, 0x4c, 0xbb, 0x13, 0x50, 0x06, 0x92, 0x4a, 0xcc, 0x80, 0x9d,
0xaa, 0x19, 0xa9, 0x3c, 0x55, 0xd5, 0xe2, 0x75, 0x37, 0x58, 0xf6, 0x87, 0x47, 0xab, 0xe0, 0xc2,
0xd4, 0x48, 0x6e, 0x74, 0x8a, 0xf9, 0xfe, 0x46, 0xe3, 0x41, 0xe3, 0x5c, 0xb0, 0xef, 0x35, 0x56,
0xed, 0xa3, 0xb7, 0xc9, 0xc5, 0x6e, 0x63, 0xdf, 0xc3, 0x54, 0xd9, 0xd9, 0xea, 0x7e, 0x9e, 0x7e,
0x5f, 0xf5, 0x45, 0x91, 0x86, 0xd3, 0x6f, 0xbe, 0xf0, 0xa9, 0xf7, 0x61, 0x1f, 0xe1, 0xee, 0x35,
0x1e, 0x1b, 0x23, 0x2a, 0xbc, 0x87, 0x67, 0x83, 0xff, 0x3d, 0xc8, 0x34, 0x54, 0xff, 0x41, 0x94,
0xdd, 0x1c, 0xfe, 0xa7, 0x60, 0x76, 0x3b, 0x1d, 0xce, 0x1f, 0xfe, 0x38, 0xd0, 0x1f, 0xfe, 0x2c,
0xd2, 0x1f, 0x2a, 0x36, 0x69, 0x50, 0xfe, 0x80, 0xba, 0xfb, 0xf5, 0x27, 0xb4, 0x9a, 0x8f, 0xa3,
0x28, 0xaa, 0xe3, 0x5f, 0xff, 0x1e, 0xa1, 0xac, 0xb8, 0xa1, 0xf1, 0x87, 0xc8, 0xa1, 0x45, 0x2c,
0x88, 0x3f, 0x62, 0x4a, 0xa2, 0x4d, 0xfa, 0x76, 0xfe, 0x6f, 0x7c, 0x47, 0x58, 0x8b, 0x51, 0x17,
0x00, 0x00
};
// Autogenerated from wled00/data/settings_2D.htm, do not edit!!
const uint16_t PAGE_settings_2D_length = 1754;
const uint8_t PAGE_settings_2D[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x8d, 0x58, 0x6d, 0x73, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x8d, 0x58, 0x6d, 0x73, 0xdb, 0x36,
0x12, 0xfe, 0xce, 0x5f, 0x01, 0x63, 0x3a, 0x2d, 0xd9, 0x50, 0x94, 0xe4, 0xde, 0x75, 0x3a, 0x16,
0x49, 0x37, 0x6e, 0xdc, 0xda, 0x1d, 0x7b, 0xe2, 0x89, 0x72, 0xce, 0xdc, 0x5c, 0x3a, 0x29, 0x44,
0xae, 0x44, 0xc4, 0x24, 0xc0, 0x01, 0x20, 0xd9, 0xae, 0xe2, 0xff, 0x7e, 0x0b, 0x90, 0x12, 0x25,
@ -1865,7 +1865,7 @@ const uint8_t PAGE_settings_2D[] PROGMEM = {
// Autogenerated from wled00/data/settings_pin.htm, do not edit!!
const uint16_t PAGE_settings_pin_length = 471;
const uint8_t PAGE_settings_pin[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0x6c, 0xa8, 0xa8, 0x04, 0xaa, 0xbd, 0x42,
0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x52, 0x55, 0x55, 0xe5, 0xd8, 0xb3, 0x89, 0x55, 0x7f, 0x2c,
0xb6, 0x37, 0x21, 0x54, 0xfc, 0x77, 0xc6, 0xbb, 0xa1, 0xa0, 0x5c, 0xd6, 0x7e, 0x33, 0xe3, 0x37,

View File

@ -633,7 +633,6 @@ void serializeInfo(JsonObject root)
JsonArray spi = root.createNestedArray(F("spi"));
spi.add(spi_mosi);
spi.add(spi_sclk);
spi.add(spi_cs);
#endif
root[F("str")] = syncToggleReceive;

View File

@ -503,31 +503,23 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
}
int8_t hw_mosi_pin = !request->arg(F("MOSI")).length() ? -1 : max(-1,min(33,(int)request->arg(F("MOSI")).toInt()));
int8_t hw_sclk_pin = !request->arg(F("SCLK")).length() ? -1 : max(-1,min(33,(int)request->arg(F("SCLK")).toInt()));
int8_t hw_cs_pin = !request->arg(F("CS")).length() ? -1 : max(-1,min(33,(int)request->arg(F("CS")).toInt()));
#ifdef ESP8266
// cannot change pins on ESP8266
if (hw_mosi_pin >= 0 && hw_mosi_pin != HW_PIN_DATASPI) hw_mosi_pin = HW_PIN_DATASPI;
if (hw_sclk_pin >= 0 && hw_sclk_pin != HW_PIN_CLOCKSPI) hw_sclk_pin = HW_PIN_CLOCKSPI;
if (hw_cs_pin >= 0 && hw_cs_pin != HW_PIN_CSSPI) hw_cs_pin = HW_PIN_CSSPI;
#endif
PinManagerPinType spi[3] = { { hw_mosi_pin, true }, { hw_sclk_pin, true }, { hw_cs_pin, true } };
if (hw_mosi_pin >= 0 && hw_sclk_pin >= 0 && hw_cs_pin >= 0 && pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) {
PinManagerPinType spi[2] = { { hw_mosi_pin, true }, { hw_sclk_pin, true } };
if (hw_mosi_pin >= 0 && hw_sclk_pin >= 0 && pinManager.allocateMultiplePins(spi, 2, PinOwner::HW_SPI)) {
spi_mosi = hw_mosi_pin;
spi_sclk = hw_sclk_pin;
spi_cs = hw_cs_pin;
#ifdef ESP8266
SPI.begin();
#else
SPI.begin(spi_sclk, (int8_t)-1, spi_mosi, spi_cs);
#endif
// no bus initialisation
} else {
//SPI.end();
DEBUG_PRINTLN(F("Could not allocate SPI pins."));
uint8_t spi[3] = { spi_mosi, spi_sclk, spi_cs };
pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); // just in case deallocation of old pins
uint8_t spi[2] = { spi_mosi, spi_sclk };
pinManager.deallocateMultiplePins(spi, 2, PinOwner::HW_SPI); // just in case deallocation of old pins
spi_mosi = -1;
spi_sclk = -1;
spi_cs = -1;
}
JsonObject um = doc.createNestedObject("um");

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2208151
#define VERSION 2208171
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG
@ -644,11 +644,10 @@ WLED_GLOBAL uint16_t ledMaps _INIT(0); // bitfield representation of available l
// Usermod manager
WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());
WLED_GLOBAL int8_t i2c_sda _INIT(HW_PIN_SDA); // global I2C SDA pin (used for usermods)
WLED_GLOBAL int8_t i2c_scl _INIT(HW_PIN_SCL); // global I2C SDA pin (used for usermods)
WLED_GLOBAL int8_t spi_mosi _INIT(HW_PIN_DATASPI); // global I2C SDA pin (used for usermods)
WLED_GLOBAL int8_t spi_sclk _INIT(HW_PIN_CLOCKSPI); // global I2C SDA pin (used for usermods)
WLED_GLOBAL int8_t spi_cs _INIT(HW_PIN_CSSPI); // global I2C SDA pin (used for usermods)
WLED_GLOBAL int8_t i2c_sda _INIT(-1); // global I2C SDA pin [HW_PIN_SDA] (used for usermods)
WLED_GLOBAL int8_t i2c_scl _INIT(-1); // global I2C SCL pin [HW_PIN_SCL] (used for usermods)
WLED_GLOBAL int8_t spi_mosi _INIT(-1); // global SPI DATA/MOSI pin [HW_PIN_DATASPI] (used for usermods)
WLED_GLOBAL int8_t spi_sclk _INIT(-1); // global SPI CLOCK/SCLK pin [HW_PIN_CLOCKSPI] (used for usermods)
// global ArduinoJson buffer
WLED_GLOBAL StaticJsonDocument<JSON_BUFFER_SIZE> doc;

View File

@ -265,10 +265,9 @@ void getSettingsJS(byte subPage, char* dest)
oappend(","); oappend(itoa(i2c_sda,nS,10));
oappend(","); oappend(itoa(i2c_scl,nS,10));
}
if (spi_mosi > -1 && spi_sclk > -1 && spi_cs > -1) {
if (spi_mosi > -1 && spi_sclk > -1) {
oappend(","); oappend(itoa(spi_mosi,nS,10));
oappend(","); oappend(itoa(spi_sclk,nS,10));
oappend(","); oappend(itoa(spi_cs,nS,10));
}
if (requestJSONBufferLock(6)) {
@ -638,12 +637,10 @@ void getSettingsJS(byte subPage, char* dest)
sappend('v',SET_F("SCL"),i2c_scl);
sappend('v',SET_F("MOSI"),spi_mosi);
sappend('v',SET_F("SCLK"),spi_sclk);
sappend('v',SET_F("CS"),spi_cs);
oappend(SET_F("addInfo('SDA','")); oappendi(HW_PIN_SDA); oappend(SET_F("');"));
oappend(SET_F("addInfo('SCL','")); oappendi(HW_PIN_SCL); oappend(SET_F("');"));
oappend(SET_F("addInfo('MOSI','")); oappendi(HW_PIN_DATASPI); oappend(SET_F("');"));
oappend(SET_F("addInfo('SCLK','")); oappendi(HW_PIN_CLOCKSPI); oappend(SET_F("');"));
oappend(SET_F("addInfo('CS','")); oappendi(HW_PIN_CSSPI); oappend(SET_F("');"));
usermods.appendConfigData();
}