#if 1 // change to 0 to generate arrays (see below, near line 180)



#include <FastLED.h>

const size_t ledsCount = 32 * 8;
CRGB leds[ledsCount];

//---------------------------------------------------------------------------

const uint32_t frame00[] PROGMEM =
{
	0x02FFFFFF, 0x0BFFFFFF, 0x14FFFFFF, 0x1BFF0000, 0x1CFF0000,
	0x1DFF0000, 0x21FF0000, 0x24FF0000, 0x25FF0000, 0x28FFFFFF,
	0x31FFFFFF, 0x3AFFFFFF, 0x40FFFFFF, 0x48FFFFFF, 0x51FFFFFF,
	0x59FF0000, 0x5AFF0000, 0x5BFF0000, 0x5CFF0000, 0x5FFF0000,
	0x60FFFFFF, 0x62FF0000, 0x63FF0000, 0x64FF0000, 0x65FF0000,
	0x66FF0000, 0x67FF0000, 0x82FFFFFF, 0x8BFFFFFF, 0x94FFFFFF,
	0x98FFFFFF, 0x99FFFFFF, 0x9AFFFFFF, 0x9BFFFFFF, 0x9CFFFFFF,
	0x9DFFFFFF, 0xA2FF99CC, 0xA4FF99CC, 0xA5FF99CC, 0xA7FF99CC,
	0xB1FFFFFF, 0xBAFFFFFF, 0xC0FFFFFF, 0xC8FFFFFF, 0xD1FFFFFF,
	0xD8FF99CC, 0xD9FF99CC, 0xDAFF99CC, 0xDBFF99CC, 0xDCFF99CC,
	0xDDFF99CC, 0xE0FFFFFF, 0xE1FFFFFF, 0xE2FFFFFF, 0xE3FF99CC,
	0xE4FF0000, 0xE5FF0000, 0xE6FF99CC, 0xE7FFFFFF, 0xE8FFFFFF,
	0xE9FFFFFF, 0xEAFFFFFF, 0xEBFFFFFF, 0xECFFFFFF, 0xEDFFFFFF,
	0xEEFFFFFF, 0xEFFFFFFF, 0xF0FFFFFF, 0xF1FFFFFF, 0xF2FFFFFF,
	0xF3FFFFFF, 0xF4FFFFFF, 0xF5FFFFFF, 0xF6FFFFFF, 0xF7FFFFFF,
	0xF8FFFFFF, 0xF9FFFFFF, 0xFAFFFFFF, 0xFBFFFFFF, 0xFCFFFFFF,
	0xFDFFFFFF, 0xFEFFFFFF, 0xFFFFFFFF
};

const uint32_t frame01[] PROGMEM =
{
	0x1AFF0000, 0x1BFF0000, 0x1CFF0000, 0x22FF0000, 0x25FF0000,
	0x26FF0000, 0x2BFFFFFF, 0x34FFFFFF, 0x3DFFFFFF, 0x45FFFFFF,
	0x4EFFFFFF, 0x58FF0000, 0x59FF0000, 0x5AFF0000, 0x5BFF0000,
	0x5CFF0000, 0x5EFF0000, 0x61FFFFFF, 0x63FF0000, 0x64FF0000,
	0x65FF0000, 0x66FF0000, 0x67FF0000, 0x68FF0000, 0x6EFFFFFF,
	0x77FFFFFF, 0x7FFFFFFF, 0x97FFFFFF, 0x98FFFFFF, 0x99FFFFFF,
	0x9AFFFFFF, 0x9BFFFFFF, 0x9CFFFFFF, 0xA3FF99CC, 0xA5FF99CC,
	0xA6FF99CC, 0xA8FF99CC, 0xABFFFFFF, 0xB4FFFFFF, 0xBDFFFFFF,
	0xC5FFFFFF, 0xCEFFFFFF, 0xD7FF99CC, 0xD8FF99CC, 0xD9FF99CC,
	0xDAFF99CC, 0xDBFF99CC, 0xDCFF99CC, 0xE0FFFFFF, 0xE1FFFFFF,
	0xE2FFFFFF, 0xE3FFFFFF, 0xE4FF99CC, 0xE5FF0000, 0xE6FF0000,
	0xE7FF99CC, 0xE8FFFFFF, 0xE9FFFFFF, 0xEAFFFFFF, 0xEBFFFFFF,
	0xECFFFFFF, 0xEDFFFFFF, 0xEEFFFFFF, 0xEFFFFFFF, 0xF0FFFFFF,
	0xF1FFFFFF, 0xF2FFFFFF, 0xF3FFFFFF, 0xF4FFFFFF, 0xF5FFFFFF,
	0xF6FFFFFF, 0xF7FFFFFF, 0xF8FFFFFF, 0xF9FFFFFF, 0xFAFFFFFF,
	0xFBFFFFFF, 0xFCFFFFFF, 0xFDFFFFFF, 0xFEFFFFFF, 0xFFFFFFFF
};

const uint32_t frame02[] PROGMEM =
{
	0x00FFFFFF, 0x08FFFFFF, 0x11FFFFFF, 0x19FF0000, 0x1AFF0000,
	0x1BFF0000, 0x20099C1C, 0x23FF0000, 0x26FF0000, 0x27FF0000,
	0x42FFFFFF, 0x4BFFFFFF, 0x54FFFFFF, 0x57FF0000, 0x58FF0000,
	0x59FF0000, 0x5AFF0000, 0x5BFF0000, 0x5DFF0000, 0x5F099C1C,
	0x60099C1C, 0x62FFFFFF, 0x64FF0000, 0x65FF0000, 0x66FF0000,
	0x67FF0000, 0x68FF0000, 0x69FF0000, 0x71FFFFFF, 0x7AFFFFFF,
	0x80FFFFFF, 0x88FFFFFF, 0x91FFFFFF, 0x96FFFFFF, 0x97FFFFFF,
	0x98FFFFFF, 0x99FFFFFF, 0x9AFFFFFF, 0x9BFFFFFF, 0x9F099C1C,
	0xA0099C1C, 0xA4FF99CC, 0xA6FF99CC, 0xA7FF99CC, 0xA9FF99CC,
	0xC2FFFFFF, 0xCBFFFFFF, 0xD4FFFFFF, 0xD6FF99CC, 0xD7FF99CC,
	0xD8FF99CC, 0xD9FF99CC, 0xDAFF99CC, 0xDBFF99CC, 0xE0FFFFFF,
	0xE1FFFFFF, 0xE2FFFFFF, 0xE3FFFFFF, 0xE4FFFFFF, 0xE5FF99CC,
	0xE6FF0000, 0xE7FF0000, 0xE8FF99CC, 0xE9FFFFFF, 0xEAFFFFFF,
	0xEBFFFFFF, 0xECFFFFFF, 0xEDFFFFFF, 0xEEFFFFFF, 0xEFFFFFFF,
	0xF0FFFFFF, 0xF1FFFFFF, 0xF2FFFFFF, 0xF3FFFFFF, 0xF4FFFFFF,
	0xF5FFFFFF, 0xF6FFFFFF, 0xF7FFFFFF, 0xF8FFFFFF, 0xF9FFFFFF,
	0xFAFFFFFF, 0xFBFFFFFF, 0xFCFFFFFF, 0xFDFFFFFF, 0xFEFFFFFF,
	0xFFFFFFFF
};

const uint32_t frame03[] PROGMEM =
{
	0x05FFFFFF, 0x0EFFFFFF, 0x18FF0000, 0x19FF0000, 0x1AFF0000,
	0x21099C1C, 0x24FF0000, 0x27FF0000, 0x28FF0000, 0x2EFFFFFF,
	0x37FFFFFF, 0x3FFFFFFF, 0x56FF0000, 0x57FF0000, 0x58FF0000,
	0x59FF0000, 0x5AFF0000, 0x5CFF0000, 0x5E099C1C, 0x61099C1C,
	0x63FFFFFF, 0x65FF0000, 0x66FF0000, 0x67FF0000, 0x68FF0000,
	0x69FF0000, 0x6AFF0000, 0x74FFFFFF, 0x7DFFFFFF, 0x85FFFFFF,
	0x8EFFFFFF, 0x95FFFFFF, 0x96FFFFFF, 0x97FFFFFF, 0x98FFFFFF,
	0x99FFFFFF, 0x9AFFFFFF, 0x9E099C1C, 0xA1099C1C, 0xA5FF99CC,
	0xA7FF99CC, 0xA8FF99CC, 0xAAFF99CC, 0xAEFFFFFF, 0xB7FFFFFF,
	0xBFFFFFFF, 0xD5FF99CC, 0xD6FF99CC, 0xD7FF99CC, 0xD8FF99CC,
	0xD9FF99CC, 0xDAFF99CC, 0xE0FFFFFF, 0xE1FFFFFF, 0xE2FFFFFF,
	0xE3FFFFFF, 0xE4FFFFFF, 0xE5FFFFFF, 0xE6FF99CC, 0xE7FF0000,
	0xE8FF0000, 0xE9FF99CC, 0xEAFFFFFF, 0xEBFFFFFF, 0xECFFFFFF,
	0xEDFFFFFF, 0xEEFFFFFF, 0xEFFFFFFF, 0xF0FFFFFF, 0xF1FFFFFF,
	0xF2FFFFFF, 0xF3FFFFFF, 0xF4FFFFFF, 0xF5FFFFFF, 0xF6FFFFFF,
	0xF7FFFFFF, 0xF8FFFFFF, 0xF9FFFFFF, 0xFAFFFFFF, 0xFBFFFFFF,
	0xFCFFFFFF, 0xFDFFFFFF, 0xFEFFFFFF, 0xFFFFFFFF
};

const uint32_t frame04[] PROGMEM =
{
	0x02FFFFFF, 0x0BFFFFFF, 0x14FFFFFF, 0x17FF0000, 0x18FF0000,
	0x19FF0000, 0x20099C1C, 0x22099C1C, 0x25FF0000, 0x28FF0000,
	0x29FF0000, 0x31FFFFFF, 0x3AFFFFFF, 0x40FFFFFF, 0x48FFFFFF,
	0x51FFFFFF, 0x55FF0000, 0x56FF0000, 0x57FF0000, 0x58FF0000,
	0x59FF0000, 0x5BFF0000, 0x5D099C1C, 0x62099C1C, 0x64FFFFFF,
	0x66FF0000, 0x67FF0000, 0x68FF0000, 0x69FF0000, 0x6AFF0000,
	0x6BFF0000, 0x82FFFFFF, 0x8BFFFFFF, 0x94FFFFFF, 0x95FFFFFF,
	0x96FFFFFF, 0x97FFFFFF, 0x98FFFFFF, 0x99FFFFFF, 0x9D099C1C,
	0xA2099C1C, 0xA6FF99CC, 0xA8FF99CC, 0xA9FF99CC, 0xABFF99CC,
	0xB1FFFFFF, 0xBAFFFFFF, 0xC0FFFFFF, 0xC8FFFFFF, 0xD1FFFFFF,
	0xD4FF99CC, 0xD5FF99CC, 0xD6FF99CC, 0xD7FF99CC, 0xD8FF99CC,
	0xD9FF99CC, 0xE0FFFFFF, 0xE1FFFFFF, 0xE2FFFFFF, 0xE3FFFFFF,
	0xE4FFFFFF, 0xE5FFFFFF, 0xE6FFFFFF, 0xE7FF99CC, 0xE8FF0000,
	0xE9FF0000, 0xEAFF99CC, 0xEBFFFFFF, 0xECFFFFFF, 0xEDFFFFFF,
	0xEEFFFFFF, 0xEFFFFFFF, 0xF0FFFFFF, 0xF1FFFFFF, 0xF2FFFFFF,
	0xF3FFFFFF, 0xF4FFFFFF, 0xF5FFFFFF, 0xF6FFFFFF, 0xF7FFFFFF,
	0xF8FFFFFF, 0xF9FFFFFF, 0xFAFFFFFF, 0xFBFFFFFF, 0xFCFFFFFF,
	0xFDFFFFFF, 0xFEFFFFFF, 0xFFFFFFFF
};

struct frame_t
{
	const uint32_t * pointer;
	uint8_t size;
};

const frame_t frames[] PROGMEM =
{
	{ frame00,  83 },
	{ frame01,  80 },
	{ frame02,  86 },
	{ frame03,  84 },
	{ frame04,  88 }
};

const size_t framesCount = sizeof(frames) / sizeof(frames[0]);

//---------------------------------------------------------------------------

void showFrame( uint8_t id )
{
  FastLED.clear();
  frame_t frame;
  memcpy_P( &frame, &frames[id], sizeof(frame_t) );
  
  for ( size_t i = 0; i < frame.size; i++ )
  {
    uint32_t val = pgm_read_dword( &(frame.pointer[i]) );
    uint8_t pixelId = val >> 24;
    CRGB pixelColor = val & 0x00FFFFFF;
    leds[pixelId] = pixelColor;
  }

  FastLED.show();
}

void setup()
{
  Serial.begin( 115200 );
  FastLED.addLeds<NEOPIXEL, 10>(leds, ledsCount);
}

void loop()
{
  uint32_t now = millis();
  static uint32_t past = now;
  
  if ( now - past >= 100 )
  {
    past = now;
    static uint8_t id = 0;    
    showFrame( id );
    
    if ( ++id == framesCount )
    {
      id = 0;
    }
  }
}



#else



