Subversion Repositories svn.mios32

Compare Revisions

Ignore whitespace Rev 2592 → Rev 2593

/trunk/apps/sequencers/LoopA/app_good.c
File deleted
/trunk/apps/sequencers/LoopA/app_good.h
File deleted
/trunk/apps/sequencers/LoopA/hardware.h
1,9 → 1,11
// --- LEDs ---
 
#include "loopa_datatypes.h"
 
extern const u8 led_startstop;
extern const u8 led_armrecord;
 
extern const u8 led_gp1;
extern const u8 LED_GP1;
extern const u8 led_gp2;
extern const u8 led_gp3;
extern const u8 led_gp4;
65,6 → 67,8
extern const u8 sw_gp5;
extern const u8 sw_gp6;
 
extern const u8 sw_menu;
extern const u8 sw_shift;
extern const u8 sw_copy;
extern const u8 sw_paste;
extern const u8 sw_delete;
/trunk/apps/sequencers/LoopA/gfx/LoopAIconFont.pnm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/apps/sequencers/LoopA/gfx/LoopAIconFont.pnm
New file
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: apps/sequencers/LoopA/gfx/LoopAIconFont.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/png
Index: apps/sequencers/LoopA/gfx/LoopAIconFont.png
===================================================================
--- apps/sequencers/LoopA/gfx/LoopAIconFont.png (revision 0)
+++ apps/sequencers/LoopA/gfx/LoopAIconFont.png (revision 2593)
/apps/sequencers/LoopA/gfx/LoopAIconFont.png
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Index: apps/sequencers/LoopA/gfx/menu.pnm
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: apps/sequencers/LoopA/gfx/menu.pnm
===================================================================
--- apps/sequencers/LoopA/gfx/menu.pnm (revision 0)
+++ apps/sequencers/LoopA/gfx/menu.pnm (revision 2593)
/apps/sequencers/LoopA/gfx/menu.pnm
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: apps/sequencers/LoopA/mios32_config.h
===================================================================
--- apps/sequencers/LoopA/mios32_config.h (revision 2592)
+++ apps/sequencers/LoopA/mios32_config.h (revision 2593)
@@ -12,11 +12,11 @@
// The boot message which is print during startup and returned on a SysEx query
#define MIOS32_LCD_BOOT_MSG_DELAY 0 // we delay the boot and print a message inside the app
-#define MIOS32_LCD_BOOT_MSG_LINE1 "MBLoopA"
-#define MIOS32_LCD_BOOT_MSG_LINE2 "(C) 2017 Hawkeye and TK."
+#define MIOS32_LCD_BOOT_MSG_LINE1 "LoopA"
+#define MIOS32_LCD_BOOT_MSG_LINE2 "(C) 2018 Hawkeye, latigid on, TK."
// define a unique VID/PID for this application
-#define MIOS32_USB_PRODUCT_STR "MBLoopA"
+#define MIOS32_USB_PRODUCT_STR "LoopA"
// enable 4 USB ports
#define MIOS32_USB_MIDI_NUM_PORTS 4
/trunk/apps/sequencers/LoopA/voxelspace.c
1,10 → 1,12
// $Id: voxelspace.c 1223 2011-06-23 21:26:52Z hawkeye $
 
#include <mios32.h>
#include "commonIncludes.h"
 
/*#include <mios32.h>
 
#include <app_lcd.h>
 
#include <seq_bpm.h>
#include <seq_bpm.h> */
#include "screen.h"
#include "voxelspace.h"
 
129,18 → 131,15
u16 yfield;
yVoxel += tempEncoderAccel;
 
 
// Output random terrain noise, that will be blurred down
yfield = (40 + yVoxel) % 128;
for (i = 0; i < 128; i++)
{
for (i = 0; i < 128; i++) {
field[yfield][i] = rand() % (seqRunning ? 255 : 208);
}
 
// Output current notedraw heightline
yfield = (29 + yVoxel) % 128;
for (i = 0; i < 128; i++)
{
for (i = 0; i < 128; i++) {
if (notedraw[i] > 0)
field[yfield][i] = notedraw[i];
else if (tickLine)
151,7 → 150,7
blur();
 
// Calculate screen buffer
for (j=0; j<30; j++) // Distance from screen plane
for (j = 0; j < 30; j++) // Distance from screen plane
{
u16 distscaler = 38 - j;
u16 stdheight = 400 / distscaler;
160,10 → 159,9
 
yfield = (j + yVoxel) % 128;
 
for (i = 0; i < 128; i++)
{
for (i = 0; i < 128; i++) {
// --- "Even" display pixel (0, 2, 4, 6, ...) ---
u16 xfield = (64 + (int)((((i<<1)-128)*distscaler)>>5)) & 127;
u16 xfield = (64 + (int) ((((i << 1) - 128) * distscaler) >> 5)) & 127;
u8 h = field[yfield][xfield];
u8 height = h / distscaler; // Scale height to distance
u8 starty = mult1dot5[stdheight - height];
173,7 → 171,7
screen[k][i] = (screen[k][i] & 0x0f) + col;
 
// --- "Odd" display pixel (1, 3, 5, 7, ...) ---
xfield = (64 + (int)((((i<<1)-127)*distscaler)>>5)) & 127;
xfield = (64 + (int) ((((i << 1) - 127) * distscaler) >> 5)) & 127;
h = field[yfield][xfield];
 
height = h / distscaler; // Scale height to distance
186,7 → 184,7
}
 
// Push screen buffer
display();
//display();
}
// ----------------------------------------------------------------------------------------
 
/trunk/apps/sequencers/LoopA/loopa.c
25,15 → 25,8
// (v3 needs no pushable encoders, as we will have more buttons and encoders directly under the commands)
// =================================================================================================
 
#include "commonIncludes.h"
 
#include <mios32.h>
#include "loopa_datatypes.h"
#include <seq_midi_out.h>
#include <seq_bpm.h>
#include <midi_port.h>
#include <midi_router.h>
#include <string.h>
 
#include "tasks.h"
#include "file.h"
#include "loopa.h"
40,9 → 33,11
#include "hardware.h"
#include "screen.h"
#include "app_lcd.h"
#include "voxelspace.h"
 
// -- Local types ---
 
 
// --- Global vars ---
 
static s32 (*clipPlayEventCallback)(u8 clipNumber, mios32_midi_package_t midi_package, u32 tick) = 0; // fetchClipEvents() callback
52,7 → 47,7
u16 bpm_ = 120; // bpm
u16 sessionNumber_ = 0; // currently active session number (directory e.g. /SESSIONS/0001)
u8 sessionExistsOnDisk_ = 0; // is the currently selected session number already saved on disk/sd card
enum LoopaPage page_ = PAGE_TRACK; // currently active page/view
enum LoopaPage page_ = PAGE_MUTE; // currently active page/view
enum Command command_ = COMMAND_NONE; // currently active command
 
u8 activeTrack_ = 0; // currently active or last active clip number (0..5)
216,7 → 211,7
case 1:
if (s1 != newState)
{
MIOS32_DOUT_PinSet(led_gp1, newState);
MIOS32_DOUT_PinSet(LED_GP1, newState);
s1 = newState;
}
break;
274,61 → 269,68
{
MUTEX_DIGITALOUT_TAKE;
 
switch (page_)
if (screenIsInMenu())
{
case PAGE_TRACK:
updateGPLed(1, !trackMute_[0]);
updateGPLed(2, !trackMute_[1]);
updateGPLed(3, !trackMute_[2]);
updateGPLed(4, !trackMute_[3]);
updateGPLed(5, !trackMute_[4]);
updateGPLed(6, !trackMute_[5]);
break;
 
case PAGE_EDIT:
updateGPLed(1, command_ == COMMAND_CLIPLEN);
updateGPLed(2, command_ == COMMAND_QUANTIZE);
updateGPLed(3, command_ == COMMAND_TRANSPOSE);
updateGPLed(4, command_ == COMMAND_SCROLL);
updateGPLed(5, command_ == COMMAND_STRETCH);
updateGPLed(6, command_ == COMMAND_CLEAR);
break;
}
 
case PAGE_NOTES:
updateGPLed(1, command_ == COMMAND_POSITION);
updateGPLed(2, command_ == COMMAND_NOTE);
updateGPLed(3, command_ == COMMAND_VELOCITY);
updateGPLed(4, command_ == COMMAND_LENGTH);
updateGPLed(5, 0);
updateGPLed(6, command_ == COMMAND_DELETENOTE);
break;
else
{
switch (page_) {
case PAGE_MUTE:
updateGPLed(1, !trackMute_[0]);
updateGPLed(2, !trackMute_[1]);
updateGPLed(3, !trackMute_[2]);
updateGPLed(4, !trackMute_[3]);
updateGPLed(5, !trackMute_[4]);
updateGPLed(6, !trackMute_[5]);
break;
 
case PAGE_MIDI:
updateGPLed(1, command_ == COMMAND_PORT);
updateGPLed(2, command_ == COMMAND_CHANNEL);
updateGPLed(3, 0);
updateGPLed(4, 0);
updateGPLed(5, 0);
updateGPLed(6, 0);
break;
case PAGE_CLIP:
updateGPLed(1, command_ == COMMAND_CLIPLEN);
updateGPLed(2, command_ == COMMAND_QUANTIZE);
updateGPLed(3, command_ == COMMAND_TRANSPOSE);
updateGPLed(4, command_ == COMMAND_SCROLL);
updateGPLed(5, command_ == COMMAND_STRETCH);
updateGPLed(6, command_ == COMMAND_CLEAR);
break;
 
case PAGE_DISK:
updateGPLed(1, command_ == COMMAND_SAVE);
updateGPLed(2, command_ == COMMAND_LOAD);
updateGPLed(3, command_ == COMMAND_NEW);
updateGPLed(4, 0);
updateGPLed(5, 0);
updateGPLed(6, 0);
break;
case PAGE_NOTES:
updateGPLed(1, command_ == COMMAND_POSITION);
updateGPLed(2, command_ == COMMAND_NOTE);
updateGPLed(3, command_ == COMMAND_VELOCITY);
updateGPLed(4, command_ == COMMAND_LENGTH);
updateGPLed(5, 0);
updateGPLed(6, command_ == COMMAND_DELETENOTE);
break;
 
case PAGE_BPM:
updateGPLed(1, command_ == COMMAND_BPM);
updateGPLed(2, command_ == COMMAND_BPMFLASH);
updateGPLed(3, 0);
updateGPLed(4, 0);
updateGPLed(5, 0);
updateGPLed(6, 0);
break;
case PAGE_TRACK:
updateGPLed(1, command_ == COMMAND_PORT);
updateGPLed(2, command_ == COMMAND_CHANNEL);
updateGPLed(3, 0);
updateGPLed(4, 0);
updateGPLed(5, 0);
updateGPLed(6, 0);
break;
 
case PAGE_DISK:
updateGPLed(1, command_ == COMMAND_SAVE);
updateGPLed(2, command_ == COMMAND_LOAD);
updateGPLed(3, command_ == COMMAND_NEW);
updateGPLed(4, 0);
updateGPLed(5, 0);
updateGPLed(6, 0);
break;
 
case PAGE_TEMPO:
updateGPLed(1, command_ == COMMAND_BPM);
updateGPLed(2, command_ == COMMAND_BPMFLASH);
updateGPLed(3, 0);
updateGPLed(4, 0);
updateGPLed(5, 0);
updateGPLed(6, 0);
break;
}
}
 
MUTEX_DIGITALOUT_GIVE;
379,12 → 381,12
page_ = page;
 
MUTEX_DIGITALOUT_TAKE;
MIOS32_DOUT_PinSet(led_page_1, page == PAGE_TRACK);
MIOS32_DOUT_PinSet(led_page_2, page == PAGE_EDIT);
MIOS32_DOUT_PinSet(led_page_1, page == PAGE_MUTE);
MIOS32_DOUT_PinSet(led_page_2, page == PAGE_CLIP);
MIOS32_DOUT_PinSet(led_page_3, page == PAGE_NOTES);
MIOS32_DOUT_PinSet(led_page_4, page == PAGE_MIDI);
MIOS32_DOUT_PinSet(led_page_4, page == PAGE_TRACK);
MIOS32_DOUT_PinSet(led_page_5, page == PAGE_DISK);
MIOS32_DOUT_PinSet(led_page_6, page == PAGE_BPM);
MIOS32_DOUT_PinSet(led_page_6, page == PAGE_TEMPO);
MUTEX_DIGITALOUT_GIVE;
}
// -------------------------------------------------------------------------------------------------
1421,7 → 1423,7
saveSession(sessionNumber_);
diskScanSessionFileAvailable();
 
page_ = PAGE_TRACK;
page_ = PAGE_MUTE;
screenNotifyPageChanged();
}
// -------------------------------------------------------------------------------------------------
1437,7 → 1439,7
 
loadSession(sessionNumber_);
 
page_ = PAGE_TRACK;
page_ = PAGE_MUTE;
screenNotifyPageChanged();
}
// -------------------------------------------------------------------------------------------------
1452,7 → 1454,7
command_ = COMMAND_NONE;
 
seqInit();
page_ = PAGE_TRACK;
page_ = PAGE_MUTE;
screenNotifyPageChanged();
 
screenFormattedFlashMessage("A fresh start... :-)");
1502,19 → 1504,54
{
seqArmButton();
}
else if (pin == sw_shift)
{
if (screenIsInMenu())
{
page_ = PAGE_MUTE;
}
else
{
// normal mode "shift"
screenShowShift(1);
}
}
else if (pin == sw_menu)
{
/*if (screenIsInShift())
{
 
}
else */
{
// normal mode "menu"
DEBUG_MSG("enter menu");
calcField();
screenShowMenu(1);
}
}
else if (pin == sw_copy)
{
copiedClipSteps_ = clipSteps_[activeTrack_][activeScene_];
copiedClipQuantize_ = clipQuantize_[activeTrack_][activeScene_];
copiedClipTranspose_ = clipTranspose_[activeTrack_][activeScene_];
copiedClipScroll_ = clipScroll_[activeTrack_][activeScene_];
copiedClipStretch_ = clipStretch_[activeTrack_][activeScene_];
memcpy(copiedClipNotes_, clipNotes_[activeTrack_][activeScene_], sizeof(copiedClipNotes_));
copiedClipNotesSize_ = clipNotesSize_[activeTrack_][activeScene_];
screenFormattedFlashMessage("copied clip to buffer");
if (screenIsInMenu())
{
page_ = PAGE_TRACK;
}
else
{
// normal mode "copy"
copiedClipSteps_ = clipSteps_[activeTrack_][activeScene_];
copiedClipQuantize_ = clipQuantize_[activeTrack_][activeScene_];
copiedClipTranspose_ = clipTranspose_[activeTrack_][activeScene_];
copiedClipScroll_ = clipScroll_[activeTrack_][activeScene_];
copiedClipStretch_ = clipStretch_[activeTrack_][activeScene_];
memcpy(copiedClipNotes_, clipNotes_[activeTrack_][activeScene_], sizeof(copiedClipNotes_));
copiedClipNotesSize_ = clipNotesSize_[activeTrack_][activeScene_];
screenFormattedFlashMessage("copied clip to buffer");
}
}
else if (pin == sw_paste)
{
voxelFrame();
// paste only, if we have a clip in memory
if (copiedClipSteps_ > 0)
{
1531,26 → 1568,31
screenFormattedFlashMessage("no clip in buffer");
 
}
else if (pin == sw_delete)
{
editClear(); // shortcut: clear track
command_ = COMMAND_NONE;
}
else if (pin == sw_gp1)
{
switch (page_)
{
case PAGE_TRACK:
case PAGE_MUTE:
toggleMute(0);
break;
case PAGE_EDIT:
case PAGE_CLIP:
editLen();
break;
case PAGE_NOTES:
notesPosition();
break;
case PAGE_MIDI:
case PAGE_TRACK:
midiTrackPort();
break;
case PAGE_DISK:
diskSave();
break;
case PAGE_BPM:
case PAGE_TEMPO:
bpmBpm();
break;
}
1559,22 → 1601,22
{
switch (page_)
{
case PAGE_TRACK:
case PAGE_MUTE:
toggleMute(1);
break;
case PAGE_EDIT:
case PAGE_CLIP:
editQuantize();
break;
case PAGE_NOTES:
notesNote();
break;
case PAGE_MIDI:
case PAGE_TRACK:
midiTrackChannel();
break;
case PAGE_DISK:
diskLoad();
break;
case PAGE_BPM:
case PAGE_TEMPO:
bpmBpmflash();
break;
}
1581,30 → 1623,39
}
else if (pin == sw_gp3)
{
switch (page_)
if (screenIsInMenu())
{
case PAGE_TRACK:
toggleMute(2);
break;
case PAGE_EDIT:
editTranspose();
break;
case PAGE_NOTES:
notesVelocity();
break;
case PAGE_DISK:
diskNew();
break;
page_ = PAGE_CLIP;
}
else
{
// Normal GP3 page handling
 
switch (page_)
{
case PAGE_MUTE:
toggleMute(2);
break;
case PAGE_CLIP:
editTranspose();
break;
case PAGE_NOTES:
notesVelocity();
break;
case PAGE_DISK:
diskNew();
break;
}
}
}
else if (pin == sw_gp4)
{
switch (page_)
{
case PAGE_TRACK:
case PAGE_MUTE:
toggleMute(3);
break;
case PAGE_EDIT:
case PAGE_CLIP:
editScroll();
break;
case PAGE_NOTES:
1616,10 → 1667,10
{
switch (page_)
{
case PAGE_TRACK:
case PAGE_MUTE:
toggleMute(4);
break;
case PAGE_EDIT:
case PAGE_CLIP:
editStretch();
break;
}
1628,10 → 1679,10
{
switch (page_)
{
case PAGE_TRACK:
case PAGE_MUTE:
toggleMute(5);
break;
case PAGE_EDIT:
case PAGE_CLIP:
editClear();
break;
case PAGE_NOTES:
1639,14 → 1690,9
break;
}
}
else if (pin == sw_delete)
{
editClear(); // shortcut: clear track
command_ = COMMAND_NONE;
}
else if (pin == sw_encoder2)
{
page_ = PAGE_TRACK; // shortcut back to track display
page_ = PAGE_MUTE; // shortcut back to track display
command_ = COMMAND_NONE;
screenNotifyPageChanged();
}
1655,6 → 1701,27
 
 
/**
* A button release has occured
*
*/
void loopaButtonReleased(s32 pin)
{
if (screenIsInMenu() && pin == sw_menu)
{
DEBUG_MSG("leave menu");
screenShowMenu(0); // Left the menu by releasing the menu button
}
 
if (screenIsInShift() && pin == sw_shift)
{
screenShowShift(0); // Left the shift overlay by releasing the shift button
}
}
 
// -------------------------------------------------------------------------------------------------
 
 
/**
* An encoder has been turned
*
*/
1719,13 → 1786,12
{
// switch through pages
 
incrementer = -incrementer; // inverted encoder handling for page switching (LEDs on left side of encoder)
enum LoopaPage page = page_;
 
if (page == PAGE_TRACK && incrementer < 0)
page = PAGE_TRACK;
else if (page >= PAGE_BPM && incrementer > 0)
page = PAGE_BPM;
if (page == PAGE_MUTE && incrementer < 0)
page = PAGE_MUTE;
else if (page >= PAGE_TEMPO && incrementer > 0)
page = PAGE_TEMPO;
else
page += incrementer;
 
/trunk/apps/sequencers/LoopA/screen.c
1,7 → 1,10
// $Id: screen.c 1223 2011-06-23 21:26:52Z hawkeye $
 
#include <mios32.h>
#include "app_lcd.h"
#include "loopa_datatypes.h"
 
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
 
11,6 → 14,7
#include "tasks.h"
#include "gfx_resources.h"
#include "loopa.h"
#include "voxelspace.h"
 
 
// -------------------------------------------------------------------------------------------
21,6 → 25,9
u8 screen[64][128]; // Screen buffer [y][x]
 
u8 screenShowLoopaLogo_;
u8 screenShowShift_ = 0;
u8 screenShowMenu_ = 0;
u8 screenShowVoxel_ = 0;
u8 screenClipNumberSelected_ = 0;
u16 screenClipStepPosition_[TRACKS];
u32 screenSongStep_ = 0;
77,7 → 84,20
}
// ----------------------------------------------------------------------------------------
 
/**
* Set the small font
*
*/
void setFontKeyIcon()
{
fontptr_ = (unsigned char*) keyicons_pixdata;
fontchar_bytewidth_ = 18;
fontchar_height_ = 32;
fontline_bytewidth_ = 600;
}
// ----------------------------------------------------------------------------------------
 
 
/**
* Set font noninverted
* *
317,7 → 337,7
 
 
/**
* If showLogo is true, draw the MBLoopa Logo (usually during unit startup)
* If showLogo is true, draw the LoopA Logo (usually during unit startup)
*
*/
void screenShowLoopaLogo(u8 showLogo)
328,6 → 348,61
 
 
/**
* If showShift is true, draw the shift key overlay
*
*/
void screenShowShift(u8 showShift)
{
screenShowShift_ = showShift;
}
// ----------------------------------------------------------------------------------------
 
 
/**
* @return true, if we are currently showing the shift overlay
*
*/
u8 screenIsInShift()
{
return screenShowShift_;
}
// ----------------------------------------------------------------------------------------
 
 
/**
* If showMenu is true, draw the menu key overlay
*
*/
void screenShowMenu(u8 showMenu)
{
screenShowMenu_ = showMenu;
}
// ----------------------------------------------------------------------------------------
 
 
/**
* @return if we are currently showing the menu
*
*/
u8 screenIsInMenu()
{
return screenShowMenu_;
}
// ----------------------------------------------------------------------------------------
 
 
/**
* If showVoxel is true, draw the voxel screensaver
* TODO: should be able to add titles or gfx on top of underlying screensaver, e.g. for startup
*/
void screenShowVoxel(u8 showVoxel)
{
screenShowVoxel_ = showVoxel;
}
// ----------------------------------------------------------------------------------------
 
 
/**
* Set the currently selected clip
*
*/
510,7 → 585,7
* Display the normal loopa view (PAGE_TRACK)
*
*/
void displayPageTrack(void)
void displayPageMute(void)
{
setFontSmall();
 
827,10 → 902,10
 
if (screenShowLoopaLogo_)
{
// Startup/initial session loading: Render the MBLoopa Logo
// Startup/initial session loading: Render the LoopA Logo
 
setFontBold(); // width per letter: 10px (for center calculation)
printFormattedString(78, 2, "LoopA V2.01");
printFormattedString(78, 2, "LoopA V2.03");
 
setFontSmall(); // width per letter: 6px
printFormattedString(28, 20, "(C) Hawkeye, latigid on, TK. 2018");
839,16 → 914,64
setFontBold(); // width per letter: 10px;
printFormattedString(52, 44, "www.midiphy.com");
}
else if (screenIsInMenu())
{
voxelFrame();
setFontKeyIcon();
// setFontDarkGreyAsBlack(); // TODO
 
int iconId;
 
iconId = (page_ == PAGE_TEMPO) ? 32 + KEYICON_TEMPO : 32 + KEYICON_TEMPO;
printFormattedString(1 * 36 + 18, 0, "%c", iconId);
 
iconId = (page_ == PAGE_CLIP) ? 32 + KEYICON_CLIP_INVERTED : 32 + KEYICON_CLIP;
printFormattedString(2 * 36 + 18, 0, "%c", iconId);
 
iconId = (page_ == PAGE_FX) ? 32 + KEYICON_FX_INVERTED : 32 + KEYICON_FX;
printFormattedString(3 * 36 + 18, 0, "%c", iconId);
 
iconId = (page_ == PAGE_NOTES) ? 32 + KEYICON_NOTES_INVERTED : 32 + KEYICON_NOTES;
printFormattedString(4 * 36 + 18, 0, "%c", iconId);
 
 
iconId = (page_ == PAGE_DISK) ? 32 + KEYICON_DISK_INVERTED : 32 + KEYICON_DISK;
printFormattedString(0 * 36, 32, "%c", iconId);
 
iconId = (page_ == PAGE_METRONOME) ? 32 + KEYICON_METRONOME_INVERTED : 32 + KEYICON_METRONOME;
printFormattedString(1 * 36, 32, "%c", iconId);
 
iconId = (page_ == PAGE_MUTE) ? 32 + KEYICON_MUTE_INVERTED : 32 + KEYICON_MUTE;
printFormattedString(2 * 36, 32, "%c", iconId);
 
iconId = 32 + KEYICON_MENU_INVERTED;
printFormattedString(3 * 36, 32, "%c", iconId);
 
iconId = (page_ == PAGE_TRACK) ? 32 + KEYICON_TRACK_INVERTED : 32 + KEYICON_TRACK;
printFormattedString(4 * 36, 32, "%c", iconId);
 
iconId = (page_ == PAGE_ROUTER) ? 32 + KEYICON_ROUTER_INVERTED : 32 + KEYICON_ROUTER;
printFormattedString(5 * 36, 32, "%c", iconId);
 
iconId = (page_ == PAGE_SETUP) ? 32 + KEYICON_SETUP_INVERTED : 32 + KEYICON_SETUP;
printFormattedString(6 * 36, 32, "%c", iconId);
 
setFontBold();
}
else if (screenShowVoxel_)
{
voxelFrame();
}
else
{
// Display page content...
switch (page_)
{
case PAGE_TRACK:
displayPageTrack();
case PAGE_MUTE:
displayPageMute();
break;
 
case PAGE_EDIT:
case PAGE_CLIP:
displayPageEdit();
break;
 
856,7 → 979,7
displayPageNotes();
break;
 
case PAGE_MIDI:
case PAGE_TRACK:
displayPageMidi();
break;
 
864,7 → 987,7
displayPageDisk();
break;
 
case PAGE_BPM:
case PAGE_TEMPO:
displayPageBpm();
break;
}
955,7 → 1078,7
if (x < 32)
{ // half screen pattern
 
if (x || 4 == 0 || y || 4 == 0)
if ((x | 4) == 0 || (y | 4) == 0)
{
APP_LCD_Data(y & 0x0f);
APP_LCD_Data(0);
/trunk/apps/sequencers/LoopA/loopa.h
1,5 → 1,5
// MBLoopa Core Logic
// (c) Hawkeye 2015, 2017
// LoopA Core Logic
// (c) Hawkeye 2015-2018
 
#define DEBUG_MSG MIOS32_MIDI_SendDebugMessage
 
14,24 → 14,64
#define PAGES 6
enum LoopaPage
{
PAGE_MUTE,
PAGE_CLIP,
PAGE_NOTES,
PAGE_TRACK,
PAGE_EDIT,
PAGE_NOTES,
PAGE_MIDI,
PAGE_DISK,
PAGE_BPM
PAGE_TEMPO,
PAGE_FX,
PAGE_METRONOME,
PAGE_ROUTER,
PAGE_SETUP
};
 
enum Command
{
COMMAND_NONE,
COMMAND_CLIPLEN, COMMAND_QUANTIZE, COMMAND_TRANSPOSE, COMMAND_SCROLL, COMMAND_STRETCH, COMMAND_CLEAR, // PAGE_EDIT
COMMAND_CLIPLEN, COMMAND_QUANTIZE, COMMAND_TRANSPOSE, COMMAND_SCROLL, COMMAND_STRETCH, COMMAND_CLEAR, // PAGE_CLIP
COMMAND_POSITION, COMMAND_NOTE, COMMAND_VELOCITY, COMMAND_LENGTH, COMMAND_DELETENOTE, // PAGE_NOTES
COMMAND_PORT, COMMAND_CHANNEL, // PAGE_MIDI
COMMAND_SAVE, COMMAND_LOAD, COMMAND_NEW, // PAGE_DISK
COMMAND_BPM, COMMAND_BPMFLASH // PAGE_BPM
COMMAND_BPM, COMMAND_BPMFLASH // PAGE_TEMPO
};
 
enum KeyIcon
{
KEYICON_MENU_INVERTED,
KEYICON_MENU,
KEYICON_MUTE_INVERTED,
KEYICON_MUTE,
KEYICON_CLIP_INVERTED,
KEYICON_CLIP,
KEYICON_FX_INVERTED,
KEYICON_FX,
KEYICON_TRACK_INVERTED,
KEYICON_TRACK,
KEYICON_NOTES_INVERTED,
KEYICON_NOTES,
KEYICON_DISK_INVERTED,
KEYICON_DISK,
KEYICON_METRONOME_INVERTED,
KEYICON_METRONOME,
KEYICON_TEMPO_INVERTED,
KEYICON_TEMPO,
KEYICON_ROUTER_INVERTED,
KEYICON_ROUTER,
KEYICON_SETUP_INVERTED,
KEYICON_SETUP,
KEYICON_SHIFT_INVERTED,
KEYICON_SHIFT,
KEYICON_HELP_INVERTED,
KEYICON_HELP,
KEYICON_ABOUT_INVERTED,
KEYICON_ABOUT,
KEYICON_DISPLAY_INVERTED,
KEYICON_DISPLAY,
KEYICON_MIDIMONITOR_INVERTED,
KEYICON_MIDIMONITOR
};
 
// --- Data structures ---
 
typedef struct
115,6 → 155,9
// A buttonpress has occured
void loopaButtonPressed(s32 pin);
 
// A button release has occured
void loopaButtonReleased(s32 pin);
 
// An encoder has been turned
void loopaEncoderTurned(s32 encoder, s32 incrementer);
 
/trunk/apps/sequencers/LoopA/app.c
111,7 → 111,7
MIOS32_BOARD_LED_Init(0xffffffff); // initialize all LEDs
 
MIOS32_MIDI_SendDebugMessage("=============================================================");
MIOS32_MIDI_SendDebugMessage("Starting MBLoopa");
MIOS32_MIDI_SendDebugMessage("Starting LoopA");
 
// enable MSD by default (has to be enabled in SHIFT menu)
msd_state = MSD_DISABLED;
179,9 → 179,9
MIOS32_ENC_ConfigSet(enc_data_id, enc_config);
 
// start tasks
xTaskCreate(TASK_Period_1mS, (signed portCHAR *)"1mS", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_PERIOD_1mS, NULL);
xTaskCreate(TASK_Period_1mS_LP, (signed portCHAR *)"1mS_LP", 2*configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_PERIOD_1mS_LP, NULL);
xTaskCreate(TASK_Period_1mS_SD, (signed portCHAR *)"1mS_SD", 2*configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_PERIOD_1mS_SD, NULL);
xTaskCreate(TASK_Period_1mS, (const char * const)"1mS", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_PERIOD_1mS, NULL);
xTaskCreate(TASK_Period_1mS_LP, (const char * const)"1mS_LP", 2*configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_PERIOD_1mS_LP, NULL);
xTaskCreate(TASK_Period_1mS_SD, (const char * const)"1mS_SD", 2*configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_PERIOD_1mS_SD, NULL);
 
loopaStartup();
}
277,6 → 277,8
 
if (pin_value == 0)
loopaButtonPressed(pin);
else
loopaButtonReleased(pin);
}
 
 
/trunk/apps/sequencers/LoopA/convPNM.C
New file
0,0 → 1,63
// C++ font converter by Hawkeye
// Convert a PNM of 8-bit greyscale image data (0x00-0xff min->max brightness)
// into a 2 pixel-per-byte data structure, that can be directly included in the project
 
#include <iostream>
#include <fstream>
 
const char* resname = "icons";
 
using namespace std;
int main(int argc, char* argv[])
{
ifstream ifs(argv[1]);
 
string version;
getline(ifs, version);
 
bool greymap = (version == "P5");
 
string widthStr;
getline(ifs, widthStr, ' ');
int width = stoi(widthStr);
 
string heightStr;
getline(ifs, heightStr);
int height = stoi(heightStr);
 
string maxBrightness;
getline(ifs, maxBrightness);
 
//cout << width << " x " << height << "px" << endl;
//cout << maxBrightness << endl;
 
// 4 bit 2pixels per byte output
// map color from 0x00 - 0xff to a 0-15 range (>> 4), read in two bytes at once and calculate output byte
 
cout << "const u16 " << resname << "_width=" << width << ";" << endl;
cout << "const u16 " << resname << "_height=" << height << ";" << endl;
cout << "const u8 " << resname << "_pixdata[]={";
 
bool comma = false;
 
for (int y=0; y<height; y++)
{
for (int x=0; x < width; x+=2)
{
unsigned char first = ifs.get(); // red, 1st pixel
if (!greymap) ifs.get(); // drop green
if (!greymap) ifs.get(); // drop blue
unsigned char second = ifs.get(); // red, 2nd pixel
if (!greymap) ifs.get(); // drop green
if (!greymap) ifs.get(); // drop blue
unsigned out = (first & 0xf0) + (second >> 4);
 
if (comma)
cout << ",";
comma = true;
 
cout << out;
}
}
cout << "};" << endl;
}
/trunk/apps/sequencers/LoopA/gfx_resources.h
17,3 → 17,12
const u16 digitstiny_width=96;
const u16 digitstiny_height=7;
const u8 digitstiny_pixdata[]={0,0,0,6,255,96,2,189,0,9,255,96,9,255,144,0,13,240,4,255,244,0,109,242,15,255,249,2,223,210,2,223,210,0,0,255,255,0,0,0,15,64,4,240,0,0,0,0,0,0,0,15,68,240,15,189,0,13,6,240,0,2,242,0,189,240,4,176,0,4,246,0,0,0,210,11,144,153,11,144,185,0,15,68,68,240,0,0,15,64,4,240,0,0,0,0,0,0,0,77,0,212,0,77,0,0,4,208,0,2,240,6,212,240,6,176,0,13,96,0,0,6,144,9,208,214,13,96,107,0,15,64,4,240,0,0,15,64,4,240,0,0,79,0,0,0,0,109,153,214,0,77,0,0,45,32,0,191,176,15,100,240,6,255,144,15,255,210,0,15,32,2,255,210,4,255,251,0,15,64,4,240,0,0,15,64,4,240,0,0,0,0,0,0,0,77,0,212,0,77,0,2,210,0,0,2,214,79,255,253,0,2,214,15,32,214,0,107,0,9,96,155,0,0,185,0,15,64,4,240,0,0,15,64,4,240,0,0,0,0,0,0,0,15,68,240,0,77,0,11,64,0,0,0,214,0,4,240,0,0,214,13,96,214,0,182,0,13,144,155,0,11,242,0,15,68,68,240,0,0,15,64,4,240,0,0,79,0,0,0,0,6,255,96,11,255,244,15,255,244,13,255,176,0,4,240,13,255,176,4,255,208,0,212,0,4,255,244,6,253,64,0,0,255,255,0,0,0,15,64,4,240,0,0,0,0,142,176,0,0,190,176,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
const u16 keyicons_width=1200;
const u16 keyicons_height=32;
const u8 keyicons_pixdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,41,222,238,238,238,238,238,238,238,238,237,146,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,243,0,63,48,3,243,0,63,255,255,255,242,0,9,128,0,0,0,8,255,144,143,249,8,255,144,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,251,175,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,2,32,0,0,0,0,0,0,8,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,255,255,255,255,255,0,0,0,0,255,255,255,255,255,249,0,13,48,0,0,0,0,0,255,255,255,255,0,0,0,0,0,3,208,0,159,255,255,255,255,255,255,255,255,255,255,255,255,255,255,249,0,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,0,159,255,255,255,80,0,0,0,0,0,0,5,255,255,255,249,0,13,48,0,0,0,109,255,255,255,255,255,255,214,0,0,0,3,208,0,159,255,255,255,255,255,255,48,3,255,255,255,255,255,255,249,0,13,48,0,0,0,0,0,0,143,249,0,0,0,0,0,0,3,208,0,159,255,255,255,240,0,15,0,0,240,0,15,255,255,255,249,0,13,48,0,0,0,15,255,240,255,255,15,255,240,0,0,0,3,208,0,159,255,255,255,48,0,0,3,241,3,243,3,255,255,255,249,0,13,48,0,0,0,143,255,255,249,12,249,8,249,0,0,0,3,208,0,159,255,255,255,255,255,16,0,3,127,255,255,255,255,255,249,0,13,48,0,0,0,0,0,207,255,200,64,0,0,0,0,0,3,208,0,159,255,255,255,255,240,0,0,0,0,255,255,255,255,255,249,0,13,48,0,0,0,0,12,255,255,255,252,0,0,0,0,0,3,208,0,159,255,255,255,255,255,252,1,32,191,255,255,255,255,255,249,0,13,48,0,0,0,0,0,1,202,157,32,0,0,0,0,0,3,208,0,159,255,255,255,48,0,0,175,160,0,0,3,255,255,255,249,0,13,48,0,0,0,143,255,252,32,44,255,255,249,0,0,0,3,208,0,159,255,255,255,255,255,255,80,0,95,255,255,255,255,255,249,0,13,48,0,0,0,0,0,0,109,253,96,0,0,0,0,0,3,208,0,159,255,255,255,255,255,255,160,175,255,255,255,255,255,255,249,0,13,48,0,0,0,0,0,0,44,32,0,0,0,0,0,0,3,208,0,159,255,255,255,255,255,255,64,4,255,255,255,255,255,255,249,0,13,48,0,0,0,0,0,0,127,247,0,0,0,0,0,0,3,208,0,159,255,255,255,255,255,246,121,0,79,255,255,255,255,255,249,0,13,48,0,0,0,0,0,6,67,253,112,0,0,0,0,0,3,208,0,159,255,255,255,255,255,250,0,0,175,255,255,255,255,255,249,0,13,48,0,0,0,0,0,2,207,252,32,0,0,0,0,0,3,208,0,159,255,255,255,255,255,255,193,39,255,255,255,255,255,255,249,0,13,48,0,0,0,0,0,0,43,148,0,0,0,0,0,0,3,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,240,0,223,255,255,255,243,255,255,255,255,255,255,63,255,255,255,253,0,15,16,0,0,0,8,0,0,0,0,0,0,128,0,0,0,1,240,0,223,255,255,245,7,238,238,238,238,238,238,112,95,255,255,253,0,15,16,0,0,6,228,17,17,17,17,17,17,78,96,0,0,1,240,0,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,240,0,223,255,255,255,240,236,15,14,192,240,236,15,255,255,255,253,0,15,16,0,0,0,15,17,240,241,31,15,17,240,0,0,0,1,240,0,223,255,255,255,255,255,255,255,240,255,255,255,255,255,255,253,0,15,16,0,0,0,0,0,0,0,15,0,0,0,0,0,0,1,240,0,223,255,255,255,255,255,15,243,55,7,255,255,255,255,255,253,0,15,16,0,0,0,0,0,240,9,148,244,0,0,0,0,0,1,240,0,223,255,255,255,255,244,15,255,255,4,255,255,255,255,255,253,0,15,16,0,0,0,0,7,192,0,0,199,0,0,0,0,0,1,240,0,223,255,255,255,255,255,69,2,48,97,255,255,255,255,255,253,0,15,16,0,0,0,0,0,118,217,141,106,0,0,0,0,0,1,240,0,223,255,255,255,255,255,244,14,4,255,255,255,255,255,255,253,0,15,16,0,0,0,0,0,7,192,199,0,0,0,0,0,0,1,240,0,223,255,255,255,255,255,245,8,232,5,255,255,255,255,255,253,0,15,16,0,0,0,0,0,6,228,20,230,0,0,0,0,0,1,240,0,223,255,255,255,255,255,255,1,15,255,255,255,255,255,255,253,0,15,16,0,0,0,0,0,0,203,192,0,0,0,0,0,0,1,240,0,223,255,255,255,255,255,255,175,160,255,255,255,255,255,255,253,0,15,16,0,0,0,0,0,0,48,61,0,0,0,0,0,0,1,240,0,223,255,255,255,255,255,176,7,7,5,255,255,255,255,255,253,0,15,16,0,0,0,0,0,44,228,244,231,0,0,0,0,0,1,240,0,223,255,255,255,255,255,240,79,244,15,255,255,255,255,255,253,0,15,16,0,0,0,0,0,12,112,7,192,0,0,0,0,0,1,240,0,223,255,255,255,255,250,17,146,69,33,127,255,255,255,255,253,0,15,16,0,0,0,0,2,187,57,118,155,80,0,0,0,0,1,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,240,255,255,255,255,255,255,15,255,255,255,255,0,15,16,0,0,0,15,0,0,0,0,0,0,240,0,0,0,0,240,0,239,255,255,240,127,255,255,255,255,255,255,247,15,255,255,255,0,15,16,0,0,13,64,0,0,0,0,0,0,4,208,0,0,0,240,0,239,255,255,255,255,243,0,63,243,0,63,255,255,255,255,255,0,15,16,0,0,0,0,8,255,144,8,255,144,0,0,0,0,0,240,0,239,255,255,255,240,254,15,15,224,240,254,15,255,255,255,255,0,15,16,0,0,0,15,1,240,240,31,15,1,240,0,0,0,0,240,0,239,255,255,255,48,0,0,3,240,243,0,3,255,255,255,255,0,15,16,0,0,0,143,255,255,249,15,8,255,249,0,0,0,0,240,0,239,255,255,255,255,255,15,255,255,113,255,255,255,255,255,255,0,15,16,0,0,0,0,0,240,0,0,76,0,0,0,0,0,0,240,0,239,255,255,255,255,255,4,255,244,15,255,255,255,255,255,255,0,15,16,0,0,0,0,0,199,0,7,192,0,0,0,0,0,0,240,0,239,255,255,255,255,253,0,255,255,16,175,255,255,255,255,255,0,15,16,0,0,0,0,1,253,0,0,191,32,0,0,0,0,0,240,0,239,255,255,255,255,255,255,1,15,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,203,192,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,240,143,255,128,255,255,255,255,255,255,0,15,16,0,0,0,0,0,13,64,0,77,0,0,0,0,0,0,240,0,239,255,255,255,255,255,244,14,4,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,7,192,199,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,115,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,88,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,98,24,15,33,255,255,255,255,255,255,0,15,16,0,0,0,0,0,89,164,240,155,0,0,0,0,0,0,240,0,239,255,255,255,255,255,64,255,255,4,255,255,255,255,255,255,0,15,16,0,0,0,0,0,124,0,0,199,0,0,0,0,0,0,240,0,239,255,255,255,255,244,132,151,94,29,31,255,255,255,255,255,0,15,16,0,0,0,0,7,71,52,96,161,160,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,0,0,0,0,255,255,255,255,255,255,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,240,0,239,255,255,255,240,255,255,255,255,255,255,15,255,255,255,255,0,15,16,0,0,0,15,0,0,0,0,0,0,240,0,0,0,0,240,0,239,255,255,240,239,255,255,255,255,255,255,254,15,255,255,255,0,15,16,0,0,15,16,0,0,0,0,0,0,1,240,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,240,254,15,15,224,240,254,15,255,255,255,255,0,15,16,0,0,0,15,1,240,240,31,15,1,240,0,0,0,0,240,0,239,255,255,255,255,255,255,255,240,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,15,243,63,240,255,255,255,255,255,255,0,15,16,0,0,0,0,0,240,8,144,15,0,0,0,0,0,0,240,0,239,255,255,255,255,255,160,175,160,175,255,255,255,255,255,255,0,15,16,0,0,0,0,0,47,32,47,32,0,0,0,0,0,0,240,0,239,255,255,255,255,247,106,127,255,230,63,255,255,255,255,255,0,15,16,0,0,0,0,5,82,80,0,22,128,0,0,0,0,0,240,0,239,255,255,255,255,255,255,112,127,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,95,80,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,240,239,255,224,255,255,255,255,255,255,0,15,16,0,0,0,0,0,15,16,0,31,0,0,0,0,0,0,240,0,239,255,255,255,255,255,160,175,160,175,255,255,255,255,255,255,0,15,16,0,0,0,0,0,47,32,47,32,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,248,31,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,4,160,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,113,7,15,18,255,255,255,255,255,255,0,15,16,0,0,0,0,0,74,213,240,186,0,0,0,0,0,0,240,0,239,255,255,255,255,250,10,255,255,160,175,255,255,255,255,255,0,15,16,0,0,0,0,2,242,0,0,47,32,0,0,0,0,0,240,0,239,255,255,255,255,252,18,255,255,65,159,255,255,255,255,255,0,15,16,0,0,0,0,1,169,0,0,123,48,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,243,255,255,255,255,255,255,63,255,255,255,255,0,15,16,0,0,0,9,0,0,0,0,0,0,144,0,0,0,0,240,0,239,255,255,240,127,255,255,255,255,255,255,247,15,255,255,255,0,15,16,0,0,13,64,0,0,0,0,0,0,4,208,0,0,0,240,0,239,255,255,255,48,3,255,255,255,255,48,3,255,255,255,255,0,15,16,0,0,0,143,249,0,0,0,0,143,249,0,0,0,0,240,0,239,255,255,255,240,254,15,15,224,240,254,15,255,255,255,255,0,15,16,0,0,0,15,1,240,240,31,15,1,240,0,0,0,0,240,0,239,255,255,255,48,0,63,16,0,243,0,3,255,255,255,255,0,15,16,0,0,0,143,255,144,207,255,8,255,249,0,0,0,0,240,0,239,255,255,255,255,255,15,243,63,240,255,255,255,255,255,255,0,15,16,0,0,0,0,0,240,8,144,15,0,0,0,0,0,0,240,0,239,255,255,255,255,255,244,14,4,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,7,192,199,0,0,0,0,0,0,0,240,0,239,255,255,255,255,240,15,32,127,241,15,255,255,255,255,255,0,15,16,0,0,0,0,12,240,172,64,12,240,0,0,0,0,0,240,0,239,255,255,255,255,255,255,1,15,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,203,192,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,240,143,255,128,255,255,255,255,255,255,0,15,16,0,0,0,0,0,13,64,0,77,0,0,0,0,0,0,240,0,239,255,255,255,255,255,4,255,244,15,255,255,255,255,255,255,0,15,16,0,0,0,0,0,199,0,7,192,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,241,175,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,11,48,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,240,16,0,11,255,255,255,255,255,255,0,15,16,0,0,0,0,0,12,191,252,226,0,0,0,0,0,0,240,0,239,255,255,255,255,240,79,255,255,244,15,255,255,255,255,255,0,15,16,0,0,0,0,12,112,0,0,7,192,0,0,0,0,0,240,0,239,255,255,255,255,129,127,255,255,249,21,255,255,255,255,255,0,15,16,0,0,0,0,75,80,0,0,3,166,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,245,7,239,255,255,255,255,254,112,95,255,255,255,0,15,16,0,0,6,228,0,0,0,0,0,0,78,96,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,240,254,15,15,224,240,254,15,255,255,255,255,0,15,16,0,0,0,15,1,240,240,31,15,1,240,0,0,0,0,240,0,239,255,255,255,255,255,255,15,240,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,240,15,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,15,255,255,240,255,255,255,255,255,255,0,15,16,0,0,0,0,0,240,0,0,15,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,1,15,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,203,192,0,0,0,0,0,0,0,240,0,239,255,255,255,255,250,191,192,10,252,159,255,255,255,255,255,0,15,16,0,0,0,0,2,32,47,243,2,48,0,0,0,0,0,240,0,239,255,255,255,255,255,244,14,4,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,7,192,199,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,245,8,232,5,255,255,255,255,255,255,0,15,16,0,0,0,0,0,6,228,20,230,0,0,0,0,0,0,240,0,239,255,255,255,255,244,15,255,255,4,255,255,255,255,255,255,0,15,16,0,0,0,0,7,192,0,0,199,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,254,48,7,239,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,141,245,0,0,0,0,0,0,0,240,0,239,255,255,255,255,64,255,255,255,255,4,255,255,255,255,255,0,15,16,0,0,0,0,124,0,0,0,0,199,0,0,0,0,0,240,0,239,255,255,255,255,30,31,255,255,241,225,255,255,255,255,255,0,15,16,0,0,0,0,176,176,0,0,10,11,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,0,0,0,0,255,255,255,255,255,255,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,240,0,239,255,255,255,243,0,63,48,3,243,0,63,255,255,255,255,0,15,16,0,0,0,8,255,144,143,249,8,255,144,0,0,0,0,240,0,239,255,255,255,80,0,0,0,0,0,0,5,255,255,255,255,0,15,16,0,0,0,109,255,255,255,255,255,255,214,0,0,0,0,240,0,239,255,243,0,63,255,255,255,255,255,255,243,0,63,255,255,0,15,16,0,8,255,144,0,0,0,0,0,0,8,255,144,0,0,240,0,239,255,255,255,240,0,15,0,0,240,0,15,255,255,255,255,0,15,16,0,0,0,15,255,240,255,255,15,255,240,0,0,0,0,240,0,239,255,255,255,48,0,63,0,0,243,0,3,255,255,255,255,0,15,16,0,0,0,143,255,144,207,252,8,255,249,0,0,0,0,240,0,239,255,255,255,255,255,0,0,0,0,255,255,255,255,255,255,0,15,16,0,0,0,0,0,207,255,255,252,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,160,175,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,44,32,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,242,14,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,9,192,0,0,0,0,0,0,0,240,0,239,255,255,255,48,0,0,175,160,0,0,3,255,255,255,255,0,15,16,0,0,0,143,255,252,32,44,255,255,249,0,0,0,0,240,0,239,255,255,255,255,255,255,80,0,95,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,109,253,96,0,0,0,0,0,0,240,0,239,255,255,255,255,240,0,0,0,0,255,255,255,255,255,255,0,15,16,0,0,0,0,12,255,255,255,252,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,240,95,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,13,96,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,248,15,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,4,240,0,0,0,0,0,0,0,240,0,239,255,255,255,255,0,0,0,0,0,0,255,255,255,255,255,0,15,16,0,0,0,0,207,255,255,255,255,252,0,0,0,0,0,240,0,239,255,255,255,255,65,63,255,255,245,18,255,255,255,255,255,0,15,16,0,0,0,0,123,144,0,0,6,186,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,254,175,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,35,255,240,95,0,1,240,143,241,242,143,242,143,255,0,15,16,0,152,0,12,96,255,251,15,64,11,9,64,9,64,0,240,0,239,255,192,207,247,15,40,255,40,0,0,8,0,4,255,255,0,15,16,0,46,32,5,208,148,0,148,255,255,212,255,247,0,0,240,0,239,255,255,255,160,0,84,143,252,31,16,0,223,255,255,255,0,15,16,0,0,0,60,255,103,64,2,176,191,252,16,0,0,0,240,0,239,255,255,255,255,248,0,4,10,240,63,255,255,255,255,255,0,15,16,0,0,0,0,4,255,247,227,12,128,0,0,0,0,0,240,0,239,16,0,12,0,2,255,242,95,255,48,0,241,253,24,255,0,15,16,191,255,242,255,249,0,9,96,0,143,253,11,1,164,0,240,0,239,128,207,194,253,16,1,209,0,0,192,0,28,0,8,255,0,15,16,77,32,41,1,191,251,27,255,255,47,255,178,207,244,0,240,0,239,255,255,240,0,29,242,143,16,4,241,253,24,255,255,255,0,15,16,0,0,15,255,161,9,64,191,247,11,1,164,0,0,0,240,0,236,12,255,112,244,0,8,0,0,33,0,13,250,0,3,255,0,15,18,226,0,93,7,255,244,255,255,155,255,193,3,207,248,0,240,0,224,0,0,128,0,76,12,255,112,244,0,10,245,0,5,255,0,15,31,255,253,79,255,114,226,0,93,7,255,211,6,239,230,0,240,0,239,64,0,175,160,0,63,193,255,193,16,0,12,0,1,255,0,15,16,127,253,48,60,255,128,43,0,43,191,255,242,255,251,0,240,0,239,248,0,13,64,0,128,0,2,15,255,15,64,0,175,255,0,15,16,4,239,225,127,255,79,255,249,208,0,208,127,253,48,0,240,0,239,255,241,0,79,31,255,31,15,64,0,64,0,5,255,255,0,15,16,0,11,255,112,176,0,176,208,127,255,127,255,246,0,0,240,0,239,255,255,31,255,31,64,0,132,143,255,0,2,255,255,255,0,15,16,0,0,176,0,176,127,255,71,64,0,255,249,0,0,0,240,0,239,245,47,248,0,4,255,48,0,175,40,255,40,0,0,47,0,15,16,6,144,4,255,247,0,143,252,48,148,0,148,255,255,144,240,0,239,255,0,1,223,15,64,1,241,0,13,72,255,255,255,255,0,15,16,0,255,250,16,208,127,251,11,255,193,116,0,0,0,0,240,0,239,80,255,243,47,15,64,0,95,84,240,127,252,12,255,255,0,15,16,108,0,8,144,208,127,253,96,103,13,80,2,226,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,16,175,80,79,31,255,240,12,241,242,143,242,143,255,0,15,16,0,173,48,109,112,176,0,14,226,11,9,64,9,64,0,240,0,239,255,160,31,240,15,40,255,40,255,15,248,79,255,255,255,0,15,16,0,61,160,12,208,148,0,148,0,208,4,112,0,0,0,240,0,239,255,255,253,5,252,164,143,252,31,31,244,63,255,255,255,0,15,16,0,0,1,230,2,55,64,2,176,176,7,128,0,0,0,240,0,239,255,255,255,255,248,79,255,64,64,255,255,255,255,255,255,0,15,16,0,0,0,0,4,112,0,125,124,0,0,0,0,0,0,240,0,239,255,28,255,31,241,175,192,15,244,13,247,241,129,223,255,0,15,16,0,178,0,176,11,48,44,192,7,193,5,11,74,16,0,240,0,239,128,15,194,241,79,243,47,241,207,241,255,245,79,204,255,0,15,16,78,192,41,11,112,8,144,11,32,11,0,6,112,34,0,240,0,239,255,255,241,255,33,242,140,31,248,241,129,223,255,255,255,0,15,16,0,0,11,0,155,9,66,176,4,11,74,16,0,0,0,240,0,234,1,255,0,244,143,255,248,47,241,255,68,208,143,209,95,0,15,19,218,0,205,7,64,0,4,144,11,0,119,29,64,27,96,240,0,239,240,255,132,255,250,1,255,0,244,143,128,128,207,160,207,0,15,16,13,0,71,0,3,218,0,205,7,64,76,76,32,60,32,240,0,239,72,248,29,8,253,21,193,255,193,255,28,255,31,255,255,0,15,16,116,4,161,212,1,182,43,0,43,0,178,0,176,0,0,240,0,239,242,143,143,72,255,255,130,255,15,255,15,72,248,15,255,0,15,16,9,64,64,116,0,0,73,0,208,0,208,116,4,192,0,240,0,239,255,193,255,143,31,255,31,15,72,255,255,69,255,255,255,0,15,16,0,43,0,64,176,0,176,208,116,0,0,118,0,0,0,240,0,239,255,255,31,255,31,72,255,244,143,255,31,241,127,255,255,0,15,16,0,0,176,0,176,116,0,7,64,0,176,11,80,0,0,240,0,239,240,12,248,79,240,244,31,245,15,40,255,40,248,47,255,0,15,16,12,194,4,112,14,7,176,6,192,148,0,148,4,144,0,240,0,239,255,31,242,31,15,13,248,241,255,67,72,255,255,255,255,0,15,16,0,176,9,176,208,193,4,11,0,120,116,0,0,0,0,240,0,239,64,79,192,31,15,72,248,8,84,240,13,242,10,255,255,0,15,16,125,112,45,160,208,116,4,196,103,13,193,9,211,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,24,29,5,79,0,4,240,64,209,242,143,242,143,255,0,15,16,0,180,177,214,112,255,247,13,125,27,9,64,9,64,0,240,0,239,255,132,24,68,15,40,255,40,255,15,248,0,8,255,255,0,15,16,0,71,180,119,192,148,0,148,0,208,4,255,244,0,0,240,0,239,255,255,248,63,255,244,143,252,31,31,244,63,255,255,255,0,15,16,0,0,4,128,0,7,64,2,176,176,7,128,0,0,0,240,0,239,255,255,255,255,248,79,255,241,12,255,255,255,255,255,255,0,15,16,0,0,0,0,4,112,0,10,242,0,0,0,0,0,0,240,0,239,255,28,255,31,241,175,39,37,241,223,255,240,31,255,255,0,15,16,0,178,0,176,11,48,149,150,11,16,0,14,160,0,0,240,0,239,130,17,194,240,255,255,15,241,207,240,0,77,2,223,255,0,15,16,73,170,41,12,0,0,192,11,32,15,255,113,201,16,0,240,0,239,255,255,241,255,240,210,143,33,175,240,31,255,255,255,255,0,15,16,0,0,11,0,12,25,64,154,48,14,160,0,0,0,0,240,0,232,65,132,64,244,0,15,248,47,241,255,68,131,255,252,31,0,15,20,123,71,124,7,255,240,4,144,11,0,119,72,0,2,160,240,0,239,240,255,128,0,136,65,132,64,244,143,128,71,255,245,79,0,15,16,13,0,79,255,68,123,71,124,7,64,76,117,0,6,112,240,0,239,72,248,24,63,255,193,193,255,193,255,28,255,0,4,255,0,15,16,116,4,164,128,0,42,43,0,43,0,178,0,255,247,0,240,0,239,250,4,255,64,0,255,130,255,15,255,15,72,248,15,255,0,15,16,3,199,0,127,255,0,73,0,208,0,208,116,4,192,0,240,0,239,255,242,26,255,0,0,31,15,72,255,255,69,255,255,255,0,15,16,0,9,163,0,255,255,176,208,116,0,0,118,0,0,0,240,0,239,255,255,16,0,15,64,0,244,143,255,31,241,127,255,255,0,15,16,0,0,191,255,240,127,255,7,64,0,176,11,80,0,0,240,0,239,83,82,248,0,3,241,223,255,42,40,255,40,248,47,255,0,15,16,104,105,4,255,248,11,16,0,147,148,0,148,4,144,0,240,0,239,255,31,255,13,15,80,95,241,255,67,72,255,255,255,255,0,15,16,0,176,0,193,208,108,96,11,0,120,116,0,0,0,0,240,0,239,71,13,23,31,15,72,255,115,84,241,68,129,56,255,255,0,15,16,117,209,181,176,208,116,0,88,103,11,119,75,132,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,15,17,72,47,31,255,240,243,17,242,143,242,175,255,0,15,16,0,208,187,116,144,176,0,13,8,171,9,64,9,48,0,240,0,239,255,84,128,13,28,40,255,42,255,15,248,79,255,255,255,0,15,16,0,103,76,209,178,148,0,147,0,208,4,112,0,0,0,240,0,239,255,255,248,63,255,244,143,252,31,16,0,223,255,255,255,0,15,16,0,0,4,128,0,7,64,2,176,191,252,16,0,0,0,240,0,239,255,255,255,255,248,0,12,208,7,255,255,255,255,255,255,0,15,16,0,0,0,0,4,255,242,29,245,0,0,0,0,0,0,240,0,239,255,28,255,0,2,253,15,192,241,223,255,241,84,255,255,0,15,16,0,178,0,255,249,1,192,44,11,16,0,11,103,0,0,240,0,239,130,240,50,240,255,255,15,241,207,241,255,255,248,23,255,0,15,16,73,12,137,12,0,0,192,11,32,11,0,0,4,181,0,240,0,239,255,255,241,255,240,210,143,252,35,241,84,255,255,255,255,0,15,16,0,0,11,0,12,25,64,2,152,11,103,0,0,0,0,240,0,229,72,0,209,196,143,255,248,47,241,0,13,131,255,252,31,0,15,22,116,205,27,39,64,0,4,144,11,255,193,72,0,2,160,240,0,239,240,255,132,255,245,72,0,209,196,0,10,71,255,245,79,0,15,16,13,0,71,0,6,116,205,27,39,255,211,117,0,6,112,240,0,239,64,0,168,63,255,193,193,255,193,255,28,255,31,255,255,0,15,16,127,253,52,128,0,42,43,0,42,0,178,0,176,0,0,240,0,239,255,244,12,72,255,255,130,255,15,255,15,64,0,175,255,0,15,16,0,7,194,116,0,0,73,0,208,0,192,127,253,48,0,240,0,239,255,255,194,63,31,255,31,15,64,0,255,69,255,255,255,0,15,16,0,0,41,128,176,0,176,208,127,253,0,118,0,0,0,240,0,239,255,255,31,255,31,72,255,244,143,255,0,2,255,255,255,0,15,16,0,0,176,0,176,116,0,7,64,0,255,249,0,0,0,240,0,239,28,240,216,79,240,161,223,255,42,40,255,42,248,47,255,0,15,16,178,13,20,112,12,59,16,0,147,148,0,147,4,144,0,240,0,239,255,31,255,13,15,255,49,241,0,13,72,255,255,255,255,0,15,16,0,176,0,193,208,0,139,11,255,193,116,0,0,0,0,240,0,239,40,65,31,15,15,72,255,115,84,193,208,8,69,255,255,0,15,16,148,123,176,208,208,116,0,88,103,43,29,196,118,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,31,128,220,47,31,255,240,255,0,244,31,192,223,253,0,15,16,0,176,78,18,144,176,0,13,0,205,7,160,46,16,1,240,0,223,255,85,241,79,44,65,252,13,255,15,248,79,255,255,253,0,15,16,0,102,11,112,146,122,2,225,0,208,4,112,0,0,1,240,0,223,255,255,253,5,255,132,143,252,31,31,255,255,255,255,253,0,15,16,0,0,1,214,0,71,64,2,176,176,0,0,0,0,1,240,0,223,255,255,255,255,248,79,255,49,112,207,255,255,255,255,253,0,15,16,0,0,0,0,4,112,0,138,94,32,0,0,0,0,1,240,0,223,255,28,255,31,115,244,0,0,132,29,248,241,245,79,253,0,15,16,0,178,0,176,88,7,255,255,71,177,4,11,6,112,1,240,0,223,130,252,2,241,63,243,47,241,207,241,255,250,207,130,253,0,15,16,73,2,233,11,128,8,144,11,32,11,0,3,32,73,1,240,0,223,255,255,241,255,33,242,141,143,208,241,245,79,255,255,253,0,15,16,0,0,11,0,155,9,65,64,28,11,6,112,0,0,1,240,0,213,95,20,242,196,143,255,248,47,241,252,31,208,95,209,93,0,15,22,96,183,9,39,64,0,4,144,11,2,176,29,96,27,97,240,0,223,240,255,132,255,245,95,20,242,196,143,255,128,175,160,205,0,15,16,13,0,71,0,6,96,183,9,39,64,0,76,48,60,33,240,0,223,72,241,205,5,253,21,240,175,51,255,28,255,31,255,253,0,15,16,116,11,33,214,1,182,14,48,136,0,178,0,176,0,1,240,0,223,247,255,69,72,255,255,130,255,20,247,15,72,255,255,253,0,15,16,5,0,118,116,0,0,73,0,167,5,192,116,0,0,1,240,0,223,255,216,253,15,31,255,31,15,72,255,255,69,255,255,253,0,15,16,0,20,1,192,176,0,176,208,116,0,0,118,0,0,1,240,0,223,255,255,31,255,31,72,255,244,143,255,31,255,255,255,253,0,15,16,0,0,176,0,176,116,0,7,64,0,176,0,0,0,1,240,0,218,0,0,72,79,208,164,29,245,15,65,252,13,248,47,253,0,15,19,255,255,116,112,28,55,177,6,192,122,2,225,4,144,1,240,0,223,255,31,242,31,15,127,241,193,255,255,72,255,255,255,253,0,15,16,0,176,9,176,208,80,11,43,0,0,116,0,0,0,1,240,0,223,44,208,143,31,15,72,248,8,84,194,244,31,85,255,253,0,15,16,146,30,64,176,208,116,4,196,103,41,7,176,102,0,1,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,255,15,255,252,31,0,0,240,255,160,253,0,4,255,249,0,13,48,0,208,0,2,176,255,255,13,0,61,1,207,247,0,3,208,0,159,255,69,255,255,40,208,0,79,255,15,248,0,1,255,249,0,13,48,0,118,0,0,148,28,255,112,0,208,4,255,251,0,3,208,0,159,255,255,255,128,0,68,0,5,31,31,255,255,255,255,249,0,13,48,0,0,0,77,255,119,255,246,176,176,0,0,0,0,3,208,0,159,255,255,255,255,248,79,247,12,241,31,255,255,255,255,249,0,13,48,0,0,0,0,4,112,5,226,10,160,0,0,0,0,3,208,0,159,255,28,255,31,244,112,223,247,47,16,0,241,255,58,249,0,13,48,0,178,0,176,7,92,16,5,144,175,254,11,0,131,3,208,0,159,130,255,66,253,16,1,223,241,207,240,0,5,0,8,249,0,13,48,73,0,121,1,191,251,16,11,32,15,255,246,255,228,3,208,0,159,255,255,240,0,29,242,140,0,4,241,255,58,255,255,249,0,13,48,0,0,15,255,161,9,66,255,247,11,0,131,0,0,3,208,0,148,95,255,242,132,0,4,248,47,241,255,163,250,0,3,249,0,13,55,96,0,9,71,255,247,4,144,11,0,56,3,207,248,3,208,0,159,240,255,128,0,20,95,255,242,132,143,255,245,0,5,249,0,13,48,13,0,79,255,183,96,0,9,71,64,0,6,239,230,3,208,0,159,72,253,31,160,0,63,245,0,12,255,28,255,0,0,249,0,13,48,116,1,176,60,255,128,6,255,194,0,178,0,255,255,3,208,0,159,242,0,12,64,0,79,130,255,160,0,143,72,255,255,249,0,13,48,9,255,194,127,255,112,73,0,61,254,64,116,0,0,3,208,0,159,255,192,0,79,31,255,31,15,72,255,255,69,255,255,249,0,13,48,0,47,255,112,176,0,176,208,116,0,0,118,0,0,3,208,0,159,255,255,31,255,31,64,0,68,0,8,31,255,255,255,249,0,13,48,0,0,176,0,176,127,255,119,255,244,176,0,0,0,3,208,0,146,143,253,8,0,3,255,48,0,175,208,0,79,248,47,249,0,13,57,64,1,212,255,248,0,143,252,48,28,255,112,4,144,3,208,0,159,255,0,1,223,15,0,1,241,255,255,64,0,128,207,249,0,13,48,0,255,250,16,208,223,251,11,0,0,127,255,79,32,3,208,0,159,28,255,255,15,15,64,0,95,84,130,255,255,84,66,249,0,13,48,178,0,0,208,208,127,253,96,103,73,0,0,103,121,3,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,13,255,255,255,255,255,255,255,255,255,255,255,255,208,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,41,223,255,255,255,255,255,255,255,255,253,146,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
 
const u16 menutest_width=256;
const u16 menutest_height=64;
const u8 menutest_pixdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,13,48,0,0,0,8,255,144,143,249,8,255,144,0,0,0,3,208,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,1,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,240,15,16,0,0,0,109,255,255,255,255,255,255,214,0,0,0,1,240,15,16,0,0,0,0,0,0,143,249,0,0,0,0,0,0,1,240,15,16,0,0,0,0,0,0,255,255,0,0,0,0,0,0,1,240,15,16,0,0,0,0,0,0,143,249,0,0,0,0,0,0,1,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,8,0,0,0,0,0,0,128,0,0,0,0,240,15,16,0,0,6,228,17,17,17,17,17,17,78,96,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,241,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,15,0,0,0,0,0,0,240,0,0,0,0,240,15,16,0,0,13,64,0,0,0,0,0,0,4,208,0,0,0,240,15,16,0,0,0,0,8,255,144,8,255,144,0,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,8,255,144,8,255,144,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,240,15,16,0,0,0,15,0,0,0,0,0,0,240,0,0,0,0,240,15,16,0,0,15,16,0,0,0,0,0,0,1,240,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,9,0,0,0,0,0,0,144,0,0,0,0,240,15,16,0,0,13,64,0,0,0,0,0,0,4,208,0,0,0,240,15,16,0,0,0,143,249,0,0,0,0,143,249,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,143,249,0,0,0,0,143,249,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,6,228,0,0,0,0,0,0,78,96,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,240,15,16,0,0,0,8,255,144,143,249,8,255,144,0,0,0,0,240,15,16,0,0,0,109,255,255,255,255,255,255,214,0,0,0,0,240,15,16,0,8,255,144,0,0,0,0,0,0,8,255,144,0,0,240,15,16,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,240,15,16,0,8,255,144,0,0,0,0,0,0,8,255,144,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,152,0,12,96,255,251,15,64,11,9,64,9,64,0,240,15,16,0,46,32,5,208,148,0,148,255,255,212,255,247,0,0,240,15,16,0,0,0,60,255,103,64,2,176,191,252,16,0,0,0,240,15,16,0,0,0,0,4,255,247,227,12,128,0,0,0,0,0,240,15,16,191,255,242,255,249,0,9,96,0,143,253,11,1,164,0,240,15,16,0,0,0,0,4,255,247,227,12,128,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,173,48,109,112,176,0,14,226,11,9,64,9,64,0,240,15,16,0,61,160,12,208,148,0,148,0,208,4,112,0,0,0,240,15,16,0,0,1,230,2,55,64,2,176,176,7,128,0,0,0,240,15,16,0,0,0,0,4,112,0,125,124,0,0,0,0,0,0,240,15,16,0,178,0,176,11,48,44,192,7,193,5,11,74,16,0,240,15,16,0,0,0,0,4,112,0,125,124,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,180,177,214,112,255,247,13,125,27,9,64,9,64,0,240,15,16,0,71,180,119,192,148,0,148,0,208,4,255,244,0,0,240,15,16,0,0,4,128,0,7,64,2,176,176,7,128,0,0,0,240,15,16,0,0,0,0,4,112,0,10,242,0,0,0,0,0,0,240,15,16,0,178,0,176,11,48,149,150,11,16,0,14,160,0,0,240,15,16,0,0,0,0,4,112,0,10,242,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,0,208,187,116,144,176,0,13,8,171,9,64,9,48,1,240,15,16,0,103,76,209,178,148,0,147,0,208,4,112,0,0,1,240,15,16,0,0,4,128,0,7,64,2,176,191,252,16,0,0,1,240,15,16,0,0,0,0,4,255,242,29,245,0,0,0,0,0,1,240,15,16,0,178,0,255,249,1,192,44,11,16,0,11,103,0,1,240,15,16,0,0,0,0,4,255,242,29,245,0,0,0,0,0,1,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,48,0,176,78,18,144,176,0,13,0,205,7,160,46,16,3,208,13,48,0,102,11,112,146,122,2,225,0,208,4,112,0,0,3,208,13,48,0,0,1,214,0,71,64,2,176,176,0,0,0,0,3,208,13,48,0,0,0,0,4,112,0,138,94,32,0,0,0,0,3,208,13,48,0,178,0,176,88,7,255,255,71,177,4,11,6,112,3,208,13,48,0,0,0,0,4,112,0,138,94,32,0,0,0,0,3,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,128,0,208,0,2,176,255,255,13,0,61,1,207,247,0,8,144,9,128,0,118,0,0,148,28,255,112,0,208,4,255,251,0,8,144,9,128,0,0,0,77,255,119,255,246,176,176,0,0,0,0,8,144,9,128,0,0,0,0,4,112,5,226,10,160,0,0,0,0,8,144,9,128,0,178,0,176,7,92,16,5,144,175,254,11,0,131,8,144,9,128,0,0,0,0,4,112,5,226,10,160,0,0,0,0,8,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,146,0,0,0,0,0,0,0,0,0,0,41,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,81,124,238,238,238,238,238,238,238,238,238,238,199,21,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,175,131,17,17,17,17,17,17,17,17,17,17,56,250,0,0,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,3,78,255,255,255,255,255,255,255,255,255,255,255,255,228,48,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,84,255,255,255,255,255,255,255,255,255,255,255,255,255,255,69,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,30,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,0,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,9,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,144,0,0,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,13,48,0,0,0,8,255,144,143,249,8,255,144,0,0,0,3,208,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,2,207,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,32,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,13,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,208,0,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,1,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,240,15,16,0,0,0,109,255,255,255,255,255,255,214,0,0,0,1,240,0,239,255,255,255,255,255,255,112,6,255,255,255,255,255,255,254,0,15,16,0,0,0,0,0,0,255,255,0,0,0,0,0,0,1,240,15,16,0,0,0,0,0,0,143,249,0,0,0,0,0,0,1,240,15,16,0,0,0,0,0,0,255,255,0,0,0,0,0,0,1,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,8,0,0,0,0,0,0,128,0,0,0,0,240,15,16,0,0,6,228,17,17,17,17,17,17,78,96,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,241,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,241,31,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,15,0,0,0,0,0,0,240,0,0,0,0,240,15,16,0,0,13,64,0,0,0,0,0,0,4,208,0,0,0,240,0,239,255,255,255,255,247,0,111,247,0,111,255,255,255,255,255,0,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,8,255,144,8,255,144,0,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,240,15,16,0,0,0,15,0,0,0,0,0,0,240,0,0,0,0,240,15,16,0,0,15,16,0,0,0,0,0,0,1,240,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,9,0,0,0,0,0,0,144,0,0,0,0,240,15,16,0,0,13,64,0,0,0,0,0,0,4,208,0,0,0,240,0,239,255,255,255,112,6,255,255,255,255,112,6,255,255,255,255,0,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,143,249,0,0,0,0,143,249,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,6,228,0,0,0,0,0,0,78,96,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,240,31,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,240,15,16,0,0,0,8,255,144,143,249,8,255,144,0,0,0,0,240,15,16,0,0,0,109,255,255,255,255,255,255,214,0,0,0,0,240,0,239,255,247,0,111,255,255,255,255,255,255,247,0,111,255,255,0,15,16,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,240,15,16,0,8,255,144,0,0,0,0,0,0,8,255,144,0,0,240,15,16,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,15,16,0,152,0,12,96,255,251,15,64,11,9,64,9,64,0,240,15,16,0,46,32,5,208,148,0,148,255,255,212,255,247,0,0,240,15,16,0,0,0,60,255,103,64,2,176,191,252,16,0,0,0,240,0,239,255,255,255,255,251,0,8,28,243,127,255,255,255,255,255,0,15,16,191,255,242,255,249,0,9,96,0,143,253,11,1,164,0,240,15,16,0,0,0,0,4,255,247,227,12,128,0,0,0,0,0,240,15,16,191,255,242,255,249,0,9,96,0,143,253,11,1,164,0,240,0,0,15,16,0,173,48,109,112,176,0,14,226,11,9,64,9,64,0,240,15,16,0,61,160,12,208,148,0,148,0,208,4,112,0,0,0,240,15,16,0,0,1,230,2,55,64,2,176,176,7,128,0,0,0,240,0,239,255,255,255,255,251,143,255,130,131,255,255,255,255,255,255,0,15,16,0,178,0,176,11,48,44,192,7,193,5,11,74,16,0,240,15,16,0,0,0,0,4,112,0,125,124,0,0,0,0,0,0,240,15,16,0,178,0,176,11,48,44,192,7,193,5,11,74,16,0,240,0,0,15,16,0,180,177,214,112,255,247,13,125,27,9,64,9,64,0,240,15,16,0,71,180,119,192,148,0,148,0,208,4,255,244,0,0,240,15,16,0,0,4,128,0,7,64,2,176,176,7,128,0,0,0,240,0,239,255,255,255,255,251,143,255,245,13,255,255,255,255,255,255,0,15,16,0,178,0,176,11,48,149,150,11,16,0,14,160,0,0,240,15,16,0,0,0,0,4,112,0,10,242,0,0,0,0,0,0,240,15,16,0,178,0,176,11,48,149,150,11,16,0,14,160,0,0,240,0,0,15,16,0,208,187,116,144,176,0,13,8,171,9,64,9,48,1,240,15,16,0,103,76,209,178,148,0,147,0,208,4,112,0,0,1,240,15,16,0,0,4,128,0,7,64,2,176,191,252,16,0,0,1,240,0,239,255,255,255,255,251,0,13,226,10,255,255,255,255,255,254,0,15,16,0,178,0,255,249,1,192,44,11,16,0,11,103,0,1,240,15,16,0,0,0,0,4,255,242,29,245,0,0,0,0,0,1,240,15,16,0,178,0,255,249,1,192,44,11,16,0,11,103,0,1,240,0,0,13,48,0,176,78,18,144,176,0,13,0,205,7,160,46,16,3,208,13,48,0,102,11,112,146,122,2,225,0,208,4,112,0,0,3,208,13,48,0,0,1,214,0,71,64,2,176,176,0,0,0,0,3,208,2,207,255,255,255,255,251,143,255,117,161,223,255,255,255,255,252,32,13,48,0,178,0,176,88,7,255,255,71,177,4,11,6,112,3,208,13,48,0,0,0,0,4,112,0,138,94,32,0,0,0,0,3,208,13,48,0,178,0,176,88,7,255,255,71,177,4,11,6,112,3,208,0,0,9,128,0,208,0,2,176,255,255,13,0,61,1,207,247,0,8,144,9,128,0,118,0,0,148,28,255,112,0,208,4,255,251,0,8,144,9,128,0,0,0,77,255,119,255,246,176,176,0,0,0,0,8,144,9,127,255,255,255,255,251,143,250,29,245,95,255,255,255,255,247,144,9,128,0,178,0,176,7,92,16,5,144,175,254,11,0,131,8,144,9,128,0,0,0,0,4,112,5,226,10,160,0,0,0,0,8,144,9,128,0,178,0,176,7,92,16,5,144,175,254,11,0,131,8,144,0,0,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,30,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,3,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,48,0,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,84,255,255,255,255,255,255,255,255,255,255,255,255,255,255,69,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,3,78,255,255,255,255,255,255,255,255,255,255,255,255,228,48,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,12,177,0,0,0,0,0,0,0,0,0,0,0,0,27,192,0,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,81,124,239,255,255,255,255,255,255,255,255,254,199,21,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,175,131,16,0,0,0,0,0,0,0,0,1,56,250,0,0,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,146,0,0,0,0,0,0,0,0,0,0,41,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0,0,3,157,255,255,255,255,255,255,255,255,255,255,217,48,0,0,0};
/trunk/apps/sequencers/LoopA/attic/app_old.c
New file
0,0 → 1,381
// $Id: app.c 1223 2011-06-23 21:26:52Z tk $
/*
* Demo application for SSD1322 GLCD
*
* ==========================================================================
*
* Copyright (C) 2008 Thorsten Klose (tk@midibox.org)
* Licensed for personal non-commercial use only.
* All other rights reserved.
*
* ==========================================================================
*/
 
/////////////////////////////////////////////////////////////////////////////
// Include files
/////////////////////////////////////////////////////////////////////////////
 
#include <mios32.h>
#include "app.h"
 
#include <glcd_font.h>
#include <app_lcd.h>
 
 
/////////////////////////////////////////////////////////////////////////////
// This hook is called after startup to initialize the application
/////////////////////////////////////////////////////////////////////////////
void APP_Init(void)
{
MIOS32_BOARD_LED_Init(0xffffffff); // initialize all LEDs
MIOS32_MIDI_SendDebugMessage("Starting LoopA");
// Turn on LEDs for testing
int pin;
for (pin=0; pin<16; pin++)
MIOS32_DOUT_PinSet(pin, 1);
 
// Install two encoders (on shift register 1)
mios32_enc_config_t enc_config = MIOS32_ENC_ConfigGet(0);
enc_config.cfg.type = DETENTED3;
enc_config.cfg.sr = 1;
enc_config.cfg.pos = 0;
enc_config.cfg.speed = NORMAL;
enc_config.cfg.speed_par = 0;
MIOS32_ENC_ConfigSet(0, enc_config);
enc_config = MIOS32_ENC_ConfigGet(1);
enc_config.cfg.type = DETENTED3;
enc_config.cfg.sr = 1;
enc_config.cfg.pos = 2;
enc_config.cfg.speed = NORMAL;
enc_config.cfg.speed_par = 0;
MIOS32_ENC_ConfigSet(1, enc_config);
}
 
// -------------------------------------------------------------------------------------------
// Voxelspace demo by Hawkeye
 
u8 field[128][128]; // Heightfield [y][x]
u8 screen[64][128]; // Screen buffer [y][x]
 
 
// Limits a value to 0...255
//
int limit(int x)
{
return x < 0 ? 0 : (x > 255 ? 255 : x);
}
// -------------------------------------------------------------------------------------------
 
 
// Landscape/heightfield generator
//
void calcField(void)
{
int p, i, j, k, k2, p2;
 
field[0][0]=128;
 
// "Cloud" landscape generator
for (p = 256; p > 1; p = p2)
{
p2 = p >> 1;
k = p * 8 + 20;
k2 = k >> 1;
 
for (i = 0; i < 128; i += p)
{
for (j = 0; j < 128; j += p)
{
int a = field[i][j];
int b = field[(i + p) & 127][j];
int c = field[i][(j + p) & 127];
int d = field[(i + p) & 127][(j + p) & 127];
 
field[i][(j + p2) & 127] = limit(((a + c)>>1)+(rand() % k - k2));
field[(i + p2) & 127][(j + p2) & 127]= limit(((a + b + c + d)>>2)+(rand() % k - k2));
field[(i + p2) & 127][j]= limit(((a + b) >> 1)+(rand() % k - k2));
}
}
}
 
// Blur
for (k=0; k<1; k++)
for (i=1; i<127; i++)
for (j=1; j<127; j++)
{
u16 four = field[i-1][j] + field[i+1][j] + field[i][j-1] + field[i][j+1];
four = four >> 2;
field[i][j] = (field[i][j] + four) >> 1;
}
}
// -------------------------------------------------------------------------------------------
 
 
// Voxel space display demo
//
// Now renders full 256x64 @ >30fps
//
static int tempEncoderAccel = 0;
void runVoxel(void)
{
u16 y; // position
u16 i, j, k;
 
calcField();
 
// multiplication/division precalculated tables
u16 mult1dot5[64];
for (i = 0; i < 64; i++)
mult1dot5[i] = (u16)((float) i * 1.5);
 
 
// initial clear screen with "horizon"
for (j = 0; j < 64; j++)
for (i = 0; i < 128; i++)
screen[j][i] = j < 6 ? ((j << 4) + j) : 0;
 
// endless animation, if it needs to be stopped, poll here
while (1)
{
for (y = 30000; y >=1 ; y--)
{
u16 yfield;
y += tempEncoderAccel;
 
// Calculate screen buffer
for (j=0; j<30; j++) // Distance from screen plane
{
u16 distscaler = 38 - j;
u16 stdheight = 400 / distscaler;
u16 endy = mult1dot5[stdheight];
if (endy > 63) endy = 63;
 
yfield = j + y;
 
// "continuous scrolling" yfield accessor adjustment
yfield = yfield % 255;
if (yfield > 127)
yfield = 255-yfield;
 
for (i = 0; i < 128; i++)
{
// --- "Even" display pixel (0, 2, 4, 6, ...) ---
u16 xfield = (64 + (int)((((i<<1)-128)*distscaler)>>5)) & 127;
u8 h = field[yfield][xfield];
u8 height = h / distscaler; // Scale height to distance
u8 starty = mult1dot5[stdheight - height];
 
u8 col = h & 0xf0;
for (k = starty; k < endy; k++)
screen[k][i] = (screen[k][i] & 0x0f) + col;
 
// --- "Odd" display pixel (1, 3, 5, 7, ...) ---
xfield = (64 + (int)((((i<<1)-127)*distscaler)>>5)) & 127;
h = field[yfield][xfield];
 
height = h / distscaler; // Scale height to distance
starty = mult1dot5[stdheight - height];
 
col = h >> 4;
for (k = starty; k < endy; k++)
screen[k][i] = (screen[k][i] & 0xf0) + col;
}
}
 
// Push screen buffer
for (j = 0; j < 64; j++)
{
APP_LCD_Cmd(0x15);
APP_LCD_Data(0+0x1c);
 
APP_LCD_Cmd(0x75);
APP_LCD_Data(j);
 
APP_LCD_Cmd(0x5c);
 
u8 bgcol = j < 6 ? ((j << 4) + j) : 0;
for (i = 0; i < 128; i++)
{
APP_LCD_Data(screen[j][i]);
screen[j][i] = bgcol;
i++;
APP_LCD_Data(screen[j][i]);
screen[j][i] = bgcol;
}
}
}
}
}
// ----------------------------------------------------------------------------------------
 
 
// Render test screen, one half is "full on" for flicker tests
// one half contains a color gradient pattern
//
void testScreen()
{
u16 x = 0;
u16 y = 0;
 
for (y = 0; y < 64; y++)
{
APP_LCD_Cmd(0x15);
APP_LCD_Data(0x1c);
 
APP_LCD_Cmd(0x75);
APP_LCD_Data(y);
 
APP_LCD_Cmd(0x5c);
 
for (x = 0; x < 64; x++)
{
if (x < 32)
{ // half screen pattern
 
if (x || 4 == 0 || y || 4 == 0)
{
APP_LCD_Data(y & 0x0f);
APP_LCD_Data(0);
}
else
{
APP_LCD_Data(0x00);
APP_LCD_Data(0x00);
}
}
else // half screen "white"
{
APP_LCD_Data(0xff);
APP_LCD_Data(0xff);
}
}
}
 
while(1);
}
// -------------------------------------------------------------------------------------------
 
 
/////////////////////////////////////////////////////////////////////////////
// This task is running endless in background
/////////////////////////////////////////////////////////////////////////////
void APP_Background(void)
{
runVoxel();
 
// Alternative: "Test screen for parameter tuning"
// testScreen();
}
 
 
/////////////////////////////////////////////////////////////////////////////
// This hook is called when a MIDI package has been received
// Very useful for tuning display initialization parameters
// Note - only tune when no other activity is going on (parallel data writes)
// good when using static "testScreen()"
/////////////////////////////////////////////////////////////////////////////
void APP_MIDI_NotifyPackage(mios32_midi_port_t port, mios32_midi_package_t midi_package)
{
// For testing
if( midi_package.type == CC ) {
switch( midi_package.cc_number ) {
case 0x10:
APP_LCD_Cmd(0xb3); // Set_Display_Clock(0x91);
APP_LCD_Data((u8)midi_package.value/2);
break;
case 0x11:
APP_LCD_Cmd(0xca); // Set_Multiplex_Ratio(0x3F);
APP_LCD_Data((u8)midi_package.value/2);
case 0x12:
APP_LCD_Cmd(0xb1); // Set_Phase_Length(0xE2);
APP_LCD_Data((u8)midi_package.value/2);
break;
case 0x13:
APP_LCD_Cmd(0xbb); // Set_Precharge_Voltage(0x1F);
APP_LCD_Data((u8)midi_package.value*2);
break;
case 0x14:
APP_LCD_Cmd(0xb6); // Set_Precharge_Period(0x08);
APP_LCD_Data((u8)midi_package.value*2);
break;
case 0x15:
APP_LCD_Cmd(0xbe); // Set_VCOMH(0x07);
APP_LCD_Data((u8)midi_package.value*2);
break;
case 0x16:
APP_LCD_Cmd(0xc1); // Constrast Current
APP_LCD_Data(midi_package.value*2);
break;
}
}
}
 
 
/////////////////////////////////////////////////////////////////////////////
// This hook is called before the shift register chain is scanned
/////////////////////////////////////////////////////////////////////////////
void APP_SRIO_ServicePrepare(void)
{
}
 
 
/////////////////////////////////////////////////////////////////////////////
// This hook is called after the shift register chain has been scanned
/////////////////////////////////////////////////////////////////////////////
void APP_SRIO_ServiceFinish(void)
{
}
 
 
/////////////////////////////////////////////////////////////////////////////
// This hook is called when a button has been toggled
// pin_value is 1 when button released, and 0 when button pressed
/////////////////////////////////////////////////////////////////////////////
void APP_DIN_NotifyToggle(u32 pin, u32 pin_value)
{
MIOS32_MIDI_SendDebugMessage("PIN %d toggled - value %d", pin, pin_value);
calcField();
}
 
 
/////////////////////////////////////////////////////////////////////////////
// This hook is called when an encoder has been moved
// incrementer is positive when encoder has been turned clockwise, else
// it is negative
/////////////////////////////////////////////////////////////////////////////
void APP_ENC_NotifyChange(u32 encoder, s32 incrementer)
{
MIOS32_MIDI_SendDebugMessage("Encoder %d turned - increment %d", encoder, incrementer);
static int pin = 0;
if (encoder == 0)
{
pin+=incrementer;
pin%=16;
int i=0;
for (i=0; i<16; i++)
MIOS32_DOUT_PinSet(i, 0);
MIOS32_DOUT_PinSet(pin, 1);
}
if (encoder == 1)
tempEncoderAccel -= incrementer;
}
 
 
/////////////////////////////////////////////////////////////////////////////
// This hook is called when a pot has been moved
/////////////////////////////////////////////////////////////////////////////
void APP_AIN_NotifyChange(u32 pin, u32 pin_value)
{
}
 
 
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: apps/sequencers/LoopA/attic/app_old.h
===================================================================
--- apps/sequencers/LoopA/attic/app_old.h (revision 0)
+++ apps/sequencers/LoopA/attic/app_old.h (revision 2593)
@@ -0,0 +1,47 @@
+// $Id: app.h 1222 2011-06-23 21:12:04Z tk $
+/*
+ * Header file of application
+ *
+ * ==========================================================================
+ *
+ * Copyright (C) 2008 Thorsten Klose (tk@midibox.org)
+ * Licensed for personal non-commercial use only.
+ * All other rights reserved.
+ *
+ * ==========================================================================
+ */
+
+#ifndef _APP_H
+#define _APP_H
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Global definitions
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Global Types
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Prototypes
+/////////////////////////////////////////////////////////////////////////////
+
+extern void APP_Init(void);
+extern void APP_Background(void);
+extern void APP_MIDI_NotifyPackage(mios32_midi_port_t port, mios32_midi_package_t midi_package);
+extern void APP_SRIO_ServicePrepare(void);
+extern void APP_SRIO_ServiceFinish(void);
+extern void APP_DIN_NotifyToggle(u32 pin, u32 pin_value);
+extern void APP_ENC_NotifyChange(u32 encoder, s32 incrementer);
+extern void APP_AIN_NotifyChange(u32 pin, u32 pin_value);
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Export global variables
+/////////////////////////////////////////////////////////////////////////////
+
+
+#endif /* _APP_H */
Index: apps/sequencers/LoopA/commonIncludes.h
===================================================================
--- apps/sequencers/LoopA/commonIncludes.h (revision 0)
+++ apps/sequencers/LoopA/commonIncludes.h (revision 2593)
@@ -0,0 +1,20 @@
+//
+// Created by hawkeye on 9/26/18.
+//
+
+#ifndef LOOPA_COMMONINCLUDES_H
+#define LOOPA_COMMONINCLUDES_H
+
+#include "loopa_datatypes.h"
+
+#include <string.h>
+
+#include <mios32.h>
+#include <mios32_midi.h>
+#include <seq_bpm.h>
+#include <seq_midi_out.h>
+#include <midi_port.h>
+#include <midi_router.h>
+
+
+#endif //LOOPA_COMMONINCLUDES_H
Index: apps/sequencers/LoopA/screen.h
===================================================================
--- apps/sequencers/LoopA/screen.h (revision 2592)
+++ apps/sequencers/LoopA/screen.h (revision 2593)
@@ -4,9 +4,24 @@
extern u8 screen[64][128]; // Screen buffer [y][x]
-// If showLogo is true, draw the MBLoopa Logo (usually during unit startup)
+// If showLogo is true, draw the LoopA Logo (usually during unit startup)
void screenShowLoopaLogo(u8 showLogo);
+// If showShift is true, draw the shift key overlay
+void screenShowShift(u8 showShift);
+
+// return true, if we are currently showing the shift overlay
+u8 screenIsInShift();
+
+// If showMenu is true, draw the menu key overlay
+void screenShowMenu(u8 showMenu);
+
+// return true, if we are currently showing the menu
+u8 screenIsInMenu();
+
+// If showVoxel is true, draw the voxel screensaver
+void screenShowVoxel(u8 showVoxel);
+
// Set the currently selected clip
void screenSetClipSelected(u8 clipNumber);
/trunk/apps/sequencers/LoopA/CMakeLists.txt
1,4 → 1,30
cmake_minimum_required(VERSION 2.8.4)
project(loopa)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_custom_target(loopa ALL COMMAND cd /home/code/mios32/trunk/apps/sequencers/LoopA&&export MIOS32_PATH=/home/code/mios32/trunk&&export MIOS32_BIN_PATH=$MIOS_PATH/bin&&export MIOS32_FAMILY=STM32F4xx&&export MIOS32_PROCESSOR=STM32F407VG&&export MIOS32_BOARD=MBHP_CORE_STM32F4&&export MIOS32_LCD=universal&&export MIOS32_GCC_PREFIX=arm-none-eabi&&export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/local/stm32f4/bin&&gmake -j1&&cp project.hex /home/xfer&&echo done)
include_directories(/usr/include/c++/v1 /usr/lib/clang/6.0.1/include /usr/include)
add_custom_target(loopa ALL COMMAND cd /home/code/mios32/trunk/apps/sequencers/LoopA&&export MIOS32_PATH=/home/code/mios32/trunk&&export MIOS32_BIN_PATH=$MIOS_PATH/bin&&export MIOS32_FAMILY=STM32F4xx&&export MIOS32_PROCESSOR=STM32F407VG&&export MIOS32_BOARD=MBHP_CORE_STM32F4&&export MIOS32_LCD=universal&&export MIOS32_GCC_PREFIX=arm-none-eabi&&export BUILDENV_HAWKEYE=1&&export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/local/stm32f4/bin&&gmake -DBUILDENV_HAWKEYE -j1&&cp project.hex /home/xfer&&echo done)
 
add_executable(dummyForClionHeaders
convPNM.C
screen.c
app.c
app_lcd.c
loopa.c
seq.c
hardware.c
screen.c
terminal.c
voxelspace.c
)
 
target_include_directories(dummyForClionHeaders PUBLIC
/usr/include/c++/v1
/usr/lib/clang/6.0.1/include
/usr/include
/home/code/mios32/trunk/FreeRTOS/Source/include
/usr/home/code/mios32/trunk/include/mios32
/usr/home/code/mios32/trunk/modules/midi_router
/usr/home/code/mios32/trunk/modules/file
/home/code/mios32/trunk/modules/sequencer
)
 
/trunk/apps/sequencers/LoopA/hardware.c
1,4 → 1,4
#include <mios32.h>
#include "commonIncludes.h"
 
// --- LEDs ---
 
5,7 → 5,7
const u8 led_startstop = 127;
const u8 led_armrecord = 14;
 
const u8 led_gp1 = 10;
const u8 LED_GP1 = 10;
const u8 led_gp2 = 17;
const u8 led_gp3 = 24;
const u8 led_gp4 = 30;
68,7 → 68,8
const u8 sw_gp5 = 29;
const u8 sw_gp6 = 28;
 
 
const u8 sw_menu = 23;
const u8 sw_shift = 13;
const u8 sw_copy = 22;
const u8 sw_paste = 21;
const u8 sw_delete = 20;
111,16 → 112,16
* dout 16 = gp2 blue
* dout 17 = gp2 green
* dout 18 = gp2 red
* dout 19 = beatloop blue
* dout 20 = beatloop green
* dout 21 = beatloop red
* dout 19 = shift blue
* dout 20 = shift green
* dout 21 = shift red
* dout 22 = gp3 blue
* dout 23 = scene switch mode: all
* dout 24 = gp3 green
* dout 25 = gp3 red
* dout 26 = shift blue
* dout 27 = shift green
* dout 28 = shift red
* dout 26 = menu blue
* dout 27 = menu green
* dout 28 = menu red
* dout 29 = gp4 blue
* dout 30 = gp4 green
* dout 31 = reserved
160,8 → 161,8
* gp6 = din 28
* run/stop = din 15
* arm = din 14
* beatloop = din 13
* shift = din 23
* shift = din 13
* menu = din 23
* copy = din 22
* paste = din 21
* delete = din 20