From 49f20b3248a7305c1a1770e61065ecc2129473ab Mon Sep 17 00:00:00 2001 From: wgroeneveld Date: Sun, 5 Aug 2018 16:51:59 +0200 Subject: [PATCH] animation embedded in sprite class itself --- lama.png | Bin 0 -> 1269 bytes src/CMakeLists.txt | 2 +- src/engine/sprites/affine_sprite.h | 2 +- src/engine/sprites/animated_sprite.cpp | 43 -- src/engine/sprites/animated_sprite.h | 34 -- src/engine/sprites/sprite.cpp | 59 ++- src/engine/sprites/sprite.h | 26 +- src/engine/sprites/sprite_builder.h | 23 +- src/engine/sprites/sprite_manager.cpp | 2 +- src/lama.h | 549 +++++++++++++++++++++++++ src/sample_start_scene.cpp | 29 +- src/sample_start_scene.h | 2 +- 12 files changed, 669 insertions(+), 102 deletions(-) create mode 100644 lama.png delete mode 100644 src/engine/sprites/animated_sprite.cpp delete mode 100644 src/engine/sprites/animated_sprite.h create mode 100644 src/lama.h diff --git a/lama.png b/lama.png new file mode 100644 index 0000000000000000000000000000000000000000..8737e6bed5123848f16f1680991eba4e42a10dfd GIT binary patch literal 1269 zcmVdW-V%E0f)s>7Q9+Q@ zL(ro_ffxpcfglld(ZKF4+C?|!Kb~P{cE`D$bG{?YzWmvpar~X{oU=3EcaG{B_@#q? zzZL_;3V15eShGB14AinjA&uADL*M9U+&&LFsMQ5vExdESo*Fei`Ge}2E2C81K7TU$ z)3Z_8D!HBv2Vj&8|d5oHsJu118td^SxqY}$lq%%Ef45GdqV})sugo5CjQa;@}${|t>?x=%?2F~@UE*m zGn3J@@6(H@1*J>OK5xJIDSykEP;&|-E0d9CgKhvASNJjo0_bnvKmf0bi+oMp?Hi|T z=P?ED-ZSqB9gotUQ#<ggYZR0NfeD0hDn@aBs-&OR+VJtr<53Vrv##v)G!&)(mdVoL%5$Qk(Wn z(+#mGQ%NZPjV2H%3aRo~->!_1Rd0>d5b6 zs>5UNJ$+_AkE<&KP`|T^00;ZtQgyy(Eo8uM$Adcgd1aHabf-1|lT)NY^)+&p0TAI2 z11SIp5aAC4DF6o$VNe4ppbP*{gBnT!H~`P3yHE;90g$zJsC$`HqrXM29TGry_kInv zc8CWs-0@UjzlK^nq?JXY4b{DeQ&b<{ zAGU=MtjpYv2eIfj1z-U45sS_Ud_5ByfTA4o!UN##kOM0K2jK0H11kUr;O&qDE1(Pj zFNYjj0XP6Jha6e~DF8Aox-WY!(xO`cD2t8{2|DqlRbw5u+ffk$kyFZ835T1IY$9FfNY1HqW}!RIUC&W1UiB9a1d03IPlBn6}Zh)zjJ0Y94Kc6;$B?*jFiPJ5SCmkR4Q6 f0H~Y@4)7n@hmARVSPMk}0000affIndex = index; } void identity(); void rotate(u16 alpha); - AffineSprite(const u32 *imgData, int imgSize, int xC, int yC, SpriteSize spriteSize) : Sprite(imgData, imgSize, xC, yC, spriteSize), affIndex(0) { + AffineSprite(const void* imgData, int imgSize, int xC, int yC, SpriteSize spriteSize) : Sprite(imgData, imgSize, xC, yC, spriteSize), affIndex(0) { } friend class SpriteManager; diff --git a/src/engine/sprites/animated_sprite.cpp b/src/engine/sprites/animated_sprite.cpp deleted file mode 100644 index 5bd7b09..0000000 --- a/src/engine/sprites/animated_sprite.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// Created by Wouter Groeneveld on 03/08/18. -// - -#include -#include "animated_sprite.h" - -AnimatedSprite::AnimatedSprite(const void *imageData, int imageSize, int x, int y, SpriteSize size, int frameTileSize, int delay) - : Sprite(imageData, imageSize, x, y, size), frameTileSize(frameTileSize), frame(0), counter(0), delay(delay) {} - -void AnimatedSprite::flipHorizontally(bool flip) { - if(flip) { - oam.get()->attr1 |= ATTR1_HFLIP; - } else { - oam.get()->attr1 &= FLIP_HORIZONTAL_CLEAR; - } -} - -void AnimatedSprite::flipVertically(bool flip) { - if(flip) { - oam.get()->attr1 |= ATTR1_VFLIP; - } else { - oam.get()->attr1 &= FLIP_VERTICAL_CLEAR; - } -} - -void AnimatedSprite::update() { - counter++; - if(counter > delay) { - frame += frameTileSize; - if(frame > frameTileSize) { - frame = 0; - } - - updateTileOffsetInOam(); - counter = 0; - } -} - -void AnimatedSprite::updateTileOffsetInOam() { - oam.get()->attr2 &= OAM_TILE_OFFSET_CLEAR; - oam.get()->attr2 |= (frame & OAM_TILE_OFFSET_NEW); -} \ No newline at end of file diff --git a/src/engine/sprites/animated_sprite.h b/src/engine/sprites/animated_sprite.h deleted file mode 100644 index 09ba1b4..0000000 --- a/src/engine/sprites/animated_sprite.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// Created by Wouter Groeneveld on 03/08/18. -// - -#ifndef GBA_SPRITE_ENGINE_ANIMATED_SPRITE_H -#define GBA_SPRITE_ENGINE_ANIMATED_SPRITE_H - - -#include "sprite.h" - -#define FLIP_VERTICAL_CLEAR 0xdfff -#define FLIP_HORIZONTAL_CLEAR 0xefff -#define OAM_TILE_OFFSET_CLEAR 0xfc00 -#define OAM_TILE_OFFSET_NEW 0x03ff - -class AnimatedSprite : public Sprite { -private: - int delay; - int frame, frameTileSize; - int counter; - - void updateTileOffsetInOam(); - -public: - AnimatedSprite(const void *imageData, int imageSize, int x, int y, SpriteSize size, int frameTileSize, int delay); - - void flipVertically(bool flip); - void flipHorizontally(bool flip); - - void update(); -}; - - -#endif //GBA_SPRITE_ENGINE_ANIMATED_SPRITE_H diff --git a/src/engine/sprites/sprite.cpp b/src/engine/sprites/sprite.cpp index e15e593..5d66237 100644 --- a/src/engine/sprites/sprite.cpp +++ b/src/engine/sprites/sprite.cpp @@ -4,10 +4,12 @@ #include #include +#include #include "sprite.h" Sprite::Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size) - : x(x), y(y), data(imageData), imageSize(imageSize) { + : x(x), y(y), data(imageData), imageSize(imageSize), + animationDelay(0), amountOfFrames(0), currentFrame(0), animationCounter(0) { setAttributesBasedOnSize(size); } @@ -17,14 +19,62 @@ void Sprite::moveTo(int x, int y) { syncOam(); } -void Sprite::syncOam() { +void Sprite::flipHorizontally(bool flip) { + if(flip) { + oam->attr1 |= ATTR1_HFLIP; + } else { + oam->attr1 &= FLIP_HORIZONTAL_CLEAR; + } +} + +void Sprite::flipVertically(bool flip) { + if(flip) { + oam->attr1 |= ATTR1_VFLIP; + } else { + oam->attr1 &= FLIP_VERTICAL_CLEAR; + } +} + +void Sprite::syncVelocity() { oam->attr0 = (oam->attr0 & ~ATTR0_Y_MASK) | (y & ATTR0_Y_MASK); oam->attr1 = (oam->attr1 & ~ATTR1_X_MASK) | (x & ATTR1_X_MASK); } -void Sprite::move() { +void Sprite::syncAnimation() { + if(amountOfFrames == 0) return; + int newTileIndex = this->tileIndex + (currentFrame * w); + + oam->attr2 &= OAM_TILE_OFFSET_CLEAR; + oam->attr2 |= (newTileIndex & OAM_TILE_OFFSET_NEW); +} + +void Sprite::syncOam() { + syncVelocity(); + syncAnimation(); +} + +void Sprite::updateVelocity() { this->x += this->dx; this-> y += this->dy; +} + +void Sprite::updateAnimation() { + if(amountOfFrames == 0) return; + + animationCounter++; + if(animationCounter > animationDelay) { + currentFrame++; + if(currentFrame > (amountOfFrames - 1)) { + currentFrame = 0; + } + + animationCounter = 0; + } +} + +void Sprite::update() { + updateVelocity(); + updateAnimation(); syncOam(); } @@ -56,6 +106,7 @@ bool Sprite::collidesWith(const Sprite &o) { void Sprite::buildOam(int tileIndex) { + this->tileIndex = tileIndex; this->oam = std::unique_ptr(new OBJ_ATTR()); this->oam->attr0 = ATTR0_Y(this->y) | @@ -73,4 +124,4 @@ void Sprite::buildOam(int tileIndex) { this->oam->attr2 = ATTR2_ID(tileIndex) | ATTR2_PRIO(priority) | ATTR2_PALBANK(0); -} \ No newline at end of file +} diff --git a/src/engine/sprites/sprite.h b/src/engine/sprites/sprite.h index e4c7570..54155e7 100644 --- a/src/engine/sprites/sprite.h +++ b/src/engine/sprites/sprite.h @@ -6,6 +6,7 @@ #define GBA_SPRITE_ENGINE_SPRITE_H #include +#include #include #define COLOR_MODE_16 0 @@ -16,6 +17,11 @@ #define HORIZONTAL_FLIP_FLAG 0 #define VERTICAL_FLIP_FLAG 0 +#define FLIP_VERTICAL_CLEAR 0xdfff +#define FLIP_HORIZONTAL_CLEAR 0xefff +#define OAM_TILE_OFFSET_CLEAR 0xfc00 +#define OAM_TILE_OFFSET_NEW 0x03ff + enum SpriteSize { SIZE_8_8, SIZE_16_16, @@ -34,11 +40,18 @@ enum SpriteSize { class SpriteManager; class Sprite { +private: + void updateVelocity(); + void updateAnimation(); + void syncVelocity(); + void syncAnimation(); + protected: const void *data; int x, y, priority, dx, dy; int w, h, size_bits, shape_bits; - int imageSize; + int imageSize, tileIndex; + int animationDelay, amountOfFrames, currentFrame, animationCounter; std::unique_ptr oam; @@ -48,15 +61,24 @@ protected: public: Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size); + virtual ~Sprite() {} + void makeAnimated(int amountOfFrames, int animationDelay) { + this->amountOfFrames = amountOfFrames; + this->animationDelay = animationDelay; + } void setVelocity(int dx, int dy) { this->dx = dx; this->dy = dy; } - void move(); + void update(); + void moveTo(int x, int y); bool collidesWith(const Sprite &other); + void flipVertically(bool flip); + void flipHorizontally(bool flip); + int getX() { return x; } int getHeight() { return h; } int getWidth() { return w; } diff --git a/src/engine/sprites/sprite_builder.h b/src/engine/sprites/sprite_builder.h index 8812604..5cdd9fb 100644 --- a/src/engine/sprites/sprite_builder.h +++ b/src/engine/sprites/sprite_builder.h @@ -10,17 +10,22 @@ template class SpriteBuilder { private: int imageSize; - const u32 *imageData; + const void *imageData; int x, y, dx, dy; + int numberOfFrames, animationDelay; SpriteSize size; void reset() { - imageSize = x = y = dx = dy = 0; + imageSize = x = y = dx = dy = numberOfFrames = animationDelay = 0; imageData = nullptr; size = SIZE_16_16; } public: - SpriteBuilder& withData(const u32 imageData[], int imageSize) { + SpriteBuilder() { + reset(); + } + + SpriteBuilder& withData(const void* imageData, int imageSize) { this->imageData = imageData; this->imageSize = imageSize; return *this; @@ -30,6 +35,7 @@ public: this->dy = dy; return *this; } + SpriteBuilder& withLocation(int x, int y) { this->x = x; this->y = y; @@ -39,6 +45,11 @@ public: this->size = size; return *this; } + SpriteBuilder& withAnimated(int numberOfFrames, int delay) { + this->numberOfFrames = numberOfFrames; + this->animationDelay = delay; + return *this; + } T build(); std::unique_ptr buildPtr(); }; @@ -46,6 +57,9 @@ public: template std::unique_ptr SpriteBuilder::buildPtr() { auto s = new T(this->imageData, this->imageSize, this->x, this->y, this->size); s->setVelocity(this->dx, this->dy); + if(this->numberOfFrames > 0) { + s->makeAnimated(this->numberOfFrames, this->animationDelay); + } reset(); return std::unique_ptr(s); @@ -54,6 +68,9 @@ template std::unique_ptr SpriteBuilder::buildPtr() { template T SpriteBuilder::build() { T s(this->imageData, this->imageSize, this->x, this->y, this->size); s.setVelocity(this->dx, this->dy); + if(this->numberOfFrames > 0) { + s.makeAnimated(this->numberOfFrames, this->animationDelay); + } reset(); return s; diff --git a/src/engine/sprites/sprite_manager.cpp b/src/engine/sprites/sprite_manager.cpp index 45877ef..67ae1a9 100644 --- a/src/engine/sprites/sprite_manager.cpp +++ b/src/engine/sprites/sprite_manager.cpp @@ -48,7 +48,7 @@ void SpriteManager::copyOverSpriteOAMToVRAM() { if(affineIndex > MAX_AFFINE_SIZE) { throw std::runtime_error("max amount of sprites with affine matriches reached"); } - sprite->move(); + sprite->update(); auto oam = sprite->oam.get(); oam_mem[i] = *oam; diff --git a/src/lama.h b/src/lama.h new file mode 100644 index 0000000..d667ea8 --- /dev/null +++ b/src/lama.h @@ -0,0 +1,549 @@ + + +const unsigned char lama_data [] = { +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, +0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x05, 0x05, +0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, 0x04, 0x04, +0x02, 0x02, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x02, 0x02, 0x06, 0x06, +0x07, 0x07, 0x06, 0x06, 0x02, 0x02, 0x08, 0x08, 0x06, 0x06, 0x03, 0x03, +0x02, 0x02, 0x08, 0x08, 0x06, 0x06, 0x03, 0x03, 0x02, 0x02, 0x09, 0x09, +0x03, 0x03, 0x07, 0x07, 0x02, 0x02, 0x09, 0x09, 0x03, 0x03, 0x07, 0x07, +0x05, 0x05, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, +0x02, 0x02, 0x0B, 0x0B, 0x07, 0x07, 0x09, 0x09, 0x02, 0x02, 0x0B, 0x0B, +0x07, 0x07, 0x09, 0x09, 0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x0B, 0x04, 0x04, +0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x0B, 0x04, 0x04, 0x02, 0x02, 0x0B, 0x0B, +0x0C, 0x0C, 0x04, 0x04, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x04, 0x04, +0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x04, 0x04, 0x02, 0x02, 0x0B, 0x0B, +0x0C, 0x0C, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0D, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0D, 0x0D, +0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, 0x02, 0x02, +0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, 0x02, 0x02, 0x10, 0x10, 0x11, 0x11, +0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, +0x11, 0x11, 0x10, 0x10, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x13, 0x13, +0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x13, 0x13, 0x12, 0x12, 0x0C, 0x0C, +0x0C, 0x0C, 0x13, 0x13, 0x12, 0x12, 0x0C, 0x0C, 0x0C, 0x0C, 0x13, 0x13, +0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, 0x13, 0x11, 0x11, 0x11, 0x11, +0x13, 0x13, 0x13, 0x13, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x04, 0x04, +0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x04, 0x04, 0x14, 0x14, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x14, 0x14, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, +0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, +0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, +0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x05, 0x05, +0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, 0x04, 0x04, +0x02, 0x02, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x02, 0x02, 0x06, 0x06, +0x07, 0x07, 0x06, 0x06, 0x02, 0x02, 0x08, 0x08, 0x06, 0x06, 0x03, 0x03, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x05, 0x05, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x08, 0x08, 0x06, 0x06, 0x03, 0x03, 0x02, 0x02, 0x09, 0x09, +0x03, 0x03, 0x07, 0x07, 0x02, 0x02, 0x09, 0x09, 0x03, 0x03, 0x07, 0x07, +0x02, 0x02, 0x0B, 0x0B, 0x07, 0x07, 0x09, 0x09, 0x02, 0x02, 0x0B, 0x0B, +0x07, 0x07, 0x09, 0x09, 0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x0B, 0x04, 0x04, +0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x0B, 0x04, 0x04, 0x02, 0x02, 0x0B, 0x0B, +0x0C, 0x0C, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, +0x0D, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0D, 0x0D, +0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, 0x02, 0x02, +0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, 0x02, 0x02, 0x10, 0x10, 0x11, 0x11, +0x11, 0x11, 0x11, 0x11, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x04, 0x04, +0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x04, 0x04, 0x02, 0x02, 0x0B, 0x0B, +0x0C, 0x0C, 0x04, 0x04, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x13, 0x13, +0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x13, 0x13, 0x12, 0x12, 0x0C, 0x0C, +0x0C, 0x0C, 0x13, 0x13, 0x12, 0x12, 0x0C, 0x0C, 0x0C, 0x0C, 0x13, 0x13, +0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, 0x13, 0x03, 0x03, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x14, 0x14, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x14, 0x14, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, +0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, +0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, +0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x15, 0x15, 0x16, 0x16, +0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x16, 0x16, 0x17, 0x17, 0x16, 0x16, +0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x18, 0x18, 0x11, 0x11, 0x11, 0x11, +0x13, 0x13, 0x13, 0x13, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x04, 0x04, +0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x04, 0x04, 0x10, 0x10, 0x11, 0x11, +0x14, 0x14, 0x04, 0x04, 0x10, 0x10, 0x11, 0x11, 0x14, 0x14, 0x04, 0x04, +0x0B, 0x0B, 0x15, 0x15, 0x0B, 0x0B, 0x16, 0x16, 0x0B, 0x0B, 0x15, 0x15, +0x0B, 0x0B, 0x16, 0x16, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, 0x18, 0x18, +0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0B, 0x0B, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x15, 0x15, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, 0x04, 0x02, 0x04, 0x04, 0x05, +0x05, 0x02, 0x02, 0x04, 0x01, 0x02, 0x02, 0x06, 0x06, 0x07, 0x07, 0x06, +0x01, 0x02, 0x02, 0x06, 0x06, 0x07, 0x07, 0x06, 0x01, 0x02, 0x02, 0x08, +0x08, 0x06, 0x06, 0x03, 0x01, 0x02, 0x02, 0x08, 0x08, 0x06, 0x06, 0x03, +0x01, 0x02, 0x02, 0x09, 0x09, 0x03, 0x03, 0x07, 0x01, 0x02, 0x02, 0x09, +0x09, 0x03, 0x03, 0x07, 0x04, 0x05, 0x05, 0x02, 0x02, 0x01, 0x01, 0x01, +0x04, 0x05, 0x05, 0x02, 0x02, 0x01, 0x01, 0x01, 0x06, 0x02, 0x02, 0x01, +0x01, 0x01, 0x01, 0x01, 0x06, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, +0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x02, 0x01, +0x01, 0x01, 0x01, 0x01, 0x07, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, +0x07, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, +0x0A, 0x0A, 0x0A, 0x0A, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x07, 0x07, 0x09, +0x01, 0x02, 0x02, 0x0B, 0x0B, 0x07, 0x07, 0x09, 0x01, 0x02, 0x02, 0x0B, +0x0B, 0x0B, 0x0B, 0x04, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x0B, 0x04, +0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x04, 0x01, 0x02, 0x02, 0x0B, +0x0B, 0x0C, 0x0C, 0x04, 0x0A, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x04, +0x0A, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x04, 0x09, 0x02, 0x02, 0x01, +0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, +0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x02, 0x02, 0x01, +0x01, 0x01, 0x01, 0x01, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, +0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x03, 0x03, 0x01, +0x01, 0x01, 0x01, 0x01, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x0A, 0x0D, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, +0x0A, 0x0D, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0F, 0x0C, +0x0C, 0x0F, 0x0F, 0x02, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, 0x02, +0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, +0x11, 0x11, 0x11, 0x11, 0x0A, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, +0x0A, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x0D, 0x02, 0x02, 0x12, +0x12, 0x0C, 0x0C, 0x13, 0x0D, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x13, +0x02, 0x12, 0x12, 0x0C, 0x0C, 0x0C, 0x0C, 0x13, 0x02, 0x12, 0x12, 0x0C, +0x0C, 0x0C, 0x0C, 0x13, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, +0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, 0x10, 0x11, 0x11, 0x11, +0x11, 0x13, 0x13, 0x04, 0x10, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x04, +0x13, 0x14, 0x14, 0x02, 0x02, 0x01, 0x01, 0x01, 0x13, 0x14, 0x14, 0x02, +0x02, 0x01, 0x01, 0x01, 0x13, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, +0x13, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x13, 0x04, 0x04, 0x0B, +0x0B, 0x01, 0x01, 0x01, 0x13, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, +0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x03, 0x03, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0B, 0x10, 0x10, 0x11, +0x11, 0x10, 0x10, 0x11, 0x0B, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, +0x01, 0x15, 0x15, 0x16, 0x16, 0x17, 0x17, 0x16, 0x01, 0x15, 0x15, 0x16, +0x16, 0x17, 0x17, 0x16, 0x01, 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x18, +0x01, 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x18, 0x01, 0x15, 0x15, 0x19, +0x19, 0x15, 0x15, 0x1A, 0x01, 0x15, 0x15, 0x19, 0x19, 0x15, 0x15, 0x1A, +0x11, 0x10, 0x10, 0x11, 0x11, 0x14, 0x14, 0x04, 0x11, 0x10, 0x10, 0x11, +0x11, 0x14, 0x14, 0x04, 0x16, 0x0B, 0x0B, 0x15, 0x15, 0x0B, 0x0B, 0x16, +0x16, 0x0B, 0x0B, 0x15, 0x15, 0x0B, 0x0B, 0x16, 0x18, 0x15, 0x15, 0x01, +0x01, 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, 0x18, +0x1A, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, 0x1A, 0x1A, 0x15, 0x15, 0x01, +0x01, 0x15, 0x15, 0x1A, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, +0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x16, 0x15, 0x15, 0x01, +0x01, 0x01, 0x01, 0x01, 0x16, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x01, +0x18, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, 0x15, 0x15, 0x01, +0x01, 0x01, 0x01, 0x01, 0x1A, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x01, +0x1A, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, +0x01, 0x01, 0x02, 0x02, 0x06, 0x06, 0x07, 0x07, 0x01, 0x01, 0x02, 0x02, +0x06, 0x06, 0x07, 0x07, 0x01, 0x01, 0x02, 0x02, 0x08, 0x08, 0x06, 0x06, +0x01, 0x01, 0x02, 0x02, 0x08, 0x08, 0x06, 0x06, 0x01, 0x01, 0x02, 0x02, +0x09, 0x09, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, 0x09, 0x09, 0x03, 0x03, +0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x07, 0x07, 0x04, 0x04, 0x05, 0x05, +0x02, 0x02, 0x01, 0x01, 0x06, 0x06, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x06, 0x06, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x07, 0x07, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x07, 0x07, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x09, 0x09, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, +0x0A, 0x0A, 0x0D, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, 0x01, 0x01, 0x02, 0x02, +0x0B, 0x0B, 0x07, 0x07, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x0B, +0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x0B, 0x01, 0x01, 0x02, 0x02, +0x0B, 0x0B, 0x0C, 0x0C, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, +0x0A, 0x0A, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0C, 0x0A, 0x0A, 0x02, 0x02, +0x0B, 0x0B, 0x0C, 0x0C, 0x0D, 0x0D, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, +0x09, 0x09, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, +0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, +0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x13, 0x13, 0x14, 0x14, +0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x0A, 0x0D, 0x0E, +0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, +0x0D, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, 0x11, 0x11, 0x10, 0x10, +0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, +0x0A, 0x0A, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x0A, 0x0A, 0x11, 0x11, +0x10, 0x10, 0x11, 0x11, 0x0B, 0x0B, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, +0x0D, 0x0D, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x02, 0x02, 0x12, 0x12, +0x0C, 0x0C, 0x0C, 0x0C, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x0C, 0x0C, +0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x11, 0x11, 0x11, 0x11, +0x11, 0x11, 0x13, 0x13, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, +0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x11, 0x11, 0x10, 0x10, +0x11, 0x11, 0x14, 0x14, 0x13, 0x13, 0x14, 0x14, 0x02, 0x02, 0x01, 0x01, +0x13, 0x13, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x13, 0x13, 0x04, 0x04, +0x03, 0x03, 0x01, 0x01, 0x13, 0x13, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, +0x13, 0x13, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, +0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, +0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0B, 0x0B, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x01, 0x01, 0x15, 0x15, +0x16, 0x16, 0x17, 0x17, 0x01, 0x01, 0x15, 0x15, 0x16, 0x16, 0x17, 0x17, +0x01, 0x01, 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, +0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, 0x19, 0x19, 0x15, 0x15, +0x01, 0x01, 0x15, 0x15, 0x19, 0x19, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, +0x15, 0x15, 0x15, 0x15, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x14, 0x14, +0x16, 0x16, 0x0B, 0x0B, 0x15, 0x15, 0x0B, 0x0B, 0x16, 0x16, 0x0B, 0x0B, +0x15, 0x15, 0x0B, 0x0B, 0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, +0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, 0x1A, 0x1A, 0x15, 0x15, +0x01, 0x01, 0x15, 0x15, 0x1A, 0x1A, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, +0x15, 0x15, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, 0x04, 0x04, 0x0B, 0x0B, +0x01, 0x01, 0x01, 0x01, 0x16, 0x16, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, +0x16, 0x16, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x18, 0x18, 0x15, 0x15, +0x01, 0x01, 0x01, 0x01, 0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, +0x1A, 0x1A, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, 0x1A, 0x1A, 0x15, 0x15, +0x01, 0x01, 0x01, 0x01, 0x15, 0x15, 0x15, 0x15, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, +0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x05, 0x05, 0x02, +0x01, 0x02, 0x02, 0x04, 0x04, 0x05, 0x05, 0x02, 0x01, 0x01, 0x01, 0x02, +0x02, 0x06, 0x06, 0x07, 0x01, 0x01, 0x01, 0x02, 0x02, 0x06, 0x06, 0x07, +0x01, 0x01, 0x01, 0x02, 0x02, 0x08, 0x08, 0x06, 0x01, 0x01, 0x01, 0x02, +0x02, 0x08, 0x08, 0x06, 0x01, 0x01, 0x01, 0x02, 0x02, 0x09, 0x09, 0x03, +0x01, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x01, 0x02, 0x04, 0x04, 0x05, +0x05, 0x02, 0x02, 0x01, 0x02, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, 0x01, +0x07, 0x06, 0x06, 0x02, 0x02, 0x01, 0x01, 0x01, 0x07, 0x06, 0x06, 0x02, +0x02, 0x01, 0x01, 0x01, 0x06, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, +0x06, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x03, 0x07, 0x07, 0x02, +0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x02, 0x02, 0x09, 0x09, 0x03, 0x01, 0x01, 0x01, 0x02, +0x02, 0x0B, 0x0B, 0x07, 0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x07, +0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x02, +0x02, 0x0B, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0C, +0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x0C, 0x0A, 0x0A, 0x0A, 0x02, +0x02, 0x0B, 0x0B, 0x0C, 0x03, 0x07, 0x07, 0x02, 0x02, 0x01, 0x01, 0x01, +0x07, 0x09, 0x09, 0x02, 0x02, 0x01, 0x01, 0x01, 0x07, 0x09, 0x09, 0x02, +0x02, 0x01, 0x01, 0x01, 0x0B, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, +0x0B, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x0C, 0x04, 0x04, 0x03, +0x03, 0x01, 0x01, 0x01, 0x0C, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, +0x0C, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x01, 0x0A, 0x0A, 0x0D, +0x0E, 0x0D, 0x0D, 0x0D, 0x01, 0x0A, 0x0A, 0x0D, 0x0E, 0x0D, 0x0D, 0x0D, +0x0A, 0x0D, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0A, 0x0D, 0x0D, 0x0F, +0x0F, 0x0C, 0x0C, 0x0F, 0x0B, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, +0x0B, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x01, 0x0A, 0x0A, 0x11, +0x11, 0x10, 0x10, 0x11, 0x0A, 0x0A, 0x0A, 0x02, 0x02, 0x0B, 0x0B, 0x0C, +0x0D, 0x0D, 0x0D, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0D, 0x0D, 0x0D, 0x02, +0x02, 0x12, 0x12, 0x0C, 0x0F, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x0C, +0x0F, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x0C, 0x11, 0x11, 0x11, 0x11, +0x11, 0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, +0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x13, 0x0C, 0x04, 0x04, 0x03, +0x03, 0x01, 0x01, 0x01, 0x0C, 0x13, 0x13, 0x14, 0x14, 0x02, 0x02, 0x01, +0x0C, 0x13, 0x13, 0x14, 0x14, 0x02, 0x02, 0x01, 0x0C, 0x13, 0x13, 0x04, +0x04, 0x03, 0x03, 0x01, 0x0C, 0x13, 0x13, 0x04, 0x04, 0x03, 0x03, 0x01, +0x13, 0x13, 0x13, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x13, 0x13, 0x13, 0x04, +0x04, 0x0B, 0x0B, 0x01, 0x13, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x0A, 0x11, 0x11, 0x10, 0x10, 0x11, +0x01, 0x0B, 0x0B, 0x10, 0x10, 0x11, 0x11, 0x10, 0x01, 0x0B, 0x0B, 0x10, +0x10, 0x11, 0x11, 0x10, 0x01, 0x01, 0x01, 0x15, 0x15, 0x16, 0x16, 0x17, +0x01, 0x01, 0x01, 0x15, 0x15, 0x16, 0x16, 0x17, 0x01, 0x01, 0x01, 0x15, +0x15, 0x18, 0x18, 0x15, 0x01, 0x01, 0x01, 0x15, 0x15, 0x18, 0x18, 0x15, +0x01, 0x01, 0x01, 0x15, 0x15, 0x19, 0x19, 0x15, 0x11, 0x10, 0x10, 0x11, +0x11, 0x11, 0x11, 0x13, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x14, +0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x14, 0x17, 0x16, 0x16, 0x0B, +0x0B, 0x15, 0x15, 0x0B, 0x17, 0x16, 0x16, 0x0B, 0x0B, 0x15, 0x15, 0x0B, +0x15, 0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x15, 0x15, 0x18, 0x18, 0x15, +0x15, 0x01, 0x01, 0x15, 0x15, 0x1A, 0x1A, 0x15, 0x15, 0x01, 0x01, 0x15, +0x13, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x01, 0x14, 0x04, 0x04, 0x0B, +0x0B, 0x01, 0x01, 0x01, 0x14, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, +0x0B, 0x16, 0x16, 0x15, 0x15, 0x01, 0x01, 0x01, 0x0B, 0x16, 0x16, 0x15, +0x15, 0x01, 0x01, 0x01, 0x15, 0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x01, +0x15, 0x18, 0x18, 0x15, 0x15, 0x01, 0x01, 0x01, 0x15, 0x1A, 0x1A, 0x15, +0x15, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, +0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x05, 0x05, 0x01, 0x01, 0x02, 0x02, +0x04, 0x04, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, +0x03, 0x03, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, +0x02, 0x02, 0x04, 0x04, 0x05, 0x05, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x06, 0x06, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x08, 0x08, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x09, 0x09, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x09, 0x09, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x07, 0x07, 0x06, 0x06, +0x02, 0x02, 0x01, 0x01, 0x07, 0x07, 0x06, 0x06, 0x02, 0x02, 0x01, 0x01, +0x06, 0x06, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x06, 0x06, 0x03, 0x03, +0x02, 0x02, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x02, 0x02, 0x01, 0x01, +0x03, 0x03, 0x07, 0x07, 0x02, 0x02, 0x01, 0x01, 0x07, 0x07, 0x09, 0x09, +0x02, 0x02, 0x01, 0x01, 0x07, 0x07, 0x09, 0x09, 0x02, 0x02, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x0A, +0x0A, 0x0A, 0x0A, 0x0A, 0x01, 0x01, 0x0A, 0x0A, 0x0D, 0x0E, 0x0D, 0x0D, +0x01, 0x01, 0x0A, 0x0A, 0x0D, 0x0E, 0x0D, 0x0D, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, +0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, +0x02, 0x02, 0x0B, 0x0B, 0x01, 0x0A, 0x0A, 0x0A, 0x02, 0x02, 0x0B, 0x0B, +0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0x02, 0x0B, 0x0B, 0x0D, 0x0D, 0x0D, 0x0D, +0x02, 0x02, 0x12, 0x12, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x02, 0x12, 0x12, +0x0B, 0x0B, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x0B, 0x0B, 0x04, 0x04, +0x02, 0x02, 0x01, 0x01, 0x0C, 0x0C, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, +0x0C, 0x0C, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x0C, 0x0C, 0x04, 0x04, +0x03, 0x03, 0x01, 0x01, 0x0C, 0x0C, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, +0x0C, 0x0C, 0x13, 0x13, 0x14, 0x14, 0x02, 0x02, 0x0C, 0x0C, 0x13, 0x13, +0x14, 0x14, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x0A, 0x0D, 0x0D, +0x0F, 0x0F, 0x0C, 0x0C, 0x0A, 0x0A, 0x0D, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, +0x0B, 0x0B, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x0B, 0x0B, 0x11, 0x11, +0x10, 0x10, 0x11, 0x11, 0x01, 0x01, 0x0A, 0x0A, 0x11, 0x11, 0x10, 0x10, +0x01, 0x01, 0x0A, 0x0A, 0x11, 0x11, 0x10, 0x10, 0x01, 0x01, 0x0B, 0x0B, +0x10, 0x10, 0x11, 0x11, 0x01, 0x01, 0x0B, 0x0B, 0x10, 0x10, 0x11, 0x11, +0x0F, 0x0F, 0x02, 0x02, 0x12, 0x12, 0x0C, 0x0C, 0x0F, 0x0F, 0x02, 0x02, +0x12, 0x12, 0x0C, 0x0C, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, +0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, +0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, +0x10, 0x10, 0x11, 0x11, 0x0C, 0x0C, 0x13, 0x13, 0x04, 0x04, 0x03, 0x03, +0x0C, 0x0C, 0x13, 0x13, 0x04, 0x04, 0x03, 0x03, 0x13, 0x13, 0x13, 0x13, +0x04, 0x04, 0x0B, 0x0B, 0x13, 0x13, 0x13, 0x13, 0x04, 0x04, 0x0B, 0x0B, +0x13, 0x13, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x13, 0x13, 0x04, 0x04, +0x03, 0x03, 0x01, 0x01, 0x14, 0x14, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, +0x14, 0x14, 0x04, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + +}; + +const unsigned short lama_palette [] = { +0x7c1f, 0x0000, 0x0489, 0x08cb, 0x22bd, 0x1a5a, 0x1add, 0x379e, 0x04cb, +0x231f, 0x08ca, 0x0532, 0x161a, 0x333d, 0x331d, 0x123c, 0x1578, 0x1592, +0x11b6, 0x123a, 0x12bd, 0x0c85, 0x08ab, 0x150e, 0x1d8c, 0x1dce, 0x25ef, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000 +}; \ No newline at end of file diff --git a/src/sample_start_scene.cpp b/src/sample_start_scene.cpp index f723ca1..9d3c8bb 100644 --- a/src/sample_start_scene.cpp +++ b/src/sample_start_scene.cpp @@ -8,31 +8,28 @@ #include #include #include "sample_start_scene.h" -#include "kul.h" #include "flying_stuff_scene.h" +#include "kul.h" +#include "lama.h" + std::vector SampleStartScene::backgrounds() { return {}; } std::vector SampleStartScene::sprites() { - return { smiley.get(), logo.get() }; + return { animation.get() }; } void SampleStartScene::load() { - foregroundPalette = std::unique_ptr(new ForegroundPaletteManager(sharedPal, sizeof(sharedPal))); + foregroundPalette = std::unique_ptr(new ForegroundPaletteManager(lama_palette, sizeof(lama_palette))); SpriteBuilder builder; - smiley = builder - .withData(piskelTiles, sizeof(piskelTiles)) - .withSize(SIZE_16_16) - .withLocation(10, 10) - .buildPtr(); - - logo = builder - .withData(kulTiles, sizeof(kulTiles)) - .withSize(SIZE_64_32) + animation = builder + .withData(lama_data, sizeof(lama_data)) + .withSize(SIZE_32_32) + .withAnimated(6, 3) .withLocation(50, 50) .buildPtr(); @@ -44,5 +41,13 @@ void SampleStartScene::tick(u16 keys) { TextStream::instance() << "entered: starting next scene"; engine->transitionIntoScene(new FlyingStuffScene(), new FadeOutScene(2)); + } else if(keys & KEY_LEFT) { + animation->flipHorizontally(true); + } else if(keys & KEY_RIGHT) { + animation->flipHorizontally(false); + } else if(keys & KEY_UP) { + animation->flipVertically(true); + } else if(keys & KEY_DOWN) { + animation->flipVertically(false); } } diff --git a/src/sample_start_scene.h b/src/sample_start_scene.h index 25d5f35..7800158 100644 --- a/src/sample_start_scene.h +++ b/src/sample_start_scene.h @@ -9,7 +9,7 @@ class SampleStartScene : public Scene { private: - std::unique_ptr logo; + std::unique_ptr animation; std::unique_ptr smiley; public: