Merge remote-tracking branch 'origin/dev' into audioreactive-prototype

This commit is contained in:
Frank 2022-09-08 20:47:49 +02:00
commit 228890aa19
33 changed files with 18678 additions and 16152 deletions

View File

@ -109,6 +109,8 @@ static void autoResetPeak(void); // peak auto-reset function
#define FFT_SPEED_OVER_PRECISION // enables use of reciprocals (1/x etc), and an a few other speedups
#define FFT_SQRT_APPROXIMATION // enables "quake3" style inverse sqrt
#define sqrt(x) sqrtf(x) // little hack that reduces FFT time by 50% on ESP32 (as alternative to FFT_SQRT_APPROXIMATION)
#else
// lib_deps += https://github.com/blazoncek/arduinoFFT.git
#endif
#include "arduinoFFT.h"
@ -1050,7 +1052,7 @@ class AudioReactive : public Usermod {
if (strip.isUpdating() && (millis() - lastUMRun < 2)) return; // be nice, but not too nice
// suspend local sound processing when "real time mode" is active (E131, UDP, ADALIGHT, ARTNET)
if ( (realtimeOverride == REALTIME_OVERRIDE_NONE) // please odd other orrides here if needed
if ( (realtimeOverride == REALTIME_OVERRIDE_NONE) // please add other overrides here if needed
&&( (realtimeMode == REALTIME_MODE_GENERIC)
||(realtimeMode == REALTIME_MODE_E131)
||(realtimeMode == REALTIME_MODE_UDP)
@ -1363,10 +1365,6 @@ class AudioReactive : public Usermod {
infoArr.add(fftTime-sampleTime);
infoArr.add("ms");
#endif
// add a small horizontal line, for better readability
infoArr = user.createNestedArray(F("<hr style=\"height:1px;border-width:0;color:gray;background-color:gray\" />"));
infoArr.add(F(" <hr style=\"height:1px;border-width:0;color:gray;background-color:gray\" /> "));
}
}

View File

@ -30,6 +30,7 @@
#define IBN 5100
#define PALETTE_SOLID_WRAP (strip.paletteBlend == 1 || strip.paletteBlend == 3)
#define indexToVStrip(index, stripNr) ((index) | (int((stripNr)+1)<<16))
// effect utility functions
uint8_t sin_gap(uint16_t in) {
@ -1926,10 +1927,7 @@ uint16_t mode_palette()
for (int i = 0; i < SEGLEN; i++)
{
uint8_t colorIndex = (i * 255 / SEGLEN) - counter;
if (noWrap) colorIndex = map(colorIndex, 0, 255, 0, 240); //cut off blend at palette "end"
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(colorIndex, false, true, 255));
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(colorIndex, false, noWrap, 255));
}
return FRAMETIME;
}
@ -1966,59 +1964,59 @@ static const char _data_FX_MODE_PALETTE[] PROGMEM = "Palette@Cycle speed,;1,2,3;
// in step 3 above) (Effect Intensity = Sparking).
uint16_t mode_fire_2012()
{
const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1;
const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength();
uint32_t it = strip.now >> 5; //div 32
//uint16_t q = cols>>2; // a quarter of flames
if (!SEGENV.allocateData(cols*rows)) return mode_static(); //allocation failed
uint16_t strips = SEGMENT.nrOfVStrips();
if (!SEGENV.allocateData(strips * SEGLEN)) return mode_static(); //allocation failed
byte* heat = SEGENV.data;
if (it != SEGENV.step) {
SEGENV.step = it;
uint8_t ignition = max(3,rows/10); // ignition area: 10% of segment length or minimum 3 pixels
uint32_t it = strip.now >> 5; //div 32
for (int f = 0; f < cols; f++) {
// Step 1. Cool down every cell a little
for (int i = 0; i < rows; i++) {
uint8_t cool = (((20 + SEGMENT.speed/3) * 16) / rows);
/*
// 2D enhancement: cool sides of the flame a bit more
if (cols>5) {
if (f < q) cool = qadd8(cool, 2*(uint16_t)((cool * (q-f))/cols)); // cool segment sides a bit more
if (f > 3*q) cool = qadd8(cool, 2*(uint16_t)((cool * (cols-f))/cols)); // cool segment sides a bit more
struct virtualStrip {
static void runStrip(uint16_t stripNr, byte* heat, uint32_t it) {
if (it != SEGENV.step)
{
uint8_t ignition = max(3,SEGLEN/10); // ignition area: 10% of segment length or minimum 3 pixels
// Step 1. Cool down every cell a little
for (int i = 0; i < SEGLEN; i++) {
uint8_t cool = random8((((20 + SEGMENT.speed/3) * 16) / SEGLEN)+2);
uint8_t minTemp = 0;
if (i<ignition) {
cool /= (ignition-i); // ignition area cools slower
minTemp = 4*(ignition-i) + 8; // and should not become black
}
uint8_t temp = qsub8(heat[i], cool);
heat[i] = i<ignition && temp<minTemp ? minTemp : temp; // prevent ignition area from becoming black
}
// Step 2. Heat from each cell drifts 'up' and diffuses a little
for (int k = SEGLEN -1; k > 1; k--) {
heat[k] = (heat[k - 1] + (heat[k - 2]<<1) ) / 3; // heat[k-2] multiplied by 2
}
// Step 3. Randomly ignite new 'sparks' of heat near the bottom
if (random8() <= SEGMENT.intensity) {
uint8_t y = random8(ignition);
heat[y] = qadd8(heat[y], random8(160,255));
}
*/
uint8_t temp = qsub8(heat[i+rows*f], random8(0, cool + 2));
heat[i+rows*f] = (temp==0 && i<ignition) ? random8(1,16) : temp; // prevent ignition area from becoming black
}
// Step 2. Heat from each cell drifts 'up' and diffuses a little
for (int k = rows -1; k > 1; k--) {
heat[k+rows*f] = (heat[k+rows*f - 1] + (heat[k+rows*f - 2]<<1) ) / 3; // heat[k-2] multiplied by 2
}
// Step 3. Randomly ignite new 'sparks' of heat near the bottom
if (random8() <= SEGMENT.intensity) {
uint8_t y = random8(ignition);
heat[y+rows*f] = qadd8(heat[y+rows*f], random8(160,255));
// Step 4. Map from heat cells to LED colors
for (int j = 0; j < SEGLEN; j++) {
SEGMENT.setPixelColor(indexToVStrip(j, stripNr), ColorFromPalette(SEGPALETTE, MIN(heat[j],240), 255, NOBLEND));
}
}
}
};
for (int stripNr=0; stripNr<strips; stripNr++)
virtualStrip::runStrip(stripNr, &heat[stripNr * SEGLEN], it);
if (it != SEGENV.step)
SEGENV.step = it;
for (int f = 0; f < cols; f++) {
// Step 4. Map from heat cells to LED colors
for (int j = 0; j < rows; j++) {
CRGB color = ColorFromPalette(SEGPALETTE, /*MIN(*/heat[j+rows*f]/*,240)*/, 255, LINEARBLEND);
if (strip.isMatrix) SEGMENT.setPixelColorXY(f, rows -j -1, color);
else SEGMENT.setPixelColor(j, color);
}
}
return FRAMETIME;
}
static const char _data_FX_MODE_FIRE_2012[] PROGMEM = "Fire 2012@Cooling,Spark rate;1,2,3;!;sx=120,ix=64,1d,2d";
static const char _data_FX_MODE_FIRE_2012[] PROGMEM = "Fire 2012@Cooling,Spark rate;1,2,3;!;sx=120,ix=64,mp12=1,1d"; //bars
// ColorWavesWithPalettes by Mark Kriegsman: https://gist.github.com/kriegsman/8281905786e8b2632aeb
@ -2849,7 +2847,7 @@ uint16_t mode_bouncing_balls(void) {
}
int pos = roundf(balls[i].height * (SEGLEN - 1));
if (SEGLEN<32) SEGMENT.setPixelColor(pos | int((stripNr+1)<<16), color); // encode virtual strip into index
if (SEGLEN<32) SEGMENT.setPixelColor(indexToVStrip(pos, stripNr), color); // encode virtual strip into index
else SEGMENT.setPixelColor(balls[i].height + (stripNr+1)*10.0f, color);
}
}
@ -2942,68 +2940,68 @@ typedef struct Spark {
uint8_t colIndex;
} spark;
#define maxNumPopcorn 21 // max 21 on 16 segment ESP8266
/*
* POPCORN
* modified from https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/Popcorn.h
*/
uint16_t mode_popcorn(void) {
const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1;
const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength();
//allocate segment data
uint16_t maxNumPopcorn = 21; // max 21 on 16 segment ESP8266
uint16_t strips = SEGMENT.nrOfVStrips();
uint16_t dataSize = sizeof(spark) * maxNumPopcorn;
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
Spark* popcorn = reinterpret_cast<Spark*>(SEGENV.data);
if (!SEGENV.allocateData(dataSize * strips)) return mode_static(); //allocation failed
float gravity = -0.0001 - (SEGMENT.speed/200000.0); // m/s/s
gravity *= rows; //SEGLEN
Spark* popcorn = reinterpret_cast<Spark*>(SEGENV.data);
bool hasCol2 = SEGCOLOR(2);
SEGMENT.fill(hasCol2 ? BLACK : SEGCOLOR(1));
uint8_t numPopcorn = SEGMENT.intensity*maxNumPopcorn/255;
if (numPopcorn == 0) numPopcorn = 1;
struct virtualStrip {
static void runStrip(uint16_t stripNr, Spark* popcorn) {
float gravity = -0.0001 - (SEGMENT.speed/200000.0); // m/s/s
gravity *= SEGLEN;
for (int i = 0; i < numPopcorn; i++) {
if (popcorn[i].pos >= 0.0f) { // if kernel is active, update its position
popcorn[i].pos += popcorn[i].vel;
popcorn[i].vel += gravity;
} else { // if kernel is inactive, randomly pop it
if (random8() < 2) { // POP!!!
popcorn[i].pos = 0.01f;
popcorn[i].posX = random16(cols);
uint16_t peakHeight = 128 + random8(128); //0-255
peakHeight = (peakHeight * (rows -1)) >> 8;
popcorn[i].vel = sqrt(-2.0 * gravity * peakHeight);
popcorn[i].velX = 0;
if (SEGMENT.palette) {
popcorn[i].colIndex = random8();
} else {
byte col = random8(0, NUM_COLORS);
if (!hasCol2 || !SEGCOLOR(col)) col = 0;
popcorn[i].colIndex = col;
uint8_t numPopcorn = SEGMENT.intensity*maxNumPopcorn/255;
if (numPopcorn == 0) numPopcorn = 1;
for(int i = 0; i < numPopcorn; i++) {
if (popcorn[i].pos >= 0.0f) { // if kernel is active, update its position
popcorn[i].pos += popcorn[i].vel;
popcorn[i].vel += gravity;
} else { // if kernel is inactive, randomly pop it
if (random8() < 2) { // POP!!!
popcorn[i].pos = 0.01f;
uint16_t peakHeight = 128 + random8(128); //0-255
peakHeight = (peakHeight * (SEGLEN -1)) >> 8;
popcorn[i].vel = sqrt(-2.0 * gravity * peakHeight);
if (SEGMENT.palette)
{
popcorn[i].colIndex = random8();
} else {
byte col = random8(0, NUM_COLORS);
if (!SEGCOLOR(2) || !SEGCOLOR(col)) col = 0;
popcorn[i].colIndex = col;
}
}
}
if (popcorn[i].pos >= 0.0f) { // draw now active popcorn (either active before or just popped)
uint32_t col = SEGMENT.color_wheel(popcorn[i].colIndex);
if (!SEGMENT.palette && popcorn[i].colIndex < NUM_COLORS) col = SEGCOLOR(popcorn[i].colIndex);
uint16_t ledIndex = popcorn[i].pos;
if (ledIndex < SEGLEN) SEGMENT.setPixelColor(indexToVStrip(ledIndex, stripNr), col);
}
}
}
if (popcorn[i].pos >= 0.0f) { // draw now active popcorn (either active before or just popped)
uint32_t col = SEGMENT.color_wheel(popcorn[i].colIndex);
if (!SEGMENT.palette && popcorn[i].colIndex < NUM_COLORS) col = SEGCOLOR(popcorn[i].colIndex);
uint16_t ledIndex = popcorn[i].pos;
if (ledIndex < rows) {
if (strip.isMatrix) SEGMENT.setPixelColorXY(uint16_t(popcorn[i].posX), rows - 1 - ledIndex, col);
else SEGMENT.setPixelColor(ledIndex, col);
}
}
}
};
for (int stripNr=0; stripNr<strips; stripNr++)
virtualStrip::runStrip(stripNr, &popcorn[stripNr * maxNumPopcorn]);
return FRAMETIME;
}
static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!;!,!,!;!;1d,2d";
static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!;!,!,!;!;mp12=1,1d"; //bar
//values close to 100 produce 5Hz flicker, which looks very candle-y
@ -3375,91 +3373,84 @@ static const char _data_FX_MODE_EXPLODING_FIREWORKS[] PROGMEM = "Fireworks 1D@Gr
*/
uint16_t mode_drip(void)
{
const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1;
const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength();
//allocate segment data
uint8_t numDrops = 4;
uint16_t dataSize = sizeof(spark) * numDrops;
if (!SEGENV.allocateData(dataSize * cols)) return mode_static(); //allocation failed
uint16_t strips = SEGMENT.nrOfVStrips();
const int maxNumDrops = 4;
uint16_t dataSize = sizeof(spark) * maxNumDrops;
if (!SEGENV.allocateData(dataSize * strips)) return mode_static(); //allocation failed
Spark* drops = reinterpret_cast<Spark*>(SEGENV.data);
SEGMENT.fill(SEGCOLOR(1));
Spark* drops = reinterpret_cast<Spark*>(SEGENV.data);
struct virtualStrip {
static void runStrip(uint16_t stripNr, Spark* drops) {
numDrops = 1 + (SEGMENT.intensity >> 6); // 255>>6 = 3
uint8_t numDrops = 1 + (SEGMENT.intensity >> 6); // 255>>6 = 3
float gravity = -0.0005 - (SEGMENT.speed/50000.0);
gravity *= rows-1;
int sourcedrop = 12;
float gravity = -0.0005 - (SEGMENT.speed/50000.0);
gravity *= SEGLEN-1;
int sourcedrop = 12;
for (int k=0; k < cols; k++) {
for (size_t j=0; j < numDrops; j++) {
uint16_t idx = k*numDrops + j;
if (drops[idx].colIndex == 0) { //init
drops[idx].pos = rows-1; // start at end
drops[idx].vel = 0; // speed
drops[idx].col = sourcedrop; // brightness
drops[idx].colIndex = 1; // drop state (0 init, 1 forming, 2 falling, 5 bouncing)
}
uint32_t col = color_blend(BLACK, SEGCOLOR(0), sourcedrop);
if (strip.isMatrix) SEGMENT.setPixelColorXY(k, 0, col);
else SEGMENT.setPixelColor(rows-1, col);// water source
if (drops[idx].colIndex == 1) {
if (drops[idx].col > 255) drops[idx].col = 255;
col = color_blend(BLACK,SEGCOLOR(0),drops[idx].col);
if (strip.isMatrix) SEGMENT.setPixelColorXY(k, rows - 1 - uint16_t(drops[idx].pos), col);
else SEGMENT.setPixelColor(uint16_t(drops[idx].pos), col);
drops[idx].col += map(SEGMENT.speed, 0, 255, 1, 6); // swelling
if (random8() < drops[idx].col/10) { // random drop
drops[idx].colIndex = 2; //fall
drops[idx].col = 255;
for (int j=0;j<numDrops;j++) {
if (drops[j].colIndex == 0) { //init
drops[j].pos = SEGLEN-1; // start at end
drops[j].vel = 0; // speed
drops[j].col = sourcedrop; // brightness
drops[j].colIndex = 1; // drop state (0 init, 1 forming, 2 falling, 5 bouncing)
}
}
if (drops[idx].colIndex > 1) { // falling
if (drops[idx].pos > 0) { // fall until end of segment
drops[idx].pos += drops[idx].vel;
if (drops[idx].pos < 0) drops[idx].pos = 0;
drops[idx].vel += gravity; // gravity is negative
for (int i = 1; i < 7 - drops[idx].colIndex; i++) { // some minor math so we don't expand bouncing droplets
uint16_t pos = constrain(uint16_t(drops[idx].pos) +i, 0, rows-1); //this is BAD, returns a pos >= SEGLEN occasionally
col = color_blend(BLACK, SEGCOLOR(0), drops[idx].col/i);
if (strip.isMatrix) SEGMENT.setPixelColorXY(k, rows - 1 - pos, col);
else SEGMENT.setPixelColor(pos, col); //spread pixel with fade while falling
SEGMENT.setPixelColor(indexToVStrip(SEGLEN-1, stripNr), color_blend(BLACK,SEGCOLOR(0), sourcedrop));// water source
if (drops[j].colIndex==1) {
if (drops[j].col>255) drops[j].col=255;
SEGMENT.setPixelColor(indexToVStrip(uint16_t(drops[j].pos), stripNr), color_blend(BLACK,SEGCOLOR(0),drops[j].col));
drops[j].col += map(SEGMENT.speed, 0, 255, 1, 6); // swelling
if (random8() < drops[j].col/10) { // random drop
drops[j].colIndex=2; //fall
drops[j].col=255;
}
}
if (drops[j].colIndex > 1) { // falling
if (drops[j].pos > 0) { // fall until end of segment
drops[j].pos += drops[j].vel;
if (drops[j].pos < 0) drops[j].pos = 0;
drops[j].vel += gravity; // gravity is negative
if (drops[idx].colIndex > 2) { // during bounce, some water is on the floor
col = color_blend(SEGCOLOR(0), BLACK, drops[idx].col);
if (strip.isMatrix) SEGMENT.setPixelColorXY(k, rows - 1, col);
else SEGMENT.setPixelColor(0, col);
}
} else { // we hit bottom
if (drops[idx].colIndex > 2) { // already hit once, so back to forming
drops[idx].colIndex = 0;
drops[idx].col = sourcedrop;
} else {
for (int i=1;i<7-drops[j].colIndex;i++) { // some minor math so we don't expand bouncing droplets
uint16_t pos = constrain(uint16_t(drops[j].pos) +i, 0, SEGLEN-1); //this is BAD, returns a pos >= SEGLEN occasionally
SEGMENT.setPixelColor(indexToVStrip(pos, stripNr), color_blend(BLACK,SEGCOLOR(0),drops[j].col/i)); //spread pixel with fade while falling
}
if (drops[idx].colIndex == 2) { // init bounce
drops[idx].vel = -drops[idx].vel/4;// reverse velocity with damping
drops[idx].pos += drops[idx].vel;
}
drops[idx].col = sourcedrop*2;
drops[idx].colIndex = 5; // bouncing
if (drops[j].colIndex > 2) { // during bounce, some water is on the floor
SEGMENT.setPixelColor(indexToVStrip(0, stripNr), color_blend(SEGCOLOR(0),BLACK,drops[j].col));
}
} else { // we hit bottom
if (drops[j].colIndex > 2) { // already hit once, so back to forming
drops[j].colIndex = 0;
drops[j].col = sourcedrop;
} else {
if (drops[j].colIndex==2) { // init bounce
drops[j].vel = -drops[j].vel/4;// reverse velocity with damping
drops[j].pos += drops[j].vel;
}
drops[j].col = sourcedrop*2;
drops[j].colIndex = 5; // bouncing
}
}
}
}
}
}
};
for (int stripNr=0; stripNr<strips; stripNr++)
virtualStrip::runStrip(stripNr, &drops[stripNr*maxNumDrops]);
return FRAMETIME;
}
static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;1d,2d";
static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;mp12=1,1d"; //bar
/*
@ -3493,7 +3484,7 @@ uint16_t mode_tetrix(void) {
if (SEGENV.call == 0) {
drop->stack = 0; // reset brick stack size
drop->step = 0;
//for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1)); // will fill virtual strip only
//for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(indexToVStrip(i, stripNr), SEGCOLOR(1)); // will fill virtual strip only
}
if (drop->step == 0) { // init brick
@ -3521,7 +3512,7 @@ uint16_t mode_tetrix(void) {
if (uint16_t(drop->pos) < drop->stack) drop->pos = drop->stack;
for (int i=int(drop->pos); i<SEGLEN; i++) {
uint32_t col = i<int(drop->pos)+drop->brick ? SEGMENT.color_from_palette(drop->col, false, false, 0) : SEGCOLOR(1);
SEGMENT.setPixelColor(i | int((stripNr+1)<<16), col);
SEGMENT.setPixelColor(indexToVStrip(i, stripNr), col);
}
} else { // we hit bottom
drop->step = 0; // proceed with next brick, go back to init
@ -3534,7 +3525,7 @@ uint16_t mode_tetrix(void) {
drop->brick = 0; // reset brick size (no more growing)
if (drop->step > millis()) {
// allow fading of virtual strip
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1), 25); // 10% blend with Bg color
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(indexToVStrip(i, stripNr), SEGCOLOR(1), 25); // 10% blend
} else {
drop->stack = 0; // reset brick stack size
drop->step = 0; // proceed with next brick
@ -5848,12 +5839,13 @@ uint16_t mode_2Dscrollingtext(void) {
int letterWidth;
int letterHeight;
switch (map(SEGMENT.custom2, 0, 255, 1, 4)) {
switch (map(SEGMENT.custom2, 0, 255, 1, 5)) {
default:
case 1: letterWidth = 5; letterHeight = 8; break;
case 2: letterWidth = 6; letterHeight = 8; break;
case 3: letterWidth = 7; letterHeight = 9; break;
case 4: letterWidth = 5; letterHeight = 12; break;
case 1: letterWidth = 4; letterHeight = 6; break;
case 2: letterWidth = 5; letterHeight = 8; break;
case 3: letterWidth = 6; letterHeight = 8; break;
case 4: letterWidth = 7; letterHeight = 9; break;
case 5: letterWidth = 5; letterHeight = 12; break;
}
const int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-letterHeight)/2;
char text[33] = {'\0'};
@ -5893,7 +5885,7 @@ uint16_t mode_2Dscrollingtext(void) {
return FRAMETIME;
}
static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size;!,!;!;ix=96,c1=0,rev=0,mi=0,rY=0,mY=0,2d";
static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size;!,!;!;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0,2d";
////////////////////////////
@ -5930,7 +5922,6 @@ static const char _data_FX_MODE_2DDRIFTROSE[] PROGMEM = "Drift Rose@Fade,Blur;;;
#endif // WLED_DISABLE_2D
#ifndef WLED_DISABLE_AUDIO
///////////////////////////////////////////////////////////////////////////////
/******************** audio enhanced routines ************************/
///////////////////////////////////////////////////////////////////////////////
@ -6614,11 +6605,6 @@ uint16_t mode_puddles(void) { // Puddles. By Andrew Tuline.
static const char _data_FX_MODE_PUDDLES[] PROGMEM = "Puddles@Fade rate,Puddle size;!,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin
///////////////////////////////////////////////////////////////////////////////
/******************** audio only routines ************************/
///////////////////////////////////////////////////////////////////////////////
#ifdef USERMOD_AUDIOREACTIVE
//////////////////////
// * PIXELS //
//////////////////////
@ -7207,14 +7193,7 @@ uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Wil
} // mode_2DFunkyPlank
static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;ssim=0,2d,fr"; // Beatsin
#endif // WLED_DISABLE_2D
//end audio only routines
#endif
#ifndef WLED_DISABLE_2D
/////////////////////////
// 2D Akemi //
/////////////////////////
@ -7319,7 +7298,6 @@ uint16_t mode_2DAkemi(void) {
static const char _data_FX_MODE_2DAKEMI[] PROGMEM = "Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette;ssim=0,2d,fr"; //beatsin
#endif // WLED_DISABLE_2D
#endif // WLED_DISABLE_AUDIO
//////////////////////////////////////////////////////////////////////////////////////////
// mode data
@ -7501,16 +7479,14 @@ void WS2812FX::setupEffectData() {
addEffect(FX_MODE_2DMETABALLS, &mode_2Dmetaballs, _data_FX_MODE_2DMETABALLS);
addEffect(FX_MODE_2DPULSER, &mode_2DPulser, _data_FX_MODE_2DPULSER);
addEffect(FX_MODE_2DDRIFT, &mode_2DDrift, _data_FX_MODE_2DDRIFT);
// --- 2D audio effects ---
#ifndef WLED_DISABLE_AUDIO
addEffect(FX_MODE_2DWAVERLY, &mode_2DWaverly, _data_FX_MODE_2DWAVERLY);
addEffect(FX_MODE_2DSWIRL, &mode_2DSwirl, _data_FX_MODE_2DSWIRL);
addEffect(FX_MODE_2DAKEMI, &mode_2DAkemi, _data_FX_MODE_2DAKEMI);
#endif
addEffect(FX_MODE_2DGEQ, &mode_2DGEQ, _data_FX_MODE_2DGEQ);
addEffect(FX_MODE_2DFUNKYPLANK, &mode_2DFunkyPlank, _data_FX_MODE_2DFUNKYPLANK);
#endif // WLED_DISABLE_2D
#ifndef WLED_DISABLE_AUDIO
// --- 1D audio effects ---
addEffect(FX_MODE_PIXELWAVE, &mode_pixelwave, _data_FX_MODE_PIXELWAVE);
addEffect(FX_MODE_JUGGLES, &mode_juggles, _data_FX_MODE_JUGGLES);
@ -7525,29 +7501,15 @@ void WS2812FX::setupEffectData() {
addEffect(FX_MODE_RIPPLEPEAK, &mode_ripplepeak, _data_FX_MODE_RIPPLEPEAK);
addEffect(FX_MODE_GRAVCENTER, &mode_gravcenter, _data_FX_MODE_GRAVCENTER);
addEffect(FX_MODE_GRAVCENTRIC, &mode_gravcentric, _data_FX_MODE_GRAVCENTRIC);
#endif // WLED_DISABLE_AUDIO
#ifdef USERMOD_AUDIOREACTIVE
// --- WLED-SR audio reactive usermod only effects ---
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
#ifdef WLED_DISABLE_2D
#error AUDIOREACTIVE usermod requires 2D support.
#endif
addEffect(FX_MODE_PIXELS, &mode_pixels, _data_FX_MODE_PIXELS);
addEffect(FX_MODE_FREQWAVE, &mode_freqwave, _data_FX_MODE_FREQWAVE);
addEffect(FX_MODE_FREQMATRIX, &mode_freqmatrix, _data_FX_MODE_FREQMATRIX);
addEffect(FX_MODE_2DGEQ, &mode_2DGEQ, _data_FX_MODE_2DGEQ);
addEffect(FX_MODE_WATERFALL, &mode_waterfall, _data_FX_MODE_WATERFALL);
addEffect(FX_MODE_FREQPIXELS, &mode_freqpixels, _data_FX_MODE_FREQPIXELS);
addEffect(FX_MODE_NOISEMOVE, &mode_noisemove, _data_FX_MODE_NOISEMOVE);
addEffect(FX_MODE_FREQMAP, &mode_freqmap, _data_FX_MODE_FREQMAP);
addEffect(FX_MODE_GRAVFREQ, &mode_gravfreq, _data_FX_MODE_GRAVFREQ);
addEffect(FX_MODE_DJLIGHT, &mode_DJLight, _data_FX_MODE_DJLIGHT);
addEffect(FX_MODE_2DFUNKYPLANK, &mode_2DFunkyPlank, _data_FX_MODE_2DFUNKYPLANK);
addEffect(FX_MODE_BLURZ, &mode_blurz, _data_FX_MODE_BLURZ);
addEffect(FX_MODE_ROCKTAVES, &mode_rocktaves, _data_FX_MODE_ROCKTAVES);
//addEffect(FX_MODE_CUSTOMEFFECT, &mode_customEffect, _data_FX_MODE_CUSTOMEFFECT); //WLEDSR Custom Effects
#endif // USERMOD_AUDIOREACTIVE
}

View File

@ -275,67 +275,39 @@
#define FX_MODE_2DMETABALLS 142 // non audio
#define FX_MODE_2DPULSER 143 // non audio
#define FX_MODE_2DDRIFT 144 // non audio
#endif
#ifndef WLED_DISABLE_AUDIO
#ifndef WLED_DISABLE_2D
#define FX_MODE_2DWAVERLY 145 // audio enhanced
#define FX_MODE_2DSWIRL 146 // audio enhanced
#define FX_MODE_2DAKEMI 147 // audio enhanced
// 148 & 149 reserved
#endif
#define FX_MODE_PIXELWAVE 150 // audio enhanced
#define FX_MODE_JUGGLES 151 // audio enhanced
#define FX_MODE_MATRIPIX 152 // audio enhanced
#define FX_MODE_GRAVIMETER 153 // audio enhanced
#define FX_MODE_PLASMOID 154 // audio enhanced
#define FX_MODE_PUDDLES 155 // audio enhanced
#define FX_MODE_MIDNOISE 156 // audio enhanced
#define FX_MODE_NOISEMETER 157 // audio enhanced
#define FX_MODE_NOISEFIRE 158 // audio enhanced
#define FX_MODE_PUDDLEPEAK 159 // audio enhanced
#define FX_MODE_RIPPLEPEAK 160 // audio enhanced
#define FX_MODE_GRAVCENTER 161 // audio enhanced
#define FX_MODE_GRAVCENTRIC 162 // audio enhanced
#endif
#define FX_MODE_2DWAVERLY 145 // audio enhanced
#define FX_MODE_2DSWIRL 146 // audio enhanced
#define FX_MODE_2DAKEMI 147 // audio enhanced
#define FX_MODE_2DGEQ 148 // audio enhanced
#define FX_MODE_2DFUNKYPLANK 149 // audio enhanced
#endif //WLED_DISABLE_2D
#define FX_MODE_PIXELWAVE 150 // audio enhanced
#define FX_MODE_JUGGLES 151 // audio enhanced
#define FX_MODE_MATRIPIX 152 // audio enhanced
#define FX_MODE_GRAVIMETER 153 // audio enhanced
#define FX_MODE_PLASMOID 154 // audio enhanced
#define FX_MODE_PUDDLES 155 // audio enhanced
#define FX_MODE_MIDNOISE 156 // audio enhanced
#define FX_MODE_NOISEMETER 157 // audio enhanced
#define FX_MODE_NOISEFIRE 158 // audio enhanced
#define FX_MODE_PUDDLEPEAK 159 // audio enhanced
#define FX_MODE_RIPPLEPEAK 160 // audio enhanced
#define FX_MODE_GRAVCENTER 161 // audio enhanced
#define FX_MODE_GRAVCENTRIC 162 // audio enhanced
#define FX_MODE_PIXELS 163 // audio enhanced
#define FX_MODE_FREQWAVE 164 // audio enhanced
#define FX_MODE_FREQMATRIX 165 // audio enhanced
#define FX_MODE_WATERFALL 166 // audio enhanced
#define FX_MODE_FREQPIXELS 167 // audio enhanced
#define FX_MODE_BINMAP 168 // audio enhanced
#define FX_MODE_NOISEMOVE 169 // audio enhanced
#define FX_MODE_FREQMAP 170 // audio enhanced
#define FX_MODE_GRAVFREQ 171 // audio enhanced
#define FX_MODE_DJLIGHT 172 // audio enhanced
#define FX_MODE_BLURZ 173 // audio enhanced
#define FX_MODE_ROCKTAVES 174 // audio enhanced
#ifndef USERMOD_AUDIOREACTIVE
#ifndef WLED_DISABLE_AUDIO
#define MODE_COUNT 163
#else
#ifndef WLED_DISABLE_2D
#define MODE_COUNT 145
#else
#define MODE_COUNT 118
#endif
#endif
#else
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
#ifdef WLED_DISABLE_2D
#error AUDIOREACTIVE usermod requires 2D support.
#endif
#define FX_MODE_2DGEQ 148
#define FX_MODE_2DFUNKYPLANK 149
#define FX_MODE_PIXELS 163
#define FX_MODE_FREQWAVE 164
#define FX_MODE_FREQMATRIX 165
#define FX_MODE_WATERFALL 166
#define FX_MODE_FREQPIXELS 167
#define FX_MODE_BINMAP 168
#define FX_MODE_NOISEMOVE 169
#define FX_MODE_FREQMAP 170
#define FX_MODE_GRAVFREQ 171
#define FX_MODE_DJLIGHT 172
#define FX_MODE_BLURZ 173
#define FX_MODE_ROCKTAVES 174
//#define FX_MODE_CUSTOMEFFECT 175 //WLEDSR Custom Effects
#define MODE_COUNT 175
#endif
#define MODE_COUNT 175
typedef enum mapping1D2D {
M12_Pixels = 0,
@ -416,14 +388,31 @@ typedef struct Segment {
uint8_t _briT; // temporary brightness
uint8_t _cctT; // temporary CCT
CRGBPalette16 _palT; // temporary palette
uint8_t _prevPaletteBlends; // number of previous palette blends (there are max 128 belnds possible)
uint8_t _modeP; // previous mode/effect
//uint16_t _aux0, _aux1; // previous mode/effect runtime data
//uint32_t _step, _call; // previous mode/effect runtime data
//byte *_data; // previous mode/effect runtime data
uint32_t _start;
uint16_t _dur;
Transition(uint16_t dur=750) : _briT(255), _cctT(127), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(dur) {}
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(d) {
Transition(uint16_t dur=750)
: _briT(255)
, _cctT(127)
, _palT(CRGBPalette16(CRGB::Black))
, _prevPaletteBlends(0)
, _modeP(FX_MODE_STATIC)
, _start(millis())
, _dur(dur)
{}
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o)
: _briT(b)
, _cctT(c)
, _palT(CRGBPalette16(CRGB::Black))
, _prevPaletteBlends(0)
, _modeP(FX_MODE_STATIC)
, _start(millis())
, _dur(d)
{
for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = o[i];
}
} *_t;
@ -647,8 +636,6 @@ class WS2812FX { // 96 bytes
public:
WS2812FX() :
gammaCorrectBri(false),
gammaCorrectCol(true),
paletteFade(0),
paletteBlend(0),
milliampsPerLed(55),
@ -747,8 +734,6 @@ class WS2812FX { // 96 bytes
inline void appendSegment(const Segment &seg = Segment()) { _segments.push_back(seg); }
bool
gammaCorrectBri,
gammaCorrectCol,
checkSegmentAlignment(void),
hasRGBWBus(void),
hasCCTBus(void),

View File

@ -459,14 +459,17 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint3
}
}
#include "console_font_5x8.h"
#include "console_font_5x12.h"
#include "console_font_6x8.h"
#include "console_font_7x9.h"
#include "src/font/console_font_4x6.h"
#include "src/font/console_font_5x8.h"
#include "src/font/console_font_5x12.h"
#include "src/font/console_font_6x8.h"
#include "src/font/console_font_7x9.h"
// draws a raster font character on canvas
// only supports 5x8=40, 5x12=60, 6x8=48 and 7x9=63 fonts ATM
void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color) {
if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported
chr -= 32; // align with font table entries
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
const int font = w*h;
@ -478,6 +481,7 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w,
if (y0 >= rows) break; // drawing off-screen
uint8_t bits = 0;
switch (font) {
case 24: bits = pgm_read_byte_near(&console_font_4x6[(chr * h) + i]); break; // 5x8 font
case 40: bits = pgm_read_byte_near(&console_font_5x8[(chr * h) + i]); break; // 5x8 font
case 48: bits = pgm_read_byte_near(&console_font_6x8[(chr * h) + i]); break; // 6x8 font
case 63: bits = pgm_read_byte_near(&console_font_7x9[(chr * h) + i]); break; // 7x9 font

View File

@ -208,6 +208,7 @@ void Segment::setUpLeds() {
CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
static unsigned long _lastPaletteChange = 0; // perhaps it should be per segment
static CRGBPalette16 randomPalette = CRGBPalette16(DEFAULT_COLOR);
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;
@ -229,30 +230,31 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
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)));
randomPalette = CRGBPalette16(
CHSV(random8(), random8(160, 255), random8(128, 255)),
CHSV(random8(), random8(160, 255), random8(128, 255)),
CHSV(random8(), random8(160, 255), random8(128, 255)),
CHSV(random8(), random8(160, 255), random8(128, 255)));
_lastPaletteChange = millis();
} break;
}
targetPalette = randomPalette; break;
case 2: {//primary color only
CRGB prim = strip.gammaCorrectCol ? gamma32(colors[0]) : colors[0];
CRGB prim = gamma32(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];
CRGB prim = gamma32(colors[0]);
CRGB sec = gamma32(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];
CRGB prim = gamma32(colors[0]);
CRGB sec = gamma32(colors[1]);
CRGB ter = gamma32(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];
CRGB prim = gamma32(colors[0]);
CRGB sec = gamma32(colors[1]);
if (colors[2]) {
CRGB ter = strip.gammaCorrectCol ? gamma32(colors[2]) : colors[2];
CRGB ter = gamma32(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);
@ -339,8 +341,11 @@ CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal
loadPalette(targetPalette, pal);
if (transitional && _t && progress() < 0xFFFFU) {
// blend palettes
uint8_t blends = map(_t->_dur, 0, 0xFFFF, 48, 6); // do not blend palettes too quickly (0-65.5s)
nblendPaletteTowardPalette(_t->_palT, targetPalette, blends);
// there are about 255 blend passes of 48 "blends" to completely blend two palettes (in _dur time)
// minimum blend time is 100ms maximum is 65535ms
uint32_t timeMS = millis() - _t->_start;
uint16_t noOfBlends = (255U * timeMS / _t->_dur) - _t->_prevPaletteBlends;
for (int i=0; i<noOfBlends; i++, _t->_prevPaletteBlends++) nblendPaletteTowardPalette(_t->_palT, targetPalette, 48);
targetPalette = _t->_palT; // copy transitioning/temporary palette
}
return targetPalette;
@ -823,7 +828,7 @@ uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_
// default palette or no RGB support on segment
if ((palette == 0 && mcol < NUM_COLORS) || !(_capabilities & 0x01)) {
uint32_t color = (transitional && _t) ? _t->_colorT[mcol] : colors[mcol];
color = strip.gammaCorrectCol ? gamma32(color) : color;
color = gamma32(color);
if (pbri == 255) return color;
return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri));
}

View File

@ -170,6 +170,7 @@ class Bus {
static bool isRgbw(uint8_t type) {
if (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true;
if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true;
if (type == TYPE_NET_DDP_RGBW) return true;
return false;
}
virtual bool hasRGB() {
@ -178,7 +179,7 @@ class Bus {
}
virtual bool hasWhite() {
if (_type == TYPE_SK6812_RGBW || _type == TYPE_TM1814 || _type == TYPE_WS2812_1CH || _type == TYPE_WS2812_WWA ||
_type == TYPE_ANALOG_1CH || _type == TYPE_ANALOG_2CH || _type == TYPE_ANALOG_4CH || _type == TYPE_ANALOG_5CH) return true;
_type == TYPE_ANALOG_1CH || _type == TYPE_ANALOG_2CH || _type == TYPE_ANALOG_4CH || _type == TYPE_ANALOG_5CH || _type == TYPE_NET_DDP_RGBW) return true;
return false;
}
static void setCCT(uint16_t cct) {
@ -573,9 +574,9 @@ class BusNetwork : public Bus {
// _rgbw = false;
// _UDPtype = 0;
// break;
// default:
_rgbw = false;
_UDPtype = bc.type - TYPE_NET_DDP_RGB;
// default: // TYPE_NET_DDP_RGB / TYPE_NET_DDP_RGBW
_rgbw = bc.type == TYPE_NET_DDP_RGBW;
_UDPtype = 0;
// break;
// }
_UDPchannels = _rgbw ? 4 : 3;

View File

@ -302,10 +302,10 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
float light_gc_bri = light["gc"]["bri"];
float light_gc_col = light["gc"]["col"]; // 2.8
if (light_gc_bri > 1.5) strip.gammaCorrectBri = true;
else if (light_gc_bri > 0.5) strip.gammaCorrectBri = false;
if (light_gc_col > 1.5) strip.gammaCorrectCol = true;
else if (light_gc_col > 0.5) strip.gammaCorrectCol = false;
if (light_gc_bri > 1.5) gammaCorrectBri = true;
else if (light_gc_bri > 0.5) gammaCorrectBri = false;
if (light_gc_col > 1.5) gammaCorrectCol = true;
else if (light_gc_col > 0.5) gammaCorrectCol = false;
JsonObject light_tr = light["tr"];
CJSON(fadeTransition, light_tr["mode"]);
@ -759,8 +759,8 @@ void serializeConfig() {
light[F("aseg")] = autoSegments;
JsonObject light_gc = light.createNestedObject("gc");
light_gc["bri"] = (strip.gammaCorrectBri) ? 2.8 : 1.0;
light_gc["col"] = (strip.gammaCorrectCol) ? 2.8 : 1.0;
light_gc["bri"] = (gammaCorrectBri) ? 2.8 : 1.0;
light_gc["col"] = (gammaCorrectCol) ? 2.8 : 1.0;
JsonObject light_tr = light.createNestedObject("tr");
light_tr["mode"] = fadeTransition;

View File

@ -358,7 +358,7 @@ uint8_t gamma8(uint8_t b)
uint32_t gamma32(uint32_t color)
{
//if (!strip.gammaCorrectCol) return color;
if (!gammaCorrectCol) return color;
uint8_t w = W(color);
uint8_t r = R(color);
uint8_t g = G(color);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -172,8 +172,9 @@
#define TYPE_LPD6803 54
//Network types (master broadcast) (80-95)
#define TYPE_NET_DDP_RGB 80 //network DDP RGB bus (master broadcast bus)
#define TYPE_NET_E131_RGB 81 //network E131 RGB bus (master broadcast bus)
#define TYPE_NET_ARTNET_RGB 82 //network ArtNet RGB bus (master broadcast bus)
#define TYPE_NET_E131_RGB 81 //network E131 RGB bus (master broadcast bus, unused)
#define TYPE_NET_ARTNET_RGB 82 //network ArtNet RGB bus (master broadcast bus, unused)
#define TYPE_NET_DDP_RGBW 88 //network DDP RGBW bus (master broadcast bus)
#define IS_DIGITAL(t) ((t) & 0x10) //digital are 16-31 and 48-63
#define IS_PWM(t) ((t) > 40 && (t) < 46)

View File

@ -101,7 +101,7 @@ button {
position: fixed;
bottom: calc(var(--bh) + 6px);
right: 6px;
color: var(--c-d);
color: var(--c-d); /* must remain bright with dark shadow (see below) to be legible on gray background */
cursor: pointer;
writing-mode: vertical-rl;
transform: rotate(180deg);
@ -1045,7 +1045,7 @@ textarea {
/*box-shadow: 0 0 0 5px var(--c-d);*/
}
.qcs, #namelabel {
.qcs, #namelabel { /* text shadow for name to be legible on grey backround */
text-shadow: -1px -1px 0 var(--c-4), 1px -1px 0 var(--c-4), -1px 1px 0 var(--c-4), 1px 1px 0 var(--c-4);
}

View File

@ -611,13 +611,13 @@ function parseInfo(i) {
//gId("filter2D").classList.add("hide");
hideModes("2D");
}
if (i.noaudio) {
gId("filterVol").classList.add("hide");
gId("filterFreq").classList.add("hide");
}
// if (i.noaudio) {
// gId("filterVol").classList.add("hide");
// gId("filterFreq").classList.add("hide");
// }
// if (!i.u || !i.u.AudioReactive) {
//gId("filterVol").classList.add("hide"); hideModes(" ♪"); // hide volume reactive effects
//gId("filterFreq").classList.add("hide"); hideModes(" ♫"); // hide frequency reactive effects
// gId("filterVol").classList.add("hide"); hideModes(" ♪"); // hide volume reactive effects
// gId("filterFreq").classList.add("hide"); hideModes(" ♫"); // hide frequency reactive effects
// }
}
@ -659,6 +659,7 @@ function populateInfo(i)
cn += `v${i.ver} "${vcn}"<br><br><table>
${urows}
${urows===""?'':'<tr><td colspan=2><hr style="height:1px;border-width:0;color:gray;background-color:gray"></td></tr>'}
${inforow("Build",i.vid)}
${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")}
${inforow("Uptime",getRuntimeStr(i.uptime))}
@ -1042,7 +1043,7 @@ function updateLen(s)
let tPL = gId(`seg${s}lbtm`);
if (stop-start>1 && stopY-startY>1) {
// 2D segment
tPL.classList.remove("hide"); // unhide transpose checkbox
if (tPL) tPL.classList.remove("hide"); // unhide transpose checkbox
let sE = gId('fxlist').querySelector(`.lstI[data-id="${selectedFx}"]`);
if (sE) {
let sN = sE.querySelector(".lstIname").innerText;
@ -1054,8 +1055,10 @@ function updateLen(s)
}
} else {
// 1D segment in 2D set-up
tPL.classList.add("hide"); // hide transpose checkbox
gId(`seg${s}tp`).checked = false; // and uncheck it
if (tPL) {
tPL.classList.add("hide"); // hide transpose checkbox
gId(`seg${s}tp`).checked = false; // and uncheck it
}
}
}
var out = "(delete)";
@ -1995,15 +1998,15 @@ function setSeg(s)
var stopY = parseInt(gId(`seg${s}eY`).value);
obj.seg.startY = startY;
obj.seg.stopY = (cfg.comp.seglen?startY:0)+stopY;
obj.seg.tp = gId(`seg${s}tp`).checked;
}
if (gId(`seg${s}grp`)) {
if (gId(`seg${s}grp`)) { // advanced options, not present in new segment dialog (makeSeg())
var grp = parseInt(gId(`seg${s}grp`).value);
var spc = parseInt(gId(`seg${s}spc`).value);
var ofs = parseInt(gId(`seg${s}of` ).value);
obj.seg.grp = grp;
obj.seg.spc = spc;
obj.seg.of = ofs;
if (isM) obj.seg.tp = gId(`seg${s}tp`).checked;
}
requestJson(obj);
}

View File

@ -177,7 +177,7 @@
if (t > 31 && t < 48) d.getElementsByName("LC"+n)[0].value = 1; // for sanity change analog count just to 1 LED
}
gId("rf"+n).onclick = (t == 31) ? (()=>{return false}) : (()=>{}); // prevent change for TM1814
isRGBW |= (t == 30 || t == 31 || (t > 40 && t < 46 && t != 43)); // RGBW checkbox, TYPE_xxxx values from const.h
isRGBW = (t == 30 || t == 31 || (t > 40 && t < 46 && t != 43) || t == 88); // RGBW checkbox, TYPE_xxxx values from const.h
gId("co"+n).style.display = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? "none":"inline"; // hide color order for PWM
gId("dig"+n+"w").style.display = (t == 30 || t == 31) ? "inline":"none"; // show swap channels dropdown
if (!(t == 30 || t == 31)) d.getElementsByName("WO"+n)[0].value = 0; // reset swapping
@ -332,6 +332,7 @@ ${i+1}:
<option value="80">DDP RGB (network)</option>
<!--option value="81">E1.31 RGB (network)</option-->
<!--option value="82">ArtNet RGB (network)</option-->
<option value="88">DDP RGBW (network)</option>
</select><br>
<div id="co${i}" style="display:inline">Color Order:
<select name="CO${i}">

View File

@ -25,9 +25,11 @@ void handleDDPPacket(e131_packet_t* p) {
}
}
uint32_t start = htonl(p->channelOffset) /3;
start += DMXAddress /3;
uint16_t stop = start + htons(p->dataLen) /3;
uint8_t ddpChannelsPerLed = (p->dataType == DDP_TYPE_RGBW32) ? 4 : 3; // data type 0x1A is RGBW (type 3, 8 bit/channel)
uint32_t start = htonl(p->channelOffset) / ddpChannelsPerLed;
start += DMXAddress / ddpChannelsPerLed;
uint16_t stop = start + htons(p->dataLen) / ddpChannelsPerLed;
uint8_t* data = p->data;
uint16_t c = 0;
if (p->flags & DDP_TIMECODE_FLAG) c = 4; //packet has timecode flag, we do not support it, but data starts 4 bytes later
@ -36,8 +38,8 @@ void handleDDPPacket(e131_packet_t* p) {
if (!realtimeOverride || (realtimeMode && useMainSegmentOnly)) {
for (uint16_t i = start; i < stop; i++) {
setRealtimePixel(i, data[c], data[c+1], data[c+2], 0);
c+=3;
setRealtimePixel(i, data[c], data[c+1], data[c+2], ddpChannelsPerLed >3 ? data[c+3] : 0);
c += ddpChannelsPerLed;
}
}

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -265,12 +265,9 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
}
if (set < 2) stop = start + 1;
uint32_t c = gamma32(RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3]));
for (int i = start; i < stop; i++) {
if (strip.gammaCorrectCol) {
seg.setPixelColor(i, gamma8(rgbw[0]), gamma8(rgbw[1]), gamma8(rgbw[2]), gamma8(rgbw[3]));
} else {
seg.setPixelColor(i, rgbw[0], rgbw[1], rgbw[2], rgbw[3]);
}
seg.setPixelColor(i, c);
}
if (!set) start++;
set = 0;
@ -589,8 +586,6 @@ void serializeInfo(JsonObject root)
leds["fps"] = strip.getFps();
leds[F("maxpwr")] = (strip.currentMilliamps)? strip.ablMilliampsMax : 0;
leds[F("maxseg")] = strip.getMaxSegments();
//leds[F("actseg")] = strip.getActiveSegmentsNum();
//leds[F("seglock")] = false; //might be used in the future to prevent modifications to segment config
leds[F("cpal")] = strip.customPalettes.size(); //number of custom palettes
#ifndef WLED_DISABLE_2D
@ -617,10 +612,6 @@ void serializeInfo(JsonObject root)
leds[F("wv")] = totalLC & 0x02; // deprecated, true if white slider should be displayed for any segment
leds["cct"] = totalLC & 0x04; // deprecated, use info.leds.lc
#ifdef WLED_DISABLE_AUDIO
root[F("noaudio")] = true;
#endif
#ifdef WLED_DEBUG
JsonArray i2c = root.createNestedArray(F("i2c"));
i2c.add(i2c_sda);

View File

@ -184,8 +184,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
turnOnAtBoot = request->hasArg(F("BO"));
t = request->arg(F("BP")).toInt();
if (t <= 250) bootPreset = t;
strip.gammaCorrectBri = request->hasArg(F("GB"));
strip.gammaCorrectCol = request->hasArg(F("GC"));
gammaCorrectBri = request->hasArg(F("GB"));
gammaCorrectCol = request->hasArg(F("GC"));
fadeTransition = request->hasArg(F("TF"));
t = request->arg(F("TD")).toInt();

View File

@ -53,6 +53,9 @@ typedef struct ip_addr ip4_addr_t;
#define DDP_PUSH_FLAG 0x01
#define DDP_TIMECODE_FLAG 0x10
#define DDP_TYPE_RGB24 0x0A
#define DDP_TYPE_RGBW32 0x1A
#define ARTNET_OPCODE_OPDMX 0x5000
#define P_E131 0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -564,7 +564,7 @@ void setRealtimePixel(uint16_t i, byte r, byte g, byte b, byte w)
{
uint16_t pix = i + arlsOffset;
if (pix < strip.getLengthTotal()) {
if (!arlsDisableGammaCorrection && strip.gammaCorrectCol) {
if (!arlsDisableGammaCorrection && gammaCorrectCol) {
r = gamma8(r);
g = gamma8(g);
b = gamma8(b);
@ -665,9 +665,6 @@ void sendSysInfoUDP()
#define DDP_FLAGS1_STORAGE 0x08
#define DDP_FLAGS1_TIME 0x10
#define DDP_TYPE_RGB24 0x0A
#define DDP_TYPE_RGBW32 0x1A // proposal, this is still not an official part of the DDP spec
#define DDP_ID_DISPLAY 1
#define DDP_ID_CONFIG 250
#define DDP_ID_STATUS 251
@ -695,7 +692,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
case 0: // DDP
{
// calculate the number of UDP packets we need to send
size_t channelCount = length * 3; // 1 channel for every R,G,B value
size_t channelCount = length * (isRGBW? 4:3); // 1 channel for every R,G,B value
size_t packetCount = ((channelCount-1) / DDP_CHANNELS_PER_PACKET) +1;
// there are 3 channels per RGB pixel
@ -727,7 +724,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
// write the header
/*0*/ddpUdp.write(flags);
/*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings)
/*2*/ddpUdp.write(0); // data type, this is not fully defined by the DDP spec and thus left at "undefined" which is assumed to be 24-bit RGB
/*2*/ddpUdp.write(isRGBW ? DDP_TYPE_RGBW32 : DDP_TYPE_RGB24);
/*3*/ddpUdp.write(DDP_ID_DISPLAY);
// data offset in bytes, 32-bit number, MSB first
/*4*/ddpUdp.write(0xFF & (channel >> 24));
@ -744,7 +741,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // R
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // G
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // B
if (isRGBW) bufferOffset++;
if (isRGBW) ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // W
}
if (!ddpUdp.endPacket()) {

View File

@ -133,9 +133,6 @@
#endif
#ifdef USERMOD_AUDIOREACTIVE
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
#include "../usermods/audioreactive/audio_reactive.h"
#endif
@ -260,9 +257,6 @@ void registerUsermods()
#endif
#ifdef USERMOD_AUDIOREACTIVE
#ifdef WLED_DISABLE_AUDIO
#error Incompatible options: WLED_DISABLE_AUDIO and USERMOD_AUDIOREACTIVE
#endif
usermods.add(new AudioReactive());
#endif
}

View File

@ -390,7 +390,6 @@ uint16_t crc16(const unsigned char* data_p, size_t length) {
}
#ifndef WLED_DISABLE_AUDIO
///////////////////////////////////////////////////////////////////////////////
// Begin simulateSound (to enable audio enhanced effects to display something)
///////////////////////////////////////////////////////////////////////////////
@ -402,7 +401,6 @@ typedef enum UM_SoundSimulations {
UMS_14_3
} um_soundSimulations_t;
// this is still work in progress
um_data_t* simulateSound(uint8_t simulationId)
{
static uint8_t samplePeak;
@ -507,7 +505,6 @@ um_data_t* simulateSound(uint8_t simulationId)
return um_data;
}
#endif
void enumerateLedmaps() {

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2208311
#define VERSION 2209061
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG
@ -287,9 +287,11 @@ WLED_GLOBAL byte bootPreset _INIT(0); // save preset to load
//if true, a segment per bus will be created on boot and LED settings save
//if false, only one segment spanning the total LEDs is created,
//but not on LED settings save if there is more than one segment currently
WLED_GLOBAL bool autoSegments _INIT(false);
WLED_GLOBAL bool correctWB _INIT(false); //CCT color correction of RGB color
WLED_GLOBAL bool cctFromRgb _INIT(false); //CCT is calculated from RGB instead of using seg.cct
WLED_GLOBAL bool autoSegments _INIT(false);
WLED_GLOBAL bool correctWB _INIT(false); // CCT color correction of RGB color
WLED_GLOBAL bool cctFromRgb _INIT(false); // CCT is calculated from RGB instead of using seg.cct
WLED_GLOBAL bool gammaCorrectCol _INIT(false); // use gamma correction on colors
WLED_GLOBAL bool gammaCorrectBri _INIT(false); // use gamma correction on brightness
WLED_GLOBAL byte col[] _INIT_N(({ 255, 160, 0, 0 })); // current RGB(W) primary color. col[] should be updated if you want to change the color.
WLED_GLOBAL byte colSec[] _INIT_N(({ 0, 0, 0, 0 })); // current RGB(W) secondary color

View File

@ -140,8 +140,8 @@ void loadSettingsFromEEPROM()
ntpEnabled = EEPROM.read(327);
currentTimezone = EEPROM.read(328);
useAMPM = EEPROM.read(329);
strip.gammaCorrectBri = EEPROM.read(330);
strip.gammaCorrectCol = EEPROM.read(331);
gammaCorrectBri = EEPROM.read(330);
gammaCorrectCol = EEPROM.read(331);
overlayCurrent = EEPROM.read(332);
alexaEnabled = EEPROM.read(333);

View File

@ -394,8 +394,8 @@ void getSettingsJS(byte subPage, char* dest)
sappend('c',SET_F("BO"),turnOnAtBoot);
sappend('v',SET_F("BP"),bootPreset);
sappend('c',SET_F("GB"),strip.gammaCorrectBri);
sappend('c',SET_F("GC"),strip.gammaCorrectCol);
sappend('c',SET_F("GB"),gammaCorrectBri);
sappend('c',SET_F("GC"),gammaCorrectCol);
sappend('c',SET_F("TF"),fadeTransition);
sappend('v',SET_F("TD"),transitionDelayDefault);
sappend('c',SET_F("PF"),strip.paletteFade);