const long Xmas001[] PROGMEM = {
  0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FFFFFF, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FF99CC, 0x00FF0000, 0x00FF0000, 0x00FF99CC, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF,   //  1
};
const long Xmas002[] PROGMEM = {
  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FF99CC, 0x00FF0000, 0x00FF0000, 0x00FF99CC, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF,   //  2
};
const long Xmas003[] PROGMEM = {
  0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00FF0000, 0x00000000, 0x00099C1C, 0x00099C1C, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00099C1C, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FF99CC, 0x00FF0000, 0x00FF0000, 0x00FF99CC, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF,   //  3
};
const long Xmas004[] PROGMEM = {
  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00FF0000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FF99CC, 0x00FF0000, 0x00FF0000, 0x00FF99CC, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF,   //  4
};
const long Xmas005[] PROGMEM = {
  0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00FF0000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00FF0000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00FF0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00099C1C, 0x00000000, 0x00000000, 0x00000000, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00FF99CC, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FF99CC, 0x00FF0000, 0x00FF0000, 0x00FF99CC, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF,   //  5
};

const long * frames[] =
{
  Xmas001, Xmas002, Xmas003, Xmas004, Xmas005
};



class ArrayFormatter
{
  public :
  
  void start( const char * text, const size_t maxValuesPerLine = 10, const bool jumpLine = false )
  {
    if ( m_started )
    {
      return;
    }
    
    m_started = true;
    m_maxValuesPerLine = maxValuesPerLine;
    m_counter = 0;
    m_jumpLine = jumpLine;
    
    if ( sm_level == 0 )
    {
      Serial.print( text );
      Serial.print( " =\n" );
    }
    else
    {
      Serial.print( "// " );
      Serial.print( text );
      Serial.print( '\n' );
      
      for ( uint8_t i = 0; i < sm_level; i++ )
      {
        Serial.print( '\t' );
      }
    }
    
    Serial.print( "{\n" );
    
    sm_level++;
  }
  
  void add( const char * value )
  {
    if ( add() )
    {
      Serial.print( value );
    }
  }
  
  bool add()
  {
    if ( !m_started )
    {
      return false;
    }
    
    if ( m_counter == 0 )
    {
      for ( uint8_t i = 0; i < sm_level; i++ )
      {
        Serial.print( '\t' );
      }
    }
    else
    {
      if ( m_counter < m_maxValuesPerLine )
      {
        Serial.print( ", " );
      }
      else
      {
        m_counter = 0;
        Serial.print( ",\n" );
        
        if ( m_jumpLine )
        {
          Serial.print( '\n' );
        }
        
        for ( uint8_t i = 0; i < sm_level; i++ )
        {
          Serial.print( '\t' );
        }
      }
    }
    m_counter++;
    return true;
  }
  
  void end()
  {
    if ( !m_started )
    {
      return;
    }
    
    m_started = false;
    m_counter = 0;
    sm_level--;
    
    Serial.print( '\n' );
    
    if ( sm_level == 0 )
    {
      Serial.print( "};\n" );
    }
    else
    {
      for ( uint8_t i = 0; i < sm_level; i++ )
      {
        Serial.print( '\t' );
      }
      Serial.print( '}' );
    }
  }
  
  private :
  static uint8_t sm_level;
  bool   m_started = false;
  size_t m_maxValuesPerLine = 10;
  size_t m_counter = 0;
  bool   m_jumpLine = false;
};
uint8_t ArrayFormatter::sm_level = 0;




void printArrays()
{
  ArrayFormatter af;
  char str[40];
  uint8_t framesCount = sizeof(frames) / sizeof(frames[0]);

  Serial.print( "//---------------------------------------------------------------------------\n\n" );
  
  // frames
  for ( size_t i = 0; i < framesCount; i++ )
  {
    snprintf( str, sizeof( str ), "const uint32_t frame%02d[] PROGMEM", i );
    af.start( str, 5 );
    for ( size_t j = 0; j < 256; j++ )
    {
      uint32_t val = pgm_read_dword( &(frames[i][j]) );
      if ( val != 0 )
      {
        snprintf( str, sizeof( str ), "0x%08lX", val | ((uint32_t)j << 24) );
        af.add( str );
      }
    }
    af.end();
    Serial.println();
  }

  // structs
  Serial.print( "struct frame_t\n{\n\tconst uint32_t * pointer;\n\tuint8_t size;\n};\n\n" );

  af.start( "const frame_t frames[] PROGMEM", 1 );
  for ( size_t i = 0; i < framesCount; i++ )
  {
    uint8_t counter = 0;
    for ( size_t j = 0; j < 256; j++ )
    {
      if ( pgm_read_dword( &(frames[i][j]) ) != 0 )
      {
        counter++;
      }
    }
    snprintf( str, sizeof( str ), "{ frame%02d, %3hhu }", i, counter );
    af.add( str );
  }
  af.end();

  Serial.print( "\nconst size_t framesCount = sizeof(frames) / sizeof(frames[0]);\n\n" );

  Serial.print( "//---------------------------------------------------------------------------\n\n" );
}

void setup()
{
  Serial.begin( 115200 );
  printArrays();
}

void loop()
{
}

#endif