Whitespace cleanup.

Revert legacy effects to 1D and use mapping instead.
This commit is contained in:
Blaz Kristan 2022-08-24 23:04:51 +02:00
parent 301ed25019
commit daf67d9cf7
7 changed files with 642 additions and 675 deletions

View File

@ -1036,7 +1036,6 @@ class AudioReactive : public Usermod {
// Only run the sampling code IF we're not in Receive mode or realtime mode
if (!(audioSyncEnabled & 0x02) && !disableSoundProcessing) {
bool agcEffect = false;
if (soundAgc > AGC_NUM_PRESETS) soundAgc = 0; // make sure that AGC preset is valid (to avoid array bounds violation)
unsigned long t_now = millis(); // remember current time

View File

@ -566,16 +566,14 @@ static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width;!,!,;!;1d";
* Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
uint16_t mode_twinkle(void) {
const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength();
const uint16_t rows = SEGMENT.virtualHeight();
SEGMENT.fill(SEGCOLOR(1));
//SEGMENT.fill(SEGCOLOR(1));
SEGMENT.fade_out(224);
uint32_t cycleTime = 20 + (255 - SEGMENT.speed)*5;
uint32_t it = strip.now / cycleTime;
if (it != SEGENV.step)
{
uint16_t maxOn = map(SEGMENT.intensity, 0, 255, 1, cols*rows-1); // make sure at least one LED is on
uint16_t maxOn = map(SEGMENT.intensity, 0, 255, 1, SEGLEN); // make sure at least one LED is on
if (SEGENV.aux0 >= maxOn)
{
SEGENV.aux0 = 0;
@ -587,20 +585,17 @@ uint16_t mode_twinkle(void) {
uint16_t PRNG16 = SEGENV.aux1;
for (int i = 0; i < SEGENV.aux0; i++)
for (uint16_t i = 0; i < SEGENV.aux0; i++)
{
PRNG16 = (uint16_t)(PRNG16 * 2053) + 13849; // next 'random' number
uint32_t p = ((uint32_t)cols*rows * (uint32_t)PRNG16) >> 16;
uint16_t j = p % cols;
uint16_t k = p / cols;
uint32_t col = SEGMENT.color_from_palette(map(p, 0, cols*rows, 0, 255), false, PALETTE_SOLID_WRAP, 0);
if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, col);
else SEGMENT.setPixelColor(j, col);
uint32_t p = (uint32_t)SEGLEN * (uint32_t)PRNG16;
uint16_t j = p >> 16;
SEGMENT.setPixelColor(j, SEGMENT.color_from_palette(j, true, PALETTE_SOLID_WRAP, 0));
}
return FRAMETIME;
}
static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!,;!,!,;!;1d,2d"; //pixels
static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!,;!,!,;!;mp12=0,1d"; //pixels
/*
@ -663,7 +658,7 @@ static const char _data_FX_MODE_DISSOLVE_RANDOM[] PROGMEM = "Dissolve Rnd@Repeat
* Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
uint16_t mode_sparkle(void) {
for (int i = 0; i < SEGLEN; i++) {
for(int i = 0; i < SEGLEN; i++) {
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1));
}
uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2;
@ -671,15 +666,13 @@ uint16_t mode_sparkle(void) {
if (it != SEGENV.step)
{
SEGENV.aux0 = random16(SEGLEN); // aux0 stores the random led index
SEGENV.aux1 = random16(0,SEGMENT.virtualHeight()-1);
SEGENV.step = it;
}
if (strip.isMatrix) SEGMENT.setPixelColorXY(SEGENV.aux0, SEGENV.aux1, SEGCOLOR(0));
else SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0));
SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0));
return FRAMETIME;
}
static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,;!,!,;!;1d,2d";
static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,;!,!,;!;mp12=0,1d";
/*
@ -687,21 +680,20 @@ static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,;!,!,;!;1d,2d";
* Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
uint16_t mode_flash_sparkle(void) {
for (int i = 0; i < SEGLEN; i++) {
for(uint16_t i = 0; i < SEGLEN; i++) {
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0));
}
if (strip.now - SEGENV.aux0 > SEGENV.step) {
if(random8((255-SEGMENT.intensity) >> 4) == 0) {
if (strip.isMatrix) SEGMENT.setPixelColorXY(random16(SEGLEN), random16(0,SEGMENT.virtualHeight()-1), SEGCOLOR(1));
else SEGMENT.setPixelColor(random16(SEGLEN), SEGCOLOR(1)); //flash
SEGMENT.setPixelColor(random16(SEGLEN), SEGCOLOR(1)); //flash
}
SEGENV.step = strip.now;
SEGENV.aux0 = 255-SEGMENT.speed;
}
return FRAMETIME;
}
static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx,;!;1d,2d";
static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx,;!;mp12=0,1d";
/*
@ -714,10 +706,9 @@ uint16_t mode_hyper_sparkle(void) {
}
if (strip.now - SEGENV.aux0 > SEGENV.step) {
if(random8((255-SEGMENT.intensity) >> 4) == 0) {
if (random8((255-SEGMENT.intensity) >> 4) == 0) {
for (int i = 0; i < MAX(1, SEGLEN/3); i++) {
if (strip.isMatrix) SEGMENT.setPixelColorXY(random16(SEGLEN), random16(0,SEGMENT.virtualHeight()), SEGCOLOR(1));
else SEGMENT.setPixelColor(random16(SEGLEN), SEGCOLOR(1));
SEGMENT.setPixelColor(random16(SEGLEN), SEGCOLOR(1));
}
}
SEGENV.step = strip.now;
@ -725,7 +716,7 @@ uint16_t mode_hyper_sparkle(void) {
}
return FRAMETIME;
}
static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx,;!;1d,2d";
static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx,;!;mp12=0,1d";
/*
@ -1350,7 +1341,7 @@ uint16_t police_base(uint32_t color1, uint32_t color2)
uint32_t it = strip.now / map(SEGMENT.speed, 0, 255, delay<<4, delay);
uint16_t offset = it % SEGLEN;
uint16_t width = ((SEGLEN*(SEGMENT.intensity+1))>>9); //max width is half the strip
uint16_t width = ((SEGLEN*(SEGMENT.intensity+1))>>9); //max width is half the strip
if (!width) width = 1;
for (int i = 0; i < width; i++) {
uint16_t indexR = (offset + i) % SEGLEN;
@ -1389,82 +1380,82 @@ static const char _data_FX_MODE_TWO_DOTS[] PROGMEM = "Two Dots@!,Dot size;1,2,Bg
typedef struct Flasher {
uint16_t stateStart;
uint8_t stateDur;
bool stateOn;
bool stateOn;
} flasher;
#define FLASHERS_PER_ZONE 6
#define MAX_SHIMMER 92
uint16_t mode_fairy() {
//set every pixel to a 'random' color from palette (using seed so it doesn't change between frames)
uint16_t PRNG16 = 5100 + strip.getCurrSegmentId();
for (int i = 0; i < SEGLEN; i++) {
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0));
}
//set every pixel to a 'random' color from palette (using seed so it doesn't change between frames)
uint16_t PRNG16 = 5100 + strip.getCurrSegmentId();
for (int i = 0; i < SEGLEN; i++) {
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0));
}
//amount of flasher pixels depending on intensity (0: none, 255: every LED)
if (SEGMENT.intensity == 0) return FRAMETIME;
uint8_t flasherDistance = ((255 - SEGMENT.intensity) / 28) +1; //1-10
uint16_t numFlashers = (SEGLEN / flasherDistance) +1;
uint16_t dataSize = sizeof(flasher) * numFlashers;
//amount of flasher pixels depending on intensity (0: none, 255: every LED)
if (SEGMENT.intensity == 0) return FRAMETIME;
uint8_t flasherDistance = ((255 - SEGMENT.intensity) / 28) +1; //1-10
uint16_t numFlashers = (SEGLEN / flasherDistance) +1;
uint16_t dataSize = sizeof(flasher) * numFlashers;
if (!SEGENV.allocateData(dataSize)) return FRAMETIME; //allocation failed
Flasher* flashers = reinterpret_cast<Flasher*>(SEGENV.data);
uint16_t now16 = strip.now & 0xFFFF;
Flasher* flashers = reinterpret_cast<Flasher*>(SEGENV.data);
uint16_t now16 = strip.now & 0xFFFF;
//Up to 11 flashers in one brightness zone, afterwards a new zone for every 6 flashers
uint16_t zones = numFlashers/FLASHERS_PER_ZONE;
if (!zones) zones = 1;
uint8_t flashersInZone = numFlashers/zones;
uint8_t flasherBri[FLASHERS_PER_ZONE*2 -1];
//Up to 11 flashers in one brightness zone, afterwards a new zone for every 6 flashers
uint16_t zones = numFlashers/FLASHERS_PER_ZONE;
if (!zones) zones = 1;
uint8_t flashersInZone = numFlashers/zones;
uint8_t flasherBri[FLASHERS_PER_ZONE*2 -1];
for (int z = 0; z < zones; z++) {
uint16_t flasherBriSum = 0;
uint16_t firstFlasher = z*flashersInZone;
if (z == zones-1) flashersInZone = numFlashers-(flashersInZone*(zones-1));
for (int z = 0; z < zones; z++) {
uint16_t flasherBriSum = 0;
uint16_t firstFlasher = z*flashersInZone;
if (z == zones-1) flashersInZone = numFlashers-(flashersInZone*(zones-1));
for (int f = firstFlasher; f < firstFlasher + flashersInZone; f++) {
uint16_t stateTime = now16 - flashers[f].stateStart;
//random on/off time reached, switch state
if (stateTime > flashers[f].stateDur * 10) {
flashers[f].stateOn = !flashers[f].stateOn;
if (flashers[f].stateOn) {
flashers[f].stateDur = 12 + random8(12 + ((255 - SEGMENT.speed) >> 2)); //*10, 250ms to 1250ms
} else {
flashers[f].stateDur = 20 + random8(6 + ((255 - SEGMENT.speed) >> 2)); //*10, 250ms to 1250ms
}
//flashers[f].stateDur = 51 + random8(2 + ((255 - SEGMENT.speed) >> 1));
flashers[f].stateStart = now16;
if (stateTime < 255) {
flashers[f].stateStart -= 255 -stateTime; //start early to get correct bri
flashers[f].stateDur += 26 - stateTime/10;
stateTime = 255 - stateTime;
} else {
stateTime = 0;
}
}
if (stateTime > 255) stateTime = 255; //for flasher brightness calculation, fades in first 255 ms of state
//flasherBri[f - firstFlasher] = (flashers[f].stateOn) ? 255-SEGMENT.gamma8((510 - stateTime) >> 1) : SEGMENT.gamma8((510 - stateTime) >> 1);
flasherBri[f - firstFlasher] = (flashers[f].stateOn) ? stateTime : 255 - (stateTime >> 0);
flasherBriSum += flasherBri[f - firstFlasher];
}
//dim factor, to create "shimmer" as other pixels get less voltage if a lot of flashers are on
uint8_t avgFlasherBri = flasherBriSum / flashersInZone;
uint8_t globalPeakBri = 255 - ((avgFlasherBri * MAX_SHIMMER) >> 8); //183-255, suitable for 1/5th of LEDs flashers
for (int f = firstFlasher; f < firstFlasher + flashersInZone; f++) {
uint16_t stateTime = now16 - flashers[f].stateStart;
//random on/off time reached, switch state
if (stateTime > flashers[f].stateDur * 10) {
flashers[f].stateOn = !flashers[f].stateOn;
if (flashers[f].stateOn) {
flashers[f].stateDur = 12 + random8(12 + ((255 - SEGMENT.speed) >> 2)); //*10, 250ms to 1250ms
} else {
flashers[f].stateDur = 20 + random8(6 + ((255 - SEGMENT.speed) >> 2)); //*10, 250ms to 1250ms
}
//flashers[f].stateDur = 51 + random8(2 + ((255 - SEGMENT.speed) >> 1));
flashers[f].stateStart = now16;
if (stateTime < 255) {
flashers[f].stateStart -= 255 -stateTime; //start early to get correct bri
flashers[f].stateDur += 26 - stateTime/10;
stateTime = 255 - stateTime;
} else {
stateTime = 0;
}
}
if (stateTime > 255) stateTime = 255; //for flasher brightness calculation, fades in first 255 ms of state
//flasherBri[f - firstFlasher] = (flashers[f].stateOn) ? 255-SEGMENT.gamma8((510 - stateTime) >> 1) : SEGMENT.gamma8((510 - stateTime) >> 1);
flasherBri[f - firstFlasher] = (flashers[f].stateOn) ? stateTime : 255 - (stateTime >> 0);
flasherBriSum += flasherBri[f - firstFlasher];
}
//dim factor, to create "shimmer" as other pixels get less voltage if a lot of flashers are on
uint8_t avgFlasherBri = flasherBriSum / flashersInZone;
uint8_t globalPeakBri = 255 - ((avgFlasherBri * MAX_SHIMMER) >> 8); //183-255, suitable for 1/5th of LEDs flashers
for (int f = firstFlasher; f < firstFlasher + flashersInZone; f++) {
uint8_t bri = (flasherBri[f - firstFlasher] * globalPeakBri) / 255;
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
uint16_t flasherPos = f*flasherDistance;
SEGMENT.setPixelColor(flasherPos, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0), bri));
for (int i = flasherPos+1; i < flasherPos+flasherDistance && i < SEGLEN; i++) {
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0, globalPeakBri));
}
}
}
return FRAMETIME;
for (int f = firstFlasher; f < firstFlasher + flashersInZone; f++) {
uint8_t bri = (flasherBri[f - firstFlasher] * globalPeakBri) / 255;
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
uint16_t flasherPos = f*flasherDistance;
SEGMENT.setPixelColor(flasherPos, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0), bri));
for (int i = flasherPos+1; i < flasherPos+flasherDistance && i < SEGLEN; i++) {
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0, globalPeakBri));
}
}
}
return FRAMETIME;
}
static const char _data_FX_MODE_FAIRY[] PROGMEM = "Fairy";
@ -1474,46 +1465,46 @@ static const char _data_FX_MODE_FAIRY[] PROGMEM = "Fairy";
* Warning: Uses 4 bytes of segment data per pixel
*/
uint16_t mode_fairytwinkle() {
uint16_t dataSize = sizeof(flasher) * SEGLEN;
uint16_t dataSize = sizeof(flasher) * SEGLEN;
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
Flasher* flashers = reinterpret_cast<Flasher*>(SEGENV.data);
uint16_t now16 = strip.now & 0xFFFF;
uint16_t PRNG16 = 5100 + strip.getCurrSegmentId();
Flasher* flashers = reinterpret_cast<Flasher*>(SEGENV.data);
uint16_t now16 = strip.now & 0xFFFF;
uint16_t PRNG16 = 5100 + strip.getCurrSegmentId();
uint16_t riseFallTime = 400 + (255-SEGMENT.speed)*3;
uint16_t maxDur = riseFallTime/100 + ((255 - SEGMENT.intensity) >> 2) + 13 + ((255 - SEGMENT.intensity) >> 1);
uint16_t riseFallTime = 400 + (255-SEGMENT.speed)*3;
uint16_t maxDur = riseFallTime/100 + ((255 - SEGMENT.intensity) >> 2) + 13 + ((255 - SEGMENT.intensity) >> 1);
for (int f = 0; f < SEGLEN; f++) {
uint16_t stateTime = now16 - flashers[f].stateStart;
//random on/off time reached, switch state
if (stateTime > flashers[f].stateDur * 100) {
flashers[f].stateOn = !flashers[f].stateOn;
bool init = !flashers[f].stateDur;
if (flashers[f].stateOn) {
flashers[f].stateDur = riseFallTime/100 + ((255 - SEGMENT.intensity) >> 2) + random8(12 + ((255 - SEGMENT.intensity) >> 1)) +1;
} else {
flashers[f].stateDur = riseFallTime/100 + random8(3 + ((255 - SEGMENT.speed) >> 6)) +1;
}
flashers[f].stateStart = now16;
stateTime = 0;
if (init) {
flashers[f].stateStart -= riseFallTime; //start lit
flashers[f].stateDur = riseFallTime/100 + random8(12 + ((255 - SEGMENT.intensity) >> 1)) +5; //fire up a little quicker
stateTime = riseFallTime;
}
}
if (flashers[f].stateOn && flashers[f].stateDur > maxDur) flashers[f].stateDur = maxDur; //react more quickly on intensity change
if (stateTime > riseFallTime) stateTime = riseFallTime; //for flasher brightness calculation, fades in first 255 ms of state
uint8_t fadeprog = 255 - ((stateTime * 255) / riseFallTime);
uint8_t flasherBri = (flashers[f].stateOn) ? 255-gamma8(fadeprog) : gamma8(fadeprog);
uint16_t lastR = PRNG16;
uint16_t diff = 0;
while (diff < 0x4000) { //make sure colors of two adjacent LEDs differ enough
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
diff = (PRNG16 > lastR) ? PRNG16 - lastR : lastR - PRNG16;
}
SEGMENT.setPixelColor(f, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0), flasherBri));
}
for (int f = 0; f < SEGLEN; f++) {
uint16_t stateTime = now16 - flashers[f].stateStart;
//random on/off time reached, switch state
if (stateTime > flashers[f].stateDur * 100) {
flashers[f].stateOn = !flashers[f].stateOn;
bool init = !flashers[f].stateDur;
if (flashers[f].stateOn) {
flashers[f].stateDur = riseFallTime/100 + ((255 - SEGMENT.intensity) >> 2) + random8(12 + ((255 - SEGMENT.intensity) >> 1)) +1;
} else {
flashers[f].stateDur = riseFallTime/100 + random8(3 + ((255 - SEGMENT.speed) >> 6)) +1;
}
flashers[f].stateStart = now16;
stateTime = 0;
if (init) {
flashers[f].stateStart -= riseFallTime; //start lit
flashers[f].stateDur = riseFallTime/100 + random8(12 + ((255 - SEGMENT.intensity) >> 1)) +5; //fire up a little quicker
stateTime = riseFallTime;
}
}
if (flashers[f].stateOn && flashers[f].stateDur > maxDur) flashers[f].stateDur = maxDur; //react more quickly on intensity change
if (stateTime > riseFallTime) stateTime = riseFallTime; //for flasher brightness calculation, fades in first 255 ms of state
uint8_t fadeprog = 255 - ((stateTime * 255) / riseFallTime);
uint8_t flasherBri = (flashers[f].stateOn) ? 255-gamma8(fadeprog) : gamma8(fadeprog);
uint16_t lastR = PRNG16;
uint16_t diff = 0;
while (diff < 0x4000) { //make sure colors of two adjacent LEDs differ enough
PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number
diff = (PRNG16 > lastR) ? PRNG16 - lastR : lastR - PRNG16;
}
SEGMENT.setPixelColor(f, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0), flasherBri));
}
return FRAMETIME;
}
static const char _data_FX_MODE_FAIRYTWINKLE[] PROGMEM = "Fairy Twinkle@;;;mp12=0,1d"; //pixels
@ -2209,19 +2200,14 @@ static const char _data_FX_MODE_NOISE16_4[] PROGMEM = "Noise 4@!,!;!,!,!;!;1d";
//based on https://gist.github.com/kriegsman/5408ecd397744ba0393e
uint16_t mode_colortwinkle()
{
const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1;
const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength();
uint16_t dataSize = (cols*rows+7) >> 3; //1 bit per LED
uint16_t dataSize = (SEGLEN+7) >> 3; //1 bit per LED
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB fastled_col, prev;
fract8 fadeUpAmount = strip.getBrightness()>28 ? 8 + (SEGMENT.speed>>2) : 68-strip.getBrightness();
fract8 fadeDownAmount = strip.getBrightness()>28 ? 8 + (SEGMENT.speed>>3) : 68-strip.getBrightness();
for (int i = 0; i < rows*cols; i++) {
uint16_t j = i % cols, k = i / cols;
fastled_col = CRGB(strip.isMatrix ? SEGMENT.getPixelColorXY(j, k) : SEGMENT.getPixelColor(i)); // TODO
for (uint16_t i = 0; i < SEGLEN; i++) {
fastled_col = SEGMENT.getPixelColor(i);
prev = fastled_col;
uint16_t index = i >> 3;
uint8_t bitNum = i & 0x07;
@ -2235,36 +2221,28 @@ uint16_t mode_colortwinkle()
if (fastled_col.red == 255 || fastled_col.green == 255 || fastled_col.blue == 255) {
bitWrite(SEGENV.data[index], bitNum, false);
}
SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col);
else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
uint32_t col = strip.isMatrix ? SEGMENT.getPixelColorXY(j, k) : SEGMENT.getPixelColor(i); // TODO
if (CRGB(col) == prev) { //fix "stuck" pixels
if (SEGMENT.getPixelColor(i) == RGBW32(prev.r, prev.g, prev.b, 0)) { //fix "stuck" pixels
fastled_col += fastled_col;
if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col);
else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
SEGMENT.setPixelColor(i, fastled_col);
}
} else {
fastled_col.nscale8(255 - fadeDownAmount);
if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col);
else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
SEGMENT.setPixelColor(i, fastled_col);
}
}
for (int j = 0; j <= rows*cols / 50; j++) {
for (uint16_t j = 0; j <= SEGLEN / 50; j++) {
if (random8() <= SEGMENT.intensity) {
for (size_t times = 0; times < 5; times++) { //attempt to spawn a new pixel 5 times
uint16_t i = random16(rows*cols);
uint16_t j = i % cols, k = i / cols;
uint32_t col = strip.isMatrix ? SEGMENT.getPixelColorXY(j, k) : SEGMENT.getPixelColor(i); // TODO
if (col == 0) {
for (uint8_t times = 0; times < 5; times++) { //attempt to spawn a new pixel 5 times
int i = random16(SEGLEN);
if (SEGMENT.getPixelColor(i) == 0) {
fastled_col = ColorFromPalette(SEGPALETTE, random8(), 64, NOBLEND);
uint16_t index = i >> 3;
uint8_t bitNum = i & 0x07;
bitWrite(SEGENV.data[index], bitNum, true);
if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col);
else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
SEGMENT.setPixelColor(i, fastled_col);
break; //only spawn 1 new pixel per frame per 50 LEDs
}
}
@ -2272,7 +2250,7 @@ uint16_t mode_colortwinkle()
}
return FRAMETIME_FIXED;
}
static const char _data_FX_MODE_COLORTWINKLE[] PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!;1d,2d"; //pixels
static const char _data_FX_MODE_COLORTWINKLE[] PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!;mp12=0,1d"; //pixels
//Calm effect, like a lake at night
@ -2651,13 +2629,13 @@ static const char _data_FX_MODE_TWINKLECAT[] PROGMEM = "Twinklecat";
//inspired by https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectBlinkingHalloweenEyes
#define HALLOWEEN_EYE_SPACE (2*MAX(1,SEGLEN>>5))
#define HALLOWEEN_EYE_WIDTH MAX(1,SEGLEN>>5)
uint16_t mode_halloween_eyes()
{
{
const uint16_t maxWidth = strip.isMatrix ? SEGMENT.virtualWidth() : SEGLEN;
const uint16_t HALLOWEEN_EYE_SPACE = MAX(2, strip.isMatrix ? SEGMENT.virtualWidth()>>4: SEGLEN>>5);
const uint16_t HALLOWEEN_EYE_WIDTH = HALLOWEEN_EYE_SPACE/2;
uint16_t eyeLength = (2*HALLOWEEN_EYE_WIDTH) + HALLOWEEN_EYE_SPACE;
if (eyeLength > SEGLEN) return mode_static(); //bail if segment too short
if (eyeLength >= maxWidth) return mode_static(); //bail if segment too short
SEGMENT.fill(SEGCOLOR(1)); //fill background
@ -2666,7 +2644,7 @@ uint16_t mode_halloween_eyes()
if (stateTime == 0) stateTime = 2000;
if (state == 0) { //spawn eyes
SEGENV.aux0 = random16(0, SEGLEN - eyeLength); //start pos
SEGENV.aux0 = random16(0, maxWidth - eyeLength - 1); //start pos
SEGENV.aux1 = random8(); //color
if (strip.isMatrix) SEGMENT.offset = random16(SEGMENT.virtualHeight()-1); // a hack: reuse offset since it is not used in matrices
state = 1;
@ -2696,9 +2674,9 @@ uint16_t mode_halloween_eyes()
if (state > 2) state = 0;
if (state < 2) {
stateTime = 100 + (255 - SEGMENT.intensity)*10; //eye fade time
stateTime = 100 + SEGMENT.intensity*10; //eye fade time
} else {
uint16_t eyeOffTimeBase = (255 - SEGMENT.speed)*10;
uint16_t eyeOffTimeBase = (256 - SEGMENT.speed)*10;
stateTime = eyeOffTimeBase + random16(eyeOffTimeBase);
}
SEGENV.step = strip.now;
@ -2933,18 +2911,14 @@ uint16_t mode_glitter()
{
mode_palette();
if (strip.isMatrix) {
uint16_t height = SEGMENT.virtualHeight();
uint16_t width = SEGMENT.virtualWidth();
for (int i = 0; i<height; i++) {
if (SEGMENT.intensity > random8()) SEGMENT.setPixelColorXY(random16(width-1), i, ULTRAWHITE);
}
} else
if (SEGMENT.intensity > random8()) SEGMENT.setPixelColor(random16(SEGLEN), ULTRAWHITE);
if (SEGMENT.intensity > random8())
{
SEGMENT.setPixelColor(random16(SEGLEN), ULTRAWHITE);
}
return FRAMETIME;
}
static const char _data_FX_MODE_GLITTER[] PROGMEM = "Glitter@,!;!,!,!;!;1d,2d"; //pixels
static const char _data_FX_MODE_GLITTER[] PROGMEM = "Glitter@,!;!,!,!;!;mp12=0,1d"; //pixels
//each needs 19 bytes
@ -3574,9 +3548,9 @@ static const char _data_FX_MODE_PLASMA[] PROGMEM = "Plasma@Phase,;1,2,3;!;1d";
*/
uint16_t mode_percent(void) {
uint8_t percent = SEGMENT.intensity;
uint8_t percent = SEGMENT.intensity;
percent = constrain(percent, 0, 200);
uint16_t active_leds = (percent < 100) ? SEGLEN * percent / 100.0
uint16_t active_leds = (percent < 100) ? SEGLEN * percent / 100.0
: SEGLEN * (200 - percent) / 100.0;
uint8_t size = (1 + ((SEGMENT.speed * SEGLEN) >> 11));
@ -3584,22 +3558,22 @@ uint16_t mode_percent(void) {
if (percent < 100) {
for (int i = 0; i < SEGLEN; i++) {
if (i < SEGENV.aux1) {
if (i < SEGENV.aux1) {
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0));
}
else {
}
else {
SEGMENT.setPixelColor(i, SEGCOLOR(1));
}
}
}
}
} else {
for (int i = 0; i < SEGLEN; i++) {
if (i < (SEGLEN - SEGENV.aux1)) {
if (i < (SEGLEN - SEGENV.aux1)) {
SEGMENT.setPixelColor(i, SEGCOLOR(1));
}
else {
}
else {
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0));
}
}
}
}
}
if(active_leds > SEGENV.aux1) { // smooth transition to the target value
@ -3770,18 +3744,14 @@ uint16_t mode_solid_glitter()
{
SEGMENT.fill(SEGCOLOR(0));
if (strip.isMatrix) {
uint16_t height = SEGMENT.virtualHeight();
uint16_t width = SEGMENT.virtualWidth();
for (int i = 0; i<height; i++) {
if (SEGMENT.intensity > random8()) SEGMENT.setPixelColorXY(random16(width-1), i, ULTRAWHITE);
}
} else
if (SEGMENT.intensity > random8()) SEGMENT.setPixelColor(random16(SEGLEN), ULTRAWHITE);
if (SEGMENT.intensity > random8())
{
SEGMENT.setPixelColor(random16(SEGLEN), ULTRAWHITE);
}
return FRAMETIME;
}
static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!,,;0;1d,2d";
static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!,,;0;mp12=0,1d";
/*
@ -3793,7 +3763,7 @@ uint16_t mode_sunrise() {
//speed 60 - 120 : sunset time in minutes - 60;
//speed above: "breathing" rise and set
if (SEGENV.call == 0 || SEGMENT.speed != SEGENV.aux0) {
SEGENV.step = millis(); //save starting time, millis() because now can change from sync
SEGENV.step = millis(); //save starting time, millis() because now can change from sync
SEGENV.aux0 = SEGMENT.speed;
}
@ -3803,15 +3773,15 @@ uint16_t mode_sunrise() {
uint32_t s10SinceStart = (millis() - SEGENV.step) /100; //tenths of seconds
if (SEGMENT.speed > 120) { //quick sunrise and sunset
uint16_t counter = (strip.now >> 1) * (((SEGMENT.speed -120) >> 1) +1);
stage = triwave16(counter);
uint16_t counter = (strip.now >> 1) * (((SEGMENT.speed -120) >> 1) +1);
stage = triwave16(counter);
} else if (SEGMENT.speed) { //sunrise
uint8_t durMins = SEGMENT.speed;
if (durMins > 60) durMins -= 60;
uint32_t s10Target = durMins * 600;
if (s10SinceStart > s10Target) s10SinceStart = s10Target;
stage = map(s10SinceStart, 0, s10Target, 0, 0xFFFF);
if (SEGMENT.speed > 60) stage = 0xFFFF - stage; //sunset
uint8_t durMins = SEGMENT.speed;
if (durMins > 60) durMins -= 60;
uint32_t s10Target = durMins * 600;
if (s10SinceStart > s10Target) s10SinceStart = s10Target;
stage = map(s10SinceStart, 0, s10Target, 0, 0xFFFF);
if (SEGMENT.speed > 60) stage = 0xFFFF - stage; //sunset
}
for (int i = 0; i <= SEGLEN/2; i++)
@ -3879,24 +3849,18 @@ static const char _data_FX_MODE_PHASEDNOISE[] PROGMEM = "Phased Noise";
uint16_t mode_twinkleup(void) { // A very short twinkle routine with fade-in and dual controls. By Andrew Tuline.
const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1;
const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength();
random16_set_seed(535); // The randomizer needs to be re-set each time through the loop in order for the same 'random' numbers to be the same each time through.
random16_set_seed(535); // The randomizer needs to be re-set each time through the loop in order for the same 'random' numbers to be the same each time through.
for (int i = 0; i<rows*cols; i++) {
uint16_t j = i % rows, k = i / rows;
uint8_t ranstart = random8(); // The starting value (aka brightness) for each pixel. Must be consistent each time through the loop for this to work.
for (int i = 0; i<SEGLEN; i++) {
uint8_t ranstart = random8(); // The starting value (aka brightness) for each pixel. Must be consistent each time through the loop for this to work.
uint8_t pixBri = sin8(ranstart + 16 * strip.now/(256-SEGMENT.speed));
if (random8() > SEGMENT.intensity) pixBri = 0;
uint32_t col = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(random8() + strip.now/100, false, PALETTE_SOLID_WRAP, 0), pixBri);
if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, col);
else SEGMENT.setPixelColor(i, col);
SEGMENT.setPixelColor(i, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(random8()+strip.now/100, false, PALETTE_SOLID_WRAP, 0), pixBri));
}
return FRAMETIME;
}
static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!,;!;1d,2d";
static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!,;!;mp12=0,1d";
// Peaceful noise that's slow and with gradually changing palettes. Does not support WLED palettes or default colours or controls.

View File

@ -678,8 +678,8 @@ class WS2812FX { // 96 bytes
_length(DEFAULT_LED_COUNT),
_brightness(DEFAULT_BRIGHTNESS),
_transitionDur(750),
_targetFps(WLED_FPS),
_frametime(FRAMETIME_FIXED),
_targetFps(WLED_FPS),
_frametime(FRAMETIME_FIXED),
_cumulativeFps(2),
_isServicing(false),
_isOffRefreshRequired(false),
@ -733,7 +733,7 @@ class WS2812FX { // 96 bytes
fixInvalidSegments(),
setPixelColor(int n, uint32_t c),
show(void),
setTargetFps(uint8_t fps),
setTargetFps(uint8_t fps),
deserializeMap(uint8_t n=0);
void fill(uint32_t c) { for (int i = 0; i < _length; i++) setPixelColor(i, c); } // fill whole strip with color (inline)
@ -869,8 +869,8 @@ class WS2812FX { // 96 bytes
uint8_t _brightness;
uint16_t _transitionDur;
uint8_t _targetFps;
uint16_t _frametime;
uint8_t _targetFps;
uint16_t _frametime;
uint16_t _cumulativeFps;
// will require only 1 byte

View File

@ -196,8 +196,92 @@ void Segment::setUpLeds() {
#else
leds = &Segment::_globalLeds[start];
#endif
else if (!leds)
leds = (CRGB*)malloc(sizeof(CRGB)*length());
else if (!leds) {
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM)
if (psramFound())
leds = (CRGB*)ps_malloc(sizeof(CRGB)*length());
else
#endif
leds = (CRGB*)malloc(sizeof(CRGB)*length());
}
}
CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
static unsigned long _lastPaletteChange = 0; // perhaps it should be per segment
byte tcp[72];
if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0;
if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0;
//default palette. Differs depending on effect
if (pal == 0) switch (mode) {
case FX_MODE_FIRE_2012 : pal = 35; break; // heat palette
case FX_MODE_COLORWAVES : pal = 26; break; // landscape 33
case FX_MODE_FILLNOISE8 : pal = 9; break; // ocean colors
case FX_MODE_NOISE16_1 : pal = 20; break; // Drywet
case FX_MODE_NOISE16_2 : pal = 43; break; // Blue cyan yellow
case FX_MODE_NOISE16_3 : pal = 35; break; // heat palette
case FX_MODE_NOISE16_4 : pal = 26; break; // landscape 33
case FX_MODE_GLITTER : pal = 11; break; // rainbow colors
case FX_MODE_SUNRISE : pal = 35; break; // heat palette
case FX_MODE_FLOW : pal = 6; break; // party
}
switch (pal) {
case 0: //default palette. Exceptions for specific effects above
targetPalette = PartyColors_p; break;
case 1: //periodically replace palette with a random one. Doesn't work with multiple FastLED segments
if (millis() - _lastPaletteChange > 5000 /*+ ((uint32_t)(255-intensity))*100*/) {
targetPalette = CRGBPalette16(
CHSV(random8(), 255, random8(128, 255)),
CHSV(random8(), 255, random8(128, 255)),
CHSV(random8(), 192, random8(128, 255)),
CHSV(random8(), 255, random8(128, 255)));
_lastPaletteChange = millis();
} break;
case 2: {//primary color only
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
targetPalette = CRGBPalette16(prim); break;}
case 3: {//primary + secondary
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
targetPalette = CRGBPalette16(prim,prim,sec,sec); break;}
case 4: {//primary + secondary + tertiary
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
targetPalette = CRGBPalette16(ter,sec,prim); break;}
case 5: {//primary + secondary (+tert if not off), more distinct
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
if (colors[2]) {
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,ter,ter,ter,ter,ter,prim);
} else {
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,sec,sec,sec);
}
break;}
case 6: //Party colors
targetPalette = PartyColors_p; break;
case 7: //Cloud colors
targetPalette = CloudColors_p; break;
case 8: //Lava colors
targetPalette = LavaColors_p; break;
case 9: //Ocean colors
targetPalette = OceanColors_p; break;
case 10: //Forest colors
targetPalette = ForestColors_p; break;
case 11: //Rainbow colors
targetPalette = RainbowColors_p; break;
case 12: //Rainbow stripe colors
targetPalette = RainbowStripeColors_p; break;
default: //progmem palettes
if (pal>245) {
targetPalette = strip.customPalettes[255-pal]; // we checked bounds above
} else {
memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[pal-13])), 72);
targetPalette.loadDynamicGradientPalette(tcp);
}
break;
}
return targetPalette;
}
void Segment::startTransition(uint16_t dur) {
@ -251,84 +335,6 @@ uint32_t Segment::currentColor(uint8_t slot, uint32_t colorNew) {
return transitional && _t ? color_blend(_t->_colorT[slot], colorNew, progress(), true) : colorNew;
}
CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
static unsigned long _lastPaletteChange = 0; // perhaps it should be per segment
byte tcp[72];
if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0;
if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0;
//default palette. Differs depending on effect
if (pal == 0) switch (mode) {
case FX_MODE_FIRE_2012 : pal = 35; break; // heat palette
case FX_MODE_COLORWAVES : pal = 26; break; // landscape 33
case FX_MODE_FILLNOISE8 : pal = 9; break; // ocean colors
case FX_MODE_NOISE16_1 : pal = 20; break; // Drywet
case FX_MODE_NOISE16_2 : pal = 43; break; // Blue cyan yellow
case FX_MODE_NOISE16_3 : pal = 35; break; // heat palette
case FX_MODE_NOISE16_4 : pal = 26; break; // landscape 33
case FX_MODE_GLITTER : pal = 11; break; // rainbow colors
case FX_MODE_SUNRISE : pal = 35; break; // heat palette
case FX_MODE_FLOW : pal = 6; break; // party
}
switch (pal) {
case 0: //default palette. Exceptions for specific effects above
targetPalette = PartyColors_p; break;
case 1: {//periodically replace palette with a random one. Doesn't work with multiple FastLED segments
if (millis() - _lastPaletteChange > 1000 + ((uint32_t)(255-intensity))*100) {
targetPalette = CRGBPalette16(
CHSV(random8(), 255, random8(128, 255)),
CHSV(random8(), 255, random8(128, 255)),
CHSV(random8(), 192, random8(128, 255)),
CHSV(random8(), 255, random8(128, 255)));
_lastPaletteChange = millis();
} break;}
case 2: {//primary color only
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
targetPalette = CRGBPalette16(prim); break;}
case 3: {//primary + secondary
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
targetPalette = CRGBPalette16(prim,prim,sec,sec); break;}
case 4: {//primary + secondary + tertiary
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
targetPalette = CRGBPalette16(ter,sec,prim); break;}
case 5: {//primary + secondary (+tert if not off), more distinct
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB sec = strip.gammaCorrectCol ? gamma32(colors[1]) : colors[1];
if (colors[2]) {
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,ter,ter,ter,ter,ter,prim);
} else {
targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,sec,sec,sec);
}
break;}
case 6: //Party colors
targetPalette = PartyColors_p; break;
case 7: //Cloud colors
targetPalette = CloudColors_p; break;
case 8: //Lava colors
targetPalette = LavaColors_p; break;
case 9: //Ocean colors
targetPalette = OceanColors_p; break;
case 10: //Forest colors
targetPalette = ForestColors_p; break;
case 11: //Rainbow colors
targetPalette = RainbowColors_p; break;
case 12: //Rainbow stripe colors
targetPalette = RainbowStripeColors_p; break;
default: //progmem palettes
if (pal>245) {
targetPalette = strip.customPalettes[255-pal]; // we checked bounds above
} else {
memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[pal-13])), 72);
targetPalette.loadDynamicGradientPalette(tcp);
}
break;
}
return targetPalette;
}
CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
loadPalette(targetPalette, pal);
if (transitional && _t && progress() < 0xFFFFU) {
@ -447,7 +453,7 @@ void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col)
if (i==0)
setPixelColorXY(0, 0, col);
else {
float step = HALF_PI / (2*i);
float step = HALF_PI / (2.5f*i);
for (float rad = 0.0f; rad <= HALF_PI+step/2; rad += step) {
// may want to try float version as well (with or without antialiasing)
int x = roundf(sin_t(rad) * i);
@ -1079,8 +1085,8 @@ uint16_t WS2812FX::getFps() {
}
void WS2812FX::setTargetFps(uint8_t fps) {
if (fps > 0 && fps <= 120) _targetFps = fps;
_frametime = 1000 / _targetFps;
if (fps > 0 && fps <= 120) _targetFps = fps;
_frametime = 1000 / _targetFps;
}
void WS2812FX::setMode(uint8_t segid, uint8_t m) {
@ -1127,7 +1133,7 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) {
// would be dangerous if applied immediately (could exceed ABL), but will not output until the next show()
busses.setBrightness(b);
} else {
unsigned long t = millis();
unsigned long t = millis();
if (_segments[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) show(); //apply brightness change immediately if no refresh soon
}
}
@ -1180,7 +1186,7 @@ uint16_t WS2812FX::getLengthPhysical(void) {
//returns if there is an RGBW bus (supports RGB and White, not only white)
//not influenced by auto-white mode, also true if white slider does not affect output white channel
bool WS2812FX::hasRGBWBus(void) {
for (size_t b = 0; b < busses.getNumBusses(); b++) {
for (size_t b = 0; b < busses.getNumBusses(); b++) {
Bus *bus = busses.getBus(b);
if (bus == nullptr || bus->getLength()==0) break;
switch (bus->getType()) {
@ -1190,12 +1196,12 @@ bool WS2812FX::hasRGBWBus(void) {
return true;
}
}
return false;
return false;
}
bool WS2812FX::hasCCTBus(void) {
if (cctFromRgb && !correctWB) return false;
for (size_t b = 0; b < busses.getNumBusses(); b++) {
if (cctFromRgb && !correctWB) return false;
for (size_t b = 0; b < busses.getNumBusses(); b++) {
Bus *bus = busses.getBus(b);
if (bus == nullptr || bus->getLength()==0) break;
switch (bus->getType()) {
@ -1204,7 +1210,7 @@ bool WS2812FX::hasCCTBus(void) {
return true;
}
}
return false;
return false;
}
void WS2812FX::purgeSegments(bool force) {
@ -1237,8 +1243,8 @@ void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping,
boundsUnchanged &= (seg.startY == startY && seg.stopY == stopY);
}
if (boundsUnchanged
&& (!grouping || (seg.grouping == grouping && seg.spacing == spacing))
&& (offset == UINT16_MAX || offset == seg.offset)) return;
&& (!grouping || (seg.grouping == grouping && seg.spacing == spacing))
&& (offset == UINT16_MAX || offset == seg.offset)) return;
//if (seg.stop) setRange(seg.start, seg.stop -1, BLACK); //turn old segment range off
if (seg.stop) seg.fill(BLACK); //turn old segment range off
@ -1273,7 +1279,7 @@ void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping,
seg.grouping = grouping;
seg.spacing = spacing;
}
if (offset < UINT16_MAX) seg.offset = offset;
if (offset < UINT16_MAX) seg.offset = offset;
seg.markForReset();
if (!boundsUnchanged) seg.refreshLightCapabilities();
}

View File

@ -574,7 +574,7 @@ function populatePresets(fromls)
<i class="icons e-icon flr" id="sege${i+100}" onclick="expand(${i+100})">&#xe395;</i>
<div class="presin lstIcontent" id="seg${i+100}"></div>
</div>`;
pNum++;
pNum++;
}
gId('pcont').innerHTML = cn;
@ -643,7 +643,7 @@ function populateInfo(i)
var pwru = "Not calculated";
if (pwr > 1000) {pwr /= 1000; pwr = pwr.toFixed((pwr > 10) ? 0 : 1); pwru = pwr + " A";}
else if (pwr > 0) {pwr = 50 * Math.round(pwr/50); pwru = pwr + " mA";}
var urows="";
var urows="";
if (i.u) {
for (const [k, val] of Object.entries(i.u)) {
if (val[1])
@ -863,10 +863,10 @@ function populatePalettes()
html += generateListItemHtml(
'palette',
pa[0],
pa[1],
'setPalette',
pa[1],
'setPalette',
`<div class="lstIprev" style="${genPalPrevCss(pa[0])}"></div>`
);
);
}
gId('pallist').innerHTML=html;
@ -932,7 +932,7 @@ function genPalPrevCss(id)
function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', effectPar = '')
{
return `<div class="lstI${id==0?' sticky':''}" data-id="${id}" ${effectPar===''?'':'data-opt="'+effectPar+'"'}onClick="${clickAction}(${id})">
return `<div class="lstI${id==0?' sticky':''}" data-id="${id}" ${effectPar===''?'':'data-opt="'+effectPar+'"'}onClick="${clickAction}(${id})">
<label class="radio schkl" onclick="event.preventDefault()">
<input type="radio" value="${id}" name="${listName}">
<span class="radiomark"></span>
@ -1035,24 +1035,27 @@ function updateLen(s)
var stop = parseInt(gId(`seg${s}e`).value);
var len = stop - (cfg.comp.seglen?0:start);
if (isM) {
// matrix setup
let startY = parseInt(gId(`seg${s}sY`).value);
let stopY = parseInt(gId(`seg${s}eY`).value);
len *= (stopY-(cfg.comp.seglen?0:startY));
let tPL = gId(`seg${s}lbtm`);
if (stop-start>1 && stopY-startY>1) {
tPL.classList.remove("hide");
// 2D segment
tPL.classList.remove("hide"); // unhide transpose checkbox
let sE = gId('fxlist').querySelector(`.lstI[data-id="${selectedFx}"]`);
if (sE) {
let sN = sE.querySelector(".lstIname").innerText;
let seg = gId(`seg${s}map2D`);
if (seg) {
if(sN.indexOf("\u25A6")<0) seg.classList.remove("hide");
else seg.classList.add("hide");
if(sN.indexOf("\u25A6")<0) seg.classList.remove("hide"); // unhide mapping for 1D effects (| in name)
else seg.classList.add("hide"); // hide mapping otherwise
}
}
} else {
tPL.classList.add("hide");
gId(`seg${s}tp`).checked = false;
// 1D segment in 2D set-up
tPL.classList.add("hide"); // hide transpose checkbox
gId(`seg${s}tp`).checked = false; // and uncheck it
}
}
var out = "(delete)";
@ -1250,7 +1253,7 @@ function readState(s,command=false)
tr = s.transition;
gId('tt').value = tr/10;
populateSegments(s);
var selc=0;
var sellvl=0; // 0: selc is invalid, 1: selc is mainseg, 2: selc is first selected
@ -1282,7 +1285,7 @@ function readState(s,command=false)
updateUI();
return true;
}
var cd = gId('csl').children;
for (let e = cd.length-1; e >= 0; e--) {
cd[e].dataset.r = i.col[e][0];
@ -1353,13 +1356,13 @@ function readState(s,command=false)
function setEffectParameters(idx)
{
if (!(Array.isArray(fxdata) && fxdata.length>idx)) return;
var controlDefined = (fxdata[idx].substr(0,1) == "@");
var controlDefined = (fxdata[idx].substr(0,1) == "@");
var effectPar = fxdata[idx].substr(1);
var effectPars = (effectPar == '')?[]:effectPar.split(";");
var slOnOff = (effectPars.length==0 || effectPars[0]=='')?[]:effectPars[0].split(",");
var coOnOff = (effectPars.length<2 || effectPars[1]=='')?[]:effectPars[1].split(",");
var paOnOff = (effectPars.length<3 || effectPars[2]=='')?[]:effectPars[2].split(",");
// set html slider items on/off
//var nSliders = Math.min(7,Math.floor(gId("sliders").children.length)); // div for each slider + filter + options
let nSliders = 5;
@ -1439,7 +1442,7 @@ function setEffectParameters(idx)
}
}
gId("cslLabel").innerHTML = cslLabel;
// set palette on/off
var palw = gId("palw"); // wrapper
var pall = gId("pall"); // label
@ -1585,28 +1588,28 @@ function toggleSync()
function toggleLiveview()
{
//WLEDSR adding liveview2D support
if (isInfo && isM) toggleInfo();
if (isNodes && isM) toggleNodes();
isLv = !isLv;
//WLEDSR adding liveview2D support
if (isInfo && isM) toggleInfo();
if (isNodes && isM) toggleNodes();
isLv = !isLv;
var lvID = "liveview";
if (isM) {
lvID = "liveview2D"
if (isLv) {
var cn = '<iframe id="liveview2D" src="about:blank"></iframe>';
d.getElementById('kliveview2D').innerHTML = cn;
var lvID = "liveview";
if (isM) {
lvID = "liveview2D"
if (isLv) {
var cn = '<iframe id="liveview2D" src="about:blank"></iframe>';
d.getElementById('kliveview2D').innerHTML = cn;
}
gId('mliveview2D').style.transform = (isLv) ? "translateY(0px)":"translateY(100%)";
}
gId('mliveview2D').style.transform = (isLv) ? "translateY(0px)":"translateY(100%)";
}
gId(lvID).style.display = (isLv) ? "block":"none";
var url = (loc?`http://${locip}`:'') + "/" + lvID;
gId(lvID).src = (isLv) ? url:"about:blank";
gId('buttonSr').className = (isLv) ? "active":"";
if (!isLv && ws && ws.readyState === WebSocket.OPEN) ws.send('{"lv":false}');
size();
gId(lvID).style.display = (isLv) ? "block":"none";
var url = (loc?`http://${locip}`:'') + "/" + lvID;
gId(lvID).src = (isLv) ? url:"about:blank";
gId('buttonSr').className = (isLv) ? "active":"";
if (!isLv && ws && ws.readyState === WebSocket.OPEN) ws.send('{"lv":false}');
size();
}
function toggleInfo()
@ -1825,17 +1828,12 @@ ${makePlSel(plJson[i].end?plJson[i].end:0, true)}
<span class="lstIname">
${pl?"Show playlist editor":(i>0)?"Overwrite with state":"Use current state"}
</span>
<input type="checkbox" id="p${i}cstgl" onchange="tglCs(${i})" ${(i==0||pl)?"checked":""}>
<span class="checkmark"></span>
</label>
</div>
<div class="po2" id="p${i}o2">
API command<br>
<textarea class="apitxt" id="p${i}api"></textarea>
</div>
<div class="po1" id="p${i}o1">
${content}
<input type="checkbox" id="p${i}cstgl" onchange="tglCs(${i})" ${(i==0||pl)?"checked":""}>
<span class="checkmark"></span>
</label>
</div>
<div class="po2" id="p${i}o2">API command<br><textarea class="apitxt" id="p${i}api"></textarea></div>
<div class="po1" id="p${i}o1">${content}</div>
<div class="c">Save to ID <input class="noslide" id="p${i}id" type="number" oninput="checkUsed(${i})" max=250 min=1 value=${(i>0)?i:getLowestUnusedP()}></div>
<div class="c">
<button class="btn btn-p" onclick="saveP(${i},${pl})"><i class="icons btn-icon">&#xe390;</i>Save</button>
@ -1862,9 +1860,10 @@ function makePUtil()
gId('psFind').classList.remove('staytop');
}
function makePlEntry(p,i) {
return `<div class="plentry">
<div class="hrz"></div>
function makePlEntry(p,i)
{
return `<div class="plentry">
<div class="hrz"></div>
<table>
<tr>
<td width="80%" colspan=2>
@ -2199,7 +2198,7 @@ function saveP(i,pl)
gId(`p${i}warn`).innerHTML = "&#9888; Syntax error in custom JSON API command";
return;
} else if (raw.indexOf("Please") == 0) {
gId(`p${i}warn`).innerHTML = "&#9888; Please refresh the page before modifying this preset";
gId(`p${i}warn`).innerHTML = "&#9888; Please refresh the page before modifying this preset";
return;
}
}

View File

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

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2208231
#define VERSION 2208241
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